You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/audit/theming/grid-list.md

156 lines
9.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# grid-list — alcance de tema: análisis y propuesta
> Generado por `node --import tsx/esm scripts/theming-census.ts --report`.
> Lo **medido** y la **propuesta** se regeneran; el **Veredicto** (§5) se conserva.
> Vista de conjunto: [README](./README.md) · método y protocolo:
> [`PLAN-theming.md`](../../process/PLAN-theming.md) §1, §2, §7.
- **Medido**: 2026-08-24 · **Alcance**: **85%** — 22 de 26 knobs por token público
- **Knobs de apariencia**: 31 — público 22 · privado 2 · global 1 · literal 1 · sistema 5 · excepción 0 _(los dos últimos, fuera del ratio)_
- **Contrato hoy** (`lib/recipes/base.ts`): 38 pública(s) — `row-height-xs`, `row-height-sm`, `row-height-md`, `row-height-lg`, `row-height-xl`, `row-padding-inline-xs`, `row-padding-inline-sm`, `row-padding-inline-md`, `row-padding-inline-lg`, `row-padding-inline-xl`, `font-size-xs`, `font-size-sm`, `font-size-md`, `font-size-lg`, `font-size-xl`, `row-height`, `row-padding-inline`, `font-size`, `gap`, `padding`, `border-width`, `border`, `radius`, `bg`, `fg`, `font-family`, `line-height`, `max-block`, `invalid-border`, `row-gap`, `row-padding-block`, `row-radius`, `row-fg`, `disabled-row-fg`, `selection-checkbox-size`, `selection-checkbox-border`, `selection-checkbox-radius`, `checked-selection-checkbox-fg` · 1 privada(s) forward — `_palette-solid`
- **Eje `size`**: no · **ficheros**: `grid-list.css`
## 1. Knobs fuera de alcance
### 1.1 Directo a primitivo global (1)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `grid-list.css:105` | `[data-grid-list-row]:hover:not([data-disabled]), [data-grid-list-row][data-highlighted]:not([data-disabled])` | `background` | `var(--color-surface-overlay)` |
### 1.2 A través de un privado (2)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `grid-list.css:171` | `[data-grid-list-selection-checkbox][data-state='checked']` | `border-color` | `var(--_grid-list-palette-solid)` |
| 2 | `grid-list.css:172` | `[data-grid-list-selection-checkbox][data-state='checked']` | `background` | `var(--_grid-list-palette-solid)` |
### 1.3 Literales (1)
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `grid-list.css:46` | `[data-grid-list][data-block]` | `inline-size` | `100%` |
### 1.4 Excepciones firmadas (0) — fuera del ratio
Literales que llevan su anotación `/* literal: <razón> */` en la propia
declaración: la válvula de recipe-contract §3, la misma que honra
`component-audit`. **Una desviación firmada no es deuda** — se listan para que la
razón se lea, no para acuñarlas.
_Ninguno._
## 2. Sistema transversal (5) — informativo, fuera del ratio
Un tema los alcanza **a nivel de sistema**, por diseño (recipe-contract §2).
| # | fichero:línea | selector | propiedad | valor |
| ---: | --- | --- | --- | --- |
| 1 | `grid-list.css:66` | `[data-grid-list][data-disabled]` | `opacity` | `var(--opacity-disabled)` |
| 2 | `grid-list.css:76` | `[data-grid-list]:focus-visible, [data-grid-list][data-focused]` | `outline` | `var(--focus-ring-width) solid var(--focus-ring-color)` |
| 3 | `grid-list.css:119` | `[data-grid-list-row][data-disabled]` | `opacity` | `var(--opacity-disabled)` |
| 4 | `grid-list.css:123` | `[data-grid-list-row]:focus-visible` | `outline` | `var(--focus-ring-width) solid var(--focus-ring-color)` |
| 5 | `grid-list.css:191` | `[data-grid-list-selection-checkbox]:focus-visible` | `outline` | `var(--focus-ring-width) solid var(--focus-ring-color)` |
## 3. Privados de la receta — ¿de dónde sale su valor?
_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-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).
### 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
al final) y theming §6.7 (slots de color, modificador delante). Un token con
DOS valores distintos es una colisión de nombre: son dos knobs, o el nombre
no distingue lo que debería — se marca `⚠`.
| token (`--grid-list-…`) | scope TSC | valor propuesto | usos |
| --- | --- | --- | ---: |
| `hover-row-bg` | `root` | `var(--color-surface-overlay)` | 1 |
### 4.2 Sin nombre mecánico (3)
- **⚠ 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** — 2: `border-color`, `background`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
- [ ] **Privado que no deriva de un público** — §3 lo marca; el privado debe leer el público o desaparecer.
- [ ] **Velo o acento en el nodo equivocado** (`archetype: 'item'` en un envoltorio, un `background` en shorthand que mata la capa de estado) — se mide desde el píxel hacia arriba.
- [ ] **Doble animación** al mover un sello a una superficie con animación propia — registro de `animationstart`/`animationend`.
- [ ] **Diff de computed = 0** en reposo · hover · abierto · disabled · foco, por talla, antes y después.
- [ ] **Centinela por token nuevo**: valor imposible en el root → el nodo lo sigue. Si no, el token miente.
## 5. Veredicto
<!-- veredicto:start -->
**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
(rama `[aria-selected='true']`, 0,4,0) — seleccionada ≡ hovered
visualmente. El checkbox SÍ pinta (`_palette-solid` vivo, medido
`oklch(0.5556 0.1829 305.86)` en checked). Decisión del autor: retirar la
regla muerta + el forward huérfano (0 diffs lo prueba; precedente
`table.selected-row-fg`), o dejarla verbatim a la espera de la reparación
firmada (re-apuntar a `[data-state='selected']` mueve píxel).
3. **El hover de la fila pinta DOBLE** — plano de la receta (`background:`
shorthand, 0,3,0 → background-color overlay) + velo del sistema (la regla
de item va a especificidad PLENA a propósito, 0,5,0 → background-image,
gana al `none` del shorthand). Es el caso `listbox.highlighted`: **NO se
acuña `hover-row-bg`** — bendeciría un duplicado condenado. La declaración
queda verbatim (global, excepción de censo). A diferencia de
table/tree-grid (velo en la CELDA, plano en la FILA — nodos distintos),
aquí ambos caen en el MISMO nodo.
4. **Fila Y celda llevan `archetype: 'item'`** — bajo el puntero se apilan
velo de celda + velo de fila (+ plano), medido en la sonda. Mismo par de
portadores que la firma pendiente de table — anotado §12.
5. **Los per-talla van al bundle, no verbatim al primitivo**: `row-height`
1:1 (`--size-{k}-control-height` ES alias de `--control-height-{k}`,
verificado en `generated/base.css:409-445`); `font-size` un paso por
debajo desde md (xs→xs, sm→sm, md→sm, lg→md, xl→lg) — deviación verbatim
como table/tree-grid, NO «corregirla» al 1:1; `row-padding-inline` ritmo
propio en `--space-*` (2/2/3/4/5). Resolved names **sin `parts`** — el
`data-size` se estampa en el provider (= host); molde `command`.
6. **Correcciones de nombre sobre la §4.1**:
`selection-checkbox-width`+`-height` son UN knob → un solo token
`selection-checkbox-size`; `on-selection-checkbox-bg` →
`checked-selection-checkbox-fg` (es la TINTA del glifo ✓; `on-` choca con
el prefijo reservado — precedente `scrim-fg-over-*`); el `padding`
uniforme se queda `padding` (slot admitido: `command.viewport-padding`,
consumido shorthand en `command.css:188`); `border` se parte en
`border-width` + `border` (color), y el checkbox comparte `border-width`
(molde tree-grid: UNA anchura por componente) con su propio
`selection-checkbox-border`; `max-block: min(60vh, 22rem)` entra al
contrato (molde `command.viewport-max-block`) aunque `max-block-size` no
puntúe en el censo.
7. **Privados que mueren**: `--_grid-list-{row-height,row-padding-inline,font-size}`
(los sustituyen los resolved names; fuera los bloques `[data-size]` del
CSS), `--_grid-list-max-height` y `--_grid-list-checkbox-size` (pasan a
público). Quedan los dos forwards THM-2.
8. **Alcance esperado ≈ 81 %** (22/27): fuera el hover condenado (1 global),
el selected muerto (1 privado — 85 % si se retira), los dos lados checked
del checkbox (forwards, privados en todo el catálogo) y el `100%` de
`[data-block]` (identidad, D-TH.2). Los `transparent` de variant son
identidad de variante y no puntúan.
<!-- veredicto:end -->

Powered by TurnKey Linux.