La escapada perfecta, hecha a la medida


/* <![CDATA[ */ window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);} gtag("set","linker",{"domains":["mex-best.mx"]}); gtag("js", new Date()); gtag("set", "developer_id.dZTNiMT", true); gtag("config", "GT-M39946KQ"); window._googlesitekit = window._googlesitekit || {}; window._googlesitekit.throttledEvents = []; window._googlesitekit.gtagEvent = (name, data) => { var key = JSON.stringify( { name, data } ); if ( !! window._googlesitekit.throttledEvents[ key ] ) { return; } window._googlesitekit.throttledEvents[ key ] = true; setTimeout( () => { delete window._googlesitekit.throttledEvents[ key ]; }, 5 ); gtag( "event", name, { ...data, event_source: "site-kit" } ); } /* ]]> */



La escapada perfecta, hecha a la medida




.tit1 { text-align: center; font-family: "DM Serif Text", serif; font-weight: 400; font-style: normal; font-size: 5vw; padding: 25% 0% 25% 0px; color: #fff; text-transform: uppercase; text-shadow: 0px 4px 6px #333; } h1{ font-family: "DM Serif Text", serif; font-weight: 400; font-style: normal; } /*Header*/ /*Button*/ button.vm { font-size: 16px; letter-spacing: 2px; text-transform: uppercase; display: inline-block; text-align: center; font-weight: regular; padding: 0.7em 2em; border: 1px solid #333; border-radius: 2px; position: relative; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.1); color: #333; text-decoration: none; transition: 0.3s ease all; z-index: 1; }

button.vm:before { transition: 0.5s all ease; position: absolute; top: 0; left: 50%; right: 50%; bottom: 0; opacity: 0; content: ''; background-color: #333; z-index: -1; }

button.vm:hover, button:focus { color: white; }

button.vm:hover:before, button:focus:before { transition: 0.5s all ease; left: 0; right: 0; opacity: 1; }

.rosa{ background: #1f2123;}

button.vm:active { transform: scale(0.9); } /*Button*/

.blanco{ background: #ffffff; } .blanco2{ background: #f1f1f1; } .bajada{ font-size: 1.2rem; } .txt-b{ color: #000; }

.txt-w{ color: #fff; } a.presentado{ text-decoration: none; color: #000; font-size: 12px; } .back-1{ background-image: url(https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/marriot-5.jpg); background-attachment: fixed; background-size: cover; background-position: bottom; color: #fff; }

.glass{ /* From https://css.glass */ background: rgba(46, 46, 46, 0.16); border-radius: 16px; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); backdrop-filter: blur(5.5px); -webkit-backdrop-filter: blur(5.5px); border: 0.5px solid #f1f1f1; }

.p-5 { padding: 1rem ; }

.box{ height: 150px; color: #fff; }

.circulo{ filter: drop-shadow(0px 6px 9px #9C9C9C); } a.link{ color: #2d2d2d; } a.link:hover{ color: #fff; } .destacado{ /* From https://css.glass */background: rgba(0, 0, 0, 0.16); border-radius: 16px; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); backdrop-filter: blur(5.5px); -webkit-backdrop-filter: blur(5.5px); }

.destacado2{ /* From https://css.glass */background: rgba(255, 255, 255, 0.16); border-radius: 16px; box-shadow: 0 4px 30px rgba(255, 255, 255, 0.1); backdrop-filter: blur(5.5px); -webkit-backdrop-filter: blur(5.5px); border: solid 1px #fff; color: #fff; } .autor{ font-size: 0.8rem; }

/*---Bootstrap--*/ .aire{ padding-right: calc(var(--bs-gutter-x) * 0.0); padding-left: calc(var(--bs-gutter-x) * 0.0); } .carousel-caption { position: static; text-align: center; }

.bg-b{ background: #000; }

@media only screen and (max-width: 700px) { body{ font-family: "Forum", serif; font-weight: 400; font-style: normal; font-size: 11px; letter-spacing: 1px; color: var(--gris); }

.tit1 {

font-size: 10vw; padding: 35% 0% 25% 0px; color: #fff; text-transform: uppercase; text-shadow: 0px 4px 6px #333; } .oper { background-image: url(https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/marriot-portada-m.jpg); } .box{ height: 130px; color: #fff; } .logomarriot{ width: 50%; } }

:root{ --ink:#0e2330; --card:#0b1b24; --cardText:#e8f4f6; --coral:#FFB995; --white: #F9F6F4; --blue: #CEDCDF; --yellow: #FFDAA0; --green: #CFE0D2; --black: #25282A;

} .poster__title{ display: none; } html,body{height:100%} body{ margin:0; font-family: "Forum", serif; font-weight: 400; font-style: normal; color:var(--ink); } .wrap{max-width:1200px;margin:auto;padding:1.25rem} .title{font-weight:800}

.wrap{max-width:1200px;margin:auto;padding:1.25rem} .mapbox{ position:relative;width:100%;border-radius:22px;overflow:hidden;background:#fff; box-shadow:0 18px 60px rgba(9,24,32,.25); }

/* Capas mapa desktop */ .bg,.dim-layer,.hits{position:absolute;inset:0} .bg{ z-index:1; pointer-events:none; background:center/cover no-repeat; transition: transform .65s cubic-bezier(.175,.885,.32,1.275), filter .35s ease; will-change: transform, filter; } .dim-layer{ z-index:2; background:rgba(0,0,0,.25); opacity:0; pointer-events:none; transition:opacity .25s ease; } .map-hover-active .dim-layer{ opacity:1; } .hits{ z-index:3; pointer-events:auto; } .mapbox svg{display:block;width:100%;height:100%}

/* Interacción SVG */ .hits svg, .hits svg * { pointer-events:auto ; } .region{ cursor:pointer; fill: var(--overlay, rgba(255,255,255,0.16)); stroke: transparent; transition: fill .18s ease, filter .18s ease, transform .38s cubic-bezier(.175,.885,.32,1.275); transform-origin:center center; mix-blend-mode: multiply; } .region:hover, .region:focus-visible{ filter: brightness(1.35) saturate(1.25); transform: scale(1.003); outline:none; }

/* Modal desktop */ .country-card{background:var(--card);color:var(--cardText)} .modal-header .btn-close{filter:invert(1) grayscale(1)} .modal-body img{ border-radius:12px }

/* -------- PÓSTER DE TEXTO (solo móvil) -------- */ .poster{ position:relative; border-radius:16px; overflow:hidden; color:#fff; min-height:260px; box-shadow:0 14px 40px rgba(0,0,0,.2); background:#0b1b24; /* fallback */ } .poster__bg{ position:absolute; inset:0; background-size:cover; background-position:center; filter: blur(6px) saturate(1.1) brightness(.65); transform: scale(1.05); } .poster__overlay{ position:absolute; inset:0; background: linear-gradient(180deg, rgba(7,15,20,.6) 0%, rgba(7,15,20,.75) 40%, rgba(7,15,20,.9) 100%); } .poster__content{ position:relative; z-index:2; padding:16px 14px 14px 14px; } .poster__eyebrow{ display:inline-block; font-size:.72rem; letter-spacing:.06em; text-transform:uppercase; background:rgba(131,212,196,.16); color:#e8f4f6; border:1px solid rgba(131,212,196,.35); padding:.25rem .5rem; border-radius:999px; margin-bottom:.4rem; } .poster__title{ font-weight:800; line-height:1.1; margin:0 0 .4rem 0; font-size:1.15rem; color:#fff; text-shadow:0 1px 0 rgba(0,0,0,.4); } .poster__subtitle{ color:#d9f2ee; opacity:.95; margin:0 0 .6rem 0; font-size:.95rem; } .poster__list{ margin:0; padding:0; list-style:none; } .poster__list li{ display:flex; gap:.5rem; align-items:flex-start; padding:.35rem 0; color:#e9fcf8; font-size:.95rem; border-top:1px dashed rgba(255,255,255,.15); } .poster__list li:first-child{ border-top:none } .poster__bullet{ width:.65rem; height:.65rem; border-radius:50%; margin-top:.35rem; background:var(--accent); box-shadow:0 0 0 3px rgba(131,212,196,.15); flex:none; } .poster__foot{ display:flex; gap:.5rem; flex-wrap:wrap; margin-top:.8rem; } .tag{ font-size:.78rem; border-radius:999px; padding:.25rem .55rem; background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.18); color:#eaf8f5; }


La escapada perfecta,
hecha a la medida

Tu próxima aventura soñada te espera en el destino más codiciado.
Desde playas vírgenes hasta paisajes majestuosos.
All Inclusive by Marriott Bonvoy® te lleva a cumplir tus más grandes deseos.

Presentado por:

Para quienes buscan unas vacaciones exclusivas, con servicio personalizado, experiencias a la medida y escenarios extraordinarios, All-Inclusive by Marriott Bonvoy presenta su propuesta diseñada para elevar el arte de la hospitalidad. Una apuesta que redefine el concepto de viajar sin preocupaciones.

BIENVENIDO A ALL-INCLUSIVE BY MARRIOTT BONVOY

All-Inclusive by Marriott Bonvoy significa disfrutar de acceso a experiencias gastronómicas, de entretenimiento y bienestar, así como a diversas actividades según el tipo de viajero. Una experiencia tan placentera, que muchos deciden volver una y otra vez.

Una colección de experiencias inmersivas en resorts para cada estilo de viaje. Conéctate con el corazón de tu destino a través de experiencias memorables con otros viajeros y locales. Con presencia en los países más importantes de América Latina y el Caribe, podrás sumergirte en los destinos más codiciados con grandes marcas de donde elegir.

EL MEJOR PORTAFOLIO

Con marcas como: Marriott Hotels, W Hotels, Westin Hotels & Resorts, Delta Hotels by Marriott, además de Autograph Collection All-Inclusive Resorts, esta propuesta se adapta a cada estilo de viaje o personalidad, ofreciendo el equilibrio perfecto entre autenticidad y libertad.

Saborea momentos sorprendentes de aventura, inspiración y descubrimiento. Sumérgete. Profundiza en tu destino. Vive la cultura local a través de la gastronomía, el arte, la música y mucho más. Cada propiedad refleja el espíritu del destino en el que se encuentra para conectar con lo esencial y All-Inclusive by Marriott Bonvoy lo convierte en un viaje a la medida, pensado para que disfrutes sin límites.

UN LUGAR PARA TODO VIAJERO

Vacaciones en familia: Resorts donde todas las edades se unen a la diversión. Actividades diseñadas para niños y adolescentes, gastronomía para todos los gustos y habitaciones que combinan confort moderno con calidez hogareña.

Escapadas solo para adultos: Playas vírgenes, spas y retiros de bienestar pensados para reconectar con la pareja. Destinos ideales para celebrar el amor: aniversarios, bodas o lunas de miel con un toque inigualable de romance.

Aventuras en solitario: Resorts concebidos para el descanso y la introspección, donde cada experiencia invita a reconectar con uno mismo o con viajeros afines. Un refugio para encontrar equilibrio, inspiración y nuevos horizontes. All-Inclusive by Marriott Bonvoy garantiza tu disfrute en los mejores destinos y garantiza experiencias que te robarán el aliento.

VENTAJAS QUE ELEVAN TU ESTANCIA

Además, con el programa Marriott Bonvoy® acumulas puntos en cada estancia al reservar en marriott.com/es o en la App deMarriottBonvoy, puntos que puedes canjear por nuevas experiencias inolvidables. Por eso, cada temporada llega con ofertas exclusivas que te invitan a redescubrir el paraíso una y otra vez. Hazte socio deMarriottBonvoy® gratis y accede a tarifas exclusivas y acumula puntos para noches gratis en más de 30 marcas hoteleras de todo el mundo. Inscríbete en el programa Marriott Bonvoy

Cada detalle está diseñado para que tus vacaciones sean tan únicas como tú: desde una cena gourmet frente al mar, hasta una clase de yoga al amanecer o una aventura en plena selva. Con All-Inclusive by Marriott Bonvoy, la escapada perfecta no solo es posible… te está esperando.

CADA PUNTO EN EL MAPA ES UN ACCESO AL PARAÍSO.


México


    Costa Rica


      Jamaica


        República Dominicana


          Antigua y Barbuda


            Barbados


              Santa Lucía


                Granada


                  Brasil


                    // Imágenes originales por si quieres conservarlas como bg de póster const IMG_SRC = { mexico:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Mexico.jpg", costa_rica:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Costa-Rica.jpg", jamaica:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Jamaica.jpg", republica_dominicana:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Republica-Dominicana.jpg", antigua_y_barbuda:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Antigua-y-Barbuda.jpg", barbados:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Barbados.jpg", santa_lucia:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Santa-Lucia.jpg", granada:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Granada.jpg", brasil:"https://brandstudio956.exp.mx/publishing/2025/noviembre/marriot-mexbest-v4/img/Brasil.jpg" };

                    // Contenido textual por país (edítalo a tu gusto) const CONTENT = { mexico: { subtitle: "", bullets: [ "ROYALTON SPLASH RIVIERA CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "ROYALTON RIVIERA CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & CASINO", "ARMAR HOUSE, ALL-INCLUSIVE", "PLANET HOLLYWOOD CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "ROYALTON CHIC CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "MARRIOTT CANCUN, AN ALL-INCLUSIVE RESORT", "PLANET HOLLYWOOD ADULT SCENE CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "HIDEAWAY ROYALTON RIVIERA CANCUN, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & CASINO- ADULTS ONLY", "DELTA HOTELS BY MARRIOTT RIVIERA NAYARIT, AN ALL-INCLUSIVE RESORT", "ALMARE, A LUXURY COLLECTION ADULT ALL-INCLUSIVE RESORT, ISLA MUJERES", "PARAISO DE LA BONITA, A LUXURY COLLECTION RESORT, RIVIERA MAYA" ], tags: [] }, costa_rica: { subtitle: "", bullets: [ "THE WESTIN RESERVA CONCHAL, AN ALL-INCLUSIVE GOLF RESORT & SPA", "PLANET HOLLYWOOD COSTA RICA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "JW MARRIOTT ALL-INCLUSIVE RESORT, COSTA RICA (OPEN SPRING 2026)" ], tags: [] }, jamaica: { subtitle: "", bullets: [ "ROYALTON NEGRIL, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "HIDEAWAY AT ROYALTON BLUE WATERS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "ROYALTON BLUE WATERS MONTEGO BAY, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "HIDEAWAY AT ROYALTON NEGRIL, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "GRAND LIDO NEGRIL AU-NATUREL, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "ROYALTON CHIC JAMAICA PARADISE COVE, AN AUTOGRAPH COLLECTION ALL INCLUSIVE RESORT - ADULTS ONLY" ], tags: [] }, republica_dominicana: { subtitle: "", bullets: [ "ROYALTON BAVARO, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & CASINO", "ROYALTON SPLASH PUNTA CANA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & CASINO", "SANCTUARY CAP CANA, A LUXURY COLLECTION RESORT, ADULT ALL-INCLUSIVE", "ROYALTON CHIC PUNTA CANA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE ADULTS RESORT & CASINO", "ROYALTON PUNTA CANA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & CASINO", "HIDEAWAY AT ROYALTON PUNTA CANA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE ADULTS RESORT & CASINO", "W PUNTA CANA, ALL-INCLUSIVE" ], tags: [] }, antigua_y_barbuda: { subtitle: "", bullets: [ "ROYALTON ANTIGUA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "ROYALTON CHIC ANTIGUA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT-ADULTS ONLY" ], tags: [] }, barbados: { subtitle: "", bullets: [ "TURTLE BEACH, BARBADOS, A TRIBUTE PORTFOLIO ALL-INCLUSIVE RESORT", "TAMARIND RESORT, BARBADOS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "CRYSTAL COVE, BARBADOS, A TRIBUTE PORTFOLIO ALL-INCLUSIVE RESORT", "WAVES RESORT & SPA, BARBADOS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "TREASURE BEACH ART HOTEL, BARBADOS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "THE HOUSE, BARBADOS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT - ADULTS ONLY", "ROYALTON CHIC BARBADOS, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT ADULTS ONLY" ], tags: [] }, santa_lucia: { subtitle: "", bullets: [ "ROYALTON SAINT LUCIA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT", "HIDEAWAY AT ROYALTON SAINT LUCIA, AN AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT & SPA - ADULTS ONLY" ], tags: [] }, granada: { subtitle: "", bullets: [ "ROYALTON GRANADA, DE AUTOGRAPH COLLECTION ALL-INCLUSIVE RESORT" ], tags: [] }, brasil: { subtitle: "", bullets: [ "THE WESTIN PORTO DE GALINHAS, AN ALL-INCLUSIVE RESORT" ], tags: [] } };

                    const MODAL_MAP = { mexico:{modalId:"modal-mexico",imgId:"img-mexico"}, costa_rica:{modalId:"modal-costa_rica",imgId:"img-costa_rica"}, jamaica:{modalId:"modal-jamaica",imgId:"img-jamaica"}, republica_dominicana:{modalId:"modal-republica_dominicana",imgId:"img-republica_dominicana"}, antigua_y_barbuda:{modalId:"modal-antigua_y_barbuda",imgId:"img-antigua_y_barbuda"}, barbados:{modalId:"modal-barbados",imgId:"img-barbados"}, santa_lucia:{modalId:"modal-santa_lucia",imgId:"img-santa_lucia"}, granada:{modalId:"modal-granada",imgId:"img-granada"}, brasil:{modalId:"modal-brasil",imgId:"img-brasil"} };

                    /* =================== REFS Y UTILS =================== */const box = document.getElementById('mapbox'); const bgHolder = document.getElementById('bg'); const hitsHolder = document.getElementById('hits'); if (bgHolder) bgHolder.style.backgroundImage = `url('${BG_IMAGE}')`;

                    // Imagen del mapa en móvil const mobileMapImg = document.getElementById('mobileMapImg'); if (mobileMapImg) mobileMapImg.src = BG_IMAGE2;

                    function normKey(s){ return (s||"") .toLowerCase() .normalize("NFD").replace(/[u0300-u036f]/g,"") .replace(/&/g," y ") .replace(/[^a-z0-9]+/g,"_") .replace(/^_+|_+$/g,""); }

                    /* ====== Accesibilidad (desktop) ====== */function blurActive(){ const ae = document.activeElement; if (ae && typeof ae.blur === 'function') ae.blur(); } function wireModalFocusHandlers(){ document.querySelectorAll('.modal').forEach(m => { m.addEventListener('show.bs.modal', blurActive); m.addEventListener('hide.bs.modal', blurActive); m.addEventListener('hidden.bs.modal', () => { const map = document.getElementById('mapbox'); if (map) map.focus(); }); }); }

                    /* ====== Desktop: abre modal por clave ====== */function openModalForKey(key){ if (!key || !MODAL_MAP[key]) return; const { modalId, imgId } = MODAL_MAP[key]; const modalEl = document.getElementById(modalId); if (!modalEl) return; const imgEl = document.getElementById(imgId); if (imgEl) imgEl.src = IMG_SRC[key]; blurActive(); const inst = bootstrap.Modal.getOrCreateInstance(modalEl, { focus: false }); inst.show(); }

                    /* ====== Render póster de texto (móvil) ====== */function renderPoster(el, key){ // fondo: usa la imagen original para conservar el “diseño” como background const bg = el.querySelector('.poster__bg'); if (bg && IMG_SRC[key]) bg.style.backgroundImage = `url('${IMG_SRC[key]}')`;

                    // texto const data = CONTENT[key] || { subtitle:"", bullets:[], tags:[] }; const subtitleEl = el.querySelector('[data-field="subtitle"]'); const bulletsEl = el.querySelector('[data-field="bullets"]'); const tagsEl = el.querySelector('[data-field="tags"]');

                    if (subtitleEl) subtitleEl.textContent = data.subtitle || "";

                    if (bulletsEl){ bulletsEl.innerHTML = ""; (data.bullets || []).forEach(t=>{ const li = document.createElement('li'); const dot = document.createElement('span'); dot.className = 'poster__bullet'; const text = document.createElement('div'); text.textContent = t; li.appendChild(dot); li.appendChild(text); bulletsEl.appendChild(li); }); } if (tagsEl){ tagsEl.innerHTML = ""; (data.tags || []).forEach(t=>{ const tag = document.createElement('span'); tag.className = 'tag'; tag.textContent = t; tagsEl.appendChild(tag); }); } }

                    /* =================== INIT =================== */(async ()=>{ try{ wireModalFocusHandlers();

                    /* Desktop: carga SVG interactivo */ if (hitsHolder) { const txt = await fetch(URL_SVG, {cache:'no-store'}).then(r=>r.text()); const doc = new DOMParser().parseFromString(txt,'image/svg+xml'); const svg = doc.querySelector('svg'); if(!svg) throw new Error('Sin ');

                    const vb = svg.getAttribute('viewBox'); if (vb){ const [, , w,h] = vb.split(/s+/).map(Number); if (!isNaN(w) && !isNaN(h)) box.style.aspectRatio = `${w}/${h}`; } svg.removeAttribute('width'); svg.removeAttribute('height'); svg.style.width='100%'; svg.style.height='100%';

                    svg.querySelectorAll('[style*="pointer-events"], [pointer-events]').forEach(el=>{ try{ el.style.pointerEvents = 'auto'; el.removeAttribute('pointer-events'); }catch{} }); svg.querySelectorAll('g,path,polygon,rect,circle,polyline,ellipse').forEach(n=>{ n.classList.add('region'); const id = n.getAttribute && n.getAttribute('id'); if (id && MODAL_MAP[normKey(id)]){ n.setAttribute('tabindex','0'); n.setAttribute('role','button'); } });

                    hitsHolder.appendChild(svg);

                    svg.addEventListener('click', (ev)=>{ if (!ev.target) return; // sube hasta un con id let n = ev.target; while (n && n !== svg){ const id = n.getAttribute && n.getAttribute('id'); if (id){ const k = normKey(id); if (MODAL_MAP[k]){ openModalForKey(k); break; } } n = n.parentElement; } });

                    svg.addEventListener('keydown', (ev)=>{ if (ev.key !== 'Enter' && ev.key !== ' ') return; let n = ev.target; while (n && n !== svg){ const id = n.getAttribute && n.getAttribute('id'); if (id){ const k = normKey(id); if (MODAL_MAP[k]){ ev.preventDefault(); openModalForKey(k); break; } } n = n.parentElement; } });

                    const isTouch = matchMedia("(hover: none), (pointer: coarse)").matches || window.innerWidth < 768; function zoomOutAt(e){ if(isTouch) return; const r = box.getBoundingClientRect(); const dx = (e.clientX - (r.left + r.width/2)) / r.width; const dy = (e.clientY - (r.top + r.height/2)) / r.height; bgHolder.style.transform = `scale(0.975) translate(${dx*6}px, ${dy*4}px)`; } function resetBg(){ bgHolder.style.transform = 'scale(1) translate(0,0)'; } svg.addEventListener('pointerenter', ()=> box.classList.add('map-hover-active')); svg.addEventListener('pointerleave', ()=> { box.classList.remove('map-hover-active'); resetBg(); }); svg.addEventListener('pointermove', zoomOutAt); }

                    /* Móvil: render dinámico al expandir */ document.querySelectorAll('.accordion-collapse').forEach(col => { col.addEventListener('show.bs.collapse', () => { const key = col.getAttribute('data-key'); const poster = col.querySelector('.poster'); if (poster && !poster.dataset.rendered){ renderPoster(poster, key); poster.dataset.rendered = "1"; } }); });

                    }catch(err){ console.error('[Mapa] Error inicializando:', err); } })();