// tweaks-app.jsx — панель Tweaks для лендинга Linksider AI (тёмная тема v2).
// Контент рендерится в обычном HTML; здесь — только панель + применение
// значений к CSS-переменным документа (живой превью).
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"hero": "split",
"accent": "#4F8DF7",
"headingFont": "Unbounded",
"secPad": 72
}/*EDITMODE-END*/;
// Производные палитры акцента для ТЁМНОЙ темы (один источник правды).
const ACCENTS = {
'#E8C547': { bright: '#F6D862', deep: '#C8A52E', strong: '#EBCB5A', tint: 'rgba(232,197,71,.13)', tint2: 'rgba(232,197,71,.24)', line: 'rgba(232,197,71,.34)', glow: 'rgba(232,197,71,.40)' },
'#4F8DF7': { bright: '#7FB0FB', deep: '#3A6FD8', strong: '#8FBBFC', tint: 'rgba(79,141,247,.15)', tint2: 'rgba(79,141,247,.26)', line: 'rgba(79,141,247,.38)', glow: 'rgba(79,141,247,.40)' },
'#34D399': { bright: '#5FDCAF', deep: '#25B07E', strong: '#6FE0BC', tint: 'rgba(52,211,153,.15)', tint2: 'rgba(52,211,153,.26)', line: 'rgba(52,211,153,.38)', glow: 'rgba(52,211,153,.40)' },
'#9B7CFC': { bright: '#B49BFD', deep: '#7E5CF0', strong: '#BCA6FD', tint: 'rgba(155,124,252,.16)', tint2: 'rgba(155,124,252,.27)', line: 'rgba(155,124,252,.40)', glow: 'rgba(155,124,252,.42)' },
};
const FONT_HREFS = {
'Unbounded': 'https://fonts.googleapis.com/css2?family=Unbounded:wght@600;700;800&display=swap',
'Manrope': 'https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&display=swap',
'Onest': 'https://fonts.googleapis.com/css2?family=Onest:wght@600;700;800&display=swap',
};
function ensureFont(name) {
const href = FONT_HREFS[name];
if (!href || document.querySelector(`link[data-twkfont="${name}"]`)) return;
const l = document.createElement('link');
l.rel = 'stylesheet'; l.href = href; l.dataset.twkfont = name;
document.head.appendChild(l);
}
function applyTweaks(t) {
const root = document.documentElement;
const p = ACCENTS[t.accent] || ACCENTS['#E8C547'];
root.style.setProperty('--gold', t.accent);
root.style.setProperty('--gold-bright', p.bright);
root.style.setProperty('--gold-deep', p.deep);
root.style.setProperty('--gold-strong', p.strong);
root.style.setProperty('--gold-tint', p.tint);
root.style.setProperty('--gold-tint-2', p.tint2);
root.style.setProperty('--gold-line', p.line);
root.style.setProperty('--gold-glow', p.glow);
root.style.setProperty('--grad-gold', `linear-gradient(135deg,${p.bright},${t.accent} 46%,${p.deep})`);
root.style.setProperty('--sec-pad', t.secPad + 'px');
ensureFont(t.headingFont);
root.style.setProperty('--f-head', `'${t.headingFont}', system-ui, sans-serif`);
document.body.setAttribute('data-hero', t.hero);
}
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
React.useEffect(() => { applyTweaks(t); }, [t]);
return (
setTweak('hero', v)} />
setTweak('accent', v)} />
setTweak('headingFont', v)} />
setTweak('secPad', v)} />
);
}
// применяем дефолты сразу (до интеракции пользователя)
applyTweaks(TWEAK_DEFAULTS);
const __twkMount = document.createElement('div');
document.body.appendChild(__twkMount);
ReactDOM.createRoot(__twkMount).render();