const { useState: useState4, useEffect: useEffect4 } = React;
/* =========================================================
TWEAKS PANEL (variant switch, persisted)
========================================================= */
window.TweaksPanel = function TweaksPanel({ variant, setVariant, accent, setAccent }) {
const [open, setOpen] = useState4(false);
useEffect4(() => {
const handler = (e) => {
if (e.data?.type === '__activate_edit_mode') setOpen(true);
if (e.data?.type === '__deactivate_edit_mode') setOpen(false);
};
window.addEventListener('message', handler);
window.parent.postMessage({type:'__edit_mode_available'}, '*');
return () => window.removeEventListener('message', handler);
}, []);
const commit = (edits) => {
window.parent.postMessage({type:'__edit_mode_set_keys', edits}, '*');
};
if (!open) return null;
return (
Дизайн
{[
['corporate', 'Corporate'],
['warm', 'Warm'],
['bold', 'Bold'],
].map(([v, l]) => (
))}
{[
['serif', 'Editorial'],
['sans', 'Sans'],
].map(([v, l]) => (
))}
3 напрямки: Corporate — синій + editorial, Warm — теплі тони amber, Bold — чорний + жовтий акцент.
);
};
/* =========================================================
COOKIE BANNER + STICKY MESSENGERS
========================================================= */
window.CookieBanner = function CookieBanner() {
const [show, setShow] = useState4(true);
if (!show) return null;
return (
Ми використовуємо cookies для покращення роботи сайту. Продовжуючи, ви погоджуєтесь з Політикою конфіденційності.
);
};
window.StickyMessengers = function StickyMessengers() {
return (
);
};
/* =========================================================
ROOT APP
========================================================= */
function App() {
const TWEAKS = /*EDITMODE-BEGIN*/{
"variant": "corporate",
"accent": "serif"
}/*EDITMODE-END*/;
const [variant, setVariant] = useState4(TWEAKS.variant);
const [accent, setAccent] = useState4(TWEAKS.accent);
const [lang, setLang] = useState4(() => {
try { return localStorage.getItem('mosty_lang') || 'UA'; } catch(e) { return 'UA'; }
});
useEffect4(() => {
document.documentElement.setAttribute('data-variant', variant);
document.documentElement.setAttribute('data-accent', accent);
}, [variant, accent]);
// Set data-lang SYNCHRONOUSLY before render so t() reads correct value
if (typeof document !== 'undefined') {
document.documentElement.setAttribute('data-lang', lang);
}
useEffect4(() => {
document.documentElement.setAttribute('data-lang', lang);
document.documentElement.setAttribute('lang', lang === 'RU' ? 'ru' : 'uk');
try { localStorage.setItem('mosty_lang', lang); } catch(e) {}
if (window.I18N && window.I18N[lang]) {
document.title = window.I18N[lang].title;
const desc = document.querySelector('meta[name="description"]');
if (desc) desc.setAttribute('content', window.I18N[lang].description);
const kw = document.querySelector('meta[name="keywords"]');
if (kw) kw.setAttribute('content', window.I18N[lang].keywords);
}
}, [lang]);
return (
);
}
ReactDOM.createRoot(document.getElementById('root')).render();