// 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();