You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/src/uix/active_architecture.md

860 lines
41 KiB

docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
# UIX — Active Architecture
> Documento vivo de la arquitectura activa de UIX: motivaciones, las cuatro
> capas, cómo se articulan, qué problema resuelven, qué dejan deliberadamente
> fuera. Este doc es la visión de conjunto; los READMEs por capa son la
> referencia operativa.
>
> Última revisión arquitectónica: 2026-05-15 (rama `active-uix`). Cambios
docs: prune obsolete audits + studies, refresh remaining references Deleted 60 obsolete documents that no longer reflect the active-uix state: - 47 per-component audit logs (*-audit.md, audit_N.md, AUDIT.md) - 5 global soma audits (AUDIT_1, codex_audit, soma-audit-04-20/21, audit-prompt template) - 5 closed studies (soma/study, morfo/study, morfo/DESIGN, morfo/ PROVIDER_STUDY_2026-04-23, uix/CONTINUITY_2026-04-24) - 2 superseded refactor proposals (refactor_claude, refactor_code) - 1 stale bug log (form/BUG-onchange-onblur-hang — repro path src/routes/test/sium/kitchen-sink no longer exists) Updated the remaining operational references to drop dead links and reflect the post-cleanup architecture: - src/uix/README.md — rewritten links section, dropped pointers to terra/air/CONTINUITY/refactor docs, updated adom/dom paths - src/uix/active_architecture.md — header now dated 2026-05-08, lists the major shifts since 2026-04-26 (provider inheritance dropped, eidos in production, doctrina parte IV, sound eager-init); pendings section reflects the eidos migration roadmap; "see also" purged of deleted files - src/uix/morfo/README.md — file tree updated (removed DESIGN/study, added compile/runtime/PERMUTATION_RUNNER); see-also pruned - src/uix/sema/README.md — SoundChannel section now describes the eager-init pattern (constructor-time, not lazy); pointer to sema-implementation-guide added - src/uix/soma/README.md — drops terra/air mentions, declares the actual dependency direction (eidos -> soma, not the reverse) - src/uix/soma/SOMA_ARCHITECTURE.md — §15 rewritten as "Estado actual y deuda histórica" reflecting Provider-inheritance-drop; demo path updated to web/routes/ - src/uix/soma/COMPONENT_GUIDE.md — A23 dates section now points to $libs/days (no external/dates façade); demo paths swapped from /test/soma/* to web/routes/ - src/uix/morfo/PERMUTATION_RUNNER.md — paths swapped to web/routes/ with a relocation note - CLAUDE.md — Refactor Documents section replaced with Reference Documents pointing to per-layer READMEs npm run check holds at baseline (39 pre-existing errors, none new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
> mayores desde la revisión anterior:
>
> - **Auditoría P0/P1 aplicada** — `SoundChannel` usa la superficie DOM
> inyectada para listeners globales, los ciclos type-only de
> `sema-map/types` y `floating/types` quedan rotos, y hay tests iniciales
> para los providers/motores de mayor riesgo: Dialog, Drawer, Command,
> Calendar, DateField, Select, Popover, Toast y RangeCalendar. Los motores
> de Table/Form/Command scoring salen de Soma hacia `libs`.
> - **Pausa de coherencia arquitectónica** — contratos mínimos por módulo
> auditados y fijados en `src/uix/contracts.ts`: qué necesita cada capa,
> qué instancia si no se le pasa, cuándo degrada y cuándo debe fallar.
docs: prune obsolete audits + studies, refresh remaining references Deleted 60 obsolete documents that no longer reflect the active-uix state: - 47 per-component audit logs (*-audit.md, audit_N.md, AUDIT.md) - 5 global soma audits (AUDIT_1, codex_audit, soma-audit-04-20/21, audit-prompt template) - 5 closed studies (soma/study, morfo/study, morfo/DESIGN, morfo/ PROVIDER_STUDY_2026-04-23, uix/CONTINUITY_2026-04-24) - 2 superseded refactor proposals (refactor_claude, refactor_code) - 1 stale bug log (form/BUG-onchange-onblur-hang — repro path src/routes/test/sium/kitchen-sink no longer exists) Updated the remaining operational references to drop dead links and reflect the post-cleanup architecture: - src/uix/README.md — rewritten links section, dropped pointers to terra/air/CONTINUITY/refactor docs, updated adom/dom paths - src/uix/active_architecture.md — header now dated 2026-05-08, lists the major shifts since 2026-04-26 (provider inheritance dropped, eidos in production, doctrina parte IV, sound eager-init); pendings section reflects the eidos migration roadmap; "see also" purged of deleted files - src/uix/morfo/README.md — file tree updated (removed DESIGN/study, added compile/runtime/PERMUTATION_RUNNER); see-also pruned - src/uix/sema/README.md — SoundChannel section now describes the eager-init pattern (constructor-time, not lazy); pointer to sema-implementation-guide added - src/uix/soma/README.md — drops terra/air mentions, declares the actual dependency direction (eidos -> soma, not the reverse) - src/uix/soma/SOMA_ARCHITECTURE.md — §15 rewritten as "Estado actual y deuda histórica" reflecting Provider-inheritance-drop; demo path updated to web/routes/ - src/uix/soma/COMPONENT_GUIDE.md — A23 dates section now points to $libs/days (no external/dates façade); demo paths swapped from /test/soma/* to web/routes/ - src/uix/morfo/PERMUTATION_RUNNER.md — paths swapped to web/routes/ with a relocation note - CLAUDE.md — Refactor Documents section replaced with Reference Documents pointing to per-layer READMEs npm run check holds at baseline (39 pre-existing errors, none new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
> - **Provider inheritance dropped** — los providers ya no heredan de un
> base compartido; son clases concretas y centralizan la mecanica
> DOM con `SomaRuntime.part(...)`.
> - **Eidos entro en produccion como runtime visual aplanado** —
> `ActiveEidos` gestiona primitivas/themes, validacion, contrato CSS,
> persistencia e inyeccion runtime cuando la app lo pide.
docs: prune obsolete audits + studies, refresh remaining references Deleted 60 obsolete documents that no longer reflect the active-uix state: - 47 per-component audit logs (*-audit.md, audit_N.md, AUDIT.md) - 5 global soma audits (AUDIT_1, codex_audit, soma-audit-04-20/21, audit-prompt template) - 5 closed studies (soma/study, morfo/study, morfo/DESIGN, morfo/ PROVIDER_STUDY_2026-04-23, uix/CONTINUITY_2026-04-24) - 2 superseded refactor proposals (refactor_claude, refactor_code) - 1 stale bug log (form/BUG-onchange-onblur-hang — repro path src/routes/test/sium/kitchen-sink no longer exists) Updated the remaining operational references to drop dead links and reflect the post-cleanup architecture: - src/uix/README.md — rewritten links section, dropped pointers to terra/air/CONTINUITY/refactor docs, updated adom/dom paths - src/uix/active_architecture.md — header now dated 2026-05-08, lists the major shifts since 2026-04-26 (provider inheritance dropped, eidos in production, doctrina parte IV, sound eager-init); pendings section reflects the eidos migration roadmap; "see also" purged of deleted files - src/uix/morfo/README.md — file tree updated (removed DESIGN/study, added compile/runtime/PERMUTATION_RUNNER); see-also pruned - src/uix/sema/README.md — SoundChannel section now describes the eager-init pattern (constructor-time, not lazy); pointer to sema-implementation-guide added - src/uix/soma/README.md — drops terra/air mentions, declares the actual dependency direction (eidos -> soma, not the reverse) - src/uix/soma/SOMA_ARCHITECTURE.md — §15 rewritten as "Estado actual y deuda histórica" reflecting Provider-inheritance-drop; demo path updated to web/routes/ - src/uix/soma/COMPONENT_GUIDE.md — A23 dates section now points to $libs/days (no external/dates façade); demo paths swapped from /test/soma/* to web/routes/ - src/uix/morfo/PERMUTATION_RUNNER.md — paths swapped to web/routes/ with a relocation note - CLAUDE.md — Refactor Documents section replaced with Reference Documents pointing to per-layer READMEs npm run check holds at baseline (39 pre-existing errors, none new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
> - **Doctrina del API cerrada** — convenciones 1-13 en
> [`src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md`](../docs/GUIA_IMPLEMENTACION_SEMAUIX.md)
> (single-event para operaciones instantáneas, 8 color tokens,
> intent ↔ color resolution, subset por componente, root visual con
> partes attached en eidos, sound prepare-time priming, etc.).
> - **SoundChannel prepare-time priming** — el `AudioContext` se crea +
> resume en `prepare()` cuando una señal sonora nace dentro del gesto de
> usuario, evitando side-effects globales en el constructor sin reabrir
> la race con la autoplay policy.
> - **Sema sin slices visuales** — `motion`, `color` y `presence` salen del
> mapa perceptivo; Sema resuelve `hold`, `sound` y `haptic`, y Eidos
> materializa la respuesta visual desde CSS/token contract.
> - **Ownership DOM P1 cerrado** — live regions, descripciones ocultas,
> bloqueo de seleccion de texto, observers y acciones imperativas de foco /
> scroll pasan por `ActiveDom`.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
---
## 0. Contratos mínimos por módulo
Qué requiere cada módulo, qué es opcional, cómo degrada y cuándo falla. Las
reglas de ownership y degradación se enuncian, atemporales, en
[`active-uix/README.md`](./active-uix/README.md) §"Reglas de ownership y
degradación".
> Fuente ejecutable: `src/uix/contracts.ts`. Test de frontera:
> `src/uix/contracts.test.ts`.
```text
Modulo Requiere Opcional Si falta Error
active-uix langs,prefs,dom* clipboard,format,events,portal standalone disabledDom falta langs/dom en attach
morfo ninguno translations no registra traducciones no
soma dom events,langs,format,clipboard disabledDom desde uix morfo/event/part invalido; servicio opcional ausente
sema projector/dom* sound,haptic,visual:false ninguno SemaConfigError sin dom/projector
eidos dom* langs,format,prefs,mode/density sources applyDom:false falta dom con applyDom activo
adom surface ActiveDom target/window/breakpoints disabledDom solo explicito errores ADom sin DOM real
* `dom` significa superficie `ActiveDom`, no necesariamente DOM real. Puede
ser `disabledDom` solo en standalone cuando el integrador pide `dom:false`.
En attach debe venir de `ActiveApp`.
* Fuera de `ActiveUix`, `EngineSemantic` con canal visual activo debe recibir
`dom` o `projector`; `visual:false` es la degradacion explicita.
```
Los siguientes cambios deben derivar de esta tabla, no de constructores
inventados desde capas inferiores.
Correccion aplicada: `ActiveUix` no importa ni instancia `Soma`/`Eidos`.
`portal` queda como setting generico de UIX; `Soma` lo consume como default
para `portalTo`, y `ActiveEidos.create(...)` crea el scope visual cuando la
app necesita Eidos.
---
## 0.1 Naming canonico
La arquitectura puede mantener los nombres historicos de carpetas
(`morfo`, `soma`, `sema`, `eidos`), pero la superficie publica debe usar una
gramatica consistente. Regla general: un nombre representa un unico concepto;
si un termino es alias historico, debe quedar marcado y con ruta de retirada.
| Concepto | Nombre canonico | Evitar / retirar |
| ------------------------------------ | ----------------------------------------- | --------------------------------------------------------- |
| Servicio runtime de traducciones | `langs` | `lang` como servicio |
| Idioma activo | `prefs.language` | `locale` para idioma de traducciones |
| Locale / formatos regionales | `prefs.locale` | `language` para formatos |
| Catalogos declarativos de texto | `translations` | `langs` dentro de `morfo`; tablas globales por componente |
| Preferencias UIX | `prefs` | `settings`, `presentation` como nombre nuevo |
| Eventos perceptivos UIX | `events` | `semantic` como servicio publico |
| Ocurrencia en vuelo | `signal` | usarlo para la capa completa |
| Payload semantico de un evento morfo | `semantic` | mezclarlo con el servicio runtime |
| Contrato declarativo TS | `morfo` | `contract` como API TS duplicada |
| Contrato CSS/data exportado | `contract` | `morfo` para CSS externo |
| Bridge CSS runtime | `ActiveEidos` | runtime visual obligatorio de componentes |
| Engine puro independiente | `EngineX` solo si vive fuera de `ActiveX` | engines decorativos |
| Root visual de Eidos | `DrawerProps`, `DialogProps` | `DrawerProviderProps` en API visual |
Decisiones ya aplicadas:
- `ActiveUix.events` es el nombre canonico del motor perceptivo. En attach
mode lee `app.events`; `defineUixServices(...)` declara ese servicio con
el mismo nombre.
- No existe `ActiveUix.semantic` como servicio publico. `semantic`
sobrevive solo como nombre del payload en `morfo.events[].semantic`.
eidos: theming fixes + size/variant parity batch + docs - theme: add surface.muted + content.muted to color contract (neutral-3 + neutral-10). Plugs 17 broken --color-content-muted and 3 broken --color-surface-muted references in recipes/components. - form.css: fix --color-neutral-element-hover typo → --color-neutral-hover. - archetypes.css + events.css: replace raw hsl/rgba indigo with color-mix(var(--color-primary-solid) …) — no raw colors left in eidos. - combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme. - sizes: 20 components expand from sm/md/lg to xs..xl (form controls, text inputs, progress/meter, field/form) or xs..lg (nav controls: breadcrumb, pagination, tag-group, toolbar). Composite panels keep sm/md/lg deliberately. - variants: field + toolbar drop arbitrary ControlVariant narrowings; both expose all 3 (surface | outline | ghost) with new outline CSS. - pagination demo: disambiguate siblingCount/boundaryCount as "per side" in label + API table (Radix/MUI convention). - docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity) + §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) + §12.8 (size category cheatsheet) added. eidos/README + active_architecture.md sync texts/migration nomenclature. - PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión. Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
- `morfo.texts` es el campo declarativo para idlangrefs owned por el
componente — la nomenclatura `morfo.translations` se renombró a `texts`
durante la migración 2026-05 (ver `langs/components/*.ts` para los
catálogos por componente). `langs` queda para el servicio runtime.
- `prefs` es el unico nombre para preferencias. `ActiveUix` expone el
`ActivePrefs` bruto; Soma/Eidos consumen vistas acotadas. No se introduce
`settings`.
fix: address architectural audit findings + sync ecosystem docs Audit: src/audit-opus-4-6-26.md. All non-words findings remediated. Code: - E1: navigation-menu indicator data-state visible -> open (render bug; the active underline was permanently invisible). Clears the only invalid lint selector. - SO1 + E2: raw `new ResizeObserver` -> ActiveDom.observeResize in carousel-provider and the canvas-text useContainerWidth hook (+ s-text / s-text-virtual-list pass eidos.dom). iframe/popup-safe, lifecycle-tracked. - A1: defineUixServices now registers `motion`, so attach-mode app.motion is real and the active-uix fallback becomes the true edge case (test guard updated). - A2/A4: contracts.ts pins `motion` + `announce` in ActiveUixServiceContract + publicSurface; dispose() comment corrected. - SO2: carousel drops the hardcoded `transform 300ms ease-out` (the recipe already handles it via [data-dragging]); also fixed the recipe's undefined `--duration-base` token -> `--duration-slow` (it was masked by the inline). - S1: HapticChannel reduced-motion via an injected ActiveDom port (mirrors SoundChannelDom) instead of global matchMedia. - T1: 10 sites repointed `$libs/dom` -> `$adom` (sema x5 + its tests x3, active-uix value import, arts/prefs). - M2 / S2 / S3: dead code removed (button `states:['idle','loading']`, SemaRuntimeChannelId, SEMA_VALENCED_FAMILY_LIST). Docs: - Motion-as-service reflected across the ecosystem: CLAUDE.md (aliases + arch + service note), arts/README, active_architecture, soma SOMA_ARCHITECTURE, eidos README, eidos-motion.md. - X1: CLAUDE.md "5 canonical channels" (false) -> the single canonical narrative (8 book channels; Sema runs 2 + visual meta-channel, Eidos materializes 5). - X2/X3/X4: sema/README (8 families + intentRequirement/intentGuidance split), types.ts JSDoc (SEMA_INTENT_POLICY -> SEMA_FAMILY_POLICY), engine.ts cascade 6->5, alias table ($frontend out, $lang->$langs, +$clipboard). - E4: codex_audit.md HISTORICO banner. Deferred: SU2 (test-only layering, not a build violation); Words M1/T5/E3 (WIP). Verify: npm run check -> 1 pre-existing error (grafito), 0 new; sema 152/152, contracts 31/32 (1 pre-existing words), carousel 4/4, motion 22/22. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
- `ActiveUix.motion` (`EngineMotion`, `arts/motion`) es el motor de animación,
consumido por Soma (`soma.motion`) y Eidos (`eidos.motion`). Vive en `arts/`,
no en Eidos, para que Soma anime (spring) sin dependencia soma→eidos. En attach
lee `app.motion`.
Orden de retirada:
1. Mantener `assertContract` como validador de data-contract y no como
registry paralelo. `registerContract` queda para tooling/tests directos;
Soma registra contratos via `registerMorfo()`.
2. Recién despues limpiar nombres de props en componentes visuales.
---
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
## 1. La tesis en una frase
> UIX trata un componente como **cuatro capas con contratos explícitos**, no
> como un bloque monolítico que mezcla estructura, comportamiento, semántica
> y presentación.
Las cuatro capas son **Morfo · Soma · Sema · Eidos**. Cada una hace un trabajo
nítido y se comunica con las otras únicamente a través del DOM y de un
contrato declarativo compartido. Ninguna invade a la siguiente.
---
## 2. El problema que resuelve
En la mayoría de frameworks de UI, un componente acumula:
- el **contrato público** del DOM (atributos, parts, ARIA)
- el **comportamiento headless** (estado, teclado, foco, eventos)
- la **semántica** del evento (qué significa "abrir un dialog" más allá del
cambio de un atributo)
- la **capa visual** (CSS, animaciones, theming)
- los **motores modales** (sonido, haptic y reacciones CSS vía eventos DOM)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
- la **integración con servicios de app** (i18n, dates, theme, etc.)
Todo eso vive mezclado. Renombrar una `part` toca seis sitios sin verificación
automática. La semántica de un evento se entierra en strings hardcodeados que
solo el componente conoce. El CSS se acopla a estructura DOM incidental. Los
motores de sonido reescriben mapeos por componente. Cuando quieres cambiar
una decisión transversal — "todos los triggers deben tener un hover dim
común" — tienes que enumerar los 30 componentes que tienen un trigger.
UIX rompe ese bloque en cuatro capas con responsabilidades disjuntas y un
canal de comunicación común: **el DOM con atributos declarados por el
contrato cross-layer**.
---
## 3. Las cuatro capas
### Morfo — el contrato cross-layer
`Morfo` declara la genética del componente: sus partes, los `data-*` que
emite, los ARIA que aporta, los roles, los estados, los eventos semánticos
que puede disparar, y las teclas que dispatcha. Una declaración por
componente, en TypeScript, validada por sium.
Morfo **no ejecuta nada**. Es DNA, no proteína.
```ts
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
// src/uix/morfo/components/dialog.ts (extracto)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
export const dialogMorfo = {
name: 'Dialog',
kebab: 'dialog',
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
scope: ['soma', 'sema'],
docs + switch: align active docs to canon, migrate switch to eidos wrapper Phase 4 (docs alignment with the canonical guide): - active_architecture.md — Dialog example refactored to the new event shape (target inside semantic, explicit verb + sequence). Verbs table grouped by family with the post-canon vocabulary (select/ toggle moved to commit, edit removed from handle, new verbs added). Section 10 (Estado actual) updated to 2026-05-08 with current progress: doctrina cerrada, eidos en producción, SoundChannel eager-init, switch migrated, etc. "Para profundizar" §14 points at the canonical guide. - morfo/README.md — Step 5.5 added covering the doctrinal event shape with all fields (semantic.family, .verb, .target, .sequence, .intent) and the two naming shapes ({verb}-{variant} and {family}-{verb}). - sema/README.md — verbs section restructured to Record-by-family matching the runtime; documents the verbs that moved between families per the canon. Naming shapes section updated with both forms and validateEventName signature. - CLAUDE.md — "Session hand-off" rewritten with the post-canon state. Pointer at GUIA_IMPLEMENTACION_SEMAUIX.md as the canonical source. Pending list refreshed: switch is the immediate next component, persistence/a11ySemantic/polymorphism deferred until real consumers appear. Switch migration to the eidos wrapper pattern: - morfo/components/switch.ts — adds events: [{ commit-toggle }] with the doctrinal shape (verb=toggle, sequence=post, intent fromProp binding to the 4 supported intents). New data-* (data-color with the 6-token Toggle/Switch subset, data-readonly, data-invalid, data-required) and corresponding aria-*. scope expanded to ['soma', 'sema']. - soma/components/switch/types.ts — adds intent, color, readonly, invalid, aria-labelledby props with full JSDoc. Subset constrained per guide §3.1 (Toggle/Switch row). - soma/components/switch/switch-provider.svelte.ts — runtime-direct, Field integration via FieldProvider.get(), isDisabled/isReadonly/ isRequired/isInvalid OR-merge derivations, intent ↔ color resolution (intent wins when evaluative), runtime.trigger( 'commit-toggle') in onclick. - soma/components/switch/components/switch.svelte — wires the new props through bindProps. - eidos/components/switch/{switch.css, switch.svelte, types.ts, index.ts, README.md} — full subdirectory pattern, mirroring toggle. Recipe drops legacy success/warning/danger/info selectors; declares the 6 doctrinal data-color values directly. Wrapper auto-renders Switch.Thumb inside the track and exposes an optional `thumb` snippet for in-thumb glyphs. - eidos/components/switch.css (legacy flat) deleted; eidos/index.css updated to import the subdirectory recipe. - web/routes/switch/+page.svelte — interactive testbed with all soma props as live controls + tabs (Live, Soma, Morfo, Sema, Eidos, Notes). Mirrors toggle's structure. npm run check holds at the 39-error baseline. Tests 217/217 green. Pending: - Migrate collapsible / dialog / drawer / popover / toast / avatar to the eidos wrapper pattern. - Persistence + holds-by-intent — defer until first signal.warn / signal.alert consumer. - a11ySemantic + polymorphic events — defer until concrete need. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
events: [{
name: 'close-cancel',
semantic: {
family: 'emerge',
verb: 'close',
target: v.partRef('content'),
sequence: 'pre'
},
prewrite: [{ part: v.partRef('content'),
attr: 'data-last-action', value: 'cancelled' }],
commits: { part: v.partRef('content'),
attr: 'data-state', value: 'closed' }
}],
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
parts: [
{ name: 'Trigger', kebab: 'trigger', archetype: 'trigger', role: 'button', ... },
{ name: 'Content', kebab: 'content', archetype: 'content', role: 'dialog', ... },
// ...
]
} as const satisfies Morfo
```
Morfo es **el único punto de articulación cross-layer**. Cualquier dato que
las otras capas necesitan compartir entre sí pasa por aquí. Es la regla
estructural más importante: si dos capas necesitan saber lo mismo, ese
"lo mismo" vive en morfo.
### Soma — el comportamiento headless
`Soma` consume morfo y lo transcribe a comportamiento ejecutable. Lee
`morfo.events`, `morfo.keyboard`, `morfo.parts[].data` y `aria`, y los
materializa: dispatcha teclas, aplica atributos al DOM, gestiona estado,
integra con context (Field, Form, Soma).
Soma **no decide visualidad**. No sabe colores. No sabe transiciones. No
sabe sonidos. Solo sabe estados, eventos, foco, teclado y cómo materializar
todo eso en el DOM.
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
La pieza central de soma es `SomaRuntime`: un intérprete del morfo que
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
recibe del provider las fuentes reactivas (states, props, parts, events,
actions) y se encarga de:
- emitir los attrs estáticos (`partProps`)
- aplicar los attrs derivados de state via `dom.apply` (effects)
- dispatchear teclas via `keydown(part, event)`
- ejecutar eventos via `trigger(eventName)` con la cadena perceptiva
completa
El provider aporta **lo que morfo no puede inferir**: getters reactivos
sobre el estado interno, handlers concretos, glue de layers ortogonales
(Presence, Dismissal, ScrollLock).
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
### Sema — vocabulario + canales perceptivos
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
`Sema` define el vocabulario canónico del framework y orquesta el
**dispatch de señales perceptivas** a un conjunto de canales modulares.
Vocabulario canónico (`SEMA_MAP` en `src/uix/sema/sema-map.ts`):
- **8 familias** — `contact`, `commit`, `signal`, `handle`, `emerge`,
`shift`, `sustain`, `delegate`. Cada una declara `hold`, base para canales
reales (`sound`, `haptic`) y el set de canales activos.
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
- **6 intents** — `neutral`, `affirm`, `fulfill`, `risk`, `threat`,
`loss`. Cada intent declara `deltas` per canal que se aplican sobre
el base familiar cuando la familia es valenced.
- **Action verbs** (`SEMA_VERBS` en `src/uix/sema/verbs.ts`) —
`present`, `dismiss`, `commit`, `cancel`, `announce`, `warn`, … —
son los nombres canónicos de los `morfo.events[].name`.
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
Sema **no decide qué evento ocurrió** — eso lo decide el provider. El
`EngineSemantic` solo:
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
- mantiene un registry de canales que implementan `Channel`
- genera el `id` de cada ocurrencia
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
- resuelve la `EffectiveSignature` per canal (base × intent deltas)
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
- despacha cada signal a todos los canales registrados
- bloquea al caller solo el tiempo que el canal visual necesite
```
src/uix/sema/
├── engine.ts registry + channel prepare/dispatch
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
├── resolver.ts resolveSignature(signal): EffectiveSignature
├── sema-map.ts tabla per-family base + per-intent deltas (typed)
├── verbs.ts SEMA_VERBS catalog
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
└── chans/
├── types.ts interfaz Channel
├── visual.ts VisualChannel (built-in, data-event projection + hold)
├── sound.ts SoundChannel (Web Audio, prepare-time priming)
└── haptic.ts HapticChannel
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
```
El **canal visual** (built-in) es el único que comparte plano DOM con el
commit estructural posterior, y por tanto el único que bloquea al caller.
`EngineSemantic` ejecuta hooks genéricos de canales; el
`VisualChannel.prepare()` proyecta `data-event` + `data-event-id` +
`data-event-phase` (y opcionalmente `data-event-family` y
`data-event-intent`) al target mediante un `SignalProjector`. En
`ActiveUix` ese proyector recibe `uix.dom`, por lo que la escritura de attrs
entra por el mismo dueño DOM que usa soma. `VisualChannel` mantiene el
`hold` configurable y el cleanup retira la proyección antes de resolver la
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Promise (semántica secuencial estricta).
> **Namespace discipline**: la proyección semántica escribe **solo**
> atributos bajo el prefijo `data-event-*`. Nunca toca `data-state`,
> `data-intent`,
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
> `data-disabled` u otros state attrs — esos pertenecen al runtime/morfo.
> Eidos lee `data-event-intent` para reacciones a la señal transitoria
> y `data-intent` (cuando lo emita el morfo) para el estado persistente.
Los hold defaults internos al canal visual vienen de
`SEMA_MAP.families[*].hold` y se resuelven sobre la escala perceptiva
`SEMA_DURATIONS`: `glimpse`, `brief`, `noticed`, etc. El integrador puede
sobreescribir per signal (`signal.hold`) o globalmente vía
`new EngineSemantic({ dom, visual: { defaultHold } })`.
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
El **SoundChannel** está implementado: sintetiza earcons cortos vía
Web Audio (dos osciladores → biquad lowpass → envelope ADSR-lite,
parametrizado por `effective.sound.{pitch, centroid, gain, contour,
roughness, duration}`). Hace **prepare-time priming**: crea + resume el
`AudioContext` en el `prepare()` de una señal sonora, síncronamente dentro
del gesto de usuario. Solo despues registra el listener capture-phase en
`document` para re-resume posteriores. Es opt-in:
`new EngineSemantic({ sound: true })`.
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Las firmas sonoras reutilizables viven en `src/uix/sema/sounds.ts`.
Los packs de componente referencian nombres (`sound('handle.pickup.air')`,
`sound('notification.ping')`) o recetas dinámicas, no constantes sueltas.
Una entrada del repositorio puede ser sintética o un `.wav` externo con
fallback sintético; `SoundChannel` reproduce `sampleUrl` y cae a síntesis si
fetch/decode falla.
El **HapticChannel** sigue como canal opt-in; el registry ya lo
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
acepta para que cuando se implemente encaje sin cambios estructurales.
Cualquier canal no-visual es fire-and-forget: gestiona su propio
timing en su plano sin afectar al caller.
### Eidos — la capa visual
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
`Eidos` es la capa visual. Su acceso al sistema es **el DOM**: lee
parts, data-attrs, ARIA, archetypes y event signals que las otras
capas escriben. No importa internals de soma; no pregunta a sema.
sema: refactor into channel modules — engine becomes registry + dispatch Reorganización estructural según el spec acordado: cada canal perceptivo vive como módulo simétrico dentro de `chans/`. El engine queda mínimo (registry + dispatch); la lógica de escribir `data-event*` al DOM, mantener hold y retirar pasa al `VisualChannel`. La API pública que ven los providers (`semantic.emit(signal)`) se mantiene idéntica. Estructura nueva src/uix/sema/ ├── engine.ts registry + dispatch (ya no conoce DOM ni hold) ├── signal.ts SemanticSignal + nuevo campo opcional `id?` ├── exports.ts barrel actualizado (chans + drop publish + drop perception) └── chans/ ├── types.ts interfaz Channel { id, handle, dispose? } ├── visual.ts VisualChannel — escribe data-event*, hold, cleanup ├── visual.test.ts 9 tests del canal aislado ├── sound.ts SoundChannel placeholder (V1 no-op) └── vibra.ts VibraChannel placeholder (V1 no-op) Cambios al engine - Constructor: `new SemanticEngine(opts?)`. `opts.visual` controla el built-in (false / VisualChannelOptions / Channel custom). `opts.dom` desaparece — ya no es responsabilidad del engine. - Métodos: `register(channel)`, `getChannel(id)`, `emit(signal)`, `destroy()`. Nada más. - emit despacha a TODOS los canales registrados: - Canales no-visuales (sound, vibra, futuros): fire-and-forget. Errores se loguean pero no propagan (Sema es ornamental). - Canal visual: el único cuya Promise se awaitea — comparte plano DOM con el commit estructural posterior. - emit genera el `id` de la ocurrencia y lo pasa a todos los canales, garantizando coherencia cross-canal para tooling futuro. Cambios al VisualChannel (lógica heredada del emit() anterior) - 5 atributos: `data-event` + `data-event-id` + `data-event-phase` (siempre) + `data-event-family` y `data-intent` (opcionales si vienen en el signal). Los opcionales son la proyección al DOM de la metadata semántica que Eidos consume. - Hold defaults internos por familia (no exportados): emerge/commit/handle: 240ms · alert/sustain: 600ms · contact: 120ms Justificación técnica (rangos típicos de CSS transitions), no escala perceptiva universal. Override per signal vía `signal.hold` o global vía `new SemanticEngine({ visual: { defaultHold } })`. - Semántica secuencial estricta: cleanup ANTES del resolve. Eliminado - `src/uix/sema/perception.ts` — escalas perceptivas no son concepto cross-canal. La tabla de defaults por familia se movió al VisualChannel como detalle interno con justificación técnica. - `engine.publish()` y todo el sistema legacy: - `SemanticEventDecl`, `SemanticComponentContract`, `SemanticPublishContext`, `PublishedSemanticEvent`, `SemanticEventFilter` - `onEvent()` y subscribers - `applyPrewrites()` interno - dependencia opcional de `ActiveDom` por construcción - Tests de `publish()` reemplazados por tests del nuevo registry/dispatch. Bootstrap (App + defaults) - `src/lib/ext/app/app.svelte.ts:52` — `new SemanticEngine({ dom: this.dom })` → `new SemanticEngine()` - `src/lib/ext/app/defaults.ts:45` — mismo cambio Tests - emit.test.ts ajustado: sin createActiveDom, sin SEMA_PERCEPTION/HOLD_DEFAULTS, test "throws without dom" eliminado, números literales (240, 600). Añadido test "resolves immediately when visual: false". 7 tests. - engine.test.ts reescrito: register / getChannel / emit dispatch a múltiples canales / id propagation / id override / fire-and-forget para non-visual / error en canal no aborta dispatch / visual: false desactiva built-in / custom Channel reemplaza built-in / destroy. 13 tests. - chans/visual.test.ts nuevo: 5 attrs vs 3 / signal.hold respetado / family default fallback / global default fallback / constructor defaultHold / cleanup / sequential strict (resolve tras cleanup) / id field. 9 tests. - 39 tests sema verdes en total. Documentación - src/uix/sema/README.md — reescrito alrededor del modelo de canales - src/uix/eidos/events.css — comentario actualizado, referencia a chans/visual.ts - src/uix/active_architecture.md — sección Sema reescrita Componentes NO requieren cambios — la API `semantic.emit(signal)` es idéntica externamente. Toast / runtime.trigger / providers funcionan igual. Verificación - 121/121 tests focused suite (sema 39 + adom + lib/dom + morfo + soma/morfo) - 66/66 morfo-check - 68/68 smoke routes - svelte-check: 155 errors (baseline, sin nuevos) Pendientes en doc del spec marcados como "no-objetivos": - Implementación real de SoundChannel / VibraChannel (placeholders V1) - Arbitraje propio del VisualChannel (deuda heredada del emit anterior) - Cancelación si el target se desconecta durante el hold
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Eidos **no es solo CSS**. Cubre lo que en la rama muerta `air/` era el
"runtime visual" más el sistema de tokens — sin heredar código. Su
estructura actual:
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
```
src/uix/eidos/
├── active-eidos.svelte.ts ActiveEidos: runtime/contexto visual creado por ActiveEidos.create
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
├── archetypes.css reglas comunes a [data-archetype=*]
├── events.css reacciones a [data-event-*] (sema visual)
├── generated/base.css foundation CSS generado desde EidosConfig base
├── themes/fonts.css font faces usados por el base generado
├── lib/ soporte de config, recipes, contrato CSS y tipos compartidos
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
└── components/{x}/ recipe + wrapper Svelte + tipos por componente
├── {x}.css recipe (selectores [data-{x}], variants)
├── {x}.svelte wrapper sobre el provider headless de soma
├── types.ts Props visuales + props publicas de soma
└── index.ts default root + partes attached
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
```
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
`ActiveEidos` es la fuente de verdad nueva del theming: primitivas
(color + alpha scales, size map, espacios, control height, radius, borde,
opacidad, z-index, focus ring, layout, tipografia, shadow, motion, icon), roles
semanticos y themes. Tambien resuelve el theme activo desde sus fuentes
visuales (`theme`, `modeSource`, `densitySource` o defaults) e inyecta CSS runtime
cuando la app no lo precompila. Los themes externos pueden venir solo por CSS
si respetan el contrato de custom properties (`themeSource: 'auto' | 'config' | 'css'`);
`getCssContract()` publica ese contrato como datos typed y
`renderContractCss()` lo materializa como CSS vacío desde la config.
Los aliases de recipe por componente (`--toast-*`, `--dialog-*`, etc.) viven en
`EidosConfig.recipes` y se generan dentro de `generated/base.css`; las recipes
CSS permanecen como selectores/estados, no como fuente paralela de tokens.
`ActiveEidos.listRecipes()` y `getRecipeTokens(component)` son la superficie
de consulta para editores de theme; devuelven nombres y copias defensivas,
no handles mutables al config interno.
`ActiveEidos` tambien puede escribir variables runtime en un style block
propio, validandolas contra el contrato para que un editor de theme no tenga
que mutar CSS a mano variable por variable. La persistencia de configuracion
completa usa `EidosConfigDocument` (`kind + version + options`), de modo que
`EidosConfig` queda como objeto puro de authoring y el versionado vive
en el borde de almacenamiento/intercambio.
`ActiveEidos` es tambien el contexto que consumen los wrappers Svelte:
`ActiveEidos.require()` expone solo la superficie visual (`dom`,
`langs`, `format`, `prefs` y helpers como `resolve(...)`, `breakpoint(...)` e
`isBelow(...)`). Los wrappers no importan `getActiveUix()` directamente.
El wrapper Svelte publico sigue la opcion C disciplinada: un root visual
`<Drawer>` / `<Tabs>` / `<Checkbox>` y partes attached
`<Drawer.Trigger>`, `<Drawer.Content>`, etc. No hay `Provider` publico y
no hay API flat con snippets como forma principal.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Reglas de selección (eidos lee, no escribe):
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
```css
/* Estilo común a todos los triggers, independiente del componente */
[data-archetype='trigger'] {
cursor: pointer;
}
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
/* Tinta exit anim según la causa (saved/cancelled/dismissed) */
[data-state='closed'][data-last-action='cancelled'] {
animation: ...;
}
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
/* Reacción a una señal perceptiva durante el hold (200–260ms según familia) */
[data-event-family='commit'][data-event-phase='active'] {
animation: eidos-commit-settle 260ms var(--ease-out);
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
/* Variante por intent transitorio (de la señal, no del estado) */
[data-event-family='commit'][data-event-intent='threat'][data-event-phase='active'] {
animation: eidos-announce-pulse-threat 400ms var(--ease-spring);
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
}
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
```
El DOM es el canal entre events/sema y eidos. El `VisualChannel` proyecta la
ocurrencia mediante `SignalProjector` + `ActiveDom`; Eidos reacciona.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
---
## 3.bis ActiveUix sin `frontend` (cerrado)
`frontend` ya no existe como artefacto activo. La fuente transversal de
preferencias es `ActivePrefs`, siguiendo el mismo patron que usa `ActiveApp`;
la proyeccion DOM es explicita y vive fuera de `ActiveUix`.
La particion actual:
- `uix.langs` — idioma y traducciones; se sincroniza desde `prefs.language`.
- `uix.format` — formatos regionales; consume `prefs.locale` como
`LocaleSource`.
- `uix.clipboard` — capacidad de escritura al portapapeles; en standalone se
crea salvo `clipboard:false`, en attach se consume de `app.clipboard` cuando
un componente lo pide.
- `uix.dom` — unico escritor de attrs globales mediante `dom.apply`.
fix: address architectural audit findings + sync ecosystem docs Audit: src/audit-opus-4-6-26.md. All non-words findings remediated. Code: - E1: navigation-menu indicator data-state visible -> open (render bug; the active underline was permanently invisible). Clears the only invalid lint selector. - SO1 + E2: raw `new ResizeObserver` -> ActiveDom.observeResize in carousel-provider and the canvas-text useContainerWidth hook (+ s-text / s-text-virtual-list pass eidos.dom). iframe/popup-safe, lifecycle-tracked. - A1: defineUixServices now registers `motion`, so attach-mode app.motion is real and the active-uix fallback becomes the true edge case (test guard updated). - A2/A4: contracts.ts pins `motion` + `announce` in ActiveUixServiceContract + publicSurface; dispose() comment corrected. - SO2: carousel drops the hardcoded `transform 300ms ease-out` (the recipe already handles it via [data-dragging]); also fixed the recipe's undefined `--duration-base` token -> `--duration-slow` (it was masked by the inline). - S1: HapticChannel reduced-motion via an injected ActiveDom port (mirrors SoundChannelDom) instead of global matchMedia. - T1: 10 sites repointed `$libs/dom` -> `$adom` (sema x5 + its tests x3, active-uix value import, arts/prefs). - M2 / S2 / S3: dead code removed (button `states:['idle','loading']`, SemaRuntimeChannelId, SEMA_VALENCED_FAMILY_LIST). Docs: - Motion-as-service reflected across the ecosystem: CLAUDE.md (aliases + arch + service note), arts/README, active_architecture, soma SOMA_ARCHITECTURE, eidos README, eidos-motion.md. - X1: CLAUDE.md "5 canonical channels" (false) -> the single canonical narrative (8 book channels; Sema runs 2 + visual meta-channel, Eidos materializes 5). - X2/X3/X4: sema/README (8 families + intentRequirement/intentGuidance split), types.ts JSDoc (SEMA_INTENT_POLICY -> SEMA_FAMILY_POLICY), engine.ts cascade 6->5, alias table ($frontend out, $lang->$langs, +$clipboard). - E4: codex_audit.md HISTORICO banner. Deferred: SU2 (test-only layering, not a build violation); Words M1/T5/E3 (WIP). Verify: npm run check -> 1 pre-existing error (grafito), 0 new; sema 152/152, contracts 31/32 (1 pre-existing words), carousel 4/4, motion 22/22. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4 months ago
- `uix.motion` — motor de animación (`EngineMotion`, `arts/motion`): registra +
corre presets del momento `--state` (CSS settle / drivers JS spring/waapi/rect).
Lo consumen Soma (`Presence` vía `soma.motion`) y Eidos (`eidos.motion`: genera
CSS + registra sus presets). En standalone se crea con el `dom` disponible; en
attach lee `app.motion`.
- `uix.prefs` — preferencias efectivas transversales: `language`, `locale`,
`direction`, `motion`, `sound`, `haptic`, etc.
- `uix.portal` — target generico de portales; capas como Soma lo adaptan a
su API (`portalTo`) sin que `ActiveUix` conozca esas capas.
Eidos queda fuera de la superficie de `ActiveUix`: `ActiveEidos.create(...)`
crea el contexto visual y, si se necesita CSS runtime, usa `uix.dom`,
`uix.langs`, `uix.format` y fuentes explicitas de `mode`/`density` cuando el
integrador no quiera los defaults.
`prefs.direction` es la unica fuente de direccion efectiva. Si el usuario no
ha fijado intent, deriva desde `prefs.language`; si llama a
`prefs.direction.set('rtl')`, ese override manda; si llama a
`prefs.direction.clear()`, vuelve a derivar. El atributo `html[dir]` es solo
la proyeccion DOM de ese valor efectivo.
La proyeccion DOM queda separada por ownership:
```text
ActivePrefsDomProjection -> dir, data-motion, data-sound, data-haptic
ActiveEidos -> data-theme, data-mode, data-density
```
En modo standalone, `createActiveUix()` instancia `ActivePrefs` con el preset
estandar de UIX y crea los servicios configurados. En modo attach,
`attachActiveUix(app)` reutiliza `app.prefs` porque `prefs` pertenece al core
de `ActiveApp`. `langs` y `dom` son los servicios requeridos para attach:
si faltan, `attachActiveUix(app)` falla temprano. `clipboard`, `events` y
`format` son opcionales; si una capa los necesita y no fueron declarados en la
app, el getter de `ActiveUix` falla explicitamente.
`ActiveUix` no auto-proyecta preferencias al DOM. La proyeccion cross-modal
existe en `arts/prefs` como `createActivePrefsDomProjection(...)`; la cablea
el composition root que quiera esos atributos globales. Esto permite usar
`ActiveApp` sin UIX, UIX sin Eidos, o Eidos con CSS precompilado sin crear
proyectores duplicados.
Cuando una shell UIX quiere modo visual runtime, el flujo canonico es:
```ts
const prefsProjection = createActivePrefsDomProjection({ prefs: uix.prefs, dom: uix.dom });
const eidos = ActiveEidos.create({
theme: 'base',
modeSource,
applyDom: true
});
```
`prefsProjection` y `eidos` se disponen con la shell. El modo claro/oscuro no
se escribe en `prefs.theme`; se pasa a `ActiveEidos` como fuente visual.
---
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
## 4. Cómo se articulan — la cadena de transcripción
Las cuatro capas forman una cadena de transcripción declarativa donde cada
una traduce el contrato de la anterior a su lenguaje:
```
Morfo declara (TypeScript constant + sium schema)
↓
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
SomaRuntime transcribe (Soma — leyendo morfo + sources)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
↓
Provider aporta sources/handlers (Soma — TypeScript class)
↓
Effects sincronizan attrs (Soma — $effect + dom.apply)
↓
EngineSemantic despacha señales (Sema — registry + prepare/dispatch)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
↓
VisualChannel prepara data-event* (Sema — via SignalProjector/uix.dom)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
↓
Eidos lee el DOM y aplica CSS (Eidos — selectores + tokens)
```
Más, en paralelo (no en cadena):
- **ADom** materializa los `dom.apply`/`dom.remove` que Soma le pide para
los attrs estructurales derivados (data-state, aria-\*, etc.).
- **Canales no visuales de Sema** (sound, haptic, futuros) reciben la misma
señal y la materializan en su modalidad — fire-and-forget.
Las piezas con responsabilidades disjuntas:
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
| Pieza | Responsabilidad | No hace |
| ------------------- | ---------------------------------------------------- | ------------------------------------- |
| **Morfo** | Declarar el contrato | Ejecutar nada |
| **SomaRuntime** | Transcribir morfo a comportamiento | Decidir lógica de negocio |
| **Provider** | Aportar fuentes reactivas + handlers | Escribir attrs mutables al DOM |
| **Effects** | Aplicar attrs derivados via `dom.apply` | Decidir qué attrs (eso lo dice morfo) |
| **EngineSemantic** | Registry de canales + prepare/dispatch | Conocer DOM, audio, vibración |
| **VisualChannel** | Proyectar `data-event*` via projector + hold awaited | Escribir attrs estructurales |
| **SignalProjector** | Proyectar `data-event*` via `dom.apply` | Decidir cuándo emitir |
| **ADom** | Mutaciones DOM imperativas para attrs estructurales | Conocer las capas superiores |
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
`Eidos` queda fuera de esa cadena: lee del DOM, no participa en la
transcripción.
---
## 5. La cadena causal de una interacción
Ejemplo concreto: el usuario clickea el botón **×** de un Toast.
```
1. Browser dispara click → Svelte llama Close.onclick
2. Close.onclick ejecuta:
void this.toastItem.runtime.trigger('dismiss')
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
3. SomaRuntime.trigger('dismiss'):
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
3.1. Busca event 'dismiss' en morfo.events ✓
3.2. Resuelve target = Item DOM element via partRef('item')
3.3. AWAIT events.emit({ target, name: 'dismiss', family: 'emerge' })
EngineSemantic despacha la señal a TODOS los canales registrados:
- VisualChannel.prepare(): SignalProjector aplica data-event*
via dom.apply(target, data-event-family=emerge)
- VisualChannel.handle(): mantiene el hold (240ms para emerge)
- cleanup: dom.apply(target, data-event*=undefined)
- SoundChannel, HapticChannel: fire-and-forget (no awaited)
La Promise resuelve cuando el VisualChannel ha terminado el cleanup
(semántica secuencial estricta)
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
4. SomaRuntime invoca el handler del provider:
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
sources.events.dismiss() →
this.provider.toaster.dismiss(opts.toast.current.id) →
toast.dismissing = true (state mutation)
5. EFFECTS reactivos del runtime ven que isOpen cambió:
resolvePartAttrs recomputa los attrs del item part
dom.apply(target, { 'data-state': 'closed' }) en el siguiente tick
6. Eidos (CSS) ha reaccionado durante toda la secuencia:
- durante t=0..240ms: [data-event^="dismiss"] dispara animation @keyframes
fade-out (CSS animation, no transition: corre full-duration aunque el
attr desaparezca después)
- en t≈245ms: [data-state="closed"] toma el relevo
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
- Presence layer aplica data-ending-style; CSS termina la animación
```
State es la única fuente de verdad. El DOM es derivación. La señal
perceptiva PRECEDE al cambio estructural por el hold completo (~240ms para
emerge) — el caller espera el cleanup antes de mutar estado, dándole a CSS
una ventana perceptible para coreografiar la salida.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
---
## 6. Las primitivas que pasan entre capas
### Atributos DOM — el canal universal
Todo lo que pasa entre capas pasa por atributos DOM:
| Atributo | Quién escribe | Quién lee |
| ------------------------------------------- | -------------------------------------- | ---------------------------- |
| `data-{component}` | partProps (estático) | Eidos (selector raíz) |
| `data-{component}-{part}` | partProps (estático) | Eidos (selector parte) |
| `data-archetype="trigger"` | partProps (estático) | Eidos (selector transversal) |
| `id` | partProps | ARIA refs, tests |
| `role` | dom.apply (effect) | Lectores de pantalla, Eidos |
| `aria-*` | dom.apply (effect) | Lectores de pantalla, Eidos |
| `data-state="open"` | dom.apply (effect) | Eidos (selector variant) |
| `data-disabled` | dom.apply (effect) | Eidos (selector estado) |
| `data-event="dismiss"` | sema.emit (transient) | Eidos (selector evento) |
| `data-event-phase="active"` | sema.emit (transient) | Eidos |
| `data-event-id="sig-N"` | sema.emit (transient) | Sound/Haptic futuros |
| `data-event-family="commit"` | sema.emit (transient) | Eidos (selector familia) |
| `data-event-intent="risk"` | sema.emit (transient) | Eidos (tinta de la señal) |
| `data-color="primary"` | dom.apply (effect) | Eidos (recipe per token) |
| `data-intent="risk"` | dom.apply (effect, opcional per morfo) | Eidos (estado persistente) |
| `data-last-action="cancelled"` | trigger prewrite | Eidos (tinta exit) |
| `data-starting-style` / `data-ending-style` | Presence layer | Eidos (animation hooks) |
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
**Regla operativa**: lo que `dom.apply` escribe, Svelte no lo renderiza. La
identidad estática (id + marker + archetype + ref attachment) ship via
`partProps`. Lo derivado de state ship via `dom.apply` desde effects. No
hay double-write.
### Vocabularies cross-layer
> **Canonical:** the semantic vocabulary (families, intents, verbs) lives in
> [`docs/CANON.md`](../../docs/CANON.md). The summary below is for the cross-layer
> view; the canon + code are authoritative.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
Dos vocabulary estables anclan la articulación:
**Archetypes** (`src/uix/morfo/types.ts:ARCHETYPE_VOCABULARY`):
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
```
provider · trigger · content · overlay · viewport
item · option · indicator · thumb · track
label · title · description · close · action
header · image · fallback · arrow · separator
group · input · segment · preview
```
24 categorías de parte que aparecen en múltiples componentes. Una `Trigger`
de Dialog, Popover, DropdownMenu y Tooltip son la misma categoría — Eidos
las puede estilar transversalmente con `[data-archetype=trigger]`.
**Verbs** (`src/uix/sema/verbs.ts:SEMA_VERBS`), agrupados por familia:
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
```
docs + switch: align active docs to canon, migrate switch to eidos wrapper Phase 4 (docs alignment with the canonical guide): - active_architecture.md — Dialog example refactored to the new event shape (target inside semantic, explicit verb + sequence). Verbs table grouped by family with the post-canon vocabulary (select/ toggle moved to commit, edit removed from handle, new verbs added). Section 10 (Estado actual) updated to 2026-05-08 with current progress: doctrina cerrada, eidos en producción, SoundChannel eager-init, switch migrated, etc. "Para profundizar" §14 points at the canonical guide. - morfo/README.md — Step 5.5 added covering the doctrinal event shape with all fields (semantic.family, .verb, .target, .sequence, .intent) and the two naming shapes ({verb}-{variant} and {family}-{verb}). - sema/README.md — verbs section restructured to Record-by-family matching the runtime; documents the verbs that moved between families per the canon. Naming shapes section updated with both forms and validateEventName signature. - CLAUDE.md — "Session hand-off" rewritten with the post-canon state. Pointer at GUIA_IMPLEMENTACION_SEMAUIX.md as the canonical source. Pending list refreshed: switch is the immediate next component, persistence/a11ySemantic/polymorphism deferred until real consumers appear. Switch migration to the eidos wrapper pattern: - morfo/components/switch.ts — adds events: [{ commit-toggle }] with the doctrinal shape (verb=toggle, sequence=post, intent fromProp binding to the 4 supported intents). New data-* (data-color with the 6-token Toggle/Switch subset, data-readonly, data-invalid, data-required) and corresponding aria-*. scope expanded to ['soma', 'sema']. - soma/components/switch/types.ts — adds intent, color, readonly, invalid, aria-labelledby props with full JSDoc. Subset constrained per guide §3.1 (Toggle/Switch row). - soma/components/switch/switch-provider.svelte.ts — runtime-direct, Field integration via FieldProvider.get(), isDisabled/isReadonly/ isRequired/isInvalid OR-merge derivations, intent ↔ color resolution (intent wins when evaluative), runtime.trigger( 'commit-toggle') in onclick. - soma/components/switch/components/switch.svelte — wires the new props through bindProps. - eidos/components/switch/{switch.css, switch.svelte, types.ts, index.ts, README.md} — full subdirectory pattern, mirroring toggle. Recipe drops legacy success/warning/danger/info selectors; declares the 6 doctrinal data-color values directly. Wrapper auto-renders Switch.Thumb inside the track and exposes an optional `thumb` snippet for in-thumb glyphs. - eidos/components/switch.css (legacy flat) deleted; eidos/index.css updated to import the subdirectory recipe. - web/routes/switch/+page.svelte — interactive testbed with all soma props as live controls + tabs (Live, Soma, Morfo, Sema, Eidos, Notes). Mirrors toggle's structure. npm run check holds at the 39-error baseline. Tests 217/217 green. Pending: - Migrate collapsible / dialog / drawer / popover / toast / avatar to the eidos wrapper pattern. - Persistence + holds-by-intent — defer until first signal.warn / signal.alert consumer. - a11ySemantic + polymorphic events — defer until concrete need. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
contact: press · tap · activate · focus · trigger · release
commit: select · unselect · toggle · save · submit · confirm · complete ·
fail · cancel · reset · discard · delete · restore · expire ·
acknowledge · apply · partial · block · move · set · remove ·
reorder · upload
signal: announce · notify · warn · alert · inform · emphasize · remind
handle: pick · carry · drop · drag · resize · reorder · rotate · scroll · zoom
docs + switch: align active docs to canon, migrate switch to eidos wrapper Phase 4 (docs alignment with the canonical guide): - active_architecture.md — Dialog example refactored to the new event shape (target inside semantic, explicit verb + sequence). Verbs table grouped by family with the post-canon vocabulary (select/ toggle moved to commit, edit removed from handle, new verbs added). Section 10 (Estado actual) updated to 2026-05-08 with current progress: doctrina cerrada, eidos en producción, SoundChannel eager-init, switch migrated, etc. "Para profundizar" §14 points at the canonical guide. - morfo/README.md — Step 5.5 added covering the doctrinal event shape with all fields (semantic.family, .verb, .target, .sequence, .intent) and the two naming shapes ({verb}-{variant} and {family}-{verb}). - sema/README.md — verbs section restructured to Record-by-family matching the runtime; documents the verbs that moved between families per the canon. Naming shapes section updated with both forms and validateEventName signature. - CLAUDE.md — "Session hand-off" rewritten with the post-canon state. Pointer at GUIA_IMPLEMENTACION_SEMAUIX.md as the canonical source. Pending list refreshed: switch is the immediate next component, persistence/a11ySemantic/polymorphism deferred until real consumers appear. Switch migration to the eidos wrapper pattern: - morfo/components/switch.ts — adds events: [{ commit-toggle }] with the doctrinal shape (verb=toggle, sequence=post, intent fromProp binding to the 4 supported intents). New data-* (data-color with the 6-token Toggle/Switch subset, data-readonly, data-invalid, data-required) and corresponding aria-*. scope expanded to ['soma', 'sema']. - soma/components/switch/types.ts — adds intent, color, readonly, invalid, aria-labelledby props with full JSDoc. Subset constrained per guide §3.1 (Toggle/Switch row). - soma/components/switch/switch-provider.svelte.ts — runtime-direct, Field integration via FieldProvider.get(), isDisabled/isReadonly/ isRequired/isInvalid OR-merge derivations, intent ↔ color resolution (intent wins when evaluative), runtime.trigger( 'commit-toggle') in onclick. - soma/components/switch/components/switch.svelte — wires the new props through bindProps. - eidos/components/switch/{switch.css, switch.svelte, types.ts, index.ts, README.md} — full subdirectory pattern, mirroring toggle. Recipe drops legacy success/warning/danger/info selectors; declares the 6 doctrinal data-color values directly. Wrapper auto-renders Switch.Thumb inside the track and exposes an optional `thumb` snippet for in-thumb glyphs. - eidos/components/switch.css (legacy flat) deleted; eidos/index.css updated to import the subdirectory recipe. - web/routes/switch/+page.svelte — interactive testbed with all soma props as live controls + tabs (Live, Soma, Morfo, Sema, Eidos, Notes). Mirrors toggle's structure. npm run check holds at the 39-error baseline. Tests 217/217 green. Pending: - Migrate collapsible / dialog / drawer / popover / toast / avatar to the eidos wrapper pattern. - Persistence + holds-by-intent — defer until first signal.warn / signal.alert consumer. - a11ySemantic + polymorphic events — defer until concrete need. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
emerge: present · dismiss · open · close · expand · collapse · reveal · hide
shift: enter-mode · exit-mode · navigate · route · step · return · context
sustain: start · progress · loading · waiting · syncing · processing ·
streaming · pending · retrying · upload · end
delegate: offer · plan · authorize · act · review · escalate · return
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
```
docs + switch: align active docs to canon, migrate switch to eidos wrapper Phase 4 (docs alignment with the canonical guide): - active_architecture.md — Dialog example refactored to the new event shape (target inside semantic, explicit verb + sequence). Verbs table grouped by family with the post-canon vocabulary (select/ toggle moved to commit, edit removed from handle, new verbs added). Section 10 (Estado actual) updated to 2026-05-08 with current progress: doctrina cerrada, eidos en producción, SoundChannel eager-init, switch migrated, etc. "Para profundizar" §14 points at the canonical guide. - morfo/README.md — Step 5.5 added covering the doctrinal event shape with all fields (semantic.family, .verb, .target, .sequence, .intent) and the two naming shapes ({verb}-{variant} and {family}-{verb}). - sema/README.md — verbs section restructured to Record-by-family matching the runtime; documents the verbs that moved between families per the canon. Naming shapes section updated with both forms and validateEventName signature. - CLAUDE.md — "Session hand-off" rewritten with the post-canon state. Pointer at GUIA_IMPLEMENTACION_SEMAUIX.md as the canonical source. Pending list refreshed: switch is the immediate next component, persistence/a11ySemantic/polymorphism deferred until real consumers appear. Switch migration to the eidos wrapper pattern: - morfo/components/switch.ts — adds events: [{ commit-toggle }] with the doctrinal shape (verb=toggle, sequence=post, intent fromProp binding to the 4 supported intents). New data-* (data-color with the 6-token Toggle/Switch subset, data-readonly, data-invalid, data-required) and corresponding aria-*. scope expanded to ['soma', 'sema']. - soma/components/switch/types.ts — adds intent, color, readonly, invalid, aria-labelledby props with full JSDoc. Subset constrained per guide §3.1 (Toggle/Switch row). - soma/components/switch/switch-provider.svelte.ts — runtime-direct, Field integration via FieldProvider.get(), isDisabled/isReadonly/ isRequired/isInvalid OR-merge derivations, intent ↔ color resolution (intent wins when evaluative), runtime.trigger( 'commit-toggle') in onclick. - soma/components/switch/components/switch.svelte — wires the new props through bindProps. - eidos/components/switch/{switch.css, switch.svelte, types.ts, index.ts, README.md} — full subdirectory pattern, mirroring toggle. Recipe drops legacy success/warning/danger/info selectors; declares the 6 doctrinal data-color values directly. Wrapper auto-renders Switch.Thumb inside the track and exposes an optional `thumb` snippet for in-thumb glyphs. - eidos/components/switch.css (legacy flat) deleted; eidos/index.css updated to import the subdirectory recipe. - web/routes/switch/+page.svelte — interactive testbed with all soma props as live controls + tabs (Live, Soma, Morfo, Sema, Eidos, Notes). Mirrors toggle's structure. npm run check holds at the 39-error baseline. Tests 217/217 green. Pending: - Migrate collapsible / dialog / drawer / popover / toast / avatar to the eidos wrapper pattern. - Persistence + holds-by-intent — defer until first signal.warn / signal.alert consumer. - a11ySemantic + polymorphic events — defer until concrete need. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Verbs que parecen de una familia pero son de otra per la canon:
**select / toggle / acknowledge** son `commit` (fijan estado, no son
solo contacto); **edit** es `shift.enter-mode` (cambia régimen).
`morfo.events[].name` debería alinear con este vocabulario en una de
dos formas: `{verb}-{variant}` (`dismiss-outside`, `close-cancel`) o
`{family}-{verb}` (`commit-toggle`, `commit-save`). Permite a Sema/
Sound/Haptic/Eidos suscribir o estilar por verb o por familia sin
docs + switch: align active docs to canon, migrate switch to eidos wrapper Phase 4 (docs alignment with the canonical guide): - active_architecture.md — Dialog example refactored to the new event shape (target inside semantic, explicit verb + sequence). Verbs table grouped by family with the post-canon vocabulary (select/ toggle moved to commit, edit removed from handle, new verbs added). Section 10 (Estado actual) updated to 2026-05-08 with current progress: doctrina cerrada, eidos en producción, SoundChannel eager-init, switch migrated, etc. "Para profundizar" §14 points at the canonical guide. - morfo/README.md — Step 5.5 added covering the doctrinal event shape with all fields (semantic.family, .verb, .target, .sequence, .intent) and the two naming shapes ({verb}-{variant} and {family}-{verb}). - sema/README.md — verbs section restructured to Record-by-family matching the runtime; documents the verbs that moved between families per the canon. Naming shapes section updated with both forms and validateEventName signature. - CLAUDE.md — "Session hand-off" rewritten with the post-canon state. Pointer at GUIA_IMPLEMENTACION_SEMAUIX.md as the canonical source. Pending list refreshed: switch is the immediate next component, persistence/a11ySemantic/polymorphism deferred until real consumers appear. Switch migration to the eidos wrapper pattern: - morfo/components/switch.ts — adds events: [{ commit-toggle }] with the doctrinal shape (verb=toggle, sequence=post, intent fromProp binding to the 4 supported intents). New data-* (data-color with the 6-token Toggle/Switch subset, data-readonly, data-invalid, data-required) and corresponding aria-*. scope expanded to ['soma', 'sema']. - soma/components/switch/types.ts — adds intent, color, readonly, invalid, aria-labelledby props with full JSDoc. Subset constrained per guide §3.1 (Toggle/Switch row). - soma/components/switch/switch-provider.svelte.ts — runtime-direct, Field integration via FieldProvider.get(), isDisabled/isReadonly/ isRequired/isInvalid OR-merge derivations, intent ↔ color resolution (intent wins when evaluative), runtime.trigger( 'commit-toggle') in onclick. - soma/components/switch/components/switch.svelte — wires the new props through bindProps. - eidos/components/switch/{switch.css, switch.svelte, types.ts, index.ts, README.md} — full subdirectory pattern, mirroring toggle. Recipe drops legacy success/warning/danger/info selectors; declares the 6 doctrinal data-color values directly. Wrapper auto-renders Switch.Thumb inside the track and exposes an optional `thumb` snippet for in-thumb glyphs. - eidos/components/switch.css (legacy flat) deleted; eidos/index.css updated to import the subdirectory recipe. - web/routes/switch/+page.svelte — interactive testbed with all soma props as live controls + tabs (Live, Soma, Morfo, Sema, Eidos, Notes). Mirrors toggle's structure. npm run check holds at the 39-error baseline. Tests 217/217 green. Pending: - Migrate collapsible / dialog / drawer / popover / toast / avatar to the eidos wrapper pattern. - Persistence + holds-by-intent — defer until first signal.warn / signal.alert consumer. - a11ySemantic + polymorphic events — defer until concrete need. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
enumerar componentes. `validateEventName` reconoce ambas formas.
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
**Intents** (`src/uix/sema/sema-map.ts:SEMA_MAP.intents`), 6 valores:
sema/morfo/eidos: align with GUIA_IMPLEMENTACION_SEMAUIX (canonical guide) The new doctrinal guide at src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md supersedes src/docs/sema-implementation-guide.md and locks the canonical vocabulary, event shape and color tokens. This commit aligns the codebase to that canon in three concrete moves. Phase 1 — sema/verbs.ts vocabulary: - Restructured from flat array to family-keyed Record per the guide. - Moved select / toggle / acknowledge → commit (these fix state, not contact). Removed edit from handle (it's shift.enter-mode now). - Added new verbs per the canon: contact (tap, focus, trigger, release), commit (complete, restore, expire, set, remove, reorder), signal (remind), handle (rotate, scroll, reorder), shift (route, step, return, context), sustain (start, loading, waiting, syncing, processing, streaming, pending, retrying, end). - validateEventName now recognises both naming shapes: {verb}-{variant} (head=verb) and {family}-{verb} (head=family). - New helper familyForVerb. Tests rewritten — 16/16 green. Phase 2 — morfo event shape: - target moved from event-level into event.semantic. Adds optional semantic.verb (advisory, validated against SEMA_VERBS[family]) and optional semantic.sequence ('pre' | 'coincident' | 'post'). - compile.ts and schema.ts updated. The 22 events across toggle, toast, popover, drawer, dialog refactored to the new shape with explicit verb + sequence. - Polymorphic capability (allowedFamilies + defaultSemantic) and a11ySemantic deferred — no current consumer needs them; will land when the first concrete usage appears. Phase 5 — color tokens (doctrinal 8): - themes/base/light.css and dark.css rewritten to expose primary, secondary, neutral, affirm, fulfill, risk, threat, loss. Renames success→fulfill, warning→risk, danger→threat (same hex). New primitives for secondary (slate-blue), affirm (teal-mint, low activation), loss (deep violet-grave, posterior). info palette deleted entirely — per guide, "info no es intent, es signal.announce + neutral". - _static.css legacy compatibility aliases (--color-bg, --color-success, --color-error, --color-accent, ...) deleted. Clean cut, no transition. Consumers reference doctrinal palettes directly. - 29 consumers (token files + recipes) migrated: - All --*-color-info-* declarations dropped. - Component palettes extended with secondary / affirm / loss. - switch + checkbox recipes updated to use [data-color='affirm'| 'risk'|'threat'|'secondary'] (was 'success'|'warning'|'danger'| 'info'). - toast tokens + recipe renamed to affirm/fulfill/risk/threat/loss (was success/error/warning/info). - meter, progress, mark, badge, button tokens renamed. - Contracts (contracts/contract.css + contracts/components/*) updated. - focus-ring-color-error in themes now points to --color-risk-border (validation errors are signal.warn + risk per doctrina, not threat). Phase 4 (partial): - src/docs/sema-implementation-guide.md deleted (superseded by the canonical guide). Tests: 217/217 green across uix. npm run check holds at the 39-error baseline (all pre-existing in unrelated test files; none introduced). Pending in follow-up commits: - Update active_architecture.md, sema/README.md, morfo/README.md, CLAUDE.md to reflect the canon. - Switch component migration to the eidos wrapper pattern. - Persistence field (untilAction / untilFix / stateBound) and holds-by-intent — defer until the first signal.warn / signal.alert consumer appears. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
```
neutral — sin carga afectiva (default)
affirm — positivo bajo ("todo va bien")
fulfill — positivo resolutivo ("objetivo cumplido")
risk — negativo moderado ("revisa esto")
threat — negativo activo ("alarma, atención inmediata")
loss — consecuencia consumada (negativo + baja activación, posterior)
```
Intent es ortogonal a familia: una `commit` puede ser `affirm` (subscribe),
`risk` (publish), `threat` (delete), o `neutral` (toggle plano). El
provider lo declara en `morfo.events[].semantic.intent` (literal) o lo
expone como prop (`fromProp + supported subset`).
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
---
## 7. Reglas duras
Las invariantes operativas que mantienen el sistema coherente:
1. **Morfo no conoce código de runtime.** Es declaración pura.
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
2. **SomaRuntime depende de Dom y Semantic.** Por construcción, no por
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
import. Provider las inyecta.
3. **Provider no escribe attrs mutables al DOM directamente.** Los aporta
como sources al runtime.
4. **`Semantic` puede usar `Dom` (hacia abajo).** `Dom` no conoce
`Semantic`.
5. **`ADom` no conoce capas superiores.** Solo aplica mutaciones, listeners
y acciones DOM transversales que recibe.
La frontera DOM no exige envolver lecturas locales: un componente puede
llamar `el.contains(...)`, `el.closest(...)`, `el.getBoundingClientRect()`
o leer `scrollTop` de su propio elemento. En cambio, listeners de
`document/window`, consultas globales, foco imperativo y scroll de ventana
pasan por `ActiveDom`.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
6. **`Eidos` consume DOM y `data-*`, no internals de Soma ni Sema.** Si lo
necesita, debe estar declarado en morfo o emitido en una señal de sema.
7. **Lo que `dom.apply` escribe, Svelte no lo renderiza desde `partProps`.**
Una sola autoridad por atributo.
8. **State es la única fuente de verdad. El DOM es derivación.** Los
handlers mutan state; los effects derivan attrs.
9. **Event handlers en `runtime.trigger` son síncronos.** Async va antes
de llamar `trigger`.
10. **Guards van en el call-site, no dentro del handler.** Si el guard
entra al handler, ya emitió la señal perceptiva.
11. **`morfo.events[].commits` es descriptivo, no ejecutable.** Documenta
lo observable; el smoke valida.
12. **La regla 2-de-3 para extender Morfo.** Una extensión a morfo solo se
justifica si **al menos dos de las tres capas** (soma, sema, eidos)
la consumen. Soma-only conveniences viven en provider via virtual
prop.
---
## 8. La distinción autoría / transcripción
Una lente útil para decidir dónde vive cada cosa:
- **Autoría** — escrito una vez por un humano, con intención. Los `Props`
de un componente, el morfo, los handlers de eventos. Vive en
TypeScript del autor.
- **Transcripción** — derivado mecánicamente de la autoría. Los `Opts`
del provider, el wrapping `readableActive(() => x)` por prop, los
attrs estructurales. Lo deriva una helper / runtime / generator.
UIX intenta que solo la autoría sea humana. La transcripción es código
que escribe código:
| Autoría | Transcripción | Cómo |
| -------------------------------------- | ---------------------- | ---------------------------------- |
| `Props` | `Opts` | `OptsFromProps<P, Managed, State>` |
| Cada prop de wrapper | Active/State boxes | `bindProps({ ... })` |
| `morfo.events[].commits` | DOM final tras handler | Effects derivan |
| `morfo.parts[].data` | Atributos en cada tick | Resolver + dom.apply |
| `morfo.events[].name` + verb canonical | `data-event="..."` | sema.emit |
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
Esta distinción explica por qué la regla 2-de-3 se mantiene: el morfo es
**autoral cross-layer**. Si solo soma necesita algo, es transcripción
soma-internal — no autoral, no merece estar en morfo.
---
## 9. Lo que NO es esta arquitectura
Para evitar mission creep, conviene fijar lo que UIX **no quiere ser**:
- **No es una colección visual.** Eidos será visual; UIX como sistema no.
- **No es un wrapper opinionated sobre primitives existentes.** Las cuatro
capas son originales, no envuelven Radix/Headless UI.
- **No es un design system clásico.** Tokens, themes y recipes pertenecen
a Eidos, no al núcleo.
- **No es un servicio monolitico de eventos que ejecuta todas las
modalidades.** Sound, Haptic, Motion y futuras modalidades se registran
como **canales** del `EngineSemantic`; cada uno gestiona su propia
modalidad. El engine es solo registry + dispatch.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
- **No es un EventEmitter global disfrazado de arquitectura.** Cada
evento tiene un target específico en el DOM y un dueño semántico
declarado en morfo.
- **No es un mini-DSL en JSON.** Morfo es declarativo descriptivo, no
programa. La lógica vive en TypeScript del provider; morfo solo dice
qué attrs y qué semántica.
---
## 10. Estado del proyecto
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
> Los snapshots de estado fechados ("qué hay implementado a fecha X") viven en
> [`docs/process/`](../../docs/process/) — p. ej.
> `active-architecture-snapshot-2026-05.md`. Este documento describe la
> arquitectura, no el avance.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
## 11. Riesgos reconocidos
Ningún diseño está libre de riesgos. UIX tiene cuatro de manera explícita:
### 11.1 Exceso de capas
Si las fronteras no se mantienen nítidas, el sistema se siente más
complejo de lo que resuelve. La regla 2-de-3 y la doctrina de "virtual
prop" mitigan, pero requieren disciplina sostenida.
### 11.2 Nombres sin disciplina
`Morfo`, `Sema`, `Soma`, `Eidos` son nombres que solo funcionan si los
contratos son nítidos. Si Sema empieza a saber de DOM, o Soma decide
visualidad, los nombres se vuelven decoración.
### 11.3 Invasión de responsabilidades
El peligro constante es que una capa intente hacer el trabajo de otra:
- `Sema` convirtiéndose en runtime multimodal (regresión).
- `Soma` decidiendo CSS o motion.
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
- `SomaRuntime` interpretando lógica de negocio.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
- `Eidos` accediendo a internals de soma.
UIX solo funciona si cada capa acepta sus límites.
### 11.4 Falta de precedentes
No hay sistemas de UI con esta composición exacta. Eso significa más
libertad arquitectónica pero también menos patrones externos que copiar
cuando aparece un caso límite.
---
## 12. Por qué puede valer la pena
Si las fronteras se mantienen, UIX ofrece algo poco común:
- **Explicabilidad arquitectónica**. Cada decisión cae en una capa
reconocible; el "dónde vive esto" tiene una respuesta predecible.
- **Menos drift entre capas**. El morfo es autoritativo; las demás capas
derivan. Renombrar una part toca un sitio, no seis.
- **Validación automática del contrato**. Sium schema + smoke + morfo-check
detectan drift estructural antes de que llegue a producción.
- **Más libertad para introducir engines nuevos**. Sound, Haptic, Motion,
cualquier modalidad futura se registra como un `Channel` adicional en
`EngineSemantic` sin tocar morfo ni soma.
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
- **Honestidad sobre fronteras de framework vs integrador**. UIX provee
vocabularios, contratos, transporte y puntos de extensión; no finge
decidir por todas las modalidades de todas las apps.
La idea importante:
> **La coherencia cross-modal puede tratarse como responsabilidad del
> integrador, no como una falsa promesa de un runtime centralizado que
> pretende saberlo todo.**
---
## 13. La frase resumen
soma/morfo/active-uix: relocate runtime + rename SomaRuntime + sema opcional Architectural correction. Morfo was importing Svelte runes, $adom, and $uix/sema — all violations of "morfo is pure declarative DNA". The runtime that interprets a CompiledMorfo lives where it executes: soma. Move: - src/uix/morfo/runtime.svelte.ts → src/uix/soma/runtime.svelte.ts - src/uix/morfo/runtime.svelte.test.ts → src/uix/soma/runtime.svelte.test.ts Rename (consistent with the move; "soma's runtime", per the doctrine "morfo declares, soma executes"): - class MorfoRuntime → SomaRuntime - createMorfoRuntime() → createSomaRuntime() - type MorfoRuntimeSources → SomaRuntimeSources - error prefixes [morfo-runtime] → [soma-runtime] Sema is now genuinely ornamental: - ActiveUix.semantic returns EngineSemantic | undefined (no longer throws when no engine is configured). Components in SSR / headless tests / audio-disabled environments stay functional. - SomaRuntime.trigger() skips the emit step AND the target-resolution check when no engine is present — only requires a DOM target when something will actually be emitted. - Soma.semantic getter returns | undefined too (was non-optional). Consumers updated: - src/uix/active-uix/active-uix.svelte.ts — imports createSomaRuntime from $soma; semantic getter returns | undefined - src/uix/active-uix/types.ts — interface SomaRuntime, semantic | undefined - 8 providers (toggle, switch, collapsible, dialog, drawer, popover, toast, avatar) — type SomaRuntime, import path $soma - src/uix/soma/index.ts — re-exports createSomaRuntime + types - src/uix/morfo/index.ts — drops the runtime re-exports (morfo is pure) - src/uix/sema/signal.ts — JSDoc reference updated - src/uix/soma/core/soma.svelte.ts — semantic getter | undefined Test added: SomaRuntime.trigger() succeeds without a semantic engine (skips emit + target check, runs handler directly). Docs aligned to the new shape: - active_architecture.md — runtime locations, sema as ornamental - soma/SOMA_ARCHITECTURE.md, soma/README.md — name + import paths - morfo/README.md — file listing now flags morfo as PURE TS, points at soma/runtime.svelte.ts for the interpreter - sema/README.md — SomaRuntime references - README.md — root architecture diagram - CLAUDE.md — hand-off note Tests 218/218 green. npm run check holds at the 39-error baseline. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
> **Morfo declara · SomaRuntime transcribe · Provider aporta · Effects
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
> sincronizan · Semantic emite · Dom aplica · Eidos lee.**
Siete palabras que describen la cadena entera. Si una decisión arquitectónica
contradice una de esas siete, la decisión está mal — o la arquitectura tiene
que evolucionar conscientemente.
---
## 14. Para profundizar
- [src/uix/README.md](./README.md) — posicionamiento general (más narrativo)
- [src/uix/morfo/README.md](./morfo/README.md) — declaración, archetypes, regla 2-de-3
- [src/uix/sema/README.md](./sema/README.md) — `emit` contract, verbs canónicos
- [src/uix/soma/SOMA_ARCHITECTURE.md](./soma/SOMA_ARCHITECTURE.md) — runtime + componentes
docs: prune obsolete audits + studies, refresh remaining references Deleted 60 obsolete documents that no longer reflect the active-uix state: - 47 per-component audit logs (*-audit.md, audit_N.md, AUDIT.md) - 5 global soma audits (AUDIT_1, codex_audit, soma-audit-04-20/21, audit-prompt template) - 5 closed studies (soma/study, morfo/study, morfo/DESIGN, morfo/ PROVIDER_STUDY_2026-04-23, uix/CONTINUITY_2026-04-24) - 2 superseded refactor proposals (refactor_claude, refactor_code) - 1 stale bug log (form/BUG-onchange-onblur-hang — repro path src/routes/test/sium/kitchen-sink no longer exists) Updated the remaining operational references to drop dead links and reflect the post-cleanup architecture: - src/uix/README.md — rewritten links section, dropped pointers to terra/air/CONTINUITY/refactor docs, updated adom/dom paths - src/uix/active_architecture.md — header now dated 2026-05-08, lists the major shifts since 2026-04-26 (provider inheritance dropped, eidos in production, doctrina parte IV, sound eager-init); pendings section reflects the eidos migration roadmap; "see also" purged of deleted files - src/uix/morfo/README.md — file tree updated (removed DESIGN/study, added compile/runtime/PERMUTATION_RUNNER); see-also pruned - src/uix/sema/README.md — SoundChannel section now describes the eager-init pattern (constructor-time, not lazy); pointer to sema-implementation-guide added - src/uix/soma/README.md — drops terra/air mentions, declares the actual dependency direction (eidos -> soma, not the reverse) - src/uix/soma/SOMA_ARCHITECTURE.md — §15 rewritten as "Estado actual y deuda histórica" reflecting Provider-inheritance-drop; demo path updated to web/routes/ - src/uix/soma/COMPONENT_GUIDE.md — A23 dates section now points to $libs/days (no external/dates façade); demo paths swapped from /test/soma/* to web/routes/ - src/uix/morfo/PERMUTATION_RUNNER.md — paths swapped to web/routes/ with a relocation note - CLAUDE.md — Refactor Documents section replaced with Reference Documents pointing to per-layer READMEs npm run check holds at baseline (39 pre-existing errors, none new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
- [src/uix/soma/COMPONENT_GUIDE.md](./soma/COMPONENT_GUIDE.md) — guía operativa para crear / migrar componentes
- [src/uix/eidos/README.md](./eidos/README.md) — capa visual: tokens, themes, recipes, wrappers
- [`src/arts/adom/README.md`](../arts/adom/README.md) — `dom.apply` + servicios DOM reactivos
- [`src/docs/GUIA_IMPLEMENTACION_SEMAUIX.md`](../docs/GUIA_IMPLEMENTACION_SEMAUIX.md) — convenciones doctrinales del API
docs: src/uix/active_architecture.md — cross-layer vision document Synthesizes the four-layer architecture (morfo · soma · sema · eidos) into a single readable doc. Where the per-layer READMEs are operational references, this is the "north star" for understanding the why and how the pieces articulate. Structure (14 sections): 1. The thesis in one line — four layers with explicit contracts 2. The problem solved — what conventional frameworks mix together 3. The four layers — Morfo (DNA), Soma (behavior), Sema (semantic channel), Eidos (visual) 4. How they articulate — the transcription chain (six pieces, one responsibility each) 5. The causal chain of an interaction — concrete walkthrough of a Toast dismiss with timing 6. The primitives that pass between layers — DOM attrs catalog + archetypes + verbs vocabularies 7. Hard rules — the 12 invariants that keep the system coherent, including the 2-of-3 rule 8. The autoría / transcripción distinction — the lens for deciding what lives where 9. What this architecture is NOT — explicit non-goals 10. Current state (2026-04-26) — what's built, designed, pending 11. Acknowledged risks — over-layering, name discipline, responsibility invasion, lack of precedent 12. Why it may be worth it — explainability, less drift, validation, extensibility 13. The summary phrase — "Morfo declara · MorfoRuntime transcribe · Provider aporta · Effects sincronizan · Semantic emite · Dom aplica · Eidos lee" 14. For deeper reading — links to per-layer docs Also adds a top-of-page pointer in src/uix/README.md so the vision doc is the obvious entry point for new readers. No code changes — pure documentation.
5 months ago
docs: prune obsolete audits + studies, refresh remaining references Deleted 60 obsolete documents that no longer reflect the active-uix state: - 47 per-component audit logs (*-audit.md, audit_N.md, AUDIT.md) - 5 global soma audits (AUDIT_1, codex_audit, soma-audit-04-20/21, audit-prompt template) - 5 closed studies (soma/study, morfo/study, morfo/DESIGN, morfo/ PROVIDER_STUDY_2026-04-23, uix/CONTINUITY_2026-04-24) - 2 superseded refactor proposals (refactor_claude, refactor_code) - 1 stale bug log (form/BUG-onchange-onblur-hang — repro path src/routes/test/sium/kitchen-sink no longer exists) Updated the remaining operational references to drop dead links and reflect the post-cleanup architecture: - src/uix/README.md — rewritten links section, dropped pointers to terra/air/CONTINUITY/refactor docs, updated adom/dom paths - src/uix/active_architecture.md — header now dated 2026-05-08, lists the major shifts since 2026-04-26 (provider inheritance dropped, eidos in production, doctrina parte IV, sound eager-init); pendings section reflects the eidos migration roadmap; "see also" purged of deleted files - src/uix/morfo/README.md — file tree updated (removed DESIGN/study, added compile/runtime/PERMUTATION_RUNNER); see-also pruned - src/uix/sema/README.md — SoundChannel section now describes the eager-init pattern (constructor-time, not lazy); pointer to sema-implementation-guide added - src/uix/soma/README.md — drops terra/air mentions, declares the actual dependency direction (eidos -> soma, not the reverse) - src/uix/soma/SOMA_ARCHITECTURE.md — §15 rewritten as "Estado actual y deuda histórica" reflecting Provider-inheritance-drop; demo path updated to web/routes/ - src/uix/soma/COMPONENT_GUIDE.md — A23 dates section now points to $libs/days (no external/dates façade); demo paths swapped from /test/soma/* to web/routes/ - src/uix/morfo/PERMUTATION_RUNNER.md — paths swapped to web/routes/ with a relocation note - CLAUDE.md — Refactor Documents section replaced with Reference Documents pointing to per-layer READMEs npm run check holds at baseline (39 pre-existing errors, none new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
Decisiones de diseño detalladas y trade-offs históricos en el git log de la
rama `active-uix`.

Powered by TurnKey Linux.