3 claves nuevas, 3 literales anotados y un token del contrato CABLEADO. El 28 %
que queda es el puente de paleta (`--_checkbox-palette-*`, THM-2): ocho filas
que no son deuda.
EL HALLAZGO: `indicator-fg` ERA UN HUÉRFANO QUE EL TEST DE HUÉRFANOS NO PUEDE
VER. La clave llevaba en el contrato desde siempre, pero la receta pintaba la
tinta de la casilla marcada leyendo `--color-content-on-solid` DIRECTAMENTE, sin
nombrarla nunca — y el test busca el NOMBRE en los ficheros del componente, así
que un token que nadie menciona pasa por vivo. Cableado
(`--_checkbox-palette-text: var(--checkbox-indicator-fg)`), computado idéntico, y
el propio guard lo confirmó marcando su adjudicación como STALE: ahora mueve. Es
la clase inversa del `--popover-bg` que vivía de un COMENTARIO.
Acuñado el estado INVALID, que gana a todas las variantes y leía el primitivo:
el borde y el DOBLE ANILLO DE FOCO (hueco + anillo), que era una sombra con dos
colores cableados. La geometría (2px/4px) se queda dentro de la declaración: es
la forma del anillo, no una perilla.
Tres literales pasan a excepción por identidad: el glifo llena su caja (`100 %`
× 2) y la etiqueta de grupo es su texto (`fit-content`).
Los 26 rojos del guard, medidos — y dos son trampas de ALCANCE del instrumento:
- El glifo SÓLO existe dentro de una casilla MARCADA, y la primera de la demo
está vacía: medir el trazo por talla sobre «el primer indicador del documento»
mide otro nodo. Con el path dentro de la misma casilla, los cinco pasos
alcanzan.
- La etiqueta de grupo lleva su PROPIO `[data-disabled]`: no lo hereda del
grupo, así que forzar el grupo no pinta nada.
El resto es lo esperable (invalid, disabled, los cuatro de transición que el
guard congela) y los ocho de TONO, que son la supersesión de la cascada de
paleta medida hoy en `button`: adjudicados con el patrón compartido.
Gates: sonda 0 diffs en 2.688 valores × 7 estados (13 nodos) · centinela 22/47
con todo lo demás adjudicado · censo 72 % · `component:audit` PASS · suite eidos
con el rojo conocido ajeno · `rtl:check` 0 · `docs:check` 0 · captura de marcada,
invalid, disabled, xl y tono affirm.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
| `--_checkbox-palette-text` | 3 | `var(--checkbox-indicator-fg)`, `var(--_checkbox-palette-solid)` | private, public | no |
Consumidos y **no declarados en el CSS** (vienen de `base.ts` o de un estilo inline del wrapper): `--_checkbox-group-columns`, `--_checkbox-palette-solid`, `--_checkbox-palette-solid-hover`.
@ -71,7 +68,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` (3)
### 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
@ -81,9 +78,7 @@ no distingue lo que debería — se marca `⚠`.
'no disabled item in the demo menu; forced data-disabled 2026-08-23 -> reaches (0.55 -> 0.137)'
},
checkbox:{
// Measured one by one 2026-08-23. Two scoping traps of the instrument: the
// glyph only exists inside a CHECKED box, and the group label carries its
// own [data-disabled] (it is not inherited from the group).
'size-xs-indicator-stroke':'the glyph exists only inside a CHECKED box and the first checkbox of the demo is empty; measured on a checked one with data-size forced -> reaches (2px -> 7px)',
'invalid-ring':'the invalid focus ring: needs [data-invalid] AND :focus-visible, which the guard blurs on purpose; focused by hand -> reaches (the 4px ring turns rgb(1,2,3))',
'invalid-ring-gap':'same double ring; forced -> reaches (the 2px gap turns rgb(4,5,6))',
'disabled-bg':'only under [data-disabled]; forced -> reaches',
'disabled-border':'only under [data-disabled]; forced -> reaches',
'disabled-opacity':'only under [data-disabled]; forced -> reaches (0.4 -> 0.137)',
'disabled-indicator-fg':'needs [data-disabled] AND a checked box (the glyph); forced on a checked one -> reaches',
'disabled-group-label-fg':'the label carries its OWN [data-disabled] - it is not inherited from the group, so forcing the group does nothing; set on the label -> reaches (oklch(0.5032 0 0) -> rgb(1,2,3))',
'transition-duration':'the guard freezes transitions and this token IS the transition; measured unfrozen -> reaches (0.12s -> 11.5s)',