diff --git a/src/renderer/src/components/browser-pane/browser-keyboard.test.ts b/src/renderer/src/components/browser-pane/browser-keyboard.test.ts index 54c79cfac9b..970721e1a67 100644 --- a/src/renderer/src/components/browser-pane/browser-keyboard.test.ts +++ b/src/renderer/src/components/browser-pane/browser-keyboard.test.ts @@ -18,6 +18,14 @@ describe('isEditableKeyboardTarget', () => { expect(isEditableKeyboardTarget(child)).toBe(true) }) + it('returns true for Monaco editor descendants', () => { + const child = { + isContentEditable: false, + closest: (selector: string) => (selector.includes('.monaco-editor') ? {} : null) + } + expect(isEditableKeyboardTarget(child)).toBe(true) + }) + it('returns false for non-editable elements', () => { const div = { isContentEditable: false, diff --git a/src/renderer/src/components/browser-pane/browser-keyboard.ts b/src/renderer/src/components/browser-pane/browser-keyboard.ts index 087f22bc20f..396e31fe2c3 100644 --- a/src/renderer/src/components/browser-pane/browser-keyboard.ts +++ b/src/renderer/src/components/browser-pane/browser-keyboard.ts @@ -12,12 +12,21 @@ export function isEditableKeyboardTarget(target: EventTarget | EditableTargetLik return false } - // Why: grab-mode single-key shortcuts should never fire while the user is - // typing into the browser chrome itself (address bar/search fields) or any - // other editable control. Treat nested elements inside those controls as - // editable too so composition wrappers or icons inside the input don't cause - // C/S to be swallowed unexpectedly. - const editableHost = element.closest?.('input, textarea, [contenteditable="true"]') + // Why: Browser panes stay mounted beside editor splits, so their global + // shortcut listeners must treat editor surfaces as editable too. + const editableHost = element.closest?.( + [ + 'input', + 'textarea', + 'select', + '[contenteditable=""]', + '[contenteditable="true"]', + '.monaco-editor', + '.diff-editor', + '.rich-markdown-editor', + '.rich-markdown-editor-shell' + ].join(', ') + ) if (editableHost) { return true }