// Main App for Zubeltzu Torre — multi-page (tabs) const { useState: useStateA, useEffect: useEffectA, useRef: useRefA, useCallback: useCallbackA } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "musgo", "typeface": "editorial", "parallax": 1, "cursor": false, "mist": true, "hero": "classic", "lang": "es" }/*EDITMODE-END*/; function applyPalette(key) { const p = window.SITE.palettes[key]; if (!p) return; const root = document.documentElement; Object.entries(p).forEach(([k,v]) => { if (k.startsWith("--c-")) root.style.setProperty(k, v); }); } function applyTypeface(key) { const f = window.SITE.typefaces[key]; if (!f) return; const root = document.documentElement; Object.entries(f).forEach(([k,v]) => { if (k.startsWith("--f-")) root.style.setProperty(k, v); }); } const PAGES = ["home","entorno","galeria","contacto"]; function App() { const [tw, setTw] = useTweaks(TWEAK_DEFAULTS); const [lang, setLang] = useStateA(tw.lang || "es"); const [page, setPage] = useStateA("home"); const [transitioning, setTransitioning] = useStateA(false); const [displayPage, setDisplayPage] = useStateA("home"); const [bookingOpen, setBookingOpen] = useStateA(false); const [legalModal, setLegalModal] = useStateA(null); // Filtro con el que abrir la galería (p. ej. al pulsar una tarjeta de alojamiento) const [galFilter, setGalFilter] = useStateA("all"); useEffectA(() => { applyPalette(tw.palette); }, [tw.palette]); useEffectA(() => { applyTypeface(tw.typeface); }, [tw.typeface]); useEffectA(() => { document.documentElement.style.setProperty("--parallax", String(tw.parallax)); }, [tw.parallax]); const tx = window.I18N[lang]; // `filter` opcional: abre la galería directamente en esa categoría. const goTo = useCallbackA((next, filter) => { setGalFilter(filter || "all"); if (next === page) { window.scrollTo({ top: 0, behavior: "smooth" }); return; } setTransitioning(true); setPage(next); setTimeout(() => { setDisplayPage(next); window.scrollTo({ top: 0, behavior: "instant" }); requestAnimationFrame(() => setTransitioning(false)); }, 380); }, [page]); const openBooking = useCallbackA(() => setBookingOpen(true), []); const closeBooking = useCallbackA(() => setBookingOpen(false), []); // ESC closes booking modal useEffectA(() => { const onKey = (e) => { if (e.key === "Escape") setBookingOpen(false); }; window.addEventListener("keydown", onKey); return () => window.removeEventListener("keydown", onKey); }, []); return ( <>