// 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();