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.

Latest Update

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 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

Design is not just what it looks like

Regular

Systems scale when decisions are shared

Medium

Tokens turn intention into consistency

Semi-Bold

Structure creates clarity in complexity

Bold

Good defaults eliminate guesswork

Extra-Bold

Constraints unlock creative freedom

Black

Build with purpose, not by accident
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

Design System Components

Medium

Design System Components

Large

Design System Components

Extra Large

Design System Components
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

Was this page helpful?

We use this feedback to improve our documentation.

Thanks for your feedback