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/process/CONTINUE-sidebar.md

110 lines
7.8 KiB

# CONTINUE — eje `Sidebar` (handoff, act. 2026-08-19)
**Estado: EJE EJECUTADO Y CERRADO.** Las 7 decisiones (más dos que salieron
durante la ejecución) están firmadas, las cinco fases hechas y verificadas en
navegador, y la revisión adversarial pasada con sus cuatro hallazgos arreglados.
Tres commits en `alpha-0.1-background`:
| Commit | Qué cerró |
| ----------- | ------------------------------------------------------------------------------------------- |
| `f6d5fa159` | F1 + F2 — sema: el par del libro en la fila, el flyout con sus `emerge`, el raíl con su contacto |
| `63b2de03c` | F3 + F4 — el eje `size` sobre el bundle, el raíl de iconos derivado, docs y demo |
| `bae03e55c` | Los 4 hallazgos reales de la revisión adversarial |
**Por dónde entrar mañana: [§Qué queda](#qué-queda).** En este eje **no queda
nada**; lo que queda son **seis deudas de OTROS ejes** que este destapó — y
**T-1 ya está cerrada** (2026-08-19, `navigation-menu` habla ahora el mismo par
que la fila). Quedan vivas T-2…T-6.
## ⚠️ LO PRIMERO: la fuente viva es el PLAN, no este fichero
**[`docs/process/PLAN-sidebar.md`](./PLAN-sidebar.md)** — el veredicto razonado
(§0), el inventario de defectos medidos (§1), los dos contratos objetivo (§2
sema, §3 talla), las decisiones firmadas **D-SB.1…D-SB.7 + D-SB.1bis +
D-SB.5bis** (§4, con §4.1 = la refutación de la lectura `commit.select`), las
fases con sus gates (§5), **la deuda transversal T-1…T-6** (§6) y el registro de
ejecución con todas las mediciones (§Registro). Este handoff indexa; el plan
manda.
## Qué cambió, en una pantalla
**Sema.** La fila del sidebar era MUDA. No era doctrina: era una decisión de la
fase 1 (2026-07-22) tomada en silencio sobre una premisa falsa —«item = Link
puro»—, cuando la fila es `<button>` sin `href`, la acción es un botón pelado y
el `MenuItem` posee un flyout. El libro no deja margen (cap. 22 §9 «Link →
contact.press seguido de shift.navigate», cap. 27 §8, cap. 22 §12 «Contacto
mudo»), así que ahora:
| Evento | Dónde se sella | Voz |
| --------------------------------------- | ------------------------------------- | ---------------------------- |
| `contact-activate` | la fila / sub-fila / raíl **anclado** | familia (`touch` + tick) |
| `shift-navigate` | el **provider** (lo que cruza) | familia (`slide`) |
| `emerge-open-sub` / `emerge-close-sub` | el `menu-sub` (por identidad) | **SILENT** (pack) |
| `emerge-expand` / `emerge-collapse` | el `panel` (sin cambios) | `emerge.soft` / `exit.soft` |
**Por qué el cruce NO va en la fila** (D-SB.1bis, salió al leer F0): «reach for
`regime` last». El gesto se sella donde está la mano y el cruce en la superficie
que cruza como unidad, así los dos no comparten la única ranura de
`data-event-*`. `calendar` ya había movido su `shift-navigate` fuera del botón
por esto mismo — su `press-squeeze` no llegaba a pintarse.
**Talla.** El componente vivía fuera del canon: `--space-8` (escala de ESPACIO)
como altura de CONTROL, `font-size` escrito en el recipe donde el guard no lo
ve, `sm`/`xs` clavados en las composiciones y la acción con los 13,33px del
user-agent. Ahora hay prop `size` (xs..lg, default **md**), `data-size` en el
wrapper, tokens por talla apuntando al bundle `--size-{k}-*`, y el raíl de
iconos **derivado** en vez de `3rem`.
Medido end-to-end desde el prop: fila **26/12 · 30/14 · 36/16 · 44/20**, glifo
14/16/18/20, rótulo 10/12/14/16, raíl 42/46/52/60, y las composiciones capadas
en `md` (a `lg` el trigger y la acción se quedan en 36px; el badge baja un paso
por la excepción firmada D-SB.5bis).
## Qué queda
### En este eje: NADA
Los gates quedaron en verde y así se commitearon: `check` con **delta CERO**
contra la base medida con stash (72/72) · eidos-lint **49 morfo-backed / 0
invalid** · `component:audit --only sidebar` **PASS 0E/0W** · `rtl:check` 0 ·
`docs:check` 0/639 · suite nueva del sidebar **8/8** · `vitest src/uix/eidos`
434/435 (el rojo es `skin-media-player`, **ajeno** e idéntico en la base).
### En OTROS ejes: seis deudas, cada una con su firma (§6 del plan)
| Id | Dónde | Qué |
| -------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| ~~**T-1**~~ | `navigation-menu` | ✅ **CERRADA 2026-08-19**. Ya no emite `commit-select + affirm` al navegar: declara el mismo par que la fila del sidebar — `contact-activate` anclado en el enlace + `shift-navigate` en el `<nav>`. Cierra la fila de Gaps del `app-shell` por los dos lados y **enmienda D.6** (PROJECT_CANON). La cita del antipatrón es **TABLA 9.3**, no cap. 10 §12. |
| **T-2** | `nav-tree` · `anchor-nav` · `breadcrumb` | Siguen mudos por el mismo contrato que aquí se retiró. Mismo arreglo, un eje cada uno. `nav-tree.css:17` arrastra además el pin `sm`. |
| **T-3** | `Link` (primitivo) | Es `scope: ['eidos']`: sin runtime, no PUEDE emitir. La ficha **A-62** del ledger de blocks supone que sí — corregirla ahí. |
| **T-4** | Ledger blocks **A-50** (REFUTADO) | Se apoyaba en «el silencio de `Link` es contrato escrito, no deriva». Bajo el veredicto del autor ese contrato ES el defecto: reabrir. |
| **T-5** | `recipe-css-contract` | El guard del bundle sólo ve TOKENS, no reglas CSS. (Al mover el `font-size` al token, sí cazó el único primitivo crudo que escribí.) |
| **T-6** | `--control-height-*` en `:root` | Un `data-density` o un `--scaling` en un SUBÁRBOL no re-derivan las alturas: el custom property hereda su valor ya sustituido. Paridad exacta con `Button` (los tres a 36px), pero ninguna doc lo enuncia. |
## Trampas que costaron tiempo hoy (no repetirlas)
1. **La pantalla del navegador oculta congela rAF y el layout.**
`getBoundingClientRect` devolvía **256px para un panel de 52**, y ni
`inline-size: 52px !important` lo movía. No era el CSS: era el instrumento.
Toda la verificación se hizo con **Playwright headless**, y el script tiene
que vivir en la RAÍZ del repo (`playwright` no resuelve desde el scratchpad).
2. **Leer `animationName` dentro del callback de un MutationObserver mide el
instante ANTERIOR al flush.** Reporté `dismiss-fade` como viva y estaba
muerta 3,5 ms después. Se muestrea en varios instantes
(+8/+30/+120/+400/+800 ms) leyendo `display`, `opacity` y `getAnimations()`.
3. **`npm run check` puede morir por `tmp/lexical/`** (scratch de otra sesión con
un `svelte.config.js` que importa un paquete ausente). Si el log no llega a
`COMPLETED`, es eso: volver a lanzarlo.
4. **La rama es COMPARTIDA.** Otra sesión commiteó `23667277c` mientras esta
trabajaba. Nada de `amend`, y mirar `git log` antes de tocar historia.
## Fuentes
- Plan y decisiones: [`PLAN-sidebar.md`](./PLAN-sidebar.md).
- Registro del tier: [`PLAN-blocks.md`](./PLAN-blocks.md) §F1.7 (última línea).
- Contrato publicado: [`src/uix/soma/components/sidebar/README.md`](../../src/uix/soma/components/sidebar/README.md)
§Sema events · [`src/uix/eidos/components/sidebar/README.md`](../../src/uix/eidos/components/sidebar/README.md)
§Talla + §Sema events.
- Suite: `src/uix/soma/components/sidebar/sidebar-provider.svelte.test.ts` (8
contratos: dónde aterriza cada ocurrencia y cuándo NO se dice nada).

Powered by TurnKey Linux.