{"version":3,"file":"parse-hotkey.cjs","names":[],"sources":["../../src/use-hotkeys/parse-hotkey.ts"],"sourcesContent":["export interface KeyboardModifiers {\n  alt: boolean;\n  ctrl: boolean;\n  meta: boolean;\n  mod: boolean;\n  shift: boolean;\n}\n\nexport interface Hotkey extends KeyboardModifiers {\n  key?: string;\n}\n\ntype CheckHotkeyMatch = (event: KeyboardEvent) => boolean;\n\nconst keyNameMap: Record<string, string> = {\n  ' ': 'space',\n  ArrowLeft: 'arrowleft',\n  ArrowRight: 'arrowright',\n  ArrowUp: 'arrowup',\n  ArrowDown: 'arrowdown',\n  Escape: 'escape',\n  Esc: 'escape',\n  esc: 'escape',\n  Enter: 'enter',\n  Tab: 'tab',\n  Backspace: 'backspace',\n  Delete: 'delete',\n  Insert: 'insert',\n  Home: 'home',\n  End: 'end',\n  PageUp: 'pageup',\n  PageDown: 'pagedown',\n  '+': 'plus',\n  '-': 'minus',\n  '*': 'asterisk',\n  '/': 'slash',\n};\n\nfunction normalizeKey(key: string): string {\n  const lowerKey = key.replace('Key', '').toLowerCase();\n  return keyNameMap[key] || lowerKey;\n}\n\nexport function parseHotkey(hotkey: string): Hotkey {\n  const keys = hotkey\n    .toLowerCase()\n    .split('+')\n    .map((part) => part.trim());\n\n  const modifiers: KeyboardModifiers = {\n    alt: keys.includes('alt'),\n    ctrl: keys.includes('ctrl'),\n    meta: keys.includes('meta'),\n    mod: keys.includes('mod'),\n    shift: keys.includes('shift'),\n  };\n\n  const reservedKeys = ['alt', 'ctrl', 'meta', 'shift', 'mod'];\n\n  const freeKey = keys.find((key) => !reservedKeys.includes(key));\n\n  return {\n    ...modifiers,\n    key: freeKey === '[plus]' ? '+' : freeKey,\n  };\n}\n\nfunction isExactHotkey(hotkey: Hotkey, event: KeyboardEvent, usePhysicalKeys?: boolean): boolean {\n  const { alt, ctrl, meta, mod, shift, key } = hotkey;\n  const { altKey, ctrlKey, metaKey, shiftKey, key: pressedKey, code: pressedCode } = event;\n\n  if (alt !== altKey) {\n    return false;\n  }\n\n  if (mod) {\n    if (!ctrlKey && !metaKey) {\n      return false;\n    }\n  } else {\n    if (ctrl !== ctrlKey) {\n      return false;\n    }\n    if (meta !== metaKey) {\n      return false;\n    }\n  }\n  if (shift !== shiftKey) {\n    return false;\n  }\n\n  if (\n    key &&\n    (usePhysicalKeys\n      ? normalizeKey(pressedCode) === normalizeKey(key)\n      : normalizeKey(pressedKey ?? pressedCode) === normalizeKey(key))\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nexport function getHotkeyMatcher(hotkey: string, usePhysicalKeys?: boolean): CheckHotkeyMatch {\n  return (event) => isExactHotkey(parseHotkey(hotkey), event, usePhysicalKeys);\n}\n\nexport interface HotkeyItemOptions {\n  preventDefault?: boolean;\n  usePhysicalKeys?: boolean;\n}\n\ntype HotkeyItem = [string, (event: any) => void, HotkeyItemOptions?];\n\nexport function getHotkeyHandler(hotkeys: HotkeyItem[]) {\n  return (event: React.KeyboardEvent<HTMLElement> | KeyboardEvent) => {\n    const _event = 'nativeEvent' in event ? event.nativeEvent : event;\n    hotkeys.forEach(\n      ([hotkey, handler, options = { preventDefault: true, usePhysicalKeys: false }]) => {\n        if (getHotkeyMatcher(hotkey, options.usePhysicalKeys)(_event)) {\n          if (options.preventDefault) {\n            event.preventDefault();\n          }\n\n          handler(_event);\n        }\n      }\n    );\n  };\n}\n"],"mappings":";;AAcA,MAAM,aAAqC;CACzC,KAAK;CACL,WAAW;CACX,YAAY;CACZ,SAAS;CACT,WAAW;CACX,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,KAAK;CACL,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,QAAQ;CACR,UAAU;CACV,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP;AAEA,SAAS,aAAa,KAAqB;CACzC,MAAM,WAAW,IAAI,QAAQ,OAAO,EAAE,EAAE,YAAY;CACpD,OAAO,WAAW,QAAQ;AAC5B;AAEA,SAAgB,YAAY,QAAwB;CAClD,MAAM,OAAO,OACV,YAAY,EACZ,MAAM,GAAG,EACT,KAAK,SAAS,KAAK,KAAK,CAAC;CAE5B,MAAM,YAA+B;EACnC,KAAK,KAAK,SAAS,KAAK;EACxB,MAAM,KAAK,SAAS,MAAM;EAC1B,MAAM,KAAK,SAAS,MAAM;EAC1B,KAAK,KAAK,SAAS,KAAK;EACxB,OAAO,KAAK,SAAS,OAAO;CAC9B;CAEA,MAAM,eAAe;EAAC;EAAO;EAAQ;EAAQ;EAAS;CAAK;CAE3D,MAAM,UAAU,KAAK,MAAM,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;CAE9D,OAAO;EACL,GAAG;EACH,KAAK,YAAY,WAAW,MAAM;CACpC;AACF;AAEA,SAAS,cAAc,QAAgB,OAAsB,iBAAoC;CAC/F,MAAM,EAAE,KAAK,MAAM,MAAM,KAAK,OAAO,QAAQ;CAC7C,MAAM,EAAE,QAAQ,SAAS,SAAS,UAAU,KAAK,YAAY,MAAM,gBAAgB;CAEnF,IAAI,QAAQ,QACV,OAAO;CAGT,IAAI;MACE,CAAC,WAAW,CAAC,SACf,OAAO;CAAA,OAEJ;EACL,IAAI,SAAS,SACX,OAAO;EAET,IAAI,SAAS,SACX,OAAO;CAEX;CACA,IAAI,UAAU,UACZ,OAAO;CAGT,IACE,QACC,kBACG,aAAa,WAAW,MAAM,aAAa,GAAG,IAC9C,aAAa,cAAc,WAAW,MAAM,aAAa,GAAG,IAEhE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,iBAAiB,QAAgB,iBAA6C;CAC5F,QAAQ,UAAU,cAAc,YAAY,MAAM,GAAG,OAAO,eAAe;AAC7E;AASA,SAAgB,iBAAiB,SAAuB;CACtD,QAAQ,UAA4D;EAClE,MAAM,SAAS,iBAAiB,QAAQ,MAAM,cAAc;EAC5D,QAAQ,SACL,CAAC,QAAQ,SAAS,UAAU;GAAE,gBAAgB;GAAM,iBAAiB;EAAM,OAAO;GACjF,IAAI,iBAAiB,QAAQ,QAAQ,eAAe,EAAE,MAAM,GAAG;IAC7D,IAAI,QAAQ,gBACV,MAAM,eAAe;IAGvB,QAAQ,MAAM;GAChB;EACF,CACF;CACF;AACF"}