// app.jsx — Main app: i18n, tweaks, top nav, scroll reveal, assembly const { useState: useStateA, useEffect: useEffectA, useRef: useRefA } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "lang": "es", "hero_variant": "A" }/*EDITMODE-END*/; function useScrollReveal() { useEffectA(() => { if (typeof IntersectionObserver === 'undefined') return; const io = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add('in'); io.unobserve(entry.target); } }); }, { threshold: 0.12, rootMargin: '0px 0px -8% 0px' }); const scan = () => { document.querySelectorAll('.reveal:not(.in)').forEach((el) => io.observe(el)); }; scan(); // Rescan when language or hero variant changes (new DOM) const id = setInterval(scan, 600); return () => { io.disconnect(); clearInterval(id); }; }, []); } function TopNav({ t, lang, setLang }) { const [open, setOpen] = useStateA(false); useEffectA(() => { document.body.style.overflow = open ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [open]); const navLinks = [ ['#bio', t.nav.bio], ['#palmares', t.nav.palmares], ['#clubes', t.nav.clubs], ['#filosofia', t.nav.philo], ['#duo', t.nav.duo], ['#archivo', t.nav.gallery], ['#contacto', t.nav.contact], ]; return ( <>