Consecuencia de la precedencia en dos clases. Tres barridos que resultaron ser
el mismo defecto visto desde tres alturas.
ESPEJOS (10). Lineas de provider que reescribian el `aria-label` que el bag ya
emitia: popover y float-panel close, editable x3 —su propio comentario ya
confesaba «resolves to the same id»—, palabras x4, y los seis hand-merges
consumer-first de wrapper (file-upload x5, command-list) que reimplementaban a
mano la politica de `mergeProps`. Con ellos cayeron cuatro errores de tipado
preexistentes.
BUTTON. Retirada su danza de dos entradas: la entrada `propRef` + `prop-truthy`
del morfo, el destructure del wrapper y la fuente del provider. El attr del
consumidor fluye por restProps y gana por politica; el tipo con su JSDoc se
queda, que documenta la API sin enrutar nada.
LAS ~28 CADENAS `resolvedAriaLabel`. Eran la danza de Button a escala: el prop
publico ES `aria-label` (los types hacen `Without<>` y lo re-declaran), asi que
el wrapper lo sacaba de restProps para que el provider lo resolviese contra un
default y lo devolviese al bag. 21 componentes normalizados; el default vive
ahora en el morfo y la supresion por labelledby es una `condition` declarada en
vez de un `if` escondido en un resolver.
Y CROSS-ELEMENT, la clase que el barrido destapo y que no estaba prevista:
textarea, mask-field, search-field, password-field y navigation-menu declaraban
el prop en una raiz que pinta un `<div>` sin rol mientras el nombre pertenece a
un control HIJO. El morfo declaraba la etiqueta INCONDICIONAL mientras el
provider la suprimia ante un `Field.Label` y luego la pisaba siempre — el plan
se evaluaba y se tiraba. Ahora el default vive en la parte que posee el nombre,
la supresion se declara (`prop-falsy fieldLabelled`, prop virtual del provider)
y el prop de conveniencia de la raiz se reenvia con spread CONDICIONAL: escribir
la clave sin condicion la pone a `undefined` y BORRA el default que el bag acaba
de aportar. `aria-label` gana a `<label for>` en el computo del nombre, asi que
esa supresion es correccion, no cosmetica.
waveform era otra cosa y por poco se rompe: su default se QUEDA en el provider
—el nombre lo lleva un `<Slider>` compuesto, que no es parte suya—. Su defecto
estaba en el otro extremo: prop `ariaLabel` camelCase, unico en el catalogo, y
`Without<..., {}>` que no filtraba nada, asi que un `aria-label` del consumidor
aterrizaba en el div sin rol y se perdia. Alineado con el catalogo; el tipo
estrecho caza al hacerlo un consumidor real (media-player-time-slider).
De paso, la incoherencia de gemelos: range-calendar declara ya sus
month/year-select con los MISMOS refs `#?common.calendar.*` que calendar.
Fuera de alcance por medida, no por pereza: las etiquetas que cambian con el
ESTADO (`mapRef` devuelve `map[String(raw)]` sin traducir) y las INTERPOLADAS
(`translationRef` nombra una clave, no admite params).
Refs compilados 145 -> 157. check 70 = base. soma 1269 verdes (1 timeout ajeno
preexistente), morfo+sema 496. SSR de las paginas migradas sin una sola fuga de
`#?`: el consumidor gana donde lo pasa y el default resuelve en castellano
donde no.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>