Skip to content

fix(web): closing a pane no longer blacks out the panes beside it - #29078

Merged
maria-rcks merged 1 commit into
pingdotgg:maria/redesign/6-workspace-panesfrom
flamboh:t3/redesign-fix-close-pane-blackout
Nov 2, 2026
Merged

maria-rcks merged 1 commit into
pingdotgg:maria/redesign/6-workspace-panesfrom
flamboh:t3/redesign-fix-close-pane-blackout

Conversation

@flamboh

@flamboh flamboh commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Fix for the redesign stack, targets layer 6 (#28845).

Problem

Close the right pane of three (say thread, thread, Diff) and most of the workspace goes black for the length of the close animation. The middle thread disappears and only the first pane and a sliver on the right stay visible. Then it snaps into the right two-pane layout. Closing a thread that has its own surface pane open shows a smaller black band the same way.

The black is the chrome-coloured "moving edge" that pane motion draws between a closing pane and the pane that takes its room (its donor). Two things gave it the wrong donor:

  • The closing pane's ghost kept its old position as percentages of the stage. When the close lets the strip fit the window, the stage gets narrower and the ghost lands left of where the pane really was. The middle pane then looked like it overlapped the ghost, so it was skipped. The far-left pane became the donor, and the edge between them spanned the whole middle pane.
  • When two panes close together, the second one's only resized neighbour can be panes away. The edge then covers everything in between.

Fix

  • A closing pane's ghost is placed in pixels of the strip it was drawn in, so it starts exactly where the pane was.
  • A donor has to be adjacent: across the normal gutter, at most 16px away. With no adjacent donor, the ghost just goes, and the pane that grows into its room shows under it.

The close animation is unchanged. The neighbour still grows into the room while the ghost slides off over it.

Before / after

Dark mode, Replay showcase threads, A | B | Diff. Window widths are 1300px and 1600px; captures are cropped to the workspace. Web Animations durations are multiplied 15× so the close is visible.

At 1300px the strip overflows and is scrolled: the middle thread blacks out before the fix and stays visible after it. The 1600px case is a wider-layout regression check; neither ref blacks out there. Replay threads were recreated with the same scenario after restarting the server.

1300px window

Before (layer 6) After
Before closing the right Diff pane, 1300px, before Before closing the right Diff pane, 1300px, after
During the right-pane close, 1300px, before During the right-pane close, 1300px, after
Settled two-pane layout, 1300px, before Settled two-pane layout, 1300px, after

Before video (15× slower):

https://gh-file-drop-api-prod-galwoqjslzlnws6s.oliver-boorstein.workers.dev/f/788c66a0f7df7482/before-1300.mp4

After video (15× slower):

https://gh-file-drop-api-prod-galwoqjslzlnws6s.oliver-boorstein.workers.dev/f/4625b85a051599aa/after-1300.mp4

1600px window

Before (layer 6) After
Before closing the right Diff pane, 1600px, before Before closing the right Diff pane, 1600px, after
During the right-pane close, 1600px, before During the right-pane close, 1600px, after
Settled two-pane layout, 1600px, before Settled two-pane layout, 1600px, after

Before video (15× slower):

https://gh-file-drop-api-prod-galwoqjslzlnws6s.oliver-boorstein.workers.dev/f/a997c7ec8d1f5f45/before-1600.mp4

After video (15× slower):

https://gh-file-drop-api-prod-galwoqjslzlnws6s.oliver-boorstein.workers.dev/f/f59a75ea0df33e6b/after-1600.mp4

Validation

  • paneMotion.browser.test.ts: a donor with a pane between it and the closing pane is rejected. Fails on the layer branch.
  • Frame checks on a dev server (animations slowed 15×, 1300px window so the strip overflows, Replay-only box). Right-pane close: on the layer branch the ghost measured at x=710 instead of 850 and the left pane was picked as donor (gap 294px), leaving a black block over the middle pane. With the fix the ghost is at 850, the middle pane is the donor (gap 8px), and it stays visible all the way through. Closing the middle thread together with its Files pane shows no black band either.
  • vp run check:changed origin/maria/redesign/6-workspace-panes passes.

Made with Claude Opus 5.5 in Claude Code.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Nov 2, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at ae222bc

Macroscope's review found this PR approvable — This fixes pane-closing visuals by preserving the closing pane’s previous width and limiting animation donors to adjacent panes. The changes are confined to transient rendering and introduce no material data or operational exposure.

You can add or adjust custom eligibility rules. Learn more.

@maria-rcks

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

Verified in a real dev environment

verified head ae222bcd0920a444da72a3fda27b19e93e19d705 on linux with the real dev server, repository playwright dependencies, and /usr/bin/google-chrome.

created a project pointing at a real git repository through the app. two real codex gpt-6.1-sol threads created and read pane-check.txt; another turn on the pr head confirmed the contents were unchanged. no replay provider, mocks, fixtures, or demo data.

  • reproduced the blackout on parent 814c2e3da1: at 1300px, closing the right diff pane in thread | thread | diff covered the middle thread during the close animation.
  • on the exact pr head, the same threads and diff stayed visible through closure and settled into two usable panes. before/after captures below use the same data, with web animations slowed 15 times for inspection.
  • checked normal-speed closure at 1600px, and closing a thread with its attached files pane at 1300px. the attached pane closed, the other thread stayed visible, and the settled thread could be reopened with its messages intact.
  • checked opening and closing a diff in light mode as well.
  • the existing paneMotion.browser.test.ts passed on blacksmith: 1 file, 1 test. chromium was installed on the worker after its first attempt reported a missing browser. github checks on this head are successful or skipped. no code changes were needed.

before, during close on the parent:

parent: middle thread covered during diff-pane close

after, during close on the pr:

pr: middle thread remains visible during diff-pane close

Not verified

github/main at 6f41364805 was installed and run first. it does not contain the redesign workspace panes this pr targets, so the original three-pane scenario cannot be reproduced there. the failing before comparison therefore uses the pr's parent, rather than claiming a reproduction on main.

native electron, ios/android, macos/windows, and remote/relay/tunnel clients were not exercised on this linux web setup. other provider adapters were not exercised; this change is in shared web pane rendering.

@maria-rcks
maria-rcks merged commit e950175 into pingdotgg:maria/redesign/6-workspace-panes Nov 2, 2026
33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants