Design tokens that survive engineering handoff
Most token systems break the moment a developer needs a hover-active-disabled triplet. A short field guide to naming, composition, and the four rules we never break.
Mira Holmberg
Design Lead
Every design system demo looks the same: a tidy palette, a Figma frame full of swatches, a JSON file with two hundred names. Then a developer asks for the hover state of a destructive button on a dark surface, and the whole thing folds like a paper chair. Tokens do not fail in the palette. They fail at the seams — naming, composition, and the moment of handoff.
Name the decision, not the color
The root mistake is naming tokens after what they look like instead of what they decide. blue-500 tells a developer nothing about when to use it; accent tells them exactly. We keep two strict layers: a primitive scale nobody references directly, and a semantic layer that maps decisions onto it.
/* primitives — private vocabulary */
--color-brand-500: #2e90fa;
--color-gray-900: #111827;
/* semantics — public decisions */
--color-accent: var(--color-brand-500);
--color-ink: var(--color-gray-900);
--color-line: var(--color-gray-200);
When the brand shifts, primitives change and semantics hold. When dark mode arrives, semantics remap and components never know. Every token a component touches should survive both events without a rename.
The four rules we never break
- No component references a primitive. Ever. The linter enforces it, not the style guide.
- Every semantic token must answer “when would I use this?” in one sentence — if the sentence needs the word “or”, split the token.
- States compose by suffix (
accent-hover, nothover-blue): the base name carries the decision, the suffix carries the state. - Tokens ship in the same PR as the Figma change. A token that exists in one tool is a rumor, not a system.
A token is a promise between two disciplines. If either side can break it silently, you do not have a system — you have a mood board.
Surviving the handoff
Handoff is where systems die because handoff is where the missing tokens surface. Our fix is unglamorous: the triplet test. Before any component ships, design and engineering walk its hover, active, and disabled states together, on light and dark surfaces. Five minutes per component. It has caught a gap every single time.
Field note
If a developer ever writes a hex value inside a component, the system did not fail at that line — it failed weeks earlier, when the token they needed was not there and asking for it was slower than hardcoding.
Mira Holmberg
Design Lead
Runs the design system practice. Believes a token is a promise between two disciplines, and promises should be kept.
READ NEXT
-
Uncategorized
Hello world!
Welcome to WordPress. This is your first post. Edit or delete it, then start writing!
· Jul 17, 2026
-
Engineering
Why we run on monorepos again
After three years of polyrepos, the cost of context switching outgrew the cost of one big lockfile. Here is what we kept, what we changed, and the tooling that finally made it work.
Anders Lindqvist · May 28, 2026
-
Cloud
Cutting AWS Fargate cold starts in half
A practical walk through layered images, provisioned capacity, and the unsung win of moving heavy imports behind lazy boundaries.
Niko Petrov · May 12, 2026