A color and layout foundation where every surface, divider, and block of text lands on the same grid — and every color is mixed from oil-pigment hues in OKLCH so light and dark mode share one palette.
- Role
- Design engineer
- Timeline
- 12 weeks, 2025
- Stack
- React, Tailwind v4, OKLCH
Problem
Two themes, three palettes, zero agreement
The product had accumulated hex values the way old houses accumulate paint layers. Dark mode was a separate palette maintained by hand, spacing was whatever the last person typed, and nothing lined up with anything else on the page.
Approach
Primitives, tokens, utilities — in that order
I rebuilt the palette as nine painter pigments expressed in OKLCH, sharing a single ramp of lightness steps. Semantic tokens map those primitives to roles — surface, text, action, state — with dark mode as overrides on one class rather than a parallel palette. A baseline grid with minor and major cells drives every margin, gap, and card height.
If it doesn't sit on the grid, it doesn't ship.Outcome
9
Pigment hues
11
Lightness steps
1
Source of truth
Theme changes went from a week of QA to a token diff. New screens compose from semantic utilities instead of raw values, and the grid made alignment reviews obsolete — if it renders, it's aligned.