Skip to content

Typography

Typefaces

Two typefaces are used across all Level 147 interfaces. Both are loaded via Google Fonts.

Inter — primary typeface

Used for all UI text, body copy, headings, and labels.

@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');
--font-sans: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;

Inter is a variable-weight sans-serif optimised for screen readability at small sizes. It has a large x-height, open apertures, and distinguishable characters (0 vs O, l vs 1) that are important for data-dense interfaces.

Fallback chain: Segoe UI (Windows), system-ui (macOS/iOS), -apple-system (older Safari), generic sans-serif.

JetBrains Mono — monospace typeface

Used for all code, terminal output, data values, API endpoints, environment variable names, and numeric data.

@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap');
--font-mono: "JetBrains Mono", "Cascadia Code", ui-monospace, monospace;

JetBrains Mono features programming ligatures (disabled by default) and excellent distinguishability between similar characters.

Fallback chain: Cascadia Code (Windows Terminal), ui-monospace (system mono), generic monospace.


Type scale

The scale uses rem units anchored to the browser default (16px). All sizes are defined as CSS custom properties and must be used — do not introduce ad-hoc font sizes.

TokenrempxUse
--fs-00.82rem13.1pxCaptions, badges, chip labels, table footnotes
--fs-10.92rem14.7pxSidebar items, metadata, secondary body
--fs-21rem16pxDefault body text
--fs-31.18rem18.9pxLead paragraphs, intro copy
--fs-41.5rem24pxSection headings (h2)
--fs-52rem32pxPage titles (h1)
--fs-62.6rem41.6pxHero / display headings
/* Usage */
.caption { font-size: var(--fs-0); }
.body { font-size: var(--fs-2); }
.lead { font-size: var(--fs-3); }
h2 { font-size: var(--fs-4); }
h1 { font-size: var(--fs-5); }
.hero-title { font-size: var(--fs-6); }

Font weights

WeightValueUse
Regular400Body text, prose, table cells
Semibold600Navigation labels, table headers, button text, active states
Bold700Headings h2–h3, emphasis
Heavy800Display headings h1, hero titles
.body-text { font-weight: 400; }
.nav-label { font-weight: 600; }
.section-title { font-weight: 700; }
.hero-heading { font-weight: 800; }

Line height

--lh: 1.7;

A line height of 1.7 is used for all body text. This is generous — appropriate for technical documentation where dense prose must remain scannable.

For headings, tighten to 1.1–1.2 to prevent gaps between lines on multi-line titles.

p, li, td {
line-height: var(--lh); /* 1.7 */
}
h1, h2, h3 {
line-height: 1.15; /* tighter for headings */
}

Letter spacing

ElementValueRationale
Body text0Inter is already optimised; do not adjust
Display headings−0.4px to −0.6pxTighten large type slightly
ALL CAPS labels+1.5pxOpen tracking improves readability at small caps sizes
.display-heading { letter-spacing: -0.5px; }
.section-label { letter-spacing: 1.5px; text-transform: uppercase; }

Monospace usage rules

Use --font-mono (JetBrains Mono) for:

  • All code blocks and inline code
  • Terminal commands and shell output
  • File paths and directory names
  • Environment variable names (NEXT_PUBLIC_*, DATABASE_URL, etc.)
  • API routes (/api/widgets/docker)
  • IP addresses and port numbers
  • Timestamps in log-style displays
  • Version numbers when presented as identifiers

Do not use monospace for:

  • Prose references to technology names (“Docker”, “Cloudflare”)
  • Generic UI labels, even if they reference config keys
  • Tables where the monospace content is not code
code, pre, kbd {
font-family: var(--font-mono);
font-size: 0.84em; /* slightly smaller than surrounding text */
}

Responsive behaviour

The type scale is fixed (rem-based, not viewport-relative). Do not use fluid type (clamp, vw units) in the current design system — the dashboard is used on large screens at consistent viewport widths. Revisit if mobile support becomes a requirement.


Typographic hierarchy example

<!-- Page title -->
<h1>Dashboard</h1> <!-- --fs-5, weight 800 -->
<!-- Section heading -->
<h2>Widget Reference</h2> <!-- --fs-4, weight 700 -->
<!-- Subsection -->
<h3>Docker Containers</h3> <!-- --fs-3, weight 650 -->
<!-- Body -->
<p>The Docker widget reads container state via...</p> <!-- --fs-2, weight 400 -->
<!-- Metadata / label -->
<span class="label">Updated 2 min ago</span> <!-- --fs-0, weight 600 -->
<!-- Code reference -->
<code>/api/widgets/docker</code> <!-- --font-mono, 0.84em -->