{"version":3,"file":"video-viewer.mjs","sources":["../../../../../../packages/components/video-viewer/src/video-viewer.vue"],"sourcesContent":["<template>\n  <component\n    :is=\"teleported ? Teleport : 'div'\"\n    to=\"body\"\n    :disabled=\"!teleported\"\n  >\n    <transition name=\"viewer-fade\" appear>\n      <div\n        ref=\"wrapper\"\n        :tabindex=\"-1\"\n        :class=\"ns.e('wrapper')\"\n        :style=\"{ zIndex }\"\n      >\n        <div :class=\"ns.e('mask')\" @click.self=\"hideOnClickModal && hide()\" />\n\n        <!-- CLOSE -->\n        <span :class=\"[ns.e('btn'), ns.e('close')]\" @click=\"hide\">\n          <el-icon>\n            <Close />\n          </el-icon>\n        </span>\n\n        <!-- ARROW -->\n        <template v-if=\"!isSingle\">\n          <span :class=\"arrowPrevKls\" @click=\"prev\">\n            <el-icon>\n              <ArrowLeft />\n            </el-icon>\n          </span>\n          <span :class=\"arrowNextKls\" @click=\"next\">\n            <el-icon>\n              <ArrowRight />\n            </el-icon>\n          </span>\n        </template>\n\n        <!-- ACTIONS -->\n        <div :class=\"[ns.e('btn'), ns.e('actions')]\">\n          <div :class=\"ns.e('actions__inner')\">\n            <el-icon @click=\"handleActions('zoomOut')\">\n              <ZoomOut />\n            </el-icon>\n            <el-icon @click=\"handleActions('zoomIn')\">\n              <ZoomIn />\n            </el-icon>\n            <i :class=\"ns.e('actions__divider')\" />\n            <el-icon @click=\"toggleMode\">\n              <component :is=\"mode.icon\" />\n            </el-icon>\n            <i :class=\"ns.e('actions__divider')\" />\n            <el-icon @click=\"handleActions('anticlockwise')\">\n              <RefreshLeft />\n            </el-icon>\n            <el-icon @click=\"handleActions('clockwise')\">\n              <RefreshRight />\n            </el-icon>\n          </div>\n        </div>\n\n        <!-- CANVAS -->\n        <div :class=\"ns.e('canvas')\">\n          <el-video\n            :key=\"videoProps.src\"\n            :style=\"calcStyle\"\n            v-bind=\"videoProps\"\n          />\n        </div>\n        <slot />\n      </div>\n    </transition>\n  </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n  Teleport,\n  computed,\n  effectScope,\n  markRaw,\n  onMounted,\n  ref,\n  shallowRef,\n  watch,\n} from 'vue'\nimport { useEventListener } from '@vueuse/core'\nimport { throttle } from 'lodash-unified'\nimport { ElIcon, useNamespace, useZIndex } from 'element-plus'\nimport ElVideo from '@element-plus/components/video/src/video.vue'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { keysOf } from '@element-plus/utils/element-plus'\nimport {\n  ArrowLeft,\n  ArrowRight,\n  Close,\n  FullScreen,\n  RefreshLeft,\n  RefreshRight,\n  ScaleToOriginal,\n  ZoomIn,\n  ZoomOut,\n} from '@element-plus/icons-vue'\nimport { videoViewerEmits, videoViewerProps } from './video-viewer'\n\nimport type { CSSProperties } from 'vue'\nimport type { VideoViewerAction, VideoViewerMode } from './video-viewer'\n\nconst modes: Record<'CONTAIN' | 'ORIGINAL', VideoViewerMode> = {\n  CONTAIN: {\n    name: 'contain',\n    icon: markRaw(FullScreen),\n  },\n  ORIGINAL: {\n    name: 'original',\n    icon: markRaw(ScaleToOriginal),\n  },\n}\n\ndefineOptions({\n  name: 'ElVideoViewer',\n})\n\nconst props = defineProps(videoViewerProps)\nconst emit = defineEmits(videoViewerEmits)\n\nconst ns = useNamespace('video-viewer')\nconst { nextZIndex } = useZIndex()\nconst wrapper = ref<HTMLDivElement>()\n\nconst scopeEventListener = effectScope()\n\nconst activeIndex = ref(props.initialIndex)\nconst mode = shallowRef<VideoViewerMode>(modes.CONTAIN)\nconst transform = ref({\n  scale: 1,\n  deg: 0,\n  offsetX: 0,\n  offsetY: 0,\n  enableTransition: false,\n})\nconst zIndex = ref(props.zIndex ?? nextZIndex())\n\nconst isSingle = computed(() => {\n  const { urlList } = props\n  return urlList.length <= 1\n})\n\nconst isFirst = computed(() => {\n  return activeIndex.value === 0\n})\n\nconst isLast = computed(() => {\n  return activeIndex.value === props.urlList.length - 1\n})\n\nconst list = computed(() => {\n  return props.urlList.map((url) => {\n    if (typeof url === 'string') {\n      return {\n        src: url,\n        poster: '',\n      }\n    } else {\n      return url\n    }\n  })\n})\n\nconst videoProps = computed(() => {\n  return list.value[activeIndex.value]\n})\n\nconst arrowPrevKls = computed(() => [\n  ns.e('btn'),\n  ns.e('prev'),\n  ns.is('disabled', !props.infinite && isFirst.value),\n])\n\nconst arrowNextKls = computed(() => [\n  ns.e('btn'),\n  ns.e('next'),\n  ns.is('disabled', !props.infinite && isLast.value),\n])\n\nconst calcStyle = computed(() => {\n  const { scale, deg, offsetX, offsetY, enableTransition } = transform.value\n  let translateX = offsetX / scale\n  let translateY = offsetY / scale\n\n  const radian = (deg * Math.PI) / 180\n  const cosRadian = Math.cos(radian)\n  const sinRadian = Math.sin(radian)\n  translateX = translateX * cosRadian + translateY * sinRadian\n  translateY = translateY * cosRadian - (offsetX / scale) * sinRadian\n\n  const style: CSSProperties = {\n    transform: `scale(${scale}) rotate(${deg}deg) translate(${translateX}px, ${translateY}px)`,\n    transition: enableTransition ? 'transform .3s' : '',\n  }\n  if (mode.value.name === modes.CONTAIN.name) {\n    style.maxWidth = style.maxHeight = '100%'\n  }\n  return style\n})\n\nfunction hide() {\n  unregisterEventListener()\n  emit('close')\n}\n\nfunction registerEventListener() {\n  const keydownHandler = throttle((e: KeyboardEvent) => {\n    switch (e.code) {\n      // ESC\n      case EVENT_CODE.esc:\n        props.closeOnPressEscape && hide()\n        break\n      // SPACE\n      case EVENT_CODE.space:\n        toggleMode()\n        break\n      // LEFT_ARROW\n      case EVENT_CODE.left:\n        prev()\n        break\n      // UP_ARROW\n      case EVENT_CODE.up:\n        handleActions('zoomIn')\n        break\n      // RIGHT_ARROW\n      case EVENT_CODE.right:\n        next()\n        break\n      // DOWN_ARROW\n      case EVENT_CODE.down:\n        handleActions('zoomOut')\n        break\n    }\n  })\n  const mousewheelHandler = throttle((e: WheelEvent) => {\n    const delta = e.deltaY || e.deltaX\n    handleActions(delta < 0 ? 'zoomIn' : 'zoomOut', {\n      zoomRate: props.zoomRate,\n      enableTransition: false,\n    })\n  })\n\n  scopeEventListener.run(() => {\n    useEventListener(document, 'keydown', keydownHandler)\n    useEventListener(document, 'wheel', mousewheelHandler)\n  })\n}\n\nfunction unregisterEventListener() {\n  scopeEventListener.stop()\n}\n\nfunction reset() {\n  transform.value = {\n    scale: 1,\n    deg: 0,\n    offsetX: 0,\n    offsetY: 0,\n    enableTransition: false,\n  }\n}\n\nfunction toggleMode() {\n  const modeNames = keysOf(modes)\n  const modeValues = Object.values(modes)\n  const currentMode = mode.value.name\n  const index = modeValues.findIndex((i) => i.name === currentMode)\n  const nextIndex = (index + 1) % modeNames.length\n  mode.value = modes[modeNames[nextIndex]]\n  reset()\n}\n\nfunction setActiveItem(index: number) {\n  const len = props.urlList.length\n  activeIndex.value = (index + len) % len\n}\n\nfunction prev() {\n  if (isFirst.value && !props.infinite) return\n  setActiveItem(activeIndex.value - 1)\n}\n\nfunction next() {\n  if (isLast.value && !props.infinite) return\n  setActiveItem(activeIndex.value + 1)\n}\n\nfunction handleActions(action: VideoViewerAction, options = {}) {\n  const { minScale, maxScale } = props\n  const { zoomRate, rotateDeg, enableTransition } = {\n    zoomRate: props.zoomRate,\n    rotateDeg: 90,\n    enableTransition: true,\n    ...options,\n  }\n  switch (action) {\n    case 'zoomOut':\n      if (transform.value.scale > minScale) {\n        transform.value.scale = Number.parseFloat(\n          (transform.value.scale / zoomRate).toFixed(3)\n        )\n      }\n      break\n    case 'zoomIn':\n      if (transform.value.scale < maxScale) {\n        transform.value.scale = Number.parseFloat(\n          (transform.value.scale * zoomRate).toFixed(3)\n        )\n      }\n      break\n    case 'clockwise':\n      transform.value.deg += rotateDeg\n      emit('rotate', transform.value.deg)\n      break\n    case 'anticlockwise':\n      transform.value.deg -= rotateDeg\n      emit('rotate', transform.value.deg)\n      break\n  }\n  transform.value.enableTransition = enableTransition\n}\n\nwatch(activeIndex, (val) => {\n  reset()\n  emit('switch', val)\n})\n\nonMounted(() => {\n  registerEventListener()\n})\n\ndefineExpose({\n  /**\n   * @description manually switch image\n   */\n  setActiveItem,\n})\n</script>\n"],"names":[],"mappings":"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"}