Template
Vernissage
A gallery-concept wedding site that frames the couple's relationship as an art exhibition: a stark white 'exhibition' hero, a date marquee, a chronology timeline, a bento photo gallery with museum-style labels ('The Works'), a venue section and a conditional RSVP. It suits design-minded couples and photographers who want something that feels curated rather than conventionally romantic.
Art-exhibition wedding site · Website · Events and bookings · static site
A mock-up of the homepage, drawn from this design’s layout, palette and typefaces. A build follows the full prompt below.
Start from this templateRead the build prompt
Typefaces
The condensed editorial serif against a typewriter mono is the museum-catalog idea itself, and this pairing is unique in the catalog.
- Instrument SerifHeadings: names ~100px and section heads 72px, italic
- Space MonoBody: body 16px; 12px uppercase nav and buttons at 0.3em
Who it is for
- Design-minded couples
- Wedding photographers showcasing work
- Agencies producing custom-looking sites
- Couples launching early and adding details later
Layout
- Sticky minimal header: monospace initials-and-year monogram left, EXHIBITION / CHRONOLOGY / THE WORKS / VENUE / RSVP right with blue active underline
- Hero: huge condensed serif first names stacked on two lines with the date spelled out and location in tracked mono, 'Scroll' cue
- Infinite marquee repeating the numeric date
- 'The Archive' chronology: center vertical line with small blue square nodes, alternating left/right entries (number in blue, year, serif title, one-line mono caption)
- 'The Works' bento gallery with museum-style labels (title, medium, year)
- 'The Space' venue block with details
- RSVP with conditional fields; footer with monogram
- Full-screen mobile menu
Palette
Curated, minimal, intellectual, cool, witty. It reads like a contemporary art museum catalog for a wedding.
- background
#ffffff - text/primary
#000000 - accent (gallery blue)
#0066ff - secondary surface
#f5f5f5 - border
#e6e6e6 - muted text
#5c5c5c
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on white | 21.00:1 | 4.5:1 |
| Aa | muted mono caps on white | 6.69:1 | 4.5:1 |
| Aa | muted text on secondary surface | 6.13:1 | 4.5:1 |
| Aa | blue index numbers and links on white | 4.83:1 | 4.5:1 |
| Aa | white label on black primary button | 21.00:1 | 4.5:1 |
| blue timeline nodes and active underline | 4.83:1 | 3:1 | |
| input border on white | 3.03:1 | 3:1 |
As vibld’s tokens
The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary
- secondary
- accent
- destructive *
Type scale
- Display
- Instrument Serif 400, ~100px names and 72px section heads with tight negative tracking
- Body
- Space Mono 16px; nav and buttons 12px uppercase mono with very wide 0.3em tracking
Condensed editorial serif against typewriter mono mimics exhibition wall text and catalog labels.
Spacing and imagery
Stark white space, 0 radius, hairline center line, alternating timeline columns, long single scroll (~8500px).
Couple photos presented as artworks in a bento grid with label cards; mostly black-and-white with one blue accent color.
Components
- Monospace sticky header with active-section underline
- Exhibition-style hero
- Date marquee
- Center-line chronology with square nodes
- Alternating timeline entries
- Bento gallery
- Museum wall label
- Venue block
- Conditional RSVP form
- Full-screen mobile menu
- Footer monogram
Interactions
- Scroll-spy highlights current section in nav
- Infinite marquee
- Staggered reveals (many custom animations)
- Gallery hover reveals label
- Conditional RSVP fields
- Full-screen mobile menu open/close
- Toast on RSVP submit
Data
Chapter{index, year, title, caption}Work{title, medium, year, image, size(bento span)}Venue{name, address, time, notes}RSVP{name, email, attending, guests, dietary, message}
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack templates) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal
Build **Vernissage**, a wedding site for fictional couple Noor & Felix, staged as an art exhibition about their relationship. The audience is guests who appreciate design; the job is to delight on first view, tell the story as a chronology, show photos as "works" with wall labels, explain the venue and collect RSVPs.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Form, RadioGroup, Input, Textarea, Sheet), lucide-react, Framer Motion (or CSS keyframes) for reveals, an IntersectionObserver scroll-spy, Sonner for toasts, Vaul or a custom full-screen menu, react-hook-form + zod with conditional logic. RSVP posts to a serverless function or Supabase insert-only table.
### Pages & layout
Single page with anchored sections:
1. **Header** – sticky, white, hairline bottom border; monogram "N + F -- 2026" in spaced mono at left; five spaced mono links at right (Exhibition, Chronology, The Works, Venue, RSVP) with a thin blue underline on the active section.
2. **Exhibition (hero)** – names stacked in a very large condensed serif; the date written out in words; "A union · [place]" in tracked mono; a small "Scroll" cue.
3. **Marquee** – the numeric date repeating in mono.
4. **Chronology** – a 1px center line with small blue square nodes; six entries alternate left and right: blue index number, year, serif title, one terse mono caption.
5. **The Works** – bento grid of 6–8 photos of mixed spans; each has a wall label (title in italic serif, "Medium: film photograph, year").
6. **The Space** – venue name, address, arrival time, dress code, transport notes.
7. **RSVP** – conditional form; footer with monogram and date.
### Design system
- Tokens: `--background: #ffffff`, `--foreground: #000000`, `--primary: #000000`, `--accent: #0066ff`, `--secondary: #f5f5f5`, `--border: #e6e6e6` (decorative), `--input-border: #949494`, `--muted-foreground: #5c5c5c`, `--radius: 0`.
- Fonts: Instrument Serif (400, italic) and Space Mono (400/700). Scale: 12 (mono caps, +0.3em) / 14 / 16 / 24 / 40 / 72 / clamp(64px, 10vw, 104px), display tracking -0.025em.
- Spacing: 8px base; sections 160px; chronology entries offset by 220px vertically.
- Motion: reveal 700ms `cubic-bezier(0.2,0.8,0.2,1)`, nodes scale in, marquee 30s linear, gallery label slide-up 200ms.
### Components & interactions
Scroll-spy nav (active, hover, focus), full-screen mobile menu (focus trap, Escape), marquee (pausable), chronology entry (left/right variants), node, bento tile (hover shows label; label also visible on touch and to screen readers), RSVP: attending radio → if yes, guest count and names plus dietary; if no, a note. States: invalid, submitting, success toast plus inline thank-you, error with retry.
### Data & state
`Chapter{index,year,title,caption,side}`, `Work{src,alt,title,medium,year,span:'sm'|'md'|'lg'}`, `Venue{name,address,time,dressCode,notes}`, `Rsvp{name,email,attending,guests[],dietary,message}`. Everything in a typed config file; placeholder photos only.
### Accessibility
Black on white is maximal; the blue `#0066ff` on white is 4.8:1, fine for small index numbers, active underlines and timeline nodes. Wide-tracked mono caps at 12px use `#5c5c5c` or darker (6.7:1 on white, 6.1:1 on `#f5f5f5`). RSVP inputs use `--input-border: #949494`; `#e6e6e6` hairlines are decorative. The marquee is `aria-hidden` and pausable; the date also appears in the hero text. Gallery labels exist in the DOM (as `figcaption`), not hover-only. Chronology order in the DOM matches reading order despite alternating sides. Scroll-spy uses `aria-current="true"`. Reduced motion shows everything statically.
Verified contrast: body text on white #000000 on #ffffff = 21.0:1; muted mono caps on white #5c5c5c on #ffffff = 6.69:1; muted text on secondary surface #5c5c5c on #f5f5f5 = 6.13:1; blue index numbers and links on white #0066ff on #ffffff = 4.83:1; white label on black primary button #ffffff on #000000 = 21.0:1.
### Security
Proportionate: zod schema shared by form and function including the conditional rules, honeypot, rate limiting, optional invite code, no keys in the client, insert-only storage, and no public guest list.
### Performance & SEO
Serve gallery images responsively with `sizes` matching bento spans, lazy-load below the fold, preload the fonts' used subsets. `noindex` by default, OG image styled like an exhibition poster. Lighthouse 95+.
### Guardrails
- Fictional couple, venue and placeholder photos; no real museum names or logos.
- No invented guest quotes.
- Minimal RSVP data, purged after the event.
- Small typed components, no `any`, visible errors.
- Done when: scroll-spy tracks all sections; chronology alternates and reads correctly by screen reader; gallery labels are accessible without hover; conditional RSVP validates on both sides; mobile menu is fully keyboard operable.