Typography
Three families, eight fluid steps, eight compound styles. Sans for interface, mono for every label and technical value, serif as an opt-in reading variant.
Families
Only one webfont is loaded — IBM Plex Mono, at 400/500/600:
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap');
Sans is a web-safe system stack; serif is Georgia-based and opt-in, for a project that wants an editorial or archival feel. Neither is fetched.
Fluid scale
Eight steps, clamp()-based (Utopia, 320→1240px viewport). The body sits at
--gl-step-0 — 18px on a phone, 20px on a wide screen — with no fixed
breakpoint in between.
The eight compound styles
Real, specific numbers — not a generic ramp compressed to fit. Each class sets family, size, weight, line-height, and (where one applies) letter-spacing in a single declaration.
| Class | Weight | Size | Line-height | Tracking | Use for |
|---|---|---|---|---|---|
.type-display |
600 | --gl-step-4 |
1.08 | -0.015em | Page-level hero title, once per screen. |
.type-h1 |
600 | --gl-step-3 |
1.12 | -0.012em | Screen title. |
.type-h2 |
600 | --gl-step-2 |
1.16 | -0.01em | Section heading. |
.type-h3 |
600 | --gl-step-1 |
1.25 | normal | Card / subsection heading. |
.type-body |
400 | --gl-step-0 |
1.55 | normal | Body copy. |
.type-body-sm |
400 | --gl-step--1 |
1.5 | normal | Secondary copy, hints. |
.type-label |
500 | --gl-step--2 |
1 | 0.08em | Eyebrows, catalog labels, meta — SAVED, RECOMMENDED, OVERDUE. |
.type-mono |
400 | --gl-step--1 |
1.5 | normal | Technical values, IDs, dates, code. |
Heading one
Heading two
Heading three
Body copy at the base size, 1.55 line-height.
Secondary copy, one step down.
Catalog label technical.value / 2026-08-21 / #3a6a63Markup
<div class="type-display">Display</div>
<h1 class="type-h1">Heading one</h1>
<h2 class="type-h2">Heading two</h2>
<h3 class="type-h3">Heading three</h3>
<p class="type-body">Body copy at the base size, 1.55 line-height.</p>
<p class="type-body-sm">Secondary copy, one step down.</p>
<span class="type-label">Catalog label</span>
<span class="type-mono">technical.value / 2026-08-21 / #3a6a63</span>
Rules
- Three families, and no fourth. A new typeface needs a reason a weight or a size cannot supply.
- Mono is not decoration. Every label, meta value, ID, date, and code sample is mono, consistently — not reserved for where code happens to appear.
type-labelis always uppercase, mono, and tracked. It is the one place uppercase belongs in this system.- Never set a size in
px. The eight steps are fluid on purpose.