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/decisions.md

92 lines
16 KiB

---
title: UIX Decision & RFC Index
type: index
audience: human + agent
authority: navigational — the single entry point to the design/RFC corpus
status: current
related:
canon: docs/CANON.md (semantic vocabulary)
theming: docs/theming/reference.md (eidos visual system, canonical reference)
---
# UIX Decision & RFC Index
This is the **entry point to the framework's design rationale** — the RFCs, the
per-subsystem design documents, and the decision logs. It is the E3 stratum of
the corpus: _why it is built the way it is_. Architecture (how the layers fit)
lives in [`architecture/active-architecture.md`](./architecture/active-architecture.md);
the semantic vocabulary lives in [`CANON.md`](./CANON.md); this file collects the
_decisions_.
Each entry gives the document, its status, and the one decision it records. Open
the document for the full argument — this index never copies it.
> **Naming note.** The eidos RFCs were renamed to `rfc-*` when they moved into
> `docs/rfcs/` (docs-book F7.4, 2026-07-02). The provenance anchors cited from
> source (e.g. `// (DEPTH_ENGINE_RFC §5)` across `src/uix/eidos/lib/*.ts`)
> keep resolving: every old path holds a stub pointing at the new chapter with
> the same section numbering. The arts design documents got the same treatment
> (arts-docs-reconciliation B2, 2026-07-03): they moved to
> `docs/decisions/design-*.md`, and every old path holds a stub so their
> citations (e.g. `DESIGN_TIMR §12.8` across `src/arts/timer/*`) keep resolving.
---
## Eidos — expression channels (the 8 of the book)
[`theming/channels.md`](./theming/channels.md) is the umbrella:
the conceptual synthesis of the book's eight expression channels (time · motion ·
presence · depth · shape · color · sound · haptic). The engine RFCs below take the
visual channels to reference-grade, one at a time, "breaking the model of the
references rather than copying it — with the cage open".
| RFC | Status | The decision it records |
| --------------------------------------------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`rfc-color-model.md`](./rfcs/rfc-color-model.md) | RESUELTO (2026-06-02) — canon in [`theming/reference.md`](./theming/reference.md) §25 | The conceptual color model: rich palette (33 scales) + hierarchy roles by explicit alias + intents auto-derived from the palette (identity = step 9). Rejected the "intent = single-anchor" variant. |
| [`rfc-color-engine.md`](./rfcs/rfc-color-engine.md) | ✅ Implementado (hasta fase 4-bis) | The _physical_ layer of color: OKLCH · P3 wide-gamut · APCA contrast · 1-seed generator. Changes how the color variables are produced, not which exist or what they mean. |
| [`rfc-typography.md`](./rfcs/rfc-typography.md) | ✅ Implementado (fases 1–5) | Typography to reference-grade, additively behind the frozen token contract (audit → compare → extend, mirroring color). |
| [`rfc-depth.md`](./rfcs/rfc-depth.md) | ✅ Implementado (fases 1–5) | The depth/presence channel: "depth is not something an element _has_, it is something that _happens_". Two-moment model (state + event). |
| [`rfc-shape.md`](./rfcs/rfc-shape.md) | ✅ Implementado (fases 1–5) | The shape channel (the book's 8th and last expression channel) as orthogonal axes on top of the untouched `--radius-*` magnitude. |
## Eidos — structural systems
| RFC | Status | The decision it records |
| --------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`rfc-structure.md`](./rfcs/rfc-structure.md) | Propuesta | Space · density · scale as state-only structural systems (the stage, not the event): rhythm, fluidity, axis composition under the open cage. |
| [`rfc-scaling.md`](./rfcs/rfc-scaling.md) | ✅ IMPLEMENTADO (2026-06-02) | Splits global zoom (`scaling`: 90/95/100/105/110) from density. Scales space + control-height + font-size + icon-size; radius/border/shadow/line-height excluded on purpose. |
## Arts — subsystem design documents
Exhaustive design-and-implementation records for the harder runtime artifacts.
Each predates the 2026-05-14 directory-rename sweep and carries a historical-note
header about the old short names (`conn`/`timr`/`sess`). Moved into the corpus
(B2, 2026-07-03); a stub at each old `src/arts/*` path keeps the source
provenance citations resolving. `design-timer.md` is kept verbatim in Spanish.
| Document | Subsystem | The decision it records |
| ---------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------- |
| [`design-connection.md`](./decisions/design-connection.md) | `connection` | Realtime connection registry: transports, reconnect, heartbeat, request/reply, channels, session bridge. |
| [`design-timer.md`](./decisions/design-timer.md) | `timer` | Deterministic timer scheduler: clock injection, the race-safety contract (§12.8), one-shots, intervals, backoff. |
| [`design-session.md`](./decisions/design-session.md) | `session` | Session lifecycle consultation: adopt/revoke/refresh, profile loading, SSR via cookie reader. |
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
## Component families — design records
Design records for component families whose doctrine spans several components
(so it belongs in one durable place, not scattered across per-component READMEs).
| Document | Family | The decision it records |
| ---------------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`design-media-quality.md`](./decisions/design-media-quality.md) | `media-player` | **Especificado, no implementado.** Por qué la calidad de reproducción no está en el puerto `MediaProvider` y nunca podría estarlo con un `<video src>` plano (los niveles los aporta un motor HLS/DASH que el framework no vendoriza); el contrato mínimo si se abre (3 campos de snapshot + `setQuality` + los espejos de `$arts/sound` + un evento de morfo que rompe el censo de 11); por qué el control se AUSENTA en vez de salir vacío; y por qué `settings-button` sigue declarado y sin implementar. |
| [`design-text-effects.md`](./decisions/design-text-effects.md) | text effects | Why animations applied to real text are **canon** (a11y surface = contract surface) while backgrounds are the pack tier; the CountUp-service vs `Text*`-decorative split (D-T1/D-T2); the shared doctrine every member obeys (content-is-the-SR-surface, no fake interactivity, measurement discipline, reduced motion, ecosystem citizenship, theme-aware color); per-member animation home (D-T5); the `TextCircular`→`Aura` connection. |
| [`design-chat-block.md`](./decisions/design-chat-block.md) | chat (`chat-*`) | Why the messaging block **composes** the ecosystem (triple-registered `Feed` + anchored `VirtualList`, `Textarea`, `FileUpload`, lucide `Icon`) instead of reinventing; the five sector failures it beats (a11y feed + separate live region, virtualization, transport-agnostic, headless-with-logic, threads/reactions); the anchoring doctrine (monotonic sticky, real-DOM pin); the reference visual redesign (soft bubbles, tapback bar, canonical size contract); and the two framework fixes it surfaced (langs `#?`-prefix, `commit-set-resize` `channels:[]`). |
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
## Cross-cutting decision logs
| Document | The decision it records |
| ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`LIBRO_VARIACIONES_Y_EXTENSIONES.md`](../src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md) | The running log of where the implementation deviates from (or extends) the book's editorial canon — verbs, adoptions, clusters, and the D.x architectural decisions. The seed for a consolidated decision-log. |
| [`GESTURES.md`](../src/uix/soma/layers/gesture/GESTURES.md) | The soma gesture layer design: `Gesture.base`/`drag`/`resize`, velocity ring-buffer, axis lock, deferred pointer capture. |
| [`architecture/active-architecture.md` §7 + `arts/adom`/`arts/perf` READMEs](./architecture/active-architecture.md) | **Sec-dom — read-timing & token-resolution (2026-06-29).** The framework governs layout READS like it governs writes: `dom.measure` (coalesced post-layout reads), `eidos.resolveToken` (token→colour in JS, no `getComputedStyle` probe), the discoverable `uix.color`/`uix.perf` surfaces. Decided: **reject** a static grep-guard (too noisy across ~120 legit reads, and it can't catch the sync-read-after-write _ordering_ nor cover routes) — the dev `uix.perf` detector (Long Animation Frames) is the runtime safety net instead. |
feat(direction): eidos comparte el contexto, y el corpus registra el endgame La entrada eidos se parte igual que la de soma: `activeEidosDir(dir)` devuelve la AFIRMACION (prop -> ancestro) y publica en el MISMO DirectionContext — un chart eidos-only dentro de un subarbol soma afirmado (o al reves) resuelve el mismo hecho. La cola matematica va a `resolveEidosDir(dir, eidos.prefs)`, con la vista de prefs cacheada por instancia (WeakMap): construirla dentro de una funcion pura llamada por $derived era una alocacion por pasada. createChartRtl consume las dos mitades por su lado: `attr` estampa la afirmacion cruda (ausente hereda del <html> proyectado), `current`/`anchor` resuelven la cola. Corpus: - direction-contract.md §2 pasa del campo obligatorio de 4.1 al mecanismo del morfo (declaracion -> tipo condicional -> estampado; secundarios del mismo morfo; el censo como guard), §7 documenta el contexto compartido y la tabla de entradas partidas, y el checklist §8.3 pide morfo + cable. - docs/decisions.md registra la ratificacion D1-D4 del 2026-08-05 con las cuatro decisiones y su porque. - CONTINUE-direction-runtime.md §11 cierra el handoff: tabla de fases con commits, verificacion final medida, la cola pospuesta por D4 y las trampas nuevas (pathspec SIEMPRE en rama compartida; el detector de huerfanos y la ruta del import; la vista en $derived). check 77 = linea base · morfo+direction suites 131/131 · docs:check 0/566. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
| [`canon/direction-contract.md`](./canon/direction-contract.md) §1, §2, §6 | **Direction endgame — physics over convention (ratified 2026-08-05).** Four decisions signed at once: (D1) the chain gains the CONTEXT link — every `activeDir` publishes its assertion and descendants consult it before prefs, the "implicit inheritance" phase reopened and ratified, closing both field-measured holes (in-place and portal) with one mechanism; (D2) the attribute stamps ONLY the assertion — prefs leave the per-component chain and reach the page once, through the now-AUTOMATIC boot projection (opt-out in standalone, opt-in in attach), with the environment SEED (`readPrefsEnvironmentFromDom`) adopting a hand-set `<html dir>` at precedence `intent > env > derive(language) > default`; (D3) the stamping mechanism belongs to the MORFO — `direction: { parts }` declares it, `soma.runtime<M>` computes the requirement from the declaration (required when declared, forbidden when not), `compileMorfo` validates part names fail-closed, and the census guard crosses prop ↔ morfo; (D4) the API census (7 components without the prop + chat-log) stays POSTPONED by explicit decision. |
| [`canon/direction-contract.md`](./canon/direction-contract.md) | **Direction — resolution, assertion and paint.** One chain resolves a component's reading direction, one native attribute asserts it to the DOM, one selector form reads it back. Decided: the resolver stops **before** the default and returns `undefined`, because _nobody asserted a direction_ is a different fact from the default; stamping `dir` is **conditional** on who reads the direction — mandatory when the recipe branches with `:dir()`, needless when the dependence is pure JavaScript; and the static guard (`RTL-1`, `npm run rtl:check`) is deliberately scoped to the one trap CSS text can reveal — a logical inline anchor paired with a physical inline translate — leaving the chain, the attribute and the selector form to review. |

Powered by TurnKey Linux.