Documentación al día de lo que se cerró hoy y handoff para retomar mañana.
- `PLAN-blocks.md` §7: **F2.1 `site-header` HECHA** con sus siete commits, la
fase 0 contra el dossier §P1, el landmark que le faltaba a `NavigationMenu`
(arreglado en el canon, no parcheado en el block), el hueco del CTA que
navega y parece botón (registrado, no falseado) y el defecto de framework
que destapó la demo.
- `theming/changelog.md` §46: las 44 variables de cascada de `Box` dejan de
heredarse. Un `Section` regalaba su padding a cada descendiente —la galería
arrastraba ~300px de aire desde F0— y los hijos heredaban anchos y `display`
ajenos. `@property { inherits: false }`, radio verificado sin regresiones.
Lección: una variable que un componente escribe para SÍ MISMO debe declararse
`inherits: false`; si no, deja de ser un prop y se vuelve un contagio.
- `architecture/blocks.md` B-9: la demo de un block se construye sobre el
harness compartido y el block se enseña A SANGRE — nunca dentro de un marco
con relleno ni de una caja con scroll, porque eso cambia lo que el block
hace.
- `src/uix/blocks/README.md`: anatomía de la demo (harness, `{Name}Site`, ruta
`preview`, `DocRow`, catálogo único, ejes en el shell).
- `CONTINUE-blocks.md` (nuevo): handoff — qué toca (F2.2 `hero`), la plantilla
de ficheros para copiar, las reglas que ya costaron sangre (a sangre, iframe
solo para anchos de dispositivo, cada prop un control, nada de backticks en
`<Text>`, ojo con las variables que heredan), la deuda declarada que es
decisión del usuario y el estado exacto de los gates.
Gates al parar: `blocks:check` verde · `svelte-check` 73 errores, todos deuda
ajena (0 propios) · `vitest src/uix/eidos` 353/353 · `contracts.test` con los
3 fallos ajenos conocidos.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Decisión del usuario. Un nodo deshabilitado conserva su fila (sigue siendo
parte del mapa) pero pierde el `href`: no hay nada que activar con clic,
Enter ni «abrir en pestaña nueva». Un `pointer-events: none` de CSS solo
habría tapado el ratón.
- morfo: la parte `link` gana `data-disabled` (propRef) y `aria-disabled`
(literal `true` bajo `prop-truthy: disabled`).
- soma: `disabled` solo aplica con `href` (un grupo sin destino lo ignora);
el toggle del grupo NUNCA se deshabilita — mostrar/ocultar es control de
vista, no destino.
- eidos: fila en `--color-content-disabled`, sin puntero y sin hover.
- demo: «Agent» va deshabilitado con badge «Soon» + filas de API y a11y.
Verificado en navegador real: `<a>` sin href, `aria-disabled="true"`,
`data-disabled`, color 0.79 frente a 0.61 de una fila normal, clic sin
efecto, fuera del orden de tabulación (44 focusables en vez de 45), badge
dentro del control. `component:audit` PASS · eidos-lint 28 morfo-backed / 0
invalid · `vitest src/uix/eidos` 353/353 · svelte-check 0 errores míos.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cierra el árbol de navegación data-driven (E-1) de F1: demo canónica de 9
pestañas con el mapa real de docs (43 nodos, 3 niveles), verificación en
navegador real y review adversarial (5 dimensiones × 3 verificadores
escépticos; 22 hallazgos brutos, 10 confirmados) con todos los confirmados
arreglados.
Arreglos del review
- sema: la parte `group` —target de los eventos emerge— se registraba SIN
`ref`, así que `runtime.trigger` lanzaba `SomaRuntimeTargetError` en
silencio y el pack no sonaba nunca (cero `data-event-*` en el grupo frente
a los de collapsible). El provider posee ahora el ref del `<ul>`.
- eidos: en una fila navegable el chevron resolvía `inline-size: 100%` como
flex-basis y ocupaba media fila (101 de 231 px en «Soma»), robándole clics
al enlace. Toggle compacto con suelo de diana de 24 px (WCAG 2.5.8).
- soma: una clave duplicada podía volver cíclico `parentByKey` y colgar la
pestaña dentro de `trailKeys` (deriva en render) → clave sufijada + aviso
del logger + guarda de ciclo en el paseo.
- soma: el colapso es CONTEXTUAL (recuerda el `activeKey` bajo el que se
hizo): cerrar la sección que lees se respeta, pero caduca al navegar
DENTRO del grupo, para que la página actual nunca quede sin fila visible.
Sigue siendo query pura, sin `$effect` que escriba estado.
- soma: `child` recibe también `children` (el árbol renderizado); antes
dejaba el landmark vacío, porque un árbol data-driven no lo puede
reautorar el consumidor.
- morfo + langs: el nombre accesible del chevron se declara en el contrato y
se localiza («Alternar sección {label}»); ya no duplica el del enlace.
- eidos: RTL completo — el glyph espeja solo (bordes lógicos), lo que no
espeja es el giro, así que bajo `[dir='rtl']` las dos rotaciones se
intercambian. El Gap «dirección del chevron en RTL» queda RESUELTO.
- demo: paridad de snippet con los controles vivos; fuera el token fantasma
`--nav-tree-rail-width` del docblock del recipe.
badge en v1 (decisión del usuario, delegada)
Está en el suelo de paridad del dossier §P5 (los 6 refs lo llevan). Se
resuelve con SNIPPET, no con recursión a nivel de eidos: el morfo declara la
parte `badge`, soma renderiza el snippet recibido (sin él, el valor crudo —
sigue siendo headless) y el wrapper de eidos pasa el `Badge` canónico. Va
DENTRO del control de la fila, así su texto entra en el nombre accesible
(«TSC, New, enlace»). `disabled` se descarta en v1 (fuera del suelo, y un
enlace de navegación deshabilitado es semánticamente dudoso); ambos quedan
registrados en la tabla de Gaps.
Verificado: `component:audit` PASS · eidos-lint 26 morfo-backed / 0 invalid ·
`svelte-check` 0 errores en estos archivos · `vitest src/uix/eidos` 353/353 ·
navegador real (Playwright): trail auto-expandido, sema estampando en el
grupo, teclado nativo, foco visible, claro y oscuro, RTL, 375 px sin
desbordes, 0 errores de consola.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adversarial-review outcome (fixes + documented v1 limits) and the two
piggybacked sticky type-fixes recorded; scoreboard corrected (prose F1.5
had also landed).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Registra sticky (998b11d9b) en el registro del plan: primer componente
behavioral, mapa de construcción por workflow, lecciones (jsdom-pragma
ignorado en browser mode → test IO-real en chromium; entangle de barrels
con sesion paralela; tension del test harness declarada). F1 = 4/8.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tercera pieza F1 del plan blocks (alcance E-2, dossier §P3). Banner = tira
de anuncio de pagina; Callout = el aside del documento (split deliberado).
- morfo: 4 partes (provider role=note / icon / title / content) + texts con
TITULOS DEFAULT LOCALIZADOS por intent (note/tip/warning/caution — patron
GitHub de label visible: la semantica nunca viaja solo en color/icono);
0 eventos justificados (dismissible DIFERIDO a pasada soma+sema por la
regla de admision — dismiss ES un evento real)
- el hueco IMPORTANT resuelto con el modelo Radix, sin 5o enum: `intent`
(neutral|affirm|risk|threat — mapea NOTE/TIP/WARNING/CAUTION) + `color`
override SOLO bajo neutral (doctrina §4: intent evaluativo gana);
IMPORTANT = intent neutral + color + titulo propio (preset en la demo)
- pintura sobre la maquinaria C6/THM-2 (patron badge): forwarders por color
+ slots `_palette-track/text/solid` → el generador emite la cascada de 8
roles Y el forward presence-guarded al shared layer — 33 escalas y
colores custom con CERO CSS extra
- a11y: role=note NOMBRADO via aria-labelledby → Title SOLO mientras esta
montado (registro reactivo por context local); escalacion tipada
role=status|alert|none (el role=alert estatico de shadcn = bug de
referencia que NO copiamos); Title NO es heading (protege el outline que
escaneara anchor-nav); icono decorativo = mapa doctrinal IntentIcon
- fix cazado en navegador: el `+=` del registro leia el estado dentro del
tracking del $effect del hijo → effect_update_depth silencioso (contador
a -997, attr nunca estampado) — untrack() en register/cleanup; leccion
registrada en memoria (incidente 2 de la clase)
- recipe: grid con acento logico border-inline-start (RTL-correcto),
nesting tolerado (Docusaurus); demo v2 9 tabs con preset IMPORTANT +
PalettePicker showIntent=false; README completo
Verificacion: component:audit PASS 0E/0W · eidos-lint 8 morfo-backed/0
invalid · guards 37/37 · svelte-check 76E/51W = baseline exacto ·
navegador: «Nota»/«Atencion» localizados · risk=ambar hue 45-60 ·
IMPORTANT=plum hue 326 resuelto por shared layer · labelledby=titleId ·
cero errores de consola.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Segunda pieza F1 del plan blocks (alcance E-2 = suelo de paridad, dossier
§P3). Comparte el esqueleto de empty-state a proposito: EmptyState describe
AUSENCIA de datos, Result reporta un RESULTADO — un lenguaje de layout, dos
contratos (duplicacion consciente registrada en el README; revisable al 3er
consumidor).
- morfo: 6 partes display (provider/media/title/description/actions/extra;
extra SIN archetype — parte genuinamente propia), scope ['eidos'],
0 eventos justificados (el resultado ya OCURRIO antes de renderizar)
- status: enum de 7 = paridad AntD CON `warning` (decision firme del
dossier) y HTTP renombrados semanticos (forbidden/not-found/server-error,
nunca '404' stringly); default 'info'; data-status = attr eidos-only
- media default: compone el mapa doctrinal IntentIcon (success→fulfill ·
error→threat · warning→risk) + Info de catalogo; HTTP = codigo mono
grande NEUTRO aria-hidden (situaciones, no fallos — AntD jamas pinta 404
de rojo); children reemplazan el default entero (context local eidos-only
con getter reactivo)
- Title default h2 (vs h3 de empty-state — Result suele SER la pagina);
Actions con label→role=group; Extra alineado a inicio (detalle que lee)
- recipe: glifo display 3× xl bundle; tokens publicos
gap/actions-gap/measures + {status}-color como forwarders de rol
retintables; sin eje size (paridad AntD, gap diferido)
- demo v2 9 tabs con copy por status + entrada nav (Status) + README
(Comparativa · Decisiones · Passive justification · Gaps con disposicion)
Verificacion: component:audit PASS 0E/0W · eidos-lint 6 morfo-backed + 5
eidos-only sancionados · recipe/api/visual-attrs 37/37 · morfo:check verde
(los 7 fallos listados son deuda foranea preexistente) · svelte-check
76E/51W = baseline exacto · navegador: success=fulfill verde 84px ·
error=threat rojo · not-found=«404» mono neutro, copy conmutando, cero
errores de consola.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Firmas del usuario (2026-07-21) tras el dossier de referencia:
- E-1: componente canonico nav-tree (F1.8, data-driven — precedente Menubar)
resuelve la colision sidebar-app vs arbol-docs/B-5; fiche nueva con
fase 0 obligada contra nuestro tree-view; docs-shell compone NavTree.
- E-2: suelo de paridad del dossier = alcance v1 (regla en intro F1).
- E-3: F2 pasa de 10 a 14 (banner · team · contact · content-section);
fiches nuevas + galeria actualizada (verificada en navegador: 28 badges).
- E-4: distribucion registry/llms.txt/MCP → iniciativa propia (next-features
§9; ese archivo sigue fuera del commit por diff foraneo).
- E-5: ⌘K = listener app-land documentado (nota en F4.1).
Doctrina: promotion path de architecture/blocks.md actualizado a 8.
Verificacion: docs:check 0/0 (512).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Encargo del usuario (2026-07-21): estudio de referencia para "estar al menos
a la par y cuanto menos superarlo". 6 agentes de investigación web en
paralelo sobre fuentes oficiales vivas (varias verificadas a nivel de código
fuente: sidebar.tsx del registry shadcn, styles.js de tailwind-typography,
sources de Mantine/Starlight/Docusaurus/Ark).
- docs/process/RESEARCH-blocks-references.md — el dossier: P1 catálogos de
marketing (conteos+variantes) · P2 aplicación (ProTable/ProLayout,
dashboard-01, Tremor 303, Clerk/Supabase) · P3 F1 ligeros (APIs a nivel de
prop; scroll-state(stuck) como vocabulario de plataforma; role=alert de
shadcn = bug a no copiar) · P4 prose+sidebar (not-prose/:where()+donut;
shadcn 23 partes) · P5 docs shells (Fumadocs benchmark; colision F1.7 vs
nav-tree/B-5; ruta svelte2tsx para props TS) · P6 ecosistema Svelte
(shadcn-svelte 58 blocks solo-app; hueco "sistema integrado" VACIO) +
sintesis: 5 conclusiones, enmiendas E-1..E-5 (presentadas, firmas
pendientes), 10 angulos de superacion.
- PLAN-blocks.md — regla nueva §4 (toda fase 0 contrasta contra el dossier),
puntero de colision en F1.7, registro.
Verificacion: docs:check 0/0 (512 docs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tier nuevo aprobado 2026-07-21 (D-BLK firmadas; D-BLK.1 enmendada: vive en
src/uix/blocks/). Plan de ejecución completo en docs/process/PLAN-blocks.md.
- docs/architecture/blocks.md — doctrina E1 (regla de admisión canon-vs-block,
contrato B-1..B-11, promotion path); espejo de packs.md
- alias $blocks → src/uix/blocks (vite + svelte.config + tabla CLAUDE.md)
- src/uix/blocks/README.md — mapa del tier + template de README de block (B-9)
- scripts/blocks-check.ts + npm run blocks:check — guard mecánico del contrato
B con self-test de detectores (fixtures inline; 5532 archivos de
canon/arts/libs/packs escaneados para dirección de imports)
- web/routes/blocks/ — galería índice del catálogo planificado + layout de
bootstrap propio (+layout@.svelte, espejo mínimo del de /uix sin packs sema)
Verificación: docs:check 0/0 (511) · svelte-check 76E/51W = baseline exacto ·
blocks:check verde · galería comprobada en navegador (a11y-tree + estilos
computados en light y dark; captura de píxel bloqueada por panel suspendido).
Fuera del commit: fila E1 en docs/README.md y §8 en docs/next-features.md
(diff foráneo de otra sesión sin separar — ver registro del plan).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>