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

Open
#583 0 comments 0 reactions 0 assignees View on GitHub
accessibility area:clipboard enhancement needs-info P1
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.