@tanstack/virtual-core 3.0.0-beta.12 → 3.0.0-beta.15

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.
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- import observeRect from '@reach/observe-rect'
2
1
  import { memo } from './utils'
3
2
 
4
3
  export * from './utils'
@@ -81,22 +80,23 @@ export const observeElementRect = (
81
80
  instance: Virtualizer<any, any>,
82
81
  cb: (rect: Rect) => void,
83
82
  ) => {
84
- const onResize = memoRectCallback(instance, cb)
85
-
86
- const observer = observeRect(instance.scrollElement as Element, (rect) => {
87
- onResize(rect)
83
+ const observer = new ResizeObserver((entries) => {
84
+ cb({
85
+ width: entries[0]?.contentRect.width as number,
86
+ height: entries[0]?.contentRect.height as number
87
+ })
88
88
  })
89
89
 
90
90
  if (!instance.scrollElement) {
91
91
  return
92
92
  }
93
93
 
94
- onResize(instance.scrollElement.getBoundingClientRect())
94
+ cb(instance.scrollElement.getBoundingClientRect())
95
95
 
96
- observer.observe()
96
+ observer.observe(instance.scrollElement)
97
97
 
98
98
  return () => {
99
- observer.unobserve()
99
+ observer.unobserve(instance.scrollElement)
100
100
  }
101
101
  }
102
102
 
@@ -193,7 +193,7 @@ export const windowScroll = (
193
193
  canSmooth: boolean,
194
194
  instance: Virtualizer<any, any>,
195
195
  ) => {
196
- ;(instance.scrollElement as Window)?.scrollTo({
196
+ ;(instance.scrollElement as Window)?.scrollTo?.({
197
197
  [instance.options.horizontal ? 'left' : 'top']: offset,
198
198
  behavior: canSmooth ? 'smooth' : undefined,
199
199
  })
@@ -204,7 +204,7 @@ export const elementScroll = (
204
204
  canSmooth: boolean,
205
205
  instance: Virtualizer<any, any>,
206
206
  ) => {
207
- ;(instance.scrollElement as Element)?.scrollTo({
207
+ ;(instance.scrollElement as Element)?.scrollTo?.({
208
208
  [instance.options.horizontal ? 'left' : 'top']: offset,
209
209
  behavior: canSmooth ? 'smooth' : undefined,
210
210
  })
@@ -269,6 +269,10 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
269
269
  number,
270
270
  (measurableItem: TItemElement | null) => void
271
271
  > = {}
272
+ private range: { startIndex: number; endIndex: number } = {
273
+ startIndex: 0,
274
+ endIndex: 0,
275
+ }
272
276
 
273
277
  constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {
274
278
  this.setOptions(opts)
@@ -327,14 +331,14 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
327
331
  this.unsubs.push(
328
332
  this.options.observeElementRect(this, (rect) => {
329
333
  this.scrollRect = rect
330
- this.notify()
334
+ this.calculateRange()
331
335
  }),
332
336
  )
333
337
 
334
338
  this.unsubs.push(
335
339
  this.options.observeElementOffset(this, (offset) => {
336
340
  this.scrollOffset = offset
337
- this.notify()
341
+ this.calculateRange()
338
342
  }),
339
343
  )
340
344
  }
@@ -378,7 +382,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
378
382
  return measurements
379
383
  },
380
384
  {
381
- key: process.env.NODE_ENV === 'development' && 'getMeasurements',
385
+ key: process.env.NODE_ENV !== 'production' && 'getMeasurements',
382
386
  debug: () => this.options.debug,
383
387
  },
384
388
  )
@@ -386,14 +390,22 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
386
390
  private calculateRange = memo(
387
391
  () => [this.getMeasurements(), this.getSize(), this.scrollOffset],
388
392
  (measurements, outerSize, scrollOffset) => {
389
- return calculateRange({
393
+ const range = calculateRange({
390
394
  measurements,
391
395
  outerSize,
392
396
  scrollOffset,
393
397
  })
398
+ if (
399
+ range.startIndex !== this.range.startIndex ||
400
+ range.endIndex !== this.range.endIndex
401
+ ) {
402
+ this.range = range
403
+ this.notify()
404
+ }
405
+ return this.range
394
406
  },
395
407
  {
396
- key: process.env.NODE_ENV === 'development' && 'calculateRange',
408
+ key: process.env.NODE_ENV !== 'production' && 'calculateRange',
397
409
  debug: () => this.options.debug,
398
410
  },
399
411
  )
@@ -401,7 +413,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
401
413
  private getIndexes = memo(
402
414
  () => [
403
415
  this.options.rangeExtractor,
404
- this.calculateRange(),
416
+ this.range,
405
417
  this.options.overscan,
406
418
  this.options.count,
407
419
  ],
@@ -413,7 +425,8 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
413
425
  })
414
426
  },
415
427
  {
416
- key: process.env.NODE_ENV === 'development' && 'getIndexes',
428
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
429
+ debug: () => this.options.debug,
417
430
  },
418
431
  )
419
432
 
@@ -437,10 +450,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
437
450
 
438
451
  if (measuredItemSize !== itemSize) {
439
452
  if (item.start < this.scrollOffset) {
440
- if (
441
- process.env.NODE_ENV === 'development' &&
442
- this.options.debug
443
- ) {
453
+ if (process.env.NODE_ENV !== 'production' && this.options.debug) {
444
454
  console.info('correction', measuredItemSize - itemSize)
445
455
  }
446
456
 
@@ -482,7 +492,8 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
482
492
  return virtualItems
483
493
  },
484
494
  {
485
- key: process.env.NODE_ENV === 'development' && 'getIndexes',
495
+ key: process.env.NODE_ENV !== 'production' && 'getIndexes',
496
+ debug: () => this.options.debug,
486
497
  },
487
498
  )
488
499
 
@@ -490,33 +501,26 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
490
501
  toOffset: number,
491
502
  { align }: ScrollToOffsetOptions = { align: 'start' },
492
503
  ) => {
493
- const attempt = () => {
494
- const offset = this.scrollOffset
495
- const size = this.getSize()
496
-
497
- if (align === 'auto') {
498
- if (toOffset <= offset) {
499
- align = 'start'
500
- } else if (toOffset >= offset + size) {
501
- align = 'end'
502
- } else {
503
- align = 'start'
504
- }
505
- }
504
+ const offset = this.scrollOffset
505
+ const size = this.getSize()
506
506
 
507
- if (align === 'start') {
508
- this._scrollToOffset(toOffset, true)
509
- } else if (align === 'end') {
510
- this._scrollToOffset(toOffset - size, true)
511
- } else if (align === 'center') {
512
- this._scrollToOffset(toOffset - size / 2, true)
507
+ if (align === 'auto') {
508
+ if (toOffset <= offset) {
509
+ align = 'start'
510
+ } else if (toOffset >= offset + size) {
511
+ align = 'end'
512
+ } else {
513
+ align = 'start'
513
514
  }
514
515
  }
515
516
 
516
- attempt()
517
- requestAnimationFrame(() => {
518
- attempt()
519
- })
517
+ if (align === 'start') {
518
+ this._scrollToOffset(toOffset, true)
519
+ } else if (align === 'end') {
520
+ this._scrollToOffset(toOffset - size, true)
521
+ } else if (align === 'center') {
522
+ this._scrollToOffset(toOffset - size / 2, true)
523
+ }
520
524
  }
521
525
 
522
526
  scrollToIndex = (
@@ -1 +0,0 @@
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\nexport interface 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\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = memoRectCallback(instance, cb)\n\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n onResize(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize(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 memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n\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 this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.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 makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (\n process.env.NODE_ENV === 'development' &&\n this.options.debug\n ) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n false,\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV === '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","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","onResize","observer","observeRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","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","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","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 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../src/utils.ts"],"sourcesContent":["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"],"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"],"mappings":";;;;;;;;;;;;;;AAIO,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;;;;"}