Token architecture and tiers
A value is written once, as a primitive. Everything after that is a name pointing at a name, so changing one primitive re-themes every control that depends on it.

Three tiers
Core primitives
Raw values with no meaning: primitive/terracotta: #9C3B22. The only tier allowed to hold a hex.
Semantic tokens
A role, pointing at a primitive: semantic/primary: var(--jv-terracotta). This is what product code binds to.
Component tokens
One property of one component: button/primary/background: var(--primary). Lives in the component's own stylesheet.
The cascade
Pick a chain to light its connectors and see how the component resolves. Change the primitive and both tiers above it follow, with no hex anywhere below tier 1.
Naming
Names say the role, never the colour. A token called --orange stops being true the day the brand changes; --primary stays true.
- Primitives ship as
--jv-*on a bare:root, so they resolve everywhere. - Semantic tokens ship inside
[data-ds="v1"], the scope every migrated screen opts into. - Status families come in threes:
--success,--success-brightfor text and icons, and--success-softat 16% alpha for fills.
No hex below tier 1
.badge {
background: var(--success-soft);
color: var(--success-bright);
}<span className="bg-[#22B573]/20
text-[#3DDB94]">Received</span>