/* app.jsx — router, shell, tweaks */ const ROUTES = ['start', 'kurse', 'wiki', 'kw-plan', 'checkliste', 'plan-7', 'shop']; function getRoute() { const h = (location.hash || '').replace(/^#\/?/, '').trim(); const seg = h.split('/')[0]; if (seg === 'admin') return 'admin'; return ROUTES.includes(seg) ? seg : 'start'; } const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "oliv", "topStrip": true, "corner": "soft", "headingScale": 1 }/*EDITMODE-END*/; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [route, setRoute] = useState(getRoute()); useEffect(() => { const onHash = () => { setRoute(getRoute()); window.scrollTo({ top: 0, behavior: 'instant' in window ? 'instant' : 'auto' }); }; window.addEventListener('hashchange', onHash); return () => window.removeEventListener('hashchange', onHash); }, []); const nav = (id) => { if (id === 'social') { window.open('https://instagram.com', '_blank', 'noopener'); return; } if (id === 'admin') { location.hash = '#/admin/dashboard'; return; } if (id === route) { window.scrollTo({ top: 0, behavior: 'smooth' }); return; } location.hash = '#/' + id; }; /* apply tweaks to root */ useEffect(() => { const r = document.documentElement; r.setAttribute('data-accent', t.accent); r.style.setProperty('--r-card-scale', t.corner === 'sharp' ? '0' : t.corner === 'round' ? '1.6' : '1'); document.body.style.setProperty('--heading-scale', t.headingScale); }, [t.accent, t.corner, t.headingScale]); if (route === 'admin') { return { location.hash = '#/start'; }} />; } let page; switch (route) { case 'kurse': page = ; break; case 'wiki': page = ; break; case 'kw-plan': page = ; break; case 'checkliste': page = ; break; case 'plan-7': page = ; break; case 'shop': page = ; break; default: page = ; } return (
{page}
setTweak('accent', v)} /> setTweak('corner', v)} /> setTweak('headingScale', v)} /> setTweak('topStrip', v)} />
); } ReactDOM.createRoot(document.getElementById('root')).render();