You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/scripts/rtl-check.ts

63 lines
2.2 KiB

feat(direction): un guard para el eje logico-fisico, y el <main> que congelaba las 51 demos 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>
2 months ago
/**
* rtl-check — the mechanical guard of the build contract's RTL row
* (docs/guides/component-guide.md). Until now that row's guard was
* "rule (LIVE)", i.e. human review, and it is how the Slider defect of
* `013ceac57` reached production: three vertical rules paired a logical
* `inset-inline-start` with a physical `translateX`, and nothing in CI looked
* at CSS declarations — `eidos-lint` classifies selectors.
*
* RTL-1 a physical inline-axis displacement (`transform: translateX/
* translate/translate3d`, or the independent `translate` property) in
* a block that also anchors on `inset-inline*` / `margin-inline*`.
* The anchor flips with the writing direction, the displacement does
* not: correct in LTR, a full element-width off-axis in RTL.
*
* The rule, its deliberate exclusions (block axis, zero X, `padding-inline`)
* and the `rtl-physical:` escape hatch live in `src/uix/eidos/rtl-lint.ts`.
*/
import { readdirSync, readFileSync, statSync } from 'node:fs';
import { join, relative } from 'node:path';
import { lintRtlGeometry } from '../src/uix/eidos/rtl-lint';
const REPO = process.cwd();
const EIDOS_DIR = join(REPO, 'src', 'uix', 'eidos');
function walk(dir: string, out: string[] = []): string[] {
for (const entry of readdirSync(dir)) {
const path = join(dir, entry);
if (statSync(path).isDirectory()) walk(path, out);
else if (entry.endsWith('.css')) out.push(path);
}
return out;
}
function main(): void {
const files = walk(EIDOS_DIR);
let errors = 0;
for (const file of files) {
const rel = relative(REPO, file).replace(/\\/g, '/');
for (const f of lintRtlGeometry(readFileSync(file, 'utf8'))) {
errors++;
console.error(
`ERROR [RTL-1] ${rel}:${f.line} — physical "${f.translate}" against logical ` +
`${f.anchors.map((a) => `"${a}"`).join(' + ')} in ${f.selector}`
);
}
}
if (errors > 0) {
console.error(
`\nrtl-check: ${errors} error(s) across ${files.length} files\n` +
'Express the offset logically (margin-inline-start: calc(…)), go fully physical\n' +
'(left/right), or mark the line /* rtl-physical: <reason> */ if the pairing is meant.'
);
process.exit(1);
}
console.log(`rtl-check: 0 error(s) across ${files.length} files`);
}
main();

Powered by TurnKey Linux.