blocks(tramo B): las quince matrices, y el guard que ya las exige

El entregable central de la ola queda cerrado. Cada block declara ahora, en su
propio README, qué composición nuestra alcanza cada variante que shippean las
referencias, con la receta exacta, dónde se ha visto y en qué estado queda. Y la
regla que gobierna la tabla no admite promesas: una receta que no se ha visto en
el navegador no entra.

El saldo es lo que la ola buscaba desde que se abrió la pregunta. Unas noventa y
cinco filas cubiertas con receta y prueba. Cuatro superaciones con nombre, que
ninguna referencia puede expresar porque shippean markup estático: el plan actual
que no se puede elegir, las dos secciones que explican por qué un envío está
bloqueado, y las cifras que cuentan respetando la preferencia de movimiento. Una
veintena de gaps, cada uno con su nombre: la mitad son recetas que existen y no se
han enseñado, que es trabajo de demo, y la otra mitad candidatos de canon que ya
conocíamos. Y ocho «no se ofrece» con su motivo escrito, que es una postura del
sistema y no un agujero — un carrusel en la apertura es movimiento automático sin
control de pausa, un mapa es una dependencia externa, filtrar preguntas es estado
de datos del app.

La primera tabla justificó el tramo entero. El hero declaraba desde julio que el
mockup de móvil estaba hecho, y la demo sólo había enseñado el cromo de navegador.
El primitivo ofrece tres. Se añadió el control, se midió, y sólo entonces se
escribió la fila: una receta declarada no es una receta demostrada, y separarlas
es exactamente para lo que este tramo existía.

El guard exige ya la sección, encendido al final como mandaba el plan —hacerlo
antes habría dejado quince readmes en rojo toda la ola— y con su fixture negativo.
Cambiar la regla hizo caer tres fixtures antiguos, que es el self-test haciendo su
trabajo, y se actualizaron. Probado en rojo sobre el árbol real: quitándole la
sección a team sale su línea exacta, y restaurada vuelve a verde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 00489be263
commit 0cee0fa403

@ -257,7 +257,7 @@ del ancho; él lo ve centrado y tiene razón), y **A-65/A-75 son el mismo patró
tramos, en orden: **A** variantes de suelo (~~V4 hero `form`~~ ✅ · ~~V8
single-price~~ ✅ · ~~V5 cta split~~ ✅ · ~~V2 testimonials spotlight~~ ✅ ·
~~V3 faq-lista~~ ✅ · ~~V1 `Pricing.Compare`~~ ✅ — **TRAMO A CERRADO 6/6 el
2026-08-17; entra por el tramo B**) · **B** la matriz de
2026-08-17; entra por el tramo B**) · **B** ✅ **CERRADO 2026-08-17** (15 matrices + guard encendido y probado en rojo) — la matriz de
equivalencia variante-a-variante en el README de cada block, con recetas
demostradas en demo (el entregable central: responde a la brecha de
cardinalidad sin competir en dumps) · **C** tres blocks nuevos — `logo-cloud`

@ -2346,3 +2346,30 @@ type="button">` es una pista de MIME falsa) — el morfo lo declara
⚠️ **Nota de proceso, segunda reincidencia**: pasé prettier por
`docs/theming/changelog.md` otra vez y reformateó 400 líneas ajenas. Restaurado
y reaplicado a mano. **Ese fichero no se formatea.**
- 2026-08-17 — **F2b · TRAMO B CERRADO: las 15 matrices de equivalencia + el guard
encendido**. El entregable central de la ola: por cada block, una sección
`## Equivalencias` con cinco columnas (variante de la referencia · quién la
shippea · **la receta exacta** · dónde se ha visto · estado), y la regla dura
operando — **una receta que no se ha visto en el navegador NO entra en la
tabla**. Saldo: ~95 filas, de las que **4 son superación** con nombre (el plan
actual no elegible de `pricing`, la explicación del envío bloqueado de
`newsletter` y de `contact`, y las cifras que cuentan de `stats-band`: ninguna
referencia puede expresarlas porque shippean markup estático), **~20 gaps con
nombre** —la mitad son «la receta existe y falta enseñarla», que es trabajo de
demo, y la otra mitad candidatos de canon ya conocidos (`visually-hidden`,
`layout-primitive-element`, `card-static-elevation`, `scroll-hide`)— y **8 «no
se ofrece» con su motivo escrito**, que es una postura del sistema y no un
hueco: el carrusel en el hero (movimiento automático sin control de pausa), el
mapa en `contact` (dependencia externa), el buscador de `faq` (estado de datos
del app)…
⚠️ **La primera tabla ya justificó el tramo**: el `hero` declaraba en sus Gaps
desde julio que el mockup de móvil estaba HECHO, y **la demo sólo había
enseñado el cromo de navegador**. `Mockup` ofrece tres; se añadió el control, se
midió (`data-chrome="phone"`, 320px) y sólo entonces se escribió la fila. Una
receta declarada no es una receta demostrada: eso es lo que este tramo separa.
**El guard exige ya la sección** (`README_SECTIONS` gana `## Equivalencias`),
encendido AL FINAL como el plan mandaba —encenderlo antes habría dejado 15
READMEs en rojo toda la ola—, con fixture negativo propio, los tres fixtures
antiguos actualizados (el self-test los cazó él solo al cambiar la regla) y
**probado en rojo sobre el árbol real**: quitándole la sección a `team` sale su
línea exacta, y restaurado vuelve a verde.

@ -52,7 +52,21 @@ const PUBLIC_ARTS = new Set(
);
// The four sections the B-9 template requires of every block README.
const README_SECTIONS = ['## Function', '## Composition map', '## Decisions', '## Gaps'];
/**
* The B-9 template. `## Equivalencias` joined it when the wave's stretch B
* landed: the tier's claim is «variants as typed props instead of N dumps», and
* that claim is only worth something if each block SHOWS which composition of
* ours reaches each variant of theirs — and names what it does not reach. The
* rule is switched on LAST on purpose: turning it on before the tables existed
* would have painted every README red for the length of the wave.
*/
const README_SECTIONS = [
'## Function',
'## Composition map',
'## Decisions',
'## Equivalencias',
'## Gaps'
];
// Trees that must never import the blocks tier (B-4).
const OUTSIDE_ROOTS = [
@ -437,23 +451,31 @@ function selfTest(): string[] {
'README without the landmark declaration flagged',
scanReadme(
'fixture',
'# Hero\n\n## Function\n\n## Composition map\n\n## Decisions\n\n## Gaps\n'
'# Hero\n\n## Function\n\n## Composition map\n\n## Decisions\n\n## Equivalencias\n\n## Gaps\n'
),
['B-8']
);
expectRules(
'README without the equivalence matrix flagged',
scanReadme(
'fixture',
'# Hero\n\n## Function\n\n## Composition map\n\n**Landmark + headings**: a section.\n\n## Decisions\n\n## Gaps\n'
),
['B-9']
);
expectRules(
'README missing a template section flagged',
scanReadme(
'fixture',
'# Hero\n\n## Function\n\n**Landmark + headings**: a `<section>`.\n\n## Gaps\n'
),
['B-9', 'B-9']
['B-9', 'B-9', 'B-9']
);
expectRules(
'a complete README clean',
scanReadme(
'fixture',
'# Hero\n\n## Function\n\n## Composition map\n\n**Landmark + headings**: a `<section>`.\n\n## Decisions\n\n## Gaps\n'
'# Hero\n\n## Function\n\n## Composition map\n\n**Landmark + headings**: a `<section>`.\n\n## Decisions\n\n## Equivalencias\n\n## Gaps\n'
),
[]
);

@ -93,6 +93,23 @@ control of intent, variant, dismissibility and direction, and the device widths
served from `preview/`. Mini-page in `BannerSite.svelte`, shared by both
surfaces: it owns the `dismissed` state, as the canon requires.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ---------------------------------------- | ------------------------------------------ | ---------------------------------------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| Tira de anuncio con texto | TW (Banners 13) · Untitled (16) · Flowbite | el block reenvia la superficie del `Banner` del canon | por defecto | cubierta |
| Con llamada a la accion | TW · Untitled | slot `children` (la app compone `Button`/`Link`) | `BannerSite` | cubierta |
| Descartable | TW · Flowbite | `onDismiss` (la visibilidad es del app: decision del componente) | control `descartable` | cubierta |
| Fijada arriba o abajo | TW · Flowbite | `affix` (la capa de colocacion canonizada) | control `affix` | cubierta — ⚠️ con la cabecera pegada es la fila **A-95** del ledger: falta la pieza que posee las alturas de pagina (`app-shell`) |
| Por tono (informativo / aviso / peligro) | Flowbite | `intent` + `variant` del `Banner` | controles `intent` · `variant` | cubierta |
| Aviso de cookies | Flowbite · Relume | — | — | no se ofrece aqui: es un overlay legal con estado, firmado como block propio en el tramo C |
## Gaps
| Gap | Disposition |

@ -138,6 +138,24 @@ control of the form's side, the verification step and the direction; device
widths served from `preview/`. Mini-page in `ContactSite.svelte`: it owns the
page's words, the contact rows, the challenge and what "send" does.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| --------------------------------------- | ------------------------- | -------------------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------- |
| Formulario de contacto | TW (Contact 7) · Flowbite | `.Form` + `.Fields` sobre el `Form` de la app | por defecto | cubierta |
| Datos de contacto junto al formulario | TW · Untitled | `.Details` + `.Detail` con etiqueta y valor | `ContactSite` | cubierta |
| Verificacion anti-bot | Flowbite | `verification` (compone `ProofOfHuman`) | control `verificacion` | cubierta |
| El envio dice por que no se puede hacer | — **ninguna** | maquina de estados del block + `Record` exhaustivo de razon y accion | control `formulario` | **superacion**: es el block que estreno la doctrina de coordinacion; las refs no pueden expresarlo |
| Mapa junto al formulario | TW · Flowbite | — | — | no se ofrece: un mapa es un servicio externo, y el framework no trae dependencias |
| Selector de motivo / departamento | Flowbite | la app anade su `Select` al esquema y a `.Fields` | — | gap: `contact-reason-select-demo` |
| Horario y sedes | Untitled | contenido libre en `.Details` | — | gap: `contact-locations-demo` |
## Gaps
| Gap | Disposition |

@ -105,6 +105,25 @@ entry; Tailwind Plus, GitHub `.markdown-body`, Starlight):
point: a container makes the plan's own goal — media outside the prose flow —
impossible.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ------------------------------ | ------------------------- | ---------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------- |
| Prosa con medida de lectura | TW (Content 7) · Untitled | la rejilla de escape de 5 pistas, pista `measure` | control `medida` | cubierta |
| Figura que respeta la columna | TW | `.Media` (por defecto `measure`: la figura sigue al texto) | control `la figura` | cubierta |
| Figura que se sale a los lados | TW · Untitled | `.Media` en pista ancha (columnas 2/5) | control `pista ancha` | cubierta |
| Figura a todo el ancho | TW | `.Media` a 1/-1 | control `pista ancha` | cubierta |
| Los tres ejes en responsive | — | `eidos.resolve()` por breakpoint | los propios controles | cubierta |
| Pie de figura | TW · Untitled | `<figure>`/`<figcaption>` reales que el block renderiza | `ContentSectionSite` | cubierta |
| Indice lateral del articulo | Untitled · refs de docs | — | — | no se ofrece aqui: es `anchor-nav` (F1.6) compuesto por el shell de docs (F4.1) |
| Cita destacada / pull quote | TW | contenido libre en la pista ancha | — | gap: `content-pullquote-demo` |
## Gaps
| Gap | Disposition |

@ -64,6 +64,24 @@ Untitled UI «Features 42» · Flowbite):
control of `columns`/`minChildWidth`/`align`/item-count, device widths from
`preview/`. Mini-page in `FeatureGridSite.svelte`, shared by both surfaces.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ----------------------------------- | ----------------------------------------- | ----------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------- |
| Rejilla de features con icono | TW (Features 15) · Flowbite · Prime (27) | `.Items` + `.Item` con `.ItemIcon`/`.ItemTitle`/`.ItemText` | por defecto | cubierta |
| 2 · 3 · 4 columnas | todas | `.Items columns` (o `minChildWidth` fluido) | control `columnas` | cubierta |
| Centrada o alineada al inicio | TW · Untitled | `align` en la raiz, que viaja a las partes por contexto | control `align` | cubierta |
| Numero variable de features | todas | la app mapea sobre N `.Item` | control `items` | cubierta |
| Alternante texto / captura | TW · Flowbite · Untitled · Prime · Relume | — | — | no se ofrece aqui: es el block hermano `feature-split`, que nacio de esta misma brecha (la n.º 1 del dossier) |
| Feature con enlace «saber mas» | Untitled | contenido libre dentro de `.Item` (la app compone `Link`) | — | gap: `feature-grid-link-demo` |
| Bento (celdas de tamanos distintos) | TW (Bento 3) · Untitled | — | — | gap: `bento-grid` (categoria propia del dossier, diferida a F5 con disparador) |
## Gaps
| Gap | Disposition |

@ -68,6 +68,24 @@ Untitled UI «Features 42» · Flowbite; the #1 gap):
(browser + phone chrome), live control of the row count and the starting side.
Mini-page in `FeatureSplitSite.svelte`, shared by both surfaces.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ----------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------- |
| Fila de texto + captura | TW · Flowbite · Untitled · Prime | `.Row` con slot `media` | por defecto | cubierta |
| Lados alternos entre filas | todas | `.Row reversed` (mueve la media por `grid-column`; el DOM sigue leyendo la copy primero) | control `primera fila` | cubierta |
| Varias filas encadenadas | TW · Untitled | N `.Row` | control `filas` | cubierta |
| Lista de features dentro de la fila | TW · Untitled | `.Features` + `.Feature` | `FeatureSplitSite` | cubierta |
| Llamada a la accion por fila | Untitled | `.Actions` | `FeatureSplitSite` | cubierta |
| Etiqueta pequena sobre el titulo | TW · Untitled | `.Eyebrow` | `FeatureSplitSite` | cubierta |
| Media a sangre por un lado | Untitled | — | — | gap: `feature-split-bleed` (la fila vive dentro de la medida; sangrar pide salirse del `Container`) |
## Gaps
| Gap | Disposition |

@ -131,6 +131,25 @@ surfaces: it owns the SIUM schema, `createForm` (with
`validationBehaviour: 'progressive'` — a field that starts empty must not be
flagged on first paint) and what subscribing means.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| --------------------------------------------- | ------------------------------------ | ----------------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Fila de correo + boton | TW (Newsletter 6) · Flowbite · Prime | slots `field` + `submit` sobre el `Form` de la app | por defecto | cubierta |
| Centrada o justificada | TW | `layout` | control `layout` | cubierta |
| Sobre panel de color | TW · Untitled | `panel` + `color` + `gradient` | controles `panel` · `color` · `acabado` | cubierta |
| Nota de privacidad bajo el campo | TW · Untitled | slot `note` | `NewsletterSite` | cubierta |
| Confirmacion tras suscribirse | Flowbite | la app compone su `Callout` en `children` tras el `commit-submit` | `NewsletterSite` | cubierta |
| Estado que explica por que no se puede enviar | — **ninguna** | `.Reason` + `.Submit`, que leen la maquina del block | `NewsletterSite` | **superacion**: el markup estatico de las refs no puede explicar un envio bloqueado |
| Nombre + correo (dos campos) | Flowbite | — | — | gap: `newsletter-two-fields` (la fila es de un campo por diseno; dos piden `Form.ErrorSummary` y otra disposicion) |
| Campo sin etiqueta visible | TW | — | — | gap: `visually-hidden` (candidato de CANON: no existe el primitivo, asi que la fila «input solo, etiqueta para AT» no se reproduce sin inventar) |
## Gaps
| Gap | Disposition |

@ -77,6 +77,25 @@ surfaces. It declares its slots as top-level snippets and passes them as **props
so turning the band off hands the block no snippet at all (its `{#if signup}` guard
is what drops the region and its gap).
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ----------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
| Columnas de enlaces | TW (Footers 7) · Untitled (40) · Flowbite | `.Column` + `.ColumnTitle`, en `AutoGrid` fluido | control `columnas` | cubierta |
| Marca + descripcion a un lado | TW · Untitled | slot `brand` | `SiteFooterSite` | cubierta |
| Alta al boletin en el pie | TW (3 de 7) | slot `signup` (la app compone su `Form`; B-10 impide importar el block `newsletter`) | control `banda de alta` | cubierta |
| Selector de idioma | TW · Untitled | slot `extra` sobre `uix.prefs.setIntent('language', …)` — el eje real del ecosistema | `SiteFooterSite` (mueve el `lang` del documento) | cubierta |
| Redes sociales | todas | slot `social` | `SiteFooterSite` | cubierta |
| Linea legal + copyright | todas | slot `legal` | `SiteFooterSite` | cubierta |
| Columnas como lista `ul`/`li` | todas (markup) | — | — | gap: `layout-primitive-element` (candidato de CANON: `Box` y todo lo construido sobre el es un `div` fijo, F21) |
| Pie a sangre con fondo propio | TW · Flowbite | la app envuelve el block en su `Surface` | — | gap: `site-footer-bleed-demo` |
## Gaps
| Gap | Disposition |

@ -62,6 +62,26 @@ cinco props, y los anchos de dispositivo servidos desde `preview/` como
documento propio. El mini-sitio vive en `SiteHeaderSite.svelte` y lo comparten
las dos superficies.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| -------------------------------- | --------------------------------------- | ------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------- |
| Barra con navegacion y acciones | TW (Navbars 11) · Flowbite · Prime (12) | slots `brand` · `nav` · `actions` | por defecto | cubierta |
| Barra pegajosa | TW · Flowbite | `sticky` (compone el `Sticky` del canon) | control `sticky` | cubierta |
| Menu desplegable / mega-menu | TW (Flyout 7) · Prime · Untitled | la app compone `NavigationMenu` en el slot `nav` | `SiteHeaderSite` | cubierta |
| Cajon de navegacion en movil | todas | `breakpoint` + `mobileOpen` hacia el `Drawer` del canon | control `breakpoint` | cubierta |
| Barra a sangre o con medida | TW | `containerSize` (incluido `full`) | control `container` | cubierta |
| Segunda fila de sub-navegacion | Flowbite | slot `children` (se renderiza bajo la barra) | — | gap: `site-header-subnav-demo` (la receta existe; falta ensenarla) |
| Buscador en la barra | Flowbite · Prime | la app compone `SearchField`/`Command` en `actions` | — | gap: `site-header-search-demo` |
| Cabecera que se esconde al bajar | TW · Untitled | — | — | gap: `scroll-hide` (candidato de CANON: es comportamiento con superficie de contrato, va al `Sticky`, no aqui) |
| Anuncio sobre la cabecera | TW (Banners 13) | — | — | no se ofrece aqui: es el block `banner`, y su convivencia con esta cabecera es la fila A-95 del ledger |
## Gaps
| Gap | Disposition |

@ -72,6 +72,23 @@ Untitled UI «Metrics 16» · Flowbite):
control of the column count and the count-up, and the device widths served from
`preview/`. Mini-page in `StatsBandSite.svelte`, shared by both surfaces.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ---------------------------- | ----------------------------------------------- | ------------------------------------------------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------- |
| Banda de cifras con etiqueta | TW (Stats 8) · Flowbite · Untitled (Metrics 16) | `.Stats` + `.Stat` con `.StatValue`/`.StatLabel` | por defecto | cubierta |
| 2 · 3 · 4 columnas | todas | `.Stats columns` | control `columnas` | cubierta |
| Cifras que cuentan al entrar | — **ninguna** | `countUp` (compone `CountUp`, que respeta `prefers-reduced-motion`) | control `count-up` | **superacion**: las refs shippean markup estatico y no pueden animar una cifra |
| Banda junto a una foto | TW · Untitled | — | — | gap: `stats-split-with-image` (otra disposicion de 2 columnas; entra como `layout` cuando una demo la pida) |
| Timeline / por pasos | TW | — | — | no se ofrece aqui: el `Timeline` del canon existe y eso es otra seccion, no una banda |
| Delta / tendencia por cifra | Untitled · Tremor | la app compone `Metrics.Delta` dentro de `.Stat` | — | gap: `stats-delta-demo` (la receta existe y no se ha ensenado) |
## Gaps
| Gap | Disposition |

@ -76,6 +76,24 @@ here: nothing about a team grid can be blocked.
of alignment, column count, the bio line and direction, and the device widths
served from `preview/`. Mini-page in `TeamSite.svelte`, shared by both surfaces.
## Equivalencias
_La matriz del tramo B: cada variante que las referencias shippean, frente a la
composicion nuestra que la logra. Del dossier (P6.1): no competir en numero de
dumps, sino **demostrar la equivalencia una a una** — y sacar a la luz lo que no
alcanzamos, con nombre. **Una receta que no se ha visto en el navegador NO entra
en esta tabla**: la columna «Demostrada en» es la prueba, no la promesa._
| Variante de la referencia | Refs | Receta | Demostrada en | Estado |
| ----------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| Rejilla de personas con foto | TW (Team 9) · Prime (12) · Untitled | `.Members` + `.Member` con `.MemberName`/`.MemberRole` | por defecto | cubierta |
| 2 · 3 · 4 columnas | todas | `.Members columns` (o fluido) | control `columnas` | cubierta |
| Con biografia | TW · Prime | contenido libre en `.Member` | control `biografia` | cubierta |
| Enlaces sociales por persona | TW · Prime | `.MemberLinks` | `TeamSite` | cubierta |
| Centrada o alineada al inicio | TW | `align` en la raiz, que viaja por contexto a cada `.Member` y a su fila de enlaces | control `align` | cubierta |
| Retrato rectangular a sangre | TW · Untitled | — | — | gap: `team-portrait` (`Avatar` es circulo o cuadrado redondeado; un retrato de proporcion fija es territorio de `Image`/`Mockup`) |
| Fila horizontal con biografia larga | TW | — | — | gap: `team-row-layout` (foto a un lado y texto al otro es otra disposicion) |
## Gaps
| Gap | Disposition |

Loading…
Cancel
Save

Powered by TurnKey Linux.