// 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', pases: 1, acomp: null }, INV002: { k: '5ji8dm', nombre: 'Hugo Antonio', pases: 1, acomp: null }, INV003: { k: '7w764q', nombre: 'Cristina Reyes', pases: 2, acomp: 'Alberto García' }, INV004: { k: 'c5knbw', nombre: 'Rosario', pases: 2, acomp: 'Eduardo Vila' }, INV005: { k: '5f075k', nombre: 'Valeria', pases: 1, acomp: null }, INV006: { k: 'lj6zh2', nombre: 'Claudia', pases: 2, acomp: 'Juan Antonio Torres-Septien' }, INV007: { k: 'jxa3bc', nombre: 'Paulina Flores', pases: 2, acomp: 'Carlos Eduardo' }, INV008: { k: 'eulllz', nombre: 'Erika', pases: 1, acomp: null }, INV009: { k: '0pe7y9', nombre: 'Karla Vázquez', pases: 1, acomp: null }, INV010: { k: 'xot1d2', nombre: 'Catalina', 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', 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: 'Samantha', 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', pases: 1, acomp: null }, INV026: { k: 'z1tlwg', nombre: 'Irving', pases: 2, acomp: 'Elba' }, INV027: { k: '47lyuz', nombre: 'Manuel Antonio', 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 Beatriz', pases: 1, acomp: null }, INV031: { k: '8h4jvk', nombre: 'Juan José Torres', pases: 2, acomp: 'Ana' }, // Invitado de PRUEBA (ficticio) para probar el sitio en vivo — ?id=PRUEBA&k=test99 PRUEBA: { k: 'test99', nombre: 'Toribio Torres', pases: 2, acomp: 'Petra Méndez' }, // Invitado de muestra para previsualizar el diseño (?id=DEMO&k=demo) DEMO: { k: 'demo', nombre: 'Nuestros invitados', pases: 2, acomp: null, demo: true }, }; 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', horaInicio: '1:20 PM', dress: { nivel: 'Semi formal', hombres: [ 'Camisa de manga larga o guayabera', 'Pantalón de vestir en color claro', 'Saco opcional · sin corbata', 'Zapatos cómodos', ], 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 = [ { nombre: 'Hotel Casántica', cat: 'Opciones recomendadas', url: 'https://maps.app.goo.gl/k8bLobthFH38Vamg8' }, { nombre: 'Hotel Casa de Sierra Azul', cat: 'Opciones recomendadas', url: 'https://maps.app.goo.gl/f5p4EusyqWU4Tg3BA' }, { nombre: 'Hotel La Catrina de Alcalá', cat: 'Opciones recomendadas', url: 'https://maps.app.goo.gl/vCuAHyGkmG8v5e5P8' }, { nombre: 'Hotel Casa Antigua', cat: 'Opciones recomendadas', url: 'https://maps.app.goo.gl/4qQYV776BMbYyX329' }, ]; 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: 'Banamex', titular: 'Daniel Torres Rodriguez', clabe: '002180701855254477', nota: 'Lluvia de sobres el día del evento.', }; Object.assign(window, { CONFIG, GUESTS, getInvite, EVENT, LODGING, GIFT });