@tanstack/virtual-core 3.0.0-beta.23 → 3.0.0-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/index.d.ts +113 -0
- package/build/{esm/index.js → lib/index.esm.js} +40 -193
- package/build/lib/index.esm.js.map +1 -0
- package/build/{cjs → lib}/index.js +37 -152
- package/build/lib/index.js.map +1 -0
- package/build/lib/index.mjs +504 -0
- package/build/lib/index.mjs.map +1 -0
- package/build/lib/utils.d.ts +7 -0
- package/build/lib/utils.esm.js +48 -0
- package/build/lib/utils.esm.js.map +1 -0
- package/build/{cjs → lib}/utils.js +4 -9
- package/build/{cjs → lib}/utils.js.map +1 -1
- package/build/lib/utils.mjs +48 -0
- package/build/lib/utils.mjs.map +1 -0
- package/build/umd/index.development.js +41 -161
- 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 +15 -11
- package/src/index.ts +53 -75
- package/build/cjs/index.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/stats.html +0 -2689
- package/build/stats.json +0 -76
- package/build/types/index.d.ts +0 -131
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/index.ts"],"sourcesContent":["import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ntype ScrollBehavior = 'auto' | 'smooth'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n behavior?: ScrollBehavior\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = <T extends Window>(\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset =\n (sync ? offset : offset + instance.options.scrollMargin) +\n (adjustments ?? 0)\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport const elementScroll = <T extends Element>(\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<T, any>,\n) => {\n const toOffset =\n (sync ? offset : offset + instance.options.scrollMargin) +\n (adjustments ?? 0)\n\n instance.scrollElement?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { adjustments?: number; behavior?: ScrollBehavior; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends Element | Window,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollAdjustments: number = 0\n private measureElementCache: Record<Key, TItemElement> = {}\n private getResizeObserver = (() => {\n let _ro: ResizeObserver | null = null\n\n return () => {\n if (_ro) {\n return _ro\n } else if (typeof ResizeObserver !== 'undefined') {\n return (_ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, false)\n })\n }))\n } else {\n return null\n }\n }\n })()\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.getResizeObserver()?.disconnect()\n this.measureElementCache = {}\n\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined,\n sync: true,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollAdjustments = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollAdjustments = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n private _measureElement = (node: TItemElement, _sync: boolean) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n\n const prevNode = this.measureElementCache[item.key]\n\n const ro = this.getResizeObserver()\n\n if (!node.isConnected) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n delete this.measureElementCache[item.key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n ro?.unobserve(prevNode)\n }\n this.measureElementCache[item.key] = node\n ro?.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n const delta = measuredItemSize - itemSize\n\n if (delta !== 0) {\n if (item.start < this.scrollOffset && this.isScrolling) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', delta)\n }\n\n this._scrollToOffset(this.scrollOffset, {\n adjustments: (this.scrollAdjustments += delta),\n behavior: undefined,\n sync: false,\n })\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', behavior }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n adjustments: undefined,\n behavior,\n sync: false,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', ...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, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n adjustments,\n behavior,\n sync,\n }: {\n adjustments: number | undefined\n behavior: ScrollBehavior | undefined\n sync: boolean\n },\n ) => {\n this.options.scrollToFn(offset, { behavior, sync, adjustments }, this)\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["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","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","round","windowScroll","adjustments","behavior","sync","toOffset","scrollTo","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollAdjustments","measureElementCache","getResizeObserver","_ro","forEach","entry","_measureElement","setOptions","Object","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","onChange","initialRect","scrollingDelay","indexAttribute","notify","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","undefined","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","console","warn","parseInt","_sync","item","prevNode","ro","isConnected","measuredItemSize","itemSize","delta","info","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","align","scrollToIndex","rest","getTotalSize","scrollToFn","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
|
@@ -15,19 +15,19 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
15
15
|
var utils = require('./utils.js');
|
|
16
16
|
|
|
17
17
|
//
|
|
18
|
+
|
|
19
|
+
//
|
|
20
|
+
|
|
18
21
|
const defaultKeyExtractor = index => index;
|
|
19
22
|
const defaultRangeExtractor = range => {
|
|
20
23
|
const start = Math.max(range.startIndex - range.overscan, 0);
|
|
21
24
|
const end = Math.min(range.endIndex + range.overscan, range.count - 1);
|
|
22
25
|
const arr = [];
|
|
23
|
-
|
|
24
26
|
for (let i = start; i <= end; i++) {
|
|
25
27
|
arr.push(i);
|
|
26
28
|
}
|
|
27
|
-
|
|
28
29
|
return arr;
|
|
29
30
|
};
|
|
30
|
-
|
|
31
31
|
const memoRectCallback = (instance, cb) => {
|
|
32
32
|
let prev = {
|
|
33
33
|
height: -1,
|
|
@@ -37,25 +37,20 @@ const memoRectCallback = (instance, cb) => {
|
|
|
37
37
|
if (instance.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {
|
|
38
38
|
cb(rect);
|
|
39
39
|
}
|
|
40
|
-
|
|
41
40
|
prev = rect;
|
|
42
41
|
};
|
|
43
42
|
};
|
|
44
|
-
|
|
45
43
|
const observeElementRect = (instance, cb) => {
|
|
46
44
|
const observer = new ResizeObserver(entries => {
|
|
47
45
|
var _entries$, _entries$2;
|
|
48
|
-
|
|
49
46
|
cb({
|
|
50
47
|
width: (_entries$ = entries[0]) == null ? void 0 : _entries$.contentRect.width,
|
|
51
48
|
height: (_entries$2 = entries[0]) == null ? void 0 : _entries$2.contentRect.height
|
|
52
49
|
});
|
|
53
50
|
});
|
|
54
|
-
|
|
55
51
|
if (!instance.scrollElement) {
|
|
56
52
|
return;
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
cb(instance.scrollElement.getBoundingClientRect());
|
|
60
55
|
observer.observe(instance.scrollElement);
|
|
61
56
|
return () => {
|
|
@@ -64,16 +59,13 @@ const observeElementRect = (instance, cb) => {
|
|
|
64
59
|
};
|
|
65
60
|
const observeWindowRect = (instance, cb) => {
|
|
66
61
|
const memoizedCallback = memoRectCallback(instance, cb);
|
|
67
|
-
|
|
68
62
|
const onResize = () => memoizedCallback({
|
|
69
63
|
width: instance.scrollElement.innerWidth,
|
|
70
64
|
height: instance.scrollElement.innerHeight
|
|
71
65
|
});
|
|
72
|
-
|
|
73
66
|
if (!instance.scrollElement) {
|
|
74
67
|
return;
|
|
75
68
|
}
|
|
76
|
-
|
|
77
69
|
onResize();
|
|
78
70
|
instance.scrollElement.addEventListener('resize', onResize, {
|
|
79
71
|
capture: false,
|
|
@@ -87,38 +79,30 @@ const scrollProps = {
|
|
|
87
79
|
element: ['scrollLeft', 'scrollTop'],
|
|
88
80
|
window: ['scrollX', 'scrollY']
|
|
89
81
|
};
|
|
90
|
-
|
|
91
82
|
const createOffsetObserver = mode => {
|
|
92
83
|
return (instance, cb) => {
|
|
93
84
|
if (!instance.scrollElement) {
|
|
94
85
|
return;
|
|
95
86
|
}
|
|
96
|
-
|
|
97
87
|
const propX = scrollProps[mode][0];
|
|
98
88
|
const propY = scrollProps[mode][1];
|
|
99
89
|
let prevX = instance.scrollElement[propX];
|
|
100
90
|
let prevY = instance.scrollElement[propY];
|
|
101
|
-
|
|
102
91
|
const scroll = () => {
|
|
103
92
|
const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
|
|
104
93
|
cb(Math.max(0, offset - instance.options.scrollMargin));
|
|
105
94
|
};
|
|
106
|
-
|
|
107
95
|
scroll();
|
|
108
|
-
|
|
109
96
|
const onScroll = e => {
|
|
110
97
|
const target = e.currentTarget;
|
|
111
98
|
const scrollX = target[propX];
|
|
112
99
|
const scrollY = target[propY];
|
|
113
|
-
|
|
114
100
|
if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {
|
|
115
101
|
scroll();
|
|
116
102
|
}
|
|
117
|
-
|
|
118
103
|
prevX = scrollX;
|
|
119
104
|
prevY = scrollY;
|
|
120
105
|
};
|
|
121
|
-
|
|
122
106
|
instance.scrollElement.addEventListener('scroll', onScroll, {
|
|
123
107
|
capture: false,
|
|
124
108
|
passive: true
|
|
@@ -128,7 +112,6 @@ const createOffsetObserver = mode => {
|
|
|
128
112
|
};
|
|
129
113
|
};
|
|
130
114
|
};
|
|
131
|
-
|
|
132
115
|
const observeElementOffset = createOffsetObserver('element');
|
|
133
116
|
const observeWindowOffset = createOffsetObserver('window');
|
|
134
117
|
const measureElement = (element, instance) => {
|
|
@@ -136,34 +119,33 @@ const measureElement = (element, instance) => {
|
|
|
136
119
|
};
|
|
137
120
|
const windowScroll = (offset, _ref, instance) => {
|
|
138
121
|
var _instance$scrollEleme;
|
|
139
|
-
|
|
140
122
|
let {
|
|
141
|
-
|
|
123
|
+
adjustments,
|
|
124
|
+
behavior,
|
|
142
125
|
sync
|
|
143
126
|
} = _ref;
|
|
144
|
-
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
127
|
+
const toOffset = (sync ? offset : offset + instance.options.scrollMargin) + (adjustments ?? 0);
|
|
145
128
|
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
146
129
|
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
147
|
-
behavior
|
|
130
|
+
behavior
|
|
148
131
|
});
|
|
149
132
|
};
|
|
150
133
|
const elementScroll = (offset, _ref2, instance) => {
|
|
151
134
|
var _instance$scrollEleme2;
|
|
152
|
-
|
|
153
135
|
let {
|
|
154
|
-
|
|
136
|
+
adjustments,
|
|
137
|
+
behavior,
|
|
155
138
|
sync
|
|
156
139
|
} = _ref2;
|
|
157
|
-
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
140
|
+
const toOffset = (sync ? offset : offset + instance.options.scrollMargin) + (adjustments ?? 0);
|
|
158
141
|
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
159
142
|
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
160
|
-
behavior
|
|
143
|
+
behavior
|
|
161
144
|
});
|
|
162
145
|
};
|
|
163
146
|
class Virtualizer {
|
|
164
147
|
constructor(_opts) {
|
|
165
148
|
var _this = this;
|
|
166
|
-
|
|
167
149
|
this.unsubs = [];
|
|
168
150
|
this.scrollElement = null;
|
|
169
151
|
this.isScrolling = false;
|
|
@@ -171,9 +153,8 @@ class Virtualizer {
|
|
|
171
153
|
this.measurementsCache = [];
|
|
172
154
|
this.itemMeasurementsCache = {};
|
|
173
155
|
this.pendingMeasuredCacheIndexes = [];
|
|
174
|
-
this.
|
|
156
|
+
this.scrollAdjustments = 0;
|
|
175
157
|
this.measureElementCache = {};
|
|
176
|
-
|
|
177
158
|
this.getResizeObserver = (() => {
|
|
178
159
|
let _ro = null;
|
|
179
160
|
return () => {
|
|
@@ -190,12 +171,10 @@ class Virtualizer {
|
|
|
190
171
|
}
|
|
191
172
|
};
|
|
192
173
|
})();
|
|
193
|
-
|
|
194
174
|
this.range = {
|
|
195
175
|
startIndex: 0,
|
|
196
176
|
endIndex: 0
|
|
197
177
|
};
|
|
198
|
-
|
|
199
178
|
this.setOptions = opts => {
|
|
200
179
|
Object.entries(opts).forEach(_ref3 => {
|
|
201
180
|
let [key, value] = _ref3;
|
|
@@ -212,7 +191,6 @@ class Virtualizer {
|
|
|
212
191
|
horizontal: false,
|
|
213
192
|
getItemKey: defaultKeyExtractor,
|
|
214
193
|
rangeExtractor: defaultRangeExtractor,
|
|
215
|
-
enableSmoothScroll: true,
|
|
216
194
|
onChange: () => {},
|
|
217
195
|
measureElement,
|
|
218
196
|
initialRect: {
|
|
@@ -225,42 +203,33 @@ class Virtualizer {
|
|
|
225
203
|
...opts
|
|
226
204
|
};
|
|
227
205
|
};
|
|
228
|
-
|
|
229
206
|
this.notify = () => {
|
|
230
207
|
var _this$options$onChang, _this$options;
|
|
231
|
-
|
|
232
208
|
(_this$options$onChang = (_this$options = this.options).onChange) == null ? void 0 : _this$options$onChang.call(_this$options, this);
|
|
233
209
|
};
|
|
234
|
-
|
|
235
210
|
this.cleanup = () => {
|
|
236
211
|
this.unsubs.filter(Boolean).forEach(d => d());
|
|
237
212
|
this.unsubs = [];
|
|
238
213
|
this.scrollElement = null;
|
|
239
214
|
};
|
|
240
|
-
|
|
241
215
|
this._didMount = () => {
|
|
242
216
|
return () => {
|
|
243
217
|
var _this$getResizeObserv;
|
|
244
|
-
|
|
245
218
|
(_this$getResizeObserv = this.getResizeObserver()) == null ? void 0 : _this$getResizeObserv.disconnect();
|
|
246
219
|
this.measureElementCache = {};
|
|
247
220
|
this.cleanup();
|
|
248
221
|
};
|
|
249
222
|
};
|
|
250
|
-
|
|
251
223
|
this._willUpdate = () => {
|
|
252
224
|
const scrollElement = this.options.getScrollElement();
|
|
253
|
-
|
|
254
225
|
if (this.scrollElement !== scrollElement) {
|
|
255
226
|
this.cleanup();
|
|
256
227
|
this.scrollElement = scrollElement;
|
|
257
|
-
|
|
258
228
|
this._scrollToOffset(this.scrollOffset, {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
229
|
+
adjustments: undefined,
|
|
230
|
+
behavior: undefined,
|
|
231
|
+
sync: true
|
|
262
232
|
});
|
|
263
|
-
|
|
264
233
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
265
234
|
this.scrollRect = rect;
|
|
266
235
|
this.calculateRange();
|
|
@@ -270,11 +239,10 @@ class Virtualizer {
|
|
|
270
239
|
clearTimeout(this.isScrollingTimeoutId);
|
|
271
240
|
this.isScrollingTimeoutId = null;
|
|
272
241
|
}
|
|
273
|
-
|
|
274
242
|
if (this.scrollOffset !== offset) {
|
|
275
243
|
this.scrollOffset = offset;
|
|
276
244
|
this.isScrolling = true;
|
|
277
|
-
this.
|
|
245
|
+
this.scrollAdjustments = 0;
|
|
278
246
|
this.isScrollingTimeoutId = setTimeout(() => {
|
|
279
247
|
this.isScrollingTimeoutId = null;
|
|
280
248
|
this.isScrolling = false;
|
|
@@ -282,25 +250,21 @@ class Virtualizer {
|
|
|
282
250
|
}, this.options.scrollingDelay);
|
|
283
251
|
} else {
|
|
284
252
|
this.isScrolling = false;
|
|
285
|
-
this.
|
|
253
|
+
this.scrollAdjustments = 0;
|
|
286
254
|
}
|
|
287
|
-
|
|
288
255
|
this.calculateRange();
|
|
289
256
|
}));
|
|
290
257
|
} else if (!this.isScrolling) {
|
|
291
258
|
this.calculateRange();
|
|
292
259
|
}
|
|
293
260
|
};
|
|
294
|
-
|
|
295
261
|
this.getSize = () => {
|
|
296
262
|
return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
|
|
297
263
|
};
|
|
298
|
-
|
|
299
264
|
this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
|
|
300
265
|
const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
|
|
301
266
|
this.pendingMeasuredCacheIndexes = [];
|
|
302
267
|
const measurements = this.measurementsCache.slice(0, min);
|
|
303
|
-
|
|
304
268
|
for (let i = min; i < count; i++) {
|
|
305
269
|
const key = getItemKey(i);
|
|
306
270
|
const measuredSize = measurementsCache[key];
|
|
@@ -315,7 +279,6 @@ class Virtualizer {
|
|
|
315
279
|
key
|
|
316
280
|
};
|
|
317
281
|
}
|
|
318
|
-
|
|
319
282
|
this.measurementsCache = measurements;
|
|
320
283
|
return measurements;
|
|
321
284
|
}, {
|
|
@@ -328,19 +291,18 @@ class Virtualizer {
|
|
|
328
291
|
outerSize,
|
|
329
292
|
scrollOffset
|
|
330
293
|
});
|
|
331
|
-
|
|
332
294
|
if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
|
|
333
295
|
this.range = range;
|
|
334
296
|
this.notify();
|
|
335
297
|
}
|
|
336
|
-
|
|
337
298
|
return this.range;
|
|
338
299
|
}, {
|
|
339
300
|
key: process.env.NODE_ENV !== 'production' && 'calculateRange',
|
|
340
301
|
debug: () => this.options.debug
|
|
341
302
|
});
|
|
342
303
|
this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
|
|
343
|
-
return rangeExtractor({
|
|
304
|
+
return rangeExtractor({
|
|
305
|
+
...range,
|
|
344
306
|
overscan,
|
|
345
307
|
count: count
|
|
346
308
|
});
|
|
@@ -348,109 +310,84 @@ class Virtualizer {
|
|
|
348
310
|
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
349
311
|
debug: () => this.options.debug
|
|
350
312
|
});
|
|
351
|
-
|
|
352
313
|
this.indexFromElement = node => {
|
|
353
314
|
const attributeName = this.options.indexAttribute;
|
|
354
315
|
const indexStr = node.getAttribute(attributeName);
|
|
355
|
-
|
|
356
316
|
if (!indexStr) {
|
|
357
|
-
console.warn(
|
|
317
|
+
console.warn(`Missing attribute name '${attributeName}={index}' on measured element.`);
|
|
358
318
|
return -1;
|
|
359
319
|
}
|
|
360
|
-
|
|
361
320
|
return parseInt(indexStr, 10);
|
|
362
321
|
};
|
|
363
|
-
|
|
364
322
|
this._measureElement = (node, _sync) => {
|
|
365
|
-
var _this$itemMeasurement;
|
|
366
|
-
|
|
367
323
|
const index = this.indexFromElement(node);
|
|
368
324
|
const item = this.measurementsCache[index];
|
|
369
|
-
|
|
370
325
|
if (!item) {
|
|
371
326
|
return;
|
|
372
327
|
}
|
|
373
|
-
|
|
374
328
|
const prevNode = this.measureElementCache[item.key];
|
|
375
329
|
const ro = this.getResizeObserver();
|
|
376
|
-
|
|
377
330
|
if (!node.isConnected) {
|
|
378
331
|
if (prevNode) {
|
|
379
332
|
ro == null ? void 0 : ro.unobserve(prevNode);
|
|
380
333
|
delete this.measureElementCache[item.key];
|
|
381
334
|
}
|
|
382
|
-
|
|
383
335
|
return;
|
|
384
336
|
}
|
|
385
|
-
|
|
386
337
|
if (!prevNode || prevNode !== node) {
|
|
387
338
|
if (prevNode) {
|
|
388
339
|
ro == null ? void 0 : ro.unobserve(prevNode);
|
|
389
340
|
}
|
|
390
|
-
|
|
391
341
|
this.measureElementCache[item.key] = node;
|
|
392
342
|
ro == null ? void 0 : ro.observe(node);
|
|
393
343
|
}
|
|
394
|
-
|
|
395
344
|
const measuredItemSize = this.options.measureElement(node, this);
|
|
396
|
-
const itemSize =
|
|
345
|
+
const itemSize = this.itemMeasurementsCache[item.key] ?? item.size;
|
|
397
346
|
const delta = measuredItemSize - itemSize;
|
|
398
|
-
|
|
399
347
|
if (delta !== 0) {
|
|
400
|
-
if (item.start < this.scrollOffset && this.isScrolling
|
|
348
|
+
if (item.start < this.scrollOffset && this.isScrolling) {
|
|
401
349
|
if (process.env.NODE_ENV !== 'production' && this.options.debug) {
|
|
402
350
|
console.info('correction', delta);
|
|
403
351
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
canSmooth: false,
|
|
409
|
-
sync: false,
|
|
410
|
-
requested: false
|
|
352
|
+
this._scrollToOffset(this.scrollOffset, {
|
|
353
|
+
adjustments: this.scrollAdjustments += delta,
|
|
354
|
+
behavior: undefined,
|
|
355
|
+
sync: false
|
|
411
356
|
});
|
|
412
357
|
}
|
|
413
|
-
|
|
414
358
|
this.pendingMeasuredCacheIndexes.push(index);
|
|
415
|
-
this.itemMeasurementsCache = {
|
|
359
|
+
this.itemMeasurementsCache = {
|
|
360
|
+
...this.itemMeasurementsCache,
|
|
416
361
|
[item.key]: measuredItemSize
|
|
417
362
|
};
|
|
418
363
|
this.notify();
|
|
419
364
|
}
|
|
420
365
|
};
|
|
421
|
-
|
|
422
366
|
this.measureElement = node => {
|
|
423
367
|
if (!node) {
|
|
424
368
|
return;
|
|
425
369
|
}
|
|
426
|
-
|
|
427
370
|
this._measureElement(node, true);
|
|
428
371
|
};
|
|
429
|
-
|
|
430
372
|
this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements()], (indexes, measurements) => {
|
|
431
373
|
const virtualItems = [];
|
|
432
|
-
|
|
433
374
|
for (let k = 0, len = indexes.length; k < len; k++) {
|
|
434
375
|
const i = indexes[k];
|
|
435
376
|
const measurement = measurements[i];
|
|
436
377
|
virtualItems.push(measurement);
|
|
437
378
|
}
|
|
438
|
-
|
|
439
379
|
return virtualItems;
|
|
440
380
|
}, {
|
|
441
381
|
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
442
382
|
debug: () => this.options.debug
|
|
443
383
|
});
|
|
444
|
-
|
|
445
384
|
this.scrollToOffset = function (toOffset, _temp) {
|
|
446
385
|
let {
|
|
447
386
|
align = 'start',
|
|
448
|
-
|
|
387
|
+
behavior
|
|
449
388
|
} = _temp === void 0 ? {} : _temp;
|
|
450
389
|
const offset = _this.scrollOffset;
|
|
451
|
-
|
|
452
390
|
const size = _this.getSize();
|
|
453
|
-
|
|
454
391
|
if (align === 'auto') {
|
|
455
392
|
if (toOffset <= offset) {
|
|
456
393
|
align = 'start';
|
|
@@ -460,13 +397,11 @@ class Virtualizer {
|
|
|
460
397
|
align = 'start';
|
|
461
398
|
}
|
|
462
399
|
}
|
|
463
|
-
|
|
464
400
|
const options = {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
401
|
+
adjustments: undefined,
|
|
402
|
+
behavior,
|
|
403
|
+
sync: false
|
|
468
404
|
};
|
|
469
|
-
|
|
470
405
|
if (align === 'start') {
|
|
471
406
|
_this._scrollToOffset(toOffset, options);
|
|
472
407
|
} else if (align === 'end') {
|
|
@@ -475,29 +410,21 @@ class Virtualizer {
|
|
|
475
410
|
_this._scrollToOffset(toOffset - size / 2, options);
|
|
476
411
|
}
|
|
477
412
|
};
|
|
478
|
-
|
|
479
413
|
this.scrollToIndex = function (index, _temp2) {
|
|
480
414
|
let {
|
|
481
415
|
align = 'auto',
|
|
482
|
-
smoothScroll = _this.options.enableSmoothScroll,
|
|
483
416
|
...rest
|
|
484
417
|
} = _temp2 === void 0 ? {} : _temp2;
|
|
485
|
-
|
|
486
418
|
const measurements = _this.getMeasurements();
|
|
487
|
-
|
|
488
419
|
const offset = _this.scrollOffset;
|
|
489
|
-
|
|
490
420
|
const size = _this.getSize();
|
|
491
|
-
|
|
492
421
|
const {
|
|
493
422
|
count
|
|
494
423
|
} = _this.options;
|
|
495
424
|
const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
|
|
496
|
-
|
|
497
425
|
if (!measurement) {
|
|
498
426
|
return;
|
|
499
427
|
}
|
|
500
|
-
|
|
501
428
|
if (align === 'auto') {
|
|
502
429
|
if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
|
|
503
430
|
align = 'end';
|
|
@@ -507,78 +434,42 @@ class Virtualizer {
|
|
|
507
434
|
return;
|
|
508
435
|
}
|
|
509
436
|
}
|
|
510
|
-
|
|
511
437
|
const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
|
|
512
|
-
|
|
513
438
|
_this.scrollToOffset(toOffset, {
|
|
514
439
|
align,
|
|
515
|
-
smoothScroll,
|
|
516
440
|
...rest
|
|
517
441
|
});
|
|
518
442
|
};
|
|
519
|
-
|
|
520
443
|
this.getTotalSize = () => {
|
|
521
444
|
var _this$getMeasurements;
|
|
522
|
-
|
|
523
445
|
return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
|
|
524
446
|
};
|
|
525
|
-
|
|
526
447
|
this._scrollToOffset = (offset, _ref4) => {
|
|
527
448
|
let {
|
|
528
|
-
|
|
529
|
-
|
|
449
|
+
adjustments,
|
|
450
|
+
behavior,
|
|
530
451
|
sync
|
|
531
452
|
} = _ref4;
|
|
532
|
-
clearTimeout(this.scrollCheckFrame);
|
|
533
|
-
|
|
534
|
-
if (requested) {
|
|
535
|
-
this.destinationOffset = offset;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
453
|
this.options.scrollToFn(offset, {
|
|
539
|
-
|
|
540
|
-
sync
|
|
454
|
+
behavior,
|
|
455
|
+
sync,
|
|
456
|
+
adjustments
|
|
541
457
|
}, this);
|
|
542
|
-
let scrollCheckFrame;
|
|
543
|
-
|
|
544
|
-
const check = () => {
|
|
545
|
-
let lastOffset = this.scrollOffset;
|
|
546
|
-
this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
|
|
547
|
-
if (this.scrollCheckFrame !== scrollCheckFrame) {
|
|
548
|
-
return;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
if (this.scrollOffset === lastOffset) {
|
|
552
|
-
this.destinationOffset = undefined;
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
lastOffset = this.scrollOffset;
|
|
557
|
-
check();
|
|
558
|
-
}, 100);
|
|
559
|
-
};
|
|
560
|
-
|
|
561
|
-
check();
|
|
562
458
|
};
|
|
563
|
-
|
|
564
459
|
this.measure = () => {
|
|
565
460
|
this.itemMeasurementsCache = {};
|
|
566
461
|
this.notify();
|
|
567
462
|
};
|
|
568
|
-
|
|
569
463
|
this.setOptions(_opts);
|
|
570
464
|
this.scrollRect = this.options.initialRect;
|
|
571
465
|
this.scrollOffset = this.options.initialOffset;
|
|
572
466
|
this.calculateRange();
|
|
573
467
|
}
|
|
574
|
-
|
|
575
468
|
}
|
|
576
|
-
|
|
577
469
|
const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
578
470
|
while (low <= high) {
|
|
579
471
|
const middle = (low + high) / 2 | 0;
|
|
580
472
|
const currentValue = getCurrentValue(middle);
|
|
581
|
-
|
|
582
473
|
if (currentValue < value) {
|
|
583
474
|
low = middle + 1;
|
|
584
475
|
} else if (currentValue > value) {
|
|
@@ -587,14 +478,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
|
587
478
|
return middle;
|
|
588
479
|
}
|
|
589
480
|
}
|
|
590
|
-
|
|
591
481
|
if (low > 0) {
|
|
592
482
|
return low - 1;
|
|
593
483
|
} else {
|
|
594
484
|
return 0;
|
|
595
485
|
}
|
|
596
486
|
};
|
|
597
|
-
|
|
598
487
|
function calculateRange(_ref5) {
|
|
599
488
|
let {
|
|
600
489
|
measurements,
|
|
@@ -602,16 +491,12 @@ function calculateRange(_ref5) {
|
|
|
602
491
|
scrollOffset
|
|
603
492
|
} = _ref5;
|
|
604
493
|
const count = measurements.length - 1;
|
|
605
|
-
|
|
606
494
|
const getOffset = index => measurements[index].start;
|
|
607
|
-
|
|
608
495
|
const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
|
|
609
496
|
let endIndex = startIndex;
|
|
610
|
-
|
|
611
497
|
while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
|
|
612
498
|
endIndex++;
|
|
613
499
|
}
|
|
614
|
-
|
|
615
500
|
return {
|
|
616
501
|
startIndex,
|
|
617
502
|
endIndex
|