// wf/app.jsx — DesignCanvas root: assembles every section and mounts a small tweaks panel. const { useState, useEffect } = React; const ACCENTS = [ { id:'sky', label:'Bleu mer', bg:'var(--sky-300)', deep:'var(--sky-500)' }, { id:'sage', label:'Sauge', bg:'var(--sage-300)', deep:'var(--sage-500)' }, { id:'copper', label:'Cuivre', bg:'#E0B27B', deep:'#A56A2C' }, { id:'cream', label:'Crème', bg:'#FCF2D9', deep:'var(--brown-800)'}, ]; function TweaksPanel() { const [open, setOpen] = useState(true); const [acc, setAcc] = useState('sky'); const [available, setAvailable] = useState(false); // Apply accent to CSS variables useEffect(() => { const a = ACCENTS.find(x => x.id === acc) || ACCENTS[0]; document.documentElement.style.setProperty('--wf-accent', a.bg); document.documentElement.style.setProperty('--wf-accent-deep', a.deep); }, [acc]); // Wire to host toolbar Tweaks toggle useEffect(() => { const onMsg = (e) => { if (e.data?.type === '__activate_edit_mode') setOpen(true); if (e.data?.type === '__deactivate_edit_mode') setOpen(false); }; window.addEventListener('message', onMsg); window.parent.postMessage({ type: '__edit_mode_available' }, '*'); setAvailable(true); return () => window.removeEventListener('message', onMsg); }, []); const dismiss = () => { setOpen(false); window.parent.postMessage({ type: '__edit_mode_dismissed' }, '*'); }; if (!open) { return ( ); } return (