uttrflow / uttrflow/uttrflow-swift

The floating button exposes no accessibility action or button role, so VoiceOver cannot start a dictation from it

Open
#552 0 comments 0 reactions 0 assignees View on GitHub
accessibility area:dictation bug P2
Dominant language
Swift
Stars
4
Forks
17
Avg merge
3h 32m
Merged PRs (30d)
277

Description

## What happens

`DockView` (`Sources/Uttrflow/Dock/DockView.swift:73-89`) starts and stops dictation with a `DragGesture(minimumDistance: 0)` on the root (`:290-302`) and then collapses the whole view with `.accessibilityElement(children: .combine)` and an explicit `.accessibilityLabel`. There is no `.accessibilityAction`, no `.isButton` trait and no hint anywhere in the file. So the element VoiceOver lands on is a label with no default action: VO-Space does not start or stop a dictation.

In the wide failure form (`:251-277`) the recovery button ("Try Again", "Open Settings", "Download"…) is a child of that combined element, and the element's label is replaced by `presentation.accessibilityLabel`, which never names the button (`Sources/UttrflowPipeline/DictationPresenter.swift:99-108`). The live level meter (`:348-370`) is a `Canvas` with no value.

## Why it matters

A VoiceOver user who navigates to the button cannot use it, and cannot discover the recovery action a failure offers there.

## How to check

`make app`, open Accessibility Inspector (Xcode > Open Developer Tool), point it at the floating button in its resting, recording and failure forms. Note role, actions and children. Then try VO-Space on it with VoiceOver on.

## Acceptance criteria

- The button has a button role and a default accessibility action that toggles dictation (the same `toggleFromControl` path the menu bar uses, since a press-and-hold cannot be performed by VoiceOver).
- In the failure form the recovery is reachable, either as a named custom action or as a separate element, with the same title the button draws.
- While recording, the element carries a value or hint that says it is listening (the meter itself need not be exposed).
- Checked with Accessibility Inspector and VoiceOver; the pull request says which forms were checked.

Contributor guide

Open the contributing guide

Research direction

Start in Sources/Uttrflow/Dock/DockView.swift:73-89 and :251-302; read DictationPresenter.swift:99-108 and trace toggleFromControl. Build with make app, then inspect the resting, recording and failure forms using Accessibility Inspector and VoiceOver. Done means the control exposes a button action, the failure recovery remains reachable with its drawn title, and recording exposes a listening value or hint.

Written by the indexing model from the issue text.

Assessment

Tech stack
macos, swift
Domain
accessibility, desktop
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.