10 claves (44 → 54). Censo drawer 57 % → **72 %**; global del eje 61 %.
Mismo cromo que el disparador de `popover` y con la misma corrección:
`min-block-size` lee el BUNDLE de talla (`--size-md-control-height`) y no el
primitivo crudo que el CSS traía. Aquí no hay estado abierto que teñir, así que
el hover lleva una sola clave.
LO QUE QUEDA FUERA ES LA FIRMA DE SALIDA, y no se cose aquí: los cuatro
`border-{side}: var(--border-width-thick) solid transparent` son la base que las
reglas de `data-last-action` tiñen al cerrar. La misma matriz vive en `popover` y
`dialog`, ya ha derivado entre las tres, y es mapeo transversal según la tabla
morfo→eidos → §13.
Los ocho privados son canales de valor (los `*-override` que el wrapper escribe
desde sus props, y el par `panel-width/height` de la variante persistente) y los
cinco literales, identidad.
UNA ADJUDICACIÓN, MEDIDA, Y DE UNA CLASE NUEVA DEL INSTRUMENTO: el guard ABRE el
cajón antes de probar, y entonces el velo tapa el disparador — la pasada de hover
no puede posarse en él (Playwright se niega a hacer hover sobre un nodo que no
recibe puntero). Con el cajón cerrado y hover a mano, `hover-trigger-bg` alcanza
(oklch(0.931 0 0) → rgb(1,2,3)).
Lo rojo que queda son **24 tokens anteriores** a este commit —el asa de arrastre,
el anillo de arrastre, los anchos y altos por talla, los gaps de cabecera y pie—,
todos de partes o estados que la demo no monta. Este commit no los empeora.
Gates: sonda antes/después **0 diffs en 390 valores** (8 estados) · censo --only
72 % · `--names` sin desviadas · component-audit PASS · eidos-lint 0 invalid ·
suite eidos con el único rojo conocido · rtl:check 0 · docs:check 0 · captura del
escenario mirada (disparador con su cromo intacto).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ -86,7 +77,7 @@ Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inl
- **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` (8)
### 4.1 Tokens a declarar en `lib/recipes/base.ts` (0)
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
@ -96,18 +87,9 @@ no distingue lo que debería — se marca `⚠`.
- **⚠ 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)** — 1: `border`.
### 4.2 Sin nombre mecánico (17)
- **⚠ decisión: `1` 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: `opacity`.
- **⚠ 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: `min-inline-size`, `min-block-size`.
- **⚠ decisión: `border-left` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `border-left`.
@ -130,6 +112,35 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**EJECUTADO 2026-08-22 — 57 % → 72 %**, 10 claves: el DISPARADOR, el mismo
cromo que el de `popover` y con la misma corrección —`min-block-size` lee el
BUNDLE de talla (`--size-md-control-height`) y no el primitivo crudo que el CSS
traía—. Aquí no hay estado abierto que teñir, así que el hover lleva una sola
clave.
**Lo que queda fuera es la FIRMA DE SALIDA y no se cose aquí**: los cuatro
`border-{side}: var(--border-width-thick) solid transparent` son la base que
las reglas de `data-last-action` tiñen al cerrar. La misma matriz vive en
`popover` y `dialog`, ya ha derivado entre las tres, y es mapeo transversal
según la tabla morfo→eidos → next-features §13.
Los ocho privados son canales de valor: los `*-override` que el wrapper
escribe desde sus props y el par `panel-width/height` de la variante
persistente. Los cinco literales son identidad (cuatro `100%` del panel
persistente y el `opacity: 1` que devuelve el velo a opaco en la variante
overlay).
**Una adjudicación, medida, y de una clase nueva del instrumento**: el guard
ABRE el cajón antes de probar, y entonces el velo tapa el disparador — la
pasada de hover no puede posarse en él (Playwright se niega a hacer hover sobre
un nodo que no recibe puntero). Con el cajón cerrado y hover a mano,
'no disabled row in the demo (0 mounted, counted); forced data-disabled → reaches (oklch(0.61 0 0) → rgb(1,2,3))'
},
drawer:{
// The guard OPENS the drawer before testing, and the overlay then covers the
// trigger: the hover pass cannot reach it (Playwright refuses to hover a
// node that does not receive the pointer). Hovered by hand with the drawer
// closed 2026-08-22 -> reaches.
'hover-trigger-bg':'the open drawer overlay covers the trigger, so the hover pass cannot land on it; hovered by hand with the drawer closed -> reaches (oklch(0.931 0 0) -> rgb(1,2,3))'
},
aura:{
// The six state tints and the halo paint the INDICATOR background, and the
// demo runs with the WebGL canvas mounted — the rule