// app.jsx — main app: tweaks + design canvas wiring const __TWEAK_DEFAULTS__ = /*EDITMODE-BEGIN*/{ "palette": "navy", "typePair": "instrument-geist", "density": "regular" }/*EDITMODE-END*/; function ThemeWrap({ tweaks, children }) { const cls = [ 'mv-screen-wrap', tweaks.palette === 'gold' ? 'palette-gold' : '', tweaks.palette === 'emerald' ? 'palette-emerald' : '', tweaks.palette === 'violet' ? 'palette-violet' : '', tweaks.typePair === 'bodoni-manrope' ? 'type-bodoni type-sans-manrope' : '', tweaks.typePair === 'sans-only' ? 'type-mono-display type-sans-sora' : '', ].filter(Boolean).join(' '); // Apply classes to every .mv-screen via a wrapper + descendant selector return (
{ if (!el) return; const root = el.closest('body') || document.body; // toggle classes globally on document.body so all screens pick them up root.classList.remove('palette-gold', 'palette-emerald', 'palette-violet', 'type-bodoni', 'type-sans-manrope', 'type-mono-display', 'type-sans-sora'); cls.split(' ').filter(Boolean).forEach(c => root.classList.add(c)); }}>{children}
); } function App() { const [t, setTweak] = useTweaks(__TWEAK_DEFAULTS__); // Apply tweaks via body classes — propagated by global CSS (.theme-X .mv-screen) useEffect(() => { const body = document.body; body.classList.remove('palette-gold', 'palette-emerald', 'palette-violet', 'type-bodoni', 'type-sans-manrope', 'type-mono-display', 'type-sans-sora'); if (t.palette === 'gold') body.classList.add('palette-gold'); if (t.palette === 'emerald') body.classList.add('palette-emerald'); if (t.palette === 'violet') body.classList.add('palette-violet'); if (t.typePair === 'bodoni-manrope') body.classList.add('type-bodoni', 'type-sans-manrope'); if (t.typePair === 'sans-only') body.classList.add('type-mono-display', 'type-sans-sora'); }, [t.palette, t.typePair]); // Helper to render any screen with the body classes inherited (we propagate // them to .mv-screen via a tiny CSS bridge below). return ( <> o.color)} onChange={(c) => { const map = { 'oklch(0.72 0.16 248)': 'navy', 'oklch(0.78 0.12 80)': 'gold', 'oklch(0.74 0.13 165)': 'emerald', 'oklch(0.68 0.18 295)': 'violet' }; setTweak('palette', map[c] || 'navy'); }} /> setTweak('typePair', v)} /> ); } ReactDOM.createRoot(document.getElementById('root')).render();