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. 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 — 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é |
|---|---|---|
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)
- La pantalla del navegador oculta congela rAF y el layout.
getBoundingClientRectdevolvía 256px para un panel de 52, y niinline-size: 52px !importantlo 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 (playwrightno resuelve desde el scratchpad). - Leer
animationNamedentro del callback de un MutationObserver mide el instante ANTERIOR al flush. Reportédismiss-fadecomo viva y estaba muerta 3,5 ms después. Se muestrea en varios instantes (+8/+30/+120/+400/+800 ms) leyendodisplay,opacityygetAnimations(). npm run checkpuede morir portmp/lexical/(scratch de otra sesión con unsvelte.config.jsque importa un paquete ausente). Si el log no llega aCOMPLETED, es eso: volver a lanzarlo.- La rama es COMPARTIDA. Otra sesión commiteó
23667277cmientras esta trabajaba. Nada deamend, y mirargit logantes de tocar historia.
Fuentes
- Plan y decisiones:
PLAN-sidebar.md. - Registro del tier:
PLAN-blocks.md§F1.7 (última línea). - Contrato publicado:
src/uix/soma/components/sidebar/README.md§Sema events ·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).