Expand description
TypeScale::neutral: the design-language-free type-scale progression —
15 named frust_text::TextStyle presets plus 15 _emphasized siblings
(see “Emphasized type scale” below).
This crate constructs no other TypeScale — a design system builds its
own from its own plugin crate (frust-material’s tokens module carries
the Material 3 mapping this table’s numeric progression originates from,
citations included; frust-cupertino’s carries the Cupertino/SF Pro
mapping). The numeric progression below is duplicated into
frust-material deliberately: a type scale (a
size/weight/tracking/line-height ladder) isn’t a branded design-system
artifact the way a named font face is, so TypeScale::neutral reuses
the identical numbers rather than inventing an unbranded ladder — only
family differs (see that constructor’s doc comment).
Source for the numbers themselves: Material 3’s type-scale tokens
(https://m3.material.io/styles/typography/type-scale-tokens, verified
2026-07-17). Sizes are specified in sp; Frust treats sp and logical px 1:1
(see frust-text’s scale). Line heights are absolute logical pixels
(LineHeight::Absolute, not a font-size-relative ratio) — M3 publishes
them as fixed px values per token, not a ratio. Letter spacing is in
logical pixels; displayLarge’s spacing is negative (tighter tracking at
very large sizes).
titleLarge is weight 400 (Regular) per m3.material.io; a secondary
source claims 500 — this module follows m3.material.io as the primary,
more authoritative source.
§Emphasized type scale
TypeScale additionally carries 15 _emphasized variants (one per
baseline role, 30 slots total), filled by TypeScale::neutral alongside
the baseline 15 (frust-material/frust-cupertino’s own constructors do
the same for their own baselines).
Role-count resolution: an earlier belief that emphasized variants were
“15 baseline + 15 emphasized (30 total), applied to Display/Headline/Title
roles” was contested — the “30 total” count was right but the
“Display/Headline/Title only” scope was wrong. Verified directly against
the primary source: Jetpack Compose Material3’s generated token file
(androidx.compose.material3.tokens.TypographyTokens/TypeScaleTokens,
VERSION: v0_103,
https://github.com/androidx/androidx/blob/androidx-main/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScaleTokens.kt
— Compose’s Typography class doc comments enumerate an
*Emphasized property for all 15 baseline roles: displayLarge
through labelSmall, not a Display/Headline/Title-only subset;
retrieved/verified 2026-07-18). This module follows that: every one of
the 15 baseline roles gets an emphasized sibling.
M3 deltas (from the same source): size and line height are unchanged
between a role’s baseline and emphasized token — only weight (and, for a
handful of roles, letter spacing) shift. Weight always steps up one rung
from the baseline token’s own weight: Regular → Medium for every
Regular-weight baseline role (display_*, headline_*, title_large,
body_*), and Medium → Bold for every Medium-weight baseline role
(title_medium, title_small, label_*) — so every emphasized style is
guaranteed to differ from its base in weight. Letter spacing mostly
matches the baseline value already in this module’s tables; body_large
is the one role whose emphasized tracking differs from its own baseline
(0.5px baseline → 0.15px emphasized, matching the source’s
BodyLargeEmphasizedTracking).