Skip to content

Typography

Human uses a dual-typeface system: Avenir for interface text and Geist Mono for code. The type scale follows a modular progression optimized for readability at every size.

Avenir Next is the primary typeface across all surfaces — web, iOS, Android, and documentation. It provides clean, geometric letterforms with excellent readability at small sizes.

Font stack: 'Avenir Next', 'Avenir', system-ui, -apple-system, sans-serif

Geist Mono is used for code blocks, terminal output, and monospaced content. It features programming ligatures and clear distinction between similar characters (0/O, 1/l/I).

Font stack: 'Geist Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', monospace

| Token | Size | Line Height | Weight | Usage | | ----------- | --------------- | :---------: | :----: | ---------------------------- | | text.xs | 12px (0.75rem) | 1.5 | 400 | Captions, badges, metadata | | text.sm | 14px (0.875rem) | 1.5 | 400 | Secondary text, table cells | | text.base | 16px (1rem) | 1.6 | 400 | Body text, form inputs | | text.lg | 18px (1.125rem) | 1.5 | 500 | Subtitles, emphasized body | | text.xl | 20px (1.25rem) | 1.4 | 600 | Card titles, section headers | | text.2xl | 24px (1.5rem) | 1.3 | 600 | Page section titles | | text.3xl | 30px (1.875rem) | 1.25 | 700 | Page titles | | text.4xl | 36px (2.25rem) | 1.2 | 700 | Hero subtitles | | text.5xl | 48px (3rem) | 1.1 | 700 | Hero headlines |

| Token | Value | Usage | | ----------------- | :---: | -------------------------- | | weight.regular | 400 | Body text, descriptions | | weight.medium | 500 | Emphasized body, labels | | weight.semibold | 600 | Titles, buttons, nav items | | weight.bold | 700 | Headlines, strong emphasis |

| Token | Value | Usage | | ----------------- | ---------- | ----------------------- | | tracking.tight | -0.025em | Headlines, display text | | tracking.normal | 0em | Body text | | tracking.wide | 0.05em | All-caps labels, badges |

h1 {
font-size: var(--hu-text-3xl);
font-weight: var(--hu-weight-bold);
letter-spacing: var(--hu-tracking-tight);
}
h2 {
font-size: var(--hu-text-2xl);
font-weight: var(--hu-weight-semibold);
}
h3 {
font-size: var(--hu-text-xl);
font-weight: var(--hu-weight-semibold);
}
p {
font-size: var(--hu-text-base);
line-height: 1.6;
color: var(--hu-text);
}
.secondary {
font-size: var(--hu-text-sm);
color: var(--hu-text-muted);
}
code {
font-family: var(--hu-font-mono);
font-size: var(--hu-text-sm);
}
pre code {
font-size: var(--hu-text-xs);
line-height: 1.6;
}

| CSS Variable | Swift | Kotlin | C | | ---------------------- | ------------------------------- | ---------------------- | --------------- | | --hu-text-base | HUTokens.textBase | HUTokens.textBase | N/A (terminal) | | --hu-weight-semibold | .semibold | FontWeight.SemiBold | HU_COLOR_BOLD | | --hu-font-mono | Font.custom("GeistMono", ...) | FontFamily.Monospace | N/A |

  • Minimum body text size is 16px (1rem) for comfortable reading
  • Line heights are tuned per size — larger text uses tighter leading
  • letter-spacing: var(--hu-tracking-wide) is applied to all-caps text for legibility
  • Font weight never drops below 400 for body text