Floating toolbar: make dragging predictable and keep Position as a secondary fallback
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 42/100
Research direction
Start in Sources/LocalVoice/CapturePanel.swift (drag snap to eight anchors) and Sources/LocalVoice/FloatingToolbar.swift (Position submenu). Implement free placement after a 4-point drag threshold, 16-point dock snap with a guide, bounds clamping, and replace the eight-item submenu with a compact Position control; persist per existing owner. Done when the listed acceptance checks pass for drag vs click, snap vs free release, collapse/reveal, keyboard placement, and relaunch.
Written by the indexing model from the issue text.
Description
Outcome and evidence
P3, user-requested usability refinement, source-confirmed current behaviour. The toolbar offers dragging and an eight-item Position submenu. The user wants direct movement to be natural, with less menu clutter.
Workbench Preview 2.3.0, build 20260928054038, source 00be555139f87d4557f48fcffc132b8621c251a2, unmodified source, macOS 26.5.1 (25F80), Apple M5, built-in display. Identity verified in the running app using Copy build details on 28 September 2026.
The full toolbar drag/anchor matrix was not run in this audit. Do not describe free placement as an existing broken feature.
Current owner
Source links below pin the earlier audited commit 9578d8cf; the relevant paths were checked against installed 00be5551 and the described behaviour is unchanged. Source findings and native observations are distinguished below.
CapturePanel.swift snaps every completed drag to the nearest of eight anchors. FloatingToolbar.swift exposes those anchors in Position. The row supports dragging from glyph/primary/divider, while mode chips and Prompts retain click behaviour.
Decision
Use free placement by default. A drag beginning on the glyph, primary control or empty chrome moves the toolbar after a 4-point movement threshold; a click below that threshold keeps its existing action. Mode chips and the prompt picker remain ordinary controls.
Snap only when the pointer releases within 16 logical points of an available dock target, with a visible guide while that target is active. Releasing elsewhere preserves the chosen free position. Clamp the toolbar inside the available display bounds and expand inward near edges.
Replace the eight-anchor submenu in the mode menu with one Position… command opening a compact keyboard-accessible placement control. It offers the existing named anchors and a reset to a visible default. This retains precision/accessibility without a cascading menu tree. Update Grammar/surface registry and the owning placement contract as part of this bounded behaviour change.
Persist position per existing owner. Keep later manual placement through collapse/reveal, relaunch and display removal. Reuse consistent drag threshold, snapping and off-screen recovery semantics for Persona where appropriate while retaining independent per-copy state. Persona edge resizing belongs to #157; the toolbar sizes to its content.
Acceptance
- Drag from the intended chrome without firing its click action; clearly distinguish moving from mode selection.
- Release beyond the 16-point dock zone and retain the chosen free position; within it, show the guide and snap to that target. Movement below 4 points remains a click.
- Expanding/collapsing preserves expected placement and pointer targets.
- Keyboard position choices and off-screen recovery remain available.
- Relaunch and available display changes preserve later manual choices; record unavailable multi-display tests.
- Geometry correction is verified first, so clipping does not distort the placement test.
Related: #134. Closed #84 consolidated Position presentation while preserving eight-anchor behaviour; this request concerns the user experience, not repeating that refactor.
- Dominant language
- Swift
- Stars
- 0
- Forks
- 1
- Avg merge
- 8h 5m
- Merged PRs (30d)
- 215
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Ship-Work/workbench
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
Maintainers usually reply within 1 day
-
documentation good first issue help wanted
Difficulty 2/5 Half a day Newbie friendliness 74/100
Ship-Work/workbench#29 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
Maintainers usually reply within 1 day
All issues in Ship-Work/workbench
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
omlahore/RemoveMacAI#67 ·
Maintainers usually reply within 1 day
-
[quality] macOSScreenshotLocation(): configured-location branch (ScreenshotFiles.swift:30) never executes under swift testPossibly taken @arteeh claimed this today. Openagent/quality agent/reviewer help wanted kind/test stage/040-covered-by-pr testing
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
hivecommons/hotshot#249 · 4 comments ·
Maintainers usually reply within 1 day
-
documentation good first issue windows
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
deltachat/deltachat-ios#3388 ·
Maintainers usually reply within 1 day
-
desktop-app
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
raullenchai/Rapid-MLX#4975 ·
Maintainers usually reply within 1 day