18 claves en el bloque `spinner` de `recipes/base.ts` (fusionadas con los dos
forwards de paleta). Censo 0 % → 70 %, cero globales. Global 48 %, sin contrato
44 → 43.
**La §4 proponía 71 tokens para 23 knobs — la peor inflación que ha dado el
generador en todo el eje.** El spinner tiene UNA coordenada de talla
(`--spinner-size`) que gobierna el anillo, la pista de puntos y las barras, más
el trazo (`--spinner-thickness`). La propuesta multiplicaba esa única
coordenada por variante × parte × dimensión × talla y producía
`ring-track-width-xs`, `dots-track-gap-xs`, `dots-dot-width-xs`,
`bars-track-gap-xs`… todos con el mismo `0.75rem`, porque todos SON el tamaño
en xs. Un tema habría necesitado veinte claves para cambiar un número.
1. Las proporciones son CONSTRUCCIÓN, no knobs: `calc(size * 0.3)` es el punto,
`* 0.18` la barra, `* 0.2` y `* 0.12` los huecos. Definen la FORMA de cada
variante y se quedan en la receta — mismo reparto que los gradientes de las
guías de tree-grid o el damero de gradient-builder.
2. `fg` / `dots-dot-bg` / `bars-bar-bg` ⚠ no eran tres knobs con dos valores en
pugna: son UNA variable (`--_spinner-color`) leída en tres sitios, con el
conmutador `data-color='inherit'` que la cambia de forward de paleta a
`currentColor`. Se queda privada, igual que `--_spinner-track`, que además
envuelve su fuente en un color-mix distinto por rama (60 % / 25 %).
Aplanarlas exigiría duplicar cada regla por color.
3. La escala es PROPIA, no la del bundle de iconos: medido, 12/16/20/28/40 px
contra los 14/16/18/20/32 de `--icon-size-*`, y sólo coinciden en sm.
Verbatim con la desviación anotada — forzar el bundle habría movido el
default en cuatro tallas de cinco.
4. `duration` entra al contrato en vez de seguir en `0.9s` a pelo: el registro
ya tenía abierta la incoherencia de que el spinner de feed ganó tokens de
duración y el de media-player no (§13). Aquí se hace bien de entrada.
El 30 % que falta son los dos privados conmutadores, los dos
`border-radius: 50%` (identidad de forma) y los fotogramas de los @keyframes.
Artefactos y gates:
- Sonda antes/después = 0 diffs en 377 valores × 7 estados. Determinismo
verificado.
- R-5.4: 14/18. Los cuatro mudos, medidos uno a uno y adjudicados: la demo
monta SÓLO la variante ring y sin etiqueta (0 barras, 0 puntos, 0 labels,
contados), y `track-opacity` sólo se declara dentro de
`prefers-reduced-motion` — forzando variante, etiqueta y contexto reduce,
los cuatro alcanzan.
- censo --only 70 % · component:audit PASS · eidos-lint invalid 0, class-hooks
0 · suite eidos sin rojos nuevos (el conocido skin-media-player) · rtl:check
0 · docs:check 0 · check por fichero limpio.
- README con su «Talla y tema» y tab `Tokens` en la demo (18 claves, en vivo).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>