@tanstack/virtual-core 3.0.0-beta.2 → 3.0.0-beta.21

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.
@@ -12,7 +12,6 @@
12
12
 
13
13
  Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
- var observeRect_esm = require('../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js');
16
15
  var utils = require('./utils.js');
17
16
 
18
17
  //
@@ -28,9 +27,29 @@ const defaultRangeExtractor = range => {
28
27
 
29
28
  return arr;
30
29
  };
30
+
31
+ const memoRectCallback = (instance, cb) => {
32
+ let prev = {
33
+ height: -1,
34
+ width: -1
35
+ };
36
+ return rect => {
37
+ if (instance.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {
38
+ cb(rect);
39
+ }
40
+
41
+ prev = rect;
42
+ };
43
+ };
44
+
31
45
  const observeElementRect = (instance, cb) => {
32
- const observer = observeRect_esm["default"](instance.scrollElement, rect => {
33
- cb(rect);
46
+ const observer = new ResizeObserver(entries => {
47
+ var _entries$, _entries$2;
48
+
49
+ cb({
50
+ width: (_entries$ = entries[0]) == null ? void 0 : _entries$.contentRect.width,
51
+ height: (_entries$2 = entries[0]) == null ? void 0 : _entries$2.contentRect.height
52
+ });
34
53
  });
35
54
 
36
55
  if (!instance.scrollElement) {
@@ -38,18 +57,18 @@ const observeElementRect = (instance, cb) => {
38
57
  }
39
58
 
40
59
  cb(instance.scrollElement.getBoundingClientRect());
41
- observer.observe();
60
+ observer.observe(instance.scrollElement);
42
61
  return () => {
43
- observer.unobserve();
62
+ observer.unobserve(instance.scrollElement);
44
63
  };
45
64
  };
46
65
  const observeWindowRect = (instance, cb) => {
47
- const onResize = () => {
48
- cb({
49
- width: instance.scrollElement.innerWidth,
50
- height: instance.scrollElement.innerHeight
51
- });
52
- };
66
+ const memoizedCallback = memoRectCallback(instance, cb);
67
+
68
+ const onResize = () => memoizedCallback({
69
+ width: instance.scrollElement.innerWidth,
70
+ height: instance.scrollElement.innerHeight
71
+ });
53
72
 
54
73
  if (!instance.scrollElement) {
55
74
  return;
@@ -64,52 +83,80 @@ const observeWindowRect = (instance, cb) => {
64
83
  instance.scrollElement.removeEventListener('resize', onResize);
65
84
  };
66
85
  };
67
- const observeElementOffset = (instance, cb) => {
68
- const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollLeft' : 'scrollTop']);
86
+ const scrollProps = {
87
+ element: ['scrollLeft', 'scrollTop'],
88
+ window: ['scrollX', 'scrollY']
89
+ };
69
90
 
70
- if (!instance.scrollElement) {
71
- return;
72
- }
91
+ const createOffsetObserver = mode => {
92
+ return (instance, cb) => {
93
+ if (!instance.scrollElement) {
94
+ return;
95
+ }
73
96
 
74
- onScroll();
75
- instance.scrollElement.addEventListener('scroll', onScroll, {
76
- capture: false,
77
- passive: true
78
- });
79
- return () => {
80
- instance.scrollElement.removeEventListener('scroll', onScroll);
81
- };
82
- };
83
- const observeWindowOffset = (instance, cb) => {
84
- const onScroll = () => cb(instance.scrollElement[instance.options.horizontal ? 'scrollX' : 'scrollY']);
97
+ const propX = scrollProps[mode][0];
98
+ const propY = scrollProps[mode][1];
99
+ let prevX = instance.scrollElement[propX];
100
+ let prevY = instance.scrollElement[propY];
85
101
 
86
- if (!instance.scrollElement) {
87
- return;
88
- }
102
+ const scroll = () => {
103
+ const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
104
+ cb(Math.max(0, offset - instance.options.scrollMargin));
105
+ };
89
106
 
90
- onScroll();
91
- instance.scrollElement.addEventListener('scroll', onScroll, {
92
- capture: false,
93
- passive: true
94
- });
95
- return () => {
96
- instance.scrollElement.removeEventListener('scroll', onScroll);
107
+ scroll();
108
+
109
+ const onScroll = e => {
110
+ const target = e.currentTarget;
111
+ const scrollX = target[propX];
112
+ const scrollY = target[propY];
113
+
114
+ if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {
115
+ scroll();
116
+ }
117
+
118
+ prevX = scrollX;
119
+ prevY = scrollY;
120
+ };
121
+
122
+ instance.scrollElement.addEventListener('scroll', onScroll, {
123
+ capture: false,
124
+ passive: true
125
+ });
126
+ return () => {
127
+ instance.scrollElement.removeEventListener('scroll', onScroll);
128
+ };
97
129
  };
98
130
  };
131
+
132
+ const observeElementOffset = createOffsetObserver('element');
133
+ const observeWindowOffset = createOffsetObserver('window');
99
134
  const measureElement = (element, instance) => {
100
- return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
135
+ return Math.round(element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height']);
101
136
  };
102
- const windowScroll = (offset, canSmooth, instance) => {
137
+ const windowScroll = (offset, _ref, instance) => {
103
138
  var _instance$scrollEleme;
104
- (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo({
105
- [instance.options.horizontal ? 'left' : 'top']: offset,
139
+
140
+ let {
141
+ canSmooth,
142
+ sync
143
+ } = _ref;
144
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
145
+ (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
146
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
106
147
  behavior: canSmooth ? 'smooth' : undefined
107
148
  });
108
149
  };
109
- const elementScroll = (offset, canSmooth, instance) => {
150
+ const elementScroll = (offset, _ref2, instance) => {
110
151
  var _instance$scrollEleme2;
111
- (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo({
112
- [instance.options.horizontal ? 'left' : 'top']: offset,
152
+
153
+ let {
154
+ canSmooth,
155
+ sync
156
+ } = _ref2;
157
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
158
+ (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
159
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
113
160
  behavior: canSmooth ? 'smooth' : undefined
114
161
  });
115
162
  };
@@ -119,13 +166,26 @@ class Virtualizer {
119
166
 
120
167
  this.unsubs = [];
121
168
  this.scrollElement = null;
169
+ this.isScrolling = false;
170
+ this.isScrollingTimeoutId = null;
122
171
  this.measurementsCache = [];
123
172
  this.itemMeasurementsCache = {};
124
173
  this.pendingMeasuredCacheIndexes = [];
174
+ this.scrollDelta = 0;
175
+ this.measureElementCache = {};
176
+ this.ro = new ResizeObserver(entries => {
177
+ entries.forEach(entry => {
178
+ this._measureElement(entry.target, false);
179
+ });
180
+ });
181
+ this.range = {
182
+ startIndex: 0,
183
+ endIndex: 0
184
+ };
125
185
 
126
186
  this.setOptions = opts => {
127
- Object.entries(opts).forEach(_ref => {
128
- let [key, value] = _ref;
187
+ Object.entries(opts).forEach(_ref3 => {
188
+ let [key, value] = _ref3;
129
189
  if (typeof value === 'undefined') delete opts[key];
130
190
  });
131
191
  this.options = {
@@ -146,6 +206,9 @@ class Virtualizer {
146
206
  width: 0,
147
207
  height: 0
148
208
  },
209
+ scrollMargin: 0,
210
+ scrollingDelay: 150,
211
+ indexAttribute: 'data-index',
149
212
  ...opts
150
213
  };
151
214
  };
@@ -159,10 +222,13 @@ class Virtualizer {
159
222
  this.cleanup = () => {
160
223
  this.unsubs.filter(Boolean).forEach(d => d());
161
224
  this.unsubs = [];
225
+ this.scrollElement = null;
162
226
  };
163
227
 
164
228
  this._didMount = () => {
165
229
  return () => {
230
+ this.ro.disconnect();
231
+ this.measureElementCache = {};
166
232
  this.cleanup();
167
233
  };
168
234
  };
@@ -173,14 +239,41 @@ class Virtualizer {
173
239
  if (this.scrollElement !== scrollElement) {
174
240
  this.cleanup();
175
241
  this.scrollElement = scrollElement;
242
+
243
+ this._scrollToOffset(this.scrollOffset, {
244
+ canSmooth: false,
245
+ sync: true,
246
+ requested: false
247
+ });
248
+
176
249
  this.unsubs.push(this.options.observeElementRect(this, rect => {
177
250
  this.scrollRect = rect;
178
- this.notify();
251
+ this.calculateRange();
179
252
  }));
180
253
  this.unsubs.push(this.options.observeElementOffset(this, offset => {
181
- this.scrollOffset = offset;
182
- this.notify();
254
+ if (this.isScrollingTimeoutId !== null) {
255
+ clearTimeout(this.isScrollingTimeoutId);
256
+ this.isScrollingTimeoutId = null;
257
+ }
258
+
259
+ if (this.scrollOffset !== offset) {
260
+ this.scrollOffset = offset;
261
+ this.isScrolling = true;
262
+ this.scrollDelta = 0;
263
+ this.isScrollingTimeoutId = setTimeout(() => {
264
+ this.isScrollingTimeoutId = null;
265
+ this.isScrolling = false;
266
+ this.notify();
267
+ }, this.options.scrollingDelay);
268
+ } else {
269
+ this.isScrolling = false;
270
+ this.scrollDelta = 0;
271
+ }
272
+
273
+ this.calculateRange();
183
274
  }));
275
+ } else if (!this.isScrolling) {
276
+ this.calculateRange();
184
277
  }
185
278
  };
186
279
 
@@ -211,108 +304,170 @@ class Virtualizer {
211
304
  this.measurementsCache = measurements;
212
305
  return measurements;
213
306
  }, {
214
- key: process.env.NODE_ENV === 'development' && 'getMeasurements',
307
+ key: process.env.NODE_ENV !== 'production' && 'getMeasurements',
215
308
  debug: () => this.options.debug
216
309
  });
217
310
  this.calculateRange = utils.memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
218
- return calculateRange({
311
+ const range = calculateRange({
219
312
  measurements,
220
313
  outerSize,
221
314
  scrollOffset
222
315
  });
316
+
317
+ if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
318
+ this.range = range;
319
+ this.notify();
320
+ }
321
+
322
+ return this.range;
223
323
  }, {
224
- key: process.env.NODE_ENV === 'development' && 'calculateRange',
324
+ key: process.env.NODE_ENV !== 'production' && 'calculateRange',
225
325
  debug: () => this.options.debug
226
326
  });
227
- this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.calculateRange(), this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
327
+ this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
228
328
  return rangeExtractor({ ...range,
229
329
  overscan,
230
330
  count: count
231
331
  });
232
332
  }, {
233
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
333
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
334
+ debug: () => this.options.debug
234
335
  });
235
- this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
336
+
337
+ this.indexFromElement = node => {
338
+ const attributeName = this.options.indexAttribute;
339
+ const indexStr = node.getAttribute(attributeName);
340
+
341
+ if (!indexStr) {
342
+ console.warn("Missing attribute name '" + attributeName + "={index}' on measured element.");
343
+ return -1;
344
+ }
345
+
346
+ return parseInt(indexStr, 10);
347
+ };
348
+
349
+ this._measureElement = (node, _sync) => {
350
+ var _this$itemMeasurement;
351
+
352
+ const index = this.indexFromElement(node);
353
+ const item = this.measurementsCache[index];
354
+
355
+ if (!item) {
356
+ return;
357
+ }
358
+
359
+ const key = String(item.key);
360
+ const prevNode = this.measureElementCache[key];
361
+
362
+ if (!node.isConnected) {
363
+ if (prevNode) {
364
+ this.ro.unobserve(prevNode);
365
+ delete this.measureElementCache[key];
366
+ }
367
+
368
+ return;
369
+ }
370
+
371
+ if (!prevNode || prevNode !== node) {
372
+ if (prevNode) {
373
+ this.ro.unobserve(prevNode);
374
+ }
375
+
376
+ this.measureElementCache[key] = node;
377
+ this.ro.observe(node);
378
+ }
379
+
380
+ const measuredItemSize = this.options.measureElement(node, this);
381
+ const itemSize = (_this$itemMeasurement = this.itemMeasurementsCache[item.key]) != null ? _this$itemMeasurement : item.size;
382
+
383
+ if (measuredItemSize !== itemSize) {
384
+ if (item.start < this.scrollOffset) {
385
+ if (process.env.NODE_ENV !== 'production' && this.options.debug) {
386
+ console.info('correction', measuredItemSize - itemSize);
387
+ }
388
+
389
+ if (this.destinationOffset === undefined) {
390
+ this.scrollDelta += measuredItemSize - itemSize;
391
+
392
+ this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
393
+ canSmooth: false,
394
+ sync: false,
395
+ requested: false
396
+ });
397
+ }
398
+ }
399
+
400
+ this.pendingMeasuredCacheIndexes.push(index);
401
+ this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
402
+ [item.key]: measuredItemSize
403
+ };
404
+ this.notify();
405
+ }
406
+ };
407
+
408
+ this.measureElement = node => {
409
+ if (!node) {
410
+ return;
411
+ }
412
+
413
+ this._measureElement(node, true);
414
+ };
415
+
416
+ this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements()], (indexes, measurements) => {
236
417
  const virtualItems = [];
237
418
 
238
419
  for (let k = 0, len = indexes.length; k < len; k++) {
239
420
  const i = indexes[k];
240
421
  const measurement = measurements[i];
241
- const item = { ...measurement,
242
- measureElement: measurableItem => {
243
- if (measurableItem) {
244
- const measuredItemSize = measureElement(measurableItem, this);
245
-
246
- if (measuredItemSize !== item.size) {
247
- if (item.start < this.scrollOffset) {
248
- if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
249
-
250
- if (!this.destinationOffset) {
251
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
252
- }
253
- }
254
-
255
- this.pendingMeasuredCacheIndexes.push(i);
256
- this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
257
- [item.key]: measuredItemSize
258
- };
259
- this.notify();
260
- }
261
- }
262
- }
263
- };
264
- virtualItems.push(item);
422
+ virtualItems.push(measurement);
265
423
  }
266
424
 
267
425
  return virtualItems;
268
426
  }, {
269
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
427
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
428
+ debug: () => this.options.debug
270
429
  });
271
430
 
272
431
  this.scrollToOffset = function (toOffset, _temp) {
273
432
  let {
274
- align
275
- } = _temp === void 0 ? {
276
- align: 'start'
277
- } : _temp;
278
-
279
- const attempt = () => {
280
- const offset = _this.scrollOffset;
433
+ align = 'start',
434
+ smoothScroll = _this.options.enableSmoothScroll
435
+ } = _temp === void 0 ? {} : _temp;
436
+ const offset = _this.scrollOffset;
281
437
 
282
- const size = _this.getSize();
438
+ const size = _this.getSize();
283
439
 
284
- if (align === 'auto') {
285
- if (toOffset <= offset) {
286
- align = 'start';
287
- } else if (toOffset >= offset + size) {
288
- align = 'end';
289
- } else {
290
- align = 'start';
291
- }
440
+ if (align === 'auto') {
441
+ if (toOffset <= offset) {
442
+ align = 'start';
443
+ } else if (toOffset >= offset + size) {
444
+ align = 'end';
445
+ } else {
446
+ align = 'start';
292
447
  }
448
+ }
293
449
 
294
- if (align === 'start') {
295
- _this._scrollToOffset(toOffset, true);
296
- } else if (align === 'end') {
297
- _this._scrollToOffset(toOffset - size, true);
298
- } else if (align === 'center') {
299
- _this._scrollToOffset(toOffset - size / 2, true);
300
- }
450
+ const options = {
451
+ canSmooth: smoothScroll,
452
+ sync: false,
453
+ requested: true
301
454
  };
302
455
 
303
- attempt();
304
- requestAnimationFrame(() => {
305
- attempt();
306
- });
456
+ if (align === 'start') {
457
+ _this._scrollToOffset(toOffset, options);
458
+ } else if (align === 'end') {
459
+ _this._scrollToOffset(toOffset - size, options);
460
+ } else if (align === 'center') {
461
+ _this._scrollToOffset(toOffset - size / 2, options);
462
+ }
307
463
  };
308
464
 
309
465
  this.scrollToIndex = function (index, _temp2) {
310
466
  let {
311
- align,
467
+ align = 'auto',
468
+ smoothScroll = _this.options.enableSmoothScroll,
312
469
  ...rest
313
- } = _temp2 === void 0 ? {
314
- align: 'auto'
315
- } : _temp2;
470
+ } = _temp2 === void 0 ? {} : _temp2;
316
471
 
317
472
  const measurements = _this.getMeasurements();
318
473
 
@@ -343,6 +498,7 @@ class Virtualizer {
343
498
 
344
499
  _this.scrollToOffset(toOffset, {
345
500
  align,
501
+ smoothScroll,
346
502
  ...rest
347
503
  });
348
504
  };
@@ -353,10 +509,22 @@ class Virtualizer {
353
509
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
354
510
  };
355
511
 
356
- this._scrollToOffset = (offset, canSmooth) => {
512
+ this._scrollToOffset = (offset, _ref4) => {
513
+ let {
514
+ requested,
515
+ canSmooth,
516
+ sync
517
+ } = _ref4;
357
518
  clearTimeout(this.scrollCheckFrame);
358
- this.destinationOffset = offset;
359
- this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
519
+
520
+ if (requested) {
521
+ this.destinationOffset = offset;
522
+ }
523
+
524
+ this.options.scrollToFn(offset, {
525
+ canSmooth,
526
+ sync
527
+ }, this);
360
528
  let scrollCheckFrame;
361
529
 
362
530
  const check = () => {
@@ -387,6 +555,7 @@ class Virtualizer {
387
555
  this.setOptions(_opts);
388
556
  this.scrollRect = this.options.initialRect;
389
557
  this.scrollOffset = this.options.initialOffset;
558
+ this.calculateRange();
390
559
  }
391
560
 
392
561
  }
@@ -412,12 +581,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
412
581
  }
413
582
  };
414
583
 
415
- function calculateRange(_ref2) {
584
+ function calculateRange(_ref5) {
416
585
  let {
417
586
  measurements,
418
587
  outerSize,
419
588
  scrollOffset
420
- } = _ref2;
589
+ } = _ref5;
421
590
  const count = measurements.length - 1;
422
591
 
423
592
  const getOffset = index => measurements[index].start;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\nexport interface VirtualItem {\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\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = <TItemElement extends Element>(\n element: TItemElement,\n instance: Virtualizer<any, TItemElement>,\n) => {\n return Math.round(\n element.getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ],\n )\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement extends unknown,\n TItemElement extends Element,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement | null\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n indexAttribute?: string\n}\n\nexport class Virtualizer<\n TScrollElement extends unknown,\n TItemElement extends Element,\n> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n measurementsCache: VirtualItem[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<string, TItemElement> = {}\n private ro = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n this._measureElement(entry.target as TItemElement, false)\n })\n })\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\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.ro.disconnect()\n this.measureElementCache = {}\n\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n indexFromElement = (node: TItemElement) => {\n const attributeName = this.options.indexAttribute\n const indexStr = node.getAttribute(attributeName)\n\n if (!indexStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on measured element.`,\n )\n return -1\n }\n\n return parseInt(indexStr, 10)\n }\n\n _measureElement = (node: TItemElement, _sync: boolean) => {\n const index = this.indexFromElement(node)\n\n const item = this.measurementsCache[index]\n if (!item) {\n return\n }\n const key = String(item.key)\n\n const prevNode = this.measureElementCache[key]\n\n if (!node.isConnected) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n delete this.measureElementCache[key]\n }\n return\n }\n\n if (!prevNode || prevNode !== node) {\n if (prevNode) {\n this.ro.unobserve(prevNode)\n }\n this.measureElementCache[key] = node\n this.ro.observe(node)\n }\n\n const measuredItemSize = this.options.measureElement(node, this)\n\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === undefined) {\n this.scrollDelta += measuredItemSize - itemSize\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: 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 measureElement = (node: TItemElement | null) => {\n if (!node) {\n return\n }\n\n this._measureElement(node, true)\n }\n\n getVirtualItems = memo(\n () => [this.getIndexes(), this.getMeasurements()],\n (indexes, measurements) => {\n const virtualItems: VirtualItem[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n virtualItems.push(measurement)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: VirtualItem[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","round","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","ro","forEach","entry","_measureElement","setOptions","Object","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","scrollingDelay","indexAttribute","notify","cleanup","filter","Boolean","d","_didMount","disconnect","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","requested","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","indexFromElement","node","attributeName","indexStr","getAttribute","console","warn","parseInt","_sync","item","String","prevNode","isConnected","measuredItemSize","itemSize","info","destinationOffset","getVirtualItems","indexes","virtualItems","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}