/* === App shell — router, tweaks, modals === */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "ivory",
"accent": "#C9A24B",
"heroLayout": "split",
"showBottomBar": true,
"displayFont": "Cormorant Garamond"
}/*EDITMODE-END*/;
function WAModal({ open, onClose }) {
if (!open) return null;
const D = window.MONILI;
return (
e.stopPropagation()}>
WhatsApp · Concierge
Which showroom would you like to reach?
We typically reply within the hour during showroom hours. (Demo only — your message won't actually send from this prototype.)
{D.showrooms.map(s => (
))}
);
}
function MoniliTweaks({ t, setTweak }) {
return (
setTweak("palette", v)}/>
setTweak("accent", v)}/>
setTweak("displayFont", v)}/>
setTweak("showBottomBar", v)}/>
);
}
function App() {
const initialPage = window.__BYTESGLUE_SHOWCASE_ROUTE || "home";
const [page, setPage] = useState(initialPage);
const [consultOpen, setConsultOpen] = useState(false);
const [waOpen, setWaOpen] = useState(false);
const [bottomVisible, setBottomVisible] = useState(false);
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply tweaks via CSS vars
useEffect(() => {
document.documentElement.dataset.palette = t.palette;
document.documentElement.style.setProperty("--champagne", t.accent);
// derive a slightly darker shade for hover
document.documentElement.style.setProperty("--champagne-deep", darken(t.accent, 0.12));
document.documentElement.style.setProperty("--serif", `"${t.displayFont}", "EB Garamond", serif`);
}, [t.palette, t.accent, t.displayFont]);
// Scroll-aware sticky CTA
useEffect(() => {
const onScroll = () => setBottomVisible(window.scrollY > 600);
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, []);
// Scroll to top on page change
useEffect(() => { window.scrollTo({ top: 0, behavior: "instant" }); }, [page]);
const openConsult = () => setConsultOpen(true);
const openWA = () => setWaOpen(true);
let PageEl = null;
switch (page) {
case "home": PageEl = ; break;
case "collections": PageEl = ; break;
case "bespoke": PageEl = ; break;
case "showrooms": PageEl = ; break;
case "heritage": PageEl = ; break;
case "visit": PageEl = ; break;
default: PageEl = ;
}
return (
<>