xs/sm/md ladder. Font size is a continuous function: a base size raised to a power of a computed ratio, where the exponent comes from the element’s text role and the ratio itself responds to the user’s typeScaleFactor preference at runtime.
The computed scale
The root of the system is one expression, fromgenerated/global/css/tokens.gen.css:
--scale-ratiois the brand’s modular ratio (typography.scale-ratio; the demo brands ship values from 1.2 to 1.25).--type-scale-factoris the user’s continuous type-scale preference (0.9 → 1.4, default 1).
--font-size-base comes from typography.base-font-size — a rem number (every bundled demo brand uses 1). Sizes are quantized to --font-size-quantum (0.25rem) so computed values land on a tidy grid.
Text roles
The exponent (--_font-scale) comes from semantic text roles, not size names. The shipped roles and their fractional exponents:
Fractional exponents are the point: a discrete integer ladder could never express
caption at −0.75 steps. Roles also carry role-specific APCA foregrounds (--ucs-{intent}-fg-l-{role}) because contrast targets depend on rendered size and weight.
Font families
Three stacks, fromtypography.heading-family, body-family, and optional mono-family:
There is no
--font-sans and no font: config block.
Density and contrast coupling
Typography participates in the continuous system twice more:typography.densitysuppliesfont-size-kandfont-weight-kcoefficients so type can respond to the user’s density preference.--weight-bumpadds font weight when--contrast-factorclimbs past 1.2 — high-contrast users get sturdier strokes, not just darker ink:
Fluid typography
Per-brand fluid behavior lives intypography.fluid (rate, optional floor, ceiling, quantum), with per-role envelopes in the generated text-role metrics. There is no top-level viewport config block.
Config: Typography
How to author the typography section of a brand config.