/* 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 (
Objective movement and gait data, in-house — used to drive rehab decisions.
Learn moreTell us a little about what you need and we'll confirm a time at your chosen location. Most patients are seen within 48 hours.
Please keep this brief. Your clinical history will be taken in private at your visit.
Thank you, {data.name.split(" ")[0] || "there"}. A member of our front-of-house team will confirm your appointment shortly.
This is a design prototype — no information is sent or stored.