react-hotkeys-hook 4.3.0 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  export declare function isHotkeyPressed(key: string | string[], splitKey?: string): boolean;
2
2
  export declare function pushToCurrentlyPressedKeys(key: string | string[]): void;
3
- export declare function removeFromCurrentlyPressedKeys(key: string): void;
3
+ export declare function removeFromCurrentlyPressedKeys(key: string | string[]): void;
@@ -92,7 +92,7 @@ function pushToCurrentlyPressedKeys(key) {
92
92
  */
93
93
  if (currentlyPressedKeys.has('meta')) {
94
94
  currentlyPressedKeys.forEach(function (key) {
95
- return !isHotkeyModifier(key) && currentlyPressedKeys["delete"](key);
95
+ return !isHotkeyModifier(key) && currentlyPressedKeys["delete"](key.toLowerCase());
96
96
  });
97
97
  }
98
98
  hotkeyArray.forEach(function (hotkey) {
@@ -100,6 +100,7 @@ function pushToCurrentlyPressedKeys(key) {
100
100
  });
101
101
  }
102
102
  function removeFromCurrentlyPressedKeys(key) {
103
+ var hotkeyArray = Array.isArray(key) ? key : [key];
103
104
  /*
104
105
  Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.
105
106
  https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser
@@ -108,7 +109,9 @@ function removeFromCurrentlyPressedKeys(key) {
108
109
  if (key === 'meta') {
109
110
  currentlyPressedKeys.clear();
110
111
  } else {
111
- currentlyPressedKeys["delete"](key);
112
+ hotkeyArray.forEach(function (hotkey) {
113
+ return currentlyPressedKeys["delete"](hotkey.toLowerCase());
114
+ });
112
115
  }
113
116
  }
114
117
  (function () {
@@ -118,14 +121,19 @@ function removeFromCurrentlyPressedKeys(key) {
118
121
  // Synthetic event (e.g., Chrome autofill). Ignore.
119
122
  return;
120
123
  }
121
- pushToCurrentlyPressedKeys(mapKey(e.code));
124
+ pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);
122
125
  });
123
126
  document.addEventListener('keyup', function (e) {
124
127
  if (e.key === undefined) {
125
128
  // Synthetic event (e.g., Chrome autofill). Ignore.
126
129
  return;
127
130
  }
128
- removeFromCurrentlyPressedKeys(mapKey(e.code));
131
+ removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);
132
+ });
133
+ }
134
+ if (typeof window !== 'undefined') {
135
+ window.addEventListener('blur', function () {
136
+ currentlyPressedKeys.clear();
129
137
  });
130
138
  }
131
139
  })();
@@ -169,7 +177,10 @@ function isScopeActive(activeScopes, scopes) {
169
177
  return scopes.includes(scope);
170
178
  }) || activeScopes.includes('*');
171
179
  }
172
- var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey) {
180
+ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey, ignoreModifiers) {
181
+ if (ignoreModifiers === void 0) {
182
+ ignoreModifiers = false;
183
+ }
173
184
  var alt = hotkey.alt,
174
185
  meta = hotkey.meta,
175
186
  mod = hotkey.mod,
@@ -183,21 +194,23 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
183
194
  var ctrlKey = isHotkeyPressed('ctrl');
184
195
  var keyCode = mapKey(code);
185
196
  var pressedKey = pressedKeyUppercase.toLowerCase();
186
- if (altKey !== alt && pressedKey !== 'alt') {
187
- return false;
188
- }
189
- if (shiftKey !== shift && pressedKey !== 'shift') {
190
- return false;
191
- }
192
- // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
193
- if (mod) {
194
- if (!metaKey && !ctrlKey) {
197
+ if (!ignoreModifiers) {
198
+ if (altKey !== alt && pressedKey !== 'alt') {
195
199
  return false;
196
200
  }
197
- } else {
198
- if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
201
+ if (shiftKey !== shift && pressedKey !== 'shift') {
199
202
  return false;
200
203
  }
204
+ // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
205
+ if (mod) {
206
+ if (!metaKey && !ctrlKey) {
207
+ return false;
208
+ }
209
+ } else {
210
+ if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
211
+ return false;
212
+ }
213
+ }
201
214
  }
202
215
  // All modifiers are correct, now check the key
203
216
  // If the key is set, we check for the key
@@ -357,8 +370,11 @@ function useHotkeys(keys, callback, options, dependencies) {
357
370
  if ((memoisedOptions == null ? void 0 : memoisedOptions.enabled) === false || !isScopeActive(enabledScopes, memoisedOptions == null ? void 0 : memoisedOptions.scopes)) {
358
371
  return;
359
372
  }
360
- var listener = function listener(e) {
373
+ var listener = function listener(e, isKeyUp) {
361
374
  var _e$target;
375
+ if (isKeyUp === void 0) {
376
+ isKeyUp = false;
377
+ }
362
378
  if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions == null ? void 0 : memoisedOptions.enableOnFormTags)) {
363
379
  return;
364
380
  }
@@ -374,7 +390,7 @@ function useHotkeys(keys, callback, options, dependencies) {
374
390
  parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
375
391
  var _hotkey$keys;
376
392
  var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);
377
- if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) && !hasTriggeredRef.current) {
393
+ if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) && !hasTriggeredRef.current) {
378
394
  maybePreventDefault(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.preventDefault);
379
395
  if (!isHotkeyEnabled(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.enabled)) {
380
396
  stopPropagation(e);
@@ -382,7 +398,9 @@ function useHotkeys(keys, callback, options, dependencies) {
382
398
  }
383
399
  // Execute the user callback for that hotkey
384
400
  cb(e, hotkey);
385
- hasTriggeredRef.current = true;
401
+ if (!isKeyUp) {
402
+ hasTriggeredRef.current = true;
403
+ }
386
404
  }
387
405
  });
388
406
  };
@@ -404,7 +422,7 @@ function useHotkeys(keys, callback, options, dependencies) {
404
422
  removeFromCurrentlyPressedKeys(mapKey(event.code));
405
423
  hasTriggeredRef.current = false;
406
424
  if (memoisedOptions != null && memoisedOptions.keyup) {
407
- listener(event);
425
+ listener(event, true);
408
426
  }
409
427
  };
410
428
  // @ts-ignore
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string): void {\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n currentlyPressedKeys.delete(key)\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(e.code))\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(e.code))\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n hasTriggeredRef.current = true\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","shift","meta","mod","singleCharKeys","filter","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","clear","document","addEventListener","e","undefined","code","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","cb","memoisedOptions","proxy","listener","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>',\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers: boolean = false): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp: boolean = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","shift","meta","mod","singleCharKeys","filter","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","clear","document","addEventListener","e","undefined","code","window","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","cb","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function u(e){return(r[e]||e).trim().toLowerCase().replace("key","").replace("digit","").replace("numpad","").replace("arrow","")}function i(e,t){return void 0===t&&(t=","),"string"==typeof e?e.split(t):e}function c(e,t){void 0===t&&(t="+");var r=e.toLocaleLowerCase().split(t).map((function(e){return u(e)}));return n({},{alt:r.includes("alt"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!o.includes(e)}))})}var a=new Set;function l(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function s(e){var t=Array.isArray(e)?e:[e];a.has("meta")&&a.forEach((function(e){return!function(e){return o.includes(e)}(e)&&a.delete(e)})),t.forEach((function(e){return a.add(e.toLowerCase())}))}function d(e){"meta"===e?a.clear():a.delete(e)}function f(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return t instanceof Array?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&!0===t)}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&s(u(e.code))})),document.addEventListener("keyup",(function(e){void 0!==e.key&&d(u(e.code))})));var v=e.createContext(void 0);function y(e){return t.jsx(v.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function p(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,o){return n&&p(e[o],t[o])}),!0):e===t}var m=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),k=function(){return e.useContext(m)},h=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},b="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=void 0===o?["*"]:o,u=n.children,i=e.useState((null==r?void 0:r.length)>0?r:["*"]),c=i[0],a=i[1],l=e.useState([]),s=l[0],d=l[1],f=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),v=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),k=e.useCallback((function(e){a((function(t){return t.includes(e)?0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),h=e.useCallback((function(e){d((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){d((function(t){return t.filter((function(t){return!p(t,e)}))}))}),[]);return t.jsx(m.Provider,{value:{enabledScopes:c,hotkeys:s,enableScope:f,disableScope:v,toggleScope:k},children:t.jsx(y,{addHotkey:h,removeHotkey:b,children:u})})},exports.isHotkeyPressed=l,exports.useHotkeys=function(t,n,o,r){var a=e.useRef(null),y=e.useRef(!1),m=o instanceof Array?r instanceof Array?void 0:r:o,g=e.useCallback(n,[].concat(o instanceof Array?o:r instanceof Array?r:[])),w=function(t){var n=e.useRef(void 0);return p(n.current,t)||(n.current=t),n.current}(m),C=k().enabledScopes,S=e.useContext(v);return b((function(){if(!1!==(null==w?void 0:w.enabled)&&(n=null==w?void 0:w.scopes,0===(e=C).length&&n?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),1):!n||e.some((function(e){return n.includes(e)}))||e.includes("*"))){var e,n,o=function(e){var n;f(e,["input","textarea","select"])&&!f(e,null==w?void 0:w.enableOnFormTags)||(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=w&&w.enableOnContentEditable)&&i(t,null==w?void 0:w.splitKey).forEach((function(t){var n,o=c(t,null==w?void 0:w.combinationKey);if((function(e,t){var n=t.alt,o=t.meta,r=t.mod,i=t.shift,c=t.keys,a=e.key,s=e.code,d=l("alt"),f=l("shift"),v=l("meta"),y=l("ctrl"),p=u(s),m=a.toLowerCase();if(d!==n&&"alt"!==m)return!1;if(f!==i&&"shift"!==m)return!1;if(r){if(!v&&!y)return!1}else if(v!==o&&y!==o&&"meta"!==p&&"ctrl"!==p)return!1;return!(!c||1!==c.length||!c.includes(m)&&!c.includes(p))||(c?l(c):!c)}(e,o)||null!=(n=o.keys)&&n.includes("*"))&&!y.current){if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,o,null==w?void 0:w.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,o,null==w?void 0:w.enabled))return void h(e);g(e,o),y.current=!0}})):h(e))},r=function(e){void 0!==e.key&&(s(u(e.code)),(void 0===(null==w?void 0:w.keydown)&&!0!==(null==w?void 0:w.keyup)||null!=w&&w.keydown)&&o(e))},v=function(e){void 0!==e.key&&(d(u(e.code)),y.current=!1,null!=w&&w.keyup&&o(e))};return(a.current||(null==m?void 0:m.document)||document).addEventListener("keyup",v),(a.current||(null==m?void 0:m.document)||document).addEventListener("keydown",r),S&&i(t,null==w?void 0:w.splitKey).forEach((function(e){return S.addHotkey(c(e,null==w?void 0:w.combinationKey))})),function(){(a.current||(null==m?void 0:m.document)||document).removeEventListener("keyup",v),(a.current||(null==m?void 0:m.document)||document).removeEventListener("keydown",r),S&&i(t,null==w?void 0:w.splitKey).forEach((function(e){return S.removeHotkey(c(e,null==w?void 0:w.combinationKey))}))}}}),[t,g,w,C]),a},exports.useHotkeysContext=k,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),i=r[0],c=r[1],a=e.useCallback((function(e){void 0!==e.key&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(u(e.code)),n})))}),[]),l=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",a),c(!1))}),[a]);return[n,{start:e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(l(),document.addEventListener("keydown",a),c(!0))}),[a,l]),stop:l,isRecording:i}]};
1
+ "use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function u(e){return(r[e]||e).trim().toLowerCase().replace("key","").replace("digit","").replace("numpad","").replace("arrow","")}function i(e,t){return void 0===t&&(t=","),"string"==typeof e?e.split(t):e}function c(e,t){void 0===t&&(t="+");var r=e.toLocaleLowerCase().split(t).map((function(e){return u(e)}));return n({},{alt:r.includes("alt"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!o.includes(e)}))})}var a=new Set;function l(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function d(e){var t=Array.isArray(e)?e:[e];a.has("meta")&&a.forEach((function(e){return!function(e){return o.includes(e)}(e)&&a.delete(e.toLowerCase())})),t.forEach((function(e){return a.add(e.toLowerCase())}))}function s(e){var t=Array.isArray(e)?e:[e];"meta"===e?a.clear():t.forEach((function(e){return a.delete(e.toLowerCase())}))}function f(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return t instanceof Array?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&!0===t)}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&d([u(e.key),u(e.code)])})),document.addEventListener("keyup",(function(e){void 0!==e.key&&s([u(e.key),u(e.code)])}))),"undefined"!=typeof window&&window.addEventListener("blur",(function(){a.clear()}));var v=e.createContext(void 0);function y(e){return t.jsx(v.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function p(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,o){return n&&p(e[o],t[o])}),!0):e===t}var m=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),k=function(){return e.useContext(m)},h=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},b="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=void 0===o?["*"]:o,u=n.children,i=e.useState((null==r?void 0:r.length)>0?r:["*"]),c=i[0],a=i[1],l=e.useState([]),d=l[0],s=l[1],f=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),v=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),k=e.useCallback((function(e){a((function(t){return t.includes(e)?0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),h=e.useCallback((function(e){s((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){s((function(t){return t.filter((function(t){return!p(t,e)}))}))}),[]);return t.jsx(m.Provider,{value:{enabledScopes:c,hotkeys:d,enableScope:f,disableScope:v,toggleScope:k},children:t.jsx(y,{addHotkey:h,removeHotkey:b,children:u})})},exports.isHotkeyPressed=l,exports.useHotkeys=function(t,n,o,r){var a=e.useRef(null),y=e.useRef(!1),m=o instanceof Array?r instanceof Array?void 0:r:o,w=e.useCallback(n,[].concat(o instanceof Array?o:r instanceof Array?r:[])),g=function(t){var n=e.useRef(void 0);return p(n.current,t)||(n.current=t),n.current}(m),C=k().enabledScopes,L=e.useContext(v);return b((function(){if(!1!==(null==g?void 0:g.enabled)&&(n=null==g?void 0:g.scopes,0===(e=C).length&&n?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),1):!n||e.some((function(e){return n.includes(e)}))||e.includes("*"))){var e,n,o=function(e,n){var o;void 0===n&&(n=!1),(!f(e,["input","textarea","select"])||f(e,null==g?void 0:g.enableOnFormTags))&&(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(o=e.target)||!o.isContentEditable||null!=g&&g.enableOnContentEditable)&&i(t,null==g?void 0:g.splitKey).forEach((function(t){var o,r=c(t,null==g?void 0:g.combinationKey);if((function(e,t,n){void 0===n&&(n=!1);var o=t.alt,r=t.meta,i=t.mod,c=t.shift,a=t.keys,d=e.key,s=e.code,f=l("alt"),v=l("shift"),y=l("meta"),p=l("ctrl"),m=u(s),k=d.toLowerCase();if(!n){if(f!==o&&"alt"!==k)return!1;if(v!==c&&"shift"!==k)return!1;if(i){if(!y&&!p)return!1}else if(y!==r&&p!==r&&"meta"!==m&&"ctrl"!==m)return!1}return!(!a||1!==a.length||!a.includes(k)&&!a.includes(m))||(a?l(a):!a)}(e,r,null==g?void 0:g.ignoreModifiers)||null!=(o=r.keys)&&o.includes("*"))&&!y.current){if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==g?void 0:g.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==g?void 0:g.enabled))return void h(e);w(e,r),n||(y.current=!0)}})):h(e))},r=function(e){void 0!==e.key&&(d(u(e.code)),(void 0===(null==g?void 0:g.keydown)&&!0!==(null==g?void 0:g.keyup)||null!=g&&g.keydown)&&o(e))},v=function(e){void 0!==e.key&&(s(u(e.code)),y.current=!1,null!=g&&g.keyup&&o(e,!0))};return(a.current||(null==m?void 0:m.document)||document).addEventListener("keyup",v),(a.current||(null==m?void 0:m.document)||document).addEventListener("keydown",r),L&&i(t,null==g?void 0:g.splitKey).forEach((function(e){return L.addHotkey(c(e,null==g?void 0:g.combinationKey))})),function(){(a.current||(null==m?void 0:m.document)||document).removeEventListener("keyup",v),(a.current||(null==m?void 0:m.document)||document).removeEventListener("keydown",r),L&&i(t,null==g?void 0:g.splitKey).forEach((function(e){return L.removeHotkey(c(e,null==g?void 0:g.combinationKey))}))}}}),[t,w,g,C]),a},exports.useHotkeysContext=k,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),i=r[0],c=r[1],a=e.useCallback((function(e){void 0!==e.key&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(u(e.code)),n})))}),[]),l=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",a),c(!1))}),[a]);return[n,{start:e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(l(),document.addEventListener("keydown",a),c(!0))}),[a,l]),stop:l,isRecording:i}]};
2
2
  //# sourceMappingURL=react-hotkeys-hook.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string): void {\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n currentlyPressedKeys.delete(key)\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(e.code))\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(e.code))\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n hasTriggeredRef.current = true\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","alt","includes","shift","meta","mod","filter","currentlyPressedKeys","Set","isHotkeyPressed","Array","isArray","every","has","pushToCurrentlyPressedKeys","hotkeyArray","forEach","isHotkeyModifier","add","removeFromCurrentlyPressedKeys","clear","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","document","addEventListener","e","undefined","code","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","cb","memoisedOptions","current","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>',\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers: boolean = false): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp: boolean = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","alt","includes","shift","meta","mod","filter","currentlyPressedKeys","Set","isHotkeyPressed","Array","isArray","every","has","pushToCurrentlyPressedKeys","hotkeyArray","forEach","isHotkeyModifier","add","removeFromCurrentlyPressedKeys","clear","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","document","addEventListener","e","undefined","code","window","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","cb","memoisedOptions","current","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","isKeyUp","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","ignoreModifiers","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
@@ -90,7 +90,7 @@ function pushToCurrentlyPressedKeys(key) {
90
90
  */
91
91
  if (currentlyPressedKeys.has('meta')) {
92
92
  currentlyPressedKeys.forEach(function (key) {
93
- return !isHotkeyModifier(key) && currentlyPressedKeys["delete"](key);
93
+ return !isHotkeyModifier(key) && currentlyPressedKeys["delete"](key.toLowerCase());
94
94
  });
95
95
  }
96
96
  hotkeyArray.forEach(function (hotkey) {
@@ -98,6 +98,7 @@ function pushToCurrentlyPressedKeys(key) {
98
98
  });
99
99
  }
100
100
  function removeFromCurrentlyPressedKeys(key) {
101
+ var hotkeyArray = Array.isArray(key) ? key : [key];
101
102
  /*
102
103
  Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.
103
104
  https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser
@@ -106,7 +107,9 @@ function removeFromCurrentlyPressedKeys(key) {
106
107
  if (key === 'meta') {
107
108
  currentlyPressedKeys.clear();
108
109
  } else {
109
- currentlyPressedKeys["delete"](key);
110
+ hotkeyArray.forEach(function (hotkey) {
111
+ return currentlyPressedKeys["delete"](hotkey.toLowerCase());
112
+ });
110
113
  }
111
114
  }
112
115
  (function () {
@@ -116,14 +119,19 @@ function removeFromCurrentlyPressedKeys(key) {
116
119
  // Synthetic event (e.g., Chrome autofill). Ignore.
117
120
  return;
118
121
  }
119
- pushToCurrentlyPressedKeys(mapKey(e.code));
122
+ pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);
120
123
  });
121
124
  document.addEventListener('keyup', function (e) {
122
125
  if (e.key === undefined) {
123
126
  // Synthetic event (e.g., Chrome autofill). Ignore.
124
127
  return;
125
128
  }
126
- removeFromCurrentlyPressedKeys(mapKey(e.code));
129
+ removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)]);
130
+ });
131
+ }
132
+ if (typeof window !== 'undefined') {
133
+ window.addEventListener('blur', function () {
134
+ currentlyPressedKeys.clear();
127
135
  });
128
136
  }
129
137
  })();
@@ -167,7 +175,10 @@ function isScopeActive(activeScopes, scopes) {
167
175
  return scopes.includes(scope);
168
176
  }) || activeScopes.includes('*');
169
177
  }
170
- var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey) {
178
+ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, hotkey, ignoreModifiers) {
179
+ if (ignoreModifiers === void 0) {
180
+ ignoreModifiers = false;
181
+ }
171
182
  var alt = hotkey.alt,
172
183
  meta = hotkey.meta,
173
184
  mod = hotkey.mod,
@@ -181,21 +192,23 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
181
192
  var ctrlKey = isHotkeyPressed('ctrl');
182
193
  var keyCode = mapKey(code);
183
194
  var pressedKey = pressedKeyUppercase.toLowerCase();
184
- if (altKey !== alt && pressedKey !== 'alt') {
185
- return false;
186
- }
187
- if (shiftKey !== shift && pressedKey !== 'shift') {
188
- return false;
189
- }
190
- // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
191
- if (mod) {
192
- if (!metaKey && !ctrlKey) {
195
+ if (!ignoreModifiers) {
196
+ if (altKey !== alt && pressedKey !== 'alt') {
193
197
  return false;
194
198
  }
195
- } else {
196
- if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
199
+ if (shiftKey !== shift && pressedKey !== 'shift') {
197
200
  return false;
198
201
  }
202
+ // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
203
+ if (mod) {
204
+ if (!metaKey && !ctrlKey) {
205
+ return false;
206
+ }
207
+ } else {
208
+ if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
209
+ return false;
210
+ }
211
+ }
199
212
  }
200
213
  // All modifiers are correct, now check the key
201
214
  // If the key is set, we check for the key
@@ -355,8 +368,11 @@ function useHotkeys(keys, callback, options, dependencies) {
355
368
  if ((memoisedOptions == null ? void 0 : memoisedOptions.enabled) === false || !isScopeActive(enabledScopes, memoisedOptions == null ? void 0 : memoisedOptions.scopes)) {
356
369
  return;
357
370
  }
358
- var listener = function listener(e) {
371
+ var listener = function listener(e, isKeyUp) {
359
372
  var _e$target;
373
+ if (isKeyUp === void 0) {
374
+ isKeyUp = false;
375
+ }
360
376
  if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions == null ? void 0 : memoisedOptions.enableOnFormTags)) {
361
377
  return;
362
378
  }
@@ -372,7 +388,7 @@ function useHotkeys(keys, callback, options, dependencies) {
372
388
  parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
373
389
  var _hotkey$keys;
374
390
  var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);
375
- if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) && !hasTriggeredRef.current) {
391
+ if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) && !hasTriggeredRef.current) {
376
392
  maybePreventDefault(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.preventDefault);
377
393
  if (!isHotkeyEnabled(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.enabled)) {
378
394
  stopPropagation(e);
@@ -380,7 +396,9 @@ function useHotkeys(keys, callback, options, dependencies) {
380
396
  }
381
397
  // Execute the user callback for that hotkey
382
398
  cb(e, hotkey);
383
- hasTriggeredRef.current = true;
399
+ if (!isKeyUp) {
400
+ hasTriggeredRef.current = true;
401
+ }
384
402
  }
385
403
  });
386
404
  };
@@ -402,7 +420,7 @@ function useHotkeys(keys, callback, options, dependencies) {
402
420
  removeFromCurrentlyPressedKeys(mapKey(event.code));
403
421
  hasTriggeredRef.current = false;
404
422
  if (memoisedOptions != null && memoisedOptions.keyup) {
405
- listener(event);
423
+ listener(event, true);
406
424
  }
407
425
  };
408
426
  // @ts-ignore
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string): void {\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n currentlyPressedKeys.delete(key)\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(e.code))\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(e.code))\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n }\n else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n hasTriggeredRef.current = true\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","shift","meta","mod","singleCharKeys","filter","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","clear","document","addEventListener","e","undefined","code","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","cb","memoisedOptions","proxy","listener","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '#': 'backslash',\n '+': 'bracketright',\n 'ShiftLeft': 'shift',\n 'ShiftRight': 'shift',\n 'AltLeft': 'alt',\n 'AltRight': 'alt',\n 'MetaLeft': 'meta',\n 'MetaRight': 'meta',\n 'ControlLeft': 'ctrl',\n 'ControlRight': 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace('key', '')\n .replace('digit', '')\n .replace('numpad', '')\n .replace('arrow', '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey: string = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map(k => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey: string = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n\n(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(targetTagName && enabledOnTags && enabledOnTags.some(tag => tag.toLowerCase() === targetTagName.toLowerCase()))\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>',\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers: boolean = false): boolean => {\n const { alt, meta, mod, shift, keys } = hotkey\n const { key: pressedKeyUppercase, code } = e\n\n const altKey = isHotkeyPressed('alt')\n const shiftKey = isHotkeyPressed('shift')\n const metaKey = isHotkeyPressed('meta')\n const ctrlKey = isHotkeyPressed('ctrl')\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n if (altKey !== alt && pressedKey !== 'alt') {\n return false\n }\n\n if (shiftKey !== shift && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void,\n removeHotkey: (hotkey: Hotkey) => void,\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return <BoundHotkeysProxyProvider.Provider value={{addHotkey, removeHotkey}}>{children}</BoundHotkeysProxyProvider.Provider>\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return (x && y && typeof x === 'object' && typeof y === 'object')\n //@ts-ignore\n ? (Object.keys(x).length === Object.keys(y).length) && Object.keys(x).reduce(function(isEqual, key) {\n return isEqual && deepEqual(x[key], y[key])\n }, true)\n : (x === y)\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({initiallyActiveScopes = ['*'], children}: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*'])\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([]);\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter(s => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter(s => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter(h => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider value={{enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope}}>\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray,\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined\n const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []\n\n const cb = useCallback(callback, [..._deps])\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp: boolean = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {\n stopPropagation(e)\n\n return\n }\n\n if (((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable)) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cb(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n\n return () => {\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || _options?.document || document).removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey)))\n }\n }\n }, [keys, cb, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false);\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys(prev => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","shift","meta","mod","singleCharKeys","filter","currentlyPressedKeys","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","pushToCurrentlyPressedKeys","forEach","add","removeFromCurrentlyPressedKeys","clear","document","addEventListener","e","undefined","code","window","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","altKey","shiftKey","metaKey","ctrlKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","cb","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -28,5 +28,6 @@ export declare type Options = {
28
28
  preventDefault?: Trigger;
29
29
  description?: string;
30
30
  document?: Document;
31
+ ignoreModifiers?: boolean;
31
32
  };
32
33
  export declare type OptionsOrDependencyArray = Options | DependencyList;
@@ -4,4 +4,4 @@ export declare function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enable
4
4
  export declare function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean;
5
5
  export declare function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags?: FormTags[] | boolean): boolean;
6
6
  export declare function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean;
7
- export declare const isHotkeyMatchingKeyboardEvent: (e: KeyboardEvent, hotkey: Hotkey) => boolean;
7
+ export declare const isHotkeyMatchingKeyboardEvent: (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers?: boolean) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-hotkeys-hook",
3
- "version": "4.3.0",
3
+ "version": "4.3.2",
4
4
  "repository": "https://JohannesKlauss@github.com/JohannesKlauss/react-keymap-hook.git",
5
5
  "homepage": "https://johannesklauss.github.io/react-hotkeys-hook/",
6
6
  "author": "Johannes Klauss",
@@ -17,13 +17,15 @@ export function pushToCurrentlyPressedKeys(key: string | string[]): void {
17
17
  Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.
18
18
  */
19
19
  if (currentlyPressedKeys.has('meta')) {
20
- currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key))
20
+ currentlyPressedKeys.forEach(key => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))
21
21
  }
22
22
 
23
23
  hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(hotkey.toLowerCase()))
24
24
  }
25
25
 
26
- export function removeFromCurrentlyPressedKeys(key: string): void {
26
+ export function removeFromCurrentlyPressedKeys(key: string | string[]): void {
27
+ const hotkeyArray = Array.isArray(key) ? key : [key]
28
+
27
29
  /*
28
30
  Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.
29
31
  https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser
@@ -32,7 +34,7 @@ export function removeFromCurrentlyPressedKeys(key: string): void {
32
34
  if (key === 'meta') {
33
35
  currentlyPressedKeys.clear()
34
36
  } else {
35
- currentlyPressedKeys.delete(key)
37
+ hotkeyArray.forEach(hotkey => currentlyPressedKeys.delete(hotkey.toLowerCase()))
36
38
  }
37
39
  }
38
40
 
@@ -44,7 +46,7 @@ export function removeFromCurrentlyPressedKeys(key: string): void {
44
46
  return
45
47
  }
46
48
 
47
- pushToCurrentlyPressedKeys(mapKey(e.code))
49
+ pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])
48
50
  })
49
51
 
50
52
  document.addEventListener('keyup', e => {
@@ -53,7 +55,13 @@ export function removeFromCurrentlyPressedKeys(key: string): void {
53
55
  return
54
56
  }
55
57
 
56
- removeFromCurrentlyPressedKeys(mapKey(e.code))
58
+ removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])
59
+ })
60
+ }
61
+
62
+ if (typeof window !== 'undefined') {
63
+ window.addEventListener('blur', () => {
64
+ currentlyPressedKeys.clear()
57
65
  })
58
66
  }
59
67
  })()
package/src/types.ts CHANGED
@@ -36,6 +36,7 @@ export type Options = {
36
36
  preventDefault?: Trigger // Prevent default browser behavior? (Default: false)
37
37
  description?: string // Use this option to describe what the hotkey does. (Default: undefined)
38
38
  document?: Document // Listen to events on the document instead of the window. (Default: false)
39
+ ignoreModifiers?: boolean // Ignore modifiers when matching hotkeys. (Default: false)
39
40
  }
40
41
 
41
42
  export type OptionsOrDependencyArray = Options | DependencyList
package/src/useHotkeys.ts CHANGED
@@ -45,7 +45,7 @@ export default function useHotkeys<T extends HTMLElement>(
45
45
  return
46
46
  }
47
47
 
48
- const listener = (e: KeyboardEvent) => {
48
+ const listener = (e: KeyboardEvent, isKeyUp: boolean = false) => {
49
49
  if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {
50
50
  return
51
51
  }
@@ -65,7 +65,7 @@ export default function useHotkeys<T extends HTMLElement>(
65
65
  parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {
66
66
  const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)
67
67
 
68
- if ((isHotkeyMatchingKeyboardEvent(e, hotkey) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {
68
+ if ((isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) && !hasTriggeredRef.current) {
69
69
  maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)
70
70
 
71
71
  if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {
@@ -77,7 +77,9 @@ export default function useHotkeys<T extends HTMLElement>(
77
77
  // Execute the user callback for that hotkey
78
78
  cb(e, hotkey)
79
79
 
80
- hasTriggeredRef.current = true
80
+ if (!isKeyUp) {
81
+ hasTriggeredRef.current = true
82
+ }
81
83
  }
82
84
  })
83
85
  }
@@ -106,7 +108,7 @@ export default function useHotkeys<T extends HTMLElement>(
106
108
  hasTriggeredRef.current = false
107
109
 
108
110
  if (memoisedOptions?.keyup) {
109
- listener(event)
111
+ listener(event, true)
110
112
  }
111
113
  }
112
114
 
package/src/validators.ts CHANGED
@@ -33,7 +33,7 @@ export function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: F
33
33
  export function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {
34
34
  if (activeScopes.length === 0 && scopes) {
35
35
  console.warn(
36
- 'A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'
36
+ 'A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>',
37
37
  )
38
38
 
39
39
  return true
@@ -46,7 +46,7 @@ export function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean
46
46
  return activeScopes.some(scope => scopes.includes(scope)) || activeScopes.includes('*')
47
47
  }
48
48
 
49
- export const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey): boolean => {
49
+ export const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers: boolean = false): boolean => {
50
50
  const { alt, meta, mod, shift, keys } = hotkey
51
51
  const { key: pressedKeyUppercase, code } = e
52
52
 
@@ -58,23 +58,25 @@ export const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey):
58
58
  const keyCode = mapKey(code)
59
59
  const pressedKey = pressedKeyUppercase.toLowerCase()
60
60
 
61
- if (altKey !== alt && pressedKey !== 'alt') {
62
- return false
63
- }
64
-
65
- if (shiftKey !== shift && pressedKey !== 'shift') {
66
- return false
67
- }
68
-
69
- // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
70
- if (mod) {
71
- if (!metaKey && !ctrlKey) {
61
+ if (!ignoreModifiers) {
62
+ if (altKey !== alt && pressedKey !== 'alt') {
72
63
  return false
73
64
  }
74
- } else {
75
- if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
65
+
66
+ if (shiftKey !== shift && pressedKey !== 'shift') {
76
67
  return false
77
68
  }
69
+
70
+ // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
71
+ if (mod) {
72
+ if (!metaKey && !ctrlKey) {
73
+ return false
74
+ }
75
+ } else {
76
+ if (metaKey !== meta && ctrlKey !== meta && keyCode !== 'meta' && keyCode !== 'ctrl') {
77
+ return false
78
+ }
79
+ }
78
80
  }
79
81
 
80
82
  // All modifiers are correct, now check the key
@@ -84,8 +86,7 @@ export const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey):
84
86
  } else if (keys) {
85
87
  // Check if all keys are present in pressedDownKeys set
86
88
  return isHotkeyPressed(keys)
87
- }
88
- else if (!keys) {
89
+ } else if (!keys) {
89
90
  // If the key is not set, we only listen for modifiers, that check went alright, so we return true
90
91
  return true
91
92
  }