/* Tweaks island — applies live theme changes to :root.
Mounts ONLY the floating panel; the page itself stays plain editable HTML. */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"theme": "escuro",
"direction": "vivido",
"accent": "#0EA5C9",
"display": "Sora",
"motion": true
}/*EDITMODE-END*/;
/* ---- color helpers ---- */
function hexToRgb(h){ h=h.replace('#',''); if(h.length===3) h=h.replace(/./g,c=>c+c);
const n=parseInt(h,16); return [(n>>16)&255,(n>>8)&255,n&255]; }
function rgbToHex(r,g,b){ return '#'+[r,g,b].map(x=>Math.max(0,Math.min(255,Math.round(x))).toString(16).padStart(2,'0')).join(''); }
function mix(hex,target,amt){ const [r,g,b]=hexToRgb(hex),[tr,tg,tb]=hexToRgb(target);
return rgbToHex(r+(tr-r)*amt, g+(tg-g)*amt, b+(tb-b)*amt); }
function rgba(hex,a){ const [r,g,b]=hexToRgb(hex); return `rgba(${r},${g},${b},${a})`; }
/* accent palette derived from the active theme */
function applyAccent(theme, hex){
const r=document.documentElement.style;
let accent, deep, soft, glow;
if(theme==='mono'){
accent='#1A1D21'; deep='#0B0D0F'; soft='#ECEDEE'; glow='rgba(20,23,27,.10)';
} else if(theme==='escuro'){
accent=mix(hex,'#ffffff',0.06); deep=mix(hex,'#ffffff',0.20);
soft=rgba(hex,0.14); glow=rgba(hex,0.26);
} else { /* cor */
accent=hex; deep=mix(hex,'#000000',0.28); soft=mix(hex,'#ffffff',0.90); glow=rgba(hex,0.18);
}
r.setProperty('--accent', accent);
r.setProperty('--accent-deep', deep);
r.setProperty('--accent-soft', soft);
r.setProperty('--accent-glow', glow);
}
const ACCENTS = ['#00B4A6','#0EA5C9','#1E73E8','#0FA968','#7C5CFF'];
const FONTS = [
{ value:'Space Grotesk', label:'Grotesk' },
{ value:'Sora', label:'Sora' },
{ value:'DM Sans', label:'DM Sans' },
];
function ThemeBridge(){
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
React.useEffect(()=>{ document.body.setAttribute('data-theme', t.theme); }, [t.theme]);
React.useEffect(()=>{ document.body.setAttribute('data-direction', t.direction); }, [t.direction]);
React.useEffect(()=>{
applyAccent(t.theme, t.accent);
if(window.__sinalysRefreshMotion) window.__sinalysRefreshMotion();
}, [t.theme, t.accent]);
React.useEffect(()=>{ document.documentElement.style.setProperty('--display', `'${t.display}', system-ui, sans-serif`); }, [t.display]);
React.useEffect(()=>{
document.body.setAttribute('data-motion', t.motion ? 'on' : 'off');
if(window.__sinalysRefreshMotion) window.__sinalysRefreshMotion();
}, [t.motion]);
const themeNote = {
cor: 'Claro · acento em cor',
mono: 'Monocromático · grafite e cinzas',
escuro: 'Tema escuro · acento luminoso',
}[t.theme];
return (
setTweak('theme',v)} />
{themeNote}
{t.theme!=='mono' && (
setTweak('accent',v)} />
)}
setTweak('direction',v)} />
setTweak('display',v)} />
setTweak('motion',v)} />
);
}
/* apply persisted defaults immediately on load (before panel opens) */
document.body.setAttribute('data-theme', TWEAK_DEFAULTS.theme);
document.body.setAttribute('data-direction', TWEAK_DEFAULTS.direction);
document.body.setAttribute('data-motion', TWEAK_DEFAULTS.motion ? 'on' : 'off');
applyAccent(TWEAK_DEFAULTS.theme, TWEAK_DEFAULTS.accent);
document.documentElement.style.setProperty('--display', `'${TWEAK_DEFAULTS.display}', system-ui, sans-serif`);
ReactDOM.createRoot(document.getElementById('tweaks-root')).render();