@tanstack/virtual-core 3.0.0-beta.19 → 3.0.0-beta.20
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/build/cjs/index.js +33 -11
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +33 -11
- package/build/esm/index.js.map +1 -1
- package/build/stats.html +1 -1
- package/build/stats.json +14 -14
- package/build/types/index.d.ts +2 -1
- package/build/umd/index.development.js +33 -11
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +29 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.development.js","sources":["../../src/utils.ts","../../src/index.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","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.isScrolling = true\n this.scrollOffset = offset\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n {\n canSmooth: false,\n sync: false,\n },\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', ...rest }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, options, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["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","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","scrollingDelay","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;;;;;;;EAIO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;IACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;EACA,EAAA,IAAIC,MAAJ,CAAA;EAEA,EAAA,OAAO,MAAM;EACX,IAAA,IAAIC,OAAJ,CAAA;EACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;MAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;MAEA,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;;MAIA,IAAI,CAACH,WAAL,EAAkB;EAChB,MAAA,OAAOP,MAAP,CAAA;EACD,KAAA;;EAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;EAEA,IAAA,IAAIM,UAAJ,CAAA;EACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;EAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;MACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;EAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;EAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;EACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;EACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;EAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;EACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;EACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;YACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;EACD,SAAA;;EACD,QAAA,OAAOA,GAAP,CAAA;SALF,CAAA;;EAQAG,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;EAWD,KAAA;;EAED,IAAA,OAAOF,MAAP,CAAA;KAhDF,CAAA;EAkDD;;ECvBD;AAEa2B,QAAAA,mBAAmB,GAAIhB,KAAD,IAAmBA,MAA/C;AAEMiB,QAAAA,qBAAqB,GAAIC,KAAD,IAAkB;EACrD,EAAA,MAAMC,KAAK,GAAGf,IAAI,CAACU,GAAL,CAASI,KAAK,CAACE,UAAN,GAAmBF,KAAK,CAACG,QAAlC,EAA4C,CAA5C,CAAd,CAAA;EACA,EAAA,MAAMC,GAAG,GAAGlB,IAAI,CAACW,GAAL,CAASG,KAAK,CAACK,QAAN,GAAiBL,KAAK,CAACG,QAAhC,EAA0CH,KAAK,CAACM,KAAN,GAAc,CAAxD,CAAZ,CAAA;IAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;IAEA,KAAK,IAAIC,CAAC,GAAGP,KAAb,EAAoBO,CAAC,IAAIJ,GAAzB,EAA8BI,CAAC,EAA/B,EAAmC;MACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;EACD,GAAA;;EAED,EAAA,OAAOD,GAAP,CAAA;EACD,EAXM;;EAaP,MAAMG,gBAAgB,GAAG,CACvBC,QADuB,EAEvBC,EAFuB,KAGpB;EACH,EAAA,IAAIC,IAAU,GAAG;MAAEC,MAAM,EAAE,CAAC,CAAX;EAAcC,IAAAA,KAAK,EAAE,CAAC,CAAA;KAAvC,CAAA;EAEA,EAAA,OAAQC,IAAD,IAAgB;MACrB,IACEL,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GACIF,IAAI,CAACD,KAAL,KAAeF,IAAI,CAACE,KADxB,GAEIC,IAAI,CAACF,MAAL,KAAgBD,IAAI,CAACC,MAH3B,EAIE;QACAF,EAAE,CAACI,IAAD,CAAF,CAAA;EACD,KAAA;;EAEDH,IAAAA,IAAI,GAAGG,IAAP,CAAA;KATF,CAAA;EAWD,CAjBD,CAAA;;QAmBaG,kBAAkB,GAAG,CAChCR,QADgC,EAEhCC,EAFgC,KAG7B;EACH,EAAA,MAAMQ,QAAQ,GAAG,IAAIC,cAAJ,CAAoBC,OAAD,IAAa;EAAA,IAAA,IAAA,SAAA,EAAA,UAAA,CAAA;;EAC/CV,IAAAA,EAAE,CAAC;QACDG,KAAK,EAAA,CAAA,SAAA,GAAEO,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAYC,WAAZ,CAAwBR,KAD9B;QAEDD,MAAM,EAAA,CAAA,UAAA,GAAEQ,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAYC,WAAZ,CAAwBT,MAAAA;EAF/B,KAAD,CAAF,CAAA;EAID,GALgB,CAAjB,CAAA;;EAOA,EAAA,IAAI,CAACH,QAAQ,CAACa,aAAd,EAA6B;EAC3B,IAAA,OAAA;EACD,GAAA;;EAEDZ,EAAAA,EAAE,CAACD,QAAQ,CAACa,aAAT,CAAuBC,qBAAvB,EAAD,CAAF,CAAA;EAEAL,EAAAA,QAAQ,CAACM,OAAT,CAAiBf,QAAQ,CAACa,aAA1B,CAAA,CAAA;EAEA,EAAA,OAAO,MAAM;EACXJ,IAAAA,QAAQ,CAACO,SAAT,CAAmBhB,QAAQ,CAACa,aAA5B,CAAA,CAAA;KADF,CAAA;EAGD,EAtBM;QAwBMI,iBAAiB,GAAG,CAC/BjB,QAD+B,EAE/BC,EAF+B,KAG5B;EACH,EAAA,MAAMiB,gBAAgB,GAAGnB,gBAAgB,CAACC,QAAD,EAAWC,EAAX,CAAzC,CAAA;;EACA,EAAA,MAAMkB,QAAQ,GAAG,MACfD,gBAAgB,CAAC;EACfd,IAAAA,KAAK,EAAEJ,QAAQ,CAACa,aAAT,CAAuBO,UADf;EAEfjB,IAAAA,MAAM,EAAEH,QAAQ,CAACa,aAAT,CAAuBQ,WAAAA;EAFhB,GAAD,CADlB,CAAA;;EAMA,EAAA,IAAI,CAACrB,QAAQ,CAACa,aAAd,EAA6B;EAC3B,IAAA,OAAA;EACD,GAAA;;IAEDM,QAAQ,EAAA,CAAA;IAERnB,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDH,QAAlD,EAA4D;EAC1DI,IAAAA,OAAO,EAAE,KADiD;EAE1DC,IAAAA,OAAO,EAAE,IAAA;KAFX,CAAA,CAAA;EAKA,EAAA,OAAO,MAAM;EACXxB,IAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDN,QAArD,CAAA,CAAA;KADF,CAAA;EAGD,EAzBM;EA6BP,MAAMO,WAAW,GAAG;EAClBC,EAAAA,OAAO,EAAE,CAAC,YAAD,EAAe,WAAf,CADS;EAElBC,EAAAA,MAAM,EAAE,CAAC,SAAD,EAAY,SAAZ,CAAA;EAFU,CAApB,CAAA;;EAKA,MAAMC,oBAAoB,GAAIC,IAAD,IAAwB;EACnD,EAAA,OAAO,CAAC9B,QAAD,EAAkCC,EAAlC,KAAmE;EACxE,IAAA,IAAI,CAACD,QAAQ,CAACa,aAAd,EAA6B;EAC3B,MAAA,OAAA;EACD,KAAA;;MAED,MAAMkB,KAAK,GAAGL,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;MACA,MAAME,KAAK,GAAGN,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;EAEA,IAAA,IAAIG,KAAa,GAAGjC,QAAQ,CAACa,aAAT,CAAuBkB,KAAvB,CAApB,CAAA;EACA,IAAA,IAAIG,KAAa,GAAGlC,QAAQ,CAACa,aAAT,CAAuBmB,KAAvB,CAApB,CAAA;;MAEA,MAAMG,MAAM,GAAG,MAAM;EACnB,MAAA,MAAMC,MAAM,GACVpC,QAAQ,CAACa,aAAT,CAAuBb,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8BwB,KAA9B,GAAsCC,KAA7D,CADF,CAAA;EAGA/B,MAAAA,EAAE,CAAC1B,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYmD,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAAtC,CAAD,CAAF,CAAA;OAJF,CAAA;;MAOAF,MAAM,EAAA,CAAA;;MAEN,MAAMG,QAAQ,GAAIC,CAAD,IAAc;EAC7B,MAAA,MAAMC,MAAM,GAAGD,CAAC,CAACE,aAAjB,CAAA;EACA,MAAA,MAAMC,OAAO,GAAGF,MAAM,CAACT,KAAD,CAAtB,CAAA;EACA,MAAA,MAAMY,OAAO,GAAGH,MAAM,CAACR,KAAD,CAAtB,CAAA;;EAEA,MAAA,IAAIhC,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B0B,KAAK,GAAGS,OAAtC,GAAgDR,KAAK,GAAGS,OAA5D,EAAqE;UACnER,MAAM,EAAA,CAAA;EACP,OAAA;;EAEDF,MAAAA,KAAK,GAAGS,OAAR,CAAA;EACAR,MAAAA,KAAK,GAAGS,OAAR,CAAA;OAVF,CAAA;;MAaA3C,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDgB,QAAlD,EAA4D;EAC1Df,MAAAA,OAAO,EAAE,KADiD;EAE1DC,MAAAA,OAAO,EAAE,IAAA;OAFX,CAAA,CAAA;EAKA,IAAA,OAAO,MAAM;EACXxB,MAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDa,QAArD,CAAA,CAAA;OADF,CAAA;KAtCF,CAAA;EA0CD,CA3CD,CAAA;;QA6CaM,oBAAoB,GAAGf,oBAAoB,CAAC,SAAD,EAAjD;QACMgB,mBAAmB,GAAGhB,oBAAoB,CAAC,QAAD,EAAhD;QAEMiB,cAAc,GAAG,CAC5BnB,OAD4B,EAE5B3B,QAF4B,KAGzB;EACH,EAAA,OAAQ2B,OAAD,CAAqBb,qBAArB,EAAA,CACLd,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,OAA9B,GAAwC,QADnC,CAAP,CAAA;EAGD,EAPM;QASMwC,YAAY,GAAG,CAC1BX,MAD0B,EAAA,IAAA,EAG1BpC,QAH0B,KAIvB;EAAA,EAAA,IAAA,qBAAA,CAAA;;IAAA,IAFH;MAAEgD,SAAF;EAAaC,IAAAA,IAAAA;KAEV,GAAA,IAAA,CAAA;EACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;EAEC,EAAA,CAAA,qBAAA,GAACrC,QAAQ,CAACa,aAAV,2CAAoCsC,QAApC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoCA,QAApC,CAA+C;MAC9C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADF;EAE9CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;KAFlC,CAAA,CAAA;EAIF,EAXM;QAaMC,aAAa,GAAG,CAC3BlB,MAD2B,EAAA,KAAA,EAG3BpC,QAH2B,KAIxB;EAAA,EAAA,IAAA,sBAAA,CAAA;;IAAA,IAFH;MAAEgD,SAAF;EAAaC,IAAAA,IAAAA;KAEV,GAAA,KAAA,CAAA;EACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;EAEC,EAAA,CAAA,sBAAA,GAACrC,QAAQ,CAACa,aAAV,4CAAqCsC,QAArC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqCA,QAArC,CAAgD;MAC/C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADD;EAE/CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;KAFlC,CAAA,CAAA;EAIF,EAXM;EA2DA,MAAME,WAAN,CAAoE;IAsBzEC,WAAW,CAAClG,KAAD,EAAyD;EAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;MAAA,IArB5DmG,CAAAA,MAqB4D,GArB1B,EAqB0B,CAAA;MAAA,IAnBpE5C,CAAAA,aAmBoE,GAnB7B,IAmB6B,CAAA;MAAA,IAlBpE6C,CAAAA,WAkBoE,GAlB7C,KAkB6C,CAAA;MAAA,IAjB5DC,CAAAA,oBAiB4D,GAjBC,IAiBD,CAAA;MAAA,IAhB5DC,CAAAA,iBAgB4D,GAhBhC,EAgBgC,CAAA;MAAA,IAf5DC,CAAAA,qBAe4D,GAff,EAee,CAAA;MAAA,IAd5DC,CAAAA,2BAc4D,GAdpB,EAcoB,CAAA;MAAA,IAT5DC,CAAAA,mBAS4D,GANhE,EAMgE,CAAA;EAAA,IAAA,IAAA,CALpE1E,KAKoE,GALlB;EAChDE,MAAAA,UAAU,EAAE,CADoC;EAEhDG,MAAAA,QAAQ,EAAE,CAAA;OAGwD,CAAA;;MAAA,IAQpEsE,CAAAA,UARoE,GAQtD1G,IAAD,IAA4D;EACvE2G,MAAAA,MAAM,CAACtD,OAAP,CAAerD,IAAf,CAAqB4G,CAAAA,OAArB,CAA6B,KAAkB,IAAA;EAAA,QAAA,IAAjB,CAACxG,GAAD,EAAMyG,KAAN,CAAiB,GAAA,KAAA,CAAA;UAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQ7G,IAAD,CAAcI,GAAd,CAAP,CAAA;SADpC,CAAA,CAAA;EAIA,MAAA,IAAA,CAAK4C,OAAL,GAAe;EACb3C,QAAAA,KAAK,EAAE,KADM;EAEbyG,QAAAA,aAAa,EAAE,CAFF;EAGb5E,QAAAA,QAAQ,EAAE,CAHG;EAIb6E,QAAAA,YAAY,EAAE,CAJD;EAKbC,QAAAA,UAAU,EAAE,CALC;EAMbC,QAAAA,kBAAkB,EAAE,CANP;EAObC,QAAAA,gBAAgB,EAAE,CAPL;EAQbjE,QAAAA,UAAU,EAAE,KARC;EASbkE,QAAAA,UAAU,EAAEtF,mBATC;EAUbuF,QAAAA,cAAc,EAAEtF,qBAVH;EAWbuF,QAAAA,kBAAkB,EAAE,IAXP;UAYbtG,QAAQ,EAAE,MAAM,EAZH;UAabyE,cAba;EAcb8B,QAAAA,WAAW,EAAE;EAAExE,UAAAA,KAAK,EAAE,CAAT;EAAYD,UAAAA,MAAM,EAAE,CAAA;WAdpB;EAebkC,QAAAA,YAAY,EAAE,CAfD;EAgBbwC,QAAAA,cAAc,EAAE,GAhBH;UAiBb,GAAGvH,IAAAA;SAjBL,CAAA;OAbkE,CAAA;;MAAA,IAkC5DwH,CAAAA,MAlC4D,GAkCnD,MAAM;EAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;EACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAKxE,OAAL,EAAajC,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;OAnCkE,CAAA;;MAAA,IAsC5D0G,CAAAA,OAtC4D,GAsClD,MAAM;QACtB,IAAKtB,CAAAA,MAAL,CAAYuB,MAAZ,CAAmBC,OAAnB,CAA4Bf,CAAAA,OAA5B,CAAqCgB,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;QACA,IAAKzB,CAAAA,MAAL,GAAc,EAAd,CAAA;QACA,IAAK5C,CAAAA,aAAL,GAAqB,IAArB,CAAA;OAzCkE,CAAA;;MAAA,IA4CpEsE,CAAAA,SA5CoE,GA4CxD,MAAM;EAChB,MAAA,OAAO,MAAM;EACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;SADF,CAAA;OA7CkE,CAAA;;MAAA,IAkDpEK,CAAAA,WAlDoE,GAkDtD,MAAM;EAClB,MAAA,MAAMvE,aAAa,GAAG,IAAA,CAAKP,OAAL,CAAa+E,gBAAb,EAAtB,CAAA;;EAEA,MAAA,IAAI,IAAKxE,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;EACxC,QAAA,IAAA,CAAKkE,OAAL,EAAA,CAAA;UAEA,IAAKlE,CAAAA,aAAL,GAAqBA,aAArB,CAAA;;EACA,QAAA,IAAA,CAAKyE,eAAL,CAAqB,IAAKC,CAAAA,YAA1B,EAAwC;EACtCvC,UAAAA,SAAS,EAAE,KAD2B;EAEtCC,UAAAA,IAAI,EAAE,IAAA;WAFR,CAAA,CAAA;;EAKA,QAAA,IAAA,CAAKQ,MAAL,CAAY3D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAaE,kBAAb,CAAgC,IAAhC,EAAuCH,IAAD,IAAU;YAC9C,IAAKmF,CAAAA,UAAL,GAAkBnF,IAAlB,CAAA;EACA,UAAA,IAAA,CAAKoF,cAAL,EAAA,CAAA;EACD,SAHD,CADF,CAAA,CAAA;EAOA,QAAA,IAAA,CAAKhC,MAAL,CAAY3D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAasC,oBAAb,CAAkC,IAAlC,EAAyCR,MAAD,IAAY;EAClD,UAAA,IAAI,IAAKuB,CAAAA,oBAAL,KAA8B,IAAlC,EAAwC;cACtC+B,YAAY,CAAC,IAAK/B,CAAAA,oBAAN,CAAZ,CAAA;cACA,IAAKA,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;EACD,WAAA;;EAED,UAAA,IAAI,IAAK4B,CAAAA,YAAL,KAAsBnD,MAA1B,EAAkC;cAChC,IAAKsB,CAAAA,WAAL,GAAmB,IAAnB,CAAA;cACA,IAAK6B,CAAAA,YAAL,GAAoBnD,MAApB,CAAA;EAEA,YAAA,IAAA,CAAKuB,oBAAL,GAA4BgC,UAAU,CAAC,MAAM;gBAC3C,IAAKhC,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;gBACA,IAAKD,CAAAA,WAAL,GAAmB,KAAnB,CAAA;EAEA,cAAA,IAAA,CAAKoB,MAAL,EAAA,CAAA;EACD,aALqC,EAKnC,IAAA,CAAKxE,OAAL,CAAauE,cALsB,CAAtC,CAAA;EAMD,WAVD,MAUO;cACL,IAAKnB,CAAAA,WAAL,GAAmB,KAAnB,CAAA;EACD,WAAA;;EAED,UAAA,IAAA,CAAK+B,cAAL,EAAA,CAAA;EACD,SArBD,CADF,CAAA,CAAA;EAwBD,OAxCD,MAwCO,IAAI,CAAC,IAAA,CAAK/B,WAAV,EAAuB;EAC5B,QAAA,IAAA,CAAK+B,cAAL,EAAA,CAAA;EACD,OAAA;OA/FiE,CAAA;;MAAA,IAkG5DG,CAAAA,OAlG4D,GAkGlD,MAAM;QACtB,OAAO,IAAA,CAAKJ,UAAL,CAAgB,IAAKlF,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAApD,CAAP,CAAA;OAnGkE,CAAA;;EAAA,IAAA,IAAA,CAsG5DsF,eAtG4D,GAsG1C1I,IAAI,CAC5B,MAAM,CACJ,IAAA,CAAKmD,OAAL,CAAaX,KADT,EAEJ,IAAKW,CAAAA,OAAL,CAAa+D,YAFT,EAGJ,IAAK/D,CAAAA,OAAL,CAAamE,UAHT,EAIJ,IAAA,CAAKZ,qBAJD,CADsB,EAO5B,CAAClE,KAAD,EAAQ0E,YAAR,EAAsBI,UAAtB,EAAkCb,iBAAlC,KAAwD;EACtD,MAAA,MAAM1E,GAAG,GACP,IAAA,CAAK4E,2BAAL,CAAiC9F,MAAjC,GAA0C,CAA1C,GACIO,IAAI,CAACW,GAAL,CAAS,GAAG,KAAK4E,2BAAjB,CADJ,GAEI,CAHN,CAAA;QAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;QAEA,MAAMgC,YAAY,GAAG,IAAA,CAAKlC,iBAAL,CAAuBmC,KAAvB,CAA6B,CAA7B,EAAgC7G,GAAhC,CAArB,CAAA;;QAEA,KAAK,IAAIW,CAAC,GAAGX,GAAb,EAAkBW,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;EAChC,QAAA,MAAMnC,GAAG,GAAG+G,UAAU,CAAC5E,CAAD,CAAtB,CAAA;EACA,QAAA,MAAMmG,YAAY,GAAGpC,iBAAiB,CAAClG,GAAD,CAAtC,CAAA;EACA,QAAA,MAAM4B,KAAK,GAAGwG,YAAY,CAACjG,CAAC,GAAG,CAAL,CAAZ,GACViG,YAAY,CAACjG,CAAC,GAAG,CAAL,CAAZ,CAAqBJ,GADX,GAEV4E,YAFJ,CAAA;EAGA,QAAA,MAAM4B,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GACIA,YADJ,GAEI,KAAK1F,OAAL,CAAa4F,YAAb,CAA0BrG,CAA1B,CAHN,CAAA;EAIA,QAAA,MAAMJ,GAAG,GAAGH,KAAK,GAAG2G,IAApB,CAAA;UACAH,YAAY,CAACjG,CAAD,CAAZ,GAAkB;EAAE1B,UAAAA,KAAK,EAAE0B,CAAT;YAAYP,KAAZ;YAAmB2G,IAAnB;YAAyBxG,GAAzB;EAA8B/B,UAAAA,GAAAA;WAAhD,CAAA;EACD,OAAA;;QAED,IAAKkG,CAAAA,iBAAL,GAAyBkC,YAAzB,CAAA;EACA,MAAA,OAAOA,YAAP,CAAA;EACD,KAhC2B,EAiC5B;QACEpI,GAAG,EAA2C,iBADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAjC4B,CAtGsC,CAAA;MAAA,IA6IpE8H,CAAAA,cA7IoE,GA6InDtI,IAAI,CACnB,MAAM,CAAC,IAAK0I,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKL,YAA9C,CADa,EAEnB,CAACO,YAAD,EAAeK,SAAf,EAA0BZ,YAA1B,KAA2C;QACzC,MAAMlG,KAAK,GAAGoG,cAAc,CAAC;UAC3BK,YAD2B;UAE3BK,SAF2B;EAG3BZ,QAAAA,YAAAA;EAH2B,OAAD,CAA5B,CAAA;;EAKA,MAAA,IACElG,KAAK,CAACE,UAAN,KAAqB,IAAA,CAAKF,KAAL,CAAWE,UAAhC,IACAF,KAAK,CAACK,QAAN,KAAmB,KAAKL,KAAL,CAAWK,QAFhC,EAGE;UACA,IAAKL,CAAAA,KAAL,GAAaA,KAAb,CAAA;EACA,QAAA,IAAA,CAAKyF,MAAL,EAAA,CAAA;EACD,OAAA;;EACD,MAAA,OAAO,KAAKzF,KAAZ,CAAA;EACD,KAhBkB,EAiBnB;QACE3B,GAAG,EAA2C,gBADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAjBmB,CA7I+C,CAAA;EAAA,IAAA,IAAA,CAoK5DyI,UApK4D,GAoK/CjJ,IAAI,CACvB,MAAM,CACJ,IAAA,CAAKmD,OAAL,CAAaoE,cADT,EAEJ,IAAKrF,CAAAA,KAFD,EAGJ,IAAKiB,CAAAA,OAAL,CAAad,QAHT,EAIJ,IAAA,CAAKc,OAAL,CAAaX,KAJT,CADiB,EAOvB,CAAC+E,cAAD,EAAiBrF,KAAjB,EAAwBG,QAAxB,EAAkCG,KAAlC,KAA4C;EAC1C,MAAA,OAAO+E,cAAc,CAAC,EACpB,GAAGrF,KADiB;UAEpBG,QAFoB;EAGpBG,QAAAA,KAAK,EAAEA,KAAAA;EAHa,OAAD,CAArB,CAAA;EAKD,KAbsB,EAcvB;QACEjC,GAAG,EAA2C,YADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAduB,CApK2C,CAAA;MAAA,IAwLpE0I,CAAAA,eAxLoE,GAwLlDlJ,IAAI,CACpB,MAAM,CACJ,IAAA,CAAKiJ,UAAL,EADI,EAEJ,IAAA,CAAKP,eAAL,EAFI,EAGJ,IAAKvF,CAAAA,OAAL,CAAawC,cAHT,CADc,EAMpB,CAACwD,OAAD,EAAUR,YAAV,EAAwBhD,cAAxB,KAA2C;EACzC,MAAA,MAAMyD,kBAAkB,GACrBpI,KAAD,IAAoBqI,cAAD,IAAyC;EAAA,QAAA,IAAA,qBAAA,CAAA;;EAC1D,QAAA,MAAMC,IAAI,GAAG,IAAA,CAAK7C,iBAAL,CAAuBzF,KAAvB,CAAb,CAAA;;UAEA,IAAI,CAACqI,cAAL,EAAqB;EACnB,UAAA,OAAA;EACD,SAAA;;EAED,QAAA,MAAME,gBAAgB,GAAG5D,cAAc,CAAC0D,cAAD,EAAiB,IAAjB,CAAvC,CAAA;EACA,QAAA,MAAMG,QAAQ,GAAA,CAAA,qBAAA,GAAG,IAAK9C,CAAAA,qBAAL,CAA2B4C,IAAI,CAAC/I,GAAhC,CAAH,KAAA,IAAA,GAAA,qBAAA,GAA2C+I,IAAI,CAACR,IAA9D,CAAA;;UAEA,IAAIS,gBAAgB,KAAKC,QAAzB,EAAmC;EACjC,UAAA,IAAIF,IAAI,CAACnH,KAAL,GAAa,IAAA,CAAKiG,YAAtB,EAAoC;EAClC,YAAA,IAA6C,IAAKjF,CAAAA,OAAL,CAAa3C,KAA1D,EAAiE;EAC/DoB,cAAAA,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2B0H,gBAAgB,GAAGC,QAA9C,CAAA,CAAA;EACD,aAAA;;cAED,IAAI,CAAC,IAAKC,CAAAA,iBAAV,EAA6B;gBAC3B,IAAKtB,CAAAA,eAAL,CACE,IAAKC,CAAAA,YAAL,IAAqBmB,gBAAgB,GAAGC,QAAxC,CADF,EAEE;EACE3D,gBAAAA,SAAS,EAAE,KADb;EAEEC,gBAAAA,IAAI,EAAE,KAAA;iBAJV,CAAA,CAAA;EAOD,aAAA;EACF,WAAA;;EAED,UAAA,IAAA,CAAKa,2BAAL,CAAiChE,IAAjC,CAAsC3B,KAAtC,CAAA,CAAA;EACA,UAAA,IAAA,CAAK0F,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;cAE3B,CAAC4C,IAAI,CAAC/I,GAAN,GAAYgJ,gBAAAA;aAFd,CAAA;EAIA,UAAA,IAAA,CAAK5B,MAAL,EAAA,CAAA;EACD,SAAA;SAlCL,CAAA;;QAqCA,MAAM+B,YAAyC,GAAG,EAAlD,CAAA;QAEA,MAAMC,sBAAuD,GAAG,EAAhE,CAAA;;EAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGV,OAAO,CAACtI,MAA9B,EAAsC+I,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;EAAA,QAAA,IAAA,qBAAA,CAAA;;EAClD,QAAA,MAAMlH,CAAC,GAAGyG,OAAO,CAACS,CAAD,CAAjB,CAAA;EACA,QAAA,MAAME,WAAW,GAAGnB,YAAY,CAACjG,CAAD,CAAhC,CAAA;EAEA,QAAA,MAAM4G,IAAI,GAAG,EACX,GAAGQ,WADQ;EAEXnE,UAAAA,cAAc,EAAGgE,sBAAsB,CAACjH,CAAD,CAAtB,GACf,CAAA,qBAAA,GAAA,IAAA,CAAKkE,mBAAL,CAAyBlE,CAAzB,CADe,KACgB0G,IAAAA,GAAAA,qBAAAA,GAAAA,kBAAkB,CAAC1G,CAAD,CAAA;WAHrD,CAAA;UAKAgH,YAAY,CAAC/G,IAAb,CAAkB2G,IAAlB,CAAA,CAAA;EACD,OAAA;;QAED,IAAK1C,CAAAA,mBAAL,GAA2B+C,sBAA3B,CAAA;EAEA,MAAA,OAAOD,YAAP,CAAA;EACD,KA/DmB,EAgEpB;QACEnJ,GAAG,EAA2C,YADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAhEoB,CAxL8C,CAAA;;EAAA,IAAA,IAAA,CA8PpEuJ,cA9PoE,GA8PnD,UACfhE,QADe,EAMZ,KAAA,EAAA;QAAA,IAJH;EACEiE,QAAAA,KAAK,GAAG,OADV;EAEEC,QAAAA,YAAY,GAAG,KAAI,CAAC9G,OAAL,CAAaqE,kBAAAA;EAF9B,OAIG,sBADwB,EACxB,GAAA,KAAA,CAAA;EACH,MAAA,MAAMvC,MAAM,GAAG,KAAI,CAACmD,YAApB,CAAA;;EACA,MAAA,MAAMU,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;QAEA,IAAIuB,KAAK,KAAK,MAAd,EAAsB;UACpB,IAAIjE,QAAQ,IAAId,MAAhB,EAAwB;EACtB+E,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SAFD,MAEO,IAAIjE,QAAQ,IAAId,MAAM,GAAG6D,IAAzB,EAA+B;EACpCkB,UAAAA,KAAK,GAAG,KAAR,CAAA;EACD,SAFM,MAEA;EACLA,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SAAA;EACF,OAAA;;EAED,MAAA,MAAM7G,OAAO,GAAG;EACd0C,QAAAA,SAAS,EAAEoE,YADG;EAEdnE,QAAAA,IAAI,EAAE,KAAA;SAFR,CAAA;;QAIA,IAAIkE,KAAK,KAAK,OAAd,EAAuB;EACrB,QAAA,KAAI,CAAC7B,eAAL,CAAqBpC,QAArB,EAA+B5C,OAA/B,CAAA,CAAA;EACD,OAFD,MAEO,IAAI6G,KAAK,KAAK,KAAd,EAAqB;EAC1B,QAAA,KAAI,CAAC7B,eAAL,CAAqBpC,QAAQ,GAAG+C,IAAhC,EAAsC3F,OAAtC,CAAA,CAAA;EACD,OAFM,MAEA,IAAI6G,KAAK,KAAK,QAAd,EAAwB;UAC7B,KAAI,CAAC7B,eAAL,CAAqBpC,QAAQ,GAAG+C,IAAI,GAAG,CAAvC,EAA0C3F,OAA1C,CAAA,CAAA;EACD,OAAA;OA5RiE,CAAA;;EAAA,IAAA,IAAA,CA+RpE+G,aA/RoE,GA+RpD,UACdlJ,KADc,EAGX,MAAA,EAAA;QAAA,IADH;EAAEgJ,QAAAA,KAAK,GAAG,MAAV;UAAkB,GAAGG,IAAAA;EAArB,OACG,uBADiD,EACjD,GAAA,MAAA,CAAA;;EACH,MAAA,MAAMxB,YAAY,GAAG,KAAI,CAACD,eAAL,EAArB,CAAA;;EACA,MAAA,MAAMzD,MAAM,GAAG,KAAI,CAACmD,YAApB,CAAA;;EACA,MAAA,MAAMU,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;QACA,MAAM;EAAEjG,QAAAA,KAAAA;SAAU,GAAA,KAAI,CAACW,OAAvB,CAAA;QAEA,MAAM2G,WAAW,GAAGnB,YAAY,CAACvH,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYV,IAAI,CAACW,GAAL,CAASf,KAAT,EAAgBwB,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;QAEA,IAAI,CAACsH,WAAL,EAAkB;EAChB,QAAA,OAAA;EACD,OAAA;;QAED,IAAIE,KAAK,KAAK,MAAd,EAAsB;EACpB,QAAA,IAAIF,WAAW,CAACxH,GAAZ,IAAmB2C,MAAM,GAAG6D,IAAT,GAAgB,KAAI,CAAC3F,OAAL,CAAakE,gBAApD,EAAsE;EACpE2C,UAAAA,KAAK,GAAG,KAAR,CAAA;EACD,SAFD,MAEO,IACLF,WAAW,CAAC3H,KAAZ,IACA8C,MAAM,GAAG,KAAI,CAAC9B,OAAL,CAAaiE,kBAFjB,EAGL;EACA4C,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SALM,MAKA;EACL,UAAA,OAAA;EACD,SAAA;EACF,OAAA;;QAED,MAAMjE,QAAQ,GACZiE,KAAK,KAAK,KAAV,GACIF,WAAW,CAACxH,GAAZ,GAAkB,KAAI,CAACa,OAAL,CAAakE,gBADnC,GAEIyC,WAAW,CAAC3H,KAAZ,GAAoB,KAAI,CAACgB,OAAL,CAAaiE,kBAHvC,CAAA;;EAKA,MAAA,KAAI,CAAC2C,cAAL,CAAoBhE,QAApB,EAA8B;UAAEiE,KAAF;UAAS,GAAGG,IAAAA;SAA1C,CAAA,CAAA;OAhUkE,CAAA;;EAAA,IAAA,IAAA,CAmUpEC,YAnUoE,GAmUrD,MAAA;EAAA,MAAA,IAAA,qBAAA,CAAA;;QAAA,OACb,CAAC,+BAAK1B,eAAL,EAAA,CAAuB,KAAKvF,OAAL,CAAaX,KAAb,GAAqB,CAA5C,4CAAgDF,GAAhD,KACC,KAAKa,OAAL,CAAa+D,YADf,IAC+B,IAAA,CAAK/D,OAAL,CAAagE,UAF/B,CAAA;OAnUqD,CAAA;;EAAA,IAAA,IAAA,CAuU5DgB,eAvU4D,GAuU1C,CACxBlD,MADwB,EAExB9B,OAFwB,KAGrB;QACHoF,YAAY,CAAC,IAAK8B,CAAAA,gBAAN,CAAZ,CAAA;QAEA,IAAKZ,CAAAA,iBAAL,GAAyBxE,MAAzB,CAAA;QACA,IAAK9B,CAAAA,OAAL,CAAamH,UAAb,CAAwBrF,MAAxB,EAAgC9B,OAAhC,EAAyC,IAAzC,CAAA,CAAA;EAEA,MAAA,IAAIkH,gBAAJ,CAAA;;QAEA,MAAME,KAAK,GAAG,MAAM;UAClB,IAAIC,UAAU,GAAG,IAAA,CAAKpC,YAAtB,CAAA;EACA,QAAA,IAAA,CAAKiC,gBAAL,GAAwBA,gBAAgB,GAAG7B,UAAU,CAAC,MAAM;EAC1D,UAAA,IAAI,IAAK6B,CAAAA,gBAAL,KAA0BA,gBAA9B,EAAgD;EAC9C,YAAA,OAAA;EACD,WAAA;;EAED,UAAA,IAAI,IAAKjC,CAAAA,YAAL,KAAsBoC,UAA1B,EAAsC;cACpC,IAAKf,CAAAA,iBAAL,GAAyBvD,SAAzB,CAAA;EACA,YAAA,OAAA;EACD,WAAA;;YACDsE,UAAU,GAAG,KAAKpC,YAAlB,CAAA;YACAmC,KAAK,EAAA,CAAA;WAV8C,EAWlD,GAXkD,CAArD,CAAA;SAFF,CAAA;;QAgBAA,KAAK,EAAA,CAAA;OAlW6D,CAAA;;MAAA,IAqWpEE,CAAAA,OArWoE,GAqW1D,MAAM;QACd,IAAK/D,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;EACA,MAAA,IAAA,CAAKiB,MAAL,EAAA,CAAA;OAvWkE,CAAA;;MAClE,IAAKd,CAAAA,UAAL,CAAgB1G,KAAhB,CAAA,CAAA;EACA,IAAA,IAAA,CAAKkI,UAAL,GAAkB,IAAKlF,CAAAA,OAAL,CAAasE,WAA/B,CAAA;EACA,IAAA,IAAA,CAAKW,YAAL,GAAoB,IAAKjF,CAAAA,OAAL,CAAa8D,aAAjC,CAAA;EAEA,IAAA,IAAA,CAAKqB,cAAL,EAAA,CAAA;EACD,GAAA;;EA5BwE,CAAA;;EAiY3E,MAAMoC,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9B7D,KAJ8B,KAK3B;IACH,OAAO2D,GAAG,IAAIC,IAAd,EAAoB;MAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;EACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;MAEA,IAAIC,YAAY,GAAG/D,KAAnB,EAA0B;QACxB2D,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;EACD,KAFD,MAEO,IAAIC,YAAY,GAAG/D,KAAnB,EAA0B;QAC/B4D,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;EACD,KAFM,MAEA;EACL,MAAA,OAAOA,MAAP,CAAA;EACD,KAAA;EACF,GAAA;;IAED,IAAIH,GAAG,GAAG,CAAV,EAAa;MACX,OAAOA,GAAG,GAAG,CAAb,CAAA;EACD,GAFD,MAEO;EACL,IAAA,OAAO,CAAP,CAAA;EACD,GAAA;EACF,CAxBD,CAAA;;EA0BA,SAASrC,cAAT,CAQG,KAAA,EAAA;IAAA,IARqB;MACtBK,YADsB;MAEtBK,SAFsB;EAGtBZ,IAAAA,YAAAA;KAKC,GAAA,KAAA,CAAA;EACD,EAAA,MAAM5F,KAAK,GAAGmG,YAAY,CAAC9H,MAAb,GAAsB,CAApC,CAAA;;IACA,MAAMmK,SAAS,GAAIhK,KAAD,IAAmB2H,YAAY,CAAC3H,KAAD,CAAZ,CAAqBmB,KAA1D,CAAA;;IAEA,MAAMC,UAAU,GAAGsI,uBAAuB,CAAC,CAAD,EAAIlI,KAAJ,EAAWwI,SAAX,EAAsB5C,YAAtB,CAA1C,CAAA;IACA,IAAI7F,QAAQ,GAAGH,UAAf,CAAA;;EAEA,EAAA,OACEG,QAAQ,GAAGC,KAAX,IACAmG,YAAY,CAACpG,QAAD,CAAZ,CAAwBD,GAAxB,GAA8B8F,YAAY,GAAGY,SAF/C,EAGE;MACAzG,QAAQ,EAAA,CAAA;EACT,GAAA;;IAED,OAAO;MAAEH,UAAF;EAAcG,IAAAA,QAAAA;KAArB,CAAA;EACD;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.development.js","sources":["../../src/utils.ts","../../src/index.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","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === undefined) {\n this.scrollDelta += measuredItemSize - itemSize\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, 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","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","observer","ResizeObserver","entries","contentRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","onResize","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","offset","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","canSmooth","sync","toOffset","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","setOptions","Object","forEach","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","scrollingDelay","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","requested","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","align","smoothScroll","scrollToIndex","rest","getTotalSize","scrollCheckFrame","scrollToFn","check","lastOffset","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":";;;;;;;;;;;;;;;;EAIO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;IACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;EACA,EAAA,IAAIC,MAAJ,CAAA;EAEA,EAAA,OAAO,MAAM;EACX,IAAA,IAAIC,OAAJ,CAAA;EACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;MAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;MAEA,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;;MAIA,IAAI,CAACH,WAAL,EAAkB;EAChB,MAAA,OAAOP,MAAP,CAAA;EACD,KAAA;;EAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;EAEA,IAAA,IAAIM,UAAJ,CAAA;EACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;EAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;MACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;EAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;EAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;EACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;EACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;EAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;EACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;EACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;YACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;EACD,SAAA;;EACD,QAAA,OAAOA,GAAP,CAAA;SALF,CAAA;;EAQAG,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;EAWD,KAAA;;EAED,IAAA,OAAOF,MAAP,CAAA;KAhDF,CAAA;EAkDD;;ECvBD;AAEa2B,QAAAA,mBAAmB,GAAIhB,KAAD,IAAmBA,MAA/C;AAEMiB,QAAAA,qBAAqB,GAAIC,KAAD,IAAkB;EACrD,EAAA,MAAMC,KAAK,GAAGf,IAAI,CAACU,GAAL,CAASI,KAAK,CAACE,UAAN,GAAmBF,KAAK,CAACG,QAAlC,EAA4C,CAA5C,CAAd,CAAA;EACA,EAAA,MAAMC,GAAG,GAAGlB,IAAI,CAACW,GAAL,CAASG,KAAK,CAACK,QAAN,GAAiBL,KAAK,CAACG,QAAhC,EAA0CH,KAAK,CAACM,KAAN,GAAc,CAAxD,CAAZ,CAAA;IAEA,MAAMC,GAAG,GAAG,EAAZ,CAAA;;IAEA,KAAK,IAAIC,CAAC,GAAGP,KAAb,EAAoBO,CAAC,IAAIJ,GAAzB,EAA8BI,CAAC,EAA/B,EAAmC;MACjCD,GAAG,CAACE,IAAJ,CAASD,CAAT,CAAA,CAAA;EACD,GAAA;;EAED,EAAA,OAAOD,GAAP,CAAA;EACD,EAXM;;EAaP,MAAMG,gBAAgB,GAAG,CACvBC,QADuB,EAEvBC,EAFuB,KAGpB;EACH,EAAA,IAAIC,IAAU,GAAG;MAAEC,MAAM,EAAE,CAAC,CAAX;EAAcC,IAAAA,KAAK,EAAE,CAAC,CAAA;KAAvC,CAAA;EAEA,EAAA,OAAQC,IAAD,IAAgB;MACrB,IACEL,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GACIF,IAAI,CAACD,KAAL,KAAeF,IAAI,CAACE,KADxB,GAEIC,IAAI,CAACF,MAAL,KAAgBD,IAAI,CAACC,MAH3B,EAIE;QACAF,EAAE,CAACI,IAAD,CAAF,CAAA;EACD,KAAA;;EAEDH,IAAAA,IAAI,GAAGG,IAAP,CAAA;KATF,CAAA;EAWD,CAjBD,CAAA;;QAmBaG,kBAAkB,GAAG,CAChCR,QADgC,EAEhCC,EAFgC,KAG7B;EACH,EAAA,MAAMQ,QAAQ,GAAG,IAAIC,cAAJ,CAAoBC,OAAD,IAAa;EAAA,IAAA,IAAA,SAAA,EAAA,UAAA,CAAA;;EAC/CV,IAAAA,EAAE,CAAC;QACDG,KAAK,EAAA,CAAA,SAAA,GAAEO,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAYC,WAAZ,CAAwBR,KAD9B;QAEDD,MAAM,EAAA,CAAA,UAAA,GAAEQ,OAAO,CAAC,CAAD,CAAT,KAAE,IAAA,GAAA,KAAA,CAAA,GAAA,UAAA,CAAYC,WAAZ,CAAwBT,MAAAA;EAF/B,KAAD,CAAF,CAAA;EAID,GALgB,CAAjB,CAAA;;EAOA,EAAA,IAAI,CAACH,QAAQ,CAACa,aAAd,EAA6B;EAC3B,IAAA,OAAA;EACD,GAAA;;EAEDZ,EAAAA,EAAE,CAACD,QAAQ,CAACa,aAAT,CAAuBC,qBAAvB,EAAD,CAAF,CAAA;EAEAL,EAAAA,QAAQ,CAACM,OAAT,CAAiBf,QAAQ,CAACa,aAA1B,CAAA,CAAA;EAEA,EAAA,OAAO,MAAM;EACXJ,IAAAA,QAAQ,CAACO,SAAT,CAAmBhB,QAAQ,CAACa,aAA5B,CAAA,CAAA;KADF,CAAA;EAGD,EAtBM;QAwBMI,iBAAiB,GAAG,CAC/BjB,QAD+B,EAE/BC,EAF+B,KAG5B;EACH,EAAA,MAAMiB,gBAAgB,GAAGnB,gBAAgB,CAACC,QAAD,EAAWC,EAAX,CAAzC,CAAA;;EACA,EAAA,MAAMkB,QAAQ,GAAG,MACfD,gBAAgB,CAAC;EACfd,IAAAA,KAAK,EAAEJ,QAAQ,CAACa,aAAT,CAAuBO,UADf;EAEfjB,IAAAA,MAAM,EAAEH,QAAQ,CAACa,aAAT,CAAuBQ,WAAAA;EAFhB,GAAD,CADlB,CAAA;;EAMA,EAAA,IAAI,CAACrB,QAAQ,CAACa,aAAd,EAA6B;EAC3B,IAAA,OAAA;EACD,GAAA;;IAEDM,QAAQ,EAAA,CAAA;IAERnB,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDH,QAAlD,EAA4D;EAC1DI,IAAAA,OAAO,EAAE,KADiD;EAE1DC,IAAAA,OAAO,EAAE,IAAA;KAFX,CAAA,CAAA;EAKA,EAAA,OAAO,MAAM;EACXxB,IAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDN,QAArD,CAAA,CAAA;KADF,CAAA;EAGD,EAzBM;EA6BP,MAAMO,WAAW,GAAG;EAClBC,EAAAA,OAAO,EAAE,CAAC,YAAD,EAAe,WAAf,CADS;EAElBC,EAAAA,MAAM,EAAE,CAAC,SAAD,EAAY,SAAZ,CAAA;EAFU,CAApB,CAAA;;EAKA,MAAMC,oBAAoB,GAAIC,IAAD,IAAwB;EACnD,EAAA,OAAO,CAAC9B,QAAD,EAAkCC,EAAlC,KAAmE;EACxE,IAAA,IAAI,CAACD,QAAQ,CAACa,aAAd,EAA6B;EAC3B,MAAA,OAAA;EACD,KAAA;;MAED,MAAMkB,KAAK,GAAGL,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;MACA,MAAME,KAAK,GAAGN,WAAW,CAACI,IAAD,CAAX,CAAkB,CAAlB,CAAd,CAAA;EAEA,IAAA,IAAIG,KAAa,GAAGjC,QAAQ,CAACa,aAAT,CAAuBkB,KAAvB,CAApB,CAAA;EACA,IAAA,IAAIG,KAAa,GAAGlC,QAAQ,CAACa,aAAT,CAAuBmB,KAAvB,CAApB,CAAA;;MAEA,MAAMG,MAAM,GAAG,MAAM;EACnB,MAAA,MAAMC,MAAM,GACVpC,QAAQ,CAACa,aAAT,CAAuBb,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8BwB,KAA9B,GAAsCC,KAA7D,CADF,CAAA;EAGA/B,MAAAA,EAAE,CAAC1B,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYmD,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAAtC,CAAD,CAAF,CAAA;OAJF,CAAA;;MAOAF,MAAM,EAAA,CAAA;;MAEN,MAAMG,QAAQ,GAAIC,CAAD,IAAc;EAC7B,MAAA,MAAMC,MAAM,GAAGD,CAAC,CAACE,aAAjB,CAAA;EACA,MAAA,MAAMC,OAAO,GAAGF,MAAM,CAACT,KAAD,CAAtB,CAAA;EACA,MAAA,MAAMY,OAAO,GAAGH,MAAM,CAACR,KAAD,CAAtB,CAAA;;EAEA,MAAA,IAAIhC,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B0B,KAAK,GAAGS,OAAtC,GAAgDR,KAAK,GAAGS,OAA5D,EAAqE;UACnER,MAAM,EAAA,CAAA;EACP,OAAA;;EAEDF,MAAAA,KAAK,GAAGS,OAAR,CAAA;EACAR,MAAAA,KAAK,GAAGS,OAAR,CAAA;OAVF,CAAA;;MAaA3C,QAAQ,CAACa,aAAT,CAAuBS,gBAAvB,CAAwC,QAAxC,EAAkDgB,QAAlD,EAA4D;EAC1Df,MAAAA,OAAO,EAAE,KADiD;EAE1DC,MAAAA,OAAO,EAAE,IAAA;OAFX,CAAA,CAAA;EAKA,IAAA,OAAO,MAAM;EACXxB,MAAAA,QAAQ,CAACa,aAAT,CAAuBY,mBAAvB,CAA2C,QAA3C,EAAqDa,QAArD,CAAA,CAAA;OADF,CAAA;KAtCF,CAAA;EA0CD,CA3CD,CAAA;;QA6CaM,oBAAoB,GAAGf,oBAAoB,CAAC,SAAD,EAAjD;QACMgB,mBAAmB,GAAGhB,oBAAoB,CAAC,QAAD,EAAhD;QAEMiB,cAAc,GAAG,CAC5BnB,OAD4B,EAE5B3B,QAF4B,KAGzB;EACH,EAAA,OAAQ2B,OAAD,CAAqBb,qBAArB,EAAA,CACLd,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,OAA9B,GAAwC,QADnC,CAAP,CAAA;EAGD,EAPM;QASMwC,YAAY,GAAG,CAC1BX,MAD0B,EAAA,IAAA,EAG1BpC,QAH0B,KAIvB;EAAA,EAAA,IAAA,qBAAA,CAAA;;IAAA,IAFH;MAAEgD,SAAF;EAAaC,IAAAA,IAAAA;KAEV,GAAA,IAAA,CAAA;EACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;EAEC,EAAA,CAAA,qBAAA,GAACrC,QAAQ,CAACa,aAAV,2CAAoCsC,QAApC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAoCA,QAApC,CAA+C;MAC9C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADF;EAE9CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;KAFlC,CAAA,CAAA;EAIF,EAXM;QAaMC,aAAa,GAAG,CAC3BlB,MAD2B,EAAA,KAAA,EAG3BpC,QAH2B,KAIxB;EAAA,EAAA,IAAA,sBAAA,CAAA;;IAAA,IAFH;MAAEgD,SAAF;EAAaC,IAAAA,IAAAA;KAEV,GAAA,KAAA,CAAA;EACH,EAAA,MAAMC,QAAQ,GAAGD,IAAI,GAAGb,MAAH,GAAYA,MAAM,GAAGpC,QAAQ,CAACM,OAAT,CAAiB+B,YAA3D,CAAA;EAEC,EAAA,CAAA,sBAAA,GAACrC,QAAQ,CAACa,aAAV,4CAAqCsC,QAArC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,sBAAA,CAAqCA,QAArC,CAAgD;MAC/C,CAACnD,QAAQ,CAACM,OAAT,CAAiBC,UAAjB,GAA8B,MAA9B,GAAuC,KAAxC,GAAgD2C,QADD;EAE/CE,IAAAA,QAAQ,EAAEJ,SAAS,GAAG,QAAH,GAAcK,SAAAA;KAFlC,CAAA,CAAA;EAIF,EAXM;EA2DA,MAAME,WAAN,CAAoE;IAuBzEC,WAAW,CAAClG,KAAD,EAAyD;EAAA,IAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;MAAA,IAtB5DmG,CAAAA,MAsB4D,GAtB1B,EAsB0B,CAAA;MAAA,IApBpE5C,CAAAA,aAoBoE,GApB7B,IAoB6B,CAAA;MAAA,IAnBpE6C,CAAAA,WAmBoE,GAnB7C,KAmB6C,CAAA;MAAA,IAlB5DC,CAAAA,oBAkB4D,GAlBC,IAkBD,CAAA;MAAA,IAjB5DC,CAAAA,iBAiB4D,GAjBhC,EAiBgC,CAAA;MAAA,IAhB5DC,CAAAA,qBAgB4D,GAhBf,EAgBe,CAAA;MAAA,IAf5DC,CAAAA,2BAe4D,GAfpB,EAeoB,CAAA;MAAA,IAZ5DC,CAAAA,WAY4D,GAZtC,CAYsC,CAAA;MAAA,IAT5DC,CAAAA,mBAS4D,GANhE,EAMgE,CAAA;EAAA,IAAA,IAAA,CALpE3E,KAKoE,GALlB;EAChDE,MAAAA,UAAU,EAAE,CADoC;EAEhDG,MAAAA,QAAQ,EAAE,CAAA;OAGwD,CAAA;;MAAA,IAQpEuE,CAAAA,UARoE,GAQtD3G,IAAD,IAA4D;EACvE4G,MAAAA,MAAM,CAACvD,OAAP,CAAerD,IAAf,CAAqB6G,CAAAA,OAArB,CAA6B,KAAkB,IAAA;EAAA,QAAA,IAAjB,CAACzG,GAAD,EAAM0G,KAAN,CAAiB,GAAA,KAAA,CAAA;UAC7C,IAAI,OAAOA,KAAP,KAAiB,WAArB,EAAkC,OAAQ9G,IAAD,CAAcI,GAAd,CAAP,CAAA;SADpC,CAAA,CAAA;EAIA,MAAA,IAAA,CAAK4C,OAAL,GAAe;EACb3C,QAAAA,KAAK,EAAE,KADM;EAEb0G,QAAAA,aAAa,EAAE,CAFF;EAGb7E,QAAAA,QAAQ,EAAE,CAHG;EAIb8E,QAAAA,YAAY,EAAE,CAJD;EAKbC,QAAAA,UAAU,EAAE,CALC;EAMbC,QAAAA,kBAAkB,EAAE,CANP;EAObC,QAAAA,gBAAgB,EAAE,CAPL;EAQblE,QAAAA,UAAU,EAAE,KARC;EASbmE,QAAAA,UAAU,EAAEvF,mBATC;EAUbwF,QAAAA,cAAc,EAAEvF,qBAVH;EAWbwF,QAAAA,kBAAkB,EAAE,IAXP;UAYbvG,QAAQ,EAAE,MAAM,EAZH;UAabyE,cAba;EAcb+B,QAAAA,WAAW,EAAE;EAAEzE,UAAAA,KAAK,EAAE,CAAT;EAAYD,UAAAA,MAAM,EAAE,CAAA;WAdpB;EAebkC,QAAAA,YAAY,EAAE,CAfD;EAgBbyC,QAAAA,cAAc,EAAE,GAhBH;UAiBb,GAAGxH,IAAAA;SAjBL,CAAA;OAbkE,CAAA;;MAAA,IAkC5DyH,CAAAA,MAlC4D,GAkCnD,MAAM;EAAA,MAAA,IAAA,qBAAA,EAAA,aAAA,CAAA;;EACrB,MAAA,CAAA,qBAAA,GAAA,CAAA,aAAA,GAAA,IAAA,CAAKzE,OAAL,EAAajC,QAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,qBAAA,CAAA,IAAA,CAAA,aAAA,EAAwB,IAAxB,CAAA,CAAA;OAnCkE,CAAA;;MAAA,IAsC5D2G,CAAAA,OAtC4D,GAsClD,MAAM;QACtB,IAAKvB,CAAAA,MAAL,CAAYwB,MAAZ,CAAmBC,OAAnB,CAA4Bf,CAAAA,OAA5B,CAAqCgB,CAAD,IAAOA,CAAC,EAA5C,CAAA,CAAA;QACA,IAAK1B,CAAAA,MAAL,GAAc,EAAd,CAAA;QACA,IAAK5C,CAAAA,aAAL,GAAqB,IAArB,CAAA;OAzCkE,CAAA;;MAAA,IA4CpEuE,CAAAA,SA5CoE,GA4CxD,MAAM;EAChB,MAAA,OAAO,MAAM;EACX,QAAA,IAAA,CAAKJ,OAAL,EAAA,CAAA;SADF,CAAA;OA7CkE,CAAA;;MAAA,IAkDpEK,CAAAA,WAlDoE,GAkDtD,MAAM;EAClB,MAAA,MAAMxE,aAAa,GAAG,IAAA,CAAKP,OAAL,CAAagF,gBAAb,EAAtB,CAAA;;EAEA,MAAA,IAAI,IAAKzE,CAAAA,aAAL,KAAuBA,aAA3B,EAA0C;EACxC,QAAA,IAAA,CAAKmE,OAAL,EAAA,CAAA;UAEA,IAAKnE,CAAAA,aAAL,GAAqBA,aAArB,CAAA;;EACA,QAAA,IAAA,CAAK0E,eAAL,CAAqB,IAAKC,CAAAA,YAA1B,EAAwC;EACtCxC,UAAAA,SAAS,EAAE,KAD2B;EAEtCC,UAAAA,IAAI,EAAE,IAFgC;EAGtCwC,UAAAA,SAAS,EAAE,KAAA;WAHb,CAAA,CAAA;;EAMA,QAAA,IAAA,CAAKhC,MAAL,CAAY3D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAaE,kBAAb,CAAgC,IAAhC,EAAuCH,IAAD,IAAU;YAC9C,IAAKqF,CAAAA,UAAL,GAAkBrF,IAAlB,CAAA;EACA,UAAA,IAAA,CAAKsF,cAAL,EAAA,CAAA;EACD,SAHD,CADF,CAAA,CAAA;EAOA,QAAA,IAAA,CAAKlC,MAAL,CAAY3D,IAAZ,CACE,IAAKQ,CAAAA,OAAL,CAAasC,oBAAb,CAAkC,IAAlC,EAAyCR,MAAD,IAAY;EAClD,UAAA,IAAI,IAAKuB,CAAAA,oBAAL,KAA8B,IAAlC,EAAwC;cACtCiC,YAAY,CAAC,IAAKjC,CAAAA,oBAAN,CAAZ,CAAA;cACA,IAAKA,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;EACD,WAAA;;EAED,UAAA,IAAI,IAAK6B,CAAAA,YAAL,KAAsBpD,MAA1B,EAAkC;cAChC,IAAKoD,CAAAA,YAAL,GAAoBpD,MAApB,CAAA;cACA,IAAKsB,CAAAA,WAAL,GAAmB,IAAnB,CAAA;cACA,IAAKK,CAAAA,WAAL,GAAmB,CAAnB,CAAA;EAEA,YAAA,IAAA,CAAKJ,oBAAL,GAA4BkC,UAAU,CAAC,MAAM;gBAC3C,IAAKlC,CAAAA,oBAAL,GAA4B,IAA5B,CAAA;gBACA,IAAKD,CAAAA,WAAL,GAAmB,KAAnB,CAAA;EAEA,cAAA,IAAA,CAAKqB,MAAL,EAAA,CAAA;EACD,aALqC,EAKnC,IAAA,CAAKzE,OAAL,CAAawE,cALsB,CAAtC,CAAA;EAMD,WAXD,MAWO;cACL,IAAKpB,CAAAA,WAAL,GAAmB,KAAnB,CAAA;cACA,IAAKK,CAAAA,WAAL,GAAmB,CAAnB,CAAA;EACD,WAAA;;EAED,UAAA,IAAA,CAAK4B,cAAL,EAAA,CAAA;EACD,SAvBD,CADF,CAAA,CAAA;EA0BD,OA3CD,MA2CO,IAAI,CAAC,IAAA,CAAKjC,WAAV,EAAuB;EAC5B,QAAA,IAAA,CAAKiC,cAAL,EAAA,CAAA;EACD,OAAA;OAlGiE,CAAA;;MAAA,IAqG5DG,CAAAA,OArG4D,GAqGlD,MAAM;QACtB,OAAO,IAAA,CAAKJ,UAAL,CAAgB,IAAKpF,CAAAA,OAAL,CAAaC,UAAb,GAA0B,OAA1B,GAAoC,QAApD,CAAP,CAAA;OAtGkE,CAAA;;EAAA,IAAA,IAAA,CAyG5DwF,eAzG4D,GAyG1C5I,IAAI,CAC5B,MAAM,CACJ,IAAA,CAAKmD,OAAL,CAAaX,KADT,EAEJ,IAAKW,CAAAA,OAAL,CAAagE,YAFT,EAGJ,IAAKhE,CAAAA,OAAL,CAAaoE,UAHT,EAIJ,IAAA,CAAKb,qBAJD,CADsB,EAO5B,CAAClE,KAAD,EAAQ2E,YAAR,EAAsBI,UAAtB,EAAkCd,iBAAlC,KAAwD;EACtD,MAAA,MAAM1E,GAAG,GACP,IAAA,CAAK4E,2BAAL,CAAiC9F,MAAjC,GAA0C,CAA1C,GACIO,IAAI,CAACW,GAAL,CAAS,GAAG,KAAK4E,2BAAjB,CADJ,GAEI,CAHN,CAAA;QAIA,IAAKA,CAAAA,2BAAL,GAAmC,EAAnC,CAAA;QAEA,MAAMkC,YAAY,GAAG,IAAA,CAAKpC,iBAAL,CAAuBqC,KAAvB,CAA6B,CAA7B,EAAgC/G,GAAhC,CAArB,CAAA;;QAEA,KAAK,IAAIW,CAAC,GAAGX,GAAb,EAAkBW,CAAC,GAAGF,KAAtB,EAA6BE,CAAC,EAA9B,EAAkC;EAChC,QAAA,MAAMnC,GAAG,GAAGgH,UAAU,CAAC7E,CAAD,CAAtB,CAAA;EACA,QAAA,MAAMqG,YAAY,GAAGtC,iBAAiB,CAAClG,GAAD,CAAtC,CAAA;EACA,QAAA,MAAM4B,KAAK,GAAG0G,YAAY,CAACnG,CAAC,GAAG,CAAL,CAAZ,GACVmG,YAAY,CAACnG,CAAC,GAAG,CAAL,CAAZ,CAAqBJ,GADX,GAEV6E,YAFJ,CAAA;EAGA,QAAA,MAAM6B,IAAI,GACR,OAAOD,YAAP,KAAwB,QAAxB,GACIA,YADJ,GAEI,KAAK5F,OAAL,CAAa8F,YAAb,CAA0BvG,CAA1B,CAHN,CAAA;EAIA,QAAA,MAAMJ,GAAG,GAAGH,KAAK,GAAG6G,IAApB,CAAA;UACAH,YAAY,CAACnG,CAAD,CAAZ,GAAkB;EAAE1B,UAAAA,KAAK,EAAE0B,CAAT;YAAYP,KAAZ;YAAmB6G,IAAnB;YAAyB1G,GAAzB;EAA8B/B,UAAAA,GAAAA;WAAhD,CAAA;EACD,OAAA;;QAED,IAAKkG,CAAAA,iBAAL,GAAyBoC,YAAzB,CAAA;EACA,MAAA,OAAOA,YAAP,CAAA;EACD,KAhC2B,EAiC5B;QACEtI,GAAG,EAA2C,iBADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAjC4B,CAzGsC,CAAA;MAAA,IAgJpEgI,CAAAA,cAhJoE,GAgJnDxI,IAAI,CACnB,MAAM,CAAC,IAAK4I,CAAAA,eAAL,EAAD,EAAyB,IAAKD,CAAAA,OAAL,EAAzB,EAAyC,IAAA,CAAKN,YAA9C,CADa,EAEnB,CAACQ,YAAD,EAAeK,SAAf,EAA0Bb,YAA1B,KAA2C;QACzC,MAAMnG,KAAK,GAAGsG,cAAc,CAAC;UAC3BK,YAD2B;UAE3BK,SAF2B;EAG3Bb,QAAAA,YAAAA;EAH2B,OAAD,CAA5B,CAAA;;EAKA,MAAA,IACEnG,KAAK,CAACE,UAAN,KAAqB,IAAA,CAAKF,KAAL,CAAWE,UAAhC,IACAF,KAAK,CAACK,QAAN,KAAmB,KAAKL,KAAL,CAAWK,QAFhC,EAGE;UACA,IAAKL,CAAAA,KAAL,GAAaA,KAAb,CAAA;EACA,QAAA,IAAA,CAAK0F,MAAL,EAAA,CAAA;EACD,OAAA;;EACD,MAAA,OAAO,KAAK1F,KAAZ,CAAA;EACD,KAhBkB,EAiBnB;QACE3B,GAAG,EAA2C,gBADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAjBmB,CAhJ+C,CAAA;EAAA,IAAA,IAAA,CAuK5D2I,UAvK4D,GAuK/CnJ,IAAI,CACvB,MAAM,CACJ,IAAA,CAAKmD,OAAL,CAAaqE,cADT,EAEJ,IAAKtF,CAAAA,KAFD,EAGJ,IAAKiB,CAAAA,OAAL,CAAad,QAHT,EAIJ,IAAA,CAAKc,OAAL,CAAaX,KAJT,CADiB,EAOvB,CAACgF,cAAD,EAAiBtF,KAAjB,EAAwBG,QAAxB,EAAkCG,KAAlC,KAA4C;EAC1C,MAAA,OAAOgF,cAAc,CAAC,EACpB,GAAGtF,KADiB;UAEpBG,QAFoB;EAGpBG,QAAAA,KAAK,EAAEA,KAAAA;EAHa,OAAD,CAArB,CAAA;EAKD,KAbsB,EAcvB;QACEjC,GAAG,EAA2C,YADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAduB,CAvK2C,CAAA;MAAA,IA2LpE4I,CAAAA,eA3LoE,GA2LlDpJ,IAAI,CACpB,MAAM,CACJ,IAAA,CAAKmJ,UAAL,EADI,EAEJ,IAAA,CAAKP,eAAL,EAFI,EAGJ,IAAKzF,CAAAA,OAAL,CAAawC,cAHT,CADc,EAMpB,CAAC0D,OAAD,EAAUR,YAAV,EAAwBlD,cAAxB,KAA2C;EACzC,MAAA,MAAM2D,kBAAkB,GACrBtI,KAAD,IAAoBuI,cAAD,IAAyC;EAAA,QAAA,IAAA,qBAAA,CAAA;;EAC1D,QAAA,MAAMC,IAAI,GAAG,IAAA,CAAK/C,iBAAL,CAAuBzF,KAAvB,CAAb,CAAA;;UAEA,IAAI,CAACuI,cAAL,EAAqB;EACnB,UAAA,OAAA;EACD,SAAA;;EAED,QAAA,MAAME,gBAAgB,GAAG9D,cAAc,CAAC4D,cAAD,EAAiB,IAAjB,CAAvC,CAAA;EACA,QAAA,MAAMG,QAAQ,GAAA,CAAA,qBAAA,GAAG,IAAKhD,CAAAA,qBAAL,CAA2B8C,IAAI,CAACjJ,GAAhC,CAAH,KAAA,IAAA,GAAA,qBAAA,GAA2CiJ,IAAI,CAACR,IAA9D,CAAA;;UAEA,IAAIS,gBAAgB,KAAKC,QAAzB,EAAmC;EACjC,UAAA,IAAIF,IAAI,CAACrH,KAAL,GAAa,IAAA,CAAKkG,YAAtB,EAAoC;EAClC,YAAA,IAA6C,IAAKlF,CAAAA,OAAL,CAAa3C,KAA1D,EAAiE;EAC/DoB,cAAAA,OAAO,CAACC,IAAR,CAAa,YAAb,EAA2B4H,gBAAgB,GAAGC,QAA9C,CAAA,CAAA;EACD,aAAA;;EAED,YAAA,IAAI,IAAKC,CAAAA,iBAAL,KAA2BzD,SAA/B,EAA0C;EACxC,cAAA,IAAA,CAAKU,WAAL,IAAoB6C,gBAAgB,GAAGC,QAAvC,CAAA;;EAEA,cAAA,IAAA,CAAKtB,eAAL,CAAqB,IAAA,CAAKC,YAAL,GAAoB,IAAA,CAAKzB,WAA9C,EAA2D;EACzDf,gBAAAA,SAAS,EAAE,KAD8C;EAEzDC,gBAAAA,IAAI,EAAE,KAFmD;EAGzDwC,gBAAAA,SAAS,EAAE,KAAA;iBAHb,CAAA,CAAA;EAKD,aAAA;EACF,WAAA;;EAED,UAAA,IAAA,CAAK3B,2BAAL,CAAiChE,IAAjC,CAAsC3B,KAAtC,CAAA,CAAA;EACA,UAAA,IAAA,CAAK0F,qBAAL,GAA6B,EAC3B,GAAG,KAAKA,qBADmB;cAE3B,CAAC8C,IAAI,CAACjJ,GAAN,GAAYkJ,gBAAAA;aAFd,CAAA;EAIA,UAAA,IAAA,CAAK7B,MAAL,EAAA,CAAA;EACD,SAAA;SAlCL,CAAA;;QAqCA,MAAMgC,YAAyC,GAAG,EAAlD,CAAA;QAEA,MAAMC,sBAAuD,GAAG,EAAhE,CAAA;;EAEA,MAAA,KAAK,IAAIC,CAAC,GAAG,CAAR,EAAWC,GAAG,GAAGV,OAAO,CAACxI,MAA9B,EAAsCiJ,CAAC,GAAGC,GAA1C,EAA+CD,CAAC,EAAhD,EAAoD;EAAA,QAAA,IAAA,qBAAA,CAAA;;EAClD,QAAA,MAAMpH,CAAC,GAAG2G,OAAO,CAACS,CAAD,CAAjB,CAAA;EACA,QAAA,MAAME,WAAW,GAAGnB,YAAY,CAACnG,CAAD,CAAhC,CAAA;EAEA,QAAA,MAAM8G,IAAI,GAAG,EACX,GAAGQ,WADQ;EAEXrE,UAAAA,cAAc,EAAGkE,sBAAsB,CAACnH,CAAD,CAAtB,GACf,CAAA,qBAAA,GAAA,IAAA,CAAKmE,mBAAL,CAAyBnE,CAAzB,CADe,KACgB4G,IAAAA,GAAAA,qBAAAA,GAAAA,kBAAkB,CAAC5G,CAAD,CAAA;WAHrD,CAAA;UAKAkH,YAAY,CAACjH,IAAb,CAAkB6G,IAAlB,CAAA,CAAA;EACD,OAAA;;QAED,IAAK3C,CAAAA,mBAAL,GAA2BgD,sBAA3B,CAAA;EAEA,MAAA,OAAOD,YAAP,CAAA;EACD,KA/DmB,EAgEpB;QACErJ,GAAG,EAA2C,YADhD;EAEEC,MAAAA,KAAK,EAAE,MAAM,IAAK2C,CAAAA,OAAL,CAAa3C,KAAAA;EAF5B,KAhEoB,CA3L8C,CAAA;;EAAA,IAAA,IAAA,CAiQpEyJ,cAjQoE,GAiQnD,UACflE,QADe,EAMZ,KAAA,EAAA;QAAA,IAJH;EACEmE,QAAAA,KAAK,GAAG,OADV;EAEEC,QAAAA,YAAY,GAAG,KAAI,CAAChH,OAAL,CAAasE,kBAAAA;EAF9B,OAIG,sBADwB,EACxB,GAAA,KAAA,CAAA;EACH,MAAA,MAAMxC,MAAM,GAAG,KAAI,CAACoD,YAApB,CAAA;;EACA,MAAA,MAAMW,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;QAEA,IAAIuB,KAAK,KAAK,MAAd,EAAsB;UACpB,IAAInE,QAAQ,IAAId,MAAhB,EAAwB;EACtBiF,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SAFD,MAEO,IAAInE,QAAQ,IAAId,MAAM,GAAG+D,IAAzB,EAA+B;EACpCkB,UAAAA,KAAK,GAAG,KAAR,CAAA;EACD,SAFM,MAEA;EACLA,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SAAA;EACF,OAAA;;EAED,MAAA,MAAM/G,OAAO,GAAG;EACd0C,QAAAA,SAAS,EAAEsE,YADG;EAEdrE,QAAAA,IAAI,EAAE,KAFQ;EAGdwC,QAAAA,SAAS,EAAE,IAAA;SAHb,CAAA;;QAKA,IAAI4B,KAAK,KAAK,OAAd,EAAuB;EACrB,QAAA,KAAI,CAAC9B,eAAL,CAAqBrC,QAArB,EAA+B5C,OAA/B,CAAA,CAAA;EACD,OAFD,MAEO,IAAI+G,KAAK,KAAK,KAAd,EAAqB;EAC1B,QAAA,KAAI,CAAC9B,eAAL,CAAqBrC,QAAQ,GAAGiD,IAAhC,EAAsC7F,OAAtC,CAAA,CAAA;EACD,OAFM,MAEA,IAAI+G,KAAK,KAAK,QAAd,EAAwB;UAC7B,KAAI,CAAC9B,eAAL,CAAqBrC,QAAQ,GAAGiD,IAAI,GAAG,CAAvC,EAA0C7F,OAA1C,CAAA,CAAA;EACD,OAAA;OAhSiE,CAAA;;EAAA,IAAA,IAAA,CAmSpEiH,aAnSoE,GAmSpD,UACdpJ,KADc,EAOX,MAAA,EAAA;QAAA,IALH;EACEkJ,QAAAA,KAAK,GAAG,MADV;EAEEC,QAAAA,YAAY,GAAG,KAAI,CAAChH,OAAL,CAAasE,kBAF9B;UAGE,GAAG4C,IAAAA;EAHL,OAKG,uBADuB,EACvB,GAAA,MAAA,CAAA;;EACH,MAAA,MAAMxB,YAAY,GAAG,KAAI,CAACD,eAAL,EAArB,CAAA;;EACA,MAAA,MAAM3D,MAAM,GAAG,KAAI,CAACoD,YAApB,CAAA;;EACA,MAAA,MAAMW,IAAI,GAAG,KAAI,CAACL,OAAL,EAAb,CAAA;;QACA,MAAM;EAAEnG,QAAAA,KAAAA;SAAU,GAAA,KAAI,CAACW,OAAvB,CAAA;QAEA,MAAM6G,WAAW,GAAGnB,YAAY,CAACzH,IAAI,CAACU,GAAL,CAAS,CAAT,EAAYV,IAAI,CAACW,GAAL,CAASf,KAAT,EAAgBwB,KAAK,GAAG,CAAxB,CAAZ,CAAD,CAAhC,CAAA;;QAEA,IAAI,CAACwH,WAAL,EAAkB;EAChB,QAAA,OAAA;EACD,OAAA;;QAED,IAAIE,KAAK,KAAK,MAAd,EAAsB;EACpB,QAAA,IAAIF,WAAW,CAAC1H,GAAZ,IAAmB2C,MAAM,GAAG+D,IAAT,GAAgB,KAAI,CAAC7F,OAAL,CAAamE,gBAApD,EAAsE;EACpE4C,UAAAA,KAAK,GAAG,KAAR,CAAA;EACD,SAFD,MAEO,IACLF,WAAW,CAAC7H,KAAZ,IACA8C,MAAM,GAAG,KAAI,CAAC9B,OAAL,CAAakE,kBAFjB,EAGL;EACA6C,UAAAA,KAAK,GAAG,OAAR,CAAA;EACD,SALM,MAKA;EACL,UAAA,OAAA;EACD,SAAA;EACF,OAAA;;QAED,MAAMnE,QAAQ,GACZmE,KAAK,KAAK,KAAV,GACIF,WAAW,CAAC1H,GAAZ,GAAkB,KAAI,CAACa,OAAL,CAAamE,gBADnC,GAEI0C,WAAW,CAAC7H,KAAZ,GAAoB,KAAI,CAACgB,OAAL,CAAakE,kBAHvC,CAAA;;EAKA,MAAA,KAAI,CAAC4C,cAAL,CAAoBlE,QAApB,EAA8B;UAAEmE,KAAF;UAASC,YAAT;UAAuB,GAAGE,IAAAA;SAAxD,CAAA,CAAA;OAxUkE,CAAA;;EAAA,IAAA,IAAA,CA2UpEC,YA3UoE,GA2UrD,MAAA;EAAA,MAAA,IAAA,qBAAA,CAAA;;QAAA,OACb,CAAC,+BAAK1B,eAAL,EAAA,CAAuB,KAAKzF,OAAL,CAAaX,KAAb,GAAqB,CAA5C,4CAAgDF,GAAhD,KACC,KAAKa,OAAL,CAAagE,YADf,IAC+B,IAAA,CAAKhE,OAAL,CAAaiE,UAF/B,CAAA;OA3UqD,CAAA;;EAAA,IAAA,IAAA,CA+U5DgB,eA/U4D,GA+U1C,CACxBnD,MADwB,EAOrB,KAAA,KAAA;QAAA,IALH;UACEqD,SADF;UAEEzC,SAFF;EAGEC,QAAAA,IAAAA;SAEC,GAAA,KAAA,CAAA;QACH2C,YAAY,CAAC,IAAK8B,CAAAA,gBAAN,CAAZ,CAAA;;EAEA,MAAA,IAAIjC,SAAJ,EAAe;UACb,IAAKqB,CAAAA,iBAAL,GAAyB1E,MAAzB,CAAA;EACD,OAAA;;EACD,MAAA,IAAA,CAAK9B,OAAL,CAAaqH,UAAb,CAAwBvF,MAAxB,EAAgC;UAAEY,SAAF;EAAaC,QAAAA,IAAAA;EAAb,OAAhC,EAAqD,IAArD,CAAA,CAAA;EAEA,MAAA,IAAIyE,gBAAJ,CAAA;;QAEA,MAAME,KAAK,GAAG,MAAM;UAClB,IAAIC,UAAU,GAAG,IAAA,CAAKrC,YAAtB,CAAA;EACA,QAAA,IAAA,CAAKkC,gBAAL,GAAwBA,gBAAgB,GAAG7B,UAAU,CAAC,MAAM;EAC1D,UAAA,IAAI,IAAK6B,CAAAA,gBAAL,KAA0BA,gBAA9B,EAAgD;EAC9C,YAAA,OAAA;EACD,WAAA;;EAED,UAAA,IAAI,IAAKlC,CAAAA,YAAL,KAAsBqC,UAA1B,EAAsC;cACpC,IAAKf,CAAAA,iBAAL,GAAyBzD,SAAzB,CAAA;EACA,YAAA,OAAA;EACD,WAAA;;YACDwE,UAAU,GAAG,KAAKrC,YAAlB,CAAA;YACAoC,KAAK,EAAA,CAAA;WAV8C,EAWlD,GAXkD,CAArD,CAAA;SAFF,CAAA;;QAgBAA,KAAK,EAAA,CAAA;OAhX6D,CAAA;;MAAA,IAmXpEE,CAAAA,OAnXoE,GAmX1D,MAAM;QACd,IAAKjE,CAAAA,qBAAL,GAA6B,EAA7B,CAAA;EACA,MAAA,IAAA,CAAKkB,MAAL,EAAA,CAAA;OArXkE,CAAA;;MAClE,IAAKd,CAAAA,UAAL,CAAgB3G,KAAhB,CAAA,CAAA;EACA,IAAA,IAAA,CAAKoI,UAAL,GAAkB,IAAKpF,CAAAA,OAAL,CAAauE,WAA/B,CAAA;EACA,IAAA,IAAA,CAAKW,YAAL,GAAoB,IAAKlF,CAAAA,OAAL,CAAa+D,aAAjC,CAAA;EAEA,IAAA,IAAA,CAAKsB,cAAL,EAAA,CAAA;EACD,GAAA;;EA7BwE,CAAA;;EAgZ3E,MAAMoC,uBAAuB,GAAG,CAC9BC,GAD8B,EAE9BC,IAF8B,EAG9BC,eAH8B,EAI9B9D,KAJ8B,KAK3B;IACH,OAAO4D,GAAG,IAAIC,IAAd,EAAoB;MAClB,MAAME,MAAM,GAAI,CAACH,GAAG,GAAGC,IAAP,IAAe,CAAhB,GAAqB,CAApC,CAAA;EACA,IAAA,MAAMG,YAAY,GAAGF,eAAe,CAACC,MAAD,CAApC,CAAA;;MAEA,IAAIC,YAAY,GAAGhE,KAAnB,EAA0B;QACxB4D,GAAG,GAAGG,MAAM,GAAG,CAAf,CAAA;EACD,KAFD,MAEO,IAAIC,YAAY,GAAGhE,KAAnB,EAA0B;QAC/B6D,IAAI,GAAGE,MAAM,GAAG,CAAhB,CAAA;EACD,KAFM,MAEA;EACL,MAAA,OAAOA,MAAP,CAAA;EACD,KAAA;EACF,GAAA;;IAED,IAAIH,GAAG,GAAG,CAAV,EAAa;MACX,OAAOA,GAAG,GAAG,CAAb,CAAA;EACD,GAFD,MAEO;EACL,IAAA,OAAO,CAAP,CAAA;EACD,GAAA;EACF,CAxBD,CAAA;;EA0BA,SAASrC,cAAT,CAQG,KAAA,EAAA;IAAA,IARqB;MACtBK,YADsB;MAEtBK,SAFsB;EAGtBb,IAAAA,YAAAA;KAKC,GAAA,KAAA,CAAA;EACD,EAAA,MAAM7F,KAAK,GAAGqG,YAAY,CAAChI,MAAb,GAAsB,CAApC,CAAA;;IACA,MAAMqK,SAAS,GAAIlK,KAAD,IAAmB6H,YAAY,CAAC7H,KAAD,CAAZ,CAAqBmB,KAA1D,CAAA;;IAEA,MAAMC,UAAU,GAAGwI,uBAAuB,CAAC,CAAD,EAAIpI,KAAJ,EAAW0I,SAAX,EAAsB7C,YAAtB,CAA1C,CAAA;IACA,IAAI9F,QAAQ,GAAGH,UAAf,CAAA;;EAEA,EAAA,OACEG,QAAQ,GAAGC,KAAX,IACAqG,YAAY,CAACtG,QAAD,CAAZ,CAAwBD,GAAxB,GAA8B+F,YAAY,GAAGa,SAF/C,EAGE;MACA3G,QAAQ,EAAA,CAAA;EACT,GAAA;;IAED,OAAO;MAAEH,UAAF;EAAcG,IAAAA,QAAAA;KAArB,CAAA;EACD;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VirtualCore={})}(this,(function(t){"use strict";function e(t,e,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=t();if(!(l.length!==o.length||l.some(((t,e)=>o[e]!==t))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=e(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const t=Math.round(100*(Date.now()-i))/100,e=Math.round(100*(Date.now()-r))/100,n=e/16,o=(t,e)=>{for(t=String(t);t.length<e;)t=" "+t;return t};console.info("%c⏱ "+o(e,5)+" /"+o(t,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 s=t=>t,n=t=>{const e=Math.max(t.startIndex-t.overscan,0),s=Math.min(t.endIndex+t.overscan,t.count-1),n=[];for(let t=e;t<=s;t++)n.push(t);return n},o={element:["scrollLeft","scrollTop"],window:["scrollX","scrollY"]},i=t=>(e,s)=>{if(!e.scrollElement)return;const n=o[t][0],i=o[t][1];let l=e.scrollElement[n],r=e.scrollElement[i];const h=()=>{const t=e.scrollElement[e.options.horizontal?n:i];s(Math.max(0,t-e.options.scrollMargin))};h();const c=t=>{const s=t.currentTarget,o=s[n],c=s[i];(e.options.horizontal?l-o:r-c)&&h(),l=o,r=c};return e.scrollElement.addEventListener("scroll",c,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",c)}},l=i("element"),r=i("window"),h=(t,e)=>t.getBoundingClientRect()[e.options.horizontal?"width":"height"];t.Virtualizer=class{constructor(t){var o=this;this.unsubs=[],this.scrollElement=null,this.isScrolling=!1,this.isScrollingTimeoutId=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.measureElementCache={},this.range={startIndex:0,endIndex:0},this.setOptions=t=>{Object.entries(t).forEach((e=>{let[s,n]=e;void 0===n&&delete t[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:s,rangeExtractor:n,enableSmoothScroll:!0,onChange:()=>{},measureElement:h,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,...t}},this.notify=()=>{var t,e;null==(t=(e=this.options).onChange)||t.call(e,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((t=>t())),this.unsubs=[],this.scrollElement=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{const t=this.options.getScrollElement();this.scrollElement!==t?(this.cleanup(),this.scrollElement=t,this._scrollToOffset(this.scrollOffset,{canSmooth:!1,sync:!0}),this.unsubs.push(this.options.observeElementRect(this,(t=>{this.scrollRect=t,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(t=>{null!==this.isScrollingTimeoutId&&(clearTimeout(this.isScrollingTimeoutId),this.isScrollingTimeoutId=null),this.scrollOffset!==t?(this.isScrolling=!0,this.
|
|
11
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VirtualCore={})}(this,(function(t){"use strict";function e(t,e,s){let n,o=[];return()=>{let i;s.key&&null!=s.debug&&s.debug()&&(i=Date.now());const l=t();if(!(l.length!==o.length||l.some(((t,e)=>o[e]!==t))))return n;let r;if(o=l,s.key&&null!=s.debug&&s.debug()&&(r=Date.now()),n=e(...l),null==s||null==s.onChange||s.onChange(n),s.key&&null!=s.debug&&s.debug()){const t=Math.round(100*(Date.now()-i))/100,e=Math.round(100*(Date.now()-r))/100,n=e/16,o=(t,e)=>{for(t=String(t);t.length<e;)t=" "+t;return t};console.info("%c⏱ "+o(e,5)+" /"+o(t,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 s=t=>t,n=t=>{const e=Math.max(t.startIndex-t.overscan,0),s=Math.min(t.endIndex+t.overscan,t.count-1),n=[];for(let t=e;t<=s;t++)n.push(t);return n},o={element:["scrollLeft","scrollTop"],window:["scrollX","scrollY"]},i=t=>(e,s)=>{if(!e.scrollElement)return;const n=o[t][0],i=o[t][1];let l=e.scrollElement[n],r=e.scrollElement[i];const h=()=>{const t=e.scrollElement[e.options.horizontal?n:i];s(Math.max(0,t-e.options.scrollMargin))};h();const c=t=>{const s=t.currentTarget,o=s[n],c=s[i];(e.options.horizontal?l-o:r-c)&&h(),l=o,r=c};return e.scrollElement.addEventListener("scroll",c,{capture:!1,passive:!0}),()=>{e.scrollElement.removeEventListener("scroll",c)}},l=i("element"),r=i("window"),h=(t,e)=>t.getBoundingClientRect()[e.options.horizontal?"width":"height"];t.Virtualizer=class{constructor(t){var o=this;this.unsubs=[],this.scrollElement=null,this.isScrolling=!1,this.isScrollingTimeoutId=null,this.measurementsCache=[],this.itemMeasurementsCache={},this.pendingMeasuredCacheIndexes=[],this.scrollDelta=0,this.measureElementCache={},this.range={startIndex:0,endIndex:0},this.setOptions=t=>{Object.entries(t).forEach((e=>{let[s,n]=e;void 0===n&&delete t[s]})),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:s,rangeExtractor:n,enableSmoothScroll:!0,onChange:()=>{},measureElement:h,initialRect:{width:0,height:0},scrollMargin:0,scrollingDelay:150,...t}},this.notify=()=>{var t,e;null==(t=(e=this.options).onChange)||t.call(e,this)},this.cleanup=()=>{this.unsubs.filter(Boolean).forEach((t=>t())),this.unsubs=[],this.scrollElement=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{const t=this.options.getScrollElement();this.scrollElement!==t?(this.cleanup(),this.scrollElement=t,this._scrollToOffset(this.scrollOffset,{canSmooth:!1,sync:!0,requested:!1}),this.unsubs.push(this.options.observeElementRect(this,(t=>{this.scrollRect=t,this.calculateRange()}))),this.unsubs.push(this.options.observeElementOffset(this,(t=>{null!==this.isScrollingTimeoutId&&(clearTimeout(this.isScrollingTimeoutId),this.isScrollingTimeoutId=null),this.scrollOffset!==t?(this.scrollOffset=t,this.isScrolling=!0,this.scrollDelta=0,this.isScrollingTimeoutId=setTimeout((()=>{this.isScrollingTimeoutId=null,this.isScrolling=!1,this.notify()}),this.options.scrollingDelay)):(this.isScrolling=!1,this.scrollDelta=0),this.calculateRange()})))):this.isScrolling||this.calculateRange()},this.getSize=()=>this.scrollRect[this.options.horizontal?"width":"height"],this.getMeasurements=e((()=>[this.options.count,this.options.paddingStart,this.options.getItemKey,this.itemMeasurementsCache]),((t,e,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<t;l++){const t=s(l),o=n[t],r=i[l-1]?i[l-1].end:e,h="number"==typeof o?o:this.options.estimateSize(l),c=r+h;i[l]={index:l,start:r,size:h,end:c,key:t}}return this.measurementsCache=i,i}),{key:!1,debug:()=>this.options.debug}),this.calculateRange=e((()=>[this.getMeasurements(),this.getSize(),this.scrollOffset]),((t,e,s)=>{const n=function(t){let{measurements:e,outerSize:s,scrollOffset:n}=t;const o=e.length-1,i=((t,e,s,n)=>{for(;t<=e;){const o=(t+e)/2|0,i=s(o);if(i<n)t=o+1;else{if(!(i>n))return o;e=o-1}}return t>0?t-1:0})(0,o,(t=>e[t].start),n);let l=i;for(;l<o&&e[l].end<n+s;)l++;return{startIndex:i,endIndex:l}}({measurements:t,outerSize:e,scrollOffset:s});return n.startIndex===this.range.startIndex&&n.endIndex===this.range.endIndex||(this.range=n,this.notify()),this.range}),{key:!1,debug:()=>this.options.debug}),this.getIndexes=e((()=>[this.options.rangeExtractor,this.range,this.options.overscan,this.options.count]),((t,e,s,n)=>t({...e,overscan:s,count:n})),{key:!1,debug:()=>this.options.debug}),this.getVirtualItems=e((()=>[this.getIndexes(),this.getMeasurements(),this.options.measureElement]),((t,e,s)=>{const n=t=>e=>{var n;const o=this.measurementsCache[t];if(!e)return;const i=s(e,this),l=null!=(n=this.itemMeasurementsCache[o.key])?n:o.size;i!==l&&(o.start<this.scrollOffset&&void 0===this.destinationOffset&&(this.scrollDelta+=i-l,this._scrollToOffset(this.scrollOffset+this.scrollDelta,{canSmooth:!1,sync:!1,requested:!1})),this.pendingMeasuredCacheIndexes.push(t),this.itemMeasurementsCache={...this.itemMeasurementsCache,[o.key]:i},this.notify())},o=[],i={};for(let s=0,r=t.length;s<r;s++){var l;const r=t[s],h={...e[r],measureElement:i[r]=null!=(l=this.measureElementCache[r])?l:n(r)};o.push(h)}return this.measureElementCache=i,o}),{key:!1,debug:()=>this.options.debug}),this.scrollToOffset=function(t,e){let{align:s="start",smoothScroll:n=o.options.enableSmoothScroll}=void 0===e?{}:e;const i=o.scrollOffset,l=o.getSize();"auto"===s&&(s=t<=i?"start":t>=i+l?"end":"start");const r={canSmooth:n,sync:!1,requested:!0};"start"===s?o._scrollToOffset(t,r):"end"===s?o._scrollToOffset(t-l,r):"center"===s&&o._scrollToOffset(t-l/2,r)},this.scrollToIndex=function(t,e){let{align:s="auto",smoothScroll:n=o.options.enableSmoothScroll,...i}=void 0===e?{}:e;const l=o.getMeasurements(),r=o.scrollOffset,h=o.getSize(),{count:c}=o.options,a=l[Math.max(0,Math.min(t,c-1))];if(!a)return;if("auto"===s)if(a.end>=r+h-o.options.scrollPaddingEnd)s="end";else{if(!(a.start<=r+o.options.scrollPaddingStart))return;s="start"}const u="end"===s?a.end+o.options.scrollPaddingEnd:a.start-o.options.scrollPaddingStart;o.scrollToOffset(u,{align:s,smoothScroll:n,...i})},this.getTotalSize=()=>{var t;return((null==(t=this.getMeasurements()[this.options.count-1])?void 0:t.end)||this.options.paddingStart)+this.options.paddingEnd},this._scrollToOffset=(t,e)=>{let s,{requested:n,canSmooth:o,sync:i}=e;clearTimeout(this.scrollCheckFrame),n&&(this.destinationOffset=t),this.options.scrollToFn(t,{canSmooth:o,sync:i},this);const l=()=>{let t=this.scrollOffset;this.scrollCheckFrame=s=setTimeout((()=>{this.scrollCheckFrame===s&&(this.scrollOffset!==t?(t=this.scrollOffset,l()):this.destinationOffset=void 0)}),100)};l()},this.measure=()=>{this.itemMeasurementsCache={},this.notify()},this.setOptions(t),this.scrollRect=this.options.initialRect,this.scrollOffset=this.options.initialOffset,this.calculateRange()}},t.defaultKeyExtractor=s,t.defaultRangeExtractor=n,t.elementScroll=(t,e,s)=>{var n;let{canSmooth:o,sync:i}=e;const l=i?t:t+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},t.measureElement=h,t.memo=e,t.observeElementOffset=l,t.observeElementRect=(t,e)=>{const s=new ResizeObserver((t=>{var s,n;e({width:null==(s=t[0])?void 0:s.contentRect.width,height:null==(n=t[0])?void 0:n.contentRect.height})}));if(t.scrollElement)return e(t.scrollElement.getBoundingClientRect()),s.observe(t.scrollElement),()=>{s.unobserve(t.scrollElement)}},t.observeWindowOffset=r,t.observeWindowRect=(t,e)=>{const s=((t,e)=>{let s={height:-1,width:-1};return n=>{(t.options.horizontal?n.width!==s.width:n.height!==s.height)&&e(n),s=n}})(t,e),n=()=>s({width:t.scrollElement.innerWidth,height:t.scrollElement.innerHeight});if(t.scrollElement)return n(),t.scrollElement.addEventListener("resize",n,{capture:!1,passive:!0}),()=>{t.scrollElement.removeEventListener("resize",n)}},t.windowScroll=(t,e,s)=>{var n;let{canSmooth:o,sync:i}=e;const l=i?t:t+s.options.scrollMargin;null==(n=s.scrollElement)||null==n.scrollTo||n.scrollTo({[s.options.horizontal?"left":"top"]:l,behavior:o?"smooth":void 0})},Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
12
12
|
//# sourceMappingURL=index.production.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.production.js","sources":["../../src/utils.ts","../../src/index.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","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.isScrolling = true\n this.scrollOffset = offset\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (!this.destinationOffset) {\n this._scrollToOffset(\n this.scrollOffset + (measuredItemSize - itemSize),\n {\n canSmooth: false,\n sync: false,\n },\n )\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', ...rest }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(offset, options, this)\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","result","deps","depTime","key","debug","Date","now","newDeps","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","scrollProps","element","window","createOffsetObserver","mode","instance","cb","scrollElement","propX","propY","prevX","prevY","scroll","offset","options","horizontal","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","_ref3","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","scrollingDelay","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","canSmooth","sync","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref4","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","destinationOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","scrollCheckFrame","scrollToFn","check","lastOffset","undefined","measure","_ref2","_instance$scrollEleme2","scrollTo","behavior","observer","ResizeObserver","_entries$","_entries$2","contentRect","observe","unobserve","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_ref","_instance$scrollEleme"],"mappings":";;;;;;;;;;mPAIO,SAASA,EACdC,EACAC,EACAC,GAMA,IACIC,EADAC,EAAc,GAGlB,MAAO,KACL,IAAIC,EACAH,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWF,EAAUG,KAAKC,OAE/C,MAAMC,EAAUV,IAMhB,KAHEU,EAAQC,SAAWP,EAAKO,QACxBD,EAAQE,MAAK,CAACC,EAAUC,IAAkBV,EAAKU,KAAWD,KAG1D,OAAOV,EAKT,IAAIY,EAMJ,GARAX,EAAOM,EAGHR,EAAKI,KAAOJ,MAAAA,EAAKK,OAALL,EAAKK,UAAWQ,EAAaP,KAAKC,OAElDN,EAASF,KAAMS,GACX,MAAJR,SAAAA,EAAMc,UAANd,EAAMc,SAAWb,GAEbD,EAAKI,KAAL,MAAYJ,EAAKK,OAALL,EAAKK,QAAW,CAC9B,MAAMU,EAAaC,KAAKC,MAAgC,KAAzBX,KAAKC,MAAQJ,IAAmB,IACzDe,EAAgBF,KAAKC,MAAmC,KAA5BX,KAAKC,MAAQM,IAAsB,IAC/DM,EAAsBD,EAAgB,GAEtCE,EAAM,CAACC,EAAsBC,KAEjC,IADAD,EAAME,OAAOF,GACNA,EAAIZ,OAASa,GAClBD,EAAM,IAAMA,EAEd,OAAOA,CAAP,EAGFG,QAAQC,KAAR,OACSL,EAAIF,EAAe,GAD5B,KACmCE,EAAIL,EAAY,oGAIhCC,KAAKU,IAChB,EACAV,KAAKW,IAAI,IAAM,IAAMR,EAAqB,MAPlD,iBASEnB,MAAAA,OAAAA,EAAAA,EAAMI,IAET,CAED,OAAOH,CAAP,CAEH,CCrBY2B,MAAAA,EAAuBhB,GAAkBA,EAEzCiB,EAAyBC,IACpC,MAAMC,EAAQf,KAAKU,IAAII,EAAME,WAAaF,EAAMG,SAAU,GACpDC,EAAMlB,KAAKW,IAAIG,EAAMK,SAAWL,EAAMG,SAAUH,EAAMM,MAAQ,GAE9DC,EAAM,GAEZ,IAAK,IAAIC,EAAIP,EAAOO,GAAKJ,EAAKI,IAC5BD,EAAIE,KAAKD,GAGX,OAAOD,CAAP,EA2EIG,EAAc,CAClBC,QAAS,CAAC,aAAc,aACxBC,OAAQ,CAAC,UAAW,YAGhBC,EAAwBC,GACrB,CAACC,EAAiCC,KACvC,IAAKD,EAASE,cACZ,OAGF,MAAMC,EAAQR,EAAYI,GAAM,GAC1BK,EAAQT,EAAYI,GAAM,GAEhC,IAAIM,EAAgBL,EAASE,cAAcC,GACvCG,EAAgBN,EAASE,cAAcE,GAE3C,MAAMG,EAAS,KACb,MAAMC,EACJR,EAASE,cAAcF,EAASS,QAAQC,WAAaP,EAAQC,GAE/DH,EAAG9B,KAAKU,IAAI,EAAG2B,EAASR,EAASS,QAAQE,cAAzC,EAGFJ,IAEA,MAAMK,EAAYC,IAChB,MAAMC,EAASD,EAAEE,cACXC,EAAUF,EAAOX,GACjBc,EAAUH,EAAOV,IAEnBJ,EAASS,QAAQC,WAAaL,EAAQW,EAAUV,EAAQW,IAC1DV,IAGFF,EAAQW,EACRV,EAAQW,CAAR,EAQF,OALAjB,EAASE,cAAcgB,iBAAiB,SAAUN,EAAU,CAC1DO,SAAS,EACTC,SAAS,IAGJ,KACLpB,EAASE,cAAcmB,oBAAoB,SAAUT,EAArD,CADF,EAMSU,EAAuBxB,EAAqB,WAC5CyB,EAAsBzB,EAAqB,UAE3C0B,EAAiB,CAC5B5B,EACAI,IAEQJ,EAAoB6B,wBAC1BzB,EAASS,QAAQC,WAAa,QAAU,wBA4ErC,MAsBLgB,YAAYvE,GAAwD,IAAAwE,EAAAC,KAAAA,KArB5DC,OAAkC,GAqB0BD,KAnBpE1B,cAAuC,KAmB6B0B,KAlBpEE,aAAuB,EAkB6CF,KAjB5DG,qBAA6D,KAiBDH,KAhB5DI,kBAA4B,GAgBgCJ,KAf5DK,sBAA6C,GAeeL,KAd5DM,4BAAwC,GAcoBN,KAT5DO,oBAGJ,GAMgEP,KALpE3C,MAAkD,CAChDE,WAAY,EACZG,SAAU,GAGwDsC,KAQpEQ,WAAcjF,IACZkF,OAAOC,QAAQnF,GAAMoF,SAAQC,IAAkB,IAAhBjF,EAAKkF,GAAWD,OACxB,IAAVC,UAA+BtF,EAAaI,EAArB,IAGpCqE,KAAKnB,QAAU,CACbjD,OAAO,EACPkF,cAAe,EACftD,SAAU,EACVuD,aAAc,EACdC,WAAY,EACZC,mBAAoB,EACpBC,iBAAkB,EAClBpC,YAAY,EACZqC,WAAYhE,EACZiE,eAAgBhE,EAChBiE,oBAAoB,EACpBhF,SAAU,OACVuD,iBACA0B,YAAa,CAAEC,MAAO,EAAGC,OAAQ,GACjCzC,aAAc,EACd0C,eAAgB,OACblG,EAjBL,EAbkEyE,KAkC5D0B,OAAS,KAAM,IAAAC,EAAAC,EACrB,OAAAD,GAAAC,EAAA5B,KAAKnB,SAAQxC,WAAbsF,EAAAE,KAAAD,EAAwB5B,KAAxB,EAnCkEA,KAsC5D8B,QAAU,KAChB9B,KAAKC,OAAO8B,OAAOC,SAASrB,SAASsB,GAAMA,MAC3CjC,KAAKC,OAAS,GACdD,KAAK1B,cAAgB,IAArB,EAzCkE0B,KA4CpEkC,UAAY,IACH,KACLlC,KAAK8B,SAAL,EA9CgE9B,KAkDpEmC,YAAc,KACZ,MAAM7D,EAAgB0B,KAAKnB,QAAQuD,mBAE/BpC,KAAK1B,gBAAkBA,GACzB0B,KAAK8B,UAEL9B,KAAK1B,cAAgBA,EACrB0B,KAAKqC,gBAAgBrC,KAAKsC,aAAc,CACtCC,WAAW,EACXC,MAAM,IAGRxC,KAAKC,OAAOnC,KACVkC,KAAKnB,QAAQ4D,mBAAmBzC,MAAO0C,IACrC1C,KAAK2C,WAAaD,EAClB1C,KAAK4C,gBAAL,KAIJ5C,KAAKC,OAAOnC,KACVkC,KAAKnB,QAAQa,qBAAqBM,MAAOpB,IACL,OAA9BoB,KAAKG,uBACP0C,aAAa7C,KAAKG,sBAClBH,KAAKG,qBAAuB,MAG1BH,KAAKsC,eAAiB1D,GACxBoB,KAAKE,aAAc,EACnBF,KAAKsC,aAAe1D,EAEpBoB,KAAKG,qBAAuB2C,YAAW,KACrC9C,KAAKG,qBAAuB,KAC5BH,KAAKE,aAAc,EAEnBF,KAAK0B,QAAL,GACC1B,KAAKnB,QAAQ4C,iBAEhBzB,KAAKE,aAAc,EAGrBF,KAAK4C,gBAAL,MAGM5C,KAAKE,aACfF,KAAK4C,gBACN,EA/FiE5C,KAkG5D+C,QAAU,IACT/C,KAAK2C,WAAW3C,KAAKnB,QAAQC,WAAa,QAAU,UAnGOkB,KAsG5DgD,gBAAkB5H,GACxB,IAAM,CACJ4E,KAAKnB,QAAQlB,MACbqC,KAAKnB,QAAQkC,aACbf,KAAKnB,QAAQsC,WACbnB,KAAKK,yBAEP,CAAC1C,EAAOoD,EAAcI,EAAYf,KAChC,MAAMlD,EACJ8C,KAAKM,4BAA4BtE,OAAS,EACtCO,KAAKW,OAAO8C,KAAKM,6BACjB,EACNN,KAAKM,4BAA8B,GAEnC,MAAM2C,EAAejD,KAAKI,kBAAkB8C,MAAM,EAAGhG,GAErD,IAAK,IAAIW,EAAIX,EAAKW,EAAIF,EAAOE,IAAK,CAChC,MAAMlC,EAAMwF,EAAWtD,GACjBsF,EAAe/C,EAAkBzE,GACjC2B,EAAQ2F,EAAapF,EAAI,GAC3BoF,EAAapF,EAAI,GAAIJ,IACrBsD,EACEqC,EACoB,iBAAjBD,EACHA,EACAnD,KAAKnB,QAAQwE,aAAaxF,GAC1BJ,EAAMH,EAAQ8F,EACpBH,EAAapF,GAAK,CAAE1B,MAAO0B,EAAGP,QAAO8F,OAAM3F,MAAK9B,MACjD,CAGD,OADAqE,KAAKI,kBAAoB6C,EAClBA,CAAP,GAEF,CACEtH,KAAK2H,EACL1H,MAAO,IAAMoE,KAAKnB,QAAQjD,QAzIsCoE,KA6IpE4C,eAAiBxH,GACf,IAAM,CAAC4E,KAAKgD,kBAAmBhD,KAAK+C,UAAW/C,KAAKsC,gBACpD,CAACW,EAAcM,EAAWjB,KACxB,MAAMjF,EAqPZ,SAQGmG,GAAA,IARqBP,aACtBA,EADsBM,UAEtBA,EAFsBjB,aAGtBA,GAKCkB,EACD,MAAM7F,EAAQsF,EAAajH,OAAS,EAG9BuB,EAtCwB,EAC9BkG,EACAC,EACAC,EACA9C,KAEA,KAAO4C,GAAOC,GAAM,CAClB,MAAME,GAAWH,EAAMC,GAAQ,EAAK,EAC9BG,EAAeF,EAAgBC,GAErC,GAAIC,EAAehD,EACjB4C,EAAMG,EAAS,MACV,MAAIC,EAAehD,GAGxB,OAAO+C,EAFPF,EAAOE,EAAS,CAGjB,CACF,CAED,OAAIH,EAAM,EACDA,EAAM,EAEN,CACR,EAekBK,CAAwB,EAAGnG,GAF3BxB,GAAkB8G,EAAa9G,GAAQmB,OAEMgF,GAChE,IAAI5E,EAAWH,EAEf,KACEG,EAAWC,GACXsF,EAAavF,GAAWD,IAAM6E,EAAeiB,GAE7C7F,IAGF,MAAO,CAAEH,aAAYG,WACtB,CA5QmBkF,CAAe,CAC3BK,eACAM,YACAjB,iBASF,OANEjF,EAAME,aAAeyC,KAAK3C,MAAME,YAChCF,EAAMK,WAAasC,KAAK3C,MAAMK,WAE9BsC,KAAK3C,MAAQA,EACb2C,KAAK0B,UAEA1B,KAAK3C,KAAZ,GAEF,CACE1B,KAAK2H,EACL1H,MAAO,IAAMoE,KAAKnB,QAAQjD,QAhKsCoE,KAoK5D+D,WAAa3I,GACnB,IAAM,CACJ4E,KAAKnB,QAAQuC,eACbpB,KAAK3C,MACL2C,KAAKnB,QAAQrB,SACbwC,KAAKnB,QAAQlB,SAEf,CAACyD,EAAgB/D,EAAOG,EAAUG,IACzByD,EAAe,IACjB/D,EACHG,WACAG,MAAOA,KAGX,CACEhC,KAAK2H,EACL1H,MAAO,IAAMoE,KAAKnB,QAAQjD,QApLsCoE,KAwLpEgE,gBAAkB5I,GAChB,IAAM,CACJ4E,KAAK+D,aACL/D,KAAKgD,kBACLhD,KAAKnB,QAAQe,kBAEf,CAACqE,EAAShB,EAAcrD,KACtB,MAAMsE,EACH/H,GAAmBgI,IAAwC,IAAAC,EAC1D,MAAMC,EAAOrE,KAAKI,kBAAkBjE,GAEpC,IAAKgI,EACH,OAGF,MAAMG,EAAmB1E,EAAeuE,EAAgBnE,MAClDuE,EAAQ,OAAAH,EAAGpE,KAAKK,sBAAsBgE,EAAK1I,MAAnCyI,EAA2CC,EAAKjB,KAE1DkB,IAAqBC,IACnBF,EAAK/G,MAAQ0C,KAAKsC,eAKftC,KAAKwE,mBACRxE,KAAKqC,gBACHrC,KAAKsC,cAAgBgC,EAAmBC,GACxC,CACEhC,WAAW,EACXC,MAAM,KAMdxC,KAAKM,4BAA4BxC,KAAK3B,GACtC6D,KAAKK,sBAAwB,IACxBL,KAAKK,sBACR,CAACgE,EAAK1I,KAAM2I,GAEdtE,KAAK0B,SACN,EAGC+C,EAA4C,GAE5CC,EAA0D,CAAA,EAEhE,IAAK,IAAIC,EAAI,EAAGC,EAAMX,EAAQjI,OAAQ2I,EAAIC,EAAKD,IAAK,CAAA,IAAAE,EAClD,MAAMhH,EAAIoG,EAAQU,GAGZN,EAAO,IAFOpB,EAAapF,GAI/B+B,eAAiB8E,EAAuB7G,GACPqG,OAA/BW,EAAA7E,KAAKO,oBAAoB1C,IAAMqG,EAAAA,EAAmBrG,IAEtD4G,EAAa3G,KAAKuG,EACnB,CAID,OAFArE,KAAKO,oBAAsBmE,EAEpBD,CAAP,GAEF,CACE9I,KAAK2H,EACL1H,MAAO,IAAMoE,KAAKnB,QAAQjD,QA1PsCoE,KA8PpE8E,eAAiB,SACfC,EAKGC,GAAA,IAJHC,MACEA,EAAQ,QADVC,aAEEA,EAAenF,EAAKlB,QAAQwC,+BACH,CAAA,EACxB2D,EACH,MAAMpG,EAASmB,EAAKuC,aACdc,EAAOrD,EAAKgD,UAEJ,SAAVkC,IAEAA,EADEF,GAAYnG,EACN,QACCmG,GAAYnG,EAASwE,EACtB,MAEA,SAIZ,MAAMvE,EAAU,CACd0D,UAAW2C,EACX1C,MAAM,GAEM,UAAVyC,EACFlF,EAAKsC,gBAAgB0C,EAAUlG,GACZ,QAAVoG,EACTlF,EAAKsC,gBAAgB0C,EAAW3B,EAAMvE,GACnB,WAAVoG,GACTlF,EAAKsC,gBAAgB0C,EAAW3B,EAAO,EAAGvE,IA3RsBmB,KA+RpEmF,cAAgB,SACdhJ,EAEGiJ,GAAA,IADHH,MAAEA,EAAQ,UAAWI,cAA+B,CAAA,EACjDD,EACH,MAAMnC,EAAelD,EAAKiD,kBACpBpE,EAASmB,EAAKuC,aACdc,EAAOrD,EAAKgD,WACZpF,MAAEA,GAAUoC,EAAKlB,QAEjByG,EAAcrC,EAAa1G,KAAKU,IAAI,EAAGV,KAAKW,IAAIf,EAAOwB,EAAQ,KAErE,IAAK2H,EACH,OAGF,GAAc,SAAVL,EACF,GAAIK,EAAY7H,KAAOmB,EAASwE,EAAOrD,EAAKlB,QAAQqC,iBAClD+D,EAAQ,UACH,MACLK,EAAYhI,OACZsB,EAASmB,EAAKlB,QAAQoC,oBAItB,OAFAgE,EAAQ,OAGT,CAGH,MAAMF,EACM,QAAVE,EACIK,EAAY7H,IAAMsC,EAAKlB,QAAQqC,iBAC/BoE,EAAYhI,MAAQyC,EAAKlB,QAAQoC,mBAEvClB,EAAK+E,eAAeC,EAAU,CAAEE,WAAUI,KAhUwBrF,KAmUpEuF,aAAe,KAAA,IAAAC,EAAA,sBACPxC,kBAAkBhD,KAAKnB,QAAQlB,MAAQ,aAAIF,MAC/CuC,KAAKnB,QAAQkC,cAAgBf,KAAKnB,QAAQmC,UAF/B,EAnUqDhB,KAuU5DqC,gBAAkB,CACxBzD,EACAC,KAOA,IAAI4G,EALJ5C,aAAa7C,KAAKyF,kBAElBzF,KAAKwE,kBAAoB5F,EACzBoB,KAAKnB,QAAQ6G,WAAW9G,EAAQC,EAASmB,MAIzC,MAAM2F,EAAQ,KACZ,IAAIC,EAAa5F,KAAKsC,aACtBtC,KAAKyF,iBAAmBA,EAAmB3C,YAAW,KAChD9C,KAAKyF,mBAAqBA,IAI1BzF,KAAKsC,eAAiBsD,GAI1BA,EAAa5F,KAAKsC,aAClBqD,KAJE3F,KAAKwE,uBAAoBqB,EAItB,GACJ,IAXH,EAcFF,GAAK,EAlW6D3F,KAqWpE8F,QAAU,KACR9F,KAAKK,sBAAwB,GAC7BL,KAAK0B,QAAL,EAtWA1B,KAAKQ,WAAWjF,GAChByE,KAAK2C,WAAa3C,KAAKnB,QAAQyC,YAC/BtB,KAAKsC,aAAetC,KAAKnB,QAAQiC,cAEjCd,KAAK4C,gBACN,qEAvF0B,CAC3BhE,EAD2BmH,EAG3B3H,KACG,IAAA4H,EAAA,IAFHzD,UAAEA,EAAFC,KAAaA,GAEVuD,EACH,MAAMhB,EAAWvC,EAAO5D,EAASA,EAASR,EAASS,QAAQE,oBAE1DiH,EAAC5H,EAASE,gBAAV,QAAqC2H,UAArCD,EAAqCC,SAAW,CAC/C,CAAC7H,EAASS,QAAQC,WAAa,OAAS,OAAQiG,EAChDmB,SAAU3D,EAAY,cAAWsD,GAFlC,4EAvI+B,CAChCzH,EACAC,KAEA,MAAM8H,EAAW,IAAIC,gBAAgB1F,IAAY,IAAA2F,EAAAC,EAC/CjI,EAAG,CACDkD,MAAO,OAAF8E,EAAE3F,EAAQ,SAAR,EAAA2F,EAAYE,YAAYhF,MAC/BC,OAAQ,OAAF8E,EAAE5F,EAAQ,SAAR,EAAA4F,EAAYC,YAAY/E,QAFlC,IAMF,GAAKpD,EAASE,cAQd,OAJAD,EAAGD,EAASE,cAAcuB,yBAE1BsG,EAASK,QAAQpI,EAASE,eAEnB,KACL6H,EAASM,UAAUrI,EAASE,cAA5B,CADF,8CAK+B,CAC/BF,EACAC,KAEA,MAAMqI,EA/CiB,EACvBtI,EACAC,KAEA,IAAIsI,EAAa,CAAEnF,QAAS,EAAGD,OAAQ,GAEvC,OAAQmB,KAEJtE,EAASS,QAAQC,WACb4D,EAAKnB,QAAUoF,EAAKpF,MACpBmB,EAAKlB,SAAWmF,EAAKnF,SAEzBnD,EAAGqE,GAGLiE,EAAOjE,CAAP,CATF,EAyCyBkE,CAAiBxI,EAAUC,GAC9CwI,EAAW,IACfH,EAAiB,CACfnF,MAAOnD,EAASE,cAAcwI,WAC9BtF,OAAQpD,EAASE,cAAcyI,cAGnC,GAAK3I,EAASE,cAWd,OAPAuI,IAEAzI,EAASE,cAAcgB,iBAAiB,SAAUuH,EAAU,CAC1DtH,SAAS,EACTC,SAAS,IAGJ,KACLpB,EAASE,cAAcmB,oBAAoB,SAAUoH,EAArD,CADF,iBAqE0B,CAC1BjI,EAD0BoI,EAG1B5I,KACG,IAAA6I,EAAA,IAFH1E,UAAEA,EAAFC,KAAaA,GAEVwE,EACH,MAAMjC,EAAWvC,EAAO5D,EAASA,EAASR,EAASS,QAAQE,oBAE1DkI,EAAC7I,EAASE,gBAAV,QAAoC2H,UAApCgB,EAAoChB,SAAW,CAC9C,CAAC7H,EAASS,QAAQC,WAAa,OAAS,OAAQiG,EAChDmB,SAAU3D,EAAY,cAAWsD,GAFlC"}
|
|
1
|
+
{"version":3,"file":"index.production.js","sources":["../../src/utils.ts","../../src/index.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","import { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align?: ScrollAlignment\n smoothScroll?: boolean\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const observer = new ResizeObserver((entries) => {\n cb({\n width: entries[0]?.contentRect.width as number,\n height: entries[0]?.contentRect.height as number,\n })\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n cb(instance.scrollElement.getBoundingClientRect())\n\n observer.observe(instance.scrollElement)\n\n return () => {\n observer.unobserve(instance.scrollElement)\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n const offset =\n instance.scrollElement[instance.options.horizontal ? propX : propY]\n\n cb(Math.max(0, offset - instance.options.scrollMargin))\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n { canSmooth, sync }: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<any, any>,\n) => {\n const toOffset = sync ? offset : offset + instance.options.scrollMargin\n\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: toOffset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n options: { canSmooth: boolean; sync: boolean },\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n scrollMargin?: number\n scrollingDelay?: number\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n isScrolling: boolean = false\n private isScrollingTimeoutId: ReturnType<typeof setTimeout> | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private scrollDelta: number = 0\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n range: { startIndex: number; endIndex: number } = {\n startIndex: 0,\n endIndex: 0,\n }\n\n constructor(opts: VirtualizerOptions<TScrollElement, TItemElement>) {\n this.setOptions(opts)\n this.scrollRect = this.options.initialRect\n this.scrollOffset = this.options.initialOffset\n\n this.calculateRange()\n }\n\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n scrollMargin: 0,\n scrollingDelay: 150,\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n this._scrollToOffset(this.scrollOffset, {\n canSmooth: false,\n sync: true,\n requested: false,\n })\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n if (this.isScrollingTimeoutId !== null) {\n clearTimeout(this.isScrollingTimeoutId)\n this.isScrollingTimeoutId = null\n }\n\n if (this.scrollOffset !== offset) {\n this.scrollOffset = offset\n this.isScrolling = true\n this.scrollDelta = 0\n\n this.isScrollingTimeoutId = setTimeout(() => {\n this.isScrollingTimeoutId = null\n this.isScrolling = false\n\n this.notify()\n }, this.options.scrollingDelay)\n } else {\n this.isScrolling = false\n this.scrollDelta = 0\n }\n\n this.calculateRange()\n }),\n )\n } else if (!this.isScrolling) {\n this.calculateRange()\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n const range = calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n })\n if (\n range.startIndex !== this.range.startIndex ||\n range.endIndex !== this.range.endIndex\n ) {\n this.range = range\n this.notify()\n }\n return this.range\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: () => this.options.debug,\n },\n )\n\n private getIndexes = memo(\n () => [\n this.options.rangeExtractor,\n this.range,\n this.options.overscan,\n this.options.count,\n ],\n (rangeExtractor, range, overscan, count) => {\n return rangeExtractor({\n ...range,\n overscan,\n count: count,\n })\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n getVirtualItems = memo(\n () => [\n this.getIndexes(),\n this.getMeasurements(),\n this.options.measureElement,\n ],\n (indexes, measurements, measureElement) => {\n const makeMeasureElement =\n (index: number) => (measurableItem: TItemElement | null) => {\n const item = this.measurementsCache[index]!\n\n if (!measurableItem) {\n return\n }\n\n const measuredItemSize = measureElement(measurableItem, this)\n const itemSize = this.itemMeasurementsCache[item.key] ?? item.size\n\n if (measuredItemSize !== itemSize) {\n if (item.start < this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && this.options.debug) {\n console.info('correction', measuredItemSize - itemSize)\n }\n\n if (this.destinationOffset === undefined) {\n this.scrollDelta += measuredItemSize - itemSize\n\n this._scrollToOffset(this.scrollOffset + this.scrollDelta, {\n canSmooth: false,\n sync: false,\n requested: false,\n })\n }\n }\n\n this.pendingMeasuredCacheIndexes.push(index)\n this.itemMeasurementsCache = {\n ...this.itemMeasurementsCache,\n [item.key]: measuredItemSize,\n }\n this.notify()\n }\n }\n\n const virtualItems: VirtualItem<TItemElement>[] = []\n\n const currentMeasureElements: typeof this.measureElementCache = {}\n\n for (let k = 0, len = indexes.length; k < len; k++) {\n const i = indexes[k]!\n const measurement = measurements[i]!\n\n const item = {\n ...measurement,\n measureElement: (currentMeasureElements[i] =\n this.measureElementCache[i] ?? makeMeasureElement(i)),\n }\n virtualItems.push(item)\n }\n\n this.measureElementCache = currentMeasureElements\n\n return virtualItems\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: () => this.options.debug,\n },\n )\n\n scrollToOffset = (\n toOffset: number,\n {\n align = 'start',\n smoothScroll = this.options.enableSmoothScroll,\n }: ScrollToOffsetOptions = {},\n ) => {\n const offset = this.scrollOffset\n const size = this.getSize()\n\n if (align === 'auto') {\n if (toOffset <= offset) {\n align = 'start'\n } else if (toOffset >= offset + size) {\n align = 'end'\n } else {\n align = 'start'\n }\n }\n\n const options = {\n canSmooth: smoothScroll,\n sync: false,\n requested: true,\n }\n if (align === 'start') {\n this._scrollToOffset(toOffset, options)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, options)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, options)\n }\n }\n\n scrollToIndex = (\n index: number,\n {\n align = 'auto',\n smoothScroll = this.options.enableSmoothScroll,\n ...rest\n }: ScrollToIndexOptions = {},\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (\n offset: number,\n {\n requested,\n canSmooth,\n sync,\n }: { canSmooth: boolean; sync: boolean; requested: boolean },\n ) => {\n clearTimeout(this.scrollCheckFrame)\n\n if (requested) {\n this.destinationOffset = offset\n }\n this.options.scrollToFn(offset, { canSmooth, sync }, 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","result","deps","depTime","key","debug","Date","now","newDeps","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","scrollProps","element","window","createOffsetObserver","mode","instance","cb","scrollElement","propX","propY","prevX","prevY","scroll","offset","options","horizontal","scrollMargin","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","isScrolling","isScrollingTimeoutId","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","scrollDelta","measureElementCache","setOptions","Object","entries","forEach","_ref3","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","scrollingDelay","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","_scrollToOffset","scrollOffset","canSmooth","sync","requested","observeElementRect","rect","scrollRect","calculateRange","clearTimeout","setTimeout","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref5","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","undefined","destinationOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","_ref4","scrollCheckFrame","scrollToFn","check","lastOffset","measure","_ref2","_instance$scrollEleme2","scrollTo","behavior","observer","ResizeObserver","_entries$","_entries$2","contentRect","observe","unobserve","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_ref","_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-beta.
|
|
4
|
+
"version": "3.0.0-beta.20",
|
|
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
|
@@ -275,6 +275,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
275
275
|
private pendingMeasuredCacheIndexes: number[] = []
|
|
276
276
|
private scrollRect: Rect
|
|
277
277
|
private scrollOffset: number
|
|
278
|
+
private scrollDelta: number = 0
|
|
278
279
|
private destinationOffset: undefined | number
|
|
279
280
|
private scrollCheckFrame!: ReturnType<typeof setTimeout>
|
|
280
281
|
private measureElementCache: Record<
|
|
@@ -346,6 +347,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
346
347
|
this._scrollToOffset(this.scrollOffset, {
|
|
347
348
|
canSmooth: false,
|
|
348
349
|
sync: true,
|
|
350
|
+
requested: false,
|
|
349
351
|
})
|
|
350
352
|
|
|
351
353
|
this.unsubs.push(
|
|
@@ -363,8 +365,9 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
363
365
|
}
|
|
364
366
|
|
|
365
367
|
if (this.scrollOffset !== offset) {
|
|
366
|
-
this.isScrolling = true
|
|
367
368
|
this.scrollOffset = offset
|
|
369
|
+
this.isScrolling = true
|
|
370
|
+
this.scrollDelta = 0
|
|
368
371
|
|
|
369
372
|
this.isScrollingTimeoutId = setTimeout(() => {
|
|
370
373
|
this.isScrollingTimeoutId = null
|
|
@@ -374,6 +377,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
374
377
|
}, this.options.scrollingDelay)
|
|
375
378
|
} else {
|
|
376
379
|
this.isScrolling = false
|
|
380
|
+
this.scrollDelta = 0
|
|
377
381
|
}
|
|
378
382
|
|
|
379
383
|
this.calculateRange()
|
|
@@ -494,14 +498,14 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
494
498
|
console.info('correction', measuredItemSize - itemSize)
|
|
495
499
|
}
|
|
496
500
|
|
|
497
|
-
if (
|
|
498
|
-
this.
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
)
|
|
501
|
+
if (this.destinationOffset === undefined) {
|
|
502
|
+
this.scrollDelta += measuredItemSize - itemSize
|
|
503
|
+
|
|
504
|
+
this._scrollToOffset(this.scrollOffset + this.scrollDelta, {
|
|
505
|
+
canSmooth: false,
|
|
506
|
+
sync: false,
|
|
507
|
+
requested: false,
|
|
508
|
+
})
|
|
505
509
|
}
|
|
506
510
|
}
|
|
507
511
|
|
|
@@ -563,6 +567,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
563
567
|
const options = {
|
|
564
568
|
canSmooth: smoothScroll,
|
|
565
569
|
sync: false,
|
|
570
|
+
requested: true,
|
|
566
571
|
}
|
|
567
572
|
if (align === 'start') {
|
|
568
573
|
this._scrollToOffset(toOffset, options)
|
|
@@ -575,7 +580,11 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
575
580
|
|
|
576
581
|
scrollToIndex = (
|
|
577
582
|
index: number,
|
|
578
|
-
{
|
|
583
|
+
{
|
|
584
|
+
align = 'auto',
|
|
585
|
+
smoothScroll = this.options.enableSmoothScroll,
|
|
586
|
+
...rest
|
|
587
|
+
}: ScrollToIndexOptions = {},
|
|
579
588
|
) => {
|
|
580
589
|
const measurements = this.getMeasurements()
|
|
581
590
|
const offset = this.scrollOffset
|
|
@@ -606,7 +615,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
606
615
|
? measurement.end + this.options.scrollPaddingEnd
|
|
607
616
|
: measurement.start - this.options.scrollPaddingStart
|
|
608
617
|
|
|
609
|
-
this.scrollToOffset(toOffset, { align, ...rest })
|
|
618
|
+
this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })
|
|
610
619
|
}
|
|
611
620
|
|
|
612
621
|
getTotalSize = () =>
|
|
@@ -615,12 +624,18 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
|
|
|
615
624
|
|
|
616
625
|
private _scrollToOffset = (
|
|
617
626
|
offset: number,
|
|
618
|
-
|
|
627
|
+
{
|
|
628
|
+
requested,
|
|
629
|
+
canSmooth,
|
|
630
|
+
sync,
|
|
631
|
+
}: { canSmooth: boolean; sync: boolean; requested: boolean },
|
|
619
632
|
) => {
|
|
620
633
|
clearTimeout(this.scrollCheckFrame)
|
|
621
634
|
|
|
622
|
-
|
|
623
|
-
|
|
635
|
+
if (requested) {
|
|
636
|
+
this.destinationOffset = offset
|
|
637
|
+
}
|
|
638
|
+
this.options.scrollToFn(offset, { canSmooth, sync }, this)
|
|
624
639
|
|
|
625
640
|
let scrollCheckFrame: ReturnType<typeof setTimeout>
|
|
626
641
|
|