@tanstack/virtual-core 3.0.0-beta.47 → 3.0.0-beta.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/index.d.ts +1 -0
- package/build/lib/index.esm.js +6 -0
- package/build/lib/index.esm.js.map +1 -1
- package/build/lib/index.js +6 -0
- package/build/lib/index.js.map +1 -1
- package/build/lib/index.mjs +6 -0
- package/build/lib/index.mjs.map +1 -1
- package/build/umd/index.development.js +6 -0
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.production.js","sources":["../../src/utils.ts","../../src/index.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n initialDeps?: TDeps\n },\n) {\n let deps = opts.initialDeps ?? []\n let result: TResult | undefined\n\n return (): TResult => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n opts?.onChange?.(result)\n\n return result!\n }\n}\n\nexport function notUndefined<T>(value: T | undefined, msg?: string): T {\n if (value === undefined) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : ''}`)\n } else {\n return value\n }\n}\n\nexport const approxEqual = (a: number, b: number) => Math.abs(a - b) < 1\n","import { approxEqual, memo, notUndefined } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = (rect: { width: number; height: number }) => {\n const { width, height } = rect\n cb({ width: Math.round(width), height: Math.round(height) })\n }\n\n handler(element.getBoundingClientRect())\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n const box = entry.borderBoxSize[0]\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize })\n return\n }\n }\n handler(element.getBoundingClientRect())\n })\n\n observer.observe(element, { box: 'border-box' })\n\n return () => {\n observer.unobserve(element)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<Window, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight })\n }\n handler()\n\n element.addEventListener('resize', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('resize', handler)\n }\n}\n\nexport const observeElementOffset = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollLeft' : 'scrollTop'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<Window, any>,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollX' : 'scrollY'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<any, TItemElement>,\n) => {\n if (entry) {\n const box = entry.borderBoxSize[0]\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? 'inlineSize' : 'blockSize'],\n )\n return size\n }\n }\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = <T extends Window>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n initialMeasurementsCache?: VirtualItem[]\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private scrollToIndexTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemSizeCache = new Map<Key, number>()\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n scrollOffset: number\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments: number = 0\n measureElementCache = new Map<Key, TItemElement>()\n private observer = (() => {\n let _ro: ResizeObserver | null = null\n\n const get = () => {\n if (_ro) {\n return _ro\n } else if (typeof ResizeObserver !== 'undefined') {\n return (_ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, entry)\n })\n }))\n } else {\n return null\n }\n }\n\n return {\n disconnect: () => get()?.disconnect(),\n observe: (target: Element) =>\n get()?.observe(target, { box: 'border-box' }),\n unobserve: (target: Element) => get()?.unobserve(target),\n }\n })()\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size)\n })\n\n this.maybeNotify()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n this.measureElementCache.forEach(this.observer.observe)\n return () => {\n this.observer.disconnect()\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n const prev = this.scrollRect\n this.scrollRect = rect\n if (\n this.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n this.maybeNotify()\n }\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollAdjustments = 0\n\n if (this.scrollOffset === offset) {\n return\n }\n\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n this.isScrolling = true\n this.scrollDirection =\n this.scrollOffset < offset ? 'forward' : 'backward'\n this.scrollOffset = offset\n\n this.maybeNotify()\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n this.scrollDirection = null\n\n this.maybeNotify()\n }, this.options.scrollingDelay)\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.itemSizeCache,\n ],\n (count, paddingStart, scrollMargin, getItemKey, itemSizeCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = itemSizeCache.get(key)\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart + scrollMargin\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return (this.range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n }))\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private maybeNotify = memo(\n () => [...Object.values(this.calculateRange()), this.isScrolling],\n () => {\n this.notify()\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: () => this.options.debug,\n initialDeps: [...Object.values(this.range), this.isScrolling],\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n private _measureElement = (\n node: TItemElement,\n entry: ResizeObserverEntry | undefined,\n ) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n\n const prevNode = this.measureElementCache.get(item.key)\n\n if (!node.isConnected) {\n this.observer.unobserve(node)\n if (node === prevNode) {\n this.measureElementCache.delete(item.key)\n }\n return\n }\n\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode)\n }\n this.observer.observe(node)\n this.measureElementCache.set(item.key, node)\n }\n\n const measuredItemSize = this.options.measureElement(node, entry, this)\n\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n\n this.itemSizeCache = new Map(\n this.itemSizeCache.set(item.key, measuredItemSize),\n )\n\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, undefined)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= this.scrollOffset) {\n align = 'start'\n } else if (toOffset >= this.scrollOffset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n toOffset = toOffset\n } else if (align === 'end') {\n toOffset = toOffset - size\n } else if (align === 'center') {\n toOffset = toOffset - size / 2\n }\n\n const scrollSizeProp = this.options.horizontal\n ? 'scrollWidth'\n : 'scrollHeight'\n const scrollSize = this.scrollElement\n ? 'document' in this.scrollElement\n ? this.scrollElement.document.documentElement[scrollSizeProp]\n : this.scrollElement[scrollSizeProp]\n : 0\n\n const maxOffset = scrollSize - this.getSize()\n\n return Math.max(Math.min(maxOffset, toOffset), 0)\n }\n\n getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n const measurement = notUndefined(this.getMeasurements()[index])\n\n if (align === 'auto') {\n if (\n measurement.end >=\n this.scrollOffset + this.getSize() - this.options.scrollPaddingEnd\n ) {\n align = 'end'\n } else if (\n measurement.start <=\n this.scrollOffset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return [this.scrollOffset, align] as const\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n return [this.getOffsetForAlignment(toOffset, align), align] as const\n }\n\n private isDynamicMode = () => this.measureElementCache.size > 0\n\n private cancelScrollToIndex = () => {\n if (this.scrollToIndexTimeoutId !== null) {\n clearTimeout(this.scrollToIndexTimeoutId)\n this.scrollToIndexTimeoutId = null\n }\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n adjustments: undefined,\n behavior,\n })\n }\n\n scrollToIndex = (\n index: number,\n { align: initialAlign = 'auto', behavior }: ScrollToIndexOptions = {},\n ) => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n const [toOffset, align] = this.getOffsetForIndex(index, initialAlign)\n\n this._scrollToOffset(toOffset, { adjustments: undefined, behavior })\n\n if (behavior !== 'smooth' && this.isDynamicMode()) {\n this.scrollToIndexTimeoutId = setTimeout(() => {\n this.scrollToIndexTimeoutId = null\n\n const elementInDOM = this.measureElementCache.has(\n this.options.getItemKey(index),\n )\n\n if (elementInDOM) {\n const [toOffset] = this.getOffsetForIndex(index, align)\n\n if (!approxEqual(toOffset, this.scrollOffset)) {\n this.scrollToIndex(index, { align, behavior })\n }\n } else {\n this.scrollToIndex(index, { align, behavior })\n }\n })\n }\n }\n\n scrollBy = (delta: number, { behavior }: ScrollToOffsetOptions = {}) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.scrollOffset + delta, {\n adjustments: undefined,\n behavior,\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) -\n this.options.scrollMargin +\n this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = new Map()\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","_opts$initialDeps","result","deps","initialDeps","depTime","key","debug","Date","now","resultTime","newDeps","length","some","dep","index","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","onChange","notUndefined","value","msg","undefined","Error","approxEqual","a","b","abs","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","measureElement","element","entry","instance","box","borderBoxSize","options","horizontal","getBoundingClientRect","_ro","get","_this","this","unsubs","scrollElement","isScrolling","isScrollingTimeoutId","scrollToIndexTimeoutId","measurementsCache","itemSizeCache","Map","pendingMeasuredCacheIndexes","scrollDirection","scrollAdjustments","measureElementCache","observer","ResizeObserver","entries","forEach","_measureElement","target","disconnect","_get","observe","_get2","unobserve","_get3","setOptions","Object","_ref3","_extends","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","initialRect","width","height","scrollMargin","scrollingDelay","indexAttribute","initialMeasurementsCache","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","adjustments","behavior","observeElementRect","rect","prev","scrollRect","maybeNotify","observeElementOffset","offset","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","calculateRange","outerSize","_ref8","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","concat","values","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","parseInt","warn","_this$itemSizeCache$g","item","prevNode","isConnected","set","measuredItemSize","delta","getVirtualItems","indexes","virtualItems","k","len","measurement","getOffsetForAlignment","toOffset","align","scrollSizeProp","maxOffset","document","documentElement","getOffsetForIndex","isDynamicMode","cancelScrollToIndex","scrollToOffset","_temp","_ref4","_ref4$align","scrollToIndex","_temp2","_ref5","_ref5$align","initialAlign","_this$getOffsetForInd","has","scrollBy","_temp3","getTotalSize","_this$getMeasurements","_ref7","scrollToFn","measure","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","_ref2","scrollTo","cb","handler","addEventListener","passive","removeEventListener","inlineSize","blockSize","innerWidth","innerHeight","_instance$scrollEleme","_instance$scrollEleme2","_ref$adjustments","_ref"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.production.js","sources":["../../src/utils.ts","../../src/index.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n initialDeps?: TDeps\n },\n) {\n let deps = opts.initialDeps ?? []\n let result: TResult | undefined\n\n return (): TResult => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n opts?.onChange?.(result)\n\n return result!\n }\n}\n\nexport function notUndefined<T>(value: T | undefined, msg?: string): T {\n if (value === undefined) {\n throw new Error(`Unexpected undefined${msg ? `: ${msg}` : ''}`)\n } else {\n return value\n }\n}\n\nexport const approxEqual = (a: number, b: number) => Math.abs(a - b) < 1\n","import { approxEqual, memo, notUndefined } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = (rect: { width: number; height: number }) => {\n const { width, height } = rect\n cb({ width: Math.round(width), height: Math.round(height) })\n }\n\n handler(element.getBoundingClientRect())\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (entry) {\n const box = entry.borderBoxSize[0]\n if (box) {\n handler({ width: box.inlineSize, height: box.blockSize })\n return\n }\n }\n handler(element.getBoundingClientRect())\n })\n\n observer.observe(element, { box: 'border-box' })\n\n return () => {\n observer.unobserve(element)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<Window, any>,\n cb: (rect: Rect) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb({ width: element.innerWidth, height: element.innerHeight })\n }\n handler()\n\n element.addEventListener('resize', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('resize', handler)\n }\n}\n\nexport const observeElementOffset = <T extends Element>(\n instance: Virtualizer<T, any>,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollLeft' : 'scrollTop'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<Window, any>,\n cb: (offset: number) => void,\n) => {\n const element = instance.scrollElement\n if (!element) {\n return\n }\n\n const handler = () => {\n cb(element[instance.options.horizontal ? 'scrollX' : 'scrollY'])\n }\n handler()\n\n element.addEventListener('scroll', handler, {\n passive: true,\n })\n\n return () => {\n element.removeEventListener('scroll', handler)\n }\n}\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<any, TItemElement>,\n) => {\n if (entry) {\n const box = entry.borderBoxSize[0]\n if (box) {\n const size = Math.round(\n box[instance.options.horizontal ? 'inlineSize' : 'blockSize'],\n )\n return size\n }\n }\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = <T extends Window>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n element: TItemElement,\n entry: ResizeObserverEntry | undefined,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n initialMeasurementsCache?: VirtualItem[]\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private scrollToIndexTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemSizeCache = new Map<Key, number>()\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n scrollOffset: number\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments: number = 0\n measureElementCache = new Map<Key, TItemElement>()\n private observer = (() => {\n let _ro: ResizeObserver | null = null\n\n const get = () => {\n if (_ro) {\n return _ro\n } else if (typeof ResizeObserver !== 'undefined') {\n return (_ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, entry)\n })\n }))\n } else {\n return null\n }\n }\n\n return {\n disconnect: () => get()?.disconnect(),\n observe: (target: Element) =>\n get()?.observe(target, { box: 'border-box' }),\n unobserve: (target: Element) => get()?.unobserve(target),\n }\n })()\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache.set(item.key, item.size)\n })\n\n this.maybeNotify()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n this.measureElementCache.forEach(this.observer.observe)\n return () => {\n this.observer.disconnect()\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n const prev = this.scrollRect\n this.scrollRect = rect\n if (\n this.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n this.maybeNotify()\n }\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollAdjustments = 0\n\n if (this.scrollOffset === offset) {\n return\n }\n\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n this.isScrolling = true\n this.scrollDirection =\n this.scrollOffset < offset ? 'forward' : 'backward'\n this.scrollOffset = offset\n\n this.maybeNotify()\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n this.scrollDirection = null\n\n this.maybeNotify()\n }, this.options.scrollingDelay)\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.scrollMargin,\n this.options.getItemKey,\n this.itemSizeCache,\n ],\n (count, paddingStart, scrollMargin, getItemKey, itemSizeCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = itemSizeCache.get(key)\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart + scrollMargin\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return (this.range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n }))\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private maybeNotify = memo(\n () => [...Object.values(this.calculateRange()), this.isScrolling],\n () => {\n this.notify()\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: () => this.options.debug,\n initialDeps: [...Object.values(this.range), this.isScrolling],\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n private _measureElement = (\n node: TItemElement,\n entry: ResizeObserverEntry | undefined,\n ) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n\n const prevNode = this.measureElementCache.get(item.key)\n\n if (!node.isConnected) {\n this.observer.unobserve(node)\n if (node === prevNode) {\n this.measureElementCache.delete(item.key)\n }\n return\n }\n\n if (prevNode !== node) {\n if (prevNode) {\n this.observer.unobserve(prevNode)\n }\n this.observer.observe(node)\n this.measureElementCache.set(item.key, node)\n }\n\n const measuredItemSize = this.options.measureElement(node, entry, this)\n\n const itemSize = this.itemSizeCache.get(item.key) ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n\n this.itemSizeCache = new Map(\n this.itemSizeCache.set(item.key, measuredItemSize),\n )\n\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, undefined)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItemForOffset = (offset: number) => {\n const measurements = this.getMeasurements()\n\n return notUndefined(\n measurements[\n findNearestBinarySearch(\n 0,\n measurements.length - 1,\n (index: number) => notUndefined(measurements[index]).start,\n offset,\n )\n ],\n )\n }\n\n getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= this.scrollOffset) {\n align = 'start'\n } else if (toOffset >= this.scrollOffset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n toOffset = toOffset\n } else if (align === 'end') {\n toOffset = toOffset - size\n } else if (align === 'center') {\n toOffset = toOffset - size / 2\n }\n\n const scrollSizeProp = this.options.horizontal\n ? 'scrollWidth'\n : 'scrollHeight'\n const scrollSize = this.scrollElement\n ? 'document' in this.scrollElement\n ? this.scrollElement.document.documentElement[scrollSizeProp]\n : this.scrollElement[scrollSizeProp]\n : 0\n\n const maxOffset = scrollSize - this.getSize()\n\n return Math.max(Math.min(maxOffset, toOffset), 0)\n }\n\n getOffsetForIndex = (index: number, align: ScrollAlignment = 'auto') => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n const measurement = notUndefined(this.getMeasurements()[index])\n\n if (align === 'auto') {\n if (\n measurement.end >=\n this.scrollOffset + this.getSize() - this.options.scrollPaddingEnd\n ) {\n align = 'end'\n } else if (\n measurement.start <=\n this.scrollOffset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return [this.scrollOffset, align] as const\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n return [this.getOffsetForAlignment(toOffset, align), align] as const\n }\n\n private isDynamicMode = () => this.measureElementCache.size > 0\n\n private cancelScrollToIndex = () => {\n if (this.scrollToIndexTimeoutId !== null) {\n clearTimeout(this.scrollToIndexTimeoutId)\n this.scrollToIndexTimeoutId = null\n }\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), {\n adjustments: undefined,\n behavior,\n })\n }\n\n scrollToIndex = (\n index: number,\n { align: initialAlign = 'auto', behavior }: ScrollToIndexOptions = {},\n ) => {\n index = Math.max(0, Math.min(index, this.options.count - 1))\n\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n const [toOffset, align] = this.getOffsetForIndex(index, initialAlign)\n\n this._scrollToOffset(toOffset, { adjustments: undefined, behavior })\n\n if (behavior !== 'smooth' && this.isDynamicMode()) {\n this.scrollToIndexTimeoutId = setTimeout(() => {\n this.scrollToIndexTimeoutId = null\n\n const elementInDOM = this.measureElementCache.has(\n this.options.getItemKey(index),\n )\n\n if (elementInDOM) {\n const [toOffset] = this.getOffsetForIndex(index, align)\n\n if (!approxEqual(toOffset, this.scrollOffset)) {\n this.scrollToIndex(index, { align, behavior })\n }\n } else {\n this.scrollToIndex(index, { align, behavior })\n }\n })\n }\n }\n\n scrollBy = (delta: number, { behavior }: ScrollToOffsetOptions = {}) => {\n this.cancelScrollToIndex()\n\n if (behavior === 'smooth' && this.isDynamicMode()) {\n console.warn(\n 'The `smooth` scroll behavior is not fully supported with dynamic size.',\n )\n }\n\n this._scrollToOffset(this.scrollOffset + delta, {\n adjustments: undefined,\n behavior,\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) -\n this.options.scrollMargin +\n this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = new Map()\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","_opts$initialDeps","result","deps","initialDeps","depTime","key","debug","Date","now","resultTime","newDeps","length","some","dep","index","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","onChange","notUndefined","value","msg","undefined","Error","approxEqual","a","b","abs","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","measureElement","element","entry","instance","box","borderBoxSize","options","horizontal","getBoundingClientRect","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","_ro","get","_this","this","unsubs","scrollElement","isScrolling","isScrollingTimeoutId","scrollToIndexTimeoutId","measurementsCache","itemSizeCache","Map","pendingMeasuredCacheIndexes","scrollDirection","scrollAdjustments","measureElementCache","observer","ResizeObserver","entries","forEach","_measureElement","target","disconnect","_get","observe","_get2","unobserve","_get3","setOptions","Object","_ref3","_extends","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","initialRect","width","height","scrollMargin","scrollingDelay","indexAttribute","initialMeasurementsCache","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","adjustments","behavior","observeElementRect","rect","prev","scrollRect","maybeNotify","observeElementOffset","offset","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","calculateRange","outerSize","_ref8","concat","values","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","parseInt","warn","_this$itemSizeCache$g","item","prevNode","isConnected","set","measuredItemSize","delta","getVirtualItems","indexes","virtualItems","k","len","measurement","getVirtualItemForOffset","getOffsetForAlignment","toOffset","align","scrollSizeProp","maxOffset","document","documentElement","getOffsetForIndex","isDynamicMode","cancelScrollToIndex","scrollToOffset","_temp","_ref4","_ref4$align","scrollToIndex","_temp2","_ref5","_ref5$align","initialAlign","_this$getOffsetForInd","has","scrollBy","_temp3","getTotalSize","_this$getMeasurements","_ref7","scrollToFn","measure","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","_ref2","scrollTo","cb","handler","addEventListener","passive","removeEventListener","inlineSize","blockSize","innerWidth","innerHeight","_instance$scrollEleme","_instance$scrollEleme2","_ref$adjustments","_ref"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/virtual-core",
|
|
3
3
|
"author": "Tanner Linsley",
|
|
4
|
-
"version": "3.0.0-beta.
|
|
4
|
+
"version": "3.0.0-beta.48",
|
|
5
5
|
"description": "Headless UI for virtualizing scrollable elements in TS/JS + Frameworks",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/tanstack/virtual#readme",
|
package/src/index.ts
CHANGED
|
@@ -617,6 +617,21 @@ export class Virtualizer<
|
|
|
617
617
|
},
|
|
618
618
|
)
|
|
619
619
|
|
|
620
|
+
getVirtualItemForOffset = (offset: number) => {
|
|
621
|
+
const measurements = this.getMeasurements()
|
|
622
|
+
|
|
623
|
+
return notUndefined(
|
|
624
|
+
measurements[
|
|
625
|
+
findNearestBinarySearch(
|
|
626
|
+
0,
|
|
627
|
+
measurements.length - 1,
|
|
628
|
+
(index: number) => notUndefined(measurements[index]).start,
|
|
629
|
+
offset,
|
|
630
|
+
)
|
|
631
|
+
],
|
|
632
|
+
)
|
|
633
|
+
}
|
|
634
|
+
|
|
620
635
|
getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {
|
|
621
636
|
const size = this.getSize()
|
|
622
637
|
|