From ed2e3cd7ca994a74819c4441229097b2b288821b Mon Sep 17 00:00:00 2001 From: dev Date: Sat, 22 Aug 2026 01:33:54 +0200 Subject: [PATCH] =?UTF-8?q?uix(theming):=20cinco=200=20%=20que=20NO=20son?= =?UTF-8?q?=20deuda=20=E2=80=94=20veredictos,=20no=20tokens=20inventados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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 --- docs/audit/theming/aspect-ratio.md | 16 +++++++++++++++- docs/audit/theming/cascade.md | 12 +++++++++++- docs/audit/theming/date-picker.md | 24 +++++++++++++++++++++++- docs/audit/theming/motion.md | 12 +++++++++++- docs/audit/theming/text-blur.md | 11 ++++++++++- docs/next-features.md | 21 +++++++++++++++++++++ 6 files changed, 91 insertions(+), 5 deletions(-) diff --git a/docs/audit/theming/aspect-ratio.md b/docs/audit/theming/aspect-ratio.md index ebe6bf06c..5fdcc0abe 100644 --- a/docs/audit/theming/aspect-ratio.md +++ b/docs/audit/theming/aspect-ratio.md @@ -71,6 +71,20 @@ no distingue lo que debería — se marca `⚠`. -_(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. diff --git a/docs/audit/theming/cascade.md b/docs/audit/theming/cascade.md index 89749cc68..301396295 100644 --- a/docs/audit/theming/cascade.md +++ b/docs/audit/theming/cascade.md @@ -65,6 +65,16 @@ no distingue lo que debería — se marca `⚠`. -_(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.** diff --git a/docs/audit/theming/date-picker.md b/docs/audit/theming/date-picker.md index a1b0212d7..1950d771d 100644 --- a/docs/audit/theming/date-picker.md +++ b/docs/audit/theming/date-picker.md @@ -65,6 +65,28 @@ no distingue lo que debería — se marca `⚠`. -_(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. diff --git a/docs/audit/theming/motion.md b/docs/audit/theming/motion.md index 9904b8a94..f6989ae3e 100644 --- a/docs/audit/theming/motion.md +++ b/docs/audit/theming/motion.md @@ -65,6 +65,16 @@ no distingue lo que debería — se marca `⚠`. -_(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.** diff --git a/docs/audit/theming/text-blur.md b/docs/audit/theming/text-blur.md index 26b5dfde9..53a4772d5 100644 --- a/docs/audit/theming/text-blur.md +++ b/docs/audit/theming/text-blur.md @@ -67,6 +67,15 @@ no distingue lo que debería — se marca `⚠`. -_(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.** diff --git a/docs/next-features.md b/docs/next-features.md index 14d1582df..f8c22e71a 100644 --- a/docs/next-features.md +++ b/docs/next-features.md @@ -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`