Communitygithub.com

mehmetmuejde/agent-skills

Se aplica cada vez que se crea o modifica la interfaz de usuario — componentes, páginas, formularios, diálogos, menús, pestañas, tablas, iconos, imágenes, animaciones, notificaciones, cambios de ruta — y para auditorías de accesibilidad. La accesibilidad se desarrolla junto con la interfaz, nunca se añade después. Objetivo: WCAG 2.2 AA. Cubre semántica y ARIA, teclado y foco, nombres accesibles, formularios y errores, regiones activas, contraste y color, tamaños de objetivo, movimiento, zoom/reajuste, y pruebas con Testing Library, Storybook addon-a11y, Playwright + axe y comprobaciones manuales con teclado y lector de pantalla. Reglas independientes del framework con ejemplos en React.

¿Qué es agent-skills?

Este conjunto de habilidades (skill) garantiza que cada cambio en la interfaz de usuario (UI) sea accesible desde el diseño inicial, el desarrollo y las pruebas, cumpliendo con el estándar WCAG 2.2 nivel AA. Es útil porque automatiza y estandariza la accesibilidad en todo el flujo de trabajo del frontend, evitando que se añada como un paso posterior. El skill es independiente del framework, pero proporciona ejemplos en React. Funciona mediante un conjunto de reglas centrales que priorizan el uso de elementos HTML nativos y ARIA mínimo pero correcto, gestión del foco y teclado, formularios etiquetados y con validación accesible, anuncios de cambios dinámicos y cumplimiento de requisitos visuales como contraste, color, tamaño de objetivo y zoom. Además, integra pruebas automatizadas y manuales: pruebas de componentes con Testing Library, historias de Storybook con addon-a11y, análisis con Playwright + axe y comprobaciones manuales de teclado y lector de pantalla.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mehmetmuejde/agent-skills/tree/HEAD/skills/frontend-accessibility

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Accesibilidad en el frontend

La accesibilidad es parte de cada cambio de interfaz: se diseña, construye y prueba con ella. Una tarea de interfaz no está terminada hasta que funciona solo con teclado, cada control anuncia nombre, función y estado, las comprobaciones automatizadas pasan y las pruebas consultan por función.

Objetivo: WCAG 2.2 nivel AA — en la UE, la Ley Europea de Accesibilidad (leyes nacionales como BFSG, EN 301 549) la hace obligatoria para muchos productos. Un hallazgo cita un criterio WCAG A/AA o una tarea concreta que un usuario de tecnología de asistencia no puede completar. Los criterios AAA y las convenciones (un <h1>, objetivos de 44 px) son recomendaciones, nunca bloqueantes.

TareaLeer
Elección de elementos, puntos de referencia, encabezados, ARIA, nombres accesibles, estados deshabilitadosreferences/semantics-and-aria.md
Anillos de foco, orden de tabulación, enlace de salto, diálogos, cambios de ruta, mapas de teclas de widgetsreferences/focus-and-keyboard.md
Etiquetas, autocompletado, tipos de entrada, errores de validación, comportamiento de envíoreferences/forms.md
Anunciar cambios, regiones activas, notificaciones, texto alternativo, SVG, mediosreferences/screen-readers.md
Contraste, color, tamaños de objetivo, movimiento, zoom, reajuste, manejo de contenidoreferences/visual-and-motion.md
Pruebas automatizadas y manuales, CIreferences/testing.md
Auditoría/revisión de interfaz existente, formato de informereferences/audit.md
Consultar un criterio WCAG 2.2references/wcag.md

Reglas fundamentales — siempre

Priorizar lo nativo. <button> para acciones, <a href> / <Link> del enrutador para navegación, <label>, <fieldset>, <table>, <dialog>, puntos de referencia. Nunca `». Ningún ARIA es mejor que un ARIA incorrecto; una función promete el modelo completo de teclado. Los widgets complejos (combobox, menú, selector de fecha) provienen de la biblioteca headless accesible del proyecto, no se construyen a mano.

Cada elemento interactivo tiene un nombre accesible [4.1.2]. Los botones de solo icono obtienen aria-label, el icono aria-hidden="true". El texto de la etiqueta visible forma parte del nombre accesible [2.5.3]. Los enlaces indican adónde llevan — nada de "haz clic aquí" [2.4.4].

Teclado [2.1.1, 2.1.2]. Todo lo que funciona con un puntero funciona con el teclado; sin trampas. El orden de tabulación = orden visual; nunca un tabIndex positivo. Escape cierra la superposición superior. Las operaciones de arrastrar y gestos tienen una alternativa de puntero único [2.5.7, 2.5.1].

Foco visible [2.4.7, 1.4.11]. Estilo :focus-visible; nunca outline: none sin un reemplazo verificado (≥ 3:1 contra cada color adyacente). El foco no se oculta detrás de encabezados/banners fijos [2.4.11] — scroll-padding-top.

Gestión del foco. Diálogos: el foco se mueve hacia adentro al abrir, se atrapa, el fondo es inerte, vuelve al desencadenante al cerrar. Cambio de ruta en SPA: actualizar document.title [2.4.2] y mover el foco al nuevo <h1> (tabIndex={-1}) o <main>.

Formularios [1.3.1, 3.3.1, 3.3.2]. <label> visible para cada control — un marcador de posición no es una etiqueta. type, inputMode y autoComplete correctos [1.3.5]. Errores en línea, vinculados con aria-describedby, campo aria-invalid="true", enfocar el primer campo no válido al enviar. Validar al enviar — no deshabilitar el botón de envío hasta que sea válido. Nunca bloquear el pegado [3.3.8].

Anunciar cambios dinámicos [4.1.3]. Específico del campo → aria-describedby; no urgente (guardado, recuento de resultados, carga) → role="status"; error urgente a nivel de formulario → role="alert". La región activa existe en el DOM antes de que su texto cambie.

Color y contraste [1.4.3, 1.4.11, 1.4.1]. Texto ≥ 4.5:1 (grande ≥ 3:1), límites de interfaz, iconos y anillos de foco ≥ 3:1 — aplicados mediante tokens de diseño. El color nunca es la única señal.

Objetivos [2.5.8]. ≥ 24×24 píxeles CSS o espacio suficiente; apuntar a 40 px en escritorio / 44 px en táctil. Las superposiciones decorativas reciben pointer-events: none.

Movimiento y tiempo [2.3.3, 2.2.2]. Animaciones opt-in mediante @media (prefers-reduced-motion: no-preference); parallax/reproducción automática desactivada en modo de movimiento reducido. Cualquier cosa que se mueva > 5 s se puede pausar. Las notificaciones con acciones o errores permanecen hasta que se descartan.

Zoom y reajuste [1.4.4, 1.4.10]. Funciona al 200 % de tamaño de texto y 320 píxeles de ancho CSS sin desplazamiento horizontal. Nunca maximum-scale=1 / user-scalable=no.

Conceptos básicos de la página. <html lang> establecido y actualizado con el idioma de la interfaz [3.1.1]; un <main> visible; los encabezados forman un esquema; enlace de salto primero cuando la navegación precede a <main> [2.4.1].

Imágenes. Significativa → alt describe el propósito; decorativa → alt=""; funcional (la imagen es el enlace/botón) → la acción [1.1.1].

Deber de pruebas

Cada cambio de interfaz se publica con:

  • pruebas de componentes que consultan por función y nombre (getByRole) y cubren rutas de teclado (user.tab(), {Escape}, toHaveFocus()),
  • historias de Storybook cuya comprobación addon-a11y se ejecuta como error (falla CI),
  • análisis de Playwright + @axe-core/playwright (etiquetas WCAG 2.x A/AA) en páginas y estados críticos,
  • una comprobación manual solo con teclado del flujo; una comprobación con lector de pantalla (VoiceOver/NVDA) para flujos críticos.

Las herramientas automatizadas encuentran solo una parte de los problemas — una ejecución limpia de axe no es conformidad con WCAG. Detalles: references/testing.md.

Antes de finalizar — revisar el cambio en busca de

PatrónCorrección
<div onClick> / <span onClick><button>, o <a href> cuando navega
role="button"/role="tab" sin manejo de teclaselemento nativo o mapa de teclas APG
outline: none / outline-none sin reemplazo focus-visiblemantener el anillo del navegador o un anillo personalizado verificado
tabIndex positivocorregir el orden del DOM, usar 0 / -1
<img sin altalt="" o una descripción del propósito
botón de icono sin nombrearia-label, icono aria-hidden
entrada sin <label> / marcador de posición como etiquetaetiqueta visible vinculada
disabled={!isValid} en el envíomantener habilitado, validar al enviar
{msg && <div role="status">…}renderizar la región vacía primero, actualizar su texto
aria-live="assertive" en mensajes de éxitorole="status"
aria-hidden en o sobre un elemento enfocableeliminarlo o hacer que el subárbol sea inert
onPaste + preventDefaultpermitir pegar
maximum-scale=1 / user-scalable=noeliminar
encabezado fijo sin scroll-padding-toprellenar el desplazador
arrastrar/gesto sin alternativa de botónagregar una ruta de puntero único
transition: all, movimiento sin protección de movimiento reducidoenumerar propiedades, envolver en no-preference

Informes

Las auditorías y revisiones se informan en el idioma de la conversación, un hallazgo por causa raíz con todas las ubicaciones, criterio WCAG, impacto en el usuario y corrección concreta — formato en references/audit.md. La severidad se asigna a la habilidad de revisión de código: ALTA → Bloqueante/Importante, MEDIA → Importante/Menor, BAJA → Menor.

Fuentes

Combinado de: web-quality-skills de Addy Osmani, accessibility (MIT), better-accessibility de Jakub Krehel (MIT), fixing-accessibility de ibelick (MIT), Web Interface Guidelines de Vercel (MIT); W3C WCAG 2.2 y WAI-ARIA Authoring Practices.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Skills relacionados