feat(home-v2): draggable tabs and browser tab gestures - #351
Merged
Conversation
Adds reorder-tab / reorder-internal ProductActions (clamped final index, same-state no-op, groups reorder independently so internal pages stay ahead of app tabs) and a pointer-capture drag in TabStrip mirroring v1: 5px start threshold, live reorder at sibling midpoints, click suppression after a completed drag, close-button exempt from capture. Gestures: middle-click (auxclick) closes app or internal tabs, double-click on the empty strip opens the configured new tab, and ArrowLeft/Right/Home/End move focus between tab buttons without activating (Enter/Space still activates). Order persists via the existing product serialization. Drag-out-to-detach is deferred: v2 windows share one persisted shell state and the existing windows:openTabInNewWindow payload is v1-shaped. Parity review P-4 (projects/qortium-home-2.1/parity-review-2026-08-24). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
QuickMythril
added a commit
that referenced
this pull request
Aug 24, 2026
PR #351 called setPointerCapture on the tab CONTAINER in pointerdown. Chromium then targets the compatibility click at the capture element, so the inner button[role=tab] never received it and no tab — internal page or app — could be switched with a mouse. Reproduced against the packaged build with CDP Input.dispatchMouseEvent: a real click left settings active, while element.click() on the same node switched correctly. Every existing smoke activates tabs with element.click(), which emits no pointer events, so the entire drag interaction was untested by anything capable of catching this and CI stayed green. Drag now tracks pointermove/pointerup/pointercancel on window for the duration of the gesture instead of capturing, which keeps click targeting intact, still follows the pointer outside the strip, and detaches on unmount. Click suppression after a completed reorder is unchanged. Adds smoke:desktop:home-v2-tabs — genuine input against the AppImage, asserting both that a real click switches tabs and that drag still reorders (verified: dashboard welcome settings -> welcome dashboard settings). Parity review I0 (projects/qortium-home-2.1/parity-review-2026-08-24). Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Parity review P-4 — tab dragging plus the cheap v1 gestures, built on #350's tab model:
reorder-tab/reorder-internalProductActions:toIndexis the clamped final index within the group; unchanged index returns the same state object (so live dragging is cheap), unknown tab/page throwsTAB_NOT_FOUND. Order persists through the existing product serialization — no shell-state format change.Deliberately deferred: drag-out-to-detach / move-tab-to-new-window. The main-process
windows:openTabInNewWindowplumbing exists but carries a v1-shaped route-history payload the v2 renderer never reads, and v2 windows currently share one persisted shell state — detaching needs a real multi-window state design first. Logged in the parity tracker as a follow-up alongside the tab context menu.Testing
tscclean;test:home-v2-foundation(extended with reorder/clamp/no-op/unknown-id and internal-group cases),test:home-v2-browser-chromepass;build:renderersucceeds. Drag feel itself needs a hands-on check on your dev build — midpoint live-reorder should feel like Home 1.🤖 Generated with Claude Code