# Token usage reference

Generated from the legacy palette plus `contract.json` by `node scripts/tokens/generate.mjs`. All semantic and component roles are listed; primitive values are in the DTCG exports. No legacy name is deprecated or removed.

Use browser Find or search `usage.json` by `path`, `purpose`, `scope`, `override`, `legacy` or `css`. Copy the exact path/CSS name from each row. This machine-readable file lets batch 3 add search/copy controls without maintaining another value table.

Read [architecture, units and tenant boundaries](ARCHITECTURE.md) first. Every colour pairing, including failed state/boundary combinations and computed replacements, is in the [contrast matrix](contrast-matrix.md); the partner column is role guidance, not a blanket contrast guarantee. Only the matrix’s required-pair table lists asserted combinations.

CSS: import `portable.css` (it imports the original `tokens.css`). New colours are complete CSS colours: `color: var(--sw-semantic-color-ink)`. Legacy colours remain RGB triplets: `color: rgb(var(--color-ink))`. Component aliases inherit semantic changes. DTCG paths are identical to the first column. Native names replace dots/hyphens with underscores and begin `sw_`.

> **Current rule (v2.1.0, 2026-11-13; DSA-014):** `line` and `danger-line` are decorative. `outline` has restricted backgrounds; use `boundary-strong` for essential neutral boundaries across hover/pressed surfaces. Use `state-indicator` (accent-ink), or tenant brand-boundary, for essential thin selected marks. Preserve the legacy colours.

## semantic roles

| Path / CSS / legacy | Purpose / scope / override | Use | Do not use | Light | Dark | Contrast partner | Aliases light / dark |
|---|---|---|---|---|---|---|---|
| `semantic.color.bg` / `--sw-semantic-color-bg` / --color-bg | bg background; system; override: none | Page canvas | Do not use as text or an essential boundary. | #FFF4E8 | #000000 | ink, muted | "{primitive.color.hexfff4e8}" / "{primitive.color.hex000000}" |
| `semantic.color.surface` / `--sw-semantic-color-surface` / --color-surface | surface background; system; override: none | Inset or secondary surface | Do not use as text or an essential boundary. | #F6ECE0 | #0B0B0B | ink, muted | "{primitive.color.hexf6ece0}" / "{primitive.color.hex0b0b0b}" |
| `semantic.color.panel` / `--sw-semantic-color-panel` / --color-panel | panel background; system; override: none | Cards and floating panels | Do not use as text or an essential boundary. | #FFFFFF | #141414 | ink, muted | "{primitive.color.hexffffff}" / "{primitive.color.hex141414}" |
| `semantic.color.hover` / `--sw-semantic-color-hover` / --color-hover | hover background; system; override: none | Neutral hover state | Do not use as text or an essential boundary. | #EFE6DB | #1C1C1C | ink, muted | "{primitive.color.hexefe6db}" / "{primitive.color.hex1c1c1c}" |
| `semantic.color.line` / `--sw-semantic-color-line` / --color-line | Decorative divider; system; override: none | Nonessential card separators; accompany danger with text/icon | Never the only necessary control, focus or error cue; see contrast matrix. | #D5D0C6 | #2C2C2C | bg, surface, panel, hover | "{primitive.color.hexd5d0c6}" / "{primitive.color.hex2c2c2c}" |
| `semantic.color.outline` / `--sw-semantic-color-outline` / --color-outline | Legacy neutral control outline; system; override: none | Only pairings marked PASS; use boundary-strong across hover and pressed surfaces | Never the only necessary control, focus or error cue; see contrast matrix. | #828A83 | #787878 | bg, surface, panel, hover | "{primitive.color.hex828a83}" / "{primitive.color.hex787878}" |
| `semantic.color.ink` / `--sw-semantic-color-ink` / --color-ink | Primary text and icons; system; override: none | Content, labels and icons on neutral surfaces | No alpha text; no use on filled teal or bright status fills. | #142C2A | #FFF4E8 | bg, surface, panel, hover | "{primitive.color.hex142c2a}" / "{primitive.color.hexfff4e8}" |
| `semantic.color.muted` / `--sw-semantic-color-muted` / --color-muted | Secondary text, labels and placeholders; system; override: none | Supporting text and placeholders with a visible label | No alpha text; no use on filled teal or bright status fills. | #5B6863 | #ACACAC | bg, surface, panel, hover | "{primitive.color.hex5b6863}" / "{primitive.color.hexacacac}" |
| `semantic.color.focus` / `--sw-semantic-color-focus` / --color-focus | Visible keyboard focus pigment; system; override: none | 2px external outline with 2px gap on neutral surroundings | Do not rely on hue alone or place directly on a matching fill; check both adjacent colours. | #006E63 | #DFFF8F | bg, surface, panel, hover | "{primitive.color.hex006e63}" / "{primitive.color.hexdfff8f}" |
| `semantic.color.accent` / `--sw-semantic-color-accent` / --color-accent | accent fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #006E63 | #006E63 | on-accent | "{primitive.color.hex006e63}" / "{primitive.color.hex006e63}" |
| `semantic.color.accent-hover` / `--sw-semantic-color-accent-hover` / --color-accent-hover | accent-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #02675D | #02675D | on-accent | "{primitive.color.hex02675d}" / "{primitive.color.hex02675d}" |
| `semantic.color.accent-active` / `--sw-semantic-color-accent-active` / --color-accent-active | accent-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #046158 | #046158 | on-accent | "{primitive.color.hex046158}" / "{primitive.color.hex046158}" |
| `semantic.color.on-accent` / `--sw-semantic-color-on-accent` / --color-on-accent | Label on accent fill; system; override: none | Opaque text/icons on accent default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #FFF4E8 | #FFF4E8 | accent, accent-hover, accent-active | "{primitive.color.hexfff4e8}" / "{primitive.color.hexfff4e8}" |
| `semantic.color.accent-soft` / `--sw-semantic-color-accent-soft` / --color-accent-soft | accent-soft opaque tint; system; override: none | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #E0EEEC | #121D1C | accent-ink, ink, muted (verify matrix) | "{primitive.color.hexe0eeec}" / "{primitive.color.hex121d1c}" |
| `semantic.color.accent-ink` / `--sw-semantic-color-accent-ink` / --color-accent-ink | Readable accent-ink foreground; system; override: none | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #006E63 | #80B1A6 | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex006e63}" / "{primitive.color.hex80b1a6}" |
| `semantic.color.brand` / `--sw-semantic-color-brand` / --color-brand | brand fill; system; override: tenant-public | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #006E63 | #006E63 | on-brand | "{primitive.color.hex006e63}" / "{primitive.color.hex006e63}" |
| `semantic.color.brand-hover` / `--sw-semantic-color-brand-hover` / --color-brand-hover | brand-hover fill; system; override: tenant-public | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #02675D | #02675D | on-brand | "{primitive.color.hex02675d}" / "{primitive.color.hex02675d}" |
| `semantic.color.brand-active` / `--sw-semantic-color-brand-active` / --color-brand-active | brand-active fill; system; override: tenant-public | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #046158 | #046158 | on-brand | "{primitive.color.hex046158}" / "{primitive.color.hex046158}" |
| `semantic.color.on-brand` / `--sw-semantic-color-on-brand` / --color-on-brand | Label on brand fill; system; override: tenant-public | Opaque text/icons on brand default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #FFF4E8 | #FFF4E8 | brand, brand-hover, brand-active | "{primitive.color.hexfff4e8}" / "{primitive.color.hexfff4e8}" |
| `semantic.color.brand-soft` / `--sw-semantic-color-brand-soft` / --color-brand-soft | brand-soft opaque tint; system; override: tenant-public | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #E0EEEC | #121D1C | brand-ink, ink, muted (verify matrix) | "{primitive.color.hexe0eeec}" / "{primitive.color.hex121d1c}" |
| `semantic.color.brand-ink` / `--sw-semantic-color-brand-ink` / --color-brand-ink | Readable brand-ink foreground; system; override: tenant-public | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #006E63 | #80B1A6 | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex006e63}" / "{primitive.color.hex80b1a6}" |
| `semantic.color.brand-boundary` / `--sw-semantic-color-brand-boundary` / --color-brand-boundary | Essential tenant-brand boundary; system; override: tenant-public | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #006E63 | #80B1A6 | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex006e63}" / "{primitive.color.hex80b1a6}" |
| `semantic.color.emphasis` / `--sw-semantic-color-emphasis` / --color-emphasis | emphasis fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #FF7447 | #FF7447 | on-emphasis | "{primitive.color.hexff7447}" / "{primitive.color.hexff7447}" |
| `semantic.color.emphasis-hover` / `--sw-semantic-color-emphasis-hover` / --color-emphasis-hover | emphasis-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #FF8157 | #FF8157 | on-emphasis | "{primitive.color.hexff8157}" / "{primitive.color.hexff8157}" |
| `semantic.color.emphasis-active` / `--sw-semantic-color-emphasis-active` / --color-emphasis-active | emphasis-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #FF8E67 | #FF8E67 | on-emphasis | "{primitive.color.hexff8e67}" / "{primitive.color.hexff8e67}" |
| `semantic.color.on-emphasis` / `--sw-semantic-color-on-emphasis` / --color-on-emphasis | Label on emphasis fill; system; override: none | Opaque text/icons on emphasis default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #142C2A | #142C2A | emphasis, emphasis-hover, emphasis-active | "{primitive.color.hex142c2a}" / "{primitive.color.hex142c2a}" |
| `semantic.color.emphasis-soft` / `--sw-semantic-color-emphasis-soft` / --color-emphasis-soft | emphasis-soft opaque tint; system; override: none | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #FFEEE9 | #221A17 | emphasis-ink, ink, muted (verify matrix) | "{primitive.color.hexffeee9}" / "{primitive.color.hex221a17}" |
| `semantic.color.success` / `--sw-semantic-color-success` / --color-success | success fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #DFFF8F | #DFFF8F | on-success | "{primitive.color.hexdfff8f}" / "{primitive.color.hexdfff8f}" |
| `semantic.color.success-hover` / `--sw-semantic-color-success-hover` / --color-success-hover | success-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #CBEA85 | #CBEA85 | on-success | "{primitive.color.hexcbea85}" / "{primitive.color.hexcbea85}" |
| `semantic.color.success-active` / `--sw-semantic-color-success-active` / --color-success-active | success-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #B6D57B | #B6D57B | on-success | "{primitive.color.hexb6d57b}" / "{primitive.color.hexb6d57b}" |
| `semantic.color.on-success` / `--sw-semantic-color-on-success` / --color-on-success | Label on success fill; system; override: none | Opaque text/icons on success default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #142C2A | #142C2A | success, success-hover, success-active | "{primitive.color.hex142c2a}" / "{primitive.color.hex142c2a}" |
| `semantic.color.success-soft` / `--sw-semantic-color-success-soft` / --color-success-soft | success-soft opaque tint; system; override: none | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #FBFFF2 | #20221B | success-ink, ink, muted (verify matrix) | "{primitive.color.hexfbfff2}" / "{primitive.color.hex20221b}" |
| `semantic.color.success-ink` / `--sw-semantic-color-success-ink` / --color-success-ink | Readable success-ink foreground; system; override: none | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #536D49 | #E9FCAA | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex536d49}" / "{primitive.color.hexe9fcaa}" |
| `semantic.color.warn` / `--sw-semantic-color-warn` / --color-warn | warn fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #FFD447 | #FFD447 | on-warn | "{primitive.color.hexffd447}" / "{primitive.color.hexffd447}" |
| `semantic.color.warn-hover` / `--sw-semantic-color-warn-hover` / --color-warn-hover | warn-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #E8C344 | #E8C344 | on-warn | "{primitive.color.hexe8c344}" / "{primitive.color.hexe8c344}" |
| `semantic.color.warn-active` / `--sw-semantic-color-warn-active` / --color-warn-active | warn-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #D0B241 | #D0B241 | on-warn | "{primitive.color.hexd0b241}" / "{primitive.color.hexd0b241}" |
| `semantic.color.on-warn` / `--sw-semantic-color-on-warn` / --color-on-warn | Label on warn fill; system; override: none | Opaque text/icons on warn default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #142C2A | #142C2A | warn, warn-hover, warn-active | "{primitive.color.hex142c2a}" / "{primitive.color.hex142c2a}" |
| `semantic.color.warn-soft` / `--sw-semantic-color-warn-soft` / --color-warn-soft | warn-soft opaque tint; system; override: none | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #FFFAE9 | #222017 | warn-ink, ink, muted (verify matrix) | "{primitive.color.hexfffae9}" / "{primitive.color.hex222017}" |
| `semantic.color.warn-ink` / `--sw-semantic-color-warn-ink` / --color-warn-ink | Readable warn-ink foreground; system; override: none | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #696834 | #FFDE77 | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex696834}" / "{primitive.color.hexffde77}" |
| `semantic.color.info` / `--sw-semantic-color-info` / --color-info | info fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #B5CDFF | #B5CDFF | on-info | "{primitive.color.hexb5cdff}" / "{primitive.color.hexb5cdff}" |
| `semantic.color.info-hover` / `--sw-semantic-color-info-hover` / --color-info-hover | info-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #A5BDEA | #A5BDEA | on-info | "{primitive.color.hexa5bdea}" / "{primitive.color.hexa5bdea}" |
| `semantic.color.info-active` / `--sw-semantic-color-info-active` / --color-info-active | info-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #95ADD4 | #95ADD4 | on-info | "{primitive.color.hex95add4}" / "{primitive.color.hex95add4}" |
| `semantic.color.on-info` / `--sw-semantic-color-on-info` / --color-on-info | Label on info fill; system; override: none | Opaque text/icons on info default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #142C2A | #142C2A | info, info-hover, info-active | "{primitive.color.hex142c2a}" / "{primitive.color.hex142c2a}" |
| `semantic.color.info-soft` / `--sw-semantic-color-info-soft` / --color-info-soft | info-soft opaque tint; system; override: none | Badges, pills and contextual panels | No alpha tints; no danger-soft token exists. | #F6F9FF | #1E1F22 | info-ink, ink, muted (verify matrix) | "{primitive.color.hexf6f9ff}" / "{primitive.color.hex1e1f22}" |
| `semantic.color.info-ink` / `--sw-semantic-color-info-ink` / --color-info-ink | Readable info-ink foreground; system; override: none | Links, icons, thin selected marks on neutral/soft grounds; check exact pairing | Filled-button labels; use on-* instead. | #51697B | #CBD9F8 | bg, surface, panel, hover, corresponding soft fill | "{primitive.color.hex51697b}" / "{primitive.color.hexcbd9f8}" |
| `semantic.color.danger` / `--sw-semantic-color-danger` / --color-danger | danger fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #B91C1C | #FCA5A5 | on-danger | "{primitive.color.hexb91c1c}" / "{primitive.color.hexfca5a5}" |
| `semantic.color.danger-hover` / `--sw-semantic-color-danger-hover` / --color-danger-hover | danger-hover fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #991B1B | #FDB9B6 | on-danger | "{primitive.color.hex991b1b}" / "{primitive.color.hexfdb9b6}" |
| `semantic.color.danger-active` / `--sw-semantic-color-danger-active` / --color-danger-active | danger-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #851E1D | #FDC9C3 | on-danger | "{primitive.color.hex851e1d}" / "{primitive.color.hexfdc9c3}" |
| `semantic.color.on-danger` / `--sw-semantic-color-on-danger` / --color-on-danger | Label on danger fill; system; override: none | Opaque text/icons on danger default, hover and active fills | Neutral backgrounds, soft fills or another status fill without checking contrast. | #FFF4E8 | #142C2A | danger, danger-hover, danger-active | "{primitive.color.hexfff4e8}" / "{primitive.color.hex142c2a}" |
| `semantic.color.danger-line` / `--sw-semantic-color-danger-line` / --color-danger-line | Decorative danger-card border; system; override: none | Nonessential card separators; accompany danger with text/icon | Never the only necessary control, focus or error cue; see contrast matrix. | #FCA5A5 | #7C6261 | bg, surface, panel, hover | "{primitive.color.hexfca5a5}" / "{primitive.color.hex7c6261}" |
| `semantic.color.sidebar` / `--sw-semantic-color-sidebar` / --color-sidebar | sidebar background; system; override: none | Sidebar ground or row hover | Do not use as text or an essential boundary. | #DFFF8F | #0B0B0B | sidebar-ink (selected rows use on-accent) | "{primitive.color.hexdfff8f}" / "{primitive.color.hex0b0b0b}" |
| `semantic.color.sidebar-hover` / `--sw-semantic-color-sidebar-hover` / --color-sidebar-hover | sidebar-hover background; system; override: none | Sidebar ground or row hover | Do not use as text or an essential boundary. | #F2FFD2 | #1C1C1C | sidebar-ink (selected rows use on-accent) | "{primitive.color.hexf2ffd2}" / "{primitive.color.hex1c1c1c}" |
| `semantic.color.sidebar-active` / `--sw-semantic-color-sidebar-active` / --color-sidebar-active | sidebar-active fill; system; override: none | Opaque named action/status fill in its stated interaction state | Not a text ink or essential thin state mark; use *-ink, brand-boundary or state-indicator. | #006E63 | #006E63 | on-accent | "{primitive.color.hex006e63}" / "{primitive.color.hex006e63}" |
| `semantic.color.scrim` / `--sw-semantic-color-scrim` / --color-scrim | Modal backdrop pigment; system; override: none | Composite over page at named scrim opacity; isolate from dialog content | Text colour or a translucent parent of content. | #142C2A | #000000 | Composite over bg, surface, panel; not a label foreground | "{primitive.color.hex142c2a}" / "{primitive.color.hex000000}" |
| `semantic.chart.series1` / `--sw-semantic-chart-series1` / --chart-1 | Stable categorical chart fill series1; chart; override: none | Hash series identity into series1–5; add dash/shape cues | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #006E63 | #006E63 | chart.edge; labels use ink on panel | "{primitive.color.hex006e63}" / "{primitive.color.hex006e63}" |
| `semantic.chart.series2` / `--sw-semantic-chart-series2` / --chart-2 | Stable categorical chart fill series2; chart; override: none | Hash series identity into series1–5; add dash/shape cues | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #FF7447 | #FF7447 | chart.edge; labels use ink on panel | "{primitive.color.hexff7447}" / "{primitive.color.hexff7447}" |
| `semantic.chart.series3` / `--sw-semantic-chart-series3` / --chart-3 | Stable categorical chart fill series3; chart; override: none | Hash series identity into series1–5; add dash/shape cues | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #DFFF8F | #DFFF8F | chart.edge; labels use ink on panel | "{primitive.color.hexdfff8f}" / "{primitive.color.hexdfff8f}" |
| `semantic.chart.series4` / `--sw-semantic-chart-series4` / --chart-4 | Stable categorical chart fill series4; chart; override: none | Hash series identity into series1–5; add dash/shape cues | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #B5CDFF | #B5CDFF | chart.edge; labels use ink on panel | "{primitive.color.hexb5cdff}" / "{primitive.color.hexb5cdff}" |
| `semantic.chart.series5` / `--sw-semantic-chart-series5` / --chart-5 | Stable categorical chart fill series5; chart; override: none | Hash series identity into series1–5; add dash/shape cues | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #FFD447 | #FFD447 | chart.edge; labels use ink on panel | "{primitive.color.hexffd447}" / "{primitive.color.hexffd447}" |
| `semantic.chart.edge` / `--sw-semantic-chart-edge` / --chart-edge | Chart mark edge and line casing; chart; override: none | 1px filled-mark edge, 4px casing under a 2px line | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #142C2A | #FFF4E8 | Chart fills and panel | "{primitive.color.hex142c2a}" / "{primitive.color.hexfff4e8}" |
| `semantic.chart.danger` / `--sw-semantic-chart-danger` / --chart-danger | Explicit negative chart data; chart; override: none | Bad/negative values only; never categorical order | Never use fill alone as a low-contrast necessary line; never convey data by colour alone. | #B91C1C | #FCA5A5 | chart.edge; labels use ink on panel | "{primitive.color.hexb91c1c}" / "{primitive.color.hexfca5a5}" |
| `semantic.spacing.0` / `--sw-semantic-spacing-0` | spacing 0; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 0px | 0px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.0}" / "{primitive.spacing.0}" |
| `semantic.spacing.4` / `--sw-semantic-spacing-4` | spacing 4; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 4px | 4px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.4}" / "{primitive.spacing.4}" |
| `semantic.spacing.8` / `--sw-semantic-spacing-8` | spacing 8; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 8px | 8px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.8}" / "{primitive.spacing.8}" |
| `semantic.spacing.12` / `--sw-semantic-spacing-12` | spacing 12; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 12px | 12px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.12}" / "{primitive.spacing.12}" |
| `semantic.spacing.16` / `--sw-semantic-spacing-16` | spacing 16; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 16px | 16px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.16}" / "{primitive.spacing.16}" |
| `semantic.spacing.20` / `--sw-semantic-spacing-20` | spacing 20; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 20px | 20px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.20}" / "{primitive.spacing.20}" |
| `semantic.spacing.24` / `--sw-semantic-spacing-24` | spacing 24; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 24px | 24px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.24}" / "{primitive.spacing.24}" |
| `semantic.spacing.28` / `--sw-semantic-spacing-28` | spacing 28; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 28px | 28px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.28}" / "{primitive.spacing.28}" |
| `semantic.spacing.32` / `--sw-semantic-spacing-32` | spacing 32; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 32px | 32px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.32}" / "{primitive.spacing.32}" |
| `semantic.spacing.36` / `--sw-semantic-spacing-36` | spacing 36; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 36px | 36px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.36}" / "{primitive.spacing.36}" |
| `semantic.spacing.40` / `--sw-semantic-spacing-40` | spacing 40; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 40px | 40px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.40}" / "{primitive.spacing.40}" |
| `semantic.spacing.44` / `--sw-semantic-spacing-44` | spacing 44; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 44px | 44px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.44}" / "{primitive.spacing.44}" |
| `semantic.spacing.48` / `--sw-semantic-spacing-48` | spacing 48; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 48px | 48px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.48}" / "{primitive.spacing.48}" |
| `semantic.spacing.56` / `--sw-semantic-spacing-56` | spacing 56; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 56px | 56px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.56}" / "{primitive.spacing.56}" |
| `semantic.spacing.64` / `--sw-semantic-spacing-64` | spacing 64; system; override: none | 4px layout grid; choose the smallest step that preserves grouping | No arbitrary replacement of the named semantic/component role. | 64px | 64px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.64}" / "{primitive.spacing.64}" |
| `semantic.radius.none` / `--sw-semantic-radius-none` | radius none; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 0px | 0px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.none}" / "{primitive.radius.none}" |
| `semantic.radius.sm` / `--sw-semantic-radius-sm` | radius sm; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 6px | 6px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.sm}" / "{primitive.radius.sm}" |
| `semantic.radius.base` / `--sw-semantic-radius-base` | radius base; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 8px | 8px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.base}" / "{primitive.radius.base}" |
| `semantic.radius.md` / `--sw-semantic-radius-md` | radius md; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 10px | 10px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.md}" / "{primitive.radius.md}" |
| `semantic.radius.lg` / `--sw-semantic-radius-lg` | radius lg; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 12px | 12px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.lg}" / "{primitive.radius.lg}" |
| `semantic.radius.xl` / `--sw-semantic-radius-xl` | radius xl; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 16px | 16px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.xl}" / "{primitive.radius.xl}" |
| `semantic.radius.2xl` / `--sw-semantic-radius-2xl` | radius 2xl; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 20px | 20px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.2xl}" / "{primitive.radius.2xl}" |
| `semantic.radius.full` / `--sw-semantic-radius-full` | radius full; system; override: none | Shape scale; controls use semantic.radius.control and cards use semantic.radius.card | No arbitrary replacement of the named semantic/component role. | 9999px | 9999px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.full}" / "{primitive.radius.full}" |
| `semantic.border-width.none` / `--sw-semantic-border-width-none` | border-width none; system; override: none | 1px borders, 2px focus/selected underline, 4px chart casing | No arbitrary replacement of the named semantic/component role. | 0px | 0px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.none}" / "{primitive.border-width.none}" |
| `semantic.border-width.hairline` / `--sw-semantic-border-width-hairline` | border-width hairline; system; override: none | 1px borders, 2px focus/selected underline, 4px chart casing | No arbitrary replacement of the named semantic/component role. | 1px | 1px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.hairline}" / "{primitive.border-width.hairline}" |
| `semantic.border-width.strong` / `--sw-semantic-border-width-strong` | border-width strong; system; override: none | 1px borders, 2px focus/selected underline, 4px chart casing | No arbitrary replacement of the named semantic/component role. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.strong}" / "{primitive.border-width.strong}" |
| `semantic.border-width.casing` / `--sw-semantic-border-width-casing` | border-width casing; system; override: none | 1px borders, 2px focus/selected underline, 4px chart casing | No arbitrary replacement of the named semantic/component role. | 4px | 4px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.casing}" / "{primitive.border-width.casing}" |
| `semantic.breakpoint.sm` / `--sw-semantic-breakpoint-sm` | breakpoint sm; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 640px | 640px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.sm}" / "{primitive.breakpoint.sm}" |
| `semantic.breakpoint.md` / `--sw-semantic-breakpoint-md` | breakpoint md; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 768px | 768px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.md}" / "{primitive.breakpoint.md}" |
| `semantic.breakpoint.lg` / `--sw-semantic-breakpoint-lg` | breakpoint lg; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 1024px | 1024px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.lg}" / "{primitive.breakpoint.lg}" |
| `semantic.breakpoint.xl` / `--sw-semantic-breakpoint-xl` | breakpoint xl; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 1280px | 1280px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.xl}" / "{primitive.breakpoint.xl}" |
| `semantic.breakpoint.2xl` / `--sw-semantic-breakpoint-2xl` | breakpoint 2xl; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 1536px | 1536px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.2xl}" / "{primitive.breakpoint.2xl}" |
| `semantic.breakpoint.wide` / `--sw-semantic-breakpoint-wide` | breakpoint wide; system; override: none | Minimum viewport widths; 2xl is the inherited Tailwind default, wide is the app 1680px adaptation | No arbitrary replacement of the named semantic/component role. | 1680px | 1680px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.breakpoint.wide}" / "{primitive.breakpoint.wide}" |
| `semantic.size.control` / `--sw-semantic-size-control` | size control; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 44px | 44px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.control}" / "{primitive.size.control}" |
| `semantic.size.row-list` / `--sw-semantic-size-row-list` | size row-list; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 56px | 56px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.row-list}" / "{primitive.size.row-list}" |
| `semantic.size.row-table` / `--sw-semantic-size-row-table` | size row-table; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 48px | 48px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.row-table}" / "{primitive.size.row-table}" |
| `semantic.size.sidebar` / `--sw-semantic-size-sidebar` | size sidebar; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 256px | 256px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.sidebar}" / "{primitive.size.sidebar}" |
| `semantic.size.sidebar-app` / `--sw-semantic-size-sidebar-app` | size sidebar-app; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 264px | 264px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.sidebar-app}" / "{primitive.size.sidebar-app}" |
| `semantic.size.bottom-tabs` / `--sw-semantic-size-bottom-tabs` | size bottom-tabs; system; override: none | Minimum geometry; allow text growth and safe-area padding | No arbitrary replacement of the named semantic/component role. | 64px | 64px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.size.bottom-tabs}" / "{primitive.size.bottom-tabs}" |
| `semantic.layer.base` / `--sw-semantic-layer-base` | layer base; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 0 | 0 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.base}" / "{primitive.layer.base}" |
| `semantic.layer.local` / `--sw-semantic-layer-local` | layer local; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 1 | 1 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.local}" / "{primitive.layer.local}" |
| `semantic.layer.raised` / `--sw-semantic-layer-raised` | layer raised; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 2 | 2 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.raised}" / "{primitive.layer.raised}" |
| `semantic.layer.sticky` / `--sw-semantic-layer-sticky` | layer sticky; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 10 | 10 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.sticky}" / "{primitive.layer.sticky}" |
| `semantic.layer.fixed` / `--sw-semantic-layer-fixed` | layer fixed; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 20 | 20 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.fixed}" / "{primitive.layer.fixed}" |
| `semantic.layer.navigation` / `--sw-semantic-layer-navigation` | layer navigation; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 30 | 30 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.navigation}" / "{primitive.layer.navigation}" |
| `semantic.layer.popover` / `--sw-semantic-layer-popover` | layer popover; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 40 | 40 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.popover}" / "{primitive.layer.popover}" |
| `semantic.layer.overlay` / `--sw-semantic-layer-overlay` | layer overlay; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 50 | 50 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.overlay}" / "{primitive.layer.overlay}" |
| `semantic.layer.critical` / `--sw-semantic-layer-critical` | layer critical; system; override: none | Stacking within a common context; nested overlays still require a stack manager | No arbitrary replacement of the named semantic/component role. | 60 | 60 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.layer.critical}" / "{primitive.layer.critical}" |
| `semantic.opacity.hidden` / `--sw-semantic-opacity-hidden` | opacity hidden; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0 | 0 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.hidden}" / "{primitive.opacity.hidden}" |
| `semantic.opacity.shadow-near` / `--sw-semantic-opacity-shadow-near` | opacity shadow-near; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.06 | 0.06 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.shadow-near}" / "{primitive.opacity.shadow-near}" |
| `semantic.opacity.shadow-far` / `--sw-semantic-opacity-shadow-far` | opacity shadow-far; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.1 | 0.1 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.shadow-far}" / "{primitive.opacity.shadow-far}" |
| `semantic.opacity.scrim-light` / `--sw-semantic-opacity-scrim-light` | opacity scrim-light; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.3 | 0.3 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.scrim-light}" / "{primitive.opacity.scrim-light}" |
| `semantic.opacity.scrim-medium` / `--sw-semantic-opacity-scrim-medium` | opacity scrim-medium; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.35 | 0.35 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.scrim-medium}" / "{primitive.opacity.scrim-medium}" |
| `semantic.opacity.scrim-default` / `--sw-semantic-opacity-scrim-default` | opacity scrim-default; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.4 | 0.4 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.scrim-default}" / "{primitive.opacity.scrim-default}" |
| `semantic.opacity.drag` / `--sw-semantic-opacity-drag` | opacity drag; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.6 | 0.6 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.drag}" / "{primitive.opacity.drag}" |
| `semantic.opacity.scrim-strong` / `--sw-semantic-opacity-scrim-strong` | opacity scrim-strong; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.7 | 0.7 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.scrim-strong}" / "{primitive.opacity.scrim-strong}" |
| `semantic.opacity.decoration` / `--sw-semantic-opacity-decoration` | opacity decoration; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 0.8 | 0.8 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.decoration}" / "{primitive.opacity.decoration}" |
| `semantic.opacity.solid` / `--sw-semantic-opacity-solid` | opacity solid; system; override: none | Decoration, shadow or scrim only; text and button disabled states stay opaque | No alpha text, faded button labels or translucent soft fills. | 1 | 1 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.opacity.solid}" / "{primitive.opacity.solid}" |
| `semantic.motion.duration-none` / `--sw-semantic-motion-duration-none` | none motion duration; system; override: none | Reduced motion and immediate state changes | Do not delay input or announcements; reduced motion sets durations to zero. | 0ms | 0ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.none}" / "{primitive.duration.none}" |
| `semantic.motion.duration-fast` / `--sw-semantic-motion-duration-fast` | fast motion duration; system; override: none | Press, hover, exit | Do not delay input or announcements; reduced motion sets durations to zero. | 120ms | 120ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.fast}" / "{primitive.duration.fast}" |
| `semantic.motion.duration-base` / `--sw-semantic-motion-duration-base` | base motion duration; system; override: none | Overlay and indicator | Do not delay input or announcements; reduced motion sets durations to zero. | 180ms | 180ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.base}" / "{primitive.duration.base}" |
| `semantic.motion.duration-slow` / `--sw-semantic-motion-duration-slow` | slow motion duration; system; override: none | Route settle | Do not delay input or announcements; reduced motion sets durations to zero. | 240ms | 240ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.slow}" / "{primitive.duration.slow}" |
| `semantic.motion.duration-display-fade` / `--sw-semantic-motion-duration-display-fade` | display-fade motion duration; system; override: none | Passive kiosk/display slide fade only (docs/motion.md) | Do not delay input or announcements; reduced motion sets durations to zero. | 400ms | 400ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.display-fade}" / "{primitive.duration.display-fade}" |
| `semantic.motion.duration-scroll-reveal` / `--sw-semantic-motion-duration-scroll-reveal` | scroll-reveal motion duration; system; override: none | Once-only marketing scroll reveal (docs/motion.md) | Do not delay input or announcements; reduced motion sets durations to zero. | 640ms | 640ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.scroll-reveal}" / "{primitive.duration.scroll-reveal}" |
| `semantic.motion.duration-logo-box-open` / `--sw-semantic-motion-duration-logo-box-open` | logo-box-open motion duration; system; override: none | Space Works mark box-open exception only; never general UI | Do not delay input or announcements; reduced motion sets durations to zero. | 2200ms | 2200ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.logo-box-open}" / "{primitive.duration.logo-box-open}" |
| `semantic.motion.easing-standard` / `--sw-semantic-motion-easing-standard` | standard motion curve; system; override: none | Standard for movement; enter for arrival; exit for departure; out-soft is the app Tailwind curve. | Do not animate layout or add hover translation. | cubic-bezier(0.2, 0, 0, 1) | cubic-bezier(0.2, 0, 0, 1) | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.easing.standard}" / "{primitive.easing.standard}" |
| `semantic.motion.easing-enter` / `--sw-semantic-motion-easing-enter` | enter motion curve; system; override: none | Standard for movement; enter for arrival; exit for departure; out-soft is the app Tailwind curve. | Do not animate layout or add hover translation. | cubic-bezier(0.16, 1, 0.3, 1) | cubic-bezier(0.16, 1, 0.3, 1) | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.easing.enter}" / "{primitive.easing.enter}" |
| `semantic.motion.easing-exit` / `--sw-semantic-motion-easing-exit` | exit motion curve; system; override: none | Standard for movement; enter for arrival; exit for departure; out-soft is the app Tailwind curve. | Do not animate layout or add hover translation. | cubic-bezier(0.4, 0, 1, 1) | cubic-bezier(0.4, 0, 1, 1) | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.easing.exit}" / "{primitive.easing.exit}" |
| `semantic.motion.easing-out-soft` / `--sw-semantic-motion-easing-out-soft` | out-soft motion curve; system; override: none | Standard for movement; enter for arrival; exit for departure; out-soft is the app Tailwind curve. | Do not animate layout or add hover translation. | cubic-bezier(0.32, 0.72, 0, 1) | cubic-bezier(0.32, 0.72, 0, 1) | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.easing.out-soft}" / "{primitive.easing.out-soft}" |
| `semantic.motion.enter-y` / `--sw-semantic-motion-enter-y` | Motion enter-y; system; override: none | Arrival motion only; kiosk/TV zero translations and keep scale at one. | Hover transforms; reduced-motion movement. | 8px | 8px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.distance.enter-y}" / "{primitive.distance.enter-y}" |
| `semantic.motion.pop-scale` / `--sw-semantic-motion-pop-scale` | Motion pop-scale; system; override: none | Arrival motion only; kiosk/TV zero translations and keep scale at one. | Hover transforms; reduced-motion movement. | 0.98 | 0.98 | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.distance.pop-scale}" / "{primitive.distance.pop-scale}" |
| `semantic.motion.pop-offset` / `--sw-semantic-motion-pop-offset` | Motion pop-offset; system; override: none | Arrival motion only; kiosk/TV zero translations and keep scale at one. | Hover transforms; reduced-motion movement. | 4px | 4px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.distance.pop-offset}" / "{primitive.distance.pop-offset}" |
| `semantic.motion.slide-x` / `--sw-semantic-motion-slide-x` | Motion slide-x; system; override: none | Arrival motion only; kiosk/TV zero translations and keep scale at one. | Hover transforms; reduced-motion movement. | 100% | 100% | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.distance.slide-x}" / "{primitive.distance.slide-x}" |
| `semantic.type.display` / `--sw-semantic-type-display` | display typography; system; override: none | Public landing hero | Do not request unshipped Gilroy 400–700; use Outfit for UI text. | 800 72px/1.0555555555555556 "Gilroy", "Outfit", sans-serif | 800 72px/1.0555555555555556 "Gilroy", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.display}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.display}","lineHeight":"{primitive.type-line.display}"} / {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.display}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.display}","lineHeight":"{primitive.type-line.display}"} |
| `semantic.type.display-sub` / `--sw-semantic-type-display-sub` | display-sub typography; system; override: none | Public/auth display supporting line | No monospace substitution; IDs use Outfit tabular numerals. | 400 32px/1.1875 "Outfit", sans-serif | 400 32px/1.1875 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.display-sub}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.display-sub}","lineHeight":"{primitive.type-line.display-sub}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.display-sub}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.display-sub}","lineHeight":"{primitive.type-line.display-sub}"} |
| `semantic.type.heading` / `--sw-semantic-type-heading` | heading typography; system; override: none | Public section heading | Do not request unshipped Gilroy 400–700; use Outfit for UI text. | 800 48px/1.0833333333333333 "Gilroy", "Outfit", sans-serif | 800 48px/1.0833333333333333 "Gilroy", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.heading}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.heading}","lineHeight":"{primitive.type-line.heading}"} / {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.heading}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.heading}","lineHeight":"{primitive.type-line.heading}"} |
| `semantic.type.page` / `--sw-semantic-type-page` | page typography; system; override: none | One page h1 | No monospace substitution; IDs use Outfit tabular numerals. | 600 32px/1.1875 "Outfit", sans-serif | 600 32px/1.1875 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.page}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.page}","lineHeight":"{primitive.type-line.page}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.page}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.page}","lineHeight":"{primitive.type-line.page}"} |
| `semantic.type.panel` / `--sw-semantic-type-panel` | panel typography; system; override: none | Card/panel title | No monospace substitution; IDs use Outfit tabular numerals. | 600 20px/1.4 "Outfit", sans-serif | 600 20px/1.4 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.panel}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.panel}","lineHeight":"{primitive.type-line.panel}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.panel}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.panel}","lineHeight":"{primitive.type-line.panel}"} |
| `semantic.type.section` / `--sw-semantic-type-section` | section typography; system; override: none | Section/list-row title | No monospace substitution; IDs use Outfit tabular numerals. | 600 16px/1.5 "Outfit", sans-serif | 600 16px/1.5 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.section}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.section}","lineHeight":"{primitive.type-line.section}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.section}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.section}","lineHeight":"{primitive.type-line.section}"} |
| `semantic.type.stat` / `--sw-semantic-type-stat` | stat typography; system; override: none | Stat number with tabular numerals | No monospace substitution; IDs use Outfit tabular numerals. | 600 32px/1.1875 "Outfit", sans-serif | 600 32px/1.1875 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.stat}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.stat}","lineHeight":"{primitive.type-line.stat}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.stat}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.stat}","lineHeight":"{primitive.type-line.stat}"} |
| `semantic.type.date` / `--sw-semantic-type-date` | date typography; system; override: none | Date chip numeral with tabular numerals | No monospace substitution; IDs use Outfit tabular numerals. | 600 20px/1.2 "Outfit", sans-serif | 600 20px/1.2 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.date}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.date}","lineHeight":"{primitive.type-line.date}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.date}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.date}","lineHeight":"{primitive.type-line.date}"} |
| `semantic.type.body` / `--sw-semantic-type-body` | body typography; system; override: none | Body copy and input text | No monospace substitution; IDs use Outfit tabular numerals. | 400 16px/1.5 "Outfit", sans-serif | 400 16px/1.5 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.body}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.body}","lineHeight":"{primitive.type-line.body}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.body}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.body}","lineHeight":"{primitive.type-line.body}"} |
| `semantic.type.label` / `--sw-semantic-type-label` | label typography; system; override: none | Form labels, navigation and meta | No monospace substitution; IDs use Outfit tabular numerals. | 500 14px/1.4285714285714286 "Outfit", sans-serif | 500 14px/1.4285714285714286 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.label}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.label}","lineHeight":"{primitive.type-line.label}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.label}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.label}","lineHeight":"{primitive.type-line.label}"} |
| `semantic.type.button` / `--sw-semantic-type-button` | button typography; system; override: none | Button label | No monospace substitution; IDs use Outfit tabular numerals. | 600 14px/1.4285714285714286 "Outfit", sans-serif | 600 14px/1.4285714285714286 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.button}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.button}","lineHeight":"{primitive.type-line.button}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.button}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.button}","lineHeight":"{primitive.type-line.button}"} |
| `semantic.type.caption` / `--sw-semantic-type-caption` | caption typography; system; override: none | Pills, timestamps and helper text | No monospace substitution; IDs use Outfit tabular numerals. | 500 12px/1.3333333333333333 "Outfit", sans-serif | 500 12px/1.3333333333333333 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.caption}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.caption}","lineHeight":"{primitive.type-line.caption}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.caption}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.caption}","lineHeight":"{primitive.type-line.caption}"} |
| `semantic.type.eyebrow` / `--sw-semantic-type-eyebrow` | eyebrow typography; system; override: none | Short uppercase category kicker | No monospace substitution; IDs use Outfit tabular numerals. | 600 12px/1.3333333333333333 "Outfit", sans-serif | 600 12px/1.3333333333333333 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.eyebrow}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.eyebrow}","lineHeight":"{primitive.type-line.eyebrow}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.eyebrow}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.eyebrow}","lineHeight":"{primitive.type-line.eyebrow}"} |
| `semantic.type.accent` / `--sw-semantic-type-accent` | accent typography; system; override: none | One short brand phrase | No long copy: one short phrase per layout. | 500 48px/1.1666666666666667 "Unbounded", "Outfit", sans-serif | 500 48px/1.1666666666666667 "Unbounded", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.accent}","fontSize":"{primitive.type-size.accent}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.accent}","lineHeight":"{primitive.type-line.accent}"} / {"fontFamily":"{primitive.font-family.accent}","fontSize":"{primitive.type-size.accent}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.accent}","lineHeight":"{primitive.type-line.accent}"} |
| `semantic.type.display-mobile` / `--sw-semantic-type-display-mobile` | display-mobile typography; system; override: none | Public landing hero; below 640px | Do not request unshipped Gilroy 400–700; use Outfit for UI text. | 800 44px/1.0909090909090908 "Gilroy", "Outfit", sans-serif | 800 44px/1.0909090909090908 "Gilroy", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.display-mobile}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.display-mobile}","lineHeight":"{primitive.type-line.display-mobile}"} / {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.display-mobile}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.display-mobile}","lineHeight":"{primitive.type-line.display-mobile}"} |
| `semantic.type.display-sub-mobile` / `--sw-semantic-type-display-sub-mobile` | display-sub-mobile typography; system; override: none | Public/auth display supporting line; below 640px | No monospace substitution; IDs use Outfit tabular numerals. | 400 24px/1.25 "Outfit", sans-serif | 400 24px/1.25 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.display-sub-mobile}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.display-sub-mobile}","lineHeight":"{primitive.type-line.display-sub-mobile}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.display-sub-mobile}","fontWeight":"{primitive.font-weight.w400}","letterSpacing":"{primitive.type-tracking.display-sub-mobile}","lineHeight":"{primitive.type-line.display-sub-mobile}"} |
| `semantic.type.heading-mobile` / `--sw-semantic-type-heading-mobile` | heading-mobile typography; system; override: none | Public section heading; below 640px | Do not request unshipped Gilroy 400–700; use Outfit for UI text. | 800 34px/1.1764705882352942 "Gilroy", "Outfit", sans-serif | 800 34px/1.1764705882352942 "Gilroy", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.heading-mobile}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.heading-mobile}","lineHeight":"{primitive.type-line.heading-mobile}"} / {"fontFamily":"{primitive.font-family.display}","fontSize":"{primitive.type-size.heading-mobile}","fontWeight":"{primitive.font-weight.w800}","letterSpacing":"{primitive.type-tracking.heading-mobile}","lineHeight":"{primitive.type-line.heading-mobile}"} |
| `semantic.type.page-mobile` / `--sw-semantic-type-page-mobile` | page-mobile typography; system; override: none | One page h1; below 640px | No monospace substitution; IDs use Outfit tabular numerals. | 600 26px/1.2307692307692308 "Outfit", sans-serif | 600 26px/1.2307692307692308 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.page-mobile}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.page-mobile}","lineHeight":"{primitive.type-line.page-mobile}"} / {"fontFamily":"{primitive.font-family.sans}","fontSize":"{primitive.type-size.page-mobile}","fontWeight":"{primitive.font-weight.w600}","letterSpacing":"{primitive.type-tracking.page-mobile}","lineHeight":"{primitive.type-line.page-mobile}"} |
| `semantic.type.accent-mobile` / `--sw-semantic-type-accent-mobile` | accent-mobile typography; system; override: none | One short brand phrase; below 640px | No long copy: one short phrase per layout. | 500 32px/1.25 "Unbounded", "Outfit", sans-serif | 500 32px/1.25 "Unbounded", "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | {"fontFamily":"{primitive.font-family.accent}","fontSize":"{primitive.type-size.accent-mobile}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.accent-mobile}","lineHeight":"{primitive.type-line.accent-mobile}"} / {"fontFamily":"{primitive.font-family.accent}","fontSize":"{primitive.type-size.accent-mobile}","fontWeight":"{primitive.font-weight.w500}","letterSpacing":"{primitive.type-tracking.accent-mobile}","lineHeight":"{primitive.type-line.accent-mobile}"} |
| `semantic.elevation.flat` / `--sw-semantic-elevation-flat` | flat elevation; system; override: none | Cards and panels (no shadow) | Use overlay only for floating content. | none | none | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.shadow.flat}" / "{primitive.shadow.flat}" |
| `semantic.elevation.overlay` / `--sw-semantic-elevation-overlay` | overlay elevation; system; override: none | Floating menus, popovers, dialogs, drawers and toasts only | No shadow on flat cards; no invented elevation ladder. | 0px 2px 6px 0px rgb(20 44 42 / 0.06), 0px 12px 32px 0px rgb(20 44 42 / 0.1) | 0px 2px 6px 0px rgb(0 0 0 / 0.06), 0px 12px 32px 0px rgb(0 0 0 / 0.1) | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.shadow.overlay-light}" / "{primitive.shadow.overlay-dark}" |
| `semantic.color.boundary-strong` / `--sw-semantic-color-boundary-strong` | Essential control boundary across neutral default, hover and pressed surfaces; system; override: none | Inputs, checkbox outlines and essential separators | Decorative dividers; use line there | #5B6863 | #787878 | bg, surface, panel, hover, line | "{semantic.color.muted}" / "{semantic.color.outline}" |
| `semantic.color.state-indicator` / `--sw-semantic-color-state-indicator` | Essential selected-state mark; system; override: none | Tab underline, selected icon or short state stroke on neutral surfaces | Text on a filled accent button; use on-accent | #006E63 | #80B1A6 | bg, surface, panel, hover | "{semantic.color.accent-ink}" / "{semantic.color.accent-ink}" |
| `semantic.color.sidebar-ink` / `--sw-semantic-color-sidebar-ink` | Sidebar text; system; override: none | Neutral sidebar and hover rows | Selected teal row; use on-accent | #142C2A | #FFF4E8 | sidebar, sidebar-hover | "{semantic.color.ink}" / "{semantic.color.ink}" |
| `semantic.color.shadow` / `--sw-semantic-color-shadow` | Overlay shadow pigment; system; override: none | Only the two overlay shadow layers | Text, borders or flat cards | #142C2A | #000000 | panel | "{primitive.color.hex142c2a}" / "{primitive.color.hex000000}" |
| `semantic.space.page-phone` / `--sw-semantic-space-page-phone` | Phone page gutter; system; override: none | Phone page gutter | Use only for the named component or role; do not replace unrelated system roles. | 16px | 16px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.16}" / "{primitive.spacing.16}" |
| `semantic.space.page-tablet` / `--sw-semantic-space-page-tablet` | Tablet page gutter; system; override: none | Tablet page gutter | Use only for the named component or role; do not replace unrelated system roles. | 24px | 24px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.24}" / "{primitive.spacing.24}" |
| `semantic.space.page-desktop` / `--sw-semantic-space-page-desktop` | Desktop page gutter; system; override: none | Desktop page gutter | Use only for the named component or role; do not replace unrelated system roles. | 32px | 32px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.32}" / "{primitive.spacing.32}" |
| `semantic.space.card` / `--sw-semantic-space-card` | Default card padding; system; override: none | Default card padding | Use only for the named component or role; do not replace unrelated system roles. | 20px | 20px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.20}" / "{primitive.spacing.20}" |
| `semantic.space.settings` / `--sw-semantic-space-settings` | Settings card padding; system; override: none | Settings card padding | Use only for the named component or role; do not replace unrelated system roles. | 24px | 24px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.24}" / "{primitive.spacing.24}" |
| `semantic.space.control-x` / `--sw-semantic-space-control-x` | Control inline padding; system; override: none | Control inline padding | Use only for the named component or role; do not replace unrelated system roles. | 12px | 12px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.12}" / "{primitive.spacing.12}" |
| `semantic.space.control-y` / `--sw-semantic-space-control-y` | Control block padding; system; override: none | Control block padding | Use only for the named component or role; do not replace unrelated system roles. | 8px | 8px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.spacing.8}" / "{primitive.spacing.8}" |
| `semantic.radius.control` / `--sw-semantic-radius-control` | Owner-selectable control radius: 10px default, full for pill; system; override: owner-control | Owner-selectable control radius: 10px default, full for pill | Use only for the named component or role; do not replace unrelated system roles. | 10px | 10px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.md}" / "{primitive.radius.md}" |
| `semantic.radius.card` / `--sw-semantic-radius-card` | Card and panel radius; system; override: none | Card and panel radius | Use only for the named component or role; do not replace unrelated system roles. | 16px | 16px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.radius.xl}" / "{primitive.radius.xl}" |
| `semantic.focus.width` / `--sw-semantic-focus-width` | Visible focus outline width; system; override: none | Visible focus outline width | Use only for the named component or role; do not replace unrelated system roles. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.strong}" / "{primitive.border-width.strong}" |
| `semantic.focus.offset` / `--sw-semantic-focus-offset` | Gap between control and external focus outline; system; override: none | Gap between control and external focus outline | Use only for the named component or role; do not replace unrelated system roles. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.strong}" / "{primitive.border-width.strong}" |
| `semantic.focus.color` / `--sw-semantic-focus-color` | Focus outline pigment on neutral surfaces; system; override: none | Focus outline pigment on neutral surfaces | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #DFFF8F | bg, surface, panel, hover | "{semantic.color.focus}" / "{semantic.color.focus}" |
| `semantic.motion.reduced-duration` / `--sw-semantic-motion-reduced-duration` | Reduced-motion duration; keep all content visible; system; override: none | Reduced-motion duration; keep all content visible | Use only for the named component or role; do not replace unrelated system roles. | 0ms | 0ms | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.duration.none}" / "{primitive.duration.none}" |
## component roles

| Path / CSS / legacy | Purpose / scope / override | Use | Do not use | Light | Dark | Contrast partner | Aliases light / dark |
|---|---|---|---|---|---|---|---|
| `component.loader.under` / `--sw-component-loader-under` / loader.under | Box-open loader local under; loader-local; override: none | Only box-open loader: underside face | Not a global text, boundary, status or focus role; logo face colours remain their masters. | #354845 | #66625D | Local logo face colours; diagnostic matrix is not permission to recolour logo | "{primitive.color.hex354845}" / "{primitive.color.hex66625d}" |
| `component.loader.spark` / `--sw-component-loader-spark` / loader.spark | Box-open loader local spark; loader-local; override: none | Only box-open loader: spark strokes | Not a global text, boundary, status or focus role; logo face colours remain their masters. | #142C2A | #FFF4E8 | Local logo face colours; diagnostic matrix is not permission to recolour logo | "{primitive.color.hex142c2a}" / "{primitive.color.hexfff4e8}" |
| `component.loader.seam` / `--sw-component-loader-seam` / loader.seam | Box-open loader local seam; loader-local; override: none | Only box-open loader: fold seam | Not a global text, boundary, status or focus role; logo face colours remain their masters. | #142C2A | #000000 | Local logo face colours; diagnostic matrix is not permission to recolour logo | "{primitive.color.hex142c2a}" / "{primitive.color.hex000000}" |
| `component.aurora.background` / `--sw-component-aurora-background` / cards.background | Aurora badge-card background; aurora-local; override: none | Aurora ID/badge card background slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #FFF4E8 | #142C2A | aurora.text, aurora.label | "{primitive.color.hexfff4e8}" / "{primitive.color.hex142c2a}" |
| `component.aurora.text` / `--sw-component-aurora-text` / cards.text | Aurora badge-card text; aurora-local; override: none | Aurora ID/badge card text slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #142C2A | #FFF4E8 | aurora.background | "{primitive.color.hex142c2a}" / "{primitive.color.hexfff4e8}" |
| `component.aurora.label` / `--sw-component-aurora-label` / cards.label | Aurora badge-card label; aurora-local; override: none | Aurora ID/badge card label slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #006E63 | #DFFF8F | aurora.background | "{primitive.color.hex006e63}" / "{primitive.color.hexdfff8f}" |
| `component.aurora.header` / `--sw-component-aurora-header` / cards.header | Aurora badge-card header; aurora-local; override: none | Aurora ID/badge card header slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #006E63 | #006E63 | on-accent | "{primitive.color.hex006e63}" / "{primitive.color.hex006e63}" |
| `component.aurora.ribbon` / `--sw-component-aurora-ribbon` / cards.ribbon | Aurora badge-card ribbon; aurora-local; override: none | Aurora ID/badge card ribbon slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #DFFF8F | #DFFF8F | on-success | "{primitive.color.hexdfff8f}" / "{primitive.color.hexdfff8f}" |
| `component.aurora.tail` / `--sw-component-aurora-tail` / cards.tail | Aurora badge-card tail; aurora-local; override: none | Aurora ID/badge card tail slot only (decision 317a) | Not a global surface or status role; header label uses on-accent, ribbon/tail labels use deep ink. | #FF7447 | #FF7447 | on-emphasis | "{primitive.color.hexff7447}" / "{primitive.color.hexff7447}" |
| `component.button.height` / `--sw-component-button-height` | Minimum button hit area; button; override: none | Minimum button hit area | Use only for the named component or role; do not replace unrelated system roles. | 44px | 44px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.size.control}" / "{semantic.size.control}" |
| `component.button.radius` / `--sw-component-button-radius` | Button corners; button; override: none | Button corners | Use only for the named component or role; do not replace unrelated system roles. | 10px | 10px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.radius.control}" / "{semantic.radius.control}" |
| `component.button.padding-x` / `--sw-component-button-padding-x` | Button inline padding; button; override: none | Button inline padding | Use only for the named component or role; do not replace unrelated system roles. | 12px | 12px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.space.control-x}" / "{semantic.space.control-x}" |
| `component.button.padding-y` / `--sw-component-button-padding-y` | Button block padding; button; override: none | Button block padding | Use only for the named component or role; do not replace unrelated system roles. | 8px | 8px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.space.control-y}" / "{semantic.space.control-y}" |
| `component.button.fill` / `--sw-component-button-fill` | Primary button default fill; button; override: none | Primary button default fill | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #006E63 | on-accent | "{semantic.color.accent}" / "{semantic.color.accent}" |
| `component.button.hover` / `--sw-component-button-hover` | Primary button hover fill; button; override: none | Primary button hover fill | Use only for the named component or role; do not replace unrelated system roles. | #02675D | #02675D | on-accent | "{semantic.color.accent-hover}" / "{semantic.color.accent-hover}" |
| `component.button.pressed` / `--sw-component-button-pressed` | Primary button pressed fill; button; override: none | Primary button pressed fill | Use only for the named component or role; do not replace unrelated system roles. | #046158 | #046158 | on-accent | "{semantic.color.accent-active}" / "{semantic.color.accent-active}" |
| `component.button.label` / `--sw-component-button-label` | Primary button label; button; override: none | Primary button label | Use only for the named component or role; do not replace unrelated system roles. | #FFF4E8 | #FFF4E8 | accent, accent-hover, accent-active | "{semantic.color.on-accent}" / "{semantic.color.on-accent}" |
| `component.button.boundary` / `--sw-component-button-boundary` | Primary button essential perimeter; button; override: none | Primary button essential perimeter | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #80B1A6 | bg, surface, panel, hover | "{semantic.color.accent-ink}" / "{semantic.color.accent-ink}" |
| `component.button.disabled-fill` / `--sw-component-button-disabled-fill` | Opaque disabled fill; button; override: none | Opaque disabled fill | Use only for the named component or role; do not replace unrelated system roles. | #F6ECE0 | #0B0B0B | muted | "{semantic.color.surface}" / "{semantic.color.surface}" |
| `component.button.disabled-label` / `--sw-component-button-disabled-label` | Opaque disabled label; button; override: none | Opaque disabled label | Use only for the named component or role; do not replace unrelated system roles. | #5B6863 | #ACACAC | surface | "{semantic.color.muted}" / "{semantic.color.muted}" |
| `component.button.disabled-border` / `--sw-component-button-disabled-border` | Disabled decorative boundary; button; override: none | Disabled decorative boundary | Use only for the named component or role; do not replace unrelated system roles. | #D5D0C6 | #2C2C2C | surface | "{semantic.color.line}" / "{semantic.color.line}" |
| `component.button.type` / `--sw-component-button-type` | Button label typography; button; override: none | Button label typography | Use only for the named component or role; do not replace unrelated system roles. | 600 14px/1.4285714285714286 "Outfit", sans-serif | 600 14px/1.4285714285714286 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.type.button}" / "{semantic.type.button}" |
| `component.input.height` / `--sw-component-input-height` | Minimum input hit area; input; override: none | Minimum input hit area | Use only for the named component or role; do not replace unrelated system roles. | 44px | 44px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.size.control}" / "{semantic.size.control}" |
| `component.input.radius` / `--sw-component-input-radius` | Input corners; input; override: none | Input corners | Use only for the named component or role; do not replace unrelated system roles. | 10px | 10px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.radius.control}" / "{semantic.radius.control}" |
| `component.input.boundary` / `--sw-component-input-boundary` | Input essential boundary including hover and pressed surroundings; input; override: none | Input essential boundary including hover and pressed surroundings | Use only for the named component or role; do not replace unrelated system roles. | #5B6863 | #787878 | bg, surface, panel, hover, line | "{semantic.color.boundary-strong}" / "{semantic.color.boundary-strong}" |
| `component.input.fill` / `--sw-component-input-fill` | Input background matching app components.css; input; override: none | Input background matching app components.css | Use only for the named component or role; do not replace unrelated system roles. | #FFFFFF | #0B0B0B | ink, muted | "{semantic.color.panel}" / "{semantic.color.surface}" |
| `component.input.label` / `--sw-component-input-label` | Input entered text; input; override: none | Input entered text | Use only for the named component or role; do not replace unrelated system roles. | #142C2A | #FFF4E8 | panel, surface | "{semantic.color.ink}" / "{semantic.color.ink}" |
| `component.input.placeholder` / `--sw-component-input-placeholder` | Placeholder text with a separate visible label; input; override: none | Placeholder text with a separate visible label | Use only for the named component or role; do not replace unrelated system roles. | #5B6863 | #ACACAC | panel, surface | "{semantic.color.muted}" / "{semantic.color.muted}" |
| `component.input.type` / `--sw-component-input-type` | Input text; 16px minimum prevents phone focus zoom; input; override: none | Input text; 16px minimum prevents phone focus zoom | Use only for the named component or role; do not replace unrelated system roles. | 400 16px/1.5 "Outfit", sans-serif | 400 16px/1.5 "Outfit", sans-serif | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.type.body}" / "{semantic.type.body}" |
| `component.tabs.indicator` / `--sw-component-tabs-indicator` | Selected tab underline; tabs; override: none | Selected tab underline | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #80B1A6 | bg, surface, panel, hover | "{semantic.color.state-indicator}" / "{semantic.color.state-indicator}" |
| `component.tabs.indicator-width` / `--sw-component-tabs-indicator-width` | Tab underline thickness; tabs; override: none | Tab underline thickness | Use only for the named component or role; do not replace unrelated system roles. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{primitive.border-width.strong}" / "{primitive.border-width.strong}" |
| `component.card.fill` / `--sw-component-card-fill` | Flat card surface; card; override: none | Flat card surface | Use only for the named component or role; do not replace unrelated system roles. | #FFFFFF | #141414 | ink, muted | "{semantic.color.panel}" / "{semantic.color.panel}" |
| `component.card.radius` / `--sw-component-card-radius` | Card corners; card; override: none | Card corners | Use only for the named component or role; do not replace unrelated system roles. | 16px | 16px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.radius.card}" / "{semantic.radius.card}" |
| `component.card.padding` / `--sw-component-card-padding` | Card inset; card; override: none | Card inset | Use only for the named component or role; do not replace unrelated system roles. | 20px | 20px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.space.card}" / "{semantic.space.card}" |
| `component.card.border` / `--sw-component-card-border` | Decorative card divider only; card; override: none | Decorative card divider only | Use only for the named component or role; do not replace unrelated system roles. | #D5D0C6 | #2C2C2C | panel | "{semantic.color.line}" / "{semantic.color.line}" |
| `component.card.shadow` / `--sw-component-card-shadow` | Cards remain flat; card; override: none | Cards remain flat | Use only for the named component or role; do not replace unrelated system roles. | none | none | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.elevation.flat}" / "{semantic.elevation.flat}" |
| `component.overlay.shadow` / `--sw-component-overlay-shadow` | Floating popover, menu, modal, drawer and toast shadow; overlay; override: none | Floating popover, menu, modal, drawer and toast shadow | Use only for the named component or role; do not replace unrelated system roles. | 0px 2px 6px 0px rgb(20 44 42 / 0.06), 0px 12px 32px 0px rgb(20 44 42 / 0.1) | 0px 2px 6px 0px rgb(0 0 0 / 0.06), 0px 12px 32px 0px rgb(0 0 0 / 0.1) | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.elevation.overlay}" / "{semantic.elevation.overlay}" |
| `component.overlay.layer` / `--sw-component-overlay-layer` | Root overlay stacking group; overlay; override: none | Root overlay stacking group | Use only for the named component or role; do not replace unrelated system roles. | 50 | 50 | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.layer.overlay}" / "{semantic.layer.overlay}" |
| `component.overlay.scrim-opacity` / `--sw-component-overlay-scrim-opacity` | Scrim opacity; apply to scrim only, never its content; overlay; override: none | Scrim opacity; apply to scrim only, never its content | Use only for the named component or role; do not replace unrelated system roles. | 0.4 | 0.4 | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.opacity.scrim-default}" / "{semantic.opacity.scrim-default}" |
| `component.focus.color` / `--sw-component-focus-color` | External focus indicator separated from fill by an offset; focus; override: none | External focus indicator separated from fill by an offset | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #DFFF8F | bg, surface, panel, hover | "{semantic.focus.color}" / "{semantic.focus.color}" |
| `component.focus.width` / `--sw-component-focus-width` | Focus outline width; focus; override: none | Focus outline width | Use only for the named component or role; do not replace unrelated system roles. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.focus.width}" / "{semantic.focus.width}" |
| `component.focus.offset` / `--sw-component-focus-offset` | External focus gap; focus; override: none | External focus gap | Use only for the named component or role; do not replace unrelated system roles. | 2px | 2px | N/A: geometry or behaviour, not a contrast foreground. | "{semantic.focus.offset}" / "{semantic.focus.offset}" |
| `component.button-brand.fill` / `--sw-component-button-brand-fill` | Public tenant-branded button fill; button-brand; override: none | Public tenant-branded button fill | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #006E63 | on-brand | "{semantic.color.brand}" / "{semantic.color.brand}" |
| `component.button-brand.hover` / `--sw-component-button-brand-hover` | Public tenant-branded button hover fill; button-brand; override: none | Public tenant-branded button hover fill | Use only for the named component or role; do not replace unrelated system roles. | #02675D | #02675D | on-brand | "{semantic.color.brand-hover}" / "{semantic.color.brand-hover}" |
| `component.button-brand.pressed` / `--sw-component-button-brand-pressed` | Public tenant-branded button pressed fill; button-brand; override: none | Public tenant-branded button pressed fill | Use only for the named component or role; do not replace unrelated system roles. | #046158 | #046158 | on-brand | "{semantic.color.brand-active}" / "{semantic.color.brand-active}" |
| `component.button-brand.label` / `--sw-component-button-brand-label` | Public tenant-branded button text; button-brand; override: none | Public tenant-branded button text | Use only for the named component or role; do not replace unrelated system roles. | #FFF4E8 | #FFF4E8 | brand, brand-hover, brand-active | "{semantic.color.on-brand}" / "{semantic.color.on-brand}" |
| `component.button-brand.boundary` / `--sw-component-button-brand-boundary` | Essential public tenant-branded button perimeter; button-brand; override: none | Essential public tenant-branded button perimeter | Use only for the named component or role; do not replace unrelated system roles. | #006E63 | #80B1A6 | bg, surface, panel, hover | "{semantic.color.brand-boundary}" / "{semantic.color.brand-boundary}" |
