import { readFileSync } from 'node:fs'; import { describe, it, expect } from 'vitest'; // Guardas de contraste, leídas del código fuente porque son una regla de // sistema, no el comportamiento de un componente suelto: lo que hay que impedir // es que el token vuelva a aparecer donde no se lee. // // `gris-medio` (#AAAAAA) da 7,2:1 sobre azul profundo — ahí es el token // correcto, y en Disciplinas y el footer se queda. Sobre blanco da 2,3:1 y // sobre gris-claro 2,1:1: en fondo claro es texto que no se lee. // // `dorado` (#C4942E) da 6,07:1 sobre azul profundo y 2,76:1 / 2,46:1 sobre los // dos fondos claros. Sigue siendo el color de rellenos, reglas, iconos y el ≡; // lo que no puede ser en claro es texto pequeño, y para eso está `dorado-texto`. const SOBRE_CLARO = [ 'components/sections/Hero.tsx', 'components/sections/Dolores.tsx', 'components/sections/Proceso.tsx', 'components/sections/ParaQuien.tsx', 'components/sections/Estratega.tsx', 'components/sections/ComoEmpezar.tsx', // La rama de movimiento reducido del recorrido va sobre gris-claro, y es // justo la que sirve a quien más necesita que el texto se lea. 'components/primitives/ParDialogo.tsx', ]; describe('tokens de texto sobre fondo claro', () => { it.each(SOBRE_CLARO)('%s no pinta texto en gris-medio', (archivo) => { expect(readFileSync(archivo, 'utf8')).not.toMatch(/text-gris-medio/); }); it('ParDialogo etiqueta al hablante en el dorado legible', () => { // La regla vertical sigue siendo `bg-dorado` — el dorado del manual como // relleno no tiene problema. Lo que no puede quedarse en #C4942E es la // etiqueta, que es texto de 12px sobre gris-claro. const fuente = readFileSync('components/primitives/ParDialogo.tsx', 'utf8'); expect(fuente).toMatch(/text-dorado-texto/); expect(fuente).not.toMatch(/text-dorado(?!-)/); }); });