@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": "RGAA 4.1, Niveau AA requis",
13
+ "remediation": {
14
+ "description": "Le texte et les images de texte doivent avoir un rapport de contraste d'au moins 4,5:1 (3:1 pour le texte large).",
15
+ "technicalGuidance": "Utilisez des outils comme WebAIM Contrast Checker pour vérifier. Ajustez les couleurs ou ajoutez un fond.",
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
+ "frenchInterpretation": "L'une des raisons les plus fréquentes d'amendes. Particulièrement important pour le secteur public.",
28
+ "commonMistakes": [
29
+ "Texte gris sur fond blanc (#777 sur #FFF)",
30
+ "Liens bleu clair sans soulignement",
31
+ "Placeholder trop clair"
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": "RGAA 4.1, Niveau A requis",
61
+ "remediation": {
62
+ "description": "Toutes les fonctionnalités doivent être accessibles via le clavier.",
63
+ "technicalGuidance": "Utilisez du HTML sémantique (button, a, input) au lieu de div/span. Assurez-vous que tabindex est correct.",
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
+ "frenchInterpretation": "L'accès au clavier est fondamental. Priorité absolue lors des audits.",
75
+ "commonMistakes": [
76
+ "Utilisation de div/span pour les éléments cliquables",
77
+ "Menus déroulants personnalisés sans support clavier",
78
+ "Les modales qui ne piègent pas le focus correctement"
79
+ ],
80
+ "diggPrecedent": "Auditors have issued fines for sites where core functions (e.g. forms, navigation) are not keyboard accessible.",
81
+ "priorityRationale": "Critical for users with motor disabilities and screen reader users."
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": "RGAA 4.1, Niveau A requis",
107
+ "remediation": {
108
+ "description": "Toutes les images doivent avoir un texte alternatif descriptif.",
109
+ "technicalGuidance": "Ajoutez alt à toutes les balises img. Pour les images décoratives, utilisez alt=\"\".",
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
+ "frenchInterpretation": "Particulièrement important pour les logos et graphiques informatifs.",
121
+ "commonMistakes": [
122
+ "Texte alt manquant",
123
+ "Alt disant 'image' ou 'inconne'",
124
+ "Nom de fichier comme alt (ex: 'IMG_1234.jpg')",
125
+ "Images décoratives avec description inutile"
126
+ ],
127
+ "diggPrecedent": "Audits frequently cite missing alt text, especially for vital infographics.",
128
+ "priorityRationale": "Critical for screen reader users to access visual information."
129
+ },
130
+ "testability": {
131
+ "automated": true,
132
+ "requiresManualCheck": true,
133
+ "pseudoAutomation": false,
134
+ "complexity": "simple"
135
+ },
136
+ "tags": [
137
+ "images",
138
+ "alt-text",
139
+ "wcag2a",
140
+ "wcag21a"
141
+ ]
142
+ },
143
+ {
144
+ "ruleId": "form-labels",
145
+ "wcagCriteria": "3.3.2",
146
+ "wcagLevel": "A",
147
+ "wcagTitle": "Labels or Instructions",
148
+ "wcagVersion": "2.0",
149
+ "en301549Criteria": "9.3.3.2",
150
+ "en301549Title": "Labels or instructions",
151
+ "en301549Chapter": 9,
152
+ "dosLagenApplies": true,
153
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
154
+ "remediation": {
155
+ "description": "Les champs de formulaire doivent avoir des étiquettes ou des instructions claires.",
156
+ "technicalGuidance": "Utilisez des éléments label liés à l'input via for/id. Pour les formulaires complexes, utilisez fieldset et legend. Utilisez aria-describedby pour les instructions supplémentaires.",
157
+ "component": "@holmdigital/components/FormField",
158
+ "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/>",
159
+ "wcagTechnique": [
160
+ "G131",
161
+ "G162",
162
+ "H44",
163
+ "H71"
164
+ ]
165
+ },
166
+ "holmdigitalInsight": {
167
+ "diggRisk": "high",
168
+ "eaaImpact": "high",
169
+ "frenchInterpretation": "Les formulaires sont critiques pour les services en ligne. La conformité est strictement appliquée dans le secteur public.",
170
+ "commonMistakes": [
171
+ "Seulement un placeholder sans label",
172
+ "Label et input non liés via for/id",
173
+ "Messages d'erreur sans aria-describedby"
174
+ ],
175
+ "diggPrecedent": "Audit decisions often criticize poor form accessibility, especially for application and contact forms.",
176
+ "priorityRationale": "Critical for users to successfully use e-services and submit information."
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": "RGAA 4.1, Niveau A requis",
202
+ "remediation": {
203
+ "description": "Chaque page web doit avoir un titre descriptif.",
204
+ "technicalGuidance": "Utilisez l'élément title dans head. Le titre doit être unique pour chaque page et décrire son but. Format : 'Nom de la page - Nom du site'.",
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
+ "frenchInterpretation": "Important pour la navigation, surtout dans les SPA où le titre doit se mettre à jour dynamiquement.",
215
+ "commonMistakes": [
216
+ "Même titre sur toutes les pages",
217
+ "Le titre ne se met pas à jour dans les SPA",
218
+ "Titre manquant"
219
+ ],
220
+ "diggPrecedent": "Audits have noted missing page titles, especially in Single Page Applications.",
221
+ "priorityRationale": "Important for screen reader navigation and SEO."
222
+ },
223
+ "testability": {
224
+ "automated": true,
225
+ "requiresManualCheck": false,
226
+ "pseudoAutomation": false,
227
+ "complexity": "simple"
228
+ },
229
+ "tags": [
230
+ "navigation",
231
+ "title",
232
+ "wcag2a",
233
+ "wcag21a"
234
+ ]
235
+ },
236
+ {
237
+ "ruleId": "info-and-relationships",
238
+ "wcagCriteria": "1.3.1",
239
+ "wcagLevel": "A",
240
+ "wcagTitle": "Info and Relationships",
241
+ "wcagVersion": "2.0",
242
+ "en301549Criteria": "9.1.3.1",
243
+ "en301549Title": "Info and relationships",
244
+ "en301549Chapter": 9,
245
+ "dosLagenApplies": true,
246
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
247
+ "remediation": {
248
+ "description": "L'information, la structure et les relations transmises par la présentation peuvent être déterminées par programme ou sont disponibles sous forme de texte.",
249
+ "technicalGuidance": "Utilisez du HTML sémantique : <header>, <nav>, <main>, <footer>, <h1>-<h6>, <ul>/ <ol>, <table>. N'utilisez pas de styles visuels pour créer de 'faux' titres ou listes.",
250
+ "component": null,
251
+ "wcagTechnique": [
252
+ "H42",
253
+ "H48",
254
+ "G115"
255
+ ]
256
+ },
257
+ "holmdigitalInsight": {
258
+ "diggRisk": "high",
259
+ "eaaImpact": "high",
260
+ "frenchInterpretation": "La structure sémantique est cruciale pour les lecteurs d'écran. Les auditeurs citent souvent la 'soupe de div' qui manque de sémantique.",
261
+ "commonMistakes": [
262
+ "Utilisation de texte gras au lieu de <h1>-<h6>",
263
+ "Utilisation de <br> pour les listes au lieu de <ul>",
264
+ "Tableaux pour la mise en page"
265
+ ],
266
+ "priorityRationale": "Fundamental for all assistive technology navigation."
267
+ },
268
+ "testability": {
269
+ "automated": true,
270
+ "requiresManualCheck": true,
271
+ "pseudoAutomation": false,
272
+ "complexity": "moderate"
273
+ },
274
+ "tags": [
275
+ "structure",
276
+ "semantic",
277
+ "headings",
278
+ "wcag2a"
279
+ ]
280
+ },
281
+ {
282
+ "ruleId": "use-of-color",
283
+ "wcagCriteria": "1.4.1",
284
+ "wcagLevel": "A",
285
+ "wcagTitle": "Use of Color",
286
+ "wcagVersion": "2.0",
287
+ "en301549Criteria": "9.1.4.1",
288
+ "en301549Title": "Use of color",
289
+ "en301549Chapter": 9,
290
+ "dosLagenApplies": true,
291
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
292
+ "remediation": {
293
+ "description": "La couleur ne doit pas être le seul moyen visuel de transmettre l'information.",
294
+ "technicalGuidance": "Complétez la couleur par du texte, des icônes ou un soulignement. Par ex., les liens doivent avoir un soulignement. Les messages d'erreur nécessitent du texte ou une icône.",
295
+ "component": "@holmdigital/components/FormField",
296
+ "wcagTechnique": [
297
+ "G14",
298
+ "G182",
299
+ "G183"
300
+ ]
301
+ },
302
+ "holmdigitalInsight": {
303
+ "diggRisk": "medium",
304
+ "eaaImpact": "medium",
305
+ "frenchInterpretation": "Problème courant dans les graphiques et les cartes où seul le codage couleur est utilisé.",
306
+ "commonMistakes": [
307
+ "Liens qui ne diffèrent du texte que par la couleur",
308
+ "Messages d'erreur marqués uniquement par la couleur rouge",
309
+ "Graphiques où seule la couleur distingue les données"
310
+ ],
311
+ "priorityRationale": "Crucial for color blind users."
312
+ },
313
+ "testability": {
314
+ "automated": false,
315
+ "requiresManualCheck": true,
316
+ "pseudoAutomation": false,
317
+ "complexity": "moderate"
318
+ },
319
+ "tags": [
320
+ "visual",
321
+ "color",
322
+ "design",
323
+ "wcag2a"
324
+ ]
325
+ },
326
+ {
327
+ "ruleId": "reflow",
328
+ "wcagCriteria": "1.4.10",
329
+ "wcagLevel": "AA",
330
+ "wcagTitle": "Reflow",
331
+ "wcagVersion": "2.1",
332
+ "en301549Criteria": "9.1.4.10",
333
+ "en301549Title": "Reflow",
334
+ "en301549Chapter": 9,
335
+ "dosLagenApplies": true,
336
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
337
+ "remediation": {
338
+ "description": "Le contenu doit être présentable sans nécessiter de défilement dans deux dimensions jusqu'à 320px de largeur.",
339
+ "technicalGuidance": "Utilisez un design responsive (CSS Media Queries, Flexbox, Grid). Évitez les largeurs fixes. Assurez-vous que les images s'adaptent.",
340
+ "component": null,
341
+ "wcagTechnique": [
342
+ "C32",
343
+ "C31"
344
+ ]
345
+ },
346
+ "holmdigitalInsight": {
347
+ "diggRisk": "high",
348
+ "eaaImpact": "high",
349
+ "frenchInterpretation": "Critique pour l'utilisation mobile. Tolérance zéro pour le défilement horizontal sur les sites verticaux.",
350
+ "commonMistakes": [
351
+ "Largeurs fixes sur les conteneurs",
352
+ "Tableaux non responsifs",
353
+ "Images plus larges que l'écran"
354
+ ],
355
+ "priorityRationale": "Critical for low vision users who zoom in heavily."
356
+ },
357
+ "testability": {
358
+ "automated": false,
359
+ "requiresManualCheck": true,
360
+ "pseudoAutomation": true,
361
+ "complexity": "moderate"
362
+ },
363
+ "tags": [
364
+ "design",
365
+ "responsive",
366
+ "mobile",
367
+ "wcag21aa"
368
+ ]
369
+ },
370
+ {
371
+ "ruleId": "non-text-contrast",
372
+ "wcagCriteria": "1.4.11",
373
+ "wcagLevel": "AA",
374
+ "wcagTitle": "Non-text Contrast",
375
+ "wcagVersion": "2.1",
376
+ "en301549Criteria": "9.1.4.11",
377
+ "en301549Title": "Non-text contrast",
378
+ "en301549Chapter": 9,
379
+ "dosLagenApplies": true,
380
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
381
+ "remediation": {
382
+ "description": "La présentation visuelle des composants d'interface et objets graphiques doit avoir un contraste d'au moins 3:1.",
383
+ "technicalGuidance": "S'applique aux boutons, bordures de champs, icônes et indicateurs de focus.",
384
+ "component": "@holmdigital/components/Button",
385
+ "wcagTechnique": [
386
+ "G195",
387
+ "G207"
388
+ ]
389
+ },
390
+ "holmdigitalInsight": {
391
+ "diggRisk": "low",
392
+ "eaaImpact": "low",
393
+ "frenchInterpretation": "Souvent oublié pour les anneaux de focus et les composants inactifs. Important pour comprendre l'interface.",
394
+ "commonMistakes": [
395
+ "Boutons grisés avec un contraste trop faible"
396
+ ],
397
+ "priorityRationale": "Important for distinguishing interactive elements."
398
+ },
399
+ "testability": {
400
+ "automated": false,
401
+ "requiresManualCheck": true,
402
+ "pseudoAutomation": false,
403
+ "complexity": "complex"
404
+ },
405
+ "tags": [
406
+ "visual",
407
+ "contrast",
408
+ "graphics",
409
+ "wcag21aa"
410
+ ]
411
+ },
412
+ {
413
+ "ruleId": "text-spacing",
414
+ "wcagCriteria": "1.4.12",
415
+ "wcagLevel": "AA",
416
+ "wcagTitle": "Text Spacing",
417
+ "wcagVersion": "2.1",
418
+ "en301549Criteria": "9.1.4.12",
419
+ "en301549Title": "Text spacing",
420
+ "en301549Chapter": 9,
421
+ "dosLagenApplies": true,
422
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
423
+ "remediation": {
424
+ "description": "Le contenu ou la fonctionnalité ne doit pas être perdu lorsque l'utilisateur modifie l'espacement du texte.",
425
+ "technicalGuidance": "Évitez les hauteurs fixes sur les conteneurs de texte. Laissez les conteneurs grandir avec le contenu.",
426
+ "component": null,
427
+ "wcagTechnique": [
428
+ "C36"
429
+ ]
430
+ },
431
+ "holmdigitalInsight": {
432
+ "diggRisk": "low",
433
+ "eaaImpact": "medium",
434
+ "frenchInterpretation": "Important pour les adaptations liées à la dyslexie.",
435
+ "commonMistakes": [
436
+ "Hauteur de ligne fixe en pixels",
437
+ "Conteneur de texte qui ne s'agrandit pas"
438
+ ],
439
+ "priorityRationale": "Important for readability during adaptations."
440
+ },
441
+ "testability": {
442
+ "automated": false,
443
+ "requiresManualCheck": true,
444
+ "pseudoAutomation": true,
445
+ "complexity": "moderate"
446
+ },
447
+ "tags": [
448
+ "visual",
449
+ "typography",
450
+ "wcag21aa"
451
+ ]
452
+ },
453
+ {
454
+ "ruleId": "content-on-hover",
455
+ "wcagCriteria": "1.4.13",
456
+ "wcagLevel": "AA",
457
+ "wcagTitle": "Content on Hover or Focus",
458
+ "wcagVersion": "2.1",
459
+ "en301549Criteria": "9.1.4.13",
460
+ "en301549Title": "Content on hover or focus",
461
+ "en301549Chapter": 9,
462
+ "dosLagenApplies": true,
463
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
464
+ "remediation": {
465
+ "description": "Le contenu affiché au survol/focus (ex: infobulles) doit pouvoir être masqué, survolé et persistant.",
466
+ "technicalGuidance": "Assurez-vous que l'infobulle ne disparaît pas lorsque vous déplacez la souris du déclencheur vers l'infobulle elle-même. Permettez à ESC de la fermer.",
467
+ "component": null,
468
+ "wcagTechnique": [
469
+ "SCR39"
470
+ ]
471
+ },
472
+ "holmdigitalInsight": {
473
+ "diggRisk": "medium",
474
+ "eaaImpact": "medium",
475
+ "frenchInterpretation": "Problème courant avec les infobulles personnalisées et les méga-menus.",
476
+ "commonMistakes": [
477
+ "Infobulles inaccessibles à la souris",
478
+ "Menus qui se ferment trop facilement",
479
+ "Contenu impossible à fermer sans déplacer le focus"
480
+ ],
481
+ "priorityRationale": "Important for users with magnification and motor difficulties."
482
+ },
483
+ "testability": {
484
+ "automated": false,
485
+ "requiresManualCheck": true,
486
+ "pseudoAutomation": true,
487
+ "complexity": "complex"
488
+ },
489
+ "tags": [
490
+ "interaction",
491
+ "hover",
492
+ "tooltips",
493
+ "wcag21aa"
494
+ ]
495
+ },
496
+ {
497
+ "ruleId": "captions-prerecorded",
498
+ "wcagCriteria": "1.2.2",
499
+ "wcagLevel": "A",
500
+ "wcagTitle": "Captions (Prerecorded)",
501
+ "wcagVersion": "2.0",
502
+ "en301549Criteria": "9.1.2.2",
503
+ "en301549Title": "Captions (prerecorded)",
504
+ "en301549Chapter": 9,
505
+ "dosLagenApplies": true,
506
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
507
+ "remediation": {
508
+ "description": "Des sous-titres doivent être fournis pour tout contenu audio préenregistré dans les médias synchronisés.",
509
+ "technicalGuidance": "Utilisez l'élément <track> avec des fichiers WebVTT pour la vidéo HTML5. Pour les réseaux sociaux, assurez-vous que les sous-titres sont activés.",
510
+ "component": null,
511
+ "wcagTechnique": [
512
+ "G87",
513
+ "G93"
514
+ ]
515
+ },
516
+ "holmdigitalInsight": {
517
+ "diggRisk": "high",
518
+ "eaaImpact": "high",
519
+ "frenchInterpretation": "L'une des lacunes les plus courantes. L'exigence légale est stricte : la vidéo avec audio DOIT avoir des sous-titres.",
520
+ "commonMistakes": [
521
+ "Sous-titres générés automatiquement de mauvaise qualité",
522
+ "Sous-titres manquants",
523
+ "Sous-titres incrustés (non accessibles pour la recherche/traduction)"
524
+ ],
525
+ "priorityRationale": "Critical for deaf and hard of hearing users."
526
+ },
527
+ "testability": {
528
+ "automated": false,
529
+ "requiresManualCheck": true,
530
+ "pseudoAutomation": false,
531
+ "complexity": "simple"
532
+ },
533
+ "tags": [
534
+ "media",
535
+ "video",
536
+ "captions",
537
+ "wcag2a"
538
+ ]
539
+ },
540
+ {
541
+ "ruleId": "audio-description",
542
+ "wcagCriteria": "1.2.5",
543
+ "wcagLevel": "AA",
544
+ "wcagTitle": "Audio Description (Prerecorded)",
545
+ "wcagVersion": "2.0",
546
+ "en301549Criteria": "9.1.2.5",
547
+ "en301549Title": "Audio description (prerecorded)",
548
+ "en301549Chapter": 9,
549
+ "dosLagenApplies": true,
550
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
551
+ "remediation": {
552
+ "description": "Une audiodescription doit être fournie pour tout contenu vidéo préenregistré.",
553
+ "technicalGuidance": "Soit comme une piste audio séparée, une version alternative de la vidéo, ou (si 'têtes parlantes') en s'assurant que toutes les infos sont transmises par l'audio.",
554
+ "wcagTechnique": [
555
+ "G78",
556
+ "G69"
557
+ ]
558
+ },
559
+ "holmdigitalInsight": {
560
+ "diggRisk": "medium",
561
+ "eaaImpact": "medium",
562
+ "frenchInterpretation": "Peut souvent être résolu par une 'description intégrée' (parler de ce qui est vu), ce qui est plus économique.",
563
+ "commonMistakes": [
564
+ "Information montrée uniquement visuellement sans être mentionnée dans l'audio"
565
+ ],
566
+ "priorityRationale": "Critical for blind video users."
567
+ },
568
+ "testability": {
569
+ "automated": false,
570
+ "requiresManualCheck": true,
571
+ "pseudoAutomation": false,
572
+ "complexity": "moderate"
573
+ },
574
+ "tags": [
575
+ "media",
576
+ "video",
577
+ "audio-description",
578
+ "wcag2aa"
579
+ ]
580
+ },
581
+ {
582
+ "ruleId": "orientation",
583
+ "wcagCriteria": "1.3.4",
584
+ "wcagLevel": "AA",
585
+ "wcagTitle": "Orientation",
586
+ "wcagVersion": "2.1",
587
+ "en301549Criteria": "9.1.3.4",
588
+ "en301549Title": "Orientation",
589
+ "en301549Chapter": 9,
590
+ "dosLagenApplies": true,
591
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
592
+ "remediation": {
593
+ "description": "Pour le contenu implémenté à l'aide de langages de balisage, les éléments ont des balises de début et de fin complètes, sont imbriqués conformément à leurs spécifications, n'ont pas d'attributs dupliqués et ont des ID uniques.",
594
+ "technicalGuidance": "Ne verrouillez pas l'écran en portrait ou paysage via CSS ou le manifeste JS. Utilisez des media queries pour gérer la mise en page.",
595
+ "component": null,
596
+ "wcagTechnique": [
597
+ "F97"
598
+ ]
599
+ },
600
+ "holmdigitalInsight": {
601
+ "diggRisk": "low",
602
+ "eaaImpact": "medium",
603
+ "frenchInterpretation": "Important pour les tablettes et les utilisateurs ayant l'appareil monté sur un support (ex: fauteuil roulant).",
604
+ "commonMistakes": [
605
+ "Applications/sites qui pivotent l'interface de 90 degrés contre la volonté de l'utilisateur"
606
+ ],
607
+ "priorityRationale": "Important for users who cannot rotate their device."
608
+ },
609
+ "testability": {
610
+ "automated": false,
611
+ "requiresManualCheck": true,
612
+ "pseudoAutomation": true,
613
+ "complexity": "simple"
614
+ },
615
+ "tags": [
616
+ "mobile",
617
+ "responsive",
618
+ "orientation",
619
+ "wcag21aa"
620
+ ]
621
+ },
622
+ {
623
+ "ruleId": "identify-input-purpose",
624
+ "wcagCriteria": "1.3.5",
625
+ "wcagLevel": "AA",
626
+ "wcagTitle": "Identify Input Purpose",
627
+ "wcagVersion": "2.1",
628
+ "en301549Criteria": "9.1.3.5",
629
+ "en301549Title": "Identify input purpose",
630
+ "en301549Chapter": 9,
631
+ "dosLagenApplies": true,
632
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
633
+ "remediation": {
634
+ "description": "Le but de chaque champ de saisie collectant des informations sur l'utilisateur doit pouvoir être déterminé par programme.",
635
+ "technicalGuidance": "Utilisez l'attribut 'autocomplete' sur les champs de saisie pour les données personnelles (nom, email, tel, adresse, etc.).",
636
+ "component": "@holmdigital/components/FormField",
637
+ "wcagTechnique": [
638
+ "H98"
639
+ ]
640
+ },
641
+ "holmdigitalInsight": {
642
+ "diggRisk": "medium",
643
+ "eaaImpact": "high",
644
+ "frenchInterpretation": "Rend le remplissage des formulaires beaucoup plus facile (remplissage automatique).",
645
+ "commonMistakes": [
646
+ "Attribut autocomplete manquant",
647
+ "Valeur autocomplete incorrecte",
648
+ "Désactivation d'autocomplete inutilement"
649
+ ],
650
+ "priorityRationale": "Reduces cognitive load and motor requirements."
651
+ },
652
+ "testability": {
653
+ "automated": true,
654
+ "requiresManualCheck": false,
655
+ "pseudoAutomation": false,
656
+ "complexity": "simple"
657
+ },
658
+ "tags": [
659
+ "forms",
660
+ "autocomplete",
661
+ "wcag21aa"
662
+ ]
663
+ },
664
+ {
665
+ "ruleId": "no-keyboard-trap",
666
+ "wcagCriteria": "2.1.2",
667
+ "wcagLevel": "A",
668
+ "wcagTitle": "No Keyboard Trap",
669
+ "wcagVersion": "2.0",
670
+ "en301549Criteria": "9.2.1.2",
671
+ "en301549Title": "No keyboard trap",
672
+ "en301549Chapter": 9,
673
+ "dosLagenApplies": true,
674
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
675
+ "remediation": {
676
+ "description": "Si le focus peut être déplacé vers un composant de la page à l'aide d'une interface clavier, alors il doit pouvoir en être retiré à l'aide de l'interface clavier seule.",
677
+ "technicalGuidance": "Attention aux widgets JS qui piègent le focus (ex: fenêtres modales). Assurez-vous qu'il y a toujours une sortie (ex: ESC ou shift+tab).",
678
+ "component": null,
679
+ "wcagTechnique": [
680
+ "G21"
681
+ ]
682
+ },
683
+ "holmdigitalInsight": {
684
+ "diggRisk": "critical",
685
+ "eaaImpact": "critical",
686
+ "frenchInterpretation": "Un piège au clavier est un 'bloqueur' qui rend le site inutilisable. Erreur grave.",
687
+ "commonMistakes": [
688
+ "Widgets personnalisés qui bouclent le focus infiniment",
689
+ "Composants tiers intégrés (cartes, chats) sans sortie"
690
+ ],
691
+ "priorityRationale": "Critical: The user gets stuck and must restart the browser."
692
+ },
693
+ "testability": {
694
+ "automated": false,
695
+ "requiresManualCheck": true,
696
+ "pseudoAutomation": true,
697
+ "complexity": "moderate"
698
+ },
699
+ "tags": [
700
+ "keyboard",
701
+ "interaction",
702
+ "wcag2a"
703
+ ]
704
+ },
705
+ {
706
+ "ruleId": "character-key-shortcuts",
707
+ "wcagCriteria": "2.1.4",
708
+ "wcagLevel": "A",
709
+ "wcagTitle": "Character Key Shortcuts",
710
+ "wcagVersion": "2.1",
711
+ "en301549Criteria": "9.2.1.4",
712
+ "en301549Title": "Character key shortcuts",
713
+ "en301549Chapter": 9,
714
+ "dosLagenApplies": true,
715
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
716
+ "remediation": {
717
+ "description": "Si un raccourci clavier est constitué d'un seul caractère (lettre, chiffre, symbole), il doit y avoir un moyen de le désactiver ou de le remapper, ou il ne doit être actif qu'au focus.",
718
+ "technicalGuidance": "Évitez les raccourcis à une touche si possible. Si nécessaire, assurez-vous qu'ils n'entrent pas en conflit avec la commande vocale ou une frappe accidentelle.",
719
+ "component": null,
720
+ "wcagTechnique": [
721
+ "G217"
722
+ ]
723
+ },
724
+ "holmdigitalInsight": {
725
+ "diggRisk": "medium",
726
+ "eaaImpact": "medium",
727
+ "frenchInterpretation": "Important pour les utilisateurs de commande vocale (Dragon etc.) où des mots simples peuvent déclencher des commandes accidentellement.",
728
+ "commonMistakes": [
729
+ "Raccourcis type Gmail activés par défaut sans option de désactivation"
730
+ ],
731
+ "priorityRationale": "Important to avoid accidental activation."
732
+ },
733
+ "testability": {
734
+ "automated": false,
735
+ "requiresManualCheck": true,
736
+ "pseudoAutomation": false,
737
+ "complexity": "moderate"
738
+ },
739
+ "tags": [
740
+ "keyboard",
741
+ "shortcuts",
742
+ "wcag21a"
743
+ ]
744
+ },
745
+ {
746
+ "ruleId": "timing-adjustable",
747
+ "wcagCriteria": "2.2.1",
748
+ "wcagLevel": "A",
749
+ "wcagTitle": "Timing Adjustable",
750
+ "wcagVersion": "2.0",
751
+ "en301549Criteria": "9.2.2.1",
752
+ "en301549Title": "Timing adjustable",
753
+ "en301549Chapter": 9,
754
+ "dosLagenApplies": true,
755
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
756
+ "remediation": {
757
+ "description": "Si une limite de temps (session, temps de lecture) est fixée, l'utilisateur doit pouvoir la désactiver, l'ajuster ou la prolonger.",
758
+ "technicalGuidance": "Fournissez un avertissement avant l'expiration de la session avec un bouton 'Prolonger la session'. La limite de temps doit être d'au moins 20 seconds.",
759
+ "component": null,
760
+ "wcagTechnique": [
761
+ "SCR16",
762
+ "G180"
763
+ ]
764
+ },
765
+ "holmdigitalInsight": {
766
+ "diggRisk": "high",
767
+ "eaaImpact": "high",
768
+ "frenchInterpretation": "Critique pour les services en ligne/banques. Les utilisateurs qui lisent lentement ou utilisent des technologies d'assistance ont besoin de plus de temps.",
769
+ "commonMistakes": [
770
+ "Déconnexion sans avertissement",
771
+ "Limites de temps impossibles à prolonger"
772
+ ],
773
+ "priorityRationale": "Critical to avoid losing entered data."
774
+ },
775
+ "testability": {
776
+ "automated": false,
777
+ "requiresManualCheck": true,
778
+ "pseudoAutomation": true,
779
+ "complexity": "moderate"
780
+ },
781
+ "tags": [
782
+ "time",
783
+ "session",
784
+ "wcag2a"
785
+ ]
786
+ },
787
+ {
788
+ "ruleId": "pause-stop-hide",
789
+ "wcagCriteria": "2.2.2",
790
+ "wcagLevel": "A",
791
+ "wcagTitle": "Pause, Stop, Hide",
792
+ "wcagVersion": "2.0",
793
+ "en301549Criteria": "9.2.2.2",
794
+ "en301549Title": "Pause, stop, hide",
795
+ "en301549Chapter": 9,
796
+ "dosLagenApplies": true,
797
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
798
+ "remediation": {
799
+ "description": "Pour les informations en mouvement, clignotantes, défilantes ou mises à jour automatiquement, il existe un mécanisme permettant à l'utilisateur de les mettre en pause, de les arrêter ou de les masquer.",
800
+ "technicalGuidance": "S'applique aux carrousels (sliders), aux fils d'actualité à mise à jour automatique, aux arrière-plans animés. Ajoutez un bouton de pause clair.",
801
+ "component": null,
802
+ "wcagTechnique": [
803
+ "G4",
804
+ "G186"
805
+ ]
806
+ },
807
+ "holmdigitalInsight": {
808
+ "diggRisk": "medium",
809
+ "eaaImpact": "medium",
810
+ "frenchInterpretation": "Important pour les utilisateurs ayant des difficultés de concentration (TDAH/Autisme) qui sont distraits par le mouvement.",
811
+ "commonMistakes": [
812
+ "Carrousels sans bouton pause",
813
+ "Sliders à rotation automatique sans contrôle"
814
+ ],
815
+ "priorityRationale": "Important for cognitive accessibility."
816
+ },
817
+ "testability": {
818
+ "automated": false,
819
+ "requiresManualCheck": true,
820
+ "pseudoAutomation": true,
821
+ "complexity": "moderate"
822
+ },
823
+ "tags": [
824
+ "animation",
825
+ "carousel",
826
+ "distraction",
827
+ "wcag2a"
828
+ ]
829
+ },
830
+ {
831
+ "ruleId": "three-flashes",
832
+ "wcagCriteria": "2.3.1",
833
+ "wcagLevel": "A",
834
+ "wcagTitle": "Three Flashes or Below Threshold",
835
+ "wcagVersion": "2.0",
836
+ "en301549Criteria": "9.2.3.1",
837
+ "en301549Title": "Three flashes or below threshold",
838
+ "en301549Chapter": 9,
839
+ "dosLagenApplies": true,
840
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
841
+ "remediation": {
842
+ "description": "Les pages web ne contiennent rien qui clignote plus de trois fois par seconde.",
843
+ "technicalGuidance": "Évitez les clignotements rapides dans les vidéos et les animations. Utilisez des outils pour mesurer la fréquence de clignotement (PEAT).",
844
+ "component": null,
845
+ "wcagTechnique": [
846
+ "G19"
847
+ ]
848
+ },
849
+ "holmdigitalInsight": {
850
+ "diggRisk": "critical",
851
+ "eaaImpact": "critical",
852
+ "frenchInterpretation": "Exigence stricte de santé. Le contenu provoquant des crises est un échec critique.",
853
+ "commonMistakes": [
854
+ "Jeux vidéo ou intros avec des clignotements rapides",
855
+ "Utilisation abusive de messages d'erreur clignotants"
856
+ ],
857
+ "priorityRationale": "Critical safety risk."
858
+ },
859
+ "testability": {
860
+ "automated": false,
861
+ "requiresManualCheck": true,
862
+ "pseudoAutomation": false,
863
+ "complexity": "complex"
864
+ },
865
+ "tags": [
866
+ "seizure",
867
+ "safety",
868
+ "animation",
869
+ "wcag2a"
870
+ ]
871
+ },
872
+ {
873
+ "ruleId": "bypass-blocks",
874
+ "wcagCriteria": "2.4.1",
875
+ "wcagLevel": "A",
876
+ "wcagTitle": "Bypass Blocks",
877
+ "wcagVersion": "2.0",
878
+ "en301549Criteria": "9.2.4.1",
879
+ "en301549Title": "Bypass blocks",
880
+ "en301549Chapter": 9,
881
+ "dosLagenApplies": true,
882
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
883
+ "remediation": {
884
+ "description": "Un mécanisme est disponible pour contourner les blocs de contenu qui sont répétés sur plusieurs pages Web.",
885
+ "technicalGuidance": "Ajoutez un lien 'Passer au contenu' comme premier élément focusable de la page. Utilisez des landmarks (header, nav, main, aside, footer) pour permettre la navigation par lecteur d'écran.",
886
+ "component": null,
887
+ "wcagTechnique": [
888
+ "G1",
889
+ "H69"
890
+ ]
891
+ },
892
+ "holmdigitalInsight": {
893
+ "diggRisk": "medium",
894
+ "eaaImpact": "medium",
895
+ "frenchInterpretation": "Lien 'Passer au contenu' quasi obligatoire pour le secteur public. Les landmarks sont également clés.",
896
+ "commonMistakes": [
897
+ "Lien 'Passer au contenu' manquant",
898
+ "Lien caché avec display:none (le rendant inatteignable)",
899
+ "Landmarks manquants"
900
+ ],
901
+ "priorityRationale": "Important for efficient navigation."
902
+ },
903
+ "testability": {
904
+ "automated": true,
905
+ "requiresManualCheck": true,
906
+ "pseudoAutomation": true,
907
+ "complexity": "simple"
908
+ },
909
+ "tags": [
910
+ "navigation",
911
+ "skip-link",
912
+ "keyboard",
913
+ "wcag2a"
914
+ ]
915
+ },
916
+ {
917
+ "ruleId": "focus-order",
918
+ "wcagCriteria": "2.4.3",
919
+ "wcagLevel": "A",
920
+ "wcagTitle": "Focus Order",
921
+ "wcagVersion": "2.0",
922
+ "en301549Criteria": "9.2.4.3",
923
+ "en301549Title": "Focus order",
924
+ "en301549Chapter": 9,
925
+ "dosLagenApplies": true,
926
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
927
+ "remediation": {
928
+ "description": "L'ordre de focus doit être logique et suivre le sens/la structure.",
929
+ "technicalGuidance": "L'ordre du DOM détermine l'ordre du focus. Ne manipulez pas tabindex (> 0). Organisez les éléments logiquement dans le HTML. Gérez le focus manuellement dans les modales et les menus.",
930
+ "component": null,
931
+ "wcagTechnique": [
932
+ "G59",
933
+ "C27"
934
+ ]
935
+ },
936
+ "holmdigitalInsight": {
937
+ "diggRisk": "high",
938
+ "eaaImpact": "high",
939
+ "frenchInterpretation": "L'ordre de tabulation logique suit l'ordre de lecture. Ne jouez pas avec tabindex. Critique pour les mises en page complexes (Grid/Flexbox) où l'ordre visuel peut différer de l'ordre du DOM.",
940
+ "commonMistakes": [
941
+ "Le focus saute de manière illogique",
942
+ "Menus dans le désordre",
943
+ "La modale se ferme et le focus revient en haut de la page"
944
+ ],
945
+ "priorityRationale": "Critical for keyboard navigation and understanding."
946
+ },
947
+ "testability": {
948
+ "automated": false,
949
+ "requiresManualCheck": true,
950
+ "pseudoAutomation": true,
951
+ "complexity": "moderate"
952
+ },
953
+ "tags": [
954
+ "focus",
955
+ "keyboard",
956
+ "navigation",
957
+ "wcag2a"
958
+ ]
959
+ },
960
+ {
961
+ "ruleId": "link-purpose",
962
+ "wcagCriteria": "2.4.4",
963
+ "wcagLevel": "A",
964
+ "wcagTitle": "Link Purpose (In Context)",
965
+ "wcagVersion": "2.0",
966
+ "en301549Criteria": "9.2.4.4",
967
+ "en301549Title": "Link purpose (in context)",
968
+ "en301549Chapter": 9,
969
+ "dosLagenApplies": true,
970
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
971
+ "remediation": {
972
+ "description": "Le but de chaque lien peut être déterminé à partir du seul texte du lien ou du texte du lien associé à son contexte déterminé par programme.",
973
+ "technicalGuidance": "Évitez 'Lire la suite' ou 'Cliquez ici'. Rédigez des textes de lien descriptifs. Utilisez aria-label si l'espace visuel est limité mais que plus d'informations sont nécessaires.",
974
+ "component": null,
975
+ "wcagTechnique": [
976
+ "G91",
977
+ "H30"
978
+ ]
979
+ },
980
+ "holmdigitalInsight": {
981
+ "diggRisk": "medium",
982
+ "eaaImpact": "medium",
983
+ "frenchInterpretation": "Les liens doivent être compréhensibles hors contexte (ex: dans une liste de liens). 'Lire la suite' est mauvais. Important pour les utilisateurs naviguant via des listes de liens (lecteurs d'écran).",
984
+ "commonMistakes": [
985
+ "Multiples liens 'Lire la suite' avec différentes cibles",
986
+ "URL nues comme texte de lien"
987
+ ],
988
+ "priorityRationale": "Important for efficient navigation."
989
+ },
990
+ "testability": {
991
+ "automated": true,
992
+ "requiresManualCheck": true,
993
+ "pseudoAutomation": false,
994
+ "complexity": "simple"
995
+ },
996
+ "tags": [
997
+ "links",
998
+ "navigation",
999
+ "copywriting",
1000
+ "wcag2a"
1001
+ ]
1002
+ },
1003
+ {
1004
+ "ruleId": "multiple-ways",
1005
+ "wcagCriteria": "2.4.5",
1006
+ "wcagLevel": "AA",
1007
+ "wcagTitle": "Multiple Ways",
1008
+ "wcagVersion": "2.0",
1009
+ "en301549Criteria": "9.2.4.5",
1010
+ "en301549Title": "Multiple ways",
1011
+ "en301549Chapter": 9,
1012
+ "dosLagenApplies": true,
1013
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1014
+ "remediation": {
1015
+ "description": "Il doit y avoir plus d'une façon de trouver une page Web dans un ensemble de pages Web.",
1016
+ "technicalGuidance": "Au moins deux parmi : Menu, Recherche, Plan du site, Liens dans le contenu.",
1017
+ "component": null,
1018
+ "wcagTechnique": [
1019
+ "G125",
1020
+ "G126"
1021
+ ]
1022
+ },
1023
+ "holmdigitalInsight": {
1024
+ "diggRisk": "low",
1025
+ "eaaImpact": "low",
1026
+ "frenchInterpretation": "Souvent rempli par menu + recherche. Le plan du site est une bonne pratique.",
1027
+ "commonMistakes": [
1028
+ "Absence de recherche sur les sites avec beaucoup de pages"
1029
+ ],
1030
+ "priorityRationale": "Facilitates different navigation strategies."
1031
+ },
1032
+ "testability": {
1033
+ "automated": false,
1034
+ "requiresManualCheck": true,
1035
+ "pseudoAutomation": false,
1036
+ "complexity": "simple"
1037
+ },
1038
+ "tags": [
1039
+ "navigation",
1040
+ "search",
1041
+ "sitemap",
1042
+ "wcag2aa"
1043
+ ]
1044
+ },
1045
+ {
1046
+ "ruleId": "headings-and-labels",
1047
+ "wcagCriteria": "2.4.6",
1048
+ "wcagLevel": "AA",
1049
+ "wcagTitle": "Headings and Labels",
1050
+ "wcagVersion": "2.0",
1051
+ "en301549Criteria": "9.2.4.6",
1052
+ "en301549Title": "Headings and labels",
1053
+ "en301549Chapter": 9,
1054
+ "dosLagenApplies": true,
1055
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1056
+ "remediation": {
1057
+ "description": "Les titres et les étiquettes doivent décrire le sujet ou l'objectif.",
1058
+ "technicalGuidance": "Rédigez des titres clairs et descriptifs qui donnent du sens au contenu qui suit. Les étiquettes de formulaire doivent être compréhensibles.",
1059
+ "component": null,
1060
+ "wcagTechnique": [
1061
+ "G130"
1062
+ ]
1063
+ },
1064
+ "holmdigitalInsight": {
1065
+ "diggRisk": "medium",
1066
+ "eaaImpact": "medium",
1067
+ "frenchInterpretation": "Concerne la qualité éditoriale et la compréhensibilité.",
1068
+ "commonMistakes": [
1069
+ "Titres cryptiques",
1070
+ "Étiquettes qui ne correspondent pas à ce qui doit être rempli"
1071
+ ],
1072
+ "priorityRationale": "Important for cognitive accessibility."
1073
+ },
1074
+ "testability": {
1075
+ "automated": false,
1076
+ "requiresManualCheck": true,
1077
+ "pseudoAutomation": false,
1078
+ "complexity": "simple"
1079
+ },
1080
+ "tags": [
1081
+ "content",
1082
+ "headings",
1083
+ "labels",
1084
+ "wcag2aa"
1085
+ ]
1086
+ },
1087
+ {
1088
+ "ruleId": "focus-visible",
1089
+ "wcagCriteria": "2.4.7",
1090
+ "wcagLevel": "AA",
1091
+ "wcagTitle": "Focus Visible",
1092
+ "wcagVersion": "2.0",
1093
+ "en301549Criteria": "9.2.4.7",
1094
+ "en301549Title": "Focus visible",
1095
+ "en301549Chapter": 9,
1096
+ "dosLagenApplies": true,
1097
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1098
+ "remediation": {
1099
+ "description": "Toute interface utilisateur utilisable au clavier doit avoir un indicateur de focus visible.",
1100
+ "technicalGuidance": "Ne jamais supprimer l'outline avec CSS (outline: none) sans le remplacer par un indicateur visuel clair. Assurez-vous que le contraste de l'anneau de focus est suffisant (voir 1.4.11).",
1101
+ "component": "@holmdigital/components/Button",
1102
+ "wcagTechnique": [
1103
+ "G149",
1104
+ "G165",
1105
+ "C15"
1106
+ ]
1107
+ },
1108
+ "holmdigitalInsight": {
1109
+ "diggRisk": "high",
1110
+ "eaaImpact": "high",
1111
+ "frenchInterpretation": "L'une des erreurs les plus courantes. Souvent parce que les designers n'aiment pas l''anneau bleu'.",
1112
+ "commonMistakes": [
1113
+ "outline: none dans le reset CSS",
1114
+ "Boutons personnalisés sans style :focus"
1115
+ ],
1116
+ "priorityRationale": "Critical: Without visible focus, the keyboard user doesn't know where they are."
1117
+ },
1118
+ "testability": {
1119
+ "automated": true,
1120
+ "requiresManualCheck": true,
1121
+ "pseudoAutomation": true,
1122
+ "complexity": "simple"
1123
+ },
1124
+ "tags": [
1125
+ "focus",
1126
+ "visual",
1127
+ "keyboard",
1128
+ "wcag2aa"
1129
+ ]
1130
+ },
1131
+ {
1132
+ "ruleId": "language-of-page",
1133
+ "wcagCriteria": "3.1.1",
1134
+ "wcagLevel": "A",
1135
+ "wcagTitle": "Language of Page",
1136
+ "wcagVersion": "2.0",
1137
+ "en301549Criteria": "9.3.1.1",
1138
+ "en301549Title": "Language of page",
1139
+ "en301549Chapter": 9,
1140
+ "dosLagenApplies": true,
1141
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
1142
+ "remediation": {
1143
+ "description": "La langue par défaut de chaque page Web doit pouvoir être déterminée par programme.",
1144
+ "technicalGuidance": "Définissez l'attribut 'lang' sur l'élément <html>. Par ex., <html lang='fr'> pour le français.",
1145
+ "component": null,
1146
+ "wcagTechnique": [
1147
+ "H57"
1148
+ ]
1149
+ },
1150
+ "holmdigitalInsight": {
1151
+ "diggRisk": "high",
1152
+ "eaaImpact": "high",
1153
+ "frenchInterpretation": "Fondamental pour la lecture d'écran. Sans cela, le lecteur d'écran devine la langue, conduisant souvent à une mauvaise prononciation.",
1154
+ "commonMistakes": [
1155
+ "Attribut Lang manquant",
1156
+ "Code langue incorrect (ex: 'en' sur une page française)"
1157
+ ],
1158
+ "priorityRationale": "Critical for screen reader users."
1159
+ },
1160
+ "testability": {
1161
+ "automated": true,
1162
+ "requiresManualCheck": false,
1163
+ "pseudoAutomation": false,
1164
+ "complexity": "simple"
1165
+ },
1166
+ "tags": [
1167
+ "content",
1168
+ "language",
1169
+ "wcag2a"
1170
+ ]
1171
+ },
1172
+ {
1173
+ "ruleId": "language-of-parts",
1174
+ "wcagCriteria": "3.1.2",
1175
+ "wcagLevel": "AA",
1176
+ "wcagTitle": "Language of Parts",
1177
+ "wcagVersion": "2.0",
1178
+ "en301549Criteria": "9.3.1.2",
1179
+ "en301549Title": "Language of parts",
1180
+ "en301549Chapter": 9,
1181
+ "dosLagenApplies": true,
1182
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1183
+ "remediation": {
1184
+ "description": "La langue humaine de chaque passage ou phrase du contenu doit être déterminable par programme.",
1185
+ "technicalGuidance": "Utilisez l'attribut lang sur les éléments qui diffèrent de la langue principale de la page. Ex: <span lang='en'>Hello</span>.",
1186
+ "component": null,
1187
+ "wcagTechnique": [
1188
+ "H58"
1189
+ ]
1190
+ },
1191
+ "holmdigitalInsight": {
1192
+ "diggRisk": "low",
1193
+ "eaaImpact": "low",
1194
+ "frenchInterpretation": "Rarement une erreur critique, sauf si cela gêne considérablement la compréhension.",
1195
+ "commonMistakes": [
1196
+ "Citations en langue étrangère dans le texte sans balisage"
1197
+ ],
1198
+ "priorityRationale": "Important for correct pronunciation."
1199
+ },
1200
+ "testability": {
1201
+ "automated": false,
1202
+ "requiresManualCheck": true,
1203
+ "pseudoAutomation": true,
1204
+ "complexity": "moderate"
1205
+ },
1206
+ "tags": [
1207
+ "content",
1208
+ "language",
1209
+ "wcag2aa"
1210
+ ]
1211
+ },
1212
+ {
1213
+ "ruleId": "on-focus",
1214
+ "wcagCriteria": "3.2.1",
1215
+ "wcagLevel": "A",
1216
+ "wcagTitle": "On Focus",
1217
+ "wcagVersion": "2.0",
1218
+ "en301549Criteria": "9.3.2.1",
1219
+ "en301549Title": "On focus",
1220
+ "en301549Chapter": 9,
1221
+ "dosLagenApplies": true,
1222
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
1223
+ "remediation": {
1224
+ "description": "Lorsqu'un composant reçoit le focus, il ne doit pas initier de changement de contexte.",
1225
+ "technicalGuidance": "N'ouvrez pas de nouvelles fenêtres, ne soumettez pas de formulaires et ne déplacez pas le focus automatiquement simplement parce que l'utilisateur navigue vers un champ.",
1226
+ "component": null,
1227
+ "wcagTechnique": [
1228
+ "G107"
1229
+ ]
1230
+ },
1231
+ "holmdigitalInsight": {
1232
+ "diggRisk": "high",
1233
+ "eaaImpact": "high",
1234
+ "frenchInterpretation": "Très déroutant pour les utilisateurs. Crée un sentiment de perte de contrôle.",
1235
+ "commonMistakes": [
1236
+ "Menus déroulants qui naviguent immédiatement après sélection (sans bouton 'Aller')",
1237
+ "Formulaires qui s'envoient automatiquement au focus du dernier champ"
1238
+ ],
1239
+ "priorityRationale": "Important for predictability."
1240
+ },
1241
+ "testability": {
1242
+ "automated": false,
1243
+ "requiresManualCheck": true,
1244
+ "pseudoAutomation": true,
1245
+ "complexity": "moderate"
1246
+ },
1247
+ "tags": [
1248
+ "interaction",
1249
+ "focus",
1250
+ "predictability",
1251
+ "wcag2a"
1252
+ ]
1253
+ },
1254
+ {
1255
+ "ruleId": "on-input",
1256
+ "wcagCriteria": "3.2.2",
1257
+ "wcagLevel": "A",
1258
+ "wcagTitle": "On Input",
1259
+ "wcagVersion": "2.0",
1260
+ "en301549Criteria": "9.3.2.2",
1261
+ "en301549Title": "On input",
1262
+ "en301549Chapter": 9,
1263
+ "dosLagenApplies": true,
1264
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
1265
+ "remediation": {
1266
+ "description": "Le changement de réglage d'un composant ne provoque pas automatiquement un changement de contexte, sauf si l'utilisateur a été averti du comportement avant d'utiliser le composant.",
1267
+ "technicalGuidance": "Informez l'utilisateur que la sélection dans une liste recharge la page. De préférence, ajoutez un bouton pour confirmer le choix.",
1268
+ "component": null,
1269
+ "wcagTechnique": [
1270
+ "G13",
1271
+ "H32"
1272
+ ]
1273
+ },
1274
+ "holmdigitalInsight": {
1275
+ "diggRisk": "medium",
1276
+ "eaaImpact": "medium",
1277
+ "frenchInterpretation": "Fréquent dans les fonctions de filtrage.",
1278
+ "commonMistakes": [
1279
+ "Cases à cocher qui rechargent la page immédiatement",
1280
+ "Filtrage qui déplace le focus"
1281
+ ],
1282
+ "priorityRationale": "Important for predictability."
1283
+ },
1284
+ "testability": {
1285
+ "automated": false,
1286
+ "requiresManualCheck": true,
1287
+ "pseudoAutomation": true,
1288
+ "complexity": "moderate"
1289
+ },
1290
+ "tags": [
1291
+ "interaction",
1292
+ "input",
1293
+ "predictability",
1294
+ "wcag2a"
1295
+ ]
1296
+ },
1297
+ {
1298
+ "ruleId": "consistent-navigation",
1299
+ "wcagCriteria": "3.2.3",
1300
+ "wcagLevel": "AA",
1301
+ "wcagTitle": "Consistent Navigation",
1302
+ "wcagVersion": "2.0",
1303
+ "en301549Criteria": "9.3.2.3",
1304
+ "en301549Title": "Consistent navigation",
1305
+ "en301549Chapter": 9,
1306
+ "dosLagenApplies": true,
1307
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1308
+ "remediation": {
1309
+ "description": "Les mécanismes de navigation qui sont répétés sur plusieurs pages Web apparaissent dans le même ordre relatif à chaque fois qu'ils sont répétés.",
1310
+ "technicalGuidance": "Gardez le menu, la recherche et le pied de page au même endroit sur toutes les pages. Ne changez pas l'ordre des éléments du menu.",
1311
+ "component": null,
1312
+ "wcagTechnique": [
1313
+ "G61"
1314
+ ]
1315
+ },
1316
+ "holmdigitalInsight": {
1317
+ "diggRisk": "medium",
1318
+ "eaaImpact": "medium",
1319
+ "frenchInterpretation": "La prévisibilité est essentielle pour l'accessibilité cognitive.",
1320
+ "commonMistakes": [
1321
+ "L'ordre des menus change entre les pages",
1322
+ "Le bouton de recherche se déplace"
1323
+ ],
1324
+ "priorityRationale": "Facilitates learning."
1325
+ },
1326
+ "testability": {
1327
+ "automated": false,
1328
+ "requiresManualCheck": true,
1329
+ "pseudoAutomation": false,
1330
+ "complexity": "simple"
1331
+ },
1332
+ "tags": [
1333
+ "navigation",
1334
+ "design",
1335
+ "consistency",
1336
+ "wcag2aa"
1337
+ ]
1338
+ },
1339
+ {
1340
+ "ruleId": "consistent-identification",
1341
+ "wcagCriteria": "3.2.4",
1342
+ "wcagLevel": "AA",
1343
+ "wcagTitle": "Consistent Identification",
1344
+ "wcagVersion": "2.0",
1345
+ "en301549Criteria": "9.3.2.4",
1346
+ "en301549Title": "Consistent identification",
1347
+ "en301549Chapter": 9,
1348
+ "dosLagenApplies": true,
1349
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1350
+ "remediation": {
1351
+ "description": "Les composants qui ont la même fonctionnalité dans un ensemble de pages Web sont identifiés de manière cohérente.",
1352
+ "technicalGuidance": "N'utilisez pas l'icône de loupe pour 'Rechercher' sur une page et 'Trouver' sur une autre. Utilisez les mêmes icônes et étiquettes pour les mêmes fonctions.",
1353
+ "component": null,
1354
+ "wcagTechnique": [
1355
+ "G197"
1356
+ ]
1357
+ },
1358
+ "holmdigitalInsight": {
1359
+ "diggRisk": "low",
1360
+ "eaaImpact": "low",
1361
+ "frenchInterpretation": "Le 'mélange' de la navigation est un gros problème pour l'utilisabilité.",
1362
+ "commonMistakes": [
1363
+ "Inconsistent naming",
1364
+ "Different icons for print/download"
1365
+ ],
1366
+ "priorityRationale": "Reduces cognitive load."
1367
+ },
1368
+ "testability": {
1369
+ "automated": false,
1370
+ "requiresManualCheck": true,
1371
+ "pseudoAutomation": false,
1372
+ "complexity": "simple"
1373
+ },
1374
+ "tags": [
1375
+ "content",
1376
+ "icons",
1377
+ "consistency",
1378
+ "wcag2aa"
1379
+ ]
1380
+ },
1381
+ {
1382
+ "ruleId": "error-identification",
1383
+ "wcagCriteria": "3.3.1",
1384
+ "wcagLevel": "A",
1385
+ "wcagTitle": "Error Identification",
1386
+ "wcagVersion": "2.0",
1387
+ "en301549Criteria": "9.3.3.1",
1388
+ "en301549Title": "Error identification",
1389
+ "en301549Chapter": 9,
1390
+ "dosLagenApplies": true,
1391
+ "dosLagenReference": "RGAA 4.1, Niveau A requis",
1392
+ "remediation": {
1393
+ "description": "Si une erreur de saisie est détectée automatiquement, l'élément en erreur est identifié et l'erreur est décrite à l'utilisateur sous forme de texte.",
1394
+ "technicalGuidance": "Affichez un message d'erreur clair à proximité du champ. Utilisez aria-invalid='true' et aria-describedby pour relier l'erreur au champ. Do not just color the field red.",
1395
+ "component": "@holmdigital/components/FormField",
1396
+ "wcagTechnique": [
1397
+ "G83",
1398
+ "SCR18"
1399
+ ]
1400
+ },
1401
+ "holmdigitalInsight": {
1402
+ "diggRisk": "high",
1403
+ "eaaImpact": "high",
1404
+ "frenchInterpretation": "Critique pour accomplir des tâches. Les messages d'erreur génériques ('Quelque chose a mal tourné') ne sont pas acceptés si l'erreur est spécifique.",
1405
+ "commonMistakes": [
1406
+ "'Valeur invalide' sans explication",
1407
+ "Message d'erreur non visible pour les lecteurs d'écran"
1408
+ ],
1409
+ "priorityRationale": "Critical for error handling."
1410
+ },
1411
+ "testability": {
1412
+ "automated": false,
1413
+ "requiresManualCheck": true,
1414
+ "pseudoAutomation": true,
1415
+ "complexity": "moderate"
1416
+ },
1417
+ "tags": [
1418
+ "forms",
1419
+ "errors",
1420
+ "wcag2a"
1421
+ ]
1422
+ },
1423
+ {
1424
+ "ruleId": "error-suggestion",
1425
+ "wcagCriteria": "3.3.3",
1426
+ "wcagLevel": "AA",
1427
+ "wcagTitle": "Error Suggestion",
1428
+ "wcagVersion": "2.0",
1429
+ "en301549Criteria": "9.3.3.3",
1430
+ "en301549Title": "Error suggestion",
1431
+ "en301549Chapter": 9,
1432
+ "dosLagenApplies": true,
1433
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1434
+ "remediation": {
1435
+ "description": "Si une erreur de saisie est détectée automatiquement et que des suggestions de correction sont connues, alors les suggestions sont fournies à l'utilisateur.",
1436
+ "technicalGuidance": "Si le format de la date est incorrect, affichez le format requis (AAAA-MM-JJ). Proposez des suggestions d'orthographe pour la recherche ('Vouliez-vous dire...?').",
1437
+ "component": "@holmdigital/components/FormField",
1438
+ "wcagTechnique": [
1439
+ "G177"
1440
+ ]
1441
+ },
1442
+ "holmdigitalInsight": {
1443
+ "diggRisk": "medium",
1444
+ "eaaImpact": "medium",
1445
+ "swedishInterpretation": "About being helpful. Reduces support cases.",
1446
+ "commonMistakes": [
1447
+ "Erreur 'Format invalide' sans exemple de format valide"
1448
+ ],
1449
+ "priorityRationale": "Facilitates correction."
1450
+ },
1451
+ "testability": {
1452
+ "automated": false,
1453
+ "requiresManualCheck": true,
1454
+ "pseudoAutomation": true,
1455
+ "complexity": "moderate"
1456
+ },
1457
+ "tags": [
1458
+ "forms",
1459
+ "errors",
1460
+ "guidance",
1461
+ "wcag2aa"
1462
+ ]
1463
+ },
1464
+ {
1465
+ "ruleId": "error-prevention",
1466
+ "wcagCriteria": "3.3.4",
1467
+ "wcagLevel": "AA",
1468
+ "wcagTitle": "Error Prevention (Legal, Financial, Data)",
1469
+ "wcagVersion": "2.0",
1470
+ "en301549Criteria": "9.3.3.4",
1471
+ "en301549Title": "Error prevention (legal, financial, data)",
1472
+ "en301549Chapter": 9,
1473
+ "dosLagenApplies": true,
1474
+ "dosLagenReference": "RGAA 4.1, Niveau AA requis",
1475
+ "remediation": {
1476
+ "description": "Pour les pages Web qui entraînent des engagements légaux ou des transactions financières, les soumissions sont réversibles, vérifiées ou confirmées.",
1477
+ "technicalGuidance": "Une page de révision avant la soumission finale est la solution standard. Ou une période d'annulation de 15 minutes.",
1478
+ "component": null,
1479
+ "wcagTechnique": [
1480
+ "G164",
1481
+ "G98"
1482
+ ]
1483
+ },
1484
+ "holmdigitalInsight": {
1485
+ "diggRisk": "high",
1486
+ "eaaImpact": "high",
1487
+ "swedishInterpretation": "Absolute requirement for e-commerce and legal decisions.",
1488
+ "frenchInterpretation": "Standard pour le e-commerce et le secteur public. La loi fiscale est stricte à ce sujet.",
1489
+ "commonMistakes": [
1490
+ "Direct purchase without confirmation",
1491
+ "Submission of binding contracts without review"
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": "RGAA 4.1, Niveau A requis",
1519
+ "remediation": {
1520
+ "description": "Pour le contenu implémenté à l'aide de langages de balisage, les éléments ont des balises de début et de fin complètes, sont imbriqués conformément à leurs spécifications, n'ont pas d'attributs dupliqués et ont des ID uniques.",
1521
+ "technicalGuidance": "Validez votre code HTML. Une syntaxe incorrecte (balises fermantes manquantes, ID dupliqués) brise la technologie d'assistance. Fermez correctement toutes les balises.",
1522
+ "component": null,
1523
+ "wcagTechnique": [
1524
+ "H88"
1525
+ ]
1526
+ },
1527
+ "holmdigitalInsight": {
1528
+ "diggRisk": "low",
1529
+ "eaaImpact": "low",
1530
+ "swedishInterpretation": "Less prioritized now as modern browsers handle errors well, but duplicate IDs can still break ARIA.",
1531
+ "commonMistakes": [
1532
+ "ID dupliqués (copier-coller)",
1533
+ "Balises mal imbriquées (div dans 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": "RGAA 4.1, Niveau A requis",
1561
+ "remediation": {
1562
+ "description": "Pour tous les composants d'interface utilisateur, le nom et le rôle peuvent être déterminés par programme ; les états, les propriétés et les valeurs peuvent être définis par programme ; et la notification des changements est disponible.",
1563
+ "technicalGuidance": "Utilisez les éléments HTML natifs lorsque cela est possible. Si des composants personnalisés sont utilisés, ARIA (role, aria-label, aria-valuenow) doit être utilisé correctement.",
1564
+ "component": null,
1565
+ "wcagTechnique": [
1566
+ "ARIA4",
1567
+ "ARIA5"
1568
+ ]
1569
+ },
1570
+ "holmdigitalInsight": {
1571
+ "diggRisk": "critical",
1572
+ "eaaImpact": "critical",
1573
+ "frenchInterpretation": "C'est la base du fonctionnement des lecteurs d'écran avec les applications web modernes. Sans cela, l'application est 'invisible' pour les technologies d'assistance.",
1574
+ "commonMistakes": [
1575
+ "Boutons div sans rôle",
1576
+ "Cases à cocher personnalisées sans aria-checked",
1577
+ "Nom accessible manquant"
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": "RGAA 4.1, Niveau AA requis",
1605
+ "remediation": {
1606
+ "description": "Les messages d'état peuvent être déterminés par programme via le rôle ou les propriétés afin qu'ils puissent être présentés à l'utilisateur par les technologies d'assistance sans recevoir le focus.",
1607
+ "technicalGuidance": "Utilisez un rôle aria-live (polite ou assertive) pour les messages qui apparaissent dynamiquement (comme les alertes de succès, les mises à jour du panier).",
1608
+ "component": null,
1609
+ "wcagTechnique": [
1610
+ "ARIA19",
1611
+ "ARIA22"
1612
+ ]
1613
+ },
1614
+ "holmdigitalInsight": {
1615
+ "diggRisk": "medium",
1616
+ "eaaImpact": "medium",
1617
+ "frenchInterpretation": "Critique pour les SPA. Les utilisateurs aveugles manquent souvent les notifications 'toast' si elles ne sont pas annoncées.",
1618
+ "commonMistakes": [
1619
+ "Silent updates of cart/search results",
1620
+ "Toast notifications not being announced"
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": "RGAA 4.1, Niveau A requis",
1648
+ "remediation": {
1649
+ "description": "La page doit avoir une (et une seule) région principale (<main>).",
1650
+ "technicalGuidance": "Utilisez l'élément <main> pour le contenu principal. Si vous en avez plusieurs, utilisez aria-label pour les distinguer, mais généralement un seul est préférable.",
1651
+ "wcagTechnique": [
1652
+ "ARIA11",
1653
+ "H97"
1654
+ ]
1655
+ },
1656
+ "holmdigitalInsight": {
1657
+ "diggRisk": "medium",
1658
+ "eaaImpact": "medium",
1659
+ "swedishInterpretation": "Screen reader users rely on landmarks to navigate quickly to the content. Missing <main> makes it difficult to skip navigation.",
1660
+ "commonMistakes": [
1661
+ "Élément <main> manquant",
1662
+ "Plusieurs éléments <main> sans étiquette"
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": "RGAA 4.1, Niveau A requis",
1688
+ "remediation": {
1689
+ "description": "La page doit avoir un titre de niveau 1 (<h1>).",
1690
+ "technicalGuidance": "Assurez-vous qu'il y a exactement un <h1> décrivant le contenu unique de la page.",
1691
+ "wcagTechnique": [
1692
+ "H42"
1693
+ ]
1694
+ },
1695
+ "holmdigitalInsight": {
1696
+ "diggRisk": "high",
1697
+ "eaaImpact": "high",
1698
+ "frenchInterpretation": "Un <h1> clair est essentiel pour que les utilisateurs comprennent où ils sont arrivés. C'est souvent la première chose qu'un utilisateur de lecteur d'écran recherche.",
1699
+ "commonMistakes": [
1700
+ "Commencer les titres à <h2>",
1701
+ "Utiliser le logo comme seul <h1> sans texte"
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": "RGAA 4.1, Niveau A requis",
1727
+ "remediation": {
1728
+ "description": "La hiérarchie des titres (h1-h6) doit être logique et ne pas sauter de niveaux.",
1729
+ "technicalGuidance": "Ne passez pas de h2 à h4. Utilisez CSS pour le style, et les balises h pour la structure.",
1730
+ "wcagTechnique": [
1731
+ "G141"
1732
+ ]
1733
+ },
1734
+ "holmdigitalInsight": {
1735
+ "diggRisk": "medium",
1736
+ "eaaImpact": "medium",
1737
+ "frenchInterpretation": "Essentiel pour la navigation structurelle (touche H du lecteur d'écran).",
1738
+ "commonMistakes": [
1739
+ "Utilisation de titres pour la taille de police (ex: utiliser h4 parce que c'est petit)"
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": "RGAA 4.1, Niveau A requis",
1765
+ "remediation": {
1766
+ "description": "La région banner (<header>) doit être au niveau supérieur.",
1767
+ "technicalGuidance": "Ne placez pas <header> à l'intérieur d'un autre landmark s'il s'agit de la bannière principale de la page.",
1768
+ "wcagTechnique": [
1769
+ "ARIA11"
1770
+ ]
1771
+ },
1772
+ "holmdigitalInsight": {
1773
+ "diggRisk": "medium",
1774
+ "eaaImpact": "medium",
1775
+ "frenchInterpretation": "Le menu principal/bannière de la page doit être situé correctement dans la structure pour être trouvé rapidement.",
1776
+ "commonMistakes": [
1777
+ "Header imbriqué dans 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": "RGAA 4.1, Niveau A requis",
1803
+ "remediation": {
1804
+ "description": "La page ne doit avoir qu'un seul landmark 'banner' (généralement <header>).",
1805
+ "technicalGuidance": "Assurez-vous d'avoir un seul <header> au niveau supérieur.",
1806
+ "wcagTechnique": [
1807
+ "ARIA11"
1808
+ ]
1809
+ },
1810
+ "holmdigitalInsight": {
1811
+ "diggRisk": "medium",
1812
+ "eaaImpact": "medium",
1813
+ "frenchInterpretation": "Les bannières multiples perturbent la navigation. Il ne doit y avoir qu'un seul en-tête principal.",
1814
+ "commonMistakes": [
1815
+ "Avoir un header en haut et en bas"
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": "RGAA 4.1, Niveau A requis",
1841
+ "remediation": {
1842
+ "description": "Les landmarks doivent avoir des rôles ou des étiquettes uniques.",
1843
+ "technicalGuidance": "Si vous avez plusieurs éléments <nav>, donnez-leur un 'aria-label' unique (ex : 'Menu principal', 'Menu pied de page').",
1844
+ "wcagTechnique": [
1845
+ "ARIA11"
1846
+ ]
1847
+ },
1848
+ "holmdigitalInsight": {
1849
+ "diggRisk": "medium",
1850
+ "eaaImpact": "medium",
1851
+ "frenchInterpretation": "L'utilisateur doit pouvoir distinguer les différents menus/régions. Donnez-leur des noms.",
1852
+ "commonMistakes": [
1853
+ "Plusieurs éléments nav sans 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": "RGAA 4.1, Niveau A requis",
1879
+ "remediation": {
1880
+ "description": "Tout le contenu de la page doit être contenu dans des landmarks (régions).",
1881
+ "technicalGuidance": "Assurez-vous que tout le contenu est à l'intérieur de <main>, <header>, <nav>, <footer>, ou <aside>.",
1882
+ "component": null,
1883
+ "wcagTechnique": [
1884
+ "ARIA11"
1885
+ ]
1886
+ },
1887
+ "holmdigitalInsight": {
1888
+ "diggRisk": "medium",
1889
+ "eaaImpact": "medium",
1890
+ "frenchInterpretation": "Pour que les utilisateurs de lecteurs d'écran puissent naviguer efficacement, la page doit être divisée en régions logiques.",
1891
+ "commonMistakes": [
1892
+ "Contenu directement dans <body> sans conteneur",
1893
+ "Utilisation de trop de 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": "RGAA 4.1, Niveau AA requis",
1918
+ "remediation": {
1919
+ "description": "Une audiodescription est fournie pour tout contenu vidéo préenregistré.",
1920
+ "technicalGuidance": "Fournissez une piste audio alternative ou une version décrivant ce qui se passe visuellement.",
1921
+ "component": null,
1922
+ "wcagTechnique": [
1923
+ "G78"
1924
+ ]
1925
+ },
1926
+ "holmdigitalInsight": {
1927
+ "diggRisk": "medium",
1928
+ "eaaImpact": "low",
1929
+ "frenchInterpretation": "La vidéo transmettant des informations visuellement doit être décrite pour ceux qui ne peuvent pas voir l'écran.",
1930
+ "commonMistakes": [
1931
+ "Vidéo manquant d'audiodescription malgré des infos visuelles importantes"
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
+ ]