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.
npx claudepluginhub davidortinau/maui-skills --plugin maui-skillsThis skill uses the workspace's default tool permissions.
Setting `SemanticProperties.Description` on a `Label` **overrides** the `Text`
Implements, reviews, or improves accessibility in iOS/macOS apps with SwiftUI and UIKit, covering VoiceOver, focus management, Dynamic Type, custom rotors, and XCTest 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.
Designs, implements, and audits WCAG 2.2 AA accessible UIs for web, iOS, Android using semantic ARIA, native traits, and POUR principles.
Share bugs, ideas, or general feedback.
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.