uix(theming): cinco 0 % que NO son deuda — veredictos, no tokens inventados

`aspect-ratio`, `text-blur`, `cascade`, `motion` y `date-picker` figuran en el
censo con alcance 0 % y sin entrada de contrato. Medidos uno a uno: **ninguno
tiene contrato que escribir**. Este commit escribe sus cinco veredictos §5 en
vez de fabricarles tokens.

- **`aspect-ratio`** no es un componente con cromo: es una FACETA de `Box`
  (`[data-box][data-aspect-ratio]`). Su único knob global está **prestado de
  `box`** — la propia ficha lo marca ⤴ — y un token prestado trae la semántica
  de su dueño: acuñar `--aspect-ratio-width` sería un segundo nombre para el
  mismo eje. `--aspect-ratio` es canal de valor por instancia (16/9, 1…), no
  tema; los `100%` y el `object-fit` del hijo son identidad de layout.
- **`text-blur`**: sus dos knobs son el `1px` de la técnica sr-only, la receta
  de accesibilidad que permite al lector de pantalla leer el texto entero
  mientras la versión animada se parte en segmentos. Moverlos rompe la técnica.
- **`cascade`** y **`motion`**: su knob es el `opacity` del gate antiparpadeo
  (`[data-reveal-pending]` / `[data-animation-pending]`), mecánica del canal de
  motion. Un tema no puede querer que ese `0` sea otra cosa sin romper el
  propósito del gate; lo tematizable de motion (duraciones, easings, presets,
  escalonado) vive en `EidosConfig.motion`.
- **`date-picker`**: su propia cabecera lo dice — «This recipe must NOT
  re-declare any of those… it owns ONLY the popover / calendar layout». Es un
  DateField compuesto cuyo cromo entero viene de `field.css` / `date-field.css`.
  Sus dos knobs son la corrección `max-content` que impide que el pie del
  popover (Clear / Cancel / Save) desborde: un único valor correcto, no una
  preferencia.

REGISTRADO EN next-features §13: **el censo no distingue «0 % por deuda» de
«0 % por naturaleza»**, y ya son cinco. Mientras los cuente igual que a un
componente con deuda real, la cifra global miente por abajo y el gate de F3
(«censo 100 %») es inalcanzable por construcción. Hace falta una clase más
—`structural`, junto a `system`— o una marca en la ficha que los saque del
denominador, como `LAYER_VOCABULARY` hizo con la familia calendar. Es la misma
pregunta ya abierta para las capas compartidas, un piso más abajo.

Sin cambios de código: cinco fichas y el registro. `docs:check` 0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 471ba96d25
commit ed2e3cd7ca

@ -71,6 +71,20 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-22. Su 0 % es DEFINITIVO, no deuda.** `aspect-ratio` no es un
componente con cromo: es una FACETA de `Box` — sus selectores rezan
`[data-box][data-aspect-ratio]`.
1. Su único knob global es `var(--box-width, 100%)`, y la propia ficha lo marca
como **prestado de `box`** (⤴). Un token prestado trae la semántica de su
dueño: la anchura de una caja la posee `box`, y acuñar
`--aspect-ratio-width` sería un segundo nombre para el mismo eje.
2. `--aspect-ratio` es CANAL DE VALOR por instancia: lo escribe el consumidor
con la proporción que quiere (16/9, 1…), no un tema.
3. Los dos `100%` y el `object-fit: cover` del hijo son identidad de layout: lo
que hace que el contenido llene la caja sin romper la proporción.
**No hay contrato que escribir.** Inventarle tokens sería fabricar deuda donde
no la hay.
<!-- veredicto:end -->

@ -65,6 +65,16 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-22. Su 0 % es DEFINITIVO, no deuda.** Su único knob es el
`opacity` del gate de revelado: `0` mientras el elemento espera su turno de
entrada (bajo `@media (scripting: enabled)`) y `1` cuando
`prefers-reduced-motion` desactiva el escalonado.
Es **mecánica del canal de motion** —el antiparpadeo que evita que el contenido
se vea antes de animarse—, no una superficie de tema: un tema no puede querer
que ese `0` sea otra cosa sin romper el propósito del gate. Lo tematizable de
una cascada (duración, escalonado, easing) vive en `EidosConfig.motion`.
**No hay contrato que escribir.**
<!-- veredicto:end -->

@ -65,6 +65,28 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-22. Su 0 % es DEFINITIVO, no deuda — y su propia cabecera lo
dice**: «This recipe must NOT re-declare any of those… it owns ONLY the popover
/ calendar layout».
`DatePicker` es un `DateField` compuesto que además ancla el popover del
calendario. Su raíz lleva `data-field` + `data-date-field`, así que **todo su
cromo de campo** —la pila etiqueta/control/ayuda, los tokens de control por
talla, variante, invalid, disabled y el gap de segmentos— viene de `field.css`
y `date-field.css`. Re-declararlo sería aliasear la base de Field.
Sus dos knobs contados son `inline-size: max-content` y
`min-inline-size: max-content` sobre el popover que hospeda el calendario, y su
comentario explica por qué: el panel debe **crecer hasta su contenido** para que
la fila del pie (Clear / Cancel / Save + huecos) no desborde y saque una barra
horizontal. Es una CORRECCIÓN DE COMPOSICIÓN con un solo valor correcto —
`max-content` —, no una preferencia: cualquier otro valor reintroduce el
desbordamiento que la regla existe para evitar. Lo mismo vale para los resets
del calendario embebido (padding, borde, fondo y sombra a cero), que apagan el
cromo duplicado del panel que ya lo envuelve.
**No hay contrato que escribir.** Lo tematizable de esta pantalla vive en
`field`, en `calendar` (vía la capa `calendar-surface`) y en `picker-shell`,
los tres ya con contrato.
<!-- veredicto:end -->

@ -65,6 +65,16 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-22. Su 0 % es DEFINITIVO, no deuda.** Igual que `cascade`: su
único knob es el `opacity` del gate `[data-animation-pending]`, el antiparpadeo
que evita ver el contenido antes de que su animación arranque, con su rama de
`prefers-reduced-motion`.
Es **mecánica del canal**, no superficie de tema. Lo tematizable de motion —
duraciones, easings, presets, escalonado— vive en `EidosConfig.motion` y se
alcanza por ahí; `--motion-stagger-each` es precisamente eso, un gancho del
canal.
**No hay contrato que escribir.**
<!-- veredicto:end -->

@ -67,6 +67,15 @@ no distingue lo que debería — se marca `⚠`.
<!-- veredicto:start -->
_(pendiente — lo escribe el autor; se conserva al regenerar)_
**Medido 2026-08-22. Su 0 % es DEFINITIVO, no deuda.** Sus dos únicos knobs son
el `width: 1px` y el `height: 1px` de `[data-text-blur-sr]` — la técnica
**sr-only** canónica, que existe para que un lector de pantalla lea el texto
completo mientras la versión animada se parte en segmentos.
Esos dos números no son estética: son la receta de accesibilidad, idéntica en
todo el catálogo, y moverlos rompería la técnica. El resto del componente
(`will-change`, `display`) es mecánica de la animación, no apariencia.
**No hay contrato que escribir.**
<!-- veredicto:end -->

@ -686,6 +686,27 @@ Lo que `textarea` añadió (2026-08-21):
adjudicados por eso. Misma clase que `date-range-picker` con
`kind='month'|'year'` (norma N-6).
Lo que la cola pequeña añadió (2026-08-22):
- **⚠ El censo no distingue «0 % por deuda» de «0 % POR NATURALEZA», y ya son
cinco componentes.** Medidos uno a uno el 2026-08-22, `aspect-ratio`,
`text-blur`, `cascade`, `motion` y `date-picker` tienen alcance 0 % y
**ninguno tiene contrato que escribir**: el knob de `aspect-ratio` está
PRESTADO de `box` (la ficha ya lo marca ⤴) porque es una faceta suya, no un
componente; los de `text-blur` son el `1px` de la técnica sr-only; los de
`cascade` y `motion` son el `opacity` del gate antiparpadeo, mecánica del
canal de motion cuyo valor tematizable vive en `EidosConfig.motion`; y los de
`date-picker` son la corrección `max-content` que impide que el pie del
popover desborde, con un único valor correcto. Sus veredictos §5 quedan
escritos.
Mientras el censo los cuente igual que a un componente con deuda real, la
cifra global miente por abajo y el gate de F3 («censo 100 %») es inalcanzable
por construcción. Lo que hace falta es una clase más —`structural`, junto a
`system`— o una marca en la ficha que los saque del denominador, como
`LAYER_VOCABULARY` hizo con la familia calendar. Es la misma pregunta que ya
está abierta para las capas compartidas, un piso más abajo.
Lo que `picker-shell` añadió (2026-08-21):
- **⚠ `picker-shell` no tiene ruta de demo propia** (`/uix/components/picker-shell`

Loading…
Cancel
Save

Powered by TurnKey Linux.