Shared Design Tokens

Cross-platform constants used identically across web, mobile, desktop, and marketing.

AI-Readable Docs (Markdown)

Machine-readable versions for Claude / LLMs. Regenerate: npm run ai-docs

Design Principles

Friendly, Not Corporate

Rounded corners, pill buttons, generous whitespace. TrainerDay feels like a helpful training buddy, not enterprise software.

Simple and Open

One font (DM Sans). One primary color (blue). One zone palette (Zwift). Consistency breeds familiarity.

Readable While Suffering

Workout screens are designed for athletes mid-effort — sweating, eyes blurred, hands shaking. Large numbers, high contrast, minimal info.

One System, Two Themes

Web and marketing use light theme. Mobile and desktop use dark theme. Same tokens, same language, different surfaces.

Font: DM Sans

DM Sans is the ONLY font across all platforms. Weights 300–700. Never Inter, Roboto, Arial, or system fonts.

Light (300) — The quick brown fox

Regular (400) — The quick brown fox

Medium (500) — The quick brown fox

SemiBold (600) — The quick brown fox

Bold (700) — The quick brown fox

Primary Color

Primary #2563eb
Primary Light #dbeafe
Primary Dark #1d4ed8

Blue is the primary action color across all platforms. One primary blue button per screen. Red is for danger only — never for primary actions or branding.

Training Zone Colors

Zwift power zone colors used everywhere: charts, badges, indicators. Source of truth: @trainerday/cycling-converter (ZONE_COLORS).

Z1 Recovery #7F7F7F
Z2 Endurance #3F8FCE
Z3 Tempo #49C072
Z4 Threshold #FFCC3F
Z5 VO2max #F46D41
Z6 Anaerobic #D6270B

Zone Background Colors (light theme)

Recovery BG #e8e8e8
Endurance BG #dcebf6
Tempo BG #def4e6
Threshold BG #fff6dc
VO2max BG #fde5dd
Anaerobic BG #f8d8d3

Periodization Colors

Used for training plan phase badges and calendar indicators.

Base #02c9af
Build #ffba4a
Peak #f86f2b
Event #1a9af6

Semantic Colors

Success #10b981
Danger #e7140f
Warning #eab308
Info #4ea1fe

Golden Rules

Always

  • Use DM Sans — it's the only font
  • Use Zwift zone colors from @trainerday/cycling-converter
  • Use blue (#2563eb) as the primary action color
  • One primary blue button per screen
  • Pill-shaped buttons (web/mobile), rounded-rect buttons (desktop)
  • Rounded corners everywhere — nothing sharp or corporate
  • Generous whitespace — breathing room, not cramped
  • Large workout numbers readable from 1 meter
  • Minimum 56px touch targets on mobile

Never

  • Use red for primary actions or branding — red is danger only
  • Use Inter, Roboto, Arial, or system fonts
  • Make sharp/corporate corners
  • Use subtle color differences in workout screens
  • Show more than 3–4 data points during workouts
  • Make touch targets smaller than 56px on mobile
  • Invent new zone color schemes
  • Add new fonts without explicit approval

Platform Differences

Aspect Web Mobile Desktop Marketing
Theme Light Dark only Dark only Light
CSS Tailwind v4 Styled Components Inline CSSProperties Tailwind v4
Button shape Pill (100px) Pill (9999px) Rounded rect (6px) Pill (100px)
Card radius 12px 12px 12px 12px
Framework Vue 3 React Native React + Electron Nuxt 3
Numeric font DM Sans DM Sans JetBrains Mono DM Sans