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 }
6 Commits (ebfa1ce5ef8a2d3c45726f7c0839bf27929b578d)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
c15873be2e |
uix(callout): temable — 27 % → 79 %, y la base óptica deja de copiar el sistema
7 claves nuevas (28 → 35) y un literal anotado. El 21 % que falta es el PUENTE DE PALETA (THM-2), que no es deuda: es la vía por la que `data-color` resuelve los 8 roles y las 33 escalas donantes sin una línea de CSS extra. Global 64 %. Cosido lo que la receta consumía a pelo: el hueco de fila, la tipografía del cuerpo (`font-size` + `line-height` — así se lee una admonición), la tinta, el tamaño del icono y el peso del título. Los tres pasos leen el BUNDLE (`--size-md-font-size`, `--size-md-font-line-height`, `--size-md-icon-size`). LA LÍNEA BASE ÓPTICA DEL ICONO DEJA DE REPETIR LAS MÉTRICAS DEL SISTEMA: era `calc(var(--size-md-font-size) * var(--font-line-height-md, 1.5))` y ahora es `calc(var(--callout-font-size) * var(--callout-line-height))` — la misma derivación, sobre los tokens del propio callout, así que un tema que agrande la copia mueve la caja del glifo con ella. Cinco respaldos muertos retirados: `var(--callout-gap, var(--space-3))`, `padding`, `accent-width`, `radius` —las cuatro claves están en el contrato— y el `, 1.5` de `--font-line-height-md`, que además MENTÍA: el token existe y vale 1.45. Los 24 rojos del guard son los TONOS, y no son de este componente: es la supersesión de la cascada de paleta que `button` destapó hoy (el bloque genérico va el último y gana por orden). Adjudicados con el patrón compartido, que ahora nombra su razón una sola vez para los dos componentes. Gates: sonda 0 diffs en 896 valores × 7 estados · centinela 10/34 con los tonos adjudicados · censo 79 % · `component:audit` PASS · suite eidos con el rojo conocido ajeno · `rtl:check` 0 · `docs:check` 0 · `check` sin errores propios · captura de cuatro tonos. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
5638d67fde |
tooling(theming): el censo aprende a leer la válvula del canon — clase `exception`
Global 58 % → **59 %** sin tocar una línea de CSS: 54 knobs que eran deuda resultan ser desviaciones que el canon ya había firmado. `recipe-contract` §3 dice que una desviación anotada `/* literal: <razón> */` EN SU PROPIA DECLARACIÓN es válida, y `component-audit` la honra desde siempre (`declarationWindow` + `/literal:/i` en R-2.1, R-2.6 y R-2.7). El censo era el único instrumento que no: su `strip()` blanquea los comentarios ANTES de clasificar, así que las **81 anotaciones del catálogo** contaban como literales sin excusa. Dos instrumentos, un canon, dos respuestas — y la que mandaba era la del que no sabía leerlo. Ahora un literal anotado cae en la clase **`exception`, fuera del ratio** como `system`, y por la misma razón: no es que un tema no lo alcance, es que el canon ya aceptó por escrito que ahí no va un token. **54 knobs en 12 componentes**: `prose` 21 (su escala editorial em-relativa, que su README documenta como decisión — «No 5× duplicated scale»), `proof-of-human` 16 (la escena de tono fijo), `palabras` 3, `timeline` 2 (73 % → **77 %**), `result` 1 (86 % → **90 %**), y siete más con una cada uno. Detalles que costaron medición: - **La anotación vale para la DECLARACIÓN entera**, no sólo para su primera línea: un valor partido en varias líneas lleva la nota al final. Se comprueban todas las líneas que abarca la declaración. - **`strip()` blanquea en el sitio** (sustituye por espacios, conserva los saltos), así que el cuerpo despojado y el crudo quedan alineados línea a línea y basta con guardar el crudo al lado. - Muta-prueba: retirar una anotación de `prose` mueve el knob de `exception` a `literal` (21 → 20) y el conteo vuelve al restaurarla. Efecto colateral bueno: cada ficha gana una **§1.4 «Excepciones firmadas»** que las LISTA con su razón. Estaban escritas en el CSS y no se leían desde ninguna parte; ahora la ficha del componente las enseña, que es donde se decide si una sigue siendo cierta. Las 163 fichas cambian porque la plantilla cambia (sección nueva + la línea de reparto); el README de la auditoría gana la fila de la clase y la nota de que `system` y `exception` quedan fuera del denominador. Guards: `--names` 4.105 claves, DESVIADAS 0 · component-audit PASS · docs:check 0 · `check` con 72 errores globales y 0 en los ficheros tocados. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |
|
|
e7219bb909 |
fix(theming): el slot de tinta es `fg` — R-5.3 me cazó tres claves, y el handoff de mañana
Los guards globales, corridos antes de cerrar la sesión, encontraron una regresión MÍA: `--names` daba **3 desviadas en 2 componentes** y `component:audit` había pasado de 4 a **6 NEEDS-WORK**. La causa: en `text-circular` y `text-focus` nombré tres claves con el slot `color` (`color`, `border-color`, `glow-color`) cuando la gramática firmada el 2026-08-20 dice que **el slot de tinta es `fg` y `color` como slot MUERE**. R-5.3 existe justamente para eso y funcionó — pero después de que yo lo escribiera, porque el guard es de catálogo y yo verificaba `--only`. Renombradas a `fg`, `border-fg` y `glow-fg`, con los destinos que el propio censo indica en su salida `--names`. Value-preserving verificado: **0 diffs** en text-circular (5.916 valores) y en text-focus (1.769), guards 5/6 y 8/8, `--names` **DESVIADAS 0**, audit de vuelta a **162 PASS / 4 NEEDS-WORK** (los cuatro preexistentes y ajenos al eje). La lección para el protocolo, y va al handoff: **la propuesta §4 generada usa el slot `color`**, así que es la cuarta manera en que falla — y como el paso 7 corre los guards con `--only`, la desviación de gramática sólo aparece al correr `--names` GLOBAL. Ese comando ya estaba en el paso 1 del handoff; ahora también se explica por qué no basta con el audit. Y el HANDOFF para mañana: cifras nuevas (56 %, sin contrato 25, al 100 % 16), la lista de los 24 componentes de F2-B con su alcance, las tres cosas que el bloque enseñó y hay que tener delante al seguir (las cuatro maneras en que falla la propuesta · declarar un público «de facto» puede MATAR una escala si detrás hay un privado por talla · cuenta los nodos que ve la sonda antes de creerte un gate verde), y la cola actualizada — con `mockup` marcado como SIN DEMO (404) y `text-scramble` como «0 % estructural, escribe el veredicto, no tokens». Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
2 months ago |
|
|
9c9c0c8652 |
uix(text-focus): temable — 63 % → 100 %, y un primitivo FANTASMA que pintaba por accidente
8 claves en una entrada NUEVA de `recipes/base.ts`. Censo 63 % → **100 %**. Mismo patrón que text-circular: cinco públicos «de facto» consumidos con fallback y ninguno declarado, más tres que faltaban — los tres en la ESQUINA del marco de foco. **La esquina es una escuadra dibujada con bordes**: 1rem × 1rem con dos de sus cuatro lados a `0` según la posición. El tamaño es un knob, el grosor del trazo otro, el radio el tercero. Los desplazamientos `-0.625rem` NO son knobs: colocan la escuadra fuera del marco y se derivan del tamaño y el trazo. `border-color` y `glow-color` son el mismo acento en dos capas y se declaran aparte a propósito: un tema puede querer el halo de otro tono que el borde. EL HALLAZGO — **`--radius-xs` NO EXISTE** (→ next-features §13): La escala de radios del sistema es `sm | md | lg | xl | xxl` (+ none, full, default), sin `xs`. Esta receta escribía `border-radius: var(--radius-xs, 3px)` y **pintaba el fallback**, así que nadie lo notó nunca. Al tokenizarlo tal cual, la variable quedó vacía, la declaración inválida y las cuatro esquinas CUADRADAS: **48 diffs** — exactamente para lo que existe el gate. El contrato guarda `3px` verbatim, el valor que de verdad pintaba, y el diff vuelve a 0. Lo que abre: **un `var(--fantasma, fallback)` es una referencia muerta que funciona por accidente**, y el guard G2 que el plan menciona («referencias-fantasma contra el contrato derivado») o no existe o no cubre los fallbacks. Barrer el catálogo buscando `var(--…, …)` cuyo primer nombre no esté en el contrato derivado es un pase mecánico que se paga solo. Y un arreglo de instrumento: **`filter` y `backdrop-filter` faltaban en la lista de propiedades del guard**. `glow-color` vive dentro de un `drop-shadow()` y leía «no effect» estando vivo — `KNOB_PROPS` del censo sí las tenía, así que el censo contaba el knob y el guard no podía verlo. Con ellas, text-focus pasa a **8/8 sin una sola excepción**. Verificados los 30 componentes con ledger: cero regresiones, cero STALE. (De paso se retiró una adjudicación que había escrito con una razón equivocada antes de medir: el token sí movía el filter.) Gates: sonda antes/después = 0 diffs en 1.769 valores × 7 estados · censo --only 100 % · suite eidos sin rojos nuevos · rtl:check 0 · docs:check 0 · check por fichero limpio. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
2 months ago |
|
|
cef2d32f16 |
uix(combobox): el campo y su panel pasan a tokens públicos, con la talla resuelta donde manda
Segundo del eje theme-reach. El combobox tenía UN token propio (`content-z`) y
todo lo demás atado a primitivos globales o enterrado en privados: alcance 0 %.
Ahora son 106 claves públicas y el 76 % medido — lo que queda fuera son tres
hovers que esperan firma, seis literales de layout y doce knobs que pasan por
privados que ya derivan de un público.
La talla sigue el canon de dos piezas (coordenada + nombre resuelto), pero con
una diferencia que el DOM impone: los resueltos del control se emiten sobre
`control` e `input`, no sobre el root, porque el `data-size` que manda vive en el
control — y el input suelto lo necesita fuera de él. Los del panel se emiten
sobre `content`, que viaja por portal y nunca vería un token del root. Es el
precedente de `select` aplicado donde toca.
Altura, tipografía y separación del control consumen la coordenada del bundle
`--size-{k}-*`; el relleno inline SE DESVÍA del bundle en cuatro tallas y
conserva su valor de hoy — la desviación queda visible en el contrato en vez de
redondearse a la coordenada, que habría sido un cambio visual disfrazado de
limpieza. El chip conserva sus expresiones (`control-height − inset`,
`control-font-size − offset`), así que mover el control sigue arrastrándolo.
El centinela cazó un fallo real a mitad del trabajo: la primera pasada dejó
vivos los ocho bloques `[data-…][data-size='…']` de la receta, que pisaban los
tokens nuevos con los valores viejos. El diff de computed daba cero JUSTAMENTE
porque la ruta vieja seguía mandando; sin centinela habría pasado por bueno.
Verificación: diff de computed vacío sobre 1.566 valores en ocho estados —
reposo, las cinco tallas, el panel ABIERTO y hover. Centinela 67/106 automático
y el resto verificado a mano: `content-z` alcanza (80 → 4321) aunque viva en el
wrapper flotante; placeholder, disabled e ink del trigger forzando su estado;
los del panel abriéndolo por teclado. Los siete nombres resueltos no se mueven
por diseño — el tema mueve la coordenada. Los catorce `selected-tag-*`, los tres
`separator-*` y `scrollbar-inset` no son verificables en esta demo (no monta
modo múltiple, ni separadores, ni scroll): queda dicho, con su consumidor
comprobado en la receta, en vez de darlos por buenos.
Un token nace inerte y se anota como tal: `content-font-family` y
`content-line-height` los pisa `[data-depth='overlay']` con la misma
especificidad — es la tipografía de portal del Build contract, y tocarla sería
otro eje.
Guards: component:audit PASS · eidos-lint 0 invalid · suite eidos sin rojos
nuevos · rtl:check 0 · docs:check 0 · el guard del bundle obligó a apuntar
`indicator-size` e `item-indicator-size` a `--size-sm-icon-size`.
El informe `docs/audit/theming/` se regenera entero, así que todas las fichas
actualizan su fecha de medida; las que cambian de contenido son combobox y
gradient-builder.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2 months ago |
|
|
2591ec2f03 |
docs(theming): la auditoría de alcance de tema, componente a componente, con su propuesta
El censo medía el eje y no lo explicaba: 5.205 knobs en dos tablas del plan no dicen QUÉ knob de QUÉ línea no alcanza un tema, ni qué token habría que crear. Ahora `theming-census.ts --report` escribe la auditoría entera bajo `docs/audit/theming/`: un README con la vista de conjunto y 170 fichas — 162 recetas con CSS + 8 componentes sin receta, el árbol completo de `eidos/components/`. Cada ficha de receta: knobs fuera de alcance con fichero:línea Y selector (agrupados por clase), sistema transversal aparte, los privados con la columna que decide («¿deriva de un público?»), y una PROPUESTA de corrección — el token a declarar en `base.ts` con su valor VERBATIM y su scope TSC. La propuesta deriva los nombres de recipe-contract §1 y theming §6.7; donde la doctrina no decide, marca `⚠ decisión` en vez de inventar. Y no propone acuñar lo que la doctrina prohíbe: lo que posee una capa compartida, el foco, la capa de estado, un token prestado de otra receta, un shorthand o un eje físico. Las 8 fichas sin receta dicen —medido, no supuesto— dónde vive su visual: el componente que componen (icon-button → button), la capa que consumen (affix → viewport-placement) o la receta ajena que pinta sus attrs (svg → badge/button). Defectos del instrumento corregidos en el mismo pase, todos encontrados mirando la salida: un `@import` pegado al primer selector se comía 2 knobs de color-picker (el suelo del censo no puede moverse); `:not(:disabled)` se leía como estado y producía `hover-disabled-*`; un knob que lee un privado se proponía a sí mismo en vez de resolverse por talla; `--icon-size-sm` se reportaba como préstamo del componente `icon` (ahora el préstamo se verifica contra las claves del dueño en `base.ts`); y el default de talla salía sin nombrar en vez de `-md`. Verificación: censo global idéntico al suelo publicado (5205 · 1621/33% · 856 · 1880 · 614 · 234) y COMPONENTE A COMPONENTE contra la tabla §9 del plan — 0 diferencias en 162 · regenerar dos veces da el árbol idéntico · el bloque de veredicto escrito a mano sobrevive · docs:check 0 errores sobre 813 docs · prettier limpio (el árbol generado entra en .prettierignore junto a eidos/generated). Las 10 primeras fichas llevan ya su veredicto de revisión: análisis correcto en las 10, propuesta apta en 2 (gradient-builder como piloto, combobox con cinco correcciones — dos de ellas evitaban romper el default), y 5 que no se tokenizan en solitario porque son alias de --calendar-*/--field-* y esperan la decisión de familia. Cuatro destaparon privados con prefijo ajeno o abreviado declarados en su propio CSS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
2 months ago |