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