@tanstack/virtual-core 3.0.0-beta.17 → 3.0.0-beta.19

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.
@@ -100,7 +100,8 @@ const createOffsetObserver = mode => {
100
100
  let prevY = instance.scrollElement[propY];
101
101
 
102
102
  const scroll = () => {
103
- cb(instance.scrollElement[instance.options.horizontal ? propX : propY]);
103
+ const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
104
+ cb(Math.max(0, offset - instance.options.scrollMargin));
104
105
  };
105
106
 
106
107
  scroll();
@@ -133,17 +134,29 @@ const observeWindowOffset = createOffsetObserver('window');
133
134
  const measureElement = (element, instance) => {
134
135
  return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
135
136
  };
136
- const windowScroll = (offset, canSmooth, instance) => {
137
+ const windowScroll = (offset, _ref, instance) => {
137
138
  var _instance$scrollEleme;
139
+
140
+ let {
141
+ canSmooth,
142
+ sync
143
+ } = _ref;
144
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
138
145
  (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
139
- [instance.options.horizontal ? 'left' : 'top']: offset,
146
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
140
147
  behavior: canSmooth ? 'smooth' : undefined
141
148
  });
142
149
  };
143
- const elementScroll = (offset, canSmooth, instance) => {
150
+ const elementScroll = (offset, _ref2, instance) => {
144
151
  var _instance$scrollEleme2;
152
+
153
+ let {
154
+ canSmooth,
155
+ sync
156
+ } = _ref2;
157
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
145
158
  (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
146
- [instance.options.horizontal ? 'left' : 'top']: offset,
159
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
147
160
  behavior: canSmooth ? 'smooth' : undefined
148
161
  });
149
162
  };
@@ -153,6 +166,8 @@ class Virtualizer {
153
166
 
154
167
  this.unsubs = [];
155
168
  this.scrollElement = null;
169
+ this.isScrolling = false;
170
+ this.isScrollingTimeoutId = null;
156
171
  this.measurementsCache = [];
157
172
  this.itemMeasurementsCache = {};
158
173
  this.pendingMeasuredCacheIndexes = [];
@@ -163,8 +178,8 @@ class Virtualizer {
163
178
  };
164
179
 
165
180
  this.setOptions = opts => {
166
- Object.entries(opts).forEach(_ref => {
167
- let [key, value] = _ref;
181
+ Object.entries(opts).forEach(_ref3 => {
182
+ let [key, value] = _ref3;
168
183
  if (typeof value === 'undefined') delete opts[key];
169
184
  });
170
185
  this.options = {
@@ -185,6 +200,8 @@ class Virtualizer {
185
200
  width: 0,
186
201
  height: 0
187
202
  },
203
+ scrollMargin: 0,
204
+ scrollingDelay: 150,
188
205
  ...opts
189
206
  };
190
207
  };
@@ -213,14 +230,38 @@ class Virtualizer {
213
230
  if (this.scrollElement !== scrollElement) {
214
231
  this.cleanup();
215
232
  this.scrollElement = scrollElement;
233
+
234
+ this._scrollToOffset(this.scrollOffset, {
235
+ canSmooth: false,
236
+ sync: true
237
+ });
238
+
216
239
  this.unsubs.push(this.options.observeElementRect(this, rect => {
217
240
  this.scrollRect = rect;
218
241
  this.calculateRange();
219
242
  }));
220
243
  this.unsubs.push(this.options.observeElementOffset(this, offset => {
221
- this.scrollOffset = offset;
244
+ if (this.isScrollingTimeoutId !== null) {
245
+ clearTimeout(this.isScrollingTimeoutId);
246
+ this.isScrollingTimeoutId = null;
247
+ }
248
+
249
+ if (this.scrollOffset !== offset) {
250
+ this.isScrolling = true;
251
+ this.scrollOffset = offset;
252
+ this.isScrollingTimeoutId = setTimeout(() => {
253
+ this.isScrollingTimeoutId = null;
254
+ this.isScrolling = false;
255
+ this.notify();
256
+ }, this.options.scrollingDelay);
257
+ } else {
258
+ this.isScrolling = false;
259
+ }
260
+
222
261
  this.calculateRange();
223
262
  }));
263
+ } else if (!this.isScrolling) {
264
+ this.calculateRange();
224
265
  }
225
266
  };
226
267
 
@@ -300,7 +341,10 @@ class Virtualizer {
300
341
  }
301
342
 
302
343
  if (!this.destinationOffset) {
303
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), false);
344
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), {
345
+ canSmooth: false,
346
+ sync: false
347
+ });
304
348
  }
305
349
  }
306
350
 
@@ -352,19 +396,23 @@ class Virtualizer {
352
396
  }
353
397
  }
354
398
 
399
+ const options = {
400
+ canSmooth: smoothScroll,
401
+ sync: false
402
+ };
403
+
355
404
  if (align === 'start') {
356
- _this._scrollToOffset(toOffset, smoothScroll);
405
+ _this._scrollToOffset(toOffset, options);
357
406
  } else if (align === 'end') {
358
- _this._scrollToOffset(toOffset - size, smoothScroll);
407
+ _this._scrollToOffset(toOffset - size, options);
359
408
  } else if (align === 'center') {
360
- _this._scrollToOffset(toOffset - size / 2, smoothScroll);
409
+ _this._scrollToOffset(toOffset - size / 2, options);
361
410
  }
362
411
  };
363
412
 
364
413
  this.scrollToIndex = function (index, _temp2) {
365
414
  let {
366
415
  align = 'auto',
367
- smoothScroll = _this.options.enableSmoothScroll,
368
416
  ...rest
369
417
  } = _temp2 === void 0 ? {} : _temp2;
370
418
 
@@ -397,7 +445,6 @@ class Virtualizer {
397
445
 
398
446
  _this.scrollToOffset(toOffset, {
399
447
  align,
400
- smoothScroll,
401
448
  ...rest
402
449
  });
403
450
  };
@@ -408,10 +455,10 @@ class Virtualizer {
408
455
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
409
456
  };
410
457
 
411
- this._scrollToOffset = (offset, canSmooth) => {
458
+ this._scrollToOffset = (offset, options) => {
412
459
  clearTimeout(this.scrollCheckFrame);
413
460
  this.destinationOffset = offset;
414
- this.options.scrollToFn(offset, canSmooth, this);
461
+ this.options.scrollToFn(offset, options, this);
415
462
  let scrollCheckFrame;
416
463
 
417
464
  const check = () => {
@@ -468,12 +515,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
468
515
  }
469
516
  };
470
517
 
471
- function calculateRange(_ref2) {
518
+ function calculateRange(_ref4) {
472
519
  let {
473
520
  measurements,
474
521
  outerSize,
475
522
  scrollOffset
476
- } = _ref2;
523
+ } = _ref4;
477
524
  const count = measurements.length - 1;
478
525
 
479
526
  const getOffset = index => measurements[index].start;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.calculateRange()\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 !== 'production' && '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 const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align = 'start', smoothScroll = this.options.enableSmoothScroll }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n 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","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","calculateRange","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.isScrolling = true\n this.scrollOffset = offset\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n {\n canSmooth: false,\n sync: false,\n },\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', ...rest }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, options, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","scrollingDelay","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -135,7 +135,8 @@ const createOffsetObserver = mode => {
135
135
  let prevY = instance.scrollElement[propY];
136
136
 
137
137
  const scroll = () => {
138
- cb(instance.scrollElement[instance.options.horizontal ? propX : propY]);
138
+ const offset = instance.scrollElement[instance.options.horizontal ? propX : propY];
139
+ cb(Math.max(0, offset - instance.options.scrollMargin));
139
140
  };
140
141
 
141
142
  scroll();
@@ -168,17 +169,29 @@ const observeWindowOffset = createOffsetObserver('window');
168
169
  const measureElement = (element, instance) => {
169
170
  return element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height'];
170
171
  };
171
- const windowScroll = (offset, canSmooth, instance) => {
172
+ const windowScroll = (offset, _ref, instance) => {
172
173
  var _instance$scrollEleme;
174
+
175
+ let {
176
+ canSmooth,
177
+ sync
178
+ } = _ref;
179
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
173
180
  (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo({
174
- [instance.options.horizontal ? 'left' : 'top']: offset,
181
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
175
182
  behavior: canSmooth ? 'smooth' : undefined
176
183
  });
177
184
  };
178
- const elementScroll = (offset, canSmooth, instance) => {
185
+ const elementScroll = (offset, _ref2, instance) => {
179
186
  var _instance$scrollEleme2;
187
+
188
+ let {
189
+ canSmooth,
190
+ sync
191
+ } = _ref2;
192
+ const toOffset = sync ? offset : offset + instance.options.scrollMargin;
180
193
  (_instance$scrollEleme2 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme2.scrollTo == null ? void 0 : _instance$scrollEleme2.scrollTo({
181
- [instance.options.horizontal ? 'left' : 'top']: offset,
194
+ [instance.options.horizontal ? 'left' : 'top']: toOffset,
182
195
  behavior: canSmooth ? 'smooth' : undefined
183
196
  });
184
197
  };
@@ -188,6 +201,8 @@ class Virtualizer {
188
201
 
189
202
  this.unsubs = [];
190
203
  this.scrollElement = null;
204
+ this.isScrolling = false;
205
+ this.isScrollingTimeoutId = null;
191
206
  this.measurementsCache = [];
192
207
  this.itemMeasurementsCache = {};
193
208
  this.pendingMeasuredCacheIndexes = [];
@@ -198,8 +213,8 @@ class Virtualizer {
198
213
  };
199
214
 
200
215
  this.setOptions = opts => {
201
- Object.entries(opts).forEach(_ref => {
202
- let [key, value] = _ref;
216
+ Object.entries(opts).forEach(_ref3 => {
217
+ let [key, value] = _ref3;
203
218
  if (typeof value === 'undefined') delete opts[key];
204
219
  });
205
220
  this.options = {
@@ -220,6 +235,8 @@ class Virtualizer {
220
235
  width: 0,
221
236
  height: 0
222
237
  },
238
+ scrollMargin: 0,
239
+ scrollingDelay: 150,
223
240
  ...opts
224
241
  };
225
242
  };
@@ -248,14 +265,38 @@ class Virtualizer {
248
265
  if (this.scrollElement !== scrollElement) {
249
266
  this.cleanup();
250
267
  this.scrollElement = scrollElement;
268
+
269
+ this._scrollToOffset(this.scrollOffset, {
270
+ canSmooth: false,
271
+ sync: true
272
+ });
273
+
251
274
  this.unsubs.push(this.options.observeElementRect(this, rect => {
252
275
  this.scrollRect = rect;
253
276
  this.calculateRange();
254
277
  }));
255
278
  this.unsubs.push(this.options.observeElementOffset(this, offset => {
256
- this.scrollOffset = offset;
279
+ if (this.isScrollingTimeoutId !== null) {
280
+ clearTimeout(this.isScrollingTimeoutId);
281
+ this.isScrollingTimeoutId = null;
282
+ }
283
+
284
+ if (this.scrollOffset !== offset) {
285
+ this.isScrolling = true;
286
+ this.scrollOffset = offset;
287
+ this.isScrollingTimeoutId = setTimeout(() => {
288
+ this.isScrollingTimeoutId = null;
289
+ this.isScrolling = false;
290
+ this.notify();
291
+ }, this.options.scrollingDelay);
292
+ } else {
293
+ this.isScrolling = false;
294
+ }
295
+
257
296
  this.calculateRange();
258
297
  }));
298
+ } else if (!this.isScrolling) {
299
+ this.calculateRange();
259
300
  }
260
301
  };
261
302
 
@@ -335,7 +376,10 @@ class Virtualizer {
335
376
  }
336
377
 
337
378
  if (!this.destinationOffset) {
338
- this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), false);
379
+ this._scrollToOffset(this.scrollOffset + (measuredItemSize - itemSize), {
380
+ canSmooth: false,
381
+ sync: false
382
+ });
339
383
  }
340
384
  }
341
385
 
@@ -387,19 +431,23 @@ class Virtualizer {
387
431
  }
388
432
  }
389
433
 
434
+ const options = {
435
+ canSmooth: smoothScroll,
436
+ sync: false
437
+ };
438
+
390
439
  if (align === 'start') {
391
- _this._scrollToOffset(toOffset, smoothScroll);
440
+ _this._scrollToOffset(toOffset, options);
392
441
  } else if (align === 'end') {
393
- _this._scrollToOffset(toOffset - size, smoothScroll);
442
+ _this._scrollToOffset(toOffset - size, options);
394
443
  } else if (align === 'center') {
395
- _this._scrollToOffset(toOffset - size / 2, smoothScroll);
444
+ _this._scrollToOffset(toOffset - size / 2, options);
396
445
  }
397
446
  };
398
447
 
399
448
  this.scrollToIndex = function (index, _temp2) {
400
449
  let {
401
450
  align = 'auto',
402
- smoothScroll = _this.options.enableSmoothScroll,
403
451
  ...rest
404
452
  } = _temp2 === void 0 ? {} : _temp2;
405
453
 
@@ -432,7 +480,6 @@ class Virtualizer {
432
480
 
433
481
  _this.scrollToOffset(toOffset, {
434
482
  align,
435
- smoothScroll,
436
483
  ...rest
437
484
  });
438
485
  };
@@ -443,10 +490,10 @@ class Virtualizer {
443
490
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
444
491
  };
445
492
 
446
- this._scrollToOffset = (offset, canSmooth) => {
493
+ this._scrollToOffset = (offset, options) => {
447
494
  clearTimeout(this.scrollCheckFrame);
448
495
  this.destinationOffset = offset;
449
- this.options.scrollToFn(offset, canSmooth, this);
496
+ this.options.scrollToFn(offset, options, this);
450
497
  let scrollCheckFrame;
451
498
 
452
499
  const check = () => {
@@ -503,12 +550,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
503
550
  }
504
551
  };
505
552
 
506
- function calculateRange(_ref2) {
553
+ function calculateRange(_ref4) {
507
554
  let {
508
555
  measurements,
509
556
  outerSize,
510
557
  scrollOffset
511
- } = _ref2;
558
+ } = _ref4;
512
559
  const count = measurements.length - 1;
513
560
 
514
561
  const getOffset = index => measurements[index].start;