Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/gus-16710/invitations/llms.txt

Use this file to discover all available pages before exploring further.

Wedding invitations in Invitaciones Digitales are organized under the /bodas/[couple] route, where each couple receives their own fully self-contained Next.js page. Every wedding invitation is a richly animated, vertically scrollable experience powered by Splide, presenting guests with a curated sequence of sections — from the opening ceremony details all the way through the gift registry and RSVP confirmation. Each invitation is built as a client-side "use client" page with a per-couple styles.css and custom Google Fonts selection to match the couple’s aesthetic.

Available Wedding Invitations

The following slugs currently exist under /bodas/:
SlugRoute
alondra-antonio/bodas/alondra-antonio
ana-yasmin-carlos-raymundo/bodas/ana-yasmin-carlos-raymundo
anahi-pablo/bodas/anahi-pablo
citlali-daniel/bodas/citlali-daniel
diana-ernesto/bodas/diana-ernesto
diana_fabian/bodas/diana_fabian
isabel-alan/bodas/isabel-alan
maria-pedro/bodas/maria-pedro
vanessa-susana/bodas/vanessa-susana

Standard Sections

Each wedding invitation is composed of a series of full-viewport sections rendered as individual SplideSlide entries. The sections and their purposes are described below.
1

Header

The opening hero slide featuring the couple’s names, wedding date, and a decorative background image — sets the visual tone for the entire invitation.
2

Presentation

A personal message or brief story from the couple, often animated with framer-motion entrance effects and styled with the couple’s chosen typeface.
3

Ceremony

Displays the church or civil ceremony venue name, address, time, and an embedded Google Maps link so guests can get directions with one tap.
4

Reception

Shows the reception venue details — name, address, start time — along with a maps link, distinct from the ceremony location when applicable.
5

GodParents

Lists the padrinos and madrinas (godparents/sponsors) who are contributing to different aspects of the wedding, acknowledging their generosity.
6

DressCode

Communicates the expected attire and any color palette restrictions, often displayed with color swatches or descriptive text and icons.
7

Itinerary

A chronological timeline of the event flow (cocktail hour, dinner, first dance, cake cutting, etc.) rendered as an animated ordered list.
8

Gallery

A photo carousel of the couple’s engagement or pre-wedding session images, using Splide in horizontal mode nested inside the vertical main slider.
9

Gifts

The gift registry or mesa de regalos section, providing links or bank transfer details so guests can contribute to the couple’s future.
10

Confirm

The RSVP section where guests confirm their attendance, typically linking out to a WhatsApp message or a Google Form.
11

AudioControl

A persistent floating button (rendered outside the Splide slider) that lets guests play or pause the background wedding music throughout their visit.

How Main.tsx Composes Sections with Splide

The core layout of every wedding invitation uses @splidejs/react-splide in top-to-bottom (ttb) mode, giving guests a vertical scroll-through experience. The following is drawn directly from diana-ernesto/components/Main.tsx:
import { useEffect, useState } from "react";
// @ts-ignore
import { Splide, SplideSlide } from "@splidejs/react-splide";
import Header from "./Header";
import Presentation from "./Presentation";
import Ceremony from "./Ceremony";
import Reception from "./Reception";
import Itinerary from "./Itinerary";
import Gallery from "./Gallery";
import Gifts from "./Gifts";
import DressCode from "./DressCode";
import GodParents from "./GodParents";
import Confirm from "./Confirm";
import AudioControl from "./AudioControl";
import { motion } from "framer-motion";
import "@splidejs/react-splide/css";

export default function Main() {
  const [open, setOpen] = useState(false);

  // Auto-dismiss modal after 4 seconds, then mount the invitation
  useEffect(() => {
    setTimeout(() => {
      setOpen(true);
    }, 4000);
  }, []);

  return (
    <div className="max-w-3xl m-auto bg-[url('/img/bodas/diana-ernesto/background-main.jpg')] bg-cover bg-center shadow-large">
      {open && (
        <motion.div
          initial={{ opacity: 0 }}
          animate={{ opacity: 1 }}
          transition={{ duration: 1 }}
        >
          <Splide
            aria-label="Diana & Ernesto"
            options={{
              rewind: true,
              direction: "ttb",   // vertical top-to-bottom sliding
              height: "100svh",   // each slide fills the full screen height
              wheel: true,        // supports mouse-wheel navigation
              releaseWheel: true,
              type: "loop",
              waitForTransition: true,
              arrows: false,
              classes: {
                page: "splide__pagination__page custom-class-page",
              },
            }}
          >
            <SplideSlide><Header /></SplideSlide>
            <SplideSlide><Presentation /></SplideSlide>
            <SplideSlide><Ceremony /></SplideSlide>
            <SplideSlide><Reception /></SplideSlide>
            <SplideSlide><GodParents /></SplideSlide>
            <SplideSlide><DressCode /></SplideSlide>
            <SplideSlide><Itinerary /></SplideSlide>
            <SplideSlide><Gallery /></SplideSlide>
            <SplideSlide><Gifts /></SplideSlide>
            <SplideSlide><Confirm /></SplideSlide>
          </Splide>
          {/* AudioControl floats outside the slider so it persists across all slides */}
          <AudioControl />
        </motion.div>
      )}
    </div>
  );
}
Each couple’s invitation directory contains its own styles.css file for per-invitation overrides — background gradients, custom animation classes, and font-face declarations that load typefaces not available through next/font/google. Google Fonts are loaded directly in each page.tsx using the next/font/google helper (e.g. Bebas_Neue, Oswald) so they are statically optimized at build time.

Opening Modal Pattern

Every wedding invitation implements a timed opening modal that fires automatically on first visit using @nextui-org/react’s <Modal> component with isDismissable={false} and hideCloseButton={true}. The modal displays for a fixed duration (e.g. 4 seconds for diana-ernesto), then auto-closes via setTimeout — after which setOpen(true) mounts the main Splide invitation inside a framer-motion fade-in wrapper. This pattern serves two purposes:
  1. Gesture unlock — the modal renders a “DESLIZA PARA VER EL CONTENIDO” message with an animated swipe-arrow SVG (framer-motion infinite loop), priming the guest before the invitation loads.
  2. Deferred mount — the heavy Splide slider and all section components are only mounted after the modal closes ({open && <motion.div>...</motion.div>}), keeping the initial page load lean.

Build docs developers (and LLMs) love