@ -68,15 +68,20 @@ Ver: [src/uix/morfo/README.md](/G:/dev/svelte/vicen/src/uix/morfo/README.md)
### `Sema`
Vocabulario y contrato semantico .
Vocabulario semantico y canalizador de senales perceptivas .
No ejecuta sound, vibra ni CSS. Su trabajo es decir :
Su trabajo:
- que acciones existen
- que ocurrencias/eventos canónicos nombra el sistema
- como se relacionan esos nombres con el componente
- definir las familias canonicas (`contact | commit | alert | handle | emerge | sustain`)
- definir los intents canonicos (`neutral | affirm | fulfill | risk | threat`)
- exponer `EngineSemantic.emit(event)` para que el provider publique ocurrencias
- garantizar la secuencia perceptiva: escribir senal `data-event*` , esperar 1 rAF
para que CSS la observe, resolver, mantener y limpiar
En su version madura, `Sema` debe ser **vocabulario y validacion** , no runtime.
`Sema` no decide que ocurrio (eso lo decide el provider). Solo orquesta la
ocurrencia que recibe.
Ver: [src/uix/sema/README.md ](/G:/dev/svelte/vicen/src/uix/sema/README.md )
### `Soma`
@ -104,15 +109,22 @@ headless del componente. Su responsabilidad es apariencia, no comportamiento.
### `ADom`
Runtime observable del DOM activo.
Runtime DOM activo de aplicacion.
No es semantic engine. No conoce Morfo, ni Sema, ni Soma, ni Eidos. Su unica
funcion es **coordinar y sincronizar mutaciones DOM** .
API publica (mutaciones):
- `app.dom.apply(change)` — aplica un paquete de attrs sobre un target
- `app.dom.remove(target, names)` — quita attrs
API publica (servicios reactivos pre-existentes):
No es un helper DOM puro ni un semantic engine. Es el broker infrastructural de
senales DOM activas:
- `viewport` , `breakpoints` , `currentBreakpoint` , `resolve` , `isAtLeast` , `matches`
- `BodyScrollLock` , `DOMContext` , `RovingFocusGroup`
- recibe emisiones de `Soma`
- publica a listeners tipados
- refleja `data-event*` en el DOM
- evita que cada engine monte su propio observer para el mismo hecho
ADom recibe instrucciones ya resueltas. No las interpreta.
Ver: [src/uix/adom/README.md ](/G:/dev/svelte/vicen/src/uix/adom/README.md )
@ -133,6 +145,94 @@ No contiene el runtime activo. Ese papel pertenece a `ADom`.
---
## 2.bis Como se ejecuta un componente
La arquitectura cerrada (post-2026-04-25) define seis piezas con
responsabilidades disjuntas. Ninguna invade a la siguiente.
```
Morfo declara
MorfoRuntime transcribe
Provider aporta sources, targets y handlers
Effects sincronizan attrs derivados
EngineSemantic emite senales perceptivas
ADom aplica mutaciones DOM
```
### El reparto operativo
`Morfo` es DNA: un fichero por componente que declara `parts` , `data-*` ,
`aria-*` , `role` , `keyboard` , `focus` , `events` . No ejecuta nada.
`MorfoRuntime` (en `soma/` ) interpreta el morfo. Una instancia por componente
recibe del provider las fuentes de estado, los targets DOM y los handlers de
eventos. Expone:
- `partProps(part)` — devuelve solo identidad estatica del nodo (id, marker,
ref attachment). Nada mutable.
- `attachPart(part, target)` — el provider registra el nodo DOM real cuando
monta.
- `keydown(part, event)` — dispatch de teclas declaradas en `morfo.keyboard` .
- `trigger(eventName)` — orquesta la secuencia perceptiva + state.
`Provider` aporta lo que el morfo no puede inferir:
- getters reactivos para `states` y `props`
- getters reactivos para los `parts` (ids dinamicos)
- handlers sincronos para los `events`
- glue de layers ortogonales (Presence, Dismissal, ScrollLock — no son morfo)
`Effects` (registrados por el runtime al montar) escuchan cambios en los
sources y aplican los attrs derivados via `dom.apply` .
`EngineSemantic` recibe el evento desde `runtime.trigger` . Escribe la senal
`data-event*` via `dom.apply` , espera 1 rAF, resuelve, mantiene la senal el
hold configurado y limpia.
`ADom` solo aplica. No interpreta.
### La secuencia de `runtime.trigger(eventName)`
```
1. prewrite imperativo (transient markers como data-last-action)
2. await semantic.emit(event)
3. handler sincrono del provider muta state
4. effects derivan y aplican attrs estructurales (data-state, aria-*)
```
El handler muta state. Los effects ven el cambio y reescriben el DOM. ADom es
el unico escritor de attrs mutables.
### Tres escenarios de Soma
```ts
// Cambio estructural sin senal
provider.commitState(change)
// internamente: dom.apply(change)
// Cambio estructural con senal
provider.commitState(change, event)
// internamente: await semantic.emit(event); dom.apply(change)
// Senal sin cambio estructural
provider.emitEvent(event)
// internamente: void semantic.emit(event)
```
### Reglas operativas
- Lo que `dom.apply` escribe, Svelte no lo renderiza. `partProps` solo emite
identidad estatica (id, marker, ref).
- Los handlers de `events` son sincronos. Async va fuera del trigger.
- Los guards (`if (disabled) return`) van en el call-site, no dentro del
handler — si entran al handler, ya emitieron senal perceptiva.
- `Semantic` puede usar `Dom` (dependencia hacia abajo). `Dom` no conoce
`Semantic` .
- `morfo.events.commits` es descriptivo: documenta lo observable, no lo
ejecuta. La cadena causal real es handler -> state -> effect.
---
## 3. Que hace distinto a UIX
### 3.1 El contrato estructural es una capa propia
@ -321,26 +421,29 @@ pero tambien menos patrones externos que copiar. Hay que inventar con disciplina
## 8. Reglas de dependencia
UIX debe preservar una direccion clara de acoplamiento.
Version simplificada:
UIX preserva una direccion clara de acoplamiento.
```text
Morfo -> describe
Sema -> nombra y valida sobre Morfo
Soma -> implementa comportamiento y emite a ADom
ADom -> transporta y publica
Eidos -> materializa visualmente
App -> compone servicios y engines
Morfo -> declara contratos
MorfoRuntime -> interpreta morfo dentro de Soma
Provider -> aporta sources, targets, handlers
Effects -> sincronizan state -> attrs
EngineSemantic -> emite senales perceptivas (depende de Dom)
ADom -> aplica mutaciones DOM
Eidos -> materializa visualmente leyendo DOM
App -> compone servicios
```
Y, como regla general :
Reglas duras :
- `Morfo` no conoce `Soma`
- `Sema` no ejecuta engines
- `ADom` no conoce sonido ni vibracion
- `Soma` no conoce implementaciones modales concretas
- `Eidos` no duplica behavior headless
- `Morfo` no conoce `Soma` , ni codigo de runtime
- `MorfoRuntime` lee `Morfo` y depende de `Dom` y `Semantic`
- `Provider` no escribe attrs mutables al DOM directamente; los aporta como
sources al runtime
- `EngineSemantic` puede usar `Dom` (hacia abajo); `Dom` no conoce `Semantic`
- `ADom` no conoce `Morfo` , ni `Sema` , ni `Soma` , ni `Eidos`
- `Eidos` consume DOM y `data-*` , no internals de `Soma` ni `Sema`
- Lo que `dom.apply` escribe, Svelte no lo renderiza
---
@ -348,11 +451,10 @@ Y, como regla general:
Si hubiera que resumir UIX en una sola idea, seria esta:
> UIX trata la interfaz no como un componente monolitico, sino como un sistema de
> capas con contratos explicitos entre estructura, semantica, comportamiento,
> visualidad y transporte de eventos activos.
> Morfo declara, MorfoRuntime transcribe, Provider aporta, Effects sincronizan,
> Semantic emite, Dom aplica.
Esa es la apuesta .
Seis piezas, seis responsabilidades, ninguna invade a la siguiente .
---