From 48bad6c7265846f83ebff178b6bbc704c4914c99 Mon Sep 17 00:00:00 2001 From: dev Date: Thu, 20 Aug 2026 01:19:00 +0200 Subject: [PATCH] =?UTF-8?q?uix(feature-split):=20una=20secci=C3=B3n=20se?= =?UTF-8?q?=20nombra=20por=20su=20encabezado,=20y=20sus=20filas=20cuelgan?= =?UTF-8?q?=20de=20=C3=A9l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feature-split era el único block de sección del tier sin parte .Header. Sus filas emitían h2 por defecto, así que una sección de tres filas aportaba tres h2 hermanos al outline y la sección misma no tenía nombre (A-110). La página compuesta lo rodeaba a mano: encabezado escrito como primer hijo y un level={3} repetido fila a fila. El h2 de las filas no era un descuido: era una decisión ESCRITA en el README del block —«.Title emits h2 by default (each row is a section-level statement of its own)… drop it to 3 when the page already put an h2 above the rows»—. Se deroga en sitio, y no por gusto sino porque el resto del tier declara lo contrario: FeatureGrid.ItemTitle, las preguntas de faq y Pricing.PlanName ponen en level 3 lo que se repite, y el h2 lo lleva el Header. Nace FeatureSplit.Header, calcado de Testimonials.Header (Box con medida + Motion + Stack) y sin contexto, porque este block no tiene eje align que heredar. Y .Title baja su default de 2 a 3. La forma queda coherente en los dos casos, que es lo que la hace preferible a las alternativas: con .Header el h2 es suyo y las filas cuelgan; sin .Header la app ya puso el h2 encima y las filas cuelgan igual. La tercera vía —un contexto donde el Header marcase su presencia y el Title derivara su nivel— daba el mismo resultado a cambio de un hijo escribiendo en el contexto del padre, que es el patrón que ya costó un bucle de $effect en este repo. Por un solo bit, no compensa. Verificado en navegador, outline leído del DOM: /blocks/feature-split/preview h2 «Del evento crudo a la decisión» h3 ×3 (las filas) ← antes: h2 ×3, sin nombre /blocks/landing h2 + h3 ×2, dentro de un outline de página que ya no salta de nivel La demo compone su encabezado y LandingSite deja de hacerlo a mano: fuera el Stack escrito a pelo y fuera los dos level={3}. Header medido en su sitio (x 144, 768 de ancho: la misma medida que la copia de las filas). Gates: svelte-check 72/62 antes y después · vitest src/uix/blocks 36/36 · blocks:check verde (19 blocks, 147 ficheros) · docs:check 0/0. Primera fila del ledger arreglada DENTRO del tier, por acotación del eje: las tres anteriores de la sesión (A-111, A-112, A-109) eran todas de canon. Co-Authored-By: Claude Opus 5 --- docs/process/AUDIT-blocks-ledger.md | 31 +++++++++++++++++-- docs/process/CONTINUE-blocks.md | 24 +++++++++++++- src/uix/blocks/feature-split/README.md | 22 ++++++++----- .../feature-split/feature-split-header.svelte | 26 ++++++++++++++++ .../feature-split/feature-split-title.svelte | 7 +++-- src/uix/blocks/feature-split/index.ts | 8 +++++ src/uix/blocks/feature-split/types.ts | 16 ++++++++-- web/routes/blocks/feature-split/+page.svelte | 14 ++++++--- .../feature-split/FeatureSplitSite.svelte | 9 ++++++ web/routes/blocks/landing/LandingSite.svelte | 17 +++++----- web/routes/blocks/landing/README.md | 2 +- 11 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 src/uix/blocks/feature-split/feature-split-header.svelte diff --git a/docs/process/AUDIT-blocks-ledger.md b/docs/process/AUDIT-blocks-ledger.md index e0419b72b..06f6f6553 100644 --- a/docs/process/AUDIT-blocks-ledger.md +++ b/docs/process/AUDIT-blocks-ledger.md @@ -153,7 +153,7 @@ Columna **or.** = de qué sección del documento viejo salió la fila (`C` confi | A-107 | `Switch` (canon) | doctrina | BAJA | F2b-D | El morfo declara dos partes (`provider` + `thumb`) y ninguna es etiqueta: la etiqueta visible es hermana, no es diana de clic y sólo se ata por `aria-labelledby` | `src/uix/morfo/components/switch.ts` | CONFIRMADO | | A-108 | `Dialog` (canon) | doctrina | MEDIA | F2b-D | Al cerrar devuelve el foco al nodo que lo tenía al abrir; si ese disparador se desmontó, acaba en el `body` — y la trampa sigue armada un frame más | `src/uix/soma/components/dialog/dialog-provider.svelte.ts` | CONFIRMADO | | A-109 | `Banner` (canon) + `banner` | doctrina | MEDIA | F2b-D | DOS landmarks `banner` en toda página con cabecera: el canon estampa `role="banner"` DESPUÉS de los rest props, así que nombrar ambos es lo único que queda | `src/uix/eidos/components/banner/banner.svelte` | ARREGLADO | -| A-110 | `feature-split` | doctrina | MEDIA | F2b-D | Único block de sección sin parte `.Header`: sus filas emiten `h2`, así que en una página compuesta la sección no tiene nombre y aporta tres `h2` hermanos | `src/uix/blocks/feature-split/types.ts` | CONFIRMADO | +| A-110 | `feature-split` | doctrina | MEDIA | F2b-D | Único block de sección sin parte `.Header`: sus filas emiten `h2`, así que en una página compuesta la sección no tiene nombre y aporta tres `h2` hermanos | `src/uix/blocks/feature-split/types.ts` | ARREGLADO | | A-111 | `NavigationMenu` (canon) | doctrina | ALTA | F3.1 | Su landmark `