Scale tokens
elements man style/tokens/scale Read as markdownThe non-color primitives: type, spacing, radius, shadow, motion, and layering.
They live in tokens/scale.css inside @layer tokens and don't change between
themes. Consume them everywhere instead of hardcoding pixel values.
Type scale
A modular ramp from --text-2xs (11px) to --text-8xl (128px). Values are in
rem; the pixel note is the value at a 16px root.
| Token | rem | px |
|---|---|---|
--text-2xs |
0.6875 | 11 |
--text-xs |
0.75 | 12 |
--text-sm |
0.875 | 14 |
--text-base |
1 | 16 |
--text-md |
1.125 | 18 |
--text-lg |
1.25 | 20 |
--text-xl |
1.5 | 24 |
--text-2xl |
1.875 | 30 |
--text-3xl |
2.25 | 36 |
--text-4xl |
3 | 48 |
--text-5xl |
3.75 | 60 |
--text-6xl |
4.5 | 72 |
--text-7xl |
6 | 96 |
--text-8xl |
8 | 128 |
Weights
| Token | Value |
|---|---|
--weight-thin |
100 |
--weight-light |
300 |
--weight-regular |
400 |
--weight-medium |
500 |
--weight-semibold |
600 |
--weight-bold |
700 |
--weight-black |
900 |
Leading and tracking
Line height:
| Token | Value |
|---|---|
--leading-none |
1 |
--leading-tight |
1.15 |
--leading-snug |
1.3 |
--leading-body |
1.5 |
--leading-relaxed |
1.65 |
--leading-loose |
1.85 |
Letter spacing:
| Token | Value |
|---|---|
--tracking-tighter |
-0.04em |
--tracking-tight |
-0.02em |
--tracking-snug |
-0.01em |
--tracking-normal |
0 |
--tracking-wide |
0.02em |
--tracking-wider |
0.06em |
--tracking-widest |
0.14em |
Font families
--font-sans: the system UI sans stack; the default for the whole app.--font-mono: the system monospace stack; used by code,<pre>, the terminal component, and inline CLI helpers.--font-serif: a system serif stack. It is defined and exposed as the.font-serifutility, but nothing in the package consumes it by default. It's there for apps that want a serif; point a class at it to use it.
Spacing
A 4-based scale from --space-0 to --space-64, with fractional half-steps for
tight work (--space-0-5, --space-1-5, --space-2-5, --space-3-5) and a
hairline --space-px (1px). --space-4 is 1rem (16px), the base rhythm unit.
--space-0 --space-px --space-0-5 --space-1 --space-1-5 --space-2 --space-2-5
--space-3 --space-3-5 --space-4 --space-5 --space-6 --space-7 --space-8
--space-9 --space-10 --space-11 --space-12 --space-14 --space-16 --space-20
--space-24 --space-28 --space-32 --space-40 --space-48 --space-56 --space-64
Radius
A scale plus semantic role slots. The scale:
| Token | Value |
|---|---|
--radius-none |
0 |
--radius-xs |
2px |
--radius-sm |
4px |
--radius-md |
6px |
--radius-lg |
8px |
--radius-xl |
12px |
--radius-2xl |
16px |
--radius-3xl |
24px |
--radius-4xl |
32px |
--radius-full |
9999px |
The role slots (defined in the theme) map those onto component intents so the radius is adjustable in one place. See component tokens.
Shadow
Elevation ramp: --shadow-xs, --shadow-sm, --shadow-md, --shadow-lg,
--shadow-xl, --shadow-2xl, plus --shadow-inner. Tuned on a cool navy tint
to match the neutral ramp.
Motion
Durations:
| Token | Value |
|---|---|
--duration-instant |
80ms |
--duration-fast |
120ms |
--duration-normal |
180ms |
--duration-slow |
280ms |
--duration-slower |
500ms |
Easings: --ease-linear, --ease-out, --ease-in, --ease-in-out,
--ease-spring.
The theme also ships ready-made transition presets (--transition-colors,
--transition-shadow, --transition-transform, --transition-opacity) used by
components and available as .transition-* utilities.
Reduced motion. themes/default.css ships a global
@media (prefers-reduced-motion: reduce) block that near-zeroes all animation
and transition durations and disables smooth scroll. You get this for free; you
don't need to guard your own transitions unless they're essential.
Layering (z-index)
A named stack so overlapping UI stays consistent:
| Token | Value |
|---|---|
--z-base |
0 |
--z-raised |
10 |
--z-sticky |
100 |
--z-fixed |
200 |
--z-overlay |
1000 |
--z-modal |
1010 |
--z-popover |
1020 |
--z-dropdown |
1030 |
--z-tooltip |
1040 |
--z-toast |
1050 |
--z-top |
max int |
Opacity
| Token | Value |
|---|---|
--opacity-disabled |
0.55 |
--opacity-muted |
0.7 |
--opacity-overlay |
0.5 |
Breakpoints
Reference values only. CSS custom properties can't be used inside a media query,
so these document the intended widths; the @media rules across the package
hardcode the same rem values.
| Token | Value |
|---|---|
--bp-sm |
40rem |
--bp-md |
48rem |
--bp-lg |
64rem |
--bp-xl |
80rem |
--bp-2xl |
96rem |
The package does not apply one uniform breakpoint everywhere. The breakpoints
that actually fire are mixed by design: the two-column form grid collapses at
40rem, the app sidebar collapses at 48rem, and the responsive utility
variants (md:, lg:) key on 48rem and 64rem. Match the breakpoint to
the thing you're making responsive rather than assuming a single system.
Container widths
Max-width tokens for constraining content, --container-xs … --container-7xl
(see elements man style/reference/scale for every value), plus role widths --container-prose (65ch),
--container-shell (72rem), --container-wide (80rem), and
--container-padding (the default gutter, --space-8). These back the
.page-shell variants and the .max-w-* utilities.