UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

92 lines (90 loc) 2.47 kB
'use client'; const keyNameMap = { " ": "space", ArrowLeft: "arrowleft", ArrowRight: "arrowright", ArrowUp: "arrowup", ArrowDown: "arrowdown", Escape: "esc", Esc: "esc", Enter: "enter", Tab: "tab", Backspace: "backspace", Delete: "delete", Insert: "insert", Home: "home", End: "end", PageUp: "pageup", PageDown: "pagedown", "+": "plus", "-": "minus", "*": "asterisk", "/": "slash" }; function normalizeKey(key) { const lowerKey = key.replace("Key", "").toLowerCase(); return keyNameMap[key] || lowerKey; } function parseHotkey(hotkey) { const keys = hotkey.toLowerCase().split("+").map((part) => part.trim()); const modifiers = { alt: keys.includes("alt"), ctrl: keys.includes("ctrl"), meta: keys.includes("meta"), mod: keys.includes("mod"), shift: keys.includes("shift"), plus: keys.includes("[plus]") }; const reservedKeys = ["alt", "ctrl", "meta", "shift", "mod"]; const freeKey = keys.find((key) => !reservedKeys.includes(key)); return { ...modifiers, key: freeKey === "[plus]" ? "+" : freeKey }; } function isExactHotkey(hotkey, event, usePhysicalKeys) { const { alt, ctrl, meta, mod, shift, key } = hotkey; const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey, code: pressedCode } = event; if (alt !== altKey) { return false; } if (mod) { if (!ctrlKey && !metaKey) { return false; } } else { if (ctrl !== ctrlKey) { return false; } if (meta !== metaKey) { return false; } } if (shift !== shiftKey) { return false; } if (key && (usePhysicalKeys ? normalizeKey(pressedCode) === normalizeKey(key) : normalizeKey(pressedKey ?? pressedCode) === normalizeKey(key))) { return true; } return false; } function getHotkeyMatcher(hotkey, usePhysicalKeys) { return (event) => isExactHotkey(parseHotkey(hotkey), event, usePhysicalKeys); } function getHotkeyHandler(hotkeys) { return (event) => { const _event = "nativeEvent" in event ? event.nativeEvent : event; hotkeys.forEach( ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => { if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(_event)) { if (options.preventDefault) { event.preventDefault(); } handler(_event); } } ); }; } export { getHotkeyHandler, getHotkeyMatcher, parseHotkey }; //# sourceMappingURL=parse-hotkey.mjs.map