// SloppyUniverse Landing — full Manifesto-in-Motion build
// All sections live here. CSS is in the host HTML.
function App() {
// Single-language Landing: 'de' oder 'en'. Default aus localStorage,
// sonst Browser-Sprache, sonst 'de'. Toggle in der Topbar.
const [lang, setLang] = React.useState(() => {
try {
var saved = localStorage.getItem('su-landing-lang');
if (saved === 'de' || saved === 'en') return saved;
var nav = (navigator.language || 'de').toLowerCase();
return nav.startsWith('en') ? 'en' : 'de';
} catch (e) { return 'de'; }
});
React.useEffect(() => {
try { localStorage.setItem('su-landing-lang', lang); } catch (e) {}
document.documentElement.lang = lang;
}, [lang]);
const motion = true;
const tilt = 0.7; // weniger aggressives Magazine-Tilt
const bg = "navy";
React.useEffect(() => {
document.documentElement.style.setProperty('--bg', bg === 'navy' ? '#0a0d2e' : '#0d0d0d');
document.documentElement.style.setProperty('--bg-alt', bg === 'navy' ? '#101537' : '#1a1a1a');
document.documentElement.style.setProperty('--tilt', `${tilt}`);
document.documentElement.style.setProperty('--motion', motion ? '1' : '0');
}, []);
return (
);
}
// ─── LANGUAGE HELPER ────────────────────────────────────────────────────────
// lang prop = 'de' oder 'en'. Single-language Render — keine Doppelausgabe
// mehr (Accessibility + Locale-Erkennung). Sprache wird in der Topbar
// umgeschaltet (Pill ist clickable).
function Bi({en, de, lang, sep = " · ", className, asBlock}) {
const text = lang === 'en' ? en : de;
if (asBlock) {
return
{text}
;
}
return {text};
}
function pickBi(m, lang) {
return lang === 'en' ? m.en : m.de;
}
function pickBoth(m, lang) {
// Backwards-compat fuer Aufrufer die secondary mitlesen — beides gleich.
const pri = lang === 'en' ? m.en : m.de;
return { primary: pri, secondary: pri };
}
// ─── TOPBAR ──────────────────────────────────────────────────────────────────
function Topbar({lang, setLang}) {
return (