/* admin-shell.jsx — admin panel shell + sub-router */ function adminSection() { const h = (location.hash || '').replace(/^#\/?/, ''); const parts = h.split('/'); // admin /
return parts[1] || 'dashboard'; } function AdminApp({ onExit }) { const [section, setSection] = useState(adminSection()); const [navOpen, setNavOpen] = useState(false); useEffect(() => { const onHash = () => { setSection(adminSection()); setNavOpen(false); }; window.addEventListener('hashchange', onHash); return () => window.removeEventListener('hashchange', onHash); }, []); const go = (id) => { location.hash = '#/admin/' + id; }; const current = ADMIN_NAV.find(n => n.id === section) || ADMIN_NAV[0]; const groups = [...new Set(ADMIN_NAV.map(n => n.group))]; let screen; switch (section) { case 'analytics': screen = ; break; case 'audit': screen = ; break; case 'seiten': screen = ; break; case 'builder': screen = ; break; case 'wiki': screen = ; break; case 'kurse': screen = ; break; case 'shop': screen = ; break; case 'medien': screen = ; break; case 'uebersetzungen': screen = ; break; case 'rollen': screen = ; break; default: screen = ; } const isBuilder = section === 'builder'; return (
Admin{current.label}
MK M. Krause Super Admin
{screen}
{navOpen &&
setNavOpen(false)} />}
); } /* ---- shared admin building blocks ---- */ function AScreenHead({ title, sub, children }) { return (

{title}

{sub &&

{sub}

}
{children &&
{children}
}
); } function StatusPill({ status }) { const s = STATUS_LABEL[status] || STATUS_LABEL.draft; return {s.de}; } function MiniBar({ data, max, tint }) { const m = max || Math.max(...data); return (
{data.map((v, i) => ( ))}
); } function tintHex(t) { return ({ oliv: 'tint-oliv', stahlblau: 'tint-stahl', sandgrau: 'tint-sand' })[t] || 'accent'; } Object.assign(window, { AdminApp, AScreenHead, StatusPill, MiniBar });