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