fix(ui): ignore prompt rail in escape abort guard

This commit is contained in:
Bohdan Triapitsyn
2026-07-29 01:33:51 +03:00
parent b0028283fb
commit 0259f11017
3 changed files with 39 additions and 7 deletions
@@ -0,0 +1,30 @@
import { expect, test } from 'bun:test';
import { hasOpenDropdown } from './keyboard-shortcut-dom';
test('does not treat an unrelated visible listbox as an open dropdown', () => {
const promptNavigator = {} as Element;
const root = {
querySelector: (selector: string) => selector.includes('[role="listbox"]') ? promptNavigator : null,
} as unknown as ParentNode;
expect(hasOpenDropdown(root)).toBe(false);
});
test('detects an open dropdown popup', () => {
const dropdown = {} as Element;
const root = {
querySelector: (selector: string) => selector.includes('[data-slot="dropdown-menu-content"][data-open]') ? dropdown : null,
} as unknown as ParentNode;
expect(hasOpenDropdown(root)).toBe(true);
});
test('detects an open select popup', () => {
const select = {} as Element;
const root = {
querySelector: (selector: string) => selector.includes('[data-slot="select-content"][data-open]') ? select : null,
} as unknown as ParentNode;
expect(hasOpenDropdown(root)).toBe(true);
});
@@ -0,0 +1,8 @@
const OPEN_DROPDOWN_SELECTOR = [
'[data-slot="dropdown-menu-content"][data-open]',
'[data-slot="select-content"][data-open]',
].join(',');
export function hasOpenDropdown(root: ParentNode = document): boolean {
return Boolean(root.querySelector(OPEN_DROPDOWN_SELECTOR));
}
@@ -16,6 +16,7 @@ import { useDirectoryStore } from '@/stores/useDirectoryStore';
import { useProjectsStore } from '@/stores/useProjectsStore';
import { getCycledPrimaryAgentName } from '@/components/chat/mobileControlsUtils';
import { focusChatInput } from '@/components/chat/composer/editor/dom';
import { hasOpenDropdown } from './keyboard-shortcut-dom';
export const useKeyboardShortcuts = () => {
const openNewSessionDraft = useSessionUIStore((s) => s.openNewSessionDraft);
@@ -93,13 +94,6 @@ export const useKeyboardShortcuts = () => {
return target instanceof Element && Boolean(target.closest(dropdownTargetSelector));
};
const hasOpenDropdown = () => {
const openDropdowns = document.querySelectorAll<HTMLElement>(
'[data-slot="dropdown-menu-content"], [data-slot="select-content"], [role="listbox"], [role="menu"], [data-radix-popper-content-wrapper]'
);
return Array.from(openDropdowns).some((element) => element.getClientRects().length > 0);
};
const handleTerminalShortcutCapture = (e: KeyboardEvent) => {
if (!isTerminalEventTarget(e.target)) {
return;