{"version":3,"file":"uiUtil.mjs","sources":["../../../../../../../packages/vue-components/vc-picker/src/utils/uiUtil.ts"],"sourcesContent":["import type { GenerateConfig } from '../generate';\nimport type { CustomFormat, PanelMode, PickerMode } from '../interface';\nimport { isVisible, KeyCode, raf } from '@antdv/utils';\n\nconst scrollIds = new Map<HTMLElement, number>();\n\n/** Trigger when element is visible in view */\nexport function waitElementReady(element: HTMLElement, callback: () => void): () => void {\n  let id: number;\n\n  function tryOrNextFrame() {\n    if (isVisible(element)) {\n      callback();\n    } else {\n      id = raf(() => {\n        tryOrNextFrame();\n      });\n    }\n  }\n\n  tryOrNextFrame();\n\n  return () => {\n    raf.cancel(id);\n  };\n}\n\nexport function scrollTo(element: HTMLElement, to: number, duration: number) {\n  if (scrollIds.get(element))\n    raf.cancel(scrollIds.get(element)!);\n\n  // jump to target if duration zero\n  if (duration <= 0) {\n    scrollIds.set(\n      element,\n      raf(() => {\n        element.scrollTop = to;\n      }),\n    );\n\n    return;\n  }\n  const difference = to - element.scrollTop;\n  const perTick = (difference / duration) * 10;\n\n  scrollIds.set(\n    element,\n    raf(() => {\n      element.scrollTop += perTick;\n      if (element.scrollTop !== to)\n        scrollTo(element, to, duration - 10);\n    }),\n  );\n}\n\nexport interface KeyboardConfig {\n  onLeftRight?: ((diff: number) => void) | null;\n  onCtrlLeftRight?: ((diff: number) => void) | null;\n  onUpDown?: ((diff: number) => void) | null;\n  onPageUpDown?: ((diff: number) => void) | null;\n  onEnter?: (() => void) | null;\n}\nexport function createKeydownHandler(\n  event: KeyboardEvent,\n  { onLeftRight, onCtrlLeftRight, onUpDown, onPageUpDown, onEnter }: KeyboardConfig,\n): boolean {\n  const { which, ctrlKey, metaKey } = event;\n\n  switch (which) {\n    case KeyCode.LEFT:\n      if (ctrlKey || metaKey) {\n        if (onCtrlLeftRight) {\n          onCtrlLeftRight(-1);\n          return true;\n        }\n      } else if (onLeftRight) {\n        onLeftRight(-1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.RIGHT:\n      if (ctrlKey || metaKey) {\n        if (onCtrlLeftRight) {\n          onCtrlLeftRight(1);\n          return true;\n        }\n      } else if (onLeftRight) {\n        onLeftRight(1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.UP:\n      if (onUpDown) {\n        onUpDown(-1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.DOWN:\n      if (onUpDown) {\n        onUpDown(1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.PAGE_UP:\n      if (onPageUpDown) {\n        onPageUpDown(-1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.PAGE_DOWN:\n      if (onPageUpDown) {\n        onPageUpDown(1);\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n\n    case KeyCode.ENTER:\n      if (onEnter) {\n        onEnter();\n        return true;\n      }\n      /* istanbul ignore next */\n      break;\n  }\n\n  return false;\n}\n\n// ===================== Format =====================\nexport function getDefaultFormat<DateType>(\n  format: string | CustomFormat<DateType> | Array<string | CustomFormat<DateType>> | undefined,\n  picker: PickerMode | undefined,\n  showTime: boolean | object | undefined,\n  use12Hours: boolean | undefined,\n) {\n  let mergedFormat = format;\n  if (!mergedFormat) {\n    switch (picker) {\n      case 'time':\n        mergedFormat = use12Hours ? 'hh:mm:ss a' : 'HH:mm:ss';\n        break;\n\n      case 'week':\n        mergedFormat = 'gggg-wo';\n        break;\n\n      case 'month':\n        mergedFormat = 'YYYY-MM';\n        break;\n\n      case 'quarter':\n        mergedFormat = 'YYYY-[Q]Q';\n        break;\n\n      case 'year':\n        mergedFormat = 'YYYY';\n        break;\n\n      default:\n        mergedFormat = showTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD';\n    }\n  }\n\n  return mergedFormat;\n}\n\nexport function getInputSize<DateType>(\n  picker: PickerMode | undefined,\n  format: string | CustomFormat<DateType>,\n  generateConfig: GenerateConfig<DateType>,\n) {\n  const defaultSize = picker === 'time' ? 8 : 10;\n  const length\n    = typeof format === 'function' ? format(generateConfig.getNow()).length : format.length;\n  return Math.max(defaultSize, length) + 2;\n}\n\n// ===================== Window =====================\ntype ClickEventHandler = (event: MouseEvent) => void;\nlet globalClickFunc: ClickEventHandler | null = null;\nconst clickCallbacks = new Set<ClickEventHandler>();\n\nexport function addGlobalMousedownEvent(callback: ClickEventHandler) {\n  if (!globalClickFunc && typeof window !== 'undefined' && window.addEventListener) {\n    globalClickFunc = (e: MouseEvent) => {\n      // Clone a new list to avoid repeat trigger events\n      [...clickCallbacks].forEach((queueFunc) => {\n        queueFunc(e);\n      });\n    };\n    window.addEventListener('mousedown', globalClickFunc);\n  }\n\n  clickCallbacks.add(callback);\n\n  return () => {\n    clickCallbacks.delete(callback);\n    if (clickCallbacks.size === 0) {\n      window.removeEventListener('mousedown', globalClickFunc!);\n      globalClickFunc = null;\n    }\n  };\n}\n\nexport function getTargetFromEvent(e: Event) {\n  const target = e.target as HTMLElement;\n\n  // get target if in shadow dom\n  if (e.composed && target.shadowRoot)\n    return (e.composedPath?.()[0] || target) as HTMLElement;\n\n  return target;\n}\n\n// ====================== Mode ======================\nfunction getYearNextMode(next: PanelMode): PanelMode {\n  if (next === 'month' || next === 'date')\n    return 'year';\n\n  return next;\n}\n\nfunction getMonthNextMode(next: PanelMode): PanelMode {\n  if (next === 'date')\n    return 'month';\n\n  return next;\n}\n\nfunction getQuarterNextMode(next: PanelMode): PanelMode {\n  if (next === 'month' || next === 'date')\n    return 'quarter';\n\n  return next;\n}\n\nfunction getWeekNextMode(next: PanelMode): PanelMode {\n  if (next === 'date')\n    return 'week';\n\n  return next;\n}\n\nexport const PickerModeMap: Record<PickerMode, ((next: PanelMode) => PanelMode) | null> = {\n  year: getYearNextMode,\n  month: getMonthNextMode,\n  quarter: getQuarterNextMode,\n  week: getWeekNextMode,\n  time: null,\n  date: null,\n};\n\nexport function elementsContains(\n  elements: Array<HTMLElement | undefined | null>,\n  target: HTMLElement,\n) {\n  if (process.env.NODE_ENV === 'test')\n    return false;\n\n  return elements.some(ele => ele && ele.contains(target));\n}\n"],"names":[],"mappings":"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"}