You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/docs/process/CONTINUE-blocks.md

86 lines
4.4 KiB

docs(blocks): registro de F2.1, doctrina de demo del tier y handoff 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>
3 months ago
# CONTINUE — F2 blocks de sitio (handoff 2026-07-23)
Estado al parar: **F1 CERRADA (8/8 componentes canon)** y **F2.1 `site-header`
HECHA** — el primer block del tier, que además fijó la superficie de demo para
los 13 que quedan. Plan maestro: `docs/process/PLAN-blocks.md` (§F2 y el
registro §7). Todo commiteado y pusheado a `gita/alpha-0.1-sec-dom`; último
commit `ae7b4f8c3`.
## Lo siguiente
**F2.2 `hero`** (ficha en `PLAN-blocks.md` §F2.2). No depende de nada. Después,
el orden del plan: feature-grid → pricing → testimonials → faq → stats-band →
cta → newsletter → site-footer → banner → team → contact → content-section.
Cada uno entra por el contrato B (`docs/architecture/blocks.md`) con **fase 0
ligera obligatoria**: mirar el equivalente en ≥2 catálogos del dossier
(`docs/process/RESEARCH-blocks-references.md`) y anotar en el README del block
qué se adopta y qué se descarta.
## La plantilla ya existe — cópiala, no la reinventes
Un block terminado son estos ficheros (ejemplo real: `site-header`):
```text
src/uix/blocks/{kebab}/
├── README.md # Función · Mapa de composición · Decisiones · Gaps
├── index.ts # export del compound + tipos
├── types.ts # props (todo contenido entra por snippets, B-5/B-7)
└── {kebab}.svelte # composición: solo componentes del canon, sin CSS
web/routes/blocks/{kebab}/
├── +page.svelte # BlockDemo + controles vivos + pestañas de doc
├── {Name}Site.svelte # el block dentro de contenido REAL de producto
└── preview/
├── +layout@.svelte # `@` resetea el layout: la vista previa es su página
└── +page.svelte # sirve {Name}Site leyendo la URL
```
Y luego: marcar `shipped: true` en `web/routes/blocks/_lib/catalog.ts` (raíl y
galería leen esa única fuente) y `npm run blocks:check`.
## Reglas que ya costaron sangre (no las re-aprendas)
- **El block se enseña A SANGRE en la página.** Nada entre el block y el borde:
ni marco con relleno, ni caja con scroll, ni cromo pegajoso encima. Medido: un
`Card` desplazaba 21px un header con `offset: 0` (su recipe pinta con
`--card-padding-*`, que `padding={0}` de la capa Box no alcanza), y un
`position: sticky` dentro de un div con scroll es un comportamiento que nadie
vive. **Si un block se ancla a algo, se mide contra lo que se anclará en
producción.**
- **Los anchos de dispositivo (375/768) van por la ruta `preview` en iframe**, y
es opt-in: en dev, dos documentos sin empaquetar a la vez agotan las
conexiones del navegador (`ERR_INSUFFICIENT_RESOURCES` mata las DOS páginas).
- **Cada prop público, un control vivo** en la demo; los ejes de sección (tema,
idioma, dirección, densidad) ya los da el shell, no los repitas.
- **Nada de backticks de markdown dentro de `<Text>`**: se ven literales. Lo que
es código va en `<Code>`.
- **Ojo con las variables de layout que heredan.** `justify` de `Group` se
hereda a los clusters anidados (pon `justify` explícito) y las de `Box` YA no
heredan desde 2026-07-23 (`docs/theming/changelog.md` §46).
- **Un hueco del canon se registra, no se falsea.** Si al componer falta algo,
va a los Gaps del block como candidato a canon y la demo usa lo que hay.
## Deuda declarada (decisiones tuyas pendientes)
feat(button): el CTA que navega y parece botón, por composición (opción D) El hueco que registró `site-header`: un «Empezar gratis» de cabecera tiene que NAVEGAR y parecer botón. `Button` no crece un `href` —`Link` posee la navegación, y un ancla se activa con Enter, no con espacio, lo cual es correcto—: presta la pintura por composición. Lo que hacía de esa forma un downgrade era que el `child` (asChild) descartaba la decoración; se completa el slot. - **eidos `<Button>`**: el `child` recibe ahora `content`, el cuerpo YA decorado (icono · etiqueta · endIcon · spinner) en su propio snippet que comparten las dos ramas de render. Así `<a href {...props}>{@render content()}</a>` conserva TODOS los slots en vez de sustituirlos (antes la flecha del sitio alpha estaba escrita a mano). Nuevo tipo exportado `ButtonChildProps`. - **soma / morfo**: en la forma `child` el elemento es del consumidor, así que soma deja de estampar `type` (un `<a type="button">` es una pista de MIME falsa). El componente pasa `type: undefined` cuando hay `child`; el provider lo REENVÍA verbatim (antes lo re-defaulteaba a `'button'` y pisaba el drop — el default vive en el destructure del componente); el morfo declara el attr `type` condicional (`prop-truthy`). - **docs**: ejemplo rancio de `index.ts` corregido (anunciaba un `asChild`/ `variant="link"` que no existen); sección «CTA que navega» en el README de eidos con el patrón y el footgun documentado (un `<button>` en un `<form>` vía `child` se pone su propio `type`); nota en el README de soma. - **site-header**: el CTA de la demo usa ya la forma real (`<a>` sólido con flecha), y el hueco pasa de «candidato a canon» a CERRADO por composición — `Button` sigue sin `href` y `Link` sigue poseyendo la navegación, las dos decisiones firmadas se mantienen. Actualizados PLAN/CONTINUE-blocks. - **demo de Button**: control `child (asChild → <a>)` vivo, snippet del código y fila de a11y explicando por qué el ancla activa solo con Enter. Verificado en navegador (dev, restart para módulos frescos): asChild ON → `<a href="#pricing">` sin `type`, pintura sólida completa (bg primary, tinta blanca, 36px, padding 16px), y el slot de icono SOBREVIVE dentro del ancla (`[data-button-icon]` + svg + body); asChild OFF → `<button type="button">` intacto (sin regresión de submit implícito); el CTA real de `site-header` sale `<a>` con la flecha final y 0 errores de consola. `blocks:check` verde · `vitest src/uix/morfo` 114/114 · `svelte-check` sin errores propios nuevos. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3 months ago
1. ~~**CTA que navega y parece botón**~~ — **RESUELTO 2026-07-23** por
composición, no por prop nueva: el `child` (asChild) de `Button` entrega
ahora un snippet `content`, así que
`<a href {...props}>{@render content()}</a>` recibe la pintura sólida
COMPLETA (icono · etiqueta · endIcon · spinner) y soma deja de estampar
`type` en un elemento que no es suyo. `Button` sigue sin `href` y `Link`
sigue poseyendo la navegación. Doctrina: README de eidos Button §«CTA que
navega». Úsalo tal cual en el `hero` (su CTA primario es exactamente esto).
docs(blocks): registro de F2.1, doctrina de demo del tier y handoff 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>
3 months ago
2. **`hero`, `pricing`, `feature-grid`** tienen brechas ya anotadas en el
dossier §P1 que el plan v1 no cubre (split alternante texto/screenshot, tabla
comparativa de precios, cita en spotlight). Cada fase 0 las presentará como
scope-approval, no se decidirán solas.
## Estado de gates al parar
- `npm run blocks:check` verde (1 block).
- `npm run check` sin errores propios (la deuda restante es ajena).
- `vitest src/uix/eidos` 353/353.
- `contracts.test.ts`: 3 fallos AJENOS conocidos (menubar DOM-write ·
radio-group `data-ready` · claves camelCase de `aura`), de sesiones paralelas.

Powered by TurnKey Linux.