{"version":3,"file":"image-preview.mjs","sources":["../../../../../src/components/ivue-image/image-preview.vue"],"sourcesContent":["<template>\r\n  <teleport to=\"body\" :disabled=\"!transfer\">\r\n    <!-- 蒙层 -->\r\n    <transition name=\"fade\">\r\n      <div\r\n        :class=\"`${prefixCls}-mask`\"\r\n        :style=\"maskStyles\"\r\n        v-if=\"modelValue\"\r\n      ></div>\r\n    </transition>\r\n    <!-- 内容 -->\r\n    <transition name=\"fade\">\r\n      <div\r\n        :class=\"`${prefixCls}-wrapper`\"\r\n        :style=\"maskStyles\"\r\n        ref=\"wrapper\"\r\n        v-if=\"modelValue\"\r\n      >\r\n        <div :class=\"prefixCls\" @click.stop=\"handleClickMask\">\r\n          <!-- 加载中 -->\r\n          <ivue-spin\r\n            :class=\"`${prefixCls}-loading`\"\r\n            :size=\"32\"\r\n            v-if=\"data.imageStatus === 'loading'\"\r\n          ></ivue-spin>\r\n          <!-- 加载错误 -->\r\n          <div\r\n            :class=\"`${prefixCls}-error`\"\r\n            v-if=\"data.imageStatus === 'error'\"\r\n          >\r\n            <span>加载失败</span>\r\n          </div>\r\n          <!-- 图片 -->\r\n          <img\r\n            :style=\"imageStyles\"\r\n            :class=\"imageClasses\"\r\n            :src=\"currentImage\"\r\n            :key=\"`${data.currentIndex}`\"\r\n            @click.stop\r\n            @load=\"handleImageLoad\"\r\n            @error=\"handleImageError\"\r\n            @mousedown.stop.prevent=\"handleMousedown\"\r\n            @touchstart.stop.prevent=\"handleTouchStart\"\r\n          />\r\n          <!-- 左按钮 -->\r\n          <ivue-icon\r\n            :class=\"`${prefixCls}-left`\"\r\n            @click.stop=\"handleImageSwitch(false)\"\r\n            >chevron_left</ivue-icon\r\n          >\r\n          <!-- 右按钮 -->\r\n          <ivue-icon\r\n            :class=\"`${prefixCls}-right`\"\r\n            @click.stop=\"handleImageSwitch(true)\"\r\n            >chevron_right</ivue-icon\r\n          >\r\n          <!-- 关闭按钮 -->\r\n          <ivue-icon :class=\"`${prefixCls}-close`\" @click.stop=\"handleClose\"\r\n            >close</ivue-icon\r\n          >\r\n          <!-- toolbar -->\r\n          <div\r\n            :class=\"`${prefixCls}-toolbar`\"\r\n            v-if=\"toolbar && toolbar.length > 0\"\r\n            @click.stop\r\n          >\r\n            <!-- 放大 -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('zoomIn') + 1\"\r\n              @click.stop=\"handleOperation('zoomIn')\"\r\n              v-if=\"toolbar.indexOf('zoomIn') > -1\"\r\n              >zoom_in</ivue-icon\r\n            >\r\n            <!-- 缩小 -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('zoomOut') + 1\"\r\n              @click.stop=\"handleOperation('zoomOut')\"\r\n              v-if=\"toolbar.indexOf('zoomOut') > -1\"\r\n              >zoom_out</ivue-icon\r\n            >\r\n            <!-- original -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('original') + 1\"\r\n              @click.stop=\"handleOperation('original')\"\r\n              v-if=\"toolbar.indexOf('original') > -1\"\r\n              >{{ !data.original ? 'crop_free' : 'zoom_out_map' }}</ivue-icon\r\n            >\r\n            <!-- 左旋转 -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('rotateLeft') + 1\"\r\n              @click.stop=\"handleOperation('rotateLeft')\"\r\n              v-if=\"toolbar.indexOf('rotateLeft') > -1\"\r\n              >rotate_left</ivue-icon\r\n            >\r\n            <!-- 右旋转 -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('rotateRight') + 1\"\r\n              @click.stop=\"handleOperation('rotateRight')\"\r\n              v-if=\"toolbar.indexOf('rotateRight') > -1\"\r\n              >rotate_right</ivue-icon\r\n            >\r\n            <!-- 下载 -->\r\n            <ivue-icon\r\n              :class=\"`${prefixCls}-toolbar--item`\"\r\n              :order=\"toolbar.indexOf('download') + 1\"\r\n              @click.stop=\"handleOperation('download')\"\r\n              v-if=\"toolbar.indexOf('download') > -1 && !data.downloading\"\r\n              >save_alt</ivue-icon\r\n            >\r\n            <!-- 下载中 -->\r\n            <ivue-icon\r\n              :class=\"[\r\n                `${prefixCls}-toolbar--item`,\r\n                `${prefixCls}-toolbar--wait`,\r\n                'ivue-load-loop',\r\n              ]\"\r\n              :order=\"toolbar.indexOf('download') + 1\"\r\n              @click.stop=\"handleOperation('download')\"\r\n              v-if=\"toolbar.indexOf('download') > -1 && data.downloading\"\r\n              >loop</ivue-icon\r\n            >\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </transition>\r\n  </teleport>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n  computed,\r\n  defineComponent,\r\n  getCurrentInstance,\r\n  nextTick,\r\n  reactive,\r\n  ref,\r\n  watch,\r\n} from 'vue';\r\nimport throttle from 'lodash.throttle';\r\n\r\n// utils\r\nimport { transferIndex, transferIncrease } from '../../utils/transfer-queue';\r\nimport { on, off } from '../../utils/dom';\r\nimport { isClient, downloadFile } from '../../utils/helpers';\r\n\r\n// components\r\nimport IvueSpin from '../ivue-spin';\r\nimport IvueIcon from '../ivue-icon';\r\n\r\n// type\r\nimport type { Props, Data } from './types/image-preview';\r\n\r\nconst prefixCls = 'ivue-image-preview';\r\n\r\nexport default defineComponent({\r\n  name: prefixCls,\r\n  emits: ['update:modelValue', 'on-close', 'on-switch'],\r\n  props: {\r\n    /**\r\n     * 是否显示，可使用 v-model 双向绑定\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    modelValue: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    /**\r\n     * 是否将弹层放置于 body 内\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    transfer: {\r\n      type: Boolean,\r\n      default() {\r\n        const global = getCurrentInstance().appContext.config.globalProperties;\r\n\r\n        return !global.$IVUE || global.$IVUE.transfer === ''\r\n          ? false\r\n          : global.$IVUE.transfer;\r\n      },\r\n    },\r\n    /**\r\n     * 打开预览的第一项\r\n     *\r\n     * @type {Number}\r\n     */\r\n    initialIndex: {\r\n      type: Number,\r\n      default: 0,\r\n    },\r\n    /**\r\n     * 是否允许点击遮罩层关闭\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    maskClosable: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 图片预览列表\r\n     *\r\n     * @type {Array}\r\n     */\r\n    previewList: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    /**\r\n     * 是否循环切换\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    infinite: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 图片预览操作栏选项，按数组顺序排序\r\n     *\r\n     * @type {Array}\r\n     */\r\n    toolbar: {\r\n      type: Array,\r\n      default() {\r\n        const global = getCurrentInstance().appContext.config.globalProperties;\r\n\r\n        return !global.$IVUE ||\r\n          !global.$IVUE.image ||\r\n          global.$IVUE.image.toolbar === ''\r\n          ? [\r\n              'zoomIn',\r\n              'zoomOut',\r\n              'original',\r\n              'rotateLeft',\r\n              'rotateRight',\r\n              'download',\r\n            ]\r\n          : global.$IVUE.image.toolbar;\r\n      },\r\n    },\r\n    /**\r\n     * 防止body滚动\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    bodyOverflow: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n  },\r\n  setup(props: Props, { emit }) {\r\n    // dom\r\n    const wrapper = ref<HTMLElement>(null);\r\n\r\n    // 蒙版index\r\n    const getMaskIndex = () => {\r\n      transferIncrease();\r\n\r\n      return transferIndex;\r\n    };\r\n\r\n    // data\r\n    const data = reactive<Data>({\r\n      /**\r\n       * 蒙层zIndex\r\n       *\r\n       * @type {Number}\r\n       */\r\n      maskIndex: getMaskIndex(),\r\n      /**\r\n       * 图片状态\r\n       *\r\n       * @type {String}\r\n       */\r\n      imageStatus: 'loading',\r\n      /**\r\n       * 当前index\r\n       *\r\n       * @type {Number}\r\n       */\r\n      currentIndex: 0,\r\n      /**\r\n       * 图片transition\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      transition: true,\r\n      /**\r\n       * 按原尺寸显示\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      original: false,\r\n      /**\r\n       * X轴\r\n       *\r\n       * @type {Number}\r\n       */\r\n      startX: 0,\r\n      /**\r\n       * Y轴\r\n       *\r\n       * @type {Number}\r\n       */\r\n      startY: 0,\r\n      /**\r\n       * 图片移动位置\r\n       *\r\n       * @type {Object}\r\n       */\r\n      imageTranslate: {\r\n        x: 0,\r\n        y: 0,\r\n      },\r\n      /**\r\n       * 图片缩放大小\r\n       *\r\n       * @type {Number}\r\n       */\r\n      imageScale: 1,\r\n      /**\r\n       * 图片旋转角度\r\n       *\r\n       * @type {NUmber}\r\n       */\r\n      imageRotate: 0,\r\n      /**\r\n       * 防止body滚动\r\n       *\r\n       * @type {String}\r\n       */\r\n      prevOverflow: '',\r\n      /**\r\n       * 下载中\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      downloading: false,\r\n    });\r\n\r\n    // computed\r\n\r\n    // 蒙版样式\r\n    const maskStyles = computed(() => {\r\n      return {\r\n        zIndex: data.maskIndex + 1000,\r\n      };\r\n    });\r\n\r\n    // 当前选择的图片\r\n    const currentImage = computed(() => {\r\n      return props.previewList[data.currentIndex];\r\n    });\r\n\r\n    // 图片class\r\n    const imageClasses = computed(() => {\r\n      return [\r\n        `${prefixCls}-image`,\r\n        {\r\n          // 抓取图片中\r\n          [`${prefixCls}-grabbing`]: !data.transition,\r\n          // 隐藏图片\r\n          [`${prefixCls}-hidden`]: data.imageStatus === 'error',\r\n          // transition\r\n          [`${prefixCls}-transition`]: data.transition,\r\n          // 限制图片大小\r\n          [`${prefixCls}-limit`]: !data.original,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 图片style\r\n    const imageStyles = computed(() => {\r\n      let translateX = data.imageTranslate.x / data.imageScale;\r\n      let translateY = data.imageTranslate.y / data.imageScale;\r\n\r\n      const mod = data.imageRotate % 360;\r\n\r\n      // 90, -270\r\n      if ([90, -270].includes(mod)) {\r\n        [translateX, translateY] = [translateY, -translateX];\r\n      }\r\n\r\n      // 180 , -180\r\n      if ([180, -180].includes(mod)) {\r\n        [translateX, translateY] = [-translateX, -translateY];\r\n      }\r\n\r\n      // 270 , -90\r\n      if ([270, -90].includes(mod)) {\r\n        [translateX, translateY] = [-translateY, translateX];\r\n      }\r\n\r\n      return {\r\n        transform: `\r\n                        scale(${data.imageScale})\r\n                        rotate(${data.imageRotate}deg)\r\n                        translate(${translateX}px, ${translateY}px)\r\n                    `,\r\n      };\r\n    });\r\n\r\n    // methods\r\n\r\n    // 点击蒙层\r\n    const handleClickMask = () => {\r\n      // 是否允许点击遮罩层关闭\r\n      if (!props.maskClosable) {\r\n        return;\r\n      }\r\n\r\n      // 关闭\r\n      handleClose();\r\n    };\r\n\r\n    // 关闭\r\n    const handleClose = () => {\r\n      emit('update:modelValue', false);\r\n      emit('on-close');\r\n    };\r\n\r\n    // 图片加载成功\r\n    const handleImageLoad = () => {\r\n      data.imageStatus = 'loaded';\r\n    };\r\n\r\n    // 图片加载失败\r\n    const handleImageError = () => {\r\n      data.imageStatus = 'error';\r\n    };\r\n\r\n    // 鼠标按下\r\n    const handleMousedown = (event: MouseEvent) => {\r\n      const {\r\n        pageX,\r\n        pageY,\r\n        // 表示被按下的按钮\r\n        which,\r\n      } = event;\r\n\r\n      // 没有按下\r\n      if (which !== 1) {\r\n        return;\r\n      }\r\n\r\n      // 触发事件的位置\r\n      data.startX = pageX;\r\n      data.startY = pageY;\r\n\r\n      data.transition = false;\r\n\r\n      on(document, 'mousemove', handleMousemove);\r\n      on(document, 'mouseup', handleMouseup);\r\n    };\r\n\r\n    // 鼠标移动 节流 throttle\r\n    const handleMousemove = throttle((event) => {\r\n      event.stopPropagation();\r\n\r\n      const { pageX, pageY } = event;\r\n\r\n      data.imageTranslate.x += pageX - data.startX;\r\n      data.imageTranslate.y += pageY - data.startY;\r\n\r\n      // 触发事件的位置\r\n      data.startX = pageX;\r\n      data.startY = pageY;\r\n    });\r\n\r\n    // 鼠标松开\r\n    const handleMouseup = () => {\r\n      data.transition = true;\r\n\r\n      off(document, 'mousemove', handleMousemove);\r\n      off(document, 'mouseup', handleMouseup);\r\n    };\r\n\r\n    // 手指按下\r\n    const handleTouchStart = (event: TouchEvent) => {\r\n      const { pageX, pageY } = event.touches[0];\r\n\r\n      // 触发事件的位置\r\n      data.startX = pageX;\r\n      data.startY = pageY;\r\n\r\n      data.transition = false;\r\n\r\n      on(document, 'touchmove', handleTouchmove);\r\n      on(document, 'touchend', handleTouchend);\r\n    };\r\n\r\n    // 手指移动\r\n    const handleTouchmove = throttle((event: TouchEvent) => {\r\n      event.stopPropagation();\r\n\r\n      const { pageX, pageY } = event.touches[0];\r\n\r\n      data.imageTranslate.x += pageX - data.startX;\r\n      data.imageTranslate.y += pageY - data.startY;\r\n\r\n      // 触发事件的位置\r\n      data.startX = pageX;\r\n      data.startY = pageY;\r\n    });\r\n\r\n    // 手指离开\r\n    const handleTouchend = () => {\r\n      data.transition = true;\r\n\r\n      off(document, 'touchmove', handleTouchmove);\r\n      off(document, 'touchend', handleTouchend);\r\n    };\r\n\r\n    // 重制样式\r\n    const resetStyle = () => {\r\n      data.imageScale = 1;\r\n      data.imageRotate = 0;\r\n\r\n      data.imageTranslate = {\r\n        x: 0,\r\n        y: 0,\r\n      };\r\n    };\r\n\r\n    // 获取body样式\r\n    const getBodyOverflow = () => {\r\n      return isClient ? document.body.style.overflow : '';\r\n    };\r\n\r\n    // 设置body样式\r\n    const setBodyOverflow = (value: string) => {\r\n      if (!isClient) {\r\n        return;\r\n      }\r\n\r\n      document.body.style.overflow = value;\r\n    };\r\n\r\n    // 鼠标滚动\r\n    const handleWheel = (event) => {\r\n      // 不设置防止body滚动\r\n      if (!props.bodyOverflow) {\r\n        event.preventDefault();\r\n      }\r\n\r\n      // 显示弹窗\r\n      if (!props.modelValue) {\r\n        return;\r\n      }\r\n\r\n      const { deltaY } = event;\r\n\r\n      // 处理事件\r\n      handleOperation(deltaY < 0 ? 'zoomIn' : 'zoomOut');\r\n    };\r\n\r\n    // 处理事件\r\n    const handleOperation = (\r\n      value:\r\n        | 'zoomIn'\r\n        | 'zoomOut'\r\n        | 'original'\r\n        | 'rotateLeft'\r\n        | 'rotateRight'\r\n        | 'download'\r\n    ) => {\r\n      // 放大\r\n      if (value === 'zoomIn' && data.imageScale < 6) {\r\n        data.imageScale += 0.25;\r\n      }\r\n\r\n      // 缩小\r\n      if (value === 'zoomOut' && data.imageScale > 0.25) {\r\n        data.imageScale -= 0.25;\r\n      }\r\n\r\n      // 按原尺寸显示\r\n      if (value === 'original') {\r\n        data.original = !data.original;\r\n\r\n        data.transition = false;\r\n\r\n        // 重制样式\r\n        resetStyle();\r\n\r\n        setTimeout(() => {\r\n          data.transition = true;\r\n        }, 0);\r\n      }\r\n\r\n      // 左旋转\r\n      if (value === 'rotateLeft') {\r\n        data.imageRotate -= 90;\r\n      }\r\n\r\n      // 右旋转\r\n      if (value === 'rotateRight') {\r\n        data.imageRotate += 90;\r\n      }\r\n\r\n      // 下载\r\n      if (value === 'download') {\r\n        data.downloading = true;\r\n\r\n        downloadFile(props.previewList[data.currentIndex])\r\n          .then(() => {\r\n            data.downloading = false;\r\n          })\r\n          .catch(() => {\r\n            data.downloading = false;\r\n          });\r\n      }\r\n    };\r\n\r\n    // 键盘按下\r\n    const handleKeydown = (event) => {\r\n      // 是否显示弹窗\r\n      if (!props.modelValue) {\r\n        return;\r\n      }\r\n\r\n      const { keyCode } = event;\r\n\r\n      // 左边键盘\r\n      if (keyCode === 37) {\r\n        handleImageSwitch(false);\r\n      }\r\n\r\n      // 右边键盘\r\n      if (keyCode === 39) {\r\n        handleImageSwitch(true);\r\n      }\r\n\r\n      // 上按钮\r\n      if (keyCode === 38) {\r\n        handleOperation('zoomIn');\r\n      }\r\n\r\n      // 下按钮\r\n      if (keyCode === 40) {\r\n        handleOperation('zoomOut');\r\n      }\r\n\r\n      // 空格\r\n      if (keyCode === 32) {\r\n        event.preventDefault();\r\n\r\n        data.original = !data.original;\r\n      }\r\n    };\r\n\r\n    // 键盘松开\r\n    const handleKeyup = (event) => {\r\n      // 是否显示弹窗\r\n      if (!props.modelValue) {\r\n        return;\r\n      }\r\n\r\n      const { keyCode } = event;\r\n\r\n      // 退出健\r\n      if (keyCode === 27) {\r\n        handleClose();\r\n      }\r\n    };\r\n\r\n    // 切换\r\n    const handleImageSwitch = (next: boolean) => {\r\n      // 下一个\r\n      if (next) {\r\n        // 是否是最后一个图片\r\n        if (data.currentIndex + 1 === props.previewList.length) {\r\n          // 是否循环切换\r\n          if (props.infinite) {\r\n            // 重制样式\r\n            resetStyle();\r\n\r\n            data.currentIndex = 0;\r\n          }\r\n        }\r\n        // 下一个\r\n        else {\r\n          // 重制样式\r\n          resetStyle();\r\n\r\n          data.currentIndex += 1;\r\n        }\r\n      }\r\n      // 上一个\r\n      else {\r\n        // 第一个图片\r\n        if (data.currentIndex === 0) {\r\n          // 是否循环切换\r\n          if (props.infinite) {\r\n            // 重制样式\r\n            resetStyle();\r\n\r\n            // 重新设置当前图片\r\n            data.currentIndex = props.previewList.length - 1;\r\n          }\r\n        }\r\n        // 下一个\r\n        else {\r\n          resetStyle();\r\n\r\n          data.currentIndex -= 1;\r\n        }\r\n      }\r\n\r\n      emit('on-switch', {\r\n        currentIndex: data.currentIndex,\r\n      });\r\n    };\r\n\r\n    // watch\r\n\r\n    // 监听弹窗显示\r\n    watch(\r\n      () => props.modelValue,\r\n      (value) => {\r\n        // 显示\r\n        if (value) {\r\n          // 设置当前index\r\n          data.currentIndex = props.initialIndex;\r\n\r\n          // 重制样式\r\n          resetStyle();\r\n\r\n          // 按原尺寸显示\r\n          data.original = false;\r\n\r\n          // 设置防止body滚动\r\n          if (props.bodyOverflow) {\r\n            // 获取body样式\r\n            data.prevOverflow = getBodyOverflow();\r\n\r\n            // 设置body样式\r\n            setBodyOverflow('hidden');\r\n          }\r\n\r\n          // 蒙层zIndex\r\n          data.maskIndex = getMaskIndex();\r\n\r\n          nextTick(() => {\r\n            // 鼠标滚动\r\n            on(wrapper.value, 'wheel', handleWheel);\r\n            // 键盘按下\r\n            on(document, 'keydown', handleKeydown);\r\n            // 键盘松开\r\n            on(document, 'keyup', handleKeyup);\r\n          });\r\n        }\r\n        // 隐藏\r\n        else {\r\n          // 设置防止body滚动\r\n          if (props.bodyOverflow) {\r\n            // 重新设置body样式\r\n            setBodyOverflow(data.prevOverflow);\r\n          }\r\n\r\n          // 鼠标滚动\r\n          off(wrapper.value, 'wheel', handleWheel);\r\n          // 键盘按下\r\n          off(document, 'keydown', handleKeydown);\r\n          // 键盘松开\r\n          off(document, 'keyup', handleKeyup);\r\n        }\r\n      }\r\n    );\r\n\r\n    // 监听当前index变化\r\n    watch(\r\n      () => data.currentIndex,\r\n      () => {\r\n        data.imageStatus = 'loading';\r\n      }\r\n    );\r\n\r\n    return {\r\n      prefixCls,\r\n      // dom\r\n      wrapper,\r\n\r\n      // data\r\n      data,\r\n\r\n      // computed\r\n      maskStyles,\r\n      currentImage,\r\n      imageClasses,\r\n      imageStyles,\r\n\r\n      // methods\r\n      handleClickMask,\r\n      handleImageLoad,\r\n      handleImageError,\r\n      handleMousedown,\r\n      handleImageSwitch,\r\n      handleOperation,\r\n      handleClose,\r\n      handleTouchStart,\r\n      resetStyle,\r\n    };\r\n  },\r\n  components: {\r\n    IvueSpin,\r\n    IvueIcon,\r\n  },\r\n});\r\n</script>\r\n"],"names":["_createElementVNode","_resolveComponent","_openBlock","_createBlock","_Teleport","_createCommentVNode","_createVNode","_Transition","_withCtx","_normalizeClass","_normalizeStyle","_withModifiers"],"mappings":"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"}