/* ===================== App ===================== */ const { useState: useStateA, useEffect: useEffectA } = React; const TWEAK_DEFAULS = /*EDITMODE-BEGIN*/{ "lang": "es", "accent": "#D2DE32", "showHeroBadges": true, "scrollHint": false }/*EDITMODE-END*/; function App() { // Persisted tweaks const tweaks = useTweaks(TWEAK_DEFAULS); // Local state const [route, setRoute] = useStateA(() => { const hash = window.location.hash.replace("#", ""); return ["home", "planes", "sobre", "contacto"].includes(hash) ? hash : "home"; }); const [lang, setLangLocal] = useStateA(tweaks.lang || "es"); const [prefilledPlan, setPrefilledPlan] = useStateA(""); // Sync language tweak <-> state useEffectA(() => { if (tweaks.lang && tweaks.lang !== lang) setLangLocal(tweaks.lang); }, [tweaks.lang]); const setLang = (l) => { setLangLocal(l); tweaks.setTweak("lang", l); }; // Sync URL hash useEffectA(() => { if (window.location.hash.replace("#", "") !== route) { history.replaceState(null, "", "#" + route); } }, [route]); // Hash change listener useEffectA(() => { const onHash = () => { const h = window.location.hash.replace("#", ""); if (["home", "planes", "sobre", "contacto"].includes(h)) setRoute(h); }; window.addEventListener("hashchange", onHash); // Expose for external automation (PPTX export) window.__abGo = (r) => { if (["home", "planes", "sobre", "contacto"].includes(r)) setRoute(r); }; return () => window.removeEventListener("hashchange", onHash); }, []); // Apply accent color tweak useEffectA(() => { if (tweaks.accent) { document.documentElement.style.setProperty("--ab-accent", tweaks.accent); } }, [tweaks.accent]); const pageProps = { lang, setRoute, setPrefilledPlan, prefilledPlan }; return (
{route === "home" && } {route === "planes" && } {route === "sobre" && } {route === "contacto" && }