// App root + router
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"heroVariant": "overlay",
"formStyle": "comfortable",
"accent": "default"
}/*EDITMODE-END*/;
const getPageFromHash = () => {
const h = (window.location.hash || '#/').replace(/^#\/?/, '').split('/')[0] || 'home';
const p = SC_PAGES.find(x => x.key === h);
return p ? p.key : 'home';
};
const App = () => {
const [page, setPage] = React.useState(getPageFromHash());
const [tweaksOn, setTweaksOn] = React.useState(false);
const [tweaks, setTweaks] = React.useState(() => {
try {
const stored = JSON.parse(localStorage.getItem('sc_tweaks') || '{}');
// bust cache when defaults change
if (stored._v !== 2) return { ...TWEAK_DEFAULTS, _v: 2 };
return { ...TWEAK_DEFAULTS, ...stored };
}
catch { return TWEAK_DEFAULTS; }
});
const navTo = React.useCallback((key) => {
const target = SC_PAGES.find(p => p.key === key) || SC_PAGES[0];
window.location.hash = target.path;
setPage(target.key);
window.scrollTo({ top: 0, behavior: 'smooth' });
}, []);
const setTweak = (k, v) => {
setTweaks(prev => {
const next = { ...prev, [k]: v };
try { localStorage.setItem('sc_tweaks', JSON.stringify(next)); } catch {}
window.parent.postMessage({ type: '__edit_mode_set_keys', edits: { [k]: v } }, '*');
return next;
});
};
React.useEffect(() => {
const onHash = () => setPage(getPageFromHash());
window.addEventListener('hashchange', onHash);
return () => window.removeEventListener('hashchange', onHash);
}, []);
// Tweaks host protocol
React.useEffect(() => {
const onMsg = (e) => {
if (!e.data || typeof e.data !== 'object') return;
if (e.data.type === '__activate_edit_mode') setTweaksOn(true);
if (e.data.type === '__deactivate_edit_mode') setTweaksOn(false);
};
window.addEventListener('message', onMsg);
window.parent.postMessage({ type: '__edit_mode_available' }, '*');
return () => window.removeEventListener('message', onMsg);
}, []);
React.useEffect(() => {
// Apply accent tweak via attribute
document.body.dataset.accent = tweaks.accent;
}, [tweaks.accent]);
React.useEffect(() => {
if (window.lucide) setTimeout(() => lucide.createIcons(), 50);
}, [page]);
let content = null;
if (page === 'home') content = ;
else if (page === 'vision') content = ;
else if (page === 'spaces') content = ;
else if (page === 'dedications') content = ;
else if (page === 'contact') content = ;
return (
<>
{content}
{tweaksOn && }
>
);
};
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render();