Puts one number in front of the reader at h2 size, with what it counts underneath, so a claim rests on a figure.

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

Do and don't

Do: A cited figure

Rendered by stat.ts

Open example: Stat · Do: A cited figure Use the full-page example to follow page links.

Number, meaning and source together.

Do: Our own count

Rendered by stat.ts

Open example: Stat · Do: Our own count Use the full-page example to follow page links.

A measured fact about the product.

Don't: An unsourced multiplier

Rendered by stat.ts

Open example: Stat · Don't: An unsourced multiplier Use the full-page example to follow page links.

Not measured, so not allowed.

Don't: A number without a unit

Rendered by stat.ts

Open example: Stat · Don't: A number without a unit Use the full-page example to follow page links.

The reader cannot tell what it counts.

Rules

RuleWhyCheck
Every stat is our own measured output or carries its source.Numbers are the site's evidence; an unsourced one undermines all the others.Automated: site-claims test (numbers in copy match the register)
Every value has a label.A bare number means nothing.Automated: tests/unit/site-system.test.ts

API

PropTypeRequiredDefaultWhat it does
valuestringYesThe figure, with its unit.
labelstringYesWhat it counts, in plain words.
sourcehtmlNoThe source, when the figure is cited.

Contract details

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

Identity

AspectValue
Idstat
LayerMolecules
Categorydata
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/molecules/stat.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26A big number with its label and, when cited, its source.

Use when

  • A measured or published figure supports the argument. Why: One clear number persuades more than a paragraph.
  • Before-and-after or counts in a proof. Why: Numbers side by side compare at a glance.

Do not use when

  • For a number that is not measured or sourced. Why: Big invented numbers are exactly what the truthfulness rule forbids.
  • More than four in a row. Why: Beyond four the eye stops comparing.

Anatomy

PartWhat it is
rootdiv.stat
valueb: the number, tabular figures.
labelspan: what it counts.
sourceCaption atom: where it comes from.

Made of: text, caption, tokens:type.

Used in: conversations, drift-palette, first-90, ops-board, proof-shift, score-us, takenote-card.

Variants

VariantWhenWhy
plainOur own measured output.The label says what was measured.
citedA third-party figure.The source must be next to the number.

States

StateRendered or not applicable
defaultdefault
hoverNot applicable: A stat is not interactive, so it has no hover state.
focus-visibleNot applicable: A stat does not take focus; links and buttons inside it carry their own focus ring.
activeNot applicable: A stat cannot be pressed.
disabledNot applicable: A stat has nothing to disable.
loadingNot applicable: A stat is rendered at build time and is complete when the page loads.
emptyNot applicable: A stat is not rendered without content; the builder skips it.
errorNot applicable: A stat shows no data that can fail.
currentNot applicable: A stat has no current item.
visitedNot applicable: A stat is not a link.
expandedNot applicable: A stat does not open or close.

Tokens

PartToken
value.font--type-h2, tabular-nums
label.font--type-small
label.color--ink-2
--stat-gap-space-2var(--space-2)
--stat-font-type-h2var(--type-h2)
--stat-letter-spacing-ls-h2var(--ls-h2)
--stat-font-type-smallvar(--type-small)
--stat-color-ink-2var(--ink-2)

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; rows of stats wrap to two columns on phones.
wrappingThe value never wraps; the label wraps.
textExpansionJapanese labels wrap under the value.

Spacing and rhythm

AspectValue
internal--space-2 between value and label.
externalGap from its grid (--grid-gap).
rhythmInside a section's figure area.

Motion

AspectValue
NoneNumbers do not count up; an animated figure delays the fact.

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
rolegroup of text
nameValue then label
keyboardNot interactive.
focusNot focusable.
screenReaderReads the number, then what it counts.
contrastInk on cotton 15.9:1.
targetNot a target.

Content

SlotLengthVoice
value6 charactersThe number and unit
label10 wordsWhat it counts, plain

Good: “16% of design systems are run by one person.”

Bad: “10x faster”

Japanese: Text comes from the page content; Japanese strings are reviewed per page (apps/showcase/site/loom/locales). Awaiting native review, as the banner on every Japanese page says.

Icons and illustrations

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

Decisions and exceptions

Usage

118 uses across the built pages (measured by npm run site:system).

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.