// app.jsx — root component, router state, tweaks const { useState, useEffect, useMemo } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "lang": "ru", "accent": "blush", "layout": "grid", "pattern": "subtle", "darkNav": false }/*EDITMODE-END*/; const ACCENT_OPTIONS = { blush: 'var(--blush)', clay: 'var(--clay)', sage: '#9FAA8E', ink: 'var(--ink)', }; function App() { const [t, setTweak] = useTweaks(TWEAK_DEFAULTS); const [route, setRoute] = useState(() => { const hash = window.location.hash.replace('#', ''); return ['gallery','about','order'].includes(hash) ? hash : 'home'; }); const [tgOpen, setTgOpen] = useState(false); const [tgProduct, setTgProduct] = useState(null); const [scrolled, setScrolled] = useState(false); // apply accent var globally useEffect(() => { document.documentElement.style.setProperty('--accent', ACCENT_OPTIONS[t.accent] || 'var(--blush)'); }, [t.accent]); // scroll listener for nav state useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 16); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); // scroll to top on route change useEffect(() => { window.scrollTo({ top: 0, behavior: 'instant' in window ? 'instant' : 'auto' }); }, [route]); const lang = t.lang; const copy = COPY[lang]; const accent = ACCENT_OPTIONS[t.accent] || 'var(--blush)'; const openTelegram = (p) => { setTgProduct(p && p.title ? p.title[lang] : null); setTgOpen(true); }; return (
); } ReactDOM.createRoot(document.getElementById('root')).render();