/* DISC Dubai — App root */ const { useState: useStateA, useEffect: useEffectA } = React; const { Header: H, Footer: F, BookingModal: BM, WhatsAppFab: WAF, useHashRoute: useRoute, navigate: nav } = window.DISC_UI; const { HomePage, ServicesHubPage, ServiceDetailPage, TeamPage, PractitionerPage, AboutPage, LocationsPage, ContactPage, BeforeAfterPage, NotFound } = window.DISC_PAGES; /* tweaks defaults */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "lime", "type": "manrope", "density": "comfortable" }/*EDITMODE-END*/; const ACCENT_OPTIONS = { lime: { green: "#8DC63F", greenDeep: "#4F7A1F", greenSoft: "oklch(0.96 0.05 130)", greenInk: "#16202B" }, forest: { green: "#2E8B57", greenDeep: "#1F5C3A", greenSoft: "oklch(0.96 0.04 155)", greenInk: "#11231A" }, ocean: { green: "#22A5A0", greenDeep: "#0E6D6A", greenSoft: "oklch(0.96 0.04 195)", greenInk: "#0E2326" }, ember: { green: "#E07A2C", greenDeep: "#A04F0F", greenSoft: "oklch(0.96 0.04 65)", greenInk: "#231510" } }; const TYPE_OPTIONS = { manrope: { display: "'Manrope', system-ui, sans-serif", body: "'Inter', system-ui, sans-serif" }, sora: { display: "'Sora', system-ui, sans-serif", body: "'Inter', system-ui, sans-serif" }, fraunces:{ display: "'Fraunces', 'Times New Roman', serif", body: "'Inter', system-ui, sans-serif" } }; function applyTweaks(t) { const root = document.documentElement; const a = ACCENT_OPTIONS[t.accent] || ACCENT_OPTIONS.lime; root.style.setProperty("--green", a.green); root.style.setProperty("--green-deep", a.greenDeep); root.style.setProperty("--green-soft", a.greenSoft); root.style.setProperty("--ink-tone", a.greenInk); const ty = TYPE_OPTIONS[t.type] || TYPE_OPTIONS.manrope; root.style.setProperty("--font-display", ty.display); root.style.setProperty("--font-body", ty.body); root.style.setProperty("--section-pad", t.density === "spacious" ? "120px" : t.density === "compact" ? "64px" : "92px"); } function App() { const { path, parts } = useRoute(); const [bookOpen, setBookOpen] = useStateA(false); const [bookService, setBookService] = useStateA(""); const [tweaks, setTweaks] = useStateA(TWEAK_DEFAULTS); const [tweaksOpen, setTweaksOpen] = useStateA(false); useEffectA(() => { applyTweaks(tweaks); }, [tweaks]); // Tweaks host wiring useEffectA(() => { const onMsg = (e) => { if (!e.data || typeof e.data !== "object") return; if (e.data.type === "__activate_edit_mode") setTweaksOpen(true); if (e.data.type === "__deactivate_edit_mode") setTweaksOpen(false); }; window.addEventListener("message", onMsg); try { window.parent.postMessage({type: "__edit_mode_available"}, "*"); } catch(e) {} return () => window.removeEventListener("message", onMsg); }, []); const setTweak = (k, v) => { const next = typeof k === "object" ? { ...tweaks, ...k } : { ...tweaks, [k]: v }; setTweaks(next); try { window.parent.postMessage({type: "__edit_mode_set_keys", edits: next}, "*"); } catch(e) {} }; const openBook = () => { setBookService(""); setBookOpen(true); }; const openBookSvc = (slug) => { setBookService(slug); setBookOpen(true); }; // hash to #/locations#dhcc — scroll into view after navigation useEffectA(() => { if (path.includes("#")) { const id = path.split("#").pop(); const el = document.getElementById(id); if (el) setTimeout(() => el.scrollIntoView({ behavior: "instant", block: "start" }), 50); } }, [path]); let page; if (path === "/" || path === "") page = ; else if (parts[0] === "services" && parts[1]) page = ; else if (parts[0] === "services") page = ; else if (parts[0] === "team" && parts[1]) page = ; else if (parts[0] === "team") page = ; else if (parts[0] === "about") page = ; else if (parts[0] === "locations") page = ; else if (parts[0] === "contact") page = ; else if (parts[0] === "before-after") page = ; else page = ; return (
{page}
setBookOpen(false)} initialService={bookService} /> {tweaksOpen && { setTweaksOpen(false); try { window.parent.postMessage({type:"__edit_mode_dismissed"}, "*"); } catch(e){} }}/>}
); } function TweaksUI({ tweaks, setTweak, onClose }) { return (
Tweaks
Accent palette
{Object.entries(ACCENT_OPTIONS).map(([key, val]) => ( ))}

DISC's orbital mark is lime green — the default. Other accents demo brand range.

Typography
{Object.keys(TYPE_OPTIONS).map(k => ( ))}
Section density
{["compact", "comfortable", "spacious"].map(k => ( ))}
); } const Icon = window.DISC_UI.Icon; const Fragment = React.Fragment; ReactDOM.createRoot(document.getElementById("root")).render();