Landing page en React para una invitacion digital de matrimonio. Incluye una introduccion animada, informacion del evento, cuenta regresiva, galeria, mapa embebido y formulario de confirmacion de asistencia. La invitación y su contenido han sido personalizados para la boda de Daniela y Michael.
- React 19
- Vite 8
- CSS nativo
- Google Apps Script para conectar el formulario a Google Sheets y enviar correos de notificacion (Google Sheets + MailApp)
- Node.js 20 o superior
- npm
- Una cuenta de Google si se desea recibir confirmaciones en Google Sheets
Desde la raiz del proyecto:
npm.cmd installnpm.cmd run dev -- --host 127.0.0.1Luego abre:
http://127.0.0.1:5173
Para detener el servidor, usa Ctrl + C en la consola donde se esta
ejecutando.
npm.cmd run buildEl resultado se genera en la carpeta dist/.
Para revisar la compilacion localmente:
npm.cmd run preview- Portada vertical con sobre y sello dorado.
- Animacion de apertura a pantalla completa al tocar la invitacion.
- Cuenta regresiva hasta el 25 de octubre de 2026.
- Secciones de bienvenida, historia, detalles, itinerario y regalos.
- Galeria navegable de imagenes.
- Mapa embebido de la recepcion y enlace a Google Maps.
- Formulario RSVP con:
- Confirmacion o rechazo de asistencia.
- Nombre completo.
- Telefono.
- Rango de edad (solo si asiste).
- Restricciones alimentarias (solo si asiste).
- Mensaje para la pareja.
- En cada envio del formulario, de forma automatica y en una sola peticion:
- Se agrega una fila nueva en Google Sheets.
- Se envia un correo HTML de notificacion a los administradores.
- Musica de fondo instrumental con control para activar/desactivar y
preferencia recordada en
localStorage.
Nota: Cada asistente debe completar y enviar su propia confirmacion. Si una persona tiene permitido asistir con acompañante, este tambien debera registrar una respuesta independiente en el formulario.
- Fecha: 25 de octubre de 2026.
- Recepcion: Sagrado, Medellin.
- Direccion: via La Catedral, vereda El Vallano, km 4, Envigado, Antioquia.
- Mapa: configurado en la seccion
Ubicacion.
- Nombres, fecha, itinerario y textos de cada seccion:
src/components/Invitation.jsx. - Sobre, video de apertura y hero:
src/components/Intro.jsx. - Cancion de fondo:
public/audio/wedding-background.mp3(verpublic/audio/README.md).
Sin configuracion adicional, el formulario guarda respuestas solo en el
localStorage del navegador. Para recibir respuestas reales desde cualquier
dispositivo, configura Google Sheets.
- Crea una hoja de calculo en Google Sheets.
No necesitas crear la pestana ni los encabezados manualmente: el script crea
la pestana Confirmaciones y escribe la fila de encabezados automaticamente la
primera vez que recibe un envio. Las columnas generadas son:
Fecha de registro | Asistencia | Nombre completo | Telefono | Rango de edad | Restricciones alimentarias | Mensaje | Fecha del dispositivo | Origen
- En Google Sheets, abre
Extensiones > Apps Script. - Reemplaza el contenido del editor con el archivo:
google-apps-script/Code.gs
- Edita la lista
NOTIFICATION_EMAILS(al inicio del archivo) con los correos que deben recibir las notificaciones. Puedes agregar o quitar destinatarios. - Guarda el proyecto.
- Selecciona
Implementar > Nueva implementacion. - Elige
Aplicacion web. - En
Ejecutar como, selecciona tu cuenta. - En acceso, selecciona
Cualquier usuario. - Autoriza el script (incluye permiso para enviar correos en tu nombre).
- Copia la URL que termina en
/exec.
El envio de correos ocurre en Apps Script (no en el navegador), por lo que la lista de destinatarios se configura en
Code.gs. Si el correo falla, la fila en Sheets se guarda igualmente y el invitado ve confirmacion de exito.
- Crea un archivo
.enven la raiz del proyecto. - Usa
.env.examplecomo base:
VITE_RSVP_ENDPOINT=https://script.google.com/macros/s/TU_ID/exec- Reinicia el servidor de desarrollo.
Cada envio agregara una fila en la pestana Confirmaciones.
.
├── google-apps-script/
| └── Code.gs # Endpoint: registra en Sheets + envia correos
├── public/
| ├── audio/ # Coloca aqui wedding-background.mp3
| ├── img/
| └── favicon.ico
├── src/
| ├── assets/
| | ├── audio/ # (placeholder) la musica vive en public/audio
| | ├── img/
| | └── vid/
| ├── components/
| | ├── Intro.jsx # Sobre, video de apertura y hero (carga inmediata)
| | ├── Invitation.jsx # Resto del contenido (carga diferida)
| | └── MusicToggle.jsx
| ├── config/
| | ├── rsvp.js # Endpoint y etiquetas del formulario
| | └── audio.js # Ruta de la musica de fondo
| ├── hooks/
| | └── useBackgroundMusic.js
| ├── services/
| | └── rsvpService.js # Construye, valida y envia el RSVP
| ├── App.jsx # Composicion raiz: Intro + Invitation + musica
| ├── main.jsx
| └── styles.css
├── .env.example
├── index.html
├── vercel.json
├── package.json
├── vite.config.js
├── eslint.config.js
├── Dockerfile
├── README.md
└── ...
src/App.jsx: composicion raiz. MontaIntrosiempre, yInvitationsolo despues de que el invitado empieza a abrir el sobre (para no competir por ancho de banda con el video de apertura).src/components/Intro.jsx: sobre, video de apertura, hero y navegacion.src/components/Invitation.jsx: galerias, itinerario, mapas, regalos y el formulario RSVP.src/styles.css: estilos visuales y responsive.src/config/rsvp.js/src/config/audio.js: variables de entorno y etiquetas.src/services/rsvpService.js: construye, valida y envia el RSVP.src/hooks/useBackgroundMusic.js: logica de la musica de fondo.src/components/MusicToggle.jsx: control para activar/desactivar la musica.src/assets/: imagenes (img/) y video (vid/) usados por la invitacion.public/audio/: ubicacion del MP3 de fondo (wedding-background.mp3).google-apps-script/Code.gs: agrega filas a Google Sheets y envia correos..env.example: plantilla para configurar la URL de Apps Script.
- Coloca un MP3 instrumental libre de derechos en
public/audio/wedding-background.mp3(verpublic/audio/README.md). - La musica inicia automaticamente; si el navegador bloquea el autoplay, arranca tras la primera interaccion del usuario.
- Se reproduce en bucle, a volumen bajo (~24 %) y mantiene el estado entre secciones.
- El boton flotante permite silenciarla y la preferencia se guarda en
localStorage. Si no hay archivo de audio, el boton no se muestra.
- La URL del endpoint no se debe escribir directamente en
App.jsx; usa siempre la variableVITE_RSVP_ENDPOINT. - El archivo
.envno debe subirse a un repositorio publico. - El script de Google protege las celdas frente a valores que comienzan con caracteres interpretables como formulas.
- Para cambiar la fecha de la cuenta regresiva, modifica
weddingDateensrc/components/Invitation.jsx.