Accesibilidad
Lineamientos WCAG 2.1 AA para todos los productos Codeway. Accesibilidad como estándar, no como feature.
Estándar mínimo
WCAG 2.1 AA ✓
Requerido para todos los productos
WCAG 2.1 AAA
Aspiracional donde sea posible
Contraste de color
| Elemento | Ratio mínimo | Ejemplo |
|---|---|---|
| Texto normal (<18px) | 4.5:1 | #fafafa sobre #000 = 19.3:1 ✓ |
| Texto grande (≥18px bold) | 3:1 | #a1a1aa sobre #000 = 8.5:1 ✓ |
| Elementos UI (borders, icons) | 3:1 | #3f3f46 sobre #000 = 2.7:1 ⚠️ |
| Decorativo / deshabilitado | N/A | Sin requisito |
Nota: zinc-700 (#3f3f46) en borders decorativos no requiere contraste AA, pero elementos interactivos sí.
Navegación por teclado
/* Reglas de focus */
/* 1. Todos los elementos interactivos deben ser focusables */
/* 2. Focus visible siempre (no outline: none sin reemplazo) */
/* 3. Orden lógico de tab (no tabindex > 0) */
/* Nuestro estilo de focus ring */
.focus-visible:outline-none
.focus-visible:ring-2
.focus-visible:ring-blue-500
.focus-visible:ring-offset-2
.focus-visible:ring-offset-black
/* Keyboard shortcuts (web) */
Esc → Cerrar modal/dropdown
Tab → Siguiente elemento
Shift+Tab → Anterior elemento
Enter → Activar botón/link
Space → Activar checkbox/button
Arrow → Navegar en listas/tabsARIA patterns
/* Button */
<button aria-label="Cerrar" aria-disabled={disabled}>
/* Modal */
<div role="dialog" aria-modal="true" aria-labelledby="title">
/* Tabs */
<div role="tablist">
<button role="tab" aria-selected={true} aria-controls="panel-1">
/* Alert */
<div role="alert" aria-live="polite">
/* Loading */
<div aria-busy="true" aria-label="Cargando contenido">
/* Form errors */
<input aria-invalid="true" aria-describedby="error-msg">
<p id="error-msg" role="alert">Error message</p>
/* Toggle */
<button role="switch" aria-checked={checked}>Accesibilidad mobile
iOS (VoiceOver)
- •
accessibilityLabelen todos los elementos - •
accessibilityHintpara acciones no obvias - •
accessibilityTraitscorrectos (.button, .header) - • Soporte de Dynamic Type (fuentes escalables)
- • Test con VoiceOver en dispositivo real
Android (TalkBack)
- •
contentDescriptionen elementos visuales - •
importantForAccessibilityconfigurado - •
accessibilityRoleen Compose - • Soporte de font scaling del sistema
- • Test con TalkBack y Accessibility Scanner
Checklist pre-release
- ☐Contraste de texto cumple 4.5:1 (AA)
- ☐Todos los elementos interactivos son focusables por teclado
- ☐Focus ring visible en todos los elementos interactivos
- ☐Imágenes tienen alt text descriptivo
- ☐Formularios tienen labels asociados
- ☐Errores se comunican con role="alert"
- ☐Modals atrapan el focus (focus trap)
- ☐Animaciones respetan prefers-reduced-motion
- ☐Touch targets ≥ 44px en mobile
- ☐VoiceOver / TalkBack testeado en flujo principal