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

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
135
  return 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,21 @@ 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.range = {
177
+ startIndex: 0,
178
+ endIndex: 0
179
+ };
125
180
 
126
181
  this.setOptions = opts => {
127
- Object.entries(opts).forEach(_ref => {
128
- let [key, value] = _ref;
182
+ Object.entries(opts).forEach(_ref3 => {
183
+ let [key, value] = _ref3;
129
184
  if (typeof value === 'undefined') delete opts[key];
130
185
  });
131
186
  this.options = {
@@ -146,6 +201,8 @@ class Virtualizer {
146
201
  width: 0,
147
202
  height: 0
148
203
  },
204
+ scrollMargin: 0,
205
+ scrollingDelay: 150,
149
206
  ...opts
150
207
  };
151
208
  };
@@ -159,6 +216,7 @@ class Virtualizer {
159
216
  this.cleanup = () => {
160
217
  this.unsubs.filter(Boolean).forEach(d => d());
161
218
  this.unsubs = [];
219
+ this.scrollElement = null;
162
220
  };
163
221
 
164
222
  this._didMount = () => {
@@ -173,14 +231,41 @@ class Virtualizer {
173
231
  if (this.scrollElement !== scrollElement) {
174
232
  this.cleanup();
175
233
  this.scrollElement = scrollElement;
234
+
235
+ this._scrollToOffset(this.scrollOffset, {
236
+ canSmooth: false,
237
+ sync: true,
238
+ requested: false
239
+ });
240
+
176
241
  this.unsubs.push(this.options.observeElementRect(this, rect => {
177
242
  this.scrollRect = rect;
178
- this.notify();
243
+ this.calculateRange();
179
244
  }));
180
245
  this.unsubs.push(this.options.observeElementOffset(this, offset => {
181
- this.scrollOffset = offset;
182
- this.notify();
246
+ if (this.isScrollingTimeoutId !== null) {
247
+ clearTimeout(this.isScrollingTimeoutId);
248
+ this.isScrollingTimeoutId = null;
249
+ }
250
+
251
+ if (this.scrollOffset !== offset) {
252
+ this.scrollOffset = offset;
253
+ this.isScrolling = true;
254
+ this.scrollDelta = 0;
255
+ this.isScrollingTimeoutId = setTimeout(() => {
256
+ this.isScrollingTimeoutId = null;
257
+ this.isScrolling = false;
258
+ this.notify();
259
+ }, this.options.scrollingDelay);
260
+ } else {
261
+ this.isScrolling = false;
262
+ this.scrollDelta = 0;
263
+ }
264
+
265
+ this.calculateRange();
183
266
  }));
267
+ } else if (!this.isScrolling) {
268
+ this.calculateRange();
184
269
  }
185
270
  };
186
271
 
@@ -211,108 +296,134 @@ class Virtualizer {
211
296
  this.measurementsCache = measurements;
212
297
  return measurements;
213
298
  }, {
214
- key: process.env.NODE_ENV === 'development' && 'getMeasurements',
299
+ key: process.env.NODE_ENV !== 'production' && 'getMeasurements',
215
300
  debug: () => this.options.debug
216
301
  });
217
302
  this.calculateRange = utils.memo(() => [this.getMeasurements(), this.getSize(), this.scrollOffset], (measurements, outerSize, scrollOffset) => {
218
- return calculateRange({
303
+ const range = calculateRange({
219
304
  measurements,
220
305
  outerSize,
221
306
  scrollOffset
222
307
  });
308
+
309
+ if (range.startIndex !== this.range.startIndex || range.endIndex !== this.range.endIndex) {
310
+ this.range = range;
311
+ this.notify();
312
+ }
313
+
314
+ return this.range;
223
315
  }, {
224
- key: process.env.NODE_ENV === 'development' && 'calculateRange',
316
+ key: process.env.NODE_ENV !== 'production' && 'calculateRange',
225
317
  debug: () => this.options.debug
226
318
  });
227
- this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.calculateRange(), this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
319
+ this.getIndexes = utils.memo(() => [this.options.rangeExtractor, this.range, this.options.overscan, this.options.count], (rangeExtractor, range, overscan, count) => {
228
320
  return rangeExtractor({ ...range,
229
321
  overscan,
230
322
  count: count
231
323
  });
232
324
  }, {
233
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
325
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
326
+ debug: () => this.options.debug
234
327
  });
235
328
  this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements(), this.options.measureElement], (indexes, measurements, measureElement) => {
329
+ const makeMeasureElement = index => measurableItem => {
330
+ var _this$itemMeasurement;
331
+
332
+ const item = this.measurementsCache[index];
333
+
334
+ if (!measurableItem) {
335
+ return;
336
+ }
337
+
338
+ const measuredItemSize = measureElement(measurableItem, this);
339
+ const itemSize = (_this$itemMeasurement = this.itemMeasurementsCache[item.key]) != null ? _this$itemMeasurement : item.size;
340
+
341
+ if (measuredItemSize !== itemSize) {
342
+ if (item.start < this.scrollOffset) {
343
+ if (process.env.NODE_ENV !== 'production' && this.options.debug) {
344
+ console.info('correction', measuredItemSize - itemSize);
345
+ }
346
+
347
+ if (this.destinationOffset === undefined) {
348
+ this.scrollDelta += measuredItemSize - itemSize;
349
+
350
+ this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
351
+ canSmooth: false,
352
+ sync: false,
353
+ requested: false
354
+ });
355
+ }
356
+ }
357
+
358
+ this.pendingMeasuredCacheIndexes.push(index);
359
+ this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
360
+ [item.key]: measuredItemSize
361
+ };
362
+ this.notify();
363
+ }
364
+ };
365
+
236
366
  const virtualItems = [];
367
+ const currentMeasureElements = {};
237
368
 
238
369
  for (let k = 0, len = indexes.length; k < len; k++) {
370
+ var _this$measureElementC;
371
+
239
372
  const i = indexes[k];
240
373
  const measurement = measurements[i];
241
374
  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
- }
375
+ measureElement: currentMeasureElements[i] = (_this$measureElementC = this.measureElementCache[i]) != null ? _this$measureElementC : makeMeasureElement(i)
263
376
  };
264
377
  virtualItems.push(item);
265
378
  }
266
379
 
380
+ this.measureElementCache = currentMeasureElements;
267
381
  return virtualItems;
268
382
  }, {
269
- key: process.env.NODE_ENV === 'development' && 'getIndexes'
383
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
384
+ debug: () => this.options.debug
270
385
  });
271
386
 
272
387
  this.scrollToOffset = function (toOffset, _temp) {
273
388
  let {
274
- align
275
- } = _temp === void 0 ? {
276
- align: 'start'
277
- } : _temp;
278
-
279
- const attempt = () => {
280
- const offset = _this.scrollOffset;
389
+ align = 'start',
390
+ smoothScroll = _this.options.enableSmoothScroll
391
+ } = _temp === void 0 ? {} : _temp;
392
+ const offset = _this.scrollOffset;
281
393
 
282
- const size = _this.getSize();
394
+ const size = _this.getSize();
283
395
 
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
- }
396
+ if (align === 'auto') {
397
+ if (toOffset <= offset) {
398
+ align = 'start';
399
+ } else if (toOffset >= offset + size) {
400
+ align = 'end';
401
+ } else {
402
+ align = 'start';
292
403
  }
404
+ }
293
405
 
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
- }
406
+ const options = {
407
+ canSmooth: smoothScroll,
408
+ sync: false,
409
+ requested: true
301
410
  };
302
411
 
303
- attempt();
304
- requestAnimationFrame(() => {
305
- attempt();
306
- });
412
+ if (align === 'start') {
413
+ _this._scrollToOffset(toOffset, options);
414
+ } else if (align === 'end') {
415
+ _this._scrollToOffset(toOffset - size, options);
416
+ } else if (align === 'center') {
417
+ _this._scrollToOffset(toOffset - size / 2, options);
418
+ }
307
419
  };
308
420
 
309
421
  this.scrollToIndex = function (index, _temp2) {
310
422
  let {
311
- align,
423
+ align = 'auto',
424
+ smoothScroll = _this.options.enableSmoothScroll,
312
425
  ...rest
313
- } = _temp2 === void 0 ? {
314
- align: 'auto'
315
- } : _temp2;
426
+ } = _temp2 === void 0 ? {} : _temp2;
316
427
 
317
428
  const measurements = _this.getMeasurements();
318
429
 
@@ -343,6 +454,7 @@ class Virtualizer {
343
454
 
344
455
  _this.scrollToOffset(toOffset, {
345
456
  align,
457
+ smoothScroll,
346
458
  ...rest
347
459
  });
348
460
  };
@@ -353,10 +465,22 @@ class Virtualizer {
353
465
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
354
466
  };
355
467
 
356
- this._scrollToOffset = (offset, canSmooth) => {
468
+ this._scrollToOffset = (offset, _ref4) => {
469
+ let {
470
+ requested,
471
+ canSmooth,
472
+ sync
473
+ } = _ref4;
357
474
  clearTimeout(this.scrollCheckFrame);
358
- this.destinationOffset = offset;
359
- this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
475
+
476
+ if (requested) {
477
+ this.destinationOffset = offset;
478
+ }
479
+
480
+ this.options.scrollToFn(offset, {
481
+ canSmooth,
482
+ sync
483
+ }, this);
360
484
  let scrollCheckFrame;
361
485
 
362
486
  const check = () => {
@@ -387,6 +511,7 @@ class Virtualizer {
387
511
  this.setOptions(_opts);
388
512
  this.scrollRect = this.options.initialRect;
389
513
  this.scrollOffset = this.options.initialOffset;
514
+ this.calculateRange();
390
515
  }
391
516
 
392
517
  }
@@ -412,12 +537,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
412
537
  }
413
538
  };
414
539
 
415
- function calculateRange(_ref2) {
540
+ function calculateRange(_ref5) {
416
541
  let {
417
542
  measurements,
418
543
  outerSize,
419
544
  scrollOffset
420
- } = _ref2;
545
+ } = _ref5;
421
546
  const count = measurements.length - 1;
422
547
 
423
548
  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\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n 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 = (\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, 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 = 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 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}\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 isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | 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 scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\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 ...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 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 getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === 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 const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\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: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","scrollingDelay","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","requested","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","virtualItems","currentMeasureElements","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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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min"],"mappings":";;;;;;;;;;;;;;AAIO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;EACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;AACA,EAAA,IAAIC,MAAJ,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,IAAIC,OAAJ,CAAA;AACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;IAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;IAEA,MAAMW,WAAW,GACfD,OAAO,CAACE,MAAR,KAAmBT,IAAI,CAACS,MAAxB,IACAF,OAAO,CAACG,IAAR,CAAa,CAACC,GAAD,EAAWC,KAAX,KAA6BZ,IAAI,CAACY,KAAD,CAAJ,KAAgBD,GAA1D,CAFF,CAAA;;IAIA,IAAI,CAACH,WAAL,EAAkB;AAChB,MAAA,OAAOP,MAAP,CAAA;AACD,KAAA;;AAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;AAEA,IAAA,IAAIM,UAAJ,CAAA;AACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;AAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;IACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;AAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;AAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;AACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;AACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;AAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;AACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;AACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;UACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;AACD,SAAA;;AACD,QAAA,OAAOA,GAAP,CAAA;OALF,CAAA;;AAQAG,MAAAA,OAAO,CAACC,IAAR,CAAA,WAAA,GACSL,GAAG,CAACF,aAAD,EAAgB,CAAhB,CADZ,GAAA,IAAA,GACmCE,GAAG,CAACL,UAAD,EAAa,CAAb,CADtC,uGAKmBC,IAAI,CAACU,GAAL,CACX,CADW,EAEXV,IAAI,CAACW,GAAL,CAAS,MAAM,GAAMR,GAAAA,mBAArB,EAA0C,GAA1C,CAFW,CALnB,GAAA,gBAAA,EASEpB,IATF,IASEA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEI,GATR,CAAA,CAAA;AAWD,KAAA;;AAED,IAAA,OAAOF,MAAP,CAAA;GAhDF,CAAA;AAkDD;;;;"}