@holmdigital/standards 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1945 @@
1
+ [
2
+ {
3
+ "ruleId": "color-contrast",
4
+ "wcagCriteria": "1.4.3",
5
+ "wcagLevel": "AA",
6
+ "wcagTitle": "Contrast (Minimum)",
7
+ "wcagVersion": "2.0",
8
+ "en301549Criteria": "9.1.4.3",
9
+ "en301549Title": "Contrast (minimum)",
10
+ "en301549Chapter": 9,
11
+ "dosLagenApplies": true,
12
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
13
+ "remediation": {
14
+ "description": "El texto y las imágenes de texto deben tener una relación de contraste de al menos 4.5:1 (3:1 para texto grande).",
15
+ "technicalGuidance": "Utilice herramientas como WebAIM Contrast Checker para verificar. Ajuste los colores o añada opacidad al fondo.",
16
+ "component": "@holmdigital/components/Button",
17
+ "codeExample": "import { Button } from '@holmdigital/components';\n\n// Bad: Poor contrast\n<button style={{ background: '#777', color: '#999' }}>Click me</button>\n\n// Good: Use accessible component\n<Button variant=\"primary\">Click me</Button>",
18
+ "wcagTechnique": [
19
+ "G18",
20
+ "G145",
21
+ "G174"
22
+ ]
23
+ },
24
+ "holmdigitalInsight": {
25
+ "diggRisk": "high",
26
+ "eaaImpact": "critical",
27
+ "spanishInterpretation": "Una de las razones más comunes de multas. Especialmente importante para el sector público.",
28
+ "commonMistakes": [
29
+ "Texto gris sobre fondo blanco (#777 en #FFF)",
30
+ "Enlaces azul claro sin subrayado",
31
+ "Texto de marcador de posición (placeholder) con bajo contraste"
32
+ ],
33
+ "diggPrecedent": "Regulators often cite poor contrast in primary navigation elements.",
34
+ "priorityRationale": "Critical for users with low vision. Affects readability for all users in varying lighting conditions."
35
+ },
36
+ "testability": {
37
+ "automated": true,
38
+ "requiresManualCheck": false,
39
+ "pseudoAutomation": false,
40
+ "complexity": "simple"
41
+ },
42
+ "tags": [
43
+ "color",
44
+ "contrast",
45
+ "visual",
46
+ "wcag2a",
47
+ "wcag21aa"
48
+ ]
49
+ },
50
+ {
51
+ "ruleId": "keyboard-accessible",
52
+ "wcagCriteria": "2.1.1",
53
+ "wcagLevel": "A",
54
+ "wcagTitle": "Keyboard",
55
+ "wcagVersion": "2.0",
56
+ "en301549Criteria": "9.2.1.1",
57
+ "en301549Title": "Keyboard",
58
+ "en301549Chapter": 9,
59
+ "dosLagenApplies": true,
60
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
61
+ "remediation": {
62
+ "description": "Todas las funcionalidades del contenido se pueden operar a través de una interfaz de teclado.",
63
+ "technicalGuidance": "Asegúrese de que todos los elementos interactivos se puedan enfocar y activar usando Tab, Enter o Espacio. Use elementos HTML nativos (<button>, <a>) siempre que sea posible. Asegúrese de que `tabindex` se use correctamente.",
64
+ "component": "@holmdigital/components/Button",
65
+ "codeExample": "// Bad: Div with onClick\n<div onClick={handleClick}>Click Me</div>\n\n// Good: Button element\n<button onClick={handleClick}>Click Me</button>\n\n// Best: Use HolmDigital component\nimport { Button } from '@holmdigital/components';\n<Button onClick={handleClick}>Click Me</Button>",
66
+ "wcagTechnique": [
67
+ "G202",
68
+ "H91"
69
+ ]
70
+ },
71
+ "holmdigitalInsight": {
72
+ "diggRisk": "critical",
73
+ "eaaImpact": "critical",
74
+ "spanishInterpretation": "Requisito básico absoluto. Si no puedes usarlo sin un ratón, no es accesible.",
75
+ "commonMistakes": [
76
+ "Elementos `div` o `span` con `onClick` pero sin `role=\"button\"` ni `tabIndex`",
77
+ "Falta de estilos de foco visible (interactúa con 2.4.7)",
78
+ "Interacciones que requieren un movimiento específico del ratón (arrastrar y soltar) sin alternativa de teclado"
79
+ ],
80
+ "diggPrecedent": "Los auditores han impuesto multas a sitios donde las funciones principales (por ejemplo, formularios, navegación) no son accesibles mediante teclado.",
81
+ "priorityRationale": "Crítico para usuarios con discapacidades motoras y usuarios de lectores de pantalla."
82
+ },
83
+ "testability": {
84
+ "automated": false,
85
+ "requiresManualCheck": true,
86
+ "pseudoAutomation": true,
87
+ "complexity": "moderate"
88
+ },
89
+ "tags": [
90
+ "keyboard",
91
+ "interaction",
92
+ "wcag2a",
93
+ "wcag21a"
94
+ ]
95
+ },
96
+ {
97
+ "ruleId": "alt-text",
98
+ "wcagCriteria": "1.1.1",
99
+ "wcagLevel": "A",
100
+ "wcagTitle": "Non-text Content",
101
+ "wcagVersion": "2.0",
102
+ "en301549Criteria": "9.1.1.1",
103
+ "en301549Title": "Non-text content",
104
+ "en301549Chapter": 9,
105
+ "dosLagenApplies": true,
106
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
107
+ "remediation": {
108
+ "description": "Todo el contenido no textual que se presenta al usuario tiene una alternativa textual que sirve para el mismo propósito.",
109
+ "technicalGuidance": "Añada el atributo `alt` a todas las imágenes `<img>`. Si es decorativa, use `alt=\"\"`. Para imágenes complejas, use figuras con subtítulos.",
110
+ "codeExample": "// Bad: Msising alt\n<img src=\"logo.png\" />\n\n// Good: Descriptive alt\n<img src=\"logo.png\" alt=\"HolmDigital Logo\" />\n\n// Good: Decorative image\n<img src=\"decoration.png\" alt=\"\" role=\"presentation\" />",
111
+ "wcagTechnique": [
112
+ "G94",
113
+ "G95",
114
+ "H37"
115
+ ]
116
+ },
117
+ "holmdigitalInsight": {
118
+ "diggRisk": "high",
119
+ "eaaImpact": "high",
120
+ "spanishInterpretation": "A menudo se pasa por alto o se hace mal ('imagen.jpg'). Esencial para los usuarios de lectores de pantalla.",
121
+ "commonMistakes": [
122
+ "Atributo `alt` faltante",
123
+ "Texto alternativo no descriptivo ('imagen', 'foto')",
124
+ "Imágenes de texto sin texto alternativo"
125
+ ],
126
+ "diggPrecedent": "Las auditorías citan con frecuencia la falta de texto alternativo, especialmente para infografías vitales.",
127
+ "priorityRationale": "Crítico para que los usuarios de lectores de pantalla accedan a la información visual."
128
+ },
129
+ "testability": {
130
+ "automated": true,
131
+ "requiresManualCheck": true,
132
+ "pseudoAutomation": false,
133
+ "complexity": "simple"
134
+ },
135
+ "tags": [
136
+ "images",
137
+ "alt-text",
138
+ "wcag2a",
139
+ "wcag21a"
140
+ ]
141
+ },
142
+ {
143
+ "ruleId": "form-labels",
144
+ "wcagCriteria": "3.3.2",
145
+ "wcagLevel": "A",
146
+ "wcagTitle": "Labels or Instructions",
147
+ "wcagVersion": "2.0",
148
+ "en301549Criteria": "9.3.3.2",
149
+ "en301549Title": "Labels or instructions",
150
+ "en301549Chapter": 9,
151
+ "dosLagenApplies": true,
152
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
153
+ "remediation": {
154
+ "description": "Si un componente de entrada acepta texto, la identificación de ese componente es un texto presentado visualmente.",
155
+ "technicalGuidance": "Todos los inputs deben tener una etiqueta asociada. Use `<label for=\"id\">`, envolver en `<label>`, o `aria-label`/`aria-labelledby`.",
156
+ "component": "@holmdigital/components/FormField",
157
+ "codeExample": "import { FormField } from '@holmdigital/components';\n\n// Bad: No label\n<input type=\"text\" placeholder=\"Name\" />\n\n// Good: With label\n<label htmlFor=\"name\">Name:</label>\n<input type=\"text\" id=\"name\" />\n\n// Best: Use HolmDigital component\n<FormField\n label=\"Name\"\n type=\"text\"\n required\n helpText=\"Enter your full name\"\n/>",
158
+ "wcagTechnique": [
159
+ "G131",
160
+ "G162",
161
+ "H44",
162
+ "H71"
163
+ ]
164
+ },
165
+ "holmdigitalInsight": {
166
+ "diggRisk": "high",
167
+ "eaaImpact": "high",
168
+ "spanishInterpretation": "Los formularios son críticos para los servicios electrónicos. El cumplimiento se aplica estrictamente en las aplicaciones del sector público.",
169
+ "commonMistakes": [
170
+ "Solo marcador de posición sin etiqueta",
171
+ "Etiqueta y entrada no vinculadas a través de for/id",
172
+ "Mensajes de error sin aria-describedby",
173
+ "Campos obligatorios no marcados claramente"
174
+ ],
175
+ "diggPrecedent": "Las decisiones de auditoría a menudo critican la mala accesibilidad de los formularios, especialmente para las solicitudes y los formularios de contacto.",
176
+ "priorityRationale": "Crítico para que los usuarios utilicen con éxito los servicios electrónicos y envíen información."
177
+ },
178
+ "testability": {
179
+ "automated": true,
180
+ "requiresManualCheck": false,
181
+ "pseudoAutomation": false,
182
+ "complexity": "simple"
183
+ },
184
+ "tags": [
185
+ "forms",
186
+ "labels",
187
+ "wcag2a",
188
+ "wcag21a"
189
+ ]
190
+ },
191
+ {
192
+ "ruleId": "page-title",
193
+ "wcagCriteria": "2.4.2",
194
+ "wcagLevel": "A",
195
+ "wcagTitle": "Page Titled",
196
+ "wcagVersion": "2.0",
197
+ "en301549Criteria": "9.2.4.2",
198
+ "en301549Title": "Page titled",
199
+ "en301549Chapter": 9,
200
+ "dosLagenApplies": true,
201
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
202
+ "remediation": {
203
+ "description": "Las páginas web tienen títulos que describen su tema o propósito.",
204
+ "technicalGuidance": "El elemento `<title>` en el `<head>` debe ser único y descriptivo para cada página. Formato: 'Nombre de la página - Nombre del sitio'.",
205
+ "codeExample": "// Bad: Generic title\n<title>Page</title>\n\n// Good: Descriptive title\n<title>Contact Us - HolmDigital</title>\n\n// React/Next.js\nimport Head from 'next/head';\n\n<Head>\n <title>Contact Us - HolmDigital</title>\n</Head>",
206
+ "wcagTechnique": [
207
+ "G88",
208
+ "H25"
209
+ ]
210
+ },
211
+ "holmdigitalInsight": {
212
+ "diggRisk": "medium",
213
+ "eaaImpact": "medium",
214
+ "spanishInterpretation": "La primera información que recibe un usuario de lector de pantalla. Esencial para la orientación.",
215
+ "commonMistakes": [
216
+ "Todas las páginas se llaman 'Inicio' o 'Nombre de la empresa'",
217
+ "Título predeterminado ('React App', 'Untitled Document')",
218
+ "Demasiado largo o demasiado corto",
219
+ "Título completamente ausente"
220
+ ],
221
+ "diggPrecedent": "Las auditorías han señalado la falta de títulos de página, especialmente en las aplicaciones de una sola página (SPA).",
222
+ "priorityRationale": "Importante para la navegación de lectores de pantalla y SEO."
223
+ },
224
+ "testability": {
225
+ "automated": true,
226
+ "requiresManualCheck": false,
227
+ "pseudoAutomation": false,
228
+ "complexity": "simple"
229
+ },
230
+ "tags": [
231
+ "navigation",
232
+ "title",
233
+ "wcag2a",
234
+ "wcag21a"
235
+ ]
236
+ },
237
+ {
238
+ "ruleId": "info-and-relationships",
239
+ "wcagCriteria": "1.3.1",
240
+ "wcagLevel": "A",
241
+ "wcagTitle": "Info and Relationships",
242
+ "wcagVersion": "2.0",
243
+ "en301549Criteria": "9.1.3.1",
244
+ "en301549Title": "Info and relationships",
245
+ "en301549Chapter": 9,
246
+ "dosLagenApplies": true,
247
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
248
+ "remediation": {
249
+ "description": "La información, estructura y relaciones transmitidas a través de la presentación pueden ser determinadas por programa o están disponibles en texto.",
250
+ "technicalGuidance": "Use HTML semántico: <header>, <nav>, <main>, <footer>, <h1>-<h6>, <ul>/ <ol>, <table>. No use estilos visuales para crear encabezados o listas 'falsos'.",
251
+ "component": null,
252
+ "wcagTechnique": [
253
+ "H42",
254
+ "H48",
255
+ "G115"
256
+ ]
257
+ },
258
+ "holmdigitalInsight": {
259
+ "diggRisk": "high",
260
+ "eaaImpact": "high",
261
+ "spanishInterpretation": "La estructura semántica es crucial para que los lectores de pantalla naveguen eficazmente. Los auditores a menudo citan la 'sopa de divs' que parece estructura pero carece de semántica.",
262
+ "commonMistakes": [
263
+ "Uso de texto en negrita en lugar de <h1>-<h6>",
264
+ "Uso de <br> para listas en lugar de <ul>",
265
+ "Tablas para diseño"
266
+ ],
267
+ "priorityRationale": "Fundamental para la navegación de toda tecnología de asistencia."
268
+ },
269
+ "testability": {
270
+ "automated": true,
271
+ "requiresManualCheck": true,
272
+ "pseudoAutomation": false,
273
+ "complexity": "moderate"
274
+ },
275
+ "tags": [
276
+ "structure",
277
+ "semantic",
278
+ "headings",
279
+ "wcag2a"
280
+ ]
281
+ },
282
+ {
283
+ "ruleId": "use-of-color",
284
+ "wcagCriteria": "1.4.1",
285
+ "wcagLevel": "A",
286
+ "wcagTitle": "Use of Color",
287
+ "wcagVersion": "2.0",
288
+ "en301549Criteria": "9.1.4.1",
289
+ "en301549Title": "Use of color",
290
+ "en301549Chapter": 9,
291
+ "dosLagenApplies": true,
292
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
293
+ "remediation": {
294
+ "description": "El color no se usa como el único medio visual para transmitir información, indicar una acción, solicitar una respuesta o distinguir un elemento visual.",
295
+ "technicalGuidance": "Acompañe el color con texto, iconos o subrayado. Por ejemplo, los enlaces deben tener subrayado u otro marcador visual además del color. Los mensajes de error necesitan texto/icono, no solo un borde rojo.",
296
+ "component": "@holmdigital/components/FormField",
297
+ "wcagTechnique": [
298
+ "G14",
299
+ "G182",
300
+ "G183"
301
+ ]
302
+ },
303
+ "holmdigitalInsight": {
304
+ "diggRisk": "medium",
305
+ "eaaImpact": "medium",
306
+ "spanishInterpretation": "Problema común en gráficos y mapas donde solo se usa la codificación por colores.",
307
+ "commonMistakes": [
308
+ "Enlaces que solo difieren por color del texto del cuerpo",
309
+ "Mensajes de error solo marcados con color rojo",
310
+ "Gráficos donde solo el color distingue los puntos de datos"
311
+ ],
312
+ "priorityRationale": "Crucial para usuarios daltónicos."
313
+ },
314
+ "testability": {
315
+ "automated": false,
316
+ "requiresManualCheck": true,
317
+ "pseudoAutomation": false,
318
+ "complexity": "moderate"
319
+ },
320
+ "tags": [
321
+ "visual",
322
+ "color",
323
+ "design",
324
+ "wcag2a"
325
+ ]
326
+ },
327
+ {
328
+ "ruleId": "reflow",
329
+ "wcagCriteria": "1.4.10",
330
+ "wcagLevel": "AA",
331
+ "wcagTitle": "Reflow",
332
+ "wcagVersion": "2.1",
333
+ "en301549Criteria": "9.1.4.10",
334
+ "en301549Title": "Reflow",
335
+ "en301549Chapter": 9,
336
+ "dosLagenApplies": true,
337
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
338
+ "remediation": {
339
+ "description": "El contenido se puede presentar sin pérdida de información o funcionalidad, y sin requerir desplazamiento en dos dimensiones.",
340
+ "technicalGuidance": "Use diseño responsivo (CSS Media Queries, Flexbox, Grid). Evite anchos fijos en píxeles. Asegúrese de que las tablas y las imágenes se escalen correctamente.",
341
+ "component": null,
342
+ "wcagTechnique": [
343
+ "C32",
344
+ "C31"
345
+ ]
346
+ },
347
+ "holmdigitalInsight": {
348
+ "diggRisk": "high",
349
+ "eaaImpact": "high",
350
+ "spanishInterpretation": "Un requisito moderno (WCAG 2.1) crítico para el uso móvil y el texto ampliado. DIGG tiene tolerancia cero para el desplazamiento horizontal en sitios verticales.",
351
+ "commonMistakes": [
352
+ "Anchos fijos en contenedores",
353
+ "Tablas que no son responsivas",
354
+ "Imágenes más anchas que la pantalla"
355
+ ],
356
+ "priorityRationale": "Crítico para usuarios con baja visión que hacen mucho zoom."
357
+ },
358
+ "testability": {
359
+ "automated": false,
360
+ "requiresManualCheck": true,
361
+ "pseudoAutomation": true,
362
+ "complexity": "moderate"
363
+ },
364
+ "tags": [
365
+ "design",
366
+ "responsive",
367
+ "mobile",
368
+ "wcag21aa"
369
+ ]
370
+ },
371
+ {
372
+ "ruleId": "non-text-contrast",
373
+ "wcagCriteria": "1.4.11",
374
+ "wcagLevel": "AA",
375
+ "wcagTitle": "Non-text Contrast",
376
+ "wcagVersion": "2.1",
377
+ "en301549Criteria": "9.1.4.11",
378
+ "en301549Title": "Non-text contrast",
379
+ "en301549Chapter": 9,
380
+ "dosLagenApplies": true,
381
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
382
+ "remediation": {
383
+ "description": "La presentación visual de los componentes de la interfaz de usuario y los objetos gráficos tiene una relación de contraste de al menos 3:1 contra los colores adyacentes.",
384
+ "technicalGuidance": "Se aplica a botones, bordes de entrada, iconos e indicadores de enfoque. Asegúrese de que todos los elementos interactivos sean claramente visibles contra el fondo.",
385
+ "component": "@holmdigital/components/Button",
386
+ "wcagTechnique": [
387
+ "G195",
388
+ "G207"
389
+ ]
390
+ },
391
+ "holmdigitalInsight": {
392
+ "diggRisk": "low",
393
+ "eaaImpact": "low",
394
+ "spanishInterpretation": "Requisito a menudo pasado por alto con respecto a los anillos de enfoque y los componentes inactivos (pero visibles). Importante para comprender la interfaz.",
395
+ "commonMistakes": [
396
+ "Botones atenuados con muy bajo contraste"
397
+ ],
398
+ "priorityRationale": "Importante para distinguir elementos interactivos."
399
+ },
400
+ "testability": {
401
+ "automated": false,
402
+ "requiresManualCheck": true,
403
+ "pseudoAutomation": false,
404
+ "complexity": "complex"
405
+ },
406
+ "tags": [
407
+ "visual",
408
+ "contrast",
409
+ "graphics",
410
+ "wcag21aa"
411
+ ]
412
+ },
413
+ {
414
+ "ruleId": "text-spacing",
415
+ "wcagCriteria": "1.4.12",
416
+ "wcagLevel": "AA",
417
+ "wcagTitle": "Text Spacing",
418
+ "wcagVersion": "2.1",
419
+ "en301549Criteria": "9.1.4.12",
420
+ "en301549Title": "Text spacing",
421
+ "en301549Chapter": 9,
422
+ "dosLagenApplies": true,
423
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
424
+ "remediation": {
425
+ "description": "En el contenido implementado utilizando lenguajes de marcado, no se produce ninguna pérdida de contenido o funcionalidad al ajustar el espaciado del texto.",
426
+ "technicalGuidance": "Evite alturas fijas en los contenedores de texto. Deje que los contenedores crezcan con el contenido. Pruebe con el bookmarklet de espaciado de texto.",
427
+ "component": null,
428
+ "wcagTechnique": [
429
+ "C36"
430
+ ]
431
+ },
432
+ "holmdigitalInsight": {
433
+ "diggRisk": "low",
434
+ "eaaImpact": "medium",
435
+ "spanishInterpretation": "Importante para las adaptaciones de dislexia.",
436
+ "commonMistakes": [
437
+ "Altura de línea fija en píxeles",
438
+ "Contenedor de texto que no crece"
439
+ ],
440
+ "priorityRationale": "Importante para la legibilidad durante las adaptaciones."
441
+ },
442
+ "testability": {
443
+ "automated": false,
444
+ "requiresManualCheck": true,
445
+ "pseudoAutomation": true,
446
+ "complexity": "moderate"
447
+ },
448
+ "tags": [
449
+ "visual",
450
+ "typography",
451
+ "wcag21aa"
452
+ ]
453
+ },
454
+ {
455
+ "ruleId": "content-on-hover",
456
+ "wcagCriteria": "1.4.13",
457
+ "wcagLevel": "AA",
458
+ "wcagTitle": "Content on Hover or Focus",
459
+ "wcagVersion": "2.1",
460
+ "en301549Criteria": "9.1.4.13",
461
+ "en301549Title": "Content on hover or focus",
462
+ "en301549Chapter": 9,
463
+ "dosLagenApplies": true,
464
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
465
+ "remediation": {
466
+ "description": "Cuando el puntero o el foco del teclado activan contenido adicional, dicho contenido es descartable, cernible y persistente.",
467
+ "technicalGuidance": "Asegúrese de que los tooltips no desaparezcan al mover el ratón del activador al propio tooltip. Permita que ESC lo cierre.",
468
+ "component": null,
469
+ "wcagTechnique": [
470
+ "SCR39"
471
+ ]
472
+ },
473
+ "holmdigitalInsight": {
474
+ "diggRisk": "medium",
475
+ "eaaImpact": "medium",
476
+ "spanishInterpretation": "Problema común con tooltips personalizados y mega-menús.",
477
+ "commonMistakes": [
478
+ "Tooltips a los que no se puede llegar con el ratón",
479
+ "Menús que se cierran con demasiada facilidad",
480
+ "Contenido que no se puede descartar sin mover el foco"
481
+ ],
482
+ "priorityRationale": "Importante para usuarios con magnificación y dificultades motoras."
483
+ },
484
+ "testability": {
485
+ "automated": false,
486
+ "requiresManualCheck": true,
487
+ "pseudoAutomation": true,
488
+ "complexity": "complex"
489
+ },
490
+ "tags": [
491
+ "interaction",
492
+ "hover",
493
+ "tooltips",
494
+ "wcag21aa"
495
+ ]
496
+ },
497
+ {
498
+ "ruleId": "captions-prerecorded",
499
+ "wcagCriteria": "1.2.2",
500
+ "wcagLevel": "A",
501
+ "wcagTitle": "Captions (Prerecorded)",
502
+ "wcagVersion": "2.0",
503
+ "en301549Criteria": "9.1.2.2",
504
+ "en301549Title": "Captions (prerecorded)",
505
+ "en301549Chapter": 9,
506
+ "dosLagenApplies": true,
507
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
508
+ "remediation": {
509
+ "description": "Se proporcionan subtítulos para todo el contenido de audio pregrabado dentro de medios sincronizados.",
510
+ "technicalGuidance": "Use el elemento `<track>` con archivos WebVTT para video HTML5. Para redes sociales, asegúrese de que los subtítulos estén activados.",
511
+ "component": null,
512
+ "wcagTechnique": [
513
+ "G87",
514
+ "G93"
515
+ ]
516
+ },
517
+ "holmdigitalInsight": {
518
+ "diggRisk": "high",
519
+ "eaaImpact": "high",
520
+ "spanishInterpretation": "Una de las carencias más comunes. Obligatorio por ley que los videos tengan subtítulos.",
521
+ "commonMistakes": [
522
+ "Subtítulos automáticos de mala calidad",
523
+ "Falta de subtítulos",
524
+ "Subtítulos incrustados (open captions) no accesibles para búsqueda/traducción"
525
+ ],
526
+ "priorityRationale": "Critical for deaf and hard of hearing users."
527
+ },
528
+ "testability": {
529
+ "automated": false,
530
+ "requiresManualCheck": true,
531
+ "pseudoAutomation": false,
532
+ "complexity": "simple"
533
+ },
534
+ "tags": [
535
+ "media",
536
+ "video",
537
+ "captions",
538
+ "wcag2a"
539
+ ]
540
+ },
541
+ {
542
+ "ruleId": "audio-description",
543
+ "wcagCriteria": "1.2.5",
544
+ "wcagLevel": "AA",
545
+ "wcagTitle": "Audio Description (Prerecorded)",
546
+ "wcagVersion": "2.0",
547
+ "en301549Criteria": "9.1.2.5",
548
+ "en301549Title": "Audio description (prerecorded)",
549
+ "en301549Chapter": 9,
550
+ "dosLagenApplies": true,
551
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
552
+ "remediation": {
553
+ "description": "Se proporciona audiodescripción para todo el contenido de video pregrabado.",
554
+ "technicalGuidance": "Ya sea como una pista de audio separada, una versión alternativa del video, o (si son 'bustos parlantes') asegurando que toda la información visual se transmita por audio.",
555
+ "component": null,
556
+ "wcagTechnique": [
557
+ "G78",
558
+ "G69"
559
+ ]
560
+ },
561
+ "holmdigitalInsight": {
562
+ "diggRisk": "medium",
563
+ "eaaImpact": "medium",
564
+ "spanishInterpretation": "A menudo se puede resolver con 'descripción integrada' (hablar de lo que se ve), lo cual es más económico.",
565
+ "commonMistakes": [
566
+ "Información mostrada solo visualmente sin mención en el audio"
567
+ ],
568
+ "priorityRationale": "Critical for blind video users."
569
+ },
570
+ "testability": {
571
+ "automated": false,
572
+ "requiresManualCheck": true,
573
+ "pseudoAutomation": false,
574
+ "complexity": "moderate"
575
+ },
576
+ "tags": [
577
+ "media",
578
+ "video",
579
+ "audio-description",
580
+ "wcag2aa"
581
+ ]
582
+ },
583
+ {
584
+ "ruleId": "orientation",
585
+ "wcagCriteria": "1.3.4",
586
+ "wcagLevel": "AA",
587
+ "wcagTitle": "Orientation",
588
+ "wcagVersion": "2.1",
589
+ "en301549Criteria": "9.1.3.4",
590
+ "en301549Title": "Orientation",
591
+ "en301549Chapter": 9,
592
+ "dosLagenApplies": true,
593
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
594
+ "remediation": {
595
+ "description": "El contenido no restringe su visión y operación a una sola orientación de pantalla, a menos que una orientación específica sea esencial.",
596
+ "technicalGuidance": "No bloquee la pantalla en retrato o paisaje mediante CSS o manifiesto JS. Use media queries para gestionar el diseño.",
597
+ "component": null,
598
+ "wcagTechnique": [
599
+ "F97"
600
+ ]
601
+ },
602
+ "holmdigitalInsight": {
603
+ "diggRisk": "low",
604
+ "eaaImpact": "medium",
605
+ "spanishInterpretation": "Importante para tabletas y usuarios con dispositivos montados (sillas de ruedas).",
606
+ "commonMistakes": [
607
+ "Apps que rotan la interfaz 90 grados contra la voluntad del usuario"
608
+ ],
609
+ "priorityRationale": "Important for users who cannot rotate their device."
610
+ },
611
+ "testability": {
612
+ "automated": false,
613
+ "requiresManualCheck": true,
614
+ "pseudoAutomation": true,
615
+ "complexity": "simple"
616
+ },
617
+ "tags": [
618
+ "mobile",
619
+ "responsive",
620
+ "orientation",
621
+ "wcag21aa"
622
+ ]
623
+ },
624
+ {
625
+ "ruleId": "identify-input-purpose",
626
+ "wcagCriteria": "1.3.5",
627
+ "wcagLevel": "AA",
628
+ "wcagTitle": "Identify Input Purpose",
629
+ "wcagVersion": "2.1",
630
+ "en301549Criteria": "9.1.3.5",
631
+ "en301549Title": "Identify input purpose",
632
+ "en301549Chapter": 9,
633
+ "dosLagenApplies": true,
634
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
635
+ "remediation": {
636
+ "description": "El propósito de cada campo de entrada que recopila información sobre el usuario puede ser determinado por programa.",
637
+ "technicalGuidance": "Use el atributo 'autocomplete' en los campos de entrada para datos personales (nombre, correo electrónico, teléfono, dirección, etc.).",
638
+ "component": "@holmdigital/components/FormField",
639
+ "wcagTechnique": [
640
+ "H98"
641
+ ]
642
+ },
643
+ "holmdigitalInsight": {
644
+ "diggRisk": "medium",
645
+ "eaaImpact": "high",
646
+ "spanishInterpretation": "Facilita enormemente el autocompletado de formularios.",
647
+ "commonMistakes": [
648
+ "Falta atributo autocomplete",
649
+ "Valor autocomplete incorrecto",
650
+ "Desactivar autocomplete innecesariamente"
651
+ ],
652
+ "priorityRationale": "Reduces cognitive load and motor requirements."
653
+ },
654
+ "testability": {
655
+ "automated": true,
656
+ "requiresManualCheck": false,
657
+ "pseudoAutomation": false,
658
+ "complexity": "simple"
659
+ },
660
+ "tags": [
661
+ "forms",
662
+ "autocomplete",
663
+ "wcag21aa"
664
+ ]
665
+ },
666
+ {
667
+ "ruleId": "no-keyboard-trap",
668
+ "wcagCriteria": "2.1.2",
669
+ "wcagLevel": "A",
670
+ "wcagTitle": "No Keyboard Trap",
671
+ "wcagVersion": "2.0",
672
+ "en301549Criteria": "9.2.1.2",
673
+ "en301549Title": "No keyboard trap",
674
+ "en301549Chapter": 9,
675
+ "dosLagenApplies": true,
676
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
677
+ "remediation": {
678
+ "description": "Si el foco se puede mover a un componente de la página mediante el teclado, entonces se puede mover fuera de ese componente usando solo el teclado.",
679
+ "technicalGuidance": "Cuidado con widgets JS que atrapan el foco (ej: ventanas modales). Asegúrese de que siempre haya una salida (ej: ESC o shift+tab).",
680
+ "component": null,
681
+ "wcagTechnique": [
682
+ "G21"
683
+ ]
684
+ },
685
+ "holmdigitalInsight": {
686
+ "diggRisk": "critical",
687
+ "eaaImpact": "critical",
688
+ "spanishInterpretation": "Una trampa de teclado es un bloqueo crítico. Error grave.",
689
+ "commonMistakes": [
690
+ "Widgets personalizados que ciclan el foco infinitamente",
691
+ "Componentes de terceros integrados (mapas, chats) sin salida"
692
+ ],
693
+ "priorityRationale": "Critical: The user gets stuck and must restart the browser."
694
+ },
695
+ "testability": {
696
+ "automated": false,
697
+ "requiresManualCheck": true,
698
+ "pseudoAutomation": true,
699
+ "complexity": "moderate"
700
+ },
701
+ "tags": [
702
+ "keyboard",
703
+ "interaction",
704
+ "wcag2a"
705
+ ]
706
+ },
707
+ {
708
+ "ruleId": "character-key-shortcuts",
709
+ "wcagCriteria": "2.1.4",
710
+ "wcagLevel": "A",
711
+ "wcagTitle": "Character Key Shortcuts",
712
+ "wcagVersion": "2.1",
713
+ "en301549Criteria": "9.2.1.4",
714
+ "en301549Title": "Character key shortcuts",
715
+ "en301549Chapter": 9,
716
+ "dosLagenApplies": true,
717
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
718
+ "remediation": {
719
+ "description": "Si un atajo de teclado se implementa usando solo letras, signos de puntuación, números o símbolos caracteres, entonces se puede desactivar, reasignar o activar solo al enfocar.",
720
+ "technicalGuidance": "Evite atajos de una sola tecla si es posible. Si son necesarios, asegúrese de que no entren en conflicto con el dictado por voz o la escritura accidental.",
721
+ "component": null,
722
+ "wcagTechnique": [
723
+ "G217"
724
+ ]
725
+ },
726
+ "holmdigitalInsight": {
727
+ "diggRisk": "medium",
728
+ "eaaImpact": "medium",
729
+ "spanishInterpretation": "Importante para usuarios de control por voz (Dragon, etc.) donde palabras simples pueden activar comandos accidentalmente.",
730
+ "commonMistakes": [
731
+ "Atajos tipo Gmail activados por defecto sin opción de desactivar"
732
+ ],
733
+ "priorityRationale": "Important to avoid accidental activation."
734
+ },
735
+ "testability": {
736
+ "automated": false,
737
+ "requiresManualCheck": true,
738
+ "pseudoAutomation": false,
739
+ "complexity": "moderate"
740
+ },
741
+ "tags": [
742
+ "keyboard",
743
+ "shortcuts",
744
+ "wcag21a"
745
+ ]
746
+ },
747
+ {
748
+ "ruleId": "timing-adjustable",
749
+ "wcagCriteria": "2.2.1",
750
+ "wcagLevel": "A",
751
+ "wcagTitle": "Timing Adjustable",
752
+ "wcagVersion": "2.0",
753
+ "en301549Criteria": "9.2.2.1",
754
+ "en301549Title": "Timing adjustable",
755
+ "en301549Chapter": 9,
756
+ "dosLagenApplies": true,
757
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
758
+ "remediation": {
759
+ "description": "Si se establece un límite de tiempo (sesión, tiempo de lectura), el usuario debe poder desactivarlo, ajustarlo o extenderlo.",
760
+ "technicalGuidance": "Proporcione una advertencia antes de que expire la sesión con un botón 'Extender sesión'. El límite de tiempo debe ser de al menos 20 segundos.",
761
+ "component": null,
762
+ "wcagTechnique": [
763
+ "SCR16",
764
+ "G180"
765
+ ]
766
+ },
767
+ "holmdigitalInsight": {
768
+ "diggRisk": "high",
769
+ "eaaImpact": "high",
770
+ "spanishInterpretation": "Crítico para servicios en línea/bancos. Los usuarios que leen despacio o usan tecnologías de asistencia necesitan más tiempo.",
771
+ "commonMistakes": [
772
+ "Cierre de sesión sin advertencia",
773
+ "Límites de tiempo imposibles de extender"
774
+ ],
775
+ "priorityRationale": "Critical to avoid losing entered data."
776
+ },
777
+ "testability": {
778
+ "automated": false,
779
+ "requiresManualCheck": true,
780
+ "pseudoAutomation": true,
781
+ "complexity": "moderate"
782
+ },
783
+ "tags": [
784
+ "time",
785
+ "session",
786
+ "wcag2a"
787
+ ]
788
+ },
789
+ {
790
+ "ruleId": "pause-stop-hide",
791
+ "wcagCriteria": "2.2.2",
792
+ "wcagLevel": "A",
793
+ "wcagTitle": "Pause, Stop, Hide",
794
+ "wcagVersion": "2.0",
795
+ "en301549Criteria": "9.2.2.2",
796
+ "en301549Title": "Pause, stop, hide",
797
+ "en301549Chapter": 9,
798
+ "dosLagenApplies": true,
799
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
800
+ "remediation": {
801
+ "description": "Para la información en movimiento, parpadeante, desplazable o de actualización automática, existe un mecanismo para que el usuario pueda pausarla, detenerla u ocultarla.",
802
+ "technicalGuidance": "Proporcione un botón de pausa para carruseles, tickers de valores o videos de fondo con reproducción automática.",
803
+ "component": null,
804
+ "wcagTechnique": [
805
+ "G4",
806
+ "G186"
807
+ ]
808
+ },
809
+ "holmdigitalInsight": {
810
+ "diggRisk": "medium",
811
+ "eaaImpact": "medium",
812
+ "spanishInterpretation": "Importante para usuarios con dificultades de concentración (TDAH/Autismo) que se distraen con el movimiento.",
813
+ "commonMistakes": [
814
+ "Carruseles sin botón de pausa",
815
+ "Sliders de rotación automática sin control"
816
+ ],
817
+ "priorityRationale": "Important for cognitive accessibility."
818
+ },
819
+ "testability": {
820
+ "automated": false,
821
+ "requiresManualCheck": true,
822
+ "pseudoAutomation": true,
823
+ "complexity": "moderate"
824
+ },
825
+ "tags": [
826
+ "animation",
827
+ "carousel",
828
+ "distraction",
829
+ "wcag2a"
830
+ ]
831
+ },
832
+ {
833
+ "ruleId": "three-flashes",
834
+ "wcagCriteria": "2.3.1",
835
+ "wcagLevel": "A",
836
+ "wcagTitle": "Three Flashes or Below Threshold",
837
+ "wcagVersion": "2.0",
838
+ "en301549Criteria": "9.2.3.1",
839
+ "en301549Title": "Three flashes or below threshold",
840
+ "en301549Chapter": 9,
841
+ "dosLagenApplies": true,
842
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
843
+ "remediation": {
844
+ "description": "Las páginas web no contienen nada que parpadee más de tres veces en un segundo, o el parpadeo está por debajo de los umbrales de parpadeo general y rojo.",
845
+ "technicalGuidance": "Evite el contenido que parpadea rápidamente (efectos estroboscópicos). Esto puede provocar convulsiones.",
846
+ "component": null,
847
+ "wcagTechnique": [
848
+ "G19"
849
+ ]
850
+ },
851
+ "holmdigitalInsight": {
852
+ "diggRisk": "critical",
853
+ "eaaImpact": "critical",
854
+ "spanishInterpretation": "Requisito de salud estricto. El contenido que provoca convulsiones es un fallo crítico.",
855
+ "commonMistakes": [
856
+ "Videojuegos o intros con parpadeos rápidos",
857
+ "Uso indebido de mensajes de error parpadeantes"
858
+ ],
859
+ "priorityRationale": "Critical safety risk."
860
+ },
861
+ "testability": {
862
+ "automated": false,
863
+ "requiresManualCheck": true,
864
+ "pseudoAutomation": false,
865
+ "complexity": "complex"
866
+ },
867
+ "tags": [
868
+ "seizure",
869
+ "safety",
870
+ "animation",
871
+ "wcag2a"
872
+ ]
873
+ },
874
+ {
875
+ "ruleId": "bypass-blocks",
876
+ "wcagCriteria": "2.4.1",
877
+ "wcagLevel": "A",
878
+ "wcagTitle": "Bypass Blocks",
879
+ "wcagVersion": "2.0",
880
+ "en301549Criteria": "9.2.4.1",
881
+ "en301549Title": "Bypass blocks",
882
+ "en301549Chapter": 9,
883
+ "dosLagenApplies": true,
884
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
885
+ "remediation": {
886
+ "description": "Existe un mecanismo disponible para saltar bloques de contenido que se repiten en múltiples páginas web.",
887
+ "technicalGuidance": "Añada un enlace 'Saltar al contenido' como el primer elemento enfocable de la página. Use landmarks (header, nav, main, aside, footer) para permitir la navegación con lector de pantalla.",
888
+ "component": null,
889
+ "wcagTechnique": [
890
+ "G1",
891
+ "H69"
892
+ ]
893
+ },
894
+ "holmdigitalInsight": {
895
+ "diggRisk": "medium",
896
+ "eaaImpact": "medium",
897
+ "spanishInterpretation": "Enlace 'Saltar al contenido' casi obligatorio. Los landmarks también son clave.",
898
+ "commonMistakes": [
899
+ "Falta enlace 'Saltar al contenido'",
900
+ "Enlace oculto con display:none (inlocalizable)",
901
+ "Faltan landmarks"
902
+ ],
903
+ "priorityRationale": "Important for efficient navigation."
904
+ },
905
+ "testability": {
906
+ "automated": true,
907
+ "requiresManualCheck": true,
908
+ "pseudoAutomation": true,
909
+ "complexity": "simple"
910
+ },
911
+ "tags": [
912
+ "navigation",
913
+ "skip-link",
914
+ "keyboard",
915
+ "wcag2a"
916
+ ]
917
+ },
918
+ {
919
+ "ruleId": "focus-order",
920
+ "wcagCriteria": "2.4.3",
921
+ "wcagLevel": "A",
922
+ "wcagTitle": "Focus Order",
923
+ "wcagVersion": "2.0",
924
+ "en301549Criteria": "9.2.4.3",
925
+ "en301549Title": "Focus order",
926
+ "en301549Chapter": 9,
927
+ "dosLagenApplies": true,
928
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
929
+ "remediation": {
930
+ "description": "Si una página web se puede navegar secuencialmente y las secuencias de navegación afectan el significado o la operación, los componentes enfocables reciben el foco en un orden que preserva el significado y la operatividad.",
931
+ "technicalGuidance": "El orden del DOM determina el orden del foco. No manipule tab-index (> 0). Organice los elementos lógicamente en el HTML.",
932
+ "component": null,
933
+ "wcagTechnique": [
934
+ "G59",
935
+ "C27"
936
+ ]
937
+ },
938
+ "holmdigitalInsight": {
939
+ "diggRisk": "high",
940
+ "eaaImpact": "high",
941
+ "spanishInterpretation": "Crítico para diseños complejos (Grid/Flexbox) donde el orden visual puede diferir del orden del DOM.",
942
+ "commonMistakes": [
943
+ "El foco salta ilógicamente",
944
+ "Menús en orden incorrecto",
945
+ "El modal se cierra y el foco vuelve a la parte superior de la página"
946
+ ],
947
+ "priorityRationale": "Critical for keyboard navigation and understanding."
948
+ },
949
+ "testability": {
950
+ "automated": false,
951
+ "requiresManualCheck": true,
952
+ "pseudoAutomation": true,
953
+ "complexity": "moderate"
954
+ },
955
+ "tags": [
956
+ "focus",
957
+ "keyboard",
958
+ "navigation",
959
+ "wcag2a"
960
+ ]
961
+ },
962
+ {
963
+ "ruleId": "link-purpose",
964
+ "wcagCriteria": "2.4.4",
965
+ "wcagLevel": "A",
966
+ "wcagTitle": "Link Purpose (In Context)",
967
+ "wcagVersion": "2.0",
968
+ "en301549Criteria": "9.2.4.4",
969
+ "en301549Title": "Link purpose (in context)",
970
+ "en301549Chapter": 9,
971
+ "dosLagenApplies": true,
972
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
973
+ "remediation": {
974
+ "description": "El propósito de cada enlace se puede determinar solo con el texto del enlace o con el texto del enlace junto con su contexto determinado por programa.",
975
+ "technicalGuidance": "Evite 'Leer más' o 'Haga clic aquí'. El texto del enlace debe indicar el destino (ej: 'Leer más sobre nuestros servicios').",
976
+ "component": null,
977
+ "wcagTechnique": [
978
+ "G91",
979
+ "H30"
980
+ ]
981
+ },
982
+ "holmdigitalInsight": {
983
+ "diggRisk": "medium",
984
+ "eaaImpact": "medium",
985
+ "spanishInterpretation": "Importante para usuarios que navegan a través de listas de enlaces (lectores de pantalla).",
986
+ "commonMistakes": [
987
+ "Muchos enlaces 'Leer más'",
988
+ "Enlaces que no indican a dónde llevan"
989
+ ],
990
+ "priorityRationale": "Important for efficient navigation."
991
+ },
992
+ "testability": {
993
+ "automated": true,
994
+ "requiresManualCheck": true,
995
+ "pseudoAutomation": false,
996
+ "complexity": "simple"
997
+ },
998
+ "tags": [
999
+ "links",
1000
+ "navigation",
1001
+ "copywriting",
1002
+ "wcag2a"
1003
+ ]
1004
+ },
1005
+ {
1006
+ "ruleId": "multiple-ways",
1007
+ "wcagCriteria": "2.4.5",
1008
+ "wcagLevel": "AA",
1009
+ "wcagTitle": "Multiple Ways",
1010
+ "wcagVersion": "2.0",
1011
+ "en301549Criteria": "9.2.4.5",
1012
+ "en301549Title": "Multiple ways",
1013
+ "en301549Chapter": 9,
1014
+ "dosLagenApplies": true,
1015
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1016
+ "remediation": {
1017
+ "description": "Debe haber más de una forma de encontrar una página web dentro de un conjunto de páginas web.",
1018
+ "technicalGuidance": "Al menos dos de: Menú, Búsqueda, Mapa del sitio, Enlaces en el contenido.",
1019
+ "component": null,
1020
+ "wcagTechnique": [
1021
+ "G125",
1022
+ "G126"
1023
+ ]
1024
+ },
1025
+ "holmdigitalInsight": {
1026
+ "diggRisk": "low",
1027
+ "eaaImpact": "low",
1028
+ "spanishInterpretation": "A menudo se cumple con menú + búsqueda. El mapa del sitio es una buena práctica.",
1029
+ "commonMistakes": [
1030
+ "Falta de búsqueda en sitios con muchas páginas"
1031
+ ],
1032
+ "priorityRationale": "Facilitates different navigation strategies."
1033
+ },
1034
+ "testability": {
1035
+ "automated": false,
1036
+ "requiresManualCheck": true,
1037
+ "pseudoAutomation": false,
1038
+ "complexity": "simple"
1039
+ },
1040
+ "tags": [
1041
+ "navigation",
1042
+ "search",
1043
+ "sitemap",
1044
+ "wcag2aa"
1045
+ ]
1046
+ },
1047
+ {
1048
+ "ruleId": "headings-and-labels",
1049
+ "wcagCriteria": "2.4.6",
1050
+ "wcagLevel": "AA",
1051
+ "wcagTitle": "Headings and Labels",
1052
+ "wcagVersion": "2.0",
1053
+ "en301549Criteria": "9.2.4.6",
1054
+ "en301549Title": "Headings and labels",
1055
+ "en301549Chapter": 9,
1056
+ "dosLagenApplies": true,
1057
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1058
+ "remediation": {
1059
+ "description": "Los encabezados y las etiquetas deben describir el tema o propósito.",
1060
+ "technicalGuidance": "Escriba encabezados claros y descriptivos que den significado al contenido debajo de ellos. Las etiquetas de formulario deben ser comprensibles.",
1061
+ "component": null,
1062
+ "wcagTechnique": [
1063
+ "G130"
1064
+ ]
1065
+ },
1066
+ "holmdigitalInsight": {
1067
+ "diggRisk": "medium",
1068
+ "eaaImpact": "medium",
1069
+ "spanishInterpretation": "Sobre la calidad editorial y la comprensibilidad.",
1070
+ "commonMistakes": [
1071
+ "Encabezados crípticos",
1072
+ "Etiquetas que no coinciden con lo que se debe rellenar"
1073
+ ],
1074
+ "priorityRationale": "Important for cognitive accessibility."
1075
+ },
1076
+ "testability": {
1077
+ "automated": false,
1078
+ "requiresManualCheck": true,
1079
+ "pseudoAutomation": false,
1080
+ "complexity": "simple"
1081
+ },
1082
+ "tags": [
1083
+ "content",
1084
+ "headings",
1085
+ "labels",
1086
+ "wcag2aa"
1087
+ ]
1088
+ },
1089
+ {
1090
+ "ruleId": "focus-visible",
1091
+ "wcagCriteria": "2.4.7",
1092
+ "wcagLevel": "AA",
1093
+ "wcagTitle": "Focus Visible",
1094
+ "wcagVersion": "2.0",
1095
+ "en301549Criteria": "9.2.4.7",
1096
+ "en301549Title": "Focus visible",
1097
+ "en301549Chapter": 9,
1098
+ "dosLagenApplies": true,
1099
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1100
+ "remediation": {
1101
+ "description": "Cualquier interfaz de usuario operable por teclado debe tener un indicador de foco visible.",
1102
+ "technicalGuidance": "Nunca elimine el contorno con CSS (outline: none) sin reemplazarlo con un indicador visual claro. Asegúrese de que el contraste del anillo de foco sea suficiente (ver 1.4.11).",
1103
+ "component": "@holmdigital/components/Button",
1104
+ "wcagTechnique": [
1105
+ "G149",
1106
+ "G165",
1107
+ "C15"
1108
+ ]
1109
+ },
1110
+ "holmdigitalInsight": {
1111
+ "diggRisk": "high",
1112
+ "eaaImpact": "high",
1113
+ "spanishInterpretation": "Uno de los errores más comunes. A menudo porque a los diseñadores no les gusta el 'anillo azul'.",
1114
+ "commonMistakes": [
1115
+ "outline: none en CSS reset",
1116
+ "Botones personalizados sin estilo :focus"
1117
+ ],
1118
+ "priorityRationale": "Critical: Without visible focus, the keyboard user doesn't know where they are."
1119
+ },
1120
+ "testability": {
1121
+ "automated": true,
1122
+ "requiresManualCheck": true,
1123
+ "pseudoAutomation": true,
1124
+ "complexity": "simple"
1125
+ },
1126
+ "tags": [
1127
+ "focus",
1128
+ "visual",
1129
+ "keyboard",
1130
+ "wcag2aa"
1131
+ ]
1132
+ },
1133
+ {
1134
+ "ruleId": "language-of-page",
1135
+ "wcagCriteria": "3.1.1",
1136
+ "wcagLevel": "A",
1137
+ "wcagTitle": "Language of Page",
1138
+ "wcagVersion": "2.0",
1139
+ "en301549Criteria": "9.3.1.1",
1140
+ "en301549Title": "Language of page",
1141
+ "en301549Chapter": 9,
1142
+ "dosLagenApplies": true,
1143
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1144
+ "remediation": {
1145
+ "description": "El idioma humano predeterminado de cada página web debe ser determinable por programa.",
1146
+ "technicalGuidance": "Establezca el atributo 'lang' en el elemento <html>. Por ejemplo, <html lang='en'> para inglés.",
1147
+ "component": null,
1148
+ "wcagTechnique": [
1149
+ "H57"
1150
+ ]
1151
+ },
1152
+ "holmdigitalInsight": {
1153
+ "diggRisk": "high",
1154
+ "eaaImpact": "high",
1155
+ "spanishInterpretation": "Fundamental para la lectura de pantalla. Sin esto, el lector de pantalla adivina el idioma, lo que a menudo lleva a una pronunciación incorrecta.",
1156
+ "commonMistakes": [
1157
+ "Falta el atributo Lang",
1158
+ "Código de idioma incorrecto (ej. 'en' en una página sueca)"
1159
+ ],
1160
+ "priorityRationale": "Critical for screen reader users."
1161
+ },
1162
+ "testability": {
1163
+ "automated": true,
1164
+ "requiresManualCheck": false,
1165
+ "pseudoAutomation": false,
1166
+ "complexity": "simple"
1167
+ },
1168
+ "tags": [
1169
+ "content",
1170
+ "language",
1171
+ "wcag2a"
1172
+ ]
1173
+ },
1174
+ {
1175
+ "ruleId": "language-of-parts",
1176
+ "wcagCriteria": "3.1.2",
1177
+ "wcagLevel": "AA",
1178
+ "wcagTitle": "Language of Parts",
1179
+ "wcagVersion": "2.0",
1180
+ "en301549Criteria": "9.3.1.2",
1181
+ "en301549Title": "Language of parts",
1182
+ "en301549Chapter": 9,
1183
+ "dosLagenApplies": true,
1184
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1185
+ "remediation": {
1186
+ "description": "El idioma humano de cada pasaje o frase en el contenido debe ser determinable por programa.",
1187
+ "technicalGuidance": "Use el atributo lang en elementos que difieran del idioma principal de la página. Por ejemplo, <span lang='fr'>Bonjour</span>.",
1188
+ "component": null,
1189
+ "wcagTechnique": [
1190
+ "H58"
1191
+ ]
1192
+ },
1193
+ "holmdigitalInsight": {
1194
+ "diggRisk": "low",
1195
+ "eaaImpact": "low",
1196
+ "spanishInterpretation": "Rara vez es un error crítico a menos que dificulte significativamente la comprensión.",
1197
+ "commonMistakes": [
1198
+ "Citas extranjeras en texto sin marcado"
1199
+ ],
1200
+ "priorityRationale": "Important for correct pronunciation."
1201
+ },
1202
+ "testability": {
1203
+ "automated": false,
1204
+ "requiresManualCheck": true,
1205
+ "pseudoAutomation": true,
1206
+ "complexity": "moderate"
1207
+ },
1208
+ "tags": [
1209
+ "content",
1210
+ "language",
1211
+ "wcag2aa"
1212
+ ]
1213
+ },
1214
+ {
1215
+ "ruleId": "on-focus",
1216
+ "wcagCriteria": "3.2.1",
1217
+ "wcagLevel": "A",
1218
+ "wcagTitle": "On Focus",
1219
+ "wcagVersion": "2.0",
1220
+ "en301549Criteria": "9.3.2.1",
1221
+ "en301549Title": "On focus",
1222
+ "en301549Chapter": 9,
1223
+ "dosLagenApplies": true,
1224
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1225
+ "remediation": {
1226
+ "description": "Cuando un componente recibe el foco, no debe iniciar un cambio de contexto.",
1227
+ "technicalGuidance": "No abra nuevas ventanas, envíe formularios o mueva el foco automáticamente solo porque el usuario tabula a un campo.",
1228
+ "component": null,
1229
+ "wcagTechnique": [
1230
+ "G107"
1231
+ ]
1232
+ },
1233
+ "holmdigitalInsight": {
1234
+ "diggRisk": "high",
1235
+ "eaaImpact": "high",
1236
+ "spanishInterpretation": "Muy confuso para los usuarios. Crea una sensación de falta de control.",
1237
+ "commonMistakes": [
1238
+ "Des desplegables que navegan inmediatamente al seleccionar (sin botón 'Ir')",
1239
+ "Formularios que se envían automáticamente al enfocar el último campo"
1240
+ ],
1241
+ "priorityRationale": "Important for predictability."
1242
+ },
1243
+ "testability": {
1244
+ "automated": false,
1245
+ "requiresManualCheck": true,
1246
+ "pseudoAutomation": true,
1247
+ "complexity": "moderate"
1248
+ },
1249
+ "tags": [
1250
+ "interaction",
1251
+ "focus",
1252
+ "predictability",
1253
+ "wcag2a"
1254
+ ]
1255
+ },
1256
+ {
1257
+ "ruleId": "on-input",
1258
+ "wcagCriteria": "3.2.2",
1259
+ "wcagLevel": "A",
1260
+ "wcagTitle": "On Input",
1261
+ "wcagVersion": "2.0",
1262
+ "en301549Criteria": "9.3.2.2",
1263
+ "en301549Title": "On input",
1264
+ "en301549Chapter": 9,
1265
+ "dosLagenApplies": true,
1266
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1267
+ "remediation": {
1268
+ "description": "Cambiar la configuración de cualquier componente no causa automáticamente un cambio de contexto a menos que se haya informado al usuario del comportamiento antes de usar el componente.",
1269
+ "technicalGuidance": "Informe al usuario que la selección en una lista recarga la página. Preferiblemente, añada un botón para confirmar la elección.",
1270
+ "component": null,
1271
+ "wcagTechnique": [
1272
+ "G13",
1273
+ "H32"
1274
+ ]
1275
+ },
1276
+ "holmdigitalInsight": {
1277
+ "diggRisk": "medium",
1278
+ "eaaImpact": "medium",
1279
+ "spanishInterpretation": "Común en funciones de filtrado.",
1280
+ "commonMistakes": [
1281
+ "Casillas de verificación que recargan la página inmediatamente",
1282
+ "Filtrado que mueve el foco"
1283
+ ],
1284
+ "priorityRationale": "Important for predictability."
1285
+ },
1286
+ "testability": {
1287
+ "automated": false,
1288
+ "requiresManualCheck": true,
1289
+ "pseudoAutomation": true,
1290
+ "complexity": "moderate"
1291
+ },
1292
+ "tags": [
1293
+ "interaction",
1294
+ "input",
1295
+ "predictability",
1296
+ "wcag2a"
1297
+ ]
1298
+ },
1299
+ {
1300
+ "ruleId": "consistent-navigation",
1301
+ "wcagCriteria": "3.2.3",
1302
+ "wcagLevel": "AA",
1303
+ "wcagTitle": "Consistent Navigation",
1304
+ "wcagVersion": "2.0",
1305
+ "en301549Criteria": "9.3.2.3",
1306
+ "en301549Title": "Consistent navigation",
1307
+ "en301549Chapter": 9,
1308
+ "dosLagenApplies": true,
1309
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1310
+ "remediation": {
1311
+ "description": "Los mecanismos de navegación que se repiten en varias páginas web aparecen en el mismo orden relativo cada vez que se repiten.",
1312
+ "technicalGuidance": "El menú principal debe verse igual y estar en el mismo lugar en todas las páginas. La función de búsqueda también.",
1313
+ "component": null,
1314
+ "wcagTechnique": [
1315
+ "G61"
1316
+ ]
1317
+ },
1318
+ "holmdigitalInsight": {
1319
+ "diggRisk": "medium",
1320
+ "eaaImpact": "medium",
1321
+ "spanishInterpretation": "La previsibilidad es clave para la accesibilidad cognitiva.",
1322
+ "commonMistakes": [
1323
+ "Menús que cambian de lugar o de orden en diferentes páginas"
1324
+ ],
1325
+ "priorityRationale": "Facilitates learning."
1326
+ },
1327
+ "testability": {
1328
+ "automated": false,
1329
+ "requiresManualCheck": true,
1330
+ "pseudoAutomation": false,
1331
+ "complexity": "simple"
1332
+ },
1333
+ "tags": [
1334
+ "navigation",
1335
+ "design",
1336
+ "consistency",
1337
+ "wcag2aa"
1338
+ ]
1339
+ },
1340
+ {
1341
+ "ruleId": "consistent-identification",
1342
+ "wcagCriteria": "3.2.4",
1343
+ "wcagLevel": "AA",
1344
+ "wcagTitle": "Consistent Identification",
1345
+ "wcagVersion": "2.0",
1346
+ "en301549Criteria": "9.3.2.4",
1347
+ "en301549Title": "Consistent identification",
1348
+ "en301549Chapter": 9,
1349
+ "dosLagenApplies": true,
1350
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1351
+ "remediation": {
1352
+ "description": "Los componentes que tienen la misma funcionalidad dentro de un conjunto de páginas web se identifican de manera consistente.",
1353
+ "technicalGuidance": "No llame a la búsqueda 'Buscar' en una página y 'Encontrar' en otra. Use el mismo icono para la misma función.",
1354
+ "component": null,
1355
+ "wcagTechnique": [
1356
+ "G197"
1357
+ ]
1358
+ },
1359
+ "holmdigitalInsight": {
1360
+ "diggRisk": "low",
1361
+ "eaaImpact": "low",
1362
+ "spanishInterpretation": "Importante para la usabilidad.",
1363
+ "commonMistakes": [
1364
+ "Nombres inconsistentes",
1365
+ "Diferentes iconos para imprimir/descargar"
1366
+ ],
1367
+ "priorityRationale": "Reduces cognitive load."
1368
+ },
1369
+ "testability": {
1370
+ "automated": false,
1371
+ "requiresManualCheck": true,
1372
+ "pseudoAutomation": false,
1373
+ "complexity": "simple"
1374
+ },
1375
+ "tags": [
1376
+ "content",
1377
+ "icons",
1378
+ "consistency",
1379
+ "wcag2aa"
1380
+ ]
1381
+ },
1382
+ {
1383
+ "ruleId": "error-identification",
1384
+ "wcagCriteria": "3.3.1",
1385
+ "wcagLevel": "A",
1386
+ "wcagTitle": "Error Identification",
1387
+ "wcagVersion": "2.0",
1388
+ "en301549Criteria": "9.3.3.1",
1389
+ "en301549Title": "Error identification",
1390
+ "en301549Chapter": 9,
1391
+ "dosLagenApplies": true,
1392
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1393
+ "remediation": {
1394
+ "description": "Si se detecta automáticamente un error de entrada, el elemento que está en error se identifica y el error se describe al usuario en texto.",
1395
+ "technicalGuidance": "Muestre el mensaje de error cerca del campo. Enlace con aria-describedby o incluya en la etiqueta. No solo coloree el campo de rojo.",
1396
+ "component": "@holmdigital/components/FormField",
1397
+ "wcagTechnique": [
1398
+ "G83",
1399
+ "SCR18"
1400
+ ]
1401
+ },
1402
+ "holmdigitalInsight": {
1403
+ "diggRisk": "high",
1404
+ "eaaImpact": "high",
1405
+ "spanishInterpretation": "Crítico para completar tareas. Los mensajes de error genéricos ('Algo salió mal') no se aceptan si el error es específico.",
1406
+ "commonMistakes": [
1407
+ "'Valor no válido' sin explicación",
1408
+ "Mensaje de error no visible para lectores de pantalla"
1409
+ ],
1410
+ "priorityRationale": "Critical for error handling."
1411
+ },
1412
+ "testability": {
1413
+ "automated": false,
1414
+ "requiresManualCheck": true,
1415
+ "pseudoAutomation": true,
1416
+ "complexity": "moderate"
1417
+ },
1418
+ "tags": [
1419
+ "forms",
1420
+ "errors",
1421
+ "wcag2a"
1422
+ ]
1423
+ },
1424
+ {
1425
+ "ruleId": "error-suggestion",
1426
+ "wcagCriteria": "3.3.3",
1427
+ "wcagLevel": "AA",
1428
+ "wcagTitle": "Error Suggestion",
1429
+ "wcagVersion": "2.0",
1430
+ "en301549Criteria": "9.3.3.3",
1431
+ "en301549Title": "Error suggestion",
1432
+ "en301549Chapter": 9,
1433
+ "dosLagenApplies": true,
1434
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1435
+ "remediation": {
1436
+ "description": "Si se detecta automáticamente un error de entrada y se conocen sugerencias para la corrección, se proporcionan las sugerencias al usuario.",
1437
+ "technicalGuidance": "Si el formato de fecha es incorrecto, muestre el formato requerido (AAAA-MM-DD). Ofrezca sugerencias de ortografía para la búsqueda ('¿Quiso decir...?').",
1438
+ "component": "@holmdigital/components/FormField",
1439
+ "wcagTechnique": [
1440
+ "G177"
1441
+ ]
1442
+ },
1443
+ "holmdigitalInsight": {
1444
+ "diggRisk": "medium",
1445
+ "eaaImpact": "medium",
1446
+ "spanishInterpretation": "Se trata de ser útil. Reduce los casos de soporte.",
1447
+ "commonMistakes": [
1448
+ "Solo decir 'Error' sin decir cómo solucionarlo"
1449
+ ],
1450
+ "priorityRationale": "Facilitates correction."
1451
+ },
1452
+ "testability": {
1453
+ "automated": false,
1454
+ "requiresManualCheck": true,
1455
+ "pseudoAutomation": true,
1456
+ "complexity": "moderate"
1457
+ },
1458
+ "tags": [
1459
+ "forms",
1460
+ "errors",
1461
+ "guidance",
1462
+ "wcag2aa"
1463
+ ]
1464
+ },
1465
+ {
1466
+ "ruleId": "error-prevention",
1467
+ "wcagCriteria": "3.3.4",
1468
+ "wcagLevel": "AA",
1469
+ "wcagTitle": "Error Prevention (Legal, Financial, Data)",
1470
+ "wcagVersion": "2.0",
1471
+ "en301549Criteria": "9.3.3.4",
1472
+ "en301549Title": "Error prevention (legal, financial, data)",
1473
+ "en301549Chapter": 9,
1474
+ "dosLagenApplies": true,
1475
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1476
+ "remediation": {
1477
+ "description": "Para las páginas web que causan compromisos legales o transacciones financieras, los usuarios deben poder: Revertir, Verificar o Confirmar.",
1478
+ "technicalGuidance": "Ofrezca una página de resumen antes del envío final con la posibilidad de editar.",
1479
+ "component": null,
1480
+ "wcagTechnique": [
1481
+ "G164",
1482
+ "G98"
1483
+ ]
1484
+ },
1485
+ "holmdigitalInsight": {
1486
+ "diggRisk": "high",
1487
+ "eaaImpact": "high",
1488
+ "spanishInterpretation": "Requisito absoluto para el comercio electrónico y las decisiones legales.",
1489
+ "commonMistakes": [
1490
+ "Compra directa sin confirmación",
1491
+ "Envío de contratos vinculantes sin revisión"
1492
+ ],
1493
+ "priorityRationale": "Critical to avoid serious consequences of mistakes."
1494
+ },
1495
+ "testability": {
1496
+ "automated": false,
1497
+ "requiresManualCheck": true,
1498
+ "pseudoAutomation": false,
1499
+ "complexity": "moderate"
1500
+ },
1501
+ "tags": [
1502
+ "forms",
1503
+ "legal",
1504
+ "financial",
1505
+ "wcag2aa"
1506
+ ]
1507
+ },
1508
+ {
1509
+ "ruleId": "parsing",
1510
+ "wcagCriteria": "4.1.1",
1511
+ "wcagLevel": "A",
1512
+ "wcagTitle": "Parsing",
1513
+ "wcagVersion": "2.0",
1514
+ "en301549Criteria": "9.4.1.1",
1515
+ "en301549Title": "Parsing",
1516
+ "en301549Chapter": 9,
1517
+ "dosLagenApplies": true,
1518
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1519
+ "remediation": {
1520
+ "description": "Update: From WCAG 2.2 this criterion is removed/obsolete, but in WCAG 2.1/EN 301 549 it applies: IDs must be unique, elements correctly nested.",
1521
+ "technicalGuidance": "Validate HTML. Ensure id attributes are unique on the page. Close all tags correctly.",
1522
+ "component": null,
1523
+ "wcagTechnique": [
1524
+ "H88"
1525
+ ]
1526
+ },
1527
+ "holmdigitalInsight": {
1528
+ "diggRisk": "low",
1529
+ "eaaImpact": "low",
1530
+ "spanishInterpretation": "Menos crítico ahora que los navegadores perdonan errores, pero IDs duplicados siguen rompiendo ARIA.",
1531
+ "commonMistakes": [
1532
+ "IDs duplicados (copy-paste)",
1533
+ "Etiquetas mal anidadas (div dentro de span)"
1534
+ ],
1535
+ "priorityRationale": "Technical hygiene factor."
1536
+ },
1537
+ "testability": {
1538
+ "automated": true,
1539
+ "requiresManualCheck": false,
1540
+ "pseudoAutomation": false,
1541
+ "complexity": "simple"
1542
+ },
1543
+ "tags": [
1544
+ "code",
1545
+ "html",
1546
+ "parsing",
1547
+ "wcag2a"
1548
+ ]
1549
+ },
1550
+ {
1551
+ "ruleId": "name-role-value",
1552
+ "wcagCriteria": "4.1.2",
1553
+ "wcagLevel": "A",
1554
+ "wcagTitle": "Name, Role, Value",
1555
+ "wcagVersion": "2.0",
1556
+ "en301549Criteria": "9.4.1.2",
1557
+ "en301549Title": "Name, role, value",
1558
+ "en301549Chapter": 9,
1559
+ "dosLagenApplies": true,
1560
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1561
+ "remediation": {
1562
+ "description": "Para todos los componentes de la interfaz de usuario, el nombre y la función pueden ser determinados por programa; los estados, propiedades y valores pueden ser configurados por programa; y la notificación de cambios está disponible.",
1563
+ "technicalGuidance": "Use elementos HTML nativos cuando sea posible. Si usa componentes personalizados, asegúrese de usar ARIA correctamente (role, aria-label, aria-valuenow).",
1564
+ "component": null,
1565
+ "wcagTechnique": [
1566
+ "ARIA4",
1567
+ "ARIA5"
1568
+ ]
1569
+ },
1570
+ "holmdigitalInsight": {
1571
+ "diggRisk": "critical",
1572
+ "eaaImpact": "critical",
1573
+ "spanishInterpretation": "Crítico. Sin esto, la aplicación es 'invisible' o inoperable para lectores de pantalla.",
1574
+ "commonMistakes": [
1575
+ "Botones div sin role",
1576
+ "Checkboxes personalizados sin aria-checked",
1577
+ "Falta de nombre accesible"
1578
+ ],
1579
+ "priorityRationale": "Absolutely critical for compatibility."
1580
+ },
1581
+ "testability": {
1582
+ "automated": true,
1583
+ "requiresManualCheck": true,
1584
+ "pseudoAutomation": true,
1585
+ "complexity": "complex"
1586
+ },
1587
+ "tags": [
1588
+ "code",
1589
+ "aria",
1590
+ "interaction",
1591
+ "wcag2a"
1592
+ ]
1593
+ },
1594
+ {
1595
+ "ruleId": "status-messages",
1596
+ "wcagCriteria": "4.1.3",
1597
+ "wcagLevel": "AA",
1598
+ "wcagTitle": "Status Messages",
1599
+ "wcagVersion": "2.1",
1600
+ "en301549Criteria": "9.4.1.3",
1601
+ "en301549Title": "Status messages",
1602
+ "en301549Chapter": 9,
1603
+ "dosLagenApplies": true,
1604
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1605
+ "remediation": {
1606
+ "description": "Los mensajes de estado deben poder presentarse al usuario sin recibir el foco (a través de lectores de pantalla).",
1607
+ "technicalGuidance": "Use regiones aria-live (polite/assertive) o role='status'/'alert' para mensajes que aparecen dinámicamente (ej. 'Guardado', 'Búsqueda completada').",
1608
+ "component": null,
1609
+ "wcagTechnique": [
1610
+ "ARIA19",
1611
+ "ARIA22"
1612
+ ]
1613
+ },
1614
+ "holmdigitalInsight": {
1615
+ "diggRisk": "medium",
1616
+ "eaaImpact": "medium",
1617
+ "spanishInterpretation": "Importante en SPAs. Los usuarios ciegos a menudo se pierden las notificaciones 'toast' si no se anuncian.",
1618
+ "commonMistakes": [
1619
+ "Actualizaciones silenciosas del carrito/resultados de búsqueda",
1620
+ "Notificaciones Toast no anunciadas"
1621
+ ],
1622
+ "priorityRationale": "Provides feedback to users without sight."
1623
+ },
1624
+ "testability": {
1625
+ "automated": false,
1626
+ "requiresManualCheck": true,
1627
+ "pseudoAutomation": true,
1628
+ "complexity": "moderate"
1629
+ },
1630
+ "tags": [
1631
+ "aria",
1632
+ "updates",
1633
+ "feedback",
1634
+ "wcag21aa"
1635
+ ]
1636
+ },
1637
+ {
1638
+ "ruleId": "landmark-one-main",
1639
+ "wcagCriteria": "1.3.1",
1640
+ "wcagLevel": "A",
1641
+ "wcagTitle": "Info and Relationships",
1642
+ "wcagVersion": "2.0",
1643
+ "en301549Criteria": "9.1.3.1",
1644
+ "en301549Title": "Info and relationships",
1645
+ "en301549Chapter": 9,
1646
+ "dosLagenApplies": true,
1647
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1648
+ "remediation": {
1649
+ "description": "La página debe tener una (y solo una) región principal (<main>).",
1650
+ "technicalGuidance": "Use el elemento <main> para el contenido principal. Si tiene varios, use aria-label, pero generalmente uno es mejor. Evite tener múltiples <main> sin etiquetas únicas, o que falte por completo.",
1651
+ "wcagTechnique": [
1652
+ "ARIA11",
1653
+ "H97"
1654
+ ]
1655
+ },
1656
+ "holmdigitalInsight": {
1657
+ "diggRisk": "medium",
1658
+ "eaaImpact": "medium",
1659
+ "spanishInterpretation": "Los usuarios de lectores de pantalla dependen de los landmarks para navegar rápidamente al contenido. La falta de <main> dificulta saltar la navegación.",
1660
+ "commonMistakes": [
1661
+ "Usar <div id='main'> en lugar de <main>",
1662
+ "Tener múltiples elementos <main>"
1663
+ ]
1664
+ },
1665
+ "testability": {
1666
+ "automated": true,
1667
+ "requiresManualCheck": false,
1668
+ "pseudoAutomation": true,
1669
+ "complexity": "simple"
1670
+ },
1671
+ "tags": [
1672
+ "wcag2a",
1673
+ "wcag131",
1674
+ "landmark"
1675
+ ]
1676
+ },
1677
+ {
1678
+ "ruleId": "page-has-heading-one",
1679
+ "wcagCriteria": "1.3.1",
1680
+ "wcagLevel": "A",
1681
+ "wcagTitle": "Info and Relationships",
1682
+ "wcagVersion": "2.0",
1683
+ "en301549Criteria": "9.1.3.1",
1684
+ "en301549Title": "Info and relationships",
1685
+ "en301549Chapter": 9,
1686
+ "dosLagenApplies": true,
1687
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1688
+ "remediation": {
1689
+ "description": "La página debe tener un título de nivel 1 (<h1>).",
1690
+ "technicalGuidance": "Asegúrese de que hay exactamente un <h1> describiendo el contenido único de la página.",
1691
+ "wcagTechnique": [
1692
+ "H42"
1693
+ ]
1694
+ },
1695
+ "holmdigitalInsight": {
1696
+ "diggRisk": "high",
1697
+ "eaaImpact": "high",
1698
+ "spanishInterpretation": "Un <h1> claro es vital para que los usuarios comprendan dónde han aterrizado. A menudo es lo primero que busca un usuario de lector de pantalla.",
1699
+ "commonMistakes": [
1700
+ "Comenzar los encabezados en <h2>",
1701
+ "Usar el logo como único <h1> sin texto"
1702
+ ]
1703
+ },
1704
+ "testability": {
1705
+ "automated": true,
1706
+ "requiresManualCheck": false,
1707
+ "pseudoAutomation": true,
1708
+ "complexity": "simple"
1709
+ },
1710
+ "tags": [
1711
+ "wcag2a",
1712
+ "wcag131",
1713
+ "heading"
1714
+ ]
1715
+ },
1716
+ {
1717
+ "ruleId": "heading-order",
1718
+ "wcagCriteria": "1.3.1",
1719
+ "wcagLevel": "A",
1720
+ "wcagTitle": "Info and Relationships",
1721
+ "wcagVersion": "2.0",
1722
+ "en301549Criteria": "9.1.3.1",
1723
+ "en301549Title": "Info and relationships",
1724
+ "en301549Chapter": 9,
1725
+ "dosLagenApplies": true,
1726
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1727
+ "remediation": {
1728
+ "description": "Los encabezados deben seguir un orden lógico (h1 -> h2 -> h3).",
1729
+ "technicalGuidance": "No salte niveles de encabezado (ej: directamente de h1 a h3).",
1730
+ "wcagTechnique": [
1731
+ "G141"
1732
+ ]
1733
+ },
1734
+ "holmdigitalInsight": {
1735
+ "diggRisk": "medium",
1736
+ "eaaImpact": "medium",
1737
+ "spanishInterpretation": "Una estructura de encabezados incorrecta dificulta la navegación de los lectores de pantalla. Nunca salte niveles.",
1738
+ "commonMistakes": [
1739
+ "Usar h3 para estilo en lugar de estructura"
1740
+ ]
1741
+ },
1742
+ "testability": {
1743
+ "automated": true,
1744
+ "requiresManualCheck": false,
1745
+ "pseudoAutomation": true,
1746
+ "complexity": "simple"
1747
+ },
1748
+ "tags": [
1749
+ "wcag2a",
1750
+ "wcag131",
1751
+ "heading"
1752
+ ]
1753
+ },
1754
+ {
1755
+ "ruleId": "landmark-banner-is-top-level",
1756
+ "wcagCriteria": "1.3.1",
1757
+ "wcagLevel": "A",
1758
+ "wcagTitle": "Info and Relationships",
1759
+ "wcagVersion": "2.0",
1760
+ "en301549Criteria": "9.1.3.1",
1761
+ "en301549Title": "Info and relationships",
1762
+ "en301549Chapter": 9,
1763
+ "dosLagenApplies": true,
1764
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1765
+ "remediation": {
1766
+ "description": "El banner (<header>) debe estar en el nivel superior.",
1767
+ "technicalGuidance": "No coloque <header> dentro de otro landmark si es el banner principal de la página.",
1768
+ "wcagTechnique": [
1769
+ "ARIA11"
1770
+ ]
1771
+ },
1772
+ "holmdigitalInsight": {
1773
+ "diggRisk": "medium",
1774
+ "eaaImpact": "medium",
1775
+ "spanishInterpretation": "El menú principal/banner de la página debe estar ubicado correctamente en la estructurapara ser encontrado rápidamente.",
1776
+ "commonMistakes": [
1777
+ "Anidar el header dentro de main"
1778
+ ]
1779
+ },
1780
+ "testability": {
1781
+ "automated": true,
1782
+ "requiresManualCheck": false,
1783
+ "pseudoAutomation": true,
1784
+ "complexity": "simple"
1785
+ },
1786
+ "tags": [
1787
+ "wcag2a",
1788
+ "wcag131",
1789
+ "landmark"
1790
+ ]
1791
+ },
1792
+ {
1793
+ "ruleId": "landmark-no-duplicate-banner",
1794
+ "wcagCriteria": "1.3.1",
1795
+ "wcagLevel": "A",
1796
+ "wcagTitle": "Info and Relationships",
1797
+ "wcagVersion": "2.0",
1798
+ "en301549Criteria": "9.1.3.1",
1799
+ "en301549Title": "Info and relationships",
1800
+ "en301549Chapter": 9,
1801
+ "dosLagenApplies": true,
1802
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1803
+ "remediation": {
1804
+ "description": "La página debe tener solo un landmark 'banner' (generalmente <header>).",
1805
+ "technicalGuidance": "Solo un <header> fuera de artículos/secciones. Asegúrese de tener un solo <header> en el nivel superior.",
1806
+ "wcagTechnique": [
1807
+ "ARIA11"
1808
+ ]
1809
+ },
1810
+ "holmdigitalInsight": {
1811
+ "diggRisk": "medium",
1812
+ "eaaImpact": "medium",
1813
+ "spanishInterpretation": "Múltiples banners confunden la navegación. Debe quedar claro cuál es el principal.",
1814
+ "commonMistakes": [
1815
+ "Tener header tanto arriba como abajo"
1816
+ ]
1817
+ },
1818
+ "testability": {
1819
+ "automated": true,
1820
+ "requiresManualCheck": false,
1821
+ "pseudoAutomation": true,
1822
+ "complexity": "simple"
1823
+ },
1824
+ "tags": [
1825
+ "wcag2a",
1826
+ "wcag131",
1827
+ "landmark"
1828
+ ]
1829
+ },
1830
+ {
1831
+ "ruleId": "landmark-unique",
1832
+ "wcagCriteria": "1.3.1",
1833
+ "wcagLevel": "A",
1834
+ "wcagTitle": "Info and Relationships",
1835
+ "wcagVersion": "2.0",
1836
+ "en301549Criteria": "9.1.3.1",
1837
+ "en301549Title": "Info and relationships",
1838
+ "en301549Chapter": 9,
1839
+ "dosLagenApplies": true,
1840
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1841
+ "remediation": {
1842
+ "description": "Los landmarks deben tener roles o etiquetas únicos.",
1843
+ "technicalGuidance": "Si tiene múltiples elementos <nav>, déles un 'aria-label' único (ej: 'Menú principal', 'Menú pie de página').",
1844
+ "wcagTechnique": [
1845
+ "ARIA11"
1846
+ ]
1847
+ },
1848
+ "holmdigitalInsight": {
1849
+ "diggRisk": "medium",
1850
+ "eaaImpact": "medium",
1851
+ "spanishInterpretation": "Si hay dos menús, el usuario debe saber cuál es cuál.",
1852
+ "commonMistakes": [
1853
+ "Múltiples elementos nav sin aria-label"
1854
+ ]
1855
+ },
1856
+ "testability": {
1857
+ "automated": true,
1858
+ "requiresManualCheck": false,
1859
+ "pseudoAutomation": true,
1860
+ "complexity": "simple"
1861
+ },
1862
+ "tags": [
1863
+ "wcag2a",
1864
+ "wcag131",
1865
+ "landmark"
1866
+ ]
1867
+ },
1868
+ {
1869
+ "ruleId": "region",
1870
+ "wcagCriteria": "1.3.1",
1871
+ "wcagLevel": "A",
1872
+ "wcagTitle": "Info and Relationships",
1873
+ "wcagVersion": "2.0",
1874
+ "en301549Criteria": "9.1.3.1",
1875
+ "en301549Title": "Info and relationships",
1876
+ "en301549Chapter": 9,
1877
+ "dosLagenApplies": true,
1878
+ "dosLagenReference": "UNE 139803:2012, Nivel A requerido",
1879
+ "remediation": {
1880
+ "description": "Todo el contenido de la página debe estar contenido dentro de landmarks (regiones).",
1881
+ "technicalGuidance": "Asegúrese de que todo el contenido esté dentro de <main>, <header>, <nav>, <footer> o <aside>.",
1882
+ "component": null,
1883
+ "wcagTechnique": [
1884
+ "ARIA11"
1885
+ ]
1886
+ },
1887
+ "holmdigitalInsight": {
1888
+ "diggRisk": "medium",
1889
+ "eaaImpact": "medium",
1890
+ "spanishInterpretation": "Todo el contenido debe pertenecer a una región. Texto huérfano en el body es difícil de encontrar.",
1891
+ "commonMistakes": [
1892
+ "Contenido directamente en <body> sin contenedor",
1893
+ "Uso de demasiados landmarks"
1894
+ ]
1895
+ },
1896
+ "testability": {
1897
+ "automated": true,
1898
+ "requiresManualCheck": false,
1899
+ "pseudoAutomation": true,
1900
+ "complexity": "simple"
1901
+ },
1902
+ "tags": [
1903
+ "wcag2a",
1904
+ "wcag131"
1905
+ ]
1906
+ },
1907
+ {
1908
+ "ruleId": "audio-description",
1909
+ "wcagCriteria": "1.2.5",
1910
+ "wcagLevel": "AA",
1911
+ "wcagTitle": "Audio Description (Prerecorded)",
1912
+ "wcagVersion": "2.0",
1913
+ "en301549Criteria": "9.1.2.5",
1914
+ "en301549Title": "Audio description (prerecorded)",
1915
+ "en301549Chapter": 9,
1916
+ "dosLagenApplies": true,
1917
+ "dosLagenReference": "UNE 139803:2012, Nivel AA requerido",
1918
+ "remediation": {
1919
+ "description": "Se proporciona audiodescripción para todo el contenido de video pregrabado.",
1920
+ "technicalGuidance": "Proporcione una pista de audio alternativa o una versión que describa lo que sucede visualmente.",
1921
+ "component": null,
1922
+ "wcagTechnique": [
1923
+ "G78"
1924
+ ]
1925
+ },
1926
+ "holmdigitalInsight": {
1927
+ "diggRisk": "medium",
1928
+ "eaaImpact": "low",
1929
+ "spanishInterpretation": "El video que transmite información visualmente debe ser descrito para aquellos que no pueden ver la pantalla.",
1930
+ "commonMistakes": [
1931
+ "Video sin audiodescripción a pesar de tener información visual importante"
1932
+ ]
1933
+ },
1934
+ "testability": {
1935
+ "automated": false,
1936
+ "requiresManualCheck": true,
1937
+ "pseudoAutomation": false,
1938
+ "complexity": "hard"
1939
+ },
1940
+ "tags": [
1941
+ "wcag2aa",
1942
+ "wcag125"
1943
+ ]
1944
+ }
1945
+ ]