20-Brand White Label · Casino & Sportsbook · v3 · 2026-04-20
Design Token Reference v3
The full catalogue — every token that needs to exist in Figma, organised by the 5 collections. v3 is the current architecture; it inherits the v2 foundation and absorbs the 9-brand edge-case audit. See the Architecture v3 deck for the rationale and implementation diagram, and the Brand Audit for per-brand evidence.
20 brands
light + dark
SE · DK · MT · ON · NL · PL + default
Figma Enterprise · native
4-pt · 1rem = 16px
marketing edits Collection 1
How to read v3
Token path is the Figma Variable name (slashes become groups). Type is the Figma Variable type (Color, Number, String, Boolean). Value / Alias shows the raw value or what it aliases to. Dimension Numbers are px in Figma; the export script converts to rem (rem = px / 16).
Status badges mark what changed from v2:
stable unchanged from v2 ·
evolved v2 token with renamed / expanded semantics ·
v3 introduced in v3 based on the brand audit.
What v3 adds over v2
- Collection 3 · Semantic — five new families:
icon.* (3-way split explicit), pill.*, badge.*, banner.* (overlay + on-surface), and radius.modal / radius.badge.
- Collection 5 · Component — expanded from v2's <10 last-resort tokens to ~35 proper alias packs:
menu-row.*, view-all.*, nav.* (with icon/text split), header.*, cta.* with 4 component variants (form / card / wallet / landing).
- No structural change — five collections, same axes. Brand remains a 20-mode axis on Collection 1. Theme = 2 modes on Collection 2. Jurisdiction = 7 modes on Collection 4. Semantic + Component are global.
Collection 1 · Primitives 20 brand modes
Raw values only — never referenced directly by components. Mix of brand-moded (20 modes: ramps, typography families, radius, layout, gradient) and global (single value: spacing, opacity, breakpoint, etc.). The 4-point scale applies to every dimension token.
1.1 · Color · Brand — brand-moded
Each brand defines its own ramp. 9 stops per scale. Values below are example hexes; each of the 20 brand modes holds its own colour set.
| Token path | Type | Example value | Notes |
| color/brand/primary-100 | Color | #EDEBFF | Lightest tint |
| color/brand/primary-200 | Color | #DAD6FF | |
| color/brand/primary-300 | Color | #B9B0FF | |
| color/brand/primary-400 | Color | #9487F2 | |
| color/brand/primary-500 | Color | #6C5CE7 | Focus rings |
| color/brand/primary-600 | Color | #5A4BCF | Default action bg |
| color/brand/primary-700 | Color | #483BA6 | Hover |
| color/brand/primary-800 | Color | #362B7D | Pressed |
| color/brand/primary-900 | Color | #241C54 | Darkest |
| color/brand/secondary-100 … 900 | Color × 9 | brand-defined | Secondary accent ramp |
| color/brand/tertiary-100 … 900 | Color × 9 | brand-defined | Tertiary / support |
| color/brand/gradient-start | Color | brand-defined | For gradient compounds |
| color/brand/gradient-end | Color | brand-defined | |
29 tokens in this group × 20 brand modes = 580 values.
1.2 · Color · Neutral — brand-moded
Each brand's own grey / warm / cool scale. 11 stops. Theme collection flips which end is used for surface/text.
| Token path | Type | Example value | Notes |
| color/neutral-50 | Color | #F9F9FB | Lightest — light-theme surface |
| color/neutral-100 | Color | #F1F1F5 | |
| color/neutral-200 | Color | #E4E4EC | |
| color/neutral-300 | Color | #C9C9D3 | |
| color/neutral-400 | Color | #9A9AAC | |
| color/neutral-500 | Color | #72728A | |
| color/neutral-600 | Color | #555568 | |
| color/neutral-700 | Color | #3A3A4A | |
| color/neutral-800 | Color | #1F1F2C | |
| color/neutral-900 | Color | #14141C | Dark-theme raised |
| color/neutral-950 | Color | #0B0B12 | Dark-theme page |
1.3 · Color · Status — brand-moded
Brand-adjusted per theme. 3 stops each: 100 (tint), 500 (base), 900 (deep). 6+ stops optional for Semantic flexibility.
| Token path | Type | Example | Notes |
| color/status/success-100 | Color | #E0F5EB | Tint — backgrounds |
| color/status/success-300 | Color | #7FD3A6 | Borders |
| color/status/success-500 | Color | #00B894 | Base |
| color/status/success-600 | Color | #009E7F | Solid bg / icon |
| color/status/success-800 | Color | #005A48 | Text on tint |
| color/status/success-900 | Color | #003D30 | Deep |
| color/status/warning-{100,300,500,600,800,900} | Color × 6 | ambers | Same pattern |
| color/status/error-{100,300,500,600,800,900} | Color × 6 | reds | Same pattern |
| color/status/info-{100,300,500,600,800,900} | Color × 6 | blues | Same pattern |
1.4 · Color · Always — same across all brand modes
| Token path | Type | Value | Notes |
| color/always/white | Color | #FFFFFF | Never overridden across brands |
| color/always/black | Color | #000000 | Never overridden |
| color/always/transparent | Color | rgba(0,0,0,0) | Explicit transparent |
1.5 · Color · Special — brand-moded (can default across all)
iGaming-specific primitives that don't fit in a brand ramp but must remain overridable per brand.
| Token path | Type | Default | Notes |
| color/special/pitch-green | Color | #1A4731 | Football pitch diagram |
| color/special/pitch-lines | Color | #FFFFFF @ 40% | Pitch markings |
| color/special/jackpot-gold | Color | #FFD700 | Jackpot ticker; some brands override to brand/primary |
| color/special/live-pulse | Color | #EF4444 | Live indicator — near-global but overridable |
1.6 · Color · VIP new — brand-moded
Loyalty tier colours. Each brand defines its own palette; standard is warmer-to-cooler up the ladder.
| Token path | Type | Example | Notes |
| color/vip/bronze | Color | #CD7F32 | Tier 1 |
| color/vip/silver | Color | #C0C0C0 | Tier 2 |
| color/vip/gold | Color | #FFD700 | Tier 3 |
| color/vip/platinum | Color | #E5E4E2 | Tier 4 |
| color/vip/diamond | Color | #B9F2FF | Tier 5 — highest |
1.7 · Typography
Family — brand-moded
| Token | Type | Example | Notes |
| typography/family/base | String | Inter | Body / UI |
| typography/family/heading | String | Sora | Headings |
| typography/family/display | String | brand-defined | Hero / jackpot numbers |
| typography/family/mono | String | JetBrains Mono | Odds, stakes, data |
Size — global · 4-point (with one sanctioned half-step)
| Token | Type | px / rem | Notes |
| typography/size/xs | Number | 12 · 0.75rem | Captions, footnotes |
| typography/size/sm | Number | 14 · 0.875rem | Half-step — only sanctioned exception to 4-pt rule |
| typography/size/md | Number | 16 · 1rem | Body base |
| typography/size/lg | Number | 20 · 1.25rem | |
| typography/size/xl | Number | 24 · 1.5rem | |
| typography/size/2xl | Number | 32 · 2rem | |
| typography/size/3xl | Number | 40 · 2.5rem | |
| typography/size/4xl | Number | 48 · 3rem | Hero / promo |
Weight — global
| Token | Type | Value | Notes |
| typography/weight/regular | Number | 400 | |
| typography/weight/medium | Number | 500 | |
| typography/weight/semibold | Number | 600 | |
| typography/weight/bold | Number | 700 | |
Line-height · Letter-spacing · Transform — global
| Token | Type | Value | Notes |
| typography/line-height/tight | Number | 1.2 | Unitless |
| typography/line-height/normal | Number | 1.5 | |
| typography/line-height/relaxed | Number | 1.75 | |
| typography/letter-spacing/none | Number | 0 | em at consumption |
| typography/letter-spacing/wide | Number | 0.04 | em |
| typography/letter-spacing/wider | Number | 0.08 | Uppercase labels |
| typography/letter-spacing/widest | Number | 0.14 | All-caps display |
| typography/transform/none | String | none | |
| typography/transform/uppercase | String | uppercase | All-caps brands |
| typography/transform/capitalize | String | capitalize | |
1.8 · Spacing — global · strict 4-point
All values are multiples of 4. v1's earlier fractional suggestion (2/6/10/14px) is dropped. Engineers receive rem via the export script.
| Token | Type | px / rem | Notes |
| spacing/1 | Number | 4 · 0.25rem | Finest gap |
| spacing/2 | Number | 8 · 0.5rem | |
| spacing/3 | Number | 12 · 0.75rem | |
| spacing/4 | Number | 16 · 1rem | Base / body |
| spacing/5 | Number | 20 · 1.25rem | |
| spacing/6 | Number | 24 · 1.5rem | |
| spacing/7 | Number | 28 · 1.75rem | |
| spacing/8 | Number | 32 · 2rem | |
| spacing/10 | Number | 40 · 2.5rem | |
| spacing/12 | Number | 48 · 3rem | |
| spacing/16 | Number | 64 · 4rem | |
| spacing/20 | Number | 80 · 5rem | Section gaps |
1.9 · Radius — brand-moded · 4-point
Brand shape identity. Each brand can pick sharper or rounder values per token. All multiples of 4; v1's radius/xs: 2px is dropped.
| Token | Type | px / rem | Notes |
| radius/none | Number | 0 · 0 | Sharp |
| radius/sm | Number | 4 · 0.25rem | Subtle curve |
| radius/md | Number | 8 · 0.5rem | Default cards |
| radius/lg | Number | 12 · 0.75rem | Modals |
| radius/xl | Number | 16 · 1rem | Heroes |
| radius/2xl | Number | 24 · 1.5rem | Featured cards |
| radius/full | Number | 9999 · px exception | Ship as px, not rem — pill needs absolute cap |
1.10 · Opacity new — global
Eliminates hardcoded "X at 96%" in Semantic. Stored as 0–1 decimal.
| Token | Type | Value | Notes |
| opacity/0 | Number | 0 | Fully transparent |
| opacity/10 | Number | 0.1 | Faint tint |
| opacity/20 | Number | 0.2 | |
| opacity/40 | Number | 0.4 | Disabled states |
| opacity/60 | Number | 0.6 | |
| opacity/80 | Number | 0.8 | |
| opacity/95 | Number | 0.95 | Near-opaque overlay |
1.11 · Breakpoint new — global
Responsive contract shared with engineering. Breakpoints target device classes, not pixel-perfect fidelity.
| Token | Type | px / rem | Notes |
| breakpoint/xs | Number | 320 · 20rem | Small mobile |
| breakpoint/sm | Number | 576 · 36rem | Large mobile |
| breakpoint/md | Number | 768 · 48rem | Tablet |
| breakpoint/lg | Number | 1024 · 64rem | Desktop |
| breakpoint/xl | Number | 1280 · 80rem | Wide desktop |
| breakpoint/2xl | Number | 1536 · 96rem | Ultra wide |
1.12 · Icon size new — global · 4-point
| Token | Type | px / rem | Notes |
| icon/size/xs | Number | 16 · 1rem | Inline with body |
| icon/size/sm | Number | 20 · 1.25rem | Buttons, inputs |
| icon/size/md | Number | 24 · 1.5rem | Default UI |
| icon/size/lg | Number | 32 · 2rem | Nav, prominent |
| icon/size/xl | Number | 40 · 2.5rem | Hero / feature |
1.13 · Z-index promoted — global
Stacking order is a primitive concern, not a component one. Keep gaps so new layers can slot in.
| Token | Type | Value | Notes |
| z-index/base | Number | 0 | Default flow |
| z-index/dropdown | Number | 800 | |
| z-index/header | Number | 900 | Sticky header |
| z-index/betslip | Number | 1000 | Above page, below toasts |
| z-index/toast | Number | 1100 | |
| z-index/modal | Number | 1200 | Above toasts? Debatable |
| z-index/tooltip | Number | 1300 | Always top |
1.14 · Motion — global
| Token | Type | Value | Notes |
| motion/duration/instant | Number | 0ms | No animation |
| motion/duration/fast | Number | 100ms | Micro-interactions |
| motion/duration/base | Number | 200ms | Default |
| motion/duration/slow | Number | 350ms | Page transitions |
| motion/duration/slower | Number | 500ms | Odds price flash |
| motion/easing/ease-in | String | cubic-bezier(0.4,0,1,1) | |
| motion/easing/ease-out | String | cubic-bezier(0,0,0.2,1) | |
| motion/easing/ease-in-out | String | cubic-bezier(0.4,0,0.2,1) | Default |
| motion/easing/spring | String | cubic-bezier(0.34,1.56,0.64,1) | Betslip add |
1.15 · Shadow — global (glow is brand-adjusted)
| Token | Type | Value | Notes |
| shadow/none | String | none | |
| shadow/xs | String | 0 1px 2px rgba(0,0,0,.06) | Subtle lift |
| shadow/sm | String | 0 2px 8px rgba(0,0,0,.10) | Cards |
| shadow/md | String | 0 4px 16px rgba(0,0,0,.14) | Dropdowns |
| shadow/lg | String | 0 8px 32px rgba(0,0,0,.18) | Modals |
| shadow/overlay | String | 0 16px 64px rgba(0,0,0,.32) | Full screen |
| shadow/glow | String | 0 0 20px {brand.primary} @ 40% | Casino tiles |
1.16 · Transition new — global · compound
Pre-paired duration + easing. Prevents designer-engineer mismatch from picking duration separately from easing.
| Token | Type | Value | Notes |
| transition/micro | String | 100ms cubic-bezier(0,0,0.2,1) | fast + ease-out |
| transition/interactive | String | 200ms cubic-bezier(0.4,0,0.2,1) | base + ease-in-out · default |
| transition/page | String | 350ms cubic-bezier(0,0,0.2,1) | slow + ease-out |
| transition/spring | String | 200ms cubic-bezier(0.34,1.56,0.64,1) | Betslip add, toast entrance |
1.17 · Layout new — brand-moded · all 4-pt
Brand-varying dimensions that v1 hid as "240 or 280" strings in Semantic. Promoting to primitives makes Figma track them properly.
| Token | Type | Example (px · rem) | Notes |
| layout/header-height | Number | 64 · 4rem (or 72 · 4.5rem) | Both multiples of 4 |
| layout/sidebar-width | Number | 240 · 15rem (or 280 · 17.5rem) | |
| layout/input-height | Number | 40 · 2.5rem (or 48 · 3rem) | |
| layout/tile-min-width | Number | 160 · 10rem | Casino tile |
| layout/launcher-top-bar-height | Number | 48 · 3rem | Game wrapper |
| layout/launcher-bottom-bar-height | Number | 56 · 3.5rem | |
| layout/footer-height | Number | brand-defined | |
| layout/page-max-width | Number | 1440 · 90rem | Content container cap |
1.18 · Gradient new — brand-moded · compound
iGaming promos are gradient-heavy. Store full gradients as strings; reference brand-ramp stops rather than literal hex.
| Token | Type | Example | Notes |
| gradient/promo-hero | String | linear-gradient(135deg, brand/primary-700, brand/primary-900) | Promo banners |
| gradient/jackpot | String | linear-gradient(90deg, special/jackpot-gold, #FFA500) | Ticker background |
| gradient/hero-fade | String | linear-gradient(180deg, transparent, neutral-950) | Image overlay |
| gradient/vip-diamond | String | linear-gradient(135deg, vip/diamond, vip/platinum) | Tier badges |
Collection 2 · Theme 2 modes · light · dark
Only the tokens that flip direction based on theme. References Primitives (brand-moded) for the actual neutral stops. Every "neutral-X or neutral-Y" from v1 lives here. ~25 tokens · ~50 values.
2.1 · Theme · Surface
| Token | Type | Light mode | Dark mode | Notes |
| theme/surface/page | Color | neutral-50 | neutral-950 | Root page bg |
| theme/surface/raised | Color | neutral-100 | neutral-900 | Cards, panels |
| theme/surface/elevated | Color | neutral-50 | neutral-850 | Popovers, floating |
| theme/surface/sunken | Color | neutral-200 | neutral-950 | Input fields, inset |
| theme/surface/inverse | Color | neutral-900 | neutral-50 | Inverted sections |
| theme/surface/skeleton | Color | neutral-200 | neutral-800 | Loading base |
| theme/surface/skeleton-shimmer | Color | neutral-100 | neutral-700 | Shimmer highlight |
| theme/surface/tooltip | Color | neutral-900 | white | Inverts vs theme |
| theme/surface/code | Color | neutral-100 | neutral-950 | Code / odds blocks |
2.2 · Theme · Text
| Token | Type | Light | Dark | Notes |
| theme/text/primary | Color | neutral-900 | white | Body |
| theme/text/secondary | Color | neutral-600 | neutral-300 | Supporting |
| theme/text/muted | Color | neutral-400 | neutral-500 | Hints |
| theme/text/disabled | Color | neutral-300 | neutral-700 | |
| theme/text/inverse | Color | white | neutral-900 | On dark bg (light mode) / on light bg (dark mode) |
| theme/text/caption | Color | neutral-500 | neutral-400 | |
| theme/text/heading-color | Color | neutral-900 | white | |
| theme/text/placeholder | Color | neutral-400 | neutral-500 | Inputs |
2.3 · Theme · Border & Divide
| Token | Type | Light | Dark | Notes |
| theme/border/default | Color | neutral-200 | neutral-700 | Cards, dividers |
| theme/border/subtle | Color | neutral-100 | neutral-800 | Faint separators |
| theme/border/strong | Color | neutral-400 | neutral-500 | Emphasis |
| theme/border/inverse | Color | neutral-700 | neutral-200 | On inverse surfaces |
| theme/border/divide | Color | neutral-100 | neutral-800 | HR / list dividers |
2.4 · Theme · Overlay
| Token | Type | Light | Dark | Notes |
| theme/overlay/backdrop-opacity | Number | 0.5 | 0.7 | Modal backdrop |
Collection 3 · Semantic global · no modes
The intent layer. Every component reads from here. References Theme and Primitives — never raw values. ~340 tokens.
3.1 · Surface
| Token | Type | Alias | Notes |
| surface/page | Color | theme/surface/page | Root page bg |
| surface/raised | Color | theme/surface/raised | Cards, panels |
| surface/elevated | Color | theme/surface/elevated | Popovers |
| surface/sunken | Color | theme/surface/sunken | Inputs |
| surface/overlay | Color | theme/surface/raised × opacity/95 | Modals |
| surface/overlay-tint | Color | color/brand/primary-900 × opacity/80 | Brand-tinted overlay |
| surface/inverse | Color | theme/surface/inverse | |
| surface/header | Color | color/always/transparent or color/brand/primary-600 | Brand-choice: 2 brands use transparent |
| surface/header-scrolled | Color | theme/surface/raised | After scroll |
| surface/footer | Color | theme/surface/inverse | |
| surface/sidebar | Color | theme/surface/raised | |
| surface/banner | Color | color/brand/primary-600 | Promo bars |
| surface/skeleton | Color | theme/surface/skeleton | |
| surface/skeleton-shimmer | Color | theme/surface/skeleton-shimmer | |
| surface/scrim | Color | color/always/black × opacity/60 | Behind modals |
| surface/tooltip | Color | theme/surface/tooltip | |
| surface/code | Color | theme/surface/code | |
3.2 · Text & Typography
Text color
| Token | Type | Alias | Notes |
| text/primary | Color | theme/text/primary | Body |
| text/secondary | Color | theme/text/secondary | Labels |
| text/muted | Color | theme/text/muted | Hints |
| text/disabled | Color | theme/text/disabled | |
| text/inverse | Color | theme/text/inverse | |
| text/on-brand | Color | color/always/white or color/brand/primary-50 | On brand-primary bg |
| text/on-status-success | Color | color/always/white | |
| text/on-status-warning | Color | color/always/white | |
| text/on-status-error | Color | color/always/white | |
| text/on-status-info | Color | color/always/white | |
| text/link/default | Color | color/brand/primary-600 | |
| text/link/hover | Color | color/brand/primary-700 | |
| text/link/visited | Color | text/link/default | Default = unchanged; opt-in per brand |
| text/link/active | Color | color/brand/primary-800 | |
| text/heading | Color | theme/text/heading-color | |
| text/display | Color | color/brand/primary-600 or text/primary | Hero / jackpot |
| text/placeholder | Color | theme/text/placeholder | |
| text/caption | Color | theme/text/caption | |
Text · Typography rules — brand-level transforms
| Token | Type | Default → Brand variant | Notes |
| text/body/weight | Number | typography/weight/regular → bold | Some brands are all-bold |
| text/body/transform | String | typography/transform/none → uppercase | Some brands all-caps |
| text/body/letter-spacing | Number | letter-spacing/none → wider | Paired with uppercase |
| text/body/size | Number | size/md → size/sm | Some brands smaller when bold |
| text/heading/weight | Number | typography/weight/semibold → bold | |
| text/heading/transform | String | typography/transform/none → uppercase | |
| text/heading/letter-spacing | Number | letter-spacing/none → wide | |
| text/body/label-weight | Number | typography/weight/medium → bold | Labels reuse body stack |
| text/body/label-transform | String | text/body/transform | No separate label rule |
Data typography — odds, scores, balances
| Token | Type | Alias | Notes |
| typography/data/family | String | typography/family/mono | Odds, scores, timers, balances |
| typography/data/weight | Number | typography/weight/medium or bold | |
| typography/data/size | Number | typography/size/md | |
| typography/data/tabular | String | tnum | Always tabular — prevents shift on odds ticks |
3.3 · Border
| Token | Type | Alias | Notes |
| border/default | Color | theme/border/default | Cards, inputs |
| border/subtle | Color | theme/border/subtle | |
| border/strong | Color | theme/border/strong | |
| border/focus | Color | color/brand/primary-500 | Keyboard focus ring |
| border/focus-offset | Color | color/always/white or surface/page | Offset ring |
| border/inverse | Color | theme/border/inverse | |
| border/brand | Color | color/brand/primary-500 | Accent borders |
| border/error | Color | color/status/error-500 | |
| border/success | Color | color/status/success-500 | |
| border/width/default | Number | 1 (px) | px exception — hairline |
| border/width/thick | Number | 2 (px) | Focus rings, active |
| divide/color | Color | theme/border/divide | HR / list |
3.4 · Interactive
Primary actions
| Token | Type | Alias | Notes |
| interactive/primary/bg-default | Color | color/brand/primary-600 | |
| interactive/primary/bg-hover | Color | color/brand/primary-700 | |
| interactive/primary/bg-pressed | Color | color/brand/primary-800 | |
| interactive/primary/bg-disabled | Color | color/neutral-200 | |
| interactive/primary/text-default | Color | color/always/white | Some brands differ |
| interactive/primary/text-hover | Color | color/always/white | |
| interactive/primary/text-disabled | Color | color/neutral-400 | |
| interactive/primary/border-default | Color | color/always/transparent | |
| interactive/primary/border-hover | Color | color/brand/primary-800 | |
| interactive/primary/icon-color | Color | color/always/white | Chevron / icon |
| interactive/primary/cursor | String | pointer | Brand variation possible |
Secondary actions
| Token | Type | Alias | Notes |
| interactive/secondary/bg-default | Color | color/always/transparent | |
| interactive/secondary/bg-hover | Color | color/brand/primary-50 | |
| interactive/secondary/bg-pressed | Color | color/brand/primary-100 | |
| interactive/secondary/bg-disabled | Color | color/always/transparent | |
| interactive/secondary/text-default | Color | color/brand/primary-600 | |
| interactive/secondary/text-hover | Color | color/brand/primary-700 | |
| interactive/secondary/text-disabled | Color | color/neutral-300 | |
| interactive/secondary/border-default | Color | color/brand/primary-600 | |
| interactive/secondary/border-hover | Color | color/brand/primary-700 | |
| interactive/secondary/icon-color | Color | color/brand/primary-600 | |
| interactive/secondary/cursor | String | pointer | |
Tertiary / Ghost actions
| Token | Type | Alias | Notes |
| interactive/tertiary/text-default | Color | color/brand/primary-600 | |
| interactive/tertiary/text-hover | Color | color/brand/primary-700 | |
| interactive/tertiary/bg-hover | Color | color/brand/primary-50 | |
| interactive/tertiary/icon-color | Color | color/brand/primary-600 | |
Destructive actions
| Token | Type | Alias | Notes |
| interactive/destructive/bg-default | Color | color/status/error-600 | Delete, close account |
| interactive/destructive/bg-hover | Color | color/status/error-700 | |
| interactive/destructive/text-default | Color | color/always/white | |
| interactive/destructive/border | Color | color/status/error-600 | |
View-all / inline links
| Token | Type | Alias | Notes |
| interactive/viewall/text | Color | color/brand/primary-600 | |
| interactive/viewall/text-hover | Color | color/brand/primary-700 | |
| interactive/viewall/chevron-color | Color | color/brand/primary-600 | |
| interactive/viewall/chevron-active | Color | color/brand/secondary-600 | Some brands differ |
| interactive/viewall/cursor | String | pointer | |
| interactive/viewall/underline | String | none or underline | Brand variation |
3.5 · Status & Feedback
Same shape × 4 statuses (success, warning, error, info). Tables show the success set; other three follow the same pattern with status/* swapped.
Per-status (success example)
| Token | Type | Alias | Notes |
| status/success/bg | Color | color/status/success-100 | Tint |
| status/success/bg-strong | Color | color/status/success-600 | Solid badge |
| status/success/text | Color | color/status/success-800 | On tint |
| status/success/text-on-bg | Color | color/always/white | On strong |
| status/success/border | Color | color/status/success-300 | |
| status/success/icon | Color | color/status/success-600 | |
Repeat the same 6 tokens for: status/warning/*, status/error/*, status/info/* — total 24 status tokens. |
Toast / Alert
| Token | Type | Alias | Notes |
| feedback/toast/success-bg | Color | status/success/bg-strong | |
| feedback/toast/warning-bg | Color | status/warning/bg-strong | v2 fix — was missing |
| feedback/toast/error-bg | Color | status/error/bg-strong | |
| feedback/toast/info-bg | Color | status/info/bg-strong | v2 fix — was missing |
| feedback/toast/text | Color | color/always/white | |
| feedback/toast/shadow | String | shadow/lg | |
| feedback/toast/border-radius | Number | radius/md | |
3.6 · Navigation
Header
| Token | Type | Alias | Notes |
| nav/header/bg | Color | surface/header | Transparent on 2 brands |
| nav/header/bg-scrolled | Color | surface/header-scrolled | |
| nav/header/text | Color | text/primary or color/always/white | |
| nav/header/icon | Color | text/primary or color/always/white | |
| nav/header/border-bottom | Color | border/default or transparent | |
| nav/header/logo-bg | Color | transparent or color/brand/primary | |
| nav/header/height | Number | layout/header-height | → Primitives |
Sidebar
| Token | Type | Alias | Notes |
| nav/sidebar/bg | Color | surface/sidebar | |
| nav/sidebar/item-text | Color | text/secondary | |
| nav/sidebar/item-text-active | Color | color/brand/primary or color/always/white | |
| nav/sidebar/item-bg-default | Color | color/always/transparent | |
| nav/sidebar/item-bg-hover | Color | color/brand/primary-50 or color/neutral-800 | |
| nav/sidebar/item-bg-active | Color | color/brand/primary-100 or color/brand/primary-700 | |
| nav/sidebar/item-border-active | Color | color/brand/primary-500 | Left accent bar |
| nav/sidebar/icon-default | Color | text/muted | |
| nav/sidebar/icon-active | Color | color/brand/primary or color/always/white | |
| nav/sidebar/width | Number | layout/sidebar-width | → Primitives |
Tabs · Bottom nav · Breadcrumb
| Token | Type | Alias | Notes |
| nav/tab/text-default | Color | text/muted | |
| nav/tab/text-active | Color | color/brand/primary-600 | |
| nav/tab/bg-default | Color | color/always/transparent | |
| nav/tab/bg-active | Color | color/brand/primary-50 | |
| nav/tab/indicator-color | Color | color/brand/primary-600 | |
| nav/tab/indicator-height | Number | 2 or 3 (px) | Brand variation |
| nav/tab/border-bottom | Color | border/default | |
| nav/bottom/bg | Color | surface/raised | Mobile |
| nav/bottom/item-active | Color | color/brand/primary-600 | |
| nav/bottom/item-default | Color | text/muted | |
| nav/breadcrumb/text | Color | text/muted | |
| nav/breadcrumb/separator | Color | text/muted | / > or chevron |
| nav/breadcrumb/current | Color | text/primary | |
3.8 · Overlay
| Token | Type | Alias | Notes |
| overlay/modal/bg | Color | surface/overlay | |
| overlay/modal/border | Color | border/default | |
| overlay/modal/border-radius | Number | radius/lg | |
| overlay/modal/shadow | String | shadow/overlay | |
| overlay/modal/backdrop | Color | surface/scrim | |
| overlay/modal/backdrop-opacity | Number | theme/overlay/backdrop-opacity | |
| overlay/drawer/bg | Color | surface/overlay | |
| overlay/drawer/overlay-bg | Color | surface/scrim | |
| overlay/drawer/header-bg | Color | surface/raised | |
| overlay/tooltip/bg | Color | surface/tooltip | |
| overlay/tooltip/text | Color | text/inverse or text/primary | |
| overlay/tooltip/border-radius | Number | radius/sm | |
| overlay/tooltip/shadow | String | shadow/md | |
| overlay/popover/bg | Color | surface/elevated | |
| overlay/popover/border | Color | border/default | |
| overlay/popover/shadow | String | shadow/lg | |
| overlay/popover/border-radius | Number | radius/md | |
| overlay/sheet/bg | Color | surface/overlay | Mobile bottom sheet |
| overlay/sheet/handle | Color | color/neutral-300 | Drag handle |
3.9 · iGaming · Odds & Betting
The most volatile UI surface in sportsbook. States must be airtight.
| Token | Type | Alias | Notes |
| gaming/odds/default/bg | Color | surface/raised | Unselected |
| gaming/odds/default/text | Color | text/primary | |
| gaming/odds/default/border | Color | border/default | |
| gaming/odds/hover/bg | Color | color/brand/primary-50 | |
| gaming/odds/hover/text | Color | color/brand/primary-700 | |
| gaming/odds/hover/border | Color | color/brand/primary-300 | |
| gaming/odds/selected/bg | Color | color/brand/primary-600 | Added to betslip |
| gaming/odds/selected/text | Color | color/always/white | |
| gaming/odds/selected/border | Color | color/brand/primary-700 | |
| gaming/odds/suspended/bg | Color | color/neutral-100 or color/neutral-800 | Market suspended |
| gaming/odds/suspended/text | Color | text/disabled | |
| gaming/odds/suspended/border | Color | border/subtle | |
| gaming/odds/suspended/icon | Color | text/muted | Lock icon |
| gaming/odds/boosted/bg | Color | color/status/warning-100 | Price boost |
| gaming/odds/boosted/text | Color | color/status/warning-800 | |
| gaming/odds/boosted/border | Color | color/status/warning-400 | |
| gaming/odds/boosted/badge-bg | Color | color/status/warning-500 | |
| gaming/odds/price-up/flash | Color | color/status/success-200 | |
| gaming/odds/price-down/flash | Color | color/status/error-200 | |
| gaming/odds/price-up/arrow | Color | color/status/success-600 | |
| gaming/odds/price-down/arrow | Color | color/status/error-600 | |
| gaming/odds/border-radius | Number | radius/sm or radius/md | |
| gaming/odds/font-family | String | typography/family/mono | |
| gaming/odds/font-weight | Number | typography/weight/bold | |
3.10 · iGaming · Live & Streaming
| Token | Type | Alias | Notes |
| gaming/live/indicator-color | Color | color/status/error-500 | Pulse dot |
| gaming/live/indicator-bg | Color | color/status/error-100 | Pulse ring |
| gaming/live/label-bg | Color | color/status/error-600 | LIVE badge |
| gaming/live/label-text | Color | color/always/white | |
| gaming/live/label-border-radius | Number | radius/sm | |
| gaming/live/score/home-bg | Color | color/brand/primary-50 | |
| gaming/live/score/away-bg | Color | surface/raised | |
| gaming/live/score/text | Color | text/primary | |
| gaming/live/score/divider | Color | border/default | |
| gaming/live/timer/text | Color | text/secondary | Match clock |
| gaming/live/pitch/bg | Color | color/special/pitch-green | Pitch diagram |
| gaming/live/streaming/bg | Color | color/always/black | Video player bg |
| gaming/live/streaming/controls | Color | color/always/white | |
| gaming/live/streaming/icon-color | Color | color/brand/primary-500 | |
| gaming/live/in-play-label/bg | Color | color/status/success-600 | |
| gaming/live/in-play-label/text | Color | color/always/white | |
3.11 · iGaming · Betslip
The revenue-critical surface. stake-input uses form/input/* directly; CTA uses interactive/primary/*.
| Token | Type | Alias | Notes |
| gaming/betslip/container-bg | Color | surface/overlay | |
| gaming/betslip/container-border | Color | border/default | |
| gaming/betslip/header-bg | Color | color/brand/primary-700 | iGaming-specific |
| gaming/betslip/header-text | Color | color/always/white | |
| gaming/betslip/header-count-bg | Color | color/always/white | Selection count |
| gaming/betslip/header-count-text | Color | color/brand/primary-700 | |
| gaming/betslip/selection-bg | Color | surface/raised | Each bet row |
| gaming/betslip/selection-border | Color | border/default | |
| gaming/betslip/selection-text | Color | text/primary | |
| gaming/betslip/selection-odds | Color | color/brand/primary-600 | |
| gaming/betslip/remove-icon | Color | text/muted | Kept separate from destructive |
| gaming/betslip/remove-hover | Color | color/status/error-500 | |
| gaming/betslip/est-returns-label | Color | text/muted | |
| gaming/betslip/est-returns-value | Color | text/primary | |
| gaming/betslip/keyboard-bg | Color | surface/sunken | Mobile numeric |
| gaming/betslip/keyboard-key-bg | Color | surface/raised | |
| gaming/betslip/keyboard-key-text | Color | text/primary | |
| gaming/betslip/empty-text | Color | text/muted | |
| gaming/betslip/empty-icon | Color | text/muted | |
| gaming/betslip/price-change-bg | Color | color/status/warning-50 | Odds changed banner |
| gaming/betslip/price-change-text | Color | color/status/warning-800 | |
| gaming/betslip/each-way-text | Color | text/secondary | E/W toggle |
3.12 · iGaming · Results & History
| Token | Type | Alias | Notes |
| gaming/result/win/text | Color | color/status/success-800 | |
| gaming/result/win/border | Color | color/status/success-300 | |
| gaming/result/win/icon | Color | color/status/success-600 | Tick / trophy |
| gaming/result/loss/text | Color | color/status/error-800 | |
| gaming/result/loss/border | Color | color/status/error-300 | |
| gaming/result/loss/icon | Color | color/status/error-600 | X |
| gaming/result/void/text | Color | text/muted | |
| gaming/result/void/border | Color | border/default | |
| gaming/result/pending/text | Color | color/status/info-800 | |
| gaming/result/pending/icon | Color | color/status/info-600 | Clock |
| gaming/result/cashout-full/text | Color | color/status/warning-800 | v2 split |
| gaming/result/cashout-full/cta-bg | Color | color/status/warning-500 | v2 split |
| gaming/result/cashout-full/cta-text | Color | color/always/white | v2 |
| gaming/result/cashout-partial/text | Color | color/status/warning-800 | v2 split |
| gaming/result/cashout-partial/cta-bg | Color | color/status/warning-400 | Distinct from full |
| gaming/result/cashout-partial/cta-text | Color | color/always/white | v2 |
| gaming/result/stake-text | Color | text/muted | |
| gaming/result/returns-text | Color | text/primary | |
3.13 · iGaming · Casino Surfaces
| Token | Type | Alias | Notes |
| gaming/casino/tile/bg | Color | surface/raised | |
| gaming/casino/tile/overlay-bg | Color | color/always/black × opacity/60 | Hover overlay |
| gaming/casino/tile/overlay-text | Color | color/always/white | |
| gaming/casino/tile/border-radius | Number | radius/md or radius/lg | |
| gaming/casino/tile/border | Color | border/default | |
| gaming/casino/tile/shadow | String | shadow/sm | |
| gaming/casino/tile/badge-new-bg | Color | color/status/info-600 | |
| gaming/casino/tile/badge-new-text | Color | color/always/white | |
| gaming/casino/tile/badge-hot-bg | Color | color/status/error-600 | |
| gaming/casino/tile/badge-hot-text | Color | color/always/white | |
| gaming/casino/jackpot/bg | Color | color/always/transparent | Ticker |
| gaming/casino/jackpot/font-family | String | typography/family/display | |
| gaming/casino/jackpot/font-weight | Number | typography/weight/bold | |
| gaming/casino/rtp/text | Color | text/muted | RTP % label |
| gaming/casino/rtp/value | Color | color/status/success-600 | High RTP |
| gaming/casino/provider/label-bg | Color | color/neutral-100 or color/neutral-800 | |
| gaming/casino/provider/label-text | Color | text/muted | |
| gaming/casino/exclusive/bg | Color | color/brand/tertiary-600 | |
| gaming/casino/exclusive/text | Color | color/always/white | |
| gaming/casino/favourite/icon | Color | color/status/warning-500 | Heart / star |
| gaming/casino/lobby/category-text | Color | text/primary | |
| gaming/casino/lobby/see-all-text | Color | interactive/viewall/text | → interactive tokens |
| gaming/casino/demo/badge-bg | Color | color/neutral-700 | |
| gaming/casino/demo/badge-text | Color | color/always/white | |
3.15 · iGaming · Responsible Gambling
Regulator-gated. Every token here aliases through reg/* from Collection 4 — never directly to Primitives. Guarantees jurisdiction overrides take effect.
| Token | Type | Alias | Notes |
| gaming/rg/warning/bg | Color | reg/rg/warning/bg | → Regulatory |
| gaming/rg/warning/text | Color | reg/rg/warning/text | |
| gaming/rg/warning/border | Color | reg/rg/warning/border | |
| gaming/rg/warning/icon | Color | reg/rg/warning/icon | |
| gaming/rg/limit/bar-track | Color | reg/rg/limit/bar-track | |
| gaming/rg/limit/bar-fill | Color | reg/rg/limit/bar-fill | |
| gaming/rg/limit/bar-fill-near | Color | reg/rg/limit/bar-fill-near | |
| gaming/rg/limit/bar-fill-at | Color | reg/rg/limit/bar-fill-at | |
| gaming/rg/limit/text | Color | text/secondary | |
| gaming/rg/reality-check/bg | Color | surface/overlay | |
| gaming/rg/reality-check/text | Color | text/primary | |
| gaming/rg/reality-check/cta | Color | interactive/primary/bg-default | |
| gaming/rg/self-excl/bg | Color | reg/rg/self-excl/bg | |
| gaming/rg/self-excl/text | Color | reg/rg/self-excl/text | |
| gaming/rg/self-excl/cta-bg | Color | reg/rg/self-excl/cta-bg | |
| gaming/rg/self-excl/program-name | String | reg/rg/self-excl/program-name | Spelpaus / ROFUS / Cruks / ConnexOntario |
| gaming/rg/session-timer/text | Color | text/muted | |
| gaming/rg/logo/color | Color | reg/logo/color | |
| gaming/rg/logo/hover | Color | reg/logo/hover | |
| gaming/rg/age-gate/min-age | Number | reg/age-gate/min-age | 18 / 19 (ON) / 24 (NL ads) |
3.16 · iGaming · Payments & KYC
| Token | Type | Alias | Notes |
| gaming/payment/method-card/bg | Color | surface/raised | |
| gaming/payment/method-card/border | Color | border/default | |
| gaming/payment/method-card/selected | Color | color/brand/primary-100 | |
| gaming/payment/method-card/border-selected | Color | border/focus | |
| gaming/payment/amount/preset-bg | Color | surface/sunken | |
| gaming/payment/amount/preset-bg-sel | Color | color/brand/primary-600 | |
| gaming/payment/amount/preset-text | Color | text/primary | |
| gaming/payment/amount/preset-text-sel | Color | color/always/white | |
| gaming/payment/progress/track | Color | color/neutral-200 | |
| gaming/payment/progress/fill | Color | color/brand/primary-600 | |
| gaming/payment/progress/step-done | Color | color/status/success-600 | |
| gaming/payment/progress/step-active | Color | color/brand/primary-600 | |
| gaming/payment/progress/step-pending | Color | color/neutral-300 | |
| gaming/payment/kyc/pending-bg | Color | color/status/warning-50 | |
| gaming/payment/kyc/pending-text | Color | color/status/warning-800 | |
| gaming/payment/kyc/verified-bg | Color | color/status/success-50 | |
| gaming/payment/kyc/verified-text | Color | color/status/success-800 | |
| gaming/payment/kyc/rejected-bg | Color | color/status/error-50 | |
| gaming/payment/kyc/rejected-text | Color | color/status/error-800 | |
| gaming/payment/kyc/upload-border | Color | border/default | |
| gaming/payment/kyc/upload-bg | Color | surface/sunken | |
| gaming/payment/kyc/upload-active-border | Color | border/focus | Drag-over |
| gaming/payment/balance/text | Color | text/primary | |
| gaming/payment/balance/positive | Color | color/status/success-600 | |
| gaming/payment/balance/currency | Color | text/muted | |
3.17 · Sportsbook · Bet Builder new
Same-game multi (SGM) / Bet Builder surface. Legs have correlation warnings absent from standard odds.
| Token | Type | Alias | Notes |
| sportsbook/bet-builder/leg-default/bg | Color | surface/raised | |
| sportsbook/bet-builder/leg-default/border | Color | border/default | |
| sportsbook/bet-builder/leg-default/text | Color | text/primary | |
| sportsbook/bet-builder/leg-selected/bg | Color | color/brand/primary-100 | |
| sportsbook/bet-builder/leg-selected/border | Color | color/brand/primary-500 | |
| sportsbook/bet-builder/leg-selected/text | Color | color/brand/primary-800 | |
| sportsbook/bet-builder/correlation-warning/bg | Color | color/status/warning-50 | Mutually-exclusive selections |
| sportsbook/bet-builder/correlation-warning/text | Color | color/status/warning-800 | |
| sportsbook/bet-builder/correlation-warning/icon | Color | color/status/warning-600 | |
| sportsbook/bet-builder/price-live | Color | color/brand/primary-600 | Live computed price |
3.18 · Sportsbook · Accumulator new
| Token | Type | Alias | Notes |
| sportsbook/accumulator/row-bg | Color | surface/raised | |
| sportsbook/accumulator/row-border | Color | border/subtle | |
| sportsbook/accumulator/boosted-bg | Color | color/status/warning-100 | Boosted acca |
| sportsbook/accumulator/boosted-text | Color | color/status/warning-800 | |
| sportsbook/accumulator/multiplier-badge-bg | Color | color/brand/tertiary-500 | |
| sportsbook/accumulator/multiplier-badge-text | Color | color/always/white | |
| sportsbook/accumulator/total-odds-text | Color | text/primary | |
3.19 · Sportsbook · Stats & Form new
W/D/L form guide colours. Distinct from status/success/error — sports form isn't a success state, and needs to work in strings of letters (W-W-D-L-W).
| Token | Type | Alias | Notes |
| sportsbook/stats/form/win | Color | color/status/success-500 | W indicator |
| sportsbook/stats/form/win-bg | Color | color/status/success-100 | |
| sportsbook/stats/form/draw | Color | color/neutral-500 | D — neutral, not status |
| sportsbook/stats/form/draw-bg | Color | color/neutral-200 | |
| sportsbook/stats/form/loss | Color | color/status/error-500 | L |
| sportsbook/stats/form/loss-bg | Color | color/status/error-100 | |
| sportsbook/stats/momentum/up | Color | color/status/success-600 | Trend indicator |
| sportsbook/stats/momentum/down | Color | color/status/error-600 | |
| sportsbook/stats/momentum/flat | Color | color/neutral-500 | |
| sportsbook/stats/h2h/heading | Color | text/heading | H2H section |
| sportsbook/stats/market-group/header-bg | Color | surface/sunken | Market Winner / O/U / BTTS |
| sportsbook/stats/market-group/header-text | Color | text/secondary | |
| sportsbook/stats/market-group/collapsed-indicator | Color | text/muted | Chevron |
3.20 · Casino · Live Dealer new
| Token | Type | Alias | Notes |
| casino/live-dealer/studio-chrome/bg | Color | color/always/black | Video frame |
| casino/live-dealer/studio-chrome/text | Color | color/always/white | |
| casino/live-dealer/dealer-name/text | Color | color/always/white | |
| casino/live-dealer/dealer-name/bg | Color | color/always/black × opacity/60 | Overlay on video |
| casino/live-dealer/seat-count/text | Color | text/secondary | "3 / 7 seats" |
| casino/live-dealer/seat-count/icon | Color | text/muted | |
| casino/live-dealer/seat/full | Color | color/status/error-500 | Table full |
| casino/live-dealer/seat/available | Color | color/status/success-500 | |
| casino/live-dealer/min-max-chips/bg | Color | surface/sunken | Bet range display |
| casino/live-dealer/min-max-chips/text | Color | text/primary | |
| casino/live-dealer/countdown/text | Color | color/always/white | Between-round timer |
| casino/live-dealer/countdown/bg | Color | color/status/error-600 | Urgent red |
| casino/live-dealer/chat/bg | Color | surface/overlay | Dealer chat |
| casino/live-dealer/chat/bubble-mine | Color | color/brand/primary-600 | |
| casino/live-dealer/chat/bubble-dealer | Color | color/neutral-700 | |
3.21 · Casino · Jackpot Tiers new
v1 had a single jackpot-gold primitive — insufficient. v2 splits into four tiers with distinct styling per tier.
| Token | Type | Alias | Notes |
| casino/jackpot/mini/bg | Color | color/neutral-700 | Subtle |
| casino/jackpot/mini/text | Color | color/always/white | |
| casino/jackpot/mini/ticker | Color | color/neutral-300 | |
| casino/jackpot/minor/bg | Color | color/brand/tertiary-600 | |
| casino/jackpot/minor/text | Color | color/always/white | |
| casino/jackpot/minor/ticker | Color | color/brand/tertiary-200 | |
| casino/jackpot/major/bg | Color | color/brand/secondary-600 | |
| casino/jackpot/major/text | Color | color/always/white | |
| casino/jackpot/major/ticker | Color | color/brand/secondary-200 | |
| casino/jackpot/grand/bg | Color | gradient/jackpot | Gradient — top tier |
| casino/jackpot/grand/text | Color | color/always/black | Against gold |
| casino/jackpot/grand/ticker | Color | color/special/jackpot-gold | |
3.22 · Casino · Tournament & Leaderboard new
| Token | Type | Alias | Notes |
| casino/tournament/leaderboard-bg | Color | surface/raised | |
| casino/tournament/row-bg | Color | surface/raised | |
| casino/tournament/row-bg-mine | Color | color/brand/primary-50 | Highlight current user |
| casino/tournament/rank-1 | Color | color/vip/gold | 🥇 |
| casino/tournament/rank-2 | Color | color/vip/silver | 🥈 |
| casino/tournament/rank-3 | Color | color/vip/bronze | 🥉 |
| casino/tournament/rank-top-10 | Color | color/brand/primary-600 | |
| casino/tournament/rank-default | Color | text/secondary | |
| casino/tournament/prize-text | Color | color/status/success-700 | |
| casino/tournament/countdown-text | Color | color/status/warning-700 | |
3.23 · VIP / Loyalty Tiers new
Same shape × 5 tiers. Shows bronze; repeat for silver/gold/platinum/diamond swapping color/vip/*.
| Token | Type | Alias | Notes |
| vip/tier/bronze/bg | Color | color/vip/bronze × opacity/20 | Badge bg |
| vip/tier/bronze/text | Color | color/vip/bronze | |
| vip/tier/bronze/border | Color | color/vip/bronze | |
| vip/tier/bronze/icon | Color | color/vip/bronze | |
Repeat 4 tokens for: vip/tier/silver/*, vip/tier/gold/*, vip/tier/platinum/*, vip/tier/diamond/* — total 20 VIP tokens. |
| vip/progress/track | Color | color/neutral-200 | Next-tier progress bar |
| vip/progress/fill | Color | color/brand/primary-600 | |
| vip/points/text | Color | color/brand/primary-700 | Loyalty points display |
3.24 · Launcher chrome new
The wrapper around 3rd-party game iframes. Players spend most of their session in here — it's where brand identity lives while the game is running.
Top bar
| Token | Type | Alias | Notes |
| launcher/top-bar/bg | Color | surface/raised | |
| launcher/top-bar/text | Color | text/primary | Game title |
| launcher/top-bar/close-icon | Color | text/secondary | |
| launcher/top-bar/close-icon-hover | Color | color/status/error-500 | |
| launcher/top-bar/balance-text | Color | text/primary | |
| launcher/top-bar/balance-currency | Color | text/muted | |
| launcher/top-bar/height | Number | layout/launcher-top-bar-height | → Primitives |
Bottom bar
| Token | Type | Alias | Notes |
| launcher/bottom-bar/bg | Color | surface/raised | |
| launcher/bottom-bar/deposit-shortcut-bg | Color | interactive/primary/bg-default | |
| launcher/bottom-bar/deposit-shortcut-text | Color | interactive/primary/text-default | |
| launcher/bottom-bar/favorite-icon | Color | text/muted | |
| launcher/bottom-bar/favorite-icon-active | Color | color/status/warning-500 | Heart / star |
| launcher/bottom-bar/session-timer-text | Color | text/muted | RG |
| launcher/bottom-bar/fullscreen-toggle | Color | text/secondary | |
| launcher/bottom-bar/height | Number | layout/launcher-bottom-bar-height | |
States
| Token | Type | Alias | Notes |
| launcher/loading/bg | Color | theme/surface/skeleton | Game booting |
| launcher/loading/shimmer | Color | theme/surface/skeleton-shimmer | |
| launcher/loading/spinner | Color | color/brand/primary-500 | |
| launcher/error-state/bg | Color | color/status/error-50 | Game failed to load |
| launcher/error-state/text | Color | color/status/error-800 | |
| launcher/error-state/retry-cta | Color | interactive/primary/bg-default | |
| launcher/frame-border | Color | border/default | Around iframe |
Live-casino specific
| Token | Type | Alias | Notes |
| launcher/live-casino/mute-icon | Color | color/always/white | Overlay on video |
| launcher/live-casino/mute-icon-active | Color | color/status/error-400 | Muted state |
| launcher/live-casino/chat-icon | Color | color/always/white | |
| launcher/live-casino/chat-badge-bg | Color | color/status/error-500 | Unread count |
| launcher/live-casino/chat-badge-text | Color | color/always/white | |
3.26 · Icon v3 — three-way split, informed by the brand audit
Three distinct icon roles that 4 of 9 audited brands diverge (getlucky, reviant-A, reviant-B, 888.nl). color.icon.action is never auto-aliased to color.primary — brands that reserve the primary for CTAs (mobilespin, 888.nl) must be free to tint icons independently.
| Token | Type | Default alias | Notes |
| color/icon/content | Color | color/brand/primary-600 or text/primary | Illustrative content icons (hero illustrations, category art) |
| color/icon/descriptive | Color | color/brand/primary-600 or text/secondary | Small icons that label menu rows |
| color/icon/action | Color | color/brand/primary-600 or text/muted | Chevrons, arrows, carets — brands can diverge from primary |
| color/icon/nav-selected | Color | color/brand/primary-600 | Bottom-nav selected icon — reviant-A splits this from nav label |
| color/icon/disabled | Color | text/disabled | Any icon in disabled state |
| color/icon/inverse | Color | text/inverse | Icons on inverse surfaces |
3.27 · Pill v3 — new semantic family (was borrowed from Sub Menu in v2)
Dedicated role family for Pill / Filter Pill / Navigation Pill / Small Pill / segmented pill component-sets. Replaces the accidental Sub Menu/* borrowing that caused cross-brand pill drift in v2.
| Token | Type | Default alias | Notes |
| pill/surface | Color | color/brand/primary-100 or color/neutral-100 | Default state bg |
| pill/on-surface | Color | color/brand/primary-800 or text/primary | Default label + icon |
| pill/border | Color | color/always/transparent or color/brand/primary-500 | Outline-style brands (reviant-B) use visible stroke |
| pill/surface-hover | Color | color/brand/primary-200 | Hover state |
| pill/surface-selected | Color | color/brand/primary-600 | Selected / active |
| pill/on-surface-selected | Color | color/always/white | Label on selected |
| pill/border-selected | Color | color/brand/primary-700 | Stroked selected |
| pill/surface-disabled | Color | color/neutral-100 | |
| pill/on-surface-disabled | Color | text/disabled | |
| pill/padding-x | Number | spacing/3 · 12px | Horizontal padding |
| pill/padding-y | Number | spacing/1 · 4px | Vertical padding |
| pill/gap | Number | spacing/1 · 4px | Gap between icon + label |
3.28 · Badge v3 — formalises the single Main/Badge primitive from v2
Extends v2's lone Main/Badge primitive into a full family so brands can set on-surface and border independently.
| Token | Type | Default alias | Notes |
| badge/surface | Color | color/brand/secondary-500 or color/status/error-500 | Was Main/Badge in v2 |
| badge/on-surface | Color | color/always/white | Label / count |
| badge/border | Color | color/always/transparent | Optional stroke |
| badge/min-size | Number | 16 | Smallest dot indicator |
| badge/dot-surface | Color | color/status/error-500 | Unread-dot variant (no count) |
3.29 · Banner v3 — evolved from Banner/Background + Banner/Stroke (v2)
Completes the banner family with banner.on-surface and banner.overlay so hero cards stop using inline fills.
| Token | Type | Default alias | Notes |
| banner/surface | Color | color/brand/primary-700 | evolved was Banner/Background |
| banner/stroke | Color | color/always/transparent | evolved was Banner/Stroke; reviant-B sets to #ff4655 |
| banner/on-surface | Color | color/always/white | Banner text + icon |
| banner/overlay | Color | color/always/black × opacity/40 | Gradient / scrim over hero imagery |
| banner/accent | Color | color/brand/secondary-500 | Secondary brand accent within banner |
3.30 · Radius roles v3 — semantic mapping on top of radius primitives
Role-level radius tokens that map intent ("this is a modal") to a primitive ("radius/lg"). v3 adds radius.modal and radius.badge so brands can tune modal/badge corners independently from cards.
| Token | Type | Default alias | Notes |
| radius/card | Number | radius/md or radius/lg | evolved role-layer over primitive |
| radius/input | Number | radius/sm or radius/md | evolved role-layer |
| radius/pill | Number | radius/full | evolved role-layer |
| radius/badge | Number | radius/sm · 4px | v3 independent from card |
| radius/modal | Number | radius/xl · 16px | v3 independent from card (reviant-B 0) |
| radius/navigation | Number | radius/none · 0 | evolved reviant-A sets to 12 |
| radius/focus-ring | Number | radius/sm | Focus ring around interactive |
Note on CTA radius: in v3 cta.radius is resolved via Figma component variants (form / card / wallet / landing), not a semantic role alias. See Collection 5 cta.*.
Collection 4 · Regulatory 7 modes · default · SE · DK · MT · ON · NL · PL
Narrow override layer. Only tokens that regulators actually constrain. Sits above Semantic in the alias chain. Every token has 7 values (one per mode); the table shows example defaults — jurisdiction-specific values are populated by the DS lead in consultation with legal/compliance.
4.1 · Regulatory tokens
| Token | Type | Default value | Jurisdiction notes |
| reg/rg/warning/bg | Color | color/status/warning-50 | NL: higher contrast required |
| reg/rg/warning/text | Color | color/status/warning-900 | NL & SE: WCAG AAA required |
| reg/rg/warning/border | Color | color/status/warning-400 | |
| reg/rg/warning/icon | Color | color/status/warning-600 | |
| reg/rg/warning/min-size-hint | Number | 14 (px) | Minimum font size for warning text |
| reg/rg/self-excl/bg | Color | color/status/error-50 | |
| reg/rg/self-excl/text | Color | color/status/error-900 | |
| reg/rg/self-excl/cta-bg | Color | color/status/error-600 | |
| reg/rg/self-excl/program-name | String | "Self-exclusion" | SE: Spelpaus · DK: ROFUS · NL: Cruks · ON: ConnexOntario · MT: Gaming-related harm support |
| reg/rg/self-excl/program-url | String | brand-defined | Direct link to register |
| reg/rg/limit/bar-track | Color | color/neutral-200 | Deposit limit progress |
| reg/rg/limit/bar-fill | Color | color/status/success-500 | |
| reg/rg/limit/bar-fill-near | Color | color/status/warning-500 | Near limit |
| reg/rg/limit/bar-fill-at | Color | color/status/error-500 | At / over limit |
| reg/bonus-disclaimer/text | Color | text/secondary | SE: strict "bonus" language rules |
| reg/bonus-disclaimer/min-contrast-hint | String | "AA" | NL: "AAA" |
| reg/bonus-disclaimer/min-size-hint | Number | 12 (px) | Regulator minimum |
| reg/logo/color | Color | text/muted | GamCare / Stödlinjen / Cruks / MGA seal / Spillemyndigheden seal / ConnexOntario |
| reg/logo/hover | Color | text/primary | |
| reg/logo/min-size-hint | Number | 24 (px) | Per regulator spec |
| reg/age-gate/min-age | Number | 18 | ON: 19 · NL ads: 24 |
| reg/age-gate/text | String | "18+" | "19+" (ON) · "24+ in advertising" (NL) |
Per-jurisdiction reference
| Mode | Regulator | Self-exclusion | Min age | Key constraint |
| default | — | generic | 18 | Fallback |
| SE | Spelinspektionen | Spelpaus | 18 | Strict bonus language · deposit-limit mandatory |
| DK | Spillemyndigheden | ROFUS | 18 | Seal placement · mandatory RG info |
| MT | MGA | MGA support | 18 | MGA seal visibility · play reminder |
| ON | iGO / AGCO | ConnexOntario | 19 | No celebrity ads · strict promo restrictions |
| NL | Kansspelautoriteit (KSA) | Cruks | 18 · 24+ for ads | KOA compliance · deposit-limit mandatory |
| PL | Ministerstwo Finansów | — | 18 | State monopoly on sports betting · restricted game types |
Collection 5 · Component global · ~35 tokens expanded in v3
In v2 this was a last-resort bucket (<10 tokens). v3 expands it into proper alias packs that match the component masters in the WEB Design System. Every pack aliases through Semantic tokens — brand-mode changes on Collection 1 cascade here automatically. Marketing designers never edit this collection; they change brand-mode values on Collection 1 and see the result.
5.2 · view-all.* v3 — "View all" / inline-link alias pair
Addresses the "label colour ≠ chevron colour" case. Evolves v2's interactive/viewall/* into an explicit label/icon split so the divergence is discoverable in brand-mode editing.
| Token | Type | Default alias | Splits in |
| view-all/label | Color | text/link/default | lyllo orange · getlucky pink |
| view-all/label-hover | Color | text/link/hover | |
| view-all/icon | Color | color/icon/action | lyllo pink · getlucky orange |
| view-all/icon-hover | Color | color/icon/action | |
| view-all/underline | String | none or underline | Brand variation |
| view-all/gap | Number | spacing/1 · 4px | Label-to-icon gap |
5.3 · nav.* v3 — Bottom-navbar alias pack, with icon/text split
Every nav state is two tokens: one for the icon, one for the text, defaulting equal. reviant-A splits selected-icon (red) from selected-text (dark); all other brands keep them matched.
| Token | Type | Default alias | Splits in |
| nav/background | Color | surface/raised or color/always/black | Brand choice |
| nav/default-icon | Color | text/muted | — |
| nav/default-text | Color | text/muted | — |
| nav/selected-icon | Color | color/icon/nav-selected | reviant-A diverges from text |
| nav/selected-text | Color | nav/selected-icon | reviant-A: text/primary while icon is red |
| nav/hover-icon | Color | text/primary | |
| nav/disabled-icon | Color | text/disabled | |
| nav/radius | Number | radius/navigation | reviant-A: 12 |
| nav/shadow | String | shadow/none | reviant-A: shadow/sm (elevated) |
| nav/height | Number | 56 · 3.5rem | |
| nav/safe-area-bottom | Number | env(safe-area-inset-bottom) | iOS home indicator |
5.5 · cta.* with context variants v3 — Button / CTA master alias pack + 4 component variants
The CTA component has a "Context" variant property with values form · card · wallet · landing. Each variant binds cta.radius to a different Primitive-backed role, so the same CTA component picks the right radius based on where the designer drops it. This is a Figma component-variant axis, not a mode axis.
| Token | Type | Default alias | Notes |
| cta/primary/surface | Color | interactive/primary/bg-default | |
| cta/primary/surface-hover | Color | interactive/primary/bg-hover | |
| cta/primary/surface-pressed | Color | interactive/primary/bg-pressed | |
| cta/primary/surface-disabled | Color | interactive/primary/bg-disabled | |
| cta/primary/on-surface | Color | interactive/primary/text-default | mobilespin: yellow on red |
| cta/primary/icon | Color | cta/primary/on-surface | Can split from label |
| cta/secondary/surface | Color | interactive/secondary/bg-default | |
| cta/secondary/on-surface | Color | interactive/secondary/text-default | |
| cta/secondary/border | Color | interactive/secondary/border-default | |
| cta/tertiary/surface | Color | color/always/transparent | Outline / ghost |
| cta/tertiary/on-surface | Color | interactive/tertiary/text-default | |
| cta/tertiary/border | Color | color/brand/primary-600 | |
| cta/destructive/surface | Color | interactive/destructive/bg-default | Delete / close account |
| cta/destructive/on-surface | Color | interactive/destructive/text-default | |
| cta/label | Color | cta/primary/on-surface | Split when CTA has leading icon |
| cta/leading-icon | Color | cta/label | |
| cta/trailing-icon | Color | cta/label | Arrow / chevron |
| cta/height | Number | layout/input-height | Matches input when in forms |
| cta/padding-x | Number | spacing/4 · 16px | |
| cta/gap | Number | spacing/2 · 8px | Icon ↔ label |
| cta/focus-ring | Color | border/focus | |
Context variants
A Figma component variant property. Each value of "Context" binds cta.radius to a different Primitive-backed radius. No new modes; just four variants of the same master.
| Variant | cta/radius resolves to | Typical value | When to use |
| context = form | radius/input or radius/sm | 3–4 px | Inside a form, next to text inputs |
| context = card | radius/card | 8–12 px | Inside a card; matches card corners |
| context = wallet | radius/full | 9999 px | Deposit / withdraw — pill-shaped on 6 of 9 audited brands |
| context = landing | radius/full | 9999 px | Marketing hero CTAs — pill-shaped |
5.6 · Last-resort overrides stable — keep under 5
Reserved for brand-specific overrides that genuinely can't live in Primitives or Semantic. Most v1/v2 Component entries migrated to layout/* or z-index/* in Primitives. If this subsection grows, audit the semantic layer first.
| Token | Type | Example value | Why it exists here |
| component/modal/backdrop-opacity-override | Number | brand-defined | Rare brand-specific legal/UX spec above theme default |
| component/card/border-radius-override | Number | brand-defined | Only if a brand varies card radius at component level specifically |
| Budget: keep under 5. The v3 alias packs above absorb most of what historically ended up here. |
↑ Top