arc-templated-issues 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,912 @@
1
+ # ARC Web Accessibility Issue Templates
2
+
3
+ > Generated on 2026-04-03
4
+
5
+ ---
6
+
7
+ # Control lacks a label in the code
8
+
9
+ ## Severity
10
+ 1-Critical
11
+
12
+ ## Suggested Priority
13
+ Blocker
14
+
15
+ -------- copy below ---------
16
+
17
+ [URL/Path]
18
+ ######
19
+
20
+ [Steps to reproduce]
21
+ ######
22
+
23
+ [Element]
24
+ The ##### located #####
25
+
26
+ [What is the issue]
27
+ The ###### control lacks a label in the code making it difficult for screen reader users to understand its purpose. A meaningful label is not announced.
28
+
29
+ [Why it is important]
30
+ Accessible labels provide critical information about a button’s purpose, enabling users of assistive technologies [such as voice recognition and screen readers] to navigate and interact with the application effectively. Without labels, users may face difficulties understanding what actions buttons will perform, leading to frustration and limited functionality.
31
+
32
+ [Code reference]
33
+ (## Tester note: grab code snippet from experience and delete me ##)
34
+ {code:html}
35
+ <button></button>
36
+ {code}
37
+
38
+ [How to fix]
39
+ Ensure that the control has an accessible label. There are many ways this is defined in the code. The control’s nested text or alternative text of images within controls can be used as the accessible name of the control.
40
+
41
+ When on-screen text is not available, authors can use another method to provide an accessible name, such as by using {{aria-labelledby}}, {{aria-label}}, or {{title}} attribute (not recommended in all cases), to provide the accessible name. The {{aria-labelledby}} attribute must contain one or more IDs of elements that label the button. The aria-label attribute is best when there is no on-screen label. Authors should place the string that labels the form field in the aria-label attribute.
42
+
43
+ Authors can also identify an accessible name using an associated label element whenever an on-screen label is present. The label element's value is then explicitly associated with the relevant form field using the for and {{ID}} attributes. Use of the label element provides an added benefit as it increases the target area that users can click to focus the form field.
44
+
45
+ [Compliant code example]
46
+ (## Tester note: include real code example or just leave generic examples below and delete me ##)
47
+ {code:html}
48
+ <button>My Account</button>
49
+ {code}
50
+
51
+ {code:html}
52
+ <a href=”/facebook” aria-label=”Facebook”><svg>...</svg></button>
53
+ {code}
54
+
55
+ {code:html}
56
+ <span id=”example”>Some text</span>
57
+ <a href=”/facebook” aria-labelledby=”example”><svg>...</svg></button>
58
+ {code}
59
+
60
+ [How to test]
61
+ Screen reader testing: Use a screen reader to navigate to the control and verify that the correct label is announced.
62
+
63
+ Visual inspection: Ensure the button has a clear, descriptive label. Check that either {{aria-label}}, {{aria-labelledby}}, or {{title}} are present in the code, and that the label reflects the button's purpose.
64
+
65
+ Use the Chrome DevTools Accessibility Inspector to verify that the Name property has been properly calculated. Open DevTools > Choose Accessibility Pane > Inspect element > review Computed Properties
66
+
67
+ [MagentaA11y]
68
+ https://www.magentaa11y.com/how-to-test/link-button/
69
+ https://www.magentaa11y.com/checklist-web/link/
70
+ https://www.magentaa11y.com/checklist-web/button/
71
+
72
+ [WCAG]
73
+ (## Tester note: Choose or add and delete me ##)
74
+ 2.4.4: Link Purpose (In Context) (A)
75
+ 2.4.6: Headings and Labels (AA)
76
+ 2.5.3: Label in Name (AA)
77
+ 4.1.2 Name, Role, Value (A)
78
+
79
+ [Operating system]
80
+ ######
81
+
82
+ [Browser]
83
+ ######
84
+
85
+ [Assistive technology]
86
+ Keyboard
87
+
88
+ ---
89
+
90
+ # Heading levels incorrectly nested
91
+
92
+ ## Severity
93
+ 3-Average
94
+
95
+ ## Suggested Priority
96
+ Medium
97
+
98
+ -------- copy below ---------
99
+
100
+ [URL/Path]
101
+ ######
102
+
103
+ [Steps to reproduce]
104
+ ######
105
+
106
+ [Element]
107
+ (## Tester note: Describe where the heading is in the UI and delete me ##)
108
+
109
+ [What is the issue]
110
+ The following heading level nesting example does not meet the requirements for logically structured heading hierarchy:
111
+
112
+ The heading levels on this page are incorrectly nested, meaning that headings do not follow a logical order. For example, a {{<h3>}} may appear before a {{<h2>}}, or a {{<h4>}} may follow a {{<h2>}} without an appropriate {{<h3>}} in between. This disrupts the hierarchical structure of the page and makes it harder for users to understand the page content and navigate effectively.
113
+
114
+ [Why it is important]
115
+ Proper heading structure is crucial for accessibility as it helps assistive technologies, such as screen readers, understand and convey the relationships between different sections of content. Incorrectly nested headings can confuse users, making it difficult for them to grasp the organization of the page. This issue impacts people who rely on headings for navigation, especially those using screen readers or keyboard navigation, preventing them from efficiently moving through content. WCAG 1.3.1 (Info and Relationships) requires that information, structure, and relationships be conveyed clearly.
116
+
117
+ [Code reference]
118
+ (## Tester note: CSS code references can be helpful here – delete me ##)
119
+ {code:css}
120
+ ...
121
+ {code}
122
+
123
+ [How to fix]
124
+
125
+ Ensure that heading levels are used in a logical, hierarchical order. For example:
126
+
127
+ - An {{<h1>}} should be the first heading on the page.
128
+
129
+ - {{<h2>}} headings should follow {{<h1>}}, and {{<h3>}} should follow {{<h2>}}.
130
+
131
+ - Do not skip heading levels (e.g., {{<h1>}} skipping to {{<h3>}} is incorrect; it should be {{<h1>}} then {{<h2>}} then {{<h3>}}).
132
+
133
+ - A single heading should not use multiple levels of nested heading elements (e.g., {{<h1>}}T-Mobile {{<h3>}}iPhone Deals{{/h3}}{{/h1}} is incorrect; it should be simplified to use a single heading level {{<h1>}}T-Mobile iPhone Deals {{</h1>}}), and inner text can font sizing and styling be further customized using CSS styles.
134
+
135
+ Use the correct HTML elements for headings: {{<h1>}}, {{<h2>}}, {{<h3>}}, etc. Avoid using styling (like font size) alone to create the appearance of a heading.
136
+
137
+ Repeating patterns of headings are allowed so long as they follow a logical sequence (example: {{<h2>}},{{<h3>}},{{<h2>}},{{<h3>}})
138
+
139
+ [Compliant code example]
140
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
141
+ {code:html}
142
+
143
+ <h1>My favorite taco recipe</h1>
144
+
145
+ <!-- Author's entire life story as it relates to tacos -->
146
+
147
+ <h2>Ingredients</h2>
148
+
149
+ <!-- List of ingredients -->
150
+
151
+ <h2>Steps</h2>
152
+
153
+ <h3>Preparing the protein</h3>
154
+
155
+ <!-- List of instructions -->
156
+
157
+ <h3>Preparing the vegetables</h3>
158
+
159
+ <!-- List of instructions -->
160
+
161
+ <h3>Assembly and plating</h3>
162
+
163
+ <!-- List of instructions-->
164
+
165
+ <h2>Nutrition information</h2>
166
+
167
+ <!-- List of nutrition info -->
168
+
169
+ <h2>Related recipes</h2>
170
+
171
+ <!-- List of related recipes -->
172
+ {code}
173
+
174
+ [How to test]
175
+
176
+ Automated:
177
+ - Use an accessibility testing tool such as Axe DevTools or the Level Access extension to detect any heading structure issues. These tools will flag incorrect nesting of heading levels.
178
+
179
+ - Follow-up with manual verification of the heading hierarchy in the HTML source code. (See Manual checks below.)
180
+
181
+ Manual:
182
+
183
+ - Inspect the page's HTML code to check the order of the heading elements (<h1>, <h2>, <h3>, etc.).
184
+
185
+ - Navigate through the page using a screen reader or keyboard shortcuts (e.g., arrow keys or heading shortcut keys) to verify that headings are in a logical order and the page content is easy to understand.
186
+
187
+ - Review the document structure using browser developer tools to ensure headings follow the correct hierarchy.
188
+
189
+ [MagentaA11y]
190
+
191
+ https://www.magentaa11y.com/checklist-web/heading/
192
+
193
+ [Resources]
194
+
195
+ https://www.w3.org/WAI/tutorials/page-structure/headings
196
+
197
+ [WCAG]
198
+ 1.3.1 Info and Relationships (Level A)
199
+
200
+ [Operating system]
201
+ ######
202
+
203
+ [Browser]
204
+ ######
205
+
206
+ [Assistive technology]
207
+ ######
208
+
209
+ ---
210
+
211
+ # Images should be marked as decorative
212
+
213
+ ## Severity
214
+ Low
215
+
216
+ ## Suggested Priority
217
+ Low
218
+
219
+ -------- copy below ---------
220
+
221
+ [URL/Path]
222
+ ######
223
+
224
+ [Steps to reproduce]
225
+ ######
226
+
227
+ [Element]
228
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
229
+
230
+ [What is the issue]
231
+ The (## Tester note: describe image here – delete me ##) image/icon does not provide meaningful information, however, it is not marked as decorative.
232
+
233
+ [Why it is important]
234
+ When images are not properly marked as decorative, screen readers may announce them unnecessarily. This creates noise, cognitive overload, or potentially conveys incorrect information for users who are blind or rely on assistive technologies. Properly marking images as decorative ensures the images are skipped by assistive technologies, which provides a cleaner overall experience for screen reader users.
235
+
236
+ [Code reference]
237
+ (## Tester note: CSS code references can be helpful here – delete me ##)
238
+ {code}
239
+ ...
240
+ {code}
241
+
242
+ [How to fix]
243
+
244
+ Ensure standard {{<img>}} elements have an empty {{alt=””}} attribute or {{alt (null)}}.
245
+ Ensure {{<svg>}} elements have {{aria-hidden=”true” focusable="false"}} attributes.
246
+ [Compliant code example]
247
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
248
+ {code:html}
249
+
250
+ <img src="image.jpg" alt="">
251
+
252
+ {code}
253
+
254
+ {code:html}
255
+
256
+ <svg aria-hidden="true">...</svg>
257
+
258
+ {code}
259
+
260
+ [How to test]
261
+
262
+ Automated: Use an automated scanning tool like Axe, Level Access, or Lighthouse to scan for images that are missing {{alt}} attributes. Decorative images still require an empty {{alt}} attribute, so if an image is missing an {{alt}} attribute all together it will be flagged by a scanner. A scanner will not flag images that should be treated as decorative, so manual testing is necessary.
263
+
264
+
265
+ Manual: Use a screen reader (e.g., NVDA, JAWS, VoiceOver) to navigate to images on the page with your arrow keys, or try jumping directly to images with the NVDA/JAWS keyboard shortcut key {{G}}, or Voiceover keyboard shortcut keys {{VO key + Command + G}}. Ensure decorative images are being skipped over and not announced by the screen reader.
266
+
267
+ [MagentaA11y]
268
+ www.magentaa11y.com/checklist-web/image-decorative/
269
+
270
+ www.magentaa11y.com/how-to-test/images/
271
+
272
+ [WCAG]
273
+ 1.1.1 Non-Text Content (A)
274
+
275
+ [Operating system]
276
+ ######
277
+
278
+ [Browser]
279
+ ######
280
+
281
+ [Assistive technology]
282
+ JAWS
283
+ NVDA
284
+ VoiceOver
285
+
286
+ [Additional Resources]
287
+
288
+ https://www.w3.org/WAI/tutorials/images/decision-tree/
289
+
290
+ ---
291
+
292
+ # Interactive element is not keyboard accessible
293
+
294
+ ## Severity
295
+ 1-Critical
296
+
297
+ ## Suggested Priority
298
+ Blocker
299
+
300
+ -------- copy below ---------
301
+
302
+ [URL/Path]
303
+ ######
304
+
305
+ [Steps to reproduce]
306
+ ######
307
+
308
+ [Element]
309
+ The ##### button located #####
310
+
311
+ [What is the issue]
312
+ (## Tester note: choose one and delete me ##)
313
+ The ###### is not keyboard accessible. Keyboard users are not able to reach the control in any way or activate it.
314
+
315
+ The ###### is not keyboard accessible. Keyboard users are able to reach the control, but nothing happens when those users try to activate the control.
316
+
317
+ [Why it is important]
318
+ All functionalities must be operable using only a keyboard or similar input method. Some users rely exclusively on keyboards, screen readers, or alternative input devices, such as switch controls or adaptive keyboards, to navigate and interact with websites. Ensuring that all interactive elements, such as buttons, links, and form controls, can be accessed and activated via keyboard is very important for accessibility. Users with mobility or dexterity-related disabilities as well as screen reader users will benefit from keyboard accessible interfaces.
319
+
320
+ [Code reference]
321
+ (## Tester note: show actual code and delete me ##)
322
+ {code:html}
323
+ ...
324
+ {code}
325
+
326
+ [How to fix]
327
+ - Ensure that all interactive elements are keyboard operable and allow for keyboard focus. Keyboard users should be able to tab to the control and activate it with the keyboard alone.
328
+ - Use an element that is naturally focusable such as a {{<button>}} or {{<a>}}.
329
+ - In cases where a negative {{tabindex}} has been used, remove {{tabindex="-1"}} from the element.
330
+ - Ensure the button does not own {{aria-hidden="true"}}
331
+ - Ensure anchor tags / links own valid {{href}} attribute values.
332
+
333
+ [Compliant code example]
334
+ (## Tester note: show a real code fragment here or use generic examples below and delete me ##)
335
+ {code:html}
336
+ <button>My Account</button>
337
+ {code}
338
+
339
+ {code:html}
340
+ <a href=”/some-page”>Learn more about MagentaA11y</a>
341
+ {code}
342
+
343
+ [How to test]
344
+ Keyboard: Using the keyboard alone, tab to the control. Focus should move to the control. Try activating the control, the control should work with the enter key and spacebar if it is a button and just the enter key if it is a link.
345
+
346
+ Manual inspection: Using Chrome DevTools, inspect the control and verify that the {{tabindex=”-1”}} and {{aria-hidden=”true”}} attributes are not present.
347
+
348
+ [MagentaA11y]
349
+ https://www.magentaa11y.com/how-to-test/keyboard-focus/
350
+ https://www.magentaa11y.com/checklist-web/button/
351
+ https://www.magentaa11y.com/checklist-web/link/
352
+
353
+ [WCAG]
354
+ (## Tester note: Choose or add and delete me ##)
355
+ 2.1.1 Keyboard (A)
356
+ 2.4.3 Focus Order (A)
357
+
358
+ [Operating system]
359
+ ######
360
+
361
+ [Browser]
362
+ ######
363
+
364
+ [Assistive technology]
365
+ Keyboard
366
+
367
+ ---
368
+
369
+ # [WIP] Link text is not descriptive or lacks purpose
370
+
371
+ ## Severity
372
+ 3-Average
373
+
374
+ ## Suggested Priority
375
+ Medium
376
+
377
+ (## Tester note: review guidance prior to logging issue ##)
378
+
379
+ 1) 1.3.1 Information & Relationships does NOT apply to buttons. Buttons can have repetitive names on the same page as long as they are doing the same action. Always inspect the code to learn whether something is coded as a link or button in HTML. `role="button"` on a link counts as a Button.
380
+
381
+ 2) If the link is nested within its related content within the same list item {{<li>}}, {{<p>}}, or table cell {{<td>}} then the link has programmatic determination and satisfies 1.3.1 Information & Relationships.
382
+
383
+ -------- copy below ---------
384
+
385
+ [URL/Path]
386
+ ######
387
+
388
+ [Steps to reproduce]
389
+ ######
390
+
391
+ [Element]
392
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
393
+
394
+ [What is the issue]
395
+ The ###### link text is not descriptive enough to convey its purpose or destination. For example, links such as "Shop now", "Buy now", "Click here", or "Read more" lack context when read independently.
396
+
397
+ [Why it is important]
398
+ Descriptive link text improves navigation for all users, especially for people using assistive technologies such as screen readers. These users often navigate links out of context, so the purpose of each link must be clear without relying on surrounding content.
399
+
400
+ When multiple links on a screen have the same visible text label but different targets, then providing distinguishing context becomes very important.
401
+
402
+ Voice Recognition users benefit from having meaningful link purpose in the code so that they can activate controls by voice alone. Imagine saying "click 'Learn more'" and seeing that there are 6 options for voice control to choose from. This is the equivalent of making someone do multiple clicks to perform a single action!!
403
+
404
+ [Code reference]
405
+ (## Tester note: CSS code references can be helpful here – delete me ##)
406
+ {code:html}
407
+ ...
408
+ {code}
409
+
410
+ [How to fix]
411
+ Update the link text to describe the link's purpose or destination. For example, replace "Buy Now" with "Buy our new iPhone 93 Pro" or "Learn more about our services." Ensure that links with identical destinations have consistent text. Avoid overly verbose descriptions. This may be a content change so partner with design or key stakeholders before changing copy.
412
+
413
+ If the generic link text itself cannot be changed then apply a code-based fix such as proper use of {{aria-describedby}}, {{aria-label}}, {{aria-labelledby}} so that context is included in the link's label in the code.
414
+
415
+ If the link is pointing to files like PDF or opening pages in new windows, it is best practice to include this information within the link's accessible name in some way.
416
+
417
+ [Compliant code example]
418
+ (## Tester note: tester can leave these generic examples in place or author a tailored solution based on the Code Reference (preferred) ##)
419
+
420
+ **aria-label:** {{aria-label}} attribute value includes the visible text and it is front-loaded followed by a comma and then the additional context which should match nearby text and be super meaningful.
421
+ {code:html}
422
+ <h2>iPhone 24 Pro</h2>
423
+ <a href="#" aria-label="Buy now, iPhone 24 Pro">Buy Now</a>
424
+ {code}
425
+
426
+ **aria-describedby:** Nearby text content is programmatically associated.
427
+ {code:html}
428
+ <h2 id="unique-id-0">Some cool heading</h2>
429
+ <a href="#" aria-describedby="unique-id-0">Buy Now</a>
430
+ {code}
431
+
432
+ **aria-labelledby:** The control itself is referenced as well as other nearby content via {{aria-labelledby}}.
433
+ {code:html}
434
+ <h2 id="unique-id-0">Some cool heading</h2>
435
+ <a href="#" aria-labelledby="unique-id-1 unique-id-0" id="unique-id-1">Buy Now</a>
436
+ {code}
437
+
438
+ **Link to file:**
439
+ {code:html}
440
+ <a href="#">Download the awesome manual (PDF)</a>
441
+ {code}
442
+
443
+ **Opens in a new window:**
444
+ {code:html}
445
+ <a href="#" aria-label="Learn more, iPhone 24 Pro, opens in a new window">Learn More</a>
446
+ {code}
447
+
448
+ [How to test]
449
+ Automated: Use tools such as Axe DevTools or the Level Access extension to identify links with generic text.
450
+
451
+ Manual:
452
+ - Review all links and ensure the text clearly conveys their purpose out of context.
453
+ - Using Chrome DevTools Accessibility Inspector, inspect the link in the HTML. The Name property value in Computed Properties (in conjunction with any Description property text) should be meaningful.
454
+ - Use a screen reader to navigate the page by links (e.g., NVDA's "Links List"). Confirm the text is descriptive and unambiguous.
455
+
456
+ [MagentaA11y]
457
+ https://www.magentaa11y.com/checklist-web/link/
458
+
459
+ [Resources]
460
+ ######
461
+
462
+ [WCAG]
463
+ 2.4.4 Link Purpose (In Context) (A)
464
+ 2.5.3 Label in Name (A)
465
+
466
+ [Operating system]
467
+ ######
468
+
469
+ [Build Version]
470
+ ######
471
+
472
+ [Browser]
473
+ ######
474
+
475
+ [Assistive technology]
476
+ JAWS
477
+ NVDA
478
+ VoiceOver
479
+ TalkBack
480
+
481
+ ---
482
+
483
+ # [WIP] Non-text content does not meet required 3:1 contrast
484
+
485
+ ## Severity
486
+ 2-Severe
487
+
488
+ ## Suggested Priority
489
+ High
490
+
491
+ -------- copy below ---------
492
+
493
+ [URL/Path]
494
+ ######
495
+
496
+ [Steps to reproduce]
497
+ ######
498
+
499
+ [Element]
500
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
501
+
502
+ The ##### located at #####
503
+
504
+ [What is the issue]
505
+ The ###### lacks 3:1 contrast which is required for non-text content that is important, informative, and contains context (aka not decorative).
506
+
507
+ [Color reference]
508
+ (## Tester note: fill out hex codes for XXXXXX which is the foreground or non-text content color and YYYYYY which is the background or adjacent color ##)
509
+
510
+ Non-text content color XXXXXX fails 3:1 contrast against YYYYYY background.
511
+ https://webaim.org/resources/contrastchecker/?fcolor=000000&bcolor=FFFFFF
512
+
513
+ [Why it is important]
514
+ Non-text content such as icons, images of text, graphics, etc. that contain important information must have contrast in order for the most possible users to be able to see them. High contrast helps users with vision disabilities such as low vision users, as well as color vision deficiencies such as red-green color blindness, blue-yellow color blindness, and complete color blindness. 3:1 contrast is actually about calculating the hue contrast such that even if you cannot make out color at all, the lightness/darkness of the colors will be sufficient for a user to tell them apart.
515
+
516
+ [How to fix]
517
+ Refer to the WebAIM Contrast checker — https://webaim.org/resources/contrastchecker/?fcolor=000000&bcolor=FFFFFF — to find a color that will have 3:1 contrast.
518
+
519
+ Consider TDDS color schemes as well: https://www.figma.com/design/HIvbo95KykcH9kuhwcVgky/1.-Foundations?node-id=1-480151&p=f&m=dev
520
+
521
+ Note: Fix will likely require consultation with a designer to find a branded and TDDS compliant color.
522
+
523
+ [Compliant code example]
524
+ n/a — this is typically a design change
525
+
526
+ [How to test]
527
+ Automated:
528
+ - Run an automated scan tool such as LevelAccess, Axe, or Lighthouse. Note, however, that these tools regularly miss these types of contrast issues. Manual evaluation is recommended.
529
+ - Input hex codes into WebAIM Contrast checker — https://webaim.org/resources/contrastchecker/?fcolor=000000&bcolor=FFFFFF — to verify contrast is less than 3:1.
530
+
531
+ Manual:
532
+ - Open DevTools in your browser window (F12)
533
+ - Right-click and select "Inspect" on the different color combinations that you see as you move from the top of the page on down
534
+ - Find the hexadecimal color values in the "Styles" tab of your DevTools window
535
+ - Enter the hex values into a contrast checking tool (like WebAIM Contrast Checker or Deque's Color Contrast Analyzer) to verify if the contrast is less than 3:1.
536
+
537
+ [MagentaA11y]
538
+ https://www.magentaa11y.com/how-to-test/color-contrast/
539
+
540
+ [Resources]
541
+ Figma contrast checker: https://www.figma.com/community/plugin/732603254453395948/stark-contrast-accessibility-checker
542
+
543
+ [WCAG]
544
+ 1.4.11 Non-text Contrast (AA)
545
+
546
+ [Operating system]
547
+ ######
548
+
549
+ [Build Version]
550
+ ######
551
+
552
+ [Browser]
553
+ ######
554
+
555
+ [Assistive technology]
556
+ ######
557
+
558
+ ---
559
+
560
+ # [WIP] Screen reader focus is not retained while navigating between modal views
561
+
562
+ ## Severity
563
+ 2-Severe
564
+
565
+ ## Suggested Priority
566
+ High
567
+
568
+ -------- copy below ---------
569
+
570
+ [URL/Path]
571
+ ######
572
+
573
+ [Steps to reproduce]
574
+ ######
575
+
576
+ [Element]
577
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
578
+
579
+ [What is the issue]
580
+ When screen reader users activate the **"[placeholder name]"** button inside a modal, which updates the content within the modal, screen reader focus is not retained within the modal. Instead, focus often lands outside the modal container — typically on the `<body>` — causing screen reader users to unintentionally navigate the page behind the modal when using arrow keys.
581
+
582
+ (## Tester note: delete this section if not applicable ##) The same issue occurs when the "back" chevron icon button is used to return to the previous modal view. Focus is not retained within the modal.
583
+
584
+ [Why it is important]
585
+ Screen reader users rely on logical, programmatically managed focus to stay oriented within dynamic components like modals. If focus is not explicitly managed during view or content changes inside a modal, or when changing to a new modal, users may unknowingly leave the modal context, leading to confusion and difficulty completing tasks. This breaks expected modal behavior.
586
+
587
+ [Code reference]
588
+ (## Tester note: grab code snippet from experience and delete me ##)
589
+ {code:html}
590
+ ...
591
+ {code}
592
+
593
+ [How to fix]
594
+ Ensure that when a user clicks the **"[placeholder name]"** button to change the view within the modal or launch another modal, programmatic focus is set to the top-level heading of the newly shown view (e.g., using `.focus()` on the `<h2>`). If there is no heading present on the view, focus can be set to whatever the first interactive element in the modal is, ideally a back or close button. Apply the same approach when changing the modal view with the "back" chevron icon button. This ensures screen reader users remain in the intended modal context.
595
+
596
+ [Compliant code example]
597
+ (## Tester note: Choose to add or delete this section if not working in Phoenix/AEM environment ##)
598
+
599
+ While this isn't the only solution, this is a sample fix that has been implemented to resolve the issue for a Phoenix/AEM multi-view modal:
600
+ {code:html}
601
+ /**
602
+ * Set focus on the heading when the content changes while navigating between promo list to promo details and vice versa.
603
+ *
604
+ * @param visibilityScopeIdTarget - The ID of the visibility scope target to set focus on.
605
+ */
606
+ manageFocus(visibilityScopeIdTarget?: string): void {
607
+ let focusTarget: HTMLElement;
608
+
609
+ if (visibilityScopeIdTarget) {
610
+ focusTarget = document.querySelector(`[data-xpr-visibility-scope="${visibilityScopeIdTarget}"]`) as HTMLElement;
611
+ } else {
612
+ focusTarget = this.component;
613
+ }
614
+ const headings: HTMLHeadingElement[] = Array.from(focusTarget?.querySelectorAll(':is(h1,h2,h3,h4,h5,h6)') || []);
615
+ // Find the first visible heading
616
+ const el = headings.find((heading) => {
617
+ return heading.offsetParent !== null && heading.offsetHeight > 0 && heading.offsetWidth > 0;
618
+ }) as HTMLElement | null;
619
+
620
+ if (el) {
621
+ el.setAttribute('tabindex', '-1');
622
+ el.focus();
623
+ } else {
624
+ (this.component?.closest('.phx-modal') as HTMLElement)?.focus();
625
+ }
626
+ },
627
+
628
+ setTimeout(() => {
629
+ this.manageFocus();
630
+ }, 100);
631
+ {code}
632
+
633
+ [How to test]
634
+ Automated: Automated tools like Chrome's Lighthouse scanner will not detect this issue. Focus management during modal transitions should be tested manually with a screen reader.
635
+
636
+ Manual:
637
+ - Open the modal and activate the **"[placeholder name]"** button to change the view.
638
+ - With NVDA or JAWS in browse mode, press the arrow keys after the view changes.
639
+ - Confirm that arrow key navigation starts at the new modal content and does not land outside the modal or on the main page.
640
+ - Activate the back button and repeat the test.
641
+
642
+ [MagentaA11y]
643
+ ######
644
+
645
+ [Resources]
646
+ ######
647
+
648
+ [WCAG]
649
+ 2.4.3 Focus Order (A)
650
+
651
+ [Operating system]
652
+ Windows
653
+
654
+ [Build Version]
655
+ ######
656
+
657
+ [Browser]
658
+ Chrome
659
+ Firefox
660
+ Edge
661
+
662
+ [Assistive technology]
663
+ JAWS
664
+ NVDA
665
+
666
+ ---
667
+
668
+ # [WIP] Semantic meaning of a heading is not conveyed to a screen reader user
669
+
670
+ ## Severity
671
+ 3-Average
672
+
673
+ ## Suggested Priority
674
+ Medium
675
+
676
+ -------- copy below ---------
677
+
678
+ [URL/Path]
679
+ ######
680
+
681
+ [Steps to reproduce]
682
+ ######
683
+
684
+ [Element]
685
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
686
+
687
+ [What is the issue]
688
+ A screen reader user does not know that a heading exists on the page because it is not coded with semantic HTML such as h1|h2|h3|h4|h5|h6. The heading is visually conveyed, but a screen reader user misses out on the same meaning, information, and hierarchy of relationships.
689
+
690
+ The semantic meaning of a heading is not conveyed to a screen reader user through HTML. This can happen when headings are marked up improperly (e.g., using non-semantic elements like `<div>` or `<span>` instead of proper tags like `<h1>` through `<h6>`).
691
+
692
+ [Why it is important]
693
+ Headings give a page a clear and logical structure, helping users of screen readers navigate and understand the content hierarchy. If the semantic HTML meaning is not conveyed correctly, users may struggle to comprehend the page structure.
694
+
695
+ Screen reader users also often make use of keyboard shortcuts to skip around only the headings on a page to learn more about the content overview quickly and efficiently. When HTML headings are missing, it reduces their ability to interact with the site.
696
+
697
+ [Code reference]
698
+ (## Tester note: CSS code references can be helpful here – delete me ##)
699
+ {code:css}
700
+ ...
701
+ {code}
702
+
703
+ [How to fix]
704
+ Ensure all headings use the appropriate HTML heading tags (`<h1>`, `<h2>`, `<h3>`, etc.) for structuring the content.
705
+
706
+ Do not use non-semantic elements like `<div>` or `<span>` for headings.
707
+
708
+ The heading hierarchy should be logical, with the `<h1>` being the most important and subsequent headings `<h2>`, `<h3>`, etc., used in a meaningful and logical order.
709
+
710
+ [Compliant code example]
711
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
712
+ {code:html}
713
+ ...
714
+ {code}
715
+
716
+ [How to test]
717
+ Automated:
718
+ Use an accessibility testing tool (e.g., Level Access) to check for missing or incorrect heading elements. Verify that headings are being used properly in the HTML.
719
+
720
+ Manual:
721
+ 1. Navigate through the page using a screen reader (e.g., VoiceOver for MacOS or NVDA for Windows).
722
+ - For VoiceOver, use VO keys + Command + H to skip around by heading
723
+ - For NVDA, use "H" key to skip around by heading
724
+ 2. Ensure that all headings are conveyed as distinct, sequentially organized elements, and the content hierarchy makes sense.
725
+ 3. Inspect the HTML structure to verify that proper HTML tags are used instead of non-semantic elements.
726
+
727
+ [MagentaA11y]
728
+ https://www.magentaa11y.com/checklist-web/heading/
729
+
730
+ [Resources]
731
+ ######
732
+
733
+ [WCAG]
734
+ 1.3.1 Info and Relationships (A)
735
+
736
+ [Operating system]
737
+ ######
738
+
739
+ [Build Version]
740
+ ######
741
+
742
+ [Browser]
743
+ ######
744
+
745
+ [Assistive technology]
746
+ JAWS
747
+ NVDA
748
+ VoiceOver
749
+ TalkBack
750
+
751
+ ---
752
+
753
+ # [WIP] Semantic meaning of a list is not conveyed to a screen reader user
754
+
755
+ ## Severity
756
+ 3-Average
757
+
758
+ ## Suggested Priority
759
+ Medium
760
+
761
+ -------- copy below ---------
762
+
763
+ [URL/Path]
764
+ ######
765
+
766
+ [Steps to reproduce]
767
+ ######
768
+
769
+ [Element]
770
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
771
+
772
+ [What is the issue]
773
+ A screen reader user does not know that a list exists on the page because it is not coded with semantic HTML such as `<ul>` or `<ol>`. The list is visually conveyed, but a screen reader user misses out on the same meaning, information, and hierarchy of relationships.
774
+
775
+ The semantic meaning of a list is not conveyed to a screen reader user through HTML. This can happen when lists are marked up improperly (e.g., using non-semantic elements like `<div>` or `<span>` instead of proper tags like `<ul>` or `<ol>`).
776
+
777
+ [Why it is important]
778
+ Lists (`<ul>` or `<ol>`) provide a clear and logical structure to content, helping users of screen readers navigate and understand the content hierarchy. A screen reader will announce where the list structure begins and ends and normally will announce the number of elements in the list as well (e.g., "1 of 10").
779
+
780
+ If the semantic meaning is not conveyed correctly, users may struggle to comprehend the page content or find relevant content efficiently, reducing their ability to interact with the site.
781
+
782
+ [Code reference]
783
+ (## Tester note: CSS code references can be helpful here – delete me ##)
784
+ {code:css}
785
+ ...
786
+ {code}
787
+
788
+ [How to fix]
789
+ Ensure all lists use the appropriate HTML list tags (`<ul>`, `<ol>`, and `<li>` for both) for structuring content.
790
+
791
+ Note: VoiceOver does not announce `<ul>` or `<ol>` when CSS styling removes their numbering or bullets.
792
+
793
+ [Compliant code example]
794
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
795
+ {code:html}
796
+ ...
797
+ {code}
798
+
799
+ [How to test]
800
+ Automated:
801
+ Use an accessibility testing tool (e.g., Level Access) to check for missing or incorrect list elements. Verify that lists are being used properly in the HTML.
802
+
803
+ Manual:
804
+ 1. Navigate through the page using a screen reader (e.g., VoiceOver for MacOS or NVDA for Windows).
805
+ 2. Ensure that all lists are conveyed as distinct, sequentially organized elements, and the content hierarchy makes sense.
806
+ 3. Inspect the HTML structure to verify that proper HTML tags are used instead of non-semantic elements.
807
+
808
+ [MagentaA11y]
809
+ https://www.magentaa11y.com/checklist-web/list/
810
+
811
+ [Resources]
812
+ ######
813
+
814
+ [WCAG]
815
+ 1.3.1 Info and Relationships (A)
816
+
817
+ [Operating system]
818
+ ######
819
+
820
+ [Build Version]
821
+ ######
822
+
823
+ [Browser]
824
+ ######
825
+
826
+ [Assistive technology]
827
+ JAWS
828
+ NVDA
829
+ VoiceOver
830
+ TalkBack
831
+
832
+ ---
833
+
834
+ # [WIP] Text does not meet minimum contrast requirements
835
+
836
+ ## Severity
837
+ 3-Average
838
+
839
+ ## Suggested Priority
840
+ Medium
841
+
842
+ -------- copy below ---------
843
+
844
+ [URL/Path]
845
+ ######
846
+
847
+ [Steps to reproduce]
848
+ ######
849
+
850
+ [Element]
851
+ (## Tester note: Describe where the text is in the UI and delete me ##)
852
+
853
+ [What is the issue]
854
+ The following text elements do not meet minimum contrast requirements:
855
+
856
+ Text Element:
857
+ Foreground: #xxxxxx
858
+ Background: #xxxxxx
859
+ Current Contrast Ratio: x.x:1
860
+
861
+ [Why it is important]
862
+ Good contrast is essential for everyone, particularly for people with low vision, color blindness, or those viewing your website on a mobile device in bright or sunny conditions. If the text doesn't meet WCAG color contrast ratio minimums, it can be difficult for users to read, impacting their overall experience. This applies to any visible element, except those intentionally hidden or sized at 1px by 1px (tracking pixels).
863
+
864
+ [Code reference]
865
+ (## Tester note: CSS code references can be helpful here – delete me ##)
866
+ {code:css}
867
+ ...
868
+ {code}
869
+
870
+ [How to fix]
871
+ - Ensure that text and background colors meet the minimum contrast requirement.
872
+ - Regular Text: For regular size text less than 24px text (or 18.5px if bold), a contrast ratio of at least 4.5:1 is necessary.
873
+ - Large Text: Anything over 24px (or 18.5px if bold) must meet a color contrast ratio of 3:1.
874
+ Note: Partner with Designers to get appropriate colors for use.
875
+
876
+ [Compliant code example]
877
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
878
+ {code:css}
879
+ ...
880
+ {code}
881
+
882
+ [How to test]
883
+ Automated: Use an automated accessibility testing tool to test for the existence the color contrast issue. E.g axe DevTools Chrome extension, Level Access Chrome Extension, ANDI
884
+
885
+ Manual: Using Chrome DevTools, inspect the text. You can click on the color swatch in the CSS pane to see the calculated color contrast if a background is defined for the container it lives within.
886
+
887
+ Alternatively, you can get the foreground hex code using Chrome DevTools by inspecting the text. Using an online color contrast tool such as Deque Color Contrast tool to compare the foreground and background. https://dequeuniversity.com/color-contrast
888
+
889
+ The foreground and background comparisons should meet the required WCAG minimums. 4.5:1 or 3:1 based on calculated text sizes.
890
+
891
+ [MagentaA11y]
892
+ https://www.magentaa11y.com/how-to-test/color-contrast/
893
+
894
+ [Resources]
895
+ ######
896
+
897
+ [WCAG]
898
+ 1.4.3 Contrast (Minimum) (AA)
899
+
900
+ [Operating system]
901
+ ######
902
+
903
+ [Build Version]
904
+ ######
905
+
906
+ [Browser]
907
+ ######
908
+
909
+ [Assistive technology]
910
+ n/a
911
+
912
+ ---