{"version":3,"file":"carousel.vue2.mjs","sources":["../../../components/carousel/carousel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport { computed, onMounted, provide, reactive, ref, toRef, watch } from 'vue'\n\nimport { emitEvent, useHoverDelay, useIcons, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useHover, useRtl, useSetTimeout } from '@vexip-ui/hooks'\nimport { debounceMinor } from '@vexip-ui/utils'\nimport { carouselProps } from './props'\nimport { CAROUSEL_STATE } from './symbol'\n\nimport type { CarouselSlots, CarouselState, ItemState } from './symbol'\n\ndefineOptions({ name: 'Carousel' })\n\nconst _props = defineProps(carouselProps)\nconst props = useProps('carousel', _props, {\n  active: {\n    default: 0,\n    static: true\n  },\n  viewSize: {\n    default: 3,\n    validator: value => value > 0\n  },\n  vertical: false,\n  disabled: false,\n  loop: false,\n  arrow: {\n    default: 'outside',\n    validator: value => ['outside', 'inside', 'none'].includes(value)\n  },\n  arrowTrigger: {\n    default: 'hover',\n    validator: value => ['hover', 'always'].includes(value)\n  },\n  autoplay: {\n    default: false,\n    validator: value => (typeof value === 'number' ? value > 500 : true)\n  },\n  pointer: {\n    default: 'none',\n    validator: value => ['outside', 'inside', 'none'].includes(value)\n  },\n  speed: 300,\n  activeOffset: 0,\n  height: null,\n  ignoreHover: false,\n  slots: () => ({})\n})\n\nconst emit = defineEmits(['update:active'])\n\ndefineSlots<CarouselSlots>()\n\nconst nh = useNameHelper('carousel')\nconst icons = useIcons()\nconst hoverDelay = useHoverDelay()\nconst { isRtl } = useRtl()\nconst itemStates = ref(new Set<ItemState>())\nconst currentActive = ref(0)\nconst isLocked = ref(false) // 用于控制阻断快速连点\nconst arrowActive = ref(props.arrowTrigger === 'always')\n\nconst listRect = reactive({\n  width: 0,\n  height: 0\n})\nconst trackRect = reactive({\n  width: 0,\n  height: 0,\n  offset: 0\n})\nconst itemRect = reactive({\n  width: 0,\n  height: 0\n})\n\nconst { wrapper, isHover } = useHover()\n\nconst prev = ref<HTMLElement>()\nconst next = ref<HTMLElement>()\n\nconst isDisabled = computed(() => {\n  return props.disabled || itemStates.value.size <= props.viewSize\n})\nconst className = computed(() => {\n  return {\n    [nh.b()]: true,\n    [nh.bs('vars')]: true,\n    [nh.bm('inherit')]: props.inherit,\n    [nh.bm('vertical')]: props.vertical,\n    [nh.bm('disabled')]: isDisabled.value\n  }\n})\nconst style = computed(() => {\n  return {\n    height:\n      props.vertical && props.height\n        ? `${props.height}${typeof props.height === 'number' ? 'px' : ''}`\n        : undefined\n  }\n})\nconst listStyle = computed(() => {\n  return {\n    width: listRect.width ? `${listRect.width}px` : undefined,\n    height: listRect.height ? `${listRect.height}px` : undefined\n  }\n})\nconst trackStyle = computed(() => {\n  return {\n    width: trackRect.width ? `${trackRect.width}px` : undefined,\n    height: trackRect.height ? `${trackRect.height}px` : undefined,\n    transform: trackRect.offset\n      ? `translate${props.vertical ? 'Y' : 'X'}(${\n          isRtl.value && !props.vertical ? `${-trackRect.offset}` : trackRect.offset\n        }px) translateZ(0)`\n      : undefined,\n    transitionDuration: isLocked.value ? '0ms' : `${props.speed}ms`\n  }\n})\nconst disabledPrev = computed(() => {\n  return isDisabled.value || (!props.loop && currentActive.value <= 0)\n})\nconst disabledNext = computed(() => {\n  return (\n    isDisabled.value ||\n    (!props.loop && currentActive.value >= itemStates.value.size - props.viewSize)\n  )\n})\nconst arrowIcons = computed(() => {\n  return props.vertical\n    ? [icons.value.angleUp, icons.value.angleDown]\n    : isRtl.value\n      ? [icons.value.angleRight, icons.value.angleLeft]\n      : [icons.value.angleLeft, icons.value.angleRight]\n})\n\nwatch(\n  () => props.active,\n  value => {\n    handleWheel(value - props.activeOffset)\n  }\n)\nwatch(isHover, value => {\n  if (props.ignoreHover) return\n\n  if (value) {\n    handleMouseEnter()\n  } else {\n    handleMouseLeave()\n  }\n})\nwatch(() => props.viewSize, refresh)\nwatch(() => props.autoplay, setAutoplay)\n\nconst refreshLabels = debounceMinor(() => {\n  Array.from(itemStates.value).forEach((item, index) => {\n    item.label = index\n  })\n})\nconst updateItemRect = debounceMinor(() => {\n  itemStates.value.forEach(state => {\n    state.width = itemRect.width\n    state.height = itemRect.height\n  })\n})\nconst updateListRect = debounceMinor(() => {\n  trackRect.width = itemRect.width * itemStates.value.size\n  trackRect.height = itemRect.height * itemStates.value.size\n})\n\nprovide<CarouselState>(\n  CAROUSEL_STATE,\n  reactive({\n    vertical: toRef(props, 'vertical'),\n    increaseItem,\n    decreaseItem,\n    isItemActive,\n    handleSelect\n  })\n)\n\n// 初始化时不使用过渡效果\nlet inTransition = false\nlet shouldReset = false\n\nisLocked.value = true\n\nonMounted(() => {\n  computeItemRect()\n  handleWheel(props.active - props.activeOffset)\n  handleAfterMove()\n\n  setTimeout(() => {\n    isLocked.value = false\n    inTransition = false\n\n    setAutoplay()\n  }, 0)\n})\n\ndefineExpose({\n  itemStates,\n  currentActive,\n  arrowActive,\n  wrapper,\n  prev,\n  next,\n  refresh\n})\n\nfunction increaseItem(item: ItemState) {\n  itemStates.value.add(item)\n  refreshLabels()\n  updateItemRect()\n  updateListRect()\n}\n\nfunction decreaseItem(item: ItemState) {\n  itemStates.value.delete(item)\n  refreshLabels()\n  updateListRect()\n}\n\nfunction isItemActive(label: number) {\n  return (currentActive.value + props.activeOffset) % itemStates.value.size === label\n}\n\nfunction computeItemRect() {\n  if (!wrapper.value) return\n\n  let prevFix = 0\n  let nextFix = 0\n\n  if (props.arrow === 'outside') {\n    if (props.vertical) {\n      prevFix = prev.value ? prev.value.offsetHeight : 0\n      nextFix = next.value ? next.value.offsetHeight : 0\n    } else {\n      prevFix = prev.value ? prev.value.offsetWidth : 0\n      nextFix = next.value ? next.value.offsetWidth : 0\n    }\n  }\n\n  if (props.vertical) {\n    listRect.width = 0\n    listRect.height = wrapper.value.offsetHeight - prevFix - nextFix\n\n    itemRect.width = 0\n    itemRect.height = listRect.height / props.viewSize\n  } else {\n    listRect.width = wrapper.value.offsetWidth - prevFix - nextFix\n    listRect.height = 0\n\n    itemRect.width = listRect.width / props.viewSize\n    itemRect.height = 0\n  }\n}\n\nfunction refresh() {\n  computeItemRect()\n  updateItemRect()\n  updateListRect()\n\n  if (trackRect.offset > 0) {\n    handlePrev(0)\n  } else {\n    handleNext(0)\n  }\n\n  setTimeout(() => {\n    isLocked.value = false\n    inTransition = false\n  }, 0)\n}\n\nfunction emitChangeEvent() {\n  const active = (currentActive.value + props.activeOffset) % itemStates.value.size\n\n  emit('update:active', active)\n  emitEvent(props.onChange, active)\n}\n\nfunction handlePrev(amount = 1) {\n  if (isDisabled.value || inTransition) return\n\n  const itemLength = props.vertical ? itemRect.height : itemRect.width\n  const itemList = Array.from(itemStates.value)\n  const itemCount = itemList.length\n  const targetIndex = (currentActive.value - amount + itemCount) % itemCount\n  const prevActive = currentActive.value\n\n  if (targetIndex >= itemCount - props.viewSize) {\n    if (!props.loop) return\n\n    if (trackRect.offset < 0) {\n      if (amount < currentActive.value) {\n        trackRect.offset = -targetIndex * itemLength\n      } else {\n        trackRect.offset = itemLength * (itemCount - targetIndex)\n\n        for (let i = targetIndex; i < itemCount; ++i) {\n          itemList[i].offset = -itemCount * itemLength\n        }\n      }\n    } else {\n      for (let i = 0; i < itemCount; ++i) {\n        itemList[i].offset =\n          i < targetIndex\n            ? 0\n            : (isRtl.value && !props.vertical ? itemCount : -itemCount) * itemLength\n      }\n\n      trackRect.offset = itemLength * (itemCount - targetIndex)\n    }\n\n    currentActive.value = targetIndex\n  } else {\n    currentActive.value = targetIndex\n    trackRect.offset = -currentActive.value * itemLength\n  }\n\n  shouldReset = currentActive.value <= itemCount - props.viewSize\n  inTransition = true\n\n  currentActive.value !== prevActive && emitChangeEvent()\n}\n\nfunction handleNext(amount = 1) {\n  if (isDisabled.value || inTransition) return\n\n  const itemLength = props.vertical ? itemRect.height : itemRect.width\n  const itemList = Array.from(itemStates.value)\n  const itemCount = itemList.length\n  const targetIndex = currentActive.value + amount\n  const prevActive = currentActive.value\n\n  if (targetIndex > itemStates.value.size - props.viewSize) {\n    if (!props.loop) return\n\n    if (trackRect.offset > 0) {\n      trackRect.offset = itemLength * (itemCount - targetIndex)\n    } else {\n      const anchorIndex = targetIndex + props.viewSize - itemCount\n\n      for (let i = 0, len = itemList.length; i < len; ++i) {\n        itemList[i].offset =\n          i < anchorIndex\n            ? (isRtl.value && !props.vertical ? -itemCount : itemCount) * itemLength\n            : 0\n      }\n\n      trackRect.offset = -targetIndex * itemLength\n    }\n\n    currentActive.value = targetIndex % itemCount\n  } else {\n    currentActive.value = targetIndex\n    trackRect.offset = -currentActive.value * itemLength\n  }\n\n  shouldReset = currentActive.value <= itemCount - props.viewSize\n  inTransition = true\n\n  currentActive.value !== prevActive && emitChangeEvent()\n}\n\nfunction handleWheel(active: number) {\n  if (isDisabled.value || inTransition || active === currentActive.value) return\n\n  const itemCount = itemStates.value.size\n\n  active = (active % itemCount) + (active < 0 ? itemCount : 0)\n\n  if (props.loop) {\n    let forward: number\n    let back: number\n\n    if (active > currentActive.value) {\n      forward = active - currentActive.value\n      back = itemCount - active + currentActive.value\n    } else {\n      forward = itemCount - currentActive.value + active\n      back = currentActive.value - active\n    }\n\n    if (forward < back) {\n      handleNext(forward)\n    } else if (forward > back) {\n      handlePrev(back)\n    } else {\n      if (trackRect.offset > 0) {\n        handlePrev(forward)\n      } else {\n        handleNext(forward)\n      }\n    }\n  } else {\n    if (active < currentActive.value) {\n      handlePrev(currentActive.value - active)\n    } else {\n      handleNext(active - currentActive.value)\n    }\n  }\n}\n\nfunction handleAfterMove() {\n  if (!shouldReset) {\n    inTransition = false\n  } else {\n    itemStates.value.forEach(state => {\n      state.offset = 0\n    })\n\n    shouldReset = false\n    isLocked.value = true\n\n    requestAnimationFrame(() => {\n      trackRect.offset = -currentActive.value * (props.vertical ? itemRect.height : itemRect.width)\n\n      requestAnimationFrame(() => {\n        isLocked.value = false\n        inTransition = false\n      })\n    })\n  }\n}\n\nfunction handlePrevClick() {\n  handlePrev(1)\n  emitEvent(props.onPrev, (currentActive.value + props.activeOffset) % itemStates.value.size)\n}\n\nfunction handleNextClick() {\n  handleNext(1)\n  emitEvent(props.onNext, (currentActive.value + props.activeOffset) % itemStates.value.size)\n}\n\nfunction handleSelect(label: number) {\n  emitEvent(props.onSelect, label)\n}\n\nconst { timer } = useSetTimeout()\n\nfunction setAutoplay() {\n  clearInterval(timer.play)\n\n  if (!props.autoplay) return\n\n  let waiting = 4000\n\n  if (typeof props.autoplay === 'number') {\n    waiting = props.autoplay\n  }\n\n  timer.play = window.setInterval(() => {\n    if (!props.loop && disabledNext.value) {\n      handleWheel(0)\n    } else {\n      handleNext()\n    }\n  }, waiting)\n}\n\nfunction handleMouseEnter() {\n  if (props.autoplay) {\n    clearTimeout(timer.hover)\n\n    timer.hover = setTimeout(() => {\n      clearInterval(timer.play)\n    }, hoverDelay.value)\n  }\n\n  if (props.arrowTrigger === 'hover' && props.arrow === 'inside') {\n    arrowActive.value = true\n  }\n}\n\nfunction handleMouseLeave() {\n  if (props.autoplay) {\n    clearTimeout(timer.hover)\n\n    timer.hover = setTimeout(() => {\n      setAutoplay()\n    }, hoverDelay.value)\n  }\n\n  if (props.arrowTrigger === 'hover') {\n    arrowActive.value = false\n  }\n}\n\nfunction isPointerDisabled(index: number) {\n  if (props.loop) return false\n\n  return !(\n    index >= props.activeOffset - 1 && index < itemStates.value.size - props.activeOffset - 1\n  )\n}\n</script>\n\n<template>\n  <div\n    ref=\"wrapper\"\n    :class=\"className\"\n    role=\"list\"\n    :style=\"style\"\n  >\n    <ResizeObserver @resize=\"refresh\">\n      <div\n        :style=\"{\n          position: 'relative',\n          display: 'flex',\n          flexDirection: props.vertical ? 'column' : 'row',\n          width: '100%'\n        }\"\n      >\n        <div\n          v-if=\"props.arrow !== 'none'\"\n          ref=\"prev\"\n          :class=\"[\n            nh.bem('arrow', props.arrow),\n            nh.bem('arrow', 'prev'),\n            arrowActive ? nh.bem('arrow', 'show') : ''\n          ]\"\n        >\n          <div\n            :class=\"{\n              [nh.be('handler')]: true,\n              [nh.bem('handler', 'disabled')]: disabledPrev\n            }\"\n            @click=\"handlePrevClick\"\n          >\n            <slot name=\"prevArrow\" :disabled=\"disabledPrev\">\n              <Renderer :renderer=\"props.slots.prevArrow\" :data=\"{ disabled: disabledPrev }\">\n                <Icon v-bind=\"arrowIcons[0]\" :scale=\"+(arrowIcons[0].scale || 1) * 1.5\"></Icon>\n              </Renderer>\n            </slot>\n          </div>\n        </div>\n        <div :class=\"nh.be('list')\" :style=\"listStyle\">\n          <div :class=\"nh.be('track')\" :style=\"trackStyle\" @transitionend.self=\"handleAfterMove\">\n            <slot> <Renderer :renderer=\"props.slots.default\"></Renderer>> </slot>\n          </div>\n        </div>\n        <div\n          v-if=\"props.arrow !== 'none'\"\n          ref=\"next\"\n          :class=\"[\n            nh.bem('arrow', props.arrow),\n            nh.bem('arrow', 'next'),\n            arrowActive ? nh.bem('arrow', 'show') : ''\n          ]\"\n        >\n          <div\n            :class=\"{\n              [nh.be('handler')]: true,\n              [nh.bem('handler', 'disabled')]: disabledNext\n            }\"\n            @click=\"handleNextClick\"\n          >\n            <slot name=\"nextArrow\" :disabled=\"disabledNext\">\n              <Renderer :renderer=\"props.slots.nextArrow\" :data=\"{ disabled: disabledNext }\">\n                <Icon v-bind=\"arrowIcons[1]\" :scale=\"+(arrowIcons[1].scale || 1) * 1.5\"></Icon>\n              </Renderer>\n            </slot>\n          </div>\n        </div>\n      </div>\n    </ResizeObserver>\n    <div v-if=\"props.pointer !== 'none'\" :class=\"nh.bem('pointers', props.pointer)\">\n      <div\n        v-for=\"index in itemStates.size\"\n        :key=\"index\"\n        :class=\"{\n          [nh.be('pointer')]: true,\n          [nh.bem('pointer', 'active')]:\n            index - 1 === (currentActive + props.activeOffset) % itemStates.size,\n          [nh.bem('pointer', 'disabled')]: isPointerDisabled(index - props.activeOffset - 1)\n        }\"\n        @click=\"handleWheel(index - props.activeOffset - 1)\"\n      >\n        <slot\n          name=\"pointer\"\n          :active=\"index - 1 === (currentActive + props.activeOffset) % itemStates.size\"\n        >\n          <Renderer\n            :renderer=\"props.slots.pointer\"\n            :data=\"{ active: index - 1 === (currentActive + props.activeOffset) % itemStates.size }\"\n          >\n            <span :class=\"nh.be('pointer-inner')\"></span>\n          </Renderer>\n        </slot>\n      </div>\n    </div>\n  </div>\n</template>\n"],"names":["props","useProps","__props","value","emit","__emit","nh","useNameHelper","icons","useIcons","hoverDelay","useHoverDelay","isRtl","useRtl","itemStates","ref","currentActive","isLocked","arrowActive","listRect","reactive","trackRect","itemRect","wrapper","isHover","useHover","prev","next","isDisabled","computed","className","style","listStyle","trackStyle","disabledPrev","disabledNext","arrowIcons","watch","handleWheel","handleMouseEnter","handleMouseLeave","refresh","setAutoplay","refreshLabels","debounceMinor","item","index","updateItemRect","state","updateListRect","provide","CAROUSEL_STATE","toRef","increaseItem","decreaseItem","isItemActive","handleSelect","inTransition","shouldReset","onMounted","computeItemRect","handleAfterMove","__expose","label","prevFix","nextFix","handlePrev","handleNext","emitChangeEvent","active","emitEvent","amount","itemLength","itemList","itemCount","targetIndex","prevActive","i","anchorIndex","len","forward","back","handlePrevClick","handleNextClick","timer","useSetTimeout","waiting","isPointerDisabled"],"mappings":"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"}