// Main App — router, tweaks, scroll restoration, enquire drawer wiring. const { useState: useStateA, useEffect: useEffectA, useCallback: useCallbackA } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#0b3619", "displayFont": "Cormorant Garamond", "density": "editorial", "rekordTheme": "dark" }/*EDITMODE-END*/; function App() { const [route, setRoute] = useStateA({ page: "home" }); const [enquire, setEnquire] = useStateA(null); const [t, setTweak] = window.useTweaks(TWEAK_DEFAULTS); // Apply tweaks to :root useEffectA(() => { document.documentElement.style.setProperty("--primary", t.accent); document.documentElement.style.setProperty("--focus", t.accent); // The mission/dot use primary; rekord-band keeps mint const fontMap = { "Cormorant Garamond": `"Cormorant Garamond", "Source Serif 4", Georgia, serif`, "EB Garamond": `"EB Garamond", "Source Serif 4", Georgia, serif`, "Spectral": `"Spectral", "Source Serif 4", Georgia, serif` }; document.documentElement.style.setProperty("--serif", fontMap[t.displayFont] || fontMap["Cormorant Garamond"]); document.documentElement.setAttribute("data-density", t.density); }, [t.accent, t.displayFont, t.density]); const goTo = useCallbackA((next) => { setRoute(next); window.scrollTo({ top: 0, behavior: "instant" in window ? "instant" : "auto" }); // Update hash for shareable state (best-effort) const hash = next.page === "home" ? "" : next.slug ? `${next.page}/${next.slug}` : next.page; history.replaceState(null, "", "#" + hash); }, []); // Hash sync (load deep links) useEffectA(() => { const h = window.location.hash.replace(/^#/, ""); if (!h) return; const [page, slug] = h.split("/"); if (["home","exhibitions","exhibition","artists","artist","viewing-rooms","rekord","about","visit"].includes(page)) { setRoute(slug ? { page, slug } : { page }); } }, []); const openEnquire = useCallbackA((ctx) => setEnquire(ctx), []); const closeEnquire = useCallbackA(() => setEnquire(null), []); function renderPage() { switch (route.page) { case "home": return ; case "exhibitions": return ; case "exhibition": return ; case "artists": return ; case "artist": return ; case "viewing-rooms": return ; case "rekord": return ; case "about": return ; case "visit": return ; default: return ; } } const isDarkPage = route.page === "rekord"; return (
{renderPage()} setTweak("accent", v)} /> setTweak("displayFont", v)} /> setTweak("density", v)} />
); } const root = ReactDOM.createRoot(document.getElementById("root")); root.render();