@tanstack/virtual-core 3.0.0-alpha.1
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 +445 -0
- package/build/cjs/packages/virtual-core/src/index.js.map +1 -0
- package/build/cjs/packages/virtual-core/src/utils.js +57 -0
- package/build/cjs/packages/virtual-core/src/utils.js.map +1 -0
- package/build/esm/index.js +538 -0
- package/build/esm/index.js.map +1 -0
- package/build/stats-html.html +2689 -0
- package/build/stats-react.json +101 -0
- package/build/types/index.d.ts +87 -0
- package/build/types/utils.d.ts +7 -0
- package/build/umd/index.development.js +559 -0
- package/build/umd/index.development.js.map +1 -0
- package/build/umd/index.production.js +12 -0
- package/build/umd/index.production.js.map +1 -0
- package/package.json +42 -0
- package/src/index.ts +602 -0
- package/src/utils.ts +67 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* virtual-core
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) TanStack
|
|
5
|
+
*
|
|
6
|
+
* This source code is licensed under the MIT license found in the
|
|
7
|
+
* LICENSE.md file in the root directory of this source tree.
|
|
8
|
+
*
|
|
9
|
+
* @license MIT
|
|
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
|
+
function memo(getDeps, fn, opts) {
|
|
82
|
+
let deps = [];
|
|
83
|
+
let result;
|
|
84
|
+
return () => {
|
|
85
|
+
let depTime;
|
|
86
|
+
if (opts.key && opts.debug != null && opts.debug()) depTime = Date.now();
|
|
87
|
+
const newDeps = getDeps();
|
|
88
|
+
const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
|
|
89
|
+
|
|
90
|
+
if (!depsChanged) {
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
deps = newDeps;
|
|
95
|
+
let resultTime;
|
|
96
|
+
if (opts.key && opts.debug != null && opts.debug()) resultTime = Date.now();
|
|
97
|
+
result = fn(...newDeps);
|
|
98
|
+
opts == null ? void 0 : opts.onChange == null ? void 0 : opts.onChange(result);
|
|
99
|
+
|
|
100
|
+
if (opts.key && opts.debug != null && opts.debug()) {
|
|
101
|
+
const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
|
|
102
|
+
const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
|
|
103
|
+
const resultFpsPercentage = resultEndTime / 16;
|
|
104
|
+
|
|
105
|
+
const pad = (str, num) => {
|
|
106
|
+
str = String(str);
|
|
107
|
+
|
|
108
|
+
while (str.length < num) {
|
|
109
|
+
str = ' ' + str;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return str;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
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);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return result;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//
|
|
123
|
+
const defaultEstimateSize = () => 50;
|
|
124
|
+
const defaultKeyExtractor = index => index;
|
|
125
|
+
const defaultRangeExtractor = range => {
|
|
126
|
+
const start = Math.max(range.startIndex - range.overscan, 0);
|
|
127
|
+
const end = Math.min(range.endIndex + range.overscan, range.count - 1);
|
|
128
|
+
const arr = [];
|
|
129
|
+
|
|
130
|
+
for (let i = start; i <= end; i++) {
|
|
131
|
+
arr.push(i);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return arr;
|
|
135
|
+
};
|
|
136
|
+
const observeElementRect = (instance, cb) => {
|
|
137
|
+
const observer = observeRect(instance.scrollElement, rect => {
|
|
138
|
+
cb(rect);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
if (!instance.scrollElement) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
cb(instance.scrollElement.getBoundingClientRect());
|
|
146
|
+
observer.observe();
|
|
147
|
+
return () => {
|
|
148
|
+
observer.unobserve();
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const observeWindowRect = (instance, cb) => {
|
|
152
|
+
const onResize = () => {
|
|
153
|
+
cb({
|
|
154
|
+
width: instance.scrollElement.innerWidth,
|
|
155
|
+
height: instance.scrollElement.innerHeight
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
if (!instance.scrollElement) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
onResize();
|
|
164
|
+
instance.scrollElement.addEventListener('resize', onResize, {
|
|
165
|
+
capture: false,
|
|
166
|
+
passive: true
|
|
167
|
+
});
|
|
168
|
+
return () => {
|
|
169
|
+
instance.scrollElement.removeEventListener('resize', onResize);
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
const observeElementOffset = (instance, cb) => {
|
|
173
|
+
const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollLeft' : 'scrollTop']);
|
|
174
|
+
|
|
175
|
+
if (!instance.scrollElement) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
onScroll();
|
|
180
|
+
instance.scrollElement.addEventListener('scroll', onScroll, {
|
|
181
|
+
capture: false,
|
|
182
|
+
passive: true
|
|
183
|
+
});
|
|
184
|
+
return () => {
|
|
185
|
+
instance.scrollElement.removeEventListener('scroll', onScroll);
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
const observeWindowOffset = (instance, cb) => {
|
|
189
|
+
const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollX' : 'scrollY']);
|
|
190
|
+
|
|
191
|
+
if (!instance.scrollElement) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
onScroll();
|
|
196
|
+
instance.scrollElement.addEventListener('scroll', onScroll, {
|
|
197
|
+
capture: false,
|
|
198
|
+
passive: true
|
|
199
|
+
});
|
|
200
|
+
return () => {
|
|
201
|
+
instance.scrollElement.removeEventListener('scroll', onScroll);
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
const defaultMeasureElement = (element, instance) => {
|
|
205
|
+
return element.getBoundingClientRect()[instance.getSizeKey()];
|
|
206
|
+
};
|
|
207
|
+
const windowScroll = (offset, canSmooth, instance) => {
|
|
208
|
+
var _instance$scrollEleme;
|
|
209
|
+
(_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
|
|
210
|
+
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
211
|
+
behavior: canSmooth ? 'smooth' : undefined
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
const elementScroll = (offset, canSmooth, instance) => {
|
|
215
|
+
var _instance$scrollEleme2;
|
|
216
|
+
(_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
|
|
217
|
+
[instance.options.horizontal ? 'left' : 'top']: offset,
|
|
218
|
+
behavior: canSmooth ? 'smooth' : undefined
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
class Virtualizer {
|
|
222
|
+
//
|
|
223
|
+
// virtualItems: VirtualItem<TItemElement>[]
|
|
224
|
+
// totalSize: number
|
|
225
|
+
// scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void
|
|
226
|
+
// scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void
|
|
227
|
+
// measure: (index: number) => void
|
|
228
|
+
constructor(_opts) {
|
|
229
|
+
var _this = this;
|
|
230
|
+
|
|
231
|
+
this.unsubs = [];
|
|
232
|
+
this.scrollElement = null;
|
|
233
|
+
this.measurementsCache = [];
|
|
234
|
+
this.itemMeasurementsCache = {};
|
|
235
|
+
this.pendingMeasuredCacheIndexes = [];
|
|
236
|
+
|
|
237
|
+
this.setOptions = opts => {
|
|
238
|
+
Object.entries(opts).forEach(_ref => {
|
|
239
|
+
let [key, value] = _ref;
|
|
240
|
+
if (typeof value === 'undefined') delete opts[key];
|
|
241
|
+
});
|
|
242
|
+
this.options = {
|
|
243
|
+
debug: false,
|
|
244
|
+
initialOffset: 0,
|
|
245
|
+
estimateSize: defaultEstimateSize,
|
|
246
|
+
overscan: 1,
|
|
247
|
+
paddingStart: 0,
|
|
248
|
+
paddingEnd: 0,
|
|
249
|
+
horizontal: false,
|
|
250
|
+
keyExtractor: defaultKeyExtractor,
|
|
251
|
+
rangeExtractor: defaultRangeExtractor,
|
|
252
|
+
enableSmoothScroll: false,
|
|
253
|
+
onChange: () => {},
|
|
254
|
+
measureElement: defaultMeasureElement,
|
|
255
|
+
initialRect: {
|
|
256
|
+
width: 0,
|
|
257
|
+
height: 0
|
|
258
|
+
},
|
|
259
|
+
...opts
|
|
260
|
+
};
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
this.notify = () => {
|
|
264
|
+
var _this$options$onChang, _this$options;
|
|
265
|
+
|
|
266
|
+
(_this$options$onChang = (_this$options = this.options).onChange) == null ? void 0 : _this$options$onChang.call(_this$options, this);
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
this.cleanup = () => {
|
|
270
|
+
this.unsubs.filter(Boolean).forEach(d => d());
|
|
271
|
+
this.unsubs = [];
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
this._didMount = () => {
|
|
275
|
+
return () => {
|
|
276
|
+
this.cleanup();
|
|
277
|
+
};
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
this._willUpdate = () => {
|
|
281
|
+
const scrollElement = this.options.getScrollElement();
|
|
282
|
+
|
|
283
|
+
if (this.scrollElement !== scrollElement) {
|
|
284
|
+
this.cleanup();
|
|
285
|
+
this.scrollElement = scrollElement;
|
|
286
|
+
this.unsubs.push(this.options.observeElementRect(this, rect => {
|
|
287
|
+
this.scrollRect = rect;
|
|
288
|
+
this.notify();
|
|
289
|
+
}));
|
|
290
|
+
this.unsubs.push(this.options.observeElementOffset(this, offset => {
|
|
291
|
+
this.scrollOffset = offset;
|
|
292
|
+
this.notify();
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
this.getSize = () => {
|
|
298
|
+
return this.scrollRect[this.getSizeKey()];
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
|
|
302
|
+
const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
|
|
303
|
+
this.pendingMeasuredCacheIndexes = [];
|
|
304
|
+
const measurements = this.measurementsCache.slice(0, min);
|
|
305
|
+
|
|
306
|
+
for (let i = min; i < count; i++) {
|
|
307
|
+
const key = keyExtractor(i);
|
|
308
|
+
const measuredSize = measurementsCache[key];
|
|
309
|
+
const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
|
|
310
|
+
const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
|
|
311
|
+
const end = start + size;
|
|
312
|
+
measurements[i] = {
|
|
313
|
+
index: i,
|
|
314
|
+
start,
|
|
315
|
+
size,
|
|
316
|
+
end,
|
|
317
|
+
key
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
this.measurementsCache = measurements;
|
|
322
|
+
return measurements;
|
|
323
|
+
}, {
|
|
324
|
+
key: process.env.NODE_ENV === 'development' && 'getMeasurements',
|
|
325
|
+
debug: () => this.options.debug
|
|
326
|
+
});
|
|
327
|
+
this.calculateRange = memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
|
|
328
|
+
return calculateRange({
|
|
329
|
+
measurements,
|
|
330
|
+
outerSize,
|
|
331
|
+
scrollOffset
|
|
332
|
+
});
|
|
333
|
+
}, {
|
|
334
|
+
key: process.env.NODE_ENV === 'development' && 'calculateRange',
|
|
335
|
+
debug: () => this.options.debug
|
|
336
|
+
});
|
|
337
|
+
this.getIndexes = memo(() => [this.options.rangeExtractor, this.calculateRange(), this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
|
|
338
|
+
return rangeExtractor({ ...range,
|
|
339
|
+
overscan,
|
|
340
|
+
count: count
|
|
341
|
+
});
|
|
342
|
+
}, {
|
|
343
|
+
key: process.env.NODE_ENV === 'development' && 'getIndexes'
|
|
344
|
+
});
|
|
345
|
+
this.getVirtualItems = memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
|
|
346
|
+
const virtualItems = [];
|
|
347
|
+
|
|
348
|
+
for (let k = 0, len = indexes.length; k < len; k++) {
|
|
349
|
+
const i = indexes[k];
|
|
350
|
+
const measurement = measurements[i];
|
|
351
|
+
const item = { ...measurement,
|
|
352
|
+
measureElement: measurableItem => {
|
|
353
|
+
if (measurableItem) {
|
|
354
|
+
const measuredItemSize = measureElement(measurableItem, this);
|
|
355
|
+
|
|
356
|
+
if (measuredItemSize !== item.size) {
|
|
357
|
+
if (item.start < this.scrollOffset) {
|
|
358
|
+
if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
|
|
359
|
+
|
|
360
|
+
this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
this.pendingMeasuredCacheIndexes.push(i);
|
|
364
|
+
this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
|
|
365
|
+
[item.key]: measuredItemSize
|
|
366
|
+
};
|
|
367
|
+
this.notify();
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
virtualItems.push(item);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return virtualItems;
|
|
376
|
+
}, {
|
|
377
|
+
key: process.env.NODE_ENV === 'development' && 'getIndexes'
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
this.scrollToOffset = function (toOffset, _temp) {
|
|
381
|
+
let {
|
|
382
|
+
align
|
|
383
|
+
} = _temp === void 0 ? {
|
|
384
|
+
align: 'start'
|
|
385
|
+
} : _temp;
|
|
386
|
+
const offset = _this.scrollOffset;
|
|
387
|
+
|
|
388
|
+
const size = _this.getSize();
|
|
389
|
+
|
|
390
|
+
if (align === 'auto') {
|
|
391
|
+
if (toOffset <= offset) {
|
|
392
|
+
align = 'start';
|
|
393
|
+
} else if (toOffset >= offset + size) {
|
|
394
|
+
align = 'end';
|
|
395
|
+
} else {
|
|
396
|
+
align = 'start';
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (align === 'start') {
|
|
401
|
+
_this._scrollToOffset(toOffset, true);
|
|
402
|
+
} else if (align === 'end') {
|
|
403
|
+
_this._scrollToOffset(toOffset - size, true);
|
|
404
|
+
} else if (align === 'center') {
|
|
405
|
+
_this._scrollToOffset(toOffset - size / 2, true);
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
this.tryScrollToIndex = function (index, _temp2) {
|
|
410
|
+
let {
|
|
411
|
+
align,
|
|
412
|
+
...rest
|
|
413
|
+
} = _temp2 === void 0 ? {
|
|
414
|
+
align: 'auto'
|
|
415
|
+
} : _temp2;
|
|
416
|
+
|
|
417
|
+
const measurements = _this.getMeasurements();
|
|
418
|
+
|
|
419
|
+
const offset = _this.scrollOffset;
|
|
420
|
+
|
|
421
|
+
const size = _this.getSize();
|
|
422
|
+
|
|
423
|
+
const {
|
|
424
|
+
count
|
|
425
|
+
} = _this.options;
|
|
426
|
+
const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
|
|
427
|
+
|
|
428
|
+
if (!measurement) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
if (align === 'auto') {
|
|
433
|
+
if (measurement.end >= offset + size) {
|
|
434
|
+
align = 'end';
|
|
435
|
+
} else if (measurement.start <= offset) {
|
|
436
|
+
align = 'start';
|
|
437
|
+
} else {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
|
|
443
|
+
|
|
444
|
+
_this.scrollToOffset(toOffset, {
|
|
445
|
+
align,
|
|
446
|
+
...rest
|
|
447
|
+
});
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
this.scrollToIndex = (index, options) => {
|
|
451
|
+
// We do a double request here because of
|
|
452
|
+
// dynamic sizes which can cause offset shift
|
|
453
|
+
// and end up in the wrong spot. Unfortunately,
|
|
454
|
+
// we can't know about those dynamic sizes until
|
|
455
|
+
// we try and render them. So double down!
|
|
456
|
+
this.tryScrollToIndex(index, options);
|
|
457
|
+
requestAnimationFrame(() => {
|
|
458
|
+
this.tryScrollToIndex(index, options);
|
|
459
|
+
});
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
this.getTotalSize = () => {
|
|
463
|
+
var _this$getMeasurements;
|
|
464
|
+
|
|
465
|
+
return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
|
|
469
|
+
|
|
470
|
+
this._scrollToOffset = (offset, canSmooth) => {
|
|
471
|
+
this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
this.getEstimateSizeFn = memo(() => [this.options.estimateSize], d => d, {
|
|
475
|
+
key: false,
|
|
476
|
+
onChange: () => {
|
|
477
|
+
this.itemMeasurementsCache = {};
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
this.measure = () => {
|
|
482
|
+
this.itemMeasurementsCache = {};
|
|
483
|
+
this.notify();
|
|
484
|
+
};
|
|
485
|
+
|
|
486
|
+
this.setOptions(_opts);
|
|
487
|
+
this.scrollRect = this.options.initialRect;
|
|
488
|
+
this.scrollOffset = this.options.initialOffset;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
|
|
494
|
+
while (low <= high) {
|
|
495
|
+
const middle = (low + high) / 2 | 0;
|
|
496
|
+
const currentValue = getCurrentValue(middle);
|
|
497
|
+
|
|
498
|
+
if (currentValue < value) {
|
|
499
|
+
low = middle + 1;
|
|
500
|
+
} else if (currentValue > value) {
|
|
501
|
+
high = middle - 1;
|
|
502
|
+
} else {
|
|
503
|
+
return middle;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
if (low > 0) {
|
|
508
|
+
return low - 1;
|
|
509
|
+
} else {
|
|
510
|
+
return 0;
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
function calculateRange(_ref2) {
|
|
515
|
+
let {
|
|
516
|
+
measurements,
|
|
517
|
+
outerSize,
|
|
518
|
+
scrollOffset
|
|
519
|
+
} = _ref2;
|
|
520
|
+
const count = measurements.length - 1;
|
|
521
|
+
|
|
522
|
+
const getOffset = index => measurements[index].start;
|
|
523
|
+
|
|
524
|
+
const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
|
|
525
|
+
let endIndex = startIndex;
|
|
526
|
+
|
|
527
|
+
while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
|
|
528
|
+
endIndex++;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return {
|
|
532
|
+
startIndex,
|
|
533
|
+
endIndex
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
export { Virtualizer, defaultEstimateSize, defaultKeyExtractor, defaultMeasureElement, defaultRangeExtractor, elementScroll, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
|
|
538
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface 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 defaultEstimateSize = () => 50\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\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\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\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\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\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\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\nexport const defaultMeasureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[instance.getSizeKey()]\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 count: number\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n getScrollElement: () => TScrollElement\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 //\n\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 estimateSize?: (index: number) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n keyExtractor?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n 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\n //\n // virtualItems: VirtualItem<TItemElement>[]\n // totalSize: number\n // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void\n // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void\n // measure: (index: number) => void\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\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 estimateSize: defaultEstimateSize,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n keyExtractor: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement: defaultMeasureElement,\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 }\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.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.getSizeKey()]\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.getEstimateSizeFn(),\n this.options.keyExtractor,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, estimateSize, keyExtractor, 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 = keyExtractor(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' ? measuredSize : 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 === 'development' && '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 return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\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 === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\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: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\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 private tryScrollToIndex = (\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) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n scrollToIndex = (index: number, options?: ScrollToIndexOptions) => {\n // We do a double request here because of\n // dynamic sizes which can cause offset shift\n // and end up in the wrong spot. Unfortunately,\n // we can't know about those dynamic sizes until\n // we try and render them. So double down!\n this.tryScrollToIndex(index, options)\n requestAnimationFrame(() => {\n this.tryScrollToIndex(index, options)\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n getSizeKey = () => (this.options.horizontal ? 'width' : 'height')\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n }\n\n private getEstimateSizeFn = memo(\n () => [this.options.estimateSize],\n (d) => d,\n {\n key: false,\n onChange: () => {\n this.itemMeasurementsCache = {}\n },\n },\n )\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultEstimateSize","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","defaultMeasureElement","element","getSizeKey","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","estimateSize","paddingStart","paddingEnd","keyExtractor","rangeExtractor","enableSmoothScroll","measureElement","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","getEstimateSizeFn","measurements","slice","measuredSize","size","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","_scrollToOffset","scrollToOffset","toOffset","align","tryScrollToIndex","rest","scrollToIndex","requestAnimationFrame","getTotalSize","scrollToFn","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
|