Foundations · Typography
Foundations

Typography

Twelve roles, not twelve sizes. Each token carries its own line-height and tracking, so one utility reproduces a style exactly and no component ever needs to set three properties to get one look.

The family
DM Sans
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789   4.7 · 3.2 · 0.0   ––   …
Regular 400
body, captions
Medium 500
eyebrows, links
Semibold 600
headings, buttons
Bold 700
rare — figures only

The scale below is tuned to DM Sans metrics — twelve sizes, each with its own line-height and tracking. Substituting the typeface means re-tuning all twelve, which is why it is not a swap anyone makes casually. --font-legacy (Inter) exists so legacy markup resolves; new work must not use it.

The scale

Token
Size
L-H
Track
Specimen
text-caption
10px
1.5
.06em
Internal survey, 2026
text-eyebrow
11px
1.4
.12em
How it works
text-meta
13px
1.4
Step 3 · 14 March · Lisbon
text-sm
14px
1.55
Table body and dense lists.
text-ui
15px
1.6
Add review
text-base
16px
1.65
The default reading size.
text-lead
17px
1.45
Pull statements and Callout bodies.
text-h4
18px
1.4
Card and panel heading
text-h3
20px
1.35
-.01em
Subsection heading
text-h2
28–36
1.2
-.02em
Section heading
text-h1
32–44
1.15
-.025em
Page title
text-display
40–56
1.05
-.03em
Hero

h2, h1 and display are clamp() — they resize with the viewport, no breakpoint overrides. display is hero-only and only in comfortable density.

Every density shares the scale

A dashboard is not a different typeface at a different scale. It is the same voice speaking in shorter sentences — the change is in the copy and the rhythm, never the type ramp.

Comfortable · www
See how organizers respond to feedback

Every athlete who rates an event gets a written debrief the same week.

Default · dashboard
Reply

Debrief sent to 412 athletes.

Uppercase is a style, never a string

Eyebrows, badges and table heads are uppercase, applied by text-transform in three recipes. A screen reader reads SUBMIT as an initialism; text-transform does not have that problem.

<Eyebrow>How it works</Eyebrow>
Do
<Eyebrow>HOW IT WORKS</Eyebrow>
Don't

Numbers

Any figure in a column, a bar or a table gets tabular-nums. Ratings are always one decimal — 4.0, not 4. A trailing .0 signals a measured average rather than a whole-number opinion.

Tabular
4.7
3.1
11.0
0.9
Proportional
4.7
3.1
11.0
0.9

Measures

Text never spans the viewport. Pick the measure by what the column contains, not by what fits.

--container-form · 28rem
--container-prose · 36rem
--container-narrow · 42rem

The editorial serifs

Resolved · 7 Aug 2026

Cut. --font-editorial-display (Playfair Display) and --font-editorial-body (Source Serif 4) were declared and never loaded, so they shipped as Georgia while reading as a decision in review. Neither token exists any more.

DM Sans is the whole typographic system. If /business/ later needs an editorial voice, add one family with its @font-face in the same commit that first uses it — two unloaded families on an SEO-first surface is a cost with no return.

--font-editorial-display (Playfair Display) and --font-editorial-body (Source Serif 4) are declared but never loaded — no @import fires for either. Right now they are two names that silently fall back to Georgia.

Recommendation: cut them. A token that resolves to a fallback is worse than no token — it looks intentional in review and ships as Georgia. If /business/ later needs an editorial voice, add one family with its @import in the same commit. Two unloaded families on an SEO-first surface is a cost with no return.

Sporting Scouter Design System
Every token on this site is generated from theme.css.