/* global React, ReactDOM, CONTENT, Cursor, Nav, Footer, HomePage, ServicesPage, AboutPage, ContactPage, useTweaks, TweaksPanel, TweakSection, TweakRadio, TweakSelect, TweakColor */
const { useState, useEffect } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"palette": "violet",
"heroLayout": "editorial",
"intensity": "balanced"
}/*EDITMODE-END*/;
const PALETTES = {
violet: { bg: "0.13 0.025 285", accent: "0.72 0.24 295", accent2: "0.82 0.16 220" },
emerald: { bg: "0.13 0.025 165", accent: "0.78 0.22 165", accent2: "0.85 0.16 200" },
amber: { bg: "0.13 0.02 60", accent: "0.80 0.20 70", accent2: "0.78 0.16 30" },
mono: { bg: "0.13 0.005 270", accent: "0.85 0.005 270", accent2: "0.65 0.01 270" }
};
function App() {
const [page, setPage] = useState('home');
const [lang, setLang] = useState('pt');
const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS);
const [tweaksOpen, setTweaksOpen] = useState(false);
const [transitioning, setTransitioning] = useState(false);
// Apply palette tweak to CSS variables
useEffect(() => {
const p = PALETTES[tweaks.palette] || PALETTES.violet;
const root = document.documentElement;
root.style.setProperty('--bg-0', `oklch(${p.bg})`);
root.style.setProperty('--bg-1', `oklch(${p.bg.replace(/^[\d.]+/, m => (parseFloat(m) + 0.04).toFixed(2))})`);
root.style.setProperty('--bg-2', `oklch(${p.bg.replace(/^[\d.]+/, m => (parseFloat(m) + 0.09).toFixed(2))})`);
root.style.setProperty('--violet', `oklch(${p.accent})`);
root.style.setProperty('--violet-glow', `oklch(${p.accent} / 0.45)`);
root.style.setProperty('--cyan', `oklch(${p.accent2})`);
root.style.setProperty('--cyan-glow', `oklch(${p.accent2} / 0.4)`);
}, [tweaks.palette]);
// Tweaks host protocol
useEffect(() => {
const onMessage = (e) => {
if (!e.data) return;
if (e.data.type === '__activate_edit_mode') setTweaksOpen(true);
if (e.data.type === '__deactivate_edit_mode') setTweaksOpen(false);
};
window.addEventListener('message', onMessage);
window.parent.postMessage({type: '__edit_mode_available'}, '*');
return () => window.removeEventListener('message', onMessage);
}, []);
// Page navigation with wipe transition
const navigate = (newPage) => {
if (newPage === page) return;
setTransitioning(true);
setTimeout(() => {
setPage(newPage);
window.scrollTo(0, 0);
}, 450);
setTimeout(() => setTransitioning(false), 950);
};
const t = CONTENT[lang];
let pageEl;
if (page === 'home') pageEl =