From 66bb3ffd736bbd70cd017ee803605995c93cecfb Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sat, 5 Sep 2026 13:37:51 -0700 Subject: [PATCH] fix(ui): ignore the persistent workspace list when detecting overlays --- src/renderer/src/lib/visible-overlay.test.ts | 10 ++++++++++ src/renderer/src/lib/visible-overlay.ts | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/renderer/src/lib/visible-overlay.test.ts b/src/renderer/src/lib/visible-overlay.test.ts index b6cf072d2d9..5b486450ce7 100644 --- a/src/renderer/src/lib/visible-overlay.test.ts +++ b/src/renderer/src/lib/visible-overlay.test.ts @@ -30,6 +30,16 @@ describe('hasVisibleOverlay', () => { expect(hasVisibleOverlay()).toBe(false) }) + it('ignores the persistent workspace list while preserving its nested popups', () => { + mount('
') + + expect(hasVisibleOverlay()).toBe(false) + + document.querySelector('[data-worktree-sidebar]')!.innerHTML = '' + + expect(hasVisibleOverlay()).toBe(true) + }) + it('ignores a display:none overlay', () => { mount('') diff --git a/src/renderer/src/lib/visible-overlay.ts b/src/renderer/src/lib/visible-overlay.ts index 19a8315cccf..6892010b4df 100644 --- a/src/renderer/src/lib/visible-overlay.ts +++ b/src/renderer/src/lib/visible-overlay.ts @@ -15,6 +15,10 @@ export function hasVisibleOverlay(options?: VisibleOverlayOptions): boolean { if (!(element instanceof HTMLElement)) { return false } + // The persistent workspace list is page chrome, not an Escape-owning popup. + if (element.matches('[role="listbox"][data-worktree-sidebar]')) { + return false + } if (element.closest('[aria-hidden="true"]')) { return false }