CauseMatch
All posts
April 9, 2026 · 4 min read

Design system notes

One source, always

Every color, font, radius, and shadow lives in DESIGN.md at the root. The same tokens are mirrored in app/styles/app.css under @theme { }. Components reference tokens through CSS variables (var(--color-foreground), var(--font-display)), never hex codes inline.

Why this matters

When everything points at one source, redesigns become small. Want a different brand color? Change one value in DESIGN.md, sync app.css, hot reload. Every component picks it up. No find-and-replace across 40 files.

Two-canvas rhythm

The visual language uses two main surfaces:

  • A clean white content canvas for body text and dense reading
  • A deep brand canvas for hero, footer, and CTA bands

Cream shows up sparingly, as an editorial third tier between the two.

Type pairing

Headings sit in a serif (Playfair Display by default). Body and UI sit in a clean sans (PT Sans). Mixing them is load-bearing. Keep that split, change the actual fonts if you need to.

When to deviate

Do not. The point of a system is consistency. If you find yourself reaching for a value that is not in the system, the answer is almost always either "use the closest token" or "add the new token to DESIGN.md and app.css once, then use it".