Card es un primitivo con paleta, y su columna `private` no es deuda: es el
puente THM-2. Clasificados uno a uno sus ocho knobs fuera de alcance ANTES de
tocar una línea —que es la mitad del trabajo—:
- cuatro leen `--_card-palette-*` DIRECTO: el velo de hover de `ghost` y
`outline`, la descripción en `solid` y el filete del pie en `solid`;
- los otros cuatro leen el conmutador por VARIANTE (`--_card-bg`, 4 fuentes;
`--_card-fg`, 2) en la raíz, el título y el cuerpo, y sus ramas son ese
mismo puente.
Un público encima de cualquiera dejaría que un tema lo fijara y matara en
silencio el `color=` de cada instancia (CONTINUE-theming §3.pre). El techo de
card **no es el 100 %**, y forzar la cifra habría sido romper la jaula del
color.
Lo único que faltaba era **la costura**: la rama `outline` del conmutador leía
`var(--color-surface-default)` a pelo — el valor es del sistema, el knob es de
la card. Entra **`outline-bg`** con ese valor verbatim, y el centinela lo
confirma vivo. Ni `ghost` ni el borde transparente se acuñan: son identidad.
Censo: 37 knobs · 28 públicos · **78 %** (idéntico, y así queda escrito en la
ficha). Contrato 97 → **98** claves. Global del catálogo sin bajar (68 %).
Diff de computed: **VACÍO**. 1.216 valores en 7 estados (sonda estándar, 6
nodos = la card y sus cinco ranuras) más 2.484 valores en 18 celdas de
variante / tono / rounded / selected / disabled / lift, con `transition` y
`animation` congeladas — porque el escenario monta UNA card `soft` y la sonda
no barre variantes. Capturas 2× antes y después, miradas.
Centinela R-5.4: **49/98, 49 adjudicadas**, verde. 40 por PATRÓN (la cascada
de paleta, medida aquí: con `data-color=primary` `--card-primary-track` no
mueve nada, `--palette-track` sobre el mismo nodo repinta, y sin `data-color`
`--card-neutral-track` vuelve a pintar) y 9 forzadas sobre el nodo real. Dos
merecen leerse:
- **el trío `emerge-*` no pinta en la demo, y no es culpa de la demo**: el
montaje CEDE al sistema de motion (`:not([data-animation-style])`) y el
escenario arranca con el preset `select-pop`. Quitado el atributo, los tres
alcanzan — y `emerge-distance` tiene ADEMÁS una segunda causa: alimenta
`--motion-distance-md` y la animación acaba en `translate 0` con
`fill-mode: both`, así que `transform` en reposo no puede enseñarlo nunca
(se mide leyendo el hook, 8px → 1234px);
- **`hover-lift` y `press-scale` mueven `transform`, que el guard no
fotografía** — mismo hueco que `rating-group.item-hover-offset` (§13).
Hallazgo de composición, MEDIDO y no forzado: dentro de un `CardGroup` el eje
`radius` de la card está muerto — `[data-card-group] [data-card]` es (0,2,0)
contra la (0,1,0) de la receta, así que manda `--card-group-card-radius`
(`--card-radius-md: 1234px` no mueve nada; el del grupo mueve las dos cards).
Es la anidación concéntrica de §30, deliberada y documentada en
`card-group.css`; se registra porque significa que el token de la card no
tiene efecto en ese contexto.
Guards: censo `--only card` 78 % · `component-audit --only card` PASS ·
`eidos-lint card` 0 invalid · `vitest run src/uix/eidos` sin rojos nuevos (el
conocido `skin-media-player` en `lint.test.ts`) · `rtl:check` 0 ·
`docs:check` 0 · `check` sin errores en ningún fichero tocado · prettier sin
desviaciones NUEVAS sobre el árbol indexado.
Anotado, fuera del eje: la raíz declara `background:` en ATAJO, lo que fija
`background-image: none` y cancela el velo del sistema — card es uno de los 45
componentes de la incidencia §12 de next-features. Arreglarlo mueve píxel.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
// The three emerge keys share ONE cause, and it is not the demo being shy:
// the mount rule is `:not([data-animation-style])` on purpose (the motion
// system owns the single `animation` property when the card opts in), and
// the stage boots with motion=select-pop.
'emerge-duration':
'the mount rule yields to the motion system — [data-card]:not([data-animation-style]) — and the stage boots with data-animation-style=select-pop, so no node runs the emerge. Removed the attribute on the real card -> reaches (animation-duration 0.32s -> 11.5s on both keyframes)',
'same yield, PLUS a second cause the other two do not have: it feeds the channel hook --motion-distance-md, and the mount ends on translate 0 with fill-mode both, so `transform` at rest can never show it. Read the hook itself on the real card -> reaches (8px -> 1234px)',
// The guard does not snapshot `transform` (same instrument gap as
'the guard does not snapshot `transform`; hovered the real card and read it -> reaches (matrix(1, 0, 0, 1, 0, -2) -> matrix(1, 0, 0, 1, 0, 1234)). Instrument gap, registered in next-features §13',
'press-scale':
'same `transform` gap AND :active, which no script can force; read the live rule instead — [data-card][data-interactive]:active…:not(:has(button:active, …)) { transform: scale(var(--card-press-scale)) } is in the sheet and consumes the token by name',
'press-duration':
'same :active rule, which also sets transition-duration: var(--card-press-duration); read in the live sheet next to press-scale',
'disabled-opacity':
'the card dims through `filter: opacity()` (not `opacity` — its own mount animation would outrank a plain one, the comment in card.css records the measurement), and the demo boots enabled; forced data-disabled on the real card -> reaches (filter opacity(0.4) -> opacity(0.123))'
' — the six tones toggle forwards x eight slots, 48 of its 126 keys (it excludes fulfill/loss by doctrine: a toggle is neither completion nor irreversible loss). Measured 2026-08-23 on the real pressed toggle with transitions frozen: with data-color=primary, --toggle-primary-solid moves NOTHING (the fill stays oklch(0.5556 0.1829 305.86)) while --palette-solid on the same node repaints it (rgb(1, 2, 3)); strip data-color and --toggle-neutral-solid paints again (oklch(0.6434 0 0) -> rgb(1, 2, 3)). The neutral eight fall with the rest for a second reason worth writing down: the guard STAMPS data-color=neutral to test them, which is exactly what turns the generic block on'
' — the eight tones x five slots, 40 of its 98 keys. Measured 2026-08-23 on the real stage card with transitions frozen: with data-color=primary, --card-primary-track moves NOTHING (the surface stays oklch(0.9932 0.0034 325.6)) while --palette-track on the same node repaints it (rgb(1, 2, 3)); strip data-color and --card-neutral-track paints again (oklch(0.9911 0 0) -> rgb(1, 2, 3)). The wrapper stamps data-color on every instance, so the named fallback never applies'