/* Embedded static pages (Home navy, Médicos, Programa Lealtad) * Renders the original hand-built HTML with its CSS scoped under a wrapper * class so it can't collide with styles.css. Internal links carry data-nav * and are routed through the SPA navigate(). */ function EmbeddedPage({ data, scope, navigate, onMount }) { const ref = React.useRef(null); React.useEffect(() => { const el = ref.current; if (!el) return; const onClick = (e) => { const a = e.target.closest("[data-nav]"); if (a && el.contains(a)) { e.preventDefault(); navigate(a.getAttribute("data-nav")); window.scrollTo({ top: 0, behavior: "instant" }); } }; el.addEventListener("click", onClick); const cleanup = onMount ? onMount(el) : null; return () => { el.removeEventListener("click", onClick); if (cleanup) cleanup(); }; }, [data, navigate, onMount]); if (!data) return null; return (
); } /* Home behavior: tabs de audiencias, accesos rapidos por ID real, * submit del buscador y carrusel manual de destacados. * Todo queda dentro del wrapper .embed-home; no toca las otras paginas embebidas. */ function makeInitHome(openStudy, navigate, openArticle) { return function initHome(el) { const offs = []; /* Tabs de audiencias */ const tabs = el.querySelector("#tabs"); if (tabs) { const onTab = (e) => { const btn = e.target.closest(".tab"); if (!btn) return; const key = btn.getAttribute("data-tab"); el.querySelectorAll("#tabs .tab").forEach(t => t.classList.toggle("active", t === btn)); el.querySelectorAll(".panel").forEach(p => p.classList.toggle("active", p.id === "panel-" + key)); }; tabs.addEventListener("click", onTab); offs.push(() => tabs.removeEventListener("click", onTab)); } /* Accesos rapidos -> detalle del estudio por ID real del prototipo */ const onStudy = (e) => { const a = e.target.closest("[data-study]"); if (!a || !el.contains(a)) return; e.preventDefault(); if (openStudy) openStudy(a.getAttribute("data-study")); }; el.addEventListener("click", onStudy); offs.push(() => el.removeEventListener("click", onStudy)); /* Tarjetas del bloque Blog -> artículo real del prototipo */ const onArticle = (e) => { const a = e.target.closest("[data-article]"); if (!a || !el.contains(a)) return; e.preventDefault(); if (openArticle) openArticle(a.getAttribute("data-article")); }; el.addEventListener("click", onArticle); offs.push(() => el.removeEventListener("click", onArticle)); /* Buscador del hero -> catalogo (destino real; no simula resultados) */ const form = el.querySelector(".search-field"); if (form) { const onSubmit = (e) => { e.preventDefault(); if (navigate) navigate("catalogo"); }; form.addEventListener("submit", onSubmit); offs.push(() => form.removeEventListener("submit", onSubmit)); } /* Carrusel de destacados: flechas accesibles, sin autoplay */ const track = el.querySelector("#dest-track"); if (track) { const arrows = el.querySelectorAll("[data-dest]"); const step = () => { const card = track.querySelector(".dest-card"); return card ? card.offsetWidth + 20 : 320; }; const sync = () => { const max = track.scrollWidth - track.clientWidth - 2; arrows.forEach(b => { const isPrev = b.getAttribute("data-dest") === "prev"; b.disabled = isPrev ? track.scrollLeft <= 2 : track.scrollLeft >= max; }); }; const onArrow = (e) => { const b = e.currentTarget; track.scrollBy({ left: b.getAttribute("data-dest") === "prev" ? -step() : step(), behavior: "smooth" }); }; arrows.forEach(b => b.addEventListener("click", onArrow)); track.addEventListener("scroll", sync); window.addEventListener("resize", sync); sync(); offs.push(() => { arrows.forEach(b => b.removeEventListener("click", onArrow)); track.removeEventListener("scroll", sync); window.removeEventListener("resize", sync); }); } return () => offs.forEach(f => f()); }; } function HomeNavy({ navigate, openStudy, openArticle }) { /* El bloque Blog del Home vive en src/embed-home.js, fuente real de la Home * embebida. Sus tarjetas navegan por data-article / data-nav. */ const onMount = React.useCallback( (el) => makeInitHome(openStudy, navigate, openArticle)(el), [openStudy, navigate, openArticle] ); return ; } function MedicosNavy({ navigate }) { return ; } function LealtadPage({ navigate }) { return ; } Object.assign(window, { EmbeddedPage, HomeNavy, MedicosNavy, LealtadPage });