{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-carousel/index.vue"],"sourcesContent":["<template>\r\n  <div\r\n    :class=\"wrapperClasses\"\r\n    ref=\"wrapper\"\r\n    @mouseenter.stop=\"handleMouseEnter\"\r\n    @mouseleave.stop=\"handleMouseLeave\"\r\n  >\r\n    <div :class=\"`${prefixCls}-content`\" :style=\"contentStyles\">\r\n      <!-- 左按钮 -->\r\n      <transition v-if=\"arrowDisplay\" name=\"fade\">\r\n        <ivue-button\r\n          :class=\"[`${prefixCls}-arrow left`]\"\r\n          flat\r\n          icon\r\n          @mouseenter=\"handleArrowEnter('left')\"\r\n          @mouseleave=\"handleArrowLeave\"\r\n          @click=\"handleArrowClick(data.activeIndex - 1)\"\r\n          v-show=\"\r\n            (arrow === 'always' || data.hover) && (loop || data.activeIndex > 0)\r\n          \"\r\n        >\r\n          <slot name=\"leftArrow\">\r\n            <ivue-icon>{{ leftArrow }}</ivue-icon>\r\n          </slot>\r\n        </ivue-button>\r\n      </transition>\r\n\r\n      <!-- slot -->\r\n      <slot></slot>\r\n\r\n      <!-- 右按钮 -->\r\n      <transition v-if=\"arrowDisplay\" name=\"fade\">\r\n        <ivue-button\r\n          :class=\"[`${prefixCls}-arrow right`]\"\r\n          flat\r\n          icon\r\n          @mouseenter=\"handleArrowEnter('right')\"\r\n          @mouseleave=\"handleArrowLeave\"\r\n          @click=\"handleArrowClick(data.activeIndex + 1)\"\r\n          v-show=\"\r\n            (arrow === 'always' || data.hover) &&\r\n            (loop || data.activeIndex < data.items.length - 1)\r\n          \"\r\n        >\r\n          <slot name=\"rightArrow\">\r\n            <ivue-icon>{{ rightArrow }}</ivue-icon>\r\n          </slot>\r\n        </ivue-button>\r\n      </transition>\r\n    </div>\r\n    <!-- 导航器 -->\r\n    <ul :class=\"dotsClasses\">\r\n      <li\r\n        v-for=\"(item, index) in data.items\"\r\n        :class=\"[\r\n          `${prefixCls}-dots--dot`,\r\n          {\r\n            [`${prefixCls}-dots--active`]: index === data.activeIndex,\r\n          },\r\n        ]\"\r\n        @mouseenter=\"handleThrottleDotHover(index)\"\r\n        @click.stop=\"handleDotClick(index)\"\r\n        :key=\"index\"\r\n      >\r\n        <button\r\n          type=\"button\"\r\n          :class=\"[\r\n            `${prefixCls}-dots--button`,\r\n            {\r\n              [`${prefixCls}-dots--radius`]: radiusDot,\r\n            },\r\n          ]\"\r\n        >\r\n          <span :class=\"`${prefixCls}-dots--label`\">\r\n            {{ item.props.label }}\r\n          </span>\r\n        </button>\r\n      </li>\r\n    </ul>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n  computed,\r\n  defineComponent,\r\n  onBeforeUnmount,\r\n  onMounted,\r\n  provide,\r\n  reactive,\r\n  ref,\r\n  shallowRef,\r\n  watch,\r\n} from 'vue';\r\nimport { useResizeObserver } from '@vueuse/core';\r\nimport { isString } from '@vue/shared';\r\nimport { throttle } from 'lodash-unified';\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 { CarouselItemContext, Props, Data } from './types/carousel';\r\nimport { CarouselContextKey } from '../ivue-carousel-item/types/carousel-item';\r\n\r\nconst prefixCls = 'ivue-carousel';\r\n\r\nexport default defineComponent({\r\n  name: prefixCls,\r\n  emits: ['on-change'],\r\n  props: {\r\n    /**\r\n     * carousel 的类型\r\n     *\r\n     * @type {String}\r\n     */\r\n    type: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['card']);\r\n      },\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, ['vertical', 'horizontal']);\r\n      },\r\n      default: 'horizontal',\r\n    },\r\n    /**\r\n     * 导航器竖向方向\r\n     *\r\n     * @type {String}\r\n     */\r\n    verticalDotsDirection: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['left', 'right']);\r\n      },\r\n      default: 'left',\r\n    },\r\n    /**\r\n     * carousel 的高度\r\n     *\r\n     * @type {String}\r\n     */\r\n    height: {\r\n      type: String,\r\n    },\r\n    /**\r\n     * 是否循环显示\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    loop: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    /**\r\n     * 初始状态激活的幻灯片的索引，从 0 开始\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 {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 {String}\r\n     *\r\n     * hover（悬停），always（一直显示），never（不显示）\r\n     */\r\n    arrow: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['hover', 'always', 'never']);\r\n      },\r\n      default: 'always',\r\n    },\r\n    /**\r\n     * 指示器的位置，可选值为 inside （内部），outside（外部），none（不显示）\r\n     *\r\n     * @type {String}\r\n     */\r\n    dots: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['inside', 'outside', 'none']);\r\n      },\r\n      default: 'inside',\r\n    },\r\n    /**\r\n     * 是否显示圆形指示器\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    radiusDot: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    /**\r\n     * 节流时间 (作用于 prev,next,handleArrowClick 方法 )\r\n     *\r\n     * @type {Number}\r\n     */\r\n    throttleTime: {\r\n      type: Number,\r\n      default: 300,\r\n    },\r\n    /**\r\n     * 指示器的触发方式\r\n     *\r\n     * @type {String}\r\n     */\r\n    trigger: {\r\n      type: String,\r\n      validator(value: string) {\r\n        return oneOf(value, ['hover', 'click']);\r\n      },\r\n      default: 'click',\r\n    },\r\n    /**\r\n     * 是否自动切换\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    autoplay: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    /**\r\n     * 自动切换的时间间隔，单位为毫秒\r\n     *\r\n     * @type {Number}\r\n     */\r\n    interval: {\r\n      type: Number,\r\n      default: 3000,\r\n    },\r\n    /**\r\n     * 鼠标悬浮时暂停自动切换\r\n     *\r\n     * @type {Boolean}\r\n     */\r\n    pauseOnHover: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    /**\r\n     * 卡片缩放大小\r\n     *\r\n     * @type {Number}\r\n     */\r\n    cardScale: {\r\n      type: Number,\r\n      default: 0.83,\r\n    },\r\n  },\r\n  setup(props: Props, { emit }) {\r\n    // dom\r\n\r\n    // wrapper\r\n    const wrapper = ref<HTMLDivElement>();\r\n\r\n    // data\r\n    const data = reactive<Data>({\r\n      /**\r\n       * 选项数量\r\n       *\r\n       * @type {Array}\r\n       */\r\n      items: [],\r\n      /**\r\n       * 激活的选项\r\n       *\r\n       * @type {Number}\r\n       */\r\n      activeIndex: -1,\r\n      /**\r\n       * 鼠标进入\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      hover: false,\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 {Number}\r\n       */\r\n      contentHeight: 0,\r\n      /**\r\n       * 是否初始化完毕\r\n       *\r\n       * @type {Boolean}\r\n       */\r\n      init: false,\r\n    });\r\n\r\n    // computed\r\n\r\n    // 外层样式\r\n    const wrapperClasses = computed(() => {\r\n      return [\r\n        prefixCls,\r\n        {\r\n          // 展示的方向\r\n          [`${prefixCls}-${props.direction}`]: true,\r\n          // 卡片类型\r\n          [`${prefixCls}-card`]: isCardType.value,\r\n          // 没有初始化完成\r\n          [`${prefixCls}-no-init`]: !data.init,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 内容样式\r\n    const contentStyles = computed(() => {\r\n      // 自定义高度\r\n      if (props.height !== 'auto') {\r\n        return {\r\n          height: props.height,\r\n        };\r\n      }\r\n\r\n      // 高度auto\r\n      return {\r\n        height: `${data.contentHeight}px`,\r\n        overflow: 'hidden',\r\n      };\r\n    });\r\n\r\n    // 是否是垂直\r\n    const isVertical = computed(() => {\r\n      return props.direction === 'vertical';\r\n    });\r\n\r\n    // 是否是卡片类型\r\n    const isCardType = computed(() => {\r\n      return props.type === 'card';\r\n    });\r\n\r\n    // 按钮禁用\r\n    const arrowDisplay = computed(() => {\r\n      return props.arrow !== 'never' && !isVertical.value;\r\n    });\r\n\r\n    // dots 样式\r\n    const dotsClasses = computed(() => {\r\n      return [\r\n        `${prefixCls}-dots`,\r\n        // 指示器的位置\r\n        `${prefixCls}-dots--${props.dots}`,\r\n        {\r\n          // 指示器文字\r\n          [`${prefixCls}-dots--labels`]: hasLabel.value,\r\n          // 指示器竖向\r\n          [`${prefixCls}-dots--vertical`]: isVertical.value,\r\n          // 指示器竖向时方向位置\r\n          [`${prefixCls}-dots--${props.verticalDotsDirection}`]:\r\n            isVertical.value,\r\n          // 卡片类型指示器使用 outside\r\n          [`${prefixCls}-dots--outside`]: isCardType.value && !isVertical.value,\r\n        },\r\n      ];\r\n    });\r\n\r\n    // 该幻灯片所对应指示器的文本\r\n    const hasLabel = computed(() => {\r\n      return data.items.some((item) => item.props.label.toString().length > 0);\r\n    });\r\n\r\n    // methods\r\n\r\n    // 激活选项\r\n    const setActiveItem = (index: number | string) => {\r\n      // index 是 字符串\r\n      if (isString(index)) {\r\n        // 通过幻灯片的名字查找下标\r\n        const filteredItems = data.items.filter(\r\n          (item) => item.props.name === index\r\n        );\r\n\r\n        // 过滤选项获取对应的index\r\n        if (filteredItems.length > 0) {\r\n          index = data.items.indexOf(filteredItems[0]);\r\n        }\r\n      }\r\n\r\n      // index\r\n      index = Number(index);\r\n\r\n      // 是否是整数\r\n      if (Number.isNaN(index) || index !== Math.floor(index)) {\r\n        // eslint-disable-next-line no-console\r\n        console.warn('index must be integer');\r\n\r\n        return;\r\n      }\r\n\r\n      // 选项长度\r\n      const itemsLength = data.items.length;\r\n\r\n      // 之前激活的下标\r\n      const oldIndex = data.activeIndex;\r\n\r\n      // 指向最后一个下标\r\n      if (index < 0) {\r\n        data.activeIndex = props.loop ? itemsLength - 1 : 0;\r\n      }\r\n      // 指向最后一个\r\n      else if (index >= itemsLength) {\r\n        data.activeIndex = props.loop ? 0 : itemsLength - 1;\r\n      }\r\n      // 其他\r\n      else {\r\n        data.activeIndex = index;\r\n      }\r\n\r\n      // 上一个下标 === 当前激活的下标\r\n      if (oldIndex === data.activeIndex) {\r\n        // 重置选项位置\r\n        resetItemPosition(oldIndex);\r\n      }\r\n\r\n      // 重置倒计时\r\n      resetTimer();\r\n    };\r\n\r\n    // 添加选项\r\n    const addItem = (item: CarouselItemContext) => {\r\n      data.items.push(item);\r\n    };\r\n\r\n    // 删除选项\r\n    const removeItem = (uid?: number) => {\r\n      const index = data.items.findIndex((item) => item.uid === uid);\r\n\r\n      // 删除\r\n      if (index !== -1) {\r\n        data.items.splice(index, 1);\r\n\r\n        // 设置下一个激活选项\r\n        if (data.activeIndex === index) {\r\n          next();\r\n        }\r\n      }\r\n    };\r\n\r\n    // 激活上一个选项\r\n    const prev = throttle(\r\n      () => {\r\n        setActiveItem(data.activeIndex - 1);\r\n      },\r\n      props.throttleTime,\r\n      { trailing: true }\r\n    );\r\n\r\n    // 激活下一个选项\r\n    const next = throttle(\r\n      () => {\r\n        setActiveItem(data.activeIndex + 1);\r\n      },\r\n      props.throttleTime,\r\n      { trailing: true }\r\n    );\r\n\r\n    // 重置选项位置\r\n    const resetItemPosition = (oldIndex?: number) => {\r\n      data.items.forEach((item, index) => {\r\n        // 移动选项\r\n        item.translateItem(index, data.activeIndex, oldIndex);\r\n      });\r\n    };\r\n\r\n    // 按钮点击\r\n    const handleArrowClick = throttle(\r\n      (index: number) => {\r\n        setActiveItem(index);\r\n      },\r\n      props.throttleTime,\r\n      { trailing: true }\r\n    );\r\n\r\n    // 开始自动切换\r\n    const startTimer = () => {\r\n      // 自动切换的时间间隔，单位为毫秒 < 0 ｜ 没有开启自动切换 | 已经存在倒计时\r\n      if (props.interval <= 0 || !props.autoplay || data.timer) {\r\n        return;\r\n      }\r\n\r\n      data.timer = setInterval(() => {\r\n        // 激活的选项 < 选项数量\r\n        if (data.activeIndex < data.items.length - 1) {\r\n          data.activeIndex += 1;\r\n        }\r\n        // 开启循环\r\n        else if (props.loop) {\r\n          data.activeIndex = 0;\r\n        }\r\n      }, props.interval);\r\n    };\r\n\r\n    // 停止自动切换\r\n    const pauseTimer = () => {\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    // 监听缩放->浅拷贝 useResizeObserver\r\n    const resizeObserver = shallowRef<ReturnType<typeof useResizeObserver>>();\r\n\r\n    // 鼠标进入\r\n    const handleMouseEnter = () => {\r\n      data.hover = true;\r\n\r\n      // 鼠标悬浮时暂停自动切换\r\n      if (props.pauseOnHover) {\r\n        pauseTimer();\r\n      }\r\n    };\r\n\r\n    // 鼠标离开\r\n    const handleMouseLeave = () => {\r\n      data.hover = false;\r\n\r\n      startTimer();\r\n    };\r\n\r\n    // 点击导航器\r\n    const handleDotClick = (index: number) => {\r\n      data.activeIndex = index;\r\n    };\r\n\r\n    // 导航器hover\r\n    const handleDotHover = (index: number) => {\r\n      if (props.trigger === 'hover' && index !== data.activeIndex) {\r\n        data.activeIndex = index;\r\n      }\r\n    };\r\n\r\n    // 导航器hover\r\n    const handleThrottleDotHover = throttle((index: number) => {\r\n      handleDotHover(index);\r\n    }, props.throttleTime);\r\n\r\n    // 设置内容高度\r\n    const setContentHeight = (height: number) => {\r\n      if (props.height !== 'auto') {\r\n        return;\r\n      }\r\n\r\n      data.contentHeight = height;\r\n    };\r\n\r\n    // 按钮鼠标进入\r\n    const handleArrowEnter = (arrow: 'left' | 'right') => {\r\n      // 是否是垂直\r\n      if (isVertical.value) {\r\n        return;\r\n      }\r\n\r\n      data.items.forEach((item, index) => {\r\n        // 设置卡片hover\r\n        if (arrow === itemInStage(item, index)) {\r\n          item.states.hover = true;\r\n        }\r\n      });\r\n    };\r\n\r\n    // 按钮鼠标离开\r\n    const handleArrowLeave = () => {\r\n      // 是否是垂直\r\n      if (isVertical.value) {\r\n        return;\r\n      }\r\n\r\n      // 取消选项的hover\r\n      data.items.forEach((item) => {\r\n        item.states.hover = false;\r\n      });\r\n    };\r\n\r\n    // 选项是否可以点击下一个\r\n    const itemInStage = (item: CarouselItemContext, index: number) => {\r\n      const items = [...data.items];\r\n      const itemLength = items.length;\r\n\r\n      // 没有选项 || 没有下一个\r\n      if (itemLength === 0 || !item.states.inStage) {\r\n        return false;\r\n      }\r\n\r\n      // 上一个选项的index\r\n      const prevItemIndex = index - 1;\r\n      // 下一个选项的index\r\n      const nextItemIndex = index + 1;\r\n      // 最后一个选项的index\r\n      const lastItemIndex = itemLength - 1;\r\n\r\n      // 最后一个选项激活\r\n      const isLastItemActive = items[lastItemIndex].states.active;\r\n      // 第一个选项激活\r\n      const isFirstItemActive = items[0].states.active;\r\n      // 上一个选项激活\r\n      const isPrevItemActive = items[prevItemIndex]?.states?.active;\r\n      // 下一个选项激活\r\n      const isNextItemActive = items[nextItemIndex]?.states?.active;\r\n\r\n      // 当前选项 === 最后一个选项 && 第一个选项激活 || 下一个选项激活 -> 选择的是左边\r\n      if ((index === lastItemIndex && isFirstItemActive) || isNextItemActive) {\r\n        return 'left';\r\n      }\r\n      // index === 0 && 最后一个选项激活 || 上一个选项激活 -> 选择的是右边\r\n      else if ((index === 0 && isLastItemActive) || isPrevItemActive) {\r\n        return 'right';\r\n      }\r\n\r\n      return false;\r\n    };\r\n\r\n    // 重置倒计时\r\n    const resetTimer = () => {\r\n      pauseTimer();\r\n      startTimer();\r\n    };\r\n\r\n    // provide\r\n    provide(CarouselContextKey, {\r\n      // dom\r\n      wrapper,\r\n\r\n      // data\r\n      items: ref(data.items),\r\n      loop: props.loop,\r\n      cardScale: props.cardScale,\r\n\r\n      // computed\r\n      // 是否是垂直\r\n      isVertical,\r\n      // 是否是卡片类型\r\n      isCardType,\r\n\r\n      // methods\r\n      // 添加选项\r\n      addItem,\r\n      // 删除选项\r\n      removeItem,\r\n      // 设置内容高度\r\n      setContentHeight,\r\n      // 激活选项\r\n      setActiveItem,\r\n    });\r\n\r\n    // watch\r\n\r\n    // 监听激活的选项\r\n    watch(\r\n      () => data.activeIndex,\r\n      (current, prev) => {\r\n        // 重置选项位置\r\n        resetItemPosition(prev);\r\n\r\n        // 改变了\r\n        if (prev > -1) {\r\n          emit('on-change', current, prev);\r\n        }\r\n      }\r\n    );\r\n\r\n    // 监听是否自动切换\r\n    watch(\r\n      () => props.autoplay,\r\n      (value) => {\r\n        value ? startTimer() : pauseTimer();\r\n      }\r\n    );\r\n\r\n    // 监听是否循环显示\r\n    watch(\r\n      () => props.loop,\r\n      () => {\r\n        setActiveItem(data.activeIndex);\r\n      }\r\n    );\r\n\r\n    // 监听自动切换的时间间隔，单位为毫秒\r\n    watch(\r\n      () => props.interval,\r\n      () => {\r\n        resetTimer();\r\n      }\r\n    );\r\n\r\n    // onMounted\r\n    onMounted(() => {\r\n      resizeObserver.value = useResizeObserver(wrapper.value, () => {\r\n        // 重置选项位置\r\n        resetItemPosition();\r\n      });\r\n\r\n      // 设置激活的选项\r\n      if (props.initialIndex < data.items.length && props.initialIndex >= 0) {\r\n        data.activeIndex = props.initialIndex;\r\n      }\r\n\r\n      // 开始自动切换\r\n      startTimer();\r\n\r\n      // 已经完成初始化\r\n      setTimeout(() => {\r\n        data.init = true;\r\n      });\r\n    });\r\n\r\n    // onBeforeUnmount\r\n    onBeforeUnmount(() => {\r\n      // 停止监听缩放\r\n      if (wrapper.value && resizeObserver.value) {\r\n        resizeObserver.value.stop();\r\n      }\r\n    });\r\n\r\n    return {\r\n      prefixCls,\r\n\r\n      // dom\r\n      wrapper,\r\n\r\n      // data\r\n      data,\r\n\r\n      // computed\r\n      wrapperClasses,\r\n      arrowDisplay,\r\n      dotsClasses,\r\n      contentStyles,\r\n\r\n      // methods\r\n      handleMouseEnter,\r\n      handleMouseLeave,\r\n      handleArrowClick,\r\n      handleDotClick,\r\n      handleThrottleDotHover,\r\n      handleArrowEnter,\r\n      handleArrowLeave,\r\n      setActiveItem,\r\n      prev,\r\n      next,\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","_withModifiers","_normalizeStyle","_createCommentVNode","_createBlock","_Transition","_withCtx","_withDirectives","_createVNode","_renderSlot","_vShow","_createElementVNode","_Fragment","_renderList"],"mappings":"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"}