// Biolite — shared components: Nav, Footer, BookingModal, marks const { useState, useEffect, useRef } = React; // Small inline SVG of the brand fan mark (reproduces media/biolite-icon-gradient.svg colors) function BrandMark({ size = 44, monotone = false }) { const fill = monotone ? "currentColor" : "url(#bm-grad)"; return ( {!monotone && ( )} ); } function Logo({ height = 44, dark = false }) { return (
Biolite
); } function Nav({ route, setRoute, openBooking }) { const items = [ { id: "home", label: "Home" }, { id: "treatments", label: "Treatments" }, { id: "doctors", label: "Our Team" }, { id: "wellness", label: "Wellness & Longevity" }, { id: "ba", label: "Before & After" }, { id: "about", label: "About" }, { id: "contact", label: "Contact" }, ]; return ( ); } function Footer({ setRoute, openBooking }) { return ( ); } // Sticky mobile rail function BookRail({ openBooking }) { return (
+971 4 346 6641
); } // ---- Booking modal (multi-step) ---- function BookingModal({ open, onClose, preselectedTreatment }) { const [step, setStep] = useState(0); const [data, setData] = useState({ intent: "", area: "", treatment: preselectedTreatment?.id || "", when: "", name: "", email: "", phone: "", notes: "", contact: "whatsapp", }); const total = 4; useEffect(() => { if (open) { setStep(0); setData(d => ({ ...d, treatment: preselectedTreatment?.id || "", area: preselectedTreatment?.area || "" })); document.body.style.overflow = "hidden"; } else document.body.style.overflow = ""; return () => { document.body.style.overflow = ""; }; }, [open, preselectedTreatment]); if (!open) return null; const update = (k, v) => setData(d => ({ ...d, [k]: v })); const canNext = () => { if (step === 0) return !!data.intent; if (step === 1) return !!data.area && !!data.treatment; if (step === 2) return !!data.when; if (step === 3) return data.name.length > 1 && data.email.includes("@") && data.phone.length > 4; return true; }; const areaTreatments = TREATMENTS.filter(t => t.area === data.area); return (
e.stopPropagation()}>
Book a consultation
{step === 0 && "What brings you to Biolite?"} {step === 1 && "Choose a treatment area"} {step === 2 && "When works for you?"} {step === 3 && "Your details"} {step === 4 && "Consultation requested"}
{step < 4 && (
{Array.from({ length: total }).map((_, i) => (
))}
)} {step === 0 && (
{["Surgical procedure", "Non-surgical aesthetics", "Wellness & longevity", "Cosmetic gynaecology", "I'm not sure — please advise"].map(o => ( ))}
Minimal PHI policy We only collect contact + treatment interest. Medical history is reviewed in clinic.
)} {step === 1 && (
{TREATMENT_AREAS.map(a => ( ))}
{data.area && (
)}
)} {step === 2 && (
{["This week", "Next week", "Within a month", "I'm visiting Dubai"].map(o => ( ))}