diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts')
| -rw-r--r-- | packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts b/packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts new file mode 100644 index 0000000..19c4adc --- /dev/null +++ b/packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts @@ -0,0 +1,66 @@ +import type { Node } from "../../utils"; +import { KEYS } from "../../keys"; +import { type FontDescriptor } from "./FontPickerList"; + +interface FontPickerKeyNavHandlerProps { + event: React.KeyboardEvent<HTMLDivElement>; + inputRef: React.RefObject<HTMLInputElement | null>; + hoveredFont: Node<FontDescriptor> | undefined; + filteredFonts: Node<FontDescriptor>[]; + onClose: () => void; + onSelect: (value: number) => void; + onHover: (value: number) => void; +} + +export const fontPickerKeyHandler = ({ + event, + inputRef, + hoveredFont, + filteredFonts, + onClose, + onSelect, + onHover, +}: FontPickerKeyNavHandlerProps) => { + if ( + !event[KEYS.CTRL_OR_CMD] && + event.shiftKey && + event.key.toLowerCase() === KEYS.F + ) { + // refocus input on the popup trigger shortcut + inputRef.current?.focus(); + return true; + } + + if (event.key === KEYS.ESCAPE) { + onClose(); + return true; + } + + if (event.key === KEYS.ENTER) { + if (hoveredFont?.value) { + onSelect(hoveredFont.value); + } + + return true; + } + + if (event.key === KEYS.ARROW_DOWN) { + if (hoveredFont?.next) { + onHover(hoveredFont.next.value); + } else if (filteredFonts[0]?.value) { + onHover(filteredFonts[0].value); + } + + return true; + } + + if (event.key === KEYS.ARROW_UP) { + if (hoveredFont?.prev) { + onHover(hoveredFont.prev.value); + } else if (filteredFonts[filteredFonts.length - 1]?.value) { + onHover(filteredFonts[filteredFonts.length - 1].value); + } + + return true; + } +}; |
