react-hotkeys-hook 4.3.7 → 4.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { Hotkey, Keys } from './types';
1
+ import { Hotkey } from './types';
2
2
  export declare function mapKey(key: string): string;
3
3
  export declare function isHotkeyModifier(key: string): boolean;
4
- export declare function parseKeysHookInput(keys: Keys, splitKey?: string): string[];
4
+ export declare function parseKeysHookInput(keys: string, splitKey?: string): string[];
5
5
  export declare function parseHotkey(hotkey: string, combinationKey?: string): Hotkey;
@@ -50,10 +50,7 @@ function parseKeysHookInput(keys, splitKey) {
50
50
  if (splitKey === void 0) {
51
51
  splitKey = ',';
52
52
  }
53
- if (typeof keys === 'string') {
54
- return keys.split(splitKey);
55
- }
56
- return keys;
53
+ return keys.split(splitKey);
57
54
  }
58
55
  function parseHotkey(hotkey, combinationKey) {
59
56
  if (combinationKey === void 0) {
@@ -369,6 +366,7 @@ function useHotkeys(keys, callback, options, dependencies) {
369
366
  var ref = react.useRef(null);
370
367
  var hasTriggeredRef = react.useRef(false);
371
368
  var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
369
+ var _keys = keys instanceof Array ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;
372
370
  var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;
373
371
  var memoisedCB = react.useCallback(callback, _deps != null ? _deps : []);
374
372
  var cbRef = react.useRef(memoisedCB);
@@ -402,7 +400,7 @@ function useHotkeys(keys, callback, options, dependencies) {
402
400
  if ((_e$target = e.target) != null && _e$target.isContentEditable && !(memoisedOptions != null && memoisedOptions.enableOnContentEditable)) {
403
401
  return;
404
402
  }
405
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
403
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
406
404
  var _hotkey$keys;
407
405
  var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);
408
406
  if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) {
@@ -449,7 +447,7 @@ function useHotkeys(keys, callback, options, dependencies) {
449
447
  // @ts-ignore
450
448
  domNode.addEventListener('keydown', handleKeyDown);
451
449
  if (proxy) {
452
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
450
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
453
451
  return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey));
454
452
  });
455
453
  }
@@ -459,12 +457,12 @@ function useHotkeys(keys, callback, options, dependencies) {
459
457
  // @ts-ignore
460
458
  domNode.removeEventListener('keydown', handleKeyDown);
461
459
  if (proxy) {
462
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
460
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
463
461
  return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey));
464
462
  });
465
463
  }
466
464
  };
467
- }, [keys, memoisedOptions, enabledScopes]);
465
+ }, [_keys, memoisedOptions, enabledScopes]);
468
466
  return ref;
469
467
  }
470
468
 
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","memoisedCB","cbRef","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey: string = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","`":"backquote","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",OSLeft:"meta",OSRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(r[e]||e).trim().toLowerCase().replace(/key|digit|numpad|arrow/,"")}function u(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 i(e)}));return n({},{alt:r.includes("alt"),ctrl:r.includes("ctrl")||r.includes("control"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!o.includes(e)}))})}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&s([i(e.key),i(e.code)])})),document.addEventListener("keyup",(function(e){void 0!==e.key&&d([i(e.key),i(e.code)])}))),"undefined"!=typeof window&&window.addEventListener("blur",(function(){a.clear()}));var a=new Set;function l(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function s(e){var t=Array.isArray(e)?e:[e];a.has("meta")&&a.forEach((function(e){return!function(e){return o.includes(e)}(e)&&a.delete(e.toLowerCase())})),t.forEach((function(e){return a.add(e.toLowerCase())}))}function d(e){var t=Array.isArray(e)?e:[e];"meta"===e?a.clear():t.forEach((function(e){return a.delete(e.toLowerCase())}))}function f(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return t instanceof Array?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&!0===t)}var v=e.createContext(void 0);function y(e){return t.jsx(v.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function p(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,o){return n&&p(e[o],t[o])}),!0):e===t}var k=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),m=function(){return e.useContext(k)},h=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},b="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=void 0===o?["*"]:o,i=n.children,u=e.useState((null==r?void 0:r.length)>0?r:["*"]),c=u[0],a=u[1],l=e.useState([]),s=l[0],d=l[1],f=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),v=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),m=e.useCallback((function(e){a((function(t){return t.includes(e)?0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),h=e.useCallback((function(e){d((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){d((function(t){return t.filter((function(t){return!p(t,e)}))}))}),[]);return t.jsx(k.Provider,{value:{enabledScopes:c,hotkeys:s,enableScope:f,disableScope:v,toggleScope:m},children:t.jsx(y,{addHotkey:h,removeHotkey:b,children:i})})},exports.isHotkeyPressed=l,exports.useHotkeys=function(t,n,o,r){var a=e.useRef(null),y=e.useRef(!1),k=o instanceof Array?r instanceof Array?void 0:r:o,w=o instanceof Array?o:r instanceof Array?r:void 0,g=e.useCallback(n,null!=w?w:[]),C=e.useRef(g);C.current=w?g:n;var L=function(t){var n=e.useRef(void 0);return p(n.current,t)||(n.current=t),n.current}(k),S=m().enabledScopes,E=e.useContext(v);return b((function(){if(!1!==(null==L?void 0:L.enabled)&&(n=null==L?void 0:L.scopes,0===(e=S).length&&n?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),1):!n||e.some((function(e){return n.includes(e)}))||e.includes("*"))){var e,n,o=function(e,n){var o;void 0===n&&(n=!1),(!f(e,["input","textarea","select"])||f(e,null==L?void 0:L.enableOnFormTags))&&(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(o=e.target)||!o.isContentEditable||null!=L&&L.enableOnContentEditable)&&u(t,null==L?void 0:L.splitKey).forEach((function(t){var o,r=c(t,null==L?void 0:L.combinationKey);if(function(e,t,n){void 0===n&&(n=!1);var o=t.alt,r=t.meta,u=t.mod,c=t.shift,a=t.ctrl,s=t.keys,d=e.key,f=e.ctrlKey,v=e.metaKey,y=e.shiftKey,p=e.altKey,k=i(e.code),m=d.toLowerCase();if(!n){if(o===!p&&"alt"!==m)return!1;if(c===!y&&"shift"!==m)return!1;if(u){if(!v&&!f)return!1}else{if(r===!v&&"meta"!==m&&"os"!==m)return!1;if(a===!f&&"ctrl"!==m&&"control"!==m)return!1}}return!(!s||1!==s.length||!s.includes(m)&&!s.includes(k))||(s?l(s):!s)}(e,r,null==L?void 0:L.ignoreModifiers)||null!=(o=r.keys)&&o.includes("*")){if(n&&y.current)return;if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==L?void 0:L.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==L?void 0:L.enabled))return void h(e);C.current(e,r),n||(y.current=!0)}})):h(e))},r=function(e){void 0!==e.key&&(s(i(e.code)),(void 0===(null==L?void 0:L.keydown)&&!0!==(null==L?void 0:L.keyup)||null!=L&&L.keydown)&&o(e))},v=function(e){void 0!==e.key&&(d(i(e.code)),y.current=!1,null!=L&&L.keyup&&o(e,!0))},p=a.current||(null==k?void 0:k.document)||document;return p.addEventListener("keyup",v),p.addEventListener("keydown",r),E&&u(t,null==L?void 0:L.splitKey).forEach((function(e){return E.addHotkey(c(e,null==L?void 0:L.combinationKey))})),function(){p.removeEventListener("keyup",v),p.removeEventListener("keydown",r),E&&u(t,null==L?void 0:L.splitKey).forEach((function(e){return E.removeHotkey(c(e,null==L?void 0:L.combinationKey))}))}}}),[t,L,S]),a},exports.useHotkeysContext=m,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),u=r[0],c=r[1],a=e.useCallback((function(e){void 0!==e.key&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(i(e.code)),n})))}),[]),l=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",a),c(!1))}),[a]);return[n,{start:e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(l(),document.addEventListener("keydown",a),c(!0))}),[a,l]),stop:l,isRecording:u}]};
1
+ "use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl"],r={esc:"escape",return:"enter",".":"period",",":"comma","-":"slash"," ":"space","`":"backquote","#":"backslash","+":"bracketright",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",OSLeft:"meta",OSRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(r[e]||e).trim().toLowerCase().replace(/key|digit|numpad|arrow/,"")}function u(e,t){return void 0===t&&(t=","),e.split(t)}function c(e,t){void 0===t&&(t="+");var r=e.toLocaleLowerCase().split(t).map((function(e){return i(e)}));return n({},{alt:r.includes("alt"),ctrl:r.includes("ctrl")||r.includes("control"),shift:r.includes("shift"),meta:r.includes("meta"),mod:r.includes("mod")},{keys:r.filter((function(e){return!o.includes(e)}))})}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.key&&s([i(e.key),i(e.code)])})),document.addEventListener("keyup",(function(e){void 0!==e.key&&d([i(e.key),i(e.code)])}))),"undefined"!=typeof window&&window.addEventListener("blur",(function(){a.clear()}));var a=new Set;function l(e,t){return void 0===t&&(t=","),(Array.isArray(e)?e:e.split(t)).every((function(e){return a.has(e.trim().toLowerCase())}))}function s(e){var t=Array.isArray(e)?e:[e];a.has("meta")&&a.forEach((function(e){return!function(e){return o.includes(e)}(e)&&a.delete(e.toLowerCase())})),t.forEach((function(e){return a.add(e.toLowerCase())}))}function d(e){var t=Array.isArray(e)?e:[e];"meta"===e?a.clear():t.forEach((function(e){return a.delete(e.toLowerCase())}))}function f(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return t instanceof Array?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&!0===t)}var v=e.createContext(void 0);function y(e){return t.jsx(v.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function p(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,o){return n&&p(e[o],t[o])}),!0):e===t}var k=e.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),m=function(){return e.useContext(k)},h=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},b="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=void 0===o?["*"]:o,i=n.children,u=e.useState((null==r?void 0:r.length)>0?r:["*"]),c=u[0],a=u[1],l=e.useState([]),s=l[0],d=l[1],f=e.useCallback((function(e){a((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),v=e.useCallback((function(e){a((function(t){return 0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e}))}))}),[]),m=e.useCallback((function(e){a((function(t){return t.includes(e)?0===t.filter((function(t){return t!==e})).length?["*"]:t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),h=e.useCallback((function(e){d((function(t){return[].concat(t,[e])}))}),[]),b=e.useCallback((function(e){d((function(t){return t.filter((function(t){return!p(t,e)}))}))}),[]);return t.jsx(k.Provider,{value:{enabledScopes:c,hotkeys:s,enableScope:f,disableScope:v,toggleScope:m},children:t.jsx(y,{addHotkey:h,removeHotkey:b,children:i})})},exports.isHotkeyPressed=l,exports.useHotkeys=function(t,n,o,r){var a=e.useRef(null),y=e.useRef(!1),k=o instanceof Array?r instanceof Array?void 0:r:o,w=t instanceof Array?t.join(null==k?void 0:k.splitKey):t,g=o instanceof Array?o:r instanceof Array?r:void 0,C=e.useCallback(n,null!=g?g:[]),L=e.useRef(C);L.current=g?C:n;var S=function(t){var n=e.useRef(void 0);return p(n.current,t)||(n.current=t),n.current}(k),E=m().enabledScopes,A=e.useContext(v);return b((function(){if(!1!==(null==S?void 0:S.enabled)&&(t=null==S?void 0:S.scopes,0===(e=E).length&&t?(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):!t||e.some((function(e){return t.includes(e)}))||e.includes("*"))){var e,t,n=function(e,t){var n;void 0===t&&(t=!1),(!f(e,["input","textarea","select"])||f(e,null==S?void 0:S.enableOnFormTags))&&(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(n=e.target)||!n.isContentEditable||null!=S&&S.enableOnContentEditable)&&u(w,null==S?void 0:S.splitKey).forEach((function(n){var o,r=c(n,null==S?void 0:S.combinationKey);if(function(e,t,n){void 0===n&&(n=!1);var o=t.alt,r=t.meta,u=t.mod,c=t.shift,a=t.ctrl,s=t.keys,d=e.key,f=e.ctrlKey,v=e.metaKey,y=e.shiftKey,p=e.altKey,k=i(e.code),m=d.toLowerCase();if(!n){if(o===!p&&"alt"!==m)return!1;if(c===!y&&"shift"!==m)return!1;if(u){if(!v&&!f)return!1}else{if(r===!v&&"meta"!==m&&"os"!==m)return!1;if(a===!f&&"ctrl"!==m&&"control"!==m)return!1}}return!(!s||1!==s.length||!s.includes(m)&&!s.includes(k))||(s?l(s):!s)}(e,r,null==S?void 0:S.ignoreModifiers)||null!=(o=r.keys)&&o.includes("*")){if(t&&y.current)return;if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==S?void 0:S.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==S?void 0:S.enabled))return void h(e);L.current(e,r),t||(y.current=!0)}})):h(e))},o=function(e){void 0!==e.key&&(s(i(e.code)),(void 0===(null==S?void 0:S.keydown)&&!0!==(null==S?void 0:S.keyup)||null!=S&&S.keydown)&&n(e))},r=function(e){void 0!==e.key&&(d(i(e.code)),y.current=!1,null!=S&&S.keyup&&n(e,!0))},v=a.current||(null==k?void 0:k.document)||document;return v.addEventListener("keyup",r),v.addEventListener("keydown",o),A&&u(w,null==S?void 0:S.splitKey).forEach((function(e){return A.addHotkey(c(e,null==S?void 0:S.combinationKey))})),function(){v.removeEventListener("keyup",r),v.removeEventListener("keydown",o),A&&u(w,null==S?void 0:S.splitKey).forEach((function(e){return A.removeHotkey(c(e,null==S?void 0:S.combinationKey))}))}}}),[w,S,E]),a},exports.useHotkeysContext=m,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),u=r[0],c=r[1],a=e.useCallback((function(e){void 0!==e.key&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(i(e.code)),n})))}),[]),l=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",a),c(!1))}),[a]);return[n,{start:e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(l(),document.addEventListener("keydown",a),c(!0))}),[a,l]),stop:l,isRecording:u}]};
2
2
  //# sourceMappingURL=react-hotkeys-hook.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","`","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","Array","isArray","every","has","hotkeyArray","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_deps","memoisedCB","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","isKeyUp","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.cjs.production.min.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useHotkeys.ts","../src/useDeepEqualMemo.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey: string = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return",".",",","-"," ","`","#","+","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","Array","isArray","every","has","hotkeyArray","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","BoundHotkeysProxyProvider","createContext","BoundHotkeysProxyProviderProvider","_jsx","Provider","value","addHotkey","removeHotkey","children","deepEqual","x","y","Object","length","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","useContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","scope","prev","from","s","addBoundHotkey","removeBoundHotkey","h","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","scopes","activeScopes","console","warn","listener","isKeyUp","enableOnFormTags","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","isHotkeyMatchingKeyboardEvent","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
@@ -48,10 +48,7 @@ function parseKeysHookInput(keys, splitKey) {
48
48
  if (splitKey === void 0) {
49
49
  splitKey = ',';
50
50
  }
51
- if (typeof keys === 'string') {
52
- return keys.split(splitKey);
53
- }
54
- return keys;
51
+ return keys.split(splitKey);
55
52
  }
56
53
  function parseHotkey(hotkey, combinationKey) {
57
54
  if (combinationKey === void 0) {
@@ -367,6 +364,7 @@ function useHotkeys(keys, callback, options, dependencies) {
367
364
  var ref = useRef(null);
368
365
  var hasTriggeredRef = useRef(false);
369
366
  var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
367
+ var _keys = keys instanceof Array ? keys.join(_options == null ? void 0 : _options.splitKey) : keys;
370
368
  var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;
371
369
  var memoisedCB = useCallback(callback, _deps != null ? _deps : []);
372
370
  var cbRef = useRef(memoisedCB);
@@ -400,7 +398,7 @@ function useHotkeys(keys, callback, options, dependencies) {
400
398
  if ((_e$target = e.target) != null && _e$target.isContentEditable && !(memoisedOptions != null && memoisedOptions.enableOnContentEditable)) {
401
399
  return;
402
400
  }
403
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
401
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
404
402
  var _hotkey$keys;
405
403
  var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey);
406
404
  if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) {
@@ -447,7 +445,7 @@ function useHotkeys(keys, callback, options, dependencies) {
447
445
  // @ts-ignore
448
446
  domNode.addEventListener('keydown', handleKeyDown);
449
447
  if (proxy) {
450
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
448
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
451
449
  return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey));
452
450
  });
453
451
  }
@@ -457,12 +455,12 @@ function useHotkeys(keys, callback, options, dependencies) {
457
455
  // @ts-ignore
458
456
  domNode.removeEventListener('keydown', handleKeyDown);
459
457
  if (proxy) {
460
- parseKeysHookInput(keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
458
+ parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.splitKey).forEach(function (key) {
461
459
  return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.combinationKey));
462
460
  });
463
461
  }
464
462
  };
465
- }, [keys, memoisedOptions, enabledScopes]);
463
+ }, [_keys, memoisedOptions, enabledScopes]);
466
464
  return ref;
467
465
  }
468
466
 
@@ -1 +1 @@
1
- {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: Keys, splitKey = ','): string[] {\n if (typeof keys === 'string') {\n return keys.split(splitKey)\n }\n\n return keys\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_deps","memoisedCB","cbRef","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
1
+ {"version":3,"file":"react-hotkeys-hook.esm.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers, Keys } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey: string = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\nexport function isHotkeyPressed(key: string | string[], splitKey = ','): boolean {\n const hotkeyArray = Array.isArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag({ target }: KeyboardEvent, enabledOnTags: FormTags[] | boolean = false): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (enabledOnTags instanceof Array) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && 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 (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.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 ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ enabledScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isHotkeyPressed","hotkeyArray","Array","isArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","useState","internalActiveScopes","setInternalActiveScopes","boundHotkeys","setBoundHotkeys","useCallback","prev","from","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","value","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","proxy","listener","isKeyUp","enableOnFormTags","activeElement","contains","isContentEditable","enableOnContentEditable","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-hotkeys-hook",
3
3
  "description": "React hook for handling keyboard shortcuts",
4
- "version": "4.3.7",
4
+ "version": "4.3.8",
5
5
  "repository": "https://JohannesKlauss@github.com/JohannesKlauss/react-keymap-hook.git",
6
6
  "homepage": "https://johannesklauss.github.io/react-hotkeys-hook/",
7
7
  "author": "Johannes Klauss",
@@ -88,13 +88,13 @@
88
88
  "@types/jest": "29.4.0",
89
89
  "@types/react": "18.0.28",
90
90
  "@types/react-dom": "18.0.11",
91
- "@typescript-eslint/eslint-plugin": "5.53.0",
92
- "@typescript-eslint/parser": "5.53.0",
91
+ "@typescript-eslint/eslint-plugin": "5.54.1",
92
+ "@typescript-eslint/parser": "5.54.1",
93
93
  "eslint": "^8.34.0",
94
94
  "eslint-plugin-prettier": "4.2.1",
95
95
  "eslint-plugin-react": "^7.32.2",
96
- "jest": "29.4.3",
97
- "jest-environment-jsdom": "29.4.3",
96
+ "jest": "29.5.0",
97
+ "jest-environment-jsdom": "29.5.0",
98
98
  "prettier": "2.8.4",
99
99
  "react": "18.2.0",
100
100
  "react-dom": "18.2.0",
@@ -35,12 +35,8 @@ export function isHotkeyModifier(key: string) {
35
35
  return reservedModifierKeywords.includes(key)
36
36
  }
37
37
 
38
- export function parseKeysHookInput(keys: Keys, splitKey = ','): string[] {
39
- if (typeof keys === 'string') {
40
- return keys.split(splitKey)
41
- }
42
-
43
- return keys
38
+ export function parseKeysHookInput(keys: string, splitKey: string = ','): string[] {
39
+ return keys.split(splitKey)
44
40
  }
45
41
 
46
42
  export function parseHotkey(hotkey: string, combinationKey = '+'): Hotkey {
package/src/useHotkeys.ts CHANGED
@@ -36,6 +36,7 @@ export default function useHotkeys<T extends HTMLElement>(
36
36
  : !(dependencies instanceof Array)
37
37
  ? (dependencies as Options)
38
38
  : undefined
39
+ const _keys: string = keys instanceof Array ? keys.join(_options?.splitKey) : keys
39
40
  const _deps: DependencyList | undefined =
40
41
  options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined
41
42
 
@@ -79,7 +80,7 @@ export default function useHotkeys<T extends HTMLElement>(
79
80
  return
80
81
  }
81
82
 
82
- parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) => {
83
+ parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {
83
84
  const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)
84
85
 
85
86
  if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {
@@ -141,7 +142,7 @@ export default function useHotkeys<T extends HTMLElement>(
141
142
  domNode.addEventListener('keydown', handleKeyDown)
142
143
 
143
144
  if (proxy) {
144
- parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>
145
+ parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>
145
146
  proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey))
146
147
  )
147
148
  }
@@ -153,12 +154,12 @@ export default function useHotkeys<T extends HTMLElement>(
153
154
  domNode.removeEventListener('keydown', handleKeyDown)
154
155
 
155
156
  if (proxy) {
156
- parseKeysHookInput(keys, memoisedOptions?.splitKey).forEach((key) =>
157
+ parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>
157
158
  proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey))
158
159
  )
159
160
  }
160
161
  }
161
- }, [keys, memoisedOptions, enabledScopes])
162
+ }, [_keys, memoisedOptions, enabledScopes])
162
163
 
163
164
  return ref
164
165
  }