ultra11y 4.4.0 → 4.5.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.
@@ -6,7 +6,7 @@ import { join as join50, relative as relative5, resolve as resolve15, sep as sep
6
6
  import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL3 } from "url";
7
7
 
8
8
  // src/types.ts
9
- var VERSION = "4.4.0";
9
+ var VERSION = "4.5.0";
10
10
  var SCHEMA_VERSION = 2;
11
11
 
12
12
  // src/audit.ts
@@ -2289,7 +2289,7 @@ var wcag_universe_default = {
2289
2289
  wcagVersion: "2.2",
2290
2290
  source: "https://www.w3.org/TR/WCAG22/",
2291
2291
  criteriaSource: "https://github.com/w3c/wcag",
2292
- provenance: "Full WCAG 2.x SC universe (all levels incl. AAA, and the removed 4.1.1 Parsing) fetched from raw.githubusercontent.com/w3c/wcag@main on 2026-08-14 via `node scripts/build-standards.mjs --refresh-universe`. Classification: core-AA = ships in src/data/wcag.json (the shipped WCAG 2.2 AA core); out-of-core = WCAG AAA; removed = obsolete (4.1.1).",
2292
+ provenance: "Full WCAG 2.x SC universe (all levels incl. AAA, and the removed 4.1.1 Parsing) fetched from raw.githubusercontent.com/w3c/wcag@main on 2026-08-17 via `node scripts/build-standards.mjs --refresh-universe`. Classification: core-AA = ships in src/data/wcag.json (the shipped WCAG 2.2 AA core); out-of-core = WCAG AAA; removed = obsolete (4.1.1).",
2293
2293
  criteria: [
2294
2294
  {
2295
2295
  id: "1.1.1",
@@ -50335,268 +50335,1398 @@ var rgaa_default2 = {
50335
50335
  var wcag_default2 = {
50336
50336
  pack: "wcag",
50337
50337
  source: "https://www.w3.org/WAI/WCAG22/Understanding/",
50338
- license: "W3C Document License",
50339
- attribution: "Derived from the W3C Understanding WCAG 2.2 documents. WCAG 2.2 \xA9 W3C. Short derived summaries and minimal illustrative examples only, not verbatim prose \u2014 see NOTICE.",
50338
+ license: "W3C Document License (code samples: W3C Software License)",
50339
+ attribution: "Derived from the W3C Techniques for WCAG 2.2 and the Understanding documents (https://github.com/w3c/wcag). WCAG 2.2 \xA9 W3C. Summaries are the working group's own 'In brief' text; code samples are the techniques' own examples. Generated by scripts/build-guidance-wcag.mjs \u2014 never hand-edited.",
50340
50340
  entries: [
50341
50341
  {
50342
- id: "media-live-captions",
50342
+ id: "wcag-non-text-content",
50343
+ criterionId: "1.1.1",
50344
+ wcag: ["1.1.1"],
50345
+ title: {
50346
+ en: "Non-text Content",
50347
+ fr: "Contenu non textuel"
50348
+ },
50349
+ summary: {
50350
+ en: "Create a text alternative for visual and auditory content. Non-text information is available to more people. People who can\u2019t fully see or hear content can understand it."
50351
+ },
50352
+ examples: [
50353
+ {
50354
+ lang: "html",
50355
+ good: '<a href="products.html">\n <img src="icon.gif" alt="">Products page\n</a>',
50356
+ note: {
50357
+ en: "Good: Combining adjacent image and text links for the same resource (H2)."
50358
+ }
50359
+ },
50360
+ {
50361
+ lang: "css",
50362
+ bad: 'ul#booklist li {\n padding-left: 20px;\n }\n \n ul#booklist li.new {\n background: transparent url(new.png) no-repeat top left; \n }\n \n ul#booklist li.limited {\n background: transparent url(limited.png) no-repeat top left; \n }\n \n ul#booklist li.instock {\n background: transparent url(instock.png) no-repeat top left; \n }\n \n ul#booklist li.outstock {\n background: transparent url(outstock.png) no-repeat top left; \n }</code>\n</pre>\n \n <p>It is used in this excerpt: </p>\n \n<pre><code class="language-html"><ul id="booklist">\n <li class="new">Some book</li>\n <li class="instock">Some other book</li>\n <li class="limited">A book we desperately want to get rid of</li>\n ...\n <li class="outstock">A book you actually want </li>\n</ul>',
50363
+ note: {
50364
+ en: "Bad: Failure of Success Criterion 1.1.1 due to conveying information exclusively using CSS background images (F3)."
50365
+ }
50366
+ }
50367
+ ],
50368
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html"
50369
+ },
50370
+ {
50371
+ id: "wcag-audio-only-and-video-only-prerecorded",
50372
+ criterionId: "1.2.1",
50373
+ wcag: ["1.2.1"],
50374
+ title: {
50375
+ en: "Audio-only and Video-only (Prerecorded)",
50376
+ fr: "Contenus seulement audio et seulement vid\xE9o (pr\xE9-enregistr\xE9s)"
50377
+ },
50378
+ summary: {
50379
+ en: "Provide an alternative when content is perceivable with only one sense. Audio and video-only content can be understood by more people. People who can\u2019t fully see or hear content can understand it."
50380
+ },
50381
+ examples: [
50382
+ {
50383
+ lang: "html",
50384
+ good: '<a href="../video/marslanding.mp4">\n <img src="../images/spaceship.jpg" alt="Mars landing, video-only"\n width="193" height="255"/>\n</a>\n<p><a href="mars-landing-audio.mp3">Audio description of "Mars Landing"</a></p>',
50385
+ note: {
50386
+ en: "Good: Providing audio that describes the important video content and describing it as such (G166)."
50387
+ }
50388
+ }
50389
+ ],
50390
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html"
50391
+ },
50392
+ {
50393
+ id: "wcag-captions-prerecorded",
50394
+ criterionId: "1.2.2",
50395
+ wcag: ["1.2.2"],
50396
+ title: {
50397
+ en: "Captions (Prerecorded)",
50398
+ fr: "Sous-titres (pr\xE9-enregistr\xE9s)"
50399
+ },
50400
+ summary: {
50401
+ en: "Provide synchronized text for audio content in existing videos. Videos can be played with captions. People who are deaf or hard of hearing can understand audio in videos."
50402
+ },
50403
+ examples: [
50404
+ {
50405
+ lang: "html",
50406
+ good: '<video poster="myvideo.png" controls>\n <source src="myvideo.mp4" srclang="en" type="video/mp4">\n <track kind="captions" label="English" src="myvideo_en.vtt" srclang="en">\n</video>',
50407
+ note: {
50408
+ en: "Good: Using the track element to provide captions (H95)."
50409
+ }
50410
+ }
50411
+ ],
50412
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html"
50413
+ },
50414
+ {
50415
+ id: "wcag-audio-description-or-media-alternative-prerecorded",
50416
+ criterionId: "1.2.3",
50417
+ wcag: ["1.2.3"],
50418
+ title: {
50419
+ en: "Audio Description or Media Alternative (Prerecorded)",
50420
+ fr: "Audio-description ou version de remplacement pour un m\xE9dia temporel (pr\xE9-enregistr\xE9)"
50421
+ },
50422
+ summary: {
50423
+ en: "Provide a description of the visual content in videos. Prerecorded videos can be understood by more people. People who are blind or who cannot understand the visual content can have it described."
50424
+ },
50425
+ examples: [
50426
+ {
50427
+ lang: "html",
50428
+ good: '<object classid="https://www.example.com/analogclock.py">\n <p>Here is some text that describes the object and its operation.</p>\n</object>',
50429
+ note: {
50430
+ en: "Good: Using the body of the object element (H53)."
50431
+ }
50432
+ }
50433
+ ],
50434
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html"
50435
+ },
50436
+ {
50437
+ id: "wcag-captions-live",
50343
50438
  criterionId: "1.2.4",
50344
50439
  wcag: ["1.2.4"],
50345
50440
  title: {
50346
- en: "Live synchronized media is captioned",
50347
- fr: "Le m\xE9dia synchronis\xE9 en direct est sous-titr\xE9"
50441
+ en: "Captions (Live)",
50442
+ fr: "Sous-titres (en direct)"
50348
50443
  },
50349
50444
  summary: {
50350
- en: "Live audio in synchronized media needs real-time captions. A player with no caption track leaves deaf and hard-of-hearing users with nothing, and a pre-recorded transcript published afterwards does not satisfy a live criterion.",
50351
- fr: "L'audio en direct d'un m\xE9dia synchronis\xE9 exige des sous-titres en temps r\xE9el. Un lecteur sans piste de sous-titres ne laisse rien aux personnes sourdes ou malentendantes, et une transcription publi\xE9e apr\xE8s coup ne satisfait pas un crit\xE8re \xAB en direct \xBB."
50445
+ en: "Provide synchronized text for audio content in real-time videos. Live videos have captions. People who are deaf or hard of hearing can understand audio in real-time video content."
50446
+ },
50447
+ examples: [],
50448
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html"
50449
+ },
50450
+ {
50451
+ id: "wcag-audio-description-prerecorded",
50452
+ criterionId: "1.2.5",
50453
+ wcag: ["1.2.5"],
50454
+ title: {
50455
+ en: "Audio Description (Prerecorded)",
50456
+ fr: "Audio-description (pr\xE9-enregistr\xE9e)"
50457
+ },
50458
+ summary: {
50459
+ en: "Provide a synchronized spoken description of the visual content in videos. Videos can be played with audio descriptions. People who cannot see or understand the visual content can hear about it while playing videos."
50460
+ },
50461
+ examples: [],
50462
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html"
50463
+ },
50464
+ {
50465
+ id: "wcag-info-and-relationships",
50466
+ criterionId: "1.3.1",
50467
+ wcag: ["1.3.1"],
50468
+ title: {
50469
+ en: "Info and Relationships",
50470
+ fr: "Information et relations"
50471
+ },
50472
+ summary: {
50473
+ en: "Use code to reinforce relationships and information conveyed through presentation. Information about content structure is available to more people. People can adapt the presentation to suit their needs while preserving the original meaning."
50352
50474
  },
50353
- impact: "high",
50354
50475
  examples: [
50355
50476
  {
50356
50477
  lang: "html",
50357
- bad: '<video src="/live/stream.m3u8" controls></video>',
50358
- good: '<video src="/live/stream.m3u8" controls>\n <track kind="captions" srclang="en" label="English (live)" src="/live/captions.vtt" default>\n</video>',
50478
+ bad: "<style>\n.heading1{\n font-family: Times, serif;\n font-size:200%;\n font-weight:bold;\n}\n</style>",
50479
+ good: "... What she <em>really</em> meant to say was, &quot;This is not OK, \n it is <strong>excellent</strong>&quot;! ...",
50359
50480
  note: {
50360
- en: "The caption track must be fed in real time (a live captioner or a live ASR service). Publishing a transcript after the broadcast is a different criterion.",
50361
- fr: "La piste doit \xEAtre aliment\xE9e en temps r\xE9el (sous-titrage humain ou reconnaissance vocale en direct). Publier une transcription apr\xE8s la diffusion rel\xE8ve d'un autre crit\xE8re."
50481
+ en: "Good: Using semantic markup to mark emphasized or special text (H49). Bad: Failure of Success Criterion 1.3.1 due to using changes in text presentation to convey information without using the appropriate markup or text (F2)."
50362
50482
  }
50363
50483
  }
50364
50484
  ],
50365
- reference: "https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html"
50485
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html"
50366
50486
  },
50367
50487
  {
50368
- id: "motion-three-flashes",
50369
- criterionId: "2.3.1",
50370
- wcag: ["2.3.1"],
50488
+ id: "wcag-meaningful-sequence",
50489
+ criterionId: "1.3.2",
50490
+ wcag: ["1.3.2"],
50371
50491
  title: {
50372
- en: "Nothing flashes more than three times a second",
50373
- fr: "Rien ne clignote plus de trois fois par seconde"
50492
+ en: "Meaningful Sequence",
50493
+ fr: "Ordre s\xE9quentiel logique"
50374
50494
  },
50375
50495
  summary: {
50376
- en: "Content that flashes more than three times in any one second can trigger a seizure. This is the one accessibility failure that can cause physical harm, so it is not a matter of preference: slow the flash below the threshold, or remove it.",
50377
- fr: "Un contenu qui clignote plus de trois fois par seconde peut d\xE9clencher une crise d'\xE9pilepsie. C'est le seul d\xE9faut d'accessibilit\xE9 qui peut causer un dommage physique : il faut ralentir le clignotement sous le seuil, ou le supprimer."
50496
+ en: "Use code to preserve meaningful content order. The order of content can be understood by more people. Assistive technology can present content to users in the proper order."
50497
+ },
50498
+ examples: [
50499
+ {
50500
+ lang: "html",
50501
+ bad: '<h1>W e l c o m e</h1></code>\n</pre>\n\n <p>&nbsp; can also be used to add white space, producing similar failures:</p>\n\n<pre><code class="language-html"><h1>H&nbsp;E&nbsp;L&nbsp;L&nbsp;O</h1>',
50502
+ good: '<p>The title says "<span lang="he" dir="rtl">\u05E4\u05E2\u05D9\u05DC\u05D5\u05EA \u05D4\u05D1\u05D9\u05E0\u05D0\u05D5\u05DD, W3C</span>" in Hebrew.</p>',
50503
+ note: {
50504
+ en: "Good: Using the dir attribute on an inline element to resolve problems with nested directional runs (H56). Bad: Failure of Success Criterion 1.3.2 due to using white space characters to control spacing within a word (F32)."
50505
+ }
50506
+ }
50507
+ ],
50508
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html"
50509
+ },
50510
+ {
50511
+ id: "wcag-sensory-characteristics",
50512
+ criterionId: "1.3.3",
50513
+ wcag: ["1.3.3"],
50514
+ title: {
50515
+ en: "Sensory Characteristics",
50516
+ fr: "Caract\xE9ristiques sensorielles"
50517
+ },
50518
+ summary: {
50519
+ en: "Describe controls by name, not just by appearance or location. Instructions are understandable by more people. People who are blind or have low vision need non-visual instructions."
50520
+ },
50521
+ examples: [
50522
+ {
50523
+ lang: "html",
50524
+ good: '<form class="wrapper">\n <h1>Sign up to our mailing list</h1>\n <div role="note">\n Complete the form and then press the lower-right (<i>sign up</i>) button.\n </div>\n <div class="form-group">\n <label for="full-name">Your name</label>\n <input autocomplete="name" id="full-name" type="text">\n </div>\n <div class="form-group">\n <label for="email">Your email address</label>\n <input autocomplete="email" id="email" type="text">\n </div>\n <button type="reset">Cancel</button>\n <button type="submit">Sign up</button>\n</form>',
50525
+ note: {
50526
+ en: "Good: Providing textual identification of items that otherwise rely only on sensory information to be understood (G96)."
50527
+ }
50528
+ }
50529
+ ],
50530
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html"
50531
+ },
50532
+ {
50533
+ id: "wcag-orientation",
50534
+ criterionId: "1.3.4",
50535
+ wcag: ["1.3.4"],
50536
+ title: {
50537
+ en: "Orientation",
50538
+ fr: "Orientation"
50539
+ },
50540
+ summary: {
50541
+ en: "Don't lock content to either portrait or landscape presentation. Devices can be used in any orientation. Wheelchair users and others may have devices mounted in a fixed orientation."
50542
+ },
50543
+ examples: [
50544
+ {
50545
+ lang: "html",
50546
+ bad: '<style>\n/* Orientation "door slam" Styling */\n\n@media all and (orientation: landscape) {\n .rotate { display: block; }\n .content { display: none; }\n}\n\n@media all and (orientation: portrait) {\n .rotate { display: none; }\n .content { display: block; }\n}\n\n.rotate {\n text-align: center;\n font-size: 2rem;\n margin-top: 4rem;\n}\n</style>',
50547
+ note: {
50548
+ en: "Bad: Failure of Success Criterion 1.3.4 due to showing a message asking to reorient device (F100)."
50549
+ }
50550
+ }
50551
+ ],
50552
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/orientation.html"
50553
+ },
50554
+ {
50555
+ id: "wcag-identify-input-purpose",
50556
+ criterionId: "1.3.5",
50557
+ wcag: ["1.3.5"],
50558
+ title: {
50559
+ en: "Identify Input Purpose",
50560
+ fr: "Identifier la finalit\xE9 de la saisie"
50561
+ },
50562
+ summary: {
50563
+ en: "Use code to indicate the purpose of common inputs, where technology allows. It is easier to fill out forms. Some people with cognitive disabilities may not understand the input's purpose from the label alone."
50564
+ },
50565
+ examples: [
50566
+ {
50567
+ lang: "html",
50568
+ good: '<form method="post" action="step2">\n <div>\n <label for="fname">First Name</label>\n <input autocomplete="given-name" id="fname" type="text">\n </div>\n <div>\n <label for="lname">Last Name</label>\n <input autocomplete="family-name" id="lname" type="text">\n </div>\n <div>\n <label for="cc-num">Credit card number:</label>\n <input autocomplete="cc-number" id="cc-num" type="text">\n </div>\n <div>\n <label for="exp-date">Expiry Date:</label>\n <input autocomplete="cc-exp" id="exp-date" type="month">\n </div>\n <div>\n <input type="submit" value="Continue">\n </div>\n</form>',
50569
+ note: {
50570
+ en: "Good: Using HTML autocomplete attributes (H98)."
50571
+ }
50572
+ }
50573
+ ],
50574
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html"
50575
+ },
50576
+ {
50577
+ id: "wcag-use-of-color",
50578
+ criterionId: "1.4.1",
50579
+ wcag: ["1.4.1"],
50580
+ title: {
50581
+ en: "Use of Color",
50582
+ fr: "Utilisation de la couleur"
50583
+ },
50584
+ summary: {
50585
+ en: "Use information in addition to color, such as shape or text, to convey meaning. Color is not the only way of distinguishing information. Not everyone sees colors or sees them the same way."
50586
+ },
50587
+ examples: [
50588
+ {
50589
+ lang: "html",
50590
+ bad: '<head>\n <style>\n p a:link {text-decoration: none}\n p a:visited {text-decoration: none}\n p a:active {text-decoration: none}\n p a:hover {text-decoration: underline; color: red;}\n </style>\n</head>\n<body>\n <p>There are many resources to find out more about the \n <a href="rain-in-spain.html">rain in Spain</a>.\n </p>\n</body>',
50591
+ good: '<style>\n .required {\n color:#ec0000;\n }\n</style>\n<label for="lastname" class="required">Last name (required):</label>\n<input autocomplete="family-name" id="lastname" type="text" value="">',
50592
+ note: {
50593
+ en: "Good: Including a text cue for colored form control labels (G205). Bad: Failure of Success Criterion 1.4.1 due to creating links that are not visually evident without color vision (F73)."
50594
+ }
50595
+ }
50596
+ ],
50597
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html"
50598
+ },
50599
+ {
50600
+ id: "wcag-audio-control",
50601
+ criterionId: "1.4.2",
50602
+ wcag: ["1.4.2"],
50603
+ title: {
50604
+ en: "Audio Control",
50605
+ fr: "Contr\xF4le du son"
50606
+ },
50607
+ summary: {
50608
+ en: "If you play audio content automatically, let people turn it down or off. A page that plays music or sounds doesn't disrupt people. Sound distracts some people, and also interferes with screen readers."
50609
+ },
50610
+ examples: [],
50611
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html"
50612
+ },
50613
+ {
50614
+ id: "wcag-contrast-minimum",
50615
+ criterionId: "1.4.3",
50616
+ wcag: ["1.4.3"],
50617
+ title: {
50618
+ en: "Contrast (Minimum)",
50619
+ fr: "Contraste (minimum)"
50620
+ },
50621
+ summary: {
50622
+ en: "Provide sufficient contrast between text and its background. Text can be seen by more people. Some people cannot read faint text."
50623
+ },
50624
+ examples: [
50625
+ {
50626
+ lang: "html",
50627
+ bad: '<!doctype>\n <html lang="en">\n <head>\n <title>Setting the canvas background</title>\n <style>\n body {background-color:white}\n </style>\n </head>\n <body>\n <p>My background is white.</p>\n </body>\n</html>',
50628
+ note: {
50629
+ en: "Bad: Failure of Success Criterion 1.4.3, 1.4.6 and 1.4.8 due to specifying foreground colors without specifying background colors or vice versa (F24)."
50630
+ }
50631
+ }
50632
+ ],
50633
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html"
50634
+ },
50635
+ {
50636
+ id: "wcag-resize-text",
50637
+ criterionId: "1.4.4",
50638
+ wcag: ["1.4.4"],
50639
+ title: {
50640
+ en: "Resize Text",
50641
+ fr: "Redimensionnement du texte"
50642
+ },
50643
+ summary: {
50644
+ en: "Ensure text can be doubled in size. Text can be enlarged. Some people can only read text when it is bigger."
50645
+ },
50646
+ examples: [
50647
+ {
50648
+ lang: "css",
50649
+ good: "#nav_menu { width: 20em; height: 100em; }\n#nav_list { font-size: 100%; }",
50650
+ note: {
50651
+ en: "Good: Specifying the size of text containers using em units (C28)."
50652
+ }
50653
+ },
50654
+ {
50655
+ lang: "html",
50656
+ bad: '<div style="font-size:100%; width:120px; height:100px; border: thin solid gray;"> \n Now is the time for all good men to come to the aid of their country. \n</div>\n<p>The quick brown fox jumps over the lazy dog.</p>',
50657
+ note: {
50658
+ en: "Bad: Failure of Success Criterion 1.4.4 when resizing visually rendered text up to 200 percent causes the text, image or controls to be clipped, truncated or obscured (F69)."
50659
+ }
50660
+ }
50661
+ ],
50662
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html"
50663
+ },
50664
+ {
50665
+ id: "wcag-images-of-text",
50666
+ criterionId: "1.4.5",
50667
+ wcag: ["1.4.5"],
50668
+ title: {
50669
+ en: "Images of Text",
50670
+ fr: "Texte sous forme d\u2019image"
50671
+ },
50672
+ summary: {
50673
+ en: "Use text instead of pictures of text. Users can adjust how text is presented. People cannot alter how text looks in images."
50674
+ },
50675
+ examples: [
50676
+ {
50677
+ lang: "html",
50678
+ good: "<p>The JavaScript method to convert a string to uppercase is <code>toUpperCase()</code>.</p>",
50679
+ note: {
50680
+ en: "Good: Using CSS to control visual presentation of text (C22)."
50681
+ }
50682
+ }
50683
+ ],
50684
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html"
50685
+ },
50686
+ {
50687
+ id: "wcag-reflow",
50688
+ criterionId: "1.4.10",
50689
+ wcag: ["1.4.10"],
50690
+ title: {
50691
+ en: "Reflow",
50692
+ fr: "Redistribution"
50693
+ },
50694
+ summary: {
50695
+ en: "Make lines of text reflow within the viewport. Content can be enlarged without increasing line length. People who need bigger text find it difficult if they must scroll to read long lines."
50696
+ },
50697
+ examples: [
50698
+ {
50699
+ lang: "html",
50700
+ good: `<!DOCTYPE html>
50701
+ <html lang="en">
50702
+ <head>
50703
+ <meta charset="UTF-8">
50704
+ <title>CSS: Using media queries and grid CSS to reflow columns</title>
50705
+ <style>
50706
+
50707
+ /* Reflow Styling */
50708
+ header { grid-area: header; }
50709
+ main { grid-area: main; }
50710
+ aside { grid-area: aside; }
50711
+ footer { grid-area: footer; }
50712
+
50713
+ .grid,
50714
+ .subgrid {
50715
+ display: grid;
50716
+ grid-template-columns: minmax(0, 1fr);
50717
+ }
50718
+
50719
+ .grid {
50720
+ grid-template-areas:
50721
+ 'header'
50722
+ 'main'
50723
+ 'aside'
50724
+ 'footer';
50725
+ width: 100%;
50726
+ }
50727
+
50728
+ .subgrid {
50729
+ width: calc(100% + 2rem);
50730
+ margin: 0 -1rem;
50731
+ }
50732
+
50733
+ .grid-item,
50734
+ .subgrid-item {
50735
+ padding: 1rem;
50736
+ }
50737
+
50738
+ @media all and (min-width: 576px) {
50739
+ .subgrid {
50740
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
50741
+ margin-bottom: 1rem;
50742
+ }
50743
+ .subgrid-item {
50744
+ padding-bottom: 0.25rem;
50745
+ }
50746
+ }
50747
+
50748
+ @media all and (min-width: 992px) {
50749
+ .grid {
50750
+ grid-template-areas:
50751
+ 'header header header'
50752
+ 'main main aside'
50753
+ 'footer footer footer';
50754
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
50755
+ }
50756
+ }
50757
+
50758
+ </style>
50759
+
50760
+ </head>
50761
+
50762
+ <body class="grid">
50763
+
50764
+ <header class="grid-item">
50765
+ ...
50766
+ </header>
50767
+
50768
+ <main class="grid-item">
50769
+ ...
50770
+ ...
50771
+ <div class="subgrid">
50772
+ <div class="subgrid-item">
50773
+ ...
50774
+ </div>
50775
+ <div class="subgrid-item">
50776
+ ...
50777
+ </div>
50778
+ </div>
50779
+ </main>
50780
+
50781
+ <aside class="grid-item">
50782
+ ...
50783
+ </aside>
50784
+
50785
+ <footer class="grid-item">
50786
+ ...
50787
+ </footer>
50788
+
50789
+ </body>
50790
+ </html>`,
50791
+ note: {
50792
+ en: "Good: Using media queries and grid CSS to reflow columns (C32)."
50793
+ }
50794
+ }
50795
+ ],
50796
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/reflow.html"
50797
+ },
50798
+ {
50799
+ id: "wcag-non-text-contrast",
50800
+ criterionId: "1.4.11",
50801
+ wcag: ["1.4.11"],
50802
+ title: {
50803
+ en: "Non-text Contrast",
50804
+ fr: "Contraste du contenu non textuel"
50805
+ },
50806
+ summary: {
50807
+ en: "Ensure meaningful visual cues achieve 3:1 against the background. Important visual information meets the same minimum contrast required for larger text. Some people cannot see elements with low contrast."
50378
50808
  },
50379
- impact: "high",
50380
50809
  examples: [
50381
50810
  {
50382
50811
  lang: "css",
50383
- bad: ".alert {\n animation: flash 0.15s steps(1) infinite;\n}",
50384
- good: ".alert {\n animation: flash 1s steps(1) infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .alert {\n animation: none;\n }\n}",
50812
+ bad: ":focus {outline: none}",
50813
+ good: "*:focus {\n /* inner indicator */\n outline: 2px #F9F9F9 solid;\n outline-offset: 0;\n /* outer indicator */\n box-shadow: 0 0 0 4px #193146;\n}",
50814
+ note: {
50815
+ en: "Good: Creating a two-color focus indicator to ensure sufficient contrast with all components (C40). Bad: Failure of Success Criterion 1.4.11, 2.4.7 and 2.4.13 due to styling element outlines and borders in a way that removes or renders non-visible the visual focus indicator (F78)."
50816
+ }
50817
+ }
50818
+ ],
50819
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html"
50820
+ },
50821
+ {
50822
+ id: "wcag-text-spacing",
50823
+ criterionId: "1.4.12",
50824
+ wcag: ["1.4.12"],
50825
+ title: {
50826
+ en: "Text Spacing",
50827
+ fr: "Espacement du texte"
50828
+ },
50829
+ summary: {
50830
+ en: "Users can adjust text spacing to make it easier to read. Some people need text with different spacing or font characteristics."
50831
+ },
50832
+ examples: [
50833
+ {
50834
+ lang: "html",
50835
+ bad: '<div style="font-size:100%; width:130px; height:125px; border: thin solid gray;">\n <p style="margin:0;">Now is the time for all good men to come to \n the aid of their country.</p>\n</div>\n<p style="margin:0;">The quick brown fox jumps over the lazy dog.</p>',
50836
+ good: "<style>\n/* CSS: No height property is set.*/\n</style>",
50837
+ note: {
50838
+ en: "Good: Allowing for text spacing override (C36). Bad: Failure of Success Criterion 1.4.12 due to clipped or overlapped content when text spacing is adjusted (F104)."
50839
+ }
50840
+ }
50841
+ ],
50842
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html"
50843
+ },
50844
+ {
50845
+ id: "wcag-content-on-hover-or-focus",
50846
+ criterionId: "1.4.13",
50847
+ wcag: ["1.4.13"],
50848
+ title: {
50849
+ en: "Content on Hover or Focus",
50850
+ fr: "Contenu au survol ou au focus"
50851
+ },
50852
+ summary: {
50853
+ en: "If hover or focus causes content changes, ensure interaction is predictable. More users can perceive and dismiss non-persistent content. Unpredictable temporary content can be hard for some to consume and may disrupt others."
50854
+ },
50855
+ examples: [
50856
+ {
50857
+ lang: "html",
50858
+ good: '<p>This is the \n <a class="a-and-tooltip" id="parent" href="index.html">trigger\n <span id="popup" role="tooltip">And this additional text \n gives additional context on the trigger term\n </span>\n </a>.\n Text and popup are <strong>in one link (a)</strong> element.\n</p>',
50859
+ note: {
50860
+ en: "Good: Making content on focus or hover hoverable, dismissible, and persistent (SCR39)."
50861
+ }
50862
+ }
50863
+ ],
50864
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html"
50865
+ },
50866
+ {
50867
+ id: "wcag-keyboard",
50868
+ criterionId: "2.1.1",
50869
+ wcag: ["2.1.1"],
50870
+ title: {
50871
+ en: "Keyboard",
50872
+ fr: "Clavier"
50873
+ },
50874
+ summary: {
50875
+ en: "Ensure pointer actions have a keyboard equivalent. Everything can be done with a keyboard except freehand movements. Many people rely on the keyboard interface, including blind and some mobility impaired people."
50876
+ },
50877
+ examples: [
50878
+ {
50879
+ lang: "html",
50880
+ bad: '<p><img onmousedown="nextPage();" src="nextarrow.gif" alt="Go to next page"></p>',
50881
+ good: '<a href="https://example.com">Example Site</a>',
50385
50882
  note: {
50386
- en: "A 0.15s cycle flashes about seven times a second. Honouring prefers-reduced-motion is good practice but does not by itself satisfy this criterion \u2014 the default must already be safe.",
50387
- fr: "Un cycle de 0,15 s clignote environ sept fois par seconde. Respecter prefers-reduced-motion est une bonne pratique mais ne suffit pas : le comportement par d\xE9faut doit d\xE9j\xE0 \xEAtre s\xFBr."
50883
+ en: "Good: Using HTML form controls and links (H91). Bad: Failure of Success Criterion 2.1.1 due to using only pointing-device-specific event handlers (including gesture) for a function (F54)."
50388
50884
  }
50389
50885
  }
50390
50886
  ],
50887
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html"
50888
+ },
50889
+ {
50890
+ id: "wcag-no-keyboard-trap",
50891
+ criterionId: "2.1.2",
50892
+ wcag: ["2.1.2"],
50893
+ title: {
50894
+ en: "No Keyboard Trap",
50895
+ fr: "Pas de pi\xE8ge au clavier"
50896
+ },
50897
+ summary: {
50898
+ en: "Ensure users always know how to navigate away from components. Keyboard users don't get stuck. People who rely on the keyboard often have no other means to navigate."
50899
+ },
50900
+ examples: [],
50901
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html"
50902
+ },
50903
+ {
50904
+ id: "wcag-character-key-shortcuts",
50905
+ criterionId: "2.1.4",
50906
+ wcag: ["2.1.4"],
50907
+ title: {
50908
+ en: "Character Key Shortcuts",
50909
+ fr: "Raccourcis clavier utilisant des caract\xE8res"
50910
+ },
50911
+ summary: {
50912
+ en: "Ensure character-only shortcut keys can be turned off or modified. Reduce accidental activation of keyboard shortcuts. Character-key shortcuts are easy to accidentally trigger, especially with speech input."
50913
+ },
50914
+ examples: [],
50915
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html"
50916
+ },
50917
+ {
50918
+ id: "wcag-timing-adjustable",
50919
+ criterionId: "2.2.1",
50920
+ wcag: ["2.2.1"],
50921
+ title: {
50922
+ en: "Timing Adjustable",
50923
+ fr: "R\xE9glage du d\xE9lai"
50924
+ },
50925
+ summary: {
50926
+ en: "Let users turn off, adjust, or extend time limits. Users have adequate time to complete tasks. People with disabilities may need more time to complete activities."
50927
+ },
50928
+ examples: [
50929
+ {
50930
+ lang: "html",
50931
+ bad: `<!doctype>
50932
+ <html lang="en">
50933
+ <head>
50934
+ <title>Do not use this!</title>
50935
+ <meta http-equiv="refresh" content="5; url=https://www.example.com/newpage">
50936
+ </head>
50937
+ <body>
50938
+ <p>
50939
+ If your browser supports Refresh, you'll be transported to our
50940
+ <a href="https://www.example.com/newpage">new site</a> in 5 seconds,
50941
+ otherwise select the link manually.
50942
+ </p>
50943
+ </body>
50944
+ </html>`,
50945
+ good: `<!doctype html>
50946
+ <html lang="en">
50947
+ <head>
50948
+ <meta charset="utf-8">
50949
+ <title>Stock Market Quotes</title>
50950
+ <script>
50951
+ function timeControl() {
50952
+ // set timer for 4 min 40 sec, then ask user to confirm.
50953
+ setTimeout('userCheck()', 280000);
50954
+ }
50955
+
50956
+ function userCheck() {
50957
+ // set page refresh for 20 sec
50958
+ var id=setTimeout('pageReload()', 20000);
50959
+ // If user selects "OK" the timer is reset
50960
+ // else the page will refresh from the server.
50961
+ if (confirm("This page is set to refresh in 20 seconds.
50962
+ Would you like more time?"))
50963
+ {
50964
+ clearTimeout(id);
50965
+ timeControl();
50966
+ }
50967
+ }
50968
+
50969
+ function pageReload() {
50970
+ window.location.reload(true);
50971
+ }
50972
+
50973
+ timeControl();
50974
+ </script>
50975
+ </head>
50976
+ <body>
50977
+ <h1>Stock Market Quotes</h1>
50978
+ ...
50979
+ </body>
50980
+ </html>`,
50981
+ note: {
50982
+ en: "Good: Providing a script that warns the user a time limit is about to expire (SCR16). Bad: Failure due to using meta redirect with a time limit (F40)."
50983
+ }
50984
+ }
50985
+ ],
50986
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html"
50987
+ },
50988
+ {
50989
+ id: "wcag-pause-stop-hide",
50990
+ criterionId: "2.2.2",
50991
+ wcag: ["2.2.2"],
50992
+ title: {
50993
+ en: "Pause, Stop, Hide",
50994
+ fr: "Mettre en pause, arr\xEAter, masquer"
50995
+ },
50996
+ summary: {
50997
+ en: "Let users control content changes that occur in parallel with other content. Fewer users are distracted by content that updates or moves. Some people with cognitive disabilities and attention deficits are distracted by continuous movement."
50998
+ },
50999
+ examples: [
51000
+ {
51001
+ lang: "html",
51002
+ bad: '<script>\n // blink "on" state\n function show(){\n document.getElementById("blink1").style.visibility = "visible";\n window.setTimeout(hide, 450);\n }\n \n // blink "off" state\n function hide(){\n document.getElementById("blink1").style.visibility = "hidden";\n window.setTimeout(show, 450);\n }\n\n // kick it off\n show();\n</script>',
51003
+ good: '...\n<div id="scroller">\n <p id="tag">This text will scroll and a Pause/Scroll link will be present \n when JavaScript and CSS are supported and active.</p>\n</div>\n...',
51004
+ note: {
51005
+ en: "Good: Using script to scroll content, and providing a mechanism to pause it (SCR33). Bad: Failure of Success Criterion 2.2.2 due to a script that causes a blink effect without a mechanism to stop the blinking at 5 seconds or less (F50)."
51006
+ }
51007
+ }
51008
+ ],
51009
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html"
51010
+ },
51011
+ {
51012
+ id: "wcag-three-flashes-or-below-threshold",
51013
+ criterionId: "2.3.1",
51014
+ wcag: ["2.3.1"],
51015
+ title: {
51016
+ en: "Three Flashes or Below Threshold",
51017
+ fr: "Pas plus de trois flashs ou sous le seuil critique"
51018
+ },
51019
+ summary: {
51020
+ en: "Avoid content that flashes, or keep it under thresholds. Content does not trigger seizures. Flashing content can cause migraines, dizziness, nausea, and seizures."
51021
+ },
51022
+ examples: [],
50391
51023
  reference: "https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html"
50392
51024
  },
50393
51025
  {
50394
- id: "navigation-multiple-ways",
51026
+ id: "wcag-bypass-blocks",
51027
+ criterionId: "2.4.1",
51028
+ wcag: ["2.4.1"],
51029
+ title: {
51030
+ en: "Bypass Blocks",
51031
+ fr: "Contourner des blocs"
51032
+ },
51033
+ summary: {
51034
+ en: "Provide a means of skipping repeating content. Users can more easily navigate by keyboard. Users reliant on the keyboard interface can move around pages efficiently."
51035
+ },
51036
+ examples: [
51037
+ {
51038
+ lang: "html",
51039
+ good: '<h1>Search Technical Periodicals</h1>\n <h2>Search</h2>\n <form action="/search" role="search">\n <label for="searchInput">Enter search topic:</label>\n <input id="searchInput" type="text">\n <input type="submit" value="Search">\n </form>\n <section>\n <h2>Available Periodicals</h2>\n <ul>\n <li><a href="https://example.com/pcoder">Professional Coder</a></li>\n <li><a href="https://example.com/algo">Algorithms</a></li>\n <li><a href="https://example.com/jse">Journal of Software Engineering</a></li>\n </ul>\n </section>\n <section>\n <h2>Search Results</h2>\n ... search results are returned in this section ...\n </section>',
51040
+ note: {
51041
+ en: "Good: Providing heading elements at the beginning of each section of content (H69)."
51042
+ }
51043
+ }
51044
+ ],
51045
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html"
51046
+ },
51047
+ {
51048
+ id: "wcag-page-titled",
51049
+ criterionId: "2.4.2",
51050
+ wcag: ["2.4.2"],
51051
+ title: {
51052
+ en: "Page Titled",
51053
+ fr: "Titre de page"
51054
+ },
51055
+ summary: {
51056
+ en: "Provide a descriptive page title using appropriate technology. Each web page has a meaningful title. Page titles help users identify and distinguish different pages."
51057
+ },
51058
+ examples: [
51059
+ {
51060
+ lang: "html",
51061
+ good: '<!doctype html>\n<html lang="en">\n <head>\n <title>The World Wide Web Consortium</title> \n </head>\n <body>\n ... \n </body> \n</html>',
51062
+ note: {
51063
+ en: "Good: Providing a title using the title element (H25)."
51064
+ }
51065
+ }
51066
+ ],
51067
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html"
51068
+ },
51069
+ {
51070
+ id: "wcag-focus-order",
51071
+ criterionId: "2.4.3",
51072
+ wcag: ["2.4.3"],
51073
+ title: {
51074
+ en: "Focus Order",
51075
+ fr: "Parcours du focus"
51076
+ },
51077
+ summary: {
51078
+ en: "Elements receive focus in an order that preserves meaning. Keyboard users navigate content in a correct order. Navigating a site or application with only the keyboard will make sense."
51079
+ },
51080
+ examples: [
51081
+ {
51082
+ lang: "html",
51083
+ bad: '<ol>\n <li><a href="main.html" tabindex="1">Homepage</a></li>\n <li><a href="chapter1.html" tabindex="4">Chapter 1</a></li>\n <li><a href="chapter2.html" tabindex="3">Chapter 2</a></li>\n <li><a href="chapter3.html" tabindex="2">Chapter 3</a></li>\n</ol>',
51084
+ good: '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width,\n initial-scale=1, shrink-to-fit=no">\n <title>Turbo Encabulator News</title>\n </head>\n <body>\n <main>\n <h1>All The News About Turbo Encabulators</h1>\n <button class="open-modal" type="button">Sign up to our mailing list!</button>\n </main>\n <dialog aria-labelledby="dialog-heading" id="mailing-list-dialog">\n <h1 id="dialog-heading" tabindex="-1">Sign up to our mailing list</h1>\n <form>\n <p class="req-note">All form fields are required.</p>\n <div>\n <label for="fname">First Name</label>\n <input aria-required="true" autocomplete="given-name" id="fname" type="text">\n </div>\n <div>\n <label for="lname">Last Name</label>\n <input aria-required="true" autocomplete="family-name" id="lname" type="text">\n </div>\n <div>\n <label for="email">Email address</label>\n <input aria-required="true" autocomplete="email" id="email" type="text">\n </div>\n <button class="sign-up" type="submit">Sign up</button>\n </form>\n <form method="dialog">\n <button aria-label="close" class="close-modal">&times;</button>\n </form>\n </dialog>\n </body>\n</html>',
51085
+ note: {
51086
+ en: "Good: Creating modal dialogs with the HTML dialog element (H102). Bad: Failure of Success Criterion 2.4.3 due to using tabindex to create a tab order that does not preserve meaning and operability (F44)."
51087
+ }
51088
+ }
51089
+ ],
51090
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html"
51091
+ },
51092
+ {
51093
+ id: "wcag-link-purpose-in-context",
51094
+ criterionId: "2.4.4",
51095
+ wcag: ["2.4.4"],
51096
+ title: {
51097
+ en: "Link Purpose (In Context)",
51098
+ fr: "Fonction du lien (selon le contexte)"
51099
+ },
51100
+ summary: {
51101
+ en: "Provide descriptive names or context for all links. Users understand what each link will do. People with visual and cognitive disabilities can navigate more easily."
51102
+ },
51103
+ examples: [
51104
+ {
51105
+ lang: "html",
51106
+ bad: `<p>A British businessman has racked up 2 million flyer miles and plans to
51107
+ travel on the world's first commercial tourism flights to space.</p>
51108
+ <p><a href="ff.html">Read More...</a></p>`,
51109
+ good: '<a href="routes.html">\n Current routes at Boulders Climbing Gym\n</a>',
51110
+ note: {
51111
+ en: "Good: Providing link text that describes the purpose of a link for anchor elements (H30). Bad: Failure of Success Criterion 2.4.4 due to providing link context only in content that is not related to the link (F63)."
51112
+ }
51113
+ }
51114
+ ],
51115
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html"
51116
+ },
51117
+ {
51118
+ id: "wcag-multiple-ways",
50395
51119
  criterionId: "2.4.5",
50396
51120
  wcag: ["2.4.5"],
50397
51121
  title: {
50398
- en: "More than one way to reach a page",
50399
- fr: "Plus d'un moyen d'atteindre une page"
51122
+ en: "Multiple Ways",
51123
+ fr: "Acc\xE8s multiples"
50400
51124
  },
50401
51125
  summary: {
50402
- en: "A site offers at least two ways to locate a page \u2014 for example a menu plus a search, or a sitemap. Users who find hierarchical menus hard to navigate need another route; the exception is a page that is a step in a process.",
50403
- fr: "Un site propose au moins deux moyens d'atteindre une page \u2014 par exemple un menu et une recherche, ou un plan du site. Les personnes pour qui la navigation hi\xE9rarchique est difficile ont besoin d'une autre voie ; l'exception est une page qui constitue une \xE9tape d'un processus."
51126
+ en: "Provide at least two options for reaching the same content. Users can get to content in multiple ways. Not everyone can navigate content in the same way."
51127
+ },
51128
+ examples: [],
51129
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html"
51130
+ },
51131
+ {
51132
+ id: "wcag-headings-and-labels",
51133
+ criterionId: "2.4.6",
51134
+ wcag: ["2.4.6"],
51135
+ title: {
51136
+ en: "Headings and Labels",
51137
+ fr: "En-t\xEAtes et \xE9tiquettes"
51138
+ },
51139
+ summary: {
51140
+ en: "Provide descriptive headings and labels A page's content is described in headings and labels People can orient themselves, especially those with cognitive or visual disabilities."
50404
51141
  },
50405
- impact: "medium",
50406
51142
  examples: [
50407
51143
  {
50408
51144
  lang: "html",
50409
- bad: '<nav aria-label="Main">\n <a href="/products">Products</a>\n <a href="/support">Support</a>\n</nav>',
50410
- good: '<nav aria-label="Main">\n <a href="/products">Products</a>\n <a href="/support">Support</a>\n</nav>\n<form role="search" action="/search">\n <label for="q">Search the site</label>\n <input id="q" name="q" type="search">\n <button type="submit">Search</button>\n</form>\n<a href="/sitemap">Sitemap</a>',
51145
+ good: "<h1>Disaster preparation</h1>\n<h2>Flood preparation</h2>\n<h2>Fire preparation</h2>",
50411
51146
  note: {
50412
- en: "Two mechanisms, not two links to the same menu. A search and a sitemap are each a second way; a duplicated navigation bar is not.",
50413
- fr: "Deux m\xE9canismes, pas deux liens vers le m\xEAme menu. Une recherche et un plan du site sont chacun un second moyen ; une barre de navigation dupliqu\xE9e non."
51147
+ en: "Good: Providing descriptive headings (G130)."
50414
51148
  }
50415
51149
  }
50416
51150
  ],
50417
- reference: "https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html"
51151
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html"
50418
51152
  },
50419
51153
  {
50420
- id: "focus-not-obscured",
51154
+ id: "wcag-focus-visible",
51155
+ criterionId: "2.4.7",
51156
+ wcag: ["2.4.7"],
51157
+ title: {
51158
+ en: "Focus Visible",
51159
+ fr: "Visibilit\xE9 du focus"
51160
+ },
51161
+ summary: {
51162
+ en: "Ensure each item receiving focus has a visible indicator. Users know which element has keyboard focus. Without a focus indicator, sighted keyboard users cannot operate the page."
51163
+ },
51164
+ examples: [
51165
+ {
51166
+ lang: "html",
51167
+ bad: '<input type="submit" onFocus="this.blur();">',
51168
+ good: '<nav id="main-nav">\n <ul>\n <li>Home</li>\n <li><a href="/services">Services</a></li>\n <li><a href="/projects">Projects</a></li>\n <li><a href="/demos">Demos</a></li>\n <li><a href="/about-us">About us</a></li>\n <li><a href="/contact-us">Contact us</a></li>\n <li><a href="/links">Links</a></li>\n </ul>\n<nav>',
51169
+ note: {
51170
+ en: "Good: Using CSS to change the presentation of a user interface component when it receives focus (C15). Bad: Failure of Success Criteria 2.1.1, 2.4.7, 2.4.13, and 3.2.1 due to using script to remove focus when focus is received (F55)."
51171
+ }
51172
+ }
51173
+ ],
51174
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html"
51175
+ },
51176
+ {
51177
+ id: "wcag-focus-not-obscured-minimum",
50421
51178
  criterionId: "2.4.11",
50422
51179
  wcag: ["2.4.11"],
50423
51180
  title: {
50424
- en: "The focused element is not hidden behind sticky content",
50425
- fr: "L'\xE9l\xE9ment qui a le focus n'est pas masqu\xE9 par un contenu collant"
51181
+ en: "Focus Not Obscured (Minimum)",
51182
+ fr: "Focus non masqu\xE9 (minimum)"
50426
51183
  },
50427
51184
  summary: {
50428
- en: "When a component takes keyboard focus it must not be entirely covered by author content such as a sticky header, footer or cookie banner. A keyboard user who cannot see where focus went has lost the page.",
50429
- fr: "Quand un composant re\xE7oit le focus clavier, il ne doit pas \xEAtre enti\xE8rement recouvert par un contenu de l'auteur : en-t\xEAte ou pied de page collant, bandeau cookies. Une personne naviguant au clavier qui ne voit plus o\xF9 est le focus a perdu la page."
51185
+ en: "Ensure when an item gets keyboard focus, it is at least partially visible. Keep the focused item visible. People who can't use a mouse need to see what has keyboard focus."
50430
51186
  },
50431
- impact: "high",
50432
51187
  examples: [
50433
51188
  {
50434
- lang: "css",
50435
- bad: ".site-footer {\n position: fixed;\n bottom: 0;\n height: 5rem;\n}",
50436
- good: ".site-footer {\n position: fixed;\n bottom: 0;\n height: 5rem;\n}\n\n:target,\n:focus {\n scroll-margin-bottom: 6rem;\n}",
51189
+ lang: "html",
51190
+ good: `<!doctype html>
51191
+ <html lang="en">
51192
+ <head>
51193
+ <meta charset="utf-8">
51194
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
51195
+ <title>Using CSS scroll-padding to un-obscure content</title>
51196
+ <style>
51197
+ ...
51198
+
51199
+ :root{
51200
+ --height-dialog: 400px;
51201
+ --breathing-room: 20px;
51202
+ --scroll-padding: calc(var(--height-dialog) + var(--breathing-room));
51203
+ }
51204
+
51205
+ .wrapper {
51206
+ display:grid;
51207
+ gap:1rem;
51208
+ grid-template-columns:repeat(9, 1fr);
51209
+ grid-template-rows:8rem auto minmax(10rem, max-content);
51210
+ min-block-size: 100vh;
51211
+ }
51212
+
51213
+ .wrapper > * {
51214
+ border:1px solid var(--black);
51215
+ padding:1rem;
51216
+ }
51217
+
51218
+ header {
51219
+ grid-column:1 / -1;
51220
+ grid-row:1;
51221
+ }
51222
+
51223
+ main {
51224
+ grid-column:1 / 8;
51225
+ }
51226
+
51227
+ aside {
51228
+ grid-column:8 / 10;
51229
+ }
51230
+
51231
+ footer {
51232
+ grid-column:1 / -1;
51233
+ }
51234
+
51235
+ @media (max-width:50rem) {
51236
+ main {
51237
+ grid-column:1 / -1;
51238
+ }
51239
+
51240
+ aside {
51241
+ grid-column:1 / -1;
51242
+ }
51243
+ }
51244
+
51245
+ .fixed-position-banner {
51246
+ background:var(--banner-background);
51247
+ border:3px solid var(--banner-border);
51248
+ margin-block-end:0.5rem;
51249
+ padding:1rem 1rem 5rem;
51250
+ position:relative;
51251
+ width:calc(100vw - 1rem);
51252
+ }
51253
+
51254
+ @media (min-width: 50rem) {
51255
+ html {
51256
+ padding-bottom:var(--height-dialog);
51257
+ scroll-padding-bottom:var(--scroll-padding);
51258
+ }
51259
+
51260
+ .fixed-position-banner {
51261
+ margin-block-end:0;
51262
+ position:fixed;
51263
+ inset:auto 0 0 0;
51264
+ }
51265
+ }
51266
+ ...
51267
+ </style>
51268
+ </head>
51269
+ <body>
51270
+ <dialog class="fixed-position-banner">
51271
+ <h2 tabindex="-1">Fixed-Position Banner</h2>
51272
+ <button aria-label="close fixed-position banner" class="close-banner" type="button">
51273
+ ...
51274
+ </button>
51275
+ </dialog>
51276
+ <div class="wrapper">
51277
+ <header>
51278
+ <p>Header Content</p>
51279
+ </header>
51280
+ <main>
51281
+ <h1>Main Content</h1>
51282
+ </main>
51283
+ <aside>
51284
+ <h2>Sidebar Content</h2>
51285
+ <p><a href="https://example.com">Here's an example link in the sidebar</a>.</p>
51286
+ </aside>
51287
+ <footer>
51288
+ <h2>Footer Content</h2>
51289
+ <p><a href="https://example.com">Here's an example link in the footer</a>.</p>
51290
+ </footer>
51291
+ </div>
51292
+ <script>
51293
+ window.addEventListener('DOMContentLoaded', () => {
51294
+ const elFixedBanner = document.querySelector('dialog');
51295
+ const elCloseBannerBtn = document.querySelector(".close-banner");
51296
+
51297
+ elFixedBanner.show();
51298
+
51299
+ const getDialogHeight = () => {
51300
+ const height = elFixedBanner.offsetHeight;
51301
+ document.documentElement.style.setProperty('--height-dialog', \`\${height}px\`);
51302
+ document.documentElement.style.setProperty('--breathing-room', \`\${height ? 20 : 0}px\`);
51303
+ }
51304
+
51305
+ const observer = new ResizeObserver(getDialogHeight);
51306
+ observer.observe(elFixedBanner);
51307
+
51308
+ elCloseBannerBtn.addEventListener("click", function(e){
51309
+ elFixedBanner.close();
51310
+ }, false);
51311
+ });
51312
+ </script>
51313
+ </body>
51314
+ </html>`,
50437
51315
  note: {
50438
- en: "scroll-margin keeps the browser from scrolling the focused element flush against the sticky bar. Verify it by tabbing through the page, not by reading the stylesheet \u2014 this criterion is decided on the render.",
50439
- fr: "scroll-margin emp\xEAche le navigateur de coller l'\xE9l\xE9ment focalis\xE9 contre la barre fixe. \xC0 v\xE9rifier en tabulant r\xE9ellement dans la page, pas en lisant la feuille de styles : ce crit\xE8re se tranche au rendu."
51316
+ en: "Good: Using CSS scroll-padding to un-obscure content (C43)."
50440
51317
  }
50441
51318
  }
50442
51319
  ],
50443
51320
  reference: "https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html"
50444
51321
  },
50445
51322
  {
50446
- id: "pointer-dragging-alternative",
50447
- criterionId: "2.5.7",
50448
- wcag: ["2.5.7"],
51323
+ id: "wcag-pointer-gestures",
51324
+ criterionId: "2.5.1",
51325
+ wcag: ["2.5.1"],
50449
51326
  title: {
50450
- en: "Anything you can drag, you can also do without dragging",
50451
- fr: "Tout ce qui se fait par glissement se fait aussi autrement"
51327
+ en: "Pointer Gestures",
51328
+ fr: "Gestes pour le contr\xF4le du pointeur"
50452
51329
  },
50453
51330
  summary: {
50454
- en: "A function operated by a dragging movement also works with a single pointer action \u2014 a button, a menu, a form field. Dragging needs sustained precision that users with tremor, limited dexterity or a head pointer may not have.",
50455
- fr: "Une fonctionnalit\xE9 actionn\xE9e par glissement doit aussi fonctionner par une action de pointeur simple : un bouton, un menu, un champ. Le glissement exige une pr\xE9cision continue dont ne disposent pas les personnes avec tremblements, dext\xE9rit\xE9 r\xE9duite ou pointeur de t\xEAte."
51331
+ en: "Provide single-point operation for all functions. Let users operate touchscreens with one finger and reduced gestures. Not everyone can perform complex and multi-touch gestures."
51332
+ },
51333
+ examples: [],
51334
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html"
51335
+ },
51336
+ {
51337
+ id: "wcag-pointer-cancellation",
51338
+ criterionId: "2.5.2",
51339
+ wcag: ["2.5.2"],
51340
+ title: {
51341
+ en: "Pointer Cancellation",
51342
+ fr: "Annulation de l\u2019action du pointeur"
51343
+ },
51344
+ summary: {
51345
+ en: "Make pointer cancellation predictable and consistent. Reduce accidental activation of controls by mouse or touch. Make it easier for anyone to recover from something they didn\u2019t mean to do."
50456
51346
  },
50457
- impact: "high",
50458
51347
  examples: [
50459
51348
  {
50460
51349
  lang: "html",
50461
- bad: '<ul id="queue" data-sortable="drag">\n <li draggable="true">First task</li>\n <li draggable="true">Second task</li>\n</ul>',
50462
- good: '<ul id="queue" data-sortable="drag">\n <li draggable="true">\n First task\n <button type="button" data-move="up">Move up</button>\n <button type="button" data-move="down">Move down</button>\n </li>\n</ul>',
51350
+ bad: '<!-- modal dialog with a form -->\n...\n<button id="close" type="button">Close</button>\n...',
50463
51351
  note: {
50464
- en: "The drag stays; a single-pointer path is added beside it. The exception is when dragging is essential to the function, such as freehand drawing.",
50465
- fr: "Le glissement reste ; un chemin en pointeur simple est ajout\xE9 \xE0 c\xF4t\xE9. L'exception est le cas o\xF9 le glissement est essentiel \xE0 la fonction, comme le dessin \xE0 main lev\xE9e."
51352
+ en: "Bad: Failure of Success Criterion 2.5.2 due to activating a control on the down-event (F101)."
50466
51353
  }
50467
51354
  }
50468
51355
  ],
51356
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html"
51357
+ },
51358
+ {
51359
+ id: "wcag-label-in-name",
51360
+ criterionId: "2.5.3",
51361
+ wcag: ["2.5.3"],
51362
+ title: {
51363
+ en: "Label in Name",
51364
+ fr: "\xC9tiquette dans le nom"
51365
+ },
51366
+ summary: {
51367
+ en: "Where practical, make the control\u2019s text label and name match. The visual label for controls is a trigger for speech activation. People who operate with voice interaction use the visible labels in their commands."
51368
+ },
51369
+ examples: [
51370
+ {
51371
+ lang: "html",
51372
+ bad: '<button id="sitesearch" aria-label="Find in this site">Go</button>',
51373
+ good: '<p>Go to our <a href="url-to-page-about-code.html">Code of conduct</a></p>',
51374
+ note: {
51375
+ en: "Good: Matching the accessible name to the visible label (G211). Bad: Failure due to the accessible name not containing the visible label text (F96)."
51376
+ }
51377
+ }
51378
+ ],
51379
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html"
51380
+ },
51381
+ {
51382
+ id: "wcag-motion-actuation",
51383
+ criterionId: "2.5.4",
51384
+ wcag: ["2.5.4"],
51385
+ title: {
51386
+ en: "Motion Actuation",
51387
+ fr: "Activation par le mouvement"
51388
+ },
51389
+ summary: {
51390
+ en: "Don't rely solely on device motion to control page content. Content is not dependent on a user's ability to move a device. Some people cannot hold or move a device steadily."
51391
+ },
51392
+ examples: [],
51393
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html"
51394
+ },
51395
+ {
51396
+ id: "wcag-dragging-movements",
51397
+ criterionId: "2.5.7",
51398
+ wcag: ["2.5.7"],
51399
+ title: {
51400
+ en: "Dragging Movements",
51401
+ fr: "Mouvements de glissement"
51402
+ },
51403
+ summary: {
51404
+ en: "For any action that involves dragging, provide a simple pointer alternative. Don\u2019t rely on dragging for user actions. Some people cannot use a mouse to drag items."
51405
+ },
51406
+ examples: [],
50469
51407
  reference: "https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html"
50470
51408
  },
50471
51409
  {
50472
- id: "pointer-target-size",
51410
+ id: "wcag-target-size-minimum",
50473
51411
  criterionId: "2.5.8",
50474
51412
  wcag: ["2.5.8"],
50475
51413
  title: {
50476
- en: "Pointer targets are at least 24 by 24 CSS pixels",
50477
- fr: "Les cibles de pointeur mesurent au moins 24 sur 24 pixels CSS"
51414
+ en: "Target Size (Minimum)",
51415
+ fr: "Taille de la cible (minimum)"
50478
51416
  },
50479
51417
  summary: {
50480
- en: "A target smaller than 24\xD724 CSS pixels needs enough spacing that a 24-pixel circle centred on it touches no other target. Small, tightly packed controls are hard to hit for anyone with a tremor or using a touchscreen one-handed.",
50481
- fr: "Une cible de moins de 24\xD724 pixels CSS doit \xEAtre assez espac\xE9e pour qu'un cercle de 24 pixels centr\xE9 dessus ne touche aucune autre cible. Des contr\xF4les petits et serr\xE9s sont difficiles \xE0 atteindre en cas de tremblement ou d'usage \xE0 une main sur \xE9cran tactile."
51418
+ en: "Ensure targets meet a minimum size or have sufficient spacing around them. Make controls easier to activate. Some people with physical impairments cannot click small buttons that are close together."
50482
51419
  },
50483
- impact: "medium",
50484
51420
  examples: [
50485
51421
  {
50486
- lang: "css",
50487
- bad: ".icon-button {\n width: 16px;\n height: 16px;\n padding: 0;\n}",
50488
- good: ".icon-button {\n min-width: 24px;\n min-height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}",
51422
+ lang: "html",
51423
+ good: '<nav aria-label="pagination">\n <ol>\n <li><a class="previous">previous</a></li>\n <li><a aria-current="page">1</li>\n <li><a href="/page-2">2</a></li>\n <li><a href="/page-3">3</a></li>\n <li><a href="/page-4">4</a></li>\n <li><a href="/page-5">5</a></li>\n <li><a href="/pages-6-10">next</a></li>\n </ol>\n</nav>',
50489
51424
  note: {
50490
- en: "The 24px is the target, not the icon: padding counts. Inline links in a sentence are excepted, as are targets whose size is set by the user agent.",
50491
- fr: "Les 24 px concernent la cible, pas l'ic\xF4ne : le padding compte. Les liens en ligne dans une phrase sont except\xE9s, comme les cibles dimensionn\xE9es par le navigateur."
51425
+ en: "Good: Using min-height and min-width on target container to ensure sufficient target spacing (C42)."
50492
51426
  }
50493
51427
  }
50494
51428
  ],
50495
51429
  reference: "https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html"
50496
51430
  },
50497
51431
  {
50498
- id: "navigation-consistent-help",
51432
+ id: "wcag-language-of-page",
51433
+ criterionId: "3.1.1",
51434
+ wcag: ["3.1.1"],
51435
+ title: {
51436
+ en: "Language of Page",
51437
+ fr: "Langue de la page"
51438
+ },
51439
+ summary: {
51440
+ en: "Indicate the predominant language on a page. Assistive technology can determine the language of a page. People using assistive technology get information in the correct language."
51441
+ },
51442
+ examples: [
51443
+ {
51444
+ lang: "html",
51445
+ good: '<!doctype html>\n<html lang="fr">\n<head>\n <meta charset="utf-8">\n <title>document \xE9crit en fran\xE7ais</title>\n</head>\n<body>\n ... document \xE9crit en fran\xE7ais ...\n</body>\n</html>',
51446
+ note: {
51447
+ en: "Good: Using the language attribute on the HTML element (H57)."
51448
+ }
51449
+ }
51450
+ ],
51451
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html"
51452
+ },
51453
+ {
51454
+ id: "wcag-language-of-parts",
51455
+ criterionId: "3.1.2",
51456
+ wcag: ["3.1.2"],
51457
+ title: {
51458
+ en: "Language of Parts",
51459
+ fr: "Langue d\u2019un passage"
51460
+ },
51461
+ summary: {
51462
+ en: "Indicate when words are in a different language. Assistive technology can identify the languages used within a page. People using assistive technology get information in the correct language."
51463
+ },
51464
+ examples: [],
51465
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html"
51466
+ },
51467
+ {
51468
+ id: "wcag-on-focus",
51469
+ criterionId: "3.2.1",
51470
+ wcag: ["3.2.1"],
51471
+ title: {
51472
+ en: "On Focus",
51473
+ fr: "Au focus"
51474
+ },
51475
+ summary: {
51476
+ en: "Do not change a user's context when items get focus. Content can be navigated more predictably. Content that behaves predictably is especially important to people with disabilities."
51477
+ },
51478
+ examples: [
51479
+ {
51480
+ lang: "html",
51481
+ bad: '<input type="submit" onFocus="this.blur();">',
51482
+ note: {
51483
+ en: "Bad: Failure of Success Criteria 2.1.1, 2.4.7, 2.4.13, and 3.2.1 due to using script to remove focus when focus is received (F55)."
51484
+ }
51485
+ }
51486
+ ],
51487
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html"
51488
+ },
51489
+ {
51490
+ id: "wcag-on-input",
51491
+ criterionId: "3.2.2",
51492
+ wcag: ["3.2.2"],
51493
+ title: {
51494
+ en: "On Input",
51495
+ fr: "\xC0 la saisie"
51496
+ },
51497
+ summary: {
51498
+ en: "Forewarn users if their context will change based on their input. Content can be operated more predictably. Content that behaves predictably is especially important to people with disabilities."
51499
+ },
51500
+ examples: [
51501
+ {
51502
+ lang: "html",
51503
+ bad: '<form method="get" id="form1">\n <input type="text" name="text1" size="3" maxlength="3"> - \n <input type="text" name="text2" size="3" maxlength="3"> - \n <input type="text" name="text3" size="4" maxlength="4" onchange="form1.submit();">\n </form>',
51504
+ good: '<form action="/subscribe" method="post">\n <p>Enter your email address to subscribe to our mailing list.</p>\n <label for="address">Your email address:</label>\n <input autocomplete="email" id="address" name="address" type="text"> \n <input type="submit" value="Subscribe">\n</form>',
51505
+ note: {
51506
+ en: "Good: Providing submit buttons (H32). Bad: Failure of Success Criterion 3.2.2 due to automatically submitting a form and presenting new content without prior warning when the last field in the form is given a value (F36)."
51507
+ }
51508
+ }
51509
+ ],
51510
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/on-input.html"
51511
+ },
51512
+ {
51513
+ id: "wcag-consistent-navigation",
51514
+ criterionId: "3.2.3",
51515
+ wcag: ["3.2.3"],
51516
+ title: {
51517
+ en: "Consistent Navigation",
51518
+ fr: "Navigation coh\xE9rente"
51519
+ },
51520
+ summary: {
51521
+ en: "Consistently order navigation that repeats across multiple pages. Content can be navigated more predictably. Content that behaves predictably is especially important to people with disabilities."
51522
+ },
51523
+ examples: [
51524
+ {
51525
+ lang: "html",
51526
+ bad: '<nav>\n <ul>\n <li><a href="brazil.html">Brazil</a></li>\n <li><a href="canada.html">Canada</a></li>\n <li><a href="germany.html">Germany</a></li>\n <li><a href="poland.html">Poland</a></li>\n </ul>\n</nav>',
51527
+ note: {
51528
+ en: "Bad: Failure of Success Criterion 3.2.3 due to presenting navigation links in a different relative order on different pages (F66)."
51529
+ }
51530
+ }
51531
+ ],
51532
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html"
51533
+ },
51534
+ {
51535
+ id: "wcag-consistent-identification",
51536
+ criterionId: "3.2.4",
51537
+ wcag: ["3.2.4"],
51538
+ title: {
51539
+ en: "Consistent Identification",
51540
+ fr: "Identification coh\xE9rente"
51541
+ },
51542
+ summary: {
51543
+ en: "Identify repeating functions consistently. Actions are more predictable across pages. Consistently identified actions are especially important to people with disabilities."
51544
+ },
51545
+ examples: [],
51546
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html"
51547
+ },
51548
+ {
51549
+ id: "wcag-consistent-help",
50499
51550
  criterionId: "3.2.6",
50500
51551
  wcag: ["3.2.6"],
50501
51552
  title: {
50502
- en: "Help is in the same place on every page",
50503
- fr: "L'aide se trouve au m\xEAme endroit sur chaque page"
51553
+ en: "Consistent Help",
51554
+ fr: "Aide coh\xE9rente"
50504
51555
  },
50505
51556
  summary: {
50506
- en: "If a set of pages offers help \u2014 a contact link, a phone number, a chat widget \u2014 it appears in the same relative order on each of them. Users who rely on spatial memory should not have to re-find it page by page.",
50507
- fr: "Si un ensemble de pages propose une aide \u2014 lien de contact, num\xE9ro de t\xE9l\xE9phone, widget de discussion \u2014 elle appara\xEEt dans le m\xEAme ordre relatif sur chacune. Les personnes qui s'appuient sur la m\xE9moire spatiale ne devraient pas avoir \xE0 la rechercher page par page."
51557
+ en: "Put help in the same place when it is on multiple pages. Make it easier to find help and support. People who need help can find it more easily if it's in the same place."
51558
+ },
51559
+ examples: [],
51560
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html"
51561
+ },
51562
+ {
51563
+ id: "wcag-error-identification",
51564
+ criterionId: "3.3.1",
51565
+ wcag: ["3.3.1"],
51566
+ title: {
51567
+ en: "Error Identification",
51568
+ fr: "Identification des erreurs"
51569
+ },
51570
+ summary: {
51571
+ en: "Provide descriptive notification of errors. Users know an error exists and what is wrong. Flagging errors helps people with reduced sight and cognitive disabilities resolve them."
50508
51572
  },
50509
- impact: "low",
50510
51573
  examples: [
50511
51574
  {
50512
51575
  lang: "html",
50513
- bad: '<header>\n <a href="/contact">Contact us</a>\n <nav>...</nav>\n</header>',
50514
- good: '<header>\n <nav>...</nav>\n <a href="/contact">Contact us</a>\n</header>',
51576
+ good: '<form name="signup" id="signup" method="post" action="">\n <p id="errors" aria-live="assertive"></p>\n <div>\n <label for="first">First Name (required)</label>\n <input aria-invalid="false" autocomplete="given-name" id="first" name="first" type="text">\n </div>\n <div>\n <label for="last">Last Name (required)</label>\n <input aria-invalid="false" autocomplete="family-name" id="last" name="last" type="text">\n </div>\n <div>\n <label for="email">Email (required)</label>\n <input aria-invalid="false" autocomplete="email" id="email" name="email" type="text">\n </div>\n <div>\n <button id="button" type="submit">Sign Up</button>\n </div>\n</form>',
50515
51577
  note: {
50516
- en: "Same relative order, not identical pixels \u2014 a responsive layout may move it. The criterion is about where it falls in the page, consistently.",
50517
- fr: "M\xEAme ordre relatif, pas les m\xEAmes pixels : une mise en page responsive peut le d\xE9placer. Le crit\xE8re porte sur sa position dans la page, de fa\xE7on constante."
51578
+ en: "Good: Using aria-invalid to Indicate An Error Field (ARIA21)."
50518
51579
  }
50519
51580
  }
50520
51581
  ],
50521
- reference: "https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html"
51582
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html"
50522
51583
  },
50523
51584
  {
50524
- id: "forms-error-suggestion",
51585
+ id: "wcag-labels-or-instructions",
51586
+ criterionId: "3.3.2",
51587
+ wcag: ["3.3.2"],
51588
+ title: {
51589
+ en: "Labels or Instructions",
51590
+ fr: "\xC9tiquettes ou instructions"
51591
+ },
51592
+ summary: {
51593
+ en: "Provide labels or instructions for inputs. Users know what information to enter. Everyone, especially those with cognitive disabilities, will know how to respond."
51594
+ },
51595
+ examples: [
51596
+ {
51597
+ lang: "html",
51598
+ good: '<label for="firstname">First name (required):</label> \n<input id="firstname" name="firstname" type="text">',
51599
+ note: {
51600
+ en: "Good: Indicating required form controls using label or legend (H90)."
51601
+ }
51602
+ }
51603
+ ],
51604
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html"
51605
+ },
51606
+ {
51607
+ id: "wcag-error-suggestion",
50525
51608
  criterionId: "3.3.3",
50526
51609
  wcag: ["3.3.3"],
50527
51610
  title: {
50528
- en: "An error message says how to fix it",
50529
- fr: "Un message d'erreur indique comment corriger"
51611
+ en: "Error Suggestion",
51612
+ fr: "Suggestion apr\xE8s une erreur"
50530
51613
  },
50531
51614
  summary: {
50532
- en: 'When input is rejected and a correction is known, the message names it. "Invalid" tells the user only that they failed; the expected format, or the nearest valid value, tells them what to do next.',
50533
- fr: "Quand une saisie est refus\xE9e et qu'une correction est connue, le message l'indique. \xAB Invalide \xBB n'apprend \xE0 l'utilisateur que son \xE9chec ; le format attendu, ou la valeur valide la plus proche, lui dit quoi faire."
51615
+ en: "Where errors are detected, suggest known ways to correct them. Users get suggestions on how to resolve errors. People can address errors faster and with reduced effort."
50534
51616
  },
50535
- impact: "high",
50536
51617
  examples: [
50537
51618
  {
50538
51619
  lang: "html",
50539
- bad: '<input id="born" name="born" aria-describedby="born-err">\n<p id="born-err">Invalid input.</p>',
50540
- good: '<label for="born">Date of birth</label>\n<input id="born" name="born" aria-describedby="born-err" aria-invalid="true">\n<p id="born-err">Enter the date as DD/MM/YYYY, for example 21/03/1994.</p>',
51620
+ good: `<dialog aria-labelledby="alert-heading" id="date-alert" role="alertdialog">
51621
+ <h1 id="alert-heading">Error</h1>
51622
+ <p>Employee's Birth Date is after their hire date. Please verify the birth date and hire date.</p>
51623
+ <button command="close" commandfor="date-alert" type="button">Return to page and correct error</button>
51624
+ </dialog>`,
50541
51625
  note: {
50542
- en: "The suggestion must be programmatically associated with the field, not merely nearby \u2014 aria-describedby is what makes a screen reader announce it with the input.",
50543
- fr: "La suggestion doit \xEAtre associ\xE9e programmatiquement au champ, pas seulement plac\xE9e \xE0 c\xF4t\xE9 : c'est aria-describedby qui la fait annoncer avec la saisie."
51626
+ en: "Good: Using aria-alertdialog to Identify Errors (ARIA18)."
50544
51627
  }
50545
51628
  }
50546
51629
  ],
50547
51630
  reference: "https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html"
50548
51631
  },
50549
51632
  {
50550
- id: "forms-redundant-entry",
51633
+ id: "wcag-error-prevention-legal-financial-data",
51634
+ criterionId: "3.3.4",
51635
+ wcag: ["3.3.4"],
51636
+ title: {
51637
+ en: "Error Prevention (Legal, Financial, Data)",
51638
+ fr: "Pr\xE9vention des erreurs (juridiques, financi\xE8res, de donn\xE9es)"
51639
+ },
51640
+ summary: {
51641
+ en: "Provide ways for users to confirm, correct, or reverse important submissions. Users can avoid submitting incorrect important information. People with disabilities may be more likely to make mistakes, or not notice them."
51642
+ },
51643
+ examples: [],
51644
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html"
51645
+ },
51646
+ {
51647
+ id: "wcag-redundant-entry",
50551
51648
  criterionId: "3.3.7",
50552
51649
  wcag: ["3.3.7"],
50553
51650
  title: {
50554
- en: "Information already entered is not asked for again",
50555
- fr: "Une information d\xE9j\xE0 saisie n'est pas redemand\xE9e"
51651
+ en: "Redundant Entry",
51652
+ fr: "Saisie redondante"
50556
51653
  },
50557
51654
  summary: {
50558
- en: "Within a process, information the user already gave is auto-populated or offered for selection rather than retyped. Re-entry is a real barrier for users with memory impairments and for anyone typing with difficulty.",
50559
- fr: "Au sein d'un processus, une information d\xE9j\xE0 fournie est pr\xE9-remplie ou propos\xE9e \xE0 la s\xE9lection plut\xF4t que ressaisie. La ressaisie est un obstacle r\xE9el en cas de troubles de la m\xE9moire et pour toute personne dont la saisie est difficile."
51655
+ en: "Don't ask for the same information twice in the same activity. Make it easier for users to complete multi-step processes. Some people with cognitive disabilities have difficulty remembering what they entered before."
51656
+ },
51657
+ examples: [],
51658
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html"
51659
+ },
51660
+ {
51661
+ id: "wcag-accessible-authentication-minimum",
51662
+ criterionId: "3.3.8",
51663
+ wcag: ["3.3.8"],
51664
+ title: {
51665
+ en: "Accessible Authentication (Minimum)",
51666
+ fr: "Authentification accessible (minimum)"
51667
+ },
51668
+ summary: {
51669
+ en: "Don't make people solve, recall, or transcribe something to log in. Make logins possible with less mental effort. Some people with cognitive disabilities cannot solve puzzles, memorize a username and password, or retype one-time passcodes."
50560
51670
  },
50561
- impact: "medium",
50562
51671
  examples: [
50563
51672
  {
50564
51673
  lang: "html",
50565
- bad: '<fieldset>\n <legend>Delivery address</legend>\n <label for="d-street">Street</label>\n <input id="d-street" name="d-street">\n</fieldset>',
50566
- good: '<fieldset>\n <legend>Delivery address</legend>\n <label for="same">\n <input type="checkbox" id="same" name="same" checked>\n Same as my billing address\n </label>\n <label for="d-street">Street</label>\n <input id="d-street" name="d-street" value="12 Rue de Rivoli">\n</fieldset>',
51674
+ good: '<form method="post" action="login">\n <div>\n <label for="email">Email</label>\n <input autocomplete="email" id="email" type="email" ...>\n </div>\n <div>\n <label for="password">Password</label>\n <input autocomplete="current-password" id="password" type="password" ...>\n </div>\n <input type="submit" value="Login">\n </div>\n</form>',
50567
51675
  note: {
50568
- en: "Exceptions exist where re-entry is essential \u2014 confirming a password, or a memory test. Convenience is not one of them.",
50569
- fr: "Des exceptions existent quand la ressaisie est essentielle : confirmation de mot de passe, test de m\xE9moire. La commodit\xE9 n'en fait pas partie."
51676
+ en: "Good: Providing properly marked up email and password inputs (H100)."
50570
51677
  }
50571
51678
  }
50572
51679
  ],
50573
- reference: "https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html"
51680
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html"
50574
51681
  },
50575
51682
  {
50576
- id: "forms-accessible-authentication",
50577
- criterionId: "3.3.8",
50578
- wcag: ["3.3.8"],
51683
+ id: "wcag-name-role-value",
51684
+ criterionId: "4.1.2",
51685
+ wcag: ["4.1.2"],
50579
51686
  title: {
50580
- en: "Signing in does not require a cognitive test",
50581
- fr: "La connexion n'exige pas un test cognitif"
51687
+ en: "Name, Role, Value",
51688
+ fr: "Nom, r\xF4le et valeur"
50582
51689
  },
50583
51690
  summary: {
50584
- en: "No step of authentication may depend on remembering, transcribing or solving a puzzle unless an alternative exists. Blocking paste into a password field is the most common way sites fail this: it breaks every password manager.",
50585
- fr: "Aucune \xE9tape d'authentification ne doit reposer sur la m\xE9morisation, la transcription ou la r\xE9solution d'une \xE9nigme, sauf alternative. Bloquer le collage dans un champ de mot de passe est l'\xE9chec le plus courant : cela casse tous les gestionnaires de mots de passe."
51691
+ en: "Give components correct names, roles, states, and values. People using assistive technology understand all components. Assistive technology only works well when code is done properly."
50586
51692
  },
50587
- impact: "high",
50588
51693
  examples: [
50589
51694
  {
50590
51695
  lang: "html",
50591
- bad: '<input type="password" id="pw" name="pw" onpaste="return false" autocomplete="off">',
50592
- good: '<label for="pw">Password</label>\n<input type="password" id="pw" name="pw" autocomplete="current-password">',
51696
+ bad: `<p>
51697
+ <span onclick="toggleCheckbox('chkbox')">
51698
+ <img src="unchecked.gif" id="chkbox" alt=""> Include Signature
51699
+ </span>
51700
+ </p>`,
51701
+ good: '<a href="https://example.com">Example Site</a>',
50593
51702
  note: {
50594
- en: 'autocomplete="current-password" lets a password manager fill the field, which is the documented way to satisfy this criterion. A puzzle CAPTCHA needs a non-cognitive alternative beside it.',
50595
- fr: 'autocomplete="current-password" permet \xE0 un gestionnaire de remplir le champ, ce qui est la fa\xE7on document\xE9e de satisfaire ce crit\xE8re. Un CAPTCHA \xE0 \xE9nigme exige une alternative non cognitive \xE0 c\xF4t\xE9.'
51703
+ en: "Good: Using HTML form controls and links (H91). Bad: Failure of Success Criterion 4.1.2 due to using script to make div or span a user interface control in HTML without providing a role for the control (F59)."
50596
51704
  }
50597
51705
  }
50598
51706
  ],
50599
- reference: "https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html"
51707
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html"
51708
+ },
51709
+ {
51710
+ id: "wcag-status-messages",
51711
+ criterionId: "4.1.3",
51712
+ wcag: ["4.1.3"],
51713
+ title: {
51714
+ en: "Status Messages",
51715
+ fr: "Messages d\u2019\xE9tat"
51716
+ },
51717
+ summary: {
51718
+ en: "Let assistive technology notify users about status changes that don't take focus. Make users aware of important changes in content. People who do not see messages need to be informed about them."
51719
+ },
51720
+ examples: [
51721
+ {
51722
+ lang: "html",
51723
+ good: '<div id="activityLog" role="log">\n <h4 id="logHeading">Recent activity</h4>\n <ul id="logentries"">\n <li>08:03 UserX logged off</li>\n </ul>\n</div>',
51724
+ note: {
51725
+ en: "Good: Using role=log to identify sequential information updates (ARIA23)."
51726
+ }
51727
+ }
51728
+ ],
51729
+ reference: "https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html"
50600
51730
  }
50601
51731
  ]
50602
51732
  };
@@ -50606,8 +51736,8 @@ var datasets = /* @__PURE__ */ new Map();
50606
51736
  function add(ds) {
50607
51737
  datasets.set(ds.pack, ds);
50608
51738
  }
50609
- add(wcag_default2);
50610
51739
  add(rgaa_default2);
51740
+ add(wcag_default2);
50611
51741
  function registerRuntimeGuidance(ds) {
50612
51742
  add(ds);
50613
51743
  }