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.
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "arc-templated-issues",
3
+ "version": "1.0.0",
4
+ "description": "ARC accessibility issue templates for web and native platforms",
5
+ "files": [
6
+ "public/",
7
+ "web/",
8
+ "native/",
9
+ "arc-accessibility-issue-template.md",
10
+ "template-mappings.json",
11
+ "template-mappings.schema.json"
12
+ ],
13
+ "scripts": {
14
+ "build": "node scripts/build-combined-doc.js",
15
+ "prepublishOnly": "npm run build",
16
+ "release:patch": "npm run build && npm version patch && npm publish",
17
+ "release:minor": "npm run build && npm version minor && npm publish",
18
+ "release:major": "npm run build && npm version major && npm publish"
19
+ },
20
+ "engines": {
21
+ "node": ">=18.0.0"
22
+ }
23
+ }
@@ -0,0 +1,487 @@
1
+ # ARC Native (iOS / Android) Accessibility Issue Templates
2
+
3
+ > Generated on 2026-04-03
4
+
5
+ ---
6
+
7
+ # Button lacks a label in the code
8
+
9
+ ## Severity
10
+ 1-Critical
11
+
12
+ ## Suggested Priority
13
+ Blocker
14
+
15
+ -------- copy below ---------
16
+
17
+ [Path]
18
+ ######
19
+
20
+ [Steps to reproduce]
21
+ ######
22
+
23
+ [Element]
24
+ The ##### button located #####
25
+
26
+ [What is the issue]
27
+ The ##### button does not have an accessible label in the code, resulting in screen readers announcing it as "button" without context. This issue occurs when buttons are missing labels via accessibility properties like {{contentDescription}} (Android) or {{.accessibilityLabel}} (iOS).
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
+ [How to fix]
33
+ - On iOS, set a descriptive {{.accessibilityLabel}} for each button.
34
+ - On Android, use the {{contentDescription}} property to provide meaningful labels.
35
+ - Ensure the label is concise and accurately describes the button's function (e.g., "Submit," "Back," or "Search").
36
+
37
+ [Compliant code example]
38
+ iOS
39
+ {code:swift}
40
+ Button(action: { /* action */ }) {
41
+ Text("Submit")
42
+ }
43
+ .accessibilityLabel("Submit, any additional context")
44
+ {code}
45
+
46
+ Android
47
+ {code:java}
48
+ Button(onClick = { /* action */ }) {
49
+ Text("Submit")
50
+ }.semantics { contentDescription = "Submit, any additional context" }
51
+ {code}
52
+
53
+ [How to test]
54
+ - Screen reader testing: Enable VoiceOver (iOS) or TalkBack (Android) and navigate to the buttons. Verify that each button is announced with a clear and accurate label.
55
+ - Manual inspection: Check the code to confirm that all buttons include appropriate accessibility properties like {{.accessibilityLabel}} or {{contentDescription}}.
56
+
57
+ [MagentaA11y]
58
+ https://www.magentaa11y.com/checklist-native/button/
59
+
60
+ [Resources]
61
+ ######
62
+
63
+ [WCAG]
64
+ (## Tester note: Choose or add and delete me ##)
65
+ 2.4.6: Headings and Labels (AA)
66
+ 2.5.3: Label in Name (AA)
67
+ 4.1.2 Name, Role, Value (A)
68
+
69
+ [Operating system]
70
+ (## Tester note: Choose one and delete me ##)
71
+ iOS
72
+ Android
73
+
74
+ [Build Version]
75
+ ###### E.g. 10.6.0
76
+
77
+ [Assistive technology]
78
+ (## Tester note: Choose one and delete me ##)
79
+ VoiceOver
80
+ TalkBack
81
+ Keyboard
82
+
83
+ ---
84
+
85
+ # Focus order is not logical
86
+
87
+ ## Severity
88
+ 2-Severe
89
+
90
+ ## Suggested Priority
91
+ High
92
+
93
+ -------- copy below ---------
94
+
95
+ [URL/Path]
96
+ ######
97
+
98
+ [Steps to reproduce]
99
+ ######
100
+
101
+ [Element]
102
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
103
+
104
+ [What is the issue]
105
+ (## Tester note: Add to this content below describing the focus order — delete me ##)
106
+ The screen reader focus order does not follow a logical order. In this case, the focus order ######
107
+
108
+ [Why it is important]
109
+ Logical focus order ensures that users relying on screen readers can navigate the interface efficiently and understand the contextual relationships between elements. When focus order is disrupted, it creates barriers for users with visual impairments or motor disabilities, leading to frustration and reduced usability.
110
+
111
+ [Code reference]
112
+ (## Tester note: Code references can be very helpful here to support screenshots and the rest of the issue — n/a if not applicable or no access to codebase, delete me ##)
113
+ {code:swift}
114
+ ...
115
+ {code}
116
+
117
+ [How to fix]
118
+ (## Tester note: If needed add to this content to describe expected focus order ##)
119
+ - Review the order of focusable elements and ensure it follows a logical and expected progression that matches the visual layout and intended user flow.
120
+ - Ensure the elements that should receive focus are enabled for accessibility. e.g. {{isAccessibilityElement}} in iOS and {{importantForAccessibility}} in Android.
121
+ - If the natural screen's focus order needs to be overridden, consider accessibility tools specific to the platform (e.g., {{accessibilityTraversalOrder}} for Android or adjusting the {{UIAccessibilityContainer}} for iOS).
122
+ - Make sure hidden elements or off-screen controls are not included in the focus order.
123
+
124
+ [Compliant code example]
125
+ (## Tester note: n/a here if not applicable — code formatting options: code:html, code:css, code:swift, code:java ##)
126
+ {code:swift}
127
+ ...
128
+ {code}
129
+
130
+ [How to test]
131
+ Automated: Use tools like Android Accessibility Scanner or iOS Accessibility Inspector to detect potential focus order issues.
132
+ Manual: Navigate the app using a screen reader (VoiceOver or TalkBack) and verify that the focus moves sequentially in a way that matches the visual and functional layout. Ensure that the meaning of the content makes sense.
133
+
134
+ [MagentaA11y]
135
+ https://www.magentaa11y.com/checklist-native/focus/
136
+
137
+ [Resources]
138
+ ######
139
+
140
+ [WCAG]
141
+ 2.4.3 Focus Order (A)
142
+ 1.3.2 Meaningful Sequence (A)
143
+
144
+ [Operating system]
145
+ iOS
146
+ Android
147
+
148
+ [Build Version]
149
+ ###### E.g. 10.6.0
150
+
151
+ [Assistive technology]
152
+ VoiceOver
153
+ TalkBack
154
+
155
+ ---
156
+
157
+ # Heading Trait is not used in the code
158
+
159
+ ## Severity
160
+ 3-Average
161
+
162
+ ## Suggested Priority
163
+ Medium
164
+
165
+ -------- copy below ---------
166
+
167
+ [Path]
168
+ ######
169
+
170
+ [Steps to reproduce]
171
+ ######
172
+
173
+ [Element]
174
+ The ##### large text located #####
175
+
176
+ [What is the issue]
177
+ The large text ##### does not own the Header Trait. This issue occurs when {{UIAccessibilityTraits.header}} (iOS) or {{AccessibilityHeading}} (Android) is not applied to a text element serving as a heading.
178
+
179
+ [Why it is important]
180
+ A heading provides semantic structure that allows users of screen readers to navigate content quickly and understand the hierarchy of information within the screen. Without a properly marked heading, users must navigate linearly, which is time-consuming and frustrating, and they will have less of an understanding of how the content is organized on the screen.
181
+
182
+ [How to fix]
183
+ - Ensure the heading is logical, concise, and represents the hierarchy of content.
184
+ - On iOS, apply the {{.accessibilityTraits}} property with the .header value to the text element.
185
+ - On Android, use the setHeading() method or AccessibilityHeading property to define the heading role for the element.
186
+
187
+ [Compliant code example]
188
+ iOS
189
+ {code:swift}
190
+ Text("Section Title")
191
+ .font(.title)
192
+ .accessibilityAddTraits(.isHeader)
193
+ {code}
194
+
195
+ Android
196
+ {code:java}
197
+ Text(
198
+ text = "Section Title",
199
+ modifier = Modifier.semantics { heading = true }
200
+ )
201
+ {code}
202
+
203
+ [How to test]
204
+ Screen reader testing: Enable VoiceOver (iOS) or TalkBack (Android) and use heading navigation gestures. Confirm that the heading is announced and navigable in a logical order.
205
+ Manual inspection: Review the code to ensure the heading is marked with appropriate accessibility traits.
206
+
207
+ [MagentaA11y]
208
+ https://www.magentaa11y.com/checklist-native/headings/
209
+
210
+ [Resources]
211
+ ######
212
+
213
+ [WCAG]
214
+ (## Tester note: Choose or add and delete me ##)
215
+ 1.3.1 Info and Relationships (A)
216
+ 2.4.6 Headings and Labels (AA)
217
+
218
+ [Operating system]
219
+ (## Tester note: Choose one and delete me ##)
220
+ iOS
221
+ Android
222
+
223
+ [Build Version]
224
+ ###### E.g. 10.6.0
225
+
226
+ [Assistive technology]
227
+ (## Tester note: Choose one and delete me ##)
228
+ VoiceOver
229
+ TalkBack
230
+ Keyboard
231
+
232
+ ---
233
+
234
+ # Image/icon should be marked as decorative
235
+
236
+ ## Severity
237
+ 3-Average
238
+
239
+ ## Suggested Priority
240
+ Medium
241
+
242
+ -------- copy below ---------
243
+
244
+ [URL/Path]
245
+ ######
246
+
247
+ [Steps to reproduce]
248
+ ######
249
+
250
+ [Element]
251
+ (## Tester note: Describe where the decorative image is in the UI and delete me ##)
252
+
253
+ [What is the issue]
254
+ The following images do not meet the requirements for properly programmatically hidden decorative images:
255
+
256
+ A caret icon is included within a table row/list item/blade. The caret icon is simply there for visual reinforcement, and it follows a visible text label. However, the caret icon is incorrectly read by a screen reader when swiping through the screen focus order.
257
+
258
+ A battery icon is next to the text string of "Battery", where the text "Battery" provides an equivalent text alternative. However, the battery icon is not grouped together with the adjacent text and the battery icon announces with a long filename which is not meaningful to users.
259
+
260
+ An image is used as a decorative design element to break up a page by visually signaling the introduction of the next section, and is not crucial to understanding the purpose or content of the page. However, the decorative layout image is still read by a screen reader.
261
+
262
+ [Why it is important]
263
+ Proper hiding or presentational status on decorative images is important in ensuring that extraneous auditory noise is not generated for assistive technology users. When images which are not intended to convey information are not programmatically hidden, then assistive technology (AT) may try to announce a filename which is not meaningful. This issue impacts cognitive users, low vision users and non-sighted users who navigate the screen using assistive technology such as screen readers and braille readers. WCAG 1.1.1 (Non-Text Content) requires that images which are decorative, incidental, or used strictly for layout/positioning be programmatically hidden from assistive technology.
264
+
265
+ [Code reference]
266
+ (## Tester note: iOS and Android image attributes for decorative, hidden, or null go here – delete me ##)
267
+ {code:swift}
268
+ ...
269
+ {code}
270
+
271
+ [How to fix]
272
+ Ensure that decorative images and icons are programmatically hidden. Use the correct function to hide the decorative image or icon.
273
+
274
+ [Compliant code example]
275
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
276
+
277
+ **Android — XML**
278
+ Use `android:importantForAccessibility="no"` to ensure that the image is not considered for accessibility purposes. This will prevent TalkBack from announcing the image.
279
+
280
+ **Android — Jetpack Compose**
281
+ Set `contentDescription = null` for decorative elements to ensure that the content description is not announced by TalkBack.
282
+ {code:java}
283
+ Image(
284
+ painter = painterResource(id = R.drawable.decorative_image),
285
+ contentDescription = null
286
+ )
287
+ {code}
288
+
289
+ **iOS — SwiftUI**
290
+ Use the modifier `.accessibilityHidden(true)` to hide an icon or image from VoiceOver, Full Keyboard Access, and Switch Control.
291
+ Use the `Image(decorative:)` initializer to mark an image as purely decorative. This ensures the image is not announced by VoiceOver, not focusable by Full Keyboard Access or Switch Control, and not included in the accessibility tree.
292
+ {code:swift}
293
+ Image(decorative: "decorative_image")
294
+ // or
295
+ Image("decorative_image")
296
+ .accessibilityHidden(true)
297
+ {code}
298
+
299
+ **iOS — UIKit**
300
+ Use `imageView.isAccessibilityElement = false` to ensure the image view is ignored by VoiceOver, meaning it won't be announced or focusable.
301
+
302
+ [How to test]
303
+ Automated:
304
+ - Not Applicable
305
+
306
+ Manual:
307
+ - Inspect the screen to identify images which have adjacent text descriptions or are non-essential.
308
+ - Navigate through the screen by swiping right and left using a screen reader in order to locate images. Follow along visually as images are announced to confirm whether the image is decorative versus providing content.
309
+ - Review the list of decorative images to ensure that each uses a valid programmatic hidden, decorative, or null description value.
310
+
311
+ [MagentaA11y]
312
+ https://www.magentaa11y.com/checklist-native/image-decorative/
313
+
314
+ [Resources]
315
+ Decorative Images
316
+ https://www.w3.org/WAI/tutorials/images/decorative/
317
+
318
+ Android Developers: Decorative Images
319
+ https://developer.android.com/guide/topics/ui/accessibility/principles#decorative
320
+
321
+ [WCAG]
322
+ 1.1.1 Non-text Content (Level A)
323
+
324
+ [Operating system]
325
+ ######
326
+
327
+ [Build Version]
328
+ ######
329
+
330
+ [Assistive technology]
331
+ VoiceOver
332
+ TalkBack
333
+
334
+ ---
335
+
336
+ # Items should be grouped
337
+
338
+ ## Severity
339
+ 3-Average
340
+
341
+ ## Suggested Priority
342
+ Medium
343
+
344
+ -------- copy below ---------
345
+
346
+ [URL/Path]
347
+ ######
348
+
349
+ [Steps to reproduce]
350
+ ######
351
+
352
+ [Element]
353
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
354
+
355
+ [What is the issue]
356
+ Related items are not properly grouped, which impacts the navigation and understanding for users relying on screen readers and braille displays or keyboards.
357
+
358
+ [Why it is important]
359
+ Grouping can help to better communicate the relationships of interactive elements such as interdependent controls, as well as non-interactive elements such as images that combine to make a larger group. Proper grouping reduces the need for excessive swipes or navigation actions and users can quickly understand and interact with related elements without needing to swipe through scattered content. This improves the overall efficiency of navigating the app, making it less tiring and more user-friendly for individuals with visual impairments. Lastly, proper groupings provide users with a larger touch target area.
360
+
361
+ [Code reference]
362
+ - In SwiftUI, group multiple elements with the `.accessibilityElement(children:)` modifier and with the `.combine` option on a parent view.
363
+ - In Jetpack Compose, group elements by using `mergeDescendants`.
364
+ - For Android Views, group all the relevant content elements in a single layout ViewGroup and set `android:importantForAccessibility="yes"` on that ViewGroup.
365
+
366
+ [How to fix]
367
+ (## Tester note: If needed add to this content to describe expected grouping ##)
368
+ - Review the order of focusable/swipeable elements and ensure related elements are logically grouped.
369
+
370
+ [Compliant code example]
371
+ (## Tester note: n/a here if not applicable — code formatting options: code:swift, code:java ##)
372
+ {code:swift}
373
+ ...
374
+ {code}
375
+
376
+ [How to test]
377
+ - Automated: Use tools like Android Accessibility Scanner or iOS Accessibility Inspector to detect missing or incorrect groupings.
378
+ - Manual: Use a screen reader (VoiceOver on iOS, TalkBack on Android) to navigate through the app. Ensure that related elements (e.g., buttons, form fields) are announced together and in the correct order. Pay close attention to how many swipes are needed to navigate between logically grouped items compared to disorganized ones. Ensure that users can reach related items with fewer actions.
379
+
380
+ [MagentaA11y]
381
+ https://www.magentaa11y.com/checklist-native/focus/
382
+
383
+ [Resources]
384
+ - Android Developers: Groups of Related Content
385
+ https://developer.android.com/guide/topics/ui/accessibility/principles#content-groups
386
+ - Accessibility group in Jetpack Compose
387
+ https://appt.org/en/docs/jetpack-compose/samples/accessibility-group
388
+ - Accessibility Group on iOS
389
+ https://appt.org/en/docs/ios/samples/accessibility-group
390
+ - Accessibility Group on React Native
391
+ https://appt.org/en/docs/react-native/samples/accessibility-group
392
+
393
+ [WCAG]
394
+ 1.3.1 Info and Relationships (A)
395
+ 3.3.2 Labels or Instructions (A)
396
+
397
+ [Operating system]
398
+ iOS
399
+ Android
400
+
401
+ [Build Version]
402
+ ###### E.g. 10.6.0
403
+
404
+ [Assistive technology]
405
+ VoiceOver
406
+ TalkBack
407
+
408
+ ---
409
+
410
+ # State is not communicated for button
411
+
412
+ ## Severity
413
+ 2-Severe
414
+
415
+ ## Suggested Priority
416
+ High
417
+
418
+ -------- copy below ---------
419
+
420
+ [Path]
421
+ ######
422
+
423
+ [Steps to reproduce]
424
+ ######
425
+
426
+ [Element]
427
+ The ##### button located #####
428
+
429
+ [What is the issue]
430
+ The ##### control with a dynamic state of ##### does not communicate its state to screen reader users.
431
+
432
+ [Why it is important]
433
+ State communication is essential for users of screen readers to understand the current functionality of the button. Without it, users may be unaware of the button's active or inactive state, leading to confusion and difficulty in completing tasks.
434
+
435
+ For example, a toggle button might not announce whether it is currently "On" or "Off," or a navigation bar button may not announce as "Selected" or "Active."
436
+
437
+ [How to fix]
438
+ - Use native controls and State will naturally be communicated.
439
+ - For a toggle button, ensure states like "selected," "pressed," or "disabled" are programmatically exposed using platform-specific APIs.
440
+ - On iOS, use {{.accessibilityValue}} to indicate the current state of the button (e.g., "On" or "Off").
441
+ - On Android, set the {{contentDescription}} dynamically to reflect the button's state, or use accessibility APIs like {{AccessibilityNodeInfo.setText()}} to provide state information.
442
+
443
+ [Compliant code example]
444
+ iOS
445
+ {code:swift}
446
+ Toggle("Enable Feature", isOn: $isOn)
447
+ .accessibilityValue(isOn ? "On" : "Off")
448
+ {code}
449
+
450
+ Android
451
+ {code:java}
452
+ val isChecked = remember { mutableStateOf(false) }
453
+ Checkbox(
454
+ checked = isChecked.value,
455
+ onCheckedChange = { isChecked.value = it },
456
+ modifier = Modifier.semantics { contentDescription = if (isChecked.value) "Checked" else "Unchecked" }
457
+ )
458
+ {code}
459
+
460
+ [How to test]
461
+ - Screen reader testing: Enable VoiceOver (iOS) or TalkBack (Android) and activate the button. Confirm that the state change (e.g., "On" to "Off", "Selected", or "Active") is announced correctly based on the interaction.
462
+
463
+ [MagentaA11y]
464
+ https://www.magentaa11y.com/checklist-native/button/
465
+
466
+ [Resources]
467
+ ######
468
+
469
+ [WCAG]
470
+ 4.1.2 Name, Role, Value (A)
471
+ 1.3.1: Info and Relationships (A)
472
+
473
+ [Operating system]
474
+ (## Tester note: Choose one and delete me ##)
475
+ iOS
476
+ Android
477
+
478
+ [Build Version]
479
+ ###### E.g. 10.6.0
480
+
481
+ [Assistive technology]
482
+ (## Tester note: Choose one and delete me ##)
483
+ VoiceOver
484
+ TalkBack
485
+ Keyboard
486
+
487
+ ---