{"version":3,"file":"modifier.mjs","sources":["../../../../../../../packages/components/video/src/hooks/modifier.ts"],"sourcesContent":["import { computed, reactive, ref, unref } from 'vue'\n\nimport { NOOP } from '@lit-element/utils'\nimport { useListener } from './listener'\n\nimport type { Ref } from 'vue'\n\nexport type ModifierState = Readonly<\n  Omit<Record<string, boolean>, 'activeKeys'> & {\n    activeKeys: Set<string>\n    resetAll: () => void\n  }\n>\n\nexport interface UseModifierOptions {\n  /**\n   * 作用的目标元素的 Ref\n   */\n  target?: Ref<HTMLElement | null | undefined>\n  /**\n   * 配置键名的别名，会与默认别名动态合并\n   */\n  aliasMap?: Record<string, string>\n  /**\n   * 是否在目标元素失去焦点时重置修饰符\n   *\n   * @default true\n   */\n  autoReset?: boolean\n  /**\n   * 事件的 capture 选项\n   *\n   * @default false\n   */\n  capture?: boolean\n  /**\n   * 事件的 passive 选项\n   *\n   * @default true\n   */\n  passive?: boolean\n  /**\n   * 是否严格匹配目标元素\n   */\n  strictTarget?: boolean\n  /**\n   * 键按下的事件回调函数\n   */\n  onKeyDown?: (event: KeyboardEvent, modifier: ModifierState) => void\n  /**\n   * 键抬起的时间回调函数\n   */\n  onKeyUp?: (event: KeyboardEvent, modifier: ModifierState) => void\n}\n\nconst defaultAliasMap: Record<string, string> = {\n  ctrl: 'control',\n  command: 'meta',\n  cmd: 'meta',\n  option: 'alt',\n  up: 'arrowup',\n  down: 'arrowdown',\n  left: 'arrowleft',\n  right: 'arrowright',\n}\n\nconst separatorRE = /[+_-]/\nconst splitRE = /[+_-]/g\n\nconst internalProps = ['activeKeys', 'resetAll']\n\nexport function useModifier(options: any = {}) {\n  const {\n    autoReset = true,\n    capture = false,\n    passive = true,\n    strictTarget = false,\n    onKeyDown = NOOP,\n    onKeyUp = NOOP,\n  } = options\n\n  const target = options.target || ref(null)\n  const aliasMap = { ...defaultAliasMap, ...(options.aliasMap || {}) }\n  const activeKeys = reactive(new Set<string>())\n  const metaDeps = new Set<string>()\n  const modifier: Record<string, any> = reactive({ activeKeys, resetAll })\n\n  function setModifier(key: string, value: boolean) {\n    if (key in modifier) {\n      modifier[key] = value\n    }\n  }\n\n  function updateModifier(event: KeyboardEvent, value: boolean) {\n    const key = event.key?.toLocaleLowerCase()\n    const code = event.code?.toLocaleLowerCase()\n    const keys = [code, key].filter(Boolean)\n\n    for (const key of keys) {\n      activeKeys[value ? 'add' : 'delete'](key)\n      setModifier(key, value)\n    }\n\n    if (!value && key === 'meta') {\n      for (const key of metaDeps) {\n        activeKeys.delete(key)\n        setModifier(key, false)\n      }\n\n      metaDeps.clear()\n    } else if (\n      value &&\n      typeof event.getModifierState === 'function' &&\n      event.getModifierState('Meta')\n    ) {\n      for (const key of [...activeKeys, ...keys]) {\n        metaDeps.add(key)\n      }\n    }\n  }\n\n  function resetAll() {\n    Object.keys(modifier).forEach((key) => {\n      modifier[key] = false\n    })\n\n    modifier.activeKeys = activeKeys\n    modifier.resetAll = resetAll\n  }\n\n  const modifierProxy = new Proxy(modifier, {\n    get(target, prop: any, receiver) {\n      if (typeof prop !== 'string' || internalProps.includes(prop)) {\n        return Reflect.get(target, prop, receiver)\n      }\n\n      prop = prop.toLocaleLowerCase()\n\n      if (prop in aliasMap) {\n        prop = aliasMap[prop]\n      }\n\n      if (!(prop in modifier)) {\n        if (separatorRE.test(prop)) {\n          const keys = prop.split(splitRE).map((key: any) => key.trim())\n\n          modifier[prop] = computed(() =>\n            keys.every((key: any) => unref(modifierProxy[key]))\n          )\n        } else {\n          modifier[prop] = ref(activeKeys.has(prop))\n        }\n      }\n\n      return unref(Reflect.get(target, prop, receiver))\n    },\n  })\n\n  useListener(\n    target,\n    'keydown',\n    (event: KeyboardEvent) => {\n      if (strictTarget && event.target !== unref(target)) {\n        return\n      }\n\n      updateModifier(event, true)\n      onKeyDown(event, modifierProxy)\n    },\n    { capture, passive }\n  )\n  useListener(\n    target,\n    'keyup',\n    (event: KeyboardEvent) => {\n      if (strictTarget && event.target !== unref(target)) {\n        return\n      }\n\n      updateModifier(event, false)\n      onKeyUp(event, modifierProxy)\n    },\n    { capture, passive }\n  )\n\n  if (autoReset) {\n    useListener(target, 'blur', resetAll, { capture, passive })\n  }\n\n  return { target, modifier: modifierProxy as ModifierState }\n}\n"],"names":[],"mappings":"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"}