SLASHED / demo

Theme Customizer

Override just 6 tokens in the Light mode column for quick branding — dark mode automatically derives an appropriate value via relative color syntax, no extra work needed. Optionally override any token in the Dark mode column for full per-mode control. Changes apply live to :root; toggle dark mode in the header to preview.

Light mode

Source brand and status colors for light mode — the full palette, surfaces and text contrasts are derived from these live.

Brand
Status

Dark mode

The same source colors for dark mode — set independently so dark mode isn't just an inversion of light.

Brand
Status

Accessibility report (live, both modes)

WCAG 2 contrast for your chosen colours, recomputed live. The framework auto-picks readable on-colours (black/white by lightness) and clamps link lightness — but contrast also depends on chroma, so this panel shows the actual result, including any pairs that fall short. AA = 4.5:1 (normal text); AA Large = 3:1 (large/UI). Fix a ✗ by adjusting that colour's lightness, or override the on-/text token directly.

Colors

Brand — light mode (base values)

The core brand roles every component pulls from — set these first; most other colors are derived from them.

primary
secondary
tertiary
action
neutral
surface

Semantic Surfaces

Background layers for elevation — page bg, raised cards, insets and overlays. Use to separate depth, not for decoration.

bg
surface
inset
raised
overlay
inverse

Status Colors

Feedback hues for success, warning, info and danger states. Use for alerts, badges and validation — not general accents.

success
warning
info
danger

Status Triplets

Each status ships a subtle / base / strong trio — subtle for fills, base for text and icons, strong for emphasis or borders.

Success
Warning
Danger
Info

Text Hierarchy

Text-color roles from primary body down to disabled — use to signal importance, never to hardcode a grey.

--sf-color-text (primary)

--sf-color-text--subtle

--sf-color-text--muted

--sf-color-text--placeholder

--sf-color-text--disabled

--sf-color-heading

Borders

Border-color roles from subtle to strong — pick by how much separation the edge should carry.

--sf-color-border
--sf-color-border--subtle
--sf-color-border--strong
--sf-color-border--focus (action color)

Gradients

Ready-made brand gradients for hero fills, accents and text clipping. Pair with .sf-text-gradient for headline effects.

gradient-primary
gradient-secondary
gradient-tertiary
gradient-brand
gradient-surface

Palette Numeric Scale 50–950 (core/tokens.css)

The raw stepped palette behind the semantic roles — reach for a specific step only when no semantic token fits.

50
100
200
300
400
500
600
700
800
900
950

Alpha Scale a5–a80

Translucent neutrals (5–80% alpha) for overlays, hovers and dividers that tint whatever sits behind them.

a5
a10
a30
a50
a80

Semantic & Functional Aliases

Named shortcuts (link, focus, selection, code…) mapped to the palette — use these in components so a re-theme flows through.

superlight
xlight
lighter
darker
xdark
superdark
hover
active
subtle
muted
tint

Scoped Themes

Use data-theme="dark" or data-theme="light" on any element to scope a theme. When attributes are inconvenient, .sf-theme-dark and .sf-theme-light are equivalent class aliases. Tokens resolve correctly per-section, enabling nested light-inside-dark (or vice-versa) without extra overrides.

Dark section data-theme="dark"

Any subtree can pin its own theme with data-theme — colors recompute from the scoped source, no utility classes needed.

primary
secondary
tertiary
action
neutral
surface

--sf-color-text (primary)

--sf-color-text--subtle

--sf-color-text--muted

Success
Warning
Danger

Light section (nested) data-theme="light"

Themes nest — a light island inside a dark section just works, each level resolving its own palette.

primary
secondary
tertiary
action
neutral
surface

--sf-color-text (primary)

--sf-color-text--subtle

--sf-color-text--muted

Success
Warning
Danger

Opt-in theme cross-fade .sf-theme-transition

Add class="sf-theme-transition" to <html> (or any subtree) so colours fade instead of switching instantly when the theme flips. Tune the speed with --sf-theme-transition-duration. Toggle dark mode in the header to see this block cross-fade.

Smooth theme transition

This card fades its background, text and border colours when the mode changes.

Section theme aliases .sf-theme-light / .sf-theme-dark

Class aliases for data-theme: one class scopes the theme, setting the background and flipping the whole foreground (text, links, borders) to match — always light or always dark, regardless of the ambient scheme.

.sf-theme-dark

Auto-light text, and a themed link.

.sf-theme-light

Auto-dark text, and a themed link.

Named background surface .sf-surface-bg

A reusable, named background bundling a base colour + image/gradient + an optional overlay layered above it. Define the --sf-surface-bg-* tokens on a scope, then apply the class. Here the overlay is a scrim over a gradient "image".

Composed background preset

Typography

Heading Scale (base.css)

Default h1–h6 sizes, weights and leading applied to bare heading tags — the classless baseline for document typography.

h1 — The quick brown fox

h2 — The quick brown fox

h3 — The quick brown fox

h4 — The quick brown fox

h5 — The quick brown fox
h6 — The quick brown fox

Fluid Text Scale (--sf-text-*)

All sizes use clamp() — resize the window to see fluid scaling.

2xs — The quick brown fox jumps over the lazy dog
xs — The quick brown fox jumps over the lazy dog
s — The quick brown fox jumps
m (base) — The quick brown fox
l — The quick brown fox
xl — The quick brown
2xl — The quick
3xl — Quick
4xl
display-s
display-m
display-l

Font Weights — base weights + semantic roles

The weight ramp plus semantic aliases (body, heading, strong) — reference the role, not the number, so a font swap stays consistent.

300 light — The quick brown fox 400 normal — The quick brown fox 500 medium — The quick brown fox 600 semibold — The quick brown fox 700 bold — The quick brown fox

Semantic roles (override to reweight the whole site):

body — The quick brown fox interactive — buttons, badges, nav heading — section titles strong — inline emphasis display — hero headlines

Semantic Weight Aliases & Font Stacks

Font-family and weight roles (body, heading, mono) — the single place to retarget typefaces across the system.

body heading display
humanist — The quick brown fox jumps geometric — The quick brown fox jumps slab — The quick brown fox jumps mono — The quick brown fox jumps

Line Heights (--sf-leading-*)

Leading scale from tight (headings) to loose (long-form) — pick by line length and text size for comfortable reading.

--sf-leading-tight (1.1)

Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.

--sf-leading-snug (1.3)

Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.

--sf-leading-normal (1.5)

Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.

--sf-leading-relaxed (1.625)

Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod.

Letter Spacing (--sf-tracking-*)

Tracking scale — tighten large display text, open up all-caps or small labels. Body copy stays at normal (0).

tracking-tight — THE QUICK BROWN FOX JUMPS OVER
tracking-normal — THE QUICK BROWN FOX JUMPS OVER
tracking-wide — THE QUICK BROWN FOX
tracking-wider — THE QUICK BROWN
tracking-widest — THE QUICK

Semantic Elements (base.css)

strong, em, mark highlight, inline code, Ctrl + C, CSS, H2O, E=mc2, small text, link, deleted, inserted

/* pre + code block */
:root {
  --sf-color-primary-source-light: oklch(0.47 0.27 264);
  --sf-color-neutral-source-light: oklch(0.52 0.025 260);
}
A blockquote. Try selecting this text to see --sf-color-selection-bg.

Link States

Default, hover, visited and active link colors on bare <a> — a consistent affordance with no utility class.

Spacing

All fluid tokens use clamp() — resize the window to see bars animate.

--sf-space-none
0
--sf-space-px
--sf-space-2xs
--sf-space-xs
--sf-space-s
--sf-space-m
--sf-space-l
--sf-space-xl
--sf-space-2xl
--sf-space-3xl
--sf-space-4xl

Spacing Aliases

Semantic gap names (gap, content-gap…) that resolve to the space scale — use these in layout so rhythm stays uniform.

--sf-gap → --sf-space-m --sf-content-gap → --sf-space-s --sf-component-pad → --sf-space-m --sf-field-block → --sf-space-l --sf-prose-paragraph → --sf-content-gap → --sf-space-s

Shadows

Shadow color is a neutral near-black auto-derived from --sf-color-neutral (--sf-shadow-color) — override it to var(--sf-color-primary) for tinted shadows. In dark mode strength scales up but every layer's alpha is capped at 0.7. Adjust via --sf-shadow-strength.

shadow-none
shadow-xs
shadow-s
shadow-m
shadow-l
shadow-xl
shadow-2xl
shadow-inner
shadow-glow

Text Shadows

Text-shadow scale for legibility over busy backgrounds or subtle heading depth — keep it restrained on body copy.

text-shadow-xs text-shadow-s text-shadow-m text-shadow-l text-shadow-xl

Drop Shadows (filter — follows alpha edges)

filter: drop-shadow that hugs an element's actual alpha shape — for icons, cut-outs and PNGs where box-shadow would look wrong.

3D Perspective

Perspective and transform tokens for depth — tilt cards or build 3D hovers without hand-tuning matrices.

Border Radius

All values multiplied by --sf-radius-scale (1 by default).

none
0
xs
2px
s
4px
m
8px
l
12px
xl
16px
2xl
24px
3xl
32px
4xl
48px
full
9999px

Motion & States

Reduced motion active — Your OS has reduced motion enabled. Animations are paused (duration: 0.01ms via accessibility.css).

Transitions (motion.css — hover these)

motion.css applies a default transition to all interactive elements (a, button, input, etc.) using --sf-duration-fast and --sf-ease-out. Hover to see the transition between the base and hover states.

Link transition

Easing Curves

The easing vocabulary (out, in-out, spring…) — match the curve to the gesture: ease-out for entrances, in-out for moves.

ease-linear
ease-out
ease-in
ease-in-out
ease-spring
ease-elastic
ease-bounce
ease-overshoot

Animation Presets (motion.css — click to replay)

Drop-in entrance and attention animations — add one class to play. All respect prefers-reduced-motion.

.sf-stagger (motion.css — parent choreographs children's animation-delay; click to replay)

Put on a parent so its children's entrance animations play in sequence — choreography only; each child still brings its own animation.

  • 1
  • 2
  • 3
  • 4

@property Color Interpolation (motion.css — sf-color-pulse)

Demonstrates smooth oklch color animation via @property-registered tokens. The box below pulses its --sf-color-primary-source-light lightness. Only works in browsers supporting @property inherits.

.sf-color-pulse — animating --sf-color-primary-source-light

Duration Tokens

Hover any row — the dot slides across using that duration token. Easing is the same (--sf-ease-out) so the only variable is speed.

--sf-duration-instant
--sf-duration-fast (default)
--sf-duration-normal
--sf-duration-slow
--sf-duration-slower

States (states.css)

The .sf-is-* state vocabulary — a shared, framework-wide way to mark active/open/valid/busy so CSS and JS agree.

.sf-is-loading

.sf-is-shimmer

.sf-invisible / .sf-visible (optional/utilities.css)

visible invisible (visibility:hidden) .sf-visible (force visibility:visible)

States — Full Coverage

Every .sf-is-* class from states.css. Grouped by category.

Navigation & Toggling

States for nav and toggles — .sf-is-selected / -highlighted mark what the user picked.

.sf-is-selected .sf-is-highlighted

Validation / Feedback

Form-field states — .sf-is-valid / -invalid / -required drive inline validation styling.

.sf-is-valid .sf-is-invalid .sf-is-warning .sf-is-success .sf-is-error .sf-is-info

Drag & Drop

Drag-and-drop states — mark the dragged item and valid drop targets while a drag is in progress.

.sf-is-dragging .sf-is-drop-target .sf-is-draggable

Overlay

Overlay positioning for modals, drawers and popovers — pair with your own open/closed class or [open]/aria-expanded (see the mobile nav drawer in this page's header for a worked example).

.sf-overlay

Interactivity

Signal that an element is temporarily inert.

.sf-is-disabled
.sf-focus-parent (focus the input → parent rings)

Empty State

.sf-is-empty styles a zero-content region — for empty lists, search results and blank slates.

.sf-is-empty:empty → display:none (the empty div above is gone)

Layout — Additional Primitives

.sf-imposter

Absolutely positioned overlay. Modifiers: --fixed, --contain.

.sf-imposter (centered)
.sf-imposter--contain (clamps to 100% − 2 × --sf-imposter-margin in both axes; overflow: auto kicks in only when the content is larger than that box)

.sf-imposter--fixed

Uses position: fixed — not demoed visually to avoid viewport takeover. Class reference: sf-imposter--fixed.

.sf-subgrid / .sf-subgrid-rows

Inherit parent grid tracks. Requires parent with explicit grid.

Subgrid col 1
Subgrid col 2
Regular col

.sf-subgrid-rows works the same for row tracks.

.sf-section-group

Groups adjacent .sf-section elements with zero gap between them.

Section A (--s padding)
Section B (--s padding)

.sf-divider

Token-driven separator (--sf-divider-width/-style/-color). Horizontal by default; .sf-divider--vertical for inline use.

Content above the divider.


Content below the divider.

Left Right

Style modifiers — colour via .sf-divider--soft / .sf-divider--strong, line via .sf-divider--dashed / .sf-divider--dotted, and a fading .sf-divider--gradient.






.sf-divide

Places a rule between direct children in one class — no extra markup per gap. .sf-divide--vertical switches to an inline-start border.

First

Second

Third

Left Middle Right

.sf-icon

Em-based inline icon sizing. Scales with surrounding text; size modifiers .sf-icon--xs.sf-icon--2xl.

.sf-icon--boxed

Padded, bordered icon frame. Override --sf-icon-box-bg / -border / -radius per instance. Combine with size modifiers; the visible glyph stays at --sf-icon-size and the frame grows around it.

.sf-grid--dense

Dense auto-flow lets later items backfill earlier gaps. Add .sf-grid--dense to any grid.

span 2
a
b
span 2
c

.sf-cover modifiers

Padding variants for the cover primitive — tune the breathing room around a hero's centered content.

.sf-cover--min
min
.sf-cover--max
max
.sf-cover--padding-s / --padding-l
pad-s

.sf-cluster--no-wrap / .sf-switcher--no-wrap / .sf-switcher--vertical

Opt out of wrapping/switching — keep a cluster or switcher on one row when scrolling beats reflow.

.sf-cluster--no-wrap
A
B
C
D
E
F
.sf-switcher--no-wrap
1
2
3
.sf-switcher--vertical
1
2
3

.sf-grid-cols-1 / Ratio grids

.sf-grid-cols-1 is intentionally a single-column grid. Ratio grids (.sf-grid-cols-1-2 etc.) collapse to a single column on narrow widths and switch to two columns at 48em via container queries — the parent must declare container-type: inline-size.

.sf-grid-cols-1 (single column by design)
Full width row
Full width row
.sf-grid-cols-1-2 (1fr 2fr)
1fr
2fr
.sf-grid-cols-2-1 (2fr 1fr)
2fr
1fr
.sf-grid-cols-1-3 (1fr 3fr)
1fr
3fr
.sf-grid-cols-3-1 (3fr 1fr)
3fr
1fr

.sf-cq — container query scope

Establishes an inline-size container context so children can use container queries.

container-type: inline-size

.sf-fluid-cq — container-relative fluid scale

Makes the fluid type + space scales interpolate against this box's width (100cqi) instead of the viewport — so text in a narrow column scales with the column, not the page. Resize the box to see it.

Fluid text tied to this container's width.

.sf-equal — fixed N-column grid

Column count never collapses — unlike .sf-grid-* which uses container queries.

.sf-equal--2
1
2
.sf-equal--3
1
2
3
.sf-equal--4
1
2
3
4
.sf-equal--6
1
2
3
4
5
6

.sf-scale-down (motion.css)

One-shot shrink-in animation for de-emphasis or dismissal — respects reduced-motion.

.sf-center / .sf-center--intrinsic

Flex-center children on both axes; add --intrinsic to shrink the box to its content instead of filling the parent.

.sf-center (max 20rem, auto margins)
.sf-center--intrinsic (flex column, items centered)

.sf-box

The simplest primitive — even padding on all sides via --sf-box-padding. Reach for it when you just need breathing room.

.sf-box — padding + outline border (no box-model disturbance)

.sf-grid-cols-6 / .sf-grid--xs … .sf-grid--2xl

Fixed-column grids (.sf-grid-cols-6) use container queries — wrap in container-type: inline-size. Auto-fill grids (.sf-grid--xs/s/m/l/xl/2xl) use repeat(auto-fill, minmax(min(--sf-grid-min, 100%), 1fr)) — they collapse to fewer columns as the container narrows. On very narrow viewports both will stack to a single column; resize the window to see them respond.

.sf-grid-cols-6
1
2
3
4
5
6
.sf-grid--xs (min ~10rem)
A
B
C
D
E
.sf-grid--s (min ~13rem)
A
B
C
D
.sf-grid--m (min ~16rem)
A
B
C
.sf-grid--l (min ~20rem)
A
B
C
.sf-grid--xl (min ~24rem)
A
B
.sf-grid--2xl (min ~28rem)
A
B

.sf-grid-flex — flex alternative for uneven item counts

Flexbox-based alternative to .sf-grid for item counts that don't divide evenly. By default the last row's leftover items stretch to fill the row; .sf-grid-flex--center keeps them fixed-width and centered instead. Reuses --sf-grid-min/--sf-grid-gap — same --xs … --2xl scale as .sf-grid.

.sf-grid-flex (default — last row stretches)
1
2
3
4
5
.sf-grid-flex--center (leftover fixed-width, centered)
1
2
3
4
5
.sf-grid-flex--xs / --s / --m / --l / --xl / --2xl (re-point --sf-grid-min)
xs
xs
xs
s
s
s
m
m
m
l
l
l
xl
xl
2xl
2xl

.sf-sidebar--narrow / .sf-sidebar--wide

Preset sidebar widths — pick one without hand-setting --sf-sidebar-width.

.sf-sidebar--narrow (12rem sidebar)
Narrow sidebar
Main content
.sf-sidebar--wide (26rem sidebar)
Wide sidebar
Main content

.sf-container--full / .sf-container--wide

Wider container caps for dashboards and media-heavy pages that need more than the default reading width.

.sf-container--wide (90rem)
wide content (90rem)
.sf-container--full (100%)
full-width content (100%)

.sf-section--xs / .sf-section--l / .sf-section--xl / .sf-section--2xl

Vertical-padding sizes for content bands — set section rhythm from tight to airy.

.sf-section--xs (small vertical padding)
.sf-section--l (large vertical padding)
.sf-section--xl (extra-large vertical padding)
.sf-section--2xl (hero vertical padding)

.sf-header--xs / .sf-header--s / .sf-header--m / .sf-header--l / .sf-header--xl

Block padding on the standard spacing scale — lighter than .sf-section. Inline gutter is left untouched.

.sf-header--xs
.sf-header--s
.sf-header--m
.sf-header--l
.sf-header--xl

.sf-frame--3-2 / .sf-frame--4-3 / .sf-frame--golden

Named aspect-ratio presets for media frames — common photo ratios without an inline --sf-frame-ratio.

.sf-frame--3-2
3 / 2
.sf-frame--4-3
4 / 3
.sf-frame--golden
golden

.sf-stack alignment: --center / --end / --stretch

Cross-axis alignment for a stack — center, end-align or stretch children without leaving the primitive.

.sf-stack--s --center
A
B
C
.sf-stack--l --end
A
B
C
.sf-stack--2xl --stretch
A
B
override beyond scale: style="--sf-stack-gap: var(--sf-space-3xl)"
A
B

.sf-gap — gap size modifiers

Injects gap into any existing flex or grid container without imposing a display type.

.sf-gap--xs
A
B
C
.sf-gap--s
A
B
C
.sf-gap--m
A
B
C
.sf-gap--l
A
B
C
.sf-gap--xl
A
B
C
.sf-gap--2xl
A
B
C

.sf-cluster gap modifiers: --xs / --s / --m / --l / --xl / --2xl

The size suffix sets the gap between items (not alignment). Compare side by side:

override below scale: style="--sf-cluster-gap: var(--sf-space-2xs)"
A
B
C
D
E
.sf-cluster--xs (smallest of the canonical scale)
A
B
C
D
E
.sf-cluster--l
A
B
C
D
E
.sf-cluster--2xl (largest of the canonical scale)
A
B
C
D
E

.sf-cluster alignment: --center / --end / --between

These set justify-content. Default is flex-start.

default (flex-start)
A
B
C
.sf-cluster--center
A
B
C
.sf-cluster--end
A
B
C
.sf-cluster--between
A
B
C

.sf-cover--padding-l

Large-padding cover variant — more generous framing for spacious heroes.

padding-l (4xl)

.sf-fade-out

The animation ends at opacity: 0 with animation-fill-mode: both, so the target stays hidden after playing. Click the button to (re)apply the animation to the box on its right.

Target — watch me fade

Accessibility

Skip Link

A .skip-link is at the very top of this page. Press Tab from the browser address bar to reveal it — it appears above the header.

Focus Ring (accessibility.css)

Tab through these elements to verify :focus-visible ring (2px solid, 2px offset, action color). The ring uses !important so it's never overridden.

Link
Details summary

Details content.

.sr-only

Hidden from sighted users but available to screen readers: [THIS TEXT IS SCREEN-READER ONLY — not visible] (check with DevTools or a screen reader)

Disabled States

How disabled controls render — reduced contrast and no pointer affordance, while staying perceivable to assistive tech.

Touch Targets (pointer: coarse)

On touch devices, class-less button, form inputs, select, and summary automatically get min-block-size/min-inline-size: var(--sf-touch-target) = 2.75rem (≈44px). Give a control any class (e.g. .sf-btn, or a third-party widget class) and it owns its own sizing — the floor never overrides styled or third-party markup.

High Contrast & Reduced Transparency

prefers-contrast: more → thicker focus ring (3px), thicker <hr>.
prefers-reduced-transparency: reduce → backdrop becomes solid.
These are handled automatically by accessibility.css.

Color Scheme Token

--sf-color-scheme: light dark controls the browser's native UI color adaptation (scrollbars, form controls). Override to only light or only dark to lock the mode at the browser level. Used by both reset.css and base.css.

Layout — Stack

.sf-stack — flex column with uniform gap. Modifier suffix sets gap size.

.sf-stack--xs
Item 1
Item 2
Item 3
.sf-stack--m
Item 1
Item 2
Item 3
.sf-stack--xl
Item 1
Item 2
Item 3

Override gap: style="--sf-stack-gap: 2rem"

Layout — Cluster

.sf-cluster — flex wrapping group with uniform gap. Ideal for tags, buttons, inline groups.

Design tokens
CSS layers
Layout primitives
Fluid typography
Motion
Accessibility
Reset
Base

Alignment modifiers: --center, --end, --between, --no-wrap

Layout — Sidebar

.sf-sidebar — first child is sidebar (fixed width), second child grows. Collapses to stack when content width < --sf-sidebar-min-width (50%).

Sidebar
(18rem default)
Main content — grows to fill available space

Override: --sf-sidebar-width, --sf-sidebar-min-width. Modifier: .sf-sidebar--right

Layout — Switcher

.sf-switcher — switches between row and column layout at a container threshold. No media queries.

Column A
Column B
Column C

Threshold: --sf-switcher-threshold (default from tokens). Below threshold → stacks vertically.

Layout — Grid

.sf-grid — auto-fill CSS grid. Responsive without any media queries.

1
2
3
4
5
6
7

Override: --sf-grid-min (min column width), --sf-grid-gap. Modifier: .sf-grid--fit (auto-fit). Fixed columns: .sf-grid-cols-2, .sf-grid-cols-3, .sf-grid-cols-4

Layout — Cover

.sf-cover — full-height flex column. .sf-cover__center child is vertically centered via margin-block: auto.

Top content

Vertically centered (.sf-cover__center)

Bottom content

Default --sf-cover-min-height: 100dvh — overridden to 16rem here for demo.

Layout — Frame

.sf-frame — aspect-ratio container. Media children use object-fit: cover.

sf-frame--video (16:9)
16 / 9
sf-frame--square (1:1)
1 / 1
sf-frame--portrait (3:4)
3 / 4
sf-frame--cinema (21:9)
21 / 9

Layout — Reel

.sf-reel — horizontal scroll container with scroll-snap-type: x mandatory. Scroll to snap cards.

Card 1
Card 2
Card 3
Card 4
Card 5
Card 6

Override: --sf-reel-item-width, --sf-reel-gap, --sf-reel-height

Layout — Prose

.sf-prose — long-form text rhythm. Adds margin-block-start: var(--sf-prose-paragraph) between children. Restores list styles.

Prose Heading

The .sf-prose class provides automatic vertical rhythm for long-form content. All direct children receive spacing automatically — no extra margin classes needed.

Lists Are Restored

  • List items get list-style: disc back (reset removes it)
  • Nested list indentation is preserved
  • Marker color follows --sf-prose-marker-color (defaults to --sf-color-primary)
  1. Ordered lists work too
  2. Each step is clearly numbered
A blockquote inside prose gets consistent margin-block spacing from the surrounding paragraphs.

Use .sf-not-prose on a child to opt out of prose spacing for that element.

Layout — Container & Section

.sf-container — centered max-width with horizontal gutters. Declares a named inline-size container sf-layout, so consumers can target it precisely with @container sf-layout (...) in their own CSS. .sf-section adds vertical padding.

sf-container--narrow (38rem)
narrow content
sf-container--prose (65ch)
prose content
sf-container (75rem default)
default content

.sf-section modifiers: --xs, --s, --m, --l, --xl, --2xl. Combine: <section class="sf-section--m"><div class="sf-container">

Layout — Bento

.sf-bento — free-form dense grid. Parent needs container-type: inline-size for responsive column collapse.

Wide + tall
(span 2 col, 2 row)
1
2
Wide (span 2)
3
4

Override: --sf-bento-cols (default 4), --sf-bento-row (row height). Column modifiers: .sf-bento--2, .sf-bento--3, .sf-bento--6. Row modifiers: .sf-bento--row-compact, .sf-bento--row-tall. Child span modifiers: .sf-bento-wide (col span 2), .sf-bento-tall (row span 2), .sf-bento-featured (2×2), .sf-bento-full (full width).

wide
.sf-bento-wide
normal
normal
tall
.sf-bento-tall
full width — .sf-bento-full

Column modifiers below use .sf-bento--2, .sf-bento--3, .sf-bento--6

Layout — Alternate (zigzag)

.sf-alternate — alternating two-column rows. Below 48em (own container width) it stacks; above, every other row reverses its children. Declares the named container sf-alternate and binds the flip query to that name — so a nested .sf-alternate reacts to its OWN width, not its outer container's.

Image / leading column
Row 1

Standard order: leading column on the left, text on the right (above 48em).

Image / leading column
Row 2

Even row — children swap order via order: 2 / 1.

Image / leading column
Row 3

Back to standard order.

Smoke test — .sf-alternate nested inside .sf-bento

Phase 4 contract: the inner .sf-alternate's flip query is bound to the sf-alternate name, so it reacts to the bento cell's intrinsic width — not the outer page container. The cell below is wide enough (a span-2 bento cell) to flip into the two-column layout independently of viewport width.

Wide cell (span 2) — contains a .sf-alternate

A1
Left → right
B1
Right → left (flipped)
Narrow bento cell

Layout — Content Grid

.sf-content-grid — named column grid. Children default to content column. .sf-breakout spans wider. .sf-full-bleed spans edge-to-edge.

Normal content column — max-width: --sf-content-width

.sf-breakout — spans --sf-breakout-width
.sf-full-bleed — edge to edge

Back to content column.

Layout — Pancake

.sf-pancake — 3-row grid (auto 1fr auto) for sticky-footer layouts. Default min-height: 100dvh.

Header (auto height)
Main (1fr — grows to fill remaining space)
Footer (auto height — sticks to bottom)

This demo is capped at 18rem. In production: min-height: 100dvh on <body>.

Reset & Base

Form Elements (reset.css + base.css)

Bare inputs, selects and textareas styled by reset + base alone — consistent, themeable fields with zero classes.

Table (reset: border-collapse)

Default table styling — collapsed borders and padded cells straight from the reset, ready for data without a wrapper.

Token Value Type
--sf-color-primary oklch(0.45 0.2 264) Brand
--sf-text-m clamp(1rem, …, 1.125rem) Typography
--sf-space-m clamp(1rem, …, 1.5rem) Spacing

Selection Color

Try selecting this text to see --sf-color-selection-bg in action. The highlight color adapts in dark mode.

List Reset

reset.css sets list-style: none on menu, ul, ol. Outside .sf-prose, styles must be applied manually:

  • This list has manually re-applied list-style: disc
  • Inside .sf-prose, styles are restored automatically

HR & Separator

The default <hr> — a themed divider using border-color tokens; spacing follows the surrounding rhythm.


Above: standard <hr> with border token. High-contrast mode thickens it automatically.

Box Model (reset.css)

All elements: box-sizing: border-box. Media (img, video, svg): display: block; max-width: 100%. Margins/padding removed globally. scrollbar-gutter: stable prevents layout shift.

Print

SLASHED's print stylesheet preserves authored colour by default — open print preview (Cmd/Ctrl + P) to compare. Two opt-in classes adjust the contract: .print-color-exact forces colours when the browser would flatten them, .print-no-color opts back into ink-on-paper.

Default — authored colour survives

Highlighted text in <mark> stays yellow in print. Success-coloured text stays green. Danger-coloured text stays red. External links carry their href in parentheses: visit the SLASHED repo.

.no-print — vanishes from print

The badge below disappears from printed output: SCREEN-ONLY

.print-color-exact — force colour preservation

Force backgrounds and colors to print exactly — for charts, badges and status fills that must survive on paper.

.print-no-color — opt back into ink-on-paper

Opt a region back into plain ink-on-paper for print — saves toner on decorative fills.

Manual verification checklist

Open print preview and confirm each of the following.

  1. <mark> retains its yellow background (the test for F-04).
  2. Success, danger and warning text retain their colour.
  3. The SCREEN-ONLY badge is absent.
  4. The .print-color-exact callout retains its tinted background.
  5. The .print-no-color callout has lost its background.
  6. The repo link shows its href in parentheses.
  7. The Open print preview button below is absent (it carries .no-print).

Macros

Recipes / patterns from core/macros.css. Macros answer "what does this element do?" — distinct from layout primitives, which answer "where do my children go?".

.sf-content-auto — skip offscreen rendering

Sets content-visibility: auto so the browser skips layout and paint for this section while it is offscreen on a long page. contain-intrinsic-size (token --sf-content-intrinsic-size) reserves a placeholder box so the scrollbar doesn't jump. Unsupported engines render it normally.

This block is render-deferred until it nears the viewport. On long product or article pages, applying it to repeated sections measurably cuts initial render cost.

.sf-tabular-nums — column-aligned figures

Fixed-width digits (font-variant-numeric: var(--sf-font-numeric)) so numbers line up in columns — prices, totals, invoices.

1,110.00
98.40
7,001.99

.sf-flow — equal vertical rhythm

Adds uniform top-margin to every child after the first — prose-like vertical rhythm from one --sf-flow-space knob.

First child has no top margin (only siblings get the rhythm).

Second child gets margin-block-start: var(--sf-flow-space).

So does every subsequent child. Override with the token.

.sf-truncate — single-line ellipsis

Clips text to one line with an ellipsis — needs a finite width to bite. Use for labels and tight table cells.

This sentence is intentionally too long for the container so the ellipsis will appear — text-overflow ellipsis on a single line.

.sf-line-clamp-2 / -3 / -N

Clamp text to N lines with an ellipsis — fixed 2/3 variants or --sf-line-clamp for a custom count. Great for card previews.

2 lines: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation.

3 lines: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation.

4 lines (via --sf-line-clamp): Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

.sf-aspect — generic ratio container

Holds any aspect-ratio from an inline --sf-aspect — content-agnostic, unlike .sf-frame which is media-specific.

.sf-equal-height — children stretch to tallest

Makes flex children share the tallest one's height — even card rows without a grid.

Short.
Two
lines.
Three
lines
here.

.sf-scroll-shadow — top + bottom mask gradient

Fades content at the top and bottom of a scroll area to hint at hidden overflow — pure CSS, no scroll listener.

Scroll inside this box.

The mask gradient fades the top and bottom of the content.

It's pure CSS — no scroll listener.

Override --sf-scroll-shadow-size to tune the fade depth.

Pairs nicely with overflow-y: auto on tables, lists, code blocks.

Also useful inside cards with overflowing comment threads.

Keep scrolling — the bottom edge fades the same way.

Final paragraph for proof.

.sf-scroll-snap — vertical scroll-snap container

Snaps each child into place as you scroll — for full-height section decks; use .sf-reel for horizontal snap.

Slide A
Slide B
Slide C

.sf-overflow-fade — end-edge mask

Fades the overflowing edge to hint at more content — drop on reels, tag rows and scroll containers.

tag-one tag-two tag-three tag-four tag-five

.sf-overflow-fade--* — directional variants

Pick which edge(s) fade — right, left, top, bottom, or a whole axis.

right: tag-one tag-two tag-three tag-four tag-five
left: tag-one tag-two tag-three tag-four tag-five
inline: tag-one tag-two tag-three tag-four tag-five
top: line one
line two
line three
line four
line five
bottom: line one
line two
line three
line four
line five
block: line one
line two
line three
line four
line five

.sf-no-tap-highlight — suppress mobile tap overlay

Removes the grey mobile tap flash on custom-styled interactive elements that supply their own active state.

.sf-clickable-parent — full-card click target

Automatic mode — one link, no extra attributes. Click anywhere on the card to navigate; the button remains independently clickable. Tab to the card to see the built-in card-level focus ring (no separate sf-focus-parent recipe needed).

Explicit mode — multiple links. Add data-overlay-link to the primary link; all other links and buttons are lifted above the overlay automatically — no manual z-index work required.

Class mode (.sf-clickable-parent__overlay) — alternative to data-overlay-link; resolves nesting fragility when secondary links live at different depths.

.sf-surface--* — auto-flipped foreground

Paint an element in a brand or status family and get an auto-contrasting foreground and matching contextual tokens for free.

primary
secondary
tertiary
action
neutral
inverse
success
warning
info
danger

.sf-text-gradient — gradient-clipped text

Clips a brand gradient to the text itself — for headlines and hero words. Keep body copy solid for contrast.

Headline gradient

.sf-link-external — external-link indicator

See the external project for more — the marker is configurable via --sf-link-external-marker.

.sf-link--subtle / .sf-link--reverse — underline affordance

The variant classes toggle only the underline line; its geometry comes from base a:link via --sf-link-underline-offset / --sf-link-underline-thickness.

A subtle link hides its underline until hover/focus, while a reverse link is underlined at rest and clears on hover.

.sf-scrim — text-over-image legibility

Gradient overlay between an image and its text. Direction modifiers .sf-scrim--top / .sf-scrim--bottom, or an even wash with .sf-scrim--full. Retune via --sf-scrim-color / --sf-scrim-direction / --sf-scrim-gradient.

Bottom scrim
Top scrim
Full wash + .sf-text-protect
<img> child
.sf-scrim__content — wrapped img

.sf-bg-layer — background-layer primitive

Absolutely-positioned cover layer that sits behind a parent's content. The parent auto-promotes to a positioned stacking context via :has(). Compose under .sf-scrim for background → gradient → content layering.

bare .sf-bg-layer div
.sf-bg-layer + .sf-scrim

.sf-overlap / .sf-overlap-host — intentional overlap recipe

One element pulled up over the next, which reserves clearance for it automatically.

.sf-overlap-host — content clears the badge above

Directional variant: .sf-overlap--down (pulls into the next element).

Macros in action — a composed profile card

A realistic card built from the overlap recipe: a banner with an avatar overlapping into the body below (.sf-overlap / .sf-overlap-host).

Jamie Chen

Design Systems Lead

.sf-focus-shadow — box-shadow focus ring (opt-in)

Tab to this link: the focus indicator follows the rounded corner via box-shadow: var(--sf-focus-ring-shadow) instead of the default outline.

Focusable pill

.sf-section--collapse — adjacent sections share padding

Removes a section's vertical padding so two same-color bands sit flush — avoids doubled gaps between stacked sections.

Section A — primary surface

Section B — secondary surface (different bg, but content has half-padding from boundary)

.sf-section--guttered — section carries the gutter

Adds padding-inline: var(--sf-gutter) to the section itself while zeroing it on any nested .sf-container, preventing double-guttering.

.sf-section--guttered — horizontal padding lives on the section, not the container

.sf-entrance--* — scroll-driven entrance

Animations require animation-timeline: view() support (Chrome 115+, Firefox flag-gated). Refresh and scroll to see effects in supported engines.

.sf-entrance--fade
.sf-entrance--fade-up
.sf-entrance--fade-down
.sf-entrance--fade-left
.sf-entrance--fade-right
.sf-entrance--scale-up

.sf-exit--* — scroll-driven exit

Symmetric counterpart of .sf-entrance--*: fires as the element scrolls out of view. Requires animation-timeline: view() support — engines without it render these statically (no unconditional fade-to-hidden fallback).

.sf-exit--fade
.sf-exit--fade-up
.sf-exit--fade-down
.sf-exit--fade-left
.sf-exit--fade-right
.sf-exit--scale-down

Full API coverage

Every public class () rendered live for manual inspection, and every design token () with its value resolved from the loaded bundle. Empty token values or broken previews flag a renamed or dropped API member.

Components 30

Layout primitives 145

Macros & effects 53

Motion & animation 22

State classes (.sf-is-*) 15

Utilities 33

Theme 3

Accessibility 8

Print 4

Forms 1

Design tokens 741

Values resolve from the loaded bundle. Component-scoped tokens (--sf-btn-*, --sf-card-*, --sf-field-*) resolve against a hidden probe of that component; a means the token has no value outside its own context (e.g. ::selection tokens).

--sf-alternate-gap
--sf-alternate-inner-gap
--sf-animation-blink
--sf-animation-color-pulse
--sf-animation-fade-in
--sf-animation-fade-out
--sf-animation-float
--sf-animation-ping
--sf-animation-scale-down
--sf-animation-scale-up
--sf-animation-shimmer
--sf-animation-slide-in-down
--sf-animation-slide-in-left
--sf-animation-slide-in-right
--sf-animation-slide-in-up
--sf-animation-slide-out-down
--sf-animation-slide-out-left
--sf-animation-slide-out-right
--sf-animation-slide-out-up
--sf-animation-spin
--sf-aspect
--sf-bento-cols-default
--sf-bento-gap
--sf-bento-row-compact
--sf-bento-row-default
--sf-bento-row-tall
--sf-bg-layer-fit
--sf-bg-layer-inset
--sf-bg-layer-position
--sf-bg-layer-radius
--sf-bg-layer-z
--sf-blur
--sf-body-color
--sf-body-em-style
--sf-body-font-family
--sf-body-font-size
--sf-body-font-weight
--sf-body-line-height
--sf-body-strong-weight
--sf-body-text-wrap
--sf-border
--sf-border-scale
--sf-border-strong
--sf-border-style
--sf-border-subtle
--sf-border-width-1
--sf-border-width-2
--sf-border-width-3
--sf-border-width-4
--sf-border-width-hairline
--sf-box-border-color
--sf-box-border-width
--sf-box-padding
--sf-breakout-width
--sf-btn-border-width
--sf-btn-font-scale
--sf-btn-font-size
--sf-btn-font-weight
--sf-btn-gap
--sf-btn-l-font-size
--sf-btn-l-min-height
--sf-btn-l-padding-block
--sf-btn-l-padding-inline
--sf-btn-m-font-size
--sf-btn-m-min-height
--sf-btn-m-padding-block
--sf-btn-m-padding-inline
--sf-btn-min-height
--sf-btn-padding-block
--sf-btn-padding-inline
--sf-btn-radius
--sf-btn-s-font-size
--sf-btn-s-min-height
--sf-btn-s-padding-block
--sf-btn-s-padding-inline
--sf-btn-xl-font-size
--sf-btn-xl-min-height
--sf-btn-xl-padding-block
--sf-btn-xl-padding-inline
--sf-btn-xs-font-size
--sf-btn-xs-min-height
--sf-btn-xs-padding-block
--sf-btn-xs-padding-inline
--sf-card-avatar-size
--sf-card-bg
--sf-card-border-color
--sf-card-border-width
--sf-card-gap
--sf-card-heading-size
--sf-card-media-radius
--sf-card-media-ratio
--sf-card-padding
--sf-card-radius
--sf-card-radius-outer
--sf-card-shadow
--sf-card-shadow--elevated
--sf-card-shadow--hover
--sf-caret-color
--sf-center-gutter
--sf-center-max
--sf-cluster-align
--sf-cluster-gap
--sf-cluster-justify
--sf-code-font-size
--sf-color-action
--sf-color-action--active
--sf-color-action--hover
--sf-color-action-100
--sf-color-action-200
--sf-color-action-300
--sf-color-action-400
--sf-color-action-50
--sf-color-action-500
--sf-color-action-600
--sf-color-action-700
--sf-color-action-800
--sf-color-action-900
--sf-color-action-950
--sf-color-action-a10
--sf-color-action-a30
--sf-color-action-a5
--sf-color-action-a50
--sf-color-action-a80
--sf-color-action-darker
--sf-color-action-lighter
--sf-color-action-muted
--sf-color-action-source-dark
--sf-color-action-source-light
--sf-color-action-subtle
--sf-color-action-superdark
--sf-color-action-superlight
--sf-color-action-tint
--sf-color-action-xdark
--sf-color-action-xlight
--sf-color-base
--sf-color-base--active
--sf-color-base--hover
--sf-color-base-100
--sf-color-base-200
--sf-color-base-300
--sf-color-base-400
--sf-color-base-50
--sf-color-base-500
--sf-color-base-600
--sf-color-base-700
--sf-color-base-800
--sf-color-base-900
--sf-color-base-950
--sf-color-base-a10
--sf-color-base-a30
--sf-color-base-a5
--sf-color-base-a50
--sf-color-base-a80
--sf-color-base-muted
--sf-color-base-source-dark
--sf-color-base-source-light
--sf-color-base-subtle
--sf-color-base-tint
--sf-color-bg
--sf-color-bg--active
--sf-color-bg--disabled
--sf-color-bg--focus
--sf-color-bg--hover
--sf-color-bg--selected
--sf-color-black
--sf-color-border
--sf-color-border--disabled
--sf-color-border--focus
--sf-color-border--strong
--sf-color-border--subtle
--sf-color-border--translucent
--sf-color-code-bg
--sf-color-code-text
--sf-color-danger
--sf-color-danger-muted
--sf-color-danger-source-dark
--sf-color-danger-source-light
--sf-color-danger-strong
--sf-color-danger-subtle
--sf-color-danger-tint
--sf-color-dim
--sf-color-heading
--sf-color-info
--sf-color-info-muted
--sf-color-info-source-dark
--sf-color-info-source-light
--sf-color-info-strong
--sf-color-info-subtle
--sf-color-info-tint
--sf-color-inset
--sf-color-inverse
--sf-color-link
--sf-color-link--active
--sf-color-link--disabled
--sf-color-link--hover
--sf-color-link--underline
--sf-color-link--visited
--sf-color-mark-bg
--sf-color-mark-text
--sf-color-neutral
--sf-color-neutral--active
--sf-color-neutral--hover
--sf-color-neutral-100
--sf-color-neutral-200
--sf-color-neutral-300
--sf-color-neutral-400
--sf-color-neutral-50
--sf-color-neutral-500
--sf-color-neutral-600
--sf-color-neutral-700
--sf-color-neutral-800
--sf-color-neutral-900
--sf-color-neutral-950
--sf-color-neutral-a10
--sf-color-neutral-a30
--sf-color-neutral-a5
--sf-color-neutral-a50
--sf-color-neutral-a80
--sf-color-neutral-darker
--sf-color-neutral-lighter
--sf-color-neutral-muted
--sf-color-neutral-source-dark
--sf-color-neutral-source-light
--sf-color-neutral-subtle
--sf-color-neutral-superdark
--sf-color-neutral-superlight
--sf-color-neutral-tint
--sf-color-neutral-xdark
--sf-color-neutral-xlight
--sf-color-overlay
--sf-color-primary
--sf-color-primary--active
--sf-color-primary--hover
--sf-color-primary-100
--sf-color-primary-200
--sf-color-primary-300
--sf-color-primary-400
--sf-color-primary-50
--sf-color-primary-500
--sf-color-primary-600
--sf-color-primary-700
--sf-color-primary-800
--sf-color-primary-900
--sf-color-primary-950
--sf-color-primary-a10
--sf-color-primary-a30
--sf-color-primary-a5
--sf-color-primary-a50
--sf-color-primary-a80
--sf-color-primary-darker
--sf-color-primary-lighter
--sf-color-primary-muted
--sf-color-primary-source-dark
--sf-color-primary-source-light
--sf-color-primary-subtle
--sf-color-primary-superdark
--sf-color-primary-superlight
--sf-color-primary-tint
--sf-color-primary-xdark
--sf-color-primary-xlight
--sf-color-raised
--sf-color-scheme
--sf-color-secondary
--sf-color-secondary--active
--sf-color-secondary--hover
--sf-color-secondary-100
--sf-color-secondary-200
--sf-color-secondary-300
--sf-color-secondary-400
--sf-color-secondary-50
--sf-color-secondary-500
--sf-color-secondary-600
--sf-color-secondary-700
--sf-color-secondary-800
--sf-color-secondary-900
--sf-color-secondary-950
--sf-color-secondary-a10
--sf-color-secondary-a30
--sf-color-secondary-a5
--sf-color-secondary-a50
--sf-color-secondary-a80
--sf-color-secondary-darker
--sf-color-secondary-lighter
--sf-color-secondary-muted
--sf-color-secondary-source-dark
--sf-color-secondary-source-light
--sf-color-secondary-subtle
--sf-color-secondary-superdark
--sf-color-secondary-superlight
--sf-color-secondary-tint
--sf-color-secondary-xdark
--sf-color-secondary-xlight
--sf-color-selection-bg
--sf-color-selection-bg--alt
--sf-color-selection-text
--sf-color-selection-text--alt
--sf-color-success
--sf-color-success-muted
--sf-color-success-source-dark
--sf-color-success-source-light
--sf-color-success-strong
--sf-color-success-subtle
--sf-color-success-tint
--sf-color-surface
--sf-color-tertiary
--sf-color-tertiary--active
--sf-color-tertiary--hover
--sf-color-tertiary-100
--sf-color-tertiary-200
--sf-color-tertiary-300
--sf-color-tertiary-400
--sf-color-tertiary-50
--sf-color-tertiary-500
--sf-color-tertiary-600
--sf-color-tertiary-700
--sf-color-tertiary-800
--sf-color-tertiary-900
--sf-color-tertiary-950
--sf-color-tertiary-a10
--sf-color-tertiary-a30
--sf-color-tertiary-a5
--sf-color-tertiary-a50
--sf-color-tertiary-a80
--sf-color-tertiary-darker
--sf-color-tertiary-lighter
--sf-color-tertiary-muted
--sf-color-tertiary-source-dark
--sf-color-tertiary-source-light
--sf-color-tertiary-subtle
--sf-color-tertiary-superdark
--sf-color-tertiary-superlight
--sf-color-tertiary-tint
--sf-color-tertiary-xdark
--sf-color-tertiary-xlight
--sf-color-text
--sf-color-text--disabled
--sf-color-text--inverse
--sf-color-text--muted
--sf-color-text--on-action
--sf-color-text--on-base
--sf-color-text--on-danger
--sf-color-text--on-info
--sf-color-text--on-inverse
--sf-color-text--on-neutral
--sf-color-text--on-primary
--sf-color-text--on-secondary
--sf-color-text--on-success
--sf-color-text--on-tertiary
--sf-color-text--on-warning
--sf-color-text--placeholder
--sf-color-text--subtle
--sf-color-warning
--sf-color-warning-muted
--sf-color-warning-source-dark
--sf-color-warning-source-light
--sf-color-warning-strong
--sf-color-warning-subtle
--sf-color-warning-tint
--sf-color-white
--sf-component-pad
--sf-container-default
--sf-container-full
--sf-container-narrow
--sf-container-prose
--sf-container-wide
--sf-content-gap
--sf-content-intrinsic-size
--sf-content-width
--sf-contrast-bias
--sf-contrast-threshold
--sf-cover-min-height
--sf-cover-padding
--sf-density
--sf-display-l-line-height
--sf-display-m-line-height
--sf-display-s-line-height
--sf-divider-color
--sf-divider-gap
--sf-divider-style
--sf-divider-width
--sf-drop-shadow-l
--sf-drop-shadow-m
--sf-drop-shadow-s
--sf-drop-shadow-xl
--sf-drop-shadow-xs
--sf-duration-fast
--sf-duration-instant
--sf-duration-none
--sf-duration-normal
--sf-duration-slow
--sf-duration-slower
--sf-ease-bounce
--sf-ease-elastic
--sf-ease-in
--sf-ease-in-out
--sf-ease-linear
--sf-ease-out
--sf-ease-overshoot
--sf-ease-spring
--sf-equal-gap
--sf-equal-min-col
--sf-equal-rule-color
--sf-equal-rule-style
--sf-equal-rule-width
--sf-field-block
--sf-field-padding-block
--sf-field-padding-inline
--sf-field-radius
--sf-field-required-marker
--sf-flow-space
--sf-fluid-max-vw
--sf-fluid-min-vw
--sf-fluid-width
--sf-focus-ring-color
--sf-focus-ring-offset
--sf-focus-ring-shadow
--sf-focus-ring-style
--sf-focus-ring-width
--sf-font-body
--sf-font-display
--sf-font-features
--sf-font-geometric
--sf-font-heading
--sf-font-humanist
--sf-font-mono
--sf-font-numeric
--sf-font-slab
--sf-font-variation
--sf-font-weight-body
--sf-font-weight-bold
--sf-font-weight-display
--sf-font-weight-heading
--sf-font-weight-interactive
--sf-font-weight-light
--sf-font-weight-medium
--sf-font-weight-normal
--sf-font-weight-semibold
--sf-font-weight-strong
--sf-frame-ratio
--sf-gap
--sf-gradient-action
--sf-gradient-brand
--sf-gradient-fade--b
--sf-gradient-fade--l
--sf-gradient-fade--r
--sf-gradient-fade--t
--sf-gradient-primary
--sf-gradient-secondary
--sf-gradient-surface
--sf-gradient-tertiary
--sf-grid-gap
--sf-grid-min
--sf-grid-min-2xl
--sf-grid-min-l
--sf-grid-min-m
--sf-grid-min-s
--sf-grid-min-xl
--sf-grid-min-xs
--sf-gutter
--sf-h1-font-weight
--sf-h1-letter-spacing
--sf-h1-line-height
--sf-h1-max-width
--sf-h1-size
--sf-h2-font-weight
--sf-h2-letter-spacing
--sf-h2-line-height
--sf-h2-max-width
--sf-h2-size
--sf-h3-font-weight
--sf-h3-letter-spacing
--sf-h3-line-height
--sf-h3-max-width
--sf-h3-size
--sf-h4-font-weight
--sf-h4-letter-spacing
--sf-h4-line-height
--sf-h4-max-width
--sf-h4-size
--sf-h5-font-weight
--sf-h5-letter-spacing
--sf-h5-line-height
--sf-h5-max-width
--sf-h5-size
--sf-h6-font-weight
--sf-h6-letter-spacing
--sf-h6-line-height
--sf-h6-max-width
--sf-h6-size
--sf-header-height
--sf-header-height-desktop
--sf-header-height-mobile
--sf-heading-color
--sf-heading-font-family
--sf-heading-text-wrap
--sf-hover-grow-scale
--sf-hover-lift
--sf-hover-shrink-scale
--sf-hover-slide
--sf-icon-2xl
--sf-icon-box-bg
--sf-icon-box-border
--sf-icon-box-pad
--sf-icon-box-radius
--sf-icon-l
--sf-icon-m
--sf-icon-s
--sf-icon-xl
--sf-icon-xs
--sf-imposter-margin
--sf-is-dark
--sf-leading-normal
--sf-leading-relaxed
--sf-leading-snug
--sf-leading-taper
--sf-leading-tight
--sf-line-clamp
--sf-link-external-label
--sf-link-external-marker
--sf-link-underline-offset
--sf-link-underline-thickness
--sf-lumlocker
--sf-lumlocker-dark
--sf-mask-scrim-end
--sf-mask-scrim-start
--sf-media-radius
--sf-motion-scale
--sf-object-fit
--sf-object-position
--sf-opacity-disabled
--sf-opacity-muted
--sf-optical-sizing
--sf-overlap-pull
--sf-palette-shade-l
--sf-palette-tint-l
--sf-print-base-size
--sf-print-page-margin
--sf-print-page-size
--sf-prose-block-margin
--sf-prose-blockquote-border
--sf-prose-blockquote-padding
--sf-prose-figcaption-size
--sf-prose-figure-margin
--sf-prose-heading-gap
--sf-prose-hr-margin
--sf-prose-list-gap
--sf-prose-marker-color
--sf-prose-media-margin
--sf-prose-media-radius
--sf-prose-nested-list-gap
--sf-prose-paragraph
--sf-prose-table-pad
--sf-radius-2xl
--sf-radius-2xs
--sf-radius-3xl
--sf-radius-4xl
--sf-radius-full
--sf-radius-l
--sf-radius-m
--sf-radius-none
--sf-radius-outer
--sf-radius-pill
--sf-radius-s
--sf-radius-scale
--sf-radius-xl
--sf-radius-xs
--sf-ratio-3-2
--sf-ratio-4-3
--sf-ratio-cinema
--sf-ratio-golden
--sf-ratio-portrait
--sf-ratio-square
--sf-ratio-video
--sf-reel-gap
--sf-reel-height
--sf-reel-item-width
--sf-safe-bottom
--sf-safe-left
--sf-safe-right
--sf-safe-top
--sf-scrim-color
--sf-scrim-direction
--sf-scrim-gradient
--sf-scrim-text-shadow
--sf-scroll-shadow-size
--sf-scroll-timeline-range-end
--sf-scroll-timeline-range-exit-end
--sf-scroll-timeline-range-exit-start
--sf-scroll-timeline-range-start
--sf-scrollbar-thumb
--sf-scrollbar-track
--sf-section-pad
--sf-section-pad--2xl
--sf-section-pad--l
--sf-section-pad--m
--sf-section-pad--s
--sf-section-pad--xl
--sf-section-pad--xs
--sf-section-scale
--sf-shadow-2xl
--sf-shadow-color
--sf-shadow-glow
--sf-shadow-glow-color
--sf-shadow-inner
--sf-shadow-l
--sf-shadow-lightness
--sf-shadow-m
--sf-shadow-none
--sf-shadow-s
--sf-shadow-strength
--sf-shadow-xl
--sf-shadow-xs
--sf-sidebar-gap
--sf-sidebar-min-width
--sf-sidebar-width
--sf-size-l
--sf-size-m
--sf-size-s
--sf-size-xl
--sf-size-xs
--sf-space-2xl
--sf-space-2xs
--sf-space-3xl
--sf-space-4xl
--sf-space-base-max
--sf-space-base-min
--sf-space-l
--sf-space-m
--sf-space-none
--sf-space-px
--sf-space-ratio-max
--sf-space-ratio-min
--sf-space-s
--sf-space-scale
--sf-space-xl
--sf-space-xs
--sf-stack-gap
--sf-stagger-step
--sf-sticky-offset
--sf-sticky-offset-desktop
--sf-sticky-offset-mobile
--sf-surface-bg-animation
--sf-surface-bg-attachment
--sf-surface-bg-color
--sf-surface-bg-image
--sf-surface-bg-overlay
--sf-surface-bg-position
--sf-surface-bg-repeat
--sf-surface-bg-size
--sf-surface-color
--sf-switcher-gap
--sf-switcher-threshold
--sf-text-2xl
--sf-text-2xl-font-weight
--sf-text-2xl-letter-spacing
--sf-text-2xl-line-height
--sf-text-2xl-max-width
--sf-text-2xs
--sf-text-2xs-font-weight
--sf-text-2xs-letter-spacing
--sf-text-2xs-line-height
--sf-text-2xs-max-width
--sf-text-3xl
--sf-text-3xl-font-weight
--sf-text-3xl-letter-spacing
--sf-text-3xl-line-height
--sf-text-3xl-max-width
--sf-text-4xl
--sf-text-4xl-font-weight
--sf-text-4xl-letter-spacing
--sf-text-4xl-line-height
--sf-text-4xl-max-width
--sf-text-base-max
--sf-text-base-min
--sf-text-display-base-max
--sf-text-display-base-min
--sf-text-display-l
--sf-text-display-m
--sf-text-display-s
--sf-text-display-scale
--sf-text-l
--sf-text-l-font-weight
--sf-text-l-letter-spacing
--sf-text-l-line-height
--sf-text-l-max-width
--sf-text-m
--sf-text-m-font-weight
--sf-text-m-letter-spacing
--sf-text-m-line-height
--sf-text-m-max-width
--sf-text-ratio-max
--sf-text-ratio-min
--sf-text-s
--sf-text-s-font-weight
--sf-text-s-letter-spacing
--sf-text-s-line-height
--sf-text-s-max-width
--sf-text-scale
--sf-text-shadow-l
--sf-text-shadow-m
--sf-text-shadow-none
--sf-text-shadow-s
--sf-text-shadow-xl
--sf-text-shadow-xs
--sf-text-xl
--sf-text-xl-font-weight
--sf-text-xl-letter-spacing
--sf-text-xl-line-height
--sf-text-xl-max-width
--sf-text-xs
--sf-text-xs-font-weight
--sf-text-xs-letter-spacing
--sf-text-xs-line-height
--sf-text-xs-max-width
--sf-theme-transition-duration
--sf-touch-target
--sf-tracking-normal
--sf-tracking-tight
--sf-tracking-wide
--sf-tracking-wider
--sf-tracking-widest
--sf-transition-colors
--sf-transition-enter
--sf-transition-exit
--sf-transition-fast
--sf-transition-form-field
--sf-transition-opacity
--sf-transition-overlay
--sf-transition-shadow
--sf-transition-slow
--sf-transition-transform
--sf-z-base
--sf-z-below
--sf-z-dropdown
--sf-z-fixed
--sf-z-modal
--sf-z-overlay
--sf-z-raised
--sf-z-sticky
--sf-z-toast
--sf-z-tooltip