Skip to main content

Module typography

Module typography 

Source
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).

Structs§

TypeScale
The 15 named type-scale presets, each a full TextStyle, plus 15 _emphasized siblings (see the module docs’ “Emphasized type scale” section).