skills/mobile-accessibility-compliance-expert/SKILL.md
Mobile accessibility compliance expert for VoiceOver, TalkBack, Dynamic Type, and WCAG mobile guidelines. Activate on: mobile accessibility, VoiceOver, TalkBack, Dynamic Type, Accessibility Inspector, WCAG mobile, screen reader, accessibility audit, a11y mobile, inclusive design. NOT for: web accessibility (use design-accessibility-auditor), UI design (use native-app-designer), general testing (use test-automation-expert).
npx skillsauth add curiositech/windags-skills mobile-accessibility-compliance-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in mobile accessibility compliance with VoiceOver, TalkBack, Dynamic Type, and WCAG mobile-specific guidelines.
Activate on: "mobile accessibility", "VoiceOver", "TalkBack", "Dynamic Type", "Accessibility Inspector", "WCAG mobile", "screen reader mobile", "accessibility audit mobile", "a11y mobile", "inclusive mobile design"
NOT for: Web accessibility → design-accessibility-auditor | UI design → native-app-designer | General testing → test-automation-expert
| Domain | Technologies | |--------|-------------| | iOS | VoiceOver, Accessibility Inspector, UIAccessibility, Dynamic Type | | Android | TalkBack, Accessibility Scanner, AccessibilityNodeInfo, sp units | | React Native | accessibilityLabel, accessibilityRole, accessibilityState, importantForAccessibility | | Flutter | Semantics widget, SemanticsService, Flutter Accessibility | | Standards | WCAG 2.2 Level AA, EN 301 549, Section 508, ADA |
// Interactive button with full accessibility
<Pressable
onPress={handleAddToCart}
accessibilityRole="button"
accessibilityLabel="Add to cart"
accessibilityHint="Adds this item to your shopping cart"
accessibilityState={{ disabled: isOutOfStock }}
>
<CartIcon />
<Text>Add to Cart</Text>
</Pressable>
// Image with description
<Image
source={{ uri: product.image }}
accessibilityRole="image"
accessibilityLabel={`Photo of ${product.name}`}
/>
// Decorative image (hidden from screen reader)
<Image
source={decorativeBorder}
accessibilityElementsHidden={true} // iOS
importantForAccessibility="no" // Android
/>
// Live region for dynamic updates
<View
accessibilityLiveRegion="polite" // Announces changes
accessibilityRole="alert"
>
<Text>{`${cartCount} items in cart`}</Text>
</View>
iOS Dynamic Type Scale:
├─ xSmall (85%) │ Minimum supported
├─ Small (90%) │
├─ Medium (95%) │
├─ Large (100%) │ Default
├─ xLarge (110%) │
├─ xxLarge (120%) │
├─ xxxLarge (135%) │
└─ Accessibility sizes:
├─ AX1 (160%) │
├─ AX2 (190%) │
├─ AX3 (235%) │
├─ AX4 (275%) │
└─ AX5 (310%) │ Maximum
Requirements:
1. Text MUST scale with system font size setting
2. Layout MUST NOT clip or overlap at largest sizes
3. Horizontal scrolling MUST NOT be required
4. Touch targets MUST remain at least 44x44pt (iOS) / 48x48dp (Android)
Manual Testing (required):
│
├─ Screen Reader Test:
│ ├─ Enable VoiceOver / TalkBack
│ ├─ Navigate every screen linearly (swipe right/left)
│ ├─ Verify: every element has a meaningful label
│ ├─ Verify: reading order matches visual layout
│ ├─ Verify: interactive elements announce role + state
│ └─ Verify: decorative elements are hidden
│
├─ Motor Accessibility:
│ ├─ All touch targets >= 44pt / 48dp
│ ├─ No gesture-only interactions (always a button alternative)
│ ├─ Switch Control (iOS) / Switch Access (Android) navigation
│ └─ No time-limited interactions without extension option
│
├─ Visual Accessibility:
│ ├─ Contrast ratio >= 4.5:1 (text), >= 3:1 (large text, UI)
│ ├─ Content visible in Dark Mode and High Contrast
│ ├─ Not conveying info by color alone (add icons/patterns)
│ └─ Dynamic Type: test at smallest and largest sizes
│
└─ Automated Testing:
├─ Xcode Accessibility Inspector audit
├─ Android Accessibility Scanner
├─ Detox/Maestro with accessibility assertions
└─ axe-core for React Native Web
accessibilityLabel.sp on Android, Dynamic Type on iOS, rem in React Native Web).[ ] Every interactive element has accessibilityLabel and accessibilityRole
[ ] Decorative elements hidden from screen readers
[ ] Reading order verified with VoiceOver and TalkBack
[ ] Touch targets meet minimum size (44pt iOS, 48dp Android)
[ ] Dynamic Type supported — layout tested at AX5 (310%)
[ ] Color contrast meets WCAG AA (4.5:1 text, 3:1 UI components)
[ ] Information not conveyed by color alone
[ ] Gesture-based actions have button alternatives
[ ] Screen reader announces state changes (loading, errors, success)
[ ] Focus management: focus moves logically after navigation and modals
[ ] Time-limited interactions can be extended or disabled
[ ] Accessibility Inspector / Scanner audit passes with zero errors
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.