react-hotkeys-hook 4.0.4-5 → 4.0.5

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.
@@ -56,7 +56,16 @@ var mappedKeys = {
56
56
  left: 'arrowleft',
57
57
  up: 'arrowup',
58
58
  right: 'arrowright',
59
- down: 'arrowdown'
59
+ down: 'arrowdown',
60
+ '1': 'digit1',
61
+ '2': 'digit2',
62
+ '3': 'digit3',
63
+ '4': 'digit4',
64
+ '5': 'digit5',
65
+ '6': 'digit6',
66
+ '7': 'digit7',
67
+ '8': 'digit8',
68
+ '9': 'digit9'
60
69
  };
61
70
  function parseKeysHookInput(keys, splitKey) {
62
71
  if (splitKey === void 0) {
@@ -292,10 +301,9 @@ var stopPropagation = function stopPropagation(e) {
292
301
  e.stopImmediatePropagation();
293
302
  };
294
303
  var useSafeLayoutEffect = typeof window !== 'undefined' ? react.useLayoutEffect : react.useEffect;
304
+ var pressedDownKeys = /*#__PURE__*/new Set();
295
305
  function useHotkeys(keys, callback, options, dependencies) {
296
306
  var ref = react.useRef(null);
297
- var _useRef = react.useRef(new Set()),
298
- pressedDownKeys = _useRef.current;
299
307
  var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
300
308
  var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : [];
301
309
  var cb = react.useCallback(callback, [].concat(_deps));
@@ -335,12 +343,20 @@ function useHotkeys(keys, callback, options, dependencies) {
335
343
  });
336
344
  };
337
345
  var handleKeyDown = function handleKeyDown(event) {
346
+ if (event.key === undefined) {
347
+ // Synthetic event (e.g., Chrome autofill). Ignore.
348
+ return;
349
+ }
338
350
  pressedDownKeys.add(event.key.toLowerCase());
339
351
  if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {
340
352
  listener(event);
341
353
  }
342
354
  };
343
355
  var handleKeyUp = function handleKeyUp(event) {
356
+ if (event.key === undefined) {
357
+ // Synthetic event (e.g., Chrome autofill). Ignore.
358
+ return;
359
+ }
344
360
  if (event.key.toLowerCase() !== 'meta') {
345
361
  pressedDownKeys["delete"](event.key.toLowerCase());
346
362
  } else {
@@ -417,9 +433,17 @@ function removeFromCurrentlyPressedKeys(key) {
417
433
  if (typeof window !== 'undefined') {
418
434
  window.addEventListener('DOMContentLoaded', function () {
419
435
  document.addEventListener('keydown', function (e) {
436
+ if (e.key === undefined) {
437
+ // Synthetic event (e.g., Chrome autofill). Ignore.
438
+ return;
439
+ }
420
440
  pushToCurrentlyPressedKeys(e.key);
421
441
  });
422
442
  document.addEventListener('keyup', function (e) {
443
+ if (e.key === undefined) {
444
+ // Synthetic event (e.g., Chrome autofill). Ignore.
445
+ return;
446
+ }
423
447
  removeFromCurrentlyPressedKeys(e.key);
424
448
  });
425
449
  });
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { 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 { 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'\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 { current: pressedDownKeys } = useRef<Set<string>>(new Set())\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 WONT TRIGGER THE HOTKEY.\n\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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n pressedDownKeys.add(event.key.toLowerCase())\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.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n pushToCurrentlyPressedKeys(e.key)\n })\n\n document.addEventListener('keyup', e => {\n removeFromCurrentlyPressedKeys(e.key)\n })\n })\n }\n})()\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","modifiers","alt","includes","ctrl","shift","meta","mod","singleCharKeys","filter","maybePreventDefault","e","preventDefault","isHotkeyEnabled","enabled","undefined","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedDownKeys","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","key","code","keyCode","replace","pressedKey","every","has","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","from","Set","s","addBoundHotkey","removeBoundHotkey","h","deepEqual","x","y","Object","reduce","isEqual","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_options","_deps","cb","useCallback","memoisedOptions","proxy","listener","enableOnFormTags","document","activeElement","contains","isContentEditable","enableOnContentEditable","forEach","handleKeyDown","event","add","keydown","keyup","handleKeyUp","clear","addEventListener","removeEventListener","currentlyPressedKeys","isHotkeyPressed","hotkeyArray","isArray","parsedHotkey","pressedHotkey","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\n '1': 'digit1',\n '2': 'digit2',\n '3': 'digit3',\n '4': 'digit4',\n '5': 'digit5',\n '6': 'digit6',\n '7': 'digit7',\n '8': 'digit8',\n '9': 'digit9',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { 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 { 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'\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\nconst pressedDownKeys = new Set<string>()\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\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 WONT 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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\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 pressedDownKeys.add(event.key.toLowerCase())\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 if (event.key.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(e.key)\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(e.key)\n })\n })\n }\n})()\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","modifiers","alt","includes","ctrl","shift","meta","mod","singleCharKeys","filter","maybePreventDefault","e","preventDefault","isHotkeyEnabled","enabled","undefined","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedDownKeys","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","key","code","keyCode","replace","pressedKey","every","has","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","from","Set","s","addBoundHotkey","removeBoundHotkey","h","deepEqual","x","y","Object","reduce","isEqual","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_options","_deps","cb","useCallback","memoisedOptions","proxy","listener","enableOnFormTags","document","activeElement","contains","isContentEditable","enableOnContentEditable","forEach","handleKeyDown","event","add","keydown","keyup","handleKeyUp","clear","addEventListener","removeEventListener","currentlyPressedKeys","isHotkeyPressed","hotkeyArray","isArray","parsedHotkey","pressedHotkey","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys"],"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 r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return r(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,void 0):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i=["ctrl","shift","alt","meta","mod"],u={esc:"escape",return:"enter",left:"arrowleft",up:"arrowup",right:"arrowright",down:"arrowdown"};function a(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 e.trim()})).map((function(e){return u[e]||e}));return n({},{alt:r.includes("alt"),ctrl:r.includes("ctrl"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!i.includes(e)}))})}function l(e,t){var n=e.target;void 0===t&&(t=!1);var r=n&&n.tagName;return t instanceof Array?Boolean(r&&t&&t.some((function(e){return e.toLowerCase()===r.toLowerCase()}))):Boolean(r&&t&&!0===t)}var s=e.createContext(void 0);function d(e){return t.jsx(s.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}var f=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),y=function(){return e.useContext(f)};function v(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,r){return n&&v(e[r],t[r])}),!0):e===t}var p=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},m="undefined"!=typeof window?e.useLayoutEffect:e.useEffect,k=new Set;"undefined"!=typeof window&&window.addEventListener("DOMContentLoaded",(function(){document.addEventListener("keydown",(function(e){var t;t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){return k.add(c(e))}))})),document.addEventListener("keyup",(function(e){var t;t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){for(var t,n=c(e),r=o(k);!(t=r()).done;){var i,u=t.value;null!=(i=u.keys)&&i.every((function(e){var t;return null==(t=n.keys)?void 0:t.includes(e)}))&&k.delete(u)}}))}))})),exports.HotkeysProvider=function(n){var r=n.initiallyActiveScopes,o=void 0===r?["*"]:r,i=n.children,u=e.useState((null==o?void 0:o.length)>0?o:["*"]),a=u[0],c=u[1],l=e.useState([]),s=l[0],y=l[1],v=e.useMemo((function(){return a.includes("*")}),[a]),p=function(e){c(v?[e]:Array.from(new Set([].concat(a,[e]))))},m=function(e){var t=a.filter((function(t){return t!==e}));c(0===t.length?["*"]:t)};return t.jsx(f.Provider,{value:{enabledScopes:a,hotkeys:s,enableScope:p,disableScope:m,toggleScope:function(e){a.includes(e)?m(e):p(e)}},children:t.jsx(d,{addHotkey:function(e){y([].concat(s,[e]))},removeHotkey:function(e){y(s.filter((function(t){return t.keys!==e.keys})))},children:i})})},exports.isHotkeyPressed=function(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){for(var t,n=c(e),r=o(k);!(t=r()).done;)if(v(n,t.value))return!0}))},exports.useHotkeys=function(t,n,r,o){var i=e.useRef(null),u=e.useRef(new Set).current,d=r instanceof Array?o instanceof Array?void 0:o:r,f=e.useCallback(n,[].concat(r instanceof Array?r:o instanceof Array?o:[])),k=function(t){var n=e.useRef(void 0);return v(n.current,t)||(n.current=t),n.current}(d),h=y().enabledScopes,b=e.useContext(s);return m((function(){if(!1!==(null==k?void 0:k.enabled)&&(n=null==k?void 0:k.scopes,0===(e=h).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,r=function(e){var n;l(e,["input","textarea","select"])&&!l(e,null==k?void 0:k.enableOnFormTags)||(null===i.current||document.activeElement===i.current||i.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=k&&k.enableOnContentEditable)&&a(t,null==k?void 0:k.splitKey).forEach((function(t){var n,r=c(t,null==k?void 0:k.combinationKey);if(function(e,t,n){var r=t.alt,o=t.ctrl,i=t.meta,u=t.mod,a=t.shift,c=t.keys,l=e.altKey,s=e.ctrlKey,d=e.metaKey,f=e.shiftKey,y=e.key,v=e.code.toLowerCase().replace("key",""),p=y.toLowerCase();if(l!==r&&"alt"!==p)return!1;if(f!==a&&"shift"!==p)return!1;if(u){if(!d&&!s)return!1}else{if(d!==i&&"meta"!==v)return!1;if(s!==o&&"ctrl"!==v)return!1}return!(!c||1!==c.length||!c.includes(p)&&!c.includes(v))||(c?c.every((function(e){return n.has(e)})):!c)}(e,r,u)||null!=(n=r.keys)&&n.includes("*")){if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==k?void 0:k.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==k?void 0:k.enabled))return void p(e);f(e,r)}})):p(e))},o=function(e){u.add(e.key.toLowerCase()),(void 0===(null==k?void 0:k.keydown)&&!0!==(null==k?void 0:k.keyup)||null!=k&&k.keydown)&&r(e)},s=function(e){"meta"!==e.key.toLowerCase()?u.delete(e.key.toLowerCase()):u.clear(),null!=k&&k.keyup&&r(e)};return(i.current||document).addEventListener("keyup",s),(i.current||document).addEventListener("keydown",o),b&&a(t,null==k?void 0:k.splitKey).forEach((function(e){return b.addHotkey(c(e,null==k?void 0:k.combinationKey))})),function(){(i.current||document).removeEventListener("keyup",s),(i.current||document).removeEventListener("keydown",o),b&&a(t,null==k?void 0:k.splitKey).forEach((function(e){return b.removeHotkey(c(e,null==k?void 0:k.combinationKey))}))}}}),[t,f,k,h]),i},exports.useHotkeysContext=y;
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 r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return r(e,void 0);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,void 0):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0;return function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i=["ctrl","shift","alt","meta","mod"],u={esc:"escape",return:"enter",left:"arrowleft",up:"arrowup",right:"arrowright",down:"arrowdown",1:"digit1",2:"digit2",3:"digit3",4:"digit4",5:"digit5",6:"digit6",7:"digit7",8:"digit8",9:"digit9"};function a(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 e.trim()})).map((function(e){return u[e]||e}));return n({},{alt:r.includes("alt"),ctrl:r.includes("ctrl"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!i.includes(e)}))})}function l(e,t){var n=e.target;void 0===t&&(t=!1);var r=n&&n.tagName;return t instanceof Array?Boolean(r&&t&&t.some((function(e){return e.toLowerCase()===r.toLowerCase()}))):Boolean(r&&t&&!0===t)}var d=e.createContext(void 0);function s(e){return t.jsx(d.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}var f=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),y=function(){return e.useContext(f)};function v(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,r){return n&&v(e[r],t[r])}),!0):e===t}var p=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},m="undefined"!=typeof window?e.useLayoutEffect:e.useEffect,k=new Set,h=new Set;"undefined"!=typeof window&&window.addEventListener("DOMContentLoaded",(function(){document.addEventListener("keydown",(function(e){var t;void 0!==e.key&&(t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){return h.add(c(e))})))})),document.addEventListener("keyup",(function(e){var t;void 0!==e.key&&(t=e.key,(Array.isArray(t)?t:[t]).forEach((function(e){for(var t,n=c(e),r=o(h);!(t=r()).done;){var i,u=t.value;null!=(i=u.keys)&&i.every((function(e){var t;return null==(t=n.keys)?void 0:t.includes(e)}))&&h.delete(u)}})))}))})),exports.HotkeysProvider=function(n){var r=n.initiallyActiveScopes,o=void 0===r?["*"]:r,i=n.children,u=e.useState((null==o?void 0:o.length)>0?o:["*"]),a=u[0],c=u[1],l=e.useState([]),d=l[0],y=l[1],v=e.useMemo((function(){return a.includes("*")}),[a]),p=function(e){c(v?[e]:Array.from(new Set([].concat(a,[e]))))},m=function(e){var t=a.filter((function(t){return t!==e}));c(0===t.length?["*"]:t)};return t.jsx(f.Provider,{value:{enabledScopes:a,hotkeys:d,enableScope:p,disableScope:m,toggleScope:function(e){a.includes(e)?m(e):p(e)}},children:t.jsx(s,{addHotkey:function(e){y([].concat(d,[e]))},removeHotkey:function(e){y(d.filter((function(t){return t.keys!==e.keys})))},children:i})})},exports.isHotkeyPressed=function(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){for(var t,n=c(e),r=o(h);!(t=r()).done;)if(v(n,t.value))return!0}))},exports.useHotkeys=function(t,n,r,o){var i=e.useRef(null),u=r instanceof Array?o instanceof Array?void 0:o:r,s=e.useCallback(n,[].concat(r instanceof Array?r:o instanceof Array?o:[])),f=function(t){var n=e.useRef(void 0);return v(n.current,t)||(n.current=t),n.current}(u),h=y().enabledScopes,g=e.useContext(d);return m((function(){if(!1!==(null==f?void 0:f.enabled)&&(n=null==f?void 0:f.scopes,0===(e=h).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,r=function(e){var n;l(e,["input","textarea","select"])&&!l(e,null==f?void 0:f.enableOnFormTags)||(null===i.current||document.activeElement===i.current||i.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=f&&f.enableOnContentEditable)&&a(t,null==f?void 0:f.splitKey).forEach((function(t){var n,r=c(t,null==f?void 0:f.combinationKey);if(function(e,t,n){var r=t.alt,o=t.ctrl,i=t.meta,u=t.mod,a=t.shift,c=t.keys,l=e.altKey,d=e.ctrlKey,s=e.metaKey,f=e.shiftKey,y=e.key,v=e.code.toLowerCase().replace("key",""),p=y.toLowerCase();if(l!==r&&"alt"!==p)return!1;if(f!==a&&"shift"!==p)return!1;if(u){if(!s&&!d)return!1}else{if(s!==i&&"meta"!==v)return!1;if(d!==o&&"ctrl"!==v)return!1}return!(!c||1!==c.length||!c.includes(p)&&!c.includes(v))||(c?c.every((function(e){return n.has(e)})):!c)}(e,r,k)||null!=(n=r.keys)&&n.includes("*")){if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==f?void 0:f.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==f?void 0:f.enabled))return void p(e);s(e,r)}})):p(e))},o=function(e){void 0!==e.key&&(k.add(e.key.toLowerCase()),(void 0===(null==f?void 0:f.keydown)&&!0!==(null==f?void 0:f.keyup)||null!=f&&f.keydown)&&r(e))},u=function(e){void 0!==e.key&&("meta"!==e.key.toLowerCase()?k.delete(e.key.toLowerCase()):k.clear(),null!=f&&f.keyup&&r(e))};return(i.current||document).addEventListener("keyup",u),(i.current||document).addEventListener("keydown",o),g&&a(t,null==f?void 0:f.splitKey).forEach((function(e){return g.addHotkey(c(e,null==f?void 0:f.combinationKey))})),function(){(i.current||document).removeEventListener("keyup",u),(i.current||document).removeEventListener("keydown",o),g&&a(t,null==f?void 0:f.splitKey).forEach((function(e){return g.removeHotkey(c(e,null==f?void 0:f.combinationKey))}))}}}),[t,s,f,h]),i},exports.useHotkeysContext=y;
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/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts","../src/useDeepEqualMemo.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { 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'\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 { current: pressedDownKeys } = useRef<Set<string>>(new Set())\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 WONT TRIGGER THE HOTKEY.\n\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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n pressedDownKeys.add(event.key.toLowerCase())\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.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n pushToCurrentlyPressedKeys(e.key)\n })\n\n document.addEventListener('keyup', e => {\n removeFromCurrentlyPressedKeys(e.key)\n })\n })\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"],"names":["reservedModifierKeywords","mappedKeys","esc","return","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","alt","includes","ctrl","shift","meta","mod","filter","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","BoundHotkeysProxyProvider","createContext","undefined","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","deepEqual","x","y","Object","length","reduce","isEqual","key","stopPropagation","e","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","currentlyPressedKeys","Set","addEventListener","document","isArray","forEach","add","parsedHotkey","pressedHotkey","_pressedHotkey$keys","every","_parsedHotkey$keys","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","scope","from","scopes","s","h","callback","options","dependencies","ref","useRef","pressedDownKeys","current","_options","cb","useCallback","memoisedOptions","useDeepEqualMemo","proxy","enabled","activeScopes","console","warn","listener","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","keyCode","code","replace","pressedKey","has","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","clear","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts","../src/useDeepEqualMemo.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\n '1': 'digit1',\n '2': 'digit2',\n '3': 'digit3',\n '4': 'digit4',\n '5': 'digit5',\n '6': 'digit6',\n '7': 'digit7',\n '8': 'digit8',\n '9': 'digit9',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { 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'\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\nconst pressedDownKeys = new Set<string>()\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\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 WONT 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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\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 pressedDownKeys.add(event.key.toLowerCase())\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 if (event.key.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(e.key)\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(e.key)\n })\n })\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"],"names":["reservedModifierKeywords","mappedKeys","esc","return","left","up","right","down","1","2","3","4","5","6","7","8","9","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","alt","includes","ctrl","shift","meta","mod","filter","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","BoundHotkeysProxyProvider","createContext","undefined","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","deepEqual","x","y","Object","length","reduce","isEqual","key","stopPropagation","e","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","pressedDownKeys","Set","currentlyPressedKeys","addEventListener","document","isArray","forEach","add","parsedHotkey","pressedHotkey","_pressedHotkey$keys","every","_parsedHotkey$keys","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","scope","from","scopes","s","h","callback","options","dependencies","ref","useRef","_options","cb","useCallback","memoisedOptions","current","useDeepEqualMemo","proxy","enabled","activeScopes","console","warn","listener","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","keyCode","code","replace","pressedKey","has","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","clear","removeEventListener"],"mappings":"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"}
@@ -54,7 +54,16 @@ var mappedKeys = {
54
54
  left: 'arrowleft',
55
55
  up: 'arrowup',
56
56
  right: 'arrowright',
57
- down: 'arrowdown'
57
+ down: 'arrowdown',
58
+ '1': 'digit1',
59
+ '2': 'digit2',
60
+ '3': 'digit3',
61
+ '4': 'digit4',
62
+ '5': 'digit5',
63
+ '6': 'digit6',
64
+ '7': 'digit7',
65
+ '8': 'digit8',
66
+ '9': 'digit9'
58
67
  };
59
68
  function parseKeysHookInput(keys, splitKey) {
60
69
  if (splitKey === void 0) {
@@ -290,10 +299,9 @@ var stopPropagation = function stopPropagation(e) {
290
299
  e.stopImmediatePropagation();
291
300
  };
292
301
  var useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
302
+ var pressedDownKeys = /*#__PURE__*/new Set();
293
303
  function useHotkeys(keys, callback, options, dependencies) {
294
304
  var ref = useRef(null);
295
- var _useRef = useRef(new Set()),
296
- pressedDownKeys = _useRef.current;
297
305
  var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
298
306
  var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : [];
299
307
  var cb = useCallback(callback, [].concat(_deps));
@@ -333,12 +341,20 @@ function useHotkeys(keys, callback, options, dependencies) {
333
341
  });
334
342
  };
335
343
  var handleKeyDown = function handleKeyDown(event) {
344
+ if (event.key === undefined) {
345
+ // Synthetic event (e.g., Chrome autofill). Ignore.
346
+ return;
347
+ }
336
348
  pressedDownKeys.add(event.key.toLowerCase());
337
349
  if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {
338
350
  listener(event);
339
351
  }
340
352
  };
341
353
  var handleKeyUp = function handleKeyUp(event) {
354
+ if (event.key === undefined) {
355
+ // Synthetic event (e.g., Chrome autofill). Ignore.
356
+ return;
357
+ }
342
358
  if (event.key.toLowerCase() !== 'meta') {
343
359
  pressedDownKeys["delete"](event.key.toLowerCase());
344
360
  } else {
@@ -415,9 +431,17 @@ function removeFromCurrentlyPressedKeys(key) {
415
431
  if (typeof window !== 'undefined') {
416
432
  window.addEventListener('DOMContentLoaded', function () {
417
433
  document.addEventListener('keydown', function (e) {
434
+ if (e.key === undefined) {
435
+ // Synthetic event (e.g., Chrome autofill). Ignore.
436
+ return;
437
+ }
418
438
  pushToCurrentlyPressedKeys(e.key);
419
439
  });
420
440
  document.addEventListener('keyup', function (e) {
441
+ if (e.key === undefined) {
442
+ // Synthetic event (e.g., Chrome autofill). Ignore.
443
+ return;
444
+ }
421
445
  removeFromCurrentlyPressedKeys(e.key);
422
446
  });
423
447
  });
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { 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 { 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'\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 { current: pressedDownKeys } = useRef<Set<string>>(new Set())\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 WONT TRIGGER THE HOTKEY.\n\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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n pressedDownKeys.add(event.key.toLowerCase())\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.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n pushToCurrentlyPressedKeys(e.key)\n })\n\n document.addEventListener('keyup', e => {\n removeFromCurrentlyPressedKeys(e.key)\n })\n })\n }\n})()\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","modifiers","alt","includes","ctrl","shift","meta","mod","singleCharKeys","filter","maybePreventDefault","e","preventDefault","isHotkeyEnabled","enabled","undefined","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedDownKeys","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","key","code","keyCode","replace","pressedKey","every","has","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","from","Set","s","addBoundHotkey","removeBoundHotkey","h","deepEqual","x","y","Object","reduce","isEqual","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_options","_deps","cb","useCallback","memoisedOptions","proxy","listener","enableOnFormTags","document","activeElement","contains","isContentEditable","enableOnContentEditable","forEach","handleKeyDown","event","add","keydown","keyup","handleKeyUp","clear","addEventListener","removeEventListener","currentlyPressedKeys","isHotkeyPressed","hotkeyArray","isArray","parsedHotkey","pressedHotkey","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,wBAAwB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AAExE,IAAMC,UAAU,GAA2B;EACzCC,GAAG,EAAE,QAAQ;EACb,UAAQ,OAAO;EACfC,IAAI,EAAE,WAAW;EACjBC,EAAE,EAAE,SAAS;EACbC,KAAK,EAAE,YAAY;EACnBC,IAAI,EAAE;CACP;SAEeC,kBAAkB,CAACC,IAAU,EAAEC;MAAAA;IAAAA,WAAmB,GAAG;;EACnE,IAAI,OAAOD,IAAI,KAAK,QAAQ,EAAE;IAC5B,OAAOA,IAAI,CAACE,KAAK,CAACD,QAAQ,CAAC;;EAG7B,OAAOD,IAAI;AACb;SAEgBG,WAAW,CAACC,MAAc,EAAEC;MAAAA;IAAAA,iBAAyB,GAAG;;EACtE,IAAML,IAAI,GAAGI,MAAM,CAChBE,iBAAiB,EAAE,CACnBJ,KAAK,CAACG,cAAc,CAAC,CACrBE,GAAG,CAAC,UAAAC,CAAC;IAAA,OAAIA,CAAC,CAACC,IAAI,EAAE;IAAC,CAClBF,GAAG,CAAC,UAAAC,CAAC;IAAA,OAAIf,UAAU,CAACe,CAAC,CAAC,IAAIA,CAAC;IAAC;EAE/B,IAAME,SAAS,GAAsB;IACnCC,GAAG,EAAEX,IAAI,CAACY,QAAQ,CAAC,KAAK,CAAC;IACzBC,IAAI,EAAEb,IAAI,CAACY,QAAQ,CAAC,MAAM,CAAC;IAC3BE,KAAK,EAAEd,IAAI,CAACY,QAAQ,CAAC,OAAO,CAAC;IAC7BG,IAAI,EAAEf,IAAI,CAACY,QAAQ,CAAC,MAAM,CAAC;IAC3BI,GAAG,EAAEhB,IAAI,CAACY,QAAQ,CAAC,KAAK;GACzB;EAED,IAAMK,cAAc,GAAGjB,IAAI,CAACkB,MAAM,CAAC,UAACV,CAAC;IAAA,OAAK,CAAChB,wBAAwB,CAACoB,QAAQ,CAACJ,CAAC,CAAC;IAAC;EAEhF,oBACKE,SAAS;IACZV,IAAI,EAAEiB;;AAEV;;SCxCgBE,mBAAmB,CAACC,CAAgB,EAAEhB,MAAc,EAAEiB,cAAwB;EAC5F,IAAK,OAAOA,cAAc,KAAK,UAAU,IAAIA,cAAc,CAACD,CAAC,EAAEhB,MAAM,CAAC,IAAKiB,cAAc,KAAK,IAAI,EAAE;IAClGD,CAAC,CAACC,cAAc,EAAE;;AAEtB;AAEA,SAAgBC,eAAe,CAACF,CAAgB,EAAEhB,MAAc,EAAEmB,OAAiB;EACjF,IAAI,OAAOA,OAAO,KAAK,UAAU,EAAE;IACjC,OAAOA,OAAO,CAACH,CAAC,EAAEhB,MAAM,CAAC;;EAG3B,OAAOmB,OAAO,KAAK,IAAI,IAAIA,OAAO,KAAKC,SAAS;AAClD;AAEA,SAAgBC,+BAA+B,CAACC,EAAiB;EAC/D,OAAOC,oBAAoB,CAACD,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE;AAEA,SAAgBC,oBAAoB,OAA4BC;MAAzBC,MAAM,QAANA,MAAM;EAAA,IAAmBD;IAAAA,gBAAsC,KAAK;;EACzG,IAAME,aAAa,GAAGD,MAAM,IAAKA,MAAsB,CAACE,OAAO;EAE/D,IAAIH,aAAa,YAAYI,KAAK,EAAE;IAClC,OAAOC,OAAO,CAACH,aAAa,IAAIF,aAAa,IAAIA,aAAa,CAACM,IAAI,CAAC,UAAAC,GAAG;MAAA,OAAIA,GAAG,CAACC,WAAW,EAAE,KAAKN,aAAa,CAACM,WAAW,EAAE;MAAC,CAAC;;EAGhI,OAAOH,OAAO,CAACH,aAAa,IAAIF,aAAa,IAAIA,aAAa,KAAK,IAAI,CAAC;AAC1E;AAEA,SAAgBS,aAAa,CAACC,YAAsB,EAAEC,MAAe;EACnE,IAAID,YAAY,CAACE,MAAM,KAAK,CAAC,IAAID,MAAM,EAAE;IACvCE,OAAO,CAACC,IAAI,CACV,2KAA2K,CAC5K;IAED,OAAO,IAAI;;EAGb,IAAI,CAACH,MAAM,EAAE;IACX,OAAO,IAAI;;EAGb,OAAOD,YAAY,CAACJ,IAAI,CAAC,UAAAS,KAAK;IAAA,OAAIJ,MAAM,CAAC3B,QAAQ,CAAC+B,KAAK,CAAC;IAAC,IAAIL,YAAY,CAAC1B,QAAQ,CAAC,GAAG,CAAC;AACzF;AAEA,AAAO,IAAMgC,6BAA6B,GAAG,SAAhCA,6BAA6B,CAAIxB,CAAgB,EAAEhB,MAAc,EAAEyC,eAA4B;EAC1G,IAAQlC,GAAG,GAAmCP,MAAM,CAA5CO,GAAG;IAAEE,IAAI,GAA6BT,MAAM,CAAvCS,IAAI;IAAEE,IAAI,GAAuBX,MAAM,CAAjCW,IAAI;IAAEC,GAAG,GAAkBZ,MAAM,CAA3BY,GAAG;IAAEF,KAAK,GAAWV,MAAM,CAAtBU,KAAK;IAAEd,IAAI,GAAKI,MAAM,CAAfJ,IAAI;EACzC,IAAQ8C,MAAM,GAAiE1B,CAAC,CAAxE0B,MAAM;IAAEC,OAAO,GAAwD3B,CAAC,CAAhE2B,OAAO;IAAEC,OAAO,GAA+C5B,CAAC,CAAvD4B,OAAO;IAAEC,QAAQ,GAAqC7B,CAAC,CAA9C6B,QAAQ;IAAOC,mBAAmB,GAAW9B,CAAC,CAApC+B,GAAG;IAAuBC,IAAI,GAAKhC,CAAC,CAAVgC,IAAI;EAE1E,IAAMC,OAAO,GAAGD,IAAI,CAAChB,WAAW,EAAE,CAACkB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EACrD,IAAMC,UAAU,GAAGL,mBAAmB,CAACd,WAAW,EAAE;EAEpD,IAAIU,MAAM,KAAKnC,GAAG,IAAI4C,UAAU,KAAK,KAAK,EAAE;IAC1C,OAAO,KAAK;;EAGd,IAAIN,QAAQ,KAAKnC,KAAK,IAAIyC,UAAU,KAAK,OAAO,EAAE;IAChD,OAAO,KAAK;;;EAId,IAAIvC,GAAG,EAAE;IACP,IAAI,CAACgC,OAAO,IAAI,CAACD,OAAO,EAAE;MACxB,OAAO,KAAK;;GAEf,MAAM;IACL,IAAIC,OAAO,KAAKjC,IAAI,IAAIsC,OAAO,KAAK,MAAM,EAAE;MAC1C,OAAO,KAAK;;IAGd,IAAIN,OAAO,KAAKlC,IAAI,IAAIwC,OAAO,KAAK,MAAM,EAAE;MAC1C,OAAO,KAAK;;;;;EAMhB,IAAIrD,IAAI,IAAIA,IAAI,CAACwC,MAAM,KAAK,CAAC,KAAKxC,IAAI,CAACY,QAAQ,CAAC2C,UAAU,CAAC,IAAIvD,IAAI,CAACY,QAAQ,CAACyC,OAAO,CAAC,CAAC,EAAE;IACtF,OAAO,IAAI;GACZ,MAAM,IAAIrD,IAAI,EAAE;;IAEf,OAAOA,IAAI,CAACwD,KAAK,CAAC,UAAAL,GAAG;MAAA,OAAIN,eAAe,CAACY,GAAG,CAACN,GAAG,CAAC;MAAC;GACnD,MACI,IAAI,CAACnD,IAAI,EAAE;;IAEd,OAAO,IAAI;;;EAIb,OAAO,KAAK;AACd,CAAC;;ACnFD,IAAM0D,yBAAyB,gBAAGC,aAAa,CAA4CnC,SAAS,CAAC;AAErG,AAAO,IAAMoC,oBAAoB,GAAG,SAAvBA,oBAAoB;EAC/B,OAAOC,UAAU,CAACH,yBAAyB,CAAC;AAC9C,CAAC;AAQD,SAAwBI,iCAAiC;MAAGC,SAAS,QAATA,SAAS;IAAEC,YAAY,QAAZA,YAAY;IAAEC,QAAQ,QAARA,QAAQ;EAC3F,oBAAOC,IAAC,yBAAyB,CAAC,QAAQ;IAAC,KAAK,EAAE;MAACH,SAAS,EAATA,SAAS;MAAEC,YAAY,EAAZA;KAAc;IAAA,UAAEC;IAA8C;AAC9H;;ACTA,IAAME,cAAc,gBAAGR,aAAa,CAAqB;EACvDS,OAAO,EAAE,EAAE;EACXC,aAAa,EAAE,EAAE;EACjBC,WAAW,EAAE,yBAAQ;EACrBC,WAAW,EAAE,yBAAQ;EACrBC,YAAY,EAAE;CACf,CAAC;AAEF,IAAaC,iBAAiB,GAAG,SAApBA,iBAAiB;EAC5B,OAAOZ,UAAU,CAACM,cAAc,CAAC;AACnC,CAAC;AAOD,IAAaO,eAAe,GAAG,SAAlBA,eAAe;mCAAKC,qBAAqB;IAArBA,qBAAqB,sCAAG,CAAC,GAAG,CAAC;IAAEV,QAAQ,QAARA,QAAQ;EACtE,gBAAwDW,QAAQ,CAAC,CAAAD,qBAAqB,oBAArBA,qBAAqB,CAAEnC,MAAM,IAAG,CAAC,GAAGmC,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC;IAA5HE,oBAAoB;IAAEC,uBAAuB;EACpD,iBAAwCF,QAAQ,CAAW,EAAE,CAAC;IAAvDG,YAAY;IAAEC,eAAe;EAEpC,IAAMC,WAAW,GAAGC,OAAO,CAAC;IAAA,OAAML,oBAAoB,CAACjE,QAAQ,CAAC,GAAG,CAAC;KAAE,CAACiE,oBAAoB,CAAC,CAAC;EAE7F,IAAMN,WAAW,GAAG,SAAdA,WAAW,CAAI5B,KAAa;IAChC,IAAIsC,WAAW,EAAE;MACfH,uBAAuB,CAAC,CAACnC,KAAK,CAAC,CAAC;KACjC,MAAM;MACLmC,uBAAuB,CAAC9C,KAAK,CAACmD,IAAI,CAAC,IAAIC,GAAG,WAAKP,oBAAoB,GAAElC,KAAK,GAAE,CAAC,CAAC;;GAEjF;EAED,IAAM6B,YAAY,GAAG,SAAfA,YAAY,CAAI7B,KAAa;IACjC,IAAMJ,MAAM,GAAGsC,oBAAoB,CAAC3D,MAAM,CAAC,UAAAmE,CAAC;MAAA,OAAIA,CAAC,KAAK1C,KAAK;MAAC;IAE5D,IAAIJ,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;MACvBsC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC;KAC/B,MAAM;MACLA,uBAAuB,CAACvC,MAAM,CAAC;;GAElC;EAED,IAAM+B,WAAW,GAAG,SAAdA,WAAW,CAAI3B,KAAa;IAChC,IAAIkC,oBAAoB,CAACjE,QAAQ,CAAC+B,KAAK,CAAC,EAAE;MACxC6B,YAAY,CAAC7B,KAAK,CAAC;KACpB,MAAM;MACL4B,WAAW,CAAC5B,KAAK,CAAC;;GAErB;EAED,IAAM2C,cAAc,GAAG,SAAjBA,cAAc,CAAIlF,MAAc;IACpC4E,eAAe,WAAKD,YAAY,GAAE3E,MAAM,GAAE;GAC3C;EAED,IAAMmF,iBAAiB,GAAG,SAApBA,iBAAiB,CAAInF,MAAc;IACvC4E,eAAe,CAACD,YAAY,CAAC7D,MAAM,CAAC,UAAAsE,CAAC;MAAA,OAAIA,CAAC,CAACxF,IAAI,KAAKI,MAAM,CAACJ,IAAI;MAAC,CAAC;GAClE;EAED,oBACEkE,IAAC,cAAc,CAAC,QAAQ;IAAC,KAAK,EAAE;MAACG,aAAa,EAAEQ,oBAAoB;MAAET,OAAO,EAAEW,YAAY;MAAER,WAAW,EAAXA,WAAW;MAAEC,YAAY,EAAZA,YAAY;MAAEF,WAAW,EAAXA;KAAa;IAAA,uBACnIJ,IAAC,iCAAiC;MAAC,SAAS,EAAEoB,cAAe;MAAC,YAAY,EAAEC,iBAAkB;MAAA,UAC3FtB;;IAEqB;AAE9B,CAAC;;SC7EuBwB,SAAS,CAACC,CAAM,EAAEC,CAAM;;EAE9C,OAAQD,CAAC,IAAIC,CAAC,IAAI,OAAOD,CAAC,KAAK,QAAQ,IAAI,OAAOC,CAAC,KAAK;;IAEnDC,MAAM,CAAC5F,IAAI,CAAC0F,CAAC,CAAC,CAAClD,MAAM,KAAKoD,MAAM,CAAC5F,IAAI,CAAC2F,CAAC,CAAC,CAACnD,MAAM,IAAKoD,MAAM,CAAC5F,IAAI,CAAC0F,CAAC,CAAC,CAACG,MAAM,CAAC,UAASC,OAAO,EAAE3C,GAAG;IAChG,OAAO2C,OAAO,IAAIL,SAAS,CAACC,CAAC,CAACvC,GAAG,CAAC,EAAEwC,CAAC,CAACxC,GAAG,CAAC,CAAC;GAC5C,EAAE,IAAI,CAAC,GACLuC,CAAC,KAAKC,CAAE;AACf;;SCLwBI,gBAAgB,CAAIC,KAAQ;EAClD,IAAMC,GAAG,GAAGC,MAAM,CAAgB1E,SAAS,CAAC;EAE5C,IAAI,CAACiE,SAAS,CAACQ,GAAG,CAACE,OAAO,EAAEH,KAAK,CAAC,EAAE;IAClCC,GAAG,CAACE,OAAO,GAAGH,KAAK;;EAGrB,OAAOC,GAAG,CAACE,OAAO;AACpB;;ACIA,IAAMC,eAAe,GAAG,SAAlBA,eAAe,CAAIhF,CAAgB;EACvCA,CAAC,CAACgF,eAAe,EAAE;EACnBhF,CAAC,CAACC,cAAc,EAAE;EAClBD,CAAC,CAACiF,wBAAwB,EAAE;AAC9B,CAAC;AAED,IAAMC,mBAAmB,GAAG,OAAOC,MAAM,KAAK,WAAW,GAAGC,eAAe,GAAGC,SAAS;AAEvF,SAAwBC,UAAU,CAChC1G,IAAU,EACV2G,QAAwB,EACxBC,OAAkC,EAClCC,YAAuC;EAEvC,IAAMZ,GAAG,GAAGC,MAAM,CAAa,IAAI,CAAC;EACpC,cAAqCA,MAAM,CAAc,IAAId,GAAG,EAAE,CAAC;IAAlDvC,eAAe,WAAxBsD,OAAO;EAEf,IAAMW,QAAQ,GAAwB,EAAEF,OAAO,YAAY5E,KAAK,CAAC,GAAI4E,OAAmB,GAAG,EAAEC,YAAY,YAAY7E,KAAK,CAAC,GAAI6E,YAAwB,GAAGrF,SAAS;EACnK,IAAMuF,KAAK,GAAmBH,OAAO,YAAY5E,KAAK,GAAG4E,OAAO,GAAGC,YAAY,YAAY7E,KAAK,GAAG6E,YAAY,GAAG,EAAE;EAEpH,IAAMG,EAAE,GAAGC,WAAW,CAACN,QAAQ,YAAMI,KAAK,EAAE;EAC5C,IAAMG,eAAe,GAAGnB,gBAAgB,CAACe,QAAQ,CAAC;EAElD,yBAA0BrC,iBAAiB,EAAE;IAArCJ,aAAa,sBAAbA,aAAa;EACrB,IAAM8C,KAAK,GAAGvD,oBAAoB,EAAE;EAEpC0C,mBAAmB,CAAC;IAClB,IAAI,CAAAY,eAAe,oBAAfA,eAAe,CAAE3F,OAAO,MAAK,KAAK,IAAI,CAACc,aAAa,CAACgC,aAAa,EAAE6C,eAAe,oBAAfA,eAAe,CAAE3E,MAAM,CAAC,EAAE;MAChG;;IAGF,IAAM6E,QAAQ,GAAG,SAAXA,QAAQ,CAAIhG,CAAgB;;MAChC,IAAIK,+BAA+B,CAACL,CAAC,CAAC,IAAI,CAACO,oBAAoB,CAACP,CAAC,EAAE8F,eAAe,oBAAfA,eAAe,CAAEG,gBAAgB,CAAC,EAAE;QACrG;;;;MAMF,IAAIpB,GAAG,CAACE,OAAO,KAAK,IAAI,IAAImB,QAAQ,CAACC,aAAa,KAAKtB,GAAG,CAACE,OAAO,IAAI,CAACF,GAAG,CAACE,OAAO,CAACqB,QAAQ,CAACF,QAAQ,CAACC,aAAa,CAAC,EAAE;QACnHnB,eAAe,CAAChF,CAAC,CAAC;QAElB;;MAGF,IAAM,aAAAA,CAAC,CAACS,MAAsB,aAAxB,UAA0B4F,iBAAiB,IAAI,EAACP,eAAe,YAAfA,eAAe,CAAEQ,uBAAuB,GAAG;QAC/F;;MAGF3H,kBAAkB,CAACC,IAAI,EAAEkH,eAAe,oBAAfA,eAAe,CAAEjH,QAAQ,CAAC,CAAC0H,OAAO,CAAC,UAACxE,GAAG;;QAC9D,IAAM/C,MAAM,GAAGD,WAAW,CAACgD,GAAG,EAAE+D,eAAe,oBAAfA,eAAe,CAAE7G,cAAc,CAAC;QAEhE,IAAIuC,6BAA6B,CAACxB,CAAC,EAAEhB,MAAM,EAAEyC,eAAe,CAAC,oBAAIzC,MAAM,CAACJ,IAAI,aAAX,aAAaY,QAAQ,CAAC,GAAG,CAAC,EAAE;UAC3FO,mBAAmB,CAACC,CAAC,EAAEhB,MAAM,EAAE8G,eAAe,oBAAfA,eAAe,CAAE7F,cAAc,CAAC;UAE/D,IAAI,CAACC,eAAe,CAACF,CAAC,EAAEhB,MAAM,EAAE8G,eAAe,oBAAfA,eAAe,CAAE3F,OAAO,CAAC,EAAE;YACzD6E,eAAe,CAAChF,CAAC,CAAC;YAElB;;UAGF4F,EAAE,CAAC5F,CAAC,EAAEhB,MAAM,CAAC;;OAEhB,CAAC;KACH;IAED,IAAMwH,aAAa,GAAG,SAAhBA,aAAa,CAAIC,KAAoB;MACzChF,eAAe,CAACiF,GAAG,CAACD,KAAK,CAAC1E,GAAG,CAACf,WAAW,EAAE,CAAC;MAE5C,IAAK,CAAA8E,eAAe,oBAAfA,eAAe,CAAEa,OAAO,MAAKvG,SAAS,IAAI,CAAA0F,eAAe,oBAAfA,eAAe,CAAEc,KAAK,MAAK,IAAI,IAAKd,eAAe,YAAfA,eAAe,CAAEa,OAAO,EAAE;QAC3GX,QAAQ,CAACS,KAAK,CAAC;;KAElB;IAED,IAAMI,WAAW,GAAG,SAAdA,WAAW,CAAIJ,KAAoB;MACvC,IAAIA,KAAK,CAAC1E,GAAG,CAACf,WAAW,EAAE,KAAK,MAAM,EAAE;QACtCS,eAAe,UAAO,CAACgF,KAAK,CAAC1E,GAAG,CAACf,WAAW,EAAE,CAAC;OAChD,MAAM;;QAELS,eAAe,CAACqF,KAAK,EAAE;;MAGzB,IAAIhB,eAAe,YAAfA,eAAe,CAAEc,KAAK,EAAE;QAC1BZ,QAAQ,CAACS,KAAK,CAAC;;KAElB;;IAGD,CAAC5B,GAAG,CAACE,OAAO,IAAImB,QAAQ,EAAEa,gBAAgB,CAAC,OAAO,EAAEF,WAAW,CAAC;;IAEhE,CAAChC,GAAG,CAACE,OAAO,IAAImB,QAAQ,EAAEa,gBAAgB,CAAC,SAAS,EAAEP,aAAa,CAAC;IAEpE,IAAIT,KAAK,EAAE;MACTpH,kBAAkB,CAACC,IAAI,EAAEkH,eAAe,oBAAfA,eAAe,CAAEjH,QAAQ,CAAC,CAAC0H,OAAO,CAAC,UAACxE,GAAG;QAAA,OAAKgE,KAAK,CAACpD,SAAS,CAAC5D,WAAW,CAACgD,GAAG,EAAE+D,eAAe,oBAAfA,eAAe,CAAE7G,cAAc,CAAC,CAAC;QAAC;;IAG1I,OAAO;;MAEL,CAAC4F,GAAG,CAACE,OAAO,IAAImB,QAAQ,EAAEc,mBAAmB,CAAC,OAAO,EAAEH,WAAW,CAAC;;MAEnE,CAAChC,GAAG,CAACE,OAAO,IAAImB,QAAQ,EAAEc,mBAAmB,CAAC,SAAS,EAAER,aAAa,CAAC;MAEvE,IAAIT,KAAK,EAAE;QACTpH,kBAAkB,CAACC,IAAI,EAAEkH,eAAe,oBAAfA,eAAe,CAAEjH,QAAQ,CAAC,CAAC0H,OAAO,CAAC,UAACxE,GAAG;UAAA,OAAKgE,KAAK,CAACnD,YAAY,CAAC7D,WAAW,CAACgD,GAAG,EAAE+D,eAAe,oBAAfA,eAAe,CAAE7G,cAAc,CAAC,CAAC;UAAC;;KAE9I;GACF,EAAE,CAACL,IAAI,EAAEgH,EAAE,EAAEE,eAAe,EAAE7C,aAAa,CAAC,CAAC;EAE9C,OAAO4B,GAAG;AACZ;;ACxHA,IAAMoC,oBAAoB,gBAAgB,IAAIjD,GAAG,EAAU;AAE3D,SAAgBkD,eAAe,CAACnF,GAAsB,EAAElD;MAAAA;IAAAA,WAAmB,GAAG;;EAC5E,IAAMsI,WAAW,GAAGvG,KAAK,CAACwG,OAAO,CAACrF,GAAG,CAAC,GAAGA,GAAG,GAAGA,GAAG,CAACjD,KAAK,CAACD,QAAQ,CAAC;EAElE,OAAOsI,WAAW,CAAC/E,KAAK,CAAC,UAACpD,MAAM;IAC9B,IAAMqI,YAAY,GAAGtI,WAAW,CAACC,MAAM,CAAC;IAExC,qDAA4BiI,oBAAoB,wCAAE;MAAA,IAAvCK,aAAa;MACtB,IAAIjD,SAAS,CAACgD,YAAY,EAAEC,aAAa,CAAC,EAAE;QAC1C,OAAO,IAAI;;;GAGhB,CAAC;AACJ;AAEA,SAAgBC,0BAA0B,CAACxF,GAAsB;EAC/D,IAAMoF,WAAW,GAAGvG,KAAK,CAACwG,OAAO,CAACrF,GAAG,CAAC,GAAGA,GAAG,GAAG,CAACA,GAAG,CAAC;EAEpDoF,WAAW,CAACZ,OAAO,CAAC,UAAAvH,MAAM;IAAA,OAAIiI,oBAAoB,CAACP,GAAG,CAAC3H,WAAW,CAACC,MAAM,CAAC,CAAC;IAAC;AAC9E;AAEA,SAAgBwI,8BAA8B,CAACzF,GAAsB;EACnE,IAAMoF,WAAW,GAAGvG,KAAK,CAACwG,OAAO,CAACrF,GAAG,CAAC,GAAGA,GAAG,GAAG,CAACA,GAAG,CAAC;EAEpDoF,WAAW,CAACZ,OAAO,CAAC,UAACvH,MAAM;IACzB,IAAMqI,YAAY,GAAGtI,WAAW,CAACC,MAAM,CAAC;IAExC,sDAA4BiI,oBAAoB,2CAAE;MAAA;MAAA,IAAvCK,aAAa;MACtB,2BAAIA,aAAa,CAAC1I,IAAI,aAAlB,oBAAoBwD,KAAK,CAAC,UAACL,GAAG;QAAA;QAAA,6BAAKsF,YAAY,CAACzI,IAAI,qBAAjB,mBAAmBY,QAAQ,CAACuC,GAAG,CAAC;QAAC,EAAE;QACxEkF,oBAAoB,UAAO,CAACK,aAAa,CAAC;;;GAG/C,CAAC;AACJ;AAEA,CAAC;EACC,IAAI,OAAOnC,MAAM,KAAK,WAAW,EAAE;IACjCA,MAAM,CAAC4B,gBAAgB,CAAC,kBAAkB,EAAE;MAC1Cb,QAAQ,CAACa,gBAAgB,CAAC,SAAS,EAAE,UAAA/G,CAAC;QACpCuH,0BAA0B,CAACvH,CAAC,CAAC+B,GAAG,CAAC;OAClC,CAAC;MAEFmE,QAAQ,CAACa,gBAAgB,CAAC,OAAO,EAAE,UAAA/G,CAAC;QAClCwH,8BAA8B,CAACxH,CAAC,CAAC+B,GAAG,CAAC;OACtC,CAAC;KACH,CAAC;;AAEN,CAAC,GAAG;;;;"}
1
+ {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/HotkeysProvider.tsx","../src/deepEqual.ts","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/isHotkeyPressed.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['ctrl', 'shift', 'alt', 'meta', 'mod']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n up: 'arrowup',\n right: 'arrowright',\n down: 'arrowdown',\n '1': 'digit1',\n '2': 'digit2',\n '3': 'digit3',\n '4': 'digit4',\n '5': 'digit5',\n '6': 'digit6',\n '7': 'digit7',\n '8': 'digit8',\n '9': 'digit9',\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 => k.trim())\n .map(k => mappedKeys[k] || k)\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl'),\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 { FormTags, Hotkey, Scopes, Trigger } from './types'\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, pressedDownKeys: Set<string>): boolean => {\n const { alt, ctrl, meta, mod, shift, keys } = hotkey\n const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKeyUppercase, code } = e\n\n const keyCode = code.toLowerCase().replace('key', '')\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 && keyCode !== 'meta') {\n return false\n }\n\n if (ctrlKey !== ctrl && 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 keys.every(key => pressedDownKeys.has(key))\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","import { Hotkey } from './types'\nimport { createContext, ReactNode, useMemo, useState, useContext } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\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 isAllActive = useMemo(() => internalActiveScopes.includes('*'), [internalActiveScopes])\n\n const enableScope = (scope: string) => {\n if (isAllActive) {\n setInternalActiveScopes([scope])\n } else {\n setInternalActiveScopes(Array.from(new Set([...internalActiveScopes, scope])))\n }\n }\n\n const disableScope = (scope: string) => {\n const scopes = internalActiveScopes.filter(s => s !== scope)\n\n if (scopes.length === 0) {\n setInternalActiveScopes(['*'])\n } else {\n setInternalActiveScopes(scopes)\n }\n }\n\n const toggleScope = (scope: string) => {\n if (internalActiveScopes.includes(scope)) {\n disableScope(scope)\n } else {\n enableScope(scope)\n }\n }\n\n const addBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys([...boundHotkeys, hotkey])\n }\n\n const removeBoundHotkey = (hotkey: Hotkey) => {\n setBoundHotkeys(boundHotkeys.filter(h => h.keys !== hotkey.keys))\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","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 { 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 { 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'\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\nconst pressedDownKeys = new Set<string>()\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\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 WONT 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, pressedDownKeys) || hotkey.keys?.includes('*')) {\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n cb(e, hotkey)\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 pressedDownKeys.add(event.key.toLowerCase())\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 if (event.key.toLowerCase() !== 'meta') {\n pressedDownKeys.delete(event.key.toLowerCase())\n } else {\n // On macOS pressing down the meta key prevents triggering the keyup event for any other key https://stackoverflow.com/a/57153300/735226.\n pressedDownKeys.clear()\n }\n\n if (memoisedOptions?.keyup) {\n listener(event)\n }\n }\n\n // @ts-ignore\n (ref.current || document).addEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 || document).removeEventListener('keyup', handleKeyUp);\n // @ts-ignore\n (ref.current || 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 { Hotkey } from './types'\nimport { parseHotkey } from './parseHotkeys'\nimport deepEqual from './deepEqual'\n\nconst currentlyPressedKeys: Set<Hotkey> = new Set<Hotkey>()\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) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (deepEqual(parsedHotkey, pressedHotkey)) {\n return true\n }\n }\n })\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach(hotkey => currentlyPressedKeys.add(parseHotkey(hotkey)))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n hotkeyArray.forEach((hotkey) => {\n const parsedHotkey = parseHotkey(hotkey)\n\n for (const pressedHotkey of currentlyPressedKeys) {\n if (pressedHotkey.keys?.every((key) => parsedHotkey.keys?.includes(key))) {\n currentlyPressedKeys.delete(pressedHotkey)\n }\n }\n })\n}\n\n(() => {\n if (typeof window !== 'undefined') {\n window.addEventListener('DOMContentLoaded', () => {\n document.addEventListener('keydown', e => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(e.key)\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(e.key)\n })\n })\n }\n})()\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","up","right","down","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","trim","modifiers","alt","includes","ctrl","shift","meta","mod","singleCharKeys","filter","maybePreventDefault","e","preventDefault","isHotkeyEnabled","enabled","undefined","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Array","Boolean","some","tag","toLowerCase","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","pressedDownKeys","altKey","ctrlKey","metaKey","shiftKey","pressedKeyUppercase","key","code","keyCode","replace","pressedKey","every","has","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","isAllActive","useMemo","from","Set","s","addBoundHotkey","removeBoundHotkey","h","deepEqual","x","y","Object","reduce","isEqual","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","window","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","_options","_deps","cb","useCallback","memoisedOptions","proxy","listener","enableOnFormTags","document","activeElement","contains","isContentEditable","enableOnContentEditable","forEach","handleKeyDown","event","add","keydown","keyup","handleKeyUp","clear","addEventListener","removeEventListener","currentlyPressedKeys","isHotkeyPressed","hotkeyArray","isArray","parsedHotkey","pressedHotkey","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-hotkeys-hook",
3
- "version": "4.0.4-5",
3
+ "version": "4.0.5",
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",
@@ -43,7 +43,7 @@
43
43
  "trailingComma": "es5"
44
44
  },
45
45
  "devDependencies": {
46
- "@babel/core": "7.20.2",
46
+ "@babel/core": "7.20.5",
47
47
  "@babel/plugin-proposal-class-properties": "7.18.6",
48
48
  "@babel/plugin-transform-react-jsx": "7.19.0",
49
49
  "@babel/preset-env": "7.20.2",
@@ -53,19 +53,19 @@
53
53
  "@testing-library/react": "13.3.0",
54
54
  "@testing-library/react-hooks": "8.0.1",
55
55
  "@testing-library/user-event": "14.4.3",
56
- "@types/jest": "29.2.2",
57
- "@types/react": "18.0.15",
58
- "@types/react-dom": "18.0.6",
56
+ "@types/jest": "29.2.4",
57
+ "@types/react": "18.0.26",
58
+ "@types/react-dom": "18.0.9",
59
59
  "eslint-plugin-prettier": "4.2.1",
60
- "jest": "29.2.2",
61
- "jest-environment-jsdom": "29.2.2",
62
- "prettier": "2.7.1",
60
+ "jest": "29.3.1",
61
+ "jest-environment-jsdom": "29.3.1",
62
+ "prettier": "2.8.1",
63
63
  "react": "18.2.0",
64
64
  "react-dom": "18.2.0",
65
65
  "react-test-renderer": "18.2.0",
66
66
  "tsdx": "0.14.1",
67
67
  "tslib": "2.4.0",
68
- "typescript": "4.7.4"
68
+ "typescript": "4.9.4"
69
69
  },
70
70
  "peerDependencies": {
71
71
  "react": ">=16.8.1",
@@ -42,10 +42,20 @@ export function removeFromCurrentlyPressedKeys(key: string | string[]): void {
42
42
  if (typeof window !== 'undefined') {
43
43
  window.addEventListener('DOMContentLoaded', () => {
44
44
  document.addEventListener('keydown', e => {
45
+ if (e.key === undefined) {
46
+ // Synthetic event (e.g., Chrome autofill). Ignore.
47
+ return
48
+ }
49
+
45
50
  pushToCurrentlyPressedKeys(e.key)
46
51
  })
47
52
 
48
53
  document.addEventListener('keyup', e => {
54
+ if (e.key === undefined) {
55
+ // Synthetic event (e.g., Chrome autofill). Ignore.
56
+ return
57
+ }
58
+
49
59
  removeFromCurrentlyPressedKeys(e.key)
50
60
  })
51
61
  })
@@ -9,6 +9,15 @@ const mappedKeys: Record<string, string> = {
9
9
  up: 'arrowup',
10
10
  right: 'arrowright',
11
11
  down: 'arrowdown',
12
+ '1': 'digit1',
13
+ '2': 'digit2',
14
+ '3': 'digit3',
15
+ '4': 'digit4',
16
+ '5': 'digit5',
17
+ '6': 'digit6',
18
+ '7': 'digit7',
19
+ '8': 'digit8',
20
+ '9': 'digit9',
12
21
  }
13
22
 
14
23
  export function parseKeysHookInput(keys: Keys, splitKey: string = ','): string[] {
package/src/useHotkeys.ts CHANGED
@@ -21,6 +21,8 @@ const stopPropagation = (e: KeyboardEvent): void => {
21
21
 
22
22
  const useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect
23
23
 
24
+ const pressedDownKeys = new Set<string>()
25
+
24
26
  export default function useHotkeys<T extends HTMLElement>(
25
27
  keys: Keys,
26
28
  callback: HotkeyCallback,
@@ -28,7 +30,6 @@ export default function useHotkeys<T extends HTMLElement>(
28
30
  dependencies?: OptionsOrDependencyArray,
29
31
  ) {
30
32
  const ref = useRef<RefType<T>>(null)
31
- const { current: pressedDownKeys } = useRef<Set<string>>(new Set())
32
33
 
33
34
  const _options: Options | undefined = !(options instanceof Array) ? (options as Options) : !(dependencies instanceof Array) ? (dependencies as Options) : undefined
34
35
  const _deps: DependencyList = options instanceof Array ? options : dependencies instanceof Array ? dependencies : []
@@ -51,7 +52,6 @@ export default function useHotkeys<T extends HTMLElement>(
51
52
 
52
53
  // 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
53
54
  // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WONT TRIGGER THE HOTKEY.
54
-
55
55
  if (ref.current !== null && document.activeElement !== ref.current && !ref.current.contains(document.activeElement)) {
56
56
  stopPropagation(e)
57
57
 
@@ -80,6 +80,11 @@ export default function useHotkeys<T extends HTMLElement>(
80
80
  }
81
81
 
82
82
  const handleKeyDown = (event: KeyboardEvent) => {
83
+ if (event.key === undefined) {
84
+ // Synthetic event (e.g., Chrome autofill). Ignore.
85
+ return
86
+ }
87
+
83
88
  pressedDownKeys.add(event.key.toLowerCase())
84
89
 
85
90
  if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {
@@ -88,6 +93,11 @@ export default function useHotkeys<T extends HTMLElement>(
88
93
  }
89
94
 
90
95
  const handleKeyUp = (event: KeyboardEvent) => {
96
+ if (event.key === undefined) {
97
+ // Synthetic event (e.g., Chrome autofill). Ignore.
98
+ return
99
+ }
100
+
91
101
  if (event.key.toLowerCase() !== 'meta') {
92
102
  pressedDownKeys.delete(event.key.toLowerCase())
93
103
  } else {