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

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,15 @@ 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,
145
137
  horizontal: false,
146
- keyExtractor: defaultKeyExtractor,
138
+ getItemKey: defaultKeyExtractor,
147
139
  rangeExtractor: defaultRangeExtractor,
148
140
  enableSmoothScroll: false,
149
141
  onChange: () => {},
150
- measureElement: defaultMeasureElement,
142
+ measureElement,
151
143
  initialRect: {
152
144
  width: 0,
153
145
  height: 0
@@ -191,19 +183,19 @@ class Virtualizer {
191
183
  };
192
184
 
193
185
  this.getSize = () => {
194
- return this.scrollRect[this.getSizeKey()];
186
+ return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
195
187
  };
196
188
 
197
- this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
189
+ this.getMeasurements = utils.memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
198
190
  const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
199
191
  this.pendingMeasuredCacheIndexes = [];
200
192
  const measurements = this.measurementsCache.slice(0, min);
201
193
 
202
194
  for (let i = min; i < count; i++) {
203
- const key = keyExtractor(i);
195
+ const key = getItemKey(i);
204
196
  const measuredSize = measurementsCache[key];
205
197
  const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
206
- const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
198
+ const size = typeof measuredSize === 'number' ? measuredSize : this.options.estimateSize(i);
207
199
  const end = start + size;
208
200
  measurements[i] = {
209
201
  index: i,
@@ -253,7 +245,9 @@ class Virtualizer {
253
245
  if (item.start < this.scrollOffset) {
254
246
  if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
255
247
 
256
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
248
+ if (!this.destinationOffset) {
249
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
250
+ }
257
251
  }
258
252
 
259
253
  this.pendingMeasuredCacheIndexes.push(i);
@@ -279,30 +273,38 @@ class Virtualizer {
279
273
  } = _temp === void 0 ? {
280
274
  align: 'start'
281
275
  } : _temp;
282
- const offset = _this.scrollOffset;
283
276
 
284
- const size = _this.getSize();
277
+ const attempt = () => {
278
+ const offset = _this.scrollOffset;
285
279
 
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';
280
+ const size = _this.getSize();
281
+
282
+ if (align === 'auto') {
283
+ if (toOffset <= offset) {
284
+ align = 'start';
285
+ } else if (toOffset >= offset + size) {
286
+ align = 'end';
287
+ } else {
288
+ align = 'start';
289
+ }
293
290
  }
294
- }
295
291
 
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
- }
292
+ if (align === 'start') {
293
+ _this._scrollToOffset(toOffset, true);
294
+ } else if (align === 'end') {
295
+ _this._scrollToOffset(toOffset - size, true);
296
+ } else if (align === 'center') {
297
+ _this._scrollToOffset(toOffset - size / 2, true);
298
+ }
299
+ };
300
+
301
+ attempt();
302
+ requestAnimationFrame(() => {
303
+ attempt();
304
+ });
303
305
  };
304
306
 
305
- this.tryScrollToIndex = function (index, _temp2) {
307
+ this.scrollToIndex = function (index, _temp2) {
306
308
  let {
307
309
  align,
308
310
  ...rest
@@ -343,36 +345,37 @@ class Virtualizer {
343
345
  });
344
346
  };
345
347
 
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
348
  this.getTotalSize = () => {
359
349
  var _this$getMeasurements;
360
350
 
361
351
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
362
352
  };
363
353
 
364
- this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
365
-
366
354
  this._scrollToOffset = (offset, canSmooth) => {
367
- this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
368
- };
355
+ clearTimeout(this.scrollCheckFrame);
356
+ this.destinationOffset = offset;
357
+ this.options.scrollToFn(offset, canSmooth, this);
358
+ let scrollCheckFrame;
359
+
360
+ const check = () => {
361
+ let lastOffset = this.scrollOffset;
362
+ this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
363
+ if (this.scrollCheckFrame !== scrollCheckFrame) {
364
+ return;
365
+ }
369
366
 
370
- this.getEstimateSizeFn = utils.memo(() => [this.options.estimateSize], d => d, {
371
- key: false,
372
- onChange: () => {
373
- this.itemMeasurementsCache = {};
374
- }
375
- });
367
+ if (this.scrollOffset === lastOffset) {
368
+ this.destinationOffset = undefined;
369
+ return;
370
+ }
371
+
372
+ lastOffset = this.scrollOffset;
373
+ check();
374
+ }, 100);
375
+ };
376
+
377
+ check();
378
+ };
376
379
 
377
380
  this.measure = () => {
378
381
  this.itemMeasurementsCache = {};
@@ -432,11 +435,10 @@ function calculateRange(_ref2) {
432
435
 
433
436
  exports.memo = utils.memo;
434
437
  exports.Virtualizer = Virtualizer;
435
- exports.defaultEstimateSize = defaultEstimateSize;
436
438
  exports.defaultKeyExtractor = defaultKeyExtractor;
437
- exports.defaultMeasureElement = defaultMeasureElement;
438
439
  exports.defaultRangeExtractor = defaultRangeExtractor;
439
440
  exports.elementScroll = elementScroll;
441
+ exports.measureElement = measureElement;
440
442
  exports.observeElementOffset = observeElementOffset;
441
443
  exports.observeElementRect = observeElementRect;
442
444
  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 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 horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\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) {\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 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(offset, canSmooth, 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","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","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,15 @@ 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,
249
241
  horizontal: false,
250
- keyExtractor: defaultKeyExtractor,
242
+ getItemKey: defaultKeyExtractor,
251
243
  rangeExtractor: defaultRangeExtractor,
252
244
  enableSmoothScroll: false,
253
245
  onChange: () => {},
254
- measureElement: defaultMeasureElement,
246
+ measureElement,
255
247
  initialRect: {
256
248
  width: 0,
257
249
  height: 0
@@ -295,19 +287,19 @@ class Virtualizer {
295
287
  };
296
288
 
297
289
  this.getSize = () => {
298
- return this.scrollRect[this.getSizeKey()];
290
+ return this.scrollRect[this.options.horizontal ? 'width' : 'height'];
299
291
  };
300
292
 
301
- this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.getEstimateSizeFn(), this.options.keyExtractor, this.itemMeasurementsCache], (count, paddingStart, estimateSize, keyExtractor, measurementsCache) => {
293
+ this.getMeasurements = memo(() => [this.options.count, this.options.paddingStart, this.options.getItemKey, this.itemMeasurementsCache], (count, paddingStart, getItemKey, measurementsCache) => {
302
294
  const min = this.pendingMeasuredCacheIndexes.length > 0 ? Math.min(...this.pendingMeasuredCacheIndexes) : 0;
303
295
  this.pendingMeasuredCacheIndexes = [];
304
296
  const measurements = this.measurementsCache.slice(0, min);
305
297
 
306
298
  for (let i = min; i < count; i++) {
307
- const key = keyExtractor(i);
299
+ const key = getItemKey(i);
308
300
  const measuredSize = measurementsCache[key];
309
301
  const start = measurements[i - 1] ? measurements[i - 1].end : paddingStart;
310
- const size = typeof measuredSize === 'number' ? measuredSize : estimateSize(i);
302
+ const size = typeof measuredSize === 'number' ? measuredSize : this.options.estimateSize(i);
311
303
  const end = start + size;
312
304
  measurements[i] = {
313
305
  index: i,
@@ -357,7 +349,9 @@ class Virtualizer {
357
349
  if (item.start < this.scrollOffset) {
358
350
  if (process.env.NODE_ENV === 'development' && this.options.debug) console.info('correction', measuredItemSize - item.size);
359
351
 
360
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
352
+ if (!this.destinationOffset) {
353
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - item.size), false);
354
+ }
361
355
  }
362
356
 
363
357
  this.pendingMeasuredCacheIndexes.push(i);
@@ -383,30 +377,38 @@ class Virtualizer {
383
377
  } = _temp === void 0 ? {
384
378
  align: 'start'
385
379
  } : _temp;
386
- const offset = _this.scrollOffset;
387
380
 
388
- const size = _this.getSize();
381
+ const attempt = () => {
382
+ const offset = _this.scrollOffset;
389
383
 
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';
384
+ const size = _this.getSize();
385
+
386
+ if (align === 'auto') {
387
+ if (toOffset <= offset) {
388
+ align = 'start';
389
+ } else if (toOffset >= offset + size) {
390
+ align = 'end';
391
+ } else {
392
+ align = 'start';
393
+ }
397
394
  }
398
- }
399
395
 
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
- }
396
+ if (align === 'start') {
397
+ _this._scrollToOffset(toOffset, true);
398
+ } else if (align === 'end') {
399
+ _this._scrollToOffset(toOffset - size, true);
400
+ } else if (align === 'center') {
401
+ _this._scrollToOffset(toOffset - size / 2, true);
402
+ }
403
+ };
404
+
405
+ attempt();
406
+ requestAnimationFrame(() => {
407
+ attempt();
408
+ });
407
409
  };
408
410
 
409
- this.tryScrollToIndex = function (index, _temp2) {
411
+ this.scrollToIndex = function (index, _temp2) {
410
412
  let {
411
413
  align,
412
414
  ...rest
@@ -447,36 +449,37 @@ class Virtualizer {
447
449
  });
448
450
  };
449
451
 
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
452
  this.getTotalSize = () => {
463
453
  var _this$getMeasurements;
464
454
 
465
455
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
466
456
  };
467
457
 
468
- this.getSizeKey = () => this.options.horizontal ? 'width' : 'height';
469
-
470
458
  this._scrollToOffset = (offset, canSmooth) => {
471
- this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
472
- };
459
+ clearTimeout(this.scrollCheckFrame);
460
+ this.destinationOffset = offset;
461
+ this.options.scrollToFn(offset, canSmooth, this);
462
+ let scrollCheckFrame;
463
+
464
+ const check = () => {
465
+ let lastOffset = this.scrollOffset;
466
+ this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
467
+ if (this.scrollCheckFrame !== scrollCheckFrame) {
468
+ return;
469
+ }
473
470
 
474
- this.getEstimateSizeFn = memo(() => [this.options.estimateSize], d => d, {
475
- key: false,
476
- onChange: () => {
477
- this.itemMeasurementsCache = {};
478
- }
479
- });
471
+ if (this.scrollOffset === lastOffset) {
472
+ this.destinationOffset = undefined;
473
+ return;
474
+ }
475
+
476
+ lastOffset = this.scrollOffset;
477
+ check();
478
+ }, 100);
479
+ };
480
+
481
+ check();
482
+ };
480
483
 
481
484
  this.measure = () => {
482
485
  this.itemMeasurementsCache = {};
@@ -534,5 +537,5 @@ function calculateRange(_ref2) {
534
537
  };
535
538
  }
536
539
 
537
- export { Virtualizer, defaultEstimateSize, defaultKeyExtractor, defaultMeasureElement, defaultRangeExtractor, elementScroll, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
540
+ export { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, memo, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };
538
541
  //# sourceMappingURL=index.js.map