Three faces (Archivo for display, Atkinson Hyperlegible Next for text, Martian Mono for figures), six sizes and one role per use, plus a Japanese display face.

Foundation · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Reference

Source reference; not an executed check.

display
font.family.stack.display
text
font.family.stack.interface
mono
font.family.stack.figure
displayJa
font.family.stack.display-japanese
sample
font.family.stack.latin
--fs-display
h1, the landing headline
--fs-h2
h2, field verbs, big numbers, long h1s
--fs-h3
h3, card titles, the lede
--fs-body
running text, buttons, inputs
--fs-small
captions, sources, secondary lines, dense UI
--fs-label
measured values: figure keys, token names, scores beside a swatch

Do and don't

2 positive / 2 negative authored documentation examples (2 each required); 1 reference (1 required); 0 failed. References and failures do not count; this is not behavior acceptance.

Do: A compact visual role keeps its semantic level

Authored by type.ts

Rendered consumer example; not an executed correctness check. heading Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Type · Do: A compact visual role keeps its semantic level Use the full-page example to follow page links.

The actual native h2 uses an existing compact visual size without becoming a skipped or decorative heading level.

Do: Running text uses the reading role

Authored by type.ts

Rendered consumer example; not an executed correctness check. text Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Type · Do: Running text uses the reading role Use the full-page example to follow page links.

The native paragraph uses the existing running-text family and rhythm; the reference font paths are not mistaken for a rendered type sample.

Don't: Display typography overwhelms a section

Authored by type.ts

Rendered misuse illustration; not an executed correctness check. heading Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Type · Don't: Display typography overwhelms a section Use the full-page example to follow page links.

The actual renderer permits this display-sized section heading, but its visual role breaks the section hierarchy. Short words keep this misuse inspectable without relying on clipped text; it is not a rejected input or an accepted layout.

Don't: A seventh local type size bypasses the scale

Authored by type.ts

Rule illustration; not an executed check. type / type.six

.local-section-heading { font-size: 37px; }
A raw local size is introduced rather than an existing semantic type role.
A one-off size erodes the recorded scale; this source illustration neither edits the type values nor executes the brand gate.

Rules

RuleWhyCheck
Six sizes, no more.A small scale makes hierarchy legible at a glance.Automated: scripts/site/check-brand.ts (font-size only from --fs-* and --type-*)
Headings break between whole words (and between phrases in Japanese), never inside a word.A broken word in a display heading looks like an error (D-SITE-015).Automated: tests/site (overflow spec at 390 px) and jaBreaks
Running text uses Atkinson Hyperlegible Next.Chosen for low-vision readability.Review: Owner

API

No props.

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idtype
LayerFoundations
Categoryfoundation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/foundations/type.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Type as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Any text. Why: Six sizes and fixed roles keep hierarchy obvious.

Do not use when

  • To add a seventh size for one element. Why: Every new size weakens the hierarchy.

Anatomy

PartWhat it is
familiesFAMILY in brand.ts
sizesSIZE: display, h2, h3, body, small, label
rolesTYPE: display, h1, h2, h3, lede, body, strong, small, small-strong, label, figure

Made of: nothing (a base element).

Used in: library-overview.

Variants

VariantWhenWhy
light and darkEvery page, following the reader's setting.The same roles resolve to light or dark values, so no element chooses its own.

States

StateRendered or not applicable
defaultThe specimen.
hoverNot applicable: A foundation is not interactive.
focus-visibleNot applicable: Not focusable.
activeNot applicable: Not interactive.
disabledNot applicable: Nothing to disable.
loadingNot applicable: Values are built into the stylesheet.
emptyNot applicable: The build fails if a value is missing.
errorNot applicable: Unresolved values fail the brand gate, not the reader.
currentNot applicable: No current item.
visitedNot applicable: Not a link.
expandedNot applicable: Does not open.

Tokens

PartToken
--type-displaydisplay · display
--type-h1display · display
--type-h2h2 · display
--type-h3h3 · display
--type-ledeh3 · text
--type-bodybody · text
--type-strongbody · text
--type-smallsmall · text
--type-small-strongsmall · text
--type-labellabel · mono
--type-figuresmall · mono

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingText wraps; nothing scrolls sideways.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalNot applicable: a foundation has no box of its own.
externalNot applicable.
rhythmApplies to every element that reads it.

Motion

AspectValue
NoneA foundation does not move.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
roleNot rendered on the site; its specimen in the Library is a list
nameThe foundation's name
keyboardNot interactive.
focusNot focusable.
screenReaderThe specimen is a plain list of names and values.
contrastEvery text and ground pair in the palette is checked (check-brand).
targetNot a target.

Content

SlotLengthVoice
headings (Heading / consuming page)Heading declares display six words, h2 twelve words and h3 eight words; the consuming page owns its exact titleUse sentence case and a clear claim or plain name. Preserve the semantic heading level when choosing an existing visual size; cut words before shrinking type.
running text and measured valuesThe consuming body, caption or data contract's budgetUse Atkinson for running text and Martian Mono for actual values, token names and code. A mono face is not permission to add decorative labels or capitals.

Good: “The next level of your design system. (Heading's positive wording)” · “--type-h2 (a technical token name, not a decorative label)”

Bad: “OVERVIEW (Heading's rejected capitals)” · “Introducing our innovative solution (Heading's rejected wording)”

Japanese: Japanese headings use Loom JP Display (Noto Sans JP Black, subset) when enabled; phrase breaks come from jaBreaks. Preserve Japanese punctuation and whole phrases, with no negative tracking or forced English-style spaces. Keep code identifiers unchanged and the native-review-pending note; typography guidance is not completed Japanese acceptance.

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

Usage

427 owned-class occurrences in built pages plus metadata-token references in built CSS (measured by npm run site:system).

No application mechanism is declared.

Current check result: not assessed by this report. Declarations and source-file presence do not establish executed enforcement or accepted coverage.

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.