{"version":3,"file":"virtual.mjs","names":["computed","ref","propsFactory","makeDataTableVirtualProps","visibleItems","type","String","Number","default","itemHeight","UP","DOWN","useVirtual","props","items","startIndex","parseInt","containerRef","isScrolling","calculateOffset","index","value","calculateMidPointIndex","scrollTop","start","end","length","middle","Math","floor","middleOffset","lastScrollTop","scrollTimeout","handleScroll","clearTimeout","setTimeout","direction","midPointIndex","buffer","round","max","min","stopIndex","paddingTop","paddingBottom"],"sources":["../../../../src/labs/VDataTable/composables/virtual.ts"],"sourcesContent":["// Utilities\nimport { computed, ref } from 'vue'\nimport { propsFactory } from '@/util'\n\n// Types\nimport type { Ref } from 'vue'\n\nexport const makeDataTableVirtualProps = propsFactory({\n  visibleItems: {\n    type: [String, Number],\n    default: 20,\n  },\n  itemHeight: {\n    type: [String, Number],\n    default: 52,\n  },\n}, 'virtual')\n\ntype VirtualProps = {\n  itemHeight: string | number\n  visibleItems: string | number\n}\n\nconst UP = -1\nconst DOWN = 1\n\n// TODO: Replace this with composable from v-virtual-scroll\nexport function useVirtual (props: VirtualProps, items: Ref<any[]>) {\n  const startIndex = ref(0)\n  const itemHeight = computed(() => parseInt(props.itemHeight, 10))\n  const visibleItems = computed(() => parseInt(props.visibleItems, 10))\n  const containerRef = ref<HTMLDivElement>()\n  const isScrolling = ref(false)\n\n  function calculateOffset (index: number) {\n    return index * itemHeight.value\n  }\n\n  function calculateMidPointIndex (scrollTop: number) {\n    let start = 0\n    let end = items.value.length\n\n    while (start <= end) {\n      const middle = start + Math.floor((end - start) / 2)\n      const middleOffset = calculateOffset(middle)\n\n      if (middleOffset === scrollTop) {\n        return middle\n      } else if (middleOffset < scrollTop) {\n        start = middle + 1\n      } else if (middleOffset > scrollTop) {\n        end = middle - 1\n      }\n    }\n\n    return start\n  }\n\n  let lastScrollTop = 0\n  let scrollTimeout: any\n  function handleScroll () {\n    if (!containerRef.value) return\n\n    isScrolling.value = true\n    clearTimeout(scrollTimeout)\n    scrollTimeout = setTimeout(() => {\n      isScrolling.value = false\n    }, 100)\n\n    const scrollTop = containerRef.value.scrollTop\n    const direction = scrollTop < lastScrollTop ? UP : DOWN\n\n    const midPointIndex = calculateMidPointIndex(scrollTop)\n\n    const buffer = Math.round(visibleItems.value / 3)\n    if (direction === UP && midPointIndex <= startIndex.value) {\n      startIndex.value = Math.max(midPointIndex - buffer, 0)\n    } else if (direction === DOWN && midPointIndex >= startIndex.value + (buffer * 2)) {\n      startIndex.value = Math.min(Math.max(0, midPointIndex - buffer), items.value.length - visibleItems.value)\n    }\n\n    lastScrollTop = containerRef.value.scrollTop\n  }\n\n  const stopIndex = computed(() => Math.min(items.value.length, startIndex.value + visibleItems.value))\n  const paddingTop = computed(() => calculateOffset(startIndex.value))\n  const paddingBottom = computed(() => calculateOffset(items.value.length) - calculateOffset(stopIndex.value))\n\n  return {\n    startIndex,\n    stopIndex,\n    paddingTop,\n    paddingBottom,\n    handleScroll,\n    containerRef,\n    itemHeight,\n    isScrolling,\n  }\n}\n"],"mappings":"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"}