{"version":3,"file":"itemUtil.cjs","sources":["../../../../../../../packages/vue-components/vc-virtual-list/src/utils/itemUtil.ts"],"sourcesContent":["/**\n * Our algorithm have additional one ghost item\n * whose index as `data.length` to simplify the calculation\n */\nexport const GHOST_ITEM_KEY = '__vc_ghost_item__';\n\n/**\n * Safari has the elasticity effect which provides negative `scrollTop` value.\n * We should ignore it since will make scroll animation shake.\n */\nexport function alignScrollTop(scrollTop, scrollRange) {\n  if (scrollTop < 0)\n    return 0;\n\n  if (scrollTop >= scrollRange)\n    return scrollRange;\n\n  return scrollTop;\n}\n\n/**\n * Get node `offsetHeight`. We prefer node is a dom element directly.\n * But if not provided, downgrade to `findDOMNode` to get the real dom element.\n */\nexport function getNodeHeight(node) {\n  return node ? node.offsetHeight : 0;\n}\n\n/**\n * Calculate the located item absolute top with whole scroll height\n */\nexport function getItemAbsoluteTop({ scrollTop, ...rest }: any) {\n  return scrollTop + getItemRelativeTop(rest);\n}\n\n/**\n * Calculate the located item related top with current window height\n */\nexport function getItemRelativeTop({\n  itemIndex,\n  itemOffsetPtg,\n  itemElementHeights,\n  scrollPtg,\n  clientHeight,\n  getItemKey,\n}) {\n  const locatedItemHeight = itemElementHeights[getItemKey(itemIndex)] || 0;\n  const locatedItemTop = scrollPtg * clientHeight;\n  const locatedItemOffset = itemOffsetPtg * locatedItemHeight;\n  return Math.floor(locatedItemTop - locatedItemOffset);\n}\n\nexport function getCompareItemRelativeTop({\n  locatedItemRelativeTop,\n  locatedItemIndex,\n  compareItemIndex,\n  startIndex,\n  endIndex,\n  getItemKey,\n  itemElementHeights,\n}) {\n  let originCompareItemTop = locatedItemRelativeTop;\n  const compareItemKey = getItemKey(compareItemIndex);\n\n  if (compareItemIndex <= locatedItemIndex) {\n    for (let index = locatedItemIndex; index >= startIndex; index -= 1) {\n      const key = getItemKey(index);\n      if (key === compareItemKey)\n        break;\n\n      const prevItemKey = getItemKey(index - 1);\n      originCompareItemTop -= itemElementHeights[prevItemKey] || 0;\n    }\n  } else {\n    for (let index = locatedItemIndex; index <= endIndex; index += 1) {\n      const key = getItemKey(index);\n      if (key === compareItemKey)\n        break;\n\n      originCompareItemTop += itemElementHeights[key] || 0;\n    }\n  }\n\n  return originCompareItemTop;\n}\n\nexport function getScrollPercentage({ scrollTop, scrollHeight, clientHeight }) {\n  if (scrollHeight <= clientHeight)\n    return 0;\n\n  const scrollRange = scrollHeight - clientHeight;\n  const alignedScrollTop = alignScrollTop(scrollTop, scrollRange);\n  const scrollTopPtg = alignedScrollTop / scrollRange;\n  return scrollTopPtg;\n}\n\nexport function getElementScrollPercentage(element) {\n  if (!element)\n    return 0;\n\n  return getScrollPercentage(element);\n}\n\n/**\n * Get location item and its align percentage with the scroll percentage.\n * We should measure current scroll position to decide which item is the location item.\n * And then fill the top count and bottom count with the base of location item.\n *\n * `total` should be the real count instead of `total - 1` in calculation.\n */\nfunction getLocationItem(scrollPtg, total) {\n  const itemIndex = Math.floor(scrollPtg * total);\n  const itemTopPtg = itemIndex / total;\n  const itemBottomPtg = (itemIndex + 1) / total;\n  const itemOffsetPtg = (scrollPtg - itemTopPtg) / (itemBottomPtg - itemTopPtg);\n\n  return {\n    index: itemIndex,\n    offsetPtg: itemOffsetPtg,\n  };\n}\n\n/**\n * Get display items start, end, located item index. This is pure math calculation\n */\nexport function getRangeIndex(scrollPtg, itemCount, visibleCount) {\n  const { index, offsetPtg } = getLocationItem(scrollPtg, itemCount);\n\n  const beforeCount = Math.ceil(scrollPtg * visibleCount);\n  const afterCount = Math.ceil((1 - scrollPtg) * visibleCount);\n\n  return {\n    itemIndex: index,\n    itemOffsetPtg: offsetPtg,\n    startIndex: Math.max(0, index - beforeCount),\n    endIndex: Math.min(itemCount - 1, index + afterCount),\n  };\n}\n\nexport function requireVirtual(height, itemHeight, count, virtual) {\n  return virtual !== false && typeof height === 'number' && count * itemHeight > height;\n}\n"],"names":[],"mappings":"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"}