07
Tier 3

Component Tokens

Three collections per component: Size (changes with size mode), Structure (fixed values), and the shared Color bridge (6 tokens, all components).

7.1 The Size Collection

Figma collection: {Component} / Size — Modes: sm, md, lg

Every token whose value changes when the component size changes lives here. This includes dimensions, padding, gaps, and typography tokens.

Button / Size Example

Tokensmmdlg
button-height32px40px48px
button-padding-x8px16px16px
button-padding-y4px8px12px
button-font-size14px14px16px
button-font-weight500500500
button-icon-size16px20px20px
button-gap4px8px8px
button-radius{radius-md}{radius-md}{radius-md}
📏
Naming Rule Token names never include the mode name. button-height is correct. button-height-md is wrong — md is a mode, not part of the token's identity.

7.2 The Structure Collection

Figma collection: {Component} / Structure — Mode: Default (single mode)

Fixed token values that never change regardless of color family or size. These are structural — they belong to the component's visual recipe, not its theming layer.

Examples

TokenValueReferences
Button / Structure
button-disabled-bgfixed{disabled-surface}
button-disabled-textfixed{disabled-on-surface}
button-disabled-borderfixed{disabled-border}
Toggle / Structure
toggle-thumbalways white{white}
toggle-thumb-borderalways medium gray{border-default}
toggle-track-offalways gray{border-default}
toggle-track-disabledfixed{disabled-surface}
Checkbox / Structure
checkbox-bg-offunchecked bg{surface-default}
checkbox-border-offunchecked border{border-default}
checkbox-checkmarkalways white{white}

7.3 The Shared Color Collection — The Key Innovation

Figma collection: Color / Active — Modes: neutral, brand, info, success, warning, danger, contrast

🔑
Instead of duplicating color definitions inside every component, one shared collection bridges Semantic Colors to Component Types. Only 6 tokens. All 15+ components. Every color family. Zero duplication.
TokenMeaningMode: brandMode: danger
colorPrimary accent swatch{brand-color} → purple{danger-color} → red
on-colorContent on color{brand-on-color} → white{danger-on-color} → white
containerSoft/subtle background{brand-container} → light purple{danger-container} → light red
on-containerContent on container{brand-on-container} → dark purple{danger-on-container} → dark red
outlineBorders and outlines{brand-outline} → purple{danger-outline} → red
focusFocus rings / highlights{brand-focus} → purple alpha{danger-focus} → red alpha

Why Only 6?

We audited every component in the system:

ComponentTokens UsedWhich Ones
Button (primary)4color, on-color, focus, outline
Button (outline)3on-container, outline, focus
Button (light)3container, on-container, focus
Button (basic)2on-container, focus
Toggle1–2color, (focus)
Checkbox2color, focus
Radio Button1color
Badge2color, on-color
Tab3–4color, on-color, outline, focus
Icon1color

No component needs more than 6. Most need 1–3. The 6 roles cover every case.

7.4 Component Typography Tokens & Styles

Typography tokens that change with size belong in the Size collection alongside dimensional tokens.

Full Typography Chain
// Tier 1 — Primitive
font-size-sm:  14px
font-size-md:  16px// Tier 3 — Button / Size (size collection)
button-font-size: {font-size-sm}  ← sm mode
                    {font-size-sm}  ← md mode
                    {font-size-md}  ← lg mode// Figma Text Style "Button / Label"
font-size$button-font-size  (bound to Size token)
font-weight$button-font-weight
font-familyInter              (static)// Label text node inside Button component
style = "Button / Label"  (no direct variable needed)
📏
Figma Constraint: Variables vs Styles In Figma, applying a Text Style and binding a font-size variable to the same text node are mutually exclusive — the style wins. The solution: bind the variable inside the style definition, not on the text node itself.

7.5 Token Naming Rules

Token names follow a flat, hyphenated, lowercase pattern: {component}-{element}-{property}

SegmentRuleExample
{component}Component name, lowercase, hyphenatedbutton, form-field, toggle
{element}Child element name (omit for root)thumb, track, label, icon
{property}CSS property or abstract property namesize, color, radius, padding-x
Token name examples
button-height              ← root property, no element
button-font-size           ← root-level typography
button-icon-size           ← child element (icon) + property
toggle-thumb-size          ← child element (thumb) + property
toggle-track-off           ← child (track) + state (off)
checkbox-border-off        ← root border in unchecked state
form-field-label-font-size ← child element (label) + property

✗ WRONG: button-height-md  ← mode in token name
✗ WRONG: btn-pad           ← abbreviation
✗ WRONG: primary-button-h  ← type in token name