From 6b54f47ebec9a651d1f0b4d236a0fb965e019517 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 5 Jun 2026 01:28:56 +0200 Subject: [PATCH] =?UTF-8?q?docs(CLAUDE):=20extend=202026-06-05=20hand-off?= =?UTF-8?q?=20=E2=80=94=20checkbox=20fix=20+=20color=20backlog=20close?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brings the session hand-off up to date with the work after the first write: - checkbox 244ms lag fix (sequence pre->post) + the new doctrine (handler-gated control state needs 'post'; call-site state tolerates 'pre'); - P3-11 surface ladder (light overlay -> neutral-4); - prefers-contrast: more a11y; - theming-engine backlog close (P3-5/6/8 fixed, P3-4/7/9 deferred with rationale, P2 halves deferred). Marks the prior "pendiente" engine-hygiene list as resolved-or-decided in the continuation block. Final state: color/theming fully triaged, check 0 errors. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9bc0afb1f..7e6e652d0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -373,10 +373,30 @@ Sprint dando "un giro de vueltas" al sistema de color de Eidos hasta reference-g - **forced-colors**: el box-shadow muere en HCM → el foco debe ser `outline`. Migrar los componentes que aún usan `var(--focus-ring)` (box-shadow) a `outline` propio es trabajo futuro per-componente (hoy dependen del fallback global). - **slot `border` = step 7** (no 6). -**Pendiente (solo higiene del engine, NO calidad de color)**: `THEMING_AUDIT` P3-4 (densidad por especificidad `:where(:root)`), P3-5 (guard parseFloat), P3-6 (`dispose()` DOM directo), P3-7 (runes en `active-eidos.svelte.ts`), P3-8 (re-exports crudos de render-fns), P3-9 (forwarders huérfanos), P3-11 (asimetría light/dark muted/overlay), + mitades P2 (poda del contrato, validación de identificador-color pelado). +**Pendiente (solo higiene del engine, NO calidad de color)** — _todo resuelto-o-decidido en la continuación, abajo_: `THEMING_AUDIT` P3-4/5/6/7/8/9/11 + mitades P2. Docs: `COLOR_ENGINE_RFC.md` §6.2/§7, `THEMING.md` §26/§27/§28 + TOC, `README.md` tabla, `THEMING_AUDIT_2026-06-01.md` P3-1/2/3 resueltos. +**Continuación (mismo día) — fix de UX + cierre del backlog**: + +- **Checkbox lag — NO era color, era timing del sema** (`e6fd014d` + `cd834384`). El usuario reportó el check "muy lento". Medido frame-a-frame: el `data-state` tardaba **244ms** en cambiar tras el click. Causa: el provider del checkbox fija el estado en el HANDLER del `runtime.trigger`, y el morfo declaraba `sequence: 'pre'` → el runtime hace `await runEmit()` (que **espera el hold del canal visual ~240ms**, `engine.emit()` → `await visualChannel.handle`) ANTES del handler. Fix: `commit-toggle-check`/`commit-toggle-uncheck` → `sequence: 'post'` (handler primero, pulso después). 244ms → 46ms. Secundario: trazo del checkmark `stroke-duration` 220ms hardcoded → `var(--duration-fast)`. **Verificado que radio-group (47ms) y tabs (31ms) NO laggean** aunque son 'pre' — fijan estado en el call-site, no en el handler; no se tocaron. Toggle/Switch ya eran 'post'. + - **DOCTRINA NUEVA**: un control cuyo estado se fija en el HANDLER del trigger DEBE usar `sequence: 'post'`; con `'pre'` el hold perceptual del emit bloquea el cambio funcional. Los que fijan estado en el call-site toleran 'pre' sin lag. + +- **P3-11 surface ladder** (`76e18772`). Light `overlay` era `neutral-3` == `muted` (popovers indistinguibles de paneles muted en light); dark ya tenía overlay=4. Light overlay → `neutral-4` → ladder consistente en ambos modos: `default(1) < raised(2) < muted(3) < overlay(4)`. Verificado (popover light: overlay L93% ≠ muted L95.5%). + +- **prefers-contrast: more** (`21b2329a`). Completa el a11y de color junto a forced-colors. `renderPrefersContrastBlock` → `@media (prefers-contrast: more) { :root:root { … } }` refuerza bordes (neutral 7/8/9) + texto de-enfatizado (12/11). `:root:root` (0,2,0) gana al `:root` del tema; aditivo, gated, estrictamente más fuerte. THEMING §28. + +- **Cierre del backlog del engine** (`afa15aea`). `THEMING_AUDIT` P3 todo fixed-or-decided: + - ✅ **P3-5** guard `appendScaledMetricDeclarations` (solo escala números finitos ≠0; keywords/`var()`/`calc()` verbatim — evita `calc(auto * …)`). + - ✅ **P3-6** confirmado ya resuelto (dispose vía `dom`, sin `document` directo). + - ✅ **P3-8** index ya NO re-exporta los render-fns crudos (API pública = clase `ActiveEidos`; `./lib/render-css` para uso interno). Consumidor de test redirigido al módulo. + - ⏸️ **P3-4** deferido (densidad gana por orden de fuente determinista, estable; restructure `:where(:root)` = coste alto por nit teórico). + - ⏸️ **P3-7** deferido (reactividad callback-driven vía `apply()` POR DISEÑO; runes = refactor riesgoso sin bug que lo justifique). + - ⏸️ **P3-9** deferido (forwarders huérfanos `_accent` — cirugía de recipe con riesgo de cascada, valor bajo). + - Único pendiente real: 2 mitades **P2** (poda de contrato + validación de identificador-color pelado) — edge-case, deferidas por bajo valor. + +**Estado final del color/theming**: apariencia + a11y (forced-colors + prefers-contrast) + wide-gamut + theme builder runtime + backlog del engine — todo resuelto-o-decidido, cero ítems colgando. `check` 0 errores. Suite eidos 156/159 (3 fallos de words, pre-existentes, confirmados con baseline). Docs extra: `THEMING.md` §28 (prefers-contrast), `THEMING_AUDIT_2026-06-01.md` scorecard P3 completo. + ## Session hand-off — 2026-05-27 (persistence + a11ySemantic + polymorphic) Sprint cerrando los 3 ítems diferidos del hand-off 2026-05-08: persistence + holds-by-intent (libro §6), a11ySemantic per event (libro §9), polymorphic events (libro §5.3). Detalle completo en `src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md` D.9 / D.10 / D.11.