/* Decretando Disney — pantallas. Exporta Home, Nosotros, Contacto, CategoryScreen, DestinationScreen, ReservaScreen */ (function(){ const { useState } = React; const Ic = window.DDIcons; /* Gestor global: solo UN video se reproduce a la vez (el más visible, o el que el usuario señala con el mouse). Evita que compitan por CPU/GPU. */ const VM = { vids: new Map(), // el -> ratio de visibilidad hovered: null, update(){ let best = null; if(this.hovered && (this.vids.get(this.hovered) || 0) > 0){ best = this.hovered; } else { let max = 0.2; // mínimo para arrancar this.vids.forEach((r, el)=>{ if(r > max){ max = r; best = el; } }); } this.vids.forEach((r, el)=>{ if(el === best){ el.play().catch(()=>{}); } else if(!el.paused){ el.pause(); } }); } }; function lazyVideo(el){ if(!el || el.__ddio) return; el.muted = true; const io = new IntersectionObserver((entries)=>{ entries.forEach(e=>{ VM.vids.set(el, e.isIntersecting ? e.intersectionRatio : 0); }); VM.update(); }, {threshold:[0,.2,.4,.6,.8,1]}); io.observe(el); el.__ddio = io; el.addEventListener('pointerenter', ()=>{ VM.hovered = el; VM.update(); }); el.addEventListener('pointerleave', ()=>{ if(VM.hovered === el) VM.hovered = null; VM.update(); }); } /* ===================== INICIO ===================== */ function Home({ nav, openMenu }){ const cats = window.DD_DATA.categorias; const scrollCats = ()=>{ const el = document.getElementById('home-cats'); if(el) el.scrollIntoView ? el.parentNode.scrollTo({top:el.offsetTop-90, behavior:'smooth'}) : null; }; return (
Decretando Disney
Con Martín & Mica · Agencia de viajes

Decretá tu próxima aventura

Armamos el viaje de tus sueños a medida. Parques, playas paradisíacas y ciudades increíbles te esperan. ¿Empezamos a planear?

Mirá los destinos

¿A dónde querés ir?

Elegí un destino y dejá que la magia haga el resto.

{cats.map(c=>{ const Icn = Ic[c.icono]; return (
nav({name:'category', catId:c.id})}> {c.nombre} {c.tagline}
);})}

Mirá lo que te espera

Un adelanto en movimiento de la magia que vas a vivir.

nav({name:'destination', catId:'disney-world', destId:'magic-kingdom'})}>

Magic Kingdom · Disney World

Ver destino
nav({name:'destination', catId:'disney-world', destId:'epcot'})}>

EPCOT · Disney World

Ver destino
nav({name:'destination', catId:'universal', destId:'universal-florida'})}>

Universal Studios

Ver destino
nav({name:'destination', catId:'disney-world', destId:'animal-kingdom'})}>

Animal Kingdom · Disney World

Ver destino

Lo que dicen nuestros viajeros

Historias reales de quienes ya decretaron su viaje con nosotros.

{window.DD_DATA.testimonios.map((t,i)=>(
★★★★★
“{t.texto}”
{t.nombre} vía {t.fuente}
))}
); } /* ===================== NOSOTROS ===================== */ function Nosotros({ nav }){ const n = window.DD_DATA.nosotros; return (
Nosotros

{n.titulo}

Detrás de cada viaje hay dos personas que aman lo que hacen.

{n.parrafos.map((p,i)=>

{p}

)}
Martín y Mica junto a Mickey
Martín & Mica
{n.valores.map((v,i)=>(

{v.t}

{v.d}

))}
); } /* ===================== CONTACTANOS ===================== */ function Contacto({ nav }){ const c = window.DD_DATA.contacto; const igUser = c.instagram.replace('@',''); return (
Contactanos

Hablemos de tu viaje

Escribinos por donde te quede más cómodo. Te respondemos con toda la onda para empezar a armar tu plan.

Mail
{c.mails.map((m,i)=>{m})} Te respondemos dentro de las 24 hs.
Teléfono / WhatsApp
{c.telefonos.map((t,i)=>( {t.quien}: {t.num} ))} Tocá para escribirnos por WhatsApp.
Instagram
{c.instagram} Seguinos para inspirarte con cada destino.
); } /* ===================== CATEGORÍA ===================== */ function CategoryScreen({ cat, nav }){ const Icn = Ic[cat.icono]; return (
{cat.tagline}

{cat.nombre}

{cat.hero} Elegí tu destino y descubrí todo lo que te espera.

{cat.destinos.map(d=>(
nav({name:'destination', catId:cat.id, destId:d.id})}>
{cat.nombre} {d.img ? {d.nombre} : }

{d.nombre}

{d.resumen}

Ver destino
))}
); } /* ===================== DETALLE DESTINO ===================== */ function DestinationScreen({ cat, dest, nav }){ return (
{dest.img ? {dest.nombre} : }
nav({name:'category', catId:cat.id})}> {cat.nombre}

{dest.nombre}

Sobre este destino

{dest.desc}

{dest.video && (

Viví un adelanto ✨

)} {/* barra fija en mobile */}
); } /* ===================== RESERVA ===================== */ function ReservaScreen({ cat, dest, nav }){ const [f,setF] = useState({nombre:'',apellido:'',telefono:'',mail:'',obs:''}); const [errs,setErrs] = useState({}); const [sent,setSent] = useState(false); const mails = window.DD_DATA.contacto.mails; const set = (k)=>(e)=>{ setF({...f,[k]:e.target.value}); if(errs[k]) setErrs({...errs,[k]:false}); }; const validate = ()=>{ const e={}; if(!f.nombre.trim()) e.nombre=true; if(!f.apellido.trim()) e.apellido=true; if(!f.telefono.trim()) e.telefono=true; if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(f.mail.trim())) e.mail=true; setErrs(e); return Object.keys(e).length===0; }; const submit = (ev)=>{ ev.preventDefault(); if(!validate()) return; const asunto = `Nueva reserva: ${dest.nombre} (${cat.nombre})`; const cuerpo = `¡Hola Martín & Mica! Quiero reservar mi lugar. Destino: ${dest.nombre} — ${cat.nombre} Nombre: ${f.nombre} Apellido: ${f.apellido} Teléfono: ${f.telefono} Mail: ${f.mail} Observaciones: ${f.obs || '—'} ¡Gracias!`; const url = `mailto:${mails.join(',')}?subject=${encodeURIComponent(asunto)}&body=${encodeURIComponent(cuerpo)}`; window.location.href = url; setSent(true); }; if(sent){ return (

¡Reserva enviada!

Se abrió tu correo con todos los datos listos para enviar a la agencia. Apenas lo recibamos, Martín o Mica te contactan para armar tu viaje a {dest.nombre}.

); } const field = (k,label,type,opts={})=>(
{opts.area ? : } {errs[k] && {opts.errMsg||'Completá este campo'}}
); return (
Reservá tu lugar

Casi listo para viajar

Reservás: {dest.nombre} · {cat.nombre}

Tus datos

Completá la ficha y te contactamos para armar tu plan. Los campos con * son obligatorios.

{field('nombre','Nombre','text',{req:true,ph:'Ej: María'})} {field('apellido','Apellido','text',{req:true,ph:'Ej: González'})} {field('telefono','Teléfono','tel',{req:true,ph:'+54 9 11 ...',inputMode:'tel'})} {field('mail','Email','email',{req:true,ph:'tucorreo@mail.com',inputMode:'email',errMsg:'Ingresá un email válido'})} {field('obs','Observaciones','text',{full:true,area:true,ph:'Fechas tentativas, cantidad de personas, lo que quieras contarnos... (opcional)'})}
Al enviar, tus datos llegan por mail a la agencia para que te contactemos. No se comparten con nadie más.
); } Object.assign(window, { Home, Nosotros, Contacto, CategoryScreen, DestinationScreen, ReservaScreen }); })();