Files
spa/TRM_Design_System-handoff/trm-design-system/project/README.md
T
julian 8223a566e4 docs: import TRM design handoff + defer adoption to phase 3.8
A design handoff bundle generated by Claude Design (claude.ai/design)
on 2026-05-02. Defines the Bloomberg/F1-pit-wall aesthetic for TRM:
- ink-on-paper base + race-flag red accent (#E8412B)
- square-edged everything, sharp printed offset shadows
- mono numerics (JetBrains Mono) for any changing value
- Goldplay (real licensed font, three weights in bundle fonts/)
- four surfaces designed: dashboard / leaderboard / mobile / marketing
  (SPA scope is the first two)

The bundle is committed in-tree at TRM_Design_System-handoff/ so 3.8
has the full source material when it picks the work up. Includes:
- Top-level + project READMEs (the design spec)
- chats/chat1.md (intent + iteration history)
- colors_and_type.css (token set, drop-in for Tailwind 4 @theme)
- fonts/ (Goldplay regular/semibold/bold)
- ui_kits/ (HTML prototypes per surface)
- preview/ (per-token visual reference cards)

Updated phase-3-dogfood-readiness/README.md task 3.8 row to point at
the bundle and document the recommended approach (retheme shadcn via
CSS variable overrides + Tailwind 4 @theme, not replace).

Why deferred: foundational tokens are non-blocking for Phase 1 (login
+ placeholder home) and Phase 2 (live map without chrome). Applying
them now would either delay dogfood-blocking work or land partial
styling that gets reworked when 3.8 lands the full pass.
2026-05-02 19:11:57 +02:00

247 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TRM — Tracking & Race Management
**Design System v1.0**
TRM (Tracking & Race Management) is a multi-sport, generic event-timing platform — race directors, timing officials, athletes, and spectators all live in one product family. Think of the way an F1 pit-wall display, a marathon results board, a triathlon transition mat, and a sailing nav screen all need to coexist visually: high-density numerical data, instant readability under any light, and absolute trust in the numbers on screen.
The system covers four surfaces:
| Surface | Audience | Density |
|---|---|---|
| **Web dashboard** | Race directors, timing officials, race control | Very high |
| **Live tracking / leaderboard** | Spectators, broadcast, kiosk | Very high, glanceable |
| **Mobile app** | Athletes, spectators following a friend | Medium |
| **Marketing website** | Race organizers evaluating the product | Editorial |
---
## Sources & provenance
This system was built **from scratch** — no existing codebase, Figma file, or brand guide was provided. The only input was a **logo PNG** (`uploads/logo-1777578841639.png``assets/logo-trm.png`): a bold geometric wordmark with three inset glyphs — a 3D **cube** in the T, a **pixel grid** in the R, and a **folded map** in the M. That triad — *object · data · place* — is the conceptual core of the brand and runs through the rest of the system.
If you receive updated source material (real product screenshots, Figma, fonts, a brand book), treat this document as a starting hypothesis to be replaced — not as canon.
---
## CONTENT FUNDAMENTALS
TRM copy reads like a **race-control radio call**: short, factual, present tense, no hype. The product is responsible for numbers people care about (a podium finish, a qualifying time), so the voice is calm and exact. Drama lives in the data, not in the prose.
### Voice attributes
- **Precise over expressive.** "Lap 14 / 22" not "Almost there!"
- **Active, present tense.** "Smith passes Jones" not "Smith has just managed to pass Jones."
- **Short.** Most UI strings are ≤ 4 words. Sentences in marketing rarely exceed 16.
- **No exclamation marks** in product UI. Marketing may use one per page, max.
- **Second person ("you") in marketing.** First person plural ("we") only when explicitly speaking as the company. Product UI prefers no pronoun at all ("Add bib" not "Add a bib to your event").
- **Numerals beat words.** "3 laps left," not "three laps remaining."
- **Time is sacred.** Always render times in mono with tabular figures: `01:23:45.678`. Leading zeros on minutes/seconds. Milliseconds when relevant.
### Casing
| Context | Style |
|---|---|
| Buttons, links, menu items | **Sentence case** ("Start race", "Export results") |
| Labels above fields | **UPPERCASE** with letter-spacing (overline class) |
| Section headings | **Sentence case** |
| Table column headers | **UPPERCASE** mono, e.g. `POS BIB NAME GAP` |
| Status flags | **UPPERCASE** ("LIVE", "DNF", "DSQ", "DNS") |
| Brand wordmark | **TRM** — always uppercase, never "Trm" |
### Vocabulary — preferred terms
| Use | Not |
|---|---|
| Event | Race (use "race" only for a single heat within an event) |
| Participant | User, racer, runner (sport-specific only when the event is single-sport) |
| Bib | Number, ID |
| Wave | Group, batch |
| Split | Checkpoint *(use "checkpoint" only when split is geographic)* |
| Leaderboard | Ranking, scoreboard |
| DNF / DSQ / DNS | Did not finish / Disqualified / Did not start *(spell out only on first use)* |
| Live | Real-time *(reserve "real-time" for technical copy)* |
### Emoji & symbols
- **No decorative emoji** anywhere in product UI. None.
- Marketing may use **🏁** or **▲ ▼** as standalone graphic elements but never inline in sentences.
- Race-flag glyphs are part of the design system as **CSS-drawn flags or SVG**, not emoji.
- Mathematical / typographic symbols *are* used freely: `+`, ``, `±`, `→`, `·`, `°`, `Δ`.
### Sample copy
> **Marketing hero:**
> *Run any event. Time any sport. TRM is the race-day operating system used by 4,000+ event organizers — from 5K fun runs to 24-hour endurance races.*
> **Empty state in dashboard:**
> *No events yet. Create your first event to start timing.*
> **Toast on save:**
> *Saved · 14:02:11* *(timestamped, mono)*
> **Race-control alert:**
> *Bib 247 — missed split 3 — flagging for review*
> **Push notification, athlete app:**
> *Maya passed split 2 — 00:42:18 — pace 4:13/km*
---
## VISUAL FOUNDATIONS
The system is **ink on paper, with one race-flag accent**. Square-edged. Hairline-bordered. Mono-numeric. The visual mood sits between a Bloomberg terminal and a printed race program.
### Colors
- **Paper / Ink palette** drives 90% of screens. Off-white `#FAFAF7` ground, deep ink `#0E0E0C` strokes and type. No true black, no true white — both are exhausting on data screens.
- **Night mode** (`#0B0D10`) is the default for live tracking, kiosk, and trackside displays. It is not a "dark theme toggle" — it's a separate context.
- **Race-flag red `#E8412B`** is the only brand accent. Reserved for: primary CTAs, "live" pulse, danger states, the leading position in a leaderboard. Used sparingly. If everything is red, nothing is.
- **Amber `#F2A516`** = caution / yellow flag / warnings.
- **Green `#2E8C4A`** = go / improvement / personal best / passed checkpoint.
- **Blue `#2563C8`** = informational, link, "tracking" pulse.
- **Categorical viz palette** is 8 hues, ordered by frequency of use; never assign meaning to a viz hue beyond chart legend.
### Typography
- **Display & UI:** *Goldplay* (Semibold supplied; 400 / 700 synthesized). The brand face — humanist sans with confident curves and a slightly editorial register. Used for headings, buttons, navigation, labels.
- **Mono / data:** *JetBrains Mono* (400 / 500 / 600). Tabular figures are non-negotiable for any time, gap, distance, or ranking. Every number that could change is mono.
- **Body / long-form prose:** *Inter* (400 / 600). Used only in marketing long-form and documentation. The dashboard does not have body prose.
- **Letter-spacing:** display is tight (`-0.02em`). Overlines / table headers are open (`+0.10em`) and uppercase.
> ✅ **Goldplay (display/UI)** — brand face installed with three weights: Regular `400` (`fonts/goldplay-regular.ttf`), Semibold `600` (`fonts/goldplay-semibold.woff2`), Bold `700` (`fonts/goldplay-bold.ttf`). No synthesis. **Mono / body** are still Google Font substitutes — share licensed faces if available.e *Berkeley Mono* or *GT America Mono*), please provide the `.woff2` / `.ttf` files and we'll swap them in.
### Spacing & grid
- **4-px base** unit. Standard scale: 4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 · 64 · 80 · 96.
- **12-column grid** at 1280 px container, 24 px gutters, 16 px column gap.
- **Table density** is the system's defining choice. Default row height is **36 px**, "dense" is **28 px**, and dense is the dashboard default — race directors look at hundreds of rows.
### Corners & borders
- **Square by default.** `--r-0: 0`. Cards, inputs, buttons, modals: all square.
- **2 px radius** for chips and small inputs only.
- **410 px radius** reserved for marketing cards and the mobile app surface.
- **Hairline 1 px borders** — `var(--hairline)` for division within a card; full ink `1px solid var(--ink)` for the outer edge of any "first-class" container (modal, primary card, button).
- **No rounded pills**, except for status badges where pill is functionally meaningful (`LIVE`, `DNF`).
### Shadows & elevation
TRM uses a **printed offset shadow** as its primary elevation model — a sharp 2 px or 4 px ink-colored offset, no blur. It says "the chip is sitting on the page," not "the chip is glowing." Soft blurry shadows are allowed only on mobile sheets and marketing site.
| Token | Use |
|---|---|
| `--shadow-2` (2 px ink offset) | Buttons at rest, primary cards |
| `--shadow-3` (4 px ink offset) | Buttons / cards on hover |
| `--shadow-soft` | Mobile bottom sheets |
| `--shadow-pop` | Marketing testimonial / floating dropdowns |
### Backgrounds & imagery
- **No gradients** in product UI. Marketing may use a **flat ink-to-night vertical gradient** behind a hero — never multi-color.
- **Imagery vibe:** high-contrast B&W or duotone (ink + flag) photography of race-day moments — start lines, timing mats, marshals, finish tape. Crops are **tight and asymmetric**. Color photos are allowed in marketing but should be **slightly desaturated and warm-graded** so they coexist with the ink palette.
- **Patterns:** a subtle **dot-grid** (`2 px dot, 24 px spacing`, ink at 8% opacity) and a **diagonal hatch** (used sparingly to mark "in progress" or "estimated" data). These are CSS-drawn, never image files.
- **No hand-drawn illustrations.** No abstract blobs. No gradients-as-backgrounds. The brand is photographic + typographic.
### Animation
- **Functional, never decorative.** Transitions are 120320 ms, almost always `--ease-snap`.
- Hover changes use `120 ms`. Modal / sheet entrances use `180 ms`. Chart redraws use `320 ms`.
- **The "live" pulse** is the one signature motion: a 2 s loop where a red dot scales from 1.0 → 1.15 and a fading ring expands from 0 → 16 px. Used at most once per screen, next to the word LIVE.
- **No bouncy / spring easing.** No fly-ins from off-screen. No micro-interactions on every button.
### States — hover, press, focus, disabled
| State | Treatment |
|---|---|
| **Hover** (button) | Shadow grows from `--shadow-2``--shadow-3`, button translates `1px ↑ 1px ←` |
| **Hover** (link) | Color shifts `--ink``--flag` |
| **Hover** (table row) | Background shifts to `--paper-2`, no elevation change |
| **Press** | Shadow collapses to `0 0 0 0`, button translates back to `0,0` |
| **Focus** | 2 px outline in `--flag`, 2 px offset, *never* removed. Keyboard users matter on race day. |
| **Disabled** | Opacity 40%, cursor `not-allowed`, no shadow |
### Transparency & blur
- **Backdrop blur** used only on mobile bottom sheets and the kiosk overlay (`backdrop-filter: blur(12px)` over a `rgba(11,13,16,0.7)` scrim).
- Tints (`--flag-tint`, `--amber-tint`, `--green-tint`, `--blue-tint`) are flat 1015% mixes, never alpha layers, so they composite predictably over `--paper-2`.
### Layout rules — fixed elements
- **Top bar** is `56 px`, full-width, ink border on the bottom, sticky.
- **Side nav** is `240 px` collapsed to `64 px`, ink border on the right, sticky.
- **Live tracking pages** use a **3-column** layout: leaderboard (40%) · map (40%) · selected-athlete detail (20%).
- **Tables fill remaining space**, scroll independently of the page.
- **Time/clock** is always pinned top-right of any "race in progress" view, mono, jumbo size.
### Iconography
See the **ICONOGRAPHY** section below.
---
## ICONOGRAPHY
TRM uses **Lucide** as its icon system — a clean, square-cornered, 2 px stroke library that pairs with Goldplay's humanist sans and the square-edged component language. Lucide is loaded via CDN (`unpkg.com/lucide@latest`) in HTML examples and via the `lucide-react` package in production code.
> ⚠ **Substitution flag:** Lucide is a substitute. The TRM logo's three inset glyphs (cube, pixel-grid, map) suggest the brand may have a custom-drawn icon set in the same blocky style. If that set exists, swap it in — Lucide is the closest CDN-available match (clean strokes, square caps, geometric).
### Icon rules
- **Stroke weight:** 2 px (Lucide default). Never 1.5 / 1 — strokes get lost on dark mode.
- **Sizes:** 14 / 16 / 20 / 24 / 32 px. Never in between.
- **Color:** inherits `currentColor`. Default `--ink-3`; hover state inherits whatever the parent's hover color is.
- **Alignment:** icons are **box-aligned**, not optically aligned. The tabular feel beats the typographic feel here.
- **Race-specific iconography** that Lucide doesn't cover (checkered flag, timing chip, transition area, podium, finish-line tape, sailing buoy, lap split) is rendered as **inline SVG** in the same 2 px stroke style. A small set lives in `assets/icons/` as we encounter the need.
### Emoji
**Not used** in product UI. Only race-flag glyphs (🏁) are tolerated in marketing, and even then only as standalone graphic elements at large size — never inline in sentences.
### Unicode glyphs
Used freely for compact mathematical / directional indicators:
- `↑ ↓ → ←` for trend arrows in leaderboards
- `▲ ▼` for sort direction
- `±` for tolerance ("split window ±5s")
- `·` as a compact bullet between meta items ("Wave 3 · 4.2 km · 47 starters")
- `°` for temperature ("18°C, dry")
- `Δ` for delta ("Δ +1.4s")
### Logo
- `assets/logo-trm.png` — primary wordmark, ink on transparent, 286×158.
- Minimum width: 80 px.
- Clear space: half the cap-height of the wordmark, all sides.
- **Never** stretch, recolor (except inversion to paper-on-ink), or place on a busy photograph without a 1 px ink-bordered paper plate behind it.
---
## INDEX — what's in this folder
| Path | Purpose |
|---|---|
| `README.md` | This file. Read first. |
| `SKILL.md` | Agent-Skill manifest for Claude Code / portable use. |
| `colors_and_type.css` | All design tokens as CSS custom properties + base type styles. **Import this first** in any HTML mock. |
| `assets/` | Logos, icons, brand imagery. |
| `assets/logo-trm.png` | Primary wordmark. |
| `preview/` | Per-token / per-component preview cards rendered into the Design System tab. Useful as visual reference. |
| `ui_kits/dashboard/` | Web dashboard for organizers — sidebar, tables, race control. |
| `ui_kits/leaderboard/` | Live tracking / spectator leaderboard view. |
| `ui_kits/mobile/` | Athlete & spectator mobile app inside an iOS frame. |
| `ui_kits/marketing/` | Marketing site — homepage hero, features, pricing strip. |
Each `ui_kits/<name>/` folder contains its own `README.md` describing the screens, an `index.html` you can open directly, and JSX components for the major UI pieces.
---
## Quick start for designers
```html
<link rel="stylesheet" href="colors_and_type.css">
<script src="https://unpkg.com/lucide@latest"></script>
```
Then build with the tokens. The preview cards in `preview/` are good copy-paste starting points for any new screen.