aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts')
-rw-r--r--packages/excalidraw/components/FontPicker/keyboardNavHandlers.ts66
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;
+ }
+};