Typography

Two families do everything: Geist for the interface, JetBrains Mono for code, eyebrows, pricing, and anywhere numbers need to line up. Sizes, weights, and spacing below are read live from @elirobinson/tokens/tokens.css.

Families

TokenValue
--font-sans'Geist', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif
--font-display'Geist', ui-sans-serif, system-ui, -apple-system, sans-serif
--font-mono'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace

Geist covers Latin, Latin-Extended, Cyrillic, and Greek. The package currently loads both families from Google Fonts via @import — the stylesheet's own comment flags this as a placeholder: if you have licensed .woff2 files, self-host them and replace the import.

The scale

A perfect-fourth-ish ramp on a 16px base. Body text never goes below --fs-md — the smaller steps are for captions, eyebrows, and metadata, not paragraphs.

--fs-8xl112px

Practical tech, honestly built.

--fs-7xl84px

Practical tech, honestly built.

--fs-6xl64px

Practical tech, honestly built.

--fs-5xl48px

Practical tech, honestly built.

--fs-4xl38px

Practical tech, honestly built.

--fs-3xl30px

Practical tech, honestly built.

--fs-2xl24px

Practical tech, honestly built.

--fs-xl20px

Practical tech, honestly built.

--fs-lg18px

Practical tech, honestly built.

--fs-md16px

Practical tech, honestly built.

--fs-sm14px

Practical tech, honestly built.

--fs-xs12px

Practical tech, honestly built.

--fs-2xs11px

Practical tech, honestly built.

--fs-3xs10px

Practical tech, honestly built.

Weights

400 for body, 500 for UI labels, 600 for headings, 700+ for display peaks. Light (300) exists but earns its place rarely.

TokenValue
--fw-light300
--fw-regular400
--fw-medium500
--fw-semibold600
--fw-bold700
--fw-black800

Line height

Body text sits at 1.65 — relaxed and forgiving on purpose; accessibility-first beats dense. Display type tightens to 1.05.

TokenValue
--lh-tight1.05
--lh-snug1.2
--lh-normal1.5
--lh-relaxed1.65

Tracking

Display sizes tighten (−0.025em), body stays neutral, and mono eyebrows open up (+0.08em, uppercase).

TokenValue
--tr-tight-0.025em
--tr-snug-0.015em
--tr-normal0em
--tr-wide0.04em
--tr-caps0.08em

Rules that keep it coherent

  • Sentence case for headings. Title Case is reserved for product names and the tagline.
  • Mono for numbers that compare — tables, pricing, stats — with tabular figures.
  • clamp() for display sizes so long translations don't break layouts (the t-display-* classes in tokens.css already do this).
  • Never justify text. Left-aligned, ragged right.