@tanstack/virtual-core 3.0.0-beta.13 → 3.0.0-beta.16
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/{packages/virtual-core/src/index.js → index.js} +52 -43
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/{packages/virtual-core/src/utils.js → utils.js} +0 -0
- package/build/cjs/utils.js.map +1 -0
- package/build/esm/index.js +52 -112
- package/build/esm/index.js.map +1 -1
- package/build/stats.html +1 -1
- package/build/stats.json +14 -39
- package/build/types/index.d.ts +1 -0
- package/build/umd/index.development.js +49 -109
- 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 +3 -5
- package/src/index.ts +51 -45
- package/build/cjs/node_modules/@reach/observe-rect/dist/observe-rect.esm.js +0 -86
- package/build/cjs/node_modules/@reach/observe-rect/dist/observe-rect.esm.js.map +0 -1
- package/build/cjs/packages/virtual-core/src/index.js.map +0 -1
- package/build/cjs/packages/virtual-core/src/utils.js.map +0 -1
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
|
|
13
13
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
14
14
|
|
|
15
|
-
var observeRect_esm = require('../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js');
|
|
16
15
|
var utils = require('./utils.js');
|
|
17
16
|
|
|
18
17
|
//
|
|
@@ -44,19 +43,23 @@ const memoRectCallback = (instance, cb) => {
|
|
|
44
43
|
};
|
|
45
44
|
|
|
46
45
|
const observeElementRect = (instance, cb) => {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
const observer = new ResizeObserver(entries => {
|
|
47
|
+
var _entries$, _entries$2;
|
|
48
|
+
|
|
49
|
+
cb({
|
|
50
|
+
width: (_entries$ = entries[0]) == null ? void 0 : _entries$.contentRect.width,
|
|
51
|
+
height: (_entries$2 = entries[0]) == null ? void 0 : _entries$2.contentRect.height
|
|
52
|
+
});
|
|
50
53
|
});
|
|
51
54
|
|
|
52
55
|
if (!instance.scrollElement) {
|
|
53
56
|
return;
|
|
54
57
|
}
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
observer.observe();
|
|
59
|
+
cb(instance.scrollElement.getBoundingClientRect());
|
|
60
|
+
observer.observe(instance.scrollElement);
|
|
58
61
|
return () => {
|
|
59
|
-
observer.unobserve();
|
|
62
|
+
observer.unobserve(instance.scrollElement);
|
|
60
63
|
};
|
|
61
64
|
};
|
|
62
65
|
const observeWindowRect = (instance, cb) => {
|
|
@@ -132,14 +135,14 @@ const measureElement = (element, instance) => {
|
|
|
132
135
|
};
|
|
133
136
|
const windowScroll = (offset, canSmooth, instance) => {
|
|
134
137
|
var _instance$scrollEleme;
|
|
135
|
-
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
138
|
+
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
136
139
|
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
137
140
|
behavior: canSmooth ? 'smooth' : undefined
|
|
138
141
|
});
|
|
139
142
|
};
|
|
140
143
|
const elementScroll = (offset, canSmooth, instance) => {
|
|
141
144
|
var _instance$scrollEleme2;
|
|
142
|
-
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
145
|
+
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
143
146
|
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
144
147
|
behavior: canSmooth ? 'smooth' : undefined
|
|
145
148
|
});
|
|
@@ -154,6 +157,10 @@ class Virtualizer {
|
|
|
154
157
|
this.itemMeasurementsCache = {};
|
|
155
158
|
this.pendingMeasuredCacheIndexes = [];
|
|
156
159
|
this.measureElementCache = {};
|
|
160
|
+
this.range = {
|
|
161
|
+
startIndex: 0,
|
|
162
|
+
endIndex: 0
|
|
163
|
+
};
|
|
157
164
|
|
|
158
165
|
this.setOptions = opts => {
|
|
159
166
|
Object.entries(opts).forEach(_ref => {
|
|
@@ -208,11 +215,11 @@ class Virtualizer {
|
|
|
208
215
|
this.scrollElement = scrollElement;
|
|
209
216
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
210
217
|
this.scrollRect = rect;
|
|
211
|
-
this.
|
|
218
|
+
this.calculateRange();
|
|
212
219
|
}));
|
|
213
220
|
this.unsubs.push(this.options.observeElementOffset(this, offset => {
|
|
214
221
|
this.scrollOffset = offset;
|
|
215
|
-
this.
|
|
222
|
+
this.calculateRange();
|
|
216
223
|
}));
|
|
217
224
|
}
|
|
218
225
|
};
|
|
@@ -244,26 +251,34 @@ class Virtualizer {
|
|
|
244
251
|
this.measurementsCache = measurements;
|
|
245
252
|
return measurements;
|
|
246
253
|
}, {
|
|
247
|
-
key: process.env.NODE_ENV
|
|
254
|
+
key: process.env.NODE_ENV !== 'production' && 'getMeasurements',
|
|
248
255
|
debug: () => this.options.debug
|
|
249
256
|
});
|
|
250
257
|
this.calculateRange = utils.memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
|
|
251
|
-
|
|
258
|
+
const range = calculateRange({
|
|
252
259
|
measurements,
|
|
253
260
|
outerSize,
|
|
254
261
|
scrollOffset
|
|
255
262
|
});
|
|
263
|
+
|
|
264
|
+
if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
|
|
265
|
+
this.range = range;
|
|
266
|
+
this.notify();
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return this.range;
|
|
256
270
|
}, {
|
|
257
|
-
key: process.env.NODE_ENV
|
|
271
|
+
key: process.env.NODE_ENV !== 'production' && 'calculateRange',
|
|
258
272
|
debug: () => this.options.debug
|
|
259
273
|
});
|
|
260
|
-
this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.
|
|
274
|
+
this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
|
|
261
275
|
return rangeExtractor({ ...range,
|
|
262
276
|
overscan,
|
|
263
277
|
count: count
|
|
264
278
|
});
|
|
265
279
|
}, {
|
|
266
|
-
key: process.env.NODE_ENV
|
|
280
|
+
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
281
|
+
debug: () => this.options.debug
|
|
267
282
|
});
|
|
268
283
|
this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
|
|
269
284
|
const makeMeasureElement = index => measurableItem => {
|
|
@@ -280,7 +295,7 @@ class Virtualizer {
|
|
|
280
295
|
|
|
281
296
|
if (measuredItemSize !== itemSize) {
|
|
282
297
|
if (item.start < this.scrollOffset) {
|
|
283
|
-
if (process.env.NODE_ENV
|
|
298
|
+
if (process.env.NODE_ENV !== 'production' && this.options.debug) {
|
|
284
299
|
console.info('correction', measuredItemSize - itemSize);
|
|
285
300
|
}
|
|
286
301
|
|
|
@@ -314,7 +329,8 @@ class Virtualizer {
|
|
|
314
329
|
this.measureElementCache = currentMeasureElements;
|
|
315
330
|
return virtualItems;
|
|
316
331
|
}, {
|
|
317
|
-
key: process.env.NODE_ENV
|
|
332
|
+
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
333
|
+
debug: () => this.options.debug
|
|
318
334
|
});
|
|
319
335
|
|
|
320
336
|
this.scrollToOffset = function (toOffset, _temp) {
|
|
@@ -323,35 +339,27 @@ class Virtualizer {
|
|
|
323
339
|
} = _temp === void 0 ? {
|
|
324
340
|
align: 'start'
|
|
325
341
|
} : _temp;
|
|
342
|
+
const offset = _this.scrollOffset;
|
|
326
343
|
|
|
327
|
-
const
|
|
328
|
-
const offset = _this.scrollOffset;
|
|
329
|
-
|
|
330
|
-
const size = _this.getSize();
|
|
331
|
-
|
|
332
|
-
if (align === 'auto') {
|
|
333
|
-
if (toOffset <= offset) {
|
|
334
|
-
align = 'start';
|
|
335
|
-
} else if (toOffset >= offset + size) {
|
|
336
|
-
align = 'end';
|
|
337
|
-
} else {
|
|
338
|
-
align = 'start';
|
|
339
|
-
}
|
|
340
|
-
}
|
|
344
|
+
const size = _this.getSize();
|
|
341
345
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
if (align === 'auto') {
|
|
347
|
+
if (toOffset <= offset) {
|
|
348
|
+
align = 'start';
|
|
349
|
+
} else if (toOffset >= offset + size) {
|
|
350
|
+
align = 'end';
|
|
351
|
+
} else {
|
|
352
|
+
align = 'start';
|
|
348
353
|
}
|
|
349
|
-
}
|
|
354
|
+
}
|
|
350
355
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
356
|
+
if (align === 'start') {
|
|
357
|
+
_this._scrollToOffset(toOffset, true);
|
|
358
|
+
} else if (align === 'end') {
|
|
359
|
+
_this._scrollToOffset(toOffset - size, true);
|
|
360
|
+
} else if (align === 'center') {
|
|
361
|
+
_this._scrollToOffset(toOffset - size / 2, true);
|
|
362
|
+
}
|
|
355
363
|
};
|
|
356
364
|
|
|
357
365
|
this.scrollToIndex = function (index, _temp2) {
|
|
@@ -435,6 +443,7 @@ class Virtualizer {
|
|
|
435
443
|
this.setOptions(_opts);
|
|
436
444
|
this.scrollRect = this.options.initialRect;
|
|
437
445
|
this.scrollOffset = this.options.initialOffset;
|
|
446
|
+
this.calculateRange();
|
|
438
447
|
}
|
|
439
448
|
|
|
440
449
|
}
|
|
@@ -0,0 +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}\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 }: ScrollToOffsetOptions = { align: 'start' },\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, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && 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","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min"],"mappings":";;;;;;;;;;;;;;AAIO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;EACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;AACA,EAAA,IAAIC,MAAJ,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,IAAIC,OAAJ,CAAA;AACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;IAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;IAEA,MAAMW,WAAW,GACfD,OAAO,CAACE,MAAR,KAAmBT,IAAI,CAACS,MAAxB,IACAF,OAAO,CAACG,IAAR,CAAa,CAACC,GAAD,EAAWC,KAAX,KAA6BZ,IAAI,CAACY,KAAD,CAAJ,KAAgBD,GAA1D,CAFF,CAAA;;IAIA,IAAI,CAACH,WAAL,EAAkB;AAChB,MAAA,OAAOP,MAAP,CAAA;AACD,KAAA;;AAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;AAEA,IAAA,IAAIM,UAAJ,CAAA;AACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;AAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;IACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;AAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;AAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;AACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;AACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;AAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;AACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;AACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;UACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;AACD,SAAA;;AACD,QAAA,OAAOA,GAAP,CAAA;OALF,CAAA;;AAQAG,MAAAA,OAAO,CAACC,IAAR,CAAA,WAAA,GACSL,GAAG,CAACF,aAAD,EAAgB,CAAhB,CADZ,GAAA,IAAA,GACmCE,GAAG,CAACL,UAAD,EAAa,CAAb,CADtC,uGAKmBC,IAAI,CAACU,GAAL,CACX,CADW,EAEXV,IAAI,CAACW,GAAL,CAAS,MAAM,GAAMR,GAAAA,mBAArB,EAA0C,GAA1C,CAFW,CALnB,GAAA,gBAAA,EASEpB,IATF,IASEA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEI,GATR,CAAA,CAAA;AAWD,KAAA;;AAED,IAAA,OAAOF,MAAP,CAAA;GAhDF,CAAA;AAkDD;;;;"}
|
package/build/esm/index.js
CHANGED
|
@@ -8,76 +8,6 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
var props = ["bottom", "height", "left", "right", "top", "width"];
|
|
12
|
-
|
|
13
|
-
var rectChanged = function rectChanged(a, b) {
|
|
14
|
-
if (a === void 0) {
|
|
15
|
-
a = {};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
if (b === void 0) {
|
|
19
|
-
b = {};
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return props.some(function (prop) {
|
|
23
|
-
return a[prop] !== b[prop];
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
var observedNodes = /*#__PURE__*/new Map();
|
|
28
|
-
var rafId;
|
|
29
|
-
|
|
30
|
-
var run = function run() {
|
|
31
|
-
var changedStates = [];
|
|
32
|
-
observedNodes.forEach(function (state, node) {
|
|
33
|
-
var newRect = node.getBoundingClientRect();
|
|
34
|
-
|
|
35
|
-
if (rectChanged(newRect, state.rect)) {
|
|
36
|
-
state.rect = newRect;
|
|
37
|
-
changedStates.push(state);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
changedStates.forEach(function (state) {
|
|
41
|
-
state.callbacks.forEach(function (cb) {
|
|
42
|
-
return cb(state.rect);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
rafId = window.requestAnimationFrame(run);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
function observeRect(node, cb) {
|
|
49
|
-
return {
|
|
50
|
-
observe: function observe() {
|
|
51
|
-
var wasEmpty = observedNodes.size === 0;
|
|
52
|
-
|
|
53
|
-
if (observedNodes.has(node)) {
|
|
54
|
-
observedNodes.get(node).callbacks.push(cb);
|
|
55
|
-
} else {
|
|
56
|
-
observedNodes.set(node, {
|
|
57
|
-
rect: undefined,
|
|
58
|
-
hasRectChanged: false,
|
|
59
|
-
callbacks: [cb]
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (wasEmpty) run();
|
|
64
|
-
},
|
|
65
|
-
unobserve: function unobserve() {
|
|
66
|
-
var state = observedNodes.get(node);
|
|
67
|
-
|
|
68
|
-
if (state) {
|
|
69
|
-
// Remove the callback
|
|
70
|
-
var index = state.callbacks.indexOf(cb);
|
|
71
|
-
if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference
|
|
72
|
-
|
|
73
|
-
if (!state.callbacks.length) observedNodes["delete"](node); // Stop the loop
|
|
74
|
-
|
|
75
|
-
if (!observedNodes.size) cancelAnimationFrame(rafId);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
11
|
function memo(getDeps, fn, opts) {
|
|
82
12
|
let deps = [];
|
|
83
13
|
let result;
|
|
@@ -148,19 +78,23 @@ const memoRectCallback = (instance, cb) => {
|
|
|
148
78
|
};
|
|
149
79
|
|
|
150
80
|
const observeElementRect = (instance, cb) => {
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
81
|
+
const observer = new ResizeObserver(entries => {
|
|
82
|
+
var _entries$, _entries$2;
|
|
83
|
+
|
|
84
|
+
cb({
|
|
85
|
+
width: (_entries$ = entries[0]) == null ? void 0 : _entries$.contentRect.width,
|
|
86
|
+
height: (_entries$2 = entries[0]) == null ? void 0 : _entries$2.contentRect.height
|
|
87
|
+
});
|
|
154
88
|
});
|
|
155
89
|
|
|
156
90
|
if (!instance.scrollElement) {
|
|
157
91
|
return;
|
|
158
92
|
}
|
|
159
93
|
|
|
160
|
-
|
|
161
|
-
observer.observe();
|
|
94
|
+
cb(instance.scrollElement.getBoundingClientRect());
|
|
95
|
+
observer.observe(instance.scrollElement);
|
|
162
96
|
return () => {
|
|
163
|
-
observer.unobserve();
|
|
97
|
+
observer.unobserve(instance.scrollElement);
|
|
164
98
|
};
|
|
165
99
|
};
|
|
166
100
|
const observeWindowRect = (instance, cb) => {
|
|
@@ -236,14 +170,14 @@ const measureElement = (element, instance) => {
|
|
|
236
170
|
};
|
|
237
171
|
const windowScroll = (offset, canSmooth, instance) => {
|
|
238
172
|
var _instance$scrollEleme;
|
|
239
|
-
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
173
|
+
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
240
174
|
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
241
175
|
behavior: canSmooth ? 'smooth' : undefined
|
|
242
176
|
});
|
|
243
177
|
};
|
|
244
178
|
const elementScroll = (offset, canSmooth, instance) => {
|
|
245
179
|
var _instance$scrollEleme2;
|
|
246
|
-
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
180
|
+
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
247
181
|
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
248
182
|
behavior: canSmooth ? 'smooth' : undefined
|
|
249
183
|
});
|
|
@@ -258,6 +192,10 @@ class Virtualizer {
|
|
|
258
192
|
this.itemMeasurementsCache = {};
|
|
259
193
|
this.pendingMeasuredCacheIndexes = [];
|
|
260
194
|
this.measureElementCache = {};
|
|
195
|
+
this.range = {
|
|
196
|
+
startIndex: 0,
|
|
197
|
+
endIndex: 0
|
|
198
|
+
};
|
|
261
199
|
|
|
262
200
|
this.setOptions = opts => {
|
|
263
201
|
Object.entries(opts).forEach(_ref => {
|
|
@@ -312,11 +250,11 @@ class Virtualizer {
|
|
|
312
250
|
this.scrollElement = scrollElement;
|
|
313
251
|
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
314
252
|
this.scrollRect = rect;
|
|
315
|
-
this.
|
|
253
|
+
this.calculateRange();
|
|
316
254
|
}));
|
|
317
255
|
this.unsubs.push(this.options.observeElementOffset(this, offset => {
|
|
318
256
|
this.scrollOffset = offset;
|
|
319
|
-
this.
|
|
257
|
+
this.calculateRange();
|
|
320
258
|
}));
|
|
321
259
|
}
|
|
322
260
|
};
|
|
@@ -348,26 +286,34 @@ class Virtualizer {
|
|
|
348
286
|
this.measurementsCache = measurements;
|
|
349
287
|
return measurements;
|
|
350
288
|
}, {
|
|
351
|
-
key: process.env.NODE_ENV
|
|
289
|
+
key: process.env.NODE_ENV !== 'production' && 'getMeasurements',
|
|
352
290
|
debug: () => this.options.debug
|
|
353
291
|
});
|
|
354
292
|
this.calculateRange = memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
|
|
355
|
-
|
|
293
|
+
const range = calculateRange({
|
|
356
294
|
measurements,
|
|
357
295
|
outerSize,
|
|
358
296
|
scrollOffset
|
|
359
297
|
});
|
|
298
|
+
|
|
299
|
+
if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
|
|
300
|
+
this.range = range;
|
|
301
|
+
this.notify();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return this.range;
|
|
360
305
|
}, {
|
|
361
|
-
key: process.env.NODE_ENV
|
|
306
|
+
key: process.env.NODE_ENV !== 'production' && 'calculateRange',
|
|
362
307
|
debug: () => this.options.debug
|
|
363
308
|
});
|
|
364
|
-
this.getIndexes = memo(() => [this.options.rangeExtractor, this.
|
|
309
|
+
this.getIndexes = memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
|
|
365
310
|
return rangeExtractor({ ...range,
|
|
366
311
|
overscan,
|
|
367
312
|
count: count
|
|
368
313
|
});
|
|
369
314
|
}, {
|
|
370
|
-
key: process.env.NODE_ENV
|
|
315
|
+
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
316
|
+
debug: () => this.options.debug
|
|
371
317
|
});
|
|
372
318
|
this.getVirtualItems = memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
|
|
373
319
|
const makeMeasureElement = index => measurableItem => {
|
|
@@ -384,7 +330,7 @@ class Virtualizer {
|
|
|
384
330
|
|
|
385
331
|
if (measuredItemSize !== itemSize) {
|
|
386
332
|
if (item.start < this.scrollOffset) {
|
|
387
|
-
if (process.env.NODE_ENV
|
|
333
|
+
if (process.env.NODE_ENV !== 'production' && this.options.debug) {
|
|
388
334
|
console.info('correction', measuredItemSize - itemSize);
|
|
389
335
|
}
|
|
390
336
|
|
|
@@ -418,7 +364,8 @@ class Virtualizer {
|
|
|
418
364
|
this.measureElementCache = currentMeasureElements;
|
|
419
365
|
return virtualItems;
|
|
420
366
|
}, {
|
|
421
|
-
key: process.env.NODE_ENV
|
|
367
|
+
key: process.env.NODE_ENV !== 'production' && 'getIndexes',
|
|
368
|
+
debug: () => this.options.debug
|
|
422
369
|
});
|
|
423
370
|
|
|
424
371
|
this.scrollToOffset = function (toOffset, _temp) {
|
|
@@ -427,35 +374,27 @@ class Virtualizer {
|
|
|
427
374
|
} = _temp === void 0 ? {
|
|
428
375
|
align: 'start'
|
|
429
376
|
} : _temp;
|
|
377
|
+
const offset = _this.scrollOffset;
|
|
430
378
|
|
|
431
|
-
const
|
|
432
|
-
const offset = _this.scrollOffset;
|
|
433
|
-
|
|
434
|
-
const size = _this.getSize();
|
|
435
|
-
|
|
436
|
-
if (align === 'auto') {
|
|
437
|
-
if (toOffset <= offset) {
|
|
438
|
-
align = 'start';
|
|
439
|
-
} else if (toOffset >= offset + size) {
|
|
440
|
-
align = 'end';
|
|
441
|
-
} else {
|
|
442
|
-
align = 'start';
|
|
443
|
-
}
|
|
444
|
-
}
|
|
379
|
+
const size = _this.getSize();
|
|
445
380
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
381
|
+
if (align === 'auto') {
|
|
382
|
+
if (toOffset <= offset) {
|
|
383
|
+
align = 'start';
|
|
384
|
+
} else if (toOffset >= offset + size) {
|
|
385
|
+
align = 'end';
|
|
386
|
+
} else {
|
|
387
|
+
align = 'start';
|
|
452
388
|
}
|
|
453
|
-
}
|
|
389
|
+
}
|
|
454
390
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
391
|
+
if (align === 'start') {
|
|
392
|
+
_this._scrollToOffset(toOffset, true);
|
|
393
|
+
} else if (align === 'end') {
|
|
394
|
+
_this._scrollToOffset(toOffset - size, true);
|
|
395
|
+
} else if (align === 'center') {
|
|
396
|
+
_this._scrollToOffset(toOffset - size / 2, true);
|
|
397
|
+
}
|
|
459
398
|
};
|
|
460
399
|
|
|
461
400
|
this.scrollToIndex = function (index, _temp2) {
|
|
@@ -539,6 +478,7 @@ class Virtualizer {
|
|
|
539
478
|
this.setOptions(_opts);
|
|
540
479
|
this.scrollRect = this.options.initialRect;
|
|
541
480
|
this.scrollOffset = this.options.initialOffset;
|
|
481
|
+
this.calculateRange();
|
|
542
482
|
}
|
|
543
483
|
|
|
544
484
|
}
|