Skip to content

ramzesenok/iOS-Accessibility-Audit-Skill

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

iOS-Accessibility-Audit-Skill

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:

Findings - P1

1. Gesture-based task rows do not expose reliable control semantics

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)
    }
}

2. Copy feedback is shown visually/haptically but not announced as a status message

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
    }
)

Findings - P2

...

Findings - P3

...

Scope / Assumptions

Audited with Swiftui Wcag Accessibility Auditor as a code-only review (no app run).

In scope: HistoryView.swift, and ToastMessageOverlay.swift

User Follow-Up Checks

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.

About

A Skill that will help agents audit your app or concrete features against accessibility norms

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors