@tanstack/virtual-core 3.0.0-beta.14 → 3.0.0-beta.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n","export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n","import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = memoRectCallback(instance, cb)\n\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n onResize(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n 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 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 { align }: ScrollToOffsetOptions = { align: 'start' },\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 if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["rafId","props","observedNodes","Map","run","changedStates","forEach","state","node","a","b","newRect","getBoundingClientRect","rect","some","prop","push","callbacks","cb","window","requestAnimationFrame","memo","getDeps","fn","opts","result","deps","depTime","key","debug","Date","now","newDeps","length","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min","defaultKeyExtractor","defaultRangeExtractor","range","start","startIndex","overscan","end","endIndex","count","arr","i","memoRectCallback","instance","prev","height","width","options","horizontal","scrollProps","element","createOffsetObserver","mode","scrollElement","propX","propY","prevX","prevY","scroll","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","constructor","_this","this","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","_ref","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","observeElementRect","scrollRect","calculateRange","offset","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","onResize","observer","observe","wasEmpty","has","get","set","hasRectChanged","unobserve","indexOf","splice","cancelAnimationFrame","observeRect","memoizedCallback","innerWidth","innerHeight","_instance$scrollEleme"],"mappings":"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"}
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 cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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 ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n 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 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 { align = 'start', smoothScroll = this.options.enableSmoothScroll }: 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 if (align === 'start') {\n this._scrollToOffset(toOffset, smoothScroll)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, smoothScroll)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, smoothScroll)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...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, 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 = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["memo","getDeps","fn","opts","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","options","horizontal","onScroll","e","target","currentTarget","scrollX","scrollY","addEventListener","capture","passive","removeEventListener","observeElementOffset","observeWindowOffset","measureElement","getBoundingClientRect","constructor","_this","this","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","_ref","value","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","initialRect","width","height","notify","_this$options$onChang","_this$options","call","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","observeElementRect","rect","scrollRect","calculateRange","offset","scrollOffset","getSize","getMeasurements","measurements","slice","measuredSize","size","estimateSize","process","outerSize","_ref2","low","high","getCurrentValue","middle","currentValue","findNearestBinarySearch","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","_this$itemMeasurement","item","measuredItemSize","itemSize","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","_this$measureElementC","scrollToOffset","toOffset","_temp","align","smoothScroll","scrollToIndex","_temp2","rest","measurement","getTotalSize","_this$getMeasurements","canSmooth","scrollCheckFrame","clearTimeout","scrollToFn","check","lastOffset","setTimeout","undefined","measure","_instance$scrollEleme2","scrollTo","behavior","observer","ResizeObserver","_entries$","_entries$2","contentRect","observe","unobserve","memoizedCallback","prev","memoRectCallback","onResize","innerWidth","innerHeight","_instance$scrollEleme"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/virtual-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "3.0.0-beta.14",
4
+ "version": "3.0.0-beta.17",
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",
@@ -25,7 +25,7 @@
25
25
  "url": "https://github.com/sponsors/tannerlinsley"
26
26
  },
27
27
  "module": "build/esm/index.js",
28
- "main": "build/cjs/packages/virtual-core/src/index.js",
28
+ "main": "build/cjs/index.js",
29
29
  "browser": "build/umd/index.production.js",
30
30
  "types": "build/types/index.d.ts",
31
31
  "sideEffects": false,
@@ -36,7 +36,5 @@
36
36
  "build/**",
37
37
  "src"
38
38
  ],
39
- "dependencies": {
40
- "@reach/observe-rect": "^1.1.0"
41
- }
39
+ "dependencies": {}
42
40
  }
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- import observeRect from '@reach/observe-rect'
2
1
  import { memo } from './utils'
3
2
 
4
3
  export * from './utils'
@@ -8,7 +7,8 @@ export * from './utils'
8
7
  type ScrollAlignment = 'start' | 'center' | 'end' | 'auto'
9
8
 
10
9
  export interface ScrollToOptions {
11
- align: ScrollAlignment
10
+ align?: ScrollAlignment
11
+ smoothScroll?: boolean
12
12
  }
13
13
 
14
14
  type ScrollToOffsetOptions = ScrollToOptions
@@ -81,22 +81,23 @@ export const observeElementRect = (
81
81
  instance: Virtualizer<any, any>,
82
82
  cb: (rect: Rect) => void,
83
83
  ) => {
84
- const onResize = memoRectCallback(instance, cb)
85
-
86
- const observer = observeRect(instance.scrollElement as Element, (rect) => {
87
- onResize(rect)
84
+ const observer = new ResizeObserver((entries) => {
85
+ cb({
86
+ width: entries[0]?.contentRect.width as number,
87
+ height: entries[0]?.contentRect.height as number
88
+ })
88
89
  })
89
90
 
90
91
  if (!instance.scrollElement) {
91
92
  return
92
93
  }
93
94
 
94
- onResize(instance.scrollElement.getBoundingClientRect())
95
+ cb(instance.scrollElement.getBoundingClientRect())
95
96
 
96
- observer.observe()
97
+ observer.observe(instance.scrollElement)
97
98
 
98
99
  return () => {
99
- observer.unobserve()
100
+ observer.unobserve(instance.scrollElement)
100
101
  }
101
102
  }
102
103
 
@@ -278,6 +279,8 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
278
279
  this.setOptions(opts)
279
280
  this.scrollRect = this.options.initialRect
280
281
  this.scrollOffset = this.options.initialOffset
282
+
283
+ this.calculateRange()
281
284
  }
282
285
 
283
286
  setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {
@@ -499,7 +502,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
499
502
 
500
503
  scrollToOffset = (
501
504
  toOffset: number,
502
- { align }: ScrollToOffsetOptions = { align: 'start' },
505
+ { align = 'start', smoothScroll = this.options.enableSmoothScroll }: ScrollToOffsetOptions = {},
503
506
  ) => {
504
507
  const offset = this.scrollOffset
505
508
  const size = this.getSize()
@@ -515,17 +518,17 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
515
518
  }
516
519
 
517
520
  if (align === 'start') {
518
- this._scrollToOffset(toOffset, true)
519
- } else if (align === 'end') {
520
- this._scrollToOffset(toOffset - size, true)
521
- } else if (align === 'center') {
522
- this._scrollToOffset(toOffset - size / 2, true)
521
+ this._scrollToOffset(toOffset, smoothScroll)
522
+ } else if (align === 'end') {
523
+ this._scrollToOffset(toOffset - size, smoothScroll)
524
+ } else if (align === 'center') {
525
+ this._scrollToOffset(toOffset - size / 2, smoothScroll)
523
526
  }
524
527
  }
525
528
 
526
529
  scrollToIndex = (
527
530
  index: number,
528
- { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },
531
+ { align = 'auto', smoothScroll = this.options.enableSmoothScroll, ...rest }: ScrollToIndexOptions = {},
529
532
  ) => {
530
533
  const measurements = this.getMeasurements()
531
534
  const offset = this.scrollOffset
@@ -556,7 +559,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
556
559
  ? measurement.end + this.options.scrollPaddingEnd
557
560
  : measurement.start - this.options.scrollPaddingStart
558
561
 
559
- this.scrollToOffset(toOffset, { align, ...rest })
562
+ this.scrollToOffset(toOffset, { align, smoothScroll, ...rest })
560
563
  }
561
564
 
562
565
  getTotalSize = () =>
@@ -569,7 +572,7 @@ export class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {
569
572
  this.destinationOffset = offset
570
573
  this.options.scrollToFn(
571
574
  offset,
572
- this.options.enableSmoothScroll && canSmooth,
575
+ canSmooth,
573
576
  this,
574
577
  )
575
578
 
@@ -1,86 +0,0 @@
1
- /**
2
- * virtual-core
3
- *
4
- * Copyright (c) TanStack
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE.md file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */
11
- 'use strict';
12
-
13
- Object.defineProperty(exports, '__esModule', { value: true });
14
-
15
- var props = ["bottom", "height", "left", "right", "top", "width"];
16
-
17
- var rectChanged = function rectChanged(a, b) {
18
- if (a === void 0) {
19
- a = {};
20
- }
21
-
22
- if (b === void 0) {
23
- b = {};
24
- }
25
-
26
- return props.some(function (prop) {
27
- return a[prop] !== b[prop];
28
- });
29
- };
30
-
31
- var observedNodes = /*#__PURE__*/new Map();
32
- var rafId;
33
-
34
- var run = function run() {
35
- var changedStates = [];
36
- observedNodes.forEach(function (state, node) {
37
- var newRect = node.getBoundingClientRect();
38
-
39
- if (rectChanged(newRect, state.rect)) {
40
- state.rect = newRect;
41
- changedStates.push(state);
42
- }
43
- });
44
- changedStates.forEach(function (state) {
45
- state.callbacks.forEach(function (cb) {
46
- return cb(state.rect);
47
- });
48
- });
49
- rafId = window.requestAnimationFrame(run);
50
- };
51
-
52
- function observeRect(node, cb) {
53
- return {
54
- observe: function observe() {
55
- var wasEmpty = observedNodes.size === 0;
56
-
57
- if (observedNodes.has(node)) {
58
- observedNodes.get(node).callbacks.push(cb);
59
- } else {
60
- observedNodes.set(node, {
61
- rect: undefined,
62
- hasRectChanged: false,
63
- callbacks: [cb]
64
- });
65
- }
66
-
67
- if (wasEmpty) run();
68
- },
69
- unobserve: function unobserve() {
70
- var state = observedNodes.get(node);
71
-
72
- if (state) {
73
- // Remove the callback
74
- var index = state.callbacks.indexOf(cb);
75
- if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference
76
-
77
- if (!state.callbacks.length) observedNodes["delete"](node); // Stop the loop
78
-
79
- if (!observedNodes.size) cancelAnimationFrame(rafId);
80
- }
81
- }
82
- };
83
- }
84
-
85
- exports["default"] = observeRect;
86
- //# sourceMappingURL=observe-rect.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observe-rect.esm.js","sources":["../../../../../../../../node_modules/@reach/observe-rect/dist/observe-rect.esm.js"],"sourcesContent":["var props = [\"bottom\", \"height\", \"left\", \"right\", \"top\", \"width\"];\n\nvar rectChanged = function rectChanged(a, b) {\n if (a === void 0) {\n a = {};\n }\n\n if (b === void 0) {\n b = {};\n }\n\n return props.some(function (prop) {\n return a[prop] !== b[prop];\n });\n};\n\nvar observedNodes = /*#__PURE__*/new Map();\nvar rafId;\n\nvar run = function run() {\n var changedStates = [];\n observedNodes.forEach(function (state, node) {\n var newRect = node.getBoundingClientRect();\n\n if (rectChanged(newRect, state.rect)) {\n state.rect = newRect;\n changedStates.push(state);\n }\n });\n changedStates.forEach(function (state) {\n state.callbacks.forEach(function (cb) {\n return cb(state.rect);\n });\n });\n rafId = window.requestAnimationFrame(run);\n};\n\nfunction observeRect(node, cb) {\n return {\n observe: function observe() {\n var wasEmpty = observedNodes.size === 0;\n\n if (observedNodes.has(node)) {\n observedNodes.get(node).callbacks.push(cb);\n } else {\n observedNodes.set(node, {\n rect: undefined,\n hasRectChanged: false,\n callbacks: [cb]\n });\n }\n\n if (wasEmpty) run();\n },\n unobserve: function unobserve() {\n var state = observedNodes.get(node);\n\n if (state) {\n // Remove the callback\n var index = state.callbacks.indexOf(cb);\n if (index >= 0) state.callbacks.splice(index, 1); // Remove the node reference\n\n if (!state.callbacks.length) observedNodes[\"delete\"](node); // Stop the loop\n\n if (!observedNodes.size) cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\nexport default observeRect;\n//# sourceMappingURL=observe-rect.esm.js.map\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/index.ts"],"sourcesContent":["import observeRect from '@reach/observe-rect'\nimport { memo } from './utils'\n\nexport * from './utils'\n\n//\n\ntype ScrollAlignment = 'start' | 'center' | 'end' | 'auto'\n\nexport interface ScrollToOptions {\n align: ScrollAlignment\n}\n\ntype ScrollToOffsetOptions = ScrollToOptions\n\ntype ScrollToIndexOptions = ScrollToOptions\n\nexport interface Range {\n startIndex: number\n endIndex: number\n overscan: number\n count: number\n}\n\ntype Key = number | string\n\ninterface Item {\n key: Key\n index: number\n start: number\n end: number\n size: number\n}\n\ninterface Rect {\n width: number\n height: number\n}\n\nexport interface VirtualItem<TItemElement> extends Item {\n measureElement: (el: TItemElement | null) => void\n}\n\n//\n\nexport const defaultKeyExtractor = (index: number) => index\n\nexport const defaultRangeExtractor = (range: Range) => {\n const start = Math.max(range.startIndex - range.overscan, 0)\n const end = Math.min(range.endIndex + range.overscan, range.count - 1)\n\n const arr = []\n\n for (let i = start; i <= end; i++) {\n arr.push(i)\n }\n\n return arr\n}\n\nconst memoRectCallback = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n let prev: Rect = { height: -1, width: -1 }\n\n return (rect: Rect) => {\n if (\n instance.options.horizontal\n ? rect.width !== prev.width\n : rect.height !== prev.height\n ) {\n cb(rect)\n }\n\n prev = rect\n }\n}\n\nexport const observeElementRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const onResize = memoRectCallback(instance, cb)\n\n const observer = observeRect(instance.scrollElement as Element, (rect) => {\n onResize(rect)\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize(instance.scrollElement.getBoundingClientRect())\n\n observer.observe()\n\n return () => {\n observer.unobserve()\n }\n}\n\nexport const observeWindowRect = (\n instance: Virtualizer<any, any>,\n cb: (rect: Rect) => void,\n) => {\n const memoizedCallback = memoRectCallback(instance, cb)\n const onResize = () =>\n memoizedCallback({\n width: instance.scrollElement.innerWidth,\n height: instance.scrollElement.innerHeight,\n })\n\n if (!instance.scrollElement) {\n return\n }\n\n onResize()\n\n instance.scrollElement.addEventListener('resize', onResize, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('resize', onResize)\n }\n}\n\ntype ObserverMode = 'element' | 'window'\n\nconst scrollProps = {\n element: ['scrollLeft', 'scrollTop'],\n window: ['scrollX', 'scrollY'],\n} as const\n\nconst createOffsetObserver = (mode: ObserverMode) => {\n return (instance: Virtualizer<any, any>, cb: (offset: number) => void) => {\n if (!instance.scrollElement) {\n return\n }\n\n const propX = scrollProps[mode][0]\n const propY = scrollProps[mode][1]\n\n let prevX: number = instance.scrollElement[propX]\n let prevY: number = instance.scrollElement[propY]\n\n const scroll = () => {\n cb(instance.scrollElement[instance.options.horizontal ? propX : propY])\n }\n\n scroll()\n\n const onScroll = (e: Event) => {\n const target = e.currentTarget as HTMLElement & Window\n const scrollX = target[propX]\n const scrollY = target[propY]\n\n if (instance.options.horizontal ? prevX - scrollX : prevY - scrollY) {\n scroll()\n }\n\n prevX = scrollX\n prevY = scrollY\n }\n\n instance.scrollElement.addEventListener('scroll', onScroll, {\n capture: false,\n passive: true,\n })\n\n return () => {\n instance.scrollElement.removeEventListener('scroll', onScroll)\n }\n }\n}\n\nexport const observeElementOffset = createOffsetObserver('element')\nexport const observeWindowOffset = createOffsetObserver('window')\n\nexport const measureElement = (\n element: unknown,\n instance: Virtualizer<any, any>,\n) => {\n return (element as Element).getBoundingClientRect()[\n instance.options.horizontal ? 'width' : 'height'\n ]\n}\n\nexport const windowScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Window)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport const elementScroll = (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<any, any>,\n) => {\n ;(instance.scrollElement as Element)?.scrollTo?.({\n [instance.options.horizontal ? 'left' : 'top']: offset,\n behavior: canSmooth ? 'smooth' : undefined,\n })\n}\n\nexport interface VirtualizerOptions<\n TScrollElement = unknown,\n TItemElement = unknown,\n> {\n // Required from the user\n count: number\n getScrollElement: () => TScrollElement\n estimateSize: (index: number) => number\n\n // Required from the framework adapter (but can be overridden)\n scrollToFn: (\n offset: number,\n canSmooth: boolean,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => void\n observeElementRect: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (rect: Rect) => void,\n ) => void | (() => void)\n observeElementOffset: (\n instance: Virtualizer<TScrollElement, TItemElement>,\n cb: (offset: number) => void,\n ) => void | (() => void)\n\n // Optional\n debug?: any\n initialRect?: Rect\n onChange?: (instance: Virtualizer<TScrollElement, TItemElement>) => void\n measureElement?: (\n el: TItemElement,\n instance: Virtualizer<TScrollElement, TItemElement>,\n ) => number\n overscan?: number\n horizontal?: boolean\n paddingStart?: number\n paddingEnd?: number\n scrollPaddingStart?: number\n scrollPaddingEnd?: number\n initialOffset?: number\n getItemKey?: (index: number) => Key\n rangeExtractor?: (range: Range) => number[]\n enableSmoothScroll?: boolean\n}\n\nexport class Virtualizer<TScrollElement = unknown, TItemElement = unknown> {\n private unsubs: (void | (() => void))[] = []\n options!: Required<VirtualizerOptions<TScrollElement, TItemElement>>\n scrollElement: TScrollElement | null = null\n private measurementsCache: Item[] = []\n private itemMeasurementsCache: Record<Key, number> = {}\n private pendingMeasuredCacheIndexes: number[] = []\n private scrollRect: Rect\n private scrollOffset: number\n private destinationOffset: undefined | number\n private scrollCheckFrame!: ReturnType<typeof setTimeout>\n private measureElementCache: Record<\n number,\n (measurableItem: TItemElement | null) => void\n > = {}\n private 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\n setOptions = (opts: VirtualizerOptions<TScrollElement, TItemElement>) => {\n Object.entries(opts).forEach(([key, value]) => {\n if (typeof value === 'undefined') delete (opts as any)[key]\n })\n\n this.options = {\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n enableSmoothScroll: true,\n onChange: () => {},\n measureElement,\n initialRect: { width: 0, height: 0 },\n ...opts,\n }\n }\n\n private notify = () => {\n this.options.onChange?.(this)\n }\n\n private cleanup = () => {\n this.unsubs.filter(Boolean).forEach((d) => d!())\n this.unsubs = []\n this.scrollElement = null\n }\n\n _didMount = () => {\n return () => {\n this.cleanup()\n }\n }\n\n _willUpdate = () => {\n const scrollElement = this.options.getScrollElement()\n\n if (this.scrollElement !== scrollElement) {\n this.cleanup()\n\n this.scrollElement = scrollElement\n\n this.unsubs.push(\n this.options.observeElementRect(this, (rect) => {\n this.scrollRect = rect\n this.calculateRange()\n }),\n )\n\n this.unsubs.push(\n this.options.observeElementOffset(this, (offset) => {\n this.scrollOffset = offset\n this.calculateRange()\n }),\n )\n }\n }\n\n private getSize = () => {\n return this.scrollRect[this.options.horizontal ? 'width' : 'height']\n }\n\n private getMeasurements = memo(\n () => [\n this.options.count,\n this.options.paddingStart,\n this.options.getItemKey,\n this.itemMeasurementsCache,\n ],\n (count, paddingStart, getItemKey, measurementsCache) => {\n const min =\n this.pendingMeasuredCacheIndexes.length > 0\n ? Math.min(...this.pendingMeasuredCacheIndexes)\n : 0\n this.pendingMeasuredCacheIndexes = []\n\n const measurements = this.measurementsCache.slice(0, min)\n\n for (let i = min; i < count; i++) {\n const key = getItemKey(i)\n const measuredSize = measurementsCache[key]\n const start = measurements[i - 1]\n ? measurements[i - 1]!.end\n : paddingStart\n const size =\n typeof measuredSize === 'number'\n ? measuredSize\n : this.options.estimateSize(i)\n const end = start + size\n measurements[i] = { index: i, start, size, end, key }\n }\n\n this.measurementsCache = measurements\n return measurements\n },\n {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: () => this.options.debug,\n },\n )\n\n private calculateRange = memo(\n () => [this.getMeasurements(), this.getSize(), this.scrollOffset],\n (measurements, outerSize, scrollOffset) => {\n 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 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 { align }: ScrollToOffsetOptions = { align: 'start' },\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 if (align === 'start') {\n this._scrollToOffset(toOffset, true)\n } else if (align === 'end') {\n this._scrollToOffset(toOffset - size, true)\n } else if (align === 'center') {\n this._scrollToOffset(toOffset - size / 2, true)\n }\n }\n\n scrollToIndex = (\n index: number,\n { align, ...rest }: ScrollToIndexOptions = { align: 'auto' },\n ) => {\n const measurements = this.getMeasurements()\n const offset = this.scrollOffset\n const size = this.getSize()\n const { count } = this.options\n\n const measurement = measurements[Math.max(0, Math.min(index, count - 1))]\n\n if (!measurement) {\n return\n }\n\n if (align === 'auto') {\n if (measurement.end >= offset + size - this.options.scrollPaddingEnd) {\n align = 'end'\n } else if (\n measurement.start <=\n offset + this.options.scrollPaddingStart\n ) {\n align = 'start'\n } else {\n return\n }\n }\n\n const toOffset =\n align === 'end'\n ? measurement.end + this.options.scrollPaddingEnd\n : measurement.start - this.options.scrollPaddingStart\n\n this.scrollToOffset(toOffset, { align, ...rest })\n }\n\n getTotalSize = () =>\n (this.getMeasurements()[this.options.count - 1]?.end ||\n this.options.paddingStart) + this.options.paddingEnd\n\n private _scrollToOffset = (offset: number, canSmooth: boolean) => {\n clearTimeout(this.scrollCheckFrame)\n\n this.destinationOffset = offset\n this.options.scrollToFn(\n offset,\n this.options.enableSmoothScroll && canSmooth,\n this,\n )\n\n let scrollCheckFrame: ReturnType<typeof setTimeout>\n\n const check = () => {\n let lastOffset = this.scrollOffset\n this.scrollCheckFrame = scrollCheckFrame = setTimeout(() => {\n if (this.scrollCheckFrame !== scrollCheckFrame) {\n return\n }\n\n if (this.scrollOffset === lastOffset) {\n this.destinationOffset = undefined\n return\n }\n lastOffset = this.scrollOffset\n check()\n }, 100)\n }\n\n check()\n }\n\n measure = () => {\n this.itemMeasurementsCache = {}\n this.notify()\n }\n}\n\nconst findNearestBinarySearch = (\n low: number,\n high: number,\n getCurrentValue: (i: number) => number,\n value: number,\n) => {\n while (low <= high) {\n const middle = ((low + high) / 2) | 0\n const currentValue = getCurrentValue(middle)\n\n if (currentValue < value) {\n low = middle + 1\n } else if (currentValue > value) {\n high = middle - 1\n } else {\n return middle\n }\n }\n\n if (low > 0) {\n return low - 1\n } else {\n return 0\n }\n}\n\nfunction calculateRange({\n measurements,\n outerSize,\n scrollOffset,\n}: {\n measurements: Item[]\n outerSize: number\n scrollOffset: number\n}) {\n const count = measurements.length - 1\n const getOffset = (index: number) => measurements[index]!.start\n\n const startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset)\n let endIndex = startIndex\n\n while (\n endIndex < count &&\n measurements[endIndex]!.end < scrollOffset + outerSize\n ) {\n endIndex++\n }\n\n return { startIndex, endIndex }\n}\n"],"names":["defaultKeyExtractor","index","defaultRangeExtractor","range","start","Math","max","startIndex","overscan","end","min","endIndex","count","arr","i","push","memoRectCallback","instance","cb","prev","height","width","rect","options","horizontal","observeElementRect","onResize","observer","observeRect","scrollElement","getBoundingClientRect","observe","unobserve","observeWindowRect","memoizedCallback","innerWidth","innerHeight","addEventListener","capture","passive","removeEventListener","scrollProps","element","window","createOffsetObserver","mode","propX","propY","prevX","prevY","scroll","onScroll","e","target","currentTarget","scrollX","scrollY","observeElementOffset","observeWindowOffset","measureElement","windowScroll","offset","canSmooth","scrollTo","behavior","undefined","elementScroll","Virtualizer","constructor","opts","unsubs","measurementsCache","itemMeasurementsCache","pendingMeasuredCacheIndexes","measureElementCache","setOptions","Object","entries","forEach","key","value","debug","initialOffset","paddingStart","paddingEnd","scrollPaddingStart","scrollPaddingEnd","getItemKey","rangeExtractor","enableSmoothScroll","onChange","initialRect","notify","cleanup","filter","Boolean","d","_didMount","_willUpdate","getScrollElement","scrollRect","calculateRange","scrollOffset","getSize","getMeasurements","memo","length","measurements","slice","measuredSize","size","estimateSize","process","env","NODE_ENV","outerSize","getIndexes","getVirtualItems","indexes","makeMeasureElement","measurableItem","item","measuredItemSize","itemSize","console","info","destinationOffset","_scrollToOffset","virtualItems","currentMeasureElements","k","len","measurement","scrollToOffset","toOffset","align","scrollToIndex","rest","getTotalSize","clearTimeout","scrollCheckFrame","scrollToFn","check","lastOffset","setTimeout","measure","findNearestBinarySearch","low","high","getCurrentValue","middle","currentValue","getOffset"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../src/utils.ts"],"sourcesContent":["export type NoInfer<A extends any> = [A][A extends any ? 0 : never]\n\nexport type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\n\nexport function memo<TDeps extends readonly any[], TResult>(\n getDeps: () => [...TDeps],\n fn: (...args: NoInfer<[...TDeps]>) => TResult,\n opts: {\n key: any\n debug?: () => any\n onChange?: (result: TResult) => void\n },\n): () => TResult {\n let deps: any[] = []\n let result: TResult | undefined\n\n return () => {\n let depTime: number\n if (opts.key && opts.debug?.()) depTime = Date.now()\n\n const newDeps = getDeps()\n\n const depsChanged =\n newDeps.length !== deps.length ||\n newDeps.some((dep: any, index: number) => deps[index] !== dep)\n\n if (!depsChanged) {\n return result!\n }\n\n deps = newDeps\n\n let resultTime: number\n if (opts.key && opts.debug?.()) resultTime = Date.now()\n\n result = fn(...newDeps)\n opts?.onChange?.(result)\n\n if (opts.key && opts.debug?.()) {\n const depEndTime = Math.round((Date.now() - depTime!) * 100) / 100\n const resultEndTime = Math.round((Date.now() - resultTime!) * 100) / 100\n const resultFpsPercentage = resultEndTime / 16\n\n const pad = (str: number | string, num: number) => {\n str = String(str)\n while (str.length < num) {\n str = ' ' + str\n }\n return str\n }\n\n console.info(\n `%c⏱ ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`,\n `\n font-size: .6rem;\n font-weight: bold;\n color: hsl(${Math.max(\n 0,\n Math.min(120 - 120 * resultFpsPercentage, 120),\n )}deg 100% 31%);`,\n opts?.key,\n )\n }\n\n return result!\n }\n}\n"],"names":["memo","getDeps","fn","opts","deps","result","depTime","key","debug","Date","now","newDeps","depsChanged","length","some","dep","index","resultTime","onChange","depEndTime","Math","round","resultEndTime","resultFpsPercentage","pad","str","num","String","console","info","max","min"],"mappings":";;;;;;;;;;;;;;AAIO,SAASA,IAAT,CACLC,OADK,EAELC,EAFK,EAGLC,IAHK,EAQU;EACf,IAAIC,IAAW,GAAG,EAAlB,CAAA;AACA,EAAA,IAAIC,MAAJ,CAAA;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,IAAIC,OAAJ,CAAA;AACA,IAAA,IAAIH,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCF,OAAO,GAAGG,IAAI,CAACC,GAAL,EAAV,CAAA;IAEhC,MAAMC,OAAO,GAAGV,OAAO,EAAvB,CAAA;IAEA,MAAMW,WAAW,GACfD,OAAO,CAACE,MAAR,KAAmBT,IAAI,CAACS,MAAxB,IACAF,OAAO,CAACG,IAAR,CAAa,CAACC,GAAD,EAAWC,KAAX,KAA6BZ,IAAI,CAACY,KAAD,CAAJ,KAAgBD,GAA1D,CAFF,CAAA;;IAIA,IAAI,CAACH,WAAL,EAAkB;AAChB,MAAA,OAAOP,MAAP,CAAA;AACD,KAAA;;AAEDD,IAAAA,IAAI,GAAGO,OAAP,CAAA;AAEA,IAAA,IAAIM,UAAJ,CAAA;AACA,IAAA,IAAId,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAYL,IAAAA,IAAAA,IAAI,CAACK,KAAL,EAAhB,EAAgCS,UAAU,GAAGR,IAAI,CAACC,GAAL,EAAb,CAAA;AAEhCL,IAAAA,MAAM,GAAGH,EAAE,CAAC,GAAGS,OAAJ,CAAX,CAAA;IACAR,IAAI,IAAA,IAAJ,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEe,QAAN,oBAAAf,IAAI,CAAEe,QAAN,CAAiBb,MAAjB,CAAA,CAAA;;AAEA,IAAA,IAAIF,IAAI,CAACI,GAAL,IAAYJ,IAAI,CAACK,KAAjB,IAAA,IAAA,IAAYL,IAAI,CAACK,KAAL,EAAhB,EAAgC;AAC9B,MAAA,MAAMW,UAAU,GAAGC,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaJ,GAAAA,OAAd,IAA0B,GAArC,IAA4C,GAA/D,CAAA;AACA,MAAA,MAAMgB,aAAa,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACZ,IAAI,CAACC,GAAL,EAAaO,GAAAA,UAAd,IAA6B,GAAxC,IAA+C,GAArE,CAAA;AACA,MAAA,MAAMM,mBAAmB,GAAGD,aAAa,GAAG,EAA5C,CAAA;;AAEA,MAAA,MAAME,GAAG,GAAG,CAACC,GAAD,EAAuBC,GAAvB,KAAuC;AACjDD,QAAAA,GAAG,GAAGE,MAAM,CAACF,GAAD,CAAZ,CAAA;;AACA,QAAA,OAAOA,GAAG,CAACZ,MAAJ,GAAaa,GAApB,EAAyB;UACvBD,GAAG,GAAG,MAAMA,GAAZ,CAAA;AACD,SAAA;;AACD,QAAA,OAAOA,GAAP,CAAA;OALF,CAAA;;AAQAG,MAAAA,OAAO,CAACC,IAAR,CAAA,WAAA,GACSL,GAAG,CAACF,aAAD,EAAgB,CAAhB,CADZ,GAAA,IAAA,GACmCE,GAAG,CAACL,UAAD,EAAa,CAAb,CADtC,uGAKmBC,IAAI,CAACU,GAAL,CACX,CADW,EAEXV,IAAI,CAACW,GAAL,CAAS,MAAM,GAAMR,GAAAA,mBAArB,EAA0C,GAA1C,CAFW,CALnB,GAAA,gBAAA,EASEpB,IATF,IASEA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEI,GATR,CAAA,CAAA;AAWD,KAAA;;AAED,IAAA,OAAOF,MAAP,CAAA;GAhDF,CAAA;AAkDD;;;;"}