// App + router + tweaks for Hessa Falasi prototype const { useState: useStateA, useEffect: useEffectA, useCallback } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#B08D57", "background": "ivory", "displayFont": "Cormorant Garamond", "density": "comfortable" }/*EDITMODE-END*/; function parseRoute(hash) { const raw = (hash || "").replace(/^#/, "") || "/"; const seg = raw.split("/").filter(Boolean); if (seg.length === 0) return { path: "/", page: "home" }; if (seg[0] === "collections") return { path: "/collections", page: "collections" }; if (seg[0] === "collection" && seg[1]) return { path: "/collection/"+seg[1], page: "collection", slug: seg[1] }; if (seg[0] === "product" && seg[1]) return { path: "/product/"+seg[1], page: "product", handle: seg[1] }; if (seg[0] === "the-house") return { path: "/the-house", page: "house" }; if (seg[0] === "press") return { path: "/press", page: "press" }; if (seg[0] === "appointments") return { path: "/appointments", page: "appointments" }; if (seg[0] === "visit") return { path: "/visit", page: "visit" }; if (seg[0] === "size-guide") return { path: "/size-guide", page: "size" }; return { path: "/", page: "home" }; } function App() { const [route, setRoute] = useStateA(() => parseRoute(window.location.hash)); const [locale, setLocale] = useStateA(() => { try { return localStorage.getItem("hf-locale") || "en"; } catch (e) { return "en"; } }); const [toast, setToast] = useStateA(null); const [tweaks, setTweaks] = useStateA(TWEAK_DEFAULTS); const [tweaksOpen, setTweaksOpen] = useStateA(false); // Hash router useEffectA(() => { const onHash = () => { setRoute(parseRoute(window.location.hash)); window.scrollTo({ top: 0, behavior: "instant" }); }; window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); // Locale persistence + html lang/dir useEffectA(() => { document.documentElement.lang = locale; document.documentElement.dir = locale === "ar" ? "rtl" : "ltr"; try { localStorage.setItem("hf-locale", locale); } catch (e) {} }, [locale]); // Tweaks: apply CSS vars useEffectA(() => { const root = document.documentElement; root.style.setProperty("--gold", tweaks.accent); root.style.setProperty("--serif", `"${tweaks.displayFont}", "Times New Roman", serif`); if (tweaks.background === "bone") { root.style.setProperty("--ivory", "#F4EFE7"); } else if (tweaks.background === "sand") { root.style.setProperty("--ivory", "#EDE3D2"); } else { root.style.setProperty("--ivory", "#FBF8F2"); } // Density: adjust container padding via inline override if (tweaks.density === "compact") { root.style.setProperty("--pad-x", "clamp(16px, 3vw, 36px)"); } else if (tweaks.density === "spacious") { root.style.setProperty("--pad-x", "clamp(28px, 6vw, 96px)"); } else { root.style.setProperty("--pad-x", "clamp(20px, 4vw, 56px)"); } }, [tweaks]); // Tweaks integration with host toolbar useEffectA(() => { const onMsg = (e) => { const d = e.data; if (!d || typeof d !== "object") return; if (d.type === "__activate_edit_mode") setTweaksOpen(true); else if (d.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 navigate = useCallback((href) => { window.location.hash = href.replace(/^#/, ""); }, []); const showToast = useCallback((msg) => setToast(msg), []); const setTweak = (key, value) => { setTweaks(prev => { const next = { ...prev, [key]: value }; try { window.parent.postMessage({ type: "__edit_mode_set_keys", edits: { [key]: value } }, "*"); } catch (e) {} return next; }); }; const closeTweaks = () => { setTweaksOpen(false); try { window.parent.postMessage({ type: "__edit_mode_dismissed" }, "*"); } catch (e) {} }; const dark = false; // nav stays light; hero is dark anyway let page; switch (route.page) { case "home": page = ; break; case "collections": page = ; break; case "collection": page = ; break; case "product": page = ; break; case "house": page = ; break; case "press": page = ; break; case "appointments":page = ; break; case "visit": page = ; break; case "size": page = ; break; default: page = ; } return ( <> {page}