Buscados los indicadores que comparten mecanismo con el de dc5e95665. Medidos
los dos, no supuestos.
NAVIGATION-MENU: CORRECTO, no se toca. Su indicador solo existe mientras un
menu esta ABIERTO, asi que abrirlo ES el disparador de la medida y nunca queda
rancia; ademas voltear cierra el menu, con lo que el escenario del rect viejo ni
se alcanza; y ancla y medida son ambas fisicas. Medido dx=0 en LTR, en RTL y al
volver. El usuario ya lo veia bien y tenia razon.
TABS: roto por partida doble. (a) No remedia al voltear —dx=518—, el mismo
agujero que el radio-group. (b) NI CON MEDIDA FRESCA acertaba en RTL —dx=400—
porque [data-tabs-indicator] anclaba con inset-inline-start LOGICO mientras el
JS le aplicaba un translate3d(x) FISICO. Es el defecto del slider, escondido
donde el guard no mira.
Migrado a MeasuredIndicator, que es la capa escrita para generalizar justo esto:
soma mide (heredando la dependencia `dir` de dc5e95665) y expone --indicator-*,
y el recipe posiciona con la propiedad translate desde esas vars y ancla en
left: 0 fisico, coherente con una medida que es fisica. El wrapper de eidos
pierde su rAF, sus observadores y su medicion: pasa a ser forma, que es su
sitio. Los cuatro escenarios a dx=0, verificado en las tres variantes con
indicador y a ojo en RTL.
PUNTO CIEGO DE RTL-1, documentado en el propio rtl-lint.ts y en el handoff: el
defecto (b) llevaba ahi desde siempre y el guard no podia verlo, porque el ancla
estaba en el CSS y el transform lo escribia el JS INLINE. RTL-1 cruza
declaraciones dentro de una regla CSS. "24 -> 1" significa 24 en el CSS
estatico, NO que el catalogo este limpio: lo que pinta desde JS sigue
necesitando el ojo.
Efecto lateral bueno: la variante `line` vuelve a mandar en su grosor de 2px. El
height inline del wrapper viejo lo pisaba — un comentario del propio tabs.css
daba por hecho que no pasaba.
Un guardian se activo y es CORRECTO que lo hiciera:
component-visual-attrs.test.ts exigia data-ready en el wrapper de eidos. El
atributo cambio de dueño a soma, asi que se retira la entrada, igual que el
indicador del radio-group, que tampoco lo lista.
Verificado: check 74 = linea base exacta. 446 tests pasan; el unico fallo es el
de lint.test.ts por audio-player, PREEXISTENTE y comprobado con stash.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Verificar los tres arreglos que quedaron sin ver en ec533845d destapo la otra
mitad del sliding-indicator.
MeasuredIndicator remide cuando cambian root o active, cuando alguno de los dos
redimensiona, en resize de ventana y en visibilitychange. Voltear la direccion
no redimensiona NADA —los items solo cambian de posicion— y active conserva su
identidad, asi que --indicator-x se quedaba con la coordenada de la disposicion
anterior y la pildora caia sobre otro item.
Arreglado con una opcion `dir` (un getter) que el $effect lee ANTES del return
temprano, para que la dependencia quede registrada en todas las pasadas y no
solo en las que llegan a medir. El consumidor —radio-group, el unico hoy— le
pasa resolvedDir. Getter y no lectura del DOM a proposito: la direccion viene de
la cadena prop/prefs y el atributo es proyeccion, no fuente.
A/B con git stash sobre los dos ficheros, moviendo la direccion por el CAMINO
REAL (el toggle del topbar): sin el arreglo el translate se queda en 177.156px y
el indicador cae 173px fuera del seleccionado; con el arreglo pasa a 4px y dx=0
en las tres posiciones del ciclo auto/ltr/rtl.
Los otros dos arreglos que faltaba ver quedan VERIFICADOS, con un probe de
Playwright y Emulation.setEmulatedMedia porque sus reglas viven en @media
(pointer: coarse) y el navegador embebido no llega ahi: archetypes (checkbox y
switch) da margin-inline-start -22px sobre un slop de 44px —la mitad exacta— con
translate sin componente X, y el barrido de hit-test alcanza 22/21 y 22/22 px,
simetrico en LTR y en RTL; proof-of-human da -23px sobre 46px con translateY
solo, y 23/23 en el barrido.
NOTA DE METODO, anotada en el handoff: el primer probe volteaba con
setAttribute('dir') sobre el elemento y daba "no arreglado". Eso NO cambia
resolvedDir, que sale de la prop/prefs, asi que la dependencia no podia
dispararse — la prueba era invalida, no el arreglo. Cualquier verificacion de
este eje tiene que mover la direccion por el camino real.
Verificado: check 74 = linea base exacta. 73/73 en soma/layers + radio-group.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cierra la §2.1 del handoff. El guard nacio en rojo con 24 hallazgos y al
arreglarlos aparecieron dos defectos mas grandes que el que buscaba.
1) EL GUARD RTL-1. Nada cruzaba un ancla LOGICA con un desplazamiento FISICO
en la misma regla CSS: eidos-lint clasifica SELECTORES, no declaraciones, y la
fila RTL del contrato de construccion decia "rule (LIVE)" — revision humana.
Por eso el defecto del slider llego a produccion y lo cazo el ojo del usuario.
Ahora `npm run rtl:check`, con la logica en src/uix/eidos/rtl-lint.ts (14
tests) para que sea testeable, calcando el par lint.ts / scripts/eidos-lint.ts.
El test ancla el caso historico: slider.css ANTES de 013ceac57 sale rojo y el
arreglo que se commiteo sale verde.
Dos desviaciones del enunciado, deliberadas. AMPLIA a la propiedad
independiente `translate:`, que se usa MAS que `transform: translate*` (87
frente a 36) y tiene el mismo defecto — ocho de los 24 hallazgos eran de esa
forma. RECORTA `padding-inline*`: no mueve la caja contra su ancla, asi que no
puede pelear con un translate; solo anadia ruido.
2) LA COSECHA, 24 -> 1. El unico que queda es palabras, auditado y no tocado.
Los 23 caen en tres familias: CENTRADO (10) donde el resultado deseado es
simetrico y basta dejar de descentrar; DIRECCIONAL (6) donde el signo debe
voltear; y FISICO (7) donde lo que sobraba era el ancla logica — handles de
brujula del cropper sobre una imagen que no se voltea, y el arco polar del
menu-dial. Medido en Chrome el switch: el thumb salia a +24px en un carril de
38px, colgando fuera. Verificados tambien carousel, avatar, cropper, menu-dial
y chat-log.
3) :dir() ES LA DOCTRINA, [dir='rtl'] QUEDA PROHIBIDO. Los 12 selectores que
habia en eidos estaban TODOS rotos, en los dos sentidos opuestos del mismo
error, y ambos medidos en Chrome. Los 5 descendientes se aplican DE MAS: el
sidebar tenia direction:ltr de verdad y aun asi matcheaba, porque el selector
capta cualquier ancestro RTL e ignora un dir mas cercano que redeclare. Los 7
de mismo-elemento NO se aplican NUNCA: el tree-view era rtl de verdad y no
matcheaba, porque desde 013ceac57 el atributo solo se estampa si alguien lo
afirmo. :dir() acierta los tres casos porque mira la direccion RESUELTA.
Baseline desde 2023.
4) EL PIN DEL <main>. 5469e05df hizo dos cosas que se anulan: puso las demos en
`auto` —sin prop dir, o sea el componente no estampa atributo y HEREDA del
DOM— y a la vez clavo <main data-uix-canvas dir="ltr"> sobre ellas. Ese <main>
era la herencia, asi que el toggle del topbar y el arabe llegaban a <html> y
morian ahi: las 51 demos congeladas en LTR. Su comentario afirmaba que "los
componentes siguen las prefs, este contenedor no les afecta" — cierto para la
LOGICA, falso para el CSS, que lee el direction COMPUTADO. Medido: html
dir="rtl" con el panel del sidebar todavia a la izquierda, y quitar ese
atributo y nada mas lo movia. Se queda el lang="en". Coste aceptado por el
usuario: vuelve la puntuacion desplazada en la prosa inglesa al elegir RTL, que
es cosmetico y solo en un modo de inspeccion; demos que no pueden demostrar,
no. Si hay que fijar la prosa otra vez, el pin va alrededor de la PROSA.
Verificado: check 74 = linea base exacta en las tres pasadas. rtl-lint 14/14.
Suite de eidos 375 pasan; el fallo de lint.test.ts por audio-player es
PREEXISTENTE, comprobado con stash, y es del hilo del sonido. Los 9 CSS tocados
ya fallaban prettier antes de tocarlos, asi que no se formatean.
SIN VERIFICAR EN NAVEGADOR, anotado en el handoff: archetypes y proof-of-human
(sus reglas viven en @media (pointer: coarse), invisible en escritorio) y
sliding-indicator (la demo del radio-group segmented no llegaba a medir).
QUEDA: hay wrappers estampando dir="" vacio en vez de omitir el atributo —
visto en sidebar y tree-view; no rompe porque un valor invalido hereda, pero
contradice la letra del contrato.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Que esta cerrado (3 commits), que queda por orden de valor, y las trampas de
metodo que costaron horas.
Lo primero de la cola NO es codigo de componente: es el guard que no existe.
Nada cruza `transform: translate*` con `inset-inline*` — hay 39 transforms en
el CSS de eidos y ningun script los mira, porque eidos-lint solo clasifica
selectores y el guard de la fila RTL del contrato es literalmente revision
humana. Por eso el bug llego a produccion y lo cazo el ojo del usuario.
Incluye la investigacion de las cinco librerias de referencia ya hecha (25
agentes, 5 hallazgos tumbados por refutacion) para que nadie la repita, y los
dos datos que mas costaron: `unicode-bidi: isolate` NO arregla el interrogante
desplazado, y `dir="ltr"` si — porque la hoja de agente del WHATWG le da
isolate de propina.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>