/* components.jsx — shared UI: icons, header, footer, small building blocks.
Exports everything to window for the other Babel scripts. */
const { useState, useEffect, useRef } = React;
/* ---------------------------------------------------------------
Icons — lucide-style line icons (1.75 stroke, round caps)
--------------------------------------------------------------- */
const ICON_PATHS = {
arrowRight: 'M5 12h14M13 6l6 6-6 6',
arrowLeft: 'M19 12H5M11 18l-6-6 6-6',
chevronRight: 'M9 6l6 6-6 6',
chevronDown: 'M6 9l6 6 6-6',
check: 'M20 6L9 17l-5-5',
clipboard: 'M9 4h6a1 1 0 0 1 1 1v1H8V5a1 1 0 0 1 1-1zM8 6H6a1 1 0 0 0-1 1v13a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V7a1 1 0 0 0-1-1h-2',
listChecks: 'M11 6h10M11 12h10M11 18h10M3 6l1.5 1.5L7 5M3 12l1.5 1.5L7 11M3 18l1.5 1.5L7 17',
calendar: 'M8 2v4M16 2v4M3 9h18M5 5h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1z',
dumbbell: 'M6.5 6.5l11 11M21 21l-1-1M3 3l1 1M18 22l4-4M2 6l4-4M6.5 17.5l-2 2M19.5 6.5l-2-2',
brain: 'M9.5 3A2.5 2.5 0 0 0 7 5.5v.5a2.5 2.5 0 0 0-2 2.45A2.5 2.5 0 0 0 5 13a2.5 2.5 0 0 0 2 4.45V18a2.5 2.5 0 0 0 5 0V5.5A2.5 2.5 0 0 0 9.5 3zM14.5 3A2.5 2.5 0 0 1 17 5.5v.5a2.5 2.5 0 0 1 2 2.45A2.5 2.5 0 0 1 19 13a2.5 2.5 0 0 1-2 4.45V18a2.5 2.5 0 0 1-5 0',
backpack: 'M6 8a6 6 0 0 1 12 0v11a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V8zM9 8a3 3 0 0 1 6 0M9 14h6M9 21v-5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v5',
bag: 'M6 2l-2 4v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6l-2-4H6zM4 6h16M16 10a4 4 0 0 1-8 0',
instagram: 'M7 2h10a5 5 0 0 1 5 5v10a5 5 0 0 1-5 5H7a5 5 0 0 1-5-5V7a5 5 0 0 1 5-5zM12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM17.5 6.5h.01',
mail: 'M4 5h16a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zM3 7l9 6 9-6',
shield: 'M12 2l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3z',
shieldCheck: 'M12 2l8 3v6c0 5-3.5 8.5-8 11-4.5-2.5-8-6-8-11V5l8-3zM9 12l2 2 4-4',
target: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10zM12 11a1 1 0 1 0 0 2 1 1 0 0 0 0-2z',
clock: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM12 7v5l3 2',
flag: 'M5 21V4M5 4h11l-1.5 3.5L16 11H5',
layers: 'M12 2l9 5-9 5-9-5 9-5zM3 12l9 5 9-5M3 17l9 5 9-5',
fileText: 'M14 2H6a1 1 0 0 0-1 1v18a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V7l-5-5zM14 2v5h5M9 13h6M9 17h6M9 9h2',
mapPin: 'M12 22s7-6.5 7-12a7 7 0 0 0-14 0c0 5.5 7 12 7 12zM12 11a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z',
menu: 'M4 7h16M4 12h16M4 17h16',
x: 'M6 6l12 12M18 6L6 18',
download: 'M12 3v12M7 10l5 5 5-5M5 21h14',
external: 'M14 4h6v6M20 4l-9 9M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5',
phone: 'M5 4h4l2 5-3 2a12 12 0 0 0 5 5l2-3 5 2v4a1 1 0 0 1-1 1A16 16 0 0 1 4 5a1 1 0 0 1 1-1z',
search: 'M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14zM21 21l-4.5-4.5',
user: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM4 21a8 8 0 0 1 16 0',
star: 'M12 3l2.6 5.5 6 .8-4.4 4.2 1.1 6L12 16.8 6.7 19.5l1.1-6L3.4 9.3l6-.8L12 3z',
bell: 'M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9M13.7 21a2 2 0 0 1-3.4 0',
info: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM12 16v-4M12 8h.01',
compass: 'M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM16 8l-2 6-6 2 2-6 6-2z',
};
function Icon({ name, size = 20, stroke = 1.75, className = '', style }) {
const d = ICON_PATHS[name] || '';
return (
);
}
/* ---------------------------------------------------------------
Brand mark — abstract anvil/shield monogram (placeholder)
--------------------------------------------------------------- */
function BrandMark({ size = 34 }) {
return (
);
}
/* ---------------------------------------------------------------
Top header + nav
--------------------------------------------------------------- */
const NAV = [
{ id: 'start', label: 'Start' },
{ id: 'kurse', label: 'Kursübersicht' },
{ id: 'wiki', label: 'Wiki' },
{ id: 'kw-plan', label: 'KW-Plan' },
{ id: 'checkliste', label: 'Checkliste' },
{ id: 'plan-7', label: '7-Tage-Plan' },
{ id: 'shop', label: 'Shop' },
];
function Header({ route, onNav }) {
const [open, setOpen] = useState(false);
useEffect(() => { setOpen(false); }, [route]);
return (
{lead}
} {children}