# MUST OBEY — Mobile-first build requirements
This app's PRIMARY surface is a mobile phone. Build it impeccably on mobile FIRST, then verify on tablet and desktop. Treat the rules below as non-negotiable hard constraints, not suggestions.
## Viewports to verify (every screen, every state)
- 320 px, 360 px, 375 px, 390 px, 414 px, 480 px
- 768 px, 834 px (iPad portrait / Pro 11)
- 1024 px, 1280 px, 1440 px, 1920 px, 2560 px
- Plus: 200% browser zoom, landscape orientation on every mobile width, iPhone with safe-area insets visible
## Hard layout rules
- Mobile-first CSS. Default styles target mobile; `@media (min-width: ...)` for larger viewports.
- Use `dvh` and `svh` instead of `vh` for full-height surfaces (iOS Safari URL-bar bug).
- Use `clamp()` for fluid typography across all viewports.
- Prefer container queries (`@container`) over media queries for component-level responsiveness.
- Use `min(100%, ...)` widths so content never overflows. Zero horizontal overflow at any viewport.
- Add `` to every page.
- Apply `padding: max(safe-area-inset-X, fallback)` on every edge-bleeding container so notched iPhones in landscape never clip content.
- Wide tables and code blocks scroll INSIDE their container (`overflow-x: auto`), never push the body.
- Use `background-attachment: scroll` on mobile, not `fixed` (iOS Safari repaint bug).
- Avoid `backdrop-filter` on animated elements. Use it sparingly on static surfaces only.
- **Canvas Scaling**: Canvases must dynamically scale with window resize events and properly handle high-DPI screens (`window.devicePixelRatio`). Set physical dimensions (`canvas.width`/`canvas.height`) using pixel ratio and render relative to this grid, using CSS to control responsive viewport scaling.
- **Robust Storage**: Every access to `localStorage`/`sessionStorage` (especially `JSON.parse` of loaded state or writes) MUST be wrapped in a `try-catch` block to handle disabled storage, private browsing mode, quota limits, or corrupted JSON gracefully. Fall back to a robust in-memory object store.
## Touch & accessibility
- Tap targets ≥ 44 × 44 px on touch (Apple HIG). Increase to 48 px under `@media (hover: none) and (pointer: coarse)`.
- All interactive controls reachable by keyboard with a visible focus ring; respect `:focus-visible`.
- Color contrast ≥ 4.5:1 for body text, 3:1 for UI components.
- All images have meaningful `alt`. Decorative images use `alt=""`.
- Respect `prefers-reduced-motion: reduce` — zero animation durations under that query.
- Forms validate inline; error messages are specific, not "Invalid input".
- Modals: focus trap, `Esc` closes, `role="dialog"`, `aria-modal="true"`, focus restored on close.
## Performance bar (Lighthouse mobile, throttled 3G/4G)
- LCP < 2.5 s · INP < 200 ms · CLS < 0.1
- JS bundle gzip < 200 KB mobile-first; lazy-load non-critical screens via `React.lazy` / dynamic imports.
- No render-blocking resources above the fold.
- Images: WebP/AVIF preferred, `loading="lazy"`, explicit `width`/`height` attributes (zero CLS), `srcset` for retina.
- Videos: `preload="metadata"`, low-resolution poster, max 720p mobile fallback. Never autoplay with audio.
- Fonts: `font-display: swap`; preload only the one used above the fold.
- Smooth scroll honoured via CSS `scroll-behavior: smooth` with reduced-motion fallback.
## Pre-ship mobile checklist (the deployer MUST verify before declaring done)
1. Open at 375 px in DevTools — every screen scrolls vertically only; zero horizontal scroll.
2. Browser zoom 200% — layout reflows without overlap.
3. iPhone Safari with the URL bar visible AND landscape — no content under the home indicator; no notch clipping.
4. iPad portrait (768 px) and landscape (1024 px) — no awkward gaps; tablet-specific breakpoints land cleanly.
5. Tap every interactive element with a thumb at real-device size — every target is easy to hit.
6. `prefers-reduced-motion: reduce` — every transition / animation skips cleanly, scroll-behavior becomes instant.
7. Lighthouse mobile score ≥ 90 across all 4 categories.
8. Zero `console.error` and zero CLS shift in real-device testing on a mid-tier Android (e.g. Pixel 6a) and an iPhone SE.
---
The original template starts below. All rules above apply on TOP of whatever this template specifies.
---
# Build Prompt — Editorial Dawn Wedding Site
Paste this into Google AI Studio's **Build** function. It is self-contained — every section below is part of the instructions.
_Source reference: https://lovable.dev/templates/websites/events/wedding-template-5_
---
## 1. Project
Build a **Events** named **Editorial Dawn Wedding Site**.
One-line description: _Create a stunning magazine-style wedding website in minutes without design skills. Collect RSVPs, share event details, and tell your story with elegant layouts that work beautifully on any device._
**What it is:**
This template gives you a wedding website with a modern editorial aesthetic inspired by high-end fashion magazines. You don't need design experience or coding knowledge to make it work. The sophisticated photo layouts, smooth animations, and elegant typography are already built—you just customize the content to match your wedding.
The technical parts are already handled. Mobile responsiveness, RSVP form with validation, countdown timer, event detail sections, smooth scroll animations—all built in. Your guests get a seamless experience on any device, and you collect RSVPs without paying for wedding software or hiring developers.
The template handles the complexity so you can focus on your content and your story. Whether you're launching quickly or customizing extensively, the foundation is production-ready. The sophisticated typography, refined color palette, and editorial layouts work together to showcase your photography and wedding details without technical bottlenecks standing between your vision and what guests see.
## 2. Target audience
- Wedding planners running small practices who can't afford to lose clients because competitors with bigger budgets offer better digital experiences, and you need professional client deliverables without spending limited business resources on software that doesn't fit your specific workflow or looking unprofessional with basic website builders when competing for the same high-end clients
- Agency professionals who realize working prototypes win more pitches than static mockups, and you need to demonstrate real functionality that differentiates your proposals while competitors are stuck showing what something might look like instead of what it actually does, expanding your service offerings without hiring expensive developers who slow down your competitive advantage
- Wedding photographers and creative professionals building their businesses who need to prove your business model works without burning through savings on developers before validating market demand, and you want something truly custom that stands out in your market and justifies premium pricing instead of template-based solutions that make you look generic against better-funded competitors
- Service-based wedding businesses who understand exactly what software would make you more efficient after years running your consulting practice or specialized service, but custom development costs too much and generic software forces frustrating compromises that waste time on workarounds instead of serving clients, and you need professional tools that improve client satisfaction without proportional increases in overhead costs
- Creative professionals serving the wedding industry who need client sites that match their service quality and justify premium pricing, proving concepts quickly so you can focus on high-value work instead of getting bottlenecked by technical limitations that prevent you from testing ideas that could drive significant business results
## 3. Core value propositions
Surface these clearly through copy, visual emphasis, and section ordering — they are the reasons users pick this product.
- **Magazine-Quality Visual Design** — Editorial layouts and sophisticated animations create unforgettable first impressions for wedding guests.
- **Complete Guest Experience** — Everything guests need in one place: story, schedule, RSVP, and countdown timer.
- **Mobile-Perfect Responsive Layout** — Flawless presentation across all devices ensures guests enjoy your site anywhere.
- **Ready-to-Launch RSVP System** — Professional form with validation captures guest responses and preferences without backend setup.
- **Fully Customizable Design** — Change colors, fonts, content, and images to match your wedding style perfectly.
## 4. Features to build
**Product features:**
Production-ready features built with modern tech stack for exceptional performance and user experience
- Editorial Photography Layouts
- Smooth Scroll Animations
- Live Wedding Countdown
- Functional RSVP System
- Premium Typography Pairing
- Responsive Mobile Experience
- Interactive Event Cards
- Romantic Color Palette
- Story Timeline Component
- Smooth Mobile Navigation
## 4b. Required services & integrations
List the back-end services this template needs to function. If a service is not needed, say so explicitly — silence is ambiguous.
- **Auth — Optional.** Account-less ticket purchase by email is the default; full accounts only for ticket-holder dashboards.
- **Database — Required.** Events, ticket types, attendees, RSVPs, dietary/accessibility notes.
- **File storage — Optional.** Event photos, speaker headshots, downloadable schedule PDFs.
- **Payments — Not needed.**
- **Transactional email — Required.** Ticket confirmation with QR, calendar invite (.ics), 7-day-before reminder, day-of reminder.
- **External APIs / third-party services:**
- Calendar (Google/iCal) for .ics generation
- Maps for venue
- Apple Wallet / Google Wallet for tickets
**Environment variables to expose in the build:** mark every secret (API key, DB URL, JWT secret, Stripe key, S3 credential) as a clearly named `.env` variable — never hard-code. Include a `.env.example` with the full list.
**Auth + data privacy reminders:** never log secrets · never store passwords in plain text · use HTTPS everywhere · hash + salt with bcrypt or argon2 · refresh tokens with rotation · honor a 'delete my account' request inside the UI.
## 5. Use cases & content to include
Build dedicated UI sections or pages for each of these — they tell you what content the page must support.
- **Wedding Announcements and Guest Information** — Share your wedding story, event timeline, and venue details in one elegant destination. The "Our Story" section lets you document your relationship journey with five milestones, each featuring an image and text in an alternating layout. The Event Details section presents all the information your guests need—ceremony time, cocktail hour, reception details—for three wedding events, displayed in a clear, beautiful grid format that they'll actually want to read.
- **RSVP Collection and Guest Management** — Collect guest responses with validation that ensures you get complete information—no follow-up emails asking what they forgot to include. Guests can quickly confirm their attendance and party size without confusion. The form adapts based on their response—if they decline, they don't see irrelevant questions. You collect complete information that helps you plan your celebration with accurate headcounts and dietary needs.
- **Multi-Event Wedding Weekends** — Document ceremony, cocktail hour, and reception as separate event cards with specific times, venues, and descriptions. The event cards use a responsive grid layout that adapts from single-column on mobile to a three-column grid on medium screens and above, working well for complex wedding weekends where guests need to track multiple events across different locations. Each event gets its own image and detailed information block so nothing gets overlooked.
- **Wedding Planners Serving Couples** — Wedding planners can customize this template for each couple's unique vision, delivering professional websites that match your service standards and differentiate you from competitors using generic tools. Change the color palette and photos to match their style while maintaining the sophisticated editorial aesthetic. Deliver a working website that couples can preview and approve, showing them exactly what their guests will experience.
## 6. Recommended page structure
Generate the following sections in this order. Adjust labels to fit the brand voice, but keep the structural intent.
1. Hero with event name, date, location, primary CTA.
2. Schedule / agenda.
3. Speakers or guests (if applicable).
4. Venue / location section with map.
5. RSVP or ticketing form.
6. Gallery (if appropriate).
7. Footer.
## 6b. First-visit onboarding
Show a **first-visit onboarding** the first time a visitor lands on the site
(detect via `localStorage` flag; do not show on return visits). Keep it
short — three steps maximum — and respectful: visitors can dismiss at any
time and revisit later from a `?` icon in the header.
**Format:** a polished modal *or* a 3-step inline tour, designed to match the
overall visual style of the template (don't bolt on a generic stepper UI).
On mobile, full-screen sheet that slides up.
**Required content — three slides:**
1. **What this is.**
- One-line headline: "Welcome to *Editorial Dawn Wedding Site* — a template for Create a stunning magazine-style wedding website in minutes without design skills. Collect RSVPs, share event details, and tell your story with elegant layouts that work beautifully on any device."
- One paragraph (max 60 words) explaining what the template demonstrates,
who it's for, and what you'd typically use it for.
- Visual: a small annotated screenshot of the page they're about to see,
OR a 4-frame storyboard of key sections.
2. **What to try.**
- 2–3 specific things the visitor should look at to understand the design
(e.g. "Open a section to see the booking flow", "Hover the gallery for
captions", "Resize the window — every layout is fluid").
- Reference real elements on the actual page so the visitor learns by doing,
not by reading.
3. **How to remix this.**
- A direct CTA: "Use this template" → links to Lovable / AI Studio Build
remix entry point.
- Below: 3 short bullets on how to make it yours — e.g.
• "Swap the copy in `data/content.{ts,json}` for your own."
• "Replace the imagery in `/public/images/` (we use AVIF + WebP)."
• "Connect your services using the env-var list in section 4b above."
- Plus a quieter secondary action: "Just looking — close" (closes modal,
remembers preference in localStorage, never auto-shows again).
**Persistent re-entry point:**
A small "?" icon in the top-right header next to the primary nav. Click → reopens the onboarding from slide 1. Tooltip: "How this template works".
**Accessibility:**
- Trap focus inside the modal while open
- `Esc` closes
- All controls reachable by keyboard, visible focus ring
- Heading hierarchy: modal title is `h1` inside the dialog
- `role="dialog"` + `aria-modal="true"` + `aria-labelledby`
- Restore focus to the trigger (or to ``) on close
- Respect `prefers-reduced-motion` — fade in/out only, no large transforms
**Copy tone:**
Warm and direct, not corporate. Avoid "Welcome to your dashboard" language.
Avoid all caps. Use the same voice as the rest of the template's copy.
**Don't:**
- Don't gate content behind the modal. The page below must be fully scrollable.
- Don't show the modal again on return visits. Use `localStorage['onboarding-seen']`.
- Don't include marketing CTAs unrelated to remixing (no newsletter signup, no
"follow us on X" — those live elsewhere).
## 7. Design language
- **Mood:** Celebratory or focused depending on event type; always image-first.
- **Typography:** Display serif or expressive sans for event name; clean body sans. Use a clear modular scale (e.g. 12 / 14 / 16 / 20 / 24 / 32 / 48 / 64 px) and tight tracking on display sizes.
- **Palette:** Aligned with event vibe — warm for weddings, technical for conferences.
- **Spacing:** consistent 4-px base. Generous whitespace — let the content breathe.
- **Radius:** consistent token set (e.g. 6 / 12 / 20 px). Don't mix arbitrary values.
- **Shadows:** subtle, layered. Avoid heavy drop-shadows.
- **Imagery:** Aspirational hero imagery matching the event genre.
- **Motion:** purposeful — entrance fades, hover lifts, page transitions. Respect `prefers-reduced-motion`. No bouncing splash animations.
## 8. Content generation rules
- Write **realistic, specific copy**. NO Lorem Ipsum. NO generic placeholders like 'Your tagline here'.
- Invent plausible names, dates, locations, prices, quotes, testimonials and product details that fit the domain.
- Tone should match the audience above — confident, specific, free of buzzwords.
- Headlines: punchy and concrete. No 'Empower your business' filler.
- Body copy: short paragraphs (2–4 sentences). Use lists where appropriate.
- All numbers, stats, and metrics must look plausible for the domain.
## 8a. Seed content (use these specific examples)
Anchor the generated copy in the concrete data below. Use these names, numbers, dates, and snippets verbatim where helpful, or generate close variants that sit in the same world.
**Couple:** Mira Tanaka & Lucas Bremer
**Date:** Sunday, October 5, 2026 · 06:30 sunrise ceremony
**Venue:** "Cap Ferrat, French Riviera"
**Editorial intro (long-read style):**
"Mira and Lucas first watched a sunrise together on the rocks below Cap Ferrat in 2021. They returned the following year. And the next. On the third sunrise, Lucas asked. On the fourth, they wrote vows. On the fifth, they invite you to sit beside them as the light comes up."
**Schedule:**
- Saturday Oct 4 · 19:00 · welcome dinner at Villa Ephrussi · candlelight, six courses
- Sunday Oct 5 · 06:00 · meet at hotel · shuttles to ceremony rocks
- Sunday Oct 5 · 06:30 · sunrise ceremony · 80 guests · live solo cellist
- Sunday Oct 5 · 08:00 · seaside breakfast · oysters, champagne, brioche
- Sunday Oct 5 · 11:00 · siesta + spa
- Sunday Oct 5 · 18:00 · long dinner · Hôtel du Cap-Eden-Roc
- Sunday Oct 5 · 22:00 · dancing under the loggia
**Dress code:** "Dawn ceremony: layered, soft, neutral linens and cashmere. Dinner: black tie."
**RSVP form:** Name · Plus-one · Will you join the welcome dinner (limited 60) · Dietary · Are you swimming Sunday afternoon (we'll arrange towels)
**Accommodation:** "Hotel block at Hôtel Royal-Riviera · use code TANAKA-BREMER · €490/night"
**Photographer:** Diego Oviedo · sunrise series will be shared 6 weeks after
**Travel info:** "Fly Nice (NCE) · 35 min by car · suggested arrival by Friday evening"
## 9. Media & assets
Every ``, `background-image`, gallery tile, thumbnail, and decorative figure on the page must come from ONE of the three buckets below. Do NOT reference any image path that is not specified here. Do NOT ship stock-photo placeholders.
### Bucket 1 — Runtime-generated via Nano Banana Pro (`gemini-3-pro-image`)
Generate at build time, cache to Firebase Storage at the path listed, serve via signed URL. Each call uses model `gemini-3-pro-image`, output format `image/webp`, dimensions as listed.
- **Hero image** → `/public/generated/hero.webp` · 2400×1500 · prompt: "Editorial dawn-light photograph of the couple named in section 8a at the venue named in section 8a, first light catching mist or sea spray, palette of pearl / oyster / pale rose, couple in motion or partially turned to keep the moment universal, no on-image text, no logos. Real-photo aesthetic, medium-format look, gentle film grain."
- **Schedule moment images (one per row in section 8a's schedule)** → `/public/generated/schedule/{slug}.webp` · 1200×1200 · per-row prompt derived from the section 8a schedule (e.g. ceremony at first light → "wide shot, ceremony at dawn at the venue described in section 8a, soft mist, couple silhouetted, 35mm look, no readable signage").
- **Venue exterior** → `/public/generated/venue.webp` · 1800×1200 · prompt: "Wide editorial photograph of the venue described in section 8a at dawn, pale sky, architectural detail in clean light, no readable signage."
- **Gallery tiles (12 images)** → `/public/generated/gallery/g-01.webp` … `g-12.webp` · 1600×1200 · per-tile prompt template: "Editorial dawn-light wedding documentary photograph at the venue described in section 8a. Subject: [one of: vow exchange at dawn · couple walking toward the water · bouquet of ranunculus and sweet pea · linen runner detail · early-morning coffee on a stone bench · first-light portrait · candle wax on stone · empty ceremony chairs at 5am · wedding rings on linen · bridesmaid laughing in pale silk · brass instrument soloist at sunrise · cake cutting under morning light]. No on-image text, no readable signage."
- **Wordmark / monogram** → `/public/generated/wordmark.svg` · prompt: "A simple two-letter monogram for the couple named in section 8a, set in the display serif of section 7, hairline weight, dawn-light editorial feel." Favicon export to `/public/generated/favicon-256.webp` (256×256).
### Bucket 2 — Seed assets shipped with the deliverable
Static files committed to `/public/samples/` as fallbacks when generation fails. Generated once via Nano Banana 2 (`gemini-3.1-flash-image`), 1024×1024 WebP unless noted.
- `/public/samples/empty-state-rsvp.webp` — 1024×1024 — prompt: "Minimal hand-drawn line illustration of an empty RSVP card on a flat surface, single-stroke outline, no colour fill."
- `/public/samples/empty-state-gallery.webp` — 1024×1024 — prompt: "Minimal hand-drawn line illustration of an empty photo album with one photo corner exposed, single-stroke outline, no colour fill."
- `/public/samples/hero-fallback.webp` — 1600×1000 — same prompt as the Bucket-1 hero, encoded once at build and committed so the page renders identically if Gemini quota is exhausted.
### Bucket 3 — User-supplied (when the template is remixed by a real couple)
Onboarding modal offers "Replace with your photos". Uploads land via the file input → Firebase Storage path `weddings/{coupleSlug}/uploads/`. The build ships with Bucket-1 + Bucket-2 only; no user-supplied images at first paint.
### Hard rules
- Every `` tag MUST have a `src` that resolves to a path listed above. Any `` referencing a path not in this section is a build error.
- No bare `image.jpg` / `hero.jpg` / `placeholder.png` references anywhere in the code.
- Icons: `lucide-react` only; use sparingly and consistently — never decorative-only.
- Optimisation: WebP or AVIF, `loading="lazy"` on everything below the fold, explicit `width`/`height` to prevent layout shift.
## 10. Interactivity & states
- Every interactive element has a hover, focus, active, and disabled state.
- Forms validate inline and show specific error messages.
- Loading states (skeletons, not spinners where possible).
- Empty states with helpful next-action guidance.
- Smooth scroll for in-page anchors.
## 11. Tech & responsive requirements
- **File downloads on Safari / Firefox:** when offering local-disk save of any export (PDF, CSV, MP3, ZIP, JSON, image, `.ics` calendar invite), fall back to `` with a blob URL — the File System Access API (`showSaveFilePicker()`) is Chromium-only. Detect with `'showSaveFilePicker' in window`; otherwise use the anchor-download path.
- **Stack:** React + TypeScript + Tailwind CSS. Use functional components and hooks.
- **Mobile-first.** Verify layouts at 375 px (iPhone SE), 768 px (iPad), 1024 px, 1440 px+.
- Use `clamp()` for fluid typography where appropriate.
- Prefer container queries over media queries for component-level responsiveness.
- Use `dvh` / `svh` units instead of `vh` to handle mobile viewport chrome.
- Zero horizontal overflow at any width. Zero layout shift on load.
- Respect safe-area insets on iOS.
## 12. Accessibility (WCAG 2.2 AA)
- Semantic HTML — `header`, `nav`, `main`, `section`, `article`, `footer`.
- All interactive controls reachable by keyboard with a visible focus ring.
- Color contrast ≥ 4.5:1 for body, 3:1 for large text and UI components.
- All images have meaningful `alt` text. Decorative images use `alt=""`.
- Form fields have associated `