@tanstack/virtual-core 3.0.0-beta.22 → 3.0.0-beta.26

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