El acabado deja de vivir solo en el hero. Los seis bloques restantes entran ya
con movimiento, la media admite vídeo de verdad y los CTA declaran su intención
semántica en vez de ser neutros.
- **Movimiento en los 7**: cada rejilla marca `data-stagger` en SU contenedor y
sus celdas SON un `Reveal` (feature-grid.Item, testimonials.Item,
pricing.Plan) — el foundation les da el índice por `:nth-child`, así que las
tarjetas se reparten una tras otra sin un solo milisegundo escrito a mano.
Cabeceras, filas de feature-split (copy y media con un compás de diferencia) y
el acordeón del FAQ entran también.
- **Vídeo**: el hero acepta un `MediaPlayer` del canon dentro del mismo `Mockup`
—nada a medida, el slot `media` toma lo que la app componga— y la demo lo
expone como control («panel» / «vídeo»). La pregunta «¿y si quiero poner un
vídeo?» ya tiene respuesta demostrada, no teórica.
- **Semántica en la interacción**: los CTA llevan `intent`. El primario del hero
es `fulfill` (esa pulsación consuma la página); en pricing, `fulfill` en el
plan recomendado y `affirm` en el resto. Un CTA neutro no significa nada, y
los 7 bloques lo eran.
Nota arquitectónica: un block NO puede declarar eventos sema propios — no tiene
morfo, es el contrato B. Su semántica entra por dos vías, y las dos estaban sin
usar: el `intent` de los componentes que compone, y los eventos que esos
componentes ya emiten (Accordion emerge, ToggleGroup, Drawer).
Verificado con Playwright en los 6: reveals con índices estructurales
(feature-grid 0..5, testimonials 0..4, pricing 0..2, hero 0..3), vídeo pintando
470×264, intents `fulfill`/`affirm` llegando al DOM, cero errores de página.
`blocks:check` verde (7) · `vitest src/uix/eidos` 361/361 · `svelte-check` sin
errores propios.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>