/* Tweaks island — applies theme tokens to the vanilla site via CSS variables */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#e55800", "headingFont": "Newsreader", "tone": "warm", "motion": true }/*EDITMODE-END*/; const FONT_MAP = { "Newsreader": '"Newsreader", Georgia, serif', "Source Serif 4": '"Source Serif 4", Georgia, serif', "Hanken Grotesk": '"Hanken Grotesk", system-ui, sans-serif' }; const TONE_MAP = { "warm": { paper:"#f6f1e7", paper2:"#efe7d8", line:"#dcd2bf" }, "cool": { paper:"#f1f2f4", paper2:"#e7e9ee", line:"#d6dae1" }, "light": { paper:"#fbfaf6", paper2:"#f3f1ea", line:"#e7e2d6" } }; function applyTweaks(t){ const root = document.documentElement; root.style.setProperty('--accent', t.accent); root.style.setProperty('--font-display', FONT_MAP[t.headingFont] || FONT_MAP.Newsreader); const tone = TONE_MAP[t.tone] || TONE_MAP.warm; root.style.setProperty('--paper', tone.paper); root.style.setProperty('--paper-2', tone.paper2); root.style.setProperty('--line', tone.line); root.classList.toggle('reduce-motion', !t.motion); } function App(){ const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); React.useEffect(function(){ applyTweaks(t); }, [t]); return ( setTweak('accent', v)} /> setTweak('headingFont', v)} /> setTweak('tone', v)} /> setTweak('motion', v)} /> ); } // Apply persisted/default tweaks immediately (before panel mount) to avoid flash try{ const saved = JSON.parse(localStorage.getItem('tweaks') || 'null'); applyTweaks(Object.assign({}, TWEAK_DEFAULTS, saved || {})); }catch(e){ applyTweaks(TWEAK_DEFAULTS); } ReactDOM.createRoot(document.getElementById('tweaks-root')).render();