Expert accessibility decisions for iOS/tvOS: when to combine vs separate elements, label vs hint selection, Dynamic Type layout strategies, and WCAG AA compliance trade-offs. Use when implementing VoiceOver support, handling Dynamic Type, or ensuring accessibility compliance. Trigger keywords: accessibility, VoiceOver, Dynamic Type, WCAG, a11y, accessibilityLabel, accessibilityElement, accessibilityTraits, isAccessibilityElement, reduceMotion, contrast, focus
View on GitHubKaakati/rails-enterprise-dev
reactree-ios-dev
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/Kaakati/rails-enterprise-dev/blob/main/plugins/reactree-ios-dev/skills/accessibility-patterns/SKILL.md -a claude-code --skill accessibility-patternsInstallation paths:
.claude/skills/accessibility-patterns/# Accessibility Patterns — Expert Decisions
Expert decision frameworks for accessibility choices. Claude knows accessibilityLabel and VoiceOver — this skill provides judgment calls for element grouping, label strategies, and compliance trade-offs.
---
## Decision Trees
### Element Grouping Strategy
```
How should VoiceOver read this content?
├─ Logically related (card, cell, profile)
│ └─ Combine: .accessibilityElement(children: .combine)
│ Read as single unit
│
├─ Each part independently actionable
│ └─ Keep separate
│ User needs to interact with each
│
├─ Container with multiple actions
│ └─ Combine + custom actions
│ Single element with .accessibilityAction
│
├─ Decorative image with text
│ └─ Combine, image hidden
│ Image adds no meaning
│
└─ Image conveys different info than text
└─ Keep separate with distinct labels
Both need to be announced
```
**The trap**: Combining elements that have different actions. User can't interact with individual parts.
### Label vs Hint Decision
```
What should be in label vs hint?
├─ What the element IS
│ └─ Label
│ "Play button", "Submit form"
│
├─ What happens when activated
│ └─ Hint (only if not obvious)
│ "Double tap to start playback"
│
├─ Current state
│ └─ Value
│ "50 percent", "Page 3 of 10"
│
└─ Control behavior
└─ Traits
.isButton, .isSelected, .isHeader
```
### Dynamic Type Layout Strategy
```
How should layout adapt to larger text?
├─ Simple HStack (icon + text)
│ └─ Stay horizontal
│ Icons scale with text
│
├─ Complex HStack (image + multi-line)
│ └─ Stack vertically at xxxLarge
│ Check @Environment(\.dynamicTypeSize)
│
├─ Fixed-height cells
│ └─ Self-sizing
│ Remove height constraints
│
└─ Toolbar/navigation elements
└─ Consider overflow menu
Or scroll at extreme sizes
```
### Reduce Motion Response
```
What happens when Reduce Motion is enabled?
├─ Transition between screens
│ └─ Instant or simple fade
│ No slide/zoom ani