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
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.