/* DISC Dubai — UI primitives + chrome */ const { useState, useEffect, useRef, useMemo, Fragment } = React; const { SERVICES, CONCERNS, LOCATIONS, TEAM } = window.DISC_DATA; /* ---------------- icons (minimal, monoline) ---------------- */ const Icon = { arrow: (p = {}) => ( ), arrowDown: (p = {}) => ( ), phone: (p = {}) => ( ), whatsapp: (p = {}) => ( ), pin: (p = {}) => ( ), clock: (p = {}) => ( ), check: (p = {}) => ( ), close: (p = {}) => ( ), shield: (p = {}) => ( ), spark: (p = {}) => ( ), layers: (p = {}) => ( ), plus: (p = {}) => ( ), globe: (p = {}) => ( ) }; /* ---------------- DISC logo (vector — generic green-mark + wordmark, original) ---------------- */ function Logo({ variant = "dark" }) { const fg = variant === "light" ? "#FFFFFF" : "var(--ink)"; return ( DISC Dubai ); } /* ---------------- routing helpers ---------------- */ function useHashRoute() { const [hash, setHash] = useState(window.location.hash || "#/"); useEffect(() => { const onHash = () => setHash(window.location.hash || "#/"); window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); const path = hash.replace(/^#/, "") || "/"; const parts = path.split("/").filter(Boolean); return { path, parts, hash }; } function navigate(to) { window.location.hash = to; window.scrollTo({ top: 0, behavior: "instant" }); } /* ---------------- Header / Nav ---------------- */ function Header({ onBook }) { const { path } = useHashRoute(); const [open, setOpen] = useState(false); const [scrolled, setScrolled] = useState(false); const [megaOpen, setMegaOpen] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8); onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); useEffect(() => { setOpen(false); setMegaOpen(false); }, [path]); const navItems = [ { label: "Services", to: "#/services", mega: true }, { label: "Our team", to: "#/team" }, { label: "Locations", to: "#/locations" }, { label: "About", to: "#/about" }, { label: "Contact", to: "#/contact" } ]; return (
3 Dubai locations — DHCC · JLT · Al Quoz
+971 4 366 2334 EN
WhatsApp
{open && (
{navItems.map(n => {n.label})}
)}
); } function Mega({ onClose }) { return (
By service
{SERVICES.map(s => ( {s.title} {s.short} ))}
By concern
{CONCERNS.map(c => ( {c.label} ))}
Differentiator
Dynexus AI gait analysis

Objective movement and gait data, in-house — used to drive rehab decisions.

Learn more
); } /* ---------------- Booking Modal ---------------- */ function BookingModal({ open, onClose, initialService }) { const [step, setStep] = useState(1); const [data, setData] = useState({ location: "dhcc", service: initialService || "", name: "", email: "", phone: "", notes: "", preferred: "" }); useEffect(() => { if (open) { setStep(1); setData(d => ({ ...d, service: initialService || "" })); document.body.style.overflow = "hidden"; } else document.body.style.overflow = ""; return () => { document.body.style.overflow = ""; }; }, [open, initialService]); if (!open) return null; const set = (k, v) => setData(d => ({ ...d, [k]: v })); const next = () => setStep(s => s + 1); const back = () => setStep(s => s - 1); return (
e.stopPropagation()}>
Book an appointment

A consultation, on your terms.

Tell us a little about what you need and we'll confirm a time at your chosen location. Most patients are seen within 48 hours.

  • No referral required
  • Three locations across Dubai
  • Most insurers accepted — confirm at booking
{[1,2,3].map(n => (
= n ? "is-on" : "")}> {n} {n===1?"Where & what":n===2?"Your details":"Confirm"}
))}
{step === 1 && (

Where would you like to be seen?

{LOCATIONS.map(l => ( ))}

What's the concern?

{CONCERNS.slice(0,6).map(c => ( ))}
)} {step === 2 && (

How can we reach you?