@tanstack/virtual-core 3.0.0-beta.23 → 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,109 +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;
345
+ const itemSize = this.itemMeasurementsCache[item.key] ?? item.size;
397
346
  const delta = measuredItemSize - itemSize;
398
-
399
347
  if (delta !== 0) {
400
- if (item.start < this.scrollOffset && this.isScrolling && this.destinationOffset === undefined) {
348
+ if (item.start < this.scrollOffset && this.isScrolling) {
401
349
  if (process.env.NODE_ENV !== 'production' && this.options.debug) {
402
350
  console.info('correction', delta);
403
351
  }
404
-
405
- this.scrollDelta += delta;
406
-
407
- this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
408
- canSmooth: false,
409
- sync: false,
410
- requested: false
352
+ this._scrollToOffset(this.scrollOffset, {
353
+ adjustments: this.scrollAdjustments += delta,
354
+ behavior: undefined,
355
+ sync: false
411
356
  });
412
357
  }
413
-
414
358
  this.pendingMeasuredCacheIndexes.push(index);
415
- this.itemMeasurementsCache = { ...this.itemMeasurementsCache,
359
+ this.itemMeasurementsCache = {
360
+ ...this.itemMeasurementsCache,
416
361
  [item.key]: measuredItemSize
417
362
  };
418
363
  this.notify();
419
364
  }
420
365
  };
421
-
422
366
  this.measureElement = node => {
423
367
  if (!node) {
424
368
  return;
425
369
  }
426
-
427
370
  this._measureElement(node, true);
428
371
  };
429
-
430
372
  this.getVirtualItems = utils.memo(() => [this.getIndexes(), this.getMeasurements()], (indexes, measurements) => {
431
373
  const virtualItems = [];
432
-
433
374
  for (let k = 0, len = indexes.length; k < len; k++) {
434
375
  const i = indexes[k];
435
376
  const measurement = measurements[i];
436
377
  virtualItems.push(measurement);
437
378
  }
438
-
439
379
  return virtualItems;
440
380
  }, {
441
381
  key: process.env.NODE_ENV !== 'production' && 'getIndexes',
442
382
  debug: () => this.options.debug
443
383
  });
444
-
445
384
  this.scrollToOffset = function (toOffset, _temp) {
446
385
  let {
447
386
  align = 'start',
448
- smoothScroll = _this.options.enableSmoothScroll
387
+ behavior
449
388
  } = _temp === void 0 ? {} : _temp;
450
389
  const offset = _this.scrollOffset;
451
-
452
390
  const size = _this.getSize();
453
-
454
391
  if (align === 'auto') {
455
392
  if (toOffset <= offset) {
456
393
  align = 'start';
@@ -460,13 +397,11 @@ class Virtualizer {
460
397
  align = 'start';
461
398
  }
462
399
  }
463
-
464
400
  const options = {
465
- canSmooth: smoothScroll,
466
- sync: false,
467
- requested: true
401
+ adjustments: undefined,
402
+ behavior,
403
+ sync: false
468
404
  };
469
-
470
405
  if (align === 'start') {
471
406
  _this._scrollToOffset(toOffset, options);
472
407
  } else if (align === 'end') {
@@ -475,29 +410,21 @@ class Virtualizer {
475
410
  _this._scrollToOffset(toOffset - size / 2, options);
476
411
  }
477
412
  };
478
-
479
413
  this.scrollToIndex = function (index, _temp2) {
480
414
  let {
481
415
  align = 'auto',
482
- smoothScroll = _this.options.enableSmoothScroll,
483
416
  ...rest
484
417
  } = _temp2 === void 0 ? {} : _temp2;
485
-
486
418
  const measurements = _this.getMeasurements();
487
-
488
419
  const offset = _this.scrollOffset;
489
-
490
420
  const size = _this.getSize();
491
-
492
421
  const {
493
422
  count
494
423
  } = _this.options;
495
424
  const measurement = measurements[Math.max(0, Math.min(index, count - 1))];
496
-
497
425
  if (!measurement) {
498
426
  return;
499
427
  }
500
-
501
428
  if (align === 'auto') {
502
429
  if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
503
430
  align = 'end';
@@ -507,78 +434,42 @@ class Virtualizer {
507
434
  return;
508
435
  }
509
436
  }
510
-
511
437
  const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
512
-
513
438
  _this.scrollToOffset(toOffset, {
514
439
  align,
515
- smoothScroll,
516
440
  ...rest
517
441
  });
518
442
  };
519
-
520
443
  this.getTotalSize = () => {
521
444
  var _this$getMeasurements;
522
-
523
445
  return (((_this$getMeasurements = this.getMeasurements()[this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || this.options.paddingStart) + this.options.paddingEnd;
524
446
  };
525
-
526
447
  this._scrollToOffset = (offset, _ref4) => {
527
448
  let {
528
- requested,
529
- canSmooth,
449
+ adjustments,
450
+ behavior,
530
451
  sync
531
452
  } = _ref4;
532
- clearTimeout(this.scrollCheckFrame);
533
-
534
- if (requested) {
535
- this.destinationOffset = offset;
536
- }
537
-
538
453
  this.options.scrollToFn(offset, {
539
- canSmooth,
540
- sync
454
+ behavior,
455
+ sync,
456
+ adjustments
541
457
  }, this);
542
- let scrollCheckFrame;
543
-
544
- const check = () => {
545
- let lastOffset = this.scrollOffset;
546
- this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {
547
- if (this.scrollCheckFrame !== scrollCheckFrame) {
548
- return;
549
- }
550
-
551
- if (this.scrollOffset === lastOffset) {
552
- this.destinationOffset = undefined;
553
- return;
554
- }
555
-
556
- lastOffset = this.scrollOffset;
557
- check();
558
- }, 100);
559
- };
560
-
561
- check();
562
458
  };
563
-
564
459
  this.measure = () => {
565
460
  this.itemMeasurementsCache = {};
566
461
  this.notify();
567
462
  };
568
-
569
463
  this.setOptions(_opts);
570
464
  this.scrollRect = this.options.initialRect;
571
465
  this.scrollOffset = this.options.initialOffset;
572
466
  this.calculateRange();
573
467
  }
574
-
575
468
  }
576
-
577
469
  const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
578
470
  while (low <= high) {
579
471
  const middle = (low + high) / 2 | 0;
580
472
  const currentValue = getCurrentValue(middle);
581
-
582
473
  if (currentValue < value) {
583
474
  low = middle + 1;
584
475
  } else if (currentValue > value) {
@@ -587,14 +478,12 @@ const findNearestBinarySearch = (low, high, getCurrentValue, value) => {
587
478
  return middle;
588
479
  }
589
480
  }
590
-
591
481
  if (low > 0) {
592
482
  return low - 1;
593
483
  } else {
594
484
  return 0;
595
485
  }
596
486
  };
597
-
598
487
  function calculateRange(_ref5) {
599
488
  let {
600
489
  measurements,
@@ -602,16 +491,12 @@ function calculateRange(_ref5) {
602
491
  scrollOffset
603
492
  } = _ref5;
604
493
  const count = measurements.length - 1;
605
-
606
494
  const getOffset = index => measurements[index].start;
607
-
608
495
  const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);
609
496
  let endIndex = startIndex;
610
-
611
497
  while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {
612
498
  endIndex++;
613
499
  }
614
-
615
500
  return {
616
501
  startIndex,
617
502
  endIndex