diff --git a/docs/architecture/blocks.md b/docs/architecture/blocks.md index c924ecc35..4c882fb43 100644 --- a/docs/architecture/blocks.md +++ b/docs/architecture/blocks.md @@ -151,6 +151,24 @@ asserts its own detectors against inline fixtures on every run). announcer on the page. Anything beyond these two is the app's, or the admission rule firing. +- **Shells (`app-shell`, `docs-shell`) — geometría, no cableado.** A shell is + the block that owns a page's REGIONS: their landmarks, their skip links and + their heights. That last one is why the tier needs it at all — an affixed + notice and a pinned header fight for the same edge, and no component can + arbitrate because none of them owns the page (ledger A-95). What a shell owns: + the grid, the scroll model, the landmark set, and the state that its own + regions share (a collapsed nav, a folded aside). What a shell does NOT own, + and this is the line that matters: **the composition root**. Creating + `ActiveApp`, attaching `ActiveUix`, mounting ``, wiring `modeSource` / + `densitySource` into `ActiveEidos`, projecting prefs onto the document, + persisting them — all of that is the application's, exactly as it is for every + other block (§Services above; only composition roots create services). A shell + that read `App.session` to draw a user menu would be a composition root + wearing a block's clothes: it would work, and it would put the ecosystem's + boot inside a piece meant to be droppable into any app. The seam is the same + one every block uses — snippets and props — and the proof that it suffices is + an application built on it, not a paragraph. + - **Prop naming — `size` es del BLOCK, nunca de una pieza interna**: un block que reenvía el eje de tamaño de algo que envuelve lo nombra **`{pieza}Size`** (`containerSize` para la medida del `Container`, `sectionSize` para el aire del diff --git a/docs/process/PLAN-blocks.md b/docs/process/PLAN-blocks.md index ce40f248b..bc6f7e506 100644 --- a/docs/process/PLAN-blocks.md +++ b/docs/process/PLAN-blocks.md @@ -84,15 +84,15 @@ quedó enmendada** respecto a la propuesta original del plan (que proponía `src/blocks/`); el resto se firmó tal como estaba propuesto. D-BLK.3/4/5 derivan de doctrina ya vigente y se firmaron por no-objeción. -| # | Decisión | FIRMADO | -| ----------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **D-BLK.1** | Ubicación y alias | **`src/uix/blocks/`** + alias `$blocks` (decisión de usuario: el tier es UI y vive junto a las capas). La prueba de encapsulación se conserva íntegra: borrar `src/uix/blocks/` deja `npm run check` verde y NADA del canon (`morfo/soma/sema/eidos/active-uix/langs`) lo importa — blocks es un tier bajo `src/uix/`, no una quinta capa. | -| **D-BLK.2** | Estilos | **Layout-components-first**: el layout se hace componiendo `Container/Section/Stack/Flex/Grid/AutoGrid/Wrap/Group/Separator/AspectRatio/Surface` y sus props. Un block NO trae `.css` propio; un `