11 — Tokens & Dev Guide
Design Tokens & Dev Guide
All design decisions codified as JSON tokens and CSS custom properties. Ship consistently across React, Vue, Svelte, Next.js, and plain HTML.
tokens.json
json
{
"color": {
"steel": {
"50": "#F2F4F5",
"100": "#E3E7E9",
"200": "#C8CED2",
"300": "#A7AFB5",
"400": "#8A9299",
"500": "#697279",
"600": "#505960",
"700": "#3A4248",
"800": "#262D32",
"900": "#161B1E"
},
"crimson": {
"50": "#FEF0F1",
"100": "#FDDCDE",
"200": "#FAB3B8",
"300": "#F47D85",
"400": "#E74552",
"500": "#BF1D2D",
"600": "#96161E",
"700": "#6E1017",
"800": "#480B0F",
"900": "#250508"
},
"gold": {
"300": "#E0C88A",
"400": "#CDB268",
"500": "#C9A74C",
"600": "#A58840",
"700": "#8C7030"
},
"cream": {
"default": "#F4EFE6",
"dark": "#EDE4CC"
},
"neutral": {
"50": "#F4F6FA",
"200": "#E2E8F0",
"400": "#94A3B8",
"500": "#64748B",
"600": "#475569",
"700": "#334155",
"900": "#091628"
},
"semantic": {
"success": "#00C853",
"warning": "#FFB300",
"error": "#FF1744",
"info": "#697279"
}
},
"spacing": {
"1": "4px", "2": "8px",
"3": "12px", "4": "16px",
"6": "24px", "8": "32px",
"12": "48px","16": "64px"
},
"radius": {
"sm": "6px",
"md": "10px",
"lg": "16px",
"pill": "100px"
},
"typography": {
"family": {
"display": "Barlow Condensed",
"heading": "Barlow Condensed",
"body": "Inter"
},
"scale": {
"display-xl": "clamp(52px, 10vw, 104px)",
"display-lg": "clamp(40px, 8vw, 88px)",
"display": "clamp(36px, 7vw, 76px)",
"display-sm": "clamp(28px, 5vw, 56px)",
"score": "clamp(48px, 10vw, 80px)",
"h1": "clamp(28px, 4.5vw, 48px)",
"h2": "clamp(20px, 3.5vw, 36px)",
"h3": "24px",
"h4": "20px",
"body-l": "18px",
"body": "15px",
"small": "13px",
"caption": "11px"
}
}
}tokens.css — CSS Custom Properties
css
:root {
/* Color — Primary */
--cpsl-steel-50: #F2F4F5;
--cpsl-steel-500: #697279;
--cpsl-steel-600: #505960;
--cpsl-steel-900: #161B1E;
/* Color — Crimson (accent) */
--cpsl-crimson-400: #E74552;
--cpsl-crimson-500: #BF1D2D;
--cpsl-crimson-600: #96161E;
/* Color — Gold */
--cpsl-gold-500: #C9A74C;
--cpsl-gold-600: #A58840;
--cpsl-gold-300: #E0C88A;
/* Color — Cream */
--cpsl-cream: #F4EFE6;
--cpsl-cream-dark: #EDE4CC;
/* Color — Neutral */
--cpsl-neutral-50: #F4F6FA;
--cpsl-neutral-200: #E2E8F0;
--cpsl-neutral-400: #94A3B8;
--cpsl-neutral-600: #475569;
--cpsl-neutral-900: #091628;
/* Semantic */
--cpsl-success: #00C853;
--cpsl-warning: #FFB300;
--cpsl-error: #FF1744;
--cpsl-info: #697279;
/* Surface tokens (swap in dark mode) */
--surface-1: #FFFFFF;
--surface-2: #F4F6FA;
--surface-3: #E2E8F0;
--surface-warm: #F4EFE6;
--text-primary: #091628;
--text-secondary:#475569;
--text-muted: #94A3B8;
--border: #E2E8F0;
/* Spacing */
--space-1: 4px; --space-2: 8px;
--space-3: 12px; --space-4: 16px;
--space-6: 24px; --space-8: 32px;
--space-12: 48px; --space-16: 64px;
/* Border radius */
--radius-sm: 6px; --radius-md: 10px;
--radius-lg: 16px; --radius-pill: 100px;
/* Type scale */
--text-display-xl: clamp(52px, 10vw, 104px);
--text-display-lg: clamp(40px, 8vw, 88px);
--text-display: clamp(36px, 7vw, 76px);
--text-display-sm: clamp(28px, 5vw, 56px);
--text-score: clamp(48px, 10vw, 80px);
--text-h1: clamp(28px, 4.5vw, 48px);
--text-h2: clamp(20px, 3.5vw, 36px);
--text-h3: 24px;
--text-h4: 20px;
--text-body-l: 18px;
--text-body: 15px;
--text-small: 13px;
--text-caption: 11px;
/* Typefaces */
--font-display: 'Barlow Condensed', sans-serif;
--font-heading: 'Barlow Condensed', sans-serif;
--font-body: 'Inter', sans-serif;
}
/* Dark mode */
[data-theme="dark"] {
--surface-1: #0A1628;
--surface-2: #091628;
--surface-3: #1E2D45;
--text-primary: #F4F6FA;
--text-secondary:#94A3B8;
--text-muted: #475569;
--border: #1E2D45;
}Contribution Checklist
Uses design tokens only — no hardcoded colors, spacing, or radii
All interactive states documented: default, hover, active, focus, disabled
WCAG AA contrast verified (4.5:1 for body text, 3:1 for large text)
Fully keyboard accessible — focus ring, tab order, no keyboard traps
Responsive across all 5 breakpoints (375px → 1440px)
Dark mode via surface tokens — no per-component dark overrides
Semantic HTML with correct ARIA attributes documented
Minimum 44×44px touch target on all interactive elements
Design Principles
⚡
Speed First
Optimistic updates, skeleton screens, and sub-200ms interactions keep fans engaged.
🎯
Data at a Glance
Large numerals, high contrast. Legible in bright sunlight on a mobile screen.
♿
Inclusive Default
WCAG AA always. Color is never the only signal — always paired with label or icon.
🏟️
Brand Cohesion
Tokens enforced everywhere. No one-off hex values in component implementations.
📱
Mobile-Led
44×44px touch targets. All layouts designed mobile-first, then scaled to desktop.
Supported Stacks
ReactNext.jsVue 3SvelteRemixVanilla CSSTailwind CSSCSS Modules
CPSL Design System v1.0
11 sections · 30+ components · 3 patterns · Publish-ready · 2026