/* global React */ // Tweaks panel — vary aesthetic, accent direction, density const { useState } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "signalHue": "lime", "trustHue": "indigo", "density": "comfortable", "displayFont": "instrument" }/*EDITMODE-END*/; const SIGNAL_PALETTES = { lime: { '--signal': '#C4F25E', '--signal-deep': '#91C92F' }, amber: { '--signal': '#F5C04A', '--signal-deep': '#C99A1F' }, electric:{ '--signal': '#3DD9FF', '--signal-deep': '#0EA8D9' }, coral: { '--signal': '#FF9572', '--signal-deep': '#E8704A' }, }; const TRUST_PALETTES = { indigo: { '--trust': '#1F3A5F', '--trust-2': '#2C4E78' }, forest: { '--trust': '#1F4231', '--trust-2': '#2D5942' }, plum: { '--trust': '#3F1F4A', '--trust-2': '#582B68' }, graphite:{ '--trust': '#2A2823', '--trust-2': '#3D3A33' }, }; const DENSITY = { comfortable: { '--container': '1240px' }, compact: { '--container': '1080px' }, wide: { '--container': '1380px' }, }; const FONTS = { instrument: '"Instrument Serif", serif', newsreader: '"Newsreader", "Instrument Serif", serif', fraunces: '"Fraunces", "Instrument Serif", serif', }; function applyTweaks(t) { const root = document.documentElement.style; const sig = SIGNAL_PALETTES[t.signalHue] || SIGNAL_PALETTES.lime; const tr = TRUST_PALETTES[t.trustHue] || TRUST_PALETTES.indigo; const d = DENSITY[t.density] || DENSITY.comfortable; Object.entries(sig).forEach(([k, v]) => root.setProperty(k, v)); Object.entries(tr).forEach(([k, v]) => root.setProperty(k, v)); Object.entries(d).forEach(([k, v]) => root.setProperty(k, v)); root.setProperty('--serif', FONTS[t.displayFont] || FONTS.instrument); } function MeceTweaks() { const [t, set] = useTweaks(TWEAK_DEFAULTS); const [visible, setVisible] = useState(false); React.useEffect(() => { applyTweaks(t); }, [t]); // Custom listener for visibility React.useEffect(() => { function onMsg(e) { if (e.data?.type === '__activate_edit_mode') setVisible(true); if (e.data?.type === '__deactivate_edit_mode') setVisible(false); } window.addEventListener('message', onMsg); window.parent.postMessage({ type: '__edit_mode_available' }, '*'); return () => window.removeEventListener('message', onMsg); }, []); if (!visible) return null; function close() { setVisible(false); window.parent.postMessage({ type: '__edit_mode_dismissed' }, '*'); } const setT = (k, v) => set({ [k]: v }); return (
Tweaks
({ k, color: v['--signal'] }))} value={t.signalHue} onChange={(v) => setT('signalHue', v)} /> ({ k, color: v['--trust'] }))} value={t.trustHue} onChange={(v) => setT('trustHue', v)} /> setT('density', v)} /> setT('displayFont', v)} />
innovation × trust · live preview
); } function useTweaks(defaults) { const [t, setT] = React.useState(defaults); function set(patchOrKey, maybeVal) { const patch = typeof patchOrKey === 'string' ? { [patchOrKey]: maybeVal } : patchOrKey; setT(prev => { const next = { ...prev, ...patch }; try { window.parent.postMessage({ type: '__edit_mode_set_keys', edits: patch }, '*'); } catch {} return next; }); } return [t, set]; } function TweakSwatchRow({ label, options, value, onChange }) { return (
{label}
{options.map(o => (
); } function TweakOptRow({ label, options, value, onChange }) { return (
{label}
{options.map(o => ( ))}
); } Object.assign(window, { MeceTweaks, applyTweaksDefaults: () => applyTweaks(TWEAK_DEFAULTS) });