@ -1057,3 +1057,60 @@ RTL arrastre derecha 1 → 2 avanza RTL izquierda 2 → 1 retrocede
no la magnitud. Y verifica la dirección ANTES de cada gesto: mi primera pasada
midió creyendo estar en LTR cuando el toggle estaba en RTL, y el resultado
parecía un defecto que no existía.
### 9.10 · El `dir=""` vacío — CERRADO, y era el shorthand de Svelte
Commit `b906dd407` . §6.5 lo había visto en `sidebar` y `tree-view` «sin
investigar de dónde sale». Sale del shorthand ** `{dir}` **: para `dir` Svelte
emite una asignación de PROPIEDAD además del atributo, y con `undefined` el
resultado es la cadena vacía en vez de la omisión.
Cazado con un trap sobre `setAttribute` + el descriptor de la propiedad: **dos
escrituras desde el mismo componente compilado**, la segunda por propiedad. Y
**no estaba en el SSR** — `dir=""` no aparece ni una vez en el HTML servido, lo
escribía el cliente al hidratar.
Un valor inválido HEREDA, así que nada pintaba mal; pero contradice la letra
del contrato y hace que `[dir]` matchee.
```svelte
{dir} → {...dir ? { dir } : {}}
```
- ** `tree-view` (eidos)**: el wrapper LO NECESITA cuando el valor es concreto —
el recipe selecciona con `[data-tree-view-root]:dir(rtl)` y ese div es el
ANCESTRO del provider que estampa el attr. Ausente, hereda: correcto.
- **26 demos** : el arnés estándar (`data-uix-stage-area` / `-canvas-inner` ).
Verificado: en `auto` sólo quedan `<html>` (la proyección) y el provider con su
valor resuelto — cero `dir=""` ; en `rtl` los tres lo reciben concreto; al
volver a `auto` desaparece. Las 26 rutas sirven 200 y ninguna trae `dir=""` .
⚠️ **MÉTODO** : mi primer regex también matcheaba dentro de `dir={dir}` y dejó
`dir={...}` — dos ficheros con parse error, que `check` cazó (76 vs 74).
**Contar ficheros modificados NO basta; hay que mirar el diff.**
### 9.11 · `html lang` — diagnóstico completo, decisión PENDIENTE
Causa raíz: ** `src/app.html:2` tiene `<html lang="en">` hardcodeado y nadie lo
actualiza nunca.** El `dir` sí se actualiza porque `ActivePrefsDomProjection`
lo proyecta (`PREFS_DOM_ATTRS.DIR`); `lang` no está en esa lista.
Medido con árabe seleccionado: `<html dir="rtl">` ✓ · `<html lang="en">` ✗.
📌 **El `<main lang="en">` NO es el defecto y debe quedarse** — es el residuo
deliberado de §6.4 y es correcto: la prosa de las demos ESTÁ en inglés. Lo que
falla es el `lang` del DOCUMENTO, que debería seguir al idioma de la shell.
El arreglo sería simétrico y corto —la shell ya registra `language` en prefs
(`es·en·fr·de·ar`), que es justo de donde prefs deriva la dirección, así que
`slots.language` ya está disponible en la proyección— pero **cambia un
contrato declarado**: `contracts.ts` fija
`prefsDomProjection.ownsAttrs = ['dir','data-motion','data-sound','data-haptic']`
con su guard en `contracts.test.ts` , más los tests de `dom-projection` y el
README de prefs.
Y hay un argumento real EN CONTRA: en apps con i18n por routing el `lang` lo
fija el servidor, y una proyección de cliente lo pisaría. Es decisión de
arquitectura, no una corrección obvia — por eso §3 lo clasificó «NO de este
hilo». Queda planteada, no ejecutada.