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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -134,10 +134,12 @@ class Virtualizer {
134
134
  overscan: 1,
135
135
  paddingStart: 0,
136
136
  paddingEnd: 0,
137
+ scrollPaddingStart: 0,
138
+ scrollPaddingEnd: 0,
137
139
  horizontal: false,
138
140
  getItemKey: defaultKeyExtractor,
139
141
  rangeExtractor: defaultRangeExtractor,
140
- enableSmoothScroll: false,
142
+ enableSmoothScroll: true,
141
143
  onChange: () => {},
142
144
  measureElement,
143
145
  initialRect: {
@@ -328,16 +330,16 @@ class Virtualizer {
328
330
  }
329
331
 
330
332
  if (align === 'auto') {
331
- if (measurement.end >= offset + size) {
333
+ if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
332
334
  align = 'end';
333
- } else if (measurement.start <= offset) {
335
+ } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
334
336
  align = 'start';
335
337
  } else {
336
338
  return;
337
339
  }
338
340
  }
339
341
 
340
- const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
342
+ const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
341
343
 
342
344
  _this.scrollToOffset(toOffset, {
343
345
  align,
@@ -354,7 +356,7 @@ class Virtualizer {
354
356
  this._scrollToOffset = (offset, canSmooth) => {
355
357
  clearTimeout(this.scrollCheckFrame);
356
358
  this.destinationOffset = offset;
357
- this.options.scrollToFn(offset, canSmooth, this);
359
+ this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
358
360
  let scrollCheckFrame;
359
361
 
360
362
  const check = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/index.ts"],"sourcesContent":["import observeRect from '@reach/observe-rect'\nimport { check } from 'prettier'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, canSmooth, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","console","info","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/index.ts"],"sourcesContent":["import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","console","info","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;;;;;;;;AA2CA;AAEaA,MAAAA,mBAAmB,GAAIC,KAAD,IAAmBA,MAA/C;AAEMC,MAAAA,qBAAqB,GAAIC,KAAD,IAAkB;AACrD,EAAA,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAL,CAASH,KAAK,CAACI,UAAN,GAAmBJ,KAAK,CAACK,QAAlC,EAA4C,CAA5C,CAAd,CAAA;AACA,EAAA,MAAMC,GAAG,GAAGJ,IAAI,CAACK,GAAL,CAASP,KAAK,CAACQ,QAAN,GAAiBR,KAAK,CAACK,QAAhC,EAA0CL,KAAK,CAACS,KAAN,GAAc,CAAxD,CAAZ,CAAA;EAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;EAEA,KAAK,IAAIC,CAAC,GAAGV,KAAb,EAAoBU,CAAC,IAAIL,GAAzB,EAA8BK,CAAC,EAA/B,EAAmC;IACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAOD,GAAP,CAAA;AACD,EAXM;MAaMG,kBAAkB,GAAG,CAChCC,QADgC,EAEhCC,EAFgC,KAG7B;EACH,MAAMC,QAAQ,GAAGC,0BAAW,CAACH,QAAQ,CAACI,aAAV,EAAqCC,IAAD,IAAU;IACxEJ,EAAE,CAACI,IAAD,CAAF,CAAA;AACD,GAF2B,CAA5B,CAAA;;AAIA,EAAA,IAAI,CAACL,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;AAEDH,EAAAA,EAAE,CAACD,QAAQ,CAACI,aAAT,CAAuBE,qBAAvB,EAAD,CAAF,CAAA;AAEAJ,EAAAA,QAAQ,CAACK,OAAT,EAAA,CAAA;AAEA,EAAA,OAAO,MAAM;AACXL,IAAAA,QAAQ,CAACM,SAAT,EAAA,CAAA;GADF,CAAA;AAGD,EAnBM;MAqBMC,iBAAiB,GAAG,CAC/BT,QAD+B,EAE/BC,EAF+B,KAG5B;EACH,MAAMS,QAAQ,GAAG,MAAM;AACrBT,IAAAA,EAAE,CAAC;AACDU,MAAAA,KAAK,EAAEX,QAAQ,CAACI,aAAT,CAAuBQ,UAD7B;AAEDC,MAAAA,MAAM,EAAEb,QAAQ,CAACI,aAAT,CAAuBU,WAAAA;AAF9B,KAAD,CAAF,CAAA;GADF,CAAA;;AAOA,EAAA,IAAI,CAACd,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDM,QAAQ,EAAA,CAAA;EAERV,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDL,QAAlD,EAA4D;AAC1DM,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDR,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMS,oBAAoB,GAAG,CAClCnB,QADkC,EAElCC,EAFkC,KAG/B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,YAA9B,GAA6C,WAD/C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMG,mBAAmB,GAAG,CACjCvB,QADiC,EAEjCC,EAFiC,KAG9B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,SAA9B,GAA0C,SAD5C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMI,cAAc,GAAG,CAC5BC,OAD4B,EAE5BzB,QAF4B,KAGzB;AACH,EAAA,OAAQyB,OAAD,CAAqBnB,qBAArB,EAAA,CACLN,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,OAA9B,GAAwC,QADnC,CAAP,CAAA;AAGD,EAPM;AASA,MAAMI,YAAY,GAAG,CAC1BC,MAD0B,EAE1BC,SAF0B,EAG1B5B,QAH0B,KAIvB;AAAA,EAAA,IAAA,qBAAA,CAAA;AACF,EAAA,CAAA,qBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoCyB,QAApC,CAA6C;IAC5C,CAAC7B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDK,MADJ;AAE5CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAWA,MAAMC,aAAa,GAAG,CAC3BL,MAD2B,EAE3BC,SAF2B,EAG3B5B,QAH2B,KAIxB;AAAA,EAAA,IAAA,sBAAA,CAAA;AACF,EAAA,CAAA,sBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqCyB,QAArC,CAA8C;IAC7C,CAAC7B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDK,MADH;AAE7CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAuDA,MAAME,WAAN,CAAoE;EAYzEC,WAAW,CAACC,KAAD,EAAyD;AAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;IAAA,IAX5DC,CAAAA,MAW4D,GAX1B,EAW0B,CAAA;IAAA,IATpEhC,CAAAA,aASoE,GAT7B,IAS6B,CAAA;IAAA,IAR5DiC,CAAAA,iBAQ4D,GARhC,EAQgC,CAAA;IAAA,IAP5DC,CAAAA,qBAO4D,GAPf,EAOe,CAAA;IAAA,IAN5DC,CAAAA,2BAM4D,GANpB,EAMoB,CAAA;;IAAA,IAMpEC,CAAAA,UANoE,GAMtDL,IAAD,IAA4D;AACvEM,MAAAA,MAAM,CAACC,OAAP,CAAeP,IAAf,CAAqBQ,CAAAA,OAArB,CAA6B,IAAkB,IAAA;AAAA,QAAA,IAAjB,CAACC,GAAD,EAAMC,KAAN,CAAiB,GAAA,IAAA,CAAA;QAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQV,IAAD,CAAcS,GAAd,CAAP,CAAA;OADpC,CAAA,CAAA;AAIA,MAAA,IAAA,CAAKvB,OAAL,GAAe;AACbyB,QAAAA,KAAK,EAAE,KADM;AAEbC,QAAAA,aAAa,EAAE,CAFF;AAGbxD,QAAAA,QAAQ,EAAE,CAHG;AAIbyD,QAAAA,YAAY,EAAE,CAJD;AAKbC,QAAAA,UAAU,EAAE,CALC;AAMbC,QAAAA,kBAAkB,EAAE,CANP;AAObC,QAAAA,gBAAgB,EAAE,CAPL;AAQb7B,QAAAA,UAAU,EAAE,KARC;AASb8B,QAAAA,UAAU,EAAErE,mBATC;AAUbsE,QAAAA,cAAc,EAAEpE,qBAVH;AAWbqE,QAAAA,kBAAkB,EAAE,IAXP;QAYbC,QAAQ,EAAE,MAAM,EAZH;QAab/B,cAba;AAcbgC,QAAAA,WAAW,EAAE;AAAE7C,UAAAA,KAAK,EAAE,CAAT;AAAYE,UAAAA,MAAM,EAAE,CAAA;SAdpB;QAeb,GAAGsB,IAAAA;OAfL,CAAA;KAXkE,CAAA;;IAAA,IA8B5DsB,CAAAA,MA9B4D,GA8BnD,MAAM;AAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;AACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAKpC,OAAL,EAAakC,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;KA/BkE,CAAA;;IAAA,IAkC5DG,CAAAA,OAlC4D,GAkClD,MAAM;MACtB,IAAKtB,CAAAA,MAAL,CAAYuB,MAAZ,CAAmBC,OAAnB,CAA4BjB,CAAAA,OAA5B,CAAqCkB,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;MACA,IAAKzB,CAAAA,MAAL,GAAc,EAAd,CAAA;KApCkE,CAAA;;IAAA,IAuCpE0B,CAAAA,SAvCoE,GAuCxD,MAAM;AAChB,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;OADF,CAAA;KAxCkE,CAAA;;IAAA,IA6CpEK,CAAAA,WA7CoE,GA6CtD,MAAM;AAClB,MAAA,MAAM3D,aAAa,GAAG,IAAA,CAAKiB,OAAL,CAAa2C,gBAAb,EAAtB,CAAA;;AAEA,MAAA,IAAI,IAAK5D,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;AACxC,QAAA,IAAA,CAAKsD,OAAL,EAAA,CAAA;QAEA,IAAKtD,CAAAA,aAAL,GAAqBA,aAArB,CAAA;AAEA,QAAA,IAAA,CAAKgC,MAAL,CAAYtC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAatB,kBAAb,CAAgC,IAAhC,EAAuCM,IAAD,IAAU;UAC9C,IAAK4D,CAAAA,UAAL,GAAkB5D,IAAlB,CAAA;AACA,UAAA,IAAA,CAAKoD,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAOA,QAAA,IAAA,CAAKrB,MAAL,CAAYtC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAaF,oBAAb,CAAkC,IAAlC,EAAyCQ,MAAD,IAAY;UAClD,IAAKuC,CAAAA,YAAL,GAAoBvC,MAApB,CAAA;AACA,UAAA,IAAA,CAAK8B,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAMD,OAAA;KAlEiE,CAAA;;IAAA,IAqE5DU,CAAAA,OArE4D,GAqElD,MAAM;MACtB,OAAO,IAAA,CAAKF,UAAL,CAAgB,IAAK5C,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAApD,CAAP,CAAA;KAtEkE,CAAA;;AAAA,IAAA,IAAA,CAyE5D8C,eAzE4D,GAyE1CC,UAAI,CAC5B,MAAM,CACJ,IAAA,CAAKhD,OAAL,CAAa1B,KADT,EAEJ,IAAK0B,CAAAA,OAAL,CAAa2B,YAFT,EAGJ,IAAK3B,CAAAA,OAAL,CAAa+B,UAHT,EAIJ,IAAA,CAAKd,qBAJD,CADsB,EAO5B,CAAC3C,KAAD,EAAQqD,YAAR,EAAsBI,UAAtB,EAAkCf,iBAAlC,KAAwD;AACtD,MAAA,MAAM5C,GAAG,GACP,IAAA,CAAK8C,2BAAL,CAAiC+B,MAAjC,GAA0C,CAA1C,GACIlF,IAAI,CAACK,GAAL,CAAS,GAAG,KAAK8C,2BAAjB,CADJ,GAEI,CAHN,CAAA;MAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;MAEA,MAAMgC,YAAY,GAAG,IAAA,CAAKlC,iBAAL,CAAuBmC,KAAvB,CAA6B,CAA7B,EAAgC/E,GAAhC,CAArB,CAAA;;MAEA,KAAK,IAAII,CAAC,GAAGJ,GAAb,EAAkBI,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;AAChC,QAAA,MAAM+C,GAAG,GAAGQ,UAAU,CAACvD,CAAD,CAAtB,CAAA;AACA,QAAA,MAAM4E,YAAY,GAAGpC,iBAAiB,CAACO,GAAD,CAAtC,CAAA;AACA,QAAA,MAAMzD,KAAK,GAAGoF,YAAY,CAAC1E,CAAC,GAAG,CAAL,CAAZ,GACV0E,YAAY,CAAC1E,CAAC,GAAG,CAAL,CAAZ,CAAqBL,GADX,GAEVwD,YAFJ,CAAA;AAGA,QAAA,MAAM0B,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GACIA,YADJ,GAEI,KAAKpD,OAAL,CAAasD,YAAb,CAA0B9E,CAA1B,CAHN,CAAA;AAIA,QAAA,MAAML,GAAG,GAAGL,KAAK,GAAGuF,IAApB,CAAA;QACAH,YAAY,CAAC1E,CAAD,CAAZ,GAAkB;AAAEb,UAAAA,KAAK,EAAEa,CAAT;UAAYV,KAAZ;UAAmBuF,IAAnB;UAAyBlF,GAAzB;AAA8BoD,UAAAA,GAAAA;SAAhD,CAAA;AACD,OAAA;;MAED,IAAKP,CAAAA,iBAAL,GAAyBkC,YAAzB,CAAA;AACA,MAAA,OAAOA,YAAP,CAAA;AACD,KAhC2B,EAiC5B;MACE3B,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,iBADjD;AAEEhC,MAAAA,KAAK,EAAE,MAAM,IAAKzB,CAAAA,OAAL,CAAayB,KAAAA;AAF5B,KAjC4B,CAzEsC,CAAA;IAAA,IAgH5DiC,CAAAA,cAhH4D,GAgH3CV,UAAI,CAC3B,MAAM,CAAC,IAAKD,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKD,YAA9C,CADqB,EAE3B,CAACK,YAAD,EAAeS,SAAf,EAA0Bd,YAA1B,KAA2C;AACzC,MAAA,OAAOa,cAAc,CAAC;QACpBR,YADoB;QAEpBS,SAFoB;AAGpBd,QAAAA,YAAAA;AAHoB,OAAD,CAArB,CAAA;AAKD,KAR0B,EAS3B;MACEtB,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,gBADjD;AAEEhC,MAAAA,KAAK,EAAE,MAAM,IAAKzB,CAAAA,OAAL,CAAayB,KAAAA;AAF5B,KAT2B,CAhHuC,CAAA;AAAA,IAAA,IAAA,CA+H5DmC,UA/H4D,GA+H/CZ,UAAI,CACvB,MAAM,CACJ,IAAA,CAAKhD,OAAL,CAAagC,cADT,EAEJ,IAAA,CAAK0B,cAAL,EAFI,EAGJ,IAAK1D,CAAAA,OAAL,CAAa9B,QAHT,EAIJ,IAAA,CAAK8B,OAAL,CAAa1B,KAJT,CADiB,EAOvB,CAAC0D,cAAD,EAAiBnE,KAAjB,EAAwBK,QAAxB,EAAkCI,KAAlC,KAA4C;AAC1C,MAAA,OAAO0D,cAAc,CAAC,EACpB,GAAGnE,KADiB;QAEpBK,QAFoB;AAGpBI,QAAAA,KAAK,EAAEA,KAAAA;AAHa,OAAD,CAArB,CAAA;AAKD,KAbsB,EAcvB;MACEiD,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAduB,CA/H2C,CAAA;IAAA,IAkJpEI,CAAAA,eAlJoE,GAkJlDb,UAAI,CACpB,MAAM,CACJ,IAAA,CAAKY,UAAL,EADI,EAEJ,IAAA,CAAKb,eAAL,EAFI,EAGJ,IAAK/C,CAAAA,OAAL,CAAaG,cAHT,CADc,EAMpB,CAAC2D,OAAD,EAAUZ,YAAV,EAAwB/C,cAAxB,KAA2C;MACzC,MAAM4D,YAAyC,GAAG,EAAlD,CAAA;;AAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGH,OAAO,CAACb,MAA9B,EAAsCe,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;AAClD,QAAA,MAAMxF,CAAC,GAAGsF,OAAO,CAACE,CAAD,CAAjB,CAAA;AACA,QAAA,MAAME,WAAW,GAAGhB,YAAY,CAAC1E,CAAD,CAAhC,CAAA;AAEA,QAAA,MAAM2F,IAAI,GAAG,EACX,GAAGD,WADQ;UAEX/D,cAAc,EAAGiE,cAAD,IAAyC;AACvD,YAAA,IAAIA,cAAJ,EAAoB;AAClB,cAAA,MAAMC,gBAAgB,GAAGlE,cAAc,CAACiE,cAAD,EAAiB,IAAjB,CAAvC,CAAA;;AAEA,cAAA,IAAIC,gBAAgB,KAAKF,IAAI,CAACd,IAA9B,EAAoC;AAClC,gBAAA,IAAIc,IAAI,CAACrG,KAAL,GAAa,IAAA,CAAK+E,YAAtB,EAAoC;kBAClC,IACEU,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IACA,IAAA,CAAKzD,OAAL,CAAayB,KAFf,EAIE6C,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2BF,gBAAgB,GAAGF,IAAI,CAACd,IAAnD,CAAA,CAAA;;kBAEF,IAAI,CAAC,IAAKmB,CAAAA,iBAAV,EAA6B;AAC3B,oBAAA,IAAA,CAAKC,eAAL,CACE,IAAK5B,CAAAA,YAAL,IAAqBwB,gBAAgB,GAAGF,IAAI,CAACd,IAA7C,CADF,EAEE,KAFF,CAAA,CAAA;AAID,mBAAA;AACF,iBAAA;;AAED,gBAAA,IAAA,CAAKnC,2BAAL,CAAiCzC,IAAjC,CAAsCD,CAAtC,CAAA,CAAA;AACA,gBAAA,IAAA,CAAKyC,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;kBAE3B,CAACkD,IAAI,CAAC5C,GAAN,GAAY8C,gBAAAA;iBAFd,CAAA;AAIA,gBAAA,IAAA,CAAKjC,MAAL,EAAA,CAAA;AACD,eAAA;AACF,aAAA;AACF,WAAA;SA9BH,CAAA;QAiCA2B,YAAY,CAACtF,IAAb,CAAkB0F,IAAlB,CAAA,CAAA;AACD,OAAA;;AAED,MAAA,OAAOJ,YAAP,CAAA;AACD,KAlDmB,EAmDpB;MACExC,GAAG,EAAEgC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAnDoB,CAlJ8C,CAAA;;AAAA,IAAA,IAAA,CA0MpEiB,cA1MoE,GA0MnD,UACfC,QADe,EAGZ,KAAA,EAAA;MAAA,IADH;AAAEC,QAAAA,KAAAA;AAAF,OACG,GADgC,KAAA,KAAA,KAAA,CAAA,GAAA;AAAEA,QAAAA,KAAK,EAAE,OAAA;OACzC,GAAA,KAAA,CAAA;;MACH,MAAMC,OAAO,GAAG,MAAM;AACpB,QAAA,MAAMvE,MAAM,GAAG,KAAI,CAACuC,YAApB,CAAA;;AACA,QAAA,MAAMQ,IAAI,GAAG,KAAI,CAACP,OAAL,EAAb,CAAA;;QAEA,IAAI8B,KAAK,KAAK,MAAd,EAAsB;UACpB,IAAID,QAAQ,IAAIrE,MAAhB,EAAwB;AACtBsE,YAAAA,KAAK,GAAG,OAAR,CAAA;AACD,WAFD,MAEO,IAAID,QAAQ,IAAIrE,MAAM,GAAG+C,IAAzB,EAA+B;AACpCuB,YAAAA,KAAK,GAAG,KAAR,CAAA;AACD,WAFM,MAEA;AACLA,YAAAA,KAAK,GAAG,OAAR,CAAA;AACD,WAAA;AACF,SAAA;;QAED,IAAIA,KAAK,KAAK,OAAd,EAAuB;AACrB,UAAA,KAAI,CAACH,eAAL,CAAqBE,QAArB,EAA+B,IAA/B,CAAA,CAAA;AACD,SAFD,MAEO,IAAIC,KAAK,KAAK,KAAd,EAAqB;AAC1B,UAAA,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGtB,IAAhC,EAAsC,IAAtC,CAAA,CAAA;AACD,SAFM,MAEA,IAAIuB,KAAK,KAAK,QAAd,EAAwB;UAC7B,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGtB,IAAI,GAAG,CAAvC,EAA0C,IAA1C,CAAA,CAAA;AACD,SAAA;OApBH,CAAA;;MAuBAwB,OAAO,EAAA,CAAA;AACPC,MAAAA,qBAAqB,CAAC,MAAM;QAC1BD,OAAO,EAAA,CAAA;AACR,OAFoB,CAArB,CAAA;KAtOkE,CAAA;;AAAA,IAAA,IAAA,CA2OpEE,aA3OoE,GA2OpD,UACdpH,KADc,EAGX,MAAA,EAAA;MAAA,IADH;QAAEiH,KAAF;QAAS,GAAGI,IAAAA;AAAZ,OACG,GADwC,MAAA,KAAA,KAAA,CAAA,GAAA;AAAEJ,QAAAA,KAAK,EAAE,MAAA;OACjD,GAAA,MAAA,CAAA;;AACH,MAAA,MAAM1B,YAAY,GAAG,KAAI,CAACH,eAAL,EAArB,CAAA;;AACA,MAAA,MAAMzC,MAAM,GAAG,KAAI,CAACuC,YAApB,CAAA;;AACA,MAAA,MAAMQ,IAAI,GAAG,KAAI,CAACP,OAAL,EAAb,CAAA;;MACA,MAAM;AAAExE,QAAAA,KAAAA;OAAU,GAAA,KAAI,CAAC0B,OAAvB,CAAA;MAEA,MAAMkE,WAAW,GAAGhB,YAAY,CAACnF,IAAI,CAACC,GAAL,CAAS,CAAT,EAAYD,IAAI,CAACK,GAAL,CAAST,KAAT,EAAgBW,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;MAEA,IAAI,CAAC4F,WAAL,EAAkB;AAChB,QAAA,OAAA;AACD,OAAA;;MAED,IAAIU,KAAK,KAAK,MAAd,EAAsB;AACpB,QAAA,IAAIV,WAAW,CAAC/F,GAAZ,IAAmBmC,MAAM,GAAG+C,IAAT,GAAgB,KAAI,CAACrD,OAAL,CAAa8B,gBAApD,EAAsE;AACpE8C,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFD,MAEO,IACLV,WAAW,CAACpG,KAAZ,IACAwC,MAAM,GAAG,KAAI,CAACN,OAAL,CAAa6B,kBAFjB,EAGL;AACA+C,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SALM,MAKA;AACL,UAAA,OAAA;AACD,SAAA;AACF,OAAA;;MAED,MAAMD,QAAQ,GACZC,KAAK,KAAK,KAAV,GACIV,WAAW,CAAC/F,GAAZ,GAAkB,KAAI,CAAC6B,OAAL,CAAa8B,gBADnC,GAEIoC,WAAW,CAACpG,KAAZ,GAAoB,KAAI,CAACkC,OAAL,CAAa6B,kBAHvC,CAAA;;AAKA,MAAA,KAAI,CAAC6C,cAAL,CAAoBC,QAApB,EAA8B;QAAEC,KAAF;QAAS,GAAGI,IAAAA;OAA1C,CAAA,CAAA;KA5QkE,CAAA;;AAAA,IAAA,IAAA,CA+QpEC,YA/QoE,GA+QrD,MAAA;AAAA,MAAA,IAAA,qBAAA,CAAA;;MAAA,OACb,CAAC,+BAAKlC,eAAL,EAAA,CAAuB,KAAK/C,OAAL,CAAa1B,KAAb,GAAqB,CAA5C,4CAAgDH,GAAhD,KACC,KAAK6B,OAAL,CAAa2B,YADf,IAC+B,IAAA,CAAK3B,OAAL,CAAa4B,UAF/B,CAAA;KA/QqD,CAAA;;AAAA,IAAA,IAAA,CAmR5D6C,eAnR4D,GAmR1C,CAACnE,MAAD,EAAiBC,SAAjB,KAAwC;MAChE2E,YAAY,CAAC,IAAKC,CAAAA,gBAAN,CAAZ,CAAA;MAEA,IAAKX,CAAAA,iBAAL,GAAyBlE,MAAzB,CAAA;AACA,MAAA,IAAA,CAAKN,OAAL,CAAaoF,UAAb,CACE9E,MADF,EAEE,IAAKN,CAAAA,OAAL,CAAaiC,kBAAb,IAAmC1B,SAFrC,EAGE,IAHF,CAAA,CAAA;AAMA,MAAA,IAAI4E,gBAAJ,CAAA;;MAEA,MAAME,KAAK,GAAG,MAAM;QAClB,IAAIC,UAAU,GAAG,IAAA,CAAKzC,YAAtB,CAAA;AACA,QAAA,IAAA,CAAKsC,gBAAL,GAAwBA,gBAAgB,GAAGI,UAAU,CAAC,MAAM;AAC1D,UAAA,IAAI,IAAKJ,CAAAA,gBAAL,KAA0BA,gBAA9B,EAAgD;AAC9C,YAAA,OAAA;AACD,WAAA;;AAED,UAAA,IAAI,IAAKtC,CAAAA,YAAL,KAAsByC,UAA1B,EAAsC;YACpC,IAAKd,CAAAA,iBAAL,GAAyB9D,SAAzB,CAAA;AACA,YAAA,OAAA;AACD,WAAA;;UACD4E,UAAU,GAAG,KAAKzC,YAAlB,CAAA;UACAwC,KAAK,EAAA,CAAA;SAV8C,EAWlD,GAXkD,CAArD,CAAA;OAFF,CAAA;;MAgBAA,KAAK,EAAA,CAAA;KA/S6D,CAAA;;IAAA,IAkTpEG,CAAAA,OAlToE,GAkT1D,MAAM;MACd,IAAKvE,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;AACA,MAAA,IAAA,CAAKmB,MAAL,EAAA,CAAA;KApTkE,CAAA;;IAClE,IAAKjB,CAAAA,UAAL,CAAgBL,KAAhB,CAAA,CAAA;AACA,IAAA,IAAA,CAAK8B,UAAL,GAAkB,IAAK5C,CAAAA,OAAL,CAAamC,WAA/B,CAAA;AACA,IAAA,IAAA,CAAKU,YAAL,GAAoB,IAAK7C,CAAAA,OAAL,CAAa0B,aAAjC,CAAA;AACD,GAAA;;AAhBwE,CAAA;;AAoU3E,MAAM+D,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9BpE,KAJ8B,KAK3B;EACH,OAAOkE,GAAG,IAAIC,IAAd,EAAoB;IAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;AACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;IAEA,IAAIC,YAAY,GAAGtE,KAAnB,EAA0B;MACxBkE,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;AACD,KAFD,MAEO,IAAIC,YAAY,GAAGtE,KAAnB,EAA0B;MAC/BmE,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;AACD,KAFM,MAEA;AACL,MAAA,OAAOA,MAAP,CAAA;AACD,KAAA;AACF,GAAA;;EAED,IAAIH,GAAG,GAAG,CAAV,EAAa;IACX,OAAOA,GAAG,GAAG,CAAb,CAAA;AACD,GAFD,MAEO;AACL,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;AACF,CAxBD,CAAA;;AA0BA,SAAShC,cAAT,CAQG,KAAA,EAAA;EAAA,IARqB;IACtBR,YADsB;IAEtBS,SAFsB;AAGtBd,IAAAA,YAAAA;GAKC,GAAA,KAAA,CAAA;AACD,EAAA,MAAMvE,KAAK,GAAG4E,YAAY,CAACD,MAAb,GAAsB,CAApC,CAAA;;EACA,MAAM8C,SAAS,GAAIpI,KAAD,IAAmBuF,YAAY,CAACvF,KAAD,CAAZ,CAAqBG,KAA1D,CAAA;;EAEA,MAAMG,UAAU,GAAGwH,uBAAuB,CAAC,CAAD,EAAInH,KAAJ,EAAWyH,SAAX,EAAsBlD,YAAtB,CAA1C,CAAA;EACA,IAAIxE,QAAQ,GAAGJ,UAAf,CAAA;;AAEA,EAAA,OACEI,QAAQ,GAAGC,KAAX,IACA4E,YAAY,CAAC7E,QAAD,CAAZ,CAAwBF,GAAxB,GAA8B0E,YAAY,GAAGc,SAF/C,EAGE;IACAtF,QAAQ,EAAA,CAAA;AACT,GAAA;;EAED,OAAO;IAAEJ,UAAF;AAAcI,IAAAA,QAAAA;GAArB,CAAA;AACD;;;;;;;;;;;;;;"}
@@ -238,10 +238,12 @@ class Virtualizer {
238
238
  overscan: 1,
239
239
  paddingStart: 0,
240
240
  paddingEnd: 0,
241
+ scrollPaddingStart: 0,
242
+ scrollPaddingEnd: 0,
241
243
  horizontal: false,
242
244
  getItemKey: defaultKeyExtractor,
243
245
  rangeExtractor: defaultRangeExtractor,
244
- enableSmoothScroll: false,
246
+ enableSmoothScroll: true,
245
247
  onChange: () => {},
246
248
  measureElement,
247
249
  initialRect: {
@@ -432,16 +434,16 @@ class Virtualizer {
432
434
  }
433
435
 
434
436
  if (align === 'auto') {
435
- if (measurement.end >= offset + size) {
437
+ if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
436
438
  align = 'end';
437
- } else if (measurement.start <= offset) {
439
+ } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
438
440
  align = 'start';
439
441
  } else {
440
442
  return;
441
443
  }
442
444
  }
443
445
 
444
- const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
446
+ const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
445
447
 
446
448
  _this.scrollToOffset(toOffset, {
447
449
  align,
@@ -458,7 +460,7 @@ class Virtualizer {
458
460
  this._scrollToOffset = (offset, canSmooth) => {
459
461
  clearTimeout(this.scrollCheckFrame);
460
462
  this.destinationOffset = offset;
461
- this.options.scrollToFn(offset, canSmooth, this);
463
+ this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
462
464
  let scrollCheckFrame;
463
465
 
464
466
  const check = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { check } from 'prettier'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, canSmooth, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","paddingStart","paddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;AAAA,IAAI,KAAK,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAClE;AACA,IAAI,WAAW,GAAG,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE;AAC7C,EAAE,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;AACpB,IAAI,CAAC,GAAG,EAAE,CAAC;AACX,GAAG;AACH;AACA,EAAE,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;AACpB,IAAI,CAAC,GAAG,EAAE,CAAC;AACX,GAAG;AACH;AACA,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE;AACpC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/B,GAAG,CAAC,CAAC;AACL,CAAC,CAAC;AACF;AACA,IAAI,aAAa,gBAAgB,IAAI,GAAG,EAAE,CAAC;AAC3C,IAAI,KAAK,CAAC;AACV;AACA,IAAI,GAAG,GAAG,SAAS,GAAG,GAAG;AACzB,EAAE,IAAI,aAAa,GAAG,EAAE,CAAC;AACzB,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE,IAAI,EAAE;AAC/C,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC/C;AACA,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AAC1C,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;AAC3B,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,KAAK;AACL,GAAG,CAAC,CAAC;AACL,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,KAAK,EAAE;AACzC,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE;AAC1C,MAAM,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,KAAK,CAAC,CAAC;AACP,GAAG,CAAC,CAAC;AACL,EAAE,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAC;AACF;AACA,SAAS,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE;AAC/B,EAAE,OAAO;AACT,IAAI,OAAO,EAAE,SAAS,OAAO,GAAG;AAChC,MAAM,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC;AAC9C;AACA,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACnC,QAAQ,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnD,OAAO,MAAM;AACb,QAAQ,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE;AAChC,UAAU,IAAI,EAAE,SAAS;AACzB,UAAU,cAAc,EAAE,KAAK;AAC/B,UAAU,SAAS,EAAE,CAAC,EAAE,CAAC;AACzB,SAAS,CAAC,CAAC;AACX,OAAO;AACP;AACA,MAAM,IAAI,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC1B,KAAK;AACL,IAAI,SAAS,EAAE,SAAS,SAAS,GAAG;AACpC,MAAM,IAAI,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1C;AACA,MAAM,IAAI,KAAK,EAAE;AACjB;AACA,QAAQ,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChD,QAAQ,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACzD;AACA,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AACnE;AACA,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAC7D,OAAO;AACP,KAAK;AACL,GAAG,CAAC;AACJ;;AChEO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;EACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;AACA,EAAA,IAAIC,MAAJ,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,IAAIC,OAAJ,CAAA;AACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;IAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;IAEA,MAAMW,WAAW,GACfD,OAAO,CAACE,MAAR,KAAmBT,IAAI,CAACS,MAAxB,IACAF,OAAO,CAACG,IAAR,CAAa,CAACC,GAAD,EAAWC,KAAX,KAA6BZ,IAAI,CAACY,KAAD,CAAJ,KAAgBD,GAA1D,CAFF,CAAA;;IAIA,IAAI,CAACH,WAAL,EAAkB;AAChB,MAAA,OAAOP,MAAP,CAAA;AACD,KAAA;;AAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;AAEA,IAAA,IAAIM,UAAJ,CAAA;AACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;AAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;IACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;AAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;AAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;AACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;AACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;AAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;AACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;AACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;UACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;AACD,SAAA;;AACD,QAAA,OAAOA,GAAP,CAAA;OALF,CAAA;;AAQAG,MAAAA,OAAO,CAACC,IAAR,CAAA,WAAA,GACSL,GAAG,CAACF,aAAD,EAAgB,CAAhB,CADZ,GAAA,IAAA,GACmCE,GAAG,CAACL,UAAD,EAAa,CAAb,CADtC,uGAKmBC,IAAI,CAACU,GAAL,CACX,CADW,EAEXV,IAAI,CAACW,GAAL,CAAS,MAAM,GAAMR,GAAAA,mBAArB,EAA0C,GAA1C,CAFW,CALnB,GAAA,gBAAA,EASEpB,IATF,IASEA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEI,GATR,CAAA,CAAA;AAWD,KAAA;;AAED,IAAA,OAAOF,MAAP,CAAA;GAhDF,CAAA;AAkDD;;ACrBD;AAEa2B,MAAAA,mBAAmB,GAAIhB,KAAD,IAAmBA,MAA/C;AAEMiB,MAAAA,qBAAqB,GAAIC,KAAD,IAAkB;AACrD,EAAA,MAAMC,KAAK,GAAGf,IAAI,CAACU,GAAL,CAASI,KAAK,CAACE,UAAN,GAAmBF,KAAK,CAACG,QAAlC,EAA4C,CAA5C,CAAd,CAAA;AACA,EAAA,MAAMC,GAAG,GAAGlB,IAAI,CAACW,GAAL,CAASG,KAAK,CAACK,QAAN,GAAiBL,KAAK,CAACG,QAAhC,EAA0CH,KAAK,CAACM,KAAN,GAAc,CAAxD,CAAZ,CAAA;EAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;EAEA,KAAK,IAAIC,CAAC,GAAGP,KAAb,EAAoBO,CAAC,IAAIJ,GAAzB,EAA8BI,CAAC,EAA/B,EAAmC;IACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;AACD,GAAA;;AAED,EAAA,OAAOD,GAAP,CAAA;AACD,EAXM;MAaMG,kBAAkB,GAAG,CAChCC,QADgC,EAEhCC,EAFgC,KAG7B;EACH,MAAMC,QAAQ,GAAGC,WAAW,CAACH,QAAQ,CAACI,aAAV,EAAqCC,IAAD,IAAU;IACxEJ,EAAE,CAACI,IAAD,CAAF,CAAA;AACD,GAF2B,CAA5B,CAAA;;AAIA,EAAA,IAAI,CAACL,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;AAEDH,EAAAA,EAAE,CAACD,QAAQ,CAACI,aAAT,CAAuBE,qBAAvB,EAAD,CAAF,CAAA;AAEAJ,EAAAA,QAAQ,CAACK,OAAT,EAAA,CAAA;AAEA,EAAA,OAAO,MAAM;AACXL,IAAAA,QAAQ,CAACM,SAAT,EAAA,CAAA;GADF,CAAA;AAGD,EAnBM;MAqBMC,iBAAiB,GAAG,CAC/BT,QAD+B,EAE/BC,EAF+B,KAG5B;EACH,MAAMS,QAAQ,GAAG,MAAM;AACrBT,IAAAA,EAAE,CAAC;AACDU,MAAAA,KAAK,EAAEX,QAAQ,CAACI,aAAT,CAAuBQ,UAD7B;AAEDC,MAAAA,MAAM,EAAEb,QAAQ,CAACI,aAAT,CAAuBU,WAAAA;AAF9B,KAAD,CAAF,CAAA;GADF,CAAA;;AAOA,EAAA,IAAI,CAACd,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDM,QAAQ,EAAA,CAAA;EAERV,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDL,QAAlD,EAA4D;AAC1DM,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDR,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMS,oBAAoB,GAAG,CAClCnB,QADkC,EAElCC,EAFkC,KAG/B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,YAA9B,GAA6C,WAD/C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMG,mBAAmB,GAAG,CACjCvB,QADiC,EAEjCC,EAFiC,KAG9B;AACH,EAAA,MAAMmB,QAAQ,GAAG,MACfnB,EAAE,CACAD,QAAQ,CAACI,aAAT,CACEJ,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,SAA9B,GAA0C,SAD5C,CADA,CADJ,CAAA;;AAOA,EAAA,IAAI,CAACtB,QAAQ,CAACI,aAAd,EAA6B;AAC3B,IAAA,OAAA;AACD,GAAA;;EAEDgB,QAAQ,EAAA,CAAA;EAERpB,QAAQ,CAACI,aAAT,CAAuBW,gBAAvB,CAAwC,QAAxC,EAAkDK,QAAlD,EAA4D;AAC1DJ,IAAAA,OAAO,EAAE,KADiD;AAE1DC,IAAAA,OAAO,EAAE,IAAA;GAFX,CAAA,CAAA;AAKA,EAAA,OAAO,MAAM;AACXjB,IAAAA,QAAQ,CAACI,aAAT,CAAuBc,mBAAvB,CAA2C,QAA3C,EAAqDE,QAArD,CAAA,CAAA;GADF,CAAA;AAGD,EAzBM;MA2BMI,cAAc,GAAG,CAC5BC,OAD4B,EAE5BzB,QAF4B,KAGzB;AACH,EAAA,OAAQyB,OAAD,CAAqBnB,qBAArB,EAAA,CACLN,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,OAA9B,GAAwC,QADnC,CAAP,CAAA;AAGD,EAPM;AASA,MAAMI,YAAY,GAAG,CAC1BC,MAD0B,EAE1BC,SAF0B,EAG1B5B,QAH0B,KAIvB;AAAA,EAAA,IAAA,qBAAA,CAAA;AACF,EAAA,CAAA,qBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoCyB,QAApC,CAA6C;IAC5C,CAAC7B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDK,MADJ;AAE5CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAWA,MAAMC,aAAa,GAAG,CAC3BL,MAD2B,EAE3BC,SAF2B,EAG3B5B,QAH2B,KAIxB;AAAA,EAAA,IAAA,sBAAA,CAAA;AACF,EAAA,CAAA,sBAAA,GAACA,QAAQ,CAACI,aAAV,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqCyB,QAArC,CAA8C;IAC7C,CAAC7B,QAAQ,CAACqB,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgDK,MADH;AAE7CG,IAAAA,QAAQ,EAAEF,SAAS,GAAG,QAAH,GAAcG,SAAAA;GAFlC,CAAA,CAAA;AAIF,EATM;AAqDA,MAAME,WAAN,CAAoE;EAYzEC,WAAW,CAAC5E,KAAD,EAAyD;AAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;IAAA,IAX5D6E,CAAAA,MAW4D,GAX1B,EAW0B,CAAA;IAAA,IATpE/B,CAAAA,aASoE,GAT7B,IAS6B,CAAA;IAAA,IAR5DgC,CAAAA,iBAQ4D,GARhC,EAQgC,CAAA;IAAA,IAP5DC,CAAAA,qBAO4D,GAPf,EAOe,CAAA;IAAA,IAN5DC,CAAAA,2BAM4D,GANpB,EAMoB,CAAA;;IAAA,IAMpEC,CAAAA,UANoE,GAMtDjF,IAAD,IAA4D;AACvEkF,MAAAA,MAAM,CAACC,OAAP,CAAenF,IAAf,CAAqBoF,CAAAA,OAArB,CAA6B,IAAkB,IAAA;AAAA,QAAA,IAAjB,CAAChF,GAAD,EAAMiF,KAAN,CAAiB,GAAA,IAAA,CAAA;QAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQrF,IAAD,CAAcI,GAAd,CAAP,CAAA;OADpC,CAAA,CAAA;AAIA,MAAA,IAAA,CAAK2D,OAAL,GAAe;AACb1D,QAAAA,KAAK,EAAE,KADM;AAEbiF,QAAAA,aAAa,EAAE,CAFF;AAGbpD,QAAAA,QAAQ,EAAE,CAHG;AAIbqD,QAAAA,YAAY,EAAE,CAJD;AAKbC,QAAAA,UAAU,EAAE,CALC;AAMbxB,QAAAA,UAAU,EAAE,KANC;AAObyB,QAAAA,UAAU,EAAE5D,mBAPC;AAQb6D,QAAAA,cAAc,EAAE5D,qBARH;AASb6D,QAAAA,kBAAkB,EAAE,KATP;QAUb5E,QAAQ,EAAE,MAAM,EAVH;QAWbmD,cAXa;AAYb0B,QAAAA,WAAW,EAAE;AAAEvC,UAAAA,KAAK,EAAE,CAAT;AAAYE,UAAAA,MAAM,EAAE,CAAA;SAZpB;QAab,GAAGvD,IAAAA;OAbL,CAAA;KAXkE,CAAA;;IAAA,IA4B5D6F,CAAAA,MA5B4D,GA4BnD,MAAM;AAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;AACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAK9B,OAAL,EAAahD,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;KA7BkE,CAAA;;IAAA,IAgC5D+E,CAAAA,OAhC4D,GAgClD,MAAM;MACtB,IAAKjB,CAAAA,MAAL,CAAYkB,MAAZ,CAAmBC,OAAnB,CAA4BZ,CAAAA,OAA5B,CAAqCa,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;MACA,IAAKpB,CAAAA,MAAL,GAAc,EAAd,CAAA;KAlCkE,CAAA;;IAAA,IAqCpEqB,CAAAA,SArCoE,GAqCxD,MAAM;AAChB,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;OADF,CAAA;KAtCkE,CAAA;;IAAA,IA2CpEK,CAAAA,WA3CoE,GA2CtD,MAAM;AAClB,MAAA,MAAMrD,aAAa,GAAG,IAAA,CAAKiB,OAAL,CAAaqC,gBAAb,EAAtB,CAAA;;AAEA,MAAA,IAAI,IAAKtD,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;AACxC,QAAA,IAAA,CAAKgD,OAAL,EAAA,CAAA;QAEA,IAAKhD,CAAAA,aAAL,GAAqBA,aAArB,CAAA;AAEA,QAAA,IAAA,CAAK+B,MAAL,CAAYrC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAatB,kBAAb,CAAgC,IAAhC,EAAuCM,IAAD,IAAU;UAC9C,IAAKsD,CAAAA,UAAL,GAAkBtD,IAAlB,CAAA;AACA,UAAA,IAAA,CAAK8C,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAOA,QAAA,IAAA,CAAKhB,MAAL,CAAYrC,IAAZ,CACE,IAAKuB,CAAAA,OAAL,CAAaF,oBAAb,CAAkC,IAAlC,EAAyCQ,MAAD,IAAY;UAClD,IAAKiC,CAAAA,YAAL,GAAoBjC,MAApB,CAAA;AACA,UAAA,IAAA,CAAKwB,MAAL,EAAA,CAAA;AACD,SAHD,CADF,CAAA,CAAA;AAMD,OAAA;KAhEiE,CAAA;;IAAA,IAmE5DU,CAAAA,OAnE4D,GAmElD,MAAM;MACtB,OAAO,IAAA,CAAKF,UAAL,CAAgB,IAAKtC,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAApD,CAAP,CAAA;KApEkE,CAAA;;AAAA,IAAA,IAAA,CAuE5DwC,eAvE4D,GAuE1C3G,IAAI,CAC5B,MAAM,CACJ,IAAA,CAAKkE,OAAL,CAAa1B,KADT,EAEJ,IAAK0B,CAAAA,OAAL,CAAawB,YAFT,EAGJ,IAAKxB,CAAAA,OAAL,CAAa0B,UAHT,EAIJ,IAAA,CAAKV,qBAJD,CADsB,EAO5B,CAAC1C,KAAD,EAAQkD,YAAR,EAAsBE,UAAtB,EAAkCX,iBAAlC,KAAwD;AACtD,MAAA,MAAMlD,GAAG,GACP,IAAA,CAAKoD,2BAAL,CAAiCtE,MAAjC,GAA0C,CAA1C,GACIO,IAAI,CAACW,GAAL,CAAS,GAAG,KAAKoD,2BAAjB,CADJ,GAEI,CAHN,CAAA;MAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;MAEA,MAAMyB,YAAY,GAAG,IAAA,CAAK3B,iBAAL,CAAuB4B,KAAvB,CAA6B,CAA7B,EAAgC9E,GAAhC,CAArB,CAAA;;MAEA,KAAK,IAAIW,CAAC,GAAGX,GAAb,EAAkBW,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;AAChC,QAAA,MAAMnC,GAAG,GAAGqF,UAAU,CAAClD,CAAD,CAAtB,CAAA;AACA,QAAA,MAAMoE,YAAY,GAAG7B,iBAAiB,CAAC1E,GAAD,CAAtC,CAAA;AACA,QAAA,MAAM4B,KAAK,GAAGyE,YAAY,CAAClE,CAAC,GAAG,CAAL,CAAZ,GACVkE,YAAY,CAAClE,CAAC,GAAG,CAAL,CAAZ,CAAqBJ,GADX,GAEVoD,YAFJ,CAAA;AAGA,QAAA,MAAMqB,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GACIA,YADJ,GAEI,KAAK5C,OAAL,CAAa8C,YAAb,CAA0BtE,CAA1B,CAHN,CAAA;AAIA,QAAA,MAAMJ,GAAG,GAAGH,KAAK,GAAG4E,IAApB,CAAA;QACAH,YAAY,CAAClE,CAAD,CAAZ,GAAkB;AAAE1B,UAAAA,KAAK,EAAE0B,CAAT;UAAYP,KAAZ;UAAmB4E,IAAnB;UAAyBzE,GAAzB;AAA8B/B,UAAAA,GAAAA;SAAhD,CAAA;AACD,OAAA;;MAED,IAAK0E,CAAAA,iBAAL,GAAyB2B,YAAzB,CAAA;AACA,MAAA,OAAOA,YAAP,CAAA;AACD,KAhC2B,EAiC5B;MACErG,GAAG,EAAE0G,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,iBADjD;AAEE3G,MAAAA,KAAK,EAAE,MAAM,IAAK0D,CAAAA,OAAL,CAAa1D,KAAAA;AAF5B,KAjC4B,CAvEsC,CAAA;IAAA,IA8G5D4G,CAAAA,cA9G4D,GA8G3CpH,IAAI,CAC3B,MAAM,CAAC,IAAK2G,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKD,YAA9C,CADqB,EAE3B,CAACG,YAAD,EAAeS,SAAf,EAA0BZ,YAA1B,KAA2C;AACzC,MAAA,OAAOW,cAAc,CAAC;QACpBR,YADoB;QAEpBS,SAFoB;AAGpBZ,QAAAA,YAAAA;AAHoB,OAAD,CAArB,CAAA;AAKD,KAR0B,EAS3B;MACElG,GAAG,EAAE0G,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,gBADjD;AAEE3G,MAAAA,KAAK,EAAE,MAAM,IAAK0D,CAAAA,OAAL,CAAa1D,KAAAA;AAF5B,KAT2B,CA9GuC,CAAA;AAAA,IAAA,IAAA,CA6H5D8G,UA7H4D,GA6H/CtH,IAAI,CACvB,MAAM,CACJ,IAAA,CAAKkE,OAAL,CAAa2B,cADT,EAEJ,IAAA,CAAKuB,cAAL,EAFI,EAGJ,IAAKlD,CAAAA,OAAL,CAAa7B,QAHT,EAIJ,IAAA,CAAK6B,OAAL,CAAa1B,KAJT,CADiB,EAOvB,CAACqD,cAAD,EAAiB3D,KAAjB,EAAwBG,QAAxB,EAAkCG,KAAlC,KAA4C;AAC1C,MAAA,OAAOqD,cAAc,CAAC,EACpB,GAAG3D,KADiB;QAEpBG,QAFoB;AAGpBG,QAAAA,KAAK,EAAEA,KAAAA;AAHa,OAAD,CAArB,CAAA;AAKD,KAbsB,EAcvB;MACEjC,GAAG,EAAE0G,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAduB,CA7H2C,CAAA;IAAA,IAgJpEI,CAAAA,eAhJoE,GAgJlDvH,IAAI,CACpB,MAAM,CACJ,IAAA,CAAKsH,UAAL,EADI,EAEJ,IAAA,CAAKX,eAAL,EAFI,EAGJ,IAAKzC,CAAAA,OAAL,CAAaG,cAHT,CADc,EAMpB,CAACmD,OAAD,EAAUZ,YAAV,EAAwBvC,cAAxB,KAA2C;MACzC,MAAMoD,YAAyC,GAAG,EAAlD,CAAA;;AAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGH,OAAO,CAAC3G,MAA9B,EAAsC6G,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;AAClD,QAAA,MAAMhF,CAAC,GAAG8E,OAAO,CAACE,CAAD,CAAjB,CAAA;AACA,QAAA,MAAME,WAAW,GAAGhB,YAAY,CAAClE,CAAD,CAAhC,CAAA;AAEA,QAAA,MAAMmF,IAAI,GAAG,EACX,GAAGD,WADQ;UAEXvD,cAAc,EAAGyD,cAAD,IAAyC;AACvD,YAAA,IAAIA,cAAJ,EAAoB;AAClB,cAAA,MAAMC,gBAAgB,GAAG1D,cAAc,CAACyD,cAAD,EAAiB,IAAjB,CAAvC,CAAA;;AAEA,cAAA,IAAIC,gBAAgB,KAAKF,IAAI,CAACd,IAA9B,EAAoC;AAClC,gBAAA,IAAIc,IAAI,CAAC1F,KAAL,GAAa,IAAA,CAAKsE,YAAtB,EAAoC;kBAClC,IACEQ,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IACA,IAAA,CAAKjD,OAAL,CAAa1D,KAFf,EAIEoB,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2BkG,gBAAgB,GAAGF,IAAI,CAACd,IAAnD,CAAA,CAAA;;kBAEF,IAAI,CAAC,IAAKiB,CAAAA,iBAAV,EAA6B;AAC3B,oBAAA,IAAA,CAAKC,eAAL,CACE,IAAKxB,CAAAA,YAAL,IAAqBsB,gBAAgB,GAAGF,IAAI,CAACd,IAA7C,CADF,EAEE,KAFF,CAAA,CAAA;AAID,mBAAA;AACF,iBAAA;;AAED,gBAAA,IAAA,CAAK5B,2BAAL,CAAiCxC,IAAjC,CAAsCD,CAAtC,CAAA,CAAA;AACA,gBAAA,IAAA,CAAKwC,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;kBAE3B,CAAC2C,IAAI,CAACtH,GAAN,GAAYwH,gBAAAA;iBAFd,CAAA;AAIA,gBAAA,IAAA,CAAK/B,MAAL,EAAA,CAAA;AACD,eAAA;AACF,aAAA;AACF,WAAA;SA9BH,CAAA;QAiCAyB,YAAY,CAAC9E,IAAb,CAAkBkF,IAAlB,CAAA,CAAA;AACD,OAAA;;AAED,MAAA,OAAOJ,YAAP,CAAA;AACD,KAlDmB,EAmDpB;MACElH,GAAG,EAAE0G,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,IAA0C,YAAA;AADjD,KAnDoB,CAhJ8C,CAAA;;AAAA,IAAA,IAAA,CAwMpEe,cAxMoE,GAwMnD,UACfC,QADe,EAGZ,KAAA,EAAA;MAAA,IADH;AAAEC,QAAAA,KAAAA;AAAF,OACG,GADgC,KAAA,KAAA,KAAA,CAAA,GAAA;AAAEA,QAAAA,KAAK,EAAE,OAAA;OACzC,GAAA,KAAA,CAAA;;MACH,MAAMC,OAAO,GAAG,MAAM;AACpB,QAAA,MAAM7D,MAAM,GAAG,KAAI,CAACiC,YAApB,CAAA;;AACA,QAAA,MAAMM,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;QAEA,IAAI0B,KAAK,KAAK,MAAd,EAAsB;UACpB,IAAID,QAAQ,IAAI3D,MAAhB,EAAwB;AACtB4D,YAAAA,KAAK,GAAG,OAAR,CAAA;AACD,WAFD,MAEO,IAAID,QAAQ,IAAI3D,MAAM,GAAGuC,IAAzB,EAA+B;AACpCqB,YAAAA,KAAK,GAAG,KAAR,CAAA;AACD,WAFM,MAEA;AACLA,YAAAA,KAAK,GAAG,OAAR,CAAA;AACD,WAAA;AACF,SAAA;;QAED,IAAIA,KAAK,KAAK,OAAd,EAAuB;AACrB,UAAA,KAAI,CAACH,eAAL,CAAqBE,QAArB,EAA+B,IAA/B,CAAA,CAAA;AACD,SAFD,MAEO,IAAIC,KAAK,KAAK,KAAd,EAAqB;AAC1B,UAAA,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGpB,IAAhC,EAAsC,IAAtC,CAAA,CAAA;AACD,SAFM,MAEA,IAAIqB,KAAK,KAAK,QAAd,EAAwB;UAC7B,KAAI,CAACH,eAAL,CAAqBE,QAAQ,GAAGpB,IAAI,GAAG,CAAvC,EAA0C,IAA1C,CAAA,CAAA;AACD,SAAA;OApBH,CAAA;;MAuBAsB,OAAO,EAAA,CAAA;AACPC,MAAAA,qBAAqB,CAAC,MAAM;QAC1BD,OAAO,EAAA,CAAA;AACR,OAFoB,CAArB,CAAA;KApOkE,CAAA;;AAAA,IAAA,IAAA,CAyOpEE,aAzOoE,GAyOpD,UACdvH,KADc,EAGX,MAAA,EAAA;MAAA,IADH;QAAEoH,KAAF;QAAS,GAAGI,IAAAA;AAAZ,OACG,GADwC,MAAA,KAAA,KAAA,CAAA,GAAA;AAAEJ,QAAAA,KAAK,EAAE,MAAA;OACjD,GAAA,MAAA,CAAA;;AACH,MAAA,MAAMxB,YAAY,GAAG,KAAI,CAACD,eAAL,EAArB,CAAA;;AACA,MAAA,MAAMnC,MAAM,GAAG,KAAI,CAACiC,YAApB,CAAA;;AACA,MAAA,MAAMM,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;MACA,MAAM;AAAElE,QAAAA,KAAAA;OAAU,GAAA,KAAI,CAAC0B,OAAvB,CAAA;MAEA,MAAM0D,WAAW,GAAGhB,YAAY,CAACxF,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYV,IAAI,CAACW,GAAL,CAASf,KAAT,EAAgBwB,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;MAEA,IAAI,CAACoF,WAAL,EAAkB;AAChB,QAAA,OAAA;AACD,OAAA;;MAED,IAAIQ,KAAK,KAAK,MAAd,EAAsB;AACpB,QAAA,IAAIR,WAAW,CAACtF,GAAZ,IAAmBkC,MAAM,GAAGuC,IAAhC,EAAsC;AACpCqB,UAAAA,KAAK,GAAG,KAAR,CAAA;AACD,SAFD,MAEO,IAAIR,WAAW,CAACzF,KAAZ,IAAqBqC,MAAzB,EAAiC;AACtC4D,UAAAA,KAAK,GAAG,OAAR,CAAA;AACD,SAFM,MAEA;AACL,UAAA,OAAA;AACD,SAAA;AACF,OAAA;;MAED,MAAMD,QAAQ,GACZC,KAAK,KAAK,QAAV,GACIR,WAAW,CAACzF,KAAZ,GAAoByF,WAAW,CAACb,IAAZ,GAAmB,CAD3C,GAEIqB,KAAK,KAAK,KAAV,GACAR,WAAW,CAACtF,GADZ,GAEAsF,WAAW,CAACzF,KALlB,CAAA;;AAOA,MAAA,KAAI,CAAC+F,cAAL,CAAoBC,QAApB,EAA8B;QAAEC,KAAF;QAAS,GAAGI,IAAAA;OAA1C,CAAA,CAAA;KAzQkE,CAAA;;AAAA,IAAA,IAAA,CA4QpEC,YA5QoE,GA4QrD,MAAA;AAAA,MAAA,IAAA,qBAAA,CAAA;;MAAA,OACb,CAAC,+BAAK9B,eAAL,EAAA,CAAuB,KAAKzC,OAAL,CAAa1B,KAAb,GAAqB,CAA5C,4CAAgDF,GAAhD,KACC,KAAK4B,OAAL,CAAawB,YADf,IAC+B,IAAA,CAAKxB,OAAL,CAAayB,UAF/B,CAAA;KA5QqD,CAAA;;AAAA,IAAA,IAAA,CAgR5DsC,eAhR4D,GAgR1C,CAACzD,MAAD,EAAiBC,SAAjB,KAAwC;MAChEiE,YAAY,CAAC,IAAKC,CAAAA,gBAAN,CAAZ,CAAA;MAEA,IAAKX,CAAAA,iBAAL,GAAyBxD,MAAzB,CAAA;MACA,IAAKN,CAAAA,OAAL,CAAa0E,UAAb,CAAwBpE,MAAxB,EAAgCC,SAAhC,EAA2C,IAA3C,CAAA,CAAA;AAEA,MAAA,IAAIkE,gBAAJ,CAAA;;MAEA,MAAME,KAAK,GAAG,MAAM;QAClB,IAAIC,UAAU,GAAG,IAAA,CAAKrC,YAAtB,CAAA;AACA,QAAA,IAAA,CAAKkC,gBAAL,GAAwBA,gBAAgB,GAAGI,UAAU,CAAC,MAAM;AAC1D,UAAA,IAAI,IAAKJ,CAAAA,gBAAL,KAA0BA,gBAA9B,EAAgD;AAC9C,YAAA,OAAA;AACD,WAAA;;AAED,UAAA,IAAI,IAAKlC,CAAAA,YAAL,KAAsBqC,UAA1B,EAAsC;YACpC,IAAKd,CAAAA,iBAAL,GAAyBpD,SAAzB,CAAA;AACA,YAAA,OAAA;AACD,WAAA;;UACDkE,UAAU,GAAG,KAAKrC,YAAlB,CAAA;UACAoC,KAAK,EAAA,CAAA;SAV8C,EAWlD,GAXkD,CAArD,CAAA;OAFF,CAAA;;MAgBAA,KAAK,EAAA,CAAA;KAxS6D,CAAA;;IAAA,IA2SpEG,CAAAA,OA3SoE,GA2S1D,MAAM;MACd,IAAK9D,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;AACA,MAAA,IAAA,CAAKc,MAAL,EAAA,CAAA;KA7SkE,CAAA;;IAClE,IAAKZ,CAAAA,UAAL,CAAgBjF,KAAhB,CAAA,CAAA;AACA,IAAA,IAAA,CAAKqG,UAAL,GAAkB,IAAKtC,CAAAA,OAAL,CAAa6B,WAA/B,CAAA;AACA,IAAA,IAAA,CAAKU,YAAL,GAAoB,IAAKvC,CAAAA,OAAL,CAAauB,aAAjC,CAAA;AACD,GAAA;;AAhBwE,CAAA;;AA6T3E,MAAMwD,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9B5D,KAJ8B,KAK3B;EACH,OAAO0D,GAAG,IAAIC,IAAd,EAAoB;IAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;AACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;IAEA,IAAIC,YAAY,GAAG9D,KAAnB,EAA0B;MACxB0D,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;AACD,KAFD,MAEO,IAAIC,YAAY,GAAG9D,KAAnB,EAA0B;MAC/B2D,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;AACD,KAFM,MAEA;AACL,MAAA,OAAOA,MAAP,CAAA;AACD,KAAA;AACF,GAAA;;EAED,IAAIH,GAAG,GAAG,CAAV,EAAa;IACX,OAAOA,GAAG,GAAG,CAAb,CAAA;AACD,GAFD,MAEO;AACL,IAAA,OAAO,CAAP,CAAA;AACD,GAAA;AACF,CAxBD,CAAA;;AA0BA,SAAS9B,cAAT,CAQG,KAAA,EAAA;EAAA,IARqB;IACtBR,YADsB;IAEtBS,SAFsB;AAGtBZ,IAAAA,YAAAA;GAKC,GAAA,KAAA,CAAA;AACD,EAAA,MAAMjE,KAAK,GAAGoE,YAAY,CAAC/F,MAAb,GAAsB,CAApC,CAAA;;EACA,MAAM0I,SAAS,GAAIvI,KAAD,IAAmB4F,YAAY,CAAC5F,KAAD,CAAZ,CAAqBmB,KAA1D,CAAA;;EAEA,MAAMC,UAAU,GAAG6G,uBAAuB,CAAC,CAAD,EAAIzG,KAAJ,EAAW+G,SAAX,EAAsB9C,YAAtB,CAA1C,CAAA;EACA,IAAIlE,QAAQ,GAAGH,UAAf,CAAA;;AAEA,EAAA,OACEG,QAAQ,GAAGC,KAAX,IACAoE,YAAY,CAACrE,QAAD,CAAZ,CAAwBD,GAAxB,GAA8BmE,YAAY,GAAGY,SAF/C,EAGE;IACA9E,QAAQ,EAAA,CAAA;AACT,GAAA;;EAED,OAAO;IAAEH,UAAF;AAAcG,IAAAA,QAAAA;GAArB,CAAA;AACD;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -2669,7 +2669,7 @@ var drawChart = (function (exports) {
2669
2669
  </script>
2670
2670
  <script>
2671
2671
  /*<!--*/
2672
- const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"node_modules/@reach/observe-rect/dist/observe-rect.esm.js","uid":"868a-1"},{"name":"packages/virtual-core/src","children":[{"uid":"868a-3","name":"utils.ts"},{"uid":"868a-5","name":"index.ts"}]}]}],"isRoot":true},"nodeParts":{"868a-1":{"renderedLength":1732,"gzipLength":652,"brotliLength":0,"mainUid":"868a-0"},"868a-3":{"renderedLength":1432,"gzipLength":544,"brotliLength":0,"mainUid":"868a-2"},"868a-5":{"renderedLength":12236,"gzipLength":2743,"brotliLength":0,"mainUid":"868a-4"}},"nodeMetas":{"868a-0":{"id":"/node_modules/@reach/observe-rect/dist/observe-rect.esm.js","moduleParts":{"index.production.js":"868a-1"},"imported":[],"importedBy":[{"uid":"868a-4"}]},"868a-2":{"id":"/packages/virtual-core/src/utils.ts","moduleParts":{"index.production.js":"868a-3"},"imported":[],"importedBy":[{"uid":"868a-4"}]},"868a-4":{"id":"/packages/virtual-core/src/index.ts","moduleParts":{"index.production.js":"868a-5"},"imported":[{"uid":"868a-0"},{"uid":"868a-2"}],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.75.4"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
2672
+ const data = {"version":2,"tree":{"name":"root","children":[{"name":"index.production.js","children":[{"name":"node_modules/@reach/observe-rect/dist/observe-rect.esm.js","uid":"92fd-1"},{"name":"packages/virtual-core/src","children":[{"uid":"92fd-3","name":"utils.ts"},{"uid":"92fd-5","name":"index.ts"}]}]}],"isRoot":true},"nodeParts":{"92fd-1":{"renderedLength":1732,"gzipLength":652,"brotliLength":0,"mainUid":"92fd-0"},"92fd-3":{"renderedLength":1432,"gzipLength":544,"brotliLength":0,"mainUid":"92fd-2"},"92fd-5":{"renderedLength":12406,"gzipLength":2777,"brotliLength":0,"mainUid":"92fd-4"}},"nodeMetas":{"92fd-0":{"id":"/node_modules/@reach/observe-rect/dist/observe-rect.esm.js","moduleParts":{"index.production.js":"92fd-1"},"imported":[],"importedBy":[{"uid":"92fd-4"}]},"92fd-2":{"id":"/packages/virtual-core/src/utils.ts","moduleParts":{"index.production.js":"92fd-3"},"imported":[],"importedBy":[{"uid":"92fd-4"}]},"92fd-4":{"id":"/packages/virtual-core/src/index.ts","moduleParts":{"index.production.js":"92fd-5"},"imported":[{"uid":"92fd-0"},{"uid":"92fd-2"}],"importedBy":[],"isEntry":true}},"env":{"rollup":"2.75.4"},"options":{"gzip":true,"brotli":false,"sourcemap":false}};
2673
2673
 
2674
2674
  const run = () => {
2675
2675
  const width = window.innerWidth;
@@ -8,17 +8,17 @@
8
8
  "children": [
9
9
  {
10
10
  "name": "node_modules/@reach/observe-rect/dist/observe-rect.esm.js",
11
- "uid": "868a-7"
11
+ "uid": "92fd-7"
12
12
  },
13
13
  {
14
14
  "name": "packages/virtual-core/src",
15
15
  "children": [
16
16
  {
17
- "uid": "868a-9",
17
+ "uid": "92fd-9",
18
18
  "name": "utils.ts"
19
19
  },
20
20
  {
21
- "uid": "868a-11",
21
+ "uid": "92fd-11",
22
22
  "name": "index.ts"
23
23
  }
24
24
  ]
@@ -29,61 +29,61 @@
29
29
  "isRoot": true
30
30
  },
31
31
  "nodeParts": {
32
- "868a-7": {
32
+ "92fd-7": {
33
33
  "renderedLength": 1732,
34
34
  "gzipLength": 652,
35
35
  "brotliLength": 0,
36
- "mainUid": "868a-6"
36
+ "mainUid": "92fd-6"
37
37
  },
38
- "868a-9": {
38
+ "92fd-9": {
39
39
  "renderedLength": 1432,
40
40
  "gzipLength": 544,
41
41
  "brotliLength": 0,
42
- "mainUid": "868a-8"
42
+ "mainUid": "92fd-8"
43
43
  },
44
- "868a-11": {
45
- "renderedLength": 12236,
46
- "gzipLength": 2743,
44
+ "92fd-11": {
45
+ "renderedLength": 12406,
46
+ "gzipLength": 2777,
47
47
  "brotliLength": 0,
48
- "mainUid": "868a-10"
48
+ "mainUid": "92fd-10"
49
49
  }
50
50
  },
51
51
  "nodeMetas": {
52
- "868a-6": {
52
+ "92fd-6": {
53
53
  "id": "/node_modules/@reach/observe-rect/dist/observe-rect.esm.js",
54
54
  "moduleParts": {
55
- "index.production.js": "868a-7"
55
+ "index.production.js": "92fd-7"
56
56
  },
57
57
  "imported": [],
58
58
  "importedBy": [
59
59
  {
60
- "uid": "868a-10"
60
+ "uid": "92fd-10"
61
61
  }
62
62
  ]
63
63
  },
64
- "868a-8": {
64
+ "92fd-8": {
65
65
  "id": "/packages/virtual-core/src/utils.ts",
66
66
  "moduleParts": {
67
- "index.production.js": "868a-9"
67
+ "index.production.js": "92fd-9"
68
68
  },
69
69
  "imported": [],
70
70
  "importedBy": [
71
71
  {
72
- "uid": "868a-10"
72
+ "uid": "92fd-10"
73
73
  }
74
74
  ]
75
75
  },
76
- "868a-10": {
76
+ "92fd-10": {
77
77
  "id": "/packages/virtual-core/src/index.ts",
78
78
  "moduleParts": {
79
- "index.production.js": "868a-11"
79
+ "index.production.js": "92fd-11"
80
80
  },
81
81
  "imported": [
82
82
  {
83
- "uid": "868a-6"
83
+ "uid": "92fd-6"
84
84
  },
85
85
  {
86
- "uid": "868a-8"
86
+ "uid": "92fd-8"
87
87
  }
88
88
  ],
89
89
  "importedBy": [],
@@ -50,6 +50,8 @@ export interface VirtualizerOptions<TScrollElement = unknown, TItemElement = unk
50
50
  horizontal?: boolean;
51
51
  paddingStart?: number;
52
52
  paddingEnd?: number;
53
+ scrollPaddingStart?: number;
54
+ scrollPaddingEnd?: number;
53
55
  initialOffset?: number;
54
56
  getItemKey?: (index: number) => Key;
55
57
  rangeExtractor?: (range: Range) => number[];
@@ -244,10 +244,12 @@
244
244
  overscan: 1,
245
245
  paddingStart: 0,
246
246
  paddingEnd: 0,
247
+ scrollPaddingStart: 0,
248
+ scrollPaddingEnd: 0,
247
249
  horizontal: false,
248
250
  getItemKey: defaultKeyExtractor,
249
251
  rangeExtractor: defaultRangeExtractor,
250
- enableSmoothScroll: false,
252
+ enableSmoothScroll: true,
251
253
  onChange: () => {},
252
254
  measureElement,
253
255
  initialRect: {
@@ -438,16 +440,16 @@
438
440
  }
439
441
 
440
442
  if (align === 'auto') {
441
- if (measurement.end >= offset + size) {
443
+ if (measurement.end >= offset + size - _this.options.scrollPaddingEnd) {
442
444
  align = 'end';
443
- } else if (measurement.start <= offset) {
445
+ } else if (measurement.start <= offset + _this.options.scrollPaddingStart) {
444
446
  align = 'start';
445
447
  } else {
446
448
  return;
447
449
  }
448
450
  }
449
451
 
450
- const toOffset = align === 'center' ? measurement.start + measurement.size / 2 : align === 'end' ? measurement.end : measurement.start;
452
+ const toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;
451
453
 
452
454
  _this.scrollToOffset(toOffset, {
453
455
  align,
@@ -464,7 +466,7 @@
464
466
  this._scrollToOffset = (offset, canSmooth) => {
465
467
  clearTimeout(this.scrollCheckFrame);
466
468
  this.destinationOffset = offset;
467
- this.options.scrollToFn(offset, canSmooth, this);
469
+ this.options.scrollToFn(offset, this.options.enableSmoothScroll && canSmooth, this);
468
470
  let scrollCheckFrame;
469
471
 
470
472
  const check = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { check } from 'prettier'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, canSmooth, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","paddingStart","paddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
1
+ {"version":3,"file":"index.development.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","push","observeElementRect","instance","cb","observer","observeRect","scrollElement","rect","getBoundingClientRect","observe","unobserve","observeWindowRect","onResize","width","innerWidth","height","innerHeight","addEventListener","capture","passive","removeEventListener","observeElementOffset","onScroll","options","horizontal","observeWindowOffset","measureElement","element","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","calculateRange","outerSize","getIndexes","getVirtualItems","indexes","virtualItems","k","len","measurement","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","align","attempt","requestAnimationFrame","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -8,5 +8,5 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VirtualCore={})}(this,(function(e){"use strict";var t,s=["bottom","height","left","right","top","width"],n=new Map,o=function e(){var o=[];n.forEach((function(e,t){var n,i,l=t.getBoundingClientRect();n=l,i=e.rect,void 0===n&&(n={}),void 0===i&&(i={}),s.some((function(e){return n[e]!==i[e]}))&&(e.rect=l,o.push(e))})),o.forEach((function(e){e.callbacks.forEach((function(t){return t(e.rect)}))})),t=window.requestAnimationFrame(e)};function i(e,t,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=e();if(!(l.length!==o.length||l.some(((e,t)=>o[t]!==e))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=t(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const e=Math.round(100*(Date.now()-i))/100,t=Math.round(100*(Date.now()-r))/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length<t;)e=" "+e;return e};console.info("%c⏱ "+o(t,5)+" /"+o(e,5)+" ms","\n font-size: .6rem;\n font-weight: bold;\n color: hsl("+Math.max(0,Math.min(120-120*n,120))+"deg 100% 31%);",null==s?void 0:s.key)}return n}}const l=e=>e,r=e=>{const t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=s;e++)n.push(e);return n},a=(e,t)=>e.getBoundingClientRect()[t.options.horizontal?"width":"height"];e.Virtualizer=class{constructor(e){var t=this;this.unsubs=[],this.scrollElement=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.setOptions=e=>{Object.entries(e).forEach((t=>{let[s,n]=t;void 0===n&&delete e[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,horizontal:!1,getItemKey:l,rangeExtractor:r,enableSmoothScroll:!1,onChange:()=>{},measureElement:a,initialRect:{width:0,height:0},...e}},this.notify=()=>{var e,t;null==(e=(t=this.options).onChange)||e.call(t,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((e=>e())),this.unsubs=[]},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e&&(this.cleanup(),this.scrollElement=e,this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.notify()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{this.scrollOffset=e,this.notify()}))))},this.getSize=()=>this.scrollRect[this.options.horizontal?"width":"height"],this.getMeasurements=i((()=>[this.options.count,this.options.paddingStart,this.options.getItemKey,this.itemMeasurementsCache]),((e,t,s,n)=>{const o=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const i=this.measurementsCache.slice(0,o);for(let l=o;l<e;l++){const e=s(l),o=n[e],r=i[l-1]?i[l-1].end:t,a="number"==typeof o?o:this.options.estimateSize(l),c=r+a;i[l]={index:l,start:r,size:a,end:c,key:e}}return this.measurementsCache=i,i}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=i((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((e,t,s)=>function(e){let{measurements:t,outerSize:s,scrollOffset:n}=e;const o=t.length-1,i=((e,t,s,n)=>{for(;e<=t;){const o=(e+t)/2|0,i=s(o);if(i<n)e=o+1;else{if(!(i>n))return o;t=o-1}}return e>0?e-1:0})(0,o,(e=>t[e].start),n);let l=i;for(;l<o&&t[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:s})),{key:!1,debug:()=>this.options.debug}),this.getIndexes=i((()=>[this.options.rangeExtractor,this.calculateRange(),this.options.overscan,this.options.count]),((e,t,s,n)=>e({...t,overscan:s,count:n})),{key:!1}),this.getVirtualItems=i((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((e,t,s)=>{const n=[];for(let o=0,i=e.length;o<i;o++){const i=e[o],l={...t[i],measureElement:e=>{if(e){const t=s(e,this);t!==l.size&&(l.start<this.scrollOffset&&(this.destinationOffset||this._scrollToOffset(this.scrollOffset+(t-l.size),!1)),this.pendingMeasuredCacheIndexes.push(i),this.itemMeasurementsCache={...this.itemMeasurementsCache,[l.key]:t},this.notify())}}};n.push(l)}return n}),{key:!1}),this.scrollToOffset=function(e,s){let{align:n}=void 0===s?{align:"start"}:s;const o=()=>{const s=t.scrollOffset,o=t.getSize();"auto"===n&&(n=e<=s?"start":e>=s+o?"end":"start"),"start"===n?t._scrollToOffset(e,!0):"end"===n?t._scrollToOffset(e-o,!0):"center"===n&&t._scrollToOffset(e-o/2,!0)};o(),requestAnimationFrame((()=>{o()}))},this.scrollToIndex=function(e,s){let{align:n,...o}=void 0===s?{align:"auto"}:s;const i=t.getMeasurements(),l=t.scrollOffset,r=t.getSize(),{count:a}=t.options,c=i[Math.max(0,Math.min(e,a-1))];if(!c)return;if("auto"===n)if(c.end>=l+r)n="end";else{if(!(c.start<=l))return;n="start"}const h="center"===n?c.start+c.size/2:"end"===n?c.end:c.start;t.scrollToOffset(h,{align:n,...o})},this.getTotalSize=()=>{var e;return((null==(e=this.getMeasurements()[this.options.count-1])?void 0:e.end)||this.options.paddingStart)+this.options.paddingEnd},this._scrollToOffset=(e,t)=>{let s;clearTimeout(this.scrollCheckFrame),this.destinationOffset=e,this.options.scrollToFn(e,t,this);const n=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,n()):this.destinationOffset=void 0)}),100)};n()},this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(e),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset}},e.defaultKeyExtractor=l,e.defaultRangeExtractor=r,e.elementScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},e.measureElement=a,e.memo=i,e.observeElementOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollLeft":"scrollTop"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeElementRect=(e,s)=>{const i=function(e,s){return{observe:function(){var t=0===n.size;n.has(e)?n.get(e).callbacks.push(s):n.set(e,{rect:void 0,hasRectChanged:!1,callbacks:[s]}),t&&o()},unobserve:function(){var o=n.get(e);if(o){var i=o.callbacks.indexOf(s);i>=0&&o.callbacks.splice(i,1),o.callbacks.length||n.delete(e),n.size||cancelAnimationFrame(t)}}}}(e.scrollElement,(e=>{s(e)}));if(e.scrollElement)return s(e.scrollElement.getBoundingClientRect()),i.observe(),()=>{i.unobserve()}},e.observeWindowOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollX":"scrollY"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeWindowRect=(e,t)=>{const s=()=>{t({width:e.scrollElement.innerWidth,height:e.scrollElement.innerHeight})};if(e.scrollElement)return s(),e.scrollElement.addEventListener("resize",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("resize",s)}},e.windowScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},Object.defineProperty(e,"__esModule",{value:!0})}));
11
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).VirtualCore={})}(this,(function(e){"use strict";var t,s=["bottom","height","left","right","top","width"],n=new Map,o=function e(){var o=[];n.forEach((function(e,t){var n,i,l=t.getBoundingClientRect();n=l,i=e.rect,void 0===n&&(n={}),void 0===i&&(i={}),s.some((function(e){return n[e]!==i[e]}))&&(e.rect=l,o.push(e))})),o.forEach((function(e){e.callbacks.forEach((function(t){return t(e.rect)}))})),t=window.requestAnimationFrame(e)};function i(e,t,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=e();if(!(l.length!==o.length||l.some(((e,t)=>o[t]!==e))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=t(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const e=Math.round(100*(Date.now()-i))/100,t=Math.round(100*(Date.now()-r))/100,n=t/16,o=(e,t)=>{for(e=String(e);e.length<t;)e=" "+e;return e};console.info("%c⏱ "+o(t,5)+" /"+o(e,5)+" ms","\n font-size: .6rem;\n font-weight: bold;\n color: hsl("+Math.max(0,Math.min(120-120*n,120))+"deg 100% 31%);",null==s?void 0:s.key)}return n}}const l=e=>e,r=e=>{const t=Math.max(e.startIndex-e.overscan,0),s=Math.min(e.endIndex+e.overscan,e.count-1),n=[];for(let e=t;e<=s;e++)n.push(e);return n},a=(e,t)=>e.getBoundingClientRect()[t.options.horizontal?"width":"height"];e.Virtualizer=class{constructor(e){var t=this;this.unsubs=[],this.scrollElement=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.setOptions=e=>{Object.entries(e).forEach((t=>{let[s,n]=t;void 0===n&&delete e[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:l,rangeExtractor:r,enableSmoothScroll:!0,onChange:()=>{},measureElement:a,initialRect:{width:0,height:0},...e}},this.notify=()=>{var e,t;null==(e=(t=this.options).onChange)||e.call(t,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((e=>e())),this.unsubs=[]},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{const e=this.options.getScrollElement();this.scrollElement!==e&&(this.cleanup(),this.scrollElement=e,this.unsubs.push(this.options.observeElementRect(this,(e=>{this.scrollRect=e,this.notify()}))),this.unsubs.push(this.options.observeElementOffset(this,(e=>{this.scrollOffset=e,this.notify()}))))},this.getSize=()=>this.scrollRect[this.options.horizontal?"width":"height"],this.getMeasurements=i((()=>[this.options.count,this.options.paddingStart,this.options.getItemKey,this.itemMeasurementsCache]),((e,t,s,n)=>{const o=this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[];const i=this.measurementsCache.slice(0,o);for(let l=o;l<e;l++){const e=s(l),o=n[e],r=i[l-1]?i[l-1].end:t,a="number"==typeof o?o:this.options.estimateSize(l),c=r+a;i[l]={index:l,start:r,size:a,end:c,key:e}}return this.measurementsCache=i,i}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=i((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((e,t,s)=>function(e){let{measurements:t,outerSize:s,scrollOffset:n}=e;const o=t.length-1,i=((e,t,s,n)=>{for(;e<=t;){const o=(e+t)/2|0,i=s(o);if(i<n)e=o+1;else{if(!(i>n))return o;t=o-1}}return e>0?e-1:0})(0,o,(e=>t[e].start),n);let l=i;for(;l<o&&t[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:e,outerSize:t,scrollOffset:s})),{key:!1,debug:()=>this.options.debug}),this.getIndexes=i((()=>[this.options.rangeExtractor,this.calculateRange(),this.options.overscan,this.options.count]),((e,t,s,n)=>e({...t,overscan:s,count:n})),{key:!1}),this.getVirtualItems=i((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((e,t,s)=>{const n=[];for(let o=0,i=e.length;o<i;o++){const i=e[o],l={...t[i],measureElement:e=>{if(e){const t=s(e,this);t!==l.size&&(l.start<this.scrollOffset&&(this.destinationOffset||this._scrollToOffset(this.scrollOffset+(t-l.size),!1)),this.pendingMeasuredCacheIndexes.push(i),this.itemMeasurementsCache={...this.itemMeasurementsCache,[l.key]:t},this.notify())}}};n.push(l)}return n}),{key:!1}),this.scrollToOffset=function(e,s){let{align:n}=void 0===s?{align:"start"}:s;const o=()=>{const s=t.scrollOffset,o=t.getSize();"auto"===n&&(n=e<=s?"start":e>=s+o?"end":"start"),"start"===n?t._scrollToOffset(e,!0):"end"===n?t._scrollToOffset(e-o,!0):"center"===n&&t._scrollToOffset(e-o/2,!0)};o(),requestAnimationFrame((()=>{o()}))},this.scrollToIndex=function(e,s){let{align:n,...o}=void 0===s?{align:"auto"}:s;const i=t.getMeasurements(),l=t.scrollOffset,r=t.getSize(),{count:a}=t.options,c=i[Math.max(0,Math.min(e,a-1))];if(!c)return;if("auto"===n)if(c.end>=l+r-t.options.scrollPaddingEnd)n="end";else{if(!(c.start<=l+t.options.scrollPaddingStart))return;n="start"}const h="end"===n?c.end+t.options.scrollPaddingEnd:c.start-t.options.scrollPaddingStart;t.scrollToOffset(h,{align:n,...o})},this.getTotalSize=()=>{var e;return((null==(e=this.getMeasurements()[this.options.count-1])?void 0:e.end)||this.options.paddingStart)+this.options.paddingEnd},this._scrollToOffset=(e,t)=>{let s;clearTimeout(this.scrollCheckFrame),this.destinationOffset=e,this.options.scrollToFn(e,this.options.enableSmoothScroll&&t,this);const n=()=>{let e=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==e?(e=this.scrollOffset,n()):this.destinationOffset=void 0)}),100)};n()},this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(e),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset}},e.defaultKeyExtractor=l,e.defaultRangeExtractor=r,e.elementScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},e.measureElement=a,e.memo=i,e.observeElementOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollLeft":"scrollTop"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeElementRect=(e,s)=>{const i=function(e,s){return{observe:function(){var t=0===n.size;n.has(e)?n.get(e).callbacks.push(s):n.set(e,{rect:void 0,hasRectChanged:!1,callbacks:[s]}),t&&o()},unobserve:function(){var o=n.get(e);if(o){var i=o.callbacks.indexOf(s);i>=0&&o.callbacks.splice(i,1),o.callbacks.length||n.delete(e),n.size||cancelAnimationFrame(t)}}}}(e.scrollElement,(e=>{s(e)}));if(e.scrollElement)return s(e.scrollElement.getBoundingClientRect()),i.observe(),()=>{i.unobserve()}},e.observeWindowOffset=(e,t)=>{const s=()=>t(e.scrollElement[e.options.horizontal?"scrollX":"scrollY"]);if(e.scrollElement)return s(),e.scrollElement.addEventListener("scroll",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",s)}},e.observeWindowRect=(e,t)=>{const s=()=>{t({width:e.scrollElement.innerWidth,height:e.scrollElement.innerHeight})};if(e.scrollElement)return s(),e.scrollElement.addEventListener("resize",s,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("resize",s)}},e.windowScroll=(e,t,s)=>{var n;null==(n=s.scrollElement)||n.scrollTo({[s.options.horizontal?"left":"top"]:e,behavior:t?"smooth":void 0})},Object.defineProperty(e,"__esModule",{value:!0})}));
12
12
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { check } from 'prettier'\nimport React from 'react'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: false,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size) {\n align = 'end'\n } else if (measurement.start <= offset) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'center'\n ? measurement.start + measurement.size / 2\n : align === 'end'\n ? measurement.end\n : measurement.start\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, canSmooth, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["rafId","props","observedNodes","Map","run","changedStates","forEach","state","node","a","b","newRect","getBoundingClientRect","rect","some","prop","push","callbacks","cb","window","requestAnimationFrame","memo","getDeps","fn","opts","result","deps","depTime","key","debug","Date","now","newDeps","length","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","measureElement","element","instance","options","horizontal","constructor","_this","this","unsubs","scrollElement","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","_ref","value","initialOffset","paddingStart","paddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","observeElementRect","scrollRect","observeElementOffset","offset","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","calculateRange","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","virtualItems","k","len","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","_temp","align","attempt","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","onScroll","addEventListener","capture","passive","removeEventListener","observer","observe","wasEmpty","has","get","set","hasRectChanged","unobserve","indexOf","splice","cancelAnimationFrame","observeRect","onResize","innerWidth","innerHeight","_instance$scrollEleme"],"mappings":"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"}
1
+ {"version":3,"file":"index.production.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\ninterface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n cb(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = () => {\n cb({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n }\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\nexport const observeElementOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollLeft' : 'scrollTop'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const observeWindowOffset = (\n instance: Virtualizer<any, any>,\n cb: (offset: number) => void,\n) => {\n const onScroll = () =>\n cb(\n instance.scrollElement[\n instance.options.horizontal ? 'scrollX' : 'scrollY'\n ],\n )\n\n if (!instance.scrollElement) {\n return\n }\n\n onScroll()\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n}\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.notify()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.notify()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n return calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.calculateRange(),\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (measurableItem: TItemElement | null) => {\n if (measurableItem) {\n const measuredItemSize = measureElement(measurableItem, this)\n\n if (measuredItemSize !== item.size) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n )\n console.info('correction', measuredItemSize - item.size)\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - item.size),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(i)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n },\n }\n\n virtualItems.push(item)\n }\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === 'development' && 'getIndexes',\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n { align }: ScrollToOffsetOptions = { align: 'start' },\n ) => {\n const attempt = () => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n attempt()\n requestAnimationFrame(() => {\n attempt()\n })\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["rafId","props","observedNodes","Map","run","changedStates","forEach","state","node","a","b","newRect","getBoundingClientRect","rect","some","prop","push","callbacks","cb","window","requestAnimationFrame","memo","getDeps","fn","opts","result","deps","depTime","key","debug","Date","now","newDeps","length","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","measureElement","element","instance","options","horizontal","constructor","_this","this","unsubs","scrollElement","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","setOptions","Object","entries","_ref","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","observeElementRect","scrollRect","observeElementOffset","offset","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","calculateRange","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","virtualItems","k","len","item","measurableItem","measuredItemSize","destinationOffset","_scrollToOffset","scrollToOffset","toOffset","_temp","align","attempt","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","onScroll","addEventListener","capture","passive","removeEventListener","observer","observe","wasEmpty","has","get","set","hasRectChanged","unobserve","indexOf","splice","cancelAnimationFrame","observeRect","onResize","innerWidth","innerHeight","_instance$scrollEleme"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/virtual-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "3.0.0-alpha.2",
4
+ "version": "3.0.0-beta.2",
5
5
  "description": "Headless UI for virtualizing scrollable elements in TS/JS + Frameworks",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/tanstack/virtual#readme",
package/src/index.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  import observeRect from '@reach/observe-rect'
2
- import { check } from 'prettier'
3
- import React from 'react'
4
2
  import { memo } from './utils'
5
3
 
6
4
  export * from './utils'
@@ -229,6 +227,8 @@ export interface VirtualizerOptions<
229
227
  horizontal?: boolean
230
228
  paddingStart?: number
231
229
  paddingEnd?: number
230
+ scrollPaddingStart?: number
231
+ scrollPaddingEnd?: number
232
232
  initialOffset?: number
233
233
  getItemKey?: (index: number) => Key
234
234
  rangeExtractor?: (range: Range) => number[]
@@ -264,10 +264,12 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
264
264
  overscan: 1,
265
265
  paddingStart: 0,
266
266
  paddingEnd: 0,
267
+ scrollPaddingStart: 0,
268
+ scrollPaddingEnd: 0,
267
269
  horizontal: false,
268
270
  getItemKey: defaultKeyExtractor,
269
271
  rangeExtractor: defaultRangeExtractor,
270
- enableSmoothScroll: false,
272
+ enableSmoothScroll: true,
271
273
  onChange: () => {},
272
274
  measureElement,
273
275
  initialRect: { width: 0, height: 0 },
@@ -496,9 +498,12 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
496
498
  }
497
499
 
498
500
  if (align === 'auto') {
499
- if (measurement.end >= offset + size) {
501
+ if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {
500
502
  align = 'end'
501
- } else if (measurement.start <= offset) {
503
+ } else if (
504
+ measurement.start <=
505
+ offset + this.options.scrollPaddingStart
506
+ ) {
502
507
  align = 'start'
503
508
  } else {
504
509
  return
@@ -506,11 +511,9 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
506
511
  }
507
512
 
508
513
  const toOffset =
509
- align === 'center'
510
- ? measurement.start + measurement.size / 2
511
- : align === 'end'
512
- ? measurement.end
513
- : measurement.start
514
+ align === 'end'
515
+ ? measurement.end + this.options.scrollPaddingEnd
516
+ : measurement.start - this.options.scrollPaddingStart
514
517
 
515
518
  this.scrollToOffset(toOffset, { align, ...rest })
516
519
  }
@@ -523,7 +526,11 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
523
526
  clearTimeout(this.scrollCheckFrame)
524
527
 
525
528
  this.destinationOffset = offset
526
- this.options.scrollToFn(offset, canSmooth, this)
529
+ this.options.scrollToFn(
530
+ offset,
531
+ this.options.enableSmoothScroll && canSmooth,
532
+ this,
533
+ )
527
534
 
528
535
  let scrollCheckFrame: ReturnType<typeof setTimeout>
529
536