/* global React, ReactDOM */ /* app.jsx — HOME — usa shared.jsx */ const { useState: useState_, useEffect: useEffect_, useRef: useRef_ } = React; /* ────────── HERO (HOME) ────────── */ function HomeHero({ variant = 'v1' }) { const imgRef = useRef_(null); useEffect_(() => { const onScroll = () => { if (!imgRef.current) return; imgRef.current.style.transform = `translateY(${window.scrollY * 0.35}px) scale(1.05)`; }; onScroll(); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); const img = variant === 'v2' ? IMG.hero2 : variant === 'v3' ? IMG.hero3 : IMG.hero; return (
Refugio Privado
Diseño, naturaleza y exclusividad en Querétaro

{splitWords('El Tiempo es el')} {splitWords('verdadero')} {splitWords('lujo.')}

Quinta Mompaní es un refugio rodeado de naturaleza y diseño contemporáneo en Querétaro, creado para celebrar momentos que merecen quedarse para siempre. Más que un jardín para eventos, somos un espacio pensado para acompañar bodas, celebraciones y encuentros especiales con calma, belleza y atención genuina.

Conoce nuestras experiencias.
Scroll
); } /* ────────── CONCEPTO ────────── */ function Concepto() { return (

Tu Celebración.
Tu refugio.

Dos caminos para un día legendario. Eliges la intensidad de la celebración o la profundidad de la conexión, y nosotros nos adaptamos a tu visión.

— Opción 01

Celebraciones Íntimas | Entre Semana

Creamos el escenario perfecto para comidas especiales, aniversarios, pedidas de mano, cumpleaños, brunches y reuniones privadas rodeadas de naturaleza y calma.

Nuestro espacio entre semana se transforma en un refugio íntimo donde la conversación fluye, el tiempo se disfruta sin prisa y cada detalle se vive de forma más cercana y auténtica.

Conoce más
— Opción 02

Celebraciones Sociales y Bodas

Nuestros jardines y escenarios fueron diseñados para recibir bodas, aniversarios, XV años, bautizos y eventos sociales en un entorno donde la naturaleza, la arquitectura y la hospitalidad crean una experiencia elegante y profundamente humana.

Conoce más
); } /* ────────── EXPERIENCIAS ────────── */ function Experiencias() { const cards = [ { no: '01', title: 'Bodas', text: 'Celebraciones espectaculares de un día o la experiencia completa de estancia.', cta: 'Diseña tu Boda', href: '/tu-evento', img: IMG.expBoda }, { no: '02', title: 'Celebraciones Íntimas', text: 'Bautizos, cumpleaños y comuniones en nuestro acogedor Jardín Jacarandas.', cta: 'Explora Eventos Sociales', href: 'intimas.html', img: IMG.expInt }]; return null; /*return (
Para cada historia

Un escenario
para cada historia.

Tres caminos. Tres atmósferas. Cada una pensada para revelar lo extraordinario en lo cotidiano.

{cards.map((c, i) =>
— {c.no}

{c.title}

{c.text}

{c.cta}
)}
);*/ } /* ────────── PILARES ────────── */ function Pilares() { const pilares = [ { no: '01', title: 'Belleza Curada y Conveniente', text: 'Olvida la logística de rentas. Nuestros paquetes incluyen mobiliario de diseño que eleva tu celebración.' }, { no: '02', title: 'Flexibilidad Inteligente', text: 'Soluciones creativas que se adaptan a tu visión, ya sea un evento de un día o una experiencia de estancia.' }, { no: '03', title: 'Servicio de Anfitrión', text: 'Somos anfitriones, no proveedores. Nuestro equipo se anticipa a tus necesidades.' }, { no: '04', title: 'Detalles que Importan', text: 'Ambientación acuática, antorchas, barras de roble, mobiliario de parota. La magia vive en lo pequeño.' }]; const trackRef = useRef_(null); const [active, setActive] = useState_(0); const onTrackScroll = () => { const el = trackRef.current; if (!el) return; const max = el.scrollWidth - el.clientWidth; const frac = max > 0 ? el.scrollLeft / max : 0; setActive(Math.round(frac * (pilares.length - 1))); }; const goTo = (i) => { const el = trackRef.current; if (!el || !el.children[i]) return; el.children[i].scrollIntoView({ behavior: 'smooth', inline: 'start', block: 'nearest' }); }; return (
Pilares de valor

Diseño, conveniencia y calidez.

{pilares.map((p, i) =>
— {p.no}

{p.title}

{p.text}

)}
{pilares.map((_, i) =>
); } /* ────────── SOBRE (parallax bg full-bleed) ────────── */ function Sobre() { return (
Sobre el refugio

Un lugar donde el
tiempo se detiene.

Quinta Mompaní nació de la creencia de que las celebraciones más importantes merecen un escenario que esté a la altura. Más que un lugar, somos un refugio diseñado para que cada conexión, cada brindis y cada pausa sea recordada para siempre.

Aquí, la naturaleza dicta el ritmo y nosotros nos encargamos de cada detalle, para que tu única tarea sea disfrutar el momento presente con quienes más amas.

— El equipo Mompaní
); } /* ────────── ESPACIOS (slider) ────────── */ function Espacios() { const [active, setActive] = useState_(0); const espacios = [ { no: '01', title: 'La Explanada', subtitle: 'Escenario principal', text: 'El corazón de tus eventos espectaculares. Un escenario amplio y moderno con mobiliario de diseño incluido.', img: IMG.espExpl }, { no: '02', title: 'Jardín Jacarandas', subtitle: 'Escenario íntimo', text: 'Un rincón cálido e íntimo pensado para reuniones especiales, brunches, ceremonias pequeñas y celebraciones rodeadas de calma y vegetación madura.', img: IMG.espJard }, { no: '03', title: 'La Ready Room', subtitle: 'Refugio exclusivo', text: 'Un santuario privado para prepararte, compartir momentos con tus personas más cercanas y vivir la emoción previa al evento con tranquilidad y comodidad.', img: IMG.espCasa }, { no: '04', title: 'Los Jardines de Mompaní', subtitle: 'Detalles que cuidan', text: 'Senderos, árboles y espacios abiertos que conectan cada experiencia con la naturaleza, creando escenarios perfectos para ceremonias, fotografías y momentos memorables.', img: IMG.espAmen }]; const prev = () => setActive(a => (a - 1 + espacios.length) % espacios.length); const next = () => setActive(a => (a + 1) % espacios.length); return (
Los Espacios

Cuatro atmósferas.
Un mismo refugio.

{espacios.map((e, i) => (
{e.title}
{e.no} / 0{espacios.length}
{e.subtitle}

{e.title}

{e.text}

))} {/* Flechas */} {/* Puntos */}
{espacios.map((_, i) => (
); } /* ────────── MANIFIESTO ────────── */ function Manifiesto() { return (
Filosofía

Creemos que la verdadera conexión humana es el lujo más raro en un mundo acelerado. Es el recuerdo que se forja no solo en la fiesta, sino en la pausa. Es la conversación que se extiende hasta el amanecer. Es el silencio compartido bajo las jacarandas. Por eso construimos un refugio que desacelera el tiempo para que cada momento dure el doble.

); } /* ────────── GALERÍA (parallax bg con grid sobrepuesta) ────────── */ function Galeria() { const clsCycle = ['gal-1','gal-2','gal-3','gal-4','gal-5','gal-6','gal-7','gal-8','gal-9']; const items = [ { title: 'Ceremonia bajo las jacarandas', meta: 'Bodas', img: 'uploads/sesion/Mompani (1).webp', cls: clsCycle[0] }, { title: 'Jardín Jacarandas', meta: 'Espacios', img: 'uploads/sesion/Mompani (2).webp', cls: clsCycle[1] }, { title: 'Explanada principal', meta: 'Espacios', img: 'uploads/sesion/Mompani (3).webp', cls: clsCycle[2] }, { title: 'Mesa de honor', meta: 'Bodas', img: 'uploads/sesion/Mompani (4).webp', cls: clsCycle[3] }, { title: 'Decoración floral', meta: 'Detalles', img: 'uploads/sesion/Mompani (5).webp', cls: clsCycle[4] }, { title: 'Coctel de bienvenida', meta: 'Celebraciones', img: 'uploads/sesion/Mompani (6).webp', cls: clsCycle[5] }, { title: 'Ambientación nocturna', meta: 'Detalles', img: 'uploads/sesion/Mompani (7).webp', cls: clsCycle[6] }, { title: 'Jardín en flor', meta: 'Espacios', img: 'uploads/sesion/Mompani (8).webp', cls: clsCycle[7] }, { title: 'Brindis en la explanada', meta: 'Bodas', img: 'uploads/sesion/Mompani (9).webp', cls: clsCycle[8] }, { title: 'Antorchas y cascada', meta: 'Detalles', img: 'uploads/sesion/Mompani (10).webp', cls: clsCycle[0] }, { title: 'La Casa Principal', meta: 'Espacios', img: 'uploads/sesion/Mompani (11).webp', cls: clsCycle[1] }, { title: 'Ceremonia íntima', meta: 'Celebraciones Íntimas', img: 'uploads/sesion/Mompani (12).webp', cls: clsCycle[2] }, { title: 'Pérgola de madera', meta: 'Espacios', img: 'uploads/sesion/Mompani (13).webp', cls: clsCycle[3] }, { title: 'Mesa dulce', meta: 'Detalles', img: 'uploads/sesion/Mompani (14).webp', cls: clsCycle[4] }, { title: 'Iluminación en árboles', meta: 'Detalles', img: 'uploads/sesion/Mompani (15).webp', cls: clsCycle[5] }, { title: 'Pista de baile', meta: 'Bodas', img: 'uploads/sesion/Mompani (16).webp', cls: clsCycle[6] }, { title: 'Bienvenida al refugio', meta: 'Espacios', img: 'uploads/sesion/Mompani (17).webp', cls: clsCycle[7] }, { title: 'Banquete', meta: 'Bodas', img: 'uploads/sesion/Mompani (18).webp', cls: clsCycle[8] }, { title: 'Barricas de roble', meta: 'Detalles', img: 'uploads/sesion/Mompani (19).webp', cls: clsCycle[0] }, { title: 'Atardecer en la quinta', meta: 'Espacios', img: 'uploads/sesion/Mompani (20).webp', cls: clsCycle[1] }, { title: 'Recepción', meta: 'Bodas', img: 'uploads/sesion/Mompani (21).webp', cls: clsCycle[2] }, { title: 'Sesión fotográfica', meta: 'Bodas', img: 'uploads/sesion/Mompani (22).webp', cls: clsCycle[3] }, { title: 'Estacionamiento privado', meta: 'Espacios', img: 'uploads/sesion/Mompani (23).webp', cls: clsCycle[4] }, { title: 'Jardín jacarandas de noche', meta: 'Detalles', img: 'uploads/sesion/Mompani (24).webp', cls: clsCycle[5] }, { title: 'Centro de mesa', meta: 'Detalles', img: 'uploads/sesion/Mompani (25).webp', cls: clsCycle[6] }, { title: 'Bautizo en jardín', meta: 'Celebraciones Íntimas', img: 'uploads/sesion/Mompani (26).webp', cls: clsCycle[7] }, { title: 'Ambiente de fiesta', meta: 'Celebraciones', img: 'uploads/sesion/Mompani (27).webp', cls: clsCycle[8] }, { title: 'Salida de proveedores', meta: 'Detalles', img: 'uploads/sesion/Mompani (28).webp', cls: clsCycle[0] }, { title: 'Zona de ceremonia', meta: 'Bodas', img: 'uploads/sesion/Mompani (29).webp', cls: clsCycle[1] }, { title: 'Pasillo de entrada', meta: 'Espacios', img: 'uploads/sesion/Mompani (30).webp', cls: clsCycle[2] }, { title: 'Ambientación acuática', meta: 'Detalles', img: 'uploads/sesion/Mompani (31).webp', cls: clsCycle[3] }, { title: 'Vista aérea de la quinta', meta: 'Espacios', img: 'uploads/sesion/Mompani (32).webp', cls: clsCycle[4] }, { title: 'Noche de bodas', meta: 'Bodas', img: 'uploads/sesion/Mompani (33).webp', cls: clsCycle[5] }, { title: 'Before the Wedding', meta: 'Bodas', img: 'uploads/sesion/Mompani (34).webp', cls: clsCycle[6] }, { title: 'Anfitriones', meta: 'Detalles', img: 'uploads/sesion/Mompani (35).webp', cls: clsCycle[7] }, { title: 'Quinceañera en el jardín', meta: 'Celebraciones Íntimas', img: 'uploads/sesion/Mompani (36).webp', cls: clsCycle[8] }, { title: 'Fuegos artificiales', meta: 'Celebraciones', img: 'uploads/sesion/Mompani (37).webp', cls: clsCycle[0] }, { title: 'La pérgola al amanecer', meta: 'Espacios', img: 'uploads/sesion/Mompani (38).webp', cls: clsCycle[1] }, { title: 'Detalle de mantelería', meta: 'Detalles', img: 'uploads/sesion/Mompani (39).webp', cls: clsCycle[2] }, { title: 'Explanada de día', meta: 'Espacios', img: 'uploads/sesion/Mompani (40).webp', cls: clsCycle[3] }, { title: 'Pastel de bodas', meta: 'Bodas', img: 'uploads/sesion/Mompani (41).webp', cls: clsCycle[4] }, { title: 'Baby shower', meta: 'Celebraciones Íntimas', img: 'uploads/sesion/Mompani (42).webp', cls: clsCycle[5] }, { title: 'Jacarandas en flor', meta: 'Espacios', img: 'uploads/sesion/Mompani (43).webp', cls: clsCycle[6] }, { title: 'Primer baile', meta: 'Bodas', img: 'uploads/sesion/Mompani (44).webp', cls: clsCycle[7] }, { title: 'Cumpleaños en la quinta', meta: 'Celebraciones Íntimas', img: 'uploads/sesion/Mompani (46).webp', cls: clsCycle[8] }, { title: 'Brunch al día siguiente', meta: 'Celebraciones', img: 'uploads/sesion/Mompani (48).webp', cls: clsCycle[0] }, { title: 'Privacidad y naturaleza', meta: 'Espacios', img: 'uploads/sesion/Mompani (49).webp', cls: clsCycle[1] }, ]; const [lb, setLb] = useState_(null); const [visible, setVisible] = useState_(9); const allShown = visible >= items.length; const showMore = () => setVisible(v => Math.min(v + 3, items.length)); const showLess = () => { setVisible(9); window.scrollTo({ top: document.getElementById('galeria').offsetTop - 80, behavior: 'smooth' }); }; const lbTotal = visible; const prev = () => setLb(i => (i - 1 + lbTotal) % lbTotal); const next = () => setLb(i => (i + 1) % lbTotal); const close = () => setLb(null); useEffect_(() => { if (lb === null) return; const onKey = e => { if (e.key === 'Escape') close(); if (e.key === 'ArrowLeft') prev(); if (e.key === 'ArrowRight') next(); }; window.addEventListener('keydown', onKey); document.body.style.overflow = 'hidden'; return () => { window.removeEventListener('keydown', onKey); document.body.style.overflow = ''; }; }, [lb]); return (
Galería

Historias reales.
Recuerdos inolvidables.

Más que un portafolio, esta es nuestra galería de historias. Cada celebración es única.

{items.slice(0, visible).map((it, i) =>
setLb(i)} style={{ cursor: 'pointer' }}> {it.title}

Quinta Mompaní

)}
{allShown ? : }
{lb !== null && (
{String(lb + 1).padStart(2,'0')} / {String(lbTotal).padStart(2,'0')}
e.stopPropagation()}> {items[lb].title}

Quinta Mompaní

)}
); } /* ────────── TESTIMONIOS ────────── */ function Testimonios() { const testis = [ { quote: 'Sentimos que nuestra boda no fue un evento, fue un fin de semana entero suspendido en el tiempo.', name: 'Mariana & Diego', meta: 'Boda de fin de semana · 2024' }, { quote: 'Buscábamos un lugar para los 3 años de Sofía y encontramos un refugio.', name: 'Familia Hernández', meta: 'Celebración Íntima · 2025' }, { quote: 'No rentamos un jardín. Recibimos hospitalidad. Esa es la diferencia.', name: 'Paola & Luis', meta: 'Boda · 2025' }, { quote: 'El jardín jacarandas fue el escenario perfecto para el bautizo de Emilio. Todo el equipo hizo que nos sintiéramos como en casa.', name: 'Familia Reyes Montoya', meta: 'Celebración Íntima · 2025' }, { quote: 'Organizamos el cumpleaños de mamá y fue mágico. Un espacio que tiene alma propia, eso no se encuentra en cualquier lugar.', name: 'Carolina Ibarra', meta: 'Festejo Familiar · 2024' }]; const [tIdx, setTIdx] = useState_(0); const trackRef = useRef_(null); const dragStart = useRef_(null); const goTo = (i) => setTIdx(i); const prev = () => goTo(Math.max(tIdx - 1, 0)); const next = () => goTo(Math.min(tIdx + 1, testis.length - 1)); const onDragStart = (clientX) => { dragStart.current = clientX; }; const onDragEnd = (clientX) => { if (dragStart.current === null) return; const delta = dragStart.current - clientX; if (Math.abs(delta) > 50) delta > 0 ? next() : prev(); dragStart.current = null; }; useEffect_(() => { const track = trackRef.current; if (!track) return; const card = track.children[tIdx]; if (!card) return; track.scrollTo({ left: card.offsetLeft - track.offsetLeft, behavior: 'smooth' }); }, [tIdx]); return (
Testimonios

Las voces de
nuestro refugio.

Lo que nos cuentan después del último brindis.

onDragStart(e.clientX)} onMouseUp={e => onDragEnd(e.clientX)} onMouseLeave={() => { dragStart.current = null; }} onTouchStart={e => onDragStart(e.touches[0].clientX)} onTouchEnd={e => onDragEnd(e.changedTouches[0].clientX)} > {testis.map((t, i) =>
"
{t.quote}
{t.name}{t.meta}
)}
{testis.map((_, i) => goTo(i)} />)}
); } /* ────────── BLOG ────────── */ const SANITY_PROJECT = 'gyrzd1m5'; const SANITY_DATASET = 'production'; const SANITY_API = `https://${SANITY_PROJECT}.api.sanity.io/v2024-01-01/data/query/${SANITY_DATASET}`; function Blog() { const [posts, setPosts] = useState_([]); const [loading, setLoading] = useState_(true); useEffect_(() => { const q = encodeURIComponent( `*[_type=="post"] | order(publishedAt desc) [0...3] { title, "slug": slug.current, category, readTime, excerpt, "imageUrl": mainImage.asset->url }` ); fetch(`${SANITY_API}?query=${q}`) .then(r => r.json()) .then(d => { setPosts(d.result || []); setLoading(false); }) .catch(() => setLoading(false)); }, []); return (
Diario del refugio

Notas desde Mompaní.

Reflexiones sobre el arte de recibir y la celebración consciente.

{loading ? ( [0,1,2].map(i => (
)) ) : posts.length === 0 ? (

Próximamente, el diario del refugio.

) : ( posts.map((p, i) => (
); } /* ────────── APP ────────── */ function App() { useReveal(); useParallax(); useBgParallax(); return ( <>