docs(CLAUDE): session hand-off 2026-06-05 — color system sprint

Records the 6-commit color sprint (cierres + runtime theme builder + wide-gamut
output + wide-gamut-true generator + forced-colors a11y + border ramp) at the top
of the hand-off section: key APIs, layering decisions, honest wide-gamut scope, and
the remaining engine-hygiene backlog (THEMING_AUDIT P3-4..P3-11 + P2 halves).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
active-uix
dev 4 months ago
parent 4eab3306b8
commit 4e71d14c63

@ -343,6 +343,40 @@ remaining surface (plain CSS recipes) until those gain a builder of
their own. Hand-written morfo-targeting selector strings in TypeScript
files are an architecture violation, not a lint warning.
## Session hand-off — 2026-06-05 (sistema de color — cierres + theme builder runtime + wide-gamut + a11y)
Sprint dando "un giro de vueltas" al sistema de color de Eidos hasta reference-grade. 6 commits. El motor `uix.color` (`$color`, art puro isomórfico: OKLCH↔sRGB, APCA, alpha compositing-inverse, `deriveScheme`/`generateScale`/`temper`) ya existía; este sprint lo CONSUME end-to-end + cierra los ítems de calidad de `THEMING_AUDIT`.
**Cierres rápidos** (`cc37bdce`):
- `themes/base.ts`: `loss` era `purple` ≡ primary → mapeado a `plum` (escala canónica). Última colisión de roles del tema base cerrada (tras tertiary→indigo).
- `temas/grafito`: la sección "override por componente" pasaba nombres de escala (teal/amber/…) a `Button.color`, que solo acepta el override jerárquico (`primary|secondary|neutral`) — type error + inerte. Reescrita a los 2 ejes reales: `color` (jerarquía) + `intent` (paleta evaluativa). Cierra el último error de `svelte-check` → **0 errores**.
**API runtime — theme builder** (`c4d2e34d`):
- Nuevo `src/uix/eidos/lib/build-scheme.ts` (PURO): `buildScheme(seed, opts)` compone `deriveScheme` + `generateScale` + APCA on-solid + alpha en el mapa de override `--primitive-{role}-*` (+ `--color-{role}-contrast`). `seed → { variables, roles }`. Sin DOM.
- `ActiveEidos.applyColorScheme(seed, opts)` / `clearColorScheme()`: resuelve escalas-donantes + background del tema activo, escribe el bloque `uix-eidos-scheme` DESPUÉS del de tema (gana cascada), RE-DERIVA al cambiar de modo (sigue light/dark). Devuelve `BuildSchemeResult`. `opts`: `variant` (tonal|vibrant|monochrome) + `temper` (cohesión de intents, mantiene hue) + `overrides` per-rol + `selector`. Exportado de `$uix/eidos`. Demo `/temas/color` dogfooda `buildScheme`.
**Wide-gamut OKLCH** (`909ab7f9` output + `0bb03559` generador):
- Output OKLCH-nativo default-on (RFC §7 estrategia A): `render-css > appendColorScaleDeclarations` emite por cada paso de paleta el hex (fallback) + un hermano `oklch()` que gana donde se soporta. SIN flag.
- Generador wide-gamut-TRUE: `buildScheme`/`applyColorScheme` retienen el OKLCH raw de `generateScale` (sin clamp) → `result.wideGamut` + `result.roles[].stepsOklch`. Nuevo `schemeDeclarations(result, { fallback })` apila hex+oklch (default) u oklch-only (inline).
- **HONESTIDAD**: la paleta Radix shipped es hex sRGB → sus `oklch()` son sRGB-equivalentes (idéntico hoy). El wide-gamut REAL vive en el generador: seed con croma > sRGB sale más saturado en P3. Demo `/temas/color`: slider **vivacidad P3** + badge «fuera de sRGB → P3» (`isInSrgbGamut`). Verificado: ×1.70 → croma primary-9 0.18→0.31. La paleta autorada NO se migró a semillas (regresaría los valores exactos de Radix sin añadir wide-gamut visible).
**P3-2 forced-colors + P3-3 ramp de bordes** (`4eab3306`):
- **forced-colors (Windows HCM)**: el navegador auto-mapea bordes/texto/fondos (`forced-color-adjust: auto`) pero ELIMINA `box-shadow` → el focus ring (`--focus-ring`, box-shadow) desaparecía. Fix: foundation emite siempre `renderForcedColorsBlock` → `@media (forced-colors: active) { :focus-visible { outline: 2px solid Highlight } }`. Componentes con outline propio (Button) lo conservan por especificidad. Pendiente: `prefers-contrast: more`.
- **ramp de bordes**: slot de rol `border` 6 (separador sutil) → **7** (UI element border de Radix). `DEFAULT_COLOR_ROLE_SLOT_STEPS`. element/hover/active=3/4/5 se quedan. Verificado: `--color-{role}-border` → primitive-7 (checkbox OK).
**Verificación**: `check` 0 errores. Suite eidos 155/158 (3 fallos pre-existentes del track `words`, confirmados con `git stash` baseline). `build-scheme` 8 + scheme 4 + forced-colors 1. `generated/base.css` regenerado y en sync.
**Decisiones con efecto duradero**:
- **Capas**: `uix.color` = matemática · `eidos/lib/build-scheme` = composición (pura) · `ActiveEidos` = aplicación DOM. No mezclar.
- **Wide-gamut default-on, sin flag** (estrategia A); fallback hex → sRGB idéntico, no-disruptivo.
- **Paleta autorada = exacta-Radix-sRGB** (sin regresión). Wide-gamut VISIBLE de la paleta = Fase 3 futura (autorar/generar en OKLCH).
- **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).
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.
## 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.

Loading…
Cancel
Save

Powered by TurnKey Linux.