@tanstack/virtual-core 3.0.0-beta.17 → 3.0.0-beta.19
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 +65 -18
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +65 -18
- package/build/esm/index.js.map +1 -1
- package/build/stats.html +1 -1
- package/build/stats.json +14 -14
- package/build/types/index.d.ts +26 -7
- package/build/umd/index.development.js +65 -18
- 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 +71 -25
package/build/cjs/index.js
CHANGED
|
@@ -100,7 +100,8 @@ const createOffsetObserver = mode => {
|
|
|
100
100
|
let prevY = instance.scrollElement[propY];
|
|
101
101
|
|
|
102
102
|
const scroll = () => {
|
|
103
|
-
|
|
103
|
+
const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
|
|
104
|
+
cb(Math.max(0, offset - instance.options.scrollMargin));
|
|
104
105
|
};
|
|
105
106
|
|
|
106
107
|
scroll();
|
|
@@ -133,17 +134,29 @@ const observeWindowOffset = createOffsetObserver('window');
|
|
|
133
134
|
const measureElement = (element, instance) => {
|
|
134
135
|
return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
|
|
135
136
|
};
|
|
136
|
-
const windowScroll = (offset,
|
|
137
|
+
const windowScroll = (offset, _ref, instance) => {
|
|
137
138
|
var _instance$scrollEleme;
|
|
139
|
+
|
|
140
|
+
let {
|
|
141
|
+
canSmooth,
|
|
142
|
+
sync
|
|
143
|
+
} = _ref;
|
|
144
|
+
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
138
145
|
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
139
|
-
[instance.options.horizontal ? 'left' : 'top']:
|
|
146
|
+
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
140
147
|
behavior: canSmooth ? 'smooth' : undefined
|
|
141
148
|
});
|
|
142
149
|
};
|
|
143
|
-
const elementScroll = (offset,
|
|
150
|
+
const elementScroll = (offset, _ref2, instance) => {
|
|
144
151
|
var _instance$scrollEleme2;
|
|
152
|
+
|
|
153
|
+
let {
|
|
154
|
+
canSmooth,
|
|
155
|
+
sync
|
|
156
|
+
} = _ref2;
|
|
157
|
+
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
145
158
|
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
146
|
-
[instance.options.horizontal ? 'left' : 'top']:
|
|
159
|
+
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
147
160
|
behavior: canSmooth ? 'smooth' : undefined
|
|
148
161
|
});
|
|
149
162
|
};
|
|
@@ -153,6 +166,8 @@ class Virtualizer {
|
|
|
153
166
|
|
|
154
167
|
this.unsubs = [];
|
|
155
168
|
this.scrollElement = null;
|
|
169
|
+
this.isScrolling = false;
|
|
170
|
+
this.isScrollingTimeoutId = null;
|
|
156
171
|
this.measurementsCache = [];
|
|
157
172
|
this.itemMeasurementsCache = {};
|
|
158
173
|
this.pendingMeasuredCacheIndexes = [];
|
|
@@ -163,8 +178,8 @@ class Virtualizer {
|
|
|
163
178
|
};
|
|
164
179
|
|
|
165
180
|
this.setOptions = opts => {
|
|
166
|
-
Object.entries(opts).forEach(
|
|
167
|
-
let [key, value] =
|
|
181
|
+
Object.entries(opts).forEach(_ref3 => {
|
|
182
|
+
let [key, value] = _ref3;
|
|
168
183
|
if (typeof value === 'undefined') delete opts[key];
|
|
169
184
|
});
|
|
170
185
|
this.options = {
|
|
@@ -185,6 +200,8 @@ class Virtualizer {
|
|
|
185
200
|
width: 0,
|
|
186
201
|
height: 0
|
|
187
202
|
},
|
|
203
|
+
scrollMargin: 0,
|
|
204
|
+
scrollingDelay: 150,
|
|
188
205
|
...opts
|
|
189
206
|
};
|
|
190
207
|
};
|
|
@@ -213,14 +230,38 @@ class Virtualizer {
|
|
|
213
230
|
if (this.scrollElement !== scrollElement) {
|
|
214
231
|
this.cleanup();
|
|
215
232
|
this.scrollElement = scrollElement;
|
|
233
|
+
|
|
234
|
+
this._scrollToOffset(this.scrollOffset, {
|
|
235
|
+
canSmooth: false,
|
|
236
|
+
sync: true
|
|
237
|
+
});
|
|
238
|
+
|
|
216
239
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
217
240
|
this.scrollRect = rect;
|
|
218
241
|
this.calculateRange();
|
|
219
242
|
}));
|
|
220
243
|
this.unsubs.push(this.options.observeElementOffset(this, offset => {
|
|
221
|
-
this.
|
|
244
|
+
if (this.isScrollingTimeoutId !== null) {
|
|
245
|
+
clearTimeout(this.isScrollingTimeoutId);
|
|
246
|
+
this.isScrollingTimeoutId = null;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (this.scrollOffset !== offset) {
|
|
250
|
+
this.isScrolling = true;
|
|
251
|
+
this.scrollOffset = offset;
|
|
252
|
+
this.isScrollingTimeoutId = setTimeout(() => {
|
|
253
|
+
this.isScrollingTimeoutId = null;
|
|
254
|
+
this.isScrolling = false;
|
|
255
|
+
this.notify();
|
|
256
|
+
}, this.options.scrollingDelay);
|
|
257
|
+
} else {
|
|
258
|
+
this.isScrolling = false;
|
|
259
|
+
}
|
|
260
|
+
|
|
222
261
|
this.calculateRange();
|
|
223
262
|
}));
|
|
263
|
+
} else if (!this.isScrolling) {
|
|
264
|
+
this.calculateRange();
|
|
224
265
|
}
|
|
225
266
|
};
|
|
226
267
|
|
|
@@ -300,7 +341,10 @@ class Virtualizer {
|
|
|
300
341
|
}
|
|
301
342
|
|
|
302
343
|
if (!this.destinationOffset) {
|
|
303
|
-
this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize),
|
|
344
|
+
this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), {
|
|
345
|
+
canSmooth: false,
|
|
346
|
+
sync: false
|
|
347
|
+
});
|
|
304
348
|
}
|
|
305
349
|
}
|
|
306
350
|
|
|
@@ -352,19 +396,23 @@ class Virtualizer {
|
|
|
352
396
|
}
|
|
353
397
|
}
|
|
354
398
|
|
|
399
|
+
const options = {
|
|
400
|
+
canSmooth: smoothScroll,
|
|
401
|
+
sync: false
|
|
402
|
+
};
|
|
403
|
+
|
|
355
404
|
if (align === 'start') {
|
|
356
|
-
_this._scrollToOffset(toOffset,
|
|
405
|
+
_this._scrollToOffset(toOffset, options);
|
|
357
406
|
} else if (align === 'end') {
|
|
358
|
-
_this._scrollToOffset(toOffset - size,
|
|
407
|
+
_this._scrollToOffset(toOffset - size, options);
|
|
359
408
|
} else if (align === 'center') {
|
|
360
|
-
_this._scrollToOffset(toOffset - size / 2,
|
|
409
|
+
_this._scrollToOffset(toOffset - size / 2, options);
|
|
361
410
|
}
|
|
362
411
|
};
|
|
363
412
|
|
|
364
413
|
this.scrollToIndex = function (index, _temp2) {
|
|
365
414
|
let {
|
|
366
415
|
align = 'auto',
|
|
367
|
-
smoothScroll = _this.options.enableSmoothScroll,
|
|
368
416
|
...rest
|
|
369
417
|
} = _temp2 === void 0 ? {} : _temp2;
|
|
370
418
|
|
|
@@ -397,7 +445,6 @@ class Virtualizer {
|
|
|
397
445
|
|
|
398
446
|
_this.scrollToOffset(toOffset, {
|
|
399
447
|
align,
|
|
400
|
-
smoothScroll,
|
|
401
448
|
...rest
|
|
402
449
|
});
|
|
403
450
|
};
|
|
@@ -408,10 +455,10 @@ class Virtualizer {
|
|
|
408
455
|
return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
|
|
409
456
|
};
|
|
410
457
|
|
|
411
|
-
this._scrollToOffset = (offset,
|
|
458
|
+
this._scrollToOffset = (offset, options) => {
|
|
412
459
|
clearTimeout(this.scrollCheckFrame);
|
|
413
460
|
this.destinationOffset = offset;
|
|
414
|
-
this.options.scrollToFn(offset,
|
|
461
|
+
this.options.scrollToFn(offset, options, this);
|
|
415
462
|
let scrollCheckFrame;
|
|
416
463
|
|
|
417
464
|
const check = () => {
|
|
@@ -468,12 +515,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
|
468
515
|
}
|
|
469
516
|
};
|
|
470
517
|
|
|
471
|
-
function calculateRange(
|
|
518
|
+
function calculateRange(_ref4) {
|
|
472
519
|
let {
|
|
473
520
|
measurements,
|
|
474
521
|
outerSize,
|
|
475
522
|
scrollOffset
|
|
476
|
-
} =
|
|
523
|
+
} = _ref4;
|
|
477
524
|
const count = measurements.length - 1;
|
|
478
525
|
|
|
479
526
|
const getOffset = index => measurements[index].start;
|
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 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 = (\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, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = 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 options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\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 isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | 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 range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...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, {\n canSmooth: false,\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.isScrolling = true\n this.scrollOffset = offset\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 }\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 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 {\n canSmooth: false,\n sync: false,\n },\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 {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n }\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 options: { canSmooth: boolean; sync: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, options, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: 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","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","scrollingDelay","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","clearTimeout","setTimeout","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","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;;;;;;;AA2CA;AAEaA,MAAAA,mBAAmB,GAAIC,KAAD,IAAmBA,MAA/C;AAEMC,MAAAA,qBAAqB,GAAIC,KAAD,IAAkB;AACrD,EAAA,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAL,CAASH,KAAK,CAACI,UAAN,GAAmBJ,KAAK,CAACK,QAAlC,EAA4C,CAA5C,CAAd,CAAA;AACA,EAAA,MAAMC,GAAG,GAAGJ,IAAI,CAACK,GAAL,CAASP,KAAK,CAACQ,QAAN,GAAiBR,KAAK,CAACK,QAAhC,EAA0CL,KAAK,CAACS,KAAN,GAAc,CAAxD,CAAZ,CAAA;EAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;EAEA,KAAK,IAAIC,CAAC,GAAGV,KAAb,EAAoBU,CAAC,IAAIL,GAAzB,EAA8BK,CAAC,EAA/B,EAAmC;IACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAOD,GAAP,CAAA;AACD,EAXM;;AAaP,MAAMG,gBAAgB,GAAG,CACvBC,QADuB,EAEvBC,EAFuB,KAGpB;AACH,EAAA,IAAIC,IAAU,GAAG;IAAEC,MAAM,EAAE,CAAC,CAAX;AAAcC,IAAAA,KAAK,EAAE,CAAC,CAAA;GAAvC,CAAA;AAEA,EAAA,OAAQC,IAAD,IAAgB;IACrB,IACEL,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GACIF,IAAI,CAACD,KAAL,KAAeF,IAAI,CAACE,KADxB,GAEIC,IAAI,CAACF,MAAL,KAAgBD,IAAI,CAACC,MAH3B,EAIE;MACAF,EAAE,CAACI,IAAD,CAAF,CAAA;AACD,KAAA;;AAEDH,IAAAA,IAAI,GAAGG,IAAP,CAAA;GATF,CAAA;AAWD,CAjBD,CAAA;;MAmBaG,kBAAkB,GAAG,CAChCR,QADgC,EAEhCC,EAFgC,KAG7B;AACH,EAAA,MAAMQ,QAAQ,GAAG,IAAIC,cAAJ,CAAoBC,OAAD,IAAa;AAAA,IAAA,IAAA,SAAA,EAAA,UAAA,CAAA;;AAC/CV,IAAAA,EAAE,CAAC;MACDG,KAAK,EAAA,CAAA,SAAA,GAAEO,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAYC,WAAZ,CAAwBR,KAD9B;MAEDD,MAAM,EAAA,CAAA,UAAA,GAAEQ,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAYC,WAAZ,CAAwBT,MAAAA;AAF/B,KAAD,CAAF,CAAA;AAID,GALgB,CAAjB,CAAA;;AAOA,EAAA,IAAI,CAACH,QAAQ,CAACa,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;AAEDZ,EAAAA,EAAE,CAACD,QAAQ,CAACa,aAAT,CAAuBC,qBAAvB,EAAD,CAAF,CAAA;AAEAL,EAAAA,QAAQ,CAACM,OAAT,CAAiBf,QAAQ,CAACa,aAA1B,CAAA,CAAA;AAEA,EAAA,OAAO,MAAM;AACXJ,IAAAA,QAAQ,CAACO,SAAT,CAAmBhB,QAAQ,CAACa,aAA5B,CAAA,CAAA;GADF,CAAA;AAGD,EAtBM;MAwBMI,iBAAiB,GAAG,CAC/BjB,QAD+B,EAE/BC,EAF+B,KAG5B;AACH,EAAA,MAAMiB,gBAAgB,GAAGnB,gBAAgB,CAACC,QAAD,EAAWC,EAAX,CAAzC,CAAA;;AACA,EAAA,MAAMkB,QAAQ,GAAG,MACfD,gBAAgB,CAAC;AACfd,IAAAA,KAAK,EAAEJ,QAAQ,CAACa,aAAT,CAAuBO,UADf;AAEfjB,IAAAA,MAAM,EAAEH,QAAQ,CAACa,aAAT,CAAuBQ,WAAAA;AAFhB,GAAD,CADlB,CAAA;;AAMA,EAAA,IAAI,CAACrB,QAAQ,CAACa,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDM,QAAQ,EAAA,CAAA;EAERnB,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDH,QAAlD,EAA4D;AAC1DI,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXxB,IAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDN,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;AA6BP,MAAMO,WAAW,GAAG;AAClBC,EAAAA,OAAO,EAAE,CAAC,YAAD,EAAe,WAAf,CADS;AAElBC,EAAAA,MAAM,EAAE,CAAC,SAAD,EAAY,SAAZ,CAAA;AAFU,CAApB,CAAA;;AAKA,MAAMC,oBAAoB,GAAIC,IAAD,IAAwB;AACnD,EAAA,OAAO,CAAC9B,QAAD,EAAkCC,EAAlC,KAAmE;AACxE,IAAA,IAAI,CAACD,QAAQ,CAACa,aAAd,EAA6B;AAC3B,MAAA,OAAA;AACD,KAAA;;IAED,MAAMkB,KAAK,GAAGL,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;IACA,MAAME,KAAK,GAAGN,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;AAEA,IAAA,IAAIG,KAAa,GAAGjC,QAAQ,CAACa,aAAT,CAAuBkB,KAAvB,CAApB,CAAA;AACA,IAAA,IAAIG,KAAa,GAAGlC,QAAQ,CAACa,aAAT,CAAuBmB,KAAvB,CAApB,CAAA;;IAEA,MAAMG,MAAM,GAAG,MAAM;AACnB,MAAA,MAAMC,MAAM,GACVpC,QAAQ,CAACa,aAAT,CAAuBb,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8BwB,KAA9B,GAAsCC,KAA7D,CADF,CAAA;AAGA/B,MAAAA,EAAE,CAACb,IAAI,CAACC,GAAL,CAAS,CAAT,EAAY+C,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAAtC,CAAD,CAAF,CAAA;KAJF,CAAA;;IAOAF,MAAM,EAAA,CAAA;;IAEN,MAAMG,QAAQ,GAAIC,CAAD,IAAc;AAC7B,MAAA,MAAMC,MAAM,GAAGD,CAAC,CAACE,aAAjB,CAAA;AACA,MAAA,MAAMC,OAAO,GAAGF,MAAM,CAACT,KAAD,CAAtB,CAAA;AACA,MAAA,MAAMY,OAAO,GAAGH,MAAM,CAACR,KAAD,CAAtB,CAAA;;AAEA,MAAA,IAAIhC,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B0B,KAAK,GAAGS,OAAtC,GAAgDR,KAAK,GAAGS,OAA5D,EAAqE;QACnER,MAAM,EAAA,CAAA;AACP,OAAA;;AAEDF,MAAAA,KAAK,GAAGS,OAAR,CAAA;AACAR,MAAAA,KAAK,GAAGS,OAAR,CAAA;KAVF,CAAA;;IAaA3C,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDgB,QAAlD,EAA4D;AAC1Df,MAAAA,OAAO,EAAE,KADiD;AAE1DC,MAAAA,OAAO,EAAE,IAAA;KAFX,CAAA,CAAA;AAKA,IAAA,OAAO,MAAM;AACXxB,MAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDa,QAArD,CAAA,CAAA;KADF,CAAA;GAtCF,CAAA;AA0CD,CA3CD,CAAA;;MA6CaM,oBAAoB,GAAGf,oBAAoB,CAAC,SAAD,EAAjD;MACMgB,mBAAmB,GAAGhB,oBAAoB,CAAC,QAAD,EAAhD;MAEMiB,cAAc,GAAG,CAC5BnB,OAD4B,EAE5B3B,QAF4B,KAGzB;AACH,EAAA,OAAQ2B,OAAD,CAAqBb,qBAArB,EAAA,CACLd,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,OAA9B,GAAwC,QADnC,CAAP,CAAA;AAGD,EAPM;MASMwC,YAAY,GAAG,CAC1BX,MAD0B,EAAA,IAAA,EAG1BpC,QAH0B,KAIvB;AAAA,EAAA,IAAA,qBAAA,CAAA;;EAAA,IAFH;IAAEgD,SAAF;AAAaC,IAAAA,IAAAA;GAEV,GAAA,IAAA,CAAA;AACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;AAEC,EAAA,CAAA,qBAAA,GAACrC,QAAQ,CAACa,aAAV,2CAAoCsC,QAApC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoCA,QAApC,CAA+C;IAC9C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADF;AAE9CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;GAFlC,CAAA,CAAA;AAIF,EAXM;MAaMC,aAAa,GAAG,CAC3BlB,MAD2B,EAAA,KAAA,EAG3BpC,QAH2B,KAIxB;AAAA,EAAA,IAAA,sBAAA,CAAA;;EAAA,IAFH;IAAEgD,SAAF;AAAaC,IAAAA,IAAAA;GAEV,GAAA,KAAA,CAAA;AACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;AAEC,EAAA,CAAA,sBAAA,GAACrC,QAAQ,CAACa,aAAV,4CAAqCsC,QAArC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqCA,QAArC,CAAgD;IAC/C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADD;AAE/CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;GAFlC,CAAA,CAAA;AAIF,EAXM;AA2DA,MAAME,WAAN,CAAoE;EAsBzEC,WAAW,CAACC,KAAD,EAAyD;AAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;IAAA,IArB5DC,CAAAA,MAqB4D,GArB1B,EAqB0B,CAAA;IAAA,IAnBpE7C,CAAAA,aAmBoE,GAnB7B,IAmB6B,CAAA;IAAA,IAlBpE8C,CAAAA,WAkBoE,GAlB7C,KAkB6C,CAAA;IAAA,IAjB5DC,CAAAA,oBAiB4D,GAjBC,IAiBD,CAAA;IAAA,IAhB5DC,CAAAA,iBAgB4D,GAhBhC,EAgBgC,CAAA;IAAA,IAf5DC,CAAAA,qBAe4D,GAff,EAee,CAAA;IAAA,IAd5DC,CAAAA,2BAc4D,GAdpB,EAcoB,CAAA;IAAA,IAT5DC,CAAAA,mBAS4D,GANhE,EAMgE,CAAA;AAAA,IAAA,IAAA,CALpE9E,KAKoE,GALlB;AAChDI,MAAAA,UAAU,EAAE,CADoC;AAEhDI,MAAAA,QAAQ,EAAE,CAAA;KAGwD,CAAA;;IAAA,IAQpEuE,CAAAA,UARoE,GAQtDR,IAAD,IAA4D;AACvES,MAAAA,MAAM,CAACvD,OAAP,CAAe8C,IAAf,CAAqBU,CAAAA,OAArB,CAA6B,KAAkB,IAAA;AAAA,QAAA,IAAjB,CAACC,GAAD,EAAMC,KAAN,CAAiB,GAAA,KAAA,CAAA;QAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQZ,IAAD,CAAcW,GAAd,CAAP,CAAA;OADpC,CAAA,CAAA;AAIA,MAAA,IAAA,CAAK9D,OAAL,GAAe;AACbgE,QAAAA,KAAK,EAAE,KADM;AAEbC,QAAAA,aAAa,EAAE,CAFF;AAGbhF,QAAAA,QAAQ,EAAE,CAHG;AAIbiF,QAAAA,YAAY,EAAE,CAJD;AAKbC,QAAAA,UAAU,EAAE,CALC;AAMbC,QAAAA,kBAAkB,EAAE,CANP;AAObC,QAAAA,gBAAgB,EAAE,CAPL;AAQbpE,QAAAA,UAAU,EAAE,KARC;AASbqE,QAAAA,UAAU,EAAE7F,mBATC;AAUb8F,QAAAA,cAAc,EAAE5F,qBAVH;AAWb6F,QAAAA,kBAAkB,EAAE,IAXP;QAYbC,QAAQ,EAAE,MAAM,EAZH;QAabjC,cAba;AAcbkC,QAAAA,WAAW,EAAE;AAAE5E,UAAAA,KAAK,EAAE,CAAT;AAAYD,UAAAA,MAAM,EAAE,CAAA;SAdpB;AAebkC,QAAAA,YAAY,EAAE,CAfD;AAgBb4C,QAAAA,cAAc,EAAE,GAhBH;QAiBb,GAAGxB,IAAAA;OAjBL,CAAA;KAbkE,CAAA;;IAAA,IAkC5DyB,CAAAA,MAlC4D,GAkCnD,MAAM;AAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;AACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAK5E,OAAL,EAAayE,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;KAnCkE,CAAA;;IAAA,IAsC5DI,CAAAA,OAtC4D,GAsClD,MAAM;MACtB,IAAKzB,CAAAA,MAAL,CAAY0B,MAAZ,CAAmBC,OAAnB,CAA4BlB,CAAAA,OAA5B,CAAqCmB,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;MACA,IAAK5B,CAAAA,MAAL,GAAc,EAAd,CAAA;MACA,IAAK7C,CAAAA,aAAL,GAAqB,IAArB,CAAA;KAzCkE,CAAA;;IAAA,IA4CpE0E,CAAAA,SA5CoE,GA4CxD,MAAM;AAChB,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;OADF,CAAA;KA7CkE,CAAA;;IAAA,IAkDpEK,CAAAA,WAlDoE,GAkDtD,MAAM;AAClB,MAAA,MAAM3E,aAAa,GAAG,IAAA,CAAKP,OAAL,CAAamF,gBAAb,EAAtB,CAAA;;AAEA,MAAA,IAAI,IAAK5E,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;AACxC,QAAA,IAAA,CAAKsE,OAAL,EAAA,CAAA;QAEA,IAAKtE,CAAAA,aAAL,GAAqBA,aAArB,CAAA;;AACA,QAAA,IAAA,CAAK6E,eAAL,CAAqB,IAAKC,CAAAA,YAA1B,EAAwC;AACtC3C,UAAAA,SAAS,EAAE,KAD2B;AAEtCC,UAAAA,IAAI,EAAE,IAAA;SAFR,CAAA,CAAA;;AAKA,QAAA,IAAA,CAAKS,MAAL,CAAY5D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAaE,kBAAb,CAAgC,IAAhC,EAAuCH,IAAD,IAAU;UAC9C,IAAKuF,CAAAA,UAAL,GAAkBvF,IAAlB,CAAA;AACA,UAAA,IAAA,CAAKwF,cAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAOA,QAAA,IAAA,CAAKnC,MAAL,CAAY5D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAasC,oBAAb,CAAkC,IAAlC,EAAyCR,MAAD,IAAY;AAClD,UAAA,IAAI,IAAKwB,CAAAA,oBAAL,KAA8B,IAAlC,EAAwC;YACtCkC,YAAY,CAAC,IAAKlC,CAAAA,oBAAN,CAAZ,CAAA;YACA,IAAKA,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;AACD,WAAA;;AAED,UAAA,IAAI,IAAK+B,CAAAA,YAAL,KAAsBvD,MAA1B,EAAkC;YAChC,IAAKuB,CAAAA,WAAL,GAAmB,IAAnB,CAAA;YACA,IAAKgC,CAAAA,YAAL,GAAoBvD,MAApB,CAAA;AAEA,YAAA,IAAA,CAAKwB,oBAAL,GAA4BmC,UAAU,CAAC,MAAM;cAC3C,IAAKnC,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;cACA,IAAKD,CAAAA,WAAL,GAAmB,KAAnB,CAAA;AAEA,cAAA,IAAA,CAAKuB,MAAL,EAAA,CAAA;AACD,aALqC,EAKnC,IAAA,CAAK5E,OAAL,CAAa2E,cALsB,CAAtC,CAAA;AAMD,WAVD,MAUO;YACL,IAAKtB,CAAAA,WAAL,GAAmB,KAAnB,CAAA;AACD,WAAA;;AAED,UAAA,IAAA,CAAKkC,cAAL,EAAA,CAAA;AACD,SArBD,CADF,CAAA,CAAA;AAwBD,OAxCD,MAwCO,IAAI,CAAC,IAAA,CAAKlC,WAAV,EAAuB;AAC5B,QAAA,IAAA,CAAKkC,cAAL,EAAA,CAAA;AACD,OAAA;KA/FiE,CAAA;;IAAA,IAkG5DG,CAAAA,OAlG4D,GAkGlD,MAAM;MACtB,OAAO,IAAA,CAAKJ,UAAL,CAAgB,IAAKtF,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAApD,CAAP,CAAA;KAnGkE,CAAA;;AAAA,IAAA,IAAA,CAsG5D0F,eAtG4D,GAsG1CC,UAAI,CAC5B,MAAM,CACJ,IAAA,CAAK5F,OAAL,CAAaX,KADT,EAEJ,IAAKW,CAAAA,OAAL,CAAakE,YAFT,EAGJ,IAAKlE,CAAAA,OAAL,CAAasE,UAHT,EAIJ,IAAA,CAAKd,qBAJD,CADsB,EAO5B,CAACnE,KAAD,EAAQ6E,YAAR,EAAsBI,UAAtB,EAAkCf,iBAAlC,KAAwD;AACtD,MAAA,MAAMpE,GAAG,GACP,IAAA,CAAKsE,2BAAL,CAAiCoC,MAAjC,GAA0C,CAA1C,GACI/G,IAAI,CAACK,GAAL,CAAS,GAAG,KAAKsE,2BAAjB,CADJ,GAEI,CAHN,CAAA;MAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;MAEA,MAAMqC,YAAY,GAAG,IAAA,CAAKvC,iBAAL,CAAuBwC,KAAvB,CAA6B,CAA7B,EAAgC5G,GAAhC,CAArB,CAAA;;MAEA,KAAK,IAAII,CAAC,GAAGJ,GAAb,EAAkBI,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;AAChC,QAAA,MAAMuE,GAAG,GAAGQ,UAAU,CAAC/E,CAAD,CAAtB,CAAA;AACA,QAAA,MAAMyG,YAAY,GAAGzC,iBAAiB,CAACO,GAAD,CAAtC,CAAA;AACA,QAAA,MAAMjF,KAAK,GAAGiH,YAAY,CAACvG,CAAC,GAAG,CAAL,CAAZ,GACVuG,YAAY,CAACvG,CAAC,GAAG,CAAL,CAAZ,CAAqBL,GADX,GAEVgF,YAFJ,CAAA;AAGA,QAAA,MAAM+B,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GACIA,YADJ,GAEI,KAAKhG,OAAL,CAAakG,YAAb,CAA0B3G,CAA1B,CAHN,CAAA;AAIA,QAAA,MAAML,GAAG,GAAGL,KAAK,GAAGoH,IAApB,CAAA;QACAH,YAAY,CAACvG,CAAD,CAAZ,GAAkB;AAAEb,UAAAA,KAAK,EAAEa,CAAT;UAAYV,KAAZ;UAAmBoH,IAAnB;UAAyB/G,GAAzB;AAA8B4E,UAAAA,GAAAA;SAAhD,CAAA;AACD,OAAA;;MAED,IAAKP,CAAAA,iBAAL,GAAyBuC,YAAzB,CAAA;AACA,MAAA,OAAOA,YAAP,CAAA;AACD,KAhC2B,EAiC5B;MACEhC,GAAG,EAAEqC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,IAAyC,iBADhD;AAEErC,MAAAA,KAAK,EAAE,MAAM,IAAKhE,CAAAA,OAAL,CAAagE,KAAAA;AAF5B,KAjC4B,CAtGsC,CAAA;IAAA,IA6IpEuB,CAAAA,cA7IoE,GA6InDK,UAAI,CACnB,MAAM,CAAC,IAAKD,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKL,YAA9C,CADa,EAEnB,CAACS,YAAD,EAAeQ,SAAf,EAA0BjB,YAA1B,KAA2C;MACzC,MAAMzG,KAAK,GAAG2G,cAAc,CAAC;QAC3BO,YAD2B;QAE3BQ,SAF2B;AAG3BjB,QAAAA,YAAAA;AAH2B,OAAD,CAA5B,CAAA;;AAKA,MAAA,IACEzG,KAAK,CAACI,UAAN,KAAqB,IAAA,CAAKJ,KAAL,CAAWI,UAAhC,IACAJ,KAAK,CAACQ,QAAN,KAAmB,KAAKR,KAAL,CAAWQ,QAFhC,EAGE;QACA,IAAKR,CAAAA,KAAL,GAAaA,KAAb,CAAA;AACA,QAAA,IAAA,CAAKgG,MAAL,EAAA,CAAA;AACD,OAAA;;AACD,MAAA,OAAO,KAAKhG,KAAZ,CAAA;AACD,KAhBkB,EAiBnB;MACEkF,GAAG,EAAEqC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,IAAyC,gBADhD;AAEErC,MAAAA,KAAK,EAAE,MAAM,IAAKhE,CAAAA,OAAL,CAAagE,KAAAA;AAF5B,KAjBmB,CA7I+C,CAAA;AAAA,IAAA,IAAA,CAoK5DuC,UApK4D,GAoK/CX,UAAI,CACvB,MAAM,CACJ,IAAA,CAAK5F,OAAL,CAAauE,cADT,EAEJ,IAAK3F,CAAAA,KAFD,EAGJ,IAAKoB,CAAAA,OAAL,CAAaf,QAHT,EAIJ,IAAA,CAAKe,OAAL,CAAaX,KAJT,CADiB,EAOvB,CAACkF,cAAD,EAAiB3F,KAAjB,EAAwBK,QAAxB,EAAkCI,KAAlC,KAA4C;AAC1C,MAAA,OAAOkF,cAAc,CAAC,EACpB,GAAG3F,KADiB;QAEpBK,QAFoB;AAGpBI,QAAAA,KAAK,EAAEA,KAAAA;AAHa,OAAD,CAArB,CAAA;AAKD,KAbsB,EAcvB;MACEyE,GAAG,EAAEqC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,IAAyC,YADhD;AAEErC,MAAAA,KAAK,EAAE,MAAM,IAAKhE,CAAAA,OAAL,CAAagE,KAAAA;AAF5B,KAduB,CApK2C,CAAA;IAAA,IAwLpEwC,CAAAA,eAxLoE,GAwLlDZ,UAAI,CACpB,MAAM,CACJ,IAAA,CAAKW,UAAL,EADI,EAEJ,IAAA,CAAKZ,eAAL,EAFI,EAGJ,IAAK3F,CAAAA,OAAL,CAAawC,cAHT,CADc,EAMpB,CAACiE,OAAD,EAAUX,YAAV,EAAwBtD,cAAxB,KAA2C;AACzC,MAAA,MAAMkE,kBAAkB,GACrBhI,KAAD,IAAoBiI,cAAD,IAAyC;AAAA,QAAA,IAAA,qBAAA,CAAA;;AAC1D,QAAA,MAAMC,IAAI,GAAG,IAAA,CAAKrD,iBAAL,CAAuB7E,KAAvB,CAAb,CAAA;;QAEA,IAAI,CAACiI,cAAL,EAAqB;AACnB,UAAA,OAAA;AACD,SAAA;;AAED,QAAA,MAAME,gBAAgB,GAAGrE,cAAc,CAACmE,cAAD,EAAiB,IAAjB,CAAvC,CAAA;AACA,QAAA,MAAMG,QAAQ,GAAA,CAAA,qBAAA,GAAG,IAAKtD,CAAAA,qBAAL,CAA2BoD,IAAI,CAAC9C,GAAhC,CAAH,KAAA,IAAA,GAAA,qBAAA,GAA2C8C,IAAI,CAACX,IAA9D,CAAA;;QAEA,IAAIY,gBAAgB,KAAKC,QAAzB,EAAmC;AACjC,UAAA,IAAIF,IAAI,CAAC/H,KAAL,GAAa,IAAA,CAAKwG,YAAtB,EAAoC;AAClC,YAAA,IAAIc,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,IAAyC,IAAKrG,CAAAA,OAAL,CAAagE,KAA1D,EAAiE;AAC/D+C,cAAAA,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2BH,gBAAgB,GAAGC,QAA9C,CAAA,CAAA;AACD,aAAA;;YAED,IAAI,CAAC,IAAKG,CAAAA,iBAAV,EAA6B;cAC3B,IAAK7B,CAAAA,eAAL,CACE,IAAKC,CAAAA,YAAL,IAAqBwB,gBAAgB,GAAGC,QAAxC,CADF,EAEE;AACEpE,gBAAAA,SAAS,EAAE,KADb;AAEEC,gBAAAA,IAAI,EAAE,KAAA;eAJV,CAAA,CAAA;AAOD,aAAA;AACF,WAAA;;AAED,UAAA,IAAA,CAAKc,2BAAL,CAAiCjE,IAAjC,CAAsCd,KAAtC,CAAA,CAAA;AACA,UAAA,IAAA,CAAK8E,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;YAE3B,CAACoD,IAAI,CAAC9C,GAAN,GAAY+C,gBAAAA;WAFd,CAAA;AAIA,UAAA,IAAA,CAAKjC,MAAL,EAAA,CAAA;AACD,SAAA;OAlCL,CAAA;;MAqCA,MAAMsC,YAAyC,GAAG,EAAlD,CAAA;MAEA,MAAMC,sBAAuD,GAAG,EAAhE,CAAA;;AAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGZ,OAAO,CAACZ,MAA9B,EAAsCuB,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;AAAA,QAAA,IAAA,qBAAA,CAAA;;AAClD,QAAA,MAAM7H,CAAC,GAAGkH,OAAO,CAACW,CAAD,CAAjB,CAAA;AACA,QAAA,MAAME,WAAW,GAAGxB,YAAY,CAACvG,CAAD,CAAhC,CAAA;AAEA,QAAA,MAAMqH,IAAI,GAAG,EACX,GAAGU,WADQ;AAEX9E,UAAAA,cAAc,EAAG2E,sBAAsB,CAAC5H,CAAD,CAAtB,GACf,CAAA,qBAAA,GAAA,IAAA,CAAKmE,mBAAL,CAAyBnE,CAAzB,CADe,KACgBmH,IAAAA,GAAAA,qBAAAA,GAAAA,kBAAkB,CAACnH,CAAD,CAAA;SAHrD,CAAA;QAKA2H,YAAY,CAAC1H,IAAb,CAAkBoH,IAAlB,CAAA,CAAA;AACD,OAAA;;MAED,IAAKlD,CAAAA,mBAAL,GAA2ByD,sBAA3B,CAAA;AAEA,MAAA,OAAOD,YAAP,CAAA;AACD,KA/DmB,EAgEpB;MACEpD,GAAG,EAAEqC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,IAAyC,YADhD;AAEErC,MAAAA,KAAK,EAAE,MAAM,IAAKhE,CAAAA,OAAL,CAAagE,KAAAA;AAF5B,KAhEoB,CAxL8C,CAAA;;AAAA,IAAA,IAAA,CA8PpEuD,cA9PoE,GA8PnD,UACf3E,QADe,EAMZ,KAAA,EAAA;MAAA,IAJH;AACE4E,QAAAA,KAAK,GAAG,OADV;AAEEC,QAAAA,YAAY,GAAG,KAAI,CAACzH,OAAL,CAAawE,kBAAAA;AAF9B,OAIG,sBADwB,EACxB,GAAA,KAAA,CAAA;AACH,MAAA,MAAM1C,MAAM,GAAG,KAAI,CAACuD,YAApB,CAAA;;AACA,MAAA,MAAMY,IAAI,GAAG,KAAI,CAACP,OAAL,EAAb,CAAA;;MAEA,IAAI8B,KAAK,KAAK,MAAd,EAAsB;QACpB,IAAI5E,QAAQ,IAAId,MAAhB,EAAwB;AACtB0F,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAFD,MAEO,IAAI5E,QAAQ,IAAId,MAAM,GAAGmE,IAAzB,EAA+B;AACpCuB,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFM,MAEA;AACLA,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAAA;AACF,OAAA;;AAED,MAAA,MAAMxH,OAAO,GAAG;AACd0C,QAAAA,SAAS,EAAE+E,YADG;AAEd9E,QAAAA,IAAI,EAAE,KAAA;OAFR,CAAA;;MAIA,IAAI6E,KAAK,KAAK,OAAd,EAAuB;AACrB,QAAA,KAAI,CAACpC,eAAL,CAAqBxC,QAArB,EAA+B5C,OAA/B,CAAA,CAAA;AACD,OAFD,MAEO,IAAIwH,KAAK,KAAK,KAAd,EAAqB;AAC1B,QAAA,KAAI,CAACpC,eAAL,CAAqBxC,QAAQ,GAAGqD,IAAhC,EAAsCjG,OAAtC,CAAA,CAAA;AACD,OAFM,MAEA,IAAIwH,KAAK,KAAK,QAAd,EAAwB;QAC7B,KAAI,CAACpC,eAAL,CAAqBxC,QAAQ,GAAGqD,IAAI,GAAG,CAAvC,EAA0CjG,OAA1C,CAAA,CAAA;AACD,OAAA;KA5RiE,CAAA;;AAAA,IAAA,IAAA,CA+RpE0H,aA/RoE,GA+RpD,UACdhJ,KADc,EAGX,MAAA,EAAA;MAAA,IADH;AAAE8I,QAAAA,KAAK,GAAG,MAAV;QAAkB,GAAGG,IAAAA;AAArB,OACG,uBADiD,EACjD,GAAA,MAAA,CAAA;;AACH,MAAA,MAAM7B,YAAY,GAAG,KAAI,CAACH,eAAL,EAArB,CAAA;;AACA,MAAA,MAAM7D,MAAM,GAAG,KAAI,CAACuD,YAApB,CAAA;;AACA,MAAA,MAAMY,IAAI,GAAG,KAAI,CAACP,OAAL,EAAb,CAAA;;MACA,MAAM;AAAErG,QAAAA,KAAAA;OAAU,GAAA,KAAI,CAACW,OAAvB,CAAA;MAEA,MAAMsH,WAAW,GAAGxB,YAAY,CAAChH,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYD,IAAI,CAACK,GAAL,CAAST,KAAT,EAAgBW,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;MAEA,IAAI,CAACiI,WAAL,EAAkB;AAChB,QAAA,OAAA;AACD,OAAA;;MAED,IAAIE,KAAK,KAAK,MAAd,EAAsB;AACpB,QAAA,IAAIF,WAAW,CAACpI,GAAZ,IAAmB4C,MAAM,GAAGmE,IAAT,GAAgB,KAAI,CAACjG,OAAL,CAAaqE,gBAApD,EAAsE;AACpEmD,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFD,MAEO,IACLF,WAAW,CAACzI,KAAZ,IACAiD,MAAM,GAAG,KAAI,CAAC9B,OAAL,CAAaoE,kBAFjB,EAGL;AACAoD,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SALM,MAKA;AACL,UAAA,OAAA;AACD,SAAA;AACF,OAAA;;MAED,MAAM5E,QAAQ,GACZ4E,KAAK,KAAK,KAAV,GACIF,WAAW,CAACpI,GAAZ,GAAkB,KAAI,CAACc,OAAL,CAAaqE,gBADnC,GAEIiD,WAAW,CAACzI,KAAZ,GAAoB,KAAI,CAACmB,OAAL,CAAaoE,kBAHvC,CAAA;;AAKA,MAAA,KAAI,CAACmD,cAAL,CAAoB3E,QAApB,EAA8B;QAAE4E,KAAF;QAAS,GAAGG,IAAAA;OAA1C,CAAA,CAAA;KAhUkE,CAAA;;AAAA,IAAA,IAAA,CAmUpEC,YAnUoE,GAmUrD,MAAA;AAAA,MAAA,IAAA,qBAAA,CAAA;;MAAA,OACb,CAAC,+BAAKjC,eAAL,EAAA,CAAuB,KAAK3F,OAAL,CAAaX,KAAb,GAAqB,CAA5C,4CAAgDH,GAAhD,KACC,KAAKc,OAAL,CAAakE,YADf,IAC+B,IAAA,CAAKlE,OAAL,CAAamE,UAF/B,CAAA;KAnUqD,CAAA;;AAAA,IAAA,IAAA,CAuU5DiB,eAvU4D,GAuU1C,CACxBtD,MADwB,EAExB9B,OAFwB,KAGrB;MACHwF,YAAY,CAAC,IAAKqC,CAAAA,gBAAN,CAAZ,CAAA;MAEA,IAAKZ,CAAAA,iBAAL,GAAyBnF,MAAzB,CAAA;MACA,IAAK9B,CAAAA,OAAL,CAAa8H,UAAb,CAAwBhG,MAAxB,EAAgC9B,OAAhC,EAAyC,IAAzC,CAAA,CAAA;AAEA,MAAA,IAAI6H,gBAAJ,CAAA;;MAEA,MAAME,KAAK,GAAG,MAAM;QAClB,IAAIC,UAAU,GAAG,IAAA,CAAK3C,YAAtB,CAAA;AACA,QAAA,IAAA,CAAKwC,gBAAL,GAAwBA,gBAAgB,GAAGpC,UAAU,CAAC,MAAM;AAC1D,UAAA,IAAI,IAAKoC,CAAAA,gBAAL,KAA0BA,gBAA9B,EAAgD;AAC9C,YAAA,OAAA;AACD,WAAA;;AAED,UAAA,IAAI,IAAKxC,CAAAA,YAAL,KAAsB2C,UAA1B,EAAsC;YACpC,IAAKf,CAAAA,iBAAL,GAAyBlE,SAAzB,CAAA;AACA,YAAA,OAAA;AACD,WAAA;;UACDiF,UAAU,GAAG,KAAK3C,YAAlB,CAAA;UACA0C,KAAK,EAAA,CAAA;SAV8C,EAWlD,GAXkD,CAArD,CAAA;OAFF,CAAA;;MAgBAA,KAAK,EAAA,CAAA;KAlW6D,CAAA;;IAAA,IAqWpEE,CAAAA,OArWoE,GAqW1D,MAAM;MACd,IAAKzE,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;AACA,MAAA,IAAA,CAAKoB,MAAL,EAAA,CAAA;KAvWkE,CAAA;;IAClE,IAAKjB,CAAAA,UAAL,CAAgBR,KAAhB,CAAA,CAAA;AACA,IAAA,IAAA,CAAKmC,UAAL,GAAkB,IAAKtF,CAAAA,OAAL,CAAa0E,WAA/B,CAAA;AACA,IAAA,IAAA,CAAKW,YAAL,GAAoB,IAAKrF,CAAAA,OAAL,CAAaiE,aAAjC,CAAA;AAEA,IAAA,IAAA,CAAKsB,cAAL,EAAA,CAAA;AACD,GAAA;;AA5BwE,CAAA;;AAiY3E,MAAM2C,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9BtE,KAJ8B,KAK3B;EACH,OAAOoE,GAAG,IAAIC,IAAd,EAAoB;IAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;AACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;IAEA,IAAIC,YAAY,GAAGxE,KAAnB,EAA0B;MACxBoE,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;AACD,KAFD,MAEO,IAAIC,YAAY,GAAGxE,KAAnB,EAA0B;MAC/BqE,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;AACD,KAFM,MAEA;AACL,MAAA,OAAOA,MAAP,CAAA;AACD,KAAA;AACF,GAAA;;EAED,IAAIH,GAAG,GAAG,CAAV,EAAa;IACX,OAAOA,GAAG,GAAG,CAAb,CAAA;AACD,GAFD,MAEO;AACL,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;AACF,CAxBD,CAAA;;AA0BA,SAAS5C,cAAT,CAQG,KAAA,EAAA;EAAA,IARqB;IACtBO,YADsB;IAEtBQ,SAFsB;AAGtBjB,IAAAA,YAAAA;GAKC,GAAA,KAAA,CAAA;AACD,EAAA,MAAMhG,KAAK,GAAGyG,YAAY,CAACD,MAAb,GAAsB,CAApC,CAAA;;EACA,MAAM2C,SAAS,GAAI9J,KAAD,IAAmBoH,YAAY,CAACpH,KAAD,CAAZ,CAAqBG,KAA1D,CAAA;;EAEA,MAAMG,UAAU,GAAGkJ,uBAAuB,CAAC,CAAD,EAAI7I,KAAJ,EAAWmJ,SAAX,EAAsBnD,YAAtB,CAA1C,CAAA;EACA,IAAIjG,QAAQ,GAAGJ,UAAf,CAAA;;AAEA,EAAA,OACEI,QAAQ,GAAGC,KAAX,IACAyG,YAAY,CAAC1G,QAAD,CAAZ,CAAwBF,GAAxB,GAA8BmG,YAAY,GAAGiB,SAF/C,EAGE;IACAlH,QAAQ,EAAA,CAAA;AACT,GAAA;;EAED,OAAO;IAAEJ,UAAF;AAAcI,IAAAA,QAAAA;GAArB,CAAA;AACD;;;;;;;;;;;;;;"}
|
package/build/esm/index.js
CHANGED
|
@@ -135,7 +135,8 @@ const createOffsetObserver = mode => {
|
|
|
135
135
|
let prevY = instance.scrollElement[propY];
|
|
136
136
|
|
|
137
137
|
const scroll = () => {
|
|
138
|
-
|
|
138
|
+
const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
|
|
139
|
+
cb(Math.max(0, offset - instance.options.scrollMargin));
|
|
139
140
|
};
|
|
140
141
|
|
|
141
142
|
scroll();
|
|
@@ -168,17 +169,29 @@ const observeWindowOffset = createOffsetObserver('window');
|
|
|
168
169
|
const measureElement = (element, instance) => {
|
|
169
170
|
return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
|
|
170
171
|
};
|
|
171
|
-
const windowScroll = (offset,
|
|
172
|
+
const windowScroll = (offset, _ref, instance) => {
|
|
172
173
|
var _instance$scrollEleme;
|
|
174
|
+
|
|
175
|
+
let {
|
|
176
|
+
canSmooth,
|
|
177
|
+
sync
|
|
178
|
+
} = _ref;
|
|
179
|
+
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
173
180
|
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
174
|
-
[instance.options.horizontal ? 'left' : 'top']:
|
|
181
|
+
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
175
182
|
behavior: canSmooth ? 'smooth' : undefined
|
|
176
183
|
});
|
|
177
184
|
};
|
|
178
|
-
const elementScroll = (offset,
|
|
185
|
+
const elementScroll = (offset, _ref2, instance) => {
|
|
179
186
|
var _instance$scrollEleme2;
|
|
187
|
+
|
|
188
|
+
let {
|
|
189
|
+
canSmooth,
|
|
190
|
+
sync
|
|
191
|
+
} = _ref2;
|
|
192
|
+
const toOffset = sync ? offset : offset + instance.options.scrollMargin;
|
|
180
193
|
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
181
|
-
[instance.options.horizontal ? 'left' : 'top']:
|
|
194
|
+
[instance.options.horizontal ? 'left' : 'top']: toOffset,
|
|
182
195
|
behavior: canSmooth ? 'smooth' : undefined
|
|
183
196
|
});
|
|
184
197
|
};
|
|
@@ -188,6 +201,8 @@ class Virtualizer {
|
|
|
188
201
|
|
|
189
202
|
this.unsubs = [];
|
|
190
203
|
this.scrollElement = null;
|
|
204
|
+
this.isScrolling = false;
|
|
205
|
+
this.isScrollingTimeoutId = null;
|
|
191
206
|
this.measurementsCache = [];
|
|
192
207
|
this.itemMeasurementsCache = {};
|
|
193
208
|
this.pendingMeasuredCacheIndexes = [];
|
|
@@ -198,8 +213,8 @@ class Virtualizer {
|
|
|
198
213
|
};
|
|
199
214
|
|
|
200
215
|
this.setOptions = opts => {
|
|
201
|
-
Object.entries(opts).forEach(
|
|
202
|
-
let [key, value] =
|
|
216
|
+
Object.entries(opts).forEach(_ref3 => {
|
|
217
|
+
let [key, value] = _ref3;
|
|
203
218
|
if (typeof value === 'undefined') delete opts[key];
|
|
204
219
|
});
|
|
205
220
|
this.options = {
|
|
@@ -220,6 +235,8 @@ class Virtualizer {
|
|
|
220
235
|
width: 0,
|
|
221
236
|
height: 0
|
|
222
237
|
},
|
|
238
|
+
scrollMargin: 0,
|
|
239
|
+
scrollingDelay: 150,
|
|
223
240
|
...opts
|
|
224
241
|
};
|
|
225
242
|
};
|
|
@@ -248,14 +265,38 @@ class Virtualizer {
|
|
|
248
265
|
if (this.scrollElement !== scrollElement) {
|
|
249
266
|
this.cleanup();
|
|
250
267
|
this.scrollElement = scrollElement;
|
|
268
|
+
|
|
269
|
+
this._scrollToOffset(this.scrollOffset, {
|
|
270
|
+
canSmooth: false,
|
|
271
|
+
sync: true
|
|
272
|
+
});
|
|
273
|
+
|
|
251
274
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
252
275
|
this.scrollRect = rect;
|
|
253
276
|
this.calculateRange();
|
|
254
277
|
}));
|
|
255
278
|
this.unsubs.push(this.options.observeElementOffset(this, offset => {
|
|
256
|
-
this.
|
|
279
|
+
if (this.isScrollingTimeoutId !== null) {
|
|
280
|
+
clearTimeout(this.isScrollingTimeoutId);
|
|
281
|
+
this.isScrollingTimeoutId = null;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (this.scrollOffset !== offset) {
|
|
285
|
+
this.isScrolling = true;
|
|
286
|
+
this.scrollOffset = offset;
|
|
287
|
+
this.isScrollingTimeoutId = setTimeout(() => {
|
|
288
|
+
this.isScrollingTimeoutId = null;
|
|
289
|
+
this.isScrolling = false;
|
|
290
|
+
this.notify();
|
|
291
|
+
}, this.options.scrollingDelay);
|
|
292
|
+
} else {
|
|
293
|
+
this.isScrolling = false;
|
|
294
|
+
}
|
|
295
|
+
|
|
257
296
|
this.calculateRange();
|
|
258
297
|
}));
|
|
298
|
+
} else if (!this.isScrolling) {
|
|
299
|
+
this.calculateRange();
|
|
259
300
|
}
|
|
260
301
|
};
|
|
261
302
|
|
|
@@ -335,7 +376,10 @@ class Virtualizer {
|
|
|
335
376
|
}
|
|
336
377
|
|
|
337
378
|
if (!this.destinationOffset) {
|
|
338
|
-
this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize),
|
|
379
|
+
this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), {
|
|
380
|
+
canSmooth: false,
|
|
381
|
+
sync: false
|
|
382
|
+
});
|
|
339
383
|
}
|
|
340
384
|
}
|
|
341
385
|
|
|
@@ -387,19 +431,23 @@ class Virtualizer {
|
|
|
387
431
|
}
|
|
388
432
|
}
|
|
389
433
|
|
|
434
|
+
const options = {
|
|
435
|
+
canSmooth: smoothScroll,
|
|
436
|
+
sync: false
|
|
437
|
+
};
|
|
438
|
+
|
|
390
439
|
if (align === 'start') {
|
|
391
|
-
_this._scrollToOffset(toOffset,
|
|
440
|
+
_this._scrollToOffset(toOffset, options);
|
|
392
441
|
} else if (align === 'end') {
|
|
393
|
-
_this._scrollToOffset(toOffset - size,
|
|
442
|
+
_this._scrollToOffset(toOffset - size, options);
|
|
394
443
|
} else if (align === 'center') {
|
|
395
|
-
_this._scrollToOffset(toOffset - size / 2,
|
|
444
|
+
_this._scrollToOffset(toOffset - size / 2, options);
|
|
396
445
|
}
|
|
397
446
|
};
|
|
398
447
|
|
|
399
448
|
this.scrollToIndex = function (index, _temp2) {
|
|
400
449
|
let {
|
|
401
450
|
align = 'auto',
|
|
402
|
-
smoothScroll = _this.options.enableSmoothScroll,
|
|
403
451
|
...rest
|
|
404
452
|
} = _temp2 === void 0 ? {} : _temp2;
|
|
405
453
|
|
|
@@ -432,7 +480,6 @@ class Virtualizer {
|
|
|
432
480
|
|
|
433
481
|
_this.scrollToOffset(toOffset, {
|
|
434
482
|
align,
|
|
435
|
-
smoothScroll,
|
|
436
483
|
...rest
|
|
437
484
|
});
|
|
438
485
|
};
|
|
@@ -443,10 +490,10 @@ class Virtualizer {
|
|
|
443
490
|
return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
|
|
444
491
|
};
|
|
445
492
|
|
|
446
|
-
this._scrollToOffset = (offset,
|
|
493
|
+
this._scrollToOffset = (offset, options) => {
|
|
447
494
|
clearTimeout(this.scrollCheckFrame);
|
|
448
495
|
this.destinationOffset = offset;
|
|
449
|
-
this.options.scrollToFn(offset,
|
|
496
|
+
this.options.scrollToFn(offset, options, this);
|
|
450
497
|
let scrollCheckFrame;
|
|
451
498
|
|
|
452
499
|
const check = () => {
|
|
@@ -503,12 +550,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
|
503
550
|
}
|
|
504
551
|
};
|
|
505
552
|
|
|
506
|
-
function calculateRange(
|
|
553
|
+
function calculateRange(_ref4) {
|
|
507
554
|
let {
|
|
508
555
|
measurements,
|
|
509
556
|
outerSize,
|
|
510
557
|
scrollOffset
|
|
511
|
-
} =
|
|
558
|
+
} = _ref4;
|
|
512
559
|
const count = measurements.length - 1;
|
|
513
560
|
|
|
514
561
|
const getOffset = index => measurements[index].start;
|