uttrflow / uttrflow/uttrflow-swift
The clipboard panel's row actions cannot be reached from the keyboard: reveal, pin, name, move, copy and delete need the pointer
- Dominant language
- Swift
- Stars
- 4
- Forks
- 17
- Avg merge
- 3h 32m
- Merged PRs (30d)
- 277
Description
## What happens
The search field is the only thing that takes keys in the panel (`Sources/Uttrflow/Panel/QuickPanelView.swift:133-139`). It handles ↑, ↓, Return, Escape, ⌘Z, ⌘Return and ⌘1–⌘9 (`:911-931`), and nothing else.
Everything else a row can do is in the ⋯ menu (`PanelPresenter.actions`, `Sources/UttrflowUX/PanelPresentation.swift:425-471`): Reveal, Copy, Pin/Unpin, Name, Move, Format, Re-indent, Make a note and Delete. That menu opens only on a click on the ⋯, which is drawn in near-invisible grey until hover (`panelGhost`, `QuickPanelView.swift:560-564`), or on a right-click or control-click (`RightClickWatch`, `:965-1003`). `PanelKey` already has `.reveal`, `.alias`, `.move` and `.delete` (`Sources/UttrflowUX/PanelKeyboard.swift:24-31`), but no key sends them. VoiceOver users can reach the actions through `accessibilityActions` (`QuickPanelView.swift:468-473`). Sighted keyboard-only users, including Full Keyboard Access and switch users, cannot.
Also missing:
- Page Up / Page Down / Home / End (or ⌘↑ / ⌘↓) in a list of up to 1,000 rows. ↑↓ stop one row at a time (`PanelKeyboard.swift:139-146`).
- The hint line teaches only "↑↓ to choose · ⏎ to paste · esc to close" (`PanelPresentation.swift:306`). ⌘Return (paste without formatting) and ⌘Z (undo delete, only announced after a delete) are not discoverable.
## Why it matters
It is a keyboard-first panel that cannot be fully used from the keyboard. Revealing a hidden credential, pinning the clip you are about to need again, or deleting one you should not have kept all mean reaching for the trackpad. For users who cannot use a pointer, those features do not exist.
## Decision needed
Which chords. They must not collide with the search field's own editing keys: ⌫ and ⌘⌫ edit the query, and ⌘A / ⌘C / ⌘V / ⌘X select, copy, paste and cut in the field. Candidates: ⌘P pin, ⌘R reveal, ⌘N name, ⌘M move, ⌘⇧C copy, ⌘⌫ delete when the field is empty. Alternatively, one key (for example → or ⌘K) could open the ⋯ menu for the selected row, with arrow and Return navigation inside it.
## Acceptance criteria
- Every action in `PanelPresenter.actions` can be performed on the selected row without a pointer.
- Large jumps through the list are possible from the keyboard.
- The chosen keys are handled in `PanelSnapshot.applying` where possible, with tests in `Tests/UttrflowUXTests`, and listed in `Docs/shortcuts.md`.
- The ⋯ menu and the hint show the keys, so they can be discovered.
Contributor guide
Research direction
Start with QuickPanelView.swift, PanelKeyboard.swift, PanelPresentation.swift, and PanelSnapshot.applying; trace existing key handling and PanelPresenter.actions before choosing non-conflicting chords. Add keyboard paths for every row action and large list jumps, update the hint and Docs/shortcuts.md, and add coverage under Tests/UttrflowUXTests. Done means all actions work without a pointer and the keys are discoverable.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- accessibility, desktop, documentation, testing
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100