@tanstack/virtual-core 3.0.0-beta.9 → 3.0.0

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.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js +27 -0
  3. package/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js.map +1 -0
  4. package/build/lib/_virtual/_rollupPluginBabelHelpers.js +31 -0
  5. package/build/lib/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  6. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs +27 -0
  7. package/build/lib/_virtual/_rollupPluginBabelHelpers.mjs.map +1 -0
  8. package/build/lib/index.d.ts +126 -0
  9. package/build/lib/index.esm.js +639 -0
  10. package/build/lib/index.esm.js.map +1 -0
  11. package/build/lib/index.js +654 -0
  12. package/build/lib/index.js.map +1 -0
  13. package/build/lib/index.mjs +639 -0
  14. package/build/lib/index.mjs.map +1 -0
  15. package/build/lib/utils.d.ts +10 -0
  16. package/build/lib/utils.esm.js +58 -0
  17. package/build/lib/utils.esm.js.map +1 -0
  18. package/build/{cjs/packages/virtual-core/src → lib}/utils.js +28 -21
  19. package/build/lib/utils.js.map +1 -0
  20. package/build/lib/utils.mjs +58 -0
  21. package/build/lib/utils.mjs.map +1 -0
  22. package/build/umd/index.development.js +600 -493
  23. package/build/umd/index.development.js.map +1 -1
  24. package/build/umd/index.production.js +1 -1
  25. package/build/umd/index.production.js.map +1 -1
  26. package/package.json +16 -14
  27. package/src/index.ts +566 -278
  28. package/src/utils.ts +17 -5
  29. package/build/cjs/packages/virtual-core/src/index.js +0 -497
  30. package/build/cjs/packages/virtual-core/src/index.js.map +0 -1
  31. package/build/cjs/packages/virtual-core/src/utils.js.map +0 -1
  32. package/build/esm/index.js +0 -591
  33. package/build/esm/index.js.map +0 -1
  34. package/build/stats-html.html +0 -2689
  35. package/build/stats.json +0 -101
  36. package/build/types/index.d.ts +0 -88
  37. package/build/types/utils.d.ts +0 -7
@@ -1,591 +0,0 @@
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 defaultKeyExtractor = index => index;
124
- const defaultRangeExtractor = range => {
125
- const start = Math.max(range.startIndex - range.overscan, 0);
126
- const end = Math.min(range.endIndex + range.overscan, range.count - 1);
127
- const arr = [];
128
-
129
- for (let i = start; i <= end; i++) {
130
- arr.push(i);
131
- }
132
-
133
- return arr;
134
- };
135
-
136
- const memoRectCallback = (instance, cb) => {
137
- let prev = {
138
- height: -1,
139
- width: -1
140
- };
141
- return rect => {
142
- if (instance.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {
143
- cb(rect);
144
- }
145
-
146
- prev = rect;
147
- };
148
- };
149
-
150
- const observeElementRect = (instance, cb) => {
151
- const onResize = memoRectCallback(instance, cb);
152
- const observer = observeRect(instance.scrollElement, rect => {
153
- onResize(rect);
154
- });
155
-
156
- if (!instance.scrollElement) {
157
- return;
158
- }
159
-
160
- onResize(instance.scrollElement.getBoundingClientRect());
161
- observer.observe();
162
- return () => {
163
- observer.unobserve();
164
- };
165
- };
166
- const observeWindowRect = (instance, cb) => {
167
- const memoizedCallback = memoRectCallback(instance, cb);
168
-
169
- const onResize = () => memoizedCallback({
170
- width: instance.scrollElement.innerWidth,
171
- height: instance.scrollElement.innerHeight
172
- });
173
-
174
- if (!instance.scrollElement) {
175
- return;
176
- }
177
-
178
- onResize();
179
- instance.scrollElement.addEventListener('resize', onResize, {
180
- capture: false,
181
- passive: true
182
- });
183
- return () => {
184
- instance.scrollElement.removeEventListener('resize', onResize);
185
- };
186
- };
187
- const scrollProps = {
188
- element: ['scrollLeft', 'scrollTop'],
189
- window: ['scrollX', 'scrollY']
190
- };
191
-
192
- const createOffsetObserver = mode => {
193
- return (instance, cb) => {
194
- if (!instance.scrollElement) {
195
- return;
196
- }
197
-
198
- const propX = scrollProps[mode][0];
199
- const propY = scrollProps[mode][1];
200
- let prevX = instance.scrollElement[propX];
201
- let prevY = instance.scrollElement[propY];
202
-
203
- const scroll = () => {
204
- cb(instance.scrollElement[instance.options.horizontal ? propX : propY]);
205
- };
206
-
207
- scroll();
208
-
209
- const onScroll = e => {
210
- const target = e.currentTarget;
211
- const scrollX = target[propX];
212
- const scrollY = target[propY];
213
-
214
- if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {
215
- scroll();
216
- }
217
-
218
- prevX = scrollX;
219
- prevY = scrollY;
220
- };
221
-
222
- instance.scrollElement.addEventListener('scroll', onScroll, {
223
- capture: false,
224
- passive: true
225
- });
226
- return () => {
227
- instance.scrollElement.removeEventListener('scroll', onScroll);
228
- };
229
- };
230
- };
231
-
232
- const observeElementOffset = createOffsetObserver('element');
233
- const observeWindowOffset = createOffsetObserver('window');
234
- const measureElement = (element, instance) => {
235
- return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
236
- };
237
- const windowScroll = (offset, canSmooth, instance) => {
238
- var _instance$scrollEleme;
239
- (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
240
- [instance.options.horizontal ? 'left' : 'top']: offset,
241
- behavior: canSmooth ? 'smooth' : undefined
242
- });
243
- };
244
- const elementScroll = (offset, canSmooth, instance) => {
245
- var _instance$scrollEleme2;
246
- (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
247
- [instance.options.horizontal ? 'left' : 'top']: offset,
248
- behavior: canSmooth ? 'smooth' : undefined
249
- });
250
- };
251
- class Virtualizer {
252
- constructor(_opts) {
253
- var _this = this;
254
-
255
- this.unsubs = [];
256
- this.scrollElement = null;
257
- this.measurementsCache = [];
258
- this.itemMeasurementsCache = {};
259
- this.pendingMeasuredCacheIndexes = [];
260
- this.measureElementCache = {};
261
-
262
- this.setOptions = opts => {
263
- Object.entries(opts).forEach(_ref => {
264
- let [key, value] = _ref;
265
- if (typeof value === 'undefined') delete opts[key];
266
- });
267
- this.options = {
268
- debug: false,
269
- initialOffset: 0,
270
- overscan: 1,
271
- paddingStart: 0,
272
- paddingEnd: 0,
273
- scrollPaddingStart: 0,
274
- scrollPaddingEnd: 0,
275
- horizontal: false,
276
- getItemKey: defaultKeyExtractor,
277
- rangeExtractor: defaultRangeExtractor,
278
- enableSmoothScroll: true,
279
- onChange: () => {},
280
- measureElement,
281
- initialRect: {
282
- width: 0,
283
- height: 0
284
- },
285
- ...opts
286
- };
287
- };
288
-
289
- this.notify = () => {
290
- var _this$options$onChang, _this$options;
291
-
292
- (_this$options$onChang = (_this$options = this.options).onChange) == null ? void 0 : _this$options$onChang.call(_this$options, this);
293
- };
294
-
295
- this.cleanup = () => {
296
- this.unsubs.filter(Boolean).forEach(d => d());
297
- this.unsubs = [];
298
- this.scrollElement = null;
299
- };
300
-
301
- this._didMount = () => {
302
- return () => {
303
- this.cleanup();
304
- };
305
- };
306
-
307
- this._willUpdate = () => {
308
- const scrollElement = this.options.getScrollElement();
309
-
310
- if (this.scrollElement !== scrollElement) {
311
- this.cleanup();
312
- this.scrollElement = scrollElement;
313
- this.unsubs.push(this.options.observeElementRect(this, rect => {
314
- this.scrollRect = rect;
315
- this.notify();
316
- }));
317
- this.unsubs.push(this.options.observeElementOffset(this, offset => {
318
- this.scrollOffset = offset;
319
- this.notify();
320
- }));
321
- }
322
- };
323
-
324
- this.getSize = () => {
325
- return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
326
- };
327
-
328
- this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
329
- const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
330
- this.pendingMeasuredCacheIndexes = [];
331
- const measurements = this.measurementsCache.slice(0, min);
332
-
333
- for (let i = min; i < count; i++) {
334
- const key = getItemKey(i);
335
- const measuredSize = measurementsCache[key];
336
- const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
337
- const size = typeof measuredSize === 'number' ? measuredSize : this.options.estimateSize(i);
338
- const end = start + size;
339
- measurements[i] = {
340
- index: i,
341
- start,
342
- size,
343
- end,
344
- key
345
- };
346
- }
347
-
348
- this.measurementsCache = measurements;
349
- return measurements;
350
- }, {
351
- key: process.env.NODE_ENV === 'development' && 'getMeasurements',
352
- debug: () => this.options.debug
353
- });
354
- this.calculateRange = memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
355
- return calculateRange({
356
- measurements,
357
- outerSize,
358
- scrollOffset
359
- });
360
- }, {
361
- key: process.env.NODE_ENV === 'development' && 'calculateRange',
362
- debug: () => this.options.debug
363
- });
364
- this.getIndexes = memo(() => [this.options.rangeExtractor, this.calculateRange(), this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
365
- return rangeExtractor({ ...range,
366
- overscan,
367
- count: count
368
- });
369
- }, {
370
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
371
- });
372
- this.getVirtualItems = memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
373
- const makeMeasureElement = index => measurableItem => {
374
- var _this$itemMeasurement;
375
-
376
- const item = this.measurementsCache[index];
377
-
378
- if (!measurableItem) {
379
- return;
380
- }
381
-
382
- const measuredItemSize = measureElement(measurableItem, this);
383
- const itemSize = (_this$itemMeasurement = this.itemMeasurementsCache[item.key]) != null ? _this$itemMeasurement : item.size;
384
-
385
- if (measuredItemSize !== itemSize) {
386
- if (item.start < this.scrollOffset) {
387
- if (process.env.NODE_ENV === 'development' && this.options.debug) {
388
- console.info('correction', measuredItemSize - itemSize);
389
- }
390
-
391
- if (!this.destinationOffset) {
392
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), false);
393
- }
394
- }
395
-
396
- this.pendingMeasuredCacheIndexes.push(index);
397
- this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
398
- [item.key]: measuredItemSize
399
- };
400
- this.notify();
401
- }
402
- };
403
-
404
- const virtualItems = [];
405
- const currentMeasureElements = {};
406
-
407
- for (let k = 0, len = indexes.length; k < len; k++) {
408
- var _this$measureElementC;
409
-
410
- const i = indexes[k];
411
- const measurement = measurements[i];
412
- const item = { ...measurement,
413
- measureElement: currentMeasureElements[i] = (_this$measureElementC = this.measureElementCache[i]) != null ? _this$measureElementC : makeMeasureElement(i)
414
- };
415
- virtualItems.push(item);
416
- }
417
-
418
- this.measureElementCache = currentMeasureElements;
419
- return virtualItems;
420
- }, {
421
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
422
- });
423
-
424
- this.scrollToOffset = function (toOffset, _temp) {
425
- let {
426
- align
427
- } = _temp === void 0 ? {
428
- align: 'start'
429
- } : _temp;
430
-
431
- const attempt = () => {
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
- }
445
-
446
- if (align === 'start') {
447
- _this._scrollToOffset(toOffset, true);
448
- } else if (align === 'end') {
449
- _this._scrollToOffset(toOffset - size, true);
450
- } else if (align === 'center') {
451
- _this._scrollToOffset(toOffset - size / 2, true);
452
- }
453
- };
454
-
455
- attempt();
456
- requestAnimationFrame(() => {
457
- attempt();
458
- });
459
- };
460
-
461
- this.scrollToIndex = function (index, _temp2) {
462
- let {
463
- align,
464
- ...rest
465
- } = _temp2 === void 0 ? {
466
- align: 'auto'
467
- } : _temp2;
468
-
469
- const measurements = _this.getMeasurements();
470
-
471
- const offset = _this.scrollOffset;
472
-
473
- const size = _this.getSize();
474
-
475
- const {
476
- count
477
- } = _this.options;
478
- const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
479
-
480
- if (!measurement) {
481
- return;
482
- }
483
-
484
- if (align === 'auto') {
485
- if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
486
- align = 'end';
487
- } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
488
- align = 'start';
489
- } else {
490
- return;
491
- }
492
- }
493
-
494
- const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
495
-
496
- _this.scrollToOffset(toOffset, {
497
- align,
498
- ...rest
499
- });
500
- };
501
-
502
- this.getTotalSize = () => {
503
- var _this$getMeasurements;
504
-
505
- return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
506
- };
507
-
508
- this._scrollToOffset = (offset, canSmooth) => {
509
- clearTimeout(this.scrollCheckFrame);
510
- this.destinationOffset = offset;
511
- this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
512
- let scrollCheckFrame;
513
-
514
- const check = () => {
515
- let lastOffset = this.scrollOffset;
516
- this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
517
- if (this.scrollCheckFrame !== scrollCheckFrame) {
518
- return;
519
- }
520
-
521
- if (this.scrollOffset === lastOffset) {
522
- this.destinationOffset = undefined;
523
- return;
524
- }
525
-
526
- lastOffset = this.scrollOffset;
527
- check();
528
- }, 100);
529
- };
530
-
531
- check();
532
- };
533
-
534
- this.measure = () => {
535
- this.itemMeasurementsCache = {};
536
- this.notify();
537
- };
538
-
539
- this.setOptions(_opts);
540
- this.scrollRect = this.options.initialRect;
541
- this.scrollOffset = this.options.initialOffset;
542
- }
543
-
544
- }
545
-
546
- const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
547
- while (low <= high) {
548
- const middle = (low + high) / 2 | 0;
549
- const currentValue = getCurrentValue(middle);
550
-
551
- if (currentValue < value) {
552
- low = middle + 1;
553
- } else if (currentValue > value) {
554
- high = middle - 1;
555
- } else {
556
- return middle;
557
- }
558
- }
559
-
560
- if (low > 0) {
561
- return low - 1;
562
- } else {
563
- return 0;
564
- }
565
- };
566
-
567
- function calculateRange(_ref2) {
568
- let {
569
- measurements,
570
- outerSize,
571
- scrollOffset
572
- } = _ref2;
573
- const count = measurements.length - 1;
574
-
575
- const getOffset = index => measurements[index].start;
576
-
577
- const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
578
- let endIndex = startIndex;
579
-
580
- while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
581
- endIndex++;
582
- }
583
-
584
- return {
585
- startIndex,
586
- endIndex
587
- };
588
- }
589
-
590
- export { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
591
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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 { 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 onResize = memoRectCallback(instance, cb)\n\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n onResize(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize(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 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\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 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.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.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 === '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 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 (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n ) {\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 === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\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 attempt()\n requestAnimationFrame(() => {\n attempt()\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":["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","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","onResize","observer","observeRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","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","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}