Skip to content

Typography

FieldValue
TypeSkill Resource
Source~/.copilot/skills/design/references/typography.md
DescriptionNot specified

Source Content

Typography

Source of truth: src/index.css :root block and @layer components. Canonical decision: ADR-003.

Root font size

html { font-size: 87.5%; } /* = 14px base — all rem tokens scale from here */

All rem values below are calculated against this 14px base.

Type scale

TokenCSS var (size)rempxLine-heightUse
label--ui-type-label-size0.6875rem11px1rem (16px)Uppercase column headers, table labels
body-xs--ui-type-body-xs-size0.75rem12px1rem (16px)Captions, metadata, fine print
body-sm--ui-type-body-sm-size0.875rem14px1.25rem (20px)Supporting text, form help
body--ui-type-body-size0.9375rem15px1.5rem (24px)Base body — default for <body>
title-sm--ui-type-title-sm-size1rem16px1.375rem (22px)Section labels, card titles
title-md--ui-type-title-md-sizeclamp(17–18px)17–18px1.4Page sub-headings
title-lg--ui-type-title-lg-sizeclamp(19–21px)19–21px1.35Section headings
title-xl--ui-type-title-xl-sizeclamp(21–26px)21–26px1.2Page-level headings
display--ui-type-display-sizeclamp(28–36px)28–36px1.05Hero / display text
value-md--ui-type-value-md-sizeclamp(18–22px)18–22px1.1Numeric data values
value-lg--ui-type-value-lg-sizeclamp(22–30px)22–30px-Large metric values

Component utility classes (.ui-type-*)

Apply via className="ui-type-body-sm" etc. These are defined in @layer components and include font-family, size, line-height, weight, and letter-spacing — prefer them over raw Tailwind text sizes because they carry the correct line-height and letter-spacing together.

ClassFamilyWeightLetter-spacing
.ui-type-labelbody6000.08em (uppercase — column headers, not eyebrows)
.ui-type-body-xs / .ui-type-body-sm / .ui-type-bodybody400-
.ui-type-title-smsystem600-0.02em
.ui-type-title-mdsystem600-0.02em
.ui-type-title-lgsystem600-0.025em
.ui-type-title-xlsystem600-0.03em
.ui-type-displaysystem600-0.04em
.ui-type-value-mdsystem600-0.03em

Tailwind shortcuts

text-xs → 12px (body-xs approximate)
text-sm → 14px (body-sm approximate)
text-base → 16px (title-sm approximate)

For exact values, use the .ui-type-* classes or inline CSS vars directly.

Font families — system stack only (ADR-003)

--font-family: -apple-system, "Segoe UI", system-ui, sans-serif;

The only font family is the system UI stack — no web fonts. Do not load or apply Fraunces, Source Sans 3, Inter, Roboto, or Arial. font-sans / font-body / font-serif all resolve to it; h1h6 and <body> all inherit the same stack. Hierarchy comes from the type scale (size + weight): titles are font-semibold at the larger ui-type-title-* sizes; body is font-normal. No display typeface.

scripts/lint_tokens.sh flags any reference to a non-system font family (Fraunces, Source Sans, Inter, Roboto, Arial) in .tsx/.jsx/.ts/.css files.

Eyebrow label pattern

Category labels above a title — distinct from .ui-type-label (wider tracking):

<span className="font-body text-[10px] font-semibold uppercase tracking-[0.28em] text-muted-foreground">
Category name
</span>

Font weights in use

TailwindWeightContexts
font-normal400Body text, descriptions
font-medium500Subtle emphasis, form labels
font-semibold600All titles, badges, labels
font-bold700Strong emphasis only — sparingly

At print time, map px to points: 1pt = 1.333px.

RolePrint size
Body copy9–11pt (~12–15px)
Headings12–14pt (~16–19px)
Captions8pt (~11px)

See css/print-and-legal.md for the full print pipeline.