|
|
5 months ago | |
|---|---|---|
| .. | ||
| components | 5 months ago | |
| svelte | 5 months ago | |
| README.md | 5 months ago | |
| active-uix.svelte.test.ts | 5 months ago | |
| active-uix.svelte.ts | 5 months ago | |
| errors.ts | 5 months ago | |
| index.ts | 5 months ago | |
| prefs.ts | 5 months ago | |
| services.ts | 5 months ago | |
| types.ts | 5 months ago | |
README.md
ActiveUix
active-uix es la raiz de composicion de UIX. Su responsabilidad no es ser
otra capa de comportamiento, sino entregar a morfo, soma, sema y eidos
los servicios minimos que necesitan sin que los componentes conozcan
ActiveApp directamente.
Handoff 2026-05-14
La regla de ownership queda cerrada:
Solo los composition roots crean servicios compartidos. Si hay
ActiveApp,attachActiveUix(app)consume sus servicios y falla si falta alguno requerido. Si no hay app,createActiveUix(...)es el composition root local y crea los servicios/prefs de UIX.morfo,soma,sema,eidosy los componentes no creandom,langs,prefs,format,clipboardni equivalentes.
La revision de naming queda cerrada asi: events es el nombre publico del
motor perceptivo en ActiveUix y tambien el nombre del servicio que
defineUixServices(...) registra en ActiveApp. semantic queda reservado
para el payload declarativo de morfo.events[].semantic, no para servicios
runtime. morfo.translations queda como catalogo declarativo owned por el
componente. prefs es el unico nombre para preferencias: ActiveUix expone
el ActivePrefs bruto y las capas inferiores consumen vistas acotadas cuando
no deben mutar.
Boot paths actuales
createActiveUix(options) compone un runtime standalone:
- crea
logger,timers,busyprefs; - el
bususacreateSvelteEngineBus({ logger, clock: timers.clock }), igual queActiveApp, para que los listeners corran bajountrack; - crea
langs,domodisabledDom,clipboard,formatyeventssegun opciones; - conserva
portalcomo target generico de portales para que cada capa lo adapte a su API sin acoplaractive-uixa esa capa; - registra traducciones comunes y
morfo.translations.
attachActiveUix(app, options) se adjunta a un ActiveApp externo:
- reutiliza
app.prefs,app.langs,app.dom,app.clipboardyapp.formatsi existen; - exige
app.langsyapp.dom; si faltan, lanza error de configuracion; - no vuelve a suscribir
langsaprefs.language: esa conexion pertenece adefineActiveLangsdentro deActiveApp; - registra traducciones comunes y
morfo.translations; - no posee el lifecycle del
app.
Contratos actuales
| Modulo | Minimo requerido | Opcional | Fallback si falta | Error si falta |
|---|---|---|---|---|
ActiveUix standalone |
langs config |
clipboard:false, format, events, portal, dom:false |
crea prefs, core services y, si dom:false, disabledDom local |
falta config langs |
ActiveUix attach |
ActiveApp core + services langs, dom |
app.clipboard, app.format, app event engine, portal |
ninguno para servicios requeridos | falta langs o dom en app; getter explicito falla si se pide un servicio opcional ausente |
SomaRuntime |
dom desde ActiveUix |
event engine, langs, format |
ninguno propio | morfo/event/part inexistente |
Sema directo |
dom o projector si visual esta activo |
sound, haptic, visual:false |
ninguno propio de servicios UIX | SemaConfigError sin dom/projector y con visual activo |
Eidos |
dom si applyDom |
langs, format, prefs, mode/density sources |
applyDom:false permite render/serializar sin DOM |
falta dom con applyDom activo; componentes visuales fallan si leen un servicio no inyectado |
ADom directo |
target/window/document del caller | breakpoints/window | disabledDom solo si el caller lo pide explicitamente |
errores propios de ADom si no hay DOM real |
Decisiones cerradas y riesgos abiertos
dom:falsesolo degrada en standalone:ActiveUixexpone undisabledDomlocal y no deja a Sema/events caer a escrituras directas.- En attach mode no hay creacion compensatoria: si la app no tiene
dom,attachActiveUix(app)falla. - Standalone usa el mismo bus Svelte-aware que
ActiveApp. - Attach mode no duplica la suscripcion
prefs.language -> langs. langsno eslocale:prefs.languagealimenta traducciones;prefs.localealimenta formatos.clipboardes un servicio de capacidad, no DOM visual. Standalone lo crea salvoclipboard:false; attach lo consume deapp.clipboardsi una capa lo pide y falla con error explicito si no fue declarado.prefs.directiones la preferencia efectiva de direccion;html[dir]es solo su proyeccion DOM.- Los wrappers/componentes no deben ser el lugar donde se resuelvan estas politicas. Primero se cierra el contrato de la raiz activa.
- El antiguo artefacto
frontendfue retirado.ActiveUixno proyecta preferencias al DOM:arts/prefsproyecta lo transversal yActiveEidosproyecta lo visual. ActiveUixno crea ni conoceSomaniEidos:Soma.create(...)crea su scope ySoma.runtime(...);ActiveEidos.create(...)crea el scope visual si la app necesita CSS runtime.
Boot de una shell UIX
Una shell que usa componentes visuales debe cablear tres piezas de forma explicita:
const uix = createActiveUix({ langs, prefs: { schema } });
setActiveUix(uix);
Soma.create();
const prefsProjection = createActivePrefsDomProjection({
prefs: uix.prefs,
dom: uix.dom
});
const eidos = ActiveEidos.create({
theme: 'base',
modeSource,
applyDom: true
});
prefsProjection es el dueño de dir, data-motion, data-sound y
data-haptic. ActiveEidos es el dueño de data-theme, data-mode y
data-density. No escribir uix.prefs.setIntent('theme', ...): theme no
existe en el preset core de UIX y provocara prefs::unknown_dimension.
Regla de trabajo vigente
Tras cerrar P1, siguen vigentes estas restricciones:
- no tocar
src/uix/eidos/components/*; - no crear nuevas fachadas internas;
- no introducir
Engine*/Active*por simetria decorativa; - cualquier cambio debe justificar que contrato minimo aclara.