A Skill that will help agents audit your app or concrete features against accessibility norms and WCAG 2.2 in particular.
- Focuses on iOS and SwiftUI
- Provides an audit, not fixes
- Suggests follow-up human checks to perform
Audit includes a problem, WCAG paragraph and a suggested solution with a code snippet. All in a descending priority markdown list. Looks like this:
What: Likely issue (confidence: high). Task rows are interactive via .onTapGesture / .onLongPressGesture on a non-control container, so role/action/state exposure is not reliably equivalent to a native control for VoiceOver, Switch Control, or keyboard-style navigation.
Where: HistoryView.swift
Fix suggestion: Use a semantic Button for toggle, expose done/not-done as accessibility value, and provide copy as an explicit accessibility action.
WCAG: 4.1.2 - Name, Role, Value (A); 2.1.1 - Keyboard (A)
ForEach(todosForDate) { todo in
let title = todo.title ?? ""
Button {
if isTogglable { toggleTodo(todo) }
} label: {
HistoryTodoView(title: title, isDone: todo.isDone == true)
.frame(maxWidth: .infinity, alignment: .leading)
}
.buttonStyle(.plain)
.contentShape(.rect)
.accessibilityLabel(title)
.accessibilityValue(todo.isDone == true ? "Done" : "Not done")
.accessibilityHint(isTogglable ? "Double tap to toggle completion." : "Read-only for this date.")
.accessibilityAction(named: Text("Copy title")) {
UIPasteboard.general.string = title
toastToShow = Toast(text: "Copied to clipboard", style: .info)
}
}What: Copied to clipboard feedback is pushed through toast + haptic only; there is no UIAccessibility.post(.announcement, ...) on this feature path, so VoiceOver users may miss transient feedback.
Where: HistoryView.swift, ToastMessageOverlay.swift
Fix suggestion: Post an accessibility announcement when copy succeeds (or centralize this in the toast modifier for all feature toasts).
WCAG: 4.1.3 - Status Messages (AA)
.onLongPressGesture(
minimumDuration: 1,
perform: {
UIPasteboard.general.string = todo.title
toastToShow = Toast(text: "Copied to clipboard", style: .info)
UIAccessibility.post(
notification: .announcement,
argument: NSLocalizedString("Copied to clipboard", comment: "History copy feedback")
)
},
onPressingChanged: { isBeingPressed in
longPressedTodoAndDate = isBeingPressed ? (todo, .now) : nil
}
)...
...
Audited with Swiftui Wcag Accessibility Auditor as a code-only review (no app run).
In scope: HistoryView.swift, and ToastMessageOverlay.swift
Set Dynamic Type to the largest accessibility size, open History in portrait and landscape, and verify all three mosaic legend labels remain fully readable without clipping/truncation.
With VoiceOver enabled, trigger “copy to clipboard” on a history task and verify the confirmation is announced once, at the moment the toast appears.