Brand
Navy that speaks, one teal that never speaks, and a pale band to breathe between. Square controls against round containers. Motion that travels in a direction rather than decorating. The product's argument is that it tells you when it does not know, so the interface never performs a confidence it has not earned.
Foundations
On the site the brand is set as a wordmark: Space Grotesk 500 at −0.05em, in ink, never in teal. There is no icon on any page of the current design.
Clear space and minimum size
Clear space on all sides equals the cap height of the T. The wordmark stops being legible below about 90px wide, which is the floor for a header lockup.
Ink and paper do the work. Teal is the one accent and it is a fill, never a word: at 2.5 against white it fails as text at every size. Where teal has to be read it becomes teal deep. Sky separates one section from the next and is never a full page.
--ws-ink#15344B12.93:1 · AADisplay type and dark surfaces
--ws-teal#03B8A52.5:1 · Never textThe brand. Fills only, never a word
--ws-teal-deep#00786C5.38:1 · AAThe text-safe teal
--ws-sky#E2F5FFSurface · ink 11.53:1The band that separates sections
--ws-paper#FFFFFFSurface · ink 12.93:1The default surface
--ws-body#00000021.0:1 · AABody copy is true black, not ink
--ws-duo#1C5F916.78:1 · AAThe blue every duotone photograph prints in
--ws-muted#6A7F8E4.17:1 · Large onlySecondary and axis text
Chart series · assign in this order, never cycled
Validated against white for lightness, chroma, colour-vision separation and contrast. All eight are safe where series sit next to each other, as in lines and bars. In a scatter or a small multiple, where any pair can meet, only the first three hold; past three, fold into Other or facet.
Sequential and diverging
Two families, and the split is strict. Space Grotesk at −0.05em is for anything that speaks. Noto Sans at +0.02em is for anything that explains. Hierarchy comes from size and weight, never from a third face. Emphasis is weight or colour, never italic.
Tissue takes load, adapts, takes more load, adapts again. When the load arrives faster than the adaptation can keep pace, the tissue does not fail on the spot.
Read the note| Role | Size | Face | Where it appears |
|---|---|---|---|
| Mega | clamp(3.6rem,17.6vw,261px) | Display | Closing bands only |
| H1 | clamp(2.9rem,8.1vw,120px) | Display | Page titles |
| H2 | clamp(2.2rem,4.05vw,60px) | Display | Section heads, article titles |
| H3 | clamp(1.9rem,3.1vw,46px) | Display | Block heads |
| Lede | clamp(1.1rem,1.82vw,27px) | Body | One paragraph under a title |
| Body | clamp(1rem,1.21vw,18px) | Body | Everything else |
| Prose | clamp(1.05rem,1.32vw,20px) | Body | Long-form, capped at 68ch |
| Label | 16px, uppercase | Body | Nav, buttons, kickers |
The highlighter
Containers are round, controls are square, and the contrast between the two is the look. Do not soften the controls and do not sharpen the cards.
| Radius and space | Value |
|---|---|
| Cards, dialogs | --ws-radius 32px |
| Tool panels | 8px |
| Every control | 0px |
| Content cap | --ws-maxw 1416px |
| Gutter | 20px, 32px above 1024 |
| Header | 104px, 88px below 1024 |
| Spacing | 4 8 12 16 24 32 48 64 96 |
| Elevation and motion | Value |
|---|---|
| Card | 0 30px 60px −40px / 45% |
| Lift on hover | 0 40px 80px −40px / 55% |
| Dialog | 0 60px 120px −50px / 70% |
| Easing | cubic-bezier(.22,.61,.36,1) |
| Micro | 220ms · hover, focus, colour |
| Reveal | 800ms · opacity and a 24px rise |
| Focus ring | 3px solid, 3px offset |
Components
A chamfer at the top left running the full height, so the control leans in the direction everything else travels. One primary action per view. Hover deepens the notch rather than swapping a colour, which is the only place on the site where a hover is a gesture instead of a state change.
Uppercase, tracked, square. Four reserved status colours that never become a chart series. A status colour never carries meaning alone: it always arrives with a dot or a word.
Garmin connected. Last sync 4 minutes ago.
Polar has not synced in 6 days. Detail past 28 days cannot be recovered once the window closes.
We could not reach Strava. Reconnect to resume importing.
Labels are always visible, set in uppercase micro type above the field. Hints are persistent rather than appearing on error. Fields are square, 54px tall, and focus is a 3px teal ring at 1px offset.
Numbers are set in the display face with tabular figures, so a column compares down rather than shifting. Every computed signal carries its confidence, and a signal running on thin data says so instead of producing a plausible number. That last part is the one piece of this system no other brand has.
| Session | Type | Distance | Avg pace | Load |
|---|---|---|---|---|
| Monday | Easy | 8.0 km | 5:38 | 44 |
| Wednesday | Intervals | 10.2 km | 4:21 | 92 |
| Saturday | Long | 24.0 km | 5:55 | 176 |
Patterns
One easing curve and two durations. Scroll-driven motion writes a single custom property per frame to a stage element and lets CSS do the rest, never a listener per item. The signatures are the card stack riding up into the band, the staircase that reveals a step at a time and then exits left, and the fan that opens on a scroll fraction.
| Pattern | Timing | What it does |
|---|---|---|
| Reveal on enter | 800ms | Opacity and a 24px rise. Never staggered to death. |
| Pin the stage | tied to scroll | Media holds while copy travels through it |
| Hand-off | tied to scroll | One passage exits left as the next arrives from the right |
| Button notch | 260ms | The cut deepens. The label does not move. |
| Dialog | 420ms | Opacity and a 20px rise |
| Reduced motion | respected | Every reveal resolves instantly and nothing is left hidden |
Real trail and real weather, never stock athleticism. Hero imagery prints in a
single blue: the photograph supplies luminance and --ws-duo supplies the hue, so a
misty forest and an athletics track end up in the same world. Everywhere else, evidence imagery
keeps its own colour, because a chart of your own data should not be styled.
Brand
Expert and plain-spoken. Direct second person, short sentences mixed with longer ones, concrete over abstract. We explain the reasoning behind every call and we state the limit rather than hiding it. Where we do not know, we say so, because a signal you have quietly learned to distrust will not change what you do on the day it matters.
The system as a page you can read, a stylesheet you can link, and the tokens as data. The brand book is the reference; the stylesheet is what an internal tool should use rather than reimplementing any of this.
Thirty days of Trailwise Pro, your history imported on day one, and a plan that answers to what your body is actually doing.
Get startedFree during the private beta. No credit card needed.
How the beta works
We sent a confirmation link to .
Your preferences are saved.
This email is already registered. If it was still unconfirmed, we’ve sent a fresh confirmation link to .