# Eidos `Eidos` es la **capa visual** de UIX. Cubre lo que en la rama muerta `air/` era el "runtime visual" más el sistema de tokens — sin heredar código. Lee del DOM lo que las capas anteriores han escrito (morfo runtime + sema visual channel) y aplica estilos, animaciones y wrappers ergonómicos. ``` Morfo declara la genética ↓ Soma transcribe el comportamiento → DOM (data-state, data-color, aria-*) ↓ Sema emite señales perceptivas → DOM (data-event-*) durante el hold ↓ Eidos aplica el visual: tokens, themes, recipes, archetypes, wrappers ``` Eidos nunca importa internals de soma ni de sema. Su fuente de verdad es **lo que está escrito en el DOM** (parts, data-attrs, ARIA, archetypes, event signals) y los tipos públicos de Soma que necesita para componer wrappers. ## Handoff 2026-05-14 Eidos queda congelado a nivel de componentes hasta reauditar la arquitectura de UIX. No tocar `src/uix/eidos/components/*` salvo orden explicita. Actualización 2026-05-17: la migración de componentes se reanudó por orden explícita. La regla vigente no cambia: cada componente nuevo debe seguir `components/README.md`, envolver partes públicas de Soma directamente y añadir sólo superficie visual de Eidos. Antes de seguir con wrappers o recipes por componente hay que respetar estas decisiones: - que contrato minimo consume `Eidos` desde `ActiveUix`; - `ActiveEidos` asume authoring, validacion, generacion CSS, persistencia y contexto visual; - `events` es el servicio perceptivo runtime y `morfo.translations` es el catalogo declarativo de texto owned por el componente; - que parte se genera desde codigo y que parte puede venir solo por CSS; - como se mantiene la regla de escritura DOM unica en standalone `dom:false`. La referencia de arranque esta en [`../active_architecture.md`](../active_architecture.md), seccion `Handoff 2026-05-14`. ## No es solo CSS El primer mental model fue "eidos = CSS reactivo". Insuficiente: hay concerns visuales puros (variant, size, layout flags, icon slots) que no son parte del comportamiento headless pero sí son ortogonales al CSS. Eidos los aloja como **wrappers Svelte sobre el Soma**. ``` src/uix/eidos/ active-eidos.svelte.ts → runtime/contexto visual y generacion CSS index.css → entrypoint que importa todo el CSS archetypes.css → reglas comunes a [data-archetype=*] events.css → reacciones a [data-event-*] (sema visual) generated/base.css → salida estatica generada desde EidosConfig base themes/fonts.css → font faces usados por el theme base generado lib/ → soporte de config, recipes, contrato CSS y tipos compartidos components/{x}/ → recipe + wrapper + tipos por componente {x}.css recipe CSS (selectores [data-{x}], etc.) {x}.svelte wrapper Svelte sobre el componente Soma types.ts props del wrapper (extiende el contrato público Soma) index.ts namespace publico (default + partes attached) ``` `lib/` contiene el soporte puro de configuracion visual: primitivas, semantica visual, themes, contrato CSS y render. `generated/base.css` es el primer artefacto estatico generado desde esa configuracion (`npm run generate:eidos-css`). Los antiguos `contracts/` y `themes/base/` CSS se retiraron del arbol activo: el contrato publico se obtiene con `ActiveEidos.getCssContract()` / `renderContractCss()` y el base visual sale de `generated/base.css`. Los antiguos `tokens/components/*` tambien se retiraron: los nombres de custom properties de recipe (`--toast-*`, `--dialog-*`, etc.) siguen siendo el contrato estable, pero sus valores base viven en `EidosConfig.recipes` y se generan en `generated/base.css`. ## Runtime activo Eidos tiene una clase activa: - `ActiveEidos` es el runtime activo y contexto visual de los wrappers Svelte. Gestiona configuracion visual pura, primitivas, roles semanticos, themes, validacion, render de CSS y persistencia. Conecta esa configuracion con los servicios de `ActiveUix` cuando hay contexto: `prefs`, `dom`, `langs`, `format` y helpers visuales como `resolve(...)`, `breakpoint(...)` o `isBelow(...)`. Si `applyDom` esta activo, inyecta/quita `