{"version":3,"file":"hotkeys-js.umd.cjs","sources":["../src/utils.ts","../src/var.ts","../src/index.ts"],"sourcesContent":["const isff: boolean =\n  typeof navigator !== 'undefined'\n    ? navigator.userAgent.toLowerCase().indexOf('firefox') > 0\n    : false;\n\n/** Bind event */\nfunction addEvent(\n  object: HTMLElement | Document | Window,\n  event: string,\n  method: EventListenerOrEventListenerObject,\n  useCapture?: boolean\n): void {\n  if (object.addEventListener) {\n    object.addEventListener(event, method, useCapture);\n    // @ts-expect-error - attachEvent is only available on IE\n  } else if (object.attachEvent) {\n    // @ts-expect-error - attachEvent is only available on IE\n    object.attachEvent(`on${event}`, method);\n  }\n}\n\nfunction removeEvent(\n  object: HTMLElement | Document | Window | null,\n  event: string,\n  method: EventListenerOrEventListenerObject,\n  useCapture?: boolean\n): void {\n  if (!object) return;\n  if (object.removeEventListener) {\n    object.removeEventListener(event, method, useCapture);\n    // @ts-expect-error - removeEvent is only available on IE\n  } else if (object.detachEvent) {\n    // @ts-expect-error - detachEvent is only available on IE\n    object.detachEvent(`on${event}`, method);\n  }\n}\n\n/** Convert modifier keys to their corresponding key codes */\nfunction getMods(modifier: Record<string, number>, key: string[]): number[] {\n  const modsKeys = key.slice(0, key.length - 1);\n  const modsCodes: number[] = [];\n  for (let i = 0; i < modsKeys.length; i++) {\n    modsCodes.push(modifier[modsKeys[i].toLowerCase()]);\n  }\n  return modsCodes;\n}\n\n/** Process the input key string and convert it to an array */\nfunction getKeys(key: string | undefined): string[] {\n  if (typeof key !== 'string') key = '';\n  key = key.replace(/\\s/g, ''); // Match any whitespace character, including spaces, tabs, form feeds, etc.\n  const keys = key.split(','); // Allow multiple shortcuts separated by ','\n  let index = keys.lastIndexOf('');\n\n  // Shortcut may include ',' — special handling needed\n  for (; index >= 0; ) {\n    keys[index - 1] += ',';\n    keys.splice(index, 1);\n    index = keys.lastIndexOf('');\n  }\n\n  return keys;\n}\n\n/** Compare arrays of modifier keys */\nfunction compareArray(a1: number[], a2: number[]): boolean {\n  const arr1 = a1.length >= a2.length ? a1 : a2;\n  const arr2 = a1.length >= a2.length ? a2 : a1;\n  let isIndex = true;\n\n  for (let i = 0; i < arr1.length; i++) {\n    if (arr2.indexOf(arr1[i]) === -1) isIndex = false;\n  }\n  return isIndex;\n}\n\n/**\n * Get layout-independent key code from keyboard event\n * This makes hotkeys work regardless of keyboard layout (Russian, German, etc.)\n * Uses event.code (physical key) instead of keyCode (character) for letter keys\n */\nfunction getLayoutIndependentKeyCode(event: KeyboardEvent): number {\n  let key = event.keyCode || event.which || event.charCode;\n\n  // Convert physical key code (KeyA-KeyZ) to corresponding ASCII code (65-90)\n  // This makes 'ctrl+a' work on any keyboard layout\n  if (event.code && /^Key[A-Z]$/.test(event.code)) {\n    key = event.code.charCodeAt(3); // \"KeyA\"[3] = \"A\" -> 65\n  }\n\n  return key;\n}\n\nexport {\n  isff,\n  getMods,\n  getKeys,\n  addEvent,\n  removeEvent,\n  compareArray,\n  getLayoutIndependentKeyCode,\n};\n","import { HotkeysEvent } from './types';\nimport { isff } from './utils';\n\n// Special Keys\nconst _keyMap: Record<string, number> = {\n  backspace: 8,\n  '⌫': 8,\n  tab: 9,\n  clear: 12,\n  enter: 13,\n  '↩': 13,\n  return: 13,\n  esc: 27,\n  escape: 27,\n  space: 32,\n  left: 37,\n  up: 38,\n  right: 39,\n  down: 40,\n  /// https://w3c.github.io/uievents/#events-keyboard-key-location\n  arrowup: 38,\n  arrowdown: 40,\n  arrowleft: 37,\n  arrowright: 39,\n  del: 46,\n  delete: 46,\n  ins: 45,\n  insert: 45,\n  home: 36,\n  end: 35,\n  pageup: 33,\n  pagedown: 34,\n  capslock: 20,\n  num_0: 96,\n  num_1: 97,\n  num_2: 98,\n  num_3: 99,\n  num_4: 100,\n  num_5: 101,\n  num_6: 102,\n  num_7: 103,\n  num_8: 104,\n  num_9: 105,\n  num_multiply: 106,\n  num_add: 107,\n  num_enter: 108,\n  num_subtract: 109,\n  num_decimal: 110,\n  num_divide: 111,\n  '⇪': 20,\n  ',': 188,\n  '.': 190,\n  '/': 191,\n  '`': 192,\n  '-': isff ? 173 : 189,\n  '=': isff ? 61 : 187,\n  ';': isff ? 59 : 186,\n  '\\'': 222,\n  '{': 219,\n  '}': 221,\n  '[': 219,\n  ']': 221,\n  '\\\\': 220,\n};\n\n// Modifier Keys\nconst _modifier: Record<string, number> = {\n  // shiftKey\n  '⇧': 16,\n  shift: 16,\n  // altKey\n  '⌥': 18,\n  alt: 18,\n  option: 18,\n  // ctrlKey\n  '⌃': 17,\n  ctrl: 17,\n  control: 17,\n  // metaKey\n  '⌘': 91,\n  cmd: 91,\n  meta: 91,\n  command: 91,\n};\n\nconst modifierMap: Record<string | number, number | string> = {\n  16: 'shiftKey',\n  18: 'altKey',\n  17: 'ctrlKey',\n  91: 'metaKey',\n\n  shiftKey: 16,\n  ctrlKey: 17,\n  altKey: 18,\n  metaKey: 91,\n};\n\nconst _mods: Record<number, boolean> = {\n  16: false,\n  18: false,\n  17: false,\n  91: false,\n};\n\nconst _handlers: Record<string | number, HotkeysEvent[]> = {};\n\n// F1~F12 special key\nfor (let k = 1; k < 20; k++) {\n  _keyMap[`f${k}`] = 111 + k;\n}\n\nexport { _keyMap, _modifier, modifierMap, _mods, _handlers };\n","import {\n  KeyCodeInfo,\n  HotkeysEvent,\n  UnbindInfo,\n  HotkeysOptions,\n  KeyHandler,\n  HotkeysInterface,\n  SetScope,\n  GetScope,\n  GetPressedKeyCodes,\n  GetPressedKeyString,\n  GetAllKeyCodes,\n  Filter,\n  IsPressed,\n  DeleteScope,\n  Unbind,\n  HotkeysAPI,\n} from './types';\nimport { addEvent, removeEvent, getMods, getKeys, compareArray, getLayoutIndependentKeyCode } from './utils';\nimport { _keyMap, _modifier, modifierMap, _mods, _handlers } from './var';\n\n/** Record the pressed keys */\nlet _downKeys: number[] = [];\n/** Whether the window has already listened to the focus event */\nlet winListendFocus: { listener: EventListener; capture: boolean } | null =\n  null;\n/** Default hotkey scope */\nlet _scope: string = 'all';\n/** Map to record elements with bound events */\nconst elementEventMap = new Map<\n  HTMLElement | Document,\n  {\n    keydownListener: EventListener;\n    keyupListenr: EventListener;\n    capture: boolean;\n  }\n>();\n\n/** Return key code */\nconst code = (x: string): number =>\n  _keyMap[x.toLowerCase()] ||\n  _modifier[x.toLowerCase()] ||\n  x.toUpperCase().charCodeAt(0);\n\nconst getKey = (x: number): string | undefined =>\n  Object.keys(_keyMap).find((k) => _keyMap[k] === x);\nconst getModifier = (x: number): string | undefined =>\n  Object.keys(_modifier).find((k) => _modifier[k] === x);\n\n/** Set or get the current scope (defaults to 'all') */\nconst setScope: SetScope = (scope) => {\n  _scope = scope || 'all';\n};\n/** Get the current scope */\nconst getScope: GetScope = () => {\n  return _scope || 'all';\n};\n/** Get the key codes of the currently pressed keys */\nconst getPressedKeyCodes: GetPressedKeyCodes = () => {\n  return _downKeys.slice(0);\n};\n\nconst getPressedKeyString: GetPressedKeyString = () => {\n  return _downKeys.map(\n    (c) => getKey(c) || getModifier(c) || String.fromCharCode(c)\n  );\n};\n\nconst getAllKeyCodes: GetAllKeyCodes = () => {\n  const result: KeyCodeInfo[] = [];\n  Object.keys(_handlers).forEach((k) => {\n    _handlers[k].forEach(({ key, scope, mods, shortcut }) => {\n      result.push({\n        scope,\n        shortcut,\n        mods,\n        keys: key.split('+').map((v) => code(v)),\n      });\n    });\n  });\n  return result;\n};\n\n/** hotkey is effective only when filter return true */\nconst filter: Filter = (event) => {\n  const target = (event.target || event.srcElement) as HTMLElement;\n  const { tagName } = target;\n  let flag = true;\n  const isInput =\n    tagName === 'INPUT' &&\n    ![\n      'checkbox',\n      'radio',\n      'range',\n      'button',\n      'file',\n      'reset',\n      'submit',\n      'color',\n    ].includes((target as HTMLInputElement).type);\n  // ignore: isContentEditable === 'true', <input> and <textarea> when readOnly state is false, <select>\n  if (\n    target.isContentEditable ||\n    ((isInput || tagName === 'TEXTAREA' || tagName === 'SELECT') &&\n      !(target as HTMLInputElement | HTMLTextAreaElement).readOnly)\n  ) {\n    flag = false;\n  }\n  return flag;\n};\n\n/** Determine whether the pressed key matches a specific key, returns true or false */\nconst isPressed: IsPressed = (keyCode) => {\n  if (typeof keyCode === 'string') {\n    keyCode = code(keyCode); // Convert to key code\n  }\n  return _downKeys.indexOf(keyCode) !== -1;\n};\n\n/** Loop through and delete all handlers with the specified scope */\nconst deleteScope: DeleteScope = (scope, newScope) => {\n  let handlers: HotkeysEvent[];\n  let i: number;\n\n  // If no scope is specified, get the current scope\n  if (!scope) scope = getScope();\n\n  for (const key in _handlers) {\n    if (Object.prototype.hasOwnProperty.call(_handlers, key)) {\n      handlers = _handlers[key];\n      for (i = 0; i < handlers.length; ) {\n        if (handlers[i].scope === scope) {\n          const deleteItems = handlers.splice(i, 1);\n          deleteItems.forEach(({ element }) => removeKeyEvent(element));\n        } else {\n          i++;\n        }\n      }\n    }\n  }\n\n  // If the current scope has been deleted, reset the scope to 'all'\n  if (getScope() === scope) setScope(newScope || 'all');\n};\n\n/** Clear modifier keys */\nfunction clearModifier(event: KeyboardEvent): void {\n  let key = getLayoutIndependentKeyCode(event);\n\n  if (event.key && event.key.toLowerCase() === 'capslock') {\n    // Ensure that when capturing keystrokes in modern browsers,\n    // uppercase and lowercase letters (such as R and r) return the same key value.\n    // https://github.com/jaywcjlove/hotkeys-js/pull/514\n    // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\n    key = code(event.key);\n  }\n  const i = _downKeys.indexOf(key);\n\n  // Remove the pressed key from the list\n  if (i >= 0) {\n    _downKeys.splice(i, 1);\n  }\n  // Special handling for the command key: fix the issue where keyup only triggers once for command combos\n  if (event.key && event.key.toLowerCase() === 'meta') {\n    _downKeys.splice(0, _downKeys.length);\n  }\n\n  // Clear modifier keys: shiftKey, altKey, ctrlKey, (command || metaKey)\n  if (key === 93 || key === 224) key = 91;\n  if (key in _mods) {\n    _mods[key] = false;\n\n    // Reset the modifier key status to false\n    for (const k in _modifier)\n      if (_modifier[k] === key) (hotkeys as any)[k] = false;\n  }\n}\n\nconst unbind: Unbind = (\n  keysInfo?: string | UnbindInfo | UnbindInfo[],\n  ...args: any[]\n): void => {\n  // unbind(), unbind all keys\n  if (typeof keysInfo === 'undefined') {\n    Object.keys(_handlers).forEach((key) => {\n      if (Array.isArray(_handlers[key])) {\n        _handlers[key].forEach((info) => eachUnbind(info));\n      }\n      delete _handlers[key];\n    });\n    removeKeyEvent(null);\n  } else if (Array.isArray(keysInfo)) {\n    // support like : unbind([{key: 'ctrl+a', scope: 's1'}, {key: 'ctrl-a', scope: 's2', splitKey: '-'}])\n    keysInfo.forEach((info) => {\n      if (info.key) eachUnbind(info);\n    });\n  } else if (typeof keysInfo === 'object') {\n    // support like unbind({key: 'ctrl+a, ctrl+b', scope:'abc'})\n    if (keysInfo.key) eachUnbind(keysInfo);\n  } else if (typeof keysInfo === 'string') {\n    // support old method\n    let [scope, method] = args;\n    if (typeof scope === 'function') {\n      method = scope;\n      scope = '';\n    }\n    eachUnbind({\n      key: keysInfo,\n      scope,\n      method,\n      splitKey: '+',\n    });\n  }\n};\n\n/** Unbind hotkeys for a specific scope */\nconst eachUnbind = ({\n  key,\n  scope,\n  method,\n  splitKey = '+',\n}: UnbindInfo): void => {\n  const multipleKeys = getKeys(key);\n  multipleKeys.forEach((originKey) => {\n    const unbindKeys = originKey.split(splitKey);\n    const len = unbindKeys.length;\n    const lastKey = unbindKeys[len - 1];\n    const keyCode = lastKey === '*' ? '*' : code(lastKey);\n    if (!_handlers[keyCode]) return;\n    // If scope is not provided, get the current scope\n    if (!scope) scope = getScope();\n    const mods = len > 1 ? getMods(_modifier, unbindKeys) : [];\n    const unbindElements: (HTMLElement | Document)[] = [];\n    _handlers[keyCode] = _handlers[keyCode].filter((record) => {\n      // Check if the method matches; if method is provided, must be equal to unbind\n      const isMatchingMethod = method ? record.method === method : true;\n      const isUnbind =\n        isMatchingMethod &&\n        record.scope === scope &&\n        compareArray(record.mods, mods);\n      if (isUnbind) unbindElements.push(record.element);\n      return !isUnbind;\n    });\n    unbindElements.forEach((element) => removeKeyEvent(element));\n  });\n};\n\n/** Handle the callback function for the corresponding hotkey */\nfunction eventHandler(\n  event: KeyboardEvent,\n  handler: HotkeysEvent,\n  scope: string,\n  element: HTMLElement | Document\n): void {\n  if (handler.element !== element) {\n    return;\n  }\n  let modifiersMatch: boolean;\n\n  // Check if it is within the current scope\n  if (handler.scope === scope || handler.scope === 'all') {\n    // Check whether modifier keys match (returns true if they do)\n    modifiersMatch = handler.mods.length > 0;\n\n    for (const y in _mods) {\n      if (Object.prototype.hasOwnProperty.call(_mods, y)) {\n        if (\n          (!_mods[y] && handler.mods.indexOf(+y) > -1) ||\n          (_mods[y] && handler.mods.indexOf(+y) === -1)\n        ) {\n          modifiersMatch = false;\n        }\n      }\n    }\n\n    // Call the handler function; ignore if it's only a modifier key\n    if (\n      (handler.mods.length === 0 &&\n        !_mods[16] &&\n        !_mods[18] &&\n        !_mods[17] &&\n        !_mods[91]) ||\n      modifiersMatch ||\n      handler.shortcut === '*'\n    ) {\n      handler.keys = [];\n      handler.keys = handler.keys.concat(_downKeys);\n      if (handler.method(event, handler) === false) {\n        if (event.preventDefault) event.preventDefault();\n        else event.returnValue = false;\n        if (event.stopPropagation) event.stopPropagation();\n        if (event.cancelBubble) event.cancelBubble = true;\n      }\n    }\n  }\n}\n\n/** Handle the keydown event */\nfunction dispatch(\n  this: any,\n  event: KeyboardEvent,\n  element: HTMLElement | Document\n): void {\n  const asterisk = _handlers['*'];\n  let key = getLayoutIndependentKeyCode(event);\n\n  // Ensure that when capturing keystrokes in modern browsers,\n  // uppercase and lowercase letters (such as R and r) return the same key value.\n  // https://github.com/jaywcjlove/hotkeys-js/pull/514\n  // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\n  // CapsLock key\n  // There's an issue where `keydown` and `keyup` events are not triggered after CapsLock is enabled to activate uppercase.\n  if (event.key && event.key.toLowerCase() === 'capslock') {\n    return;\n  }\n  // Form control filter: by default, shortcut keys are not triggered in form elements\n  const filterFn = (hotkeys as any).filter || filter;\n  if (!filterFn.call(this, event)) return;\n\n  // In Gecko (Firefox), the command key code is 224; unify it with WebKit (Chrome)\n  // In WebKit, left and right command keys have different codes\n  if (key === 93 || key === 224) key = 91;\n\n  /**\n   * Collect bound keys\n   * If an Input Method Editor is processing key input and the event is keydown, return 229.\n   * https://stackoverflow.com/questions/25043934/is-it-ok-to-ignore-keydown-events-with-keycode-229\n   * http://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html\n   */\n  if (_downKeys.indexOf(key) === -1 && key !== 229) _downKeys.push(key);\n  /**\n   * Jest test cases are required.\n   * ===============================\n   */\n  ['metaKey', 'ctrlKey', 'altKey', 'shiftKey'].forEach((keyName) => {\n    const keyNum = (modifierMap as any)[keyName] as number;\n    if ((event as any)[keyName] && _downKeys.indexOf(keyNum) === -1) {\n      _downKeys.push(keyNum);\n    } else if (!(event as any)[keyName] && _downKeys.indexOf(keyNum) > -1) {\n      _downKeys.splice(_downKeys.indexOf(keyNum), 1);\n    } else if (keyName === 'metaKey' && (event as any)[keyName]) {\n      // If the command key is pressed, clear all non-modifier keys except the current event key.\n      // This is because keyup for non-modifier keys will NEVER be triggered when command is pressed.\n      // This is a known browser limitation.\n      _downKeys = _downKeys.filter((k) => k in modifierMap || k === key);\n    }\n  });\n  /**\n   * -------------------------------\n   */\n  if (key in _mods) {\n    _mods[key] = true;\n    // Register special modifier keys to the `hotkeys` object\n    for (const k in _modifier) {\n      if (Object.prototype.hasOwnProperty.call(_modifier, k)) {\n        const eventKey = (modifierMap as any)[_modifier[k]] as string;\n        (hotkeys as any)[k] = (event as any)[eventKey];\n      }\n    }\n\n    if (!asterisk) return;\n  }\n\n  // Bind the modifier keys in modifierMap to the event\n  for (const e in _mods) {\n    if (Object.prototype.hasOwnProperty.call(_mods, e)) {\n      _mods[e] = (event as any)[(modifierMap as any)[e]];\n    }\n  }\n  /**\n   * https://github.com/jaywcjlove/hotkeys/pull/129\n   * This solves the issue in Firefox on Windows where hotkeys corresponding to special characters would not trigger.\n   * An example of this is ctrl+alt+m on a Swedish keyboard which is used to type μ.\n   * Browser support: https://caniuse.com/#feat=keyboardevent-getmodifierstate\n   */\n  if (\n    event.getModifierState &&\n    !(event.altKey && !event.ctrlKey) &&\n    event.getModifierState('AltGraph')\n  ) {\n    if (_downKeys.indexOf(17) === -1) {\n      _downKeys.push(17);\n    }\n\n    if (_downKeys.indexOf(18) === -1) {\n      _downKeys.push(18);\n    }\n\n    _mods[17] = true;\n    _mods[18] = true;\n  }\n\n  // Get the current scope (defaults to 'all')\n  const scope = getScope();\n  // Handle any hotkeys registered as '*'\n  if (asterisk) {\n    for (let i = 0; i < asterisk.length; i++) {\n      if (\n        asterisk[i].scope === scope &&\n        ((event.type === 'keydown' && asterisk[i].keydown) ||\n          (event.type === 'keyup' && asterisk[i].keyup))\n      ) {\n        eventHandler(event, asterisk[i], scope, element);\n      }\n    }\n  }\n  // If the key is not registered, return\n  if (!(key in _handlers)) return;\n\n  const handlerKey = _handlers[key];\n  const keyLen = handlerKey.length;\n  for (let i = 0; i < keyLen; i++) {\n    if (\n      (event.type === 'keydown' && handlerKey[i].keydown) ||\n      (event.type === 'keyup' && handlerKey[i].keyup)\n    ) {\n      if (handlerKey[i].key) {\n        const record = handlerKey[i];\n        const { splitKey } = record;\n        const keyShortcut = record.key.split(splitKey);\n        const _downKeysCurrent: number[] = []; // Store the current key codes\n        for (let a = 0; a < keyShortcut.length; a++) {\n          _downKeysCurrent.push(code(keyShortcut[a]));\n        }\n        if (_downKeysCurrent.sort().join('') === _downKeys.sort().join('')) {\n          // Match found, call the handler\n          eventHandler(event, record, scope, element);\n        }\n      }\n    }\n  }\n}\n\nconst hotkeys = function hotkeys(\n  key: string,\n  option?: string | HotkeysOptions | KeyHandler,\n  method?: KeyHandler\n): void {\n  _downKeys = [];\n  /** List of hotkeys to handle */\n  const keys = getKeys(key);\n  let mods: number[] = [];\n  /** Default scope is 'all', meaning effective in all scopes */\n  let scope: string = 'all';\n  /** Element to which the hotkey events are bound */\n  let element: HTMLElement | Document = document;\n  let i = 0;\n  let keyup = false;\n  let keydown = true;\n  let splitKey = '+';\n  let capture = false;\n  /** Allow only a single callback */\n  let single = false;\n\n  // Determine if the second argument is a function (no options provided)\n  if (method === undefined && typeof option === 'function') {\n    method = option;\n  }\n\n  // Parse options object\n  if (Object.prototype.toString.call(option) === '[object Object]') {\n    const opts = option as HotkeysOptions;\n    if (opts.scope) scope = opts.scope; // Set scope\n    if (opts.element) element = opts.element; // Set binding element\n    if (opts.keyup) keyup = opts.keyup;\n    if (opts.keydown !== undefined) keydown = opts.keydown;\n    if (opts.capture !== undefined) capture = opts.capture;\n    if (typeof opts.splitKey === 'string') splitKey = opts.splitKey;\n    if (opts.single === true) single = true;\n  }\n\n  if (typeof option === 'string') scope = option;\n\n  // If only one callback is allowed, unbind the existing one first\n  if (single) unbind(key, scope);\n\n  // Handle each hotkey\n  for (; i < keys.length; i++) {\n    const currentKey = keys[i].split(splitKey); // Split into individual keys\n    mods = [];\n\n    // If it's a combination, extract modifier keys\n    if (currentKey.length > 1) mods = getMods(_modifier, currentKey);\n\n    // Convert non-modifier key to key code\n    let finalKey: string | number = currentKey[currentKey.length - 1];\n    finalKey = finalKey === '*' ? '*' : code(finalKey); // '*' means match all hotkeys\n\n    // Initialize handler array if this key has no handlers yet\n    if (!(finalKey in _handlers)) _handlers[finalKey] = [];\n\n    _handlers[finalKey].push({\n      keyup,\n      keydown,\n      scope,\n      mods,\n      shortcut: keys[i],\n      method: method!,\n      key: keys[i],\n      splitKey,\n      element,\n    });\n  }\n  // Register hotkey event listeners on the global document\n  if (typeof element !== 'undefined' && typeof window !== 'undefined') {\n    if (!elementEventMap.has(element)) {\n      // @ts-expect-error - window.event is deprecated IE property\n      const keydownListener = (event: Event = window.event) =>\n        dispatch(event as KeyboardEvent, element);\n      // @ts-expect-error - window.event is deprecated IE property\n      const keyupListenr = (event: Event = window.event) => {\n        dispatch(event as KeyboardEvent, element);\n        clearModifier(event as KeyboardEvent);\n      };\n      elementEventMap.set(element, { keydownListener, keyupListenr, capture });\n      addEvent(element, 'keydown', keydownListener, capture);\n      addEvent(element, 'keyup', keyupListenr, capture);\n    }\n    // Register focus event listener once to clear pressed keys on window focus\n    if (!winListendFocus) {\n      const listener = () => {\n        _downKeys = [];\n      };\n      winListendFocus = { listener, capture };\n      addEvent(window, 'focus', listener, capture);\n    }\n  }\n} as HotkeysInterface;\n\nfunction trigger(shortcut: string, scope: string = 'all'): void {\n  Object.keys(_handlers).forEach((key) => {\n    const dataList = _handlers[key].filter(\n      (item) => item.scope === scope && item.shortcut === shortcut\n    );\n    dataList.forEach((data) => {\n      if (data && data.method) {\n        data.method({} as KeyboardEvent, data);\n      }\n    });\n  });\n}\n\n/** Clean up event listeners. After unbinding, check whether the element still has any hotkeys bound. If not, remove its event listeners. */\nfunction removeKeyEvent(element: HTMLElement | Document | null): void {\n  const values = Object.values(_handlers).flat();\n  const findindex = values.findIndex(({ element: el }) => el === element);\n\n  if (findindex < 0 && element) {\n    const { keydownListener, keyupListenr, capture } =\n      elementEventMap.get(element) || {};\n    if (keydownListener && keyupListenr) {\n      removeEvent(element, 'keyup', keyupListenr, capture);\n      removeEvent(element, 'keydown', keydownListener, capture);\n      elementEventMap.delete(element);\n    }\n  }\n\n  if (values.length <= 0 || elementEventMap.size <= 0) {\n    // Remove all event listeners from all elements\n    const eventKeys = Array.from(elementEventMap.keys());\n    eventKeys.forEach((el) => {\n      const { keydownListener, keyupListenr, capture } =\n        elementEventMap.get(el) || {};\n      if (keydownListener && keyupListenr) {\n        removeEvent(el, 'keyup', keyupListenr, capture);\n        removeEvent(el, 'keydown', keydownListener, capture);\n        elementEventMap.delete(el);\n      }\n    });\n    // Clear the elementEventMap\n    elementEventMap.clear();\n    // Clear all handlers\n    Object.keys(_handlers).forEach((key) => delete _handlers[key]);\n    // Remove the global window focus event listener\n    if (winListendFocus) {\n      const { listener, capture } = winListendFocus;\n      removeEvent(window, 'focus', listener, capture);\n      winListendFocus = null;\n    }\n  }\n}\n\nconst _api: Omit<HotkeysAPI, 'noConflict'> = {\n  getPressedKeyString,\n  setScope,\n  getScope,\n  deleteScope,\n  getPressedKeyCodes,\n  getAllKeyCodes,\n  isPressed,\n  filter,\n  trigger,\n  unbind,\n  keyMap: _keyMap,\n  modifier: _modifier,\n  modifierMap,\n};\n\nfor (const a in _api) {\n  const key = a as keyof typeof _api;\n  if (Object.prototype.hasOwnProperty.call(_api, key)) {\n    (hotkeys as any)[key] = _api[key];\n  }\n}\n\nif (typeof window !== 'undefined') {\n  const _hotkeys = (window as any).hotkeys;\n  (hotkeys as HotkeysInterface).noConflict = (deep?: boolean) => {\n    if (deep && (window as any).hotkeys === hotkeys) {\n      (window as any).hotkeys = _hotkeys;\n    }\n    return hotkeys as HotkeysInterface;\n  };\n  (window as any).hotkeys = hotkeys;\n}\n\nexport default hotkeys as HotkeysInterface;\nexport type { KeyHandler, HotkeysEvent };\n"],"names":["isff","addEvent","object","event","method","useCapture","removeEvent","getMods","modifier","key","modsKeys","modsCodes","getKeys","keys","index","compareArray","a1","a2","arr1","arr2","isIndex","i","getLayoutIndependentKeyCode","_keyMap","_modifier","modifierMap","_mods","_handlers","k","_downKeys","winListendFocus","_scope","elementEventMap","code","x","getKey","getModifier","setScope","scope","getScope","getPressedKeyCodes","getPressedKeyString","c","getAllKeyCodes","result","mods","shortcut","v","filter","target","tagName","flag","isInput","isPressed","keyCode","deleteScope","newScope","handlers","element","removeKeyEvent","clearModifier","hotkeys","unbind","keysInfo","args","info","eachUnbind","splitKey","originKey","unbindKeys","len","lastKey","unbindElements","record","isUnbind","eventHandler","handler","modifiersMatch","y","dispatch","asterisk","keyName","keyNum","eventKey","e","handlerKey","keyLen","keyShortcut","_downKeysCurrent","a","option","keyup","keydown","capture","single","opts","currentKey","finalKey","keydownListener","keyupListenr","listener","trigger","item","data","values","el","_api","_hotkeys","deep"],"mappings":"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"}