Typography tokens provide a consistent, modular system for all text across the products. They are designed for clarity, readability, and hierarchy, while remaining flexible across devices.
The system uses three font families — a primary sans-serif for body and UI, a secondary serif for headings, and a tertiary monospace for code and labels. For the full list of typography token values, see the Tokens page.
Font Sizes
The full type scale used across the system. Reference these tokens when setting font sizes on any element.
The scale uses a progressive step approach: +2px in the body range, +4px in the heading range, and +8px in the display range. This gives more granularity where it matters most.
| Token | Value | px Equivalent | Step |
|---|---|---|---|
| 0.625rem | 10px | — | |
| 0.75rem | 12px | +2px | |
| 0.875rem | 14px | +2px | |
| 1rem | 16px | +2px | |
| 1.125rem | 18px | +2px | |
| 1.25rem | 20px | +2px | |
| 1.375rem | 22px | +2px | |
| 1.5rem | 24px | +2px | |
| 1.75rem | 28px | +4px | |
| 2rem | 32px | +4px | |
| 2.25rem | 36px | +4px | |
| 2.5rem | 40px | +4px | |
| 3rem | 48px | +8px | |
| 3.5rem | 56px | +8px | |
| 4rem | 64px | +8px | |
| 4.5rem | 72px | +8px |
Headings
All headings use (RecifeText) at (400). Each level steps down in size to create a clear visual hierarchy.
Heading 1
Build systems that scale with your ambition
Heading 2
Every detail contributes to the whole
Heading 3
Structure creates clarity in complexity
Heading 4
Good defaults eliminate guesswork
Heading 5
Constraints unlock creative freedom
Heading 6
Small decisions compound over time
<h1>Build systems that scale with your ambition</h1>
<h2>Every detail contributes to the whole</h2>
<h3>Structure creates clarity in complexity</h3>
| Element | Token | px | Mobile (≤768px) | Line Height | Value |
|---|---|---|---|---|---|
h1 |
48px | (36px) | 1.3 | ||
h2 |
36px | (28px) | 1.3 | ||
h3 |
28px | — | 1.3 | ||
h4 |
24px | — | 1.3 | ||
h5 |
22px | — | 1.3 | ||
h6 |
22px | — | 1.4 |
Headings use (1.3) so multi-line titles have breathing room. On mobile (≤768px), h1 and h2 step down a level to prevent giant titles from dominating small viewports.
Body Text
The default paragraph style used for all running content. The token controls the base size globally — changing it updates paragraphs, inputs, code, tables, and buttons at once. Size modifier classes let you step up or down from the default.
Extra Large
Lead paragraphs and hero text that needs to stand out from regular body copy.
Large
Introductory text and section summaries that sit between headings and body text in the hierarchy.
Medium (default)
The default body text size. This is what you get without adding any size class — the baseline for all running content.
Small
Secondary content, supporting details, and supplementary information that doesn't need to compete with body text for attention.
Extra Small
Captions, footnotes, metadata, and fine print — available but not prominent.
<p class="text-size-xlarge">Lead paragraph text.</p>
<p class="text-size-large">Introductory text.</p>
<p>Default body text (no class needed).</p>
<p class="text-size-small">Smaller supporting text.</p>
<p class="text-size-xsmall">Captions and metadata.</p>
| Element | Token | px | Line Height | Value |
|---|---|---|---|---|
| 28px | 1.4 | |||
| 22px | 1.4 | |||
p (default) |
18px | 1.4 | ||
| 16px | 1.6 | |||
| 14px | 1.6 |
Eyebrow
A small, uppercase label used to provide context above headings, within sections, or inline with other content. The class works on any element — <p>, <span>, <h2>, or anything else.
Case Study
Building a design system from the ground up
A design system is more than a collection of components — it is a shared language between design and engineering.
New components added to the library
Section Label
An eyebrow on an h2 resets it to the small uppercase style, useful when you need heading semantics without heading size.
<!-- On a paragraph -->
<p class="eyebrow">Case Study</p>
<h2>Building a design system from the ground up</h2>
<!-- On a span (inline) -->
<span class="eyebrow">Latest Update</span>
<!-- On a heading (semantic heading, eyebrow style) -->
<h2 class="eyebrow">Section Label</h2>
| Element | Token | Line Height | Value |
|---|---|---|---|
| 1.3 |
Blockquote
Used for pullquotes and highlighted passages. Renders in the secondary serif font with a left border accent.
Short quote
Good typography is invisible. Bad typography is everywhere.
Long quote
A design system is more than a collection of components — it is a shared language between design and engineering. When done well, it reduces inconsistency, speeds up delivery, and creates a foundation that scales with the product.
<blockquote>
<p>Good typography is invisible. Bad typography is everywhere.</p>
</blockquote>
| Element | Token | Line Height | Value |
|---|---|---|---|
blockquote |
1.4 |
Links
Links use text-color underlines with a hover transition. The default state shows text with a coloured underline. On hover, the text colour shifts to and the underline moves down slightly. External links (target="_blank") automatically show a share icon via ::after that inherits the link colour.
Inline link
Read the full brand guidelines before starting any new project.
External link
Typography is powered by Google Fonts for web delivery.
<!-- Inline link -->
<p>Read the full <a href="/brand">brand guidelines</a> before starting.</p>
<!-- External link (icon added automatically) -->
<p>Typography is powered by <a href="https://fonts.google.com" target="_blank" rel="noopener noreferrer">Google Fonts</a> for web delivery.</p>
| Property | Value |
|---|---|
| Default colour | |
| Underline colour | |
| Hover colour | |
| Underline offset | 2.5px → 4px on hover |
| Underline thickness | 1.5px |
| Transition | 0.3s all |
| External icon | ::after on a[target="_blank"], inherits currentColor |
Font Families
The system uses four font stacks, each with a distinct role.
Primary — Inclusive Sans
Typography is the voice of design
Secondary — RecifeText
Typography is the voice of design
Tertiary — Bugrino
Typography is the voice of design
Quaternary — IBM Plex Mono
Typography is the voice of design
body { font-family: var(--font-primary); }
h1, h2, h3, h4, h5, h6 { font-family: var(--font-secondary); }
code, pre, kbd { font-family: var(--font-quaternary); }
| Token | Font | Used For |
|---|---|---|
| Inclusive Sans | Body text, UI, labels | |
| RecifeText | Headings, blockquotes | |
| Bugrino | Brand display, eyebrows, buttons, badges | |
| IBM Plex Mono | Code, pre, kbd |
Font Weight
Available weight values from light to black. All headings default to regular weight.
Light
Regular
Medium
Semi-Bold
Bold
Extra-Bold
Black
font-weight: var(--font-weight-bold);
| Token | Value |
|---|---|
| 300 | |
| 400 | |
| 500 | |
| 600 | |
| 700 | |
| 800 | |
| 900 |
Line Height
Vertical rhythm values from tight display text to loose body copy. Headings use tighter values; body text uses looser values for readability.
Extra Small
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
Small
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
Medium
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
Large
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
Extra Large
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
2X Large
Design tokens capture color, typography, spacing, and border values as reusable variables so that design and code stay in sync across every surface.
line-height: var(--line-height-l);
| Token | Value | Used For |
|---|---|---|
| 0.7 | Tight display text | |
| 1 | Tight display text | |
| 1.3 | Headings, eyebrows | |
| 1.4 | Body text, paragraphs | |
| 1.6 | Small text, captions | |
| 1.8 | Spacious body text |
Letter Spacing
Tracking values used for labels, eyebrows, and display text. Values are em-based so they scale proportionally with font size.
Small
Medium
Large
Extra Large
letter-spacing: var(--letter-spacing-xl);
| Token | Value | Used For |
|---|---|---|
| 0.03em | Subtle tracking | |
| 0.06em | Medium tracking | |
| 0.12em | Wide tracking | |
| 0.24em | Eyebrows, labels |