Palette
The colors. Source of truth lives in src/styles/global.css as @theme tokens. Source files reference them via var(--color-brand-X); the tests/brand-palette.test.ts guardrail fails CI if a raw hex sneaks past the central file. One file = full rebrand.
Greens — the brand action color
Warms — yellows and gold
Neutrals — the cream surfaces
Depth — navy and accent
Ink — text colors
Typography
Three families, each with one job. Loaded once from Google Fonts via font-display: optional so render isn't blocked. No swap-in flash, no layout shift.
Display · Plus Jakarta Sans
There is a solution for everything.
Body · Inter
Premium quality, for everyone. Inter is the body voice — quiet, neutral, present. Reads as long-form copy at 1rem and as captions at 0.85rem without complaint. Weights 400, 500, 600.
Mono · JetBrains Mono
SECTION · 01 · §07 · TOOLS · MEMBERS
Components
The visual primitives that appear across the site. Each one earns its place — no decorative components, no "we might need this" abstractions.
Primary button
Green pill, white text, no border. The default call-to-action.
Ghost button
Outline only. Secondary actions, cancellations, "Maybe later."
Badge
The membership badge and its siblings. Yellow surface, ink border, monospace text, 3-pixel hard shadow. Sticker energy.
Eyebrow label
JetBrains Mono, 0.7rem, 0.12em letter-spacing, uppercase, green. Sits above section titles to give them a context line.
Card
White surface, 2px ink border, 3-pixel yellow hard shadow, 0.85rem radius. Used for grouped content (account stats, voice rule rows).
Display name
Saved to user_metadata.full_name. Refreshes the nav avatar initials when changed.
Where to find it in code
Palette tokens: src/styles/global.css under @theme. Type rules: same file, font definitions and utility classes. Components: per-page styles for now; some (badges, buttons) repeat enough that a future PR could promote them to shared src/styles/components.css.
The palette guardrail is real: tests/brand-palette.test.ts fails CI if you write a brand-palette hex outside global.css. Use var(--color-brand-X) always; add new tokens to @theme first, then reference them.