VOW & CO.

Design system · v0.1

Vow & Co. — foundation.

An evaluable scaffold for a three-sided wedding platform. Every token, primitive, and motion rule used by the product lives on this page. Two palettes. Full reduced-motion support. No features yet — by design.

Section 01

Brand

Vow & Co. is a working-title identity. The mark, wordmark, tagline, and palette are held as a handful of constants — changing a single line in /lib/config.ts rebrands the entire shell. Treat everything shown here as a scaffold that will evolve with real brand direction.

Monogram

24px
48px
96px
160px
ink
clay
cream

Wordmark

smVOW & CO.
mdVOW & CO.
lgVOW & CO.
VOW & CO.VOW & CO.
VOW & CO.

The placeholder brand is intentionally quiet — a serif wordmark, a monogram with two interlocking letterforms, and a palette of warm naturals. Every brand value lives in /lib/config.ts. Swap the constants, and the whole shell reads differently.

Section 02

Typography

Fraunces carries the display work — titles, feature headings, quotes — while Inter handles body, labels, and dense interface surfaces. The scale is deliberately gentle at the top end so longer lines stay readable, and wide at the bottom for captions, meta, and tabular rows.

Display · Fraunces

text-6xlWhere every wedding comes together.
text-5xlA quiet afternoon in the Yarra Valley.
text-4xlForty guests beneath the grandmother's oak.
text-3xlFirst look at four o'clock.
text-2xlLinen, lavender, and long shadows.
text-xlCeremony draft shared with the planner.

Body · Inter

text-lgAn emphasised body size for moments that deserve a little more weight — framing, quotes, and calls to attention.
text-baseThe ceremony will begin at four o'clock on the lawn, with a Yarra Valley sunset as the backdrop. Guests will gather informally from three.
text-smSecondary copy. Sits under titles and captions. Reads comfortably at small sizes.
text-xsMeta copy: dates, statuses, and short inline labels.
text-microLegal, timestamps, and footnotes.

Numeric · without tabular-nums

1,234,567.89

Columns can feel jittery; digits have variable widths.

Numeric · with tabular-nums

1,234,567.89

Use font-numeric for stats, prices, and tables.

Section 03

Colour

A warm, natural palette drawn from linen, clay, and sage. The same tokens are re-mapped under the cool-natural palette (toggle in the header) so the same components read differently without changing any class names.

Base palette

Ivory--ivory
Cream--cream
Linen--linen
Stone--stone
Sand--sand
Clay--clay
Clay deep--clay-deep
Sage--sage
Olive--olive
Ink--ink
Graphite--graphite
Mist--mist
Blush--blush

Status

Positive--status-positive
Pending--status-pending
Attention--status-attention
Neutral--status-neutral

Contrast check — text on surface

WCAG ratios between text tokens (rows) and surface tokens (columns). AA body text requires 4.5, AA large text 3. Ratios recompute when the palette toggle in the header is flipped.

Text ↓ / Surface →
Ivory
Cream
Linen
Stone
Ink
Graphite
Mist
Clay
Clay deep

Palette toggle · live demo

Flip the toggle in the header. The page restyles smoothly — no reload and no re-render. Every token is a CSS custom property; Tailwind classes never change.

Venue feature

Laurel & Oak Homestead

Yarra Valley · capacity 140 · ceremony on the stone terrace

From $14,500

Brief

A sage-and-cream palette, long trestle tables beneath the pergola, and a four-piece string ensemble at sunset. Forty guests for dinner, eighty for dancing.

Saved by Amelia · draft v3

Section 04

Spacing, radius & shadow

Corner radii step up from 6px (inputs) through to 24px (feature panels). Shadows are muted and warm — no heavy elevations, no neon. Generous padding on cards keeps the interface feeling breathable rather than dense.

Radius scale

rounded-sm
6px
rounded-DEFAULT
8px
rounded-md
10px
rounded-lg
12px
rounded-xl
16px
rounded-2xl
24px
rounded-full
9999px

Shadow scale

shadow-soft
Resting elevation for cards and panels.
shadow-soft-hover
Hover me. Interactive cards lift gently.
shadow-inset-soft
Subtle inset, used on inputs and embedded fields.

Spacing

p-1
4px
p-2
8px
p-3
12px
p-4
16px
p-6
24px
p-8
32px
p-12
48px
p-16
64px
Section 05

Motion

Motion is used to soften state changes, not to draw attention. Five easing curves and five duration tokens cover almost every case — reveals, stagger, count-ups, and skeleton-to-content transitions. All motion respects reduced-motion preferences.

Ease curves

Soft
[0.22, 1, 0.36, 1]
Emerge
[0.16, 1, 0.3, 1]
Gentle
[0.4, 0, 0.2, 1]
Spring
stiffness 260 · damping 28
Spring (soft)
stiffness 180 · damping 22
Duration
micro 0.18s · fast 0.28s · normal 0.45s · slow 0.75s · scenic 1.2s
Reveal & Stagger

Scroll into view, or replay.

1
Reveal card 1
Fades and lifts into place.
2
Reveal card 2
Fades and lifts into place.
3
Reveal card 3
Fades and lifts into place.
4
Reveal card 4
Fades and lifts into place.
CountUp

Stats animate from zero on mount.

Weddings
0
in preparation
Suppliers
0
listed nationwide
Reply rate
0.0%
within 48 hours
Shimmer

Skeleton placeholder → real content.

Section 06

Components

Every primitive in its resting states. Real sample content is used throughout — no lorem ipsum — to make it easier to judge how these components will read in the product itself.

variant: primary

variant: secondary

variant: outline

variant: ghost

variant: destructive

variant: link

Section 07

Image treatment

Images always render into a warm placeholder — linen whilst loading, a monogram fallback if they fail. No broken icons, no white flashes. The fallback uses the same SVG mark as the logo.

Loaded

A couple and guests gathered outdoors at a wedding, warmly lit.

A real photograph fades in once loaded.

Loading

Skeleton state while a photograph is still fetching.

Failed

Placeholder — image failed to load.

Monogram fallback on a cream-to-linen gradient.

Forces the first card to point at a broken URL so the fallback can be inspected.

Section 08

Accessibility

Focus rings are visible on every interactive surface. Reduced-motion preferences are respected both at the OS level and via the header toggle. Every image has alt text or is explicitly decorative.

Focus ring

Press Tab to cycle focus through these elements.

Example link

Reduced motion

Every motion component consults useReducedMotionSafe(), which honours both the OS prefers-reduced-motion query and the toggle in this page’s header. When reduced, all reveals, count-ups, and shimmer loops collapse to static states.

Try flipping Reduce motion at the top of this page and scroll back up — the motion demos render without animation.

Contrast recap

The contrast grid in Section 03 surfaces the WCAG ratio of every text-on-surface pairing we use. Pairings that fail AA (body 4.5, large 3) are flagged in terracotta — any failures found there are treated as bugs to be fixed, not warnings to be ignored.

Section 09

What's next

The shell you have here is foundation. The data models that back a three-sided platform — weddings, suppliers, enquiries, moodboards, messages, timelines, payments — come next, alongside the role switcher that lets a single session step between Planner, Couple, and Supplier without the friction of real authentication.

From there, each experience earns its own phase. A Couple who plans their own wedding and discovers suppliers. A Planner who carries dozens of weddings in parallel and needs a calm place to see them all. A Supplier who runs a small business on enquiries, quotes, and bookings. Each surface will reuse the primitives shown here and extend them with role-specific composite components — moodboards, kanbans, timelines, messaging — built to the same bar.

A set of scripted product tours will then thread those roles together into a single continuous story, so a founder or investor can walk through a real wedding from first brief to first dance without leaving the shell.

This foundation is built to extend, not to be replaced.