From 3c36c051c9089cc2233a12da70af487d5472a15a Mon Sep 17 00:00:00 2001 From: dev Date: Thu, 9 Jul 2026 00:42:54 +0200 Subject: [PATCH] =?UTF-8?q?docs(process):=20refresh=20audit-fix=20handoff?= =?UTF-8?q?=20=E2=80=94=20S6=20Field-family=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mark S6 done (16 fields compose field.css + 199 orphaned recipe tokens pruned + date/time pickers de-aliased onto the Field public tokens, commits 5eb92132.. d1670caa). Rewrite "lo que queda" to start at S8 calendar-surface; record the two non-blocking follow-ups (TimeRangePicker endpoint data-size threading task_d66356de, PickerProvider deferValue migration) and the S6 method lessons (run the recipe-css-contract vitest scope after CSS refactors; --field-segment- height only exists under [data-field][data-size]). Co-Authored-By: Claude Opus 4.8 --- docs/process/continue-audit-fixes-2026-07.md | 66 ++++++++++++++++++-- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/docs/process/continue-audit-fixes-2026-07.md b/docs/process/continue-audit-fixes-2026-07.md index 0df28ee1a..d86d628c2 100644 --- a/docs/process/continue-audit-fixes-2026-07.md +++ b/docs/process/continue-audit-fixes-2026-07.md @@ -1,6 +1,11 @@ # Continue — Auditoría de componentes + fase de fixes (P0–P7) -**Handoff. Fecha: 2026-07-08.** Rama `alpha-0.1-sec-dom`. +**Handoff. Fecha: 2026-07-08 · actualizado 2026-07-09.** Rama `alpha-0.1-sec-dom`. + +> **Arranca mañana aquí →** [§ P5 — lo que queda](#p5--lo-que-queda-arrancar-aquí-mañana). +> **S6 Field-family está COMPLETO y pusheado** (`53b6f629..d1670caa`). Lo siguiente +> es **S8 calendar-surface**, luego **P6** y **P7**. Dos follow-ups no bloqueantes +> registrados abajo. Documento de continuación para retomar la fase de fixes de la re-auditoría de componentes. La **fuente de verdad de los veredictos** es @@ -19,7 +24,7 @@ componentes. La **fuente de verdad de los veredictos** es | **P2** contratos morfo (role=application×4, aria-selected fuera del Day, drp translationRef, field data-state, pin-input commit-set, media-player renames) | ✅ | | **P3** packs sema (13 packs nuevos + 12 morfos `family-default`→`'pack'`) | ✅ | | **P4** naming/API N1–N10 | ✅ **COMPLETO** | -| **P5** sistema/eidos | 🟡 **EN CURSO** — S1 ✅ · S5 ✅ · depth ✅ · touch-rows ✅ · **S6, S8 pendientes** | +| **P5** sistema/eidos | 🟡 **EN CURSO** — S1 ✅ · S5 ✅ · depth ✅ · touch-rows ✅ · **S6 ✅** (composición + poda + de-alias, pusheado) · **S8 pendiente** | | **P6** C7 textarea-measure + D13 · C6 weekInfo · B.11 splitter | ⬜ pendiente | | **P7** S9 iniciativas · S4 28 READMEs · S7 papeleo · errores de tipo baseline | ⬜ pendiente | @@ -87,13 +92,62 @@ fila-label/Field. El código y los docs (§37 reference + changelog) están pues Material desacoplan área/visual; **nadie** hace split AA/AAA por talla (el análogo MUI se considera bug). → suelo único 44 AAA sobre el ÁREA. +## P5 — S6 Field composition (HECHO 2026-07-08→09, pusheado) + +Doctrina del usuario: **todos los fields deben SER fields** (componen `field.css`), +**y ningún field concreto declara tokens que aliasen los de Field**. Commits +`5eb92132..d1670caa` (12). Detalle en memoria: `compose-base-field-not-replicate`, +`no-token-aliases`, `recipe-orphan-test-prune`. + +- **16 fields componen `field.css`** — cuatro cardinalidades descubiertas y + documentadas: + 1. **multi-field** (date/time-range-field): montan un ``/`` + real por endpoint (soma), tamaño/variant/color via visual context. + 2. **single-field picker** (date/time-picker): el root ES el field + (`data-field` + `data-{c}-field`), chrome de `field.css`. + 3. **single-control text** (search/mask/number/css): colapsan `fieldRole('provider')` + + `fieldRole('control')` en la única caja; `field.css [data-field-control]` fija + `flex-direction: row` (evita que la columna del provider apile los afijos). + 4. **field con contenido debajo** (password: strength meter): estructura Field + canónica completa con una parte `` real + el meter como hermano del stack. +- **Poda de recipe-tokens** (`a820e5f3` + `d1670caa`, **199 tokens**): mover el chrome + a `field.css` dejó los `--{c}-field-height/padding/border/bg/font/...` **huérfanos** + (emitidos sin consumidor). El guard **`recipe-css-contract.test.ts` "orphaned"** los + caza (167 en la 1ª pasada + 32 tras de-aliasar los pickers). mask-field quedó sin + tokens propios → entrada de recipe eliminada. +- **De-alias de pickers** (`d1670caa`): date-range/time/time-range-picker aliasaban + `--date-field-*`/`--time-field-*` para su parte "field-shaped" → retargeteados a los + **tokens públicos de Field** (`--field-control-*`/`--field-*`/`--field-segment-height`) + o al primitivo donde Field no tiene equivalente (wrap column-gap = segment gap). + Value-preserving (mismo primitivo tras un hop), verificado con revisión adversarial + (workflow, 4 agentes) + navegador en los 4 pickers. + +### Lecciones de método (S6) — no repetir + +- **El baseline `svelte-check` NO corre vitest.** Tras cualquier refactor de + recipe/CSS, corre además `npx vitest run src/uix/eidos/recipe-css-contract.test.ts` + (25 tests: huérfanos, phantom, "todo var resuelve", scope-contract). La regresión + de 167 huérfanos fue invisible al baseline durante toda la composición S6. +- **`--field-segment-height` solo existe bajo `[data-field][data-size]`.** Un elemento + compuesto SIN `[data-size]` cae al default `[data-field]` = **md, fijado**. Antes de + cambiar un `calc(--control-height - space-2)` por `--field-segment-height`, verifica + en el DOM (xs/sm/lg) que el elemento consumidor lleva `[data-size]`. La revisión + adversarial cazó exactamente esto en time-range-picker. + ## P5 — lo que queda (arrancar aquí mañana) -- **S6 Field composition** (el grande, veredicto CONFIRMADO): R-1.3/R-1.4 - (readonly/invalid ×9+2) como tratamiento único DENTRO de Field; 6 fields matan - alturas duplicadas; aterriza `--field-segment-height`. - **S8 calendar-surface** CONFIRMADO + tokens de rango como **API pública** de la - capa (drp deja de tunear `--_calendar-range-*` ajenos). + capa (drp deja de tunear `--_calendar-range-*` ajenos). **← EMPEZAR AQUÍ.** + +### Follow-ups no bloqueantes (registrados) + +- **`task_d66356de`** — **TimeRangePicker no propaga `data-size` a sus endpoints** + (caja fijada a md en todo tamaño; verificado en DOM 2026-07-08). DateRangePicker SÍ + lo hace (via el visual context de date-range-field). Espejar ese patrón; luego el + embedded-trigger de time-range-picker podrá volver a `--field-segment-height` (hoy usa + el privado `--_time-field-height` a propósito, por este hueco). +- **Task #31 (memoria)** — migrar los date/time pickers al `PickerProvider` + genérico (deferValue). **POST audit-fix**, no ahora. ## Protocolo de verificación (invariante en toda la fase)