Systematicby design
Screens are the output, not the work. The work is a pipeline of decisions — raw values, named intent, composed parts — arranged so one change travels everywhere it should and nowhere it shouldn't.
primitive — a value with no meaning yet
the primitives shelf — findable, versioned, reused
semantic alias — intent, not colour
tokens.cssbuilt from tokens.json
:root {
}
ios· UIColor(named: "accent")
android · R.color.accent
components consume roles, never values
Raw values live in exactly one place. Everything above them is a reference with a meaning — so a rebrand is an edit, not a rebuild.
hover a segment — each one answers a different question
- R01category → property → concept → state; never reordered
- R02no raw values past the primitive layer — everything else references
- R03semantic names say intent (accent, canvas), never appearance (green, dark)
- R04deprecate with an alias and a changelog entry; never break a name
interactive elements take radius.2 — cards radius.3 — pills full. nothing else is legal.
Tokens aren't a Figma poster — they're a build artifact. One JSON source compiles to every platform the team ships, so design and code can never drift apart.
{"color": {"accent": {"default": {"$value": "{color.cyan.300}","$type": "color"}}}}
Every component should live at one published address — states, props, and accessibility notes beside the canvas. Try it — the knobs are live.
The payoff of the waterfall: point the same kit at a different set of primitives and the whole product re-skins itself. This is how one design system serves many clients.
The use case that pays for the system: a client wants the product under their own brand. With every screen built on semantic tokens, a white-label is a new primitive sheet — not a fork, not a redesign, not a second codebase.
