// data.jsx — Configuración, base de invitados (mock) y contenido editorial. // Exporta a window: CONFIG, GUESTS, getInvite, EVENT, LODGING, GIFT. /* ============================================================================ 1) CONEXIÓN DEL RSVP (la opción más eficiente: Google Sheets + Apps Script) ---------------------------------------------------------------------------- • Abre la "Guía de conexión Google Sheets.html" incluida en el proyecto. • Sigue los 6 pasos: crear la hoja, pegar el script, publicar como Web App. • Copia la URL que termina en /exec y pégala abajo entre las comillas. • Mientras esté vacío, el formulario funciona en MODO DEMO (no envía nada, solo muestra la confirmación y registra el payload en la consola). ========================================================================== */ const CONFIG = { WEBHOOK_URL: 'https://script.google.com/macros/s/AKfycbySaoGEgGm1TAcmN4jFqRT9w-_-2PNe4syKjC5y3oH0M_MEeLsQkzaUd7MeNsAaYKgqew/exec', // Fecha/hora del evento en horario de Oaxaca (UTC−6) DATE_ISO: '2026-11-07T13:00:00-06:00', coupleHash: '#DianaYDaniel', // Token global que el script comparte — solo para verificar el origen (opcional) formSecret: 'dd-2026', }; /* ============================================================================ 2) BASE DE INVITADOS. Cada invitado tiene: id → identificador en la URL (?id=INV001) k → token secreto del enlace (?k=...) — sin él, no se abre la invitación nombre → cómo se le saluda pases → número máximo de personas permitidas acomp → nombre del acompañante (null = va solo/a · 'TBD' = +1 sin nombre) ---------------------------------------------------------------------------- El enlace que se comparte se ve así: .../Invitación Diana & Daniel.html?id=INV001&k=7typqw Lista generada desde Invitados_RSVP_BodaDD.xlsx · 31 invitaciones. ========================================================================== */ const GUESTS = { INV001 : { k: '7typqw', nombre: 'Cristina Ortiz', pases: 1, acomp: null }, INV002 : { k: '5ji8dm', nombre: 'Hugo Reyes', pases: 1, acomp: null }, INV003 : { k: '7w764q', nombre: 'Cristina Reyes', pases: 2, acomp: 'Alberto García' }, INV004 : { k: 'c5knbw', nombre: 'Rosario Ortiz', pases: 2, acomp: 'Eduardo Vila' }, INV005 : { k: '5f075k', nombre: 'Valeria Vila', pases: 1, acomp: null }, INV006 : { k: 'lj6zh2', nombre: 'Claudia Torres', pases: 2, acomp: 'Juan Antonio Torres-Septien' }, INV007 : { k: 'jxa3bc', nombre: 'Paulina Flores', pases: 2, acomp: 'Carlos Eduardo' }, INV008 : { k: 'eulllz', nombre: 'Erika Estrada', pases: 1, acomp: null }, INV009 : { k: '0pe7y9', nombre: 'Karla Vázquez', pases: 1, acomp: null }, INV010 : { k: 'xot1d2', nombre: 'Catalina Larrazolo', pases: 2, acomp: 'TBD' }, INV011 : { k: 'q6t40v', nombre: 'David Cerdio', pases: 2, acomp: 'Ana Lú' }, INV012 : { k: '7zkqm1', nombre: 'Carlos Pacheco', pases: 1, acomp: null }, INV013 : { k: 'a59cc7', nombre: 'Sergio Patrón', pases: 2, acomp: 'Oziel' }, INV014 : { k: '0f4p7b', nombre: 'Rossmery Meza', pases: 1, acomp: null }, INV015 : { k: '5bqtlu', nombre: 'Rosario Becerra', pases: 2, acomp: 'José Luis' }, INV016 : { k: 'dq2lzy', nombre: 'Cristina Gómez', pases: 2, acomp: 'Carlos Luis' }, INV017 : { k: 'xn1ddf', nombre: 'David Favila', pases: 2, acomp: 'Alejandra' }, INV018 : { k: 'uxv1hx', nombre: 'Karla Navar', pases: 1, acomp: null }, INV019 : { k: 'isdt87', nombre: 'Eduardo Herrera', pases: 1, acomp: null }, INV020 : { k: 'usqo6j', nombre: 'Paulina Ojeda', pases: 2, acomp: 'TBD' }, INV021 : { k: 'nv5po7', nombre: 'Mar Rentería', pases: 2, acomp: 'Esposo de Mar' }, INV022 : { k: '8fhvfl', nombre: 'Sammy Ortiz', pases: 2, acomp: 'Raúl' }, INV023 : { k: 'wae6j4', nombre: 'José Alvarado', pases: 2, acomp: 'Emma Amador' }, INV024 : { k: 'o6er96', nombre: 'Rafael Torres', pases: 2, acomp: 'Lissie' }, INV025 : { k: 'yfmp58', nombre: 'Cuauhtémoc Molina', pases: 1, acomp: null }, INV026 : { k: 'z1tlwg', nombre: 'Irving Ángel', pases: 2, acomp: 'Elba' }, INV027 : { k: '47lyuz', nombre: 'Manu Hernández', pases: 1, acomp: null }, INV028 : { k: 'bdolpp', nombre: 'Eduardo Torres', pases: 1, acomp: null }, INV029 : { k: 'b16dxc', nombre: 'Juan José Torres Blancas', pases: 1, acomp: null }, INV030 : { k: 'cfioxu', nombre: 'Landy Rodríguez', pases: 1, acomp: null }, INV031 : { k: '8h4jvk', nombre: 'Juan José Torres Montes de Oca', pases: 2, acomp: 'Ana' }, PRUEBA : { k: 'test99', nombre: 'Toribio Torres', pases: 2, acomp: 'Kuki Torres' }, DEMO : { k: 'demo', nombre: 'Nuestros invitados', pases: 2, acomp: null }, }; function getInvite() { const q = new URLSearchParams(location.search); const id = (q.get('id') || '').trim().toUpperCase(); const k = (q.get('k') || '').trim(); if (!id) return { status: 'none' }; // sin id → portada genérica const g = GUESTS[id]; if (!g) return { status: 'invalid', id }; // id inexistente if (g.k !== k) return { status: 'denied', id, nombre: g.nombre }; // token incorrecto return { status: 'ok', id, ...g }; } /* ============================================================================ 3) CONTENIDO EDITORIAL ========================================================================== */ const EVENT = { novios: { a: 'Diana', b: 'Daniel' }, fechaLarga: 'Sábado 7 de noviembre de 2026', fechaCorta: '07 · 11 · 2026', hora: '1:00 PM', ciudad: 'Oaxaca de Juárez, México', venue: 'Kaku Secret Gallery', venueZona: 'Oaxaca de Juárez, Oax.', mapsUrl: 'https://share.google/Y3h9RPyeTY4A4eEBJ', wazeUrl: 'https://waze.com/ul?q=Kaku%20Secret%20Gallery%20Oaxaca&navigate=yes', ceremoniaHora: '1:00 PM', recepcionHora: '3:00 PM', dress: { nivel: 'Semi formal', hombres: [ 'Camisa de manga larga o guayabera', 'Pantalón de vestir en color claro', 'Saco opcional · sin corbata', 'Zapatos formales', ], mujeres: [ 'Vestido midi o largo, enterizo elegante o traje', 'Evitar blanco, beige y negro', 'Zapatos cómodos para disfrutar la fiesta', ], }, ninos: 'Los niños están mejor en casa, descansando, mientras mamá y papá se divierten. Será una celebración solo para adultos.', }; // Todos a menos de 10 minutos caminando de Kaku Secret Gallery. // cat → grupo · dir → dirección · rating → estrellas Google · nota → detalle opcional const LODGING = [ // —— Hoteles boutique —— { nombre: 'Casa de Siete Balcones', cat: 'Hoteles boutique', dir: 'Morelos 800', rating: 4.8, url: 'https://maps.google.com/?cid=5222576429452597903' }, { nombre: 'Sauvé Casa Boutique', cat: 'Hoteles boutique', dir: 'Matamoros 102', rating: 4.7, url: 'https://hotelsauve.com/' }, { nombre: 'Hotel La Casona de Tita', cat: 'Hoteles boutique', dir: 'García Vigil 805', rating: 4.7, url: 'https://www.lacasonadetitaoaxaca.com/' }, { nombre: 'Majagua Hotel Boutique', cat: 'Hoteles boutique', dir: 'Pino Suárez 519', rating: 4.6, url: 'https://www.majaguahotel.com/' }, { nombre: 'Hotel Casa Catrina', cat: 'Hoteles boutique', dir: 'García Vigil 703', rating: 4.5, url: 'http://www.casacatrina.com.mx/' }, // —— Casas / villas —— { nombre: 'Casa Almaviva', cat: 'Casas y villas', dir: 'Quintana Roo 102', nota: 'Villa completa con alberca', rating: 5.0, url: 'http://oaxaca.almaviva.villas/' }, { nombre: 'Casa Murguía', cat: 'Casas y villas', dir: 'Murguía 403', nota: '5 habitaciones · alberca', rating: 4.5, url: 'http://www.casamurguia.com/' }, // —— Opción económica —— { nombre: 'Hostal Luz de Luna', cat: 'Opción económica', dir: 'Benito Juárez 101', rating: 4.4, url: 'http://www.hosteluzdeluna.com/' }, ]; const GIFT = { intro: 'Tu presencia es nuestro mejor regalo. Si además deseas tener un detalle con nosotros, lo recibiremos con todo el corazón.', banco: 'BBVA', titular: 'Diana & Daniel', clabe: '01021...', // ← completa los 18 dígitos de la CLABE nota: 'Lluvia de sobres el día del evento.', }; Object.assign(window, { CONFIG, GUESTS, getInvite, EVENT, LODGING, GIFT });