/* global React, ReactDOM */
// TWEAKS defaults
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "cyan",
"theme": "dark",
"density": "default"
}/*EDITMODE-END*/;
const ACCENT_MAP = {
cyan: { v: '#3FA4C9', name: 'Cyan' },
orange: { v: '#E89B3C', name: 'Orange' },
navy: { v: '#1B3360', name: 'Navy' },
green: { v: '#6FB85A', name: 'Green' },
sky: { v: '#7FB9DC', name: 'Sky' },
};
function App() {
const hash = useHashRoute();
const [theme, setThemeState] = useState(TWEAK_DEFAULTS.theme);
const [accent, setAccent] = useState(TWEAK_DEFAULTS.accent);
const [mobileOpen, setMobileOpen] = useState(false);
const [tweaksOpen, setTweaksOpen] = useState(false);
const [editModeActive, setEditModeActive] = useState(false);
// apply theme to document
useEffect(() => { document.documentElement.setAttribute('data-theme', theme); }, [theme]);
// apply accent via CSS var
useEffect(() => {
const c = ACCENT_MAP[accent]?.v || ACCENT_MAP.cyan.v;
document.documentElement.style.setProperty('--accent', c);
}, [accent]);
const setTheme = (t) => {
setThemeState(t);
window.parent?.postMessage({type:'__edit_mode_set_keys', edits:{theme:t}}, '*');
};
const pickAccent = (a) => {
setAccent(a);
window.parent?.postMessage({type:'__edit_mode_set_keys', edits:{accent:a}}, '*');
};
// close mobile menu on route change
useEffect(() => { setMobileOpen(false); }, [hash]);
// Tweaks protocol — listener first, then announce
useEffect(() => {
const handle = (ev) => {
if (ev.data?.type === '__activate_edit_mode') { setEditModeActive(true); setTweaksOpen(true); }
if (ev.data?.type === '__deactivate_edit_mode') { setEditModeActive(false); setTweaksOpen(false); }
};
window.addEventListener('message', handle);
window.parent?.postMessage({type:'__edit_mode_available'}, '*');
return () => window.removeEventListener('message', handle);
}, []);
const Page = pickPage(hash);
return (
<>