/* App root: route state, tweak state, page dispatch */ const { useState: useStateApp, useEffect: useEffectApp } = React; const DEFAULT_TWEAKS = /*EDITMODE-BEGIN*/{ "serifFamily": "Cormorant Garamond", "accent": "#8A3F2D", "secondary": "#7A6A57", "bgTone": "#FBFBF9", "density": "standard", "showClosure": true, "locale": "EN" }/*EDITMODE-END*/; function App() { const [route, setRoute] = useStateApp({ name: "home" }); const [drawer, setDrawer] = useStateApp({ open: false, ctx: null }); const [t, setTweak] = window.useTweaks(DEFAULT_TWEAKS); // Apply tweak vars at root useEffectApp(() => { const r = document.documentElement; r.style.setProperty("--accent", t.accent); r.style.setProperty("--secondary", t.secondary); r.style.setProperty("--bg", t.bgTone); r.style.setProperty("--serif", `"${t.serifFamily}", "EB Garamond", Georgia, serif`); document.body.setAttribute("data-locale", t.locale); document.documentElement.setAttribute("dir", t.locale === "AR" ? "rtl" : "ltr"); }, [t]); // Smooth-ish route change: scroll to top, no animation overhead useEffectApp(() => { window.scrollTo({ top: 0, behavior: "instant" }); }, [route]); const openEnquire = (ctx) => setDrawer({ open: true, ctx }); const closeEnquire = () => setDrawer((d) => ({ ...d, open: false })); let page; switch (route.name) { case "exhibitions": page = ; break; case "exhibition": page = ; break; case "artists": page = ; break; case "artist": page = ; break; case "online": page = ; break; case "fairs": page = ; break; case "press": page = ; break; case "about": page = ; break; case "contact": page = ; break; default: page = ; } return ( {t.showClosure && } setTweak("locale", l)} />
{page}
); } function TweaksUI({ t, setTweak }) { const T = window.TweaksPanel; const S = window.TweakSection; if (!T) return null; return ( setTweak("serifFamily", v)} options={[ { value: "Cormorant Garamond", label: "Cormorant Garamond — narrow editorial" }, { value: "EB Garamond", label: "EB Garamond — classical, denser" }, { value: "Tenor Sans", label: "Tenor Sans — modern museum sans" }, { value: "Cardo", label: "Cardo — humanist serif" } ]} /> setTweak("density", v)} options={["standard", "deep"]} /> setTweak("accent", v)} options={["#8A3F2D", "#A0522D", "#2F6F73", "#1B1B1B"]} /> setTweak("secondary", v)} options={["#7A6A57", "#8C7B68", "#5C5A52", "#9A8C76"]} /> setTweak("bgTone", v)} options={["#FBFBF9", "#F7F4ED", "#FFFFFF", "#F0EBE0"]} /> setTweak("showClosure", v)} /> setTweak("locale", v)} options={["EN", "AR", "RU", "ZH"]} /> ); } // Mount const root = ReactDOM.createRoot(document.getElementById("root")); root.render();