Primary Color
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.
Cross-platform constants used identically across web, mobile, desktop, and marketing.
Machine-readable versions for Claude / LLMs. Regenerate: npm run ai-docs
Rounded corners, pill buttons, generous whitespace. TrainerDay feels like a helpful training buddy, not enterprise software.
One font (DM Sans). One primary color (blue). One zone palette (Zwift). Consistency breeds familiarity.
Workout screens are designed for athletes mid-effort — sweating, eyes blurred, hands shaking. Large numbers, high contrast, minimal info.
Web and marketing use light theme. Mobile and desktop use dark theme. Same tokens, same language, different surfaces.
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
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.
Zwift power zone colors used everywhere: charts, badges, indicators. Source of truth: @trainerday/cycling-converter (ZONE_COLORS).
Used for training plan phase badges and calendar indicators.
@trainerday/cycling-converter| 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 |