astra
alpha-0.1-background
alpha-0.1-dir-prefs
alpha-0.1-sec-dom
menubar-v4-safe
active-uix
morfo-runtime
morfo-driven-soma
semantuix
glm-5
main
sium-v1.0
${ noResults }
4 Commits (56d7f744e993c8cabda4b02c6e2508923dfe4d93)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
cdc00bc117 |
fix(blocks): lo que la auditoría encontró DENTRO del tier
Una auditoría multi-agente (7 dimensiones doctrinales + refutación adversarial) confirmó 32 hallazgos sobre la pasada de calidad. Esto corrige los que caen dentro de `blocks/`; la deuda de fuera queda REGISTRADA, no tocada (`PLAN-blocks-quality.md` §6). - **B-7 roto en `pricing`**: el block traía tres strings castellanas propias como defaults del toggle — dos visibles y un nombre accesible. Hardcodeaba un idioma DENTRO del framework y esquivaba `langs`, en el mismo block cuyo README predica «cero strings propias». Ahora los tres son props REQUERIDAS y las pone la app. - **El block pintaba**: `pricing.Plan` metía `box-shadow` por `style=` porque `Card` no expone elevación. Retirado; el hueco queda registrado como candidato a canon en vez de falseado. - **El escalonado estaba roto y el comentario mentía**: puse `spring-pop` (driver JS) en los planes, y un driver JS no lee el `animation-delay` donde vive el stagger — entraban TODOS a la vez mientras el comentario afirmaba lo contrario. Vuelto al preset CSS: verificado, índices 0,1,2 a 70ms. - **Comentario falso en la demo del hero**: atribuía al `intent` visual una consecuencia sonora/háptica que ningún camino produce (el morfo del Button dice explícitamente que `contact-activate` NO lleva intent). Reescrito. - **Composition maps mentían**: los 6 blocks que ahora componen `Motion` no lo decían; el hero seguía diciendo `Heading` (es `Display`), sin `Backdrop` ni `decor`, y declaraba DIFERIDO un preset de cromo de media que ya está shipeado (`Mockup`). Al día, sin filas duplicadas ni datos rancios (el chip de feature-grid es `solid`, no `soft`). - **Handoff y plan**: el plan seguía prescribiendo un `<Reveal>` que esta misma sesión creó y retiró; el handoff daba `feature-split` por «sin decidir» estando hecho, y los gates con números falsos. Verificado: `blocks:check` verde (7) · `svelte-check` sin errores propios · en el navegador, pricing escalona de nuevo, las etiquetas vienen de la app y ninguna tarjeta pinta sombra. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
2 months ago |
|
|
ceab195ae1 |
feat(blocks): el arco semántico completo — contacto al pulsar, commit al elegir
Elegir un plan ya no era solo un click: ahora demuestra el momento `--event` entero, que es lo que ninguna referencia puede shippear. - Pulsar emite `contact-activate` — gratis, por composición: es el evento del morfo del propio `Button`. Eso ya funcionaba en todos los bloques. - Lo que faltaba es la CONSECUENCIA: la app emite `commit-select` con intent `affirm` (CANON §2: una elección activa es afirmativa) vía `uix.events`. Un block no puede emitir eventos propios —no tiene morfo, contrato B—, así que la consecuencia es necesariamente app-land; la demo la ejerce para que el arco se vea. El commit va DESPUÉS del resultado (`await tick()`), no en la pulsación. Es la doctrina (un commit es lo que quedó fijado, no el contacto) y además evita una colisión real que medí: emitidos a la vez sobre el mismo elemento, la proyección del contacto pisa la del commit. Verificado con MutationObserver usando `attributeOldValue` —sin él la medición MIENTE, porque el callback se agrupa en microtarea y `getAttribute` ya devuelve el valor sobrescrito—: la secuencia es `contact-activate` → `commit-select` (family `commit`, intent `affirm`), cero errores de página. `blocks:check` verde (7) · `svelte-check` sin errores propios. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
2 months ago |
|
|
164ca0183e |
feat(blocks): movimiento en TODOS los bloques, vídeo e intent semántico
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> |
2 months ago |
|
|
594e5a5db4 |
feat(blocks): F2.4 `pricing` — el primer compound CON CONTEXTO del tier
La sección de planes: un toggle de periodo sobre una fila de planes, uno destacado. Es el primer block cuyas partes se COORDINAN de verdad (no solo se repiten como en feature-grid/split): el `Switch` escribe el periodo de facturación y cada `PlanPrice` lo lee. Esa coordinación es lo que gana un contexto compartido — la forma más fuerte de compound. `<Pricing bind:period>` + `.Header` + `.Switch` + `.Plans` + `.Plan`(featured, badge) + `.PlanName`/`.PlanDescription`/`.PlanPrice`/`.PlanFeatures`/ `.PlanFeature`/`.PlanAction`. - **Contexto reactivo** (`context.ts`): la raíz provee el periodo como getter sobre un `$bindable`; el `Switch` (un `ToggleGroup`) lo escribe, el `PlanPrice` lo lee y muestra el snippet `monthly` o `annual`. Mismo patrón que `CardGroup`. `period` es bindable por si la app quiere observarlo. - **El block NUNCA formatea moneda**: la app compone `FormatNumber` dentro de los snippets de precio (B-7). El block posee el switch, no el dinero. - `.PlanAction` fija el CTA al borde inferior de la tarjeta (`margin-block-start: auto`) para que una fila de planes alinee sus botones aunque tengan distinto nº de features; `.Plan` con `align="start"` deja los checks en columna limpia; `featured` da acento (borde primary) + elevación. Demo (`web/routes/blocks/pricing/`): full-bleed + ruta `preview`, tres planes (Pro destacado en el centro) con el toggle mensual/anual vivo. Hueco a decisión del usuario (Gaps del block): la **tabla de comparación** (features × planes) — la brecha recurrente del dossier en pricing. Es una tabla, no una fila de tarjetas: candidato a hermano `pricing-table`. Presentado, no resuelto. Verificado en navegador: el toggle cambia los TRES precios a la vez (0/29/99 → 0/23/79), tarjetas de igual alto con CTAs alineados, featured con acento, en claro/oscuro × LTR/RTL. `blocks:check` verde (5 blocks) · `svelte-check` sin errores propios. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
3 months ago |