{"version":3,"file":"index.cjs","sources":["../src/components/VueScrollPicker.vue","../src/index.ts"],"sourcesContent":["<script\n  setup\n  lang=\"ts\"\n  generic=\"T extends ScrollPickerOption = ScrollPickerOption\"\n>\nimport {\n  computed,\n  nextTick,\n  onBeforeUnmount,\n  onMounted,\n  ref,\n  shallowRef,\n  VNode,\n  watch,\n} from 'vue'\n\nexport type ScrollPickerValue = string | number | boolean | null\nexport interface ScrollPickerOption {\n  name: string\n  value: ScrollPickerValue\n  disabled?: boolean\n}\n\nexport type ScrollPickerOptionable<T> = ScrollPickerValue | T\n\ntype GestureState = [scrollY: number, clientY: number, isDragging: boolean]\n\nconst EVENT_OPTIONS: AddEventListenerOptions = { passive: false }\n\nconst emit = defineEmits<{\n  (event: 'update:modelValue', value: ScrollPickerValue | undefined): void\n  (event: 'start'): void\n  (event: 'move', value: ScrollPickerValue | undefined): void\n  (event: 'end', value: ScrollPickerValue | undefined): void\n  (event: 'cancel'): void\n  (event: 'wheel', value: ScrollPickerValue | undefined): void\n  (event: 'click', value: ScrollPickerValue | undefined): void\n}>()\n\nconst props = withDefaults(\n  defineProps<{\n    modelValue: ScrollPickerValue | undefined\n    options?: ScrollPickerOptionable<T>[]\n    dragSensitivity?: number\n    touchSensitivity?: number\n    wheelSensitivity?: number\n    emptyText?: string\n  }>(),\n  {\n    options: () => [],\n    dragSensitivity: 1.7,\n    touchSensitivity: 1.7,\n    wheelSensitivity: 1,\n    emptyText: 'No Options Available',\n  },\n)\n\ndefineSlots<{\n  default: (props: { option: T }) => VNode\n  empty: (props: { text: string }) => VNode\n}>()\n\nconst internalOptions = computed<T[]>(() => {\n  return props.options.map((option) => {\n    if (option === null) {\n      return { value: null, name: '' } as T\n    }\n    switch (typeof option) {\n      case 'string': {\n        return { value: option, name: option } as T\n      }\n      case 'number':\n      case 'boolean': {\n        return { value: option, name: `${option}` } as T\n      }\n    }\n    return option\n  })\n})\n\nconst transitionTimeout = ref<ReturnType<typeof setTimeout> | null>(null)\n\nconst internalIndex = ref(\n  Math.max(\n    internalOptions.value.findIndex(\n      (option) => option.value == props.modelValue,\n    ),\n    0,\n  ),\n)\n\nlet itemOffsets: number[] = []\n\nlet scrollOffset = 0\nlet scrollY = 0\nlet scrollYMax = 0\n\nlet gestureState: GestureState | null = null\n\nconst el = shallowRef<HTMLDivElement>()\n\nconst rotatorRef = shallowRef<HTMLDivElement>()\nconst layerTopRef = shallowRef<HTMLDivElement>()\nconst layerSelectionRef = shallowRef<HTMLDivElement>()\nconst layerBottomRef = shallowRef<HTMLDivElement>()\n\nlet resizeObserver: globalThis.ResizeObserver | null = null\n\nwatch(\n  () => props.modelValue,\n  (value) => {\n    const nextIndex = internalOptions.value.findIndex(\n      (option) => option.value == value,\n    )\n    if (internalIndex.value !== nextIndex) {\n      internalIndex.value = Math.max(nextIndex, 0)\n      scrollTo(findScrollByIndex(nextIndex))\n    }\n  },\n)\n\nwatch(internalOptions, (options) => {\n  internalIndex.value = Math.max(\n    options.findIndex((option) => option.value == props.modelValue),\n    0,\n  )\n  nextTick(() => {\n    updateItemOffsets()\n    setScroll(findScrollByIndex(internalIndex.value))\n  })\n})\n\nonMounted(() => {\n  if (!el.value) {\n    return\n  }\n\n  el.value.addEventListener('wheel', handleWheel, EVENT_OPTIONS)\n  el.value.addEventListener('touchstart', handleTouchStart, EVENT_OPTIONS)\n  el.value.addEventListener('mousedown', handleMouseDown, EVENT_OPTIONS)\n\n  if (typeof window.ResizeObserver !== 'undefined') {\n    let raf = null as ReturnType<typeof requestAnimationFrame> | null\n    resizeObserver = new window.ResizeObserver(() => {\n      if (raf) {\n        cancelAnimationFrame(raf)\n      }\n      raf = requestAnimationFrame(() => {\n        updateItemOffsets()\n        raf = null\n      })\n    })\n    resizeObserver.observe(el.value)\n  } else {\n    updateItemOffsets()\n  }\n})\n\nonBeforeUnmount(() => {\n  el.value?.removeEventListener('wheel', handleWheel)\n  el.value?.removeEventListener('touchstart', handleTouchStart)\n  el.value?.removeEventListener('mousedown', handleMouseDown)\n\n  resizeObserver?.disconnect()\n})\n\nfunction updateItemOffsets() {\n  const rotatorEl = rotatorRef.value\n  const layerSelectionEl = layerSelectionRef.value\n  if (!rotatorEl || !layerSelectionEl) {\n    return\n  }\n\n  // set scrollOffset\n  {\n    const { top, bottom } = layerSelectionEl.getBoundingClientRect()\n    const elTop = el.value?.getBoundingClientRect().top ?? 0\n    scrollOffset = (top + bottom) / 2 - elTop\n  }\n\n  // set itemOffsets\n  let firstItemOffset = 0\n  itemOffsets = Array.from(rotatorEl.children).map((itemRef, index) => {\n    const { top, bottom } = itemRef.getBoundingClientRect()\n    const itemOffset = (top + bottom) / 2\n    if (index === 0) {\n      scrollOffset -= itemOffset - top\n      firstItemOffset = itemOffset\n    }\n    return itemOffset - firstItemOffset\n  })\n\n  scrollYMax = Math.max(...itemOffsets)\n  setScroll(findScrollByIndex(internalIndex.value))\n}\n\nfunction findIndexFromScroll(scroll: number, ignoreDisabled: boolean): number {\n  let minDiff = Infinity\n  let foundBoundIndex = 0\n  for (const [boundIndex, bound] of itemOffsets.entries()) {\n    if (!ignoreDisabled && internalOptions.value[boundIndex]?.disabled) {\n      continue\n    }\n    if (Math.abs(bound - scroll) < minDiff) {\n      minDiff = Math.abs(bound - scroll)\n      foundBoundIndex = boundIndex\n    }\n  }\n  return foundBoundIndex\n}\n\nfunction findScrollByIndex(index: number): number {\n  return itemOffsets[Math.min(Math.max(index, 0), itemOffsets.length - 1)]\n}\n\nfunction scrollTo(scroll: number) {\n  setScroll(scroll)\n  if (transitionTimeout.value) {\n    clearTimeout(transitionTimeout.value)\n  }\n  transitionTimeout.value = setTimeout(() => {\n    transitionTimeout.value = null\n  }, 150)\n}\n\nlet scrollRaf = null as ReturnType<typeof requestAnimationFrame> | null\nfunction setScroll(scroll: number) {\n  scrollY = scroll\n  if (scrollRaf) {\n    cancelAnimationFrame(scrollRaf)\n  }\n  scrollRaf = requestAnimationFrame(() => {\n    if (rotatorRef.value) {\n      rotatorRef.value.style.top = `${scrollOffset - scroll}px`\n    }\n    scrollRaf = null\n  })\n  return scroll\n}\n\nfunction bounceEffect(value: number, min: number, max: number, tension = 0.2) {\n  if (value < min) {\n    return min + (value - min) * tension\n  }\n  if (value > max) {\n    return max + (value - max) * tension\n  }\n  return value\n}\n\nlet wheelTimeout: ReturnType<typeof setTimeout> | null = null\nfunction handleWheel(e: WheelEvent) {\n  if (!wheelTimeout && scrollY <= 0 && e.deltaY < 0) {\n    return\n  }\n  if (!wheelTimeout && scrollY >= scrollYMax && e.deltaY > 0) {\n    return\n  }\n\n  if (itemOffsets.length === 1) {\n    return\n  }\n  e.preventDefault()\n  const scrollYValue = setScroll(\n    bounceEffect(scrollY + e.deltaY * props.wheelSensitivity, 0, scrollYMax),\n  )\n\n  const nextIndex = findIndexFromScroll(scrollYValue, true)\n  const nextOption: ScrollPickerOption | undefined =\n    internalOptions.value[nextIndex]\n  const nextValue = nextOption?.value\n  emit('wheel', nextValue)\n  if (nextOption && !nextOption.disabled) {\n    internalIndex.value = nextIndex\n    emitUpdateModelValue(nextValue)\n  }\n\n  if (wheelTimeout) {\n    clearTimeout(wheelTimeout)\n  }\n  wheelTimeout = setTimeout(() => {\n    scrollTo(findScrollByIndex(findIndexFromScroll(scrollYValue, false)))\n    wheelTimeout = null\n  }, 100)\n}\n\nfunction handleTouchStart(e: TouchEvent) {\n  if (gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n\n  // TODO multitouch\n  gestureState = [scrollY, e.touches[0].clientY, false]\n  emit('start')\n\n  document.addEventListener('touchmove', handleTouchMove, EVENT_OPTIONS)\n  document.addEventListener('touchend', handleTouchEnd, EVENT_OPTIONS)\n  document.addEventListener('touchcancel', handleTouchCancel)\n}\n\nfunction handleMouseDown(e: MouseEvent) {\n  if (gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n\n  gestureState = [scrollY, e.clientY, false]\n  emit('start')\n\n  document.addEventListener('mousemove', handleMouseMove, EVENT_OPTIONS)\n  document.addEventListener('mouseup', handleMouseUp, EVENT_OPTIONS)\n  document.addEventListener('mouseout', handleMouseOut)\n}\n\nfunction handleTouchMove(e: TouchEvent) {\n  if (!gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n  const diff = gestureState[1] - e.touches[0].clientY // TODO multitouch\n  if (Math.abs(diff) > 1.5) {\n    const nextGestureState = gestureState.slice() as GestureState\n    nextGestureState[2] = true\n    gestureState = nextGestureState\n  }\n  emitMove(\n    setScroll(\n      bounceEffect(\n        gestureState[0] + diff * props.touchSensitivity,\n        0,\n        scrollYMax,\n      ),\n    ),\n  )\n}\n\nfunction handleMouseMove(e: MouseEvent) {\n  if (!gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n  const diff = gestureState[1] - e.clientY\n  if (Math.abs(diff) > 1.5) {\n    const nextGestureState = gestureState.slice() as GestureState\n    nextGestureState[2] = true\n    gestureState = nextGestureState\n  }\n  emitMove(\n    setScroll(\n      bounceEffect(\n        gestureState[0] + diff * props.dragSensitivity,\n        0,\n        scrollYMax,\n      ),\n    ),\n  )\n}\n\nfunction emitMove(scrollY: number) {\n  emit(\n    'move',\n    internalOptions.value[findIndexFromScroll(scrollY, true)]?.value ??\n      undefined,\n  )\n}\n\nfunction handleMouseUp(e: MouseEvent) {\n  if (!gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n\n  endGesture(gestureState[2], e.clientX, e.clientY)\n  gestureState = null\n\n  document.removeEventListener('mousemove', handleMouseMove)\n  document.removeEventListener('mouseup', handleMouseUp)\n  document.removeEventListener('mouseout', handleMouseOut)\n}\n\nfunction handleTouchEnd(e: TouchEvent) {\n  if (!gestureState) {\n    return\n  }\n  if (e.cancelable) {\n    e.preventDefault()\n  }\n  endGesture(\n    gestureState[2],\n    e.changedTouches[0].clientX,\n    e.changedTouches[0].clientY,\n  )\n  gestureState = null\n\n  document.removeEventListener('touchmove', handleTouchMove)\n  document.removeEventListener('touchend', handleTouchEnd)\n  document.removeEventListener('touchcancel', handleTouchCancel)\n}\n\nfunction endGesture(isDragging: boolean, x: number, y: number) {\n  if (isDragging) {\n    const nextIndex = findIndexFromScroll(scrollY, false)\n    const nextValue = internalOptions.value[nextIndex]?.value ?? null\n    scrollTo(findScrollByIndex(nextIndex))\n    internalIndex.value = nextIndex\n    emit('end', nextValue)\n    emitUpdateModelValue(nextValue)\n  } else {\n    triggerClick(x, y)\n  }\n}\n\nfunction triggerClick(x: number, y: number) {\n  if (!layerTopRef.value || !layerBottomRef.value) {\n    return\n  }\n  const topRect = layerTopRef.value.getBoundingClientRect()\n  const bottomRect = layerBottomRef.value.getBoundingClientRect()\n  let nextIndex = internalIndex.value\n  if (\n    topRect.left <= x &&\n    x <= topRect.right &&\n    topRect.top <= y &&\n    y <= topRect.bottom\n  ) {\n    if (internalIndex.value === 0) {\n      return // top\n    }\n    nextIndex--\n    while (\n      internalOptions.value[nextIndex] &&\n      internalOptions.value[nextIndex].disabled\n    ) {\n      nextIndex--\n    }\n  } else if (\n    bottomRect.left <= x &&\n    x <= bottomRect.right &&\n    bottomRect.top <= y &&\n    y <= bottomRect.bottom\n  ) {\n    if (internalIndex.value === internalOptions.value.length - 1) {\n      return // bottom\n    }\n    nextIndex++\n    while (\n      internalOptions.value[nextIndex] &&\n      internalOptions.value[nextIndex].disabled\n    ) {\n      nextIndex++\n    }\n  }\n  if (internalIndex.value !== nextIndex && internalOptions.value[nextIndex]) {\n    internalIndex.value = nextIndex\n    const nextValue = internalOptions.value[nextIndex].value\n    emit('end', nextValue)\n    emit('click', nextValue)\n    emitUpdateModelValue(nextValue)\n    scrollTo(findScrollByIndex(nextIndex))\n  }\n}\n\nfunction emitUpdateModelValue(value: ScrollPickerValue) {\n  if (props.modelValue !== value) {\n    emit('update:modelValue', value)\n  }\n}\n\n// <Cancel>\nfunction handleMouseOut(e: MouseEvent) {\n  if (e.relatedTarget === null) {\n    cancelGesture()\n  }\n}\n\nfunction handleTouchCancel() {\n  cancelGesture()\n}\n\nfunction cancelGesture() {\n  scrollTo(findScrollByIndex(internalIndex.value))\n  gestureState = null\n  emit('cancel')\n}\n// </Cancel>\n</script>\n<template>\n  <div ref=\"el\" class=\"vue-scroll-picker\">\n    <div\n      ref=\"rotatorRef\"\n      role=\"listbox\"\n      :class=\"[\n        'vue-scroll-picker-rotator',\n        {\n          'vue-scroll-picker-rotator-transition': transitionTimeout,\n        },\n      ]\"\n    >\n      <template v-if=\"internalOptions.length === 0\">\n        <div\n          key=\"empty\"\n          role=\"option\"\n          class=\"vue-scroll-picker-item\"\n          aria-disabled=\"true\"\n          aria-selected=\"false\"\n        >\n          <slot name=\"empty\" :text=\"emptyText\">\n            {{ emptyText }}\n          </slot>\n        </div>\n      </template>\n      <template v-else>\n        <template\n          v-for=\"(option, optionIndex) in internalOptions\"\n          :key=\"optionIndex\"\n        >\n          <div\n            role=\"option\"\n            class=\"vue-scroll-picker-item\"\n            :aria-disabled=\"option.disabled\"\n            :aria-selected=\"internalIndex === optionIndex\"\n            :data-value=\"option.value ?? ''\"\n          >\n            <slot :option=\"option\">{{ option.name }}</slot>\n          </div>\n        </template>\n      </template>\n    </div>\n    <div class=\"vue-scroll-picker-layer\">\n      <div ref=\"layerTopRef\" class=\"vue-scroll-picker-layer-top\"></div>\n      <div\n        ref=\"layerSelectionRef\"\n        class=\"vue-scroll-picker-layer-selection\"\n      ></div>\n      <div ref=\"layerBottomRef\" class=\"vue-scroll-picker-layer-bottom\"></div>\n    </div>\n  </div>\n</template>\n","import { App, Component, Plugin } from 'vue'\n\nimport VueScrollPicker, {\n  type ScrollPickerValue,\n  type ScrollPickerOption,\n  type ScrollPickerOptionable,\n} from './components/VueScrollPicker.vue'\n\nimport './style.css'\n\nexport function install(app: App) {\n  app.component('VueScrollPicker', VueScrollPicker as unknown as Component)\n}\n\nif (typeof window !== 'undefined' && 'Vue' in window) {\n  install(window.Vue as App)\n}\n\nconst plugin: Plugin = {\n  install,\n}\n\nexport default plugin\n\nexport { VueScrollPicker }\n\nexport type VueScrollPickerValue = ScrollPickerValue\nexport type VueScrollPickerOption = ScrollPickerOption\nexport type VueScrollPickerOptionable<T> = ScrollPickerOptionable<T>\n"],"names":["EVENT_OPTIONS","emit","__emit","props","__props","internalOptions","computed","option","transitionTimeout","ref","internalIndex","itemOffsets","scrollOffset","scrollY","scrollYMax","gestureState","el","shallowRef","rotatorRef","layerTopRef","layerSelectionRef","layerBottomRef","resizeObserver","watch","value","nextIndex","scrollTo","findScrollByIndex","options","nextTick","updateItemOffsets","setScroll","onMounted","handleWheel","handleTouchStart","handleMouseDown","raf","onBeforeUnmount","_a","_b","_c","rotatorEl","layerSelectionEl","top","bottom","elTop","firstItemOffset","itemRef","index","itemOffset","findIndexFromScroll","scroll","ignoreDisabled","minDiff","foundBoundIndex","boundIndex","bound","scrollRaf","bounceEffect","min","max","tension","wheelTimeout","scrollYValue","nextOption","nextValue","emitUpdateModelValue","handleTouchMove","handleTouchEnd","handleTouchCancel","handleMouseMove","handleMouseUp","handleMouseOut","diff","nextGestureState","emitMove","endGesture","isDragging","x","y","triggerClick","topRect","bottomRect","cancelGesture","install","app","VueScrollPicker","plugin"],"mappings":"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"}