Files
ADS3-Design-System/plans/typography.md

3.9 KiB
Raw Blame History

Typography System Plan

What we're building

A complete typography token set for the design system, sourced from the NSW Design System style guide (desktop, >= 960px), expanded with missing styles for a well-balanced type system.

Font Family

Public Sans — the NSW Government typeface. Self-hosted via @fontsource-variable/public-sans (weights 100900, normal + italic).

Fallback stack: 'Public Sans', system-ui, sans-serif

Typography Scale

From the style guide (12 styles)

Style Class Weight Size Line Height Notes
Heading 1 text-h1 700 48px 1.25
Heading 2 text-h2 700 32px 1.25
Heading 3 text-h3 700 24px 1.333
Heading 4 text-h4 700 20px 1.4
Heading 5 text-h5 700 16px 1.5
Intro text-intro 400 20px 1.4 Lead paragraph
Body Strong text-body-strong 700 16px 1.5
Body text-body 400 16px 1.5
Small Strong text-small-strong 700 14px 1.357
Small text-small 400 14px 1.357
Body Link text-body-link 700 16px 1.5 Underlined, Blue 02
Small Link text-small-link 700 14px 1.357 Underlined, Blue 02

New additions (4 styles)

Style Class Weight Size Line Height Rationale
Heading 6 text-h6 700 14px 1.43 Completes heading hierarchy; same size as Small but bold, sits between H5 and body
Label text-label 500 14px 1.43 Form labels — medium weight distinguishes from body text without being as heavy as bold. The user called this out as missing
Caption text-caption 400 12px 1.5 Metadata, timestamps, helper text. Introduces 12px to the scale
Overline text-overline 700 12px 1.5 Category tags, section labels. Uppercase + 0.05em letter-spacing

Total: 16 styles

Size scale summary

48 → 32 → 24 → 20 → 16 → 14 → 12 (px)

Implementation

1. tokens.css — Add to @theme block

  • --font-sans for the font family
  • --text-{name} + --text-{name}--line-height for each size/line-height pair (Tailwind v4 convention — gives us text-h1, text-body, etc. utilities automatically)
  • Font weights don't need custom tokens — Tailwind's built-in font-normal (400), font-medium (500), font-bold (700) cover our needs

2. typography.css — Composed utility classes

Create src/tokens/typography.css with @utility directives for styles that combine multiple properties:

  • text-body-strong, text-small-strong (size + weight)
  • text-body-link, text-small-link (size + weight + underline + colour)
  • text-overline (size + weight + uppercase + letter-spacing)
  • text-label (size + weight)

This keeps the @theme block as raw tokens and the utilities as compositions.

3. Load Public Sans

Add Google Fonts import to index.html or src/index.css. Google Fonts is fine for dev; can revisit self-hosting later if needed for production/privacy.

4. Figma — Typography styles

Create typography styles in the Figma design file via MCP so designers can apply them from the styles panel.

Key decisions

  • Public Sans via Google Fonts — simplest path; the font is open source (OFL) so self-hosting later is trivial.
  • Tailwind v4 --text-* naming — gives us free utility classes. Composed styles go in a separate file to keep tokens.css clean.
  • No text-xs/text-sm/text-lg scale aliases — the semantic names (text-body, text-caption) are clearer for a design system. Tailwind defaults still work if needed.
  • Medium (500) for Label — distinguishes from Regular body text without being as heavy as Bold headings. Common pattern in Material Design, Atlassian DS, etc.

Questions for Richie

  1. Font loading: Google Fonts import in index.html, or self-host from the start?
  2. Does this expanded set look right? Any styles you want to add or remove?