10 claves en el bloque `drag-drop` de `recipes/base.ts` (fusionadas con
`preview-z`, que ya estaba, y los dos forwards de paleta). Censo 0 % → 89 %,
cero globales.
**Siete de sus dieciséis knobs YA eran sistema** y no entran al ratio (las
opacidades de fantasma y deshabilitado, los dos anillos de foco y el anillo
`inset` de los droppables), así que los puntuables eran nueve — seis de ellos
en el PREVIEW, el fantasma que sigue al puntero.
1. Los dos forwards de paleta siguen privados (THM-2): el fondo del
`[data-dragover]` los lee a pelo y no admite un público sin duplicar la
regla — es el 11 % que falta. En cambio el `border` y el `box-shadow` del
preview los COMBINAN con una anchura y una sombra que sí son knobs propios,
así que esas dos declaraciones entran al alcance.
2. El `--ring-inset-*` de los droppables no se toca: es vocabulario del anillo
del SISTEMA y la receta se limita a alimentarlo con su acento. Acuñar un
`droppable-ring-*` sería vocabulario paralelo sobre un transversal.
3. El `padding` del preview es un shorthand de dos valores → dos knobs lógicos.
Artefactos y gates:
- Sonda antes/después = 0 diffs en 1.827 valores × 7 estados. Determinismo
verificado.
- R-5.4: 0/10 en vivo, y los DIEZ adjudicados con su medición. No es un
instrumento roto ni tokens muertos: el preview se crea sólo mientras hay un
arrastre en curso (0 nodos en reposo, contados), y forzando el nodo los diez
mueven su propiedad — padding 8→1234px, radio 6→1236px, borde 1→9px, fondo,
tinta, familia, tamaño 14→99px, sombra y z 100→4321.
- censo --only 89 % · 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 (10 claves, en vivo).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- **⚠ 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: `background`, `box-shadow`.
- **⚠ decisión: `padding` es shorthand o eje físico — hay que partirlo en ejes lógicos antes de nombrarlo (recipe-contract §1, R-4.4)** — 1: `padding`.
- **⚠ 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`.
- **⚠ 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** — 1: `background`.
### 4.4 Lo que hay que comprobar a mano (PLAN-theming §1.3 · §7.4)
@ -91,6 +75,27 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-21** (sonda ×2 = 0 diffs en 1.827 valores · 7 estados). Es un
componente pequeño con una anatomía clara: **de sus 16 knobs, SIETE ya son
sistema** (opacidades de fantasma y deshabilitado, anillos de foco, el anillo
`inset` de los droppables) y quedan nueve puntuables, seis de ellos en el
PREVIEW.
1. **Casi todo lo tokenizable vive en `[data-drag-drop-preview]`**, el fantasma
que sigue al puntero. Existe SÓLO durante el arrastre, así que ni la sonda
ni el guard lo ven en reposo: se verifica forzando el nodo.
2. **Los dos forwards de paleta se quedan privados** (THM-2). El fondo del
`[data-dragover]` los lee a pelo y no admite un público sin duplicar la
regla; el `border` y el `box-shadow` del preview los combinan con una
anchura y una sombra que SÍ son knobs, así que esas dos declaraciones pasan
a alcance con `preview-border-width` y `preview-shadow`.
3. **El `--ring-inset-*` de los droppables no se toca**: es el vocabulario del
anillo del sistema, que la receta ALIMENTA con su acento
(`--ring-inset-color: var(--_drag-drop-palette-element)`). Acuñar un
`droppable-ring-*` sería vocabulario paralelo sobre un sistema transversal.
4. **`preview-z` ya existía** en el contrato — es el único público que este
componente tenía, y se conserva tal cual.
5. El `padding` del preview es un shorthand de dos valores → dos knobs
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (8 → 1234px)',
'preview-padding-inline':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (12 → 1235px)',
'preview-radius':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (6 → 1236px)',
'preview-border-width':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (1 → 9px)',
'preview-bg':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (rgb(1,2,3))',
'preview-fg':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (rgb(4,5,6))',
'preview-font-family':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (Zapfino)',
'preview-font-size':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (14 → 99px)',
'preview-shadow':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (0 0 0 7px rgb(7,8,9))',
'preview-z':
'the drag PREVIEW is created only while a drag is in flight (0 nodes at rest, counted); forced → reaches (100 → 4321)'
},
'link-preview':{
'trigger-fg':
'the panel opens on HOVER, so measuring it REQUIRES the pointer on the trigger — and hover is exactly the state whose rule overrides the resting ink. Structural, not a demo gap: the hover token (`hover-trigger-fg`) reads live in the same run',