# Eidos Theming — Architecture Reference > **Audiencia**: cualquier dev que abra el repo y necesite entender cómo > se hace el theming en UIX. Cubre el modelo mental, los contratos, > las herramientas y las trampas. Si después de leerlo todavía no sabes > dónde poner un token nuevo, falló este doc — abre un issue. **TL;DR**: - **9 roles canónicos** de color (`primary`, `secondary`, `tertiary`, `neutral`, `affirm`, `fulfill`, `risk`, `threat`, `loss`). - **6 sizes canónicos** + `full` (`xxs..xxl`). - **3 niveles de tokens** públicos: foundation (estable), per-component recipe (overrideable), private (`--_*`, no contrato externo). - **Token Scope Contract (TSC)** decide DÓNDE se emite cada token (`:root` / `[data-{c}]` / `[data-{c}][data-color='X']` / etc.) y valida transitividad al generar. - **226 KB raw / 25 KB gzip** de CSS foundation por defecto. Usa `npm run eidos:purge` para apps en producción → −46 a −55%. - **Modelo de color**: paleta de 31 escalas (diseñable) → roles de jerarquía (alias explícito) → intents (auto-derivados por convención del libro, identidad = step 9). Ver §25. - **Compatible con** persistencia versionada, themes CSS-only, runtime overrides, dark/light, density (compact/comfortable/spacious), scaling (zoom 90–110, eje aparte), reduced motion, multi-axis breakpoints. --- ## Tabla de contenidos 1. [Mental model](#1-mental-model) 1bis. [Theming vive en Eidos, no en Morfo (por diseño)](#1bis-theming-vive-en-eidos-no-en-morfo-por-diseño) 2. [Las 6 capas del CSS de Eidos](#2-las-6-capas-del-css-de-eidos) 3. [Las 7 capas de tokens](#3-las-7-capas-de-tokens) 4. [Los 9 roles canónicos de color](#4-los-9-roles-canónicos-de-color) 5. [El canon de sizes](#5-el-canon-de-sizes) 6. [Convenciones de naming](#6-convenciones-de-naming) 7. [Token Scope Contract (TSC)](#7-token-scope-contract-tsc) 8. [Cómo añadir un componente nuevo](#8-cómo-añadir-un-componente-nuevo) 9. [Cómo definir un theme](#9-cómo-definir-un-theme) 10. [Cómo overridear tokens en runtime](#10-cómo-overridear-tokens-en-runtime) 11. [Bundle strategy + `eidos:purge`](#11-bundle-strategy--eidospurge) 12. [Herramientas de validación](#12-herramientas-de-validación) 13. [Integración con Sema (`event:*` scope)](#13-integración-con-sema-event-scope) 14. [Motion (estado actual)](#14-motion-estado-actual) 15. [Comparación con librerías de referencia](#15-comparación-con-librerías-de-referencia) 16. [Anti-patterns que NO debes cometer](#16-anti-patterns-que-no-debes-cometer) 17. [FAQ — decisiones polémicas](#17-faq--decisiones-polémicas) 18. [Cobertura universal de TSC](#18-cobertura-universal-de-tsc) 19. [Variants son canon del eidos, NO del theme](#19-variants-son-canon-del-eidos-no-del-theme) 20. [Correcciones del engine de theming (2026-06-01)](#20-correcciones-del-engine-de-theming-2026-06-01) 21. [Modelo de color de dos niveles (RFC — RESUELTO en §25)](#21-modelo-de-color-de-dos-niveles-rfc--resuelto-en-25) 22. [Mejoras pendientes del theming](#22-mejoras-pendientes-del-theming) 23. [Eje de `scaling` (zoom global)](#23-eje-de-scaling-zoom-global--2026-06-02) 24. [Correcciones P2 del engine (2026-06-02)](#24-correcciones-p2-del-engine-2026-06-02) 25. [Modelo de color — paleta + roles/intents derivados](#25-modelo-de-color--paleta--rolesintents-derivados-2026-06-02) 26. [Theme builder en runtime — `eidos.applyColorScheme`](#26-theme-builder-en-runtime--eidosapplycolorscheme-2026-06-04) 27. [Salida wide-gamut OKLCH (default-on)](#27-salida-wide-gamut-oklch-default-on-2026-06-04) 28. [Accesibilidad forced-colors + ramp de bordes](#28-accesibilidad-forced-colors--ramp-de-bordes-2026-06-05) --- ## 1. Mental model Eidos es **la capa visual** de UIX. NO posee comportamiento ni estado. Lee del DOM lo que las capas anteriores escribieron y aplica estilos. ``` Morfo declara la genética (qué attrs / events / partes existen) ↓ Soma transcribe behavior (data-state, data-color, aria-*, focus, …) ↓ Sema emite señales (data-event-* durante el hold perceptual) ↓ Eidos aplica visual (tokens, themes, recipes, archetypes, motion) ``` **Lo que Eidos posee**: - El namespace `--*` de custom properties. - 5 layers de CSS (archetypes, events, foundation generado, recipes, themes). - El runtime `ActiveEidos` que inyecta foundation + theme CSS. - Tooling: generación, validación, purge, lint. **Lo que Eidos NO posee**: - Estado lógico de componentes (eso es soma). - Definición de qué events existen (eso es morfo). - Disparar señales perceptivas (eso es sema). **La regla del 2-de-3**: una extensión al sistema (atributo, token, convención) sólo se justifica si **al menos dos de las tres capas** (soma, sema, eidos) la consumen. Las extensiones que entraron por voto de eidos: `archetype`, `events[].semantic.{family,intent}`, `events[].prewrite[]`, `data-starting-style` / `data-ending-style`. --- ## 1.bis Theming vive en Eidos, no en Morfo (por diseño) > **Esta es la pregunta arquitectónica más frecuente — y la respuesta más > importante para no romper el sistema.** La intuición razonable de un dev nuevo es: *"si morfo es la fuente de verdad cross-layer, los tokens visuales deberían vivir en morfo también"*. **NO.** El diseño explícito de UIX dice lo contrario. Esta sección existe para cerrar el caso con citas, antes de que la confusión arrastre a un PR que viole la arquitectura. ### Las dos citas canónicas del repo **`src/uix/active_architecture.md` §9 (Lo que NO es esta arquitectura)**: > **No es un design system clásico.** Tokens, themes y recipes pertenecen > a Eidos, no al núcleo. **`src/uix/README.md` §2 (Eidos)**: > Capa visual: **tokens, themes, recipes CSS por componente**, archetype > rules, event reactions y wrappers Svelte sobre los providers headless de > soma… > > Eidos lee del DOM lo que las otras capas escriben — **nunca importa > internals de soma ni de sema**. Estas dos frases, por sí solas, cierran cualquier debate sobre dónde vive el theming. Si una propuesta futura las contradice, la propuesta debe rechazarse o el doc canónico debe actualizarse antes — no después. ### La regla 2-de-3 lo deriva mecánicamente **`active_architecture.md` §7 #12** y **README.md §5** dicen lo mismo: > Una extensión a morfo solo se justifica si **al menos dos de las tres > capas** (soma, sema, eidos) la consumen. Aplicado al theming: | ¿Quién consume los tokens visuales? | | |---|---| | Soma (behavior runtime) | ❌ no | | Sema (perceptual signals) | ❌ no | | Eidos (visual layer) | ✅ sí | | **Cuenta** | **1-de-3** | **1-de-3 ≠ 2-de-3 → tokens NO van en morfo, por regla**. La integración visual cae automáticamente en eidos por la disciplina del 2-de-3, sin que nadie tenga que decidirlo per-caso. ### ¿Cuál es entonces la relación entre morfo y theming? Morfo es source-of-truth del **contrato cross-layer**: - Parts (qué partes existen) - Events (qué eventos puede disparar) - Attrs y sus valores enumerados (qué attrs aparecen en DOM con qué values) - Archetypes (clasificación transversal) - States declarativos **El theming se integra con morfo en UN SENTIDO PRECISO**: las recipes de eidos targetean DOM attrs que morfo declara. Sin morfo, los attrs no existirían en el DOM y los selectores eidos estarían muertos. ``` MORFO declara data-color.values = ['primary', 'affirm', 'threat', ...] ↓ SOMA emite