Una sola clave, y es la COSTURA (PLAN §2-A): el `gap` del encabezado leía
`var(--space-2)` A PELO. El valor es del sistema; el knob no era de nadie, así
que un tema no podía apretar esta cabecera sin mover el paso de espaciado en
toda la app. El nombre lo decide el CATÁLOGO, no la propuesta de la ficha:
`trigger-gap` ya existe ocho veces en `base.ts`, cinco de ellas con exactamente
`var(--space-2)`.
Qué entra:
- `--collapsible-trigger-gap: var(--space-2)` — valor verbatim, cero píxel.
Qué NO entra, y por qué:
- Los dos knobs restantes son SISTEMA TRANSVERSAL, fuera del ratio: el velo de
hover es `linear-gradient(var(--state-hover), var(--state-hover))` (la capa de
`archetypes.css`, nunca una invención por componente) y el anillo de foco es
`--focus-ring-*`.
- **No hay clave de motion que acuñar.** Este componente «anima su apertura» y
aun así su receta no declara un solo `@keyframes`: la firma es el par de
eventos `emerge-expand` / `emerge-collapse` que materializa
`EidosConfig.motion.signatures` (recipe-contract §2, R-4.5). Lo único suyo es
el par `transition-*`, que ya estaba en el contrato.
Censo: 12 knobs · público 9 → 10 · global 1 → 0 · sistema 2 · 90 % → 100 %.
Contrato 11 → 12 claves. Global del catálogo 68 %, sin bajar.
Diff de computed: VACÍO — 736 valores en 8 estados (reposo, cinco tallas,
abierto y hover) sobre 3 nodos, que son las TRES partes del morfo, en cerrado y
en abierto. Capturas 2× antes/después, reposo y abierto: idénticas.
Centinela R-5.4: 10/12, dos adjudicadas, cero muertas sin razón.
- `transition-duration` / `transition-ease` SON la transición que el guard
congela para poder leer todo lo demás (la clase que `color-picker` documentó
el 2026-08-23). Medidas sin congelar sobre el encabezado real:
`0.18s, 0.18s → 4.321s, 4.321s` y `cubic-bezier(0.4, 0, 0.2, 1) ×2 →
steps(3) ×2` — dos entradas porque el trigger transiciona `background` Y
`color`. Al ledger con esa razón.
- `disabled-opacity` NO se adjudica: se ARREGLA. Encender el interruptor
`disabled` de la demo para toda la corrida se habría llevado el tinte de hover
por delante (`pointer-events: none` en el provider — «montar más mide menos»),
así que el estado se mide como SUPERFICIE EXTRA por la URL de la demo
(`?perm.disabled=true`), precedente `radio-group`. 8/11 → 10/12.
Guards: censo `--only` 100 % · `component-audit --only collapsible` PASS ·
`eidos-lint collapsible` 7 morfo-backed / 0 invalid · `vitest run src/uix/eidos`
35/36 ficheros (el rojo es `skin-media-player`, el conocido) · `rtl:check` 0 ·
`docs:check` 0 · `check` COMPLETED sin un solo error atribuible a este
componente · prettier: mi bloque limpio, la deriva del README y de la demo es
PREEXISTENTE en HEAD y no se toca.
Artefactos de documentación del protocolo: README con su `## Talla y tema`
derivada del contrato, pestaña `Tokens` en la demo (12 claves resueltas en vivo,
verificada en navegador) y veredicto §5 de la ficha.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>