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/docs/glossary.md

90 lines
8.5 KiB

---
title: UIX Glossary
type: reference
audience: human + agent
authority: navigational — concise definitions; the linked doc is authoritative
status: current
---
# UIX Glossary
The framework's invented vocabulary, defined in one line each, with a pointer to
the authoritative doc. The **semantic** vocabulary (families, intents, verbs,
channels) is owned by [`CANON.md`](./CANON.md) — this glossary points there
rather than re-stating the values, so they cannot drift.
New here? Start at [`docs/README.md`](./README.md).
## The layers
| Term | Meaning |
| --- | --- |
| **morfo** | The declarative contract (a component's "DNA"): its public DOM surface — parts, `data-*`/ARIA, keyboard, events — declared once in a typed object. Every other layer reads it. → [`architecture/morfo`](./architecture/morfo.md) |
| **soma** | The headless behavior layer: keyboard, focus, ARIA wiring, state machines, composition. No visuals. → [`architecture/soma`](./architecture/soma.md) |
| **sema** | The perceptual engine: turns a declared event into sound / haptic (runtime) and a `data-event-*` projection (for eidos), via a cascade. → [`architecture/sema`](./architecture/sema.md) |
| **eidos** | The visual layer: CSS recipes, tokens, themes, sizes, variants — reacts to the DOM attrs morfo promises. → [`architecture/eidos`](./architecture/eidos.md) |
| **arts** | Runtime artifacts: the `Engine*` / `Active*` services (auth, cache, http, format, langs, dom, motion, …). → [`arts/README`](../src/arts/README.md) |
| **libs** | Pure, zero-dependency helpers (`$libs/days`, `$libs/dom`, `$reactive`, …). |
| **svrs** | Server-authoritative engines (`$svrs/auth`, `$svrs/perm`, `$svrs/cache`). |
| **active-uix** | The composition root that wires the layers — `createActiveUix` (standalone) or `attachActiveUix` (attach to an app). → [`architecture/active-uix`](./architecture/active-uix.md) |
| **ActiveDom / `$adom`** | The single reactive DOM service: the only sanctioned surface for managed DOM writes, listeners, queries, focus and scroll. |
feat(packs+text): incorporate the animation collection — Ambient pack + text-effects family + docs Two streams, split by what the animation touches: STREAM A — decorative backgrounds → the pack tier - arts/scene: a consolidated scene runtime ($scene) that owns, once, the citizenship every ad-hoc background reinvented or skipped (frame loop, off-view pause, DPR cap, mandatory reduced-motion, WebGL context loss/restore, scene budget, teardown). SceneDom port (adom satisfies it), webgl/webgl2/canvas2d drivers + a custom-pipeline extension (vertexShader + draw + glContext.depth/dprCap) for real geometry (beam, particles, dither, grid, eter, pixel-blast, hyperspeed). 32 effects as shared resources. - src/packs/ambient: the first pack — <Ambient effect="…"> mounts a registered effect; the P contract (P-1..P-6) guarded by scripts/packs-check.ts; colors are token-aware (P-4). One-way dependency, removable-by-construction. - resolveToken extended to semantic color slots (--color-{role}-{slot}) so consumers resolve theme tokens to concrete colors (the P-4 half). STREAM B — animations over real text → canon - Six components (count-up + text-{gradient,circular,blur,focus,scramble}): each a morfo + eidos recipe (where there's styling) + demo. CountUp is a service component (counts through uix.format.numbers). The five Text* are passive decoratives. Upgrades over the seeds: SR hardening (real text visually-hidden + aria-hidden decoration), a11y fix (no fake role=button), measurement discipline (cached rects via dom.measure, no reflow storm), reduced-motion, ecosystem citizenship (eidos.dom/timers, no raw platform). - MorfoElement gains 'p'. DOCS - docs/architecture/packs.md (pack tier, admission rule, P contract, Aura promotion path); docs/decisions/design-text-effects.md (the family design record) + indexed in decisions.md / README.md; glossary entries (scene/Ambient/Aura/text effects); scene README custom-pipeline + authoring bridge; motion-guide content-effects note; strata tables acknowledge packs. Gates: component:audit 141/0/0 · docs:check 0/0 · scene tests 9/9 · packs:check 0/36 · check 0 own errors. Verified in browser (32 effects mount+compile; 6 text components SSR+hydrate, CountUp re-formats by locale live, TextGradient resolves token stops to OKLCH via var()). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
| **pack** | An encapsulated opt-in collection above the layers (decorative leaves: no morfo, outside the acceptance matrix, one-way dependency). Admission rule + P contract → [`architecture/packs`](./architecture/packs.md) |
fix(uix): la auditoría del sistema — lo que los guards no veían Auditoría clean-room de todo ActiveUIX (excluido `web/`), componente a componente. Lo que sale de aquí no es una lista de bugs: es un patrón. El framework validaba que lo escrito fuese VÁLIDO, no que lo declarado se CUMPLIESE — y sus guards fallaban ABIERTOS. ## El colapso de las uniones de props (95 → 0) Un `Props` de eidos es `{ …props propias… } & <atributos nativos>`. Cuando el elemento declara un atributo homónimo, la intersección funde ambos y una unión estrecha contra el `string` nativo COLAPSA a `string`. Causa: `Without<T, U> = Omit<T, keyof U>` invocado como `Without<T, {}>` — `Omit<T, never>`, un no-op — 433 veces en soma; sólo 3 con argumento real. Invisible para `svelte-check`: ensanchar un tipo no es un error, es una garantía perdida. Medido: 95 props en 72 componentes. `<Avatar color="nonsense">` compilaba. `ComboboxInput.size` chocaba con el `<input size>` numérico y era inusable. Migrado con codemod sobre AST (nunca regex) a `Own & Omit<Nativos, keyof Own>`: 92 tipos en 73 ficheros + carousel a mano. `check` no se movió. Garantía nueva: `eidos/prop-surface.test.ts` (PROP-1) compara los literales de la anotación del autor contra los de la propiedad pública. Verificado que falla reintroduciendo el defecto. ## Los cuatro guards que fallaban abiertos - `translations:check` crasheaba en CADA ejecución de su historia — un stripper de comentarios borraba `//` dentro de strings. Sustituido por import dinámico. Al arrancar destapó 8 slots `texts` sin traducción. - `soma-attr-audit` agotaba el timeout de 5 s: sin veredicto, verde por omisión. - `component-audit` D-7.4 hacía `continue` mudo cuando el tipo no resolvía. Ahora resuelve con el checker de TypeScript (`scripts/prop-unions.ts`): puntos ciegos de 124 → 3. - `component-audit` R-1.1: el regex casaba `[data-motion='reduce']` y daba PASS por el motivo equivocado. Regla adoptada: un guard que no puede evaluar TIENE que decirlo. El informe lleva ahora bloque «Not verified» y recuento en el resumen. ## D-1 · tooltip y D-2 · card, cableados `tooltip` declaraba 3 eventos `emerge` que nadie emitía. Ahora emiten; `present` pasa a `sequence: 'post'` — con `'pre'` el hold de ~240 ms gateaba el montaje del propio overlay. `card` declaraba `commit-select` sin emisor posible (scope sin soma). Puente headless en `soma/components/card/` con la forma ya establecida por `menu-dial` / `onion-menu`: eidos posee estado y render, soma posee sólo el `SomaRuntime` que emite. ## Documentación: 22 mentiras corregidas `docs/` afirmaba guards inexistentes (`NO_MISSING_PROVIDER_TESTS`), APIs con firma equivocada y un modelo de Motion que el código no implementa. Corregido en CANON, arquitectura, glosario, theming/motion, checklist y los README de `motion` / `callout` / `arts/motion`. ## Además - CardGroup: la descripción se metía en la primera celda del grid. - Motion: `data-state` siempre estampado, salida real en `leave()`, token fantasma `--motion-stagger-each-default` eliminado. - `engine-motion`: `handoffState` Map → WeakMap (fuga por nodo). - `mockup`: primitivo crudo → token de rol (R-4.6). - 5 catálogos de traducción que faltaban. Handoff: `docs/process/CONTINUE-audit-2026-07-29.md`. Batería: check 0 errores en src · vitest server 3701/3701 · docs:check 0/0 · component:audit 161 PASS / 2 NEEDS-WORK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| **scene (`EngineScene` / `$scene`)** | The ambient-scene runtime art: mounts a WebGL/canvas-2D **effect** on a host with the citizenship done once (frame loop, off-view pause, DPR cap, mandatory reduced-motion, context loss/restore, budget, teardown). Effects are shared resources (`$scene/effects`) — the same one a pack mounts decoratively, `Aura` mounts semantically. Exposed as `uix.scene`. → [`arts/scene/README`](../src/arts/scene/README.md) |
feat(packs+text): incorporate the animation collection — Ambient pack + text-effects family + docs Two streams, split by what the animation touches: STREAM A — decorative backgrounds → the pack tier - arts/scene: a consolidated scene runtime ($scene) that owns, once, the citizenship every ad-hoc background reinvented or skipped (frame loop, off-view pause, DPR cap, mandatory reduced-motion, WebGL context loss/restore, scene budget, teardown). SceneDom port (adom satisfies it), webgl/webgl2/canvas2d drivers + a custom-pipeline extension (vertexShader + draw + glContext.depth/dprCap) for real geometry (beam, particles, dither, grid, eter, pixel-blast, hyperspeed). 32 effects as shared resources. - src/packs/ambient: the first pack — <Ambient effect="…"> mounts a registered effect; the P contract (P-1..P-6) guarded by scripts/packs-check.ts; colors are token-aware (P-4). One-way dependency, removable-by-construction. - resolveToken extended to semantic color slots (--color-{role}-{slot}) so consumers resolve theme tokens to concrete colors (the P-4 half). STREAM B — animations over real text → canon - Six components (count-up + text-{gradient,circular,blur,focus,scramble}): each a morfo + eidos recipe (where there's styling) + demo. CountUp is a service component (counts through uix.format.numbers). The five Text* are passive decoratives. Upgrades over the seeds: SR hardening (real text visually-hidden + aria-hidden decoration), a11y fix (no fake role=button), measurement discipline (cached rects via dom.measure, no reflow storm), reduced-motion, ecosystem citizenship (eidos.dom/timers, no raw platform). - MorfoElement gains 'p'. DOCS - docs/architecture/packs.md (pack tier, admission rule, P contract, Aura promotion path); docs/decisions/design-text-effects.md (the family design record) + indexed in decisions.md / README.md; glossary entries (scene/Ambient/Aura/text effects); scene README custom-pipeline + authoring bridge; motion-guide content-effects note; strata tables acknowledge packs. Gates: component:audit 141/0/0 · docs:check 0/0 · scene tests 9/9 · packs:check 0/36 · check 0 own errors. Verified in browser (32 effects mount+compile; 6 text components SSR+hydrate, CountUp re-formats by locale live, TextGradient resolves token stops to OKLCH via var()). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
| **Ambient** | The first pack (`$packs/ambient`) — animated backgrounds. `<Ambient effect="…">` mounts a registered scene effect; colors accept theme tokens (P-4). → [`src/packs/ambient/README`](../src/packs/ambient/README.md) |
fix(uix): la auditoría del sistema — lo que los guards no veían Auditoría clean-room de todo ActiveUIX (excluido `web/`), componente a componente. Lo que sale de aquí no es una lista de bugs: es un patrón. El framework validaba que lo escrito fuese VÁLIDO, no que lo declarado se CUMPLIESE — y sus guards fallaban ABIERTOS. ## El colapso de las uniones de props (95 → 0) Un `Props` de eidos es `{ …props propias… } & <atributos nativos>`. Cuando el elemento declara un atributo homónimo, la intersección funde ambos y una unión estrecha contra el `string` nativo COLAPSA a `string`. Causa: `Without<T, U> = Omit<T, keyof U>` invocado como `Without<T, {}>` — `Omit<T, never>`, un no-op — 433 veces en soma; sólo 3 con argumento real. Invisible para `svelte-check`: ensanchar un tipo no es un error, es una garantía perdida. Medido: 95 props en 72 componentes. `<Avatar color="nonsense">` compilaba. `ComboboxInput.size` chocaba con el `<input size>` numérico y era inusable. Migrado con codemod sobre AST (nunca regex) a `Own & Omit<Nativos, keyof Own>`: 92 tipos en 73 ficheros + carousel a mano. `check` no se movió. Garantía nueva: `eidos/prop-surface.test.ts` (PROP-1) compara los literales de la anotación del autor contra los de la propiedad pública. Verificado que falla reintroduciendo el defecto. ## Los cuatro guards que fallaban abiertos - `translations:check` crasheaba en CADA ejecución de su historia — un stripper de comentarios borraba `//` dentro de strings. Sustituido por import dinámico. Al arrancar destapó 8 slots `texts` sin traducción. - `soma-attr-audit` agotaba el timeout de 5 s: sin veredicto, verde por omisión. - `component-audit` D-7.4 hacía `continue` mudo cuando el tipo no resolvía. Ahora resuelve con el checker de TypeScript (`scripts/prop-unions.ts`): puntos ciegos de 124 → 3. - `component-audit` R-1.1: el regex casaba `[data-motion='reduce']` y daba PASS por el motivo equivocado. Regla adoptada: un guard que no puede evaluar TIENE que decirlo. El informe lleva ahora bloque «Not verified» y recuento en el resumen. ## D-1 · tooltip y D-2 · card, cableados `tooltip` declaraba 3 eventos `emerge` que nadie emitía. Ahora emiten; `present` pasa a `sequence: 'post'` — con `'pre'` el hold de ~240 ms gateaba el montaje del propio overlay. `card` declaraba `commit-select` sin emisor posible (scope sin soma). Puente headless en `soma/components/card/` con la forma ya establecida por `menu-dial` / `onion-menu`: eidos posee estado y render, soma posee sólo el `SomaRuntime` que emite. ## Documentación: 22 mentiras corregidas `docs/` afirmaba guards inexistentes (`NO_MISSING_PROVIDER_TESTS`), APIs con firma equivocada y un modelo de Motion que el código no implementa. Corregido en CANON, arquitectura, glosario, theming/motion, checklist y los README de `motion` / `callout` / `arts/motion`. ## Además - CardGroup: la descripción se metía en la primera celda del grid. - Motion: `data-state` siempre estampado, salida real en `leave()`, token fantasma `--motion-stagger-each-default` eliminado. - `engine-motion`: `handoffState` Map → WeakMap (fuga por nodo). - `mockup`: primitivo crudo → token de rol (R-4.6). - 5 catálogos de traducción que faltaban. Handoff: `docs/process/CONTINUE-audit-2026-07-29.md`. Batería: check 0 errores en src · vitest server 3701/3701 · docs:check 0/0 · component:audit 161 PASS / 2 NEEDS-WORK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| **Aura** | The canonical **agent-presence** component: materializes the `delegate` + `sustain` families by consuming `$scene/effects` semantically (intent → speed/amplitude/hue). **Built** — morfo + soma + eidos, `expression: 'family-default'` by signed decision. It surfaces the run cycle (`idle · offered · planned · reviewing · acting · escalated`), owns the agent's `polite` live region and the authorize/reject affordances. → [`architecture/agent`](./architecture/agent.md) §7 |
feat(packs+text): incorporate the animation collection — Ambient pack + text-effects family + docs Two streams, split by what the animation touches: STREAM A — decorative backgrounds → the pack tier - arts/scene: a consolidated scene runtime ($scene) that owns, once, the citizenship every ad-hoc background reinvented or skipped (frame loop, off-view pause, DPR cap, mandatory reduced-motion, WebGL context loss/restore, scene budget, teardown). SceneDom port (adom satisfies it), webgl/webgl2/canvas2d drivers + a custom-pipeline extension (vertexShader + draw + glContext.depth/dprCap) for real geometry (beam, particles, dither, grid, eter, pixel-blast, hyperspeed). 32 effects as shared resources. - src/packs/ambient: the first pack — <Ambient effect="…"> mounts a registered effect; the P contract (P-1..P-6) guarded by scripts/packs-check.ts; colors are token-aware (P-4). One-way dependency, removable-by-construction. - resolveToken extended to semantic color slots (--color-{role}-{slot}) so consumers resolve theme tokens to concrete colors (the P-4 half). STREAM B — animations over real text → canon - Six components (count-up + text-{gradient,circular,blur,focus,scramble}): each a morfo + eidos recipe (where there's styling) + demo. CountUp is a service component (counts through uix.format.numbers). The five Text* are passive decoratives. Upgrades over the seeds: SR hardening (real text visually-hidden + aria-hidden decoration), a11y fix (no fake role=button), measurement discipline (cached rects via dom.measure, no reflow storm), reduced-motion, ecosystem citizenship (eidos.dom/timers, no raw platform). - MorfoElement gains 'p'. DOCS - docs/architecture/packs.md (pack tier, admission rule, P contract, Aura promotion path); docs/decisions/design-text-effects.md (the family design record) + indexed in decisions.md / README.md; glossary entries (scene/Ambient/Aura/text effects); scene README custom-pipeline + authoring bridge; motion-guide content-effects note; strata tables acknowledge packs. Gates: component:audit 141/0/0 · docs:check 0/0 · scene tests 9/9 · packs:check 0/36 · check 0 own errors. Verified in browser (32 effects mount+compile; 6 text components SSR+hydrate, CountUp re-formats by locale live, TextGradient resolves token stops to OKLCH via var()). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
| **text effects** | A canon family of eidos components that treat REAL text content (`TextGradient`, `TextCircular`, `TextBlur`, `TextFocus`, `TextScramble`) plus the service `CountUp` — the animated siblings of the typographic primitives. Content stays the accessibility surface; the animation is presentation. Each self-documents (README + demo). |
## Morfo vocabulary
| Term | Meaning |
| --- | --- |
| **part** | A named sub-element of a component (`provider`, `trigger`, `content`, …). |
| **archetype** | Cross-component classification of a part (`trigger`, `item`, `option`, …) — used for transversal eidos selectors and sema verbs. |
| **kind** | A part's visibility: `public` \| `internal` \| `private`. |
| **data-attr contract** | The stable markers a part emits: `data-{component}` (provider) and `data-{component}-{part}`. Never `data-soma-*`. The eidos/sema frontier. |
| **value sources (`v.*`)** | Typed origins for an ARIA/data value in morfo: `v.literal`, `v.stateRef`, `v.partRef`, `v.propRef`, `v.translationRef`. |
| **scope** | Which layers implement the component: `['soma']`, `['soma', 'eidos']`, … |
| **2-of-3 rule** | A morfo field is justified only if at least 2 of soma / sema / eidos consume it. |
| **compileMorfo** | Turns a morfo into a `CompiledMorfo` (resolved attr/keyboard/action plans + the closed set of CSS selectors), cached by morfo identity. |
| **expression** | How a morfo materializes its perceptual signature: `'pack'` \| `'family-default'` \| `'delegated'` \| `'none'`. |
## Soma vocabulary
| Term | Meaning |
| --- | --- |
| **provider** | The concrete state class for a component or part. The root registers context; sub-parts read it. Exported as `Xxx.Provider`. |
| **SomaRuntime** | The morfo interpreter in soma. `runtime.part()` registers a part; `runtime.trigger(event)` sequences prewrite → emit → handler → effect-driven attrs. |
| **layer (soma)** | A shared behavior class consumed by providers: `Presence`, `FocusScope`, `Dismissal`, `ScrollLock`, `Gesture`, `SafePolygon`. → [`SOMA_ARCHITECTURE`](./architecture/soma-architecture.md) §6 |
| **Presence** | Animation-aware mount/unmount (waits for exit animations before removing). |
| **Active\<T\> / State\<T\>** | Reactive containers (readonly / mutable, exposing `.current`) that let runes be passed by reference between classes. |
| **context convention** | The `X.create()` / `X.get()` / `X.require()` static methods every context-using class follows. |
| **roving vs virtual focus** | Two keyboard strategies: real DOM focus with one `tabindex=0` (roving) vs focus stays on the input and items are `data-highlighted` via `aria-activedescendant` (virtual). |
| **polymorphic close** | One `close` event with `allowedFamilies`; the provider chooses the family at dismiss time (used by Dialog/Drawer/Popover). |
| **prewrite / commit** | DOM written imperatively *before* the semantic emit (`prewrite`, e.g. `data-last-action`) vs the structural state written *after* (`commit`). |
## Sema vocabulary
The values live in [`CANON.md`](./CANON.md); these are the term shapes.
| Term | Meaning |
| --- | --- |
| **family** | One of the **8** perceptual event families (contact · commit · signal · handle · emerge · shift · sustain · delegate). → CANON |
| **intent** | The evaluative load of an occurrence (neutral · affirm · fulfill · risk · threat · loss) — only on valenced families. → CANON |
| **verb** | The specific act within a family (`tap`, `select`, `close`, …). → CANON |
| **channel** | An expression modality. Sema runs two at runtime (sound, haptic) and projects `visual`; eidos owns the rest (motion/presence/depth/shape/color). → CANON |
| **hold** | The minimum perceptible duration a signal stays projected (`data-event-*` stamped during it). |
| **cascade** | The layered resolution of a perceptual signature (1 family base → 2 intent deltas → 3 per-event → 4 globals → 5a packs / 5b app rules). → [`architecture/sema`](./architecture/sema.md) |
| **persistence** | A signal's lifecycle, distinct from hold: `transient` \| `untilAction` \| `untilFix` \| `stateBound`. |
## Eidos vocabulary
| Term | Meaning |
| --- | --- |
| **recipe** | A component's token + CSS definition (in `EidosConfig.recipes` / `{name}.css`). |
| **token** | A CSS custom property. Public: `--{component}-*`; private recipe-internal: `--_{component}-*`. Never `--eidos-*` / `--soma-*`. |
| **TSC (Token Scope Contract)** | Where each token is allowed to be emitted (`:root` / `[data-{c}]` / by color / by event) + transitivity validation. → [`canon/tsc`](./canon/tsc.md) |
| **variant** | A fixed visual archetype (`solid`, `outline`, `ghost`, …). Canon of eidos — a theme cannot invent or redefine one. |
| **role** | One of the **9** canonical color roles (`primary`, `secondary`, `tertiary`, `neutral`, `affirm`, `fulfill`, `risk`, `threat`, `loss`). |
| **scaling / density** | Orthogonal structural axes: global zoom (90–110) vs spacing (compact/comfortable/spacious). |
| **theme** | A retint of the perceptually-fixed: it changes *which hex* is `affirm`, never *what* `outline` means. → [`THEMING`](./theming/reference.md) |

Powered by TurnKey Linux.