{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-carousel-loop/index.vue"],"sourcesContent":["<template>\r\n  <div\r\n    :class=\"prefixCls\"\r\n    @mouseenter=\"handleMouseenter\"\r\n    @mouseleave=\"handleMouseleave\"\r\n  >\r\n    <!-- 按钮 -->\r\n    <template v-if=\"data.showCopyTrack\">\r\n      <ivue-button\r\n        :class=\"leftButtonClasses\"\r\n        flat\r\n        icon\r\n        @click=\"handleArrowClick('left')\"\r\n        v-if=\"!$slots.leftArrow\"\r\n      >\r\n        <ivue-icon>{{ leftArrow }}</ivue-icon>\r\n      </ivue-button>\r\n      <template v-if=\"$slots.leftArrow\">\r\n        <div :class=\"leftButtonClasses\" @click=\"handleArrowClick('left')\">\r\n          <slot name=\"leftArrow\"></slot>\r\n        </div>\r\n      </template>\r\n    </template>\r\n\r\n    <!-- scroll -->\r\n    <div :class=\"`${prefixCls}-scroll`\" ref=\"scroll\">\r\n      <!-- 内容 -->\r\n      <div :class=\"`${prefixCls}-content`\" ref=\"content\">\r\n        <div :class=\"`${prefixCls}-list`\" :style=\"listStyles\" ref=\"list\">\r\n          <slot></slot>\r\n        </div>\r\n        <!-- 复制的内容 -->\r\n        <div\r\n          :class=\"`${prefixCls}-list copy-track`\"\r\n          :style=\"listCopyStyles\"\r\n          v-if=\"data.showCopyTrack\"\r\n        >\r\n          <slot></slot>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- 按钮 -->\r\n    <template v-if=\"data.showCopyTrack\">\r\n      <ivue-button\r\n        :class=\"rightButtonClasses\"\r\n        flat\r\n        icon\r\n        @click=\"handleArrowClick('right')\"\r\n        v-if=\"!$slots.rightArrow\"\r\n      >\r\n        <slot name=\"rightArrow\">\r\n          <ivue-icon>{{ rightArrow }}</ivue-icon>\r\n        </slot>\r\n      </ivue-button>\r\n      <template v-if=\"$slots.rightArrow\">\r\n        <div :class=\"rightButtonClasses\" @click=\"handleArrowClick('right')\">\r\n          <slot name=\"rightArrow\"></slot>\r\n        </div>\r\n      </template>\r\n    </template>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n  defineComponent,\r\n  reactive,\r\n  computed,\r\n  ref,\r\n  nextTick,\r\n  onMounted,\r\n  onUnmounted,\r\n  watch,\r\n} from 'vue';\r\n\r\nimport { oneOf } from '../../utils/assist';\r\n\r\nimport IvueButton from '../ivue-button';\r\nimport IvueIcon from '../ivue-icon';\r\n\r\n// type\r\nimport type { Props, Data } from './types/carousel-loop';\r\n\r\nconst prefixCls = 'ivue-carousel-loop';\r\n\r\nexport default defineComponent({\r\n  name: prefixCls,\r\n  emits: ['on-scroll-end'],\r\n  props: {\r\n    /**\r\n     * 左箭头图标\r\n     *\r\n     * @type {String}\r\n     */\r\n    leftArrow: {\r\n      type: String,\r\n      default: 'keyboard_arrow_left',\r\n    },\r\n    /**\r\n     * 右箭头图标\r\n     *\r\n     * @type {String}\r\n     */\r\n    rightArrow: {\r\n      type: String,\r\n      default: 'keyboard_arrow_right',\r\n    },\r\n    /**\r\n     * 是否自动滚动\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    autoplay: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 自动滚动的时间间隔，单位为毫秒\r\n     *\r\n     * @type {Number}\r\n     */\r\n    interval: {\r\n      type: Number,\r\n      default: 16.7,\r\n    },\r\n    /**\r\n     * 滚动方向\r\n     *\r\n     * @type {String}\r\n     */\r\n    direction: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['left', 'right']);\r\n      },\r\n      default: 'right',\r\n    },\r\n    /**\r\n     * 鼠标悬浮时暂停自动滚动\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    pauseOnHover: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 每一次滚动偏移大小\r\n     *\r\n     * @type {Number}\r\n     */\r\n    offset: {\r\n      type: Number,\r\n      default: 200,\r\n    },\r\n    /**\r\n     * 滑动速率（毫秒）\r\n     *\r\n     * @type {Number}\r\n     */\r\n    slidingSpeed: {\r\n      type: Number,\r\n      default: 5,\r\n    },\r\n    /**\r\n     * 按钮点击是否等待动画完成后才可以下一步\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    slidingEndNext: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 滚动次数\r\n     *\r\n     * @type {Number}\r\n     */\r\n    scrollQuantity: {\r\n      type: Number,\r\n    },\r\n    /**\r\n     * 箭头显示时机\r\n     *\r\n     * @type {String}\r\n     *\r\n     * hover（悬停），always（一直显示），never（不显示）, outside (外部)\r\n     */\r\n    arrow: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['hover', 'always', 'never', 'outside']);\r\n      },\r\n      default: 'always',\r\n    },\r\n    /**\r\n     * 外部数据传入用于监听数据变化更新滚动动画\r\n     *\r\n     * @type {Array}\r\n     */\r\n    dataList: {\r\n      type: Array,\r\n    },\r\n  },\r\n  setup(props: Props, { emit, slots }) {\r\n    // dom\r\n    const scroll = ref<HTMLDivElement>();\r\n    const content = ref<HTMLDivElement>();\r\n    const list = ref<HTMLDivElement>();\r\n\r\n    // data\r\n    const data = reactive<Data>({\r\n      /**\r\n       * setInterval\r\n       *\r\n       * @type  {Function}\r\n       */\r\n      timer: null,\r\n      /**\r\n       * 是否循环显示\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      loop: true,\r\n      /**\r\n       * 显示复制的内容\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      showCopyTrack: false,\r\n      /**\r\n       * 列表宽度\r\n       *\r\n       * @type {Number}\r\n       */\r\n      listWidth: 0,\r\n      /**\r\n       * 内容宽度\r\n       *\r\n       * @type {Number}\r\n       */\r\n      contentWidth: 0,\r\n      /**\r\n       * 列表动画\r\n       *\r\n       * @type {Number}\r\n       */\r\n      listTranslate: 0,\r\n      /**\r\n       * 列表动画开始\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      listTranslateStart: true,\r\n      /**\r\n       * 复制列表动画\r\n       *\r\n       * @type {Number}\r\n       */\r\n      listCopyTranslate: 0,\r\n      /**\r\n       * 复制列表动画开始\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      listCopyTranslateStart: false,\r\n      /**\r\n       * 溢出宽度\r\n       *\r\n       * @type {Number}\r\n       */\r\n      overflowWidth: 0,\r\n      /**\r\n       * 列表滚动完成数量\r\n       *\r\n       * @type {Number}\r\n       */\r\n      scrollDoneQuantity: 0,\r\n      /**\r\n       * 方向\r\n       *\r\n       * @type {String}\r\n       */\r\n      direction: props.direction,\r\n      /**\r\n       * 箭头点击滚动\r\n       *\r\n       * @type {Function}\r\n       */\r\n      arrowInterval: null,\r\n      /**\r\n       * 箭头点击滚动\r\n       *\r\n       * @type {Function}\r\n       */\r\n      arrowSetTimeout: null,\r\n      /**\r\n       * 跨度\r\n       *\r\n       * @type {Number}\r\n       */\r\n      span: -1,\r\n      /**\r\n       * 滑动开始\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      slidingStart: false,\r\n    });\r\n\r\n    // computed\r\n\r\n    // 列表样式\r\n    const listStyles = computed(() => {\r\n      return {\r\n        transform: `translateX(${data.listTranslate}px)`,\r\n      };\r\n    });\r\n\r\n    // 复制列表样式\r\n    const listCopyStyles = computed(() => {\r\n      return {\r\n        transform: `translateX(${data.listCopyTranslate}px)`,\r\n      };\r\n    });\r\n\r\n    // 左按钮\r\n    const leftButtonClasses = computed(() => {\r\n      return [\r\n        `${prefixCls}-arrow left`,\r\n        `${prefixCls}-arrow--${props.arrow}`,\r\n        {\r\n          [`${prefixCls}-arrow--slot`]: slots.leftArrow,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 右按钮\r\n    const rightButtonClasses = computed(() => {\r\n      return [\r\n        `${prefixCls}-arrow right`,\r\n        `${prefixCls}-arrow--${props.arrow}`,\r\n        {\r\n          [`${prefixCls}-arrow--slot`]: slots.leftArrow,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 总宽度\r\n    const overallWidth = computed(() => {\r\n      // 总宽度 = 已经滚动成功次数 > 0 ? 列表宽度 + 父级宽度 : 列表宽度\r\n      let allWidth = 0;\r\n\r\n      // 向左\r\n      if (data.span < 0) {\r\n        allWidth = data.listWidth;\r\n      }\r\n\r\n      // 向右\r\n      if (data.span > 0) {\r\n        allWidth = data.contentWidth;\r\n      }\r\n\r\n      return allWidth;\r\n    });\r\n\r\n    // methods\r\n\r\n    // 初始化数据\r\n    const initData = () => {\r\n      // 可滚动滚动的宽度\r\n      const scrollWidth = scroll.value.scrollWidth;\r\n      // 滚动层宽度\r\n      const offsetWidth = scroll.value.offsetWidth;\r\n\r\n      // 内容宽度\r\n      data.contentWidth = content.value.offsetWidth;\r\n\r\n      // 列表宽度\r\n      data.listWidth = list.value.offsetWidth;\r\n\r\n      // 溢出宽度\r\n      data.overflowWidth = data.listWidth - data.contentWidth;\r\n\r\n      // 初始化列表动画\r\n      data.listTranslate = 0;\r\n\r\n      // 超过长度显示复制的内容\r\n      if (scrollWidth - offsetWidth > 0) {\r\n        data.showCopyTrack = true;\r\n      }\r\n\r\n      // 向左\r\n      if (props.direction === 'left') {\r\n        data.span = -1;\r\n\r\n        data.listCopyTranslate = data.contentWidth;\r\n      }\r\n\r\n      // 向右\r\n      if (props.direction === 'right') {\r\n        data.span = 1;\r\n\r\n        data.listCopyTranslate = -data.listWidth;\r\n      }\r\n\r\n      // 自动滚动\r\n      startTime();\r\n    };\r\n\r\n    // 设置列表动画\r\n    const setListTranslate = () => {\r\n      // 列表动画开始\r\n      if (data.listTranslateStart) {\r\n        // 列表动画 < 总宽度\r\n        data.listTranslate += data.span;\r\n\r\n        // 向左\r\n        if (data.span < 0) {\r\n          // 列表最后一个已展示 -> 重制列表动画位置\r\n          if (data.listTranslate === -data.overflowWidth) {\r\n            // 复制列表动画开始\r\n            data.listCopyTranslateStart = true;\r\n\r\n            // 重制列表动画位置\r\n            data.listCopyTranslate = data.contentWidth;\r\n          }\r\n\r\n          // 最后一个已隐藏 -> 重制列表动画位置\r\n          if (data.listTranslate === -overallWidth.value) {\r\n            // 列表动画结束\r\n            data.listTranslateStart = false;\r\n\r\n            // 重制列表动画位置\r\n            data.listTranslate = data.contentWidth;\r\n\r\n            // 记录滚动次数\r\n            data.scrollDoneQuantity += 1;\r\n          }\r\n        }\r\n\r\n        // 向右\r\n        if (data.span > 0) {\r\n          // 列表开始滚动 === 0 -> 复制列表紧跟 -> 重制复制列表动画位置\r\n          if (data.listTranslate === 0) {\r\n            // 重制复制列表动画位置\r\n            data.listCopyTranslate = -data.listWidth;\r\n          }\r\n\r\n          // 复制列表开始滚动\r\n          if (data.listTranslate > 0) {\r\n            data.listCopyTranslateStart = true;\r\n          }\r\n\r\n          // 第一个已隐藏 -> 重制列表动画位置\r\n          if (data.listTranslate === overallWidth.value) {\r\n            // 列表动画结束\r\n            data.listTranslateStart = false;\r\n\r\n            // 重制列表动画位置\r\n            data.listTranslate = -data.listWidth;\r\n\r\n            // 记录滚动次数\r\n            data.scrollDoneQuantity += 1;\r\n          }\r\n        }\r\n      }\r\n\r\n      // 复制列表动画开始\r\n      if (data.listCopyTranslateStart) {\r\n        // 复制列表动画 < 总宽度\r\n        data.listCopyTranslate += data.span;\r\n\r\n        // 向左\r\n        if (data.span < 0) {\r\n          // 列表最后一个已展示 -> 重制列表动画位置\r\n          if (\r\n            data.listCopyTranslate < 0 &&\r\n            data.listCopyTranslate === -data.overflowWidth\r\n          ) {\r\n            // 列表动画开始\r\n            data.listTranslateStart = true;\r\n\r\n            // 重制列表动画位置\r\n            data.listTranslate = data.contentWidth;\r\n          }\r\n\r\n          // 最后一个已隐藏 -> 重制复制列表动画位置\r\n          if (data.listCopyTranslate === -overallWidth.value) {\r\n            // 列表动画结束\r\n            data.listCopyTranslateStart = false;\r\n\r\n            // 重制复制列表动画位置\r\n            data.listCopyTranslate = data.contentWidth;\r\n\r\n            // 记录滚动次数\r\n            data.scrollDoneQuantity += 1;\r\n          }\r\n        }\r\n\r\n        // 向右\r\n        if (data.span > 0) {\r\n          // 第一个已显示 -> 重制列表动画位置\r\n          if (data.listCopyTranslate === 0) {\r\n            // 重制列表动画位置\r\n            data.listTranslate = -data.listWidth;\r\n\r\n            // 重制列表动画开始\r\n            data.listTranslateStart = true;\r\n          }\r\n\r\n          // 第一个已隐藏 -> 重制复制列表动画位置\r\n          if (data.listCopyTranslate === data.contentWidth) {\r\n            // 列表动画开始\r\n            data.listCopyTranslateStart = false;\r\n\r\n            // 重制复制列表动画位置\r\n            data.listCopyTranslate = -data.listWidth;\r\n\r\n            // 记录滚动次数\r\n            data.scrollDoneQuantity += 1;\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    // 自动滚动\r\n    const startTime = () => {\r\n      // 没有显示复制的内容\r\n      if (!data.showCopyTrack) {\r\n        return;\r\n      }\r\n\r\n      // 达到滚动次数\r\n      if (data.scrollDoneQuantity >= props.scrollQuantity) {\r\n        clearTimer();\r\n\r\n        return;\r\n      }\r\n\r\n      // 自动切换的时间间隔，单位为毫秒 < 0 ｜ 没有开启自动切换 | 已经存在倒计时\r\n      if (props.interval <= 0 || !props.autoplay || data.timer) {\r\n        return;\r\n      }\r\n\r\n      // 可以滚动\r\n      nextTick(() => {\r\n        data.timer = setInterval(() => {\r\n          setListTranslate();\r\n        }, props.interval);\r\n      });\r\n    };\r\n\r\n    // 清除定时器\r\n    const clearTimer = () => {\r\n      if (data.timer) {\r\n        clearInterval(data.timer);\r\n\r\n        data.timer = null;\r\n      }\r\n    };\r\n\r\n    // 清除箭头定时器\r\n    const clearArrowInterval = () => {\r\n      // 清除 setInterval\r\n      if (data.arrowInterval) {\r\n        clearInterval(data.arrowInterval);\r\n        data.arrowInterval = null;\r\n      }\r\n    };\r\n\r\n    // 箭头点击\r\n    const handleArrowClick = (arrow: 'left' | 'right') => {\r\n      // 设置方向\r\n\r\n      // 向左\r\n      if (arrow === 'left') {\r\n        data.span = -1;\r\n\r\n        // 没有进行过滑动 -> 初始化复制列表位置\r\n        if (data.listTranslate === 0) {\r\n          data.listCopyTranslate = data.contentWidth;\r\n        }\r\n      }\r\n\r\n      // 向右\r\n      if (arrow === 'right') {\r\n        data.span = 1;\r\n\r\n        // 没有进行过滑动 -> 初始化复制列表位置\r\n        if (data.listTranslate === 0) {\r\n          data.listCopyTranslate = -data.listWidth;\r\n        }\r\n      }\r\n\r\n      // 是否等待动画完成后才可以下一步\r\n      if (props.slidingEndNext) {\r\n        if (data.slidingStart) {\r\n          return;\r\n        }\r\n\r\n        // 滑动开始\r\n        data.slidingStart = true;\r\n      }\r\n\r\n      // 清除原有计时器\r\n      clearTimer();\r\n      // 清除 setInterval\r\n      clearArrowInterval();\r\n\r\n      // 清除setTimeout\r\n      if (data.arrowSetTimeout) {\r\n        clearTimeout(data.arrowSetTimeout);\r\n        data.arrowSetTimeout = null;\r\n      }\r\n\r\n      // 设置滚动\r\n      data.arrowInterval = setInterval(() => {\r\n        setListTranslate();\r\n      }, props.slidingSpeed);\r\n\r\n      // n秒后停止滚动\r\n      data.arrowSetTimeout = setTimeout(\r\n        () => {\r\n          // 重置滑动开始\r\n          data.slidingStart = false;\r\n\r\n          // 清除 setInterval\r\n          clearArrowInterval();\r\n\r\n          // 没有鼠标悬浮时暂停自动切换\r\n          if (!props.pauseOnHover) {\r\n            // 重新开始自动滚动\r\n            startTime();\r\n          }\r\n        },\r\n        // 几秒后停止 滑动速率 * 每一次滚动偏移大小\r\n        props.slidingSpeed * props.offset\r\n      );\r\n    };\r\n\r\n    // 鼠标进入\r\n    const handleMouseenter = () => {\r\n      // 鼠标悬浮时暂停自动切换\r\n      if (props.pauseOnHover) {\r\n        clearTimer();\r\n      }\r\n    };\r\n\r\n    // 鼠标移开\r\n    const handleMouseleave = () => {\r\n      startTime();\r\n    };\r\n\r\n    // watch\r\n\r\n    // 监听滚动次数\r\n    watch(\r\n      () => data.scrollDoneQuantity,\r\n      (value) => {\r\n        // 达到滚动次数\r\n        if (props.scrollQuantity && value >= props.scrollQuantity) {\r\n          clearTimer();\r\n\r\n          // 滚动完成\r\n          emit('on-scroll-end', data.scrollDoneQuantity);\r\n        }\r\n      }\r\n    );\r\n\r\n    // 监听数据变化\r\n    watch(\r\n      () => props.dataList || slots.default(),\r\n      () => {\r\n        // 清除定时器\r\n        clearTimer();\r\n\r\n        nextTick(() => {\r\n          // 初始化数据\r\n          initData();\r\n        });\r\n      },\r\n      {\r\n        // 深度监听\r\n        deep: true,\r\n      }\r\n    );\r\n\r\n    // 监听是否自动滚动\r\n    watch(\r\n      () => props.autoplay,\r\n      () => {\r\n        // 清除定时器\r\n        clearTimer();\r\n\r\n        nextTick(() => {\r\n          // 初始化数据\r\n          initData();\r\n        });\r\n      }\r\n    );\r\n\r\n    // onMounted\r\n    onMounted(() => {\r\n      // 初始化数据\r\n      initData();\r\n    });\r\n\r\n    // onUnmounted\r\n    onUnmounted(() => {\r\n      // 清除定时器\r\n      clearTimer();\r\n    });\r\n\r\n    return {\r\n      prefixCls,\r\n\r\n      // dom\r\n      scroll,\r\n      content,\r\n      list,\r\n\r\n      // data\r\n      data,\r\n\r\n      // computed\r\n      listStyles,\r\n      listCopyStyles,\r\n      leftButtonClasses,\r\n      rightButtonClasses,\r\n\r\n      // methods\r\n      startTime,\r\n      clearTimer,\r\n      handleArrowClick,\r\n      handleMouseenter,\r\n      handleMouseleave,\r\n    };\r\n  },\r\n  components: {\r\n    IvueButton,\r\n    IvueIcon,\r\n  },\r\n});\r\n</script>\r\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_createCommentVNode","_Fragment","_withCtx","_createVNode","_createElementVNode","_normalizeStyle","_renderSlot"],"mappings":"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"}