@tanstack/virtual-core 3.0.0-beta.21 → 3.0.0-beta.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.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 },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\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 opts?.onChange?.(result)\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 return result!\n }\n}\n","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\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\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends unknown,\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: { canSmooth: boolean; sync: boolean },\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 el: TItemElement,\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 enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends unknown,\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 measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<string, TItemElement> = {}\n private ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, false)\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\n this.calculateRange()\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 enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\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 return () => {\n this.ro.disconnect()\n this.measureElementCache = {}\n\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 this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\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.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\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 = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\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 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 const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: 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 _measureElement = (node: TItemElement, _sync: boolean) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n const key = String(item.key)\n\n const prevNode = this.measureElementCache[key]\n\n if (!node.isConnected) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n delete this.measureElementCache[key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n }\n this.measureElementCache[key] = node\n this.ro.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === undefined) {\n this.scrollDelta += measuredItemSize - itemSize\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\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 scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\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","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","ro","forEach","entry","_measureElement","setOptions","Object","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","scrollingDelay","indexAttribute","notify","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","requested","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","warn","parseInt","_sync","item","prevNode","isConnected","measuredItemSize","itemSize","destinationOffset","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
1
+ {"version":3,"file":"index.development.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 },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\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 opts?.onChange?.(result)\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 return result!\n }\n}\n","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\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\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends unknown,\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: { canSmooth: boolean; sync: boolean },\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 el: TItemElement,\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 enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends unknown,\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 measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<Key, TItemElement> = {}\n private getResizeObserver = (() => {\n let _ro: ResizeObserver | null = null\n\n return () => {\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, false)\n })\n }))\n } else {\n return null\n }\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\n this.calculateRange()\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 enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\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 return () => {\n this.getResizeObserver()?.disconnect()\n this.measureElementCache = {}\n\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 this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\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.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\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 = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\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 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 const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: 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 = (node: TItemElement, _sync: boolean) => {\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[item.key]\n\n const ro = this.getResizeObserver()\n\n if (!node.isConnected) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n delete this.measureElementCache[item.key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n }\n this.measureElementCache[item.key] = node\n ro?.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (\n item.start < this.scrollOffset &&\n this.isScrolling &&\n this.destinationOffset === undefined\n ) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n this.scrollDelta += delta\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\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 scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\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","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","getResizeObserver","_ro","forEach","entry","_measureElement","setOptions","Object","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","scrollingDelay","indexAttribute","notify","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","requested","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","warn","parseInt","_sync","item","prevNode","ro","isConnected","measuredItemSize","itemSize","delta","destinationOffset","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VirtualCore={})}(this,(function(e){"use strict";function t(e,t,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=e();if(!(l.length!==o.length||l.some(((e,t)=>o[t]!==e))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=t(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const e=Math.round(100*(Date.now()-i))/100,t=Math.round(100*(Date.now()-r))/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length<t;)e=" "+e;return e};console.info("%c⏱ "+o(t,5)+" /"+o(e,5)+" ms","\n font-size: .6rem;\n font-weight: bold;\n color: hsl("+Math.max(0,Math.min(120-120*n,120))+"deg 100% 31%);",null==s?void 0:s.key)}return n}}const s=e=>e,n=e=>{const t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=s;e++)n.push(e);return n},o={element:["scrollLeft","scrollTop"],window:["scrollX","scrollY"]},i=e=>(t,s)=>{if(!t.scrollElement)return;const n=o[e][0],i=o[e][1];let l=t.scrollElement[n],r=t.scrollElement[i];const h=()=>{const e=t.scrollElement[t.options.horizontal?n:i];s(Math.max(0,e-t.options.scrollMargin))};h();const c=e=>{const s=e.currentTarget,o=s[n],c=s[i];(t.options.horizontal?l-o:r-c)&&h(),l=o,r=c};return t.scrollElement.addEventListener("scroll",c,{capture:!1,passive:!0}),()=>{t.scrollElement.removeEventListener("scroll",c)}},l=i("element"),r=i("window"),h=(e,t)=>Math.round(e.getBoundingClientRect()[t.options.horizontal?"width":"height"]);e.Virtualizer=class{constructor(e){var o=this;this.unsubs=[],this.scrollElement=null,this.isScrolling=!1,this.isScrollingTimeoutId=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.scrollDelta=0,this.measureElementCache={},this.ro=new ResizeObserver((e=>{e.forEach((e=>{this._measureElement(e.target,!1)}))})),this.range={startIndex:0,endIndex:0},this.setOptions=e=>{Object.entries(e).forEach((t=>{let[s,n]=t;void 0===n&&delete e[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:s,rangeExtractor:n,enableSmoothScroll:!0,onChange:()=>{},measureElement:h,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,indexAttribute:"data-index",...e}},this.notify=()=>{var e,t;null==(e=(t=this.options).onChange)||e.call(t,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((e=>e())),this.unsubs=[],this.scrollElement=null},this._didMount=()=>()=>{this.ro.disconnect(),this.measureElementCache={},this.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e?(this.cleanup(),this.scrollElement=e,this._scrollToOffset(this.scrollOffset,{canSmooth:!1,sync:!0,requested:!1}),this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{null!==this.isScrollingTimeoutId&&(clearTimeout(this.isScrollingTimeoutId),this.isScrollingTimeoutId=null),this.scrollOffset!==e?(this.scrollOffset=e,this.isScrolling=!0,this.scrollDelta=0,this.isScrollingTimeoutId=setTimeout((()=>{this.isScrollingTimeoutId=null,this.isScrolling=!1,this.notify()}),this.options.scrollingDelay)):(this.isScrolling=!1,this.scrollDelta=0),this.calculateRange()})))):this.isScrolling||this.calculateRange()},this.getSize=()=>this.scrollRect[this.options.horizontal?"width":"height"],this.getMeasurements=t((()=>[this.options.count,this.options.paddingStart,this.options.getItemKey,this.itemMeasurementsCache]),((e,t,s,n)=>{const o=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const i=this.measurementsCache.slice(0,o);for(let l=o;l<e;l++){const e=s(l),o=n[e],r=i[l-1]?i[l-1].end:t,h="number"==typeof o?o:this.options.estimateSize(l),c=r+h;i[l]={index:l,start:r,size:h,end:c,key:e}}return this.measurementsCache=i,i}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=t((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((e,t,s)=>{const n=function(e){let{measurements:t,outerSize:s,scrollOffset:n}=e;const o=t.length-1,i=((e,t,s,n)=>{for(;e<=t;){const o=(e+t)/2|0,i=s(o);if(i<n)e=o+1;else{if(!(i>n))return o;t=o-1}}return e>0?e-1:0})(0,o,(e=>t[e].start),n);let l=i;for(;l<o&&t[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:s});return n.startIndex===this.range.startIndex&&n.endIndex===this.range.endIndex||(this.range=n,this.notify()),this.range}),{key:!1,debug:()=>this.options.debug}),this.getIndexes=t((()=>[this.options.rangeExtractor,this.range,this.options.overscan,this.options.count]),((e,t,s,n)=>e({...t,overscan:s,count:n})),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const t=this.options.indexAttribute,s=e.getAttribute(t);return s?parseInt(s,10):(console.warn("Missing attribute name '"+t+"={index}' on measured element."),-1)},this._measureElement=(e,t)=>{var s;const n=this.indexFromElement(e),o=this.measurementsCache[n];if(!o)return;const i=String(o.key),l=this.measureElementCache[i];if(!e.isConnected)return void(l&&(this.ro.unobserve(l),delete this.measureElementCache[i]));l&&l===e||(l&&this.ro.unobserve(l),this.measureElementCache[i]=e,this.ro.observe(e));const r=this.options.measureElement(e,this),h=null!=(s=this.itemMeasurementsCache[o.key])?s:o.size;r!==h&&(o.start<this.scrollOffset&&void 0===this.destinationOffset&&(this.scrollDelta+=r-h,this._scrollToOffset(this.scrollOffset+this.scrollDelta,{canSmooth:!1,sync:!1,requested:!1})),this.pendingMeasuredCacheIndexes.push(n),this.itemMeasurementsCache={...this.itemMeasurementsCache,[o.key]:r},this.notify())},this.measureElement=e=>{e&&this._measureElement(e,!0)},this.getVirtualItems=t((()=>[this.getIndexes(),this.getMeasurements()]),((e,t)=>{const s=[];for(let n=0,o=e.length;n<o;n++){const o=t[e[n]];s.push(o)}return s}),{key:!1,debug:()=>this.options.debug}),this.scrollToOffset=function(e,t){let{align:s="start",smoothScroll:n=o.options.enableSmoothScroll}=void 0===t?{}:t;const i=o.scrollOffset,l=o.getSize();"auto"===s&&(s=e<=i?"start":e>=i+l?"end":"start");const r={canSmooth:n,sync:!1,requested:!0};"start"===s?o._scrollToOffset(e,r):"end"===s?o._scrollToOffset(e-l,r):"center"===s&&o._scrollToOffset(e-l/2,r)},this.scrollToIndex=function(e,t){let{align:s="auto",smoothScroll:n=o.options.enableSmoothScroll,...i}=void 0===t?{}:t;const l=o.getMeasurements(),r=o.scrollOffset,h=o.getSize(),{count:c}=o.options,a=l[Math.max(0,Math.min(e,c-1))];if(!a)return;if("auto"===s)if(a.end>=r+h-o.options.scrollPaddingEnd)s="end";else{if(!(a.start<=r+o.options.scrollPaddingStart))return;s="start"}const u="end"===s?a.end+o.options.scrollPaddingEnd:a.start-o.options.scrollPaddingStart;o.scrollToOffset(u,{align:s,smoothScroll:n,...i})},this.getTotalSize=()=>{var e;return((null==(e=this.getMeasurements()[this.options.count-1])?void 0:e.end)||this.options.paddingStart)+this.options.paddingEnd},this._scrollToOffset=(e,t)=>{let s,{requested:n,canSmooth:o,sync:i}=t;clearTimeout(this.scrollCheckFrame),n&&(this.destinationOffset=e),this.options.scrollToFn(e,{canSmooth:o,sync:i},this);const l=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,l()):this.destinationOffset=void 0)}),100)};l()},this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(e),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset,this.calculateRange()}},e.defaultKeyExtractor=s,e.defaultRangeExtractor=n,e.elementScroll=(e,t,s)=>{var n;let{canSmooth:o,sync:i}=t;const l=i?e:e+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},e.measureElement=h,e.memo=t,e.observeElementOffset=l,e.observeElementRect=(e,t)=>{const s=new ResizeObserver((e=>{var s,n;t({width:null==(s=e[0])?void 0:s.contentRect.width,height:null==(n=e[0])?void 0:n.contentRect.height})}));if(e.scrollElement)return t(e.scrollElement.getBoundingClientRect()),s.observe(e.scrollElement),()=>{s.unobserve(e.scrollElement)}},e.observeWindowOffset=r,e.observeWindowRect=(e,t)=>{const s=((e,t)=>{let s={height:-1,width:-1};return n=>{(e.options.horizontal?n.width!==s.width:n.height!==s.height)&&t(n),s=n}})(e,t),n=()=>s({width:e.scrollElement.innerWidth,height:e.scrollElement.innerHeight});if(e.scrollElement)return n(),e.scrollElement.addEventListener("resize",n,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("resize",n)}},e.windowScroll=(e,t,s)=>{var n;let{canSmooth:o,sync:i}=t;const l=i?e:e+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},Object.defineProperty(e,"__esModule",{value:!0})}));
11
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VirtualCore={})}(this,(function(e){"use strict";function t(e,t,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=e();if(!(l.length!==o.length||l.some(((e,t)=>o[t]!==e))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=t(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const e=Math.round(100*(Date.now()-i))/100,t=Math.round(100*(Date.now()-r))/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length<t;)e=" "+e;return e};console.info("%c⏱ "+o(t,5)+" /"+o(e,5)+" ms","\n font-size: .6rem;\n font-weight: bold;\n color: hsl("+Math.max(0,Math.min(120-120*n,120))+"deg 100% 31%);",null==s?void 0:s.key)}return n}}const s=e=>e,n=e=>{const t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=s;e++)n.push(e);return n},o={element:["scrollLeft","scrollTop"],window:["scrollX","scrollY"]},i=e=>(t,s)=>{if(!t.scrollElement)return;const n=o[e][0],i=o[e][1];let l=t.scrollElement[n],r=t.scrollElement[i];const h=()=>{const e=t.scrollElement[t.options.horizontal?n:i];s(Math.max(0,e-t.options.scrollMargin))};h();const c=e=>{const s=e.currentTarget,o=s[n],c=s[i];(t.options.horizontal?l-o:r-c)&&h(),l=o,r=c};return t.scrollElement.addEventListener("scroll",c,{capture:!1,passive:!0}),()=>{t.scrollElement.removeEventListener("scroll",c)}},l=i("element"),r=i("window"),h=(e,t)=>Math.round(e.getBoundingClientRect()[t.options.horizontal?"width":"height"]);e.Virtualizer=class{constructor(e){var o=this;this.unsubs=[],this.scrollElement=null,this.isScrolling=!1,this.isScrollingTimeoutId=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.scrollDelta=0,this.measureElementCache={},this.getResizeObserver=(()=>{let e=null;return()=>e||("undefined"!=typeof ResizeObserver?e=new ResizeObserver((e=>{e.forEach((e=>{this._measureElement(e.target,!1)}))})):null)})(),this.range={startIndex:0,endIndex:0},this.setOptions=e=>{Object.entries(e).forEach((t=>{let[s,n]=t;void 0===n&&delete e[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:s,rangeExtractor:n,enableSmoothScroll:!0,onChange:()=>{},measureElement:h,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,indexAttribute:"data-index",...e}},this.notify=()=>{var e,t;null==(e=(t=this.options).onChange)||e.call(t,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((e=>e())),this.unsubs=[],this.scrollElement=null},this._didMount=()=>()=>{var e;null==(e=this.getResizeObserver())||e.disconnect(),this.measureElementCache={},this.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e?(this.cleanup(),this.scrollElement=e,this._scrollToOffset(this.scrollOffset,{canSmooth:!1,sync:!0,requested:!1}),this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{null!==this.isScrollingTimeoutId&&(clearTimeout(this.isScrollingTimeoutId),this.isScrollingTimeoutId=null),this.scrollOffset!==e?(this.scrollOffset=e,this.isScrolling=!0,this.scrollDelta=0,this.isScrollingTimeoutId=setTimeout((()=>{this.isScrollingTimeoutId=null,this.isScrolling=!1,this.notify()}),this.options.scrollingDelay)):(this.isScrolling=!1,this.scrollDelta=0),this.calculateRange()})))):this.isScrolling||this.calculateRange()},this.getSize=()=>this.scrollRect[this.options.horizontal?"width":"height"],this.getMeasurements=t((()=>[this.options.count,this.options.paddingStart,this.options.getItemKey,this.itemMeasurementsCache]),((e,t,s,n)=>{const o=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const i=this.measurementsCache.slice(0,o);for(let l=o;l<e;l++){const e=s(l),o=n[e],r=i[l-1]?i[l-1].end:t,h="number"==typeof o?o:this.options.estimateSize(l),c=r+h;i[l]={index:l,start:r,size:h,end:c,key:e}}return this.measurementsCache=i,i}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=t((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((e,t,s)=>{const n=function(e){let{measurements:t,outerSize:s,scrollOffset:n}=e;const o=t.length-1,i=((e,t,s,n)=>{for(;e<=t;){const o=(e+t)/2|0,i=s(o);if(i<n)e=o+1;else{if(!(i>n))return o;t=o-1}}return e>0?e-1:0})(0,o,(e=>t[e].start),n);let l=i;for(;l<o&&t[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:s});return n.startIndex===this.range.startIndex&&n.endIndex===this.range.endIndex||(this.range=n,this.notify()),this.range}),{key:!1,debug:()=>this.options.debug}),this.getIndexes=t((()=>[this.options.rangeExtractor,this.range,this.options.overscan,this.options.count]),((e,t,s,n)=>e({...t,overscan:s,count:n})),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=e=>{const t=this.options.indexAttribute,s=e.getAttribute(t);return s?parseInt(s,10):(console.warn("Missing attribute name '"+t+"={index}' on measured element."),-1)},this._measureElement=(e,t)=>{var s;const n=this.indexFromElement(e),o=this.measurementsCache[n];if(!o)return;const i=this.measureElementCache[o.key],l=this.getResizeObserver();if(!e.isConnected)return void(i&&(null==l||l.unobserve(i),delete this.measureElementCache[o.key]));i&&i===e||(i&&(null==l||l.unobserve(i)),this.measureElementCache[o.key]=e,null==l||l.observe(e));const r=this.options.measureElement(e,this),h=r-(null!=(s=this.itemMeasurementsCache[o.key])?s:o.size);0!==h&&(o.start<this.scrollOffset&&this.isScrolling&&void 0===this.destinationOffset&&(this.scrollDelta+=h,this._scrollToOffset(this.scrollOffset+this.scrollDelta,{canSmooth:!1,sync:!1,requested:!1})),this.pendingMeasuredCacheIndexes.push(n),this.itemMeasurementsCache={...this.itemMeasurementsCache,[o.key]:r},this.notify())},this.measureElement=e=>{e&&this._measureElement(e,!0)},this.getVirtualItems=t((()=>[this.getIndexes(),this.getMeasurements()]),((e,t)=>{const s=[];for(let n=0,o=e.length;n<o;n++){const o=t[e[n]];s.push(o)}return s}),{key:!1,debug:()=>this.options.debug}),this.scrollToOffset=function(e,t){let{align:s="start",smoothScroll:n=o.options.enableSmoothScroll}=void 0===t?{}:t;const i=o.scrollOffset,l=o.getSize();"auto"===s&&(s=e<=i?"start":e>=i+l?"end":"start");const r={canSmooth:n,sync:!1,requested:!0};"start"===s?o._scrollToOffset(e,r):"end"===s?o._scrollToOffset(e-l,r):"center"===s&&o._scrollToOffset(e-l/2,r)},this.scrollToIndex=function(e,t){let{align:s="auto",smoothScroll:n=o.options.enableSmoothScroll,...i}=void 0===t?{}:t;const l=o.getMeasurements(),r=o.scrollOffset,h=o.getSize(),{count:c}=o.options,a=l[Math.max(0,Math.min(e,c-1))];if(!a)return;if("auto"===s)if(a.end>=r+h-o.options.scrollPaddingEnd)s="end";else{if(!(a.start<=r+o.options.scrollPaddingStart))return;s="start"}const u="end"===s?a.end+o.options.scrollPaddingEnd:a.start-o.options.scrollPaddingStart;o.scrollToOffset(u,{align:s,smoothScroll:n,...i})},this.getTotalSize=()=>{var e;return((null==(e=this.getMeasurements()[this.options.count-1])?void 0:e.end)||this.options.paddingStart)+this.options.paddingEnd},this._scrollToOffset=(e,t)=>{let s,{requested:n,canSmooth:o,sync:i}=t;clearTimeout(this.scrollCheckFrame),n&&(this.destinationOffset=e),this.options.scrollToFn(e,{canSmooth:o,sync:i},this);const l=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,l()):this.destinationOffset=void 0)}),100)};l()},this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(e),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset,this.calculateRange()}},e.defaultKeyExtractor=s,e.defaultRangeExtractor=n,e.elementScroll=(e,t,s)=>{var n;let{canSmooth:o,sync:i}=t;const l=i?e:e+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},e.measureElement=h,e.memo=t,e.observeElementOffset=l,e.observeElementRect=(e,t)=>{const s=new ResizeObserver((e=>{var s,n;t({width:null==(s=e[0])?void 0:s.contentRect.width,height:null==(n=e[0])?void 0:n.contentRect.height})}));if(e.scrollElement)return t(e.scrollElement.getBoundingClientRect()),s.observe(e.scrollElement),()=>{s.unobserve(e.scrollElement)}},e.observeWindowOffset=r,e.observeWindowRect=(e,t)=>{const s=((e,t)=>{let s={height:-1,width:-1};return n=>{(e.options.horizontal?n.width!==s.width:n.height!==s.height)&&t(n),s=n}})(e,t),n=()=>s({width:e.scrollElement.innerWidth,height:e.scrollElement.innerHeight});if(e.scrollElement)return n(),e.scrollElement.addEventListener("resize",n,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("resize",n)}},e.windowScroll=(e,t,s)=>{var n;let{canSmooth:o,sync:i}=t;const l=i?e:e+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},Object.defineProperty(e,"__esModule",{value:!0})}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -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 },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\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 opts?.onChange?.(result)\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 return result!\n }\n}\n","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\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\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends unknown,\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: { canSmooth: boolean; sync: boolean },\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 el: TItemElement,\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 enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends unknown,\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 measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<string, TItemElement> = {}\n private ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, false)\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\n this.calculateRange()\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 enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\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 return () => {\n this.ro.disconnect()\n this.measureElementCache = {}\n\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 this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\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.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\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 = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\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 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 const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: 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 _measureElement = (node: TItemElement, _sync: boolean) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n const key = String(item.key)\n\n const prevNode = this.measureElementCache[key]\n\n if (!node.isConnected) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n delete this.measureElementCache[key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n }\n this.measureElementCache[key] = node\n this.ro.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === undefined) {\n this.scrollDelta += measuredItemSize - itemSize\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\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 scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\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","result","deps","depTime","key","debug","Date","now","newDeps","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","scrollProps","element","window","createOffsetObserver","mode","instance","cb","scrollElement","propX","propY","prevX","prevY","scroll","offset","options","horizontal","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","ro","ResizeObserver","entries","forEach","entry","_measureElement","setOptions","Object","_ref3","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","scrollingDelay","indexAttribute","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","canSmooth","sync","requested","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref5","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","parseInt","warn","_sync","_this$itemMeasurement","item","prevNode","isConnected","unobserve","observe","measuredItemSize","itemSize","undefined","destinationOffset","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","getTotalSize","_this$getMeasurements","_ref4","scrollCheckFrame","scrollToFn","check","lastOffset","measure","_ref2","_instance$scrollEleme2","scrollTo","behavior","observer","_entries$","_entries$2","contentRect","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_ref","_instance$scrollEleme"],"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 },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\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 opts?.onChange?.(result)\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 return result!\n }\n}\n","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\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\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends unknown,\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: { canSmooth: boolean; sync: boolean },\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 el: TItemElement,\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 enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends unknown,\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 measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<Key, TItemElement> = {}\n private getResizeObserver = (() => {\n let _ro: ResizeObserver | null = null\n\n return () => {\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, false)\n })\n }))\n } else {\n return null\n }\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\n this.calculateRange()\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 enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\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 return () => {\n this.getResizeObserver()?.disconnect()\n this.measureElementCache = {}\n\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 this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\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.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\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 = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\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 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 const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: 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 = (node: TItemElement, _sync: boolean) => {\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[item.key]\n\n const ro = this.getResizeObserver()\n\n if (!node.isConnected) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n delete this.measureElementCache[item.key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n }\n this.measureElementCache[item.key] = node\n ro?.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (\n item.start < this.scrollOffset &&\n this.isScrolling &&\n this.destinationOffset === undefined\n ) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n this.scrollDelta += delta\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\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 scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\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","result","deps","depTime","key","debug","Date","now","newDeps","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","scrollProps","element","window","createOffsetObserver","mode","instance","cb","scrollElement","propX","propY","prevX","prevY","scroll","offset","options","horizontal","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","getResizeObserver","_ro","ResizeObserver","entries","forEach","entry","_measureElement","setOptions","Object","_ref3","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","scrollingDelay","indexAttribute","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_this$getResizeObserv","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","canSmooth","sync","requested","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref5","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","parseInt","warn","_sync","_this$itemMeasurement","item","prevNode","ro","isConnected","unobserve","observe","measuredItemSize","delta","undefined","destinationOffset","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","getTotalSize","_this$getMeasurements","_ref4","scrollCheckFrame","scrollToFn","check","lastOffset","measure","_ref2","_instance$scrollEleme2","scrollTo","behavior","observer","_entries$","_entries$2","contentRect","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_ref","_instance$scrollEleme"],"mappings":";;;;;;;;;;mPAIO,SAASA,EACdC,EACAC,EACAC,GAMA,IACIC,EADAC,EAAc,GAGlB,MAAO,KACL,IAAIC,EACAH,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWF,EAAUG,KAAKC,OAE/C,MAAMC,EAAUV,IAMhB,KAHEU,EAAQC,SAAWP,EAAKO,QACxBD,EAAQE,MAAK,CAACC,EAAUC,IAAkBV,EAAKU,KAAWD,KAG1D,OAAOV,EAKT,IAAIY,EAMJ,GARAX,EAAOM,EAGHR,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWQ,EAAaP,KAAKC,OAElDN,EAASF,KAAMS,GACX,MAAJR,SAAAA,EAAMc,UAANd,EAAMc,SAAWb,GAEbD,EAAKI,KAAL,MAAYJ,EAAKK,OAALL,EAAKK,QAAW,CAC9B,MAAMU,EAAaC,KAAKC,MAAgC,KAAzBX,KAAKC,MAAQJ,IAAmB,IACzDe,EAAgBF,KAAKC,MAAmC,KAA5BX,KAAKC,MAAQM,IAAsB,IAC/DM,EAAsBD,EAAgB,GAEtCE,EAAM,CAACC,EAAsBC,KAEjC,IADAD,EAAME,OAAOF,GACNA,EAAIZ,OAASa,GAClBD,EAAM,IAAMA,EAEd,OAAOA,CAAP,EAGFG,QAAQC,KAAR,OACSL,EAAIF,EAAe,GAD5B,KACmCE,EAAIL,EAAY,oGAIhCC,KAAKU,IAChB,EACAV,KAAKW,IAAI,IAAM,IAAMR,EAAqB,MAPlD,iBASEnB,MAAAA,OAAAA,EAAAA,EAAMI,IAET,CAED,OAAOH,CAAP,CAEH,CCzBY2B,MAAAA,EAAuBhB,GAAkBA,EAEzCiB,EAAyBC,IACpC,MAAMC,EAAQf,KAAKU,IAAII,EAAME,WAAaF,EAAMG,SAAU,GACpDC,EAAMlB,KAAKW,IAAIG,EAAMK,SAAWL,EAAMG,SAAUH,EAAMM,MAAQ,GAE9DC,EAAM,GAEZ,IAAK,IAAIC,EAAIP,EAAOO,GAAKJ,EAAKI,IAC5BD,EAAIE,KAAKD,GAGX,OAAOD,CAAP,EA2EIG,EAAc,CAClBC,QAAS,CAAC,aAAc,aACxBC,OAAQ,CAAC,UAAW,YAGhBC,EAAwBC,GACrB,CAACC,EAAiCC,KACvC,IAAKD,EAASE,cACZ,OAGF,MAAMC,EAAQR,EAAYI,GAAM,GAC1BK,EAAQT,EAAYI,GAAM,GAEhC,IAAIM,EAAgBL,EAASE,cAAcC,GACvCG,EAAgBN,EAASE,cAAcE,GAE3C,MAAMG,EAAS,KACb,MAAMC,EACJR,EAASE,cAAcF,EAASS,QAAQC,WAAaP,EAAQC,GAE/DH,EAAG9B,KAAKU,IAAI,EAAG2B,EAASR,EAASS,QAAQE,cAAzC,EAGFJ,IAEA,MAAMK,EAAYC,IAChB,MAAMC,EAASD,EAAEE,cACXC,EAAUF,EAAOX,GACjBc,EAAUH,EAAOV,IAEnBJ,EAASS,QAAQC,WAAaL,EAAQW,EAAUV,EAAQW,IAC1DV,IAGFF,EAAQW,EACRV,EAAQW,CAAR,EAQF,OALAjB,EAASE,cAAcgB,iBAAiB,SAAUN,EAAU,CAC1DO,SAAS,EACTC,SAAS,IAGJ,KACLpB,EAASE,cAAcmB,oBAAoB,SAAUT,EAArD,CADF,EAMSU,EAAuBxB,EAAqB,WAC5CyB,EAAsBzB,EAAqB,UAE3C0B,EAAiB,CAC5B5B,EACAI,IAEO7B,KAAKC,MACVwB,EAAQ6B,wBACNzB,EAASS,QAAQC,WAAa,QAAU,yBA8EvC,MAwCLgB,YAAYvE,GAAwD,IAAAwE,EAAAC,KAAAA,KApC5DC,OAAkC,GAoC0BD,KAlCpE1B,cAAuC,KAkC6B0B,KAjCpEE,aAAuB,EAiC6CF,KAhC5DG,qBAA6D,KAgCDH,KA/BpEI,kBAAmC,GA+BiCJ,KA9B5DK,sBAA6C,GA8BeL,KA7B5DM,4BAAwC,GA6BoBN,KA1B5DO,YAAsB,EA0BsCP,KAvB5DQ,oBAAiD,GAuBWR,KAtB5DS,kBAAoB,MAC1B,IAAIC,EAA6B,KAEjC,MAAO,IACDA,IAEiC,oBAAnBC,eACRD,EAAM,IAAIC,gBAAgBC,IAChCA,EAAQC,SAASC,IACfd,KAAKe,gBAAgBD,EAAM5B,QAAwB,EAAnD,GADF,IAKK,KAbe,EAAA,GAsBwCc,KALpE3C,MAAkD,CAChDE,WAAY,EACZG,SAAU,GAGwDsC,KAQpEgB,WAAczF,IACZ0F,OAAOL,QAAQrF,GAAMsF,SAAQK,IAAkB,IAAhBvF,EAAKwF,GAAWD,OACxB,IAAVC,UAA+B5F,EAAaI,EAArB,IAGpCqE,KAAKnB,QAAU,CACbjD,OAAO,EACPwF,cAAe,EACf5D,SAAU,EACV6D,aAAc,EACdC,WAAY,EACZC,mBAAoB,EACpBC,iBAAkB,EAClB1C,YAAY,EACZ2C,WAAYtE,EACZuE,eAAgBtE,EAChBuE,oBAAoB,EACpBtF,SAAU,OACVuD,iBACAgC,YAAa,CAAEC,MAAO,EAAGC,OAAQ,GACjC/C,aAAc,EACdgD,eAAgB,IAChBC,eAAgB,gBACbzG,EAlBL,EAbkEyE,KAmC5DiC,OAAS,KAAM,IAAAC,EAAAC,EACrB,OAAAD,GAAAC,EAAAnC,KAAKnB,SAAQxC,WAAb6F,EAAAE,KAAAD,EAAwBnC,KAAxB,EApCkEA,KAuC5DqC,QAAU,KAChBrC,KAAKC,OAAOqC,OAAOC,SAAS1B,SAAS2B,GAAMA,MAC3CxC,KAAKC,OAAS,GACdD,KAAK1B,cAAgB,IAArB,EA1CkE0B,KA6CpEyC,UAAY,IACH,KAAM,IAAAC,SACNjC,EAAAA,KAAAA,wBAAqBkC,aAC1B3C,KAAKQ,oBAAsB,GAE3BR,KAAKqC,SAAL,EAlDgErC,KAsDpE4C,YAAc,KACZ,MAAMtE,EAAgB0B,KAAKnB,QAAQgE,mBAE/B7C,KAAK1B,gBAAkBA,GACzB0B,KAAKqC,UAELrC,KAAK1B,cAAgBA,EACrB0B,KAAK8C,gBAAgB9C,KAAK+C,aAAc,CACtCC,WAAW,EACXC,MAAM,EACNC,WAAW,IAGblD,KAAKC,OAAOnC,KACVkC,KAAKnB,QAAQsE,mBAAmBnD,MAAOoD,IACrCpD,KAAKqD,WAAaD,EAClBpD,KAAKsD,gBAAL,KAIJtD,KAAKC,OAAOnC,KACVkC,KAAKnB,QAAQa,qBAAqBM,MAAOpB,IACL,OAA9BoB,KAAKG,uBACPoD,aAAavD,KAAKG,sBAClBH,KAAKG,qBAAuB,MAG1BH,KAAK+C,eAAiBnE,GACxBoB,KAAK+C,aAAenE,EACpBoB,KAAKE,aAAc,EACnBF,KAAKO,YAAc,EAEnBP,KAAKG,qBAAuBqD,YAAW,KACrCxD,KAAKG,qBAAuB,KAC5BH,KAAKE,aAAc,EAEnBF,KAAKiC,QAAL,GACCjC,KAAKnB,QAAQkD,kBAEhB/B,KAAKE,aAAc,EACnBF,KAAKO,YAAc,GAGrBP,KAAKsD,gBAAL,MAGMtD,KAAKE,aACfF,KAAKsD,gBACN,EAtGiEtD,KAyG5DyD,QAAU,IACTzD,KAAKqD,WAAWrD,KAAKnB,QAAQC,WAAa,QAAU,UA1GOkB,KA6G5D0D,gBAAkBtI,GACxB,IAAM,CACJ4E,KAAKnB,QAAQlB,MACbqC,KAAKnB,QAAQwC,aACbrB,KAAKnB,QAAQ4C,WACbzB,KAAKK,yBAEP,CAAC1C,EAAO0D,EAAcI,EAAYrB,KAChC,MAAMlD,EACJ8C,KAAKM,4BAA4BtE,OAAS,EACtCO,KAAKW,OAAO8C,KAAKM,6BACjB,EACNN,KAAKM,4BAA8B,GAEnC,MAAMqD,EAAe3D,KAAKI,kBAAkBwD,MAAM,EAAG1G,GAErD,IAAK,IAAIW,EAAIX,EAAKW,EAAIF,EAAOE,IAAK,CAChC,MAAMlC,EAAM8F,EAAW5D,GACjBgG,EAAezD,EAAkBzE,GACjC2B,EAAQqG,EAAa9F,EAAI,GAC3B8F,EAAa9F,EAAI,GAAIJ,IACrB4D,EACEyC,EACoB,iBAAjBD,EACHA,EACA7D,KAAKnB,QAAQkF,aAAalG,GAC1BJ,EAAMH,EAAQwG,EACpBH,EAAa9F,GAAK,CAAE1B,MAAO0B,EAAGP,QAAOwG,OAAMrG,MAAK9B,MACjD,CAGD,OADAqE,KAAKI,kBAAoBuD,EAClBA,CAAP,GAEF,CACEhI,KAAKqI,EACLpI,MAAO,IAAMoE,KAAKnB,QAAQjD,QAhJsCoE,KAoJpEsD,eAAiBlI,GACf,IAAM,CAAC4E,KAAK0D,kBAAmB1D,KAAKyD,UAAWzD,KAAK+C,gBACpD,CAACY,EAAcM,EAAWlB,KACxB,MAAM1F,EAiSZ,SAQG6G,GAAA,IARqBP,aACtBA,EADsBM,UAEtBA,EAFsBlB,aAGtBA,GAKCmB,EACD,MAAMvG,EAAQgG,EAAa3H,OAAS,EAG9BuB,EAtCwB,EAC9B4G,EACAC,EACAC,EACAlD,KAEA,KAAOgD,GAAOC,GAAM,CAClB,MAAME,GAAWH,EAAMC,GAAQ,EAAK,EAC9BG,EAAeF,EAAgBC,GAErC,GAAIC,EAAepD,EACjBgD,EAAMG,EAAS,MACV,MAAIC,EAAepD,GAGxB,OAAOmD,EAFPF,EAAOE,EAAS,CAGjB,CACF,CAED,OAAIH,EAAM,EACDA,EAAM,EAEN,CACR,EAekBK,CAAwB,EAAG7G,GAF3BxB,GAAkBwH,EAAaxH,GAAQmB,OAEMyF,GAChE,IAAIrF,EAAWH,EAEf,KACEG,EAAWC,GACXgG,EAAajG,GAAWD,IAAMsF,EAAekB,GAE7CvG,IAGF,MAAO,CAAEH,aAAYG,WACtB,CAxTmB4F,CAAe,CAC3BK,eACAM,YACAlB,iBASF,OANE1F,EAAME,aAAeyC,KAAK3C,MAAME,YAChCF,EAAMK,WAAasC,KAAK3C,MAAMK,WAE9BsC,KAAK3C,MAAQA,EACb2C,KAAKiC,UAEAjC,KAAK3C,KAAZ,GAEF,CACE1B,KAAKqI,EACLpI,MAAO,IAAMoE,KAAKnB,QAAQjD,QAvKsCoE,KA2K5DyE,WAAarJ,GACnB,IAAM,CACJ4E,KAAKnB,QAAQ6C,eACb1B,KAAK3C,MACL2C,KAAKnB,QAAQrB,SACbwC,KAAKnB,QAAQlB,SAEf,CAAC+D,EAAgBrE,EAAOG,EAAUG,IACzB+D,EAAe,IACjBrE,EACHG,WACAG,MAAOA,KAGX,CACEhC,KAAKqI,EACLpI,MAAO,IAAMoE,KAAKnB,QAAQjD,QA3LsCoE,KA+LpE0E,iBAAoBC,IAClB,MAAMC,EAAgB5E,KAAKnB,QAAQmD,eAC7B6C,EAAWF,EAAKG,aAAaF,GAEnC,OAAKC,EAOEE,SAASF,EAAU,KANxB9H,QAAQiI,KAAR,2BAC6BJ,EAD7B,mCAGQ,EAGV,EA1MkE5E,KA6M5De,gBAAkB,CAAC4D,EAAoBM,KAAmB,IAAAC,EAChE,MAAM/I,EAAQ6D,KAAK0E,iBAAiBC,GAE9BQ,EAAOnF,KAAKI,kBAAkBjE,GACpC,IAAKgJ,EACH,OAGF,MAAMC,EAAWpF,KAAKQ,oBAAoB2E,EAAKxJ,KAEzC0J,EAAKrF,KAAKS,oBAEhB,IAAKkE,EAAKW,YAKR,YAJIF,UACFC,GAAAA,EAAIE,UAAUH,UACPpF,KAAKQ,oBAAoB2E,EAAKxJ,OAKpCyJ,GAAYA,IAAaT,IACxBS,UACFC,GAAAA,EAAIE,UAAUH,IAEhBpF,KAAKQ,oBAAoB2E,EAAKxJ,KAAOgJ,QACrCU,GAAAA,EAAIG,QAAQb,IAGd,MAAMc,EAAmBzF,KAAKnB,QAAQe,eAAe+E,EAAM3E,MAIrD0F,EAAQD,GAFA,OAAAP,EAAGlF,KAAKK,sBAAsB8E,EAAKxJ,MAAnCuJ,EAA2CC,EAAKrB,MAIhD,IAAV4B,IAEAP,EAAK7H,MAAQ0C,KAAK+C,cAClB/C,KAAKE,kBACsByF,IAA3B3F,KAAK4F,oBAKL5F,KAAKO,aAAemF,EAEpB1F,KAAK8C,gBAAgB9C,KAAK+C,aAAe/C,KAAKO,YAAa,CACzDyC,WAAW,EACXC,MAAM,EACNC,WAAW,KAIflD,KAAKM,4BAA4BxC,KAAK3B,GACtC6D,KAAKK,sBAAwB,IACxBL,KAAKK,sBACR,CAAC8E,EAAKxJ,KAAM8J,GAEdzF,KAAKiC,SACN,EAvQiEjC,KA0QpEJ,eAAkB+E,IACXA,GAIL3E,KAAKe,gBAAgB4D,GAAM,EAA3B,EA/QkE3E,KAkRpE6F,gBAAkBzK,GAChB,IAAM,CAAC4E,KAAKyE,aAAczE,KAAK0D,qBAC/B,CAACoC,EAASnC,KACR,MAAMoC,EAA8B,GAEpC,IAAK,IAAIC,EAAI,EAAGC,EAAMH,EAAQ9J,OAAQgK,EAAIC,EAAKD,IAAK,CAClD,MACME,EAAcvC,EADVmC,EAAQE,IAGlBD,EAAajI,KAAKoI,EACnB,CAED,OAAOH,CAAP,GAEF,CACEpK,KAAKqI,EACLpI,MAAO,IAAMoE,KAAKnB,QAAQjD,QAlSsCoE,KAsSpEmG,eAAiB,SACfC,EAKGC,GAAA,IAJHC,MACEA,EAAQ,QADVC,aAEEA,EAAexG,EAAKlB,QAAQ8C,+BACH,CAAA,EACxB0E,EACH,MAAMzH,EAASmB,EAAKgD,aACde,EAAO/D,EAAK0D,UAEJ,SAAV6C,IAEAA,EADEF,GAAYxH,EACN,QACCwH,GAAYxH,EAASkF,EACtB,MAEA,SAIZ,MAAMjF,EAAU,CACdmE,UAAWuD,EACXtD,MAAM,EACNC,WAAW,GAEC,UAAVoD,EACFvG,EAAK+C,gBAAgBsD,EAAUvH,GACZ,QAAVyH,EACTvG,EAAK+C,gBAAgBsD,EAAWtC,EAAMjF,GACnB,WAAVyH,GACTvG,EAAK+C,gBAAgBsD,EAAWtC,EAAO,EAAGjF,IApUsBmB,KAwUpEwG,cAAgB,SACdrK,EAMGsK,GAAA,IALHH,MACEA,EAAQ,OADVC,aAEEA,EAAexG,EAAKlB,QAAQ8C,sBACzB+E,cACqB,CAAA,EACvBD,EACH,MAAM9C,EAAe5D,EAAK2D,kBACpB9E,EAASmB,EAAKgD,aACde,EAAO/D,EAAK0D,WACZ9F,MAAEA,GAAUoC,EAAKlB,QAEjBqH,EAAcvC,EAAapH,KAAKU,IAAI,EAAGV,KAAKW,IAAIf,EAAOwB,EAAQ,KAErE,IAAKuI,EACH,OAGF,GAAc,SAAVI,EACF,GAAIJ,EAAYzI,KAAOmB,EAASkF,EAAO/D,EAAKlB,QAAQ2C,iBAClD8E,EAAQ,UACH,MACLJ,EAAY5I,OACZsB,EAASmB,EAAKlB,QAAQ0C,oBAItB,OAFA+E,EAAQ,OAGT,CAGH,MAAMF,EACM,QAAVE,EACIJ,EAAYzI,IAAMsC,EAAKlB,QAAQ2C,iBAC/B0E,EAAY5I,MAAQyC,EAAKlB,QAAQ0C,mBAEvCxB,EAAKoG,eAAeC,EAAU,CAAEE,QAAOC,kBAAiBG,KA7WU1G,KAgXpE2G,aAAe,KAAA,IAAAC,EAAA,sBACPlD,kBAAkB1D,KAAKnB,QAAQlB,MAAQ,aAAIF,MAC/CuC,KAAKnB,QAAQwC,cAAgBrB,KAAKnB,QAAQyC,UAF/B,EAhXqDtB,KAoX5D8C,gBAAkB,CACxBlE,EAMGiI,KAAA,IAQCC,GAbJ5D,UACEA,EADFF,UAEEA,EAFFC,KAGEA,GAEC4D,EACHtD,aAAavD,KAAK8G,kBAEd5D,IACFlD,KAAK4F,kBAAoBhH,GAE3BoB,KAAKnB,QAAQkI,WAAWnI,EAAQ,CAAEoE,YAAWC,QAAQjD,MAIrD,MAAMgH,EAAQ,KACZ,IAAIC,EAAajH,KAAK+C,aACtB/C,KAAK8G,iBAAmBA,EAAmBtD,YAAW,KAChDxD,KAAK8G,mBAAqBA,IAI1B9G,KAAK+C,eAAiBkE,GAI1BA,EAAajH,KAAK+C,aAClBiE,KAJEhH,KAAK4F,uBAAoBD,EAItB,GACJ,IAXH,EAcFqB,GAAK,EArZ6DhH,KAwZpEkH,QAAU,KACRlH,KAAKK,sBAAwB,GAC7BL,KAAKiC,QAAL,EAzZAjC,KAAKgB,WAAWzF,GAChByE,KAAKqD,WAAarD,KAAKnB,QAAQ+C,YAC/B5B,KAAK+C,aAAe/C,KAAKnB,QAAQuC,cAEjCpB,KAAKsD,gBACN,qEA1G0B,CAC3B1E,EAD2BuI,EAG3B/I,KACG,IAAAgJ,EAAA,IAFHpE,UAAEA,EAAFC,KAAaA,GAEVkE,EACH,MAAMf,EAAWnD,EAAOrE,EAASA,EAASR,EAASS,QAAQE,oBAE1DqI,EAAChJ,EAASE,gBAAV,QAAqC+I,UAArCD,EAAqCC,SAAW,CAC/C,CAACjJ,EAASS,QAAQC,WAAa,OAAS,OAAQsH,EAChDkB,SAAUtE,EAAY,cAAW2C,GAFlC,4EAzI+B,CAChCvH,EACAC,KAEA,MAAMkJ,EAAW,IAAI5G,gBAAgBC,IAAY,IAAA4G,EAAAC,EAC/CpJ,EAAG,CACDwD,MAAO,OAAF2F,EAAE5G,EAAQ,SAAR,EAAA4G,EAAYE,YAAY7F,MAC/BC,OAAQ,OAAF2F,EAAE7G,EAAQ,SAAR,EAAA6G,EAAYC,YAAY5F,QAFlC,IAMF,GAAK1D,EAASE,cAQd,OAJAD,EAAGD,EAASE,cAAcuB,yBAE1B0H,EAAS/B,QAAQpH,EAASE,eAEnB,KACLiJ,EAAShC,UAAUnH,EAASE,cAA5B,CADF,8CAK+B,CAC/BF,EACAC,KAEA,MAAMsJ,EA/CiB,EACvBvJ,EACAC,KAEA,IAAIuJ,EAAa,CAAE9F,QAAS,EAAGD,OAAQ,GAEvC,OAAQuB,KAEJhF,EAASS,QAAQC,WACbsE,EAAKvB,QAAU+F,EAAK/F,MACpBuB,EAAKtB,SAAW8F,EAAK9F,SAEzBzD,EAAG+E,GAGLwE,EAAOxE,CAAP,CATF,EAyCyByE,CAAiBzJ,EAAUC,GAC9CyJ,EAAW,IACfH,EAAiB,CACf9F,MAAOzD,EAASE,cAAcyJ,WAC9BjG,OAAQ1D,EAASE,cAAc0J,cAGnC,GAAK5J,EAASE,cAWd,OAPAwJ,IAEA1J,EAASE,cAAcgB,iBAAiB,SAAUwI,EAAU,CAC1DvI,SAAS,EACTC,SAAS,IAGJ,KACLpB,EAASE,cAAcmB,oBAAoB,SAAUqI,EAArD,CADF,iBAuE0B,CAC1BlJ,EAD0BqJ,EAG1B7J,KACG,IAAA8J,EAAA,IAFHlF,UAAEA,EAAFC,KAAaA,GAEVgF,EACH,MAAM7B,EAAWnD,EAAOrE,EAASA,EAASR,EAASS,QAAQE,oBAE1DmJ,EAAC9J,EAASE,gBAAV,QAAoC+I,UAApCa,EAAoCb,SAAW,CAC9C,CAACjJ,EAASS,QAAQC,WAAa,OAAS,OAAQsH,EAChDkB,SAAUtE,EAAY,cAAW2C,GAFlC"}
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.21",
4
+ "version": "3.0.0-beta.23",
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
@@ -280,12 +280,24 @@ export class Virtualizer<
280
280
  private scrollDelta: number = 0
281
281
  private destinationOffset: undefined | number
282
282
  private scrollCheckFrame!: ReturnType<typeof setTimeout>
283
- private measureElementCache: Record<string, TItemElement> = {}
284
- private ro = new ResizeObserver((entries) => {
285
- entries.forEach((entry) => {
286
- this._measureElement(entry.target as TItemElement, false)
287
- })
288
- })
283
+ private measureElementCache: Record<Key, TItemElement> = {}
284
+ private getResizeObserver = (() => {
285
+ let _ro: ResizeObserver | null = null
286
+
287
+ return () => {
288
+ if (_ro) {
289
+ return _ro
290
+ } else if (typeof ResizeObserver !== 'undefined') {
291
+ return (_ro = new ResizeObserver((entries) => {
292
+ entries.forEach((entry) => {
293
+ this._measureElement(entry.target as TItemElement, false)
294
+ })
295
+ }))
296
+ } else {
297
+ return null
298
+ }
299
+ }
300
+ })()
289
301
  range: { startIndex: number; endIndex: number } = {
290
302
  startIndex: 0,
291
303
  endIndex: 0,
@@ -338,7 +350,7 @@ export class Virtualizer<
338
350
 
339
351
  _didMount = () => {
340
352
  return () => {
341
- this.ro.disconnect()
353
+ this.getResizeObserver()?.disconnect()
342
354
  this.measureElementCache = {}
343
355
 
344
356
  this.cleanup()
@@ -496,52 +508,56 @@ export class Virtualizer<
496
508
  return parseInt(indexStr, 10)
497
509
  }
498
510
 
499
- _measureElement = (node: TItemElement, _sync: boolean) => {
511
+ private _measureElement = (node: TItemElement, _sync: boolean) => {
500
512
  const index = this.indexFromElement(node)
501
513
 
502
514
  const item = this.measurementsCache[index]
503
515
  if (!item) {
504
516
  return
505
517
  }
506
- const key = String(item.key)
507
518
 
508
- const prevNode = this.measureElementCache[key]
519
+ const prevNode = this.measureElementCache[item.key]
520
+
521
+ const ro = this.getResizeObserver()
509
522
 
510
523
  if (!node.isConnected) {
511
524
  if (prevNode) {
512
- this.ro.unobserve(prevNode)
513
- delete this.measureElementCache[key]
525
+ ro?.unobserve(prevNode)
526
+ delete this.measureElementCache[item.key]
514
527
  }
515
528
  return
516
529
  }
517
530
 
518
531
  if (!prevNode || prevNode !== node) {
519
532
  if (prevNode) {
520
- this.ro.unobserve(prevNode)
533
+ ro?.unobserve(prevNode)
521
534
  }
522
- this.measureElementCache[key] = node
523
- this.ro.observe(node)
535
+ this.measureElementCache[item.key] = node
536
+ ro?.observe(node)
524
537
  }
525
538
 
526
539
  const measuredItemSize = this.options.measureElement(node, this)
527
540
 
528
541
  const itemSize = this.itemMeasurementsCache[item.key] ?? item.size
529
542
 
530
- if (measuredItemSize !== itemSize) {
531
- if (item.start < this.scrollOffset) {
543
+ const delta = measuredItemSize - itemSize
544
+
545
+ if (delta !== 0) {
546
+ if (
547
+ item.start < this.scrollOffset &&
548
+ this.isScrolling &&
549
+ this.destinationOffset === undefined
550
+ ) {
532
551
  if (process.env.NODE_ENV !== 'production' && this.options.debug) {
533
- console.info('correction', measuredItemSize - itemSize)
552
+ console.info('correction', delta)
534
553
  }
554
+ this.scrollDelta += delta
535
555
 
536
- if (this.destinationOffset === undefined) {
537
- this.scrollDelta += measuredItemSize - itemSize
538
-
539
- this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
540
- canSmooth: false,
541
- sync: false,
542
- requested: false,
543
- })
544
- }
556
+ this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
557
+ canSmooth: false,
558
+ sync: false,
559
+ requested: false,
560
+ })
545
561
  }
546
562
 
547
563
  this.pendingMeasuredCacheIndexes.push(index)