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/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # ARC Templated Accessibility Issues
2
+
3
+ Pre-written accessibility issue templates for iOS, Android, and Web, maintained by the **ARC Accessibility Resource Center**. These templates are designed to standardize how accessibility defects are documented and filed across platforms, ensuring consistent severity ratings, reproduction steps, code references, and remediation guidance.
4
+
5
+ ## Purpose
6
+
7
+ Manually writing accessibility issues from scratch is time-consuming and inconsistent. These templates give testers and engineers a reliable starting point — with pre-filled issue descriptions, WCAG references, how-to-fix guidance, and testing steps — so teams can file high-quality bugs faster.
8
+
9
+ ## Structure
10
+
11
+ ```
12
+ arc-templated-issues/
13
+ ├── web/ # Web platform templates
14
+ ├── native/ # iOS and Android platform templates
15
+ ├── public/ # Combined output docs (generated)
16
+ │ ├── web-issue-templates.md
17
+ │ └── native-issue-templates.md
18
+ ├── scripts/
19
+ │ └── build-combined-doc.js # Script to regenerate public/ docs
20
+ ├── arc-accessibility-issue-template.md # Base template structure
21
+ ├── template-mappings.json # Maps axe-core rule IDs to templates
22
+ └── template-mappings.schema.json # JSON schema for template-mappings.json
23
+ ```
24
+
25
+ ## Platforms
26
+
27
+ | Platform | Status |
28
+ |----------|--------|
29
+ | Web | Active |
30
+ | iOS | Active |
31
+ | Android | Active |
32
+
33
+ ## Template Format
34
+
35
+ Each template follows a standard structure:
36
+
37
+ - **Severity** — Critical / Severe / Average / Low
38
+ - **Suggested Priority** — Blocker / High / Medium / Low
39
+ - **Steps to reproduce**
40
+ - **Element** — Where the issue appears in the UI
41
+ - **What is the issue** — Description, including screen reader announcement impact
42
+ - **Why it is important** — User impact and business rationale
43
+ - **Code reference** — Snippet of the offending code
44
+ - **How to fix** — Remediation guidance
45
+ - **Compliant code example** — Corrected code snippet
46
+ - **How to test** — Automated and manual testing steps
47
+ - **MagentaA11y** — Links to relevant MagentaA11y criteria
48
+ - **WCAG** — Applicable success criteria and conformance level
49
+ - **Operating system / Browser / Assistive technology** — Environment details
50
+
51
+ ## Web Templates
52
+
53
+ | Template | Mapped axe-core Rules |
54
+ |----------|-----------------------|
55
+ | [Control lacks a label in the code](web/control-lacks-a-label-in-the-code.md) | `button-name`, `link-name`, `label`, `aria-label` rules, and more |
56
+ | [Heading levels incorrectly nested](web/heading-levels-incorrectly-nested.md) | `heading-order`, `empty-heading`, `page-has-heading-one` |
57
+ | [Images should be marked as decorative](web/images-should-be-marked-as-decorative.md) | `image-alt`, `role-img-alt`, `svg-img-alt`, and more |
58
+ | [Interactive element is not keyboard accessible](web/interactive-element-is-not-keyboard-accessible.md) | `tabindex`, `scrollable-region-focusable`, `nested-interactive`, and more |
59
+
60
+ The full axe-core rule-to-template mapping is defined in [`template-mappings.json`](template-mappings.json).
61
+
62
+ ## Native Templates
63
+
64
+ | Template |
65
+ |----------|
66
+ | [Button lacks a label in the code](native/button-lacks-a-label-in-the-code.md) |
67
+ | [Focus order is not logical](native/focus-order-is-not-logical.md) |
68
+ | [Heading trait is not used in the code](native/heading-trait-is-not-used-in-the-code.md) |
69
+ | [Image/icon should be marked as decorative](native/image-icon-should-be-marked-as-decorative.md) |
70
+ | [Items should be grouped](native/items-should-be-grouped.md) |
71
+ | [State is not communicated for button](native/state-is-not-communicated-for-button.md) |
72
+
73
+ ## Building the Combined Docs
74
+
75
+ The `public/` folder contains pre-built markdown files that merge all templates by platform. To regenerate them after adding or editing templates:
76
+
77
+ ```bash
78
+ node scripts/build-combined-doc.js
79
+ ```
80
+
81
+ This outputs:
82
+ - [`public/web-issue-templates.md`](public/web-issue-templates.md)
83
+ - [`public/native-issue-templates.md`](public/native-issue-templates.md)
84
+
85
+ ## npm Package
86
+
87
+ This repo is published to npm as `arc-templated-issues`. Any project can consume the templates directly:
88
+
89
+ ```bash
90
+ npm install arc-templated-issues
91
+ ```
92
+
93
+ **Published contents:**
94
+
95
+ | Path | Description |
96
+ |------|-------------|
97
+ | `public/web-issue-templates.md` | All web templates merged into one file |
98
+ | `public/native-issue-templates.md` | All native templates merged into one file |
99
+ | `web/*.md` | Individual web templates |
100
+ | `native/*.md` | Individual native templates |
101
+ | `arc-accessibility-issue-template.md` | Base template structure |
102
+ | `template-mappings.json` | axe-core rule ID → template mappings |
103
+
104
+ ### Releasing a new version
105
+
106
+ ```bash
107
+ npm run release:patch # bug fixes / content updates → 1.0.x
108
+ npm run release:minor # new templates added → 1.x.0
109
+ npm run release:major # breaking changes → x.0.0
110
+ ```
111
+
112
+ Each `release:*` script rebuilds `public/` from the source templates, bumps the version, and publishes.
113
+
114
+ ## Usage
115
+
116
+ 1. Identify the accessibility issue you are filing.
117
+ 2. Find the matching template in the relevant platform folder (`web/` or `native/`).
118
+ 3. Copy the section below the `-------- copy below ---------` divider into your issue tracker.
119
+ 4. Fill in the `######` placeholders with issue-specific details.
120
+ 5. Remove any tester notes (lines beginning with `## Tester note:`) before filing.
121
+
122
+ ## Contributing
123
+
124
+ Templates are owned and maintained by the ARC Accessibility Resource Center. To propose a new template or suggest changes to an existing one, open a merge request with your changes and a brief description of the accessibility issue it addresses.
125
+
126
+ New templates should follow the base structure in [`arc-accessibility-issue-template.md`](arc-accessibility-issue-template.md) and include at minimum: severity, WCAG mapping, how-to-fix guidance, a compliant code example, and a MagentaA11y reference where applicable.
@@ -0,0 +1,83 @@
1
+ [Severity]
2
+ Critical
3
+ Severe
4
+ Average
5
+ Low
6
+
7
+ [Priority]
8
+ Blocker
9
+ High
10
+ Medium
11
+ Low
12
+
13
+ [URL/Path]
14
+ ######
15
+
16
+ [Steps to reproduce]
17
+ ######
18
+
19
+ [Element]
20
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
21
+
22
+ [What is the issue]
23
+ (## Tester note: If the issue has screen reader impact - clearly describe announcements and delete me - if no screen reader impact, delete the announcement content below for that issue. ##)
24
+
25
+ ######
26
+
27
+ Screen reader announcement (currently) is: "x...."
28
+ Ideal announcement would be: "x ..."
29
+
30
+
31
+ [Why it is important]
32
+ ######
33
+
34
+ [Code reference]
35
+ (## Tester note: Code references can be very helpful here to support screenshots and the reset of the issue – delete me ##)
36
+ {code:html}
37
+ ...
38
+ {code}
39
+
40
+ [How to fix]
41
+ ######
42
+
43
+ [Compliant code example]
44
+ (## Tester note: n/a here if not applicable - this could be a fixed/tailored code fragment pulled from Code Reference - code formatting options: code:html, code:css, code:swift, code:java ##)
45
+ {code:html}
46
+ ...
47
+ {code}
48
+
49
+ [How to test]
50
+ Automated: ######
51
+ Manual: ######
52
+
53
+ [MagentaA11y]
54
+ ###### Links to MagentaA11y pages
55
+
56
+ [Resources]
57
+ ######
58
+
59
+ [WCAG]
60
+ ###### Format: x.x.x Success Criterion (A or AA)
61
+
62
+ [Operating system]
63
+ Windows
64
+ MacOS
65
+ iOS
66
+ Android
67
+
68
+ [Build Version]
69
+ ###### E.g. 10.6.0
70
+
71
+ [Browser]
72
+ Chrome
73
+ Safari
74
+ Firefox
75
+ Edge
76
+
77
+ [Assistive technology]
78
+ Keyboard
79
+ JAWS
80
+ NVDA
81
+ VoiceOver
82
+ TalkBack
83
+ Zoom/Text Resize
@@ -0,0 +1,75 @@
1
+ # Button lacks a label in the code
2
+
3
+ ## Severity
4
+ 1-Critical
5
+
6
+ ## Suggested Priority
7
+ Blocker
8
+
9
+ -------- copy below ---------
10
+
11
+ [Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ The ##### button located #####
19
+
20
+ [What is the issue]
21
+ 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).
22
+
23
+ [Why it is important]
24
+ 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.
25
+
26
+ [How to fix]
27
+ - On iOS, set a descriptive {{.accessibilityLabel}} for each button.
28
+ - On Android, use the {{contentDescription}} property to provide meaningful labels.
29
+ - Ensure the label is concise and accurately describes the button's function (e.g., "Submit," "Back," or "Search").
30
+
31
+ [Compliant code example]
32
+ iOS
33
+ {code:swift}
34
+ Button(action: { /* action */ }) {
35
+ Text("Submit")
36
+ }
37
+ .accessibilityLabel("Submit, any additional context")
38
+ {code}
39
+
40
+ Android
41
+ {code:java}
42
+ Button(onClick = { /* action */ }) {
43
+ Text("Submit")
44
+ }.semantics { contentDescription = "Submit, any additional context" }
45
+ {code}
46
+
47
+ [How to test]
48
+ - 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.
49
+ - Manual inspection: Check the code to confirm that all buttons include appropriate accessibility properties like {{.accessibilityLabel}} or {{contentDescription}}.
50
+
51
+ [MagentaA11y]
52
+ https://www.magentaa11y.com/checklist-native/button/
53
+
54
+ [Resources]
55
+ ######
56
+
57
+ [WCAG]
58
+ (## Tester note: Choose or add and delete me ##)
59
+ 2.4.6: Headings and Labels (AA)
60
+ 2.5.3: Label in Name (AA)
61
+ 4.1.2 Name, Role, Value (A)
62
+
63
+ [Operating system]
64
+ (## Tester note: Choose one and delete me ##)
65
+ iOS
66
+ Android
67
+
68
+ [Build Version]
69
+ ###### E.g. 10.6.0
70
+
71
+ [Assistive technology]
72
+ (## Tester note: Choose one and delete me ##)
73
+ VoiceOver
74
+ TalkBack
75
+ Keyboard
@@ -0,0 +1,69 @@
1
+ # Focus order is not logical
2
+
3
+ ## Severity
4
+ 2-Severe
5
+
6
+ ## Suggested Priority
7
+ High
8
+
9
+ -------- copy below ---------
10
+
11
+ [URL/Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
19
+
20
+ [What is the issue]
21
+ (## Tester note: Add to this content below describing the focus order — delete me ##)
22
+ The screen reader focus order does not follow a logical order. In this case, the focus order ######
23
+
24
+ [Why it is important]
25
+ 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.
26
+
27
+ [Code reference]
28
+ (## 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 ##)
29
+ {code:swift}
30
+ ...
31
+ {code}
32
+
33
+ [How to fix]
34
+ (## Tester note: If needed add to this content to describe expected focus order ##)
35
+ - Review the order of focusable elements and ensure it follows a logical and expected progression that matches the visual layout and intended user flow.
36
+ - Ensure the elements that should receive focus are enabled for accessibility. e.g. {{isAccessibilityElement}} in iOS and {{importantForAccessibility}} in Android.
37
+ - 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).
38
+ - Make sure hidden elements or off-screen controls are not included in the focus order.
39
+
40
+ [Compliant code example]
41
+ (## Tester note: n/a here if not applicable — code formatting options: code:html, code:css, code:swift, code:java ##)
42
+ {code:swift}
43
+ ...
44
+ {code}
45
+
46
+ [How to test]
47
+ Automated: Use tools like Android Accessibility Scanner or iOS Accessibility Inspector to detect potential focus order issues.
48
+ 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.
49
+
50
+ [MagentaA11y]
51
+ https://www.magentaa11y.com/checklist-native/focus/
52
+
53
+ [Resources]
54
+ ######
55
+
56
+ [WCAG]
57
+ 2.4.3 Focus Order (A)
58
+ 1.3.2 Meaningful Sequence (A)
59
+
60
+ [Operating system]
61
+ iOS
62
+ Android
63
+
64
+ [Build Version]
65
+ ###### E.g. 10.6.0
66
+
67
+ [Assistive technology]
68
+ VoiceOver
69
+ TalkBack
@@ -0,0 +1,74 @@
1
+ # Heading Trait is not used in the code
2
+
3
+ ## Severity
4
+ 3-Average
5
+
6
+ ## Suggested Priority
7
+ Medium
8
+
9
+ -------- copy below ---------
10
+
11
+ [Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ The ##### large text located #####
19
+
20
+ [What is the issue]
21
+ 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.
22
+
23
+ [Why it is important]
24
+ 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.
25
+
26
+ [How to fix]
27
+ - Ensure the heading is logical, concise, and represents the hierarchy of content.
28
+ - On iOS, apply the {{.accessibilityTraits}} property with the .header value to the text element.
29
+ - On Android, use the setHeading() method or AccessibilityHeading property to define the heading role for the element.
30
+
31
+ [Compliant code example]
32
+ iOS
33
+ {code:swift}
34
+ Text("Section Title")
35
+ .font(.title)
36
+ .accessibilityAddTraits(.isHeader)
37
+ {code}
38
+
39
+ Android
40
+ {code:java}
41
+ Text(
42
+ text = "Section Title",
43
+ modifier = Modifier.semantics { heading = true }
44
+ )
45
+ {code}
46
+
47
+ [How to test]
48
+ 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.
49
+ Manual inspection: Review the code to ensure the heading is marked with appropriate accessibility traits.
50
+
51
+ [MagentaA11y]
52
+ https://www.magentaa11y.com/checklist-native/headings/
53
+
54
+ [Resources]
55
+ ######
56
+
57
+ [WCAG]
58
+ (## Tester note: Choose or add and delete me ##)
59
+ 1.3.1 Info and Relationships (A)
60
+ 2.4.6 Headings and Labels (AA)
61
+
62
+ [Operating system]
63
+ (## Tester note: Choose one and delete me ##)
64
+ iOS
65
+ Android
66
+
67
+ [Build Version]
68
+ ###### E.g. 10.6.0
69
+
70
+ [Assistive technology]
71
+ (## Tester note: Choose one and delete me ##)
72
+ VoiceOver
73
+ TalkBack
74
+ Keyboard
@@ -0,0 +1,99 @@
1
+ # Image/icon should be marked as decorative
2
+
3
+ ## Severity
4
+ 3-Average
5
+
6
+ ## Suggested Priority
7
+ Medium
8
+
9
+ -------- copy below ---------
10
+
11
+ [URL/Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ (## Tester note: Describe where the decorative image is in the UI and delete me ##)
19
+
20
+ [What is the issue]
21
+ The following images do not meet the requirements for properly programmatically hidden decorative images:
22
+
23
+ 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.
24
+
25
+ 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.
26
+
27
+ 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.
28
+
29
+ [Why it is important]
30
+ 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.
31
+
32
+ [Code reference]
33
+ (## Tester note: iOS and Android image attributes for decorative, hidden, or null go here – delete me ##)
34
+ {code:swift}
35
+ ...
36
+ {code}
37
+
38
+ [How to fix]
39
+ Ensure that decorative images and icons are programmatically hidden. Use the correct function to hide the decorative image or icon.
40
+
41
+ [Compliant code example]
42
+ (## Tester note: n/a here if not applicable and is a design change and delete me ##)
43
+
44
+ **Android — XML**
45
+ Use `android:importantForAccessibility="no"` to ensure that the image is not considered for accessibility purposes. This will prevent TalkBack from announcing the image.
46
+
47
+ **Android — Jetpack Compose**
48
+ Set `contentDescription = null` for decorative elements to ensure that the content description is not announced by TalkBack.
49
+ {code:java}
50
+ Image(
51
+ painter = painterResource(id = R.drawable.decorative_image),
52
+ contentDescription = null
53
+ )
54
+ {code}
55
+
56
+ **iOS — SwiftUI**
57
+ Use the modifier `.accessibilityHidden(true)` to hide an icon or image from VoiceOver, Full Keyboard Access, and Switch Control.
58
+ 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.
59
+ {code:swift}
60
+ Image(decorative: "decorative_image")
61
+ // or
62
+ Image("decorative_image")
63
+ .accessibilityHidden(true)
64
+ {code}
65
+
66
+ **iOS — UIKit**
67
+ Use `imageView.isAccessibilityElement = false` to ensure the image view is ignored by VoiceOver, meaning it won't be announced or focusable.
68
+
69
+ [How to test]
70
+ Automated:
71
+ - Not Applicable
72
+
73
+ Manual:
74
+ - Inspect the screen to identify images which have adjacent text descriptions or are non-essential.
75
+ - 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.
76
+ - Review the list of decorative images to ensure that each uses a valid programmatic hidden, decorative, or null description value.
77
+
78
+ [MagentaA11y]
79
+ https://www.magentaa11y.com/checklist-native/image-decorative/
80
+
81
+ [Resources]
82
+ Decorative Images
83
+ https://www.w3.org/WAI/tutorials/images/decorative/
84
+
85
+ Android Developers: Decorative Images
86
+ https://developer.android.com/guide/topics/ui/accessibility/principles#decorative
87
+
88
+ [WCAG]
89
+ 1.1.1 Non-text Content (Level A)
90
+
91
+ [Operating system]
92
+ ######
93
+
94
+ [Build Version]
95
+ ######
96
+
97
+ [Assistive technology]
98
+ VoiceOver
99
+ TalkBack
@@ -0,0 +1,71 @@
1
+ # Items should be grouped
2
+
3
+ ## Severity
4
+ 3-Average
5
+
6
+ ## Suggested Priority
7
+ Medium
8
+
9
+ -------- copy below ---------
10
+
11
+ [URL/Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ (## Tester note: Describe where the thing is in the UI and delete me ##)
19
+
20
+ [What is the issue]
21
+ Related items are not properly grouped, which impacts the navigation and understanding for users relying on screen readers and braille displays or keyboards.
22
+
23
+ [Why it is important]
24
+ 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.
25
+
26
+ [Code reference]
27
+ - In SwiftUI, group multiple elements with the `.accessibilityElement(children:)` modifier and with the `.combine` option on a parent view.
28
+ - In Jetpack Compose, group elements by using `mergeDescendants`.
29
+ - For Android Views, group all the relevant content elements in a single layout ViewGroup and set `android:importantForAccessibility="yes"` on that ViewGroup.
30
+
31
+ [How to fix]
32
+ (## Tester note: If needed add to this content to describe expected grouping ##)
33
+ - Review the order of focusable/swipeable elements and ensure related elements are logically grouped.
34
+
35
+ [Compliant code example]
36
+ (## Tester note: n/a here if not applicable — code formatting options: code:swift, code:java ##)
37
+ {code:swift}
38
+ ...
39
+ {code}
40
+
41
+ [How to test]
42
+ - Automated: Use tools like Android Accessibility Scanner or iOS Accessibility Inspector to detect missing or incorrect groupings.
43
+ - 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.
44
+
45
+ [MagentaA11y]
46
+ https://www.magentaa11y.com/checklist-native/focus/
47
+
48
+ [Resources]
49
+ - Android Developers: Groups of Related Content
50
+ https://developer.android.com/guide/topics/ui/accessibility/principles#content-groups
51
+ - Accessibility group in Jetpack Compose
52
+ https://appt.org/en/docs/jetpack-compose/samples/accessibility-group
53
+ - Accessibility Group on iOS
54
+ https://appt.org/en/docs/ios/samples/accessibility-group
55
+ - Accessibility Group on React Native
56
+ https://appt.org/en/docs/react-native/samples/accessibility-group
57
+
58
+ [WCAG]
59
+ 1.3.1 Info and Relationships (A)
60
+ 3.3.2 Labels or Instructions (A)
61
+
62
+ [Operating system]
63
+ iOS
64
+ Android
65
+
66
+ [Build Version]
67
+ ###### E.g. 10.6.0
68
+
69
+ [Assistive technology]
70
+ VoiceOver
71
+ TalkBack
@@ -0,0 +1,76 @@
1
+ # State is not communicated for button
2
+
3
+ ## Severity
4
+ 2-Severe
5
+
6
+ ## Suggested Priority
7
+ High
8
+
9
+ -------- copy below ---------
10
+
11
+ [Path]
12
+ ######
13
+
14
+ [Steps to reproduce]
15
+ ######
16
+
17
+ [Element]
18
+ The ##### button located #####
19
+
20
+ [What is the issue]
21
+ The ##### control with a dynamic state of ##### does not communicate its state to screen reader users.
22
+
23
+ [Why it is important]
24
+ 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.
25
+
26
+ 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."
27
+
28
+ [How to fix]
29
+ - Use native controls and State will naturally be communicated.
30
+ - For a toggle button, ensure states like "selected," "pressed," or "disabled" are programmatically exposed using platform-specific APIs.
31
+ - On iOS, use {{.accessibilityValue}} to indicate the current state of the button (e.g., "On" or "Off").
32
+ - On Android, set the {{contentDescription}} dynamically to reflect the button's state, or use accessibility APIs like {{AccessibilityNodeInfo.setText()}} to provide state information.
33
+
34
+ [Compliant code example]
35
+ iOS
36
+ {code:swift}
37
+ Toggle("Enable Feature", isOn: $isOn)
38
+ .accessibilityValue(isOn ? "On" : "Off")
39
+ {code}
40
+
41
+ Android
42
+ {code:java}
43
+ val isChecked = remember { mutableStateOf(false) }
44
+ Checkbox(
45
+ checked = isChecked.value,
46
+ onCheckedChange = { isChecked.value = it },
47
+ modifier = Modifier.semantics { contentDescription = if (isChecked.value) "Checked" else "Unchecked" }
48
+ )
49
+ {code}
50
+
51
+ [How to test]
52
+ - 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.
53
+
54
+ [MagentaA11y]
55
+ https://www.magentaa11y.com/checklist-native/button/
56
+
57
+ [Resources]
58
+ ######
59
+
60
+ [WCAG]
61
+ 4.1.2 Name, Role, Value (A)
62
+ 1.3.1: Info and Relationships (A)
63
+
64
+ [Operating system]
65
+ (## Tester note: Choose one and delete me ##)
66
+ iOS
67
+ Android
68
+
69
+ [Build Version]
70
+ ###### E.g. 10.6.0
71
+
72
+ [Assistive technology]
73
+ (## Tester note: Choose one and delete me ##)
74
+ VoiceOver
75
+ TalkBack
76
+ Keyboard