// primitives.jsx — Logo, icons, small reusable bits function NMark({ size = 28, color = "currentColor" }) { // An "N" whose diagonal doubles as a walking stride — proprietary mark return ( ); } function Arrow({ size = 14 }) { return ( ); } function Star() { return ( ); } function CursorSpot() { const ref = React.useRef(null); React.useEffect(() => { let rafId; let x = window.innerWidth / 2,y = window.innerHeight / 2; let tx = x,ty = y; const onMove = (e) => {tx = e.clientX;ty = e.clientY;}; const loop = () => { x += (tx - x) * 0.12;y += (ty - y) * 0.12; if (ref.current) ref.current.style.transform = `translate(${x}px, ${y}px) translate(-50%, -50%)`; rafId = requestAnimationFrame(loop); }; window.addEventListener("mousemove", onMove); loop(); return () => {cancelAnimationFrame(rafId);window.removeEventListener("mousemove", onMove);}; }, []); return
; } function Nav({ lang, setLang }) { const [scrolled, setScrolled] = React.useState(false); const [menuOpen, setMenuOpen] = React.useState(false); const t = COPY[lang]; React.useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 20); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); React.useEffect(() => { document.body.style.overflow = menuOpen ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [menuOpen]); const scrollTo = (id) => (e) => { e.preventDefault(); setMenuOpen(false); const el = document.getElementById(id); if (el) window.scrollTo({ top: el.offsetTop - 70, behavior: "smooth" }); }; return ( ); } function Hero({ lang, variant }) { const t = COPY[lang].hero; const videoRef = React.useRef(null); React.useEffect(() => { const v = videoRef.current; if (!v) return; v.muted = true; const tryPlay = () => { const p = v.play(); if (p && p.catch) p.catch(() => {}); }; tryPlay(); v.addEventListener("canplay", tryPlay, { once: true }); }, []); return (
↳ {t.eyebrow}

{t.line1} {t.line2a} {t.line2b} {t.line3}

{variant === "media" ?
:

{t.lede}

}
{[...t.ticker, ...t.ticker].map((w, i) => — {w} )}
); } function CookieConsent({ lang }) { const t = (COPY[lang] && COPY[lang].cookie) || COPY.de.cookie; const KEY = "nm-cookie-consent"; const [show, setShow] = React.useState(false); React.useEffect(() => { try { if (!localStorage.getItem(KEY)) setShow(true); } catch (e) { setShow(true); } }, []); const decide = (choice) => { try { localStorage.setItem(KEY, JSON.stringify({ choice, ts: Date.now() })); } catch (e) {} setShow(false); }; if (!show) return null; const dpUrl = (window.__datenschutzUrl || "datenschutz.html") + "?lang=" + lang; return (
{t.title}

{t.body} {t.more} →

); } Object.assign(window, { NMark, Arrow, Star, CursorSpot, Nav, Hero, CookieConsent });