Rendered from Button-web.json (36 variants: 3 styles × 3 sizes × 4 states). Source: Button.tsx, ButtonLarge.ts, ButtonSmall.ts, theme.ts
Light Mode
3 styles × 3 sizes × 4 states — hover = darken(0.05), disabled = transparentize/lighten
Primary — #0366d6 accent, drop shadow
EnabledLarge
Hovered
Focused
Disabled
Medium
Small
Neutral — white + inset border, focus swaps border color
EnabledLarge
Hovered
Focused
Disabled
Medium
Small
Danger — #ed2651 red, focus outline #a00d2d
EnabledLarge
Hovered
Focused
Disabled
Medium
Small
Complete Token Reference
All values from Button.tsx, ButtonLarge.ts, ButtonSmall.ts, shared/styles/theme.ts. Colors computed via polished (darken, lighten, transparentize).
1. Size Geometry
| Size | Height | Padding H | Font Size | Line Height | Font Weight | Radius |
| Large | 40 | 16 | 14 | 40 (= height) | 500 | 6 |
| Medium | 32 | 8 | 14 | 32 | 500 | 6 |
| Small | 26 | 6 | 13 | 26 | 500 | 6 |
CSS uses line-height = height (single-line centering). For Figma: paddingV = (height - 20) / 2 for 14px font, (height - 18) / 2 for 13px font.
2. Color Tokens — Enabled State
| Style | | Fill | | Text | Border | Shadow |
| Primary | | #0366d6 | | #FFFFFF | — | rgba(0,0,0,0.2) 0 1px 2px |
| Neutral | | #FFFFFF | | #111319 | 1px inset #D9D9D9 | rgba(0,0,0,0.07) 0 1px 2px |
| Danger | | #ed2651 | | #FFFFFF | — | rgba(0,0,0,0.2) 0 1px 2px |
3. Interaction State Tokens
Hover darkens 5% via polished. Active mirrors hover. Focus: Primary gets box-shadow ring, Neutral swaps border color, Danger gets outline.
| Style | State | | Fill | | Text | Border/Outline | Expression |
| Primary | Hovered | | #035abd | | #FFFFFF | — | darken(0.05, #0366d6) |
| Focused | | #0366d6 | | #FFFFFF | 2px ring #0366d6 | box-shadow focus ring |
| Disabled | | rgba(3,102,214, 0.9) | | rgba(255,255,255, 0.7) | — | transparentize(0.1 / 0.3) |
| Neutral | Hovered | | #F2F2F2 | | #111319 | 1px #D9D9D9 | darken(0.05, #FFF) |
| Focused | | #FFFFFF | | #111319 | 1px #66778F | inputBorderFocused |
| Disabled | | transparent | | #66778F | 1px #D9D9D9 | bg: none, textTertiary |
| Danger | Hovered | | #e61341 | | #FFFFFF | — | darken(0.05, #ed2651) |
| Focused | | #ed2651 | | #FFFFFF | 2px outline #a00d2d | darken(0.20, #ed2651) |
| Disabled | | #ef3e64 | | #FFFFFF | — | lighten(0.05, #ed2651) |
4. Dark Mode Color Tokens
Only Neutral changes between light and dark. Primary and Danger use the same values in both modes.
| Token | | Light | | Dark | Figma Variable |
| accent | | #0366d6 | | #0366d6 | colors/accent |
| accentText | | #FFFFFF | | #FFFFFF | colors/accent-text |
| danger | | #ed2651 | | #ed2651 | colors/danger |
| buttonNeutralBg | | #FFFFFF | | #111319 | colors/button-neutral-bg |
| buttonNeutralText | | #111319 | | #FFFFFF | colors/button-neutral-text |
| buttonNeutralBorder | | #D9D9D9 | | #394351 | colors/button-neutral-border |
| inputBorderFocused | | #66778F | | #66778F | colors/input-border-focused |
| textTertiary | | #66778F | | #66778F | colors/text-tertiary |
5. Computed Color Expressions
All computed via polished v4.3.1 (verified). These are exact resolved values.
| Expression | Input | | Resolved | Used By |
| darken(0.05, accent) | #0366d6 | | #035abd | Primary hover |
| darken(0.05, neutralBg) | #FFFFFF | | #F2F2F2 | Neutral hover |
| darken(0.05, danger) | #ed2651 | | #e61341 | Danger hover |
| darken(0.15, white) | #FFFFFF | | #D9D9D9 | Neutral border |
| darken(0.20, danger) | #ed2651 | | #a00d2d | Danger focus outline |
| lighten(0.05, danger) | #ed2651 | | #ef3e64 | Danger disabled |
| transparentize(0.1, accent) | #0366d6 | | rgba(3,102,214, 0.9) | Primary disabled fill |
| transparentize(0.3, white) | #FFFFFF | | rgba(255,255,255, 0.7) | Primary disabled text |