# Continue Fecha de corte: 2026-05-13. Rama: `active-uix`. Actualizacion 2026-05-14: - Revision post-cambios aplicada. La supuesta perdida de proyeccion cross-modal queda resuelta como aclaracion de ownership: la proyeccion vive en `arts/prefs` mediante `createActivePrefsDomProjection(...)`, no en `ActiveUix`. - Documentacion de ecosistema actualizada en `src/uix/*` y `src/arts/*`: ownership de prefs/proyeccion/Eidos, naming canonico (`langs`, `events`, `active-app`, `storage`, `connection`, `session`, `cache`, `timer`, `logger`) y marcas historicas en docs de diseno antiguas. - Archivos documentales de revision retirados. Las conclusiones vigentes quedan absorbidas por `src/uix/active_architecture.md`, los README de capa y `src/uix/contracts.ts`. - Limpieza Eidos CSS/runtime aplicada: `index.css` ya solo importa fonts, `generated/base.css`, `archetypes.css`, `events.css` y recipes activas. Se retiraron CSS historicos de `contracts/`, `themes/base/`, `tokens/motion.css`, `tokens/index.css` y los token files de componentes. - Migracion Eidos recipe tokens aplicada: los aliases `--{component}-*` viven en `EidosConfig.recipes`, el tema base los define en `src/uix/eidos/lib/recipes/base.ts`, y `generated/base.css` los publica desde `npm run generate:eidos-css`. - Superficie de consulta de recipes aplicada: `ActiveEidos.listRecipes()` y `getRecipeTokens(component)` exponen aliases para editores de theme sin inspeccionar CSS ni devolver handles mutables del config interno. - Commits nuevos empujados: - `694eb5c5` — `Clarify prefs projection contract` - `223cdf9e` — `Align sema docs with channel ownership` - `3dc775f4` — `Update UIX architecture notes` - `b1215549` — `Fix UIX docs theme and popover dismiss` - `6da10987` — `Prune legacy Eidos CSS runtime` - `d822597f` — `Generate Eidos recipe tokens from config` - `65958538` — `Expose Eidos recipe token queries` - Validado de nuevo: - `npx vitest run src/uix/contracts.test.ts src/arts/prefs/test/dom-projection.test.ts src/uix/active-uix/active-uix.svelte.test.ts src/uix/eidos/active-eidos.test.ts src/uix/soma/runtime.svelte.test.ts` -> 79 tests OK. - `npx vitest run src/uix/sema/engine.test.ts src/uix/soma/runtime.svelte.test.ts` -> 48 tests OK. - `npx vitest run src/uix/eidos/active-eidos-config.test.ts src/uix/eidos/generated-css.test.ts src/uix/eidos/active-eidos.test.ts src/uix/contracts.test.ts` -> 52 tests OK. - `npm run check` -> 0 errores, 0 warnings. - Playwright `/uix`: toggle dark actualiza `html[data-theme="base-dark"]`, `html[data-mode="dark"]` y mantiene `html[data-density="comfortable"]`; sin `pageerror`. Los unicos recursos bloqueados son fuentes externas por sandbox de red (`fonts.googleapis.com`, `api.fontshare.com`). ## Estado validado - `ActiveUix` ya no crea ni conoce `Soma` ni `Eidos`. - Solo `ActiveApp` y `createActiveUix(...)` standalone crean servicios compartidos. - `attachActiveUix(app)` reutiliza servicios de `ActiveApp` y falla temprano si faltan `langs` o `dom`. - El servicio runtime de traducciones se llama `langs`. No confundir: - `prefs.language` alimenta `langs`. - `prefs.locale` alimenta `format`. - `prefs.direction`, `prefs.motion`, `prefs.sound` y `prefs.haptic` se proyectan mediante `createActivePrefsDomProjection(...)`. - `events` es el nombre publico del motor perceptivo en `ActiveUix`; `semantic` queda solo como payload de `morfo.events[].semantic`. - `ActiveEidos` queda aplanado: no existe engine visual separado ni directorio `engine` bajo Eidos. - Los helpers de configuracion/render/persistencia de Eidos viven en `src/uix/eidos/lib`. - `ActiveEidos` asume configuracion, validacion, contrato CSS, render, persistencia y scope visual. - Shells UIX deben pasar modo/densidad visuales a `ActiveEidos` mediante `modeSource`/`densitySource`; no escribir `prefs.theme`. - Los componentes Eidos siguen congelados salvo orden explicita. Validaciones ejecutadas en esta fase: - `npx vitest run src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts` -> 37 tests OK. - `npx vitest run src/arts/adom/test/active-dom.test.ts src/uix/soma/runtime.svelte.test.ts src/uix/morfo/registry.test.ts src/uix/sema/resolver.test.ts src/uix/sema/chans/sound.test.ts src/uix/sema/chans/visual.test.ts src/uix/eidos/active-eidos.test.ts src/uix/eidos/active-eidos-config.test.ts src/uix/contracts.test.ts` -> 115 tests OK. - `npm run check` -> 0 errores, 0 warnings. ## Arquitectura acordada La regla central queda asi: ```text ActiveApp o ActiveUix standalone crean servicios. ActiveUix expone servicios y prefs. Morfo declara contrato y translations. Soma consume ActiveUix/Soma scope y transcribe morfo al DOM via uix.dom. Sema/events emite ocurrencias perceptivas; no debe inventar servicios. ActiveEidos consume ActiveUix y resuelve config/tokens/CSS runtime. Los componentes no crean servicios compartidos. ``` `portal` queda como preferencia/target generico de `ActiveUix`; Soma lo adapta a su `portalTo`. No usar nombres como `somaPortalTo` en `ActiveUix`. ## P1 cerrado 1. Ownership DOM P1 cerrado. - Corregido: `TextSelection` ya escribe/restaura `user-select` via `ActiveDom.apply`. - Corregido: announcers/live regions de Soma y descripciones ocultas de date/time usan `ActiveDom.writeNode/writeText/removeNode`. - Correcto: `ActiveUix` prefs, `SomaRuntime`, `VisualChannel`/`DomSignalProjector` y `ActiveEidos` usan `ActiveDom`. - Barrido P1 sin escrituras directas de produccion restantes; quedan lecturas DOM y fixtures de tests. 2. Tabla de contratos minimos cerrada como codigo/tests: `src/uix/contracts.ts` + `src/uix/contracts.test.ts` cubren `ActiveUix`, `SomaRuntime`, `EngineSemantic/events`, `ActiveEidos` y `Morfo`. 3. Sema queda purgado de las slices visuales `motion`, `color` y `presence`. El mapa canonico resuelve solo `hold`, `sound` y `haptic`; Eidos reacciona visualmente a `data-event-*` y a sus propios tokens CSS. 4. Naming `langs` revisado en mensajes/docs/tipos principales. Quedan solo usos tecnicos validos (`