uttrflow / uttrflow/uttrflow-swift
VoiceOver hears none of the clipboard panel's notices: "Copied — press ⌘V", a refused write, the undo offer or a missing picture
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
The panel reports what just happened in a notice bar or the hint line (`Sources/Uttrflow/Panel/QuickPanelView.swift:341-364`, `:665-673`):
- copy-only results: "Copied — press ⌘V where you want it", "Copied — press ⌘V. Turn on Accessibility and Uttrflow can paste for you." (`Sources/UttrflowUX/PanelInsertion.swift:60-79`)
- a refused write (`PanelNotice.writeFailed`)
- "Deleted · ⌘Z to put it back" (`PanelPresentation.swift:311`)
- "That picture is no longer on this Mac" (`PanelEffect.swift:39-43`)
None of them is posted as an accessibility announcement. `Sources/` contains no `AccessibilityNotification`, `NSAccessibility.post` or `.announcement` at all. The views change on screen, and after a copy-only result the panel closes itself 2.5 s later (`AppDelegate.swift:1106-1115`). A VoiceOver user whose focus is on the row they chose never reaches the notice bar before it disappears.
The row's hint also always says "Pastes where you were typing" (`QuickPanelView.swift:466`), including when the panel already knows it can only copy (`snapshot.insertion == .clipboardOnly`).
## Why it matters
For a VoiceOver user, choosing a clip without Accessibility permission sounds identical to a successful paste: the panel closes and nothing arrives. The undo offer after a delete, which replaced a confirmation dialog, is never heard, so for them a delete is silently irreversible.
## Acceptance criteria
- Each `PanelNotice` shown, and the undo hint, is announced once when it appears (for example `AccessibilityNotification.Announcement(message).post()`), at a priority that is not interrupted by the panel closing.
- In copy-only mode the row hint says that choosing copies rather than pastes.
- The announcement text comes from the presenter, so a test in `Tests/UttrflowUXTests` can check what would be said for each notice. Only the posting stays in the view.
- `Docs/app-quick-panel.md` says which events are announced.
Contributor guide
Research direction
Start with the notice and hint paths in Sources/Uttrflow/Panel/QuickPanelView.swift, PanelInsertion.swift, PanelPresentation.swift, and PanelEffect.swift, then inspect the presenter and Tests/UttrflowUXTests. Verify each PanelNotice and undo hint has one announcement, copy-only mode has distinct wording, and Docs/app-quick-panel.md lists the announced events.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, swift
- Domain
- accessibility, desktop, documentation
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 74/100