Skip to content

fix(next): a dragged tab stays glass in a translucent window - #22807

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
cmux/tab-drag-ghost-glass
Oct 21, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
cmux/tab-drag-ghost-glass

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Ports the still-wanted half of #22202 (owner gone, CONFLICTING) onto feat-cmux-next. In a translucent window (appearance.backgroundOpacity below 1), a dragged tab turned from glass into a solid theme block the moment it lifted:

  • the lifted tab in its strip painted windowBackground at full alpha (TabCell),
  • the tab's drag image was drawn on a solid windowBackground card, and the drag ghost's glass stayed at alpha 0 until the preview card unfolded (TabStripView.snapshot, TabDragGhostPanel).

WindowBackdrop.dragPreview(scope) (CmuxNextDesign) now decides both from the source scope's backdrop. Over glass the lifted tab's fill is a thicker piece of the window tint, and the tab image has no card and stands on the ghost's glass from the first frame. Opaque windows and Reduce Transparency keep the solid card.

Dropped from #22202: its DragLiftView per-window glass/tint. Base now lifts a sidebar row on the one overlay glass (OverlaySurfaceView, Lawrence 2026-10-20, u5506). What stays from that half: a snapshot does not draw the glass, so SidebarDragHandoff.imageOnGlass (from DragLiftView.isGlass, any overlay material but opaque) tells the ghost to stand the row's image on glass. Base also renamed Motion.* to Motion.tabs.* in TabDragSession, so that conflict was resolved to base's names.

Testing

DragGlassTests (CmuxNextAppTests, from #22202 minus the superseded sidebar lift cases):

  • liftAndCardFillsAreGlassOnlyInATranslucentWindow
  • aLiftedSidebarRowHandsItsGlassToTheGhost (new: glass for liquid glass and vibrancy, not for opaque)
  • aLiftedTabLetsTheWindowsGlassReadThrough
  • theDragGhostStandsOnGlassFromItsFirstFrame
  • aWorkspacesOwnBackgroundDecidesTheGhostsGlassNotTheApps
  • aNewSecondaryWindowHasTheMainWindowsBackdrop

SubtleElevationTests' ghost cases pin onGlass: false.

Observed / Not run

  • prepush-gate.py: no new violations.
  • Fleet package-test-lane.sh for DragGlassTests|SubtleElevationTests at this head: result recorded in a comment when it finishes.
  • Not run: live drag in a tagged build with a translucent theme (no Mac builds on this machine).

Changelog

Fixed: Dragging a tab in a translucent window keeps it glass instead of turning it into a solid theme-colored block

Localization: no user-facing strings changed.

Supersedes #22202.

🤖 Generated with Claude Code

Agent session: cosmic-gray


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Fixes dragged tabs turning from glass into solid theme-colored blocks in translucent windows.

Drag previews now follow the source scope's backdrop (WindowBackdrop.dragPreview), not the app's, so a workspace that pins its own background decides its own glass.

  • The lifted tab's fill is a thicker piece of the window tint (60% coverage) instead of full alpha.
  • The tab's drag image is drawn without a card, and the drag ghost stands on glass from the first frame until the preview card unfolds.
  • Opaque windows and Reduce Transparency keep the solid card.
  • A lifted sidebar row's handoff now tells the ghost to stand the row's image on glass, since a snapshot does not draw glass.
  • Supersedes Keep dragged tabs and sidebar rows on glass in translucent windows #22202.

Written for commit 63625dd. Summary will update on new commits.

View guided diff Turn on auto-fix

Ports the tab half of #22202 onto base: the lifted tab's fill, the tab drag
image and the drag ghost follow the source scope's backdrop (WindowBackdrop
dragsOnGlass). The sidebar half is superseded: base lifts a row on the overlay
glass (u5506); its handoff now tells the ghost to stand the row's image on glass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 63625dd: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr22807 -f ref=cmux/tab-drag-ghost-glass -f platform=macos -f backend_mode=local

Not verified: macOS jobs did not run: compile and app tests were skipped on 63625dd7bf; ci-status is green without them.

CI passes on 63625dd7bf (run 39534224443 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

web and size checks: green

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-utevq created for this PR by the cmux coordinator.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

owner: 01a15ba7-3152-78b2-bfdf-bb6eb0d5a053

@teamleaderleo
teamleaderleo merged commit 67eea14 into feat-cmux-next Oct 21, 2026
@teamleaderleo
teamleaderleo deleted the cmux/tab-drag-ghost-glass branch October 21, 2026 02:51
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Merged after review PASS. Fleet: DragGlassTests and SubtleElevationTests passed (step 04c9fe0c4d32, on this change plus the #22821 base compile fix, since base did not compile). The one red, generated drift, died on a GitHub API rate limit (HTTP 403) before checking anything. Compile and swift test checks were still pending at merge.

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

@github-actions

Copy link
Copy Markdown
Contributor

Shipped in:

teamleaderleo added a commit that referenced this pull request Oct 21, 2026
…, Pinned and custom sections, multi-row drags and motion; a dragged tab stays glass (#23542)

* test(next): sidebar rebuild invariant covers Group by Folder, filters, Pinned and custom sections, multi-row drags and motion; a dragged tab stays glass

Extends SidebarIncrementalMatchesRebuildTests (#23389) to the gaps it named,
each through the list's own pointer and key handlers, and pins #22807: the
tab drag lands in Work between docs and web, and a lifted strip tab keeps
its glass fill at every step of a real pointer drag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray

* test(next): the rebuild check waits for the list's springs with motion on; the gap drags move like a hand

With motion on the check compared after 90 ms, while springs and fades still
ran: half-point offsets and rows mid-fade. It now waits until no animation
runs in the list (at most 3 s), then compares. The gap scenarios' drags move
4 pt per step, and the Pinned and two-row drags check what they are about.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray

* test(next): the rebuild check waits until the list stops moving, not for layer animations

A row's spring writes its frame on each display frame and leaves no layer
animation, so the check now waits until two looks 50 ms apart agree (at
most 3 s) before it compares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba7-3152-78b2-bfdf-bb6eb0d5a053&host=cosmic-gray

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant