@ -378,8 +378,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'risk-border' : 'var(--color-risk-border)' ,
'threat-track' : 'var(--color-threat-track)' ,
'threat-border' : 'var(--color-threat-border)' ,
// Private palette (TSC v2.1). 8 colors, 5 slots.
_track : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots so the THM-2
// shared-layer forward routes color="teal" + the 33 scales; renamed from
// the bare `_{slot}` prefix 2026-07-13). 8 colors, 5 slots.
'_palette-track' : {
declarations : [
{ value : 'var(--badge-primary-track)' , scope : 'host' } ,
{ value : 'var(--badge-secondary-track)' , scope : 'color:secondary' } ,
@ -391,7 +393,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--badge-loss-track)' , scope : 'color:loss' }
]
} ,
_border : {
'_palette-border' : {
declarations : [
{ value : 'var(--badge-primary-border)' , scope : 'host' } ,
{ value : 'var(--badge-secondary-border)' , scope : 'color:secondary' } ,
@ -403,7 +405,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--badge-loss-border)' , scope : 'color:loss' }
]
} ,
_solid : {
'_palette-solid' : {
declarations : [
{ value : 'var(--badge-primary-solid)' , scope : 'host' } ,
{ value : 'var(--badge-secondary-solid)' , scope : 'color:secondary' } ,
@ -415,7 +417,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--badge-loss-solid)' , scope : 'color:loss' }
]
} ,
_text : {
'_palette-text' : {
declarations : [
{ value : 'var(--badge-primary-text)' , scope : 'host' } ,
{ value : 'var(--badge-secondary-text)' , scope : 'color:secondary' } ,
@ -427,7 +429,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--badge-loss-text)' , scope : 'color:loss' }
]
} ,
_contrast : {
'_palette-contrast' : {
declarations : [
{ value : 'var(--badge-primary-contrast)' , scope : 'host' } ,
{ value : 'var(--badge-secondary-contrast)' , scope : 'color:secondary' } ,
@ -582,8 +584,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'risk-border' : 'var(--color-risk-border)' ,
'threat-track' : 'var(--color-threat-track)' ,
'threat-border' : 'var(--color-threat-border)' ,
// Private palette (TSC v2.1). 8 colors, 5 slots. Default = neutral.
_track : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots so the THM-2
// shared-layer forward routes color="teal" + the 33 scales; renamed from
// the bare `_{slot}` prefix 2026-07-13). 8 colors, 5 slots. Default = neutral.
'_palette-track' : {
declarations : [
{ value : 'var(--card-neutral-track)' , scope : 'host' } ,
{ value : 'var(--card-primary-track)' , scope : 'color:primary' } ,
@ -595,7 +599,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--card-loss-track)' , scope : 'color:loss' }
]
} ,
_border : {
'_palette-border' : {
declarations : [
{ value : 'var(--card-neutral-border)' , scope : 'host' } ,
{ value : 'var(--card-primary-border)' , scope : 'color:primary' } ,
@ -607,7 +611,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--card-loss-border)' , scope : 'color:loss' }
]
} ,
_solid : {
'_palette-solid' : {
declarations : [
{ value : 'var(--card-neutral-solid)' , scope : 'host' } ,
{ value : 'var(--card-primary-solid)' , scope : 'color:primary' } ,
@ -619,7 +623,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--card-loss-solid)' , scope : 'color:loss' }
]
} ,
_text : {
'_palette-text' : {
declarations : [
{ value : 'var(--card-neutral-text)' , scope : 'host' } ,
{ value : 'var(--card-primary-text)' , scope : 'color:primary' } ,
@ -631,7 +635,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--card-loss-text)' , scope : 'color:loss' }
]
} ,
_contrast : {
'_palette-contrast' : {
declarations : [
{ value : 'var(--card-neutral-contrast)' , scope : 'host' } ,
{ value : 'var(--card-primary-contrast)' , scope : 'color:primary' } ,
@ -2144,7 +2148,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
// `text`). The legacy CSS also declared `--_select-accent-solid`
// but nothing in select.css read it; that orphan stayed out of
// the TSC migration on purpose.
'_ accent -track': {
'_ palette -track': {
parts : [ 'trigger' , 'content' ] ,
declarations : [
{ value : 'var(--select-primary-track)' , scope : 'host' } ,
@ -2157,7 +2161,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--select-loss-track)' , scope : 'color:loss' }
]
} ,
'_ accent -border': {
'_ palette -border': {
parts : [ 'trigger' , 'content' ] ,
declarations : [
{ value : 'var(--select-primary-border)' , scope : 'host' } ,
@ -2170,7 +2174,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--select-loss-border)' , scope : 'color:loss' }
]
} ,
'_ accent -text': {
'_ palette -text': {
parts : [ 'trigger' , 'content' ] ,
declarations : [
{ value : 'var(--select-primary-text)' , scope : 'host' } ,
@ -2340,8 +2344,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'risk-border' : 'var(--color-risk-border)' ,
'threat-track' : 'var(--color-threat-track)' ,
'threat-border' : 'var(--color-threat-border)' ,
// Private accent palette (TSC v2.1). 8 colors, 5 slots.
'_accent-solid' : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots for the THM-2
// shared-layer forward — color="teal" + the 33 scales; renamed from
// `_accent-*` 2026-07-13). 8 colors, 5 slots.
'_palette-solid' : {
declarations : [
{ value : 'var(--file-upload-primary-solid)' , scope : 'host' } ,
{ value : 'var(--file-upload-secondary-solid)' , scope : 'color:secondary' } ,
@ -2353,7 +2359,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--file-upload-loss-solid)' , scope : 'color:loss' }
]
} ,
'_ accent -solid-hover': {
'_ palette -solid-hover': {
declarations : [
{ value : 'var(--file-upload-primary-solid-hover)' , scope : 'host' } ,
{ value : 'var(--file-upload-secondary-solid-hover)' , scope : 'color:secondary' } ,
@ -2365,7 +2371,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--file-upload-loss-solid-hover)' , scope : 'color:loss' }
]
} ,
'_ accent -track': {
'_ palette -track': {
declarations : [
{ value : 'var(--file-upload-primary-track)' , scope : 'host' } ,
{ value : 'var(--file-upload-secondary-track)' , scope : 'color:secondary' } ,
@ -2377,7 +2383,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--file-upload-loss-track)' , scope : 'color:loss' }
]
} ,
'_ accent -border': {
'_ palette -border': {
declarations : [
{ value : 'var(--file-upload-primary-border)' , scope : 'host' } ,
{ value : 'var(--file-upload-secondary-border)' , scope : 'color:secondary' } ,
@ -2389,7 +2395,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--file-upload-loss-border)' , scope : 'color:loss' }
]
} ,
'_ accent -text': {
'_ palette -text': {
declarations : [
{ value : 'var(--file-upload-primary-text)' , scope : 'host' } ,
{ value : 'var(--file-upload-secondary-text)' , scope : 'color:secondary' } ,
@ -2451,63 +2457,50 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'primary-soft-bg' : 'var(--color-primary-surface)' ,
'primary-soft-bg-hover' : 'var(--color-primary-surface-hover)' ,
'primary-soft-fg' : 'var(--color-primary-text)' ,
'primary-outline-border' : 'var(--color-primary-border)' ,
'primary-outline-fg' : 'var(--color-primary-text)' ,
'secondary-solid-bg' : 'var(--color-secondary-solid)' ,
'primary-outline-border' : 'var(--color-primary-border)' , 'secondary-solid-bg' : 'var(--color-secondary-solid)' ,
'secondary-solid-bg-hover' : 'var(--color-secondary-solid-hover)' ,
'secondary-soft-bg' : 'var(--color-secondary-surface)' ,
'secondary-soft-bg-hover' : 'var(--color-secondary-surface-hover)' ,
'secondary-soft-fg' : 'var(--color-secondary-text)' ,
'secondary-outline-border' : 'var(--color-secondary-border)' ,
'secondary-outline-fg' : 'var(--color-secondary-text)' ,
'neutral-solid-bg' : 'var(--color-neutral-solid)' ,
'secondary-outline-border' : 'var(--color-secondary-border)' , 'neutral-solid-bg' : 'var(--color-neutral-solid)' ,
'neutral-solid-bg-hover' : 'var(--color-neutral-solid-hover)' ,
'neutral-soft-bg' : 'var(--color-neutral-surface)' ,
'neutral-soft-bg-hover' : 'var(--color-neutral-surface-hover)' ,
'neutral-soft-fg' : 'var(--color-neutral-text)' ,
'neutral-outline-border' : 'var(--color-neutral-border)' ,
'neutral-outline-fg' : 'var(--color-neutral-text)' ,
'affirm-solid-bg' : 'var(--color-affirm-solid)' ,
'neutral-outline-border' : 'var(--color-neutral-border)' , 'affirm-solid-bg' : 'var(--color-affirm-solid)' ,
'affirm-solid-bg-hover' : 'var(--color-affirm-solid-hover)' ,
'affirm-soft-bg' : 'var(--color-affirm-surface)' ,
'affirm-soft-bg-hover' : 'var(--color-affirm-surface-hover)' ,
'affirm-soft-fg' : 'var(--color-affirm-text)' ,
'affirm-outline-border' : 'var(--color-affirm-border)' ,
'affirm-outline-fg' : 'var(--color-affirm-text)' ,
'fulfill-solid-bg' : 'var(--color-fulfill-solid)' ,
'affirm-outline-border' : 'var(--color-affirm-border)' , 'fulfill-solid-bg' : 'var(--color-fulfill-solid)' ,
'fulfill-solid-bg-hover' : 'var(--color-fulfill-solid-hover)' ,
'fulfill-soft-bg' : 'var(--color-fulfill-surface)' ,
'fulfill-soft-bg-hover' : 'var(--color-fulfill-surface-hover)' ,
'fulfill-soft-fg' : 'var(--color-fulfill-text)' ,
'fulfill-outline-border' : 'var(--color-fulfill-border)' ,
'fulfill-outline-fg' : 'var(--color-fulfill-text)' ,
'risk-solid-bg' : 'var(--color-risk-solid)' ,
'fulfill-outline-border' : 'var(--color-fulfill-border)' , 'risk-solid-bg' : 'var(--color-risk-solid)' ,
'risk-solid-bg-hover' : 'var(--color-risk-solid-hover)' ,
'risk-soft-bg' : 'var(--color-risk-surface)' ,
'risk-soft-bg-hover' : 'var(--color-risk-surface-hover)' ,
'risk-soft-fg' : 'var(--color-risk-text)' ,
'risk-outline-border' : 'var(--color-risk-border)' ,
'risk-outline-fg' : 'var(--color-risk-text)' ,
'threat-solid-bg' : 'var(--color-threat-solid)' ,
'risk-outline-border' : 'var(--color-risk-border)' , 'threat-solid-bg' : 'var(--color-threat-solid)' ,
'threat-solid-bg-hover' : 'var(--color-threat-solid-hover)' ,
'threat-soft-bg' : 'var(--color-threat-surface)' ,
'threat-soft-bg-hover' : 'var(--color-threat-surface-hover)' ,
'threat-soft-fg' : 'var(--color-threat-text)' ,
'threat-outline-border' : 'var(--color-threat-border)' ,
'threat-outline-fg' : 'var(--color-threat-text)' ,
'loss-solid-bg' : 'var(--color-loss-solid)' ,
'threat-outline-border' : 'var(--color-threat-border)' , 'loss-solid-bg' : 'var(--color-loss-solid)' ,
'loss-solid-bg-hover' : 'var(--color-loss-solid-hover)' ,
'loss-soft-bg' : 'var(--color-loss-surface)' ,
'loss-soft-bg-hover' : 'var(--color-loss-surface-hover)' ,
'loss-soft-fg' : 'var(--color-loss-text)' ,
'loss-outline-border' : 'var(--color-loss-border)' ,
'loss-outline-fg' : 'var(--color-loss-text)' ,
// Private selected palette (TSC v2.1). 8 colors, 7 slots
// (solid-bg + solid-bg-hover for solid variant, soft-bg +
// soft-bg-hover + soft-fg for soft variant, outline-border +
// outline-fg for outline variant). All 3 variants share the
// same per-color cascade keyed on `data-color`.
'_selected-solid-bg' : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots so the THM-2
// shared-layer forward routes color="teal" + the 33 scales, incl. the
// alpha `surface`/`surface-hover` slots for the soft variant; renamed
// from `_selected-*` 2026-07-12). solid + solid-hover (solid variant) ·
// surface + surface-hover + text (soft variant) · border + text (outline
// variant — its fg merged into `text`, same value). Cascade keyed on
// `data-color`.
'_palette-solid' : {
declarations : [
{ value : 'var(--tag-group-primary-solid-bg)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-solid-bg)' , scope : 'color:secondary' } ,
@ -2519,7 +2512,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-loss-solid-bg)' , scope : 'color:loss' }
]
} ,
'_ selected-solid-bg -hover': {
'_ palette-solid -hover': {
declarations : [
{ value : 'var(--tag-group-primary-solid-bg-hover)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-solid-bg-hover)' , scope : 'color:secondary' } ,
@ -2531,7 +2524,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-loss-solid-bg-hover)' , scope : 'color:loss' }
]
} ,
'_ selected-soft-bg ': {
'_ palette-surface ': {
declarations : [
{ value : 'var(--tag-group-primary-soft-bg)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-soft-bg)' , scope : 'color:secondary' } ,
@ -2543,7 +2536,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-loss-soft-bg)' , scope : 'color:loss' }
]
} ,
'_ selected-soft-bg -hover': {
'_ palette-surface -hover': {
declarations : [
{ value : 'var(--tag-group-primary-soft-bg-hover)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-soft-bg-hover)' , scope : 'color:secondary' } ,
@ -2555,7 +2548,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-loss-soft-bg-hover)' , scope : 'color:loss' }
]
} ,
'_ selected-soft-fg ': {
'_ palette-text ': {
declarations : [
{ value : 'var(--tag-group-primary-soft-fg)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-soft-fg)' , scope : 'color:secondary' } ,
@ -2567,7 +2560,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-loss-soft-fg)' , scope : 'color:loss' }
]
} ,
'_ selected-outlin e-border': {
'_ palett e-border': {
declarations : [
{ value : 'var(--tag-group-primary-outline-border)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-outline-border)' , scope : 'color:secondary' } ,
@ -2578,18 +2571,6 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tag-group-threat-outline-border)' , scope : 'color:threat' } ,
{ value : 'var(--tag-group-loss-outline-border)' , scope : 'color:loss' }
]
} ,
'_selected-outline-fg' : {
declarations : [
{ value : 'var(--tag-group-primary-outline-fg)' , scope : 'host' } ,
{ value : 'var(--tag-group-secondary-outline-fg)' , scope : 'color:secondary' } ,
{ value : 'var(--tag-group-neutral-outline-fg)' , scope : 'color:neutral' } ,
{ value : 'var(--tag-group-affirm-outline-fg)' , scope : 'color:affirm' } ,
{ value : 'var(--tag-group-fulfill-outline-fg)' , scope : 'color:fulfill' } ,
{ value : 'var(--tag-group-risk-outline-fg)' , scope : 'color:risk' } ,
{ value : 'var(--tag-group-threat-outline-fg)' , scope : 'color:threat' } ,
{ value : 'var(--tag-group-loss-outline-fg)' , scope : 'color:loss' }
]
}
} ,
editable : {
@ -2650,9 +2631,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'affirm-border' : 'var(--color-affirm-border)' ,
'risk-border' : 'var(--color-risk-border)' ,
'threat-border' : 'var(--color-threat-border)' ,
// Private accent palette (TSC v2.1). Only solid + border +
// solid-hover are consumed; track/text declared pre-TSC but unused.
'_accent-solid' : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots for the THM-2
// shared-layer forward — color="teal" + the 33 scales; renamed from
// `_accent-*` 2026-07-13). solid + border + solid-hover consumed.
'_palette-solid' : {
declarations : [
{ value : 'var(--editable-primary-solid)' , scope : 'host' } ,
{ value : 'var(--editable-secondary-solid)' , scope : 'color:secondary' } ,
@ -2662,7 +2644,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--editable-threat-solid)' , scope : 'color:threat' }
]
} ,
'_ accent -border': {
'_ palette -border': {
declarations : [
{ value : 'var(--editable-primary-border)' , scope : 'host' } ,
{ value : 'var(--editable-secondary-border)' , scope : 'color:secondary' } ,
@ -2672,7 +2654,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--editable-threat-border)' , scope : 'color:threat' }
]
} ,
'_ accent -solid-hover': {
'_ palette -solid-hover': {
declarations : [
{ value : 'var(--color-primary-solid-hover)' , scope : 'host' } ,
{ value : 'var(--color-secondary-solid-hover)' , scope : 'color:secondary' } ,
@ -2888,9 +2870,11 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'risk-border' : 'var(--color-risk-border)' ,
'threat-track' : 'var(--color-threat-track)' ,
'threat-border' : 'var(--color-threat-border)' ,
// Private accent palette (TSC v2.1). 8 colors, 3 slots (track,
// Private palette (TSC v2.1 · canonical `_palette-*` slots so the
// THM-2 shared-layer forward routes `color="teal"` + the 33 scales;
// renamed from `_accent-*` 2026-07-13). 8 colors, 3 slots (track,
// border, text). `solid` was declared pre-TSC but never consumed.
'_accent-track' : {
'_ palette -track': {
declarations : [
{ value : 'var(--tags-input-primary-track)' , scope : 'host' } ,
{ value : 'var(--tags-input-secondary-track)' , scope : 'color:secondary' } ,
@ -2902,7 +2886,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tags-input-loss-track)' , scope : 'color:loss' }
]
} ,
'_ accent -border': {
'_ palette -border': {
declarations : [
{ value : 'var(--tags-input-primary-border)' , scope : 'host' } ,
{ value : 'var(--tags-input-secondary-border)' , scope : 'color:secondary' } ,
@ -2914,7 +2898,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--tags-input-loss-border)' , scope : 'color:loss' }
]
} ,
'_ accent -text': {
'_ palette -text': {
declarations : [
{ value : 'var(--tags-input-primary-text)' , scope : 'host' } ,
{ value : 'var(--tags-input-secondary-text)' , scope : 'color:secondary' } ,
@ -3088,8 +3072,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'neutral-border' : 'var(--color-neutral-border)' ,
'affirm-track' : 'var(--color-affirm-track)' ,
'affirm-border' : 'var(--color-affirm-border)' ,
// Private accent palette (TSC v2.1). Per-color cascade in config.
'_accent-solid' : {
// Private palette (TSC v2.1 · canonical `_palette-*` slots for the
// THM-2 shared-layer forward — color="teal" + the 33 scales; renamed
// from `_accent-*` 2026-07-13). Per-color cascade in config.
'_palette-solid' : {
declarations : [
{ value : 'var(--stepper-primary-solid)' , scope : 'host' } ,
{ value : 'var(--stepper-secondary-solid)' , scope : 'color:secondary' } ,
@ -3098,7 +3084,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--stepper-fulfill-solid)' , scope : 'color:fulfill' }
]
} ,
'_ accent -track': {
'_ palette -track': {
declarations : [
{ value : 'var(--stepper-primary-track)' , scope : 'host' } ,
{ value : 'var(--stepper-secondary-track)' , scope : 'color:secondary' } ,
@ -3107,7 +3093,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--stepper-fulfill-track)' , scope : 'color:fulfill' }
]
} ,
'_ accent -border': {
'_ palette -border': {
declarations : [
{ value : 'var(--stepper-primary-border)' , scope : 'host' } ,
{ value : 'var(--stepper-secondary-border)' , scope : 'color:secondary' } ,
@ -3116,7 +3102,7 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
{ value : 'var(--stepper-fulfill-border)' , scope : 'color:fulfill' }
]
} ,
'_ accent -text': {
'_ palette -text': {
declarations : [
{ value : 'var(--stepper-primary-text)' , scope : 'host' } ,
{ value : 'var(--stepper-secondary-text)' , scope : 'color:secondary' } ,
@ -4006,90 +3992,11 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
// ─────────────────────────────────────────────────────────────────────
'toggle-group' : {
gap : 'var(--space-1)' ,
// TSC v2.2 — cross-recipe composition. Items inside a toggle-group
// ARE toggles, so the group's `data-color` cascade must override
// Toggle's PUBLIC palette tokens (owned by Toggle's recipe — not by
// toggle-group) ONLY when reached through a toggle-group ancestor.
//
// `targetSelector: '[data-toggle-group-item]'` reaches the foreign
// part inside the host's cascade. The generator emits:
// [data-toggle-group][data-color='X'] [data-toggle-group-item] {
// --toggle-palette-{slot}: var(--toggle-X-{slot});
// }
//
// Replaces the 4 hand-written CSS blocks that used to live in
// `toggle-group.css` (lines 264-308 in the legacy file).
composition : {
toggle : {
targetSelector : '[data-toggle-group-item]' ,
tokens : {
'palette-track' : {
declarations : [
{ value : 'var(--toggle-primary-track)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-track)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-track)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-track)' , scope : 'color:threat' }
]
} ,
'palette-element' : {
declarations : [
{ value : 'var(--toggle-primary-element)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-element)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-element)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-element)' , scope : 'color:threat' }
]
} ,
'palette-hover' : {
declarations : [
{ value : 'var(--toggle-primary-hover)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-hover)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-hover)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-hover)' , scope : 'color:threat' }
]
} ,
'palette-border' : {
declarations : [
{ value : 'var(--toggle-primary-border)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-border)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-border)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-border)' , scope : 'color:threat' }
]
} ,
'palette-solid' : {
declarations : [
{ value : 'var(--toggle-primary-solid)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-solid)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-solid)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-solid)' , scope : 'color:threat' }
]
} ,
'palette-solid-hover' : {
declarations : [
{ value : 'var(--toggle-primary-solid-hover)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-solid-hover)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-solid-hover)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-solid-hover)' , scope : 'color:threat' }
]
} ,
'palette-text' : {
declarations : [
{ value : 'var(--toggle-primary-text)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-text)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-text)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-text)' , scope : 'color:threat' }
]
} ,
'palette-contrast' : {
declarations : [
{ value : 'var(--toggle-primary-contrast)' , scope : 'color:primary' } ,
{ value : 'var(--toggle-affirm-contrast)' , scope : 'color:affirm' } ,
{ value : 'var(--toggle-risk-contrast)' , scope : 'color:risk' } ,
{ value : 'var(--toggle-threat-contrast)' , scope : 'color:threat' }
]
}
}
}
}
// Per-color palette: the group's `data-color` routes to every item's Toggle
// palette via the shared per-instance layer (THM-2). The composition DSL
// can't presence-scope (`[data-color]` with no value), so the routing is
// hand-authored in `toggle-group.css` — ONE rule covering all roles + the
// 33 scales, replacing the old 4-role composition enumeration.
} ,
// ─────────────────────────────────────────────────────────────────────