/* 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 =
DISC's orbital mark is lime green — the default. Other accents demo brand range.