{"version":3,"file":"index.mjs","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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"}