Design system

Augusta National at dusk. Quiet, premium, monospaced numerics, generous breathing room. This page is the handoff: every token, every component, with the values Claude Code (or any engineer) can lift directly.

Color 11 tokens

No blue. No purple. No gradients (except one optional radial behind the matchup score block). Status is always conveyed by icon + text + color — never color alone.

Surface

#0a0a0a
Background
--bg
Page background, near-black with a hint of warmth.
#141414
Surface
--surface
Cards, sheets, modals — first elevation step.
#1c1c1c
Surface inset
--surface-2
Inputs, table rows on hover, segmented track.
#262626
Hairline
--hairline
1px borders. Used sparingly — prefer space over lines.

Text

#f5f5f4
Text primary
--text
Warm off-white, never pure white.
#a3a3a3
Text secondary
--text-2
Labels, metadata. 4.62:1 on bg — WCAG AA.
#525252
Text tertiary
--text-3
Timestamps, footnotes. Decorative use only.

Accent + status

#1f8a5b
Emerald
--emerald
Active tab, primary CTA, "live", "you" highlight.
#0c3d28
Emerald muted
--emerald-mute
Filled progress bars, selected segment bg.
#f59e0b
Amber
--amber
Lock T-2hr, "haven't picked yet" badges.
#ef4444
Red
--red
Lock T-15min, validation, MC badge.

Type Inter · 4 weights · tabular nums

One family. Four weights (400/500/600/700). All numerics use font-variant-numeric: tabular-nums so columns of scores, prices, points and PHR align visually.

Display
--text-display
32 / 36 · 700 · -0.01em
317.6
H1
--text-h1
24 / 32 · 600 · -0.01em
PGA Championship
H2
--text-h2
18 / 24 · 600
Live standings
Body
--text-body
16 / 24 · 400
Picks lock in 1 hour 47 minutes — tap to finish.
Label
--text-label
13 / 18 · 500 · 0.04em · UPPER
Your points · Rank · PHR
Meta
--text-meta
13 / 18 · 400 · tertiary
Updated 3 minutes ago
Caption
--text-caption
11 / 16 · 500 · 0.04em
Live

Spacing 4-base scale

4px base unit. Use the named scale below — don't invent half-steps. Mobile container padding is 16px horizontal, never less.

4
--s-1
8
--s-2
12
--s-3
16
--s-4
20
--s-5
24
--s-6
32
--s-8
48
--s-12
64
--s-16

Radii

Card
--r-card · 12px
Button
--r-btn · 8px
Pill
--r-pill · 999px

Touch targets

Minimum44 × 44Any interactive element.
Pick / swap56 tallLineup rows, swap-drawer rows.
Roster row64 tallStandings row, golfer row.
Header56 tallApp bar.
Bottom nav56 + safe-areaPlus env(safe-area-inset-bottom).

Components 15 in spec · sampled below

Anatomy snapshots. The full live prototype is on the sister page — these are reference renders for handoff.

Status pills

22h · 8px pad · 11/16 500 · 0.04em
Live Finished MC Unpaid

Buttons

56h primary · 8 radius · 16/600

Segmented control

--surface-2 track · 999 radius · emerald top-rule on active

Toggle

51 × 31 · iOS-style · emerald on / inset off
On
Off

Tabs

18/600 · 2px emerald underline · 200ms ease-out

Progress bar

2px (standings) · 4px (budget) · emerald on --surface-2 rail

Tokens JSON Drop straight into Tailwind / Style Dictionary

Source of truth. Engineers can paste this into tailwind.config.js or feed it to Style Dictionary.

// design-tokens.json
{
  "color": {
    "bg":           "#0a0a0a",
    "surface":      "#141414",
    "surface-2":    "#1c1c1c",
    "hairline":     "#262626",
    "text":         "#f5f5f4",
    "text-2":       "#a3a3a3",
    "text-3":       "#525252",
    "emerald":      "#1f8a5b",
    "emerald-mute": "#0c3d28",
    "amber":        "#f59e0b",
    "red":          "#ef4444"
  },
  "font": {
    "sans":    "Inter, -apple-system, system-ui, sans-serif",
    "feature": "'tnum' 1"     // applied via .tnum utility on all numerics
  },
  "text": {
    "display": { "size": "32px", "line": "36px", "weight": "700", "tracking": "-0.01em" },
    "h1":      { "size": "24px", "line": "32px", "weight": "600", "tracking": "-0.01em" },
    "h2":      { "size": "18px", "line": "24px", "weight": "600" },
    "body":    { "size": "16px", "line": "24px", "weight": "400" },
    "label":   { "size": "13px", "line": "18px", "weight": "500", "transform": "uppercase", "tracking": "0.04em" },
    "meta":    { "size": "13px", "line": "18px", "weight": "400" },
    "caption": { "size": "11px", "line": "16px", "weight": "500", "tracking": "0.04em" }
  },
  "space": { "1": "4px", "2": "8px", "3": "12px", "4": "16px", "5": "20px", "6": "24px", "8": "32px", "12": "48px", "16": "64px" },
  "radius": { "card": "12px", "btn": "8px", "pill": "999px" },
  "touch": { "min": "44px", "pick": "56px", "roster": "64px" },
  "motion": {
    "tap":        "scale(0.97) 100ms",
    "page":       "fade 200ms ease-out",
    "skeleton":   "shimmer 800ms cycle, cap 2s",
    "live-update": "emerald → text, 600ms fade",
    "live-pulse":  "2s ease-in-out infinite, opacity 1→0.4",
    "reduce-motion": "fades only, no scale"
  },
  "focus": { "ring": "2px solid #1f8a5b", "offset": "2px" }
}

Rules of the road