Skip to content

Commit ab16990

Browse files
authored
Merge pull request Gnathonic#250 from Gnathonic/fix/reader-hotkey-textbox
fix: Extend hotkey filtering to OCR textboxes and nav keys
2 parents 8cb1078 + c6e032d commit ab16990

2 files changed

Lines changed: 37 additions & 5 deletions

File tree

src/lib/components/Reader/Reader.svelte

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,23 +194,31 @@
194194
}
195195
196196
function handleShortcuts(event: KeyboardEvent & { currentTarget: EventTarget & Window }) {
197-
// Ignore shortcuts when user is in a text input, editable field, or UI overlay
197+
// Ignore shortcuts when user is in a text input, editable field, text box, or UI overlay
198198
const target = event.target as HTMLElement;
199199
if (
200200
target.tagName === 'INPUT' ||
201201
target.tagName === 'TEXTAREA' ||
202202
target.isContentEditable ||
203203
target.closest('#settings') || // Settings drawer
204-
target.closest('[data-popover]') // Page number popover and other popovers
204+
target.closest('[data-popover]') || // Page number popover and other popovers
205+
target.closest('.textBox') // OCR text boxes (even when not editable)
205206
) {
206207
return;
207208
}
208209
209210
const action = event.code || event.key;
210211
211-
// For letter keys, ignore if any modifier key is pressed (e.g., Ctrl+C for copy)
212+
// For letter keys and nav keys, ignore if any modifier key is pressed
213+
// (e.g., Ctrl+C for copy, Shift+Arrow for text selection)
212214
const isLetterKey = action.startsWith('Key');
213-
if (isLetterKey && (event.ctrlKey || event.altKey || event.metaKey)) {
215+
const isNavKey = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'].includes(
216+
action
217+
);
218+
if (
219+
(isLetterKey || isNavKey) &&
220+
(event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)
221+
) {
214222
return;
215223
}
216224

src/lib/panzoom/util.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,34 @@ export function initPanzoom(node: HTMLElement) {
3535
// Panzoom typing is wrong here
3636
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
3737
// @ts-expect-error
38-
filterKey: (e: any) => {
38+
filterKey: (e: KeyboardEvent) => {
39+
// Filter (ignore) keys that shouldn't be handled by panzoom
40+
const target = e.target as HTMLElement;
41+
42+
// Always filter left/right arrows (page navigation)
3943
if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
4044
return true;
4145
}
46+
47+
// Filter all keys when in text inputs, settings, popovers, or textboxes
48+
if (
49+
target.tagName === 'INPUT' ||
50+
target.tagName === 'TEXTAREA' ||
51+
target.isContentEditable ||
52+
target.closest('#settings') ||
53+
target.closest('[data-popover]') ||
54+
target.closest('.textBox')
55+
) {
56+
return true;
57+
}
58+
59+
// Filter nav keys when modifier keys are pressed (for text selection, etc.)
60+
const isNavKey = ['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(e.key);
61+
if (isNavKey && (e.ctrlKey || e.altKey || e.metaKey || e.shiftKey)) {
62+
return true;
63+
}
64+
65+
return false;
4266
}
4367
});
4468

0 commit comments

Comments
 (0)