@tanstack/virtual-core 3.0.0-beta.34 → 3.0.0-beta.35

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.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 ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\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(offset)\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 = <T extends Window>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n 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 scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n initialMeasurementsCache?: VirtualItem[]\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemSizeCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n scrollOffset: number\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments: number = 0\n private measureElementCache: Record<Key, TItemElement> = {}\n private pendingScrollToIndexCallback: (() => void) | null = null\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 this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache[item.key] = item.size\n })\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 onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n const ro = this.getResizeObserver()\n Object.values(this.measureElementCache).forEach((node) => ro?.observe(node))\n\n return () => {\n ro?.disconnect()\n\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n this.pendingScrollToIndexCallback?.()\n\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollAdjustments = 0\n\n if (this.scrollOffset === offset) {\n return\n }\n\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n const onIsScrollingChange = (isScrolling: boolean) => {\n if (this.isScrolling !== isScrolling) {\n this.isScrolling = isScrolling\n this.notify()\n }\n }\n\n this.scrollDirection =\n this.scrollOffset < offset ? 'forward' : 'backward'\n\n this.scrollOffset = offset\n\n this.calculateRange()\n\n onIsScrollingChange(true)\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.scrollDirection = null\n onIsScrollingChange(false)\n }, this.options.scrollingDelay)\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.scrollMargin,\n this.options.getItemKey,\n this.itemSizeCache,\n ],\n (count, paddingStart, scrollMargin, getItemKey, itemSizeCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = itemSizeCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart + scrollMargin\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n 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.itemSizeCache[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.scrollDirection === 'backward'\n ) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemSizeCache = {\n ...this.itemSizeCache,\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 getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {\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 if (align === 'start') {\n return toOffset\n } else if (align === 'end') {\n return toOffset - size\n } else if (align === 'center') {\n return toOffset - size / 2\n }\n return toOffset\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n const options = {\n adjustments: undefined,\n behavior,\n sync: false,\n }\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), options)\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', behavior }: ScrollToIndexOptions = {},\n ) => {\n this.pendingScrollToIndexCallback = null\n\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurements = this.getMeasurements()\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n throw new Error(`VirtualItem not found for index = ${index}`)\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 getOffsetForIndexAndAlignment = (measurement: VirtualItem) => {\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n return this.getOffsetForAlignment(toOffset, align)\n }\n\n const toOffset = getOffsetForIndexAndAlignment(measurement)\n\n if (Math.round(toOffset) === Math.round(offset)) {\n return\n }\n\n const options = {\n adjustments: undefined,\n behavior,\n }\n this._scrollToOffset(toOffset, options)\n\n const isDynamic = Object.keys(this.measureElementCache).length > 0\n\n if (isDynamic) {\n this.pendingScrollToIndexCallback = () => {\n this.scrollToIndex(index, { align, behavior })\n }\n }\n }\n\n scrollBy = (adjustments: number, options?: { behavior: ScrollBehavior }) => {\n this._scrollToOffset(this.scrollOffset, {\n adjustments,\n behavior: options?.behavior,\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) -\n this.options.scrollMargin +\n this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = {}\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","resultTime","newDeps","length","some","dep","index","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","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","_ro","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemSizeCache","pendingMeasuredCacheIndexes","scrollDirection","scrollAdjustments","measureElementCache","pendingScrollToIndexCallback","getResizeObserver","ResizeObserver","entries","forEach","entry","_measureElement","setOptions","Object","_ref3","_extends","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","initialRect","width","height","scrollMargin","scrollingDelay","indexAttribute","initialMeasurementsCache","notify","cleanup","filter","Boolean","d","_didMount","ro","values","node","observe","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","adjustments","undefined","behavior","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","onIsScrollingChange","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref7","low","high","getCurrentValue","value","middle","currentValue","findNearestBinarySearch","getIndexes","indexFromElement","attributeName","indexStr","getAttribute","parseInt","warn","_sync","_this$itemSizeCache$i","item","prevNode","isConnected","unobserve","_extends2","measuredItemSize","delta","getVirtualItems","indexes","virtualItems","k","len","measurement","getOffsetForAlignment","toOffset","align","scrollToOffset","_temp","_ref4","_ref4$align","sync","scrollToIndex","_temp2","_ref5","_ref5$align","Error","getOffsetForIndexAndAlignment","keys","scrollBy","getTotalSize","_this$getMeasurements","_ref6","scrollToFn","measure","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","_ref2","scrollTo","observer","_entries$","_entries$2","contentRect","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_instance$scrollEleme","_instance$scrollEleme2","_ref$adjustments","_ref"],"mappings":"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"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/utils.ts","../../src/index.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\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 ScrollDirection = 'forward' | 'backward'\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\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 const entry = entries[0]\n if (entry) {\n const { width, height } = entry.contentRect\n cb({\n width: Math.round(width),\n height: Math.round(height),\n })\n } else {\n cb({ width: 0, height: 0 })\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(offset)\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 = <T extends Window>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments = 0,\n behavior,\n }: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset = offset + adjustments\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n 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 scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n initialMeasurementsCache?: VirtualItem[]\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemSizeCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n scrollOffset: number\n scrollDirection: ScrollDirection | null = null\n private scrollAdjustments: number = 0\n private measureElementCache: Record<Key, TItemElement> = {}\n private pendingScrollToIndexCallback: (() => void) | null = null\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 this.measurementsCache = this.options.initialMeasurementsCache\n this.measurementsCache.forEach((item) => {\n this.itemSizeCache[item.key] = item.size\n })\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 onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n const ro = this.getResizeObserver()\n Object.values(this.measureElementCache).forEach((node) => ro?.observe(node))\n\n return () => {\n ro?.disconnect()\n\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n this.pendingScrollToIndexCallback?.()\n\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollAdjustments = 0\n\n if (this.scrollOffset === offset) {\n return\n }\n\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n const onIsScrollingChange = (isScrolling: boolean) => {\n if (this.isScrolling !== isScrolling) {\n this.isScrolling = isScrolling\n this.notify()\n }\n }\n\n this.scrollDirection =\n this.scrollOffset < offset ? 'forward' : 'backward'\n\n this.scrollOffset = offset\n\n this.calculateRange()\n\n onIsScrollingChange(true)\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.scrollDirection = null\n onIsScrollingChange(false)\n }, this.options.scrollingDelay)\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.scrollMargin,\n this.options.getItemKey,\n this.itemSizeCache,\n ],\n (count, paddingStart, scrollMargin, getItemKey, itemSizeCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = itemSizeCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart + scrollMargin\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n 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.itemSizeCache[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.scrollDirection === 'backward'\n ) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemSizeCache = {\n ...this.itemSizeCache,\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 getOffsetForAlignment = (toOffset: number, align: ScrollAlignment) => {\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 if (align === 'start') {\n return toOffset\n } else if (align === 'end') {\n return toOffset - size\n } else if (align === 'center') {\n return toOffset - size / 2\n }\n return toOffset\n }\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n const options = {\n adjustments: undefined,\n behavior,\n sync: false,\n }\n this._scrollToOffset(this.getOffsetForAlignment(toOffset, align), options)\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', behavior }: ScrollToIndexOptions = {},\n ) => {\n this.pendingScrollToIndexCallback = null\n\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurements = this.getMeasurements()\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n throw new Error(`VirtualItem not found for index = ${index}`)\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 getOffsetForIndexAndAlignment = (measurement: VirtualItem) => {\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n return this.getOffsetForAlignment(toOffset, align)\n }\n\n const toOffset = getOffsetForIndexAndAlignment(measurement)\n\n if (toOffset === offset) {\n return\n }\n\n const options = {\n adjustments: undefined,\n behavior,\n }\n this._scrollToOffset(toOffset, options)\n\n const isDynamic = Object.keys(this.measureElementCache).length > 0\n\n if (isDynamic) {\n this.pendingScrollToIndexCallback = () => {\n this.scrollToIndex(index, { align, behavior })\n }\n }\n }\n\n scrollBy = (adjustments: number, options?: { behavior: ScrollBehavior }) => {\n this._scrollToOffset(this.scrollOffset, {\n adjustments,\n behavior: options?.behavior,\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) -\n this.options.scrollMargin +\n this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, adjustments }, this)\n }\n\n measure = () => {\n this.itemSizeCache = {}\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","resultTime","newDeps","length","some","dep","index","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","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","_ro","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemSizeCache","pendingMeasuredCacheIndexes","scrollDirection","scrollAdjustments","measureElementCache","pendingScrollToIndexCallback","getResizeObserver","ResizeObserver","entries","forEach","entry","_measureElement","setOptions","Object","_ref3","_extends","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","initialRect","width","height","scrollMargin","scrollingDelay","indexAttribute","initialMeasurementsCache","notify","cleanup","filter","Boolean","d","_didMount","ro","values","node","observe","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","adjustments","undefined","behavior","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","onIsScrollingChange","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref7","low","high","getCurrentValue","value","middle","currentValue","findNearestBinarySearch","getIndexes","indexFromElement","attributeName","indexStr","getAttribute","parseInt","warn","_sync","_this$itemSizeCache$i","item","prevNode","isConnected","unobserve","_extends2","measuredItemSize","delta","getVirtualItems","indexes","virtualItems","k","len","measurement","getOffsetForAlignment","toOffset","align","scrollToOffset","_temp","_ref4","_ref4$align","sync","scrollToIndex","_temp2","_ref5","_ref5$align","Error","getOffsetForIndexAndAlignment","keys","scrollBy","getTotalSize","_this$getMeasurements","_ref6","scrollToFn","measure","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","_ref2","scrollTo","observer","contentRect","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_instance$scrollEleme","_instance$scrollEleme2","_ref$adjustments","_ref"],"mappings":";;;;;;;;;;udAIO,SAASA,EACdC,EACAC,EACAC,GAMA,IACIC,EADAC,EAAc,GAGlB,OAAO,WACL,IAAIC,EACAH,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWF,EAAUG,KAAKC,OAE/C,IAYIC,EAZEC,EAAUX,IAMhB,KAHEW,EAAQC,SAAWR,EAAKQ,QACxBD,EAAQE,MAAK,SAACC,EAAUC,GAAa,OAAKX,EAAKW,KAAWD,MAG1D,OAAOX,EAWT,GARAC,EAAOO,EAGHT,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWG,EAAaF,KAAKC,OAElDN,EAASF,EAAMU,WAAAA,EAAAA,GACX,MAAJT,GAAc,MAAdA,EAAMc,UAANd,EAAMc,SAAWb,GAEbD,EAAKI,KAAiB,MAAVJ,EAAKK,OAALL,EAAKK,QAAW,CAC9B,IAAMU,EAAaC,KAAKC,MAAgC,KAAzBX,KAAKC,MAAQJ,IAAmB,IACzDe,EAAgBF,KAAKC,MAAmC,KAA5BX,KAAKC,MAAQC,IAAsB,IAC/DW,EAAsBD,EAAgB,GAEtCE,EAAM,SAACC,EAAsBC,GAEjC,IADAD,EAAME,OAAOF,GACNA,EAAIX,OAASY,GAClBD,EAAM,IAAMA,EAEd,OAAOA,GAGTG,QAAQC,KAAI,OACHL,EAAIF,EAAe,QAAOE,EAAIL,EAAY,GAIhCC,MAAAA,2FAAAA,KAAKU,IAChB,EACAV,KAAKW,IAAI,IAAM,IAAMR,EAAqB,MAEhDnB,uBAAAA,SAAAA,EAAMI,IAEV,CAEA,OAAOH,EAEX,KCrBa2B,EAAsB,SAACf,GAAa,OAAKA,CAAK,EAE9CgB,EAAwB,SAACC,GAMpC,IALA,IAAMC,EAAQf,KAAKU,IAAII,EAAME,WAAaF,EAAMG,SAAU,GACpDC,EAAMlB,KAAKW,IAAIG,EAAMK,SAAWL,EAAMG,SAAUH,EAAMM,MAAQ,GAE9DC,EAAM,GAEHC,EAAIP,EAAOO,GAAKJ,EAAKI,IAC5BD,EAAIE,KAAKD,GAGX,OAAOD,CACT,EAgFMG,EAAc,CAClBC,QAAS,CAAC,aAAc,aACxBC,OAAQ,CAAC,UAAW,YAGhBC,EAAuB,SAACC,GAC5B,OAAO,SAACC,EAAiCC,GACvC,GAAKD,EAASE,cAAd,CAIA,IAAMC,EAAQR,EAAYI,GAAM,GAC1BK,EAAQT,EAAYI,GAAM,GAE5BM,EAAgBL,EAASE,cAAcC,GACvCG,EAAgBN,EAASE,cAAcE,GAErCG,EAAS,WACb,IAAMC,EACJR,EAASE,cAAcF,EAASS,QAAQC,WAAaP,EAAQC,GAE/DH,EAAGO,IAGLD,IAEA,IAAMI,EAAW,SAACC,GAChB,IAAMC,EAASD,EAAEE,cACXC,EAAUF,EAAOV,GACjBa,EAAUH,EAAOT,IAEnBJ,EAASS,QAAQC,WAAaL,EAAQU,EAAUT,EAAQU,IAC1DT,IAGFF,EAAQU,EACRT,EAAQU,GAQV,OALAhB,EAASE,cAAce,iBAAiB,SAAUN,EAAU,CAC1DO,SAAS,EACTC,SAAS,IAGJ,WACLnB,EAASE,cAAckB,oBAAoB,SAAUT,GApCvD,EAuCJ,EAEaU,EAAuBvB,EAAqB,WAC5CwB,EAAsBxB,EAAqB,UAE3CyB,EAAiB,SAC5B3B,EACAI,GAEA,OAAO7B,KAAKC,MACVwB,EAAQ4B,wBACNxB,EAASS,QAAQC,WAAa,QAAU,UAG9C,gBAyHE,SAAYvD,GAAwD,IArB9DsE,EAqB8DC,EAAAC,KAAAA,KApC5DC,OAAkC,GAAED,KAE5CzB,cAAuC,KAAIyB,KAC3CE,aAAuB,EAAKF,KACpBG,qBAA6D,KAAIH,KACzEI,kBAAmC,GAAEJ,KAC7BK,cAAqC,GAAEL,KACvCM,4BAAwC,GAAEN,KAGlDO,gBAA0C,KAAIP,KACtCQ,kBAA4B,EAACR,KAC7BS,oBAAiD,GAAET,KACnDU,6BAAoD,KAAIV,KACxDW,mBACFb,EAA6B,KAE1B,WACL,OAAIA,IAEiC,oBAAnBc,eACRd,EAAM,IAAIc,gBAAe,SAACC,GAChCA,EAAQC,SAAQ,SAACC,GACfhB,EAAKiB,gBAAgBD,EAAM7B,QAAwB,EACrD,GACF,IAEO,QAGTc,KACJ1C,MAAkD,CAChDE,WAAY,EACZG,SAAU,GACXqC,KAcDiB,WAAa,SAACzF,GACZ0F,OAAOL,QAAQrF,GAAMsF,SAAQ,SAAkBK,GAAA,IAAhBvF,EAAGuF,EAAA,QACX,IADkBA,EAAA,WACG3F,EAAaI,EACzD,IAEAmE,EAAKjB,QAAOsC,EAAA,CACVvF,OAAO,EACPwF,cAAe,EACf5D,SAAU,EACV6D,aAAc,EACdC,WAAY,EACZC,mBAAoB,EACpBC,iBAAkB,EAClB1C,YAAY,EACZ2C,WAAYtE,EACZuE,eAAgBtE,EAChBf,SAAU,WAAQ,EAClBsD,eAAAA,EACAgC,YAAa,CAAEC,MAAO,EAAGC,OAAQ,GACjCC,aAAc,EACdC,eAAgB,IAChBC,eAAgB,aAChBC,yBAA0B,IACvB1G,IAENwE,KAEOmC,OAAS,WACf,MAAApC,EAAKjB,QAAQxC,UAAbyD,EAAKjB,QAAQxC,SAAWyD,IACzBC,KAEOoC,QAAU,WAChBrC,EAAKE,OAAOoC,OAAOC,SAASxB,SAAQ,SAACyB,GAAC,OAAKA,OAC3CxC,EAAKE,OAAS,GACdF,EAAKxB,cAAgB,MACtByB,KAEDwC,UAAY,WACV,IAAMC,EAAK1C,EAAKY,oBAGhB,OAFAO,OAAOwB,OAAO3C,EAAKU,qBAAqBK,SAAQ,SAAC6B,GAAI,OAAKF,MAAAA,OAAAA,EAAAA,EAAIG,QAAQD,MAE/D,WACLF,MAAAA,GAAAA,EAAII,aAEJ9C,EAAKqC,YAERpC,KAED8C,YAAc,WACqB,MAAjC/C,EAAKW,8BAALX,EAAKW,+BAEL,IAAMnC,EAAgBwB,EAAKjB,QAAQiE,mBAE/BhD,EAAKxB,gBAAkBA,GACzBwB,EAAKqC,UAELrC,EAAKxB,cAAgBA,EAErBwB,EAAKiD,gBAAgBjD,EAAKkD,aAAc,CACtCC,iBAAaC,EACbC,cAAUD,IAGZpD,EAAKE,OAAOlC,KACVgC,EAAKjB,QAAQuE,mBAAmBtD,GAAM,SAACuD,GACrCvD,EAAKwD,WAAaD,EAClBvD,EAAKyD,gBACN,KAGHzD,EAAKE,OAAOlC,KACVgC,EAAKjB,QAAQY,qBAAqBK,GAAM,SAAClB,GAGvC,GAFAkB,EAAKS,kBAAoB,EAErBT,EAAKkD,eAAiBpE,EAA1B,CAIkC,OAA9BkB,EAAKI,uBACPsD,aAAa1D,EAAKI,sBAClBJ,EAAKI,qBAAuB,MAG9B,IAAMuD,EAAsB,SAACxD,GACvBH,EAAKG,cAAgBA,IACvBH,EAAKG,YAAcA,EACnBH,EAAKoC,WAITpC,EAAKQ,gBACHR,EAAKkD,aAAepE,EAAS,UAAY,WAE3CkB,EAAKkD,aAAepE,EAEpBkB,EAAKyD,iBAELE,GAAoB,GAEpB3D,EAAKI,qBAAuBwD,YAAW,WACrC5D,EAAKI,qBAAuB,KAC5BJ,EAAKQ,gBAAkB,KACvBmD,GAAoB,EACtB,GAAG3D,EAAKjB,QAAQkD,eA3BhB,CA4BD,MAEOjC,EAAKG,aACfH,EAAKyD,kBAERxD,KAEO4D,QAAU,WAChB,OAAO7D,EAAKwD,WAAWxD,EAAKjB,QAAQC,WAAa,QAAU,WAC5DiB,KAEO6D,gBAAkBxI,GACxB,WAAA,MAAM,CACJ0E,EAAKjB,QAAQlB,MACbmC,EAAKjB,QAAQwC,aACbvB,EAAKjB,QAAQiD,aACbhC,EAAKjB,QAAQ4C,WACb3B,EAAKM,cAEP,IAAA,SAACzC,EAAO0D,EAAcS,EAAcL,EAAYrB,GAC9C,IAAMlD,EACJ4C,EAAKO,4BAA4BpE,OAAS,EACtCM,KAAKW,UAALX,KAAYuD,EAAKO,6BACjB,EACNP,EAAKO,4BAA8B,GAInC,IAFA,IAAMwD,EAAe/D,EAAKK,kBAAkB2D,MAAM,EAAG5G,GAE5CW,EAAIX,EAAKW,EAAIF,EAAOE,IAAK,CAChC,IAAMlC,EAAM8F,EAAW5D,GACjBkG,EAAe3D,EAAczE,GAC7B2B,EAAQuG,EAAahG,EAAI,GAC3BgG,EAAahG,EAAI,GAAIJ,IACrB4D,EAAeS,EACbkC,EACoB,iBAAjBD,EACHA,EACAjE,EAAKjB,QAAQoF,aAAapG,GAC1BJ,EAAMH,EAAQ0G,EACpBH,EAAahG,GAAK,CAAEzB,MAAOyB,EAAGP,MAAAA,EAAO0G,KAAAA,EAAMvG,IAAAA,EAAK9B,IAAAA,EAClD,CAIA,OAFAmE,EAAKK,kBAAoB0D,EAElBA,CACT,GACA,CACElI,KAAKuI,EACLtI,MAAO,WAAA,OAAMkE,EAAKjB,QAAQjD,KAAK,IAElCmE,KAEDwD,eAAiBnI,GACf,WAAA,MAAM,CAAC0E,EAAK8D,kBAAmB9D,EAAK6D,UAAW7D,EAAKkD,aAAa,IACjE,SAACa,EAAcM,EAAWnB,GACxB,IAAM3F,EAuSZ,SAQG+G,GAAA,IAPDP,IAAAA,aACAM,IAAAA,UACAnB,IAAAA,aAMMrF,EAAQkG,EAAa5H,OAAS,EAG9BsB,EAtCwB,SAC9B8G,EACAC,EACAC,EACAC,GAEA,KAAOH,GAAOC,GAAM,CAClB,IAAMG,GAAWJ,EAAMC,GAAQ,EAAK,EAC9BI,EAAeH,EAAgBE,GAErC,GAAIC,EAAeF,EACjBH,EAAMI,EAAS,MACV,MAAIC,EAAeF,GAGxB,OAAOC,EAFPH,EAAOG,EAAS,CAGlB,CACF,CAEA,OAAIJ,EAAM,EACDA,EAAM,EAEN,CAEX,CAcqBM,CAAwB,EAAGhH,GAF5B,SAACvB,GAAa,OAAKyH,EAAazH,GAAQkB,KAAK,GAEC0F,GAC5DtF,EAAWH,EAEf,KACEG,EAAWC,GACXkG,EAAanG,GAAWD,IAAMuF,EAAemB,GAE7CzG,IAGF,MAAO,CAAEH,WAAAA,EAAYG,SAAAA,EACvB,CA9ToB6F,CAAe,CAC3BM,aAAAA,EACAM,UAAAA,EACAnB,aAAAA,IASF,OANE3F,EAAME,aAAeuC,EAAKzC,MAAME,YAChCF,EAAMK,WAAaoC,EAAKzC,MAAMK,WAE9BoC,EAAKzC,MAAQA,EACbyC,EAAKoC,UAEApC,EAAKzC,KACd,GACA,CACE1B,KAAKuI,EACLtI,MAAO,WAAA,OAAMkE,EAAKjB,QAAQjD,KAAK,IAElCmE,KAEO6E,WAAaxJ,GACnB,WAAA,MAAM,CACJ0E,EAAKjB,QAAQ6C,eACb5B,EAAKzC,MACLyC,EAAKjB,QAAQrB,SACbsC,EAAKjB,QAAQlB,MAEf,IAAA,SAAC+D,EAAgBrE,EAAOG,EAAUG,GAChC,OAAO+D,OACFrE,EAAK,CACRG,SAAAA,EACAG,MAAOA,IAEX,GACA,CACEhC,KAAKuI,EACLtI,MAAO,WAAA,OAAMkE,EAAKjB,QAAQjD,KAAK,IAElCmE,KAED8E,iBAAmB,SAACnC,GAClB,IAAMoC,EAAgBhF,EAAKjB,QAAQmD,eAC7B+C,EAAWrC,EAAKsC,aAAaF,GAEnC,OAAKC,EAOEE,SAASF,EAAU,KANxBhI,QAAQmI,KACqBJ,2BAAAA,EAC5B,mCACO,IAIX/E,KAEOgB,gBAAkB,SAAC2B,EAAoByC,GAAmB,IAAAC,EAC1DhJ,EAAQ0D,EAAK+E,iBAAiBnC,GAE9B2C,EAAOvF,EAAKK,kBAAkB/D,GACpC,GAAKiJ,EAAL,CAIA,IAAMC,EAAWxF,EAAKU,oBAAoB6E,EAAK1J,KAEzC6G,EAAK1C,EAAKY,oBAEhB,GAAKgC,EAAK6C,YAAV,CAQKD,GAAYA,IAAa5C,IACxB4C,UACF9C,GAAAA,EAAIgD,UAAUF,IAEhBxF,EAAKU,oBAAoB6E,EAAK1J,KAAO+G,QACrCF,GAAAA,EAAIG,QAAQD,IAGd,IAMiB+C,EANXC,EAAmB5F,EAAKjB,QAAQc,eAAe+C,EAAM5C,GAIrD6F,EAAQD,GAFmCL,OAAnCD,EAAGtF,EAAKM,cAAciF,EAAK1J,MAAQ0J,EAAAA,EAAKrB,MAItD,GAAc,IAAV2B,EAEAN,EAAK/H,MAAQwC,EAAKkD,cAClBlD,EAAKG,aACoB,aAAzBH,EAAKQ,iBAMLR,EAAKiD,gBAAgBjD,EAAKkD,aAAc,CACtCC,YAAcnD,EAAKS,mBAAqBoF,EACxCxC,cAAUD,IAIdpD,EAAKO,4BAA4BvC,KAAK1B,GACtC0D,EAAKM,cACAe,EAAA,CAAA,EAAArB,EAAKM,gBACPiF,EAAAA,CAAAA,GAAAA,EAAK1J,KAAM+J,EACbD,IACD3F,EAAKoC,QArCP,MALMoD,UACF9C,GAAAA,EAAIgD,UAAUF,UACPxF,EAAKU,oBAAoB6E,EAAK1J,KATzC,GAmDDoE,KAEDJ,eAAiB,SAAC+C,GACXA,GAIL5C,EAAKiB,gBAAgB2B,GAAM,IAC5B3C,KAED6F,gBAAkBxK,GAChB,WAAA,MAAM,CAAC0E,EAAK8E,aAAc9E,EAAK8D,kBAAkB,IACjD,SAACiC,EAAShC,GAGR,IAFA,IAAMiC,EAA8B,GAE3BC,EAAI,EAAGC,EAAMH,EAAQ5J,OAAQ8J,EAAIC,EAAKD,IAAK,CAClD,IACME,EAAcpC,EADVgC,EAAQE,IAGlBD,EAAahI,KAAKmI,EACpB,CAEA,OAAOH,CACT,GACA,CACEnK,KAAKuI,EACLtI,MAAO,WAAA,OAAMkE,EAAKjB,QAAQjD,KAAK,IAElCmE,KAEDmG,sBAAwB,SAACC,EAAkBC,GACzC,IAAMxH,EAASkB,EAAKkD,aACdgB,EAAOlE,EAAK6D,UAYlB,MAVc,SAAVyC,IAEAA,EADED,GAAYvH,EACN,QACCuH,GAAYvH,EAASoF,EACtB,MAEA,SAIE,UAAVoC,EACKD,EACY,QAAVC,EACFD,EAAWnC,EACC,WAAVoC,EACFD,EAAWnC,EAAO,EAEpBmC,GACRpG,KAEDsG,eAAiB,SACfF,EAEGG,GAAA,IAAAC,OAAA,IAAAD,EADoD,CAAE,EAAAA,EAAAE,EAAAD,EAAvDH,MAAAA,aAAQ,QAAOI,EAEX3H,EAAU,CACdoE,iBAAaC,EACbC,WAJiBA,SAKjBsD,MAAM,GAER3G,EAAKiD,gBAAgBjD,EAAKoG,sBAAsBC,EAAUC,GAAQvH,IACnEkB,KAED2G,cAAgB,SACdtK,EAEGuK,GAAA,IAAAC,OAAA,IAAAD,EADkD,CAAE,EAAAA,EAAAE,EAAAD,EAArDR,MAAAA,aAAQ,OAAMS,EAAE1D,IAAAA,SAElBrD,EAAKW,6BAA+B,KAEpC,IAAM7B,EAASkB,EAAKkD,aACdgB,EAAOlE,EAAK6D,UACVhG,EAAUmC,EAAKjB,QAAflB,MAGFsI,EADenG,EAAK8D,kBACOrH,KAAKU,IAAI,EAAGV,KAAKW,IAAId,EAAOuB,EAAQ,KAErE,IAAKsI,EACH,MAAM,IAAIa,MAA2C1K,qCAAAA,GAGvD,GAAc,SAAVgK,EACF,GAAIH,EAAYxI,KAAOmB,EAASoF,EAAOlE,EAAKjB,QAAQ2C,iBAClD4E,EAAQ,UACH,MACLH,EAAY3I,OACZsB,EAASkB,EAAKjB,QAAQ0C,oBAItB,OAFA6E,EAAQ,OAGV,CAGF,IASMD,EATgC,SAACF,GACrC,IAAME,EACM,QAAVC,EACIH,EAAYxI,IAAMqC,EAAKjB,QAAQ2C,iBAC/ByE,EAAY3I,MAAQwC,EAAKjB,QAAQ0C,mBAEvC,OAAOzB,EAAKoG,sBAAsBC,EAAUC,GAG7BW,CAA8Bd,GAE/C,GAAIE,IAAavH,EAAjB,CAIA,IAAMC,EAAU,CACdoE,iBAAaC,EACbC,SAAAA,GAEFrD,EAAKiD,gBAAgBoD,EAAUtH,GAEboC,OAAO+F,KAAKlH,EAAKU,qBAAqBvE,OAAS,IAG/D6D,EAAKW,6BAA+B,WAClCX,EAAK4G,cAActK,EAAO,CAAEgK,MAAAA,EAAOjD,SAAAA,KAZvC,GAeDpD,KAEDkH,SAAW,SAAChE,EAAqBpE,GAC/BiB,EAAKiD,gBAAgBjD,EAAKkD,aAAc,CACtCC,YAAAA,EACAE,SAAUtE,MAAAA,OAAAA,EAAAA,EAASsE,YAEtBpD,KAEDmH,aAAe,WAAA,IAAAC,EAAA,eACZA,EAAArH,EAAK8D,kBAAkB9D,EAAKjB,QAAQlB,MAAQ,WAA5CwJ,EAAgD1J,MAC/CqC,EAAKjB,QAAQwC,cACfvB,EAAKjB,QAAQiD,aACbhC,EAAKjB,QAAQyC,UAAU,EAAAvB,KAEjBgD,gBAAkB,SACxBnE,EAQGwI,GAAA,IANDnE,IAAAA,YACAE,IAAAA,SAMFrD,EAAKjB,QAAQwI,WAAWzI,EAAQ,CAAEuE,SAAAA,EAAUF,YAAAA,GAAenD,IAC5DC,KAEDuH,QAAU,WACRxH,EAAKM,cAAgB,GACrBN,EAAKoC,UAnbLnC,KAAKiB,WAAWzF,GAChBwE,KAAKuD,WAAavD,KAAKlB,QAAQ8C,YAC/B5B,KAAKiD,aAAejD,KAAKlB,QAAQuC,cACjCrB,KAAKI,kBAAoBJ,KAAKlB,QAAQoD,yBACtClC,KAAKI,kBAAkBU,SAAQ,SAACwE,GAC9BvF,EAAKM,cAAciF,EAAK1J,KAAO0J,EAAKrB,IACtC,IAEAjE,KAAKwD,gBACP,oEAjH2B,SAC3B3E,EAKAR,EAAAA,GACG,IAAAmJ,EAAAC,EAAAC,EAAAC,EAJDzE,YAAAA,aAAc,EAACwE,EACftE,IAAAA,SAIIgD,EAAWvH,EAASqE,EAE1B,OAAA7E,EAAAA,EAASE,gBAAT,MAAAiJ,EAAwBI,UAAxBJ,EAAwBI,WAAQH,EAAA,CAAA,GAC7BpJ,EAASS,QAAQC,WAAa,OAAS,OAAQqH,EAChDhD,EAAAA,SAAAA,EACAqE,GACJ,4EAzJkC,SAChCpJ,EACAC,GAEA,IAAMuJ,EAAW,IAAIjH,gBAAe,SAACC,GACnC,IAAME,EAAQF,EAAQ,GACtB,GAAIE,EAAO,CACT,IAA0BA,EAAAA,EAAM+G,YAAxBjG,IAAAA,MAAOC,IAAAA,OACfxD,EAAG,CACDuD,MAAOrF,KAAKC,MAAMoF,GAClBC,OAAQtF,KAAKC,MAAMqF,IAEvB,MACExD,EAAG,CAAEuD,MAAO,EAAGC,OAAQ,GAE3B,IAEA,GAAKzD,EAASE,cAQd,OAJAD,EAAGD,EAASE,cAAcsB,yBAE1BgI,EAASjF,QAAQvE,EAASE,eAEnB,WACLsJ,EAASpC,UAAUpH,EAASE,eAEhC,8CAEiC,SAC/BF,EACAC,GAEA,IAAMyJ,EArDiB,SACvB1J,EACAC,GAEA,IAAI0J,EAAa,CAAElG,QAAS,EAAGD,OAAQ,GAEvC,OAAO,SAACyB,IAEJjF,EAASS,QAAQC,WACbuE,EAAKzB,QAAUmG,EAAKnG,MACpByB,EAAKxB,SAAWkG,EAAKlG,SAEzBxD,EAAGgF,GAGL0E,EAAO1E,EAEX,CAoC2B2E,CAAiB5J,EAAUC,GAC9C4J,EAAW,WAAH,OACZH,EAAiB,CACflG,MAAOxD,EAASE,cAAc4J,WAC9BrG,OAAQzD,EAASE,cAAc6J,aAC/B,EAEJ,GAAK/J,EAASE,cAWd,OAPA2J,IAEA7J,EAASE,cAAce,iBAAiB,SAAU4I,EAAU,CAC1D3I,SAAS,EACTC,SAAS,IAGJ,WACLnB,EAASE,cAAckB,oBAAoB,SAAUyI,GAEzD,iBAoE4B,SAC1BrJ,EAKAR,EAAAA,GACG,IAAAgK,EAAAC,EAAAC,EAAAC,EAJDtF,YAAAA,aAAc,EAACqF,EACfnF,IAAAA,SAIIgD,EAAWvH,EAASqE,EAE1B,OAAA7E,EAAAA,EAASE,gBAAT,MAAA8J,EAAwBT,UAAxBS,EAAwBT,WAAQU,EAAA,CAAA,GAC7BjK,EAASS,QAAQC,WAAa,OAAS,OAAQqH,EAChDhD,EAAAA,SAAAA,EACAkF,GACJ"}
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.34",
4
+ "version": "3.0.0-beta.35",
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
@@ -82,10 +82,16 @@ export const observeElementRect = (
82
82
  cb: (rect: Rect) => void,
83
83
  ) => {
84
84
  const observer = new ResizeObserver((entries) => {
85
- cb({
86
- width: entries[0]?.contentRect.width as number,
87
- height: entries[0]?.contentRect.height as number,
88
- })
85
+ const entry = entries[0]
86
+ if (entry) {
87
+ const { width, height } = entry.contentRect
88
+ cb({
89
+ width: Math.round(width),
90
+ height: Math.round(height),
91
+ })
92
+ } else {
93
+ cb({ width: 0, height: 0 })
94
+ }
89
95
  })
90
96
 
91
97
  if (!instance.scrollElement) {
@@ -702,7 +708,7 @@ export class Virtualizer<
702
708
 
703
709
  const toOffset = getOffsetForIndexAndAlignment(measurement)
704
710
 
705
- if (Math.round(toOffset) === Math.round(offset)) {
711
+ if (toOffset === offset) {
706
712
  return
707
713
  }
708
714