/* 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();