Morfo es el contrato ENTRE capas, y un knob de pintura lo lee UNA: el CSS del
propio componente. La doctrina lo dice en tres sitios, y ninguno lo escribi yo:
· morfo.md §«What morfo does NOT contain» → «Visual variants / recipes →
src/uix/eidos/ — Layer-specific, not shared»
· morfo.md §Backlog 2026-08-13 → `undeclaredState` es «the escape hatch for
attrs OUTSIDE the contract — a visual wrapper's `data-size`, a presentation
flag like `data-sheet`», y LANZA si el attr resulta estar declarado
· theming/reference.md §39 → la familia `data-variant`/`data-size` es un
wrapper attr eidos-only; regla de pulgar: morfo declara un attr solo cuando
su prop cruza la frontera de SOMA
Ninguno de los 25 cruza: los seis componentes no tienen capa soma.
avatar 9 size · variant x2 · color x2 · radius · position · dot · ring
s-text 6 style · truncate · clamp · canvas · italic · underline
image 5 fit · position · radius · size · placeholder
avatar-group 2 size · stacking
skeleton 2 shape · animated
qr-code 1 cell-shape
COMENTADOS, NO BORRADOS, por orden del autor, y cada bloque lleva su porque con
las tres citas. Dos motivos que valen la pena: son la huella de lo que el morfo
prometia, y son el enum que `eidos-lint` podra volver a leer el dia que sepa
tomarlo de la union TS (`AvatarSize = Extract<Size, …>`), que es donde vive de
verdad. Hasta entonces esos 25 enums pierden la comprobacion del CSS — el codigo
sigue tipado.
LO QUE SE QUEDA, y por que: los `data-status` de `avatar` (x3) e `image` (x4) los
produce `ImageProvider` de `$soma/layers` — `avatar.svelte:24`,
`avatar-image.svelte:3` — asi que su driver SI cruza, que es exactamente la
condicion que nombra la regla de pulgar.
FUERA DEL BARRIDO, y tampoco son knobs: `separator` y `button-group` declaran
`data-orientation` junto a un `aria-orientation` del MISMO prop (es el espejo CSS
de una propiedad ARIA que el morfo ya posee); `chart` usa `data-chart-axis` para
discriminar dos instancias de la misma parte (identidad estructural); y
`barcode` usa `data-symbology` para decir que estandar codifica el simbolo.
Medido: los seis morfos parsean, `eidos-lint` invalid 0 en todos, y el
desplazamiento esperado — avatar pasa de 24 morfo-backed a 7 y de 46 a 63
eidos-only. morfo:check PASS en los seis (nunca los miro: son attrs desnudos,
no `data-{kebab}-*`). component:audit los seis PASS. check 69 = base intacta.
morfo:vocabulary OK. smoke 311/311.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>