/* global React, ReactDOM, SK, SK_DATA */ const { useState, useEffect, useMemo } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accentHex": "#B08D57", "backgroundHex": "#FBFAF7", "displaySerif": "Cormorant Garamond", "heroVariantIndex": 0, "tightTopbar": false, "showStickyPill": true }/*EDITMODE-END*/; function App() { const [page, setPage] = useState("home"); const [locale, setLocale] = useState("en"); const [openId, setOpenId] = useState(null); const [submitted, setSubmitted] = useState(null); const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); // Listen for cross-product navigation from the modal useEffect(() => { const handler = (e) => setOpenId(e.detail); window.addEventListener("sk-open", handler); return () => window.removeEventListener("sk-open", handler); }, []); // Apply tweaks to CSS vars useEffect(() => { document.documentElement.style.setProperty("--accent", t.accentHex); document.documentElement.style.setProperty("--focus", t.accentHex); document.documentElement.style.setProperty("--bg", t.backgroundHex); document.documentElement.style.setProperty("--serif", `"${t.displaySerif}", "EB Garamond", Georgia, serif`); }, [t.accentHex, t.backgroundHex, t.displaySerif]); // Apply RTL useEffect(() => { document.documentElement.lang = locale; document.documentElement.dir = locale === "ar" ? "rtl" : "ltr"; }, [locale]); // Scroll to top on page change useEffect(() => { window.scrollTo({ top: 0, behavior: "instant" }); }, [page]); // Hero variant kept here so the home page survives navigation const [heroVariant, setHeroVariant] = useState(t.heroVariantIndex || 0); useEffect(() => { setHeroVariant(t.heroVariantIndex || 0); }, [t.heroVariantIndex]); const go = (k) => { setPage(k); setOpenId(null); }; const openProduct = (id) => setOpenId(id); const closeModal = () => setOpenId(null); // Auto-clear submitted after 7s useEffect(() => { if (!submitted) return; const id = setTimeout(() => setSubmitted(null), 8000); return () => clearTimeout(id); }, [submitted]); let body; switch (page) { case "couture": body = ; break; case "rtw": body = ; break; case "bridal": body = ; break; case "custom": body = ; break; case "house": body = ; break; case "stores": body = ; break; case "appointments":body = ; break; default: body = ; } return ( <> {!t.tightTopbar && }
{body}
{t.showStickyPill && page !== "appointments" && ( )} {openId && } {submitted && (
Request received.
Thank you, {submitted.name}. We'll confirm your {submitted.line} appointment in {submitted.showroom} within one business day. A pre-filled WhatsApp is ready —{" "} continue now →.
)} setTweak("accentHex", v)} options={["#B08D57","#8C6B4F","#1A1A1A","#6E6A63","#C9A876"]}/> setTweak("backgroundHex", v)} options={["#FBFAF7","#FFFFFF","#F2EDE3","#EDE8DC","#181613"]}/> setTweak("displaySerif", v)} options={["Cormorant Garamond", "Playfair Display", "EB Garamond", "Tenor Sans", "Italiana"]}/> setTweak("heroVariantIndex", Number(v))} options={[ { value: "0", label: "Feather sculpted (SS26)" }, { value: "1", label: "Double satin train (SS26)" }, { value: "2", label: "Feather organza (SS26)" }, { value: "3", label: "Bridal · Tayla (FW26)" }, ]}/> setTweak("tightTopbar", !v)}/> setTweak("showStickyPill", v)}/> go("appointments")}/> { go("couture"); setTimeout(()=>openProduct("royal-bloom"), 350); }}/> ); } /* ---------- Home composition ---------- */ function HomePage({ go, openProduct, locale, heroVariant, setHeroVariant }) { return ( <>
); } function BridalTeaser({ go }) { return (
Bridal · 2027

For one body,
and one aisle.

Bridal Couture is a four-month conversation between you and our Beirut atelier — three to five fittings, embroidery samples for sign-off, and a single delivery in your colour, your silhouette, your light.

); } function PressRow() { return (
Where we have been seen

Press & runway.

{SK_DATA.pressLines.map(p => (
{p.house}
{p.credit}
{p.year}
))}
); } const Eyebrow = window.SK.Eyebrow; ReactDOM.createRoot(document.getElementById("root")).render();