uttrflow / uttrflow/uttrflow-swift
The floating button exposes no accessibility action or button role, so VoiceOver cannot start a dictation from it
- 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
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