From maui-skills
Guides adding screen reader support to .NET MAUI apps via SemanticProperties, heading levels, AutomationProperties, focus management, and gotchas for TalkBack, VoiceOver, Narrator.
How this skill is triggered — by the user, by Claude, or both
Slash command
/maui-skills:maui-accessibilityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Setting `SemanticProperties.Description` on a `Label` **overrides** the `Text`
Setting SemanticProperties.Description on a Label overrides the Text
property for screen readers. The label may be read twice or behave unexpectedly.
<!-- ❌ Stops Text from being read naturally -->
<Label Text="Welcome"
SemanticProperties.Description="Welcome" />
<!-- ✅ Screen reader reads Text automatically -->
<Label Text="Welcome" />
On Android, setting SemanticProperties.Description on Entry or Editor
causes TalkBack to lose "double tap to edit" action hints.
<!-- ❌ Breaks TalkBack on Android -->
<Entry SemanticProperties.Description="Email address" />
<!-- ✅ Use Placeholder for context instead -->
<Entry Placeholder="Email address" />
On iOS/VoiceOver, setting SemanticProperties.Description on a layout makes the
entire container a single accessible element — child elements become unreachable.
<!-- ❌ Children invisible to VoiceOver -->
<HorizontalStackLayout SemanticProperties.Description="User info">
<Label Text="Name:" />
<Label Text="Alice" />
</HorizontalStackLayout>
<!-- ✅ Let children be individually focusable -->
<HorizontalStackLayout>
<Label Text="Name:" />
<Label Text="Alice" />
</HorizontalStackLayout>
On Android, SemanticProperties.Hint and Entry.Placeholder map to the same
Android attribute (contentDescription / hint). Setting both causes one to
override the other. Choose one.
Level1–Level9).Use heading levels for semantic correctness — just know the hierarchy only renders on Windows.
When auditing or retrofitting a page:
SemanticProperties.Description to meaningful images.
Set AutomationProperties.IsInAccessibleTree="false" on decorative ones.Description.
Text buttons generally don't need it.Placeholder for context. Add Hint only if
extra instruction is needed. Avoid Description (Android breakage).Description — let Text speak for itself.
Add HeadingLevel to section headers.Level1, section titles as Level2, etc.Description on layout containers (iOS breakage).
Use ExcludedWithChildren to hide decorative groups.SemanticScreenReader.Announce for status
changes. Use SetSemanticFocus after navigation or error display.TabIndex on interactive controls for logical order.npx claudepluginhub davidortinau/maui-skills --plugin maui-skillsBuilding accessible .NET UI. SemanticProperties, ARIA, AutomationPeer, testing tools per platform.
Implements and audits accessibility in iOS/macOS apps with SwiftUI and UIKit. Covers VoiceOver, Switch Control, Dynamic Type, focus management, custom rotors, and XCTest a11y testing.
Provides mobile accessibility patterns for Android Jetpack Compose and iOS: content descriptions, semantics, touch targets, screen reader support, WCAG compliance, dynamic type, color contrast.