# 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-13 Eidos queda congelado a nivel de componentes hasta reauditar la arquitectura de UIX. No tocar `src/uix/eidos/components/*` salvo orden explicita. 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-13`. ## 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 contracts/ → contratos CSS archivados; no se importan en runtime tokens/ → valores CSS legacy hasta generarlos desde ActiveEidos themes/base/ → CSS base archivado; no se importa en runtime lib/ → soporte de config, tokens, 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`). `contracts/` y `themes/base/` quedan como material archivado para consulta y tooling, pero ya no se importan desde `index.css` ni desde `tokens/index.css`. `tokens/` sigue existiendo como material de transicion, pero no es el modelo que debe crecer. ## 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 `