/* VoxiConf — Tweaks: 3 варианта стиля + акцент + плотность */ const { useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakColor, TweakSelect } = window; const VOX_DEFAULTS = /*EDITMODE-BEGIN*/{ "theme": "midnight", "accent": "#2fd4c7", "radius": "обычные" }/*EDITMODE-END*/; const THEME_LABELS = { graphite: "Графит", midnight: "Полночь", steel: "Сталь" }; // each theme has a tasteful default accent const THEME_ACCENTS = { graphite: "#4d7cfe", midnight: "#2fd4c7", steel: "#c9a25e" }; const ACCENTS = ["#4d7cfe", "#2fd4c7", "#a47cff", "#c9a25e", "#e8633a"]; function accentPair(hex) { // lighten for the -2 variant const n = parseInt(hex.slice(1), 16); let r = (n >> 16) & 255, g = (n >> 8) & 255, b = n & 255; r = Math.round(r + (255 - r) * 0.28); g = Math.round(g + (255 - g) * 0.28); b = Math.round(b + (255 - b) * 0.28); return "#" + [r, g, b].map(x => x.toString(16).padStart(2, "0")).join(""); } function rgba(hex, a) { const n = parseInt(hex.slice(1), 16); return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})`; } function luminance(hex) { const n = parseInt(hex.slice(1), 16); const r = (n >> 16) & 255, g = (n >> 8) & 255, b = n & 255; return (0.299 * r + 0.587 * g + 0.114 * b) / 255; } const RADII = { "острые": ["6px", "10px", "14px"], "обычные": ["10px", "16px", "22px"], "мягкие": ["14px", "22px", "30px"] }; function App() { const [t, setTweak] = useTweaks(VOX_DEFAULTS); React.useEffect(() => { const root = document.documentElement; root.setAttribute("data-theme", t.theme); const acc = t.accent; root.style.setProperty("--accent", acc); root.style.setProperty("--accent-2", accentPair(acc)); root.style.setProperty("--accent-ink", luminance(acc) > 0.62 ? "#15110a" : "#ffffff"); root.style.setProperty("--accent-glow", rgba(acc, 0.28)); root.style.setProperty("--accent-soft", rgba(acc, 0.12)); const r = RADII[t.radius] || RADII["обычные"]; root.style.setProperty("--radius-s", r[0]); root.style.setProperty("--radius", r[1]); root.style.setProperty("--radius-l", r[2]); }, [t.theme, t.accent, t.radius]); function setTheme(theme) { // switching theme resets accent to that theme's signature color setTweak({ theme: theme, accent: THEME_ACCENTS[theme] }); } return ( setTweak("accent", v)} /> setTweak("radius", v)} /> ); } ReactDOM.createRoot(document.getElementById("tweaks-root")).render();