// App shell + Tweaks panel const { useState: useS, useEffect: useE } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "displayFont": "Fraunces", "bodyFont": "Plus Jakarta Sans", "density": "default", "cardStyle": "soft", "heroVariant": "editorial", "dark": false }/*EDITMODE-END*/; function App() { const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS); const [page, setPage] = useS('home'); // Apply font CSS vars useE(() => { document.documentElement.style.setProperty('--font-display', `"${tweaks.displayFont}", Georgia, serif`); document.documentElement.style.setProperty('--font-body', `"${tweaks.bodyFont}", system-ui, sans-serif`); // Load Google Fonts dynamically const id = 'tweak-fonts'; let link = document.getElementById(id); const fonts = `family=${tweaks.bodyFont.replace(/ /g, '+')}:wght@300;400;500;600;700;800&family=${tweaks.displayFont.replace(/ /g, '+')}:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400&display=swap`; if (!link) { link = document.createElement('link'); link.id = id; link.rel = 'stylesheet'; document.head.appendChild(link); } link.href = `https://fonts.googleapis.com/css2?${fonts}`; }, [tweaks.displayFont, tweaks.bodyFont]); useE(() => { if (window.lucide) window.lucide.createIcons(); }); useE(() => { const t = setTimeout(() => { if (window.lucide) window.lucide.createIcons(); }, 80); return () => clearTimeout(t); }, [page, tweaks]); // Scroll to top on page change useE(() => { window.scrollTo({ top: 0, behavior: 'smooth' }); }, [page]); const dark = tweaks.dark; const Page = { home: HomePage, about: AboutPage, programs: ProgramsPage, contact: ContactPage }[page]; return (
); } ReactDOM.createRoot(document.getElementById('root')).render();