@tanstack/virtual-core 3.0.0-alpha.1 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,6 @@ var observeRect_esm = require('../../../node_modules/@reach/observe-rect/dist/ob
16
16
  var utils = require('./utils.js');
17
17
 
18
18
  //
19
- const defaultEstimateSize = () => 50;
20
19
  const defaultKeyExtractor = index => index;
21
20
  const defaultRangeExtractor = range => {
22
21
  const start = Math.max(range.startIndex - range.overscan, 0);
@@ -97,8 +96,8 @@ const observeWindowOffset = (instance, cb) => {
97
96
  instance.scrollElement.removeEventListener('scroll', onScroll);
98
97
  };
99
98
  };
100
- const defaultMeasureElement = (element, instance) => {
101
- return element.getBoundingClientRect()[instance.getSizeKey()];
99
+ const measureElement = (element, instance) => {
100
+ return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
102
101
  };
103
102
  const windowScroll = (offset, canSmooth, instance) => {
104
103
  var _instance$scrollEleme;
@@ -115,12 +114,6 @@ const elementScroll = (offset, canSmooth, instance) => {
115
114
  });
116
115
  };
117
116
  class Virtualizer {
118
- //
119
- // virtualItems: VirtualItem<TItemElement>[]
120
- // totalSize: number
121
- // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void
122
- // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void
123
- // measure: (index: number) => void
124
117
  constructor(_opts) {
125
118
  var _this = this;
126
119
 
@@ -138,16 +131,17 @@ class Virtualizer {
138
131
  this.options = {
139
132
  debug: false,
140
133
  initialOffset: 0,
141
- estimateSize: defaultEstimateSize,
142
134
  overscan: 1,
143
135
  paddingStart: 0,
144
136
  paddingEnd: 0,
137
+ scrollPaddingStart: 0,
138
+ scrollPaddingEnd: 0,
145
139
  horizontal: false,
146
- keyExtractor: defaultKeyExtractor,
140
+ getItemKey: defaultKeyExtractor,
147
141
  rangeExtractor: defaultRangeExtractor,
148
- enableSmoothScroll: false,
142
+ enableSmoothScroll: true,
149
143
  onChange: () => {},
150
- measureElement: defaultMeasureElement,
144
+ measureElement,
151
145
  initialRect: {
152
146
  width: 0,
153
147
  height: 0
@@ -191,19 +185,19 @@ class Virtualizer {
191
185
  };
192
186
 
193
187
  this.getSize = () => {
194
- return this.scrollRect[this.getSizeKey()];
188
+ return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
195
189
  };
196
190
 
197
- this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
191
+ this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
198
192
  const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
199
193
  this.pendingMeasuredCacheIndexes = [];
200
194
  const measurements = this.measurementsCache.slice(0, min);
201
195
 
202
196
  for (let i = min; i < count; i++) {
203
- const key = keyExtractor(i);
197
+ const key = getItemKey(i);
204
198
  const measuredSize = measurementsCache[key];
205
199
  const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
206
- const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
200
+ const size = typeof measuredSize === 'number' ? measuredSize : this.options.estimateSize(i);
207
201
  const end = start + size;
208
202
  measurements[i] = {
209
203
  index: i,
@@ -253,7 +247,9 @@ class Virtualizer {
253
247
  if (item.start < this.scrollOffset) {
254
248
  if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
255
249
 
256
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
250
+ if (!this.destinationOffset) {
251
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
252
+ }
257
253
  }
258
254
 
259
255
  this.pendingMeasuredCacheIndexes.push(i);
@@ -279,30 +275,38 @@ class Virtualizer {
279
275
  } = _temp === void 0 ? {
280
276
  align: 'start'
281
277
  } : _temp;
282
- const offset = _this.scrollOffset;
283
278
 
284
- const size = _this.getSize();
279
+ const attempt = () => {
280
+ const offset = _this.scrollOffset;
285
281
 
286
- if (align === 'auto') {
287
- if (toOffset <= offset) {
288
- align = 'start';
289
- } else if (toOffset >= offset + size) {
290
- align = 'end';
291
- } else {
292
- align = 'start';
282
+ const size = _this.getSize();
283
+
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
+ }
293
292
  }
294
- }
295
293
 
296
- if (align === 'start') {
297
- _this._scrollToOffset(toOffset, true);
298
- } else if (align === 'end') {
299
- _this._scrollToOffset(toOffset - size, true);
300
- } else if (align === 'center') {
301
- _this._scrollToOffset(toOffset - size / 2, true);
302
- }
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
+ }
301
+ };
302
+
303
+ attempt();
304
+ requestAnimationFrame(() => {
305
+ attempt();
306
+ });
303
307
  };
304
308
 
305
- this.tryScrollToIndex = function (index, _temp2) {
309
+ this.scrollToIndex = function (index, _temp2) {
306
310
  let {
307
311
  align,
308
312
  ...rest
@@ -326,16 +330,16 @@ class Virtualizer {
326
330
  }
327
331
 
328
332
  if (align === 'auto') {
329
- if (measurement.end >= offset + size) {
333
+ if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
330
334
  align = 'end';
331
- } else if (measurement.start <= offset) {
335
+ } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
332
336
  align = 'start';
333
337
  } else {
334
338
  return;
335
339
  }
336
340
  }
337
341
 
338
- const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
342
+ const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
339
343
 
340
344
  _this.scrollToOffset(toOffset, {
341
345
  align,
@@ -343,36 +347,37 @@ class Virtualizer {
343
347
  });
344
348
  };
345
349
 
346
- this.scrollToIndex = (index, options) => {
347
- // We do a double request here because of
348
- // dynamic sizes which can cause offset shift
349
- // and end up in the wrong spot. Unfortunately,
350
- // we can't know about those dynamic sizes until
351
- // we try and render them. So double down!
352
- this.tryScrollToIndex(index, options);
353
- requestAnimationFrame(() => {
354
- this.tryScrollToIndex(index, options);
355
- });
356
- };
357
-
358
350
  this.getTotalSize = () => {
359
351
  var _this$getMeasurements;
360
352
 
361
353
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
362
354
  };
363
355
 
364
- this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
365
-
366
356
  this._scrollToOffset = (offset, canSmooth) => {
357
+ clearTimeout(this.scrollCheckFrame);
358
+ this.destinationOffset = offset;
367
359
  this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
368
- };
360
+ let scrollCheckFrame;
369
361
 
370
- this.getEstimateSizeFn = utils.memo(() => [this.options.estimateSize], d => d, {
371
- key: false,
372
- onChange: () => {
373
- this.itemMeasurementsCache = {};
374
- }
375
- });
362
+ const check = () => {
363
+ let lastOffset = this.scrollOffset;
364
+ this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
365
+ if (this.scrollCheckFrame !== scrollCheckFrame) {
366
+ return;
367
+ }
368
+
369
+ if (this.scrollOffset === lastOffset) {
370
+ this.destinationOffset = undefined;
371
+ return;
372
+ }
373
+
374
+ lastOffset = this.scrollOffset;
375
+ check();
376
+ }, 100);
377
+ };
378
+
379
+ check();
380
+ };
376
381
 
377
382
  this.measure = () => {
378
383
  this.itemMeasurementsCache = {};
@@ -432,11 +437,10 @@ function calculateRange(_ref2) {
432
437
 
433
438
  exports.memo = utils.memo;
434
439
  exports.Virtualizer = Virtualizer;
435
- exports.defaultEstimateSize = defaultEstimateSize;
436
440
  exports.defaultKeyExtractor = defaultKeyExtractor;
437
- exports.defaultMeasureElement = defaultMeasureElement;
438
441
  exports.defaultRangeExtractor = defaultRangeExtractor;
439
442
  exports.elementScroll = elementScroll;
443
+ exports.measureElement = measureElement;
440
444
  exports.observeElementOffset = observeElementOffset;
441
445
  exports.observeElementRect = observeElementRect;
442
446
  exports.observeWindowOffset = observeWindowOffset;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/index.ts"],"sourcesContent":["import observeRect from '@reach/observe-rect'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultEstimateSize = () => 50\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const defaultMeasureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[instance.getSizeKey()]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n count: number\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n getScrollElement: () => TScrollElement\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n //\n\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n estimateSize?: (index: number) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n keyExtractor?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n\n //\n // virtualItems: VirtualItem<TItemElement>[]\n // totalSize: number\n // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void\n // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void\n // measure: (index: number) => void\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n estimateSize: defaultEstimateSize,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n keyExtractor: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement: defaultMeasureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.getSizeKey()]\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.getEstimateSizeFn(),\n this.options.keyExtractor,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = keyExtractor(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number' ? measuredSize : estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n private tryScrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n scrollToIndex = (index: number, options?: ScrollToIndexOptions) => {\n // We do a double request here because of\n // dynamic sizes which can cause offset shift\n // and end up in the wrong spot. Unfortunately,\n // we can't know about those dynamic sizes until\n // we try and render them. So double down!\n this.tryScrollToIndex(index, options)\n requestAnimationFrame(() => {\n this.tryScrollToIndex(index, options)\n })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n getSizeKey = () => (this.options.horizontal ? 'width' : 'height')\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n }\n\n private getEstimateSizeFn = memo(\n () => [this.options.estimateSize],\n (d) => d,\n {\n key: false,\n onChange: () => {\n this.itemMeasurementsCache = {}\n },\n },\n )\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultEstimateSize","defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","defaultMeasureElement","element","getSizeKey","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","key","value","debug","initialOffset","estimateSize","paddingStart","paddingEnd","keyExtractor","rangeExtractor","enableSmoothScroll","onChange","measureElement","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","memo","getEstimateSizeFn","length","measurements","slice","measuredSize","size","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","console","info","_scrollToOffset","scrollToOffset","toOffset","align","tryScrollToIndex","rest","scrollToIndex","requestAnimationFrame","getTotalSize","scrollToFn","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;;;;;;;;AA4CA;AAEaA,MAAAA,mBAAmB,GAAG,MAAM,GAAlC;AACMC,MAAAA,mBAAmB,GAAIC,KAAD,IAAmBA,MAA/C;AAEMC,MAAAA,qBAAqB,GAAIC,KAAD,IAAkB;AACrD,EAAA,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAL,CAASH,KAAK,CAACI,UAAN,GAAmBJ,KAAK,CAACK,QAAlC,EAA4C,CAA5C,CAAd,CAAA;AACA,EAAA,MAAMC,GAAG,GAAGJ,IAAI,CAACK,GAAL,CAASP,KAAK,CAACQ,QAAN,GAAiBR,KAAK,CAACK,QAAhC,EAA0CL,KAAK,CAACS,KAAN,GAAc,CAAxD,CAAZ,CAAA;EAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;EAEA,KAAK,IAAIC,CAAC,GAAGV,KAAb,EAAoBU,CAAC,IAAIL,GAAzB,EAA8BK,CAAC,EAA/B,EAAmC;IACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAOD,GAAP,CAAA;AACD,EAXM;MAaMG,kBAAkB,GAAG,CAChCC,QADgC,EAEhCC,EAFgC,KAG7B;EACH,MAAMC,QAAQ,GAAGC,0BAAW,CAACH,QAAQ,CAACI,aAAV,EAAqCC,IAAD,IAAU;IACxEJ,EAAE,CAACI,IAAD,CAAF,CAAA;AACD,GAF2B,CAA5B,CAAA;;AAIA,EAAA,IAAI,CAACL,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;AAEDH,EAAAA,EAAE,CAACD,QAAQ,CAACI,aAAT,CAAuBE,qBAAvB,EAAD,CAAF,CAAA;AAEAJ,EAAAA,QAAQ,CAACK,OAAT,EAAA,CAAA;AAEA,EAAA,OAAO,MAAM;AACXL,IAAAA,QAAQ,CAACM,SAAT,EAAA,CAAA;GADF,CAAA;AAGD,EAnBM;MAqBMC,iBAAiB,GAAG,CAC/BT,QAD+B,EAE/BC,EAF+B,KAG5B;EACH,MAAMS,QAAQ,GAAG,MAAM;AACrBT,IAAAA,EAAE,CAAC;AACDU,MAAAA,KAAK,EAAEX,QAAQ,CAACI,aAAT,CAAuBQ,UAD7B;AAEDC,MAAAA,MAAM,EAAEb,QAAQ,CAACI,aAAT,CAAuBU,WAAAA;AAF9B,KAAD,CAAF,CAAA;GADF,CAAA;;AAOA,EAAA,IAAI,CAACd,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDM,QAAQ,EAAA,CAAA;EAERV,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDL,QAAlD,EAA4D;AAC1DM,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDR,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMS,oBAAoB,GAAG,CAClCnB,QADkC,EAElCC,EAFkC,KAG/B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,YAA9B,GAA6C,WAD/C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMG,mBAAmB,GAAG,CACjCvB,QADiC,EAEjCC,EAFiC,KAG9B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,SAA9B,GAA0C,SAD5C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMI,qBAAqB,GAAG,CACnCC,OADmC,EAEnCzB,QAFmC,KAGhC;EACH,OAAQyB,OAAD,CAAqBnB,qBAArB,EAAA,CAA6CN,QAAQ,CAAC0B,UAAT,EAA7C,CAAP,CAAA;AACD,EALM;AAOA,MAAMC,YAAY,GAAG,CAC1BC,MAD0B,EAE1BC,SAF0B,EAG1B7B,QAH0B,KAIvB;AAAA,EAAA,IAAA,qBAAA,CAAA;AACF,EAAA,CAAA,qBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoC0B,QAApC,CAA6C;IAC5C,CAAC9B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDM,MADJ;AAE5CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAWA,MAAMC,aAAa,GAAG,CAC3BL,MAD2B,EAE3BC,SAF2B,EAG3B7B,QAH2B,KAIxB;AAAA,EAAA,IAAA,sBAAA,CAAA;AACF,EAAA,CAAA,sBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqC0B,QAArC,CAA8C;IAC7C,CAAC9B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDM,MADH;AAE7CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAmDA,MAAME,WAAN,CAAoE;AAUzE;AACA;AACA;AACA;AACA;AACA;EAEAC,WAAW,CAACC,KAAD,EAAyD;AAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;IAAA,IAhBpEC,CAAAA,MAgBoE,GAhBlC,EAgBkC,CAAA;IAAA,IAdpEjC,CAAAA,aAcoE,GAd7B,IAc6B,CAAA;IAAA,IAb5DkC,CAAAA,iBAa4D,GAbhC,EAagC,CAAA;IAAA,IAZ5DC,CAAAA,qBAY4D,GAZf,EAYe,CAAA;IAAA,IAX5DC,CAAAA,2BAW4D,GAXpB,EAWoB,CAAA;;IAAA,IAMpEC,CAAAA,UANoE,GAMtDL,IAAD,IAA4D;AACvEM,MAAAA,MAAM,CAACC,OAAP,CAAeP,IAAf,CAAqBQ,CAAAA,OAArB,CAA6B,IAAkB,IAAA;AAAA,QAAA,IAAjB,CAACC,GAAD,EAAMC,KAAN,CAAiB,GAAA,IAAA,CAAA;QAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQV,IAAD,CAAcS,GAAd,CAAP,CAAA;OADpC,CAAA,CAAA;AAIA,MAAA,IAAA,CAAKxB,OAAL,GAAe;AACb0B,QAAAA,KAAK,EAAE,KADM;AAEbC,QAAAA,aAAa,EAAE,CAFF;AAGbC,QAAAA,YAAY,EAAEnE,mBAHD;AAIbS,QAAAA,QAAQ,EAAE,CAJG;AAKb2D,QAAAA,YAAY,EAAE,CALD;AAMbC,QAAAA,UAAU,EAAE,CANC;AAOb7B,QAAAA,UAAU,EAAE,KAPC;AAQb8B,QAAAA,YAAY,EAAErE,mBARD;AASbsE,QAAAA,cAAc,EAAEpE,qBATH;AAUbqE,QAAAA,kBAAkB,EAAE,KAVP;QAWbC,QAAQ,EAAE,MAAM,EAXH;AAYbC,QAAAA,cAAc,EAAEhC,qBAZH;AAabiC,QAAAA,WAAW,EAAE;AAAE9C,UAAAA,KAAK,EAAE,CAAT;AAAYE,UAAAA,MAAM,EAAE,CAAA;SAbpB;QAcb,GAAGuB,IAAAA;OAdL,CAAA;KAXkE,CAAA;;IAAA,IA6B5DsB,CAAAA,MA7B4D,GA6BnD,MAAM;AAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;AACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAKrC,OAAL,EAAakC,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;KA9BkE,CAAA;;IAAA,IAiC5DI,CAAAA,OAjC4D,GAiClD,MAAM;MACtB,IAAKtB,CAAAA,MAAL,CAAYuB,MAAZ,CAAmBC,OAAnB,CAA4BjB,CAAAA,OAA5B,CAAqCkB,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;MACA,IAAKzB,CAAAA,MAAL,GAAc,EAAd,CAAA;KAnCkE,CAAA;;IAAA,IAsCpE0B,CAAAA,SAtCoE,GAsCxD,MAAM;AAChB,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;OADF,CAAA;KAvCkE,CAAA;;IAAA,IA4CpEK,CAAAA,WA5CoE,GA4CtD,MAAM;AAClB,MAAA,MAAM5D,aAAa,GAAG,IAAA,CAAKiB,OAAL,CAAa4C,gBAAb,EAAtB,CAAA;;AAEA,MAAA,IAAI,IAAK7D,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;AACxC,QAAA,IAAA,CAAKuD,OAAL,EAAA,CAAA;QAEA,IAAKvD,CAAAA,aAAL,GAAqBA,aAArB,CAAA;AAEA,QAAA,IAAA,CAAKiC,MAAL,CAAYvC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAatB,kBAAb,CAAgC,IAAhC,EAAuCM,IAAD,IAAU;UAC9C,IAAK6D,CAAAA,UAAL,GAAkB7D,IAAlB,CAAA;AACA,UAAA,IAAA,CAAKqD,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAOA,QAAA,IAAA,CAAKrB,MAAL,CAAYvC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAaF,oBAAb,CAAkC,IAAlC,EAAyCS,MAAD,IAAY;UAClD,IAAKuC,CAAAA,YAAL,GAAoBvC,MAApB,CAAA;AACA,UAAA,IAAA,CAAK8B,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAMD,OAAA;KAjEiE,CAAA;;IAAA,IAoE5DU,CAAAA,OApE4D,GAoElD,MAAM;AACtB,MAAA,OAAO,KAAKF,UAAL,CAAgB,IAAKxC,CAAAA,UAAL,EAAhB,CAAP,CAAA;KArEkE,CAAA;;AAAA,IAAA,IAAA,CAwE5D2C,eAxE4D,GAwE1CC,UAAI,CAC5B,MAAM,CACJ,IAAKjD,CAAAA,OAAL,CAAa1B,KADT,EAEJ,IAAK0B,CAAAA,OAAL,CAAa6B,YAFT,EAGJ,KAAKqB,iBAAL,EAHI,EAIJ,IAAA,CAAKlD,OAAL,CAAa+B,YAJT,EAKJ,IAAKb,CAAAA,qBALD,CADsB,EAQ5B,CAAC5C,KAAD,EAAQuD,YAAR,EAAsBD,YAAtB,EAAoCG,YAApC,EAAkDd,iBAAlD,KAAwE;AACtE,MAAA,MAAM7C,GAAG,GACP,IAAA,CAAK+C,2BAAL,CAAiCgC,MAAjC,GAA0C,CAA1C,GACIpF,IAAI,CAACK,GAAL,CAAS,GAAG,KAAK+C,2BAAjB,CADJ,GAEI,CAHN,CAAA;MAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;MAEA,MAAMiC,YAAY,GAAG,IAAA,CAAKnC,iBAAL,CAAuBoC,KAAvB,CAA6B,CAA7B,EAAgCjF,GAAhC,CAArB,CAAA;;MAEA,KAAK,IAAII,CAAC,GAAGJ,GAAb,EAAkBI,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;AAChC,QAAA,MAAMgD,GAAG,GAAGO,YAAY,CAACvD,CAAD,CAAxB,CAAA;AACA,QAAA,MAAM8E,YAAY,GAAGrC,iBAAiB,CAACO,GAAD,CAAtC,CAAA;AACA,QAAA,MAAM1D,KAAK,GAAGsF,YAAY,CAAC5E,CAAC,GAAG,CAAL,CAAZ,GACV4E,YAAY,CAAC5E,CAAC,GAAG,CAAL,CAAZ,CAAqBL,GADX,GAEV0D,YAFJ,CAAA;AAGA,QAAA,MAAM0B,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GAAmCA,YAAnC,GAAkD1B,YAAY,CAACpD,CAAD,CADhE,CAAA;AAEA,QAAA,MAAML,GAAG,GAAGL,KAAK,GAAGyF,IAApB,CAAA;QACAH,YAAY,CAAC5E,CAAD,CAAZ,GAAkB;AAAEb,UAAAA,KAAK,EAAEa,CAAT;UAAYV,KAAZ;UAAmByF,IAAnB;UAAyBpF,GAAzB;AAA8BqD,UAAAA,GAAAA;SAAhD,CAAA;AACD,OAAA;;MAED,IAAKP,CAAAA,iBAAL,GAAyBmC,YAAzB,CAAA;AACA,MAAA,OAAOA,YAAP,CAAA;AACD,KA/B2B,EAgC5B;MACE5B,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,iBADjD;AAEEhC,MAAAA,KAAK,EAAE,MAAM,IAAK1B,CAAAA,OAAL,CAAa0B,KAAAA;AAF5B,KAhC4B,CAxEsC,CAAA;IAAA,IA8G5DiC,CAAAA,cA9G4D,GA8G3CV,UAAI,CAC3B,MAAM,CAAC,IAAKD,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKD,YAA9C,CADqB,EAE3B,CAACM,YAAD,EAAeQ,SAAf,EAA0Bd,YAA1B,KAA2C;AACzC,MAAA,OAAOa,cAAc,CAAC;QACpBP,YADoB;QAEpBQ,SAFoB;AAGpBd,QAAAA,YAAAA;AAHoB,OAAD,CAArB,CAAA;AAKD,KAR0B,EAS3B;MACEtB,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,gBADjD;AAEEhC,MAAAA,KAAK,EAAE,MAAM,IAAK1B,CAAAA,OAAL,CAAa0B,KAAAA;AAF5B,KAT2B,CA9GuC,CAAA;AAAA,IAAA,IAAA,CA6H5DmC,UA7H4D,GA6H/CZ,UAAI,CACvB,MAAM,CACJ,IAAA,CAAKjD,OAAL,CAAagC,cADT,EAEJ,IAAA,CAAK2B,cAAL,EAFI,EAGJ,IAAK3D,CAAAA,OAAL,CAAa9B,QAHT,EAIJ,IAAA,CAAK8B,OAAL,CAAa1B,KAJT,CADiB,EAOvB,CAAC0D,cAAD,EAAiBnE,KAAjB,EAAwBK,QAAxB,EAAkCI,KAAlC,KAA4C;AAC1C,MAAA,OAAO0D,cAAc,CAAC,EACpB,GAAGnE,KADiB;QAEpBK,QAFoB;AAGpBI,QAAAA,KAAK,EAAEA,KAAAA;AAHa,OAAD,CAArB,CAAA;AAKD,KAbsB,EAcvB;MACEkD,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAduB,CA7H2C,CAAA;IAAA,IAgJpEI,CAAAA,eAhJoE,GAgJlDb,UAAI,CACpB,MAAM,CACJ,IAAA,CAAKY,UAAL,EADI,EAEJ,IAAA,CAAKb,eAAL,EAFI,EAGJ,IAAKhD,CAAAA,OAAL,CAAamC,cAHT,CADc,EAMpB,CAAC4B,OAAD,EAAUX,YAAV,EAAwBjB,cAAxB,KAA2C;MACzC,MAAM6B,YAAyC,GAAG,EAAlD,CAAA;;AAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGH,OAAO,CAACZ,MAA9B,EAAsCc,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;AAClD,QAAA,MAAMzF,CAAC,GAAGuF,OAAO,CAACE,CAAD,CAAjB,CAAA;AACA,QAAA,MAAME,WAAW,GAAGf,YAAY,CAAC5E,CAAD,CAAhC,CAAA;AAEA,QAAA,MAAM4F,IAAI,GAAG,EACX,GAAGD,WADQ;UAEXhC,cAAc,EAAGkC,cAAD,IAAyC;AACvD,YAAA,IAAIA,cAAJ,EAAoB;AAClB,cAAA,MAAMC,gBAAgB,GAAGnC,cAAc,CAACkC,cAAD,EAAiB,IAAjB,CAAvC,CAAA;;AAEA,cAAA,IAAIC,gBAAgB,KAAKF,IAAI,CAACb,IAA9B,EAAoC;AAClC,gBAAA,IAAIa,IAAI,CAACtG,KAAL,GAAa,IAAA,CAAKgF,YAAtB,EAAoC;kBAClC,IACEU,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IACA,IAAA,CAAK1D,OAAL,CAAa0B,KAFf,EAIE6C,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2BF,gBAAgB,GAAGF,IAAI,CAACb,IAAnD,CAAA,CAAA;;AAEF,kBAAA,IAAA,CAAKkB,eAAL,CACE,IAAK3B,CAAAA,YAAL,IAAqBwB,gBAAgB,GAAGF,IAAI,CAACb,IAA7C,CADF,EAEE,KAFF,CAAA,CAAA;AAID,iBAAA;;AAED,gBAAA,IAAA,CAAKpC,2BAAL,CAAiC1C,IAAjC,CAAsCD,CAAtC,CAAA,CAAA;AACA,gBAAA,IAAA,CAAK0C,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;kBAE3B,CAACkD,IAAI,CAAC5C,GAAN,GAAY8C,gBAAAA;iBAFd,CAAA;AAIA,gBAAA,IAAA,CAAKjC,MAAL,EAAA,CAAA;AACD,eAAA;AACF,aAAA;AACF,WAAA;SA5BH,CAAA;QA+BA2B,YAAY,CAACvF,IAAb,CAAkB2F,IAAlB,CAAA,CAAA;AACD,OAAA;;AAED,MAAA,OAAOJ,YAAP,CAAA;AACD,KAhDmB,EAiDpB;MACExC,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAjDoB,CAhJ8C,CAAA;;AAAA,IAAA,IAAA,CAsMpEgB,cAtMoE,GAsMnD,UACfC,QADe,EAGZ,KAAA,EAAA;MAAA,IADH;AAAEC,QAAAA,KAAAA;AAAF,OACG,GADgC,KAAA,KAAA,KAAA,CAAA,GAAA;AAAEA,QAAAA,KAAK,EAAE,OAAA;OACzC,GAAA,KAAA,CAAA;AACH,MAAA,MAAMrE,MAAM,GAAG,KAAI,CAACuC,YAApB,CAAA;;AACA,MAAA,MAAMS,IAAI,GAAG,KAAI,CAACR,OAAL,EAAb,CAAA;;MAEA,IAAI6B,KAAK,KAAK,MAAd,EAAsB;QACpB,IAAID,QAAQ,IAAIpE,MAAhB,EAAwB;AACtBqE,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAFD,MAEO,IAAID,QAAQ,IAAIpE,MAAM,GAAGgD,IAAzB,EAA+B;AACpCqB,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFM,MAEA;AACLA,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAAA;AACF,OAAA;;MAED,IAAIA,KAAK,KAAK,OAAd,EAAuB;AACrB,QAAA,KAAI,CAACH,eAAL,CAAqBE,QAArB,EAA+B,IAA/B,CAAA,CAAA;AACD,OAFD,MAEO,IAAIC,KAAK,KAAK,KAAd,EAAqB;AAC1B,QAAA,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGpB,IAAhC,EAAsC,IAAtC,CAAA,CAAA;AACD,OAFM,MAEA,IAAIqB,KAAK,KAAK,QAAd,EAAwB;QAC7B,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGpB,IAAI,GAAG,CAAvC,EAA0C,IAA1C,CAAA,CAAA;AACD,OAAA;KA7NiE,CAAA;;AAAA,IAAA,IAAA,CAgO5DsB,gBAhO4D,GAgOzC,UACzBlH,KADyB,EAGtB,MAAA,EAAA;MAAA,IADH;QAAEiH,KAAF;QAAS,GAAGE,IAAAA;AAAZ,OACG,GADwC,MAAA,KAAA,KAAA,CAAA,GAAA;AAAEF,QAAAA,KAAK,EAAE,MAAA;OACjD,GAAA,MAAA,CAAA;;AACH,MAAA,MAAMxB,YAAY,GAAG,KAAI,CAACJ,eAAL,EAArB,CAAA;;AACA,MAAA,MAAMzC,MAAM,GAAG,KAAI,CAACuC,YAApB,CAAA;;AACA,MAAA,MAAMS,IAAI,GAAG,KAAI,CAACR,OAAL,EAAb,CAAA;;MACA,MAAM;AAAEzE,QAAAA,KAAAA;OAAU,GAAA,KAAI,CAAC0B,OAAvB,CAAA;MAEA,MAAMmE,WAAW,GAAGf,YAAY,CAACrF,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYD,IAAI,CAACK,GAAL,CAAST,KAAT,EAAgBW,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;MAEA,IAAI,CAAC6F,WAAL,EAAkB;AAChB,QAAA,OAAA;AACD,OAAA;;MAED,IAAIS,KAAK,KAAK,MAAd,EAAsB;AACpB,QAAA,IAAIT,WAAW,CAAChG,GAAZ,IAAmBoC,MAAM,GAAGgD,IAAhC,EAAsC;AACpCqB,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFD,MAEO,IAAIT,WAAW,CAACrG,KAAZ,IAAqByC,MAAzB,EAAiC;AACtCqE,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAFM,MAEA;AACL,UAAA,OAAA;AACD,SAAA;AACF,OAAA;;MAED,MAAMD,QAAQ,GACZC,KAAK,KAAK,QAAV,GACIT,WAAW,CAACrG,KAAZ,GAAoBqG,WAAW,CAACZ,IAAZ,GAAmB,CAD3C,GAEIqB,KAAK,KAAK,KAAV,GACAT,WAAW,CAAChG,GADZ,GAEAgG,WAAW,CAACrG,KALlB,CAAA;;AAOA,MAAA,KAAI,CAAC4G,cAAL,CAAoBC,QAApB,EAA8B;QAAEC,KAAF;QAAS,GAAGE,IAAAA;OAA1C,CAAA,CAAA;KAhQkE,CAAA;;AAAA,IAAA,IAAA,CAmQpEC,aAnQoE,GAmQpD,CAACpH,KAAD,EAAgBqC,OAAhB,KAAmD;AACjE;AACA;AACA;AACA;AACA;AACA,MAAA,IAAA,CAAK6E,gBAAL,CAAsBlH,KAAtB,EAA6BqC,OAA7B,CAAA,CAAA;AACAgF,MAAAA,qBAAqB,CAAC,MAAM;AAC1B,QAAA,IAAA,CAAKH,gBAAL,CAAsBlH,KAAtB,EAA6BqC,OAA7B,CAAA,CAAA;AACD,OAFoB,CAArB,CAAA;KA1QkE,CAAA;;AAAA,IAAA,IAAA,CA+QpEiF,YA/QoE,GA+QrD,MAAA;AAAA,MAAA,IAAA,qBAAA,CAAA;;MAAA,OACb,CAAC,+BAAKjC,eAAL,EAAA,CAAuB,KAAKhD,OAAL,CAAa1B,KAAb,GAAqB,CAA5C,4CAAgDH,GAAhD,KACC,KAAK6B,OAAL,CAAa6B,YADf,IAC+B,IAAA,CAAK7B,OAAL,CAAa8B,UAF/B,CAAA;KA/QqD,CAAA;;IAAA,IAmRpEzB,CAAAA,UAnRoE,GAmRvD,MAAO,IAAKL,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAnRY,CAAA;;AAAA,IAAA,IAAA,CAqR5DwE,eArR4D,GAqR1C,CAAClE,MAAD,EAAiBC,SAAjB,KAAwC;AAChE,MAAA,IAAA,CAAKR,OAAL,CAAakF,UAAb,CACE3E,MADF,EAEE,IAAKP,CAAAA,OAAL,CAAaiC,kBAAb,IAAmCzB,SAFrC,EAGE,IAHF,CAAA,CAAA;KAtRkE,CAAA;;AAAA,IAAA,IAAA,CA6R5D0C,iBA7R4D,GA6RxCD,UAAI,CAC9B,MAAM,CAAC,IAAA,CAAKjD,OAAL,CAAa4B,YAAd,CADwB,EAE7Ba,CAAD,IAAOA,CAFuB,EAG9B;AACEjB,MAAAA,GAAG,EAAE,KADP;AAEEU,MAAAA,QAAQ,EAAE,MAAM;QACd,IAAKhB,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;AACD,OAAA;AAJH,KAH8B,CA7RoC,CAAA;;IAAA,IAwSpEiE,CAAAA,OAxSoE,GAwS1D,MAAM;MACd,IAAKjE,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;AACA,MAAA,IAAA,CAAKmB,MAAL,EAAA,CAAA;KA1SkE,CAAA;;IAClE,IAAKjB,CAAAA,UAAL,CAAgBL,KAAhB,CAAA,CAAA;AACA,IAAA,IAAA,CAAK8B,UAAL,GAAkB,IAAK7C,CAAAA,OAAL,CAAaoC,WAA/B,CAAA;AACA,IAAA,IAAA,CAAKU,YAAL,GAAoB,IAAK9C,CAAAA,OAAL,CAAa2B,aAAjC,CAAA;AACD,GAAA;;AArBwE,CAAA;;AA+T3E,MAAMyD,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9B9D,KAJ8B,KAK3B;EACH,OAAO4D,GAAG,IAAIC,IAAd,EAAoB;IAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;AACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;IAEA,IAAIC,YAAY,GAAGhE,KAAnB,EAA0B;MACxB4D,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;AACD,KAFD,MAEO,IAAIC,YAAY,GAAGhE,KAAnB,EAA0B;MAC/B6D,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;AACD,KAFM,MAEA;AACL,MAAA,OAAOA,MAAP,CAAA;AACD,KAAA;AACF,GAAA;;EAED,IAAIH,GAAG,GAAG,CAAV,EAAa;IACX,OAAOA,GAAG,GAAG,CAAb,CAAA;AACD,GAFD,MAEO;AACL,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;AACF,CAxBD,CAAA;;AA0BA,SAAS1B,cAAT,CAQG,KAAA,EAAA;EAAA,IARqB;IACtBP,YADsB;IAEtBQ,SAFsB;AAGtBd,IAAAA,YAAAA;GAKC,GAAA,KAAA,CAAA;AACD,EAAA,MAAMxE,KAAK,GAAG8E,YAAY,CAACD,MAAb,GAAsB,CAApC,CAAA;;EACA,MAAMuC,SAAS,GAAI/H,KAAD,IAAmByF,YAAY,CAACzF,KAAD,CAAZ,CAAqBG,KAA1D,CAAA;;EAEA,MAAMG,UAAU,GAAGmH,uBAAuB,CAAC,CAAD,EAAI9G,KAAJ,EAAWoH,SAAX,EAAsB5C,YAAtB,CAA1C,CAAA;EACA,IAAIzE,QAAQ,GAAGJ,UAAf,CAAA;;AAEA,EAAA,OACEI,QAAQ,GAAGC,KAAX,IACA8E,YAAY,CAAC/E,QAAD,CAAZ,CAAwBF,GAAxB,GAA8B2E,YAAY,GAAGc,SAF/C,EAGE;IACAvF,QAAQ,EAAA,CAAA;AACT,GAAA;;EAED,OAAO;IAAEJ,UAAF;AAAcI,IAAAA,QAAAA;GAArB,CAAA;AACD;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/index.ts"],"sourcesContent":["import observeRect from '@reach/observe-rect'\nimport { check } from 'prettier'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const 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\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 }\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 virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const 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":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","console","info","destinationOffset","_scrollToOffset","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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"}
@@ -120,7 +120,6 @@ function memo(getDeps, fn, opts) {
120
120
  }
121
121
 
122
122
  //
123
- const defaultEstimateSize = () => 50;
124
123
  const defaultKeyExtractor = index => index;
125
124
  const defaultRangeExtractor = range => {
126
125
  const start = Math.max(range.startIndex - range.overscan, 0);
@@ -201,8 +200,8 @@ const observeWindowOffset = (instance, cb) => {
201
200
  instance.scrollElement.removeEventListener('scroll', onScroll);
202
201
  };
203
202
  };
204
- const defaultMeasureElement = (element, instance) => {
205
- return element.getBoundingClientRect()[instance.getSizeKey()];
203
+ const measureElement = (element, instance) => {
204
+ return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
206
205
  };
207
206
  const windowScroll = (offset, canSmooth, instance) => {
208
207
  var _instance$scrollEleme;
@@ -219,12 +218,6 @@ const elementScroll = (offset, canSmooth, instance) => {
219
218
  });
220
219
  };
221
220
  class Virtualizer {
222
- //
223
- // virtualItems: VirtualItem<TItemElement>[]
224
- // totalSize: number
225
- // scrollToOffset: (offset: number, options?: ScrollToOffsetOptions) => void
226
- // scrollToIndex: (index: number, options?: ScrollToIndexOptions) => void
227
- // measure: (index: number) => void
228
221
  constructor(_opts) {
229
222
  var _this = this;
230
223
 
@@ -242,16 +235,17 @@ class Virtualizer {
242
235
  this.options = {
243
236
  debug: false,
244
237
  initialOffset: 0,
245
- estimateSize: defaultEstimateSize,
246
238
  overscan: 1,
247
239
  paddingStart: 0,
248
240
  paddingEnd: 0,
241
+ scrollPaddingStart: 0,
242
+ scrollPaddingEnd: 0,
249
243
  horizontal: false,
250
- keyExtractor: defaultKeyExtractor,
244
+ getItemKey: defaultKeyExtractor,
251
245
  rangeExtractor: defaultRangeExtractor,
252
- enableSmoothScroll: false,
246
+ enableSmoothScroll: true,
253
247
  onChange: () => {},
254
- measureElement: defaultMeasureElement,
248
+ measureElement,
255
249
  initialRect: {
256
250
  width: 0,
257
251
  height: 0
@@ -295,19 +289,19 @@ class Virtualizer {
295
289
  };
296
290
 
297
291
  this.getSize = () => {
298
- return this.scrollRect[this.getSizeKey()];
292
+ return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
299
293
  };
300
294
 
301
- this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
295
+ this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
302
296
  const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
303
297
  this.pendingMeasuredCacheIndexes = [];
304
298
  const measurements = this.measurementsCache.slice(0, min);
305
299
 
306
300
  for (let i = min; i < count; i++) {
307
- const key = keyExtractor(i);
301
+ const key = getItemKey(i);
308
302
  const measuredSize = measurementsCache[key];
309
303
  const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
310
- const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
304
+ const size = typeof measuredSize === 'number' ? measuredSize : this.options.estimateSize(i);
311
305
  const end = start + size;
312
306
  measurements[i] = {
313
307
  index: i,
@@ -357,7 +351,9 @@ class Virtualizer {
357
351
  if (item.start < this.scrollOffset) {
358
352
  if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
359
353
 
360
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
354
+ if (!this.destinationOffset) {
355
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
356
+ }
361
357
  }
362
358
 
363
359
  this.pendingMeasuredCacheIndexes.push(i);
@@ -383,30 +379,38 @@ class Virtualizer {
383
379
  } = _temp === void 0 ? {
384
380
  align: 'start'
385
381
  } : _temp;
386
- const offset = _this.scrollOffset;
387
382
 
388
- const size = _this.getSize();
383
+ const attempt = () => {
384
+ const offset = _this.scrollOffset;
389
385
 
390
- if (align === 'auto') {
391
- if (toOffset <= offset) {
392
- align = 'start';
393
- } else if (toOffset >= offset + size) {
394
- align = 'end';
395
- } else {
396
- align = 'start';
386
+ const size = _this.getSize();
387
+
388
+ if (align === 'auto') {
389
+ if (toOffset <= offset) {
390
+ align = 'start';
391
+ } else if (toOffset >= offset + size) {
392
+ align = 'end';
393
+ } else {
394
+ align = 'start';
395
+ }
397
396
  }
398
- }
399
397
 
400
- if (align === 'start') {
401
- _this._scrollToOffset(toOffset, true);
402
- } else if (align === 'end') {
403
- _this._scrollToOffset(toOffset - size, true);
404
- } else if (align === 'center') {
405
- _this._scrollToOffset(toOffset - size / 2, true);
406
- }
398
+ if (align === 'start') {
399
+ _this._scrollToOffset(toOffset, true);
400
+ } else if (align === 'end') {
401
+ _this._scrollToOffset(toOffset - size, true);
402
+ } else if (align === 'center') {
403
+ _this._scrollToOffset(toOffset - size / 2, true);
404
+ }
405
+ };
406
+
407
+ attempt();
408
+ requestAnimationFrame(() => {
409
+ attempt();
410
+ });
407
411
  };
408
412
 
409
- this.tryScrollToIndex = function (index, _temp2) {
413
+ this.scrollToIndex = function (index, _temp2) {
410
414
  let {
411
415
  align,
412
416
  ...rest
@@ -430,16 +434,16 @@ class Virtualizer {
430
434
  }
431
435
 
432
436
  if (align === 'auto') {
433
- if (measurement.end >= offset + size) {
437
+ if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
434
438
  align = 'end';
435
- } else if (measurement.start <= offset) {
439
+ } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
436
440
  align = 'start';
437
441
  } else {
438
442
  return;
439
443
  }
440
444
  }
441
445
 
442
- const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
446
+ const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
443
447
 
444
448
  _this.scrollToOffset(toOffset, {
445
449
  align,
@@ -447,36 +451,37 @@ class Virtualizer {
447
451
  });
448
452
  };
449
453
 
450
- this.scrollToIndex = (index, options) => {
451
- // We do a double request here because of
452
- // dynamic sizes which can cause offset shift
453
- // and end up in the wrong spot. Unfortunately,
454
- // we can't know about those dynamic sizes until
455
- // we try and render them. So double down!
456
- this.tryScrollToIndex(index, options);
457
- requestAnimationFrame(() => {
458
- this.tryScrollToIndex(index, options);
459
- });
460
- };
461
-
462
454
  this.getTotalSize = () => {
463
455
  var _this$getMeasurements;
464
456
 
465
457
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
466
458
  };
467
459
 
468
- this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
469
-
470
460
  this._scrollToOffset = (offset, canSmooth) => {
461
+ clearTimeout(this.scrollCheckFrame);
462
+ this.destinationOffset = offset;
471
463
  this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
472
- };
464
+ let scrollCheckFrame;
473
465
 
474
- this.getEstimateSizeFn = memo(() => [this.options.estimateSize], d => d, {
475
- key: false,
476
- onChange: () => {
477
- this.itemMeasurementsCache = {};
478
- }
479
- });
466
+ const check = () => {
467
+ let lastOffset = this.scrollOffset;
468
+ this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
469
+ if (this.scrollCheckFrame !== scrollCheckFrame) {
470
+ return;
471
+ }
472
+
473
+ if (this.scrollOffset === lastOffset) {
474
+ this.destinationOffset = undefined;
475
+ return;
476
+ }
477
+
478
+ lastOffset = this.scrollOffset;
479
+ check();
480
+ }, 100);
481
+ };
482
+
483
+ check();
484
+ };
480
485
 
481
486
  this.measure = () => {
482
487
  this.itemMeasurementsCache = {};
@@ -534,5 +539,5 @@ function calculateRange(_ref2) {
534
539
  };
535
540
  }
536
541
 
537
- export { Virtualizer, defaultEstimateSize, defaultKeyExtractor, defaultMeasureElement, defaultRangeExtractor, elementScroll, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
542
+ export { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
538
543
  //# sourceMappingURL=index.js.map