|
|
/**
|
|
|
* theming-sentinel-exceptions — the written adjudications R-5.4 requires.
|
|
|
*
|
|
|
* A public token the sentinel reports as "no effect" is EITHER a lie (retire
|
|
|
* it) OR its silence has a measured reason that lives here, one line per
|
|
|
* token: the part is conditional and the demo does not mount it, the state
|
|
|
* needs forcing, the consumer is a pseudo-element or a composed component the
|
|
|
* instrument cannot read, the value sits behind a media query. "Forced →
|
|
|
* reaches" means the adjudication PROVED the token alive by mounting what it
|
|
|
* needs; an instrument-limit entry names the limit (they are also registered
|
|
|
* in next-features §13).
|
|
|
*
|
|
|
* An entry whose token starts moving again is reported as STALE by the guard —
|
|
|
* prune it (a stale exception is the same debt as a stale allowlist row).
|
|
|
*
|
|
|
* All entries below were measured during the F2-A adversarial review
|
|
|
* (2026-08-21) unless dated otherwise.
|
|
|
*/
|
|
|
|
|
|
export const SENTINEL_EXCEPTIONS: Record<string, Record<string, string>> = {
|
|
|
command: {
|
|
|
'focus-input-border':
|
|
|
'consumed only under :focus-visible, which the guard blurs away ON PURPOSE (the click-focus poisoning fix); focused by hand → reaches (rgb(9,9,9))',
|
|
|
'loading-height': 'the loading bar is conditional and the demo does not mount it',
|
|
|
'loading-fg': 'the loading bar is conditional and the demo does not mount it',
|
|
|
'viewport-padding': 'the non-ScrollArea viewport variant is not mounted in the demo',
|
|
|
'empty-padding-block': 'the empty state is conditional and not mounted at measurement',
|
|
|
'empty-fg': 'the empty state is conditional and not mounted at measurement'
|
|
|
},
|
|
|
table: {
|
|
|
'header-z':
|
|
|
'consumed only under [data-sticky-header], which the demo does not set; forced → reaches (2 → 4321)',
|
|
|
'row-detail-fg':
|
|
|
'detail rows are closed (display:none) in the demo initial state; forced data-state=open → reaches (rgb(1,2,3))',
|
|
|
'row-detail-padding-block':
|
|
|
'detail rows are closed (display:none) in the demo initial state; forced data-state=open → reaches (12 → 1234)'
|
|
|
},
|
|
|
'media-player': {
|
|
|
'accent-strong': 'consumed by the live indicator, which only paints under [data-live]',
|
|
|
track:
|
|
|
'forwarded into the composed Slider — paints on [data-slider-*] nodes, outside this component attribute space',
|
|
|
'buffered-bg':
|
|
|
'forwarded into the composed Slider (SecondaryRange) — outside this component attribute space',
|
|
|
'captions-bg': 'captions are conditional and the demo video carries no track',
|
|
|
'captions-fg': 'captions are conditional and the demo video carries no track',
|
|
|
'captions-radius': 'captions are conditional and the demo video carries no track',
|
|
|
'captions-padding-block': 'captions are conditional and the demo video carries no track',
|
|
|
'captions-padding-inline': 'captions are conditional and the demo video carries no track',
|
|
|
'captions-line-height': 'captions are conditional and the demo video carries no track',
|
|
|
'volume-vertical-length': 'the volume float is interaction-mounted; not open at measurement',
|
|
|
'volume-float-padding-block':
|
|
|
'the volume float is interaction-mounted; not open at measurement',
|
|
|
'volume-float-padding-inline':
|
|
|
'the volume float is interaction-mounted; not open at measurement',
|
|
|
'rate-button-min-width': 'the rate control is conditional and the demo does not mount it',
|
|
|
'audio-title-padding-block': 'audio variant — the video demo does not mount the audio title',
|
|
|
'audio-title-padding-inline': 'audio variant — the video demo does not mount the audio title'
|
|
|
},
|
|
|
'tree-grid': {
|
|
|
'header-z':
|
|
|
'consumed only under [data-sticky-header], which the demo does not set; forced → reaches (2 → 4321)',
|
|
|
'disabled-row-fg': 'no disabled row in the demo; forced data-disabled → reaches (rgb(1,2,3))'
|
|
|
},
|
|
|
'gradient-picker': {
|
|
|
'chip-radius':
|
|
|
'the swatch is a CLASS hook (.gradient-picker-trigger-swatch) outside the attribute-filtered node set; direct read → reaches (§13 class-hook debt)',
|
|
|
'chip-border':
|
|
|
'the swatch is a CLASS hook outside the attribute-filtered node set; direct read → reaches (§13 class-hook debt)',
|
|
|
'content-width-sm':
|
|
|
"sized by data-picker-size (picker-shell's axis, not data-size); forced → reaches (288 → 512)",
|
|
|
'content-width-lg':
|
|
|
"sized by data-picker-size (picker-shell's axis, not data-size); forced → reaches (352 → 512)",
|
|
|
'stoplist-max-block':
|
|
|
"consumer node lives in the composed ScrollArea's attribute space (--scroll-area-auto-max-block on the viewport); direct read → reaches (132 → 1234)",
|
|
|
'stoplist-scrollbar-size':
|
|
|
'the design scrollbar only mounts on overflow; the demo list is short',
|
|
|
'stoplist-scrollbar-inset':
|
|
|
"consumer node lives in the composed ScrollArea's attribute space; direct read → reaches (12 → 1234)",
|
|
|
'presets-panel-width':
|
|
|
"the presets popover needs a second click the guard's open step does not perform; forced → reaches (240 → 1234)",
|
|
|
'presets-gap': 'presets popover not mounted by the open step; forced → reaches (8 → 1234)',
|
|
|
'presets-min-column':
|
|
|
'presets popover not mounted by the open step; forced → reaches (66px columns → 1234)',
|
|
|
'preset-height': 'presets popover not mounted by the open step; forced → reaches (32 → 1234)',
|
|
|
'preset-radius': 'presets popover not mounted by the open step; forced → reaches (6 → 1234)',
|
|
|
'preset-border': 'presets popover not mounted by the open step; forced → reaches (rgb(1,2,3))',
|
|
|
'hover-preset-border':
|
|
|
'presets popover not mounted by the open step; forced + real hover → reaches (rgb(1,2,3))',
|
|
|
'selected-preset-border':
|
|
|
'presets popover not mounted by the open step; forced data-selected → reaches (rgb(1,2,3))',
|
|
|
'selected-preset-outline-offset':
|
|
|
'presets popover not mounted by the open step; forced data-selected → reaches (2 → 1234)'
|
|
|
},
|
|
|
listbox: {
|
|
|
'invalid-border': 'no invalid listbox in the demo; forced data-invalid → reaches (rgb(1,2,3))'
|
|
|
},
|
|
|
carousel: {
|
|
|
'vertical-block-size':
|
|
|
'vertical orientation not mounted in the demo; forced → reaches (256 → 1234)'
|
|
|
},
|
|
|
feed: {
|
|
|
'sentinel-spinner-size':
|
|
|
'the spinner only exists while [data-busy], and the guard WAITS for the busy window to close (the settle fix); measured live during the busy window (::before, 12 → 1234)',
|
|
|
'sentinel-spinner-width':
|
|
|
'the spinner only exists while [data-busy]; measured live during the busy window (::before border)',
|
|
|
'sentinel-spinner-gap':
|
|
|
'the spinner only exists while [data-busy]; measured live during the busy window (::before margin)',
|
|
|
'sentinel-spinner-duration':
|
|
|
'the spinner only exists while [data-busy]; measured live during the busy window (animation-duration 0.7s → 11.5s)',
|
|
|
'article-title-font-size-5':
|
|
|
'the demo mounts heading levels 3–4 only; forced aria-level=5 → reaches (14 → 1234)',
|
|
|
'article-title-font-size-6':
|
|
|
'the demo mounts heading levels 3–4 only; forced aria-level=6 → reaches (12 → 1234)',
|
|
|
'sentinel-spinner-reduced-duration':
|
|
|
'behind prefers-reduced-motion; emulated reduce context → reaches (4s → 11.5s)'
|
|
|
},
|
|
|
'card-group': {
|
|
|
'title-fg':
|
|
|
'the STATIC heading form is not mounted in the demo (0 [data-static] nodes vs 1 [data-button], counted); forced → reaches (rgb(1,2,3))',
|
|
|
'title-font-family':
|
|
|
'static heading not mounted in the demo; forced → reaches (Instrument Sans → Zapfino)',
|
|
|
'title-font-size':
|
|
|
'static heading not mounted in the demo; forced → reaches (16 → 1234px)',
|
|
|
'title-line-height':
|
|
|
'static heading not mounted in the demo; forced → reaches (20px → 3.77em)',
|
|
|
'title-padding-block-end':
|
|
|
'static heading not mounted in the demo; forced → reaches (8 → 1234px)'
|
|
|
},
|
|
|
'code-block': {
|
|
|
'pre-padding':
|
|
|
'the DEMO HARNESS outweighs the component: `[data-uix-docs] pre` (uix.css:801, 0-1-1) beats `[data-code-block-pre]` (0-1-0) and paints padding/border/radius/bg/font on the <pre>. Forced with !important → reaches (16px 20px → 12px). Seven properties measured, registered in next-features §13'
|
|
|
},
|
|
|
'tree-view': {
|
|
|
'disabled-row-fg':
|
|
|
'no disabled row in the demo (0 mounted, counted); forced data-disabled → reaches (oklch(0.61 0 0) → rgb(1,2,3))'
|
|
|
},
|
|
|
textarea: {
|
|
|
'focus-input-border':
|
|
|
'consumed only under [data-focused], which the guard blurs away ON PURPOSE (the click-focus poisoning fix); focused by hand with the pointer parked → reaches (rgb(4,5,6))',
|
|
|
'invalid-input-border':
|
|
|
'consumed only under [data-invalid]; the demo boots valid. Forced by hand 2026-08-21 → reaches (rgb(7,8,9))',
|
|
|
'overflow-count-fg':
|
|
|
'the count only carries [data-overflow] past maxLength (280 chars); forced → reaches (rgb(13,14,15))',
|
|
|
'overflow-count-font-weight':
|
|
|
'the count only carries [data-overflow] past maxLength (280 chars); forced → reaches (font-weight 333)'
|
|
|
},
|
|
|
'grid-list': {
|
|
|
'invalid-border':
|
|
|
'consumed only under [data-invalid]; the demo boots with its invalid control off, so the rule never matches at measurement. Toggled by hand 2026-08-21 → reaches (oklch(0.9555 0.0207 13.86) → rgb(1,2,3))'
|
|
|
}
|
|
|
};
|