38 claves nuevas en el bloque `grid-list` de `recipes/base.ts` (que ya existía
con los dos forwards de paleta: se FUSIONA, no se añade un segundo). Alcance
del censo 0 % → 85 % (22 de 26 puntuables); global 45 % → 46 %, sin contrato
49 → 48.
El eje `size` se estampa en el PROVIDER —el wrapper de eidos no tiene parte
`root`—, así que los tres nombres resueltos van SIN `parts`: molde `command`,
no `table`/`tree-grid`. Fuera los cuatro bloques `[data-size]` del CSS; los
emite el TSC. Altura de fila 1:1 con el bundle, `row-padding-inline` con ritmo
propio, y la tipografía un paso por debajo de md en adelante — verbatim, como
table y tree-grid.
LO QUE LA MEDICIÓN CAMBIÓ (la §4 generada tenía un error de doctrina y dos
defectos que sólo aparecieron midiendo; el §5 Veredicto se escribió con la
sonda delante, porque estaba vacío):
1. La selección de fila NUNCA HA PINTADO. La receta seleccionaba
`[data-grid-list-row][data-selected]`, un atributo que ni el morfo declara
ni soma estampa (estampa `data-state='selected'` + `aria-selected`): la
regla no casaba jamás y su acento `--_grid-list-palette-element` no llegó
nunca al píxel — una fila seleccionada muestra el velo NEUTRO del
arquetipo, indistinguible del hover (capturado). Retirada la declaración
muerta y su forward huérfano: 0 diffs, que es la prueba. Repararlo mueve
píxel y choca con §12.5 (el arquetipo fija también `color`) → §13, espera
firma. El acento del checkbox (`_palette-solid`) sí vive y se conserva.
2. NO se acuña `hover-row-bg` aunque la propuesta lo pedía. La fila es
`archetype: 'item'`: el velo del sistema la pinta a especificidad plena y
el plano de la receta pierde — medido, el hover pinta DOS VECES sobre el
MISMO nodo (a diferencia de table/tree-grid, donde velo y plano caen en
nodos distintos). Sería un token que no puede ganar; mismo criterio que
listbox.highlighted → §12.7. Y fila Y celda llevan ambas `item`, así que
bajo el puntero se apilan tres capas.
3. «Consume la capa compartida `menu-indicator`» es FALSO. Sale de
`SHARED_LAYERS` (`theming-census.ts:432`), pero esa capa no tiene un solo
selector de grid-list, la receta no la importa y soma no renderiza
indicator: el checkbox ESPEJA el visual pintándolo por su cuenta. Entrada
desviada del censo → §13 (listbox / menubar / navigation-menu están en la
misma entrada y tampoco aparecen en el fichero).
Nombres, sobre la propuesta: `selection-checkbox-{width,height}` son UN knob →
`selection-checkbox-size`; `on-selection-checkbox-bg` → `checked-selection-checkbox-fg`
(es la tinta del glifo, y `on-` es prefijo reservado); `border` partido en
`border-width` + color (molde `command.input-border*`), que el checkbox
comparte; `padding` uniforme se queda `padding` (precedente
`command.viewport-padding`); `max-block` entra al contrato (molde
`command.viewport-max-block`).
Artefactos y gates:
- Sonda antes/después = 0 diffs en 6.090 valores × 7 estados. Determinismo
verificado: dos corridas del mismo código, 0 diffs.
- R-5.4: 37/38 tokens mueven un computed. `invalid-border` adjudicado EN EL
LEDGER con su razón medida (la demo arranca con su control en off; activado
a mano alcanza: oklch(0.9555 0.0207 13.86) → rgb(1,2,3)).
- censo --only 85 % · component:audit PASS (R-5.3 incluida) · eidos-lint
invalid 0, class-hooks 0 · suite eidos sin rojos nuevos (el único es el
conocido skin-media-player) · rtl:check 0 · docs:check 0 · check por fichero
limpio (72 globales, ninguno mío).
- README con su «Talla y tema» y tab `Tokens` en la demo (38 claves, leídas en
vivo). El tab `Recipe` documentaba la regla retirada: corregido.
Las fichas de calendar / carousel / command / month-grid / range-calendar /
table / year-grid entran porque `--report` regenera el informe entero: sólo
actualizan NÚMEROS DE LÍNEA de commits ya hechos que no lo regeneraron. Cero
cambios de alcance. Las otras 161, que sólo cambiaban la fecha, se revirtieron.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_calendar-palette-border`, `--_calendar-palette-solid`, `--_calendar-palette-solid-hover`, `--_calendar-palette-text`, `--_calendar-palette-track`.
## 4. Propuesta de corrección
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
- **Consume la capa compartida `calendar-surface`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--calendar-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (3)
@ -82,12 +73,9 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **ya alcanzable: el privado `--_calendar-font-size` deriva de un público (`var(--calendar-font-size-md)`, `var(--calendar-font-size-xs)`, `var(--calendar-font-size-sm)`, `var(--calendar-font-size-lg)`) — sin acción; el censo lo cuenta como no alcanzable por el límite del regex** — 1: `font-size`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
- **ya alcanzable: el privado `--_calendar-day-size` deriva de un público (`var(--calendar-day-size-md)`, `var(--calendar-day-size-xs)`, `var(--calendar-day-size-sm)`, `var(--calendar-day-size-lg)`) — sin acción; el censo lo cuenta como no alcanzable por el límite del regex** — 4: `inline-size`, `block-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `border-color`, `background`, `color`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
_La receta no declara privados propios en su CSS._
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_grid-list-palette-element`, `--_grid-list-palette-solid`.
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_grid-list-palette-solid`.
## 4. Propuesta de corrección
- **Consume la capa compartida `menu-indicator`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--grid-list-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (32)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (1)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -93,52 +63,12 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **⚠ decisión: `border` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 2: `border`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 3: `background`, `border-color`.
### 4.3 Avisos sobre los tokens propuestos (4)
- **el privado `--_grid-list-font-size` debe pasar a leer este público (o desaparecer)** — `--grid-list-font-size-md`, `--grid-list-font-size-xs`, `--grid-list-font-size-sm`, `--grid-list-font-size-lg`, `--grid-list-font-size-xl`
- **el privado `--_grid-list-row-height` debe pasar a leer este público (o desaparecer)** — `--grid-list-row-height-md`, `--grid-list-row-height-xs`, `--grid-list-row-height-sm`, `--grid-list-row-height-lg`, `--grid-list-row-height-xl`
- **el privado `--_grid-list-row-padding-inline` debe pasar a leer este público (o desaparecer)** — `--grid-list-row-padding-inline-md`, `--grid-list-row-padding-inline-xs`, `--grid-list-row-padding-inline-sm`, `--grid-list-row-padding-inline-lg`, `--grid-list-row-padding-inline-xl`
- **el privado `--_grid-list-checkbox-size` debe pasar a leer este público (o desaparecer)** — `--grid-list-selection-checkbox-width`, `--grid-list-selection-checkbox-height`
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 2: `border-color`, `background`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
@ -152,6 +82,66 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-21** (sonda ×2 sobre el mismo código = 0 diffs en 6.090
valores · 7 estados; dev server 5180). La §4 orienta pero tiene un error de
doctrina y dos defectos que sólo aparecieron midiendo.
1. **La nota «consume la capa `menu-indicator`» NO aplica.** Sale de
`SHARED_LAYERS` (`theming-census.ts:432`), que lista a grid-list como
consumidor — pero `lib/menu-indicator.css` no tiene un solo selector
`grid-list`, la receta no la importa y soma no renderiza indicator. El
checkbox **espeja** el visual con pintura propia (el comentario de la
receta dice «recipe family», no consumo). Entrada desviada del censo —
anotada como incidencia §13.
2. **La selección está MUERTA en la fila.** La receta selecciona
`[data-grid-list-row][data-selected]`, pero ni el morfo declara
`data-selected` ni soma lo estampa (DOM medido: `data-state=selected` +
`aria-selected='true'`). El acento `--_grid-list-palette-element` no pinta
jamás; una fila seleccionada sólo muestra el velo neutro del arquetipo
## 3. Privados de la receta — ¿de dónde sale su valor?
| privado | declaraciones | valor(es) | origen | ¿deriva de un público? |
| --- | ---: | --- | --- | :-: |
| `--_month-grid-padding` | 4 | `var(--calendar-padding-md)`, `var(--calendar-padding-xs)`, `var(--calendar-padding-sm)`, `var(--calendar-padding-lg)` | global | no |
| `--_month-grid-control-size` | 4 | `var(--calendar-control-size-md)`, `var(--calendar-control-size-xs)`, `var(--calendar-control-size-sm)`, `var(--calendar-control-size-lg)` | global | no |
| `--_month-grid-cell-size` | 4 | `var(--calendar-day-size-md)`, `var(--calendar-day-size-xs)`, `var(--calendar-day-size-sm)`, `var(--calendar-day-size-lg)` | global | no |
| `--_month-grid-font-size` | 4 | `var(--calendar-font-size-md)`, `var(--calendar-font-size-xs)`, `var(--calendar-font-size-sm)`, `var(--calendar-font-size-lg)` | global | no |
_La receta no declara privados propios en su CSS._
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_month-grid-palette-border`, `--_month-grid-palette-solid`, `--_month-grid-palette-solid-hover`, `--_month-grid-palette-text`, `--_month-grid-palette-track`.
## 4. Propuesta de corrección
- **Consume la capa compartida `calendar-surface`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--month-grid-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Consume la capa compartida `picker-shell`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--month-grid-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Consume tokens públicos de `calendar`.** Un token prestado importa la semántica de su dueño: la corrección no es duplicarlo con prefijo propio, sino la decisión de familia que la auditoría de fase 1 dejó registrada (`theming-audit.md` §B, familia calendar).
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (55)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (2)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -122,74 +116,13 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **⚠ decisión: `border` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 3: `border`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 3: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `border-color`, `background`, `color`.
### 4.3 Avisos sobre los tokens propuestos (3)
### 4.2 Sin nombre mecánico (10)
- **el privado `--_month-grid-font-size` debe pasar a leer este público (o desaparecer)** — `--month-grid-font-size-md`, `--month-grid-font-size-xs`, `--month-grid-font-size-sm`, `--month-grid-font-size-lg`
- **el privado `--_month-grid-control-size` debe pasar a leer este público (o desaparecer)** — `--month-grid-prev-button-width-md`, `--month-grid-prev-button-width-xs`, `--month-grid-prev-button-width-sm`, `--month-grid-prev-button-width-lg`, `--month-grid-prev-button-height-md`, `--month-grid-prev-button-height-xs`, `--month-grid-prev-button-height-sm`, `--month-grid-prev-button-height-lg`
- **el privado `--_month-grid-cell-size` debe pasar a leer este público (o desaparecer)** — `--month-grid-cell-width-md`, `--month-grid-cell-width-xs`, `--month-grid-cell-width-sm`, `--month-grid-cell-width-lg`, `--month-grid-cell-height-md`, `--month-grid-cell-height-xs`, `--month-grid-cell-height-sm`, `--month-grid-cell-height-lg`
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 3: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `border-color`, `background`, `color`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
## 3. Privados de la receta — ¿de dónde sale su valor?
@ -140,10 +140,10 @@ Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inl
## 4. Propuesta de corrección
- **Consume la capa compartida `calendar-surface`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--range-calendar-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Consume tokens públicos de `calendar`.** Un token prestado importa la semántica de su dueño: la corrección no es duplicarlo con prefijo propio, sino la decisión de familia que la auditoría de fase 1 dejó registrada (`theming-audit.md` §B, familia calendar).
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (59)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (4)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -153,76 +153,15 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **⚠ decisión: `border` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 3: `border`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `background`, `color`, `border-color`.
### 4.3 Avisos sobre los tokens propuestos (1)
### 4.2 Sin nombre mecánico (8)
- **⚠ decisión: el valor es una expresión — el token puede llevar la expresión entera o sólo su término variable** — `--range-calendar-month-select-width`, `--range-calendar-year-select-width`
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 1: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `background`, `color`, `border-color`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
## 3. Privados de la receta — ¿de dónde sale su valor?
| privado | declaraciones | valor(es) | origen | ¿deriva de un público? |
| --- | ---: | --- | --- | :-: |
| `--_year-grid-padding` | 4 | `var(--calendar-padding-md)`, `var(--calendar-padding-xs)`, `var(--calendar-padding-sm)`, `var(--calendar-padding-lg)` | global | no |
| `--_year-grid-control-size` | 4 | `var(--calendar-control-size-md)`, `var(--calendar-control-size-xs)`, `var(--calendar-control-size-sm)`, `var(--calendar-control-size-lg)` | global | no |
| `--_year-grid-cell-size` | 4 | `var(--calendar-day-size-md)`, `var(--calendar-day-size-xs)`, `var(--calendar-day-size-sm)`, `var(--calendar-day-size-lg)` | global | no |
| `--_year-grid-font-size` | 4 | `var(--calendar-font-size-md)`, `var(--calendar-font-size-xs)`, `var(--calendar-font-size-sm)`, `var(--calendar-font-size-lg)` | global | no |
_La receta no declara privados propios en su CSS._
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_year-grid-palette-border`, `--_year-grid-palette-solid`, `--_year-grid-palette-solid-hover`, `--_year-grid-palette-text`, `--_year-grid-palette-track`.
## 4. Propuesta de corrección
- **Consume la capa compartida `calendar-surface`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--year-grid-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Consume la capa compartida `picker-shell`.** Un eje que la capa posee se consume como `var(--_x, var(--x))`; el consumidor **no acuña**`--year-grid-{eje}` para él — sería un vocabulario paralelo (README de `eidos/components`, «Capas compartidas» regla 2).
- **Consume tokens públicos de `calendar`.** Un token prestado importa la semántica de su dueño: la corrección no es duplicarlo con prefijo propio, sino la decisión de familia que la auditoría de fase 1 dejó registrada (`theming-audit.md` §B, familia calendar).
- **Tiene eje `size`**: los tokens dimensionales van por talla (`{part}-{eje}-{k}`) apuntando al bundle `--size-{k}-*`, nunca al primitivo crudo (theming §5; el guard `recipe-css-contract` prohíbe el primitivo).
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (55)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (2)
Valor **verbatim** del CSS de hoy: el default no se mueve, sólo cambia quién
puede moverlo. Nombres derivados de recipe-contract §1 (ejes lógicos, talla
@ -122,74 +116,13 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **⚠ decisión: `border` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 3: `border`.
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 3: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `border-color`, `background`, `color`.
### 4.3 Avisos sobre los tokens propuestos (3)
### 4.2 Sin nombre mecánico (10)
- **el privado `--_year-grid-font-size` debe pasar a leer este público (o desaparecer)** — `--year-grid-font-size-md`, `--year-grid-font-size-xs`, `--year-grid-font-size-sm`, `--year-grid-font-size-lg`
- **el privado `--_year-grid-control-size` debe pasar a leer este público (o desaparecer)** — `--year-grid-prev-button-width-md`, `--year-grid-prev-button-width-xs`, `--year-grid-prev-button-width-sm`, `--year-grid-prev-button-width-lg`, `--year-grid-prev-button-height-md`, `--year-grid-prev-button-height-xs`, `--year-grid-prev-button-height-sm`, `--year-grid-prev-button-height-lg`
- **el privado `--_year-grid-cell-size` debe pasar a leer este público (o desaparecer)** — `--year-grid-cell-width-md`, `--year-grid-cell-width-xs`, `--year-grid-cell-width-sm`, `--year-grid-cell-width-lg`, `--year-grid-cell-height-md`, `--year-grid-cell-height-xs`, `--year-grid-cell-height-sm`, `--year-grid-cell-height-lg`
- **⚠ decisión: `100%` es un valor identidad o geometría de layout, no un knob de tema — el perímetro de «knob» es D-TH.2, sin firmar** — 3: `inline-size`.
- **⚠ decisión: el privado que alimenta este knob no se declara en el CSS (viene de `base.ts` o de un estilo inline) — hay que resolverlo antes de nombrarlo** — 7: `border-color`, `background`, `color`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
'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))'
<tr><tdclass="name">[data-grid-list][data-color]</td><td><spandata-uix-tagdata-kind="eidos">eidos</span></td><td>Accent palette for the checked selection checkbox + focus ring.</td></tr>
<tr><tdclass="name">[data-grid-list-row]</td><td><spandata-uix-tagdata-kind="soma">morfo</span></td><td>Row — flex layout, padding. Hover / highlighted / selected are painted by the SYSTEM state layer (archetype <code>item</code>), not here.</td></tr>
<tr><tdclass="name">[data-grid-list-cell]</td><td><spandata-uix-tagdata-kind="soma">morfo</span></td><td>Cell slot — first/last child get special flex treatment.</td></tr>
<tr><tdclass="name">[data-grid-list-selection-checkbox][data-state]</td><td><spandata-uix-tagdata-kind="eidos">eidos</span></td><td>0.875rem outlined box → filled accent + white ✓.</td></tr>