Typography
Graphite’s type scale is the kit’s Graphite Typography collection, emitted as CSS variables in rem. Twenty-nine steps, each a size and a line height, set in three families at four weights. Every value on this page is read from the stylesheet when the page is built, and every sample is set with the variable it names.
Type scale
Eight ladders. Heading is the editorial scale and runs large; title is the UI scale. A component-level heading is a UI title, so it maps to title/*, not to the heading of the same number.
Display
- One source color, every role resolved
Heading: the editorial ladder
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
Title: the UI ladder
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
Body
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
Component
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
Footnote
- One source color, every role resolved
Caption
- One source color, every role resolved
- One source color, every role resolved
Code
- var(--graphite-text-code-1-size)
- var(--graphite-text-code-2-size)
- var(--graphite-text-code-3-size)
Sizes and line heights are the kit’s px divided by 16. The px shown is for reading; the stylesheet stays in rem so type answers to a reader who has turned their font size up. Values in the primary role are the Mobile override.
Desktop and Mobile
The kit has two modes. Fifteen of the twenty-nine steps change between them; the other fourteen are stated once and never restated.
| Step | Desktop | Mobile |
|---|---|---|
| display-1 | 96px / 120px | 64px / 80px |
| heading-1 | 64px / 80px | 48px / 56px |
| heading-2 | 56px / 72px | 40px / 48px |
| heading-3 | 48px / 64px | 32px / 40px |
| heading-4 | 40px / 48px | 28px / 32px |
| heading-5 | 32px / 40px | 24px / 32px |
| heading-6 | 24px / 32px | 18px / 28px |
| title-1 | 32px / 40px | 24px / 32px |
| title-2 | 24px / 32px | 18px / 28px |
| title-3 | 18px / 28px | 16px / 24px |
| title-4 | 16px / 24px | 14px / 20px |
| title-5 | 14px / 20px | 13px / 16px |
| body-1 | 18px / 28px | 16px / 24px |
| body-2 | 16px / 24px | 14px / 20px |
| body-3 | 14px / 20px | 13px / 16px |
Mobile applies below 672px. The kit does not say where its two modes divide, so the stylesheet reuses the boundary the rest of the site already uses, one pixel below md. It is stated in one place, so if it is wrong it is wrong once.
Families
Three family tokens. Two of them hold the same face today and are still two tokens, because the kit gives them distinct roles.
--graphite-font-1'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serifDisplay, headings and titles 1-2. IBM Plex Sans.
--graphite-font-2'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serifTitles 3-5, body and component text. IBM Plex Sans.
--graphite-font-mono'IBM Plex Mono', ui-monospace, 'SFMono-Regular', Menlo, Consolas, 'Liberation Mono', monospaceCode and technical values. IBM Plex Mono.
Weights
The kit stores Figma style names; CSS needs numbers. The mapping happens once, at the token, rather than at every call site.
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
- One source color, every role resolved
How components use it
The Typography component is the scale’s main consumer. Its seven variants bind to the title ladder, and only display reaches into the heading ladder.
| Variant | Tag | Step | Family | Sample |
|---|---|---|---|---|
| display | h1 | heading-3 | font-1 | One source color, every role resolved |
| heading-1 | h1 | title-1 | font-1 | One source color, every role resolved |
| heading-2 | h2 | title-2 | font-1 | One source color, every role resolved |
| heading-3 | h3 | title-3 | font-2 | One source color, every role resolved |
| heading-4 | h4 | title-4 | font-2 | One source color, every role resolved |
| body | p | body-2 | font-2 | One source color, every role resolved |
| caption | span | caption-1 | font-2 | One source color, every role resolved |
The tag is structure, not size: heading-2 renders an h2 whatever it looks like, and skipping a level is the page composer’s error to avoid.
| Component | Steps read | Literal sizes |
|---|---|---|
| accordion | body-3 | none |
| breadcrumb | body-3 | none |
| button-group | none | none |
| button | none | 0.75rem, 0.875rem, 1rem |
| checkbox-group | none | 0.75rem |
| checkbox | body-3 | 0.75rem |
| contained-list | body-3 | 0.75rem |
| data-table | body-3 | none |
| date-picker | title-5, body-3 | 0.75rem |
| dropdown | body-3 | 0.75rem |
| file-uploader | body-3 | 0.75rem |
| link | body-2, body-3, caption-1 | none |
| menu-button | none | none |
| menu | body-3 | none |
| modal | body-1, body-3 | 0.75rem |
| navigation-menu | none | none |
| notification | body-3 | none |
| number-input | none | none |
| pagination | body-3 | none |
| password-input | none | none |
| popover | none | none |
| progress-bar | body-3 | 0.75rem |
| radio-button-group | body-3 | 0.75rem |
| search | none | 0.75rem |
| select | none | 0.75rem |
| slider | body-3, caption-1 | 0.75rem |
| tabs | body-3 | 0.75rem |
| tag | caption-1 | none |
| text-area | none | 0.75rem |
| text-input | none | 0.75rem |
| time-picker | caption-1 | 0.75rem |
| toast | body-3 | none |
| toggle | body-3 | 0.75rem |
| tooltip | none | 0.75rem |
| tree-view | body-3 | none |
| typography | heading-3, title-1, title-2, title-3, title-4, body-2, caption-1 | none |
Letter-spacing has no token: the kit does not model it.
Rules
From the typography foundation contract, version 1.1.1.
Do
- The kit keeps two ladders. heading/* is the editorial scale and runs to 64px; title/* is the UI scale. A component-level heading is a UI title: map it to title/*, not to the heading of the same number.
- font-1 and font-2 hold the same family today and are still two tokens. They are distinct roles, per the kit's own descriptions, so the pair can diverge without a rename sweep.
- 15 of the 29 steps change between Desktop and Mobile. The other 14 are restated nowhere; a step with identical modes must not carry an override.
Don’t
- Do not feed --graphite-text-weight-* back to Figma. The kit stores style names, and the Plugin API's string for this face is "Semi Bold" with a space, not the "SemiBold" the kit uses.
- Do not convert sizes to px. Type is the case where answering to the reader's root font size matters most.
- Do not collapse font-1 and font-2 because they are equal today.
Next steps
- Typography component
The variants, their tags and the heading-level rule, rendered live.
- Tokens
Every variable Graphite exposes, type included, and how to export them.
- Spacing
The other rem scale, read from the same stylesheet.
