// Tweaks panel — theme/accent/density/font // Follows the host protocol: register listener first, then announce availability. function Tweaks() { const [open, setOpen] = useState(false); const [enabled, setEnabled] = useState(false); const [cfg, setCfg] = useState(() => ({...(window.__TWEAKS__ || {})})); useEffect(() => { const onMsg = (e) => { const t = e.data && e.data.type; if (t === "__activate_edit_mode") { setEnabled(true); setOpen(true); } else if (t === "__deactivate_edit_mode") { setEnabled(false); setOpen(false); } }; window.addEventListener("message", onMsg); try { window.parent.postMessage({ type:"__edit_mode_available" }, "*"); } catch(e){} return () => window.removeEventListener("message", onMsg); }, []); const apply = (next) => { const merged = { ...cfg, ...next }; setCfg(merged); const html = document.documentElement; if (next.theme !== undefined) { html.classList.remove("dark","light"); html.classList.add(next.theme); } if (next.accent !== undefined) html.setAttribute("data-accent", next.accent); if (next.density !== undefined) html.setAttribute("data-density", next.density); if (next.monoBody !== undefined) document.body.classList.toggle("mono-body", !!next.monoBody); try { window.parent.postMessage({ type:"__edit_mode_set_keys", edits: next }, "*"); } catch(e){} }; if (!enabled) return null; return (
{!open ? ( ) : (
Tweaks
apply({theme:v})} opts={[{v:"dark",l:"Dark"},{v:"light",l:"Light"}]}/> apply({density:v})} opts={[{v:"comfortable",l:"Comfortable"},{v:"compact",l:"Compact"}]}/>
{["teal","lime","amber","indigo"].map(a => (
apply({monoBody: !cfg.monoBody})}/>
)}
); } function Row({label, children}) { return (
{label}
{children}
); } function Segmented({value, onChange, opts}) { return (
{opts.map(o => ( ))}
); } window.Tweaks = Tweaks;