Primeros pasos
Trabajar con IA
Qué puede leer un agente de programación con IA, cómo comprobar lo que ha escrito y qué revisor de accesibilidad puedes darle.
Dale LUZ a tu agente
LUZ usa HTML y CSS sin más, así que un agente de programación con IA puede escribirlo si conoce los nombres de clase disponibles. Pega este prompt en tu agente.
Indica al agente los archivos que aparecen abajo y le pide que ejecute el comprobador sobre lo que ha escrito. En Lo que no hace se explica qué no comprueba.
Use LUZ for the markup. Read https://nandovejer.github.io/luz/llms.txt first and use only the classes in each package's classes.json. After you write HTML or CSS, run `npx @luz-ds/check@0.3.0` on the files and fix every finding before you answer.
Empezar un sitio
Para un sitio nuevo, o para pasar uno a LUZ, dale a un LLM el prompt largo. Te pregunta por el proyecto en rondas cortas, te enseña el plan y no escribe nada hasta que dices "go".
Para un tipo de sitio concreto, su página tiene un prompt hecho para él y las recetas de sus partes: una landing page, un blog o un periódico, una aplicación web o un sitio de documentación.
Qué puede leer un agente
La compilación de este sitio genera cada archivo a partir de las páginas que estás leyendo, así que tanto un agente como una persona obtienen la misma información. Dale al agente la URL de llms.txt: ahí se enumeran los demás archivos.
| Archivo | URL | Descripción | Generado por |
|---|---|---|---|
llms.txt | https://nandovejer.github.io/luz/llms.txt | El índice de la documentación para un agente: todas las páginas con su descripción, en orden de lectura. | scripts/docs-site/ai.js, durante la compilación de las páginas |
llms-full.txt | https://nandovejer.github.io/luz/llms-full.txt | Las mismas páginas en texto sin formato: el marcado, las variantes, cuándo usar cada una y su uso con el teclado. | scripts/docs-site/ai.js, durante la compilación de las páginas |
prompts/start.txt | https://nandovejer.github.io/luz/prompts/start.txt | El prompt general: pégalo en cualquier LLM para empezar un sitio o pasar uno a LUZ; pregunta por el proyecto en rondas antes de escribir nada. | scripts/docs-site/prompts.js, durante la compilación de las páginas |
prompts/landing.txt | https://nandovejer.github.io/luz/prompts/landing.txt | El prompt para una landing page: el general, con las partes y las clases de una landing page. | scripts/docs-site/prompts.js, durante la compilación de las páginas |
prompts/blog.txt | https://nandovejer.github.io/luz/prompts/blog.txt | El prompt para un blog o un periódico, sea cual sea el CMS: el general, con las partes y las clases de un blog. | scripts/docs-site/prompts.js, durante la compilación de las páginas |
prompts/app.txt | https://nandovejer.github.io/luz/prompts/app.txt | El prompt para una aplicación web: el general, con las partes y las clases de una app. | scripts/docs-site/prompts.js, durante la compilación de las páginas |
prompts/docs.txt | https://nandovejer.github.io/luz/prompts/docs.txt | El prompt para un sitio de documentación: el general, con las partes y las clases de un sitio de documentación. | scripts/docs-site/prompts.js, durante la compilación de las páginas |
examples/<area>/<slug>.html | https://nandovejer.github.io/luz/examples/components/button.html | El marcado de una página de componente o patrón, con estilos de LUZ; cada página que tenga una sección de marcado dispone del suyo en /examples/. | scripts/docs-site/ai.js, durante la compilación de las páginas |
manifests/tokens/classes.json | https://nandovejer.github.io/luz/manifests/tokens/classes.json | Todas las clases, propiedades personalizadas y atributos de enganche del paquete: los nombres que puede usar un agente. Paquete: @luz-ds/tokens. | scripts/ai-manifests.js, durante la compilación de cada paquete |
manifests/core/classes.json | https://nandovejer.github.io/luz/manifests/core/classes.json | Todas las clases, propiedades personalizadas y atributos de enganche del paquete: los nombres que puede usar un agente. Paquete: @luz-ds/core. | scripts/ai-manifests.js, durante la compilación de cada paquete |
manifests/core/custom-elements.json | https://nandovejer.github.io/luz/manifests/core/custom-elements.json | Los elementos personalizados que define o declara el paquete, con los atributos que lee cada uno. Paquete: @luz-ds/core. | scripts/ai-manifests.js, durante la compilación de cada paquete |
manifests/catalog/classes.json | https://nandovejer.github.io/luz/manifests/catalog/classes.json | Todas las clases, propiedades personalizadas y atributos de enganche del paquete: los nombres que puede usar un agente. Paquete: @luz-ds/catalog. | scripts/ai-manifests.js, durante la compilación de cada paquete |
manifests/catalog/custom-elements.json | https://nandovejer.github.io/luz/manifests/catalog/custom-elements.json | Los elementos personalizados que define o declara el paquete, con los atributos que lee cada uno. Paquete: @luz-ds/catalog. | scripts/ai-manifests.js, durante la compilación de cada paquete |
Comprueba lo que ha escrito un agente
npx @luz-ds/check@0.3.0 lee sin conexión el HTML y el CSS de un proyecto e indica qué clases, elementos, orden de carga y tokens de color de LUZ son incorrectos. Lee archivos, pero no escribe nada.
Necesita Node 20 o posterior.
npx @luz-ds/check@0.3.0
npx @luz-ds/check@0.3.0 index.html css/site.css
npx @luz-ds/check@0.3.0 src --json
Indica npx @luz-ds/check@0.3.0 y el ámbito. Una ruta puede ser un archivo, una carpeta (la lectura es recursiva: .html, .htm y .css) o un patrón glob entre comillas, como "src/**/*.html".
Si no indicas ninguna ruta, lee la carpeta actual.
| Opción | Qué hace |
|---|---|
--json | Muestra el informe como JSON |
--strict | Falla tanto si hay un aviso como si hay un hallazgo bloqueante |
--config <file> | Lee esta configuración en lugar de luz-check.json |
--theme <file.css> | Indica una hoja de estilos que define tokens de color cuyos colores se miden; repítelo para cada archivo, en el orden en que los carga la página |
--ext <list> | También lee como HTML archivos con estas extensiones, como .astro,.vue |
--version | Muestra la versión |
--help | Muestra las opciones y los límites del comando |
Un archivo luz-check.json en la carpeta desde la que ejecutas el comando configura ignore, rules, themes y strict. Desde ahí puedes desactivar una regla que avisa; una regla bloqueante solo se silencia con ignore. El resumen indica cuántos hallazgos se han ignorado y cuántas reglas están desactivadas.
Códigos de salida
| Código | Significado |
|---|---|
0 | No hay bloqueos. Puede que se hayan mostrado avisos. |
1 | Hay al menos un hallazgo bloqueante o, con --strict, se ha encontrado un aviso. |
2 | El comando se ha usado de forma incorrecta, no se puede leer una configuración o no hay nada que leer. |
Qué muestra
Una línea por cada hallazgo, en el orden de los archivos y las líneas: un símbolo (✗ bloquea, ! avisa), la ubicación, la regla y una frase que explica qué está mal y qué hacer. Después de un hallazgo sobre un token de color aparecen las líneas donde se definieron los colores.
La última línea cuenta los hallazgos encontrados en los archivos que ha leído.
✗ index.html:14:8 class/unknown .luz-btn-primary is not a LUZ class; the closest is .luz-btn--primary
✗ index.html:22:5 load/package-missing <luz-announcement> is in @luz-ds/catalog/components/announcement.css; add it after core
! site.css:8:3 css/literal-colour color is set to #1a5fb4; use a token, such as var(--luz-brand-fill)
✗ theme.css:3:3 theme/contrast light: --luz-text-secondary on surface-page is 2.8:1, needs 4.5:1 (text); change one of the two
--luz-text-secondary: #999999 is set in theme.css:3
✗ 3 blocking and 1 warning in 3 files (manifests: @luz-ds/core 0.1.0 from node_modules)
La parte (manifests: …) indica con qué versión de LUZ se han comprobado los nombres y de dónde procede: de tu node_modules o de la copia incluida con el comando.
El informe JSON
--json muestra un objeto con estos campos. Si un campo no aparece en esta tabla, no forma parte del informe.
| Campo | Tipo | Qué es |
|---|---|---|
tool | cadena | Siempre @luz-ds/check |
version | cadena | La versión del comprobador |
ok | booleano | Verdadero si no hay bloqueos ni avisos con --strict. No es un resultado de accesibilidad |
files | lista de cadenas | Los archivos que ha leído, ordenados |
manifests | lista de objetos | Los datos de LUZ con los que ha comprobado el proyecto, una entrada por paquete |
manifests[].package | cadena | El paquete, como @luz-ds/core |
manifests[].version | cadena | La versión de los datos de ese paquete |
manifests[].source | cadena | node_modules si tu proyecto tiene el paquete; bundled si se ha usado la copia del propio comando |
summary | objeto | Los recuentos de la ejecución |
summary.files | número | Cuántos archivos ha leído |
summary.blocking | número | Cuántos hallazgos bloquean |
summary.warnings | número | Cuántos hallazgos generan avisos |
summary.skipped | número | Cuántas rutas no ha leído |
summary.ignored | número | Cuántos hallazgos ha eliminado ignore en la configuración |
summary.off | número | Cuántas reglas ha desactivado la configuración |
summary.truncated | booleano | Verdadero si se ha truncado la lista de hallazgos; los recuentos anteriores están completos |
config | objeto | La configuración que se ha leído |
config.file | cadena o null | El archivo de configuración o null si no había ninguno |
config.off | lista de cadenas | Las reglas que ha desactivado la configuración |
findings | lista de objetos | Lo que ha encontrado, en el orden de los archivos y las líneas |
findings[].rule | cadena | La regla, como class/unknown |
findings[].severity | cadena | block o warn |
findings[].file | cadena | La ruta, relativa a la carpeta desde la que ejecutaste el comando |
findings[].line | número o null | La línea, si el hallazgo tiene una ubicación en el archivo |
findings[].column | número o null | La columna, si el hallazgo tiene una ubicación en el archivo |
findings[].message | cadena | La frase en inglés que explica qué está mal y qué hacer |
findings[].suggestion | cadena o null | El nombre de LUZ más parecido, si hay alguno suficientemente cercano |
findings[].docs | cadena | La URL de la página que explica la regla |
findings[].details | objeto | Solo en algunos hallazgos. Un hallazgo sobre un token de color indica el modo, los colores, la proporción y dónde se definieron los colores |
skipped | lista de objetos | Las rutas que no ha leído |
skipped[].file | cadena | La ruta |
skipped[].reason | cadena | Motivo: es un enlace, no es un archivo normal, supera 1 MiB, no se ha podido abrir o se ha alcanzado un límite de la ejecución |
Lo mismo ocurre con el texto y con JSON: las rutas y los nombres que contienen caracteres no habituales se escriben con escapes, y el comando nunca cita el contenido de tus archivos.
Qué bloquea y sobre qué avisa check
Cada regla tiene un id, como class/unknown, que aparece en todos los hallazgos. Una regla bloqueante hace que el código de salida sea 1.
Una regla que avisa no lo hace, salvo que pases --strict. Las dos tablas se generan a partir de la lista de reglas del comando.
Catalog 0.3 cambió el nombre de sus clases, elementos, archivos y módulos, y los nombres antiguos no hacen nada. names/renamed encuentra una clase, una etiqueta, un enlace a un archivo de componente o un módulo con el nombre antiguo, y da el nombre nuevo. No dice nada en una página que enlaza catalog 0.0 a 0.2, donde los nombres antiguos son los correctos.
| Rule | What it finds | Severity |
|---|---|---|
a11y/slider-no-name | A <luz-theme-time variant="bar"> with no data-luz-label-scrub on it or an ancestor, so its slider has no accessible name: the script writes no English text. | block |
class/unknown | A class starting with luz- that no classes.json lists, or an o- or u- class a typo away from one LUZ has. | block |
element/unknown | A <luz-*> tag that no custom-elements.json declares and that is not the block of a class. | block |
element/unknown-attribute | An attribute on a LUZ element that its custom-elements.json does not declare; global, aria-*, data-* and framework attributes are left alone. | block |
load/layer-statement | A <style> that declares the layers after the first LUZ stylesheet, when the order of the layers is already fixed. | block |
load/package-missing | A class or tag from a package whose stylesheet the page does not load, such as a site class with no site stylesheet. | block |
load/tokens-missing | A page that links core, catalog or a package for one kind of site and does not link @luz-ds/tokens. | block |
misuse/host-element | A class on an element it is not made for, such as a button class on a <div>; classes.json lists each class's elements. | block |
misuse/modifier-alone | A modifier such as luz-btn--primary on an element that does not also have the class it modifies. | block |
names/renamed | A class, element or file of catalog that has its old name from before 0.3 (luz-landing-hero, <luz-mode>, <luz-color-mode>, luz-mode-btn, landing-hero.css): the finding gives the new name. | block |
parse/error | A file that ends inside a comment, tag, string or brace, so the rest of it cannot be read. | block |
theme/contrast | A foreground and background pair in your colour token files that is under its WCAG contrast minimum in light, dark or high contrast. | block |
theme/unreadable | A LUZ colour token, in a file that sets colour tokens, whose value cannot be read as an sRGB colour, so its contrast cannot be measured. | block |
| Rule | What it finds | Severity |
|---|---|---|
a11y/link-no-href | An <a> that has a class made for links and no href, so it is not a link and a keyboard cannot reach it. | warn |
a11y/role-on-generic | A widget role, or onclick, on a <div> or <span> where a native element such as <button> does the same with the keyboard. | warn |
attr/unknown-hook | A data-luz-* attribute on an element that no package reads: usually a misspelling of one it does. | warn |
class/reserved-prefix | A stylesheet of yours that defines a class starting with luz-, the prefix LUZ keeps for itself. | warn |
class/unknown-in-css | A selector in your stylesheet that names a .luz-* class no classes.json lists. | warn |
css/important | !important in a declaration, in a custom property too; a rule outside the layers already wins over LUZ. | warn |
css/knob-in-px | --luz-type-base or --luz-space-unit set in px, which ignores the text size the reader chose. | warn |
css/literal-colour | A colour written out in a declaration (hex, rgb, hsl and the other functions) instead of a token. | warn |
css/literal-size | A px or rem length in font-size, margin, padding, gap or border-radius instead of a space, text or radius token. | warn |
css/private-token | A --luz-* property that one component sets for itself, set or read outside that component. | warn |
css/unknown-token | A --luz-* property that no package declares, set or read: usually a misspelling. | warn |
file/skipped | A path the check did not read, such as a symlink or a file that is too large; the finding says why. | warn |
load/no-stylesheet | Checked files that load no LUZ stylesheet at all, so a class can only be told from your own by its name. | warn |
load/order | LUZ stylesheets linked out of order; the order is tokens, core, catalog, then the package for your kind of site. | warn |
misuse/part-orphan | A part such as luz-card__title with no element of its block around it. | warn |
misuse/state-class | An is-* class that LUZ's own script sets, written in the markup. | warn |
theme/advisory | A note on how the colour check ran: the file order it used, a token no colour mode can place, a wide-gamut colour it does not measure, or sets of colour tokens past its limit. | warn |
El revisor de accesibilidad
El mismo paquete muestra una definición de agente para un asistente de programación con IA: un revisor que lee el código fuente de una página y ofrece recomendaciones de accesibilidad. Cópiala en tu proyecto.
npx @luz-ds/check@0.3.0 agent > .claude/agents/luz-accessibility-reviewer.md
- Sobrescribe archivos. El operador
>sustituye un archivo existente. Si lo has editado, usa otra ruta o guarda antes tu copia en el control de versiones. - Es de solo lectura. Tiene tres herramientas,
Read,GrepyGlob: lee, busca y enumera archivos, pero no escribe nada. Solo lectura no significa que sea inofensivo, porqueReadno limita las rutas. Lee el archivo antes de usarlo y revisa cualquier cambio como harías con el código. - Ofrece recomendaciones. Revisa el código fuente según el nivel AA de WCAG 2.2 y EN 301 549, y etiqueta cada hallazgo como confirmado en el código fuente o como algo que requiere un navegador o tecnología de asistencia. Sus hallazgos son sugerencias basadas en la lectura del código, no resultados de pruebas.
- No usa tecnología de asistencia. No abre páginas ni ejecuta scripts, y no observa cómo se representa una página, así que no sustituye una prueba con teclado y lector de pantalla.
El archivo también está en el paquete como @luz-ds/check/agents/accessibility.md, para que un paso de compilación lo copie.
Lo que no hace
Una ejecución sin hallazgos indica lo que el comprobador no ha encontrado en los archivos que ha leído. No es una prueba de la página.
- No ejecuta un navegador. Lee archivos, así que no detecta nada que dependa de cómo se representa una página, como la maquetación, el orden del foco o los colores que calcula el navegador.
- Solo mide el contraste de tus tokens. Mide los colores
--luz-*que defines en tu propio archivo de tokens de color. No compara los colores escritos directamente en una regla con ningún otro. En Comprobación del contraste se explica cómo lee los pares. - No detecta las clases creadas en tiempo de ejecución. Un nombre construido en un script, como
"luz-" + name, o escrito por una plantilla, no está en el archivo, así que no se comprueba. - No comprueba nombres, etiquetas, texto alternativo, encabezados ni el idioma. No analiza si un botón tiene nombre, si una imagen tiene una alternativa útil, si los encabezados están ordenados ni si la página tiene un idioma. Una ejecución sin hallazgos no dice nada sobre estos aspectos.
- No sustituye las pruebas con lector de pantalla. Ni el comando ni el revisor utilizan tecnología de asistencia. Lo que no se ha probado se enumera en la declaración de accesibilidad.
- No accede a la red. Se ejecuta sin conexión, con los datos de tu
node_moduleso de su propio paquete. - El descubrimiento mediante
llms.txtse hace con un enlace. Este sitio no está en la raíz de un host, así que el agente no encuentra el archivo por sí solo: dale la URL, como hace el prompt anterior. - El código de salida 0 no es un resultado de accesibilidad. Indica que ninguna de las reglas anteriores bloquea los archivos leídos.
- Los mensajes están en inglés. No se traducen, sea cual sea el idioma de la página.