5.1 KiB
ActiveUix
active-uix es la raíz de composición de UIX. Su responsabilidad no es ser otra
capa de comportamiento, sino entregar a morfo, soma, sema y eidos los
servicios mínimos que necesitan, sin que los componentes conozcan ActiveApp
directamente.
Arquitectura de conjunto:
../active_architecture.md. Contrato ejecutable:contracts.ts, validado encontracts.test.ts.
Dos modos de arranque
createActiveUix(options) — standalone. Compone un runtime propio:
- crea
logger,timers,busyprefs; - el
bususacreateSvelteEngineBus({ logger, clock: timers.clock }), igual queActiveApp, para que los listeners corran bajountracky no creen dependencias reactivas accidentales; - crea
langs,dom(odisabledDomsidom:false),clipboard,formatyeventssegún opciones; - conserva
portalcomo target genérico de portales, para que cada capa lo adapte a su API (portalTo) sin acoplaractive-uixa esa capa; - registra las traducciones comunes y las
morfo.translations.
attachActiveUix(app, options) — attach a un ActiveApp externo:
- reutiliza
app.prefs,app.langs,app.dom,app.clipboardyapp.formatcuando existen; - exige
app.langsyapp.dom; si faltan, lanza error de configuración; - no vuelve a suscribir
langsaprefs.language(esa conexión pertenece adefineActiveLangsdentro deActiveApp); - registra las traducciones comunes y las
morfo.translations; - no posee el lifecycle del
app.
Contratos mínimos por módulo
Fuente ejecutable:
contracts.ts.
| Módulo | Mínimo 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 + servicios langs, dom |
app.clipboard, app.format, motor de eventos, portal |
ninguno para servicios requeridos | falta langs o dom en app; el getter de un servicio opcional ausente falla explícito |
SomaRuntime |
dom desde ActiveUix |
motor de eventos, langs, format |
ninguno propio | morfo/event/part inexistente |
Sema directo |
dom o projector si visual activo |
sound, haptic, visual:false |
ninguno propio de servicios UIX | SemaConfigError sin dom/projector con visual activo |
Eidos |
dom si applyDom |
langs, format, prefs, fuentes mode/density |
applyDom:false permite render/serializar sin DOM |
falta dom con applyDom activo |
ADom directo |
target/window/document del caller | breakpoints/window | disabledDom solo si el caller lo pide |
errores propios de ADom sin DOM real |
Reglas de ownership y degradación
- Solo los composition roots crean servicios compartidos.
morfo,soma,sema,eidosy los componentes nunca creandom,langs,prefs,format,clipboardni equivalentes: los reciben deActiveUix. dom:falsesolo degrada en standalone.ActiveUixexpone undisabledDomlocal y se lo pasa también aEngineSemantic; Sema/events no caen a escrituras DOM directas. En attach no hay creación compensatoria: si la app no tienedom,attachActiveUix(app)falla.langsno eslocale.prefs.languagealimenta las traducciones;prefs.localealimenta los formatos. No se mezclan.clipboardes un servicio de capacidad, no DOM visual. Standalone lo crea salvoclipboard:false; attach lo consume deapp.clipboardcuando una capa lo pide, y falla con error explícito si no se declaró.prefs.directiones la preferencia efectiva de dirección;html[dir]es solo su proyección DOM.ActiveUixno auto-proyecta preferencias al DOM.arts/prefsproyecta lo transversal (dir,data-motion,data-sound,data-haptic) víacreateActivePrefsDomProjection;ActiveEidosproyecta lo visual (data-theme,data-mode,data-density). El artefactofrontendfue retirado y no debe reaparecer como fuente delocale.ActiveUixno crea ni conoceSomaniEidos.Soma.create(...)crea su propio scope ySoma.runtime(...);ActiveEidos.create(...)crea el scope visual cuando la app necesita CSS runtime.
Arrancar una shell UIX
Una shell que usa componentes visuales cablea tres piezas de forma explícita:
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. El modo claro/oscuro se pasa a ActiveEidos.modeSource, no a
prefs.theme — theme no forma parte del preset core de UIX y escribirlo
provoca prefs::unknown_dimension.