fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(web): preserve dialog state through close transitions - #7495

Open
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions
Open

fix(web): preserve dialog state through close transitions#7495
tarik02 wants to merge 11 commits into
pingdotgg:mainfrom
tarik02:fix/dialog-close-transitions

Conversation

@tarik02

@tarik02tarik02 commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What Changed

This supersedes #5169 and includes its Projects Search close-transition fix.

  • Keep dialog payload and form state mounted while open changes to false.
  • Clear retained state from onOpenChangeComplete(false), after Base UI finishes its ending styles.
  • Keep the Projects Search mode in place during close, then reset to command mode on the next regular open.
  • Move the expanded image viewer onto Base UI's dialog lifecycle so opening and closing use the same transition model.

Why

Several dialogs used payload presence as both their data and their open state. Closing cleared the payload or reset the form immediately, so the popup disappeared before Base UI could render its ending styles. Opening animated, but closing vanished in one frame.

The dialog's visibility and payload lifetime are now separate. Closing changes visibility first. Payload and form cleanup happen only after the close transition completes.

UI Changes

Projects Search

Before

projects-search-before.mp4

After

projects-search-after.mp4

Add provider

Before

add-provider-open-close-before.mp4

After

add-provider-open-close-after.mp4

Commit dialog

Before

commit-dialog-open-close-before.mp4

After

commit-dialog-open-close-after.mp4

Create pairing link

Before

create-pairing-link-open-close-before.mp4

After

create-pairing-link-open-close-after.mp4

Default branch confirmation

Before

default-branch-confirm-before.mp4

After

default-branch-confirm-open-close-after.mp4

Image preview

Before

image-preview-open-close-before.mp4

After

image-preview-open-close-after.mp4

Legacy project grouping

Before

legacy-project-grouping-open-close-before.mp4

After

legacy-project-grouping-open-close-after.mp4

Legacy project rename

Before

legacy-project-rename-open-close-before.mp4

After

legacy-project-rename-open-close-after.mp4

Publish repository

Before

publish-repository-open-close-before.mp4

After

publish-repository-open-close-after.mp4

Pull request dialog

Before

pull-request-dialog-open-close-before.mp4

After

pull-request-dialog-open-close-after.mp4

Right panel sheet

Before

right-panel-sheet-open-close-before.mp4

After

right-panel-sheet-open-close-after.mp4

Project settings

Before

sidebar-v2-project-settings-open-close-before.mp4

After

sidebar-v2-project-settings-open-close-after.mp4

SSH password prompt

Before

ssh-password-prompt-open-close-before.mp4

After

ssh-password-prompt-open-close-after.mp4

Tailscale setup

Before

tailscale-setup-open-close-before.mp4

After

tailscale-setup-open-close-after.mp4

WSL confirmation

Before

wsl-confirm-open-close-before.mp4

After

wsl-confirm-open-close-after.mp4

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
UI-only dialog lifecycle changes; no auth, data, or backend behavior is modified. Close-timing bugs are the main residual risk.

Overview
Fixes close animations by splitting visibility from payload lifetime. Dialogs now set open: false first and only clear form/payload state in onOpenChangeComplete(false) after Base UI ending styles finish.

This pattern is applied across chat, git, settings, command palette, SSH password, WSL/Tailscale, and the right-panel sheet. The expanded image viewer is moved onto Base UI Dialog so it uses the same open/close transitions, keyed by a generation counter on reopen.

Reviewed by Cursor Bugbot for commit 18085c3. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Preserve dialog state through close transitions across web UI components

  • Dialogs now retain their internal state until onOpenChangeComplete fires (after the close animation finishes), rather than clearing state immediately on onOpenChange(false). This prevents visual content flicker during exit transitions.
  • Affected components include commit, pull request, SSH password prompt, image preview, WSL/Tailscale confirmation, add-provider-instance, and pairing dialogs.
  • The ExpandedImageDialog is refactored to use @base-ui/react/dialog primitives and is now fully controlled via open/onOpenChange/onOpenChangeComplete props; a monotonically increasing generation key forces remount when reopening the same image.
  • RightPanelSheet removes keepMounted and is always rendered when its trigger conditions are met, with visibility controlled by the open prop.
  • Behavioral Change: several dialogs now hold their data objects (e.g. pendingDefaultBranchAction, pendingTailscaleServeSetup) until close fully completes rather than nulling them immediately on close.

Macroscope summarized 18085c3.

tarik02and others added 6 commits August 1, 2026 13:59
…ansitions
# Conflicts:
#	apps/web/src/components/ChatView.tsx
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/Sidebar.tsx
#	apps/web/src/components/SidebarV2.tsx
#	apps/web/src/components/settings/SettingsPanels.tsx
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 19, 2026
@coderabbitai

coderabbitaiBot commented Aug 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d745349-e607-4d03-907b-8299bceeafca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:L 100-499 changed lines (additions + deletions). label Aug 19, 2026
Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the dialog-transition migration: the SSH password prompt's mount-time focus no longer runs now that open starts false. Everything else (Base UI onOpenChangeComplete for deferred reset/unmount, the ExpandedImageDialog port to Dialog.Root, and the RightPanelSheet open-prop change) preserves the existing geometry, class ownership, and close semantics.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx Outdated
@macroscopeapp

macroscopeappBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR makes systematic changes to dialog state management across 11 components, delaying state cleanup until after close animations complete. One component (ExpandedImageDialog) is substantially rewritten to use base-ui's Dialog component. The scope and behavioral nature of these changes warrant human review to verify transition timing works correctly.

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

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the lightbox migration to Base UI Dialog — the rest of the dialog lifecycle plumbing (state kept alive until onOpenChangeComplete, resets moved to close-complete, sheet now animating instead of being conditionally unmounted) looks consistent with the shared dialog contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/chat/ExpandedImageDialog.tsx
tarik02and others added 2 commits August 19, 2026 11:48
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit c6553ee. Configure here.

Comment threadapps/web/src/components/desktop/SshPasswordPromptDialog.tsx
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tarik02