@tanstack/virtual-core 3.0.0-beta.17 → 3.0.0-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +3 -0
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +3 -0
- package/build/esm/index.js.map +1 -1
- package/build/stats.html +1 -1
- package/build/stats.json +14 -14
- package/build/umd/index.development.js +3 -0
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
package/build/cjs/index.js
CHANGED
|
@@ -213,6 +213,9 @@ class Virtualizer {
|
|
|
213
213
|
if (this.scrollElement !== scrollElement) {
|
|
214
214
|
this.cleanup();
|
|
215
215
|
this.scrollElement = scrollElement;
|
|
216
|
+
|
|
217
|
+
this._scrollToOffset(this.scrollOffset, false);
|
|
218
|
+
|
|
216
219
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
217
220
|
this.scrollRect = rect;
|
|
218
221
|
this.calculateRange();
|
package/build/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","calculateRange","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.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, false)\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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
package/build/esm/index.js
CHANGED
|
@@ -248,6 +248,9 @@ class Virtualizer {
|
|
|
248
248
|
if (this.scrollElement !== scrollElement) {
|
|
249
249
|
this.cleanup();
|
|
250
250
|
this.scrollElement = scrollElement;
|
|
251
|
+
|
|
252
|
+
this._scrollToOffset(this.scrollOffset, false);
|
|
253
|
+
|
|
251
254
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
252
255
|
this.scrollRect = rect;
|
|
253
256
|
this.calculateRange();
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","calculateRange","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.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, false)\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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
package/build/stats.html
CHANGED
|
@@ -2669,7 +2669,7 @@ var drawChart = (function (exports) {
|
|
|
2669
2669
|
</script>
|
|
2670
2670
|
<script>
|
|
2671
2671
|
/*<!--*/
|
|
2672
|
-
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/virtual-core/src","children":[{"uid":"
|
|
2672
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"packages/virtual-core/src","children":[{"uid":"97f2-1","name":"utils.ts"},{"uid":"97f2-3","name":"index.ts"}]}]}],"isRoot":true},"nodeParts":{"97f2-1":{"renderedLength":1432,"gzipLength":544,"brotliLength":0,"mainUid":"97f2-0"},"97f2-3":{"renderedLength":14354,"gzipLength":3247,"brotliLength":0,"mainUid":"97f2-2"}},"nodeMetas":{"97f2-0":{"id":"/packages/virtual-core/src/utils.ts","moduleParts":{"index.production.js":"97f2-1"},"imported":[],"importedBy":[{"uid":"97f2-2"}]},"97f2-2":{"id":"/packages/virtual-core/src/index.ts","moduleParts":{"index.production.js":"97f2-3"},"imported":[{"uid":"97f2-0"}],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.75.4"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
|
|
2673
2673
|
|
|
2674
2674
|
const run = () => {
|
|
2675
2675
|
const width = window.innerWidth;
|
package/build/stats.json
CHANGED
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"name": "packages/virtual-core/src",
|
|
11
11
|
"children": [
|
|
12
12
|
{
|
|
13
|
-
"uid": "
|
|
13
|
+
"uid": "97f2-5",
|
|
14
14
|
"name": "utils.ts"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
|
-
"uid": "
|
|
17
|
+
"uid": "97f2-7",
|
|
18
18
|
"name": "index.ts"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
@@ -25,40 +25,40 @@
|
|
|
25
25
|
"isRoot": true
|
|
26
26
|
},
|
|
27
27
|
"nodeParts": {
|
|
28
|
-
"
|
|
28
|
+
"97f2-5": {
|
|
29
29
|
"renderedLength": 1432,
|
|
30
30
|
"gzipLength": 544,
|
|
31
31
|
"brotliLength": 0,
|
|
32
|
-
"mainUid": "
|
|
32
|
+
"mainUid": "97f2-4"
|
|
33
33
|
},
|
|
34
|
-
"
|
|
35
|
-
"renderedLength":
|
|
36
|
-
"gzipLength":
|
|
34
|
+
"97f2-7": {
|
|
35
|
+
"renderedLength": 14354,
|
|
36
|
+
"gzipLength": 3247,
|
|
37
37
|
"brotliLength": 0,
|
|
38
|
-
"mainUid": "
|
|
38
|
+
"mainUid": "97f2-6"
|
|
39
39
|
}
|
|
40
40
|
},
|
|
41
41
|
"nodeMetas": {
|
|
42
|
-
"
|
|
42
|
+
"97f2-4": {
|
|
43
43
|
"id": "/packages/virtual-core/src/utils.ts",
|
|
44
44
|
"moduleParts": {
|
|
45
|
-
"index.production.js": "
|
|
45
|
+
"index.production.js": "97f2-5"
|
|
46
46
|
},
|
|
47
47
|
"imported": [],
|
|
48
48
|
"importedBy": [
|
|
49
49
|
{
|
|
50
|
-
"uid": "
|
|
50
|
+
"uid": "97f2-6"
|
|
51
51
|
}
|
|
52
52
|
]
|
|
53
53
|
},
|
|
54
|
-
"
|
|
54
|
+
"97f2-6": {
|
|
55
55
|
"id": "/packages/virtual-core/src/index.ts",
|
|
56
56
|
"moduleParts": {
|
|
57
|
-
"index.production.js": "
|
|
57
|
+
"index.production.js": "97f2-7"
|
|
58
58
|
},
|
|
59
59
|
"imported": [
|
|
60
60
|
{
|
|
61
|
-
"uid": "
|
|
61
|
+
"uid": "97f2-4"
|
|
62
62
|
}
|
|
63
63
|
],
|
|
64
64
|
"importedBy": [],
|
|
@@ -254,6 +254,9 @@
|
|
|
254
254
|
if (this.scrollElement !== scrollElement) {
|
|
255
255
|
this.cleanup();
|
|
256
256
|
this.scrollElement = scrollElement;
|
|
257
|
+
|
|
258
|
+
this._scrollToOffset(this.scrollOffset, false);
|
|
259
|
+
|
|
257
260
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
258
261
|
this.scrollRect = rect;
|
|
259
262
|
this.calculateRange();
|
|
@@ -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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","calculateRange","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.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, false)\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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","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=()=>{s(t.scrollElement[t.options.horizontal?n:i])};h();const a=e=>{const s=e.currentTarget,o=s[n],a=s[i];(t.options.horizontal?l-o:r-a)&&h(),l=o,r=a};return t.scrollElement.addEventListener("scroll",a,{capture:!1,passive:!0}),()=>{t.scrollElement.removeEventListener("scroll",a)}},l=i("element"),r=i("window"),h=(e,t)=>e.getBoundingClientRect()[t.options.horizontal?"width":"height"];e.Virtualizer=class{constructor(e){var o=this;this.unsubs=[],this.scrollElement=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.measureElementCache={},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},...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.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e&&(this.cleanup(),this.scrollElement=e,this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{this.scrollOffset=e,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),a=r+h;i[l]={index:l,start:r,size:h,end:a,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.getVirtualItems=t((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((e,t,s)=>{const n=e=>t=>{var n;const o=this.measurementsCache[e];if(!t)return;const i=s(t,this),l=null!=(n=this.itemMeasurementsCache[o.key])?n:o.size;i!==l&&(o.start<this.scrollOffset&&(this.destinationOffset||this._scrollToOffset(this.scrollOffset+(i-l),!1)),this.pendingMeasuredCacheIndexes.push(e),this.itemMeasurementsCache={...this.itemMeasurementsCache,[o.key]:i},this.notify())},o=[],i={};for(let s=0,r=e.length;s<r;s++){var l;const r=e[s],h={...t[r],measureElement:i[r]=null!=(l=this.measureElementCache[r])?l:n(r)};o.push(h)}return this.measureElementCache=i,o}),{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"),"start"===s?o._scrollToOffset(e,n):"end"===s?o._scrollToOffset(e-l,n):"center"===s&&o._scrollToOffset(e-l/2,n)},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:a}=o.options,c=l[Math.max(0,Math.min(e,a-1))];if(!c)return;if("auto"===s)if(c.end>=r+h-o.options.scrollPaddingEnd)s="end";else{if(!(c.start<=r+o.options.scrollPaddingStart))return;s="start"}const u="end"===s?c.end+o.options.scrollPaddingEnd:c.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;clearTimeout(this.scrollCheckFrame),this.destinationOffset=e,this.options.scrollToFn(e,t,this);const n=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,n()):this.destinationOffset=void 0)}),100)};n()},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;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"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;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"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=()=>{s(t.scrollElement[t.options.horizontal?n:i])};h();const a=e=>{const s=e.currentTarget,o=s[n],a=s[i];(t.options.horizontal?l-o:r-a)&&h(),l=o,r=a};return t.scrollElement.addEventListener("scroll",a,{capture:!1,passive:!0}),()=>{t.scrollElement.removeEventListener("scroll",a)}},l=i("element"),r=i("window"),h=(e,t)=>e.getBoundingClientRect()[t.options.horizontal?"width":"height"];e.Virtualizer=class{constructor(e){var o=this;this.unsubs=[],this.scrollElement=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.measureElementCache={},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},...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.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e&&(this.cleanup(),this.scrollElement=e,this._scrollToOffset(this.scrollOffset,!1),this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{this.scrollOffset=e,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),a=r+h;i[l]={index:l,start:r,size:h,end:a,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.getVirtualItems=t((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((e,t,s)=>{const n=e=>t=>{var n;const o=this.measurementsCache[e];if(!t)return;const i=s(t,this),l=null!=(n=this.itemMeasurementsCache[o.key])?n:o.size;i!==l&&(o.start<this.scrollOffset&&(this.destinationOffset||this._scrollToOffset(this.scrollOffset+(i-l),!1)),this.pendingMeasuredCacheIndexes.push(e),this.itemMeasurementsCache={...this.itemMeasurementsCache,[o.key]:i},this.notify())},o=[],i={};for(let s=0,r=e.length;s<r;s++){var l;const r=e[s],h={...t[r],measureElement:i[r]=null!=(l=this.measureElementCache[r])?l:n(r)};o.push(h)}return this.measureElementCache=i,o}),{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"),"start"===s?o._scrollToOffset(e,n):"end"===s?o._scrollToOffset(e-l,n):"center"===s&&o._scrollToOffset(e-l/2,n)},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:a}=o.options,c=l[Math.max(0,Math.min(e,a-1))];if(!c)return;if("auto"===s)if(c.end>=r+h-o.options.scrollPaddingEnd)s="end";else{if(!(c.start<=r+o.options.scrollPaddingStart))return;s="start"}const u="end"===s?c.end+o.options.scrollPaddingEnd:c.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;clearTimeout(this.scrollCheckFrame),this.destinationOffset=e,this.options.scrollToFn(e,t,this);const n=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,n()):this.destinationOffset=void 0)}),100)};n()},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;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"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;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","options","horizontal","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","_ref","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","observeElementRect","rect","scrollRect","calculateRange","offset","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","observer","ResizeObserver","_entries$","_entries$2","contentRect","observe","unobserve","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_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\ninterface Item {\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\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\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 = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: 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}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...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.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, false)\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.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.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 private 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\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) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\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: Item[]\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","options","horizontal","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","_ref","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","observeElementRect","rect","scrollRect","calculateRange","offset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","observer","ResizeObserver","_entries$","_entries$2","contentRect","observe","unobserve","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_instance$scrollEleme"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/virtual-core",
|
|
3
3
|
"author": "Tanner Linsley",
|
|
4
|
-
"version": "3.0.0-beta.
|
|
4
|
+
"version": "3.0.0-beta.18",
|
|
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
|
@@ -330,6 +330,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
330
330
|
this.cleanup()
|
|
331
331
|
|
|
332
332
|
this.scrollElement = scrollElement
|
|
333
|
+
this._scrollToOffset(this.scrollOffset, false)
|
|
333
334
|
|
|
334
335
|
this.unsubs.push(
|
|
335
336
|
this.options.observeElementRect(this, (rect) => {
|