diff --git a/src/lib/components/notes/Notes.svelte b/src/lib/components/notes/Notes.svelte index 9bda19b6d6..786d03dd9a 100644 --- a/src/lib/components/notes/Notes.svelte +++ b/src/lib/components/notes/Notes.svelte @@ -320,11 +320,16 @@ dropzoneElement?.addEventListener('drop', onDrop); dropzoneElement?.addEventListener('dragleave', onDragLeave); + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event: KeyboardEvent) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; openNoteMenuId = null; } @@ -340,6 +345,7 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); @@ -347,6 +353,7 @@ return () => { clearTimeout(searchDebounceTimer); + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur); diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 3d6bb28c07..4d2c7c757c 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -488,11 +488,16 @@ await tick(); loaded = true; + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; } }; @@ -507,11 +512,13 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); return () => { + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur); diff --git a/src/lib/components/workspace/Prompts.svelte b/src/lib/components/workspace/Prompts.svelte index cb0b663db0..7b1f627c68 100644 --- a/src/lib/components/workspace/Prompts.svelte +++ b/src/lib/components/workspace/Prompts.svelte @@ -351,11 +351,16 @@ openCreateModal(); } + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event: KeyboardEvent) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; } }; @@ -370,6 +375,7 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); @@ -377,6 +383,7 @@ return () => { clearTimeout(searchDebounceTimer); window.removeEventListener('message', onMessage); + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur); diff --git a/src/lib/components/workspace/Skills.svelte b/src/lib/components/workspace/Skills.svelte index 4cb9cbc754..29ff9c3908 100644 --- a/src/lib/components/workspace/Skills.svelte +++ b/src/lib/components/workspace/Skills.svelte @@ -303,11 +303,16 @@ viewOption = localStorage?.workspaceViewOption || ''; loaded = true; + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; } }; @@ -322,12 +327,14 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); return () => { clearTimeout(searchDebounceTimer); + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur); diff --git a/src/lib/components/workspace/Tools.svelte b/src/lib/components/workspace/Tools.svelte index 6684391a45..c02ef51976 100644 --- a/src/lib/components/workspace/Tools.svelte +++ b/src/lib/components/workspace/Tools.svelte @@ -299,11 +299,16 @@ await init(); loaded = true; + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; } }; @@ -318,12 +323,14 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); return () => { clearTimeout(searchDebounceTimer); + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur); diff --git a/src/routes/(app)/automations/+page.svelte b/src/routes/(app)/automations/+page.svelte index 7cc3c7c47b..8598c8ad9d 100644 --- a/src/routes/(app)/automations/+page.svelte +++ b/src/routes/(app)/automations/+page.svelte @@ -324,11 +324,16 @@ loaded = true; ensureChannels(); + let keyboardFocusedElement: Element | null = null; + const onFocusIn = (event: FocusEvent) => { + const target = event.target as Element; + keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)') + ? target + : null; + }; + const onKeyDown = (event: KeyboardEvent) => { - if ( - event.key === 'Shift' && - !document.activeElement?.matches(':focus-visible:not(input, textarea)') - ) { + if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) { shiftKey = true; openAutomationMenuId = null; } @@ -344,6 +349,7 @@ shiftKey = false; }; + window.addEventListener('focusin', onFocusIn); window.addEventListener('keydown', onKeyDown); window.addEventListener('keyup', onKeyUp); window.addEventListener('blur', onBlur); @@ -351,6 +357,7 @@ return () => { clearTimeout(searchDebounceTimer); + window.removeEventListener('focusin', onFocusIn); window.removeEventListener('keydown', onKeyDown); window.removeEventListener('keyup', onKeyUp); window.removeEventListener('blur', onBlur);