Add accessibility checklist for native mobile experiences#41
Add accessibility checklist for native mobile experiences#41janmaarten-a11y wants to merge 7 commits intomainfrom
Conversation
This document provides a comprehensive checklist for accessibility considerations specific to native mobile experiences, including guidelines, best practices, and resources for iOS and Android applications.
Co-authored-by: Eric Bailey <ericwbailey@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds a new, mobile-specific accessibility checklist to complement the existing designer and engineering checklists, addressing mobile-native patterns and audit considerations requested in issue #36.
Changes:
- Introduces
checklists/mobile-checklist.mdwith an iOS/Android-focused accessibility checklist (WCAG 2.2 + WCAG2Mobile/WCAG2ICT guidance + platform best practices). - Includes annotation pointers, testing recommendations, and a curated set of resources for mobile accessibility work.
Show a summary per file
| File | Description |
|---|---|
| checklists/mobile-checklist.md | Adds a comprehensive native mobile accessibility checklist covering key areas (color, hierarchy, gestures, platform behavior, navigation, etc.). |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 1/1 changed files
- Comments generated: 3
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
joelamyman
left a comment
There was a problem hiding this comment.
@janmaarten-a11y as always, this is such a fantastic resource - super comprehensive and easy to follow!
I've left some minor comments, please feel free to use/dismiss them as you see necessary! If there are any questions, please let me know 😄
| - [ ] **Roles and traits are specified per platform** | ||
| - iOS uses traits (button, header, adjustable, selected). Android uses roles and state descriptions. Annotate both if you ship to both. | ||
| - [ ] **Hints are used only for non-obvious interactions** | ||
| - Don't put critical info in hints. Users can disable them, and they're announced last. |
There was a problem hiding this comment.
This is an excellent point to raise as its something that feels like its missed quite often, so great to include it here!!
| - [ ] **Stock components use the platform's native accessibility behavior** | ||
| - When using a system component, toggle "Follow stock native pattern" in your Mobile Details annotation and link to the platform docs. | ||
| - [ ] **Platform conventions are respected** | ||
| - Back navigation, modal dismissal, and primary action placement differ between iOS and Android. Don't force one platform's pattern onto the other. |
There was a problem hiding this comment.
This is a really important point for usability, so it's great to see it included here! 🙌
Updated language for clarity and added guidance on accessibility practices in mobile app design.
Added a checklist for mobile accessibility considerations.
Updated checklist items to include links for Smart Invert, color correction, VoiceOver, TalkBack, Reduce Motion, iOS Dynamic Type, and Android Font Size Scaling for better accessibility guidance. h/t @ericwbailey
|
Thanks all for the thorough and thoughtful review! 🙌 I've pushed the remaining updates addressing every open comment. What changed in this round:
I also added links to this new doc from the repo README.md and the Mobile annotations tutorial. What I didn't take:
Re-requesting review from @ericwbailey and @joelamyman. Thanks again for making this much sharper than where it started! |
|
|
||
| - [Check color contrast - Figma Docs](https://help.figma.com/hc/en-us/articles/360041003774-Apply-paints-with-the-color-picker#h_01JQF1T71AC72G6VDXN27B77V0) | ||
| - [Web Color Contrast Checker - WebAIM](https://webaim.org/resources/contrastchecker/) | ||
| - [Colour Contrast Analyzer for Mac and Windows - TPGi](https://www.tpgi.com/color-contrast-checker/) |
There was a problem hiding this comment.
Worth a mention that the Android Accessibility Scanner can detect contrast issues? It's not fool-proof, but it's decent.
|
|
||
| - [ ] **Each screen has at most one Title** | ||
| - Not every screen needs a title, but if one is needed, only one is used. Titles live in the top app bar (Android) or navigation bar (iOS) and are announced on view transition. Note: in WCAG terms, [SC 2.4.2 Page Titled](https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html) applies to the application as a whole on native, but the per-screen title is still the right pattern for orientation. | ||
| - [ ] **Headings are used sparingly and only when they help structure the screen** |
There was a problem hiding this comment.
If a screen doesn't have a title in the top bar, I always highly encourage that the screen have some kind of prominent heading at or near the top of content.
| - [ ] **Hints are used only for non-obvious interactions** | ||
| - Don't put critical info in hints. Users can disable them, and they're announced last. | ||
| - [ ] **Decorative elements are hidden from assistive tech** | ||
| - Mark with `accessibilityElementsHidden` (iOS) or `importantForAccessibility="no"` (Android). |
There was a problem hiding this comment.
Rather than accessibilityElementsHidden, I'd recommending citing .accessibilityHidden set to true, which is specific to iOS (SwiftUI specifically).
| - [ ] **Decorative elements are hidden from assistive tech** | ||
| - Mark with `accessibilityElementsHidden` (iOS) or `importantForAccessibility="no"` (Android). | ||
| - [ ] **Language of the app is set, and any sections in a different language are identified** | ||
| - On native, [SC 3.1.1 Language of Page](https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html) applies to the application as a whole, not individual screens. For inline text in a different language, identify it programmatically per [SC 3.1.2 Language of Parts](https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html). |
There was a problem hiding this comment.
Consider adding a reference link for this, as it's kind of varsity-level. Appt.org has a good starting point that covers all major native mobile frameworks: https://appt.org/en/guidelines/wcag/success-criterion-3-1-2
| ### Resources | ||
|
|
||
| - [Getting To The Bottom Of Minimum WCAG-Conformant Interactive Element Size - Smashing Magazine](https://www.smashingmagazine.com/2024/07/getting-bottom-minimum-wcag-conformant-interactive-element-size/) | ||
| - [Apple HIG: Buttons](https://developer.apple.com/design/human-interface-guidelines/buttons) |
There was a problem hiding this comment.
This link covers target size on a platform rather than component level: https://developer.apple.com/design/human-interface-guidelines/accessibility#Mobility
| - [ ] **There are no focus traps** | ||
| - Modals, sheets, and overlays must let users dismiss and return focus to a logical place. Per [SC 2.1.2 No Keyboard Trap](https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html). | ||
| - [ ] **Custom controls expose proper accessibility actions** | ||
| - A custom slider should respond to increment/decrement actions, not just drag. |
| - [ ] **Stock components use the platform's native accessibility behavior** | ||
| - When using a system component, toggle "Follow stock native pattern" in your Mobile Details annotation and link to the platform docs. | ||
| - [ ] **Platform conventions are respected** | ||
| - Back navigation, modal dismissal, and primary action placement differ between iOS and Android. Don't force one platform's pattern onto the other. |
There was a problem hiding this comment.
Worth mentioning the VO scrub gesture here, that behaves similar to the back button? It can navigate backward, dismiss modals, and be assigned to collapse/hide custom components when it makes sense. If you're not using stock components, users will expect support of the scrub gesture and it has to be added manually.
| - [ ] **Adjacent targets have enough spacing** | ||
| - Aim for at least 8 pt/dp between tappable elements to prevent mis-taps. | ||
| - [ ] **Buttons and links are used appropriately** | ||
| - Buttons trigger actions. Links navigate. Don't style one as the other. When annotating, identify every element that performs an action when activated so the right role is applied. |
There was a problem hiding this comment.
It's less clearcut on mobile -- the general practice I teach and that most platform apps seem to follow is that anything that navigates you within an app, or that triggers a system function (e.g. initiating a phone call) is a button. Links are reserved for content that opens in the device browser, or possibly web views.
| - [ ] **Automatic transitions are avoided or controllable** | ||
| - System-initiated screen, state, or content changes should be paused, slowed, or dismissable. Common offenders: onboarding carousels, auto-advancing tutorials. Per [SC 3.2.1 On Focus](https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html) and [SC 3.2.2 On Input](https://www.w3.org/WAI/WCAG22/Understanding/on-input.html). | ||
| - [ ] **Opening external content is announced** | ||
| - "Opens in Safari", "Opens in browser", or "Opens in a new window" warnings prevent disorientation, especially when leaving an app for a web view. |
There was a problem hiding this comment.
Recommend striking the Safari example since iPhone users can customize their default browser (even if it is all just Safari/Webkit under the hood 🙃 )
|
|
||
| ## 13. Notifications and live updates | ||
|
|
||
| - [ ] **Status changes are announced via Live Regions** |
There was a problem hiding this comment.
Live Regions live accessibility announcements
(live regions aren't really a thing, although we can accomplish similar goals. Just different terms.)
joelamyman
left a comment
There was a problem hiding this comment.
Just completed another review, all of the changes look good to me - I caught a TPGi link that should be changed to Vispero after their recent rebranding, but that's it! 😄
|
|
||
| - [Check color contrast - Figma Docs](https://help.figma.com/hc/en-us/articles/360041003774-Apply-paints-with-the-color-picker#h_01JQF1T71AC72G6VDXN27B77V0) | ||
| - [Web Color Contrast Checker - WebAIM](https://webaim.org/resources/contrastchecker/) | ||
| - [Colour Contrast Analyzer for Mac and Windows - TPGi](https://www.tpgi.com/color-contrast-checker/) |
There was a problem hiding this comment.
Only just caught this, but as a heads up, TPGi are now Vispero - so I think this should be:
- [Colour Contrast Analyzer for Mac and Windows - Vispero](https://vispero.com/lp/color-contrast-checker/)
Closes #36
Overview
This pull request adds a comprehensive accessibility checklist specifically for native mobile applications (iOS and Android) in the new file
checklists/mobile-checklist.md. The checklist consolidates WCAG 2.2 requirements, W3C mobile guidance, and platform best practices into actionable items for designers and engineers working on native mobile experiences. It covers all major accessibility considerations, provides annotation guidance, and includes resources and testing recommendations.