Skip to main content
vibld

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

  1. Sticky minimal header: monospace initials-and-year monogram left, EXHIBITION / CHRONOLOGY / THE WORKS / VENUE / RSVP right with blue active underline
  2. Hero: huge condensed serif first names stacked on two lines with the date spelled out and location in tracked mono, 'Scroll' cue
  3. Infinite marquee repeating the numeric date
  4. '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)
  5. 'The Works' bento gallery with museum-style labels (title, medium, year)
  6. 'The Space' venue block with details
  7. RSVP with conditional fields; footer with monogram
  8. 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

SampleWhereRatioNeeds
Aabody text on white21.00:14.5:1
Aamuted mono caps on white6.69:14.5:1
Aamuted text on secondary surface6.13:14.5:1
Aablue index numbers and links on white4.83:14.5:1
Aawhite label on black primary button21.00:14.5:1
blue timeline nodes and active underline4.83:13:1
input border on white3.03:13: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.

Open the builderAll templatesThis palette on its own