FORK

Typography

Three font families with strict roles — display, body, and mono

Display / Besley

Besley
Google Fonts / Variable / Display & Titles
XL Title 2
The quick brown
42px Bold
XL Title
The quick brown fox
36px Bold
Large Title
The quick brown fox
34px Bold
Title 1
The quick brown fox jumps
28px Bold
Title 2
The quick brown fox jumps over
22px Semi
Title 3
The quick brown fox jumps over the lazy dog
20px Semi
Headline
The quick brown fox jumps over the lazy dog nearby
17px Semi
Token All Size Weight Web line-height Notes
xlTitle2427001.15iOS 17+ only (extraLargeTitle2)
xlTitle367001.15iOS 17+ only (extraLargeTitle)
largeTitle347001.18Web: use for hero/page headers. Consider clamp(28px, 4vw, 34px) for fluid sizing
title1287001.21
title2226001.27
title3206001.3
headline176001.35
When to use
  • XL Title 2/Hero moments, splash screens, marketing surfaces
  • XL Title/Feature headers, onboarding screens, prominent section openers
  • Large Title/Top-level navigation titles. iOS Maps to UINavigationBar large title. Android Maps to TopAppBar large title in Material3. Web Use fluid sizing with clamp() for responsive
  • Title 1–3/Section headers, card titles, detail screen headers
  • Headline/Emphasized inline text, list item titles with serif character
  • Display sizes/Same px values on all platforms. Display sizes are large enough that 1pt/1px difference is negligible.
Platform notes
  • iOS Uses Bespoke Serif (bundled) as the native equivalent. Registered via CTFontManagerRegisterFontsForURL. Maps to UIFont.bespokeSerif(ofSize:weight:).
  • Android Bundle Besley in res/font/. In Compose use FontFamily(Font(R.font.besley_bold)). Do not use Google Fonts runtime download — bundle for offline consistency.
  • Android Use sp (scale-independent pixels) for all display sizes. Values map 1:1 from the type scale tokens. Respect user font size accessibility settings.
  • Web Besley loaded via Google Fonts (variable, 400–900). For hero/page headers consider clamp(28px, 4vw, 34px) for fluid sizing on responsive layouts.
  • All Display sizes (42–17px) use identical values on all platforms. At these sizes, the 1pt/1px difference is negligible.

Body / Figtree

Figtree
Google Fonts / Variable / UI text, forms, lists, captions
Body
The quick brown fox jumps over the lazy dog. Typography is the craft of endowing human language with a durable visual form.
18px Regular
Body Semi
The quick brown fox jumps over the lazy dog. Emphasis within running text.
18px Semi
Callout
The quick brown fox jumps over the lazy dog. Secondary body text for supporting paragraphs.
17px Regular
Subheadline
The quick brown fox jumps over the lazy dog. Subtitles and descriptions below headings.
16px Regular
Footnote
The quick brown fox jumps over the lazy dog. Timestamps, attributions, and fine print that supports without competing.
14px Regular
Caption 1
The quick brown fox jumps over the lazy dog. Image captions, table annotations, small metadata.
13px Regular
Caption 2
The quick brown fox jumps over the lazy dog. The smallest readable text — legal disclaimers, version numbers.
12px Regular
Token iOS Size Android Size Web Size Weight Web line-height Web letter-spacing
body17pt18sp18px4001.6normal
bodySemi17pt18sp18px6001.6normal
callout16pt17sp17px4001.5normal
subheadline15pt16sp16px4001.5+0.01em
footnote13pt14sp14px4001.45+0.01em
caption112pt13sp13px4001.4+0.01em
caption211pt12sp12px4001.35+0.02em
When to use
  • Body/Primary UI text, form fields, list items, chat messages
  • Callout/Secondary content blocks, card descriptions, tooltips
  • Subheadline/Subtitles below headings, list item descriptions
  • Footnote/Timestamps, attributions, supplementary info
  • Caption 1–2/Image captions, legal text, version numbers, tab bar labels
Platform notes
  • Web Body text is 18px (vs 17pt iOS). Web rendering at 1x displays lacks Retina sharpness — the extra pixel improves readability.
  • Web Caption2 is 12px minimum (vs 11pt iOS). Below 12px text becomes illegible on non-Retina screens. Accessibility guideline.
  • Web Small sizes (footnote, caption) get +0.01em letter-spacing. Figtree's tracking at small sizes benefits from — slight loosening helps on screen.
  • Web Always set explicit line-height. iOS derives it from font metrics automatically; browsers use a default ~1.2 which is too tight for body text.
  • iOS Uses UIFont.satoshi(ofSize:weight:) with variable font wght axis. Registration via CTFontManagerRegisterFontsForURL.
  • Android Bundle Figtree in res/font/. In Compose use FontFamily(Font(R.font.figtree_variable)). Do not use Google Fonts runtime download — bundle for offline consistency.
  • Android Use sp for font sizes — values map 1:1 from the type scale tokens. Use Web column sizes (18sp body, 12sp caption2 minimum) rather than iOS pt values.
  • Android Line height in Compose: specify as (fontSize * lineHeightMultiplier).sp using the Web line-height column values. In XML use android:lineSpacingMultiplier.
  • Android Letter spacing in Compose is in em units (same as Web). In XML use android:letterSpacing (also in em). Use the Web letter-spacing column values.
  • Web Load via Google Fonts or self-host .woff2. Variable font: single @font-face with font-weight: 300 700.

Mono / IBM Plex

IBM Plex Mono
Google Fonts / Technical UI, code, data
Code
let configuration = URLSessionConfiguration.default
14 / 21 Regular
Label
Section Label · 2 items · Updated 3m ago
11 / 15 Semi uc
Data
1,247 messages · 98.6% uptime · 340ms p99
13 / 18 Semi tab
When to use
  • Code/Inline code, API responses, terminal output
  • Label/Section headers, metadata, navigation breadcrumbs — uppercase + tracking
  • Data/Counters, stats, tabular numbers — Web use font-variant-numeric: tabular-nums for column alignment. Android use fontFeatureSettings = "tnum" in Compose
Platform notes
  • All Same sizes on all platforms — monospace is rendered consistently across iOS, Android, and web.
  • Web Load via Google Fonts: family=IBM+Plex+Mono:wght@400;600. Only 400 and 600 weights needed.
  • iOS Bundled as static .ttf (Regular + SemiBold). Loaded via Font.Family.ibmPlexMono.
  • Android Bundle IBM Plex Mono in res/font/ (Regular + SemiBold .ttf). In Compose use FontFamily(Font(R.font.ibm_plex_mono_regular)). Do not use Google Fonts runtime download.
  • Android Use sp for all mono sizes. For tabular number alignment in Compose, use fontFeatureSettings = "tnum".