react-virtuoso 2.16.4 → 2.16.5

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/useIsomorphicLayoutEffect.ts","../src/loggerSystem.ts","../src/hooks/useSize.ts","../src/hooks/useChangedChildSizes.ts","../src/utils/correctItemSize.ts","../src/utils/approximatelyEqual.ts","../src/hooks/useScrollTop.ts","../src/domIOSystem.ts","../src/AATree.ts","../src/utils/binaryArraySearch.ts","../src/recalcSystem.ts","../src/sizeSystem.ts","../src/scrollToIndexSystem.ts","../src/stateFlagsSystem.ts","../src/propsReadySystem.ts","../src/initialTopMostItemIndexSystem.ts","../src/followOutputSystem.ts","../src/groupedListSystem.ts","../src/comparators.tsx","../src/sizeRangeSystem.ts","../src/listStateSystem.ts","../src/initialItemCountSystem.ts","../src/scrollSeekSystem.ts","../src/topItemCountSystem.ts","../src/totalListHeightSystem.ts","../src/utils/simpleMemoize.ts","../src/upwardScrollFixSystem.ts","../src/initialScrollTopSystem.ts","../src/alignToBottomSystem.ts","../src/windowScrollerSystem.ts","../src/scrollIntoViewSystem.ts","../src/listSystem.ts","../src/utils/positionStickyCssValue.ts","../src/hooks/useWindowViewportRect.ts","../src/List.tsx","../src/gridSystem.ts","../src/Grid.tsx","../src/Table.tsx","../src/components.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react'\n\nconst useIsomorphicLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default useIsomorphicLayoutEffect\n","import * as u from '@virtuoso.dev/urx'\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace globalThis {\n let VIRTUOSO_LOG_LEVEL: LogLevel | undefined\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace window {\n let VIRTUOSO_LOG_LEVEL: LogLevel | undefined\n}\n\nexport enum LogLevel {\n DEBUG,\n INFO,\n WARN,\n ERROR,\n}\nexport interface LogMessage {\n level: LogLevel\n message: any\n label: string\n}\n\nexport type Log = (label: string, message: any, level?: LogLevel) => void\n\nconst CONSOLE_METHOD_MAP = {\n [LogLevel.DEBUG]: 'debug',\n [LogLevel.INFO]: 'log',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error',\n} as const\n\nconst getGlobalThis = () => (typeof globalThis === 'undefined' ? window : globalThis)\n\nexport const loggerSystem = u.system(\n () => {\n const logLevel = u.statefulStream<LogLevel>(LogLevel.ERROR)\n const log = u.statefulStream<Log>((label: string, message: any, level: LogLevel = LogLevel.INFO) => {\n const currentLevel = getGlobalThis()['VIRTUOSO_LOG_LEVEL'] ?? u.getValue(logLevel)\n if (level >= currentLevel) {\n // eslint-disable-next-line no-console\n console[CONSOLE_METHOD_MAP[level]](\n '%creact-virtuoso: %c%s %o',\n 'color: #0253b3; font-weight: bold',\n 'color: initial',\n label,\n message\n )\n }\n })\n\n return {\n log,\n logLevel,\n }\n },\n [],\n { singleton: true }\n)\n","import { useRef } from 'react'\n\nexport type CallbackRefParam = HTMLElement | null\n\nexport function useSizeWithElRef(callback: (e: HTMLElement) => void, enabled = true) {\n const ref = useRef<CallbackRefParam>(null)\n\n let callbackRef = (_el: CallbackRefParam) => {\n void 0\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n const element = entries[0].target as HTMLElement\n if (element.offsetParent !== null) {\n callback(element)\n }\n })\n\n callbackRef = (elRef: CallbackRefParam) => {\n if (elRef && enabled) {\n observer.observe(elRef)\n ref.current = elRef\n } else {\n if (ref.current) {\n observer.unobserve(ref.current)\n }\n ref.current = null\n }\n }\n }\n\n return { ref, callbackRef }\n}\n\nexport default function useSize(callback: (e: HTMLElement) => void, enabled = true) {\n return useSizeWithElRef(callback, enabled).callbackRef\n}\n","import { Log, LogLevel } from '../loggerSystem'\nimport { SizeFunction, SizeRange } from '../sizeSystem'\nimport { useSizeWithElRef } from './useSize'\nimport { ScrollContainerState } from '../interfaces'\nexport default function useChangedListContentsSizes(\n callback: (ranges: SizeRange[]) => void,\n itemSize: SizeFunction,\n enabled: boolean,\n scrollContainerStateCallback: (state: ScrollContainerState) => void,\n log: Log,\n gap?: (gap: number) => void,\n customScrollParent?: HTMLElement\n) {\n return useSizeWithElRef((el: HTMLElement) => {\n const ranges = getChangedChildSizes(el.children, itemSize, 'offsetHeight', log)\n let scrollableElement = el.parentElement!\n\n while (!scrollableElement.dataset['virtuosoScroller']) {\n scrollableElement = scrollableElement.parentElement!\n }\n\n const scrollTop = customScrollParent\n ? customScrollParent.scrollTop\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (scrollableElement.firstElementChild! as HTMLDivElement).dataset['viewportType']! === 'window'\n ? window.pageYOffset || document.documentElement.scrollTop\n : scrollableElement.scrollTop\n\n scrollContainerStateCallback({\n scrollTop: Math.max(scrollTop, 0),\n scrollHeight: (customScrollParent ?? scrollableElement).scrollHeight,\n viewportHeight: (customScrollParent ?? scrollableElement).offsetHeight,\n })\n\n gap?.(resolveGapValue('row-gap', getComputedStyle(el).rowGap, log))\n\n if (ranges !== null) {\n callback(ranges)\n }\n }, enabled)\n}\n\nfunction getChangedChildSizes(children: HTMLCollection, itemSize: SizeFunction, field: 'offsetHeight' | 'offsetWidth', log: Log) {\n const length = children.length\n\n if (length === 0) {\n return null\n }\n\n const results: SizeRange[] = []\n\n for (let i = 0; i < length; i++) {\n const child = children.item(i) as HTMLElement\n\n if (!child || child.dataset.index === undefined) {\n continue\n }\n\n const index = parseInt(child.dataset.index!)\n const knownSize = parseFloat(child.dataset.knownSize!)\n const size = itemSize(child, field)\n\n if (size === 0) {\n log('Zero-sized element, this should not happen', { child }, LogLevel.ERROR)\n }\n\n if (size === knownSize) {\n continue\n }\n\n const lastResult = results[results.length - 1]\n if (results.length === 0 || lastResult.size !== size || lastResult.endIndex !== index - 1) {\n results.push({ startIndex: index, endIndex: index, size })\n } else {\n results[results.length - 1].endIndex++\n }\n }\n\n return results\n}\n\nfunction resolveGapValue(property: string, value: string, log: Log) {\n if (value !== 'normal' && !value.endsWith('px')) {\n log(`${property} was not resolved to pixel value correctly`, value, LogLevel.WARN)\n }\n if (value === 'normal') {\n return 0\n }\n return parseInt(value, 10)\n}\n","export function correctItemSize(el: HTMLElement, dimension: 'height' | 'width') {\n return Math.round(el.getBoundingClientRect()[dimension])\n}\n","export function approximatelyEqual(num1: number, num2: number) {\n return Math.abs(num1 - num2) < 1.01\n}\n","import { useRef, useCallback, useEffect } from 'react'\nimport * as u from '@virtuoso.dev/urx'\nimport { correctItemSize } from '../utils/correctItemSize'\nimport { ScrollContainerState } from '../interfaces'\nimport { flushSync } from 'react-dom'\nimport { approximatelyEqual } from '../utils/approximatelyEqual'\n\nexport type ScrollerRef = Window | HTMLElement | null\n\nexport default function useScrollTop(\n scrollContainerStateCallback: (state: ScrollContainerState) => void,\n smoothScrollTargetReached: (yes: true) => void,\n scrollerElement: any,\n scrollerRefCallback: (ref: ScrollerRef) => void = u.noop,\n customScrollParent?: HTMLElement\n) {\n const scrollerRef = useRef<HTMLElement | null | Window>(null)\n const scrollTopTarget = useRef<any>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const shouldFlushSync = useRef(false)\n\n const handler = useCallback(\n (ev: Event) => {\n const el = ev.target as HTMLElement\n const windowScroll = (el as any) === window || (el as any) === document\n const scrollTop = windowScroll ? window.pageYOffset || document.documentElement.scrollTop : el.scrollTop\n const scrollHeight = windowScroll ? document.documentElement.scrollHeight : el.scrollHeight\n const viewportHeight = windowScroll ? window.innerHeight : el.offsetHeight\n\n const call = () => {\n scrollContainerStateCallback({\n scrollTop: Math.max(scrollTop, 0),\n scrollHeight,\n viewportHeight,\n })\n }\n\n if (shouldFlushSync.current) {\n flushSync(call)\n } else {\n call()\n }\n shouldFlushSync.current = false\n\n if (scrollTopTarget.current !== null) {\n if (scrollTop === scrollTopTarget.current || scrollTop <= 0 || scrollTop === scrollHeight - viewportHeight) {\n scrollTopTarget.current = null\n smoothScrollTargetReached(true)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }\n }\n },\n [scrollContainerStateCallback, smoothScrollTargetReached]\n )\n\n useEffect(() => {\n const localRef = customScrollParent ? customScrollParent : scrollerRef.current!\n\n scrollerRefCallback(customScrollParent ? customScrollParent : scrollerRef.current)\n handler({ target: localRef } as unknown as Event)\n localRef.addEventListener('scroll', handler, { passive: true })\n\n return () => {\n scrollerRefCallback(null)\n localRef.removeEventListener('scroll', handler)\n }\n }, [scrollerRef, handler, scrollerElement, scrollerRefCallback, customScrollParent])\n\n function scrollToCallback(location: ScrollToOptions) {\n const scrollerElement = scrollerRef.current\n if (!scrollerElement || ('offsetHeight' in scrollerElement && scrollerElement.offsetHeight === 0)) {\n return\n }\n\n const isSmooth = location.behavior === 'smooth'\n\n let offsetHeight: number\n let scrollHeight: number\n let scrollTop: number\n\n if (scrollerElement === window) {\n // this is not a mistake\n scrollHeight = Math.max(correctItemSize(document.documentElement, 'height'), document.documentElement.scrollHeight)\n offsetHeight = window.innerHeight\n scrollTop = document.documentElement.scrollTop\n } else {\n scrollHeight = (scrollerElement as HTMLElement).scrollHeight\n offsetHeight = correctItemSize(scrollerElement as HTMLElement, 'height')\n scrollTop = (scrollerElement as HTMLElement).scrollTop\n }\n\n const maxScrollTop = scrollHeight - offsetHeight\n location.top = Math.ceil(Math.max(Math.min(maxScrollTop, location.top!), 0))\n\n // avoid system hanging because the DOM never called back\n // with the scrollTop\n // scroller is already at this location\n if (approximatelyEqual(offsetHeight, scrollHeight) || location.top === scrollTop) {\n scrollContainerStateCallback({ scrollTop, scrollHeight, viewportHeight: offsetHeight })\n if (isSmooth) {\n smoothScrollTargetReached(true)\n }\n return\n }\n\n if (isSmooth) {\n scrollTopTarget.current = location.top\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null\n scrollTopTarget.current = null\n smoothScrollTargetReached(true)\n }, 1000)\n } else {\n scrollTopTarget.current = null\n }\n\n scrollerElement.scrollTo(location)\n }\n\n function scrollByCallback(location: ScrollToOptions) {\n shouldFlushSync.current = true\n scrollerRef.current!.scrollBy(location)\n }\n\n return { scrollerRef, scrollByCallback, scrollToCallback }\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { ScrollContainerState } from './interfaces'\n\nexport const domIOSystem = u.system(\n () => {\n const scrollContainerState = u.stream<ScrollContainerState>()\n const scrollTop = u.stream<number>()\n const deviation = u.statefulStream(0)\n const smoothScrollTargetReached = u.stream<true>()\n const statefulScrollTop = u.statefulStream(0)\n const viewportHeight = u.stream<number>()\n const scrollHeight = u.stream<number>()\n const headerHeight = u.statefulStream(0)\n const fixedHeaderHeight = u.statefulStream(0)\n const footerHeight = u.statefulStream(0)\n const scrollTo = u.stream<ScrollToOptions>()\n const scrollBy = u.stream<ScrollToOptions>()\n const scrollingInProgress = u.statefulStream(false)\n // bogus, has no effect\n const react18ConcurrentRendering = u.statefulStream(false)\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollTop }) => scrollTop)\n ),\n scrollTop\n )\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollHeight }) => scrollHeight)\n ),\n scrollHeight\n )\n\n u.connect(scrollTop, statefulScrollTop)\n\n return {\n // input\n scrollContainerState,\n scrollTop,\n viewportHeight,\n headerHeight,\n fixedHeaderHeight,\n footerHeight,\n scrollHeight,\n smoothScrollTargetReached,\n react18ConcurrentRendering,\n\n // signals\n scrollTo,\n scrollBy,\n\n // state\n statefulScrollTop,\n deviation,\n scrollingInProgress,\n }\n },\n [],\n { singleton: true }\n)\n","interface NilNode {\n lvl: 0\n}\n\nconst NIL_NODE: NilNode = { lvl: 0 }\n\ninterface NodeData<T> {\n k: number\n v: T\n}\n\ninterface NonNilAANode<T> {\n k: number\n v: T\n lvl: number\n l: NonNilAANode<T> | NilNode\n r: NonNilAANode<T> | NilNode\n}\n\nexport interface Range<T> {\n start: number\n end: number\n value: T\n}\n\nexport type AANode<T> = NilNode | NonNilAANode<T>\n\nfunction newAANode<T>(k: number, v: T, lvl: number, l: AANode<T> = NIL_NODE, r: AANode<T> = NIL_NODE): NonNilAANode<T> {\n return { k, v, lvl, l, r }\n}\n\nexport function empty(node: AANode<any>): node is NilNode {\n return node === NIL_NODE\n}\n\nexport function newTree<T>(): AANode<T> {\n return NIL_NODE\n}\n\nexport function remove<T>(node: AANode<T>, key: number): AANode<T> {\n if (empty(node)) return NIL_NODE\n\n const { k, l, r } = node\n\n if (key === k) {\n if (empty(l)) {\n return r\n } else if (empty(r)) {\n return l\n } else {\n const [lastKey, lastValue] = last(l)\n return adjust(clone(node, { k: lastKey, v: lastValue, l: deleteLast(l) }))\n }\n } else if (key < k) {\n return adjust(clone(node, { l: remove(l, key) }))\n } else {\n return adjust(clone(node, { r: remove(r, key) }))\n }\n}\n\nexport function find<T>(node: AANode<T>, key: number): T | undefined {\n if (empty(node)) {\n return\n }\n\n if (key === node.k) {\n return node.v\n } else if (key < node.k) {\n return find(node.l, key)\n } else {\n return find(node.r, key)\n }\n}\n\nexport function findMaxKeyValue<T>(node: AANode<T>, value: number, field: 'k' | 'v' = 'k'): [number, T | undefined] {\n if (empty(node)) {\n return [-Infinity, undefined]\n }\n\n if (node[field] === value) {\n return [node.k, node.v]\n }\n\n if (node[field] < value) {\n const r = findMaxKeyValue(node.r, value, field)\n if (r[0] === -Infinity) {\n return [node.k, node.v]\n } else {\n return r\n }\n }\n\n return findMaxKeyValue(node.l, value, field)\n}\n\nexport function insert<T>(node: AANode<T>, k: number, v: T): NonNilAANode<T> {\n if (empty(node)) {\n return newAANode(k, v, 1)\n }\n if (k === node.k) {\n return clone(node, { k, v })\n } else if (k < node.k) {\n return rebalance(clone(node, { l: insert(node.l, k, v) }))\n } else {\n return rebalance(clone(node, { r: insert(node.r, k, v) }))\n }\n}\n\nexport function walkWithin<T>(node: AANode<T>, start: number, end: number): NodeData<T>[] {\n if (empty(node)) {\n return []\n }\n\n const { k, v, l, r } = node\n let result: NodeData<T>[] = []\n if (k > start) {\n result = result.concat(walkWithin(l, start, end))\n }\n\n if (k >= start && k <= end) {\n result.push({ k, v })\n }\n\n if (k <= end) {\n result = result.concat(walkWithin(r, start, end))\n }\n\n return result\n}\n\nexport function walk<T>(node: AANode<T>): NodeData<T>[] {\n if (empty(node)) {\n return []\n }\n\n return [...walk(node.l), { k: node.k, v: node.v }, ...walk(node.r)]\n}\n\nfunction last<T>(node: NonNilAANode<T>): [number, T] {\n return empty(node.r) ? [node.k, node.v] : last(node.r)\n}\n\nfunction deleteLast<T>(node: NonNilAANode<T>): AANode<T> {\n return empty(node.r) ? node.l : adjust(clone(node, { r: deleteLast(node.r) }))\n}\n\nfunction clone<T>(node: NonNilAANode<T>, args: Partial<NonNilAANode<T>>): NonNilAANode<T> {\n return newAANode(\n args.k !== undefined ? args.k : node.k,\n args.v !== undefined ? args.v : node.v,\n args.lvl !== undefined ? args.lvl : node.lvl,\n args.l !== undefined ? args.l : node.l,\n args.r !== undefined ? args.r : node.r\n )\n}\n\nfunction isSingle(node: AANode<any>) {\n return empty(node) || node.lvl > node.r.lvl\n}\n\nfunction rebalance<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n return split(skew(node))\n}\n\nfunction adjust<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { l, r, lvl } = node\n if (r.lvl >= lvl - 1 && l.lvl >= lvl - 1) {\n return node\n } else if (lvl > r.lvl + 1) {\n if (isSingle(l)) {\n return skew(clone(node, { lvl: lvl - 1 }))\n } else {\n if (!empty(l) && !empty(l.r)) {\n return clone(l.r, {\n l: clone(l, { r: l.r.l }),\n r: clone(node, {\n l: l.r.r,\n lvl: lvl - 1,\n }),\n lvl: lvl,\n })\n } else {\n throw new Error('Unexpected empty nodes')\n }\n }\n } else {\n if (isSingle(node)) {\n return split(clone(node, { lvl: lvl - 1 }))\n } else {\n if (!empty(r) && !empty(r.l)) {\n const rl = r.l\n const rlvl = isSingle(rl) ? r.lvl - 1 : r.lvl\n\n return clone(rl, {\n l: clone(node, {\n r: rl.l,\n lvl: lvl - 1,\n }),\n r: split(clone(r, { l: rl.r, lvl: rlvl })),\n lvl: rl.lvl + 1,\n })\n } else {\n throw new Error('Unexpected empty nodes')\n }\n }\n }\n}\n\nexport function keys(node: AANode<any>): number[] {\n if (empty(node)) {\n return []\n }\n return [...keys(node.l), node.k, ...keys(node.r)]\n}\n\nexport function ranges<T>(node: AANode<T>): Range<T>[] {\n return toRanges(walk(node))\n}\n\nexport function rangesWithin<T>(node: AANode<T>, startIndex: number, endIndex: number): Range<T>[] {\n if (empty(node)) {\n return []\n }\n const adjustedStart = findMaxKeyValue(node, startIndex)[0]\n return toRanges(walkWithin(node, adjustedStart, endIndex))\n}\n\nexport function arrayToRanges<T, V>(\n items: T[],\n parser: (item: T) => { index: number; value: V }\n): Array<{ start: number; end: number; value: V }> {\n const length = items.length\n if (length === 0) {\n return []\n }\n\n let { index: start, value } = parser(items[0])\n\n const result = []\n\n for (let i = 1; i < length; i++) {\n const { index: nextIndex, value: nextValue } = parser(items[i])\n result.push({ start, end: nextIndex - 1, value })\n\n start = nextIndex\n value = nextValue\n }\n\n result.push({ start, end: Infinity, value })\n return result\n}\n\nfunction toRanges<T>(nodes: NodeData<T>[]): Range<T>[] {\n return arrayToRanges(nodes, ({ k: index, v: value }) => ({ index, value }))\n}\n\nfunction split<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { r, lvl } = node\n\n return !empty(r) && !empty(r.r) && r.lvl === lvl && r.r.lvl === lvl ? clone(r, { l: clone(node, { r: r.l }), lvl: lvl + 1 }) : node\n}\n\nfunction skew<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { l } = node\n\n return !empty(l) && l.lvl === node.lvl ? clone(l, { r: clone(node, { l: l.r }) }) : node\n}\n","export type Comparator<T> = {\n (item: T, value: number): -1 | 0 | 1\n}\n\nexport function findIndexOfClosestSmallerOrEqual<T>(items: T[], value: number, comparator: Comparator<T>, start = 0): number {\n let end = items.length - 1\n\n while (start <= end) {\n const index = Math.floor((start + end) / 2)\n const item = items[index]\n const match = comparator(item, value)\n if (match === 0) {\n return index\n }\n\n if (match === -1) {\n if (end - start < 2) {\n return index - 1\n }\n end = index - 1\n } else {\n if (end === start) {\n return index\n }\n start = index + 1\n }\n }\n\n throw new Error(`Failed binary finding record in array - ${items.join(',')}, searched for ${value}`)\n}\n\nexport function findClosestSmallerOrEqual<T>(items: T[], value: number, comparator: Comparator<T>): T {\n return items[findIndexOfClosestSmallerOrEqual(items, value, comparator)]\n}\n\nexport function findRange<T>(items: T[], startValue: number, endValue: number, comparator: Comparator<T>): T[] {\n const startIndex = findIndexOfClosestSmallerOrEqual(items, startValue, comparator)\n const endIndex = findIndexOfClosestSmallerOrEqual(items, endValue, comparator, startIndex)\n return items.slice(startIndex, endIndex + 1)\n}\n","import * as u from '@virtuoso.dev/urx'\n\nexport const recalcSystem = u.system(\n () => {\n const recalcInProgress = u.statefulStream(false)\n return { recalcInProgress }\n },\n [],\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { arrayToRanges, AANode, empty, findMaxKeyValue, insert, newTree, Range, rangesWithin, remove, walk } from './AATree'\nimport * as arrayBinarySearch from './utils/binaryArraySearch'\nimport { correctItemSize } from './utils/correctItemSize'\nimport { loggerSystem, Log, LogLevel } from './loggerSystem'\nimport { recalcSystem } from './recalcSystem'\n\nexport interface SizeRange {\n startIndex: number\n endIndex: number\n size: number\n}\n\nexport type Data = readonly unknown[] | undefined\n\nfunction rangeIncludes(refRange: SizeRange) {\n const { size, startIndex, endIndex } = refRange\n return (range: Range<number>) => {\n return range.start === startIndex && (range.end === endIndex || range.end === Infinity) && range.value === size\n }\n}\n\nexport function insertRanges(sizeTree: AANode<number>, ranges: SizeRange[]) {\n let syncStart = empty(sizeTree) ? 0 : Infinity\n\n for (const range of ranges) {\n const { size, startIndex, endIndex } = range\n syncStart = Math.min(syncStart, startIndex)\n\n if (empty(sizeTree)) {\n sizeTree = insert(sizeTree, 0, size)\n continue\n }\n\n // extend the range in both directions, so that we can get adjacent neighbours.\n // if the previous / next ones have the same value as the one we are about to insert,\n // we 'merge' them.\n const overlappingRanges = rangesWithin(sizeTree, startIndex - 1, endIndex + 1)\n\n if (overlappingRanges.some(rangeIncludes(range))) {\n continue\n }\n\n let firstPassDone = false\n let shouldInsert = false\n for (const { start: rangeStart, end: rangeEnd, value: rangeValue } of overlappingRanges) {\n // previous range\n if (!firstPassDone) {\n shouldInsert = rangeValue !== size\n firstPassDone = true\n } else {\n // remove the range if it starts within the new range OR if\n // it has the same value as it, in order to perform a merge\n if (endIndex >= rangeStart || size === rangeValue) {\n sizeTree = remove(sizeTree, rangeStart)\n }\n }\n\n // next range\n if (rangeEnd > endIndex && endIndex >= rangeStart) {\n if (rangeValue !== size) {\n sizeTree = insert(sizeTree, endIndex + 1, rangeValue)\n }\n }\n }\n\n if (shouldInsert) {\n sizeTree = insert(sizeTree, startIndex, size)\n }\n }\n return [sizeTree, syncStart] as const\n}\n\nexport interface OffsetPoint {\n offset: number\n size: number\n index: number\n}\n\nexport interface SizeState {\n sizeTree: AANode<number>\n offsetTree: Array<OffsetPoint>\n groupOffsetTree: AANode<number>\n lastIndex: number\n lastOffset: number\n lastSize: number\n groupIndices: number[]\n}\n\nexport function initialSizeState(): SizeState {\n return {\n offsetTree: [],\n sizeTree: newTree<number>(),\n groupOffsetTree: newTree<number>(),\n lastIndex: 0,\n lastOffset: 0,\n lastSize: 0,\n groupIndices: [],\n }\n}\n\nexport function indexComparator({ index: itemIndex }: OffsetPoint, index: number) {\n return index === itemIndex ? 0 : index < itemIndex ? -1 : 1\n}\n\nexport function offsetComparator({ offset: itemOffset }: OffsetPoint, offset: number) {\n return offset === itemOffset ? 0 : offset < itemOffset ? -1 : 1\n}\n\nfunction offsetPointParser(point: OffsetPoint) {\n return { index: point.index, value: point }\n}\n\nexport function rangesWithinOffsets(\n tree: Array<OffsetPoint>,\n startOffset: number,\n endOffset: number,\n minStartIndex = 0\n): Array<{\n start: number\n end: number\n value: {\n size: number\n offset: number\n index: number\n }\n}> {\n if (minStartIndex > 0) {\n startOffset = Math.max(startOffset, arrayBinarySearch.findClosestSmallerOrEqual(tree, minStartIndex, indexComparator).offset)\n }\n\n return arrayToRanges(arrayBinarySearch.findRange(tree, startOffset, endOffset, offsetComparator), offsetPointParser)\n}\n\nfunction createOffsetTree(prevOffsetTree: OffsetPoint[], syncStart: number, sizeTree: AANode<number>, gap: number) {\n let offsetTree = prevOffsetTree\n let prevIndex = 0\n let prevSize = 0\n\n let prevOffset = 0\n let startIndex = 0\n\n if (syncStart !== 0) {\n startIndex = arrayBinarySearch.findIndexOfClosestSmallerOrEqual(offsetTree, syncStart - 1, indexComparator)\n const offsetInfo = offsetTree[startIndex]\n prevOffset = offsetInfo.offset\n const kv = findMaxKeyValue(sizeTree, syncStart - 1)\n prevIndex = kv[0]\n prevSize = kv[1]!\n\n if (offsetTree.length && offsetTree[startIndex].size === findMaxKeyValue(sizeTree, syncStart)[1]) {\n startIndex -= 1\n }\n\n offsetTree = offsetTree.slice(0, startIndex + 1)\n } else {\n offsetTree = []\n }\n\n for (const { start: startIndex, value } of rangesWithin(sizeTree, syncStart, Infinity)) {\n const indexOffset = startIndex - prevIndex\n const aOffset = indexOffset * prevSize + prevOffset + indexOffset * gap\n offsetTree.push({\n offset: aOffset,\n size: value,\n index: startIndex,\n })\n prevIndex = startIndex\n prevOffset = aOffset\n prevSize = value\n }\n\n return {\n offsetTree,\n lastIndex: prevIndex,\n lastOffset: prevOffset,\n lastSize: prevSize,\n }\n}\n\nexport function sizeStateReducer(state: SizeState, [ranges, groupIndices, log, gap]: [SizeRange[], number[], Log, number]) {\n if (ranges.length > 0) {\n log('received item sizes', ranges, LogLevel.DEBUG)\n }\n const sizeTree = state.sizeTree\n let newSizeTree: AANode<number> = sizeTree\n let syncStart = 0\n\n // We receive probe item results from a group probe,\n // which should always pass an item and a group\n // the results contain two ranges, which we consider to mean that groups and items have different size\n if (groupIndices.length > 0 && empty(sizeTree) && ranges.length === 2) {\n const groupSize = ranges[0].size\n const itemSize = ranges[1].size\n newSizeTree = groupIndices.reduce((tree, groupIndex) => {\n return insert(insert(tree, groupIndex, groupSize), groupIndex + 1, itemSize)\n }, newSizeTree)\n } else {\n ;[newSizeTree, syncStart] = insertRanges(newSizeTree, ranges)\n }\n\n if (newSizeTree === sizeTree) {\n return state\n }\n\n const { offsetTree: newOffsetTree, lastIndex, lastSize, lastOffset } = createOffsetTree(state.offsetTree, syncStart, newSizeTree, gap)\n\n return {\n sizeTree: newSizeTree,\n offsetTree: newOffsetTree,\n lastIndex,\n lastOffset,\n lastSize,\n groupOffsetTree: groupIndices.reduce((tree, index) => {\n return insert(tree, index, offsetOf(index, newOffsetTree, gap))\n }, newTree<number>()),\n groupIndices,\n }\n}\n\nexport function offsetOf(index: number, tree: Array<OffsetPoint>, gap: number) {\n if (tree.length === 0) {\n return 0\n }\n\n const { offset, index: startIndex, size } = arrayBinarySearch.findClosestSmallerOrEqual(tree, index, indexComparator)\n const itemCount = index - startIndex\n const top = size * itemCount + (itemCount - 1) * gap + offset\n return top > 0 ? top + gap : top\n}\n\nexport type FlatOrGroupedLocation = { index: number | 'LAST' } | { groupIndex: number }\n\nexport function isGroupLocation(location: FlatOrGroupedLocation): location is { groupIndex: number } {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return typeof (location as any).groupIndex !== 'undefined'\n}\n\nexport function originalIndexFromLocation(location: FlatOrGroupedLocation, sizes: SizeState, lastIndex: number) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isGroupLocation(location)) {\n // return the index of the first item below the index\n return sizes.groupIndices[location.groupIndex] + 1\n } else {\n const numericIndex = location.index === 'LAST' ? lastIndex : location.index\n let result = originalIndexFromItemIndex(numericIndex, sizes)\n result = Math.max(0, result, Math.min(lastIndex, result))\n return result\n }\n}\n\nexport function originalIndexFromItemIndex(itemIndex: number, sizes: SizeState) {\n if (!hasGroups(sizes)) {\n return itemIndex\n }\n\n let groupOffset = 0\n while (sizes.groupIndices[groupOffset] <= itemIndex + groupOffset) {\n groupOffset++\n }\n // we find the real item index, offsetting it by the number of group items before it\n return itemIndex + groupOffset\n}\n\nexport function hasGroups(sizes: SizeState) {\n return !empty(sizes.groupOffsetTree)\n}\n\ntype OptionalNumber = number | undefined\n\nconst SIZE_MAP = {\n offsetHeight: 'height',\n offsetWidth: 'width',\n} as const\n\n/** Calculates the height of `el`, which will be the `Item` element in the DOM. */\nexport type SizeFunction = (el: HTMLElement, field: 'offsetHeight' | 'offsetWidth') => number\n\nexport const sizeSystem = u.system(\n ([{ log }, { recalcInProgress }]) => {\n const sizeRanges = u.stream<SizeRange[]>()\n const totalCount = u.stream<number>()\n const statefulTotalCount = u.statefulStreamFromEmitter(totalCount, 0)\n const unshiftWith = u.stream<number>()\n const shiftWith = u.stream<number>()\n const firstItemIndex = u.statefulStream(0)\n const groupIndices = u.statefulStream([] as number[])\n const fixedItemSize = u.statefulStream<OptionalNumber>(undefined)\n const defaultItemSize = u.statefulStream<OptionalNumber>(undefined)\n const itemSize = u.statefulStream<SizeFunction>((el, field) => correctItemSize(el, SIZE_MAP[field]))\n const data = u.statefulStream<Data>(undefined)\n const gap = u.statefulStream(0)\n const initial = initialSizeState()\n\n const sizes = u.statefulStreamFromEmitter(\n u.pipe(sizeRanges, u.withLatestFrom(groupIndices, log, gap), u.scan(sizeStateReducer, initial), u.distinctUntilChanged()),\n initial\n )\n\n u.connect(\n u.pipe(\n groupIndices,\n u.filter((indexes) => indexes.length > 0),\n u.withLatestFrom(sizes, gap),\n u.map(([groupIndices, sizes, gap]) => {\n const groupOffsetTree = groupIndices.reduce((tree, index, idx) => {\n return insert(tree, index, offsetOf(index, sizes.offsetTree, gap) || idx)\n }, newTree<number>())\n\n return {\n ...sizes,\n groupIndices,\n groupOffsetTree,\n }\n })\n ),\n sizes\n )\n\n // decreasing the total count should remove any existing entries\n // beyond the last index - do this by publishing the default size as a range over them.\n u.connect(\n u.pipe(\n totalCount,\n u.withLatestFrom(sizes),\n u.filter(([totalCount, { lastIndex }]) => {\n return totalCount < lastIndex\n }),\n u.map(([totalCount, { lastIndex, lastSize }]) => {\n return [\n {\n startIndex: totalCount,\n endIndex: lastIndex,\n size: lastSize,\n },\n ] as SizeRange[]\n })\n ),\n sizeRanges\n )\n\n u.connect(fixedItemSize, defaultItemSize)\n\n const trackItemSizes = u.statefulStreamFromEmitter(\n u.pipe(\n fixedItemSize,\n u.map((size) => size === undefined)\n ),\n true\n )\n\n u.connect(\n u.pipe(\n defaultItemSize,\n u.filter((value) => {\n return value !== undefined && empty(u.getValue(sizes).sizeTree)\n }),\n u.map((size) => [{ startIndex: 0, endIndex: 0, size }] as SizeRange[])\n ),\n sizeRanges\n )\n\n const listRefresh = u.streamFromEmitter(\n u.pipe(\n sizeRanges,\n u.withLatestFrom(sizes),\n u.scan(\n ({ sizes: oldSizes }, [_, newSizes]) => {\n return {\n changed: newSizes !== oldSizes,\n sizes: newSizes,\n }\n },\n { changed: false, sizes: initial }\n ),\n u.map((value) => value.changed)\n )\n )\n\n u.subscribe(\n u.pipe(\n firstItemIndex,\n u.scan(\n (prev, next) => {\n return { diff: prev.prev - next, prev: next }\n },\n { diff: 0, prev: 0 }\n ),\n u.map((val) => val.diff)\n ),\n (offset) => {\n if (offset > 0) {\n u.publish(recalcInProgress, true)\n u.publish(unshiftWith, offset)\n } else if (offset < 0) {\n u.publish(shiftWith, offset)\n }\n }\n )\n\n u.subscribe(u.pipe(firstItemIndex, u.withLatestFrom(log)), ([index, log]) => {\n if (index < 0) {\n log(\n \"`firstItemIndex` prop should not be set to less than zero. If you don't know the total count, just use a very high value\",\n { firstItemIndex },\n LogLevel.ERROR\n )\n }\n })\n\n // Capture the current list top item before the sizes get refreshed\n const beforeUnshiftWith = u.streamFromEmitter(unshiftWith)\n\n u.connect(\n u.pipe(\n unshiftWith,\n u.withLatestFrom(sizes),\n u.map(([unshiftWith, sizes]) => {\n if (sizes.groupIndices.length > 0) {\n throw new Error('Virtuoso: prepending items does not work with groups')\n }\n\n return walk(sizes.sizeTree).reduce(\n (acc, { k: index, v: size }) => {\n return {\n ranges: [...acc.ranges, { startIndex: acc.prevIndex, endIndex: index + unshiftWith - 1, size: acc.prevSize }],\n prevIndex: index + unshiftWith,\n prevSize: size,\n }\n },\n {\n ranges: [] as SizeRange[],\n prevIndex: 0,\n prevSize: sizes.lastSize,\n }\n ).ranges\n })\n ),\n sizeRanges\n )\n\n const shiftWithOffset = u.streamFromEmitter(\n u.pipe(\n shiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([shiftWith, { offsetTree }, gap]) => {\n const newFirstItemIndex = -shiftWith\n return offsetOf(newFirstItemIndex, offsetTree, gap)\n })\n )\n )\n\n u.connect(\n u.pipe(\n shiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([shiftWith, sizes, gap]) => {\n if (sizes.groupIndices.length > 0) {\n throw new Error('Virtuoso: shifting items does not work with groups')\n }\n\n const newSizeTree = walk(sizes.sizeTree).reduce((acc, { k, v }) => {\n return insert(acc, Math.max(0, k + shiftWith), v)\n }, newTree<number>())\n\n return {\n ...sizes,\n sizeTree: newSizeTree,\n ...createOffsetTree(sizes.offsetTree, 0, newSizeTree, gap),\n }\n })\n ),\n sizes\n )\n\n return {\n // input\n data,\n totalCount,\n sizeRanges,\n groupIndices,\n defaultItemSize,\n fixedItemSize,\n unshiftWith,\n shiftWith,\n shiftWithOffset,\n beforeUnshiftWith,\n firstItemIndex,\n gap,\n\n // output\n sizes,\n listRefresh,\n statefulTotalCount,\n trackItemSizes,\n itemSize,\n }\n },\n u.tup(loggerSystem, recalcSystem),\n { singleton: true }\n)\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport * as u from '@virtuoso.dev/urx'\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { offsetOf, originalIndexFromLocation, sizeSystem } from './sizeSystem'\nimport { IndexLocationWithAlign } from './interfaces'\nimport { loggerSystem, LogLevel } from './loggerSystem'\n\nexport type IndexLocation = number | IndexLocationWithAlign\n\nconst SUPPORTS_SCROLL_TO_OPTIONS = typeof document !== 'undefined' && 'scrollBehavior' in document.documentElement.style\n\nexport function normalizeIndexLocation(location: IndexLocation) {\n const result: IndexLocationWithAlign = typeof location === 'number' ? { index: location } : location\n\n if (!result.align) {\n result.align = 'start'\n }\n if (!result.behavior || !SUPPORTS_SCROLL_TO_OPTIONS) {\n result.behavior = 'auto'\n }\n if (!result.offset) {\n result.offset = 0\n }\n\n return result\n}\n\nexport const scrollToIndexSystem = u.system(\n ([\n { sizes, totalCount, listRefresh, gap },\n { scrollingInProgress, viewportHeight, scrollTo, smoothScrollTargetReached, headerHeight, footerHeight },\n { log },\n ]) => {\n const scrollToIndex = u.stream<IndexLocation>()\n const topListHeight = u.statefulStream(0)\n\n let unsubscribeNextListRefresh: any = null\n let cleartTimeoutRef: ReturnType<typeof setTimeout> | null = null\n let unsubscribeListRefresh: any = null\n\n function cleanup() {\n if (unsubscribeNextListRefresh) {\n unsubscribeNextListRefresh()\n unsubscribeNextListRefresh = null\n }\n\n if (unsubscribeListRefresh) {\n unsubscribeListRefresh()\n unsubscribeListRefresh = null\n }\n\n if (cleartTimeoutRef) {\n clearTimeout(cleartTimeoutRef)\n cleartTimeoutRef = null\n }\n u.publish(scrollingInProgress, false)\n }\n\n u.connect(\n u.pipe(\n scrollToIndex,\n u.withLatestFrom(sizes, viewportHeight, totalCount, topListHeight, headerHeight, footerHeight, log),\n u.withLatestFrom(gap),\n u.map(([[location, sizes, viewportHeight, totalCount, topListHeight, headerHeight, footerHeight, log], gap]) => {\n const normalLocation = normalizeIndexLocation(location)\n const { align, behavior, offset } = normalLocation\n const lastIndex = totalCount - 1\n\n const index = originalIndexFromLocation(normalLocation, sizes, lastIndex)\n\n let top = offsetOf(index, sizes.offsetTree, gap) + headerHeight\n if (align === 'end') {\n top = top - viewportHeight + findMaxKeyValue(sizes.sizeTree, index)[1]!\n if (index === lastIndex) {\n top += footerHeight\n }\n } else if (align === 'center') {\n top = top - viewportHeight / 2 + findMaxKeyValue(sizes.sizeTree, index)[1]! / 2\n } else {\n top -= topListHeight\n }\n\n if (offset) {\n top += offset\n }\n\n const retry = (listChanged: boolean) => {\n cleanup()\n if (listChanged) {\n log('retrying to scroll to', { location }, LogLevel.DEBUG)\n u.publish(scrollToIndex, location)\n } else {\n log('list did not change, scroll successful', {}, LogLevel.DEBUG)\n }\n }\n\n cleanup()\n\n if (behavior === 'smooth') {\n let listChanged = false\n unsubscribeListRefresh = u.subscribe(listRefresh, (changed) => {\n listChanged = listChanged || changed\n })\n\n unsubscribeNextListRefresh = u.handleNext(smoothScrollTargetReached, () => {\n retry(listChanged)\n })\n } else {\n unsubscribeNextListRefresh = u.handleNext(u.pipe(listRefresh, watchChangesFor(150)), retry)\n }\n\n // if the scroll jump is too small, the list won't get rerendered.\n // clean this listener\n cleartTimeoutRef = setTimeout(() => {\n cleanup()\n }, 1200)\n\n u.publish(scrollingInProgress, true)\n log('scrolling from index to', { index, top, behavior }, LogLevel.DEBUG)\n return { top, behavior }\n })\n ),\n scrollTo\n )\n\n return {\n scrollToIndex,\n topListHeight,\n }\n },\n u.tup(sizeSystem, domIOSystem, loggerSystem),\n { singleton: true }\n)\n\nfunction watchChangesFor(limit: number): u.Operator<boolean> {\n return (done) => {\n const timeoutRef = setTimeout(() => {\n done(false)\n }, limit)\n return (value) => {\n if (value) {\n done(true)\n clearTimeout(timeoutRef)\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { approximatelyEqual } from './utils/approximatelyEqual'\n\nexport const UP = 'up' as const\nexport const DOWN = 'down' as const\nexport const NONE = 'none' as const\nexport type ScrollDirection = typeof UP | typeof DOWN | typeof NONE\n\nexport interface ListBottomInfo {\n bottom: number\n offsetBottom: number\n}\n\nexport interface AtBottomParams {\n offsetBottom: number\n scrollTop: number\n viewportHeight: number\n scrollHeight: number\n}\n\nexport type NotAtBottomReason =\n | 'SIZE_INCREASED'\n | 'NOT_SHOWING_LAST_ITEM'\n | 'VIEWPORT_HEIGHT_DECREASING'\n | 'SCROLLING_UPWARDS'\n | 'NOT_FULLY_SCROLLED_TO_LAST_ITEM_BOTTOM'\n\nexport type AtBottomReason = 'SIZE_DECREASED' | 'SCROLLED_DOWN'\n\nexport type AtBottomState =\n | {\n atBottom: false\n notAtBottomBecause: NotAtBottomReason\n state: AtBottomParams\n }\n | {\n atBottom: true\n state: AtBottomParams\n atBottomBecause: AtBottomReason\n scrollTopDelta: number\n }\n\nconst INITIAL_BOTTOM_STATE = {\n atBottom: false,\n notAtBottomBecause: 'NOT_SHOWING_LAST_ITEM',\n state: {\n offsetBottom: 0,\n scrollTop: 0,\n viewportHeight: 0,\n scrollHeight: 0,\n },\n} as AtBottomState\n\nconst DEFAULT_AT_TOP_THRESHOLD = 0\n\nexport const stateFlagsSystem = u.system(([{ scrollContainerState, scrollTop, viewportHeight, headerHeight, footerHeight, scrollBy }]) => {\n const isAtBottom = u.statefulStream(false)\n const isAtTop = u.statefulStream(true)\n const atBottomStateChange = u.stream<boolean>()\n const atTopStateChange = u.stream<boolean>()\n const atBottomThreshold = u.statefulStream(4)\n const atTopThreshold = u.statefulStream(DEFAULT_AT_TOP_THRESHOLD)\n\n // skip 1 to avoid an initial on/off flick\n const isScrolling = u.statefulStreamFromEmitter(\n u.pipe(\n u.merge(u.pipe(u.duc(scrollTop), u.skip(1), u.mapTo(true)), u.pipe(u.duc(scrollTop), u.skip(1), u.mapTo(false), u.debounceTime(100))),\n u.distinctUntilChanged()\n ),\n false\n )\n\n const isScrollingBy = u.statefulStreamFromEmitter(\n u.pipe(u.merge(u.pipe(scrollBy, u.mapTo(true)), u.pipe(scrollBy, u.mapTo(false), u.debounceTime(200))), u.distinctUntilChanged()),\n false\n )\n\n // u.subscribe(isScrollingBy, (isScrollingBy) => console.log({ isScrollingBy }))\n\n u.connect(\n u.pipe(\n u.combineLatest(u.duc(scrollTop), u.duc(atTopThreshold)),\n u.map(([top, atTopThreshold]) => top <= atTopThreshold),\n u.distinctUntilChanged()\n ),\n isAtTop\n )\n\n u.connect(u.pipe(isAtTop, u.throttleTime(50)), atTopStateChange)\n\n const atBottomState = u.streamFromEmitter(\n u.pipe(\n u.combineLatest(scrollContainerState, u.duc(viewportHeight), u.duc(headerHeight), u.duc(footerHeight), u.duc(atBottomThreshold)),\n u.scan((current, [{ scrollTop, scrollHeight }, viewportHeight, _headerHeight, _footerHeight, atBottomThreshold]) => {\n const isAtBottom = scrollTop + viewportHeight - scrollHeight > -atBottomThreshold\n const state = {\n viewportHeight,\n scrollTop,\n scrollHeight,\n }\n\n if (isAtBottom) {\n let atBottomBecause: 'SIZE_DECREASED' | 'SCROLLED_DOWN'\n let scrollTopDelta: number\n if (scrollTop > current.state.scrollTop) {\n atBottomBecause = 'SCROLLED_DOWN'\n scrollTopDelta = current.state.scrollTop - scrollTop\n } else {\n atBottomBecause = 'SIZE_DECREASED'\n scrollTopDelta = current.state.scrollTop - scrollTop || (current as { scrollTopDelta: number }).scrollTopDelta\n }\n return {\n atBottom: true,\n state,\n atBottomBecause,\n scrollTopDelta,\n } as AtBottomState\n }\n\n let notAtBottomBecause: NotAtBottomReason\n\n if (state.scrollHeight > current.state.scrollHeight) {\n notAtBottomBecause = 'SIZE_INCREASED'\n } else if (viewportHeight < current.state.viewportHeight) {\n notAtBottomBecause = 'VIEWPORT_HEIGHT_DECREASING'\n } else if (scrollTop < current.state.scrollTop) {\n notAtBottomBecause = 'SCROLLING_UPWARDS'\n } else {\n notAtBottomBecause = 'NOT_FULLY_SCROLLED_TO_LAST_ITEM_BOTTOM'\n }\n\n return {\n atBottom: false,\n notAtBottomBecause,\n state,\n } as AtBottomState\n }, INITIAL_BOTTOM_STATE),\n u.distinctUntilChanged((prev, next) => {\n return prev && prev.atBottom === next.atBottom\n })\n )\n )\n\n const lastJumpDueToItemResize = u.statefulStreamFromEmitter(\n u.pipe(\n scrollContainerState,\n u.scan(\n (current, { scrollTop, scrollHeight, viewportHeight }) => {\n if (!approximatelyEqual(current.scrollHeight, scrollHeight)) {\n const atBottom = scrollHeight - (scrollTop + viewportHeight) < 1\n\n if (current.scrollTop !== scrollTop && atBottom) {\n return {\n scrollHeight,\n scrollTop,\n jump: current.scrollTop - scrollTop,\n changed: true,\n }\n } else {\n return {\n scrollHeight,\n scrollTop,\n jump: 0,\n changed: true,\n }\n }\n } else {\n return {\n scrollTop,\n scrollHeight,\n jump: 0,\n changed: false,\n }\n }\n },\n { scrollHeight: 0, jump: 0, scrollTop: 0, changed: false }\n ),\n u.filter((value) => value.changed),\n u.map((value) => value.jump)\n ),\n 0\n )\n\n u.connect(\n u.pipe(\n atBottomState,\n u.map((state) => state.atBottom)\n ),\n isAtBottom\n )\n\n u.connect(u.pipe(isAtBottom, u.throttleTime(50)), atBottomStateChange)\n\n const scrollDirection = u.statefulStream<ScrollDirection>(DOWN)\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollTop }) => scrollTop),\n u.distinctUntilChanged(),\n u.scan(\n (acc, scrollTop) => {\n // if things change while compensating for items, ignore,\n // but store the new scrollTop\n if (u.getValue(isScrollingBy)) {\n return { direction: acc.direction, prevScrollTop: scrollTop }\n }\n\n return { direction: scrollTop < acc.prevScrollTop ? UP : DOWN, prevScrollTop: scrollTop }\n },\n { direction: DOWN, prevScrollTop: 0 } as { direction: ScrollDirection; prevScrollTop: number }\n ),\n u.map((value) => value.direction)\n ),\n scrollDirection\n )\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.connect(u.pipe(scrollContainerState, u.throttleTime(50), u.mapTo(NONE)), scrollDirection)\n\n const scrollVelocity = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n isScrolling,\n u.filter((value) => !value),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(0)\n ),\n scrollVelocity\n )\n\n u.connect(\n u.pipe(\n scrollTop,\n u.throttleTime(100),\n u.withLatestFrom(isScrolling),\n u.filter(([_, isScrolling]) => !!isScrolling),\n u.scan(([_, prev], [next]) => [prev, next], [0, 0]),\n u.map(([prev, next]) => next - prev)\n ),\n scrollVelocity\n )\n\n return {\n isScrolling,\n isAtTop,\n isAtBottom,\n atBottomState,\n atTopStateChange,\n atBottomStateChange,\n scrollDirection,\n atBottomThreshold,\n atTopThreshold,\n scrollVelocity,\n lastJumpDueToItemResize,\n }\n}, u.tup(domIOSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { loggerSystem, LogLevel } from './loggerSystem'\n\nexport const propsReadySystem = u.system(\n ([{ log }]) => {\n const propsReady = u.statefulStream(false)\n\n const didMount = u.streamFromEmitter(\n u.pipe(\n propsReady,\n u.filter((ready) => ready),\n u.distinctUntilChanged()\n )\n )\n u.subscribe(propsReady, (value) => {\n value && u.getValue(log)('props updated', {}, LogLevel.DEBUG)\n })\n\n return { propsReady, didMount }\n },\n u.tup(loggerSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { empty } from './AATree'\nimport { sizeSystem } from './sizeSystem'\nimport { domIOSystem } from './domIOSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { FlatIndexLocationWithAlign } from './interfaces'\n\nexport function getInitialTopMostItemIndexNumber(location: number | FlatIndexLocationWithAlign, totalCount: number): number {\n const lastIndex = totalCount - 1\n const index = typeof location === 'number' ? location : location.index === 'LAST' ? lastIndex : location.index\n return index\n}\n\nexport const initialTopMostItemIndexSystem = u.system(\n ([{ sizes, listRefresh, defaultItemSize }, { scrollTop }, { scrollToIndex }, { didMount }]) => {\n const scrolledToInitialItem = u.statefulStream(true)\n const initialTopMostItemIndex = u.statefulStream<number | FlatIndexLocationWithAlign>(0)\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialTopMostItemIndex),\n u.filter(([_, location]) => !!location),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(false)\n ),\n scrolledToInitialItem\n )\n\n u.subscribe(\n u.pipe(\n u.combineLatest(listRefresh, didMount),\n u.withLatestFrom(scrolledToInitialItem, sizes, defaultItemSize),\n u.filter(([[, didMount], scrolledToInitialItem, { sizeTree }, defaultItemSize]) => {\n return didMount && (!empty(sizeTree) || defaultItemSize !== undefined) && !scrolledToInitialItem\n }),\n u.withLatestFrom(initialTopMostItemIndex)\n ),\n ([, initialTopMostItemIndex]) => {\n setTimeout(() => {\n u.handleNext(scrollTop, () => {\n u.publish(scrolledToInitialItem, true)\n })\n u.publish(scrollToIndex, initialTopMostItemIndex)\n })\n }\n )\n\n return {\n scrolledToInitialItem,\n initialTopMostItemIndex,\n }\n },\n u.tup(sizeSystem, domIOSystem, scrollToIndexSystem, propsReadySystem),\n { singleton: true }\n)\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport * as u from '@virtuoso.dev/urx'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { FollowOutput, FollowOutputScalarType } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { loggerSystem, LogLevel } from './loggerSystem'\nimport { domIOSystem } from './domIOSystem'\n\nfunction normalizeFollowOutput(follow: FollowOutputScalarType): FollowOutputScalarType {\n if (!follow) {\n return false\n }\n return follow === 'smooth' ? 'smooth' : 'auto'\n}\n\nconst behaviorFromFollowOutput = (follow: FollowOutput, isAtBottom: boolean) => {\n if (typeof follow === 'function') {\n return normalizeFollowOutput(follow(isAtBottom))\n }\n return isAtBottom && normalizeFollowOutput(follow)\n}\n\nexport const followOutputSystem = u.system(\n ([\n { totalCount, listRefresh },\n { isAtBottom, atBottomState },\n { scrollToIndex },\n { scrolledToInitialItem },\n { propsReady, didMount },\n { log },\n { scrollingInProgress },\n ]) => {\n const followOutput = u.statefulStream<FollowOutput>(false)\n const autoscrollToBottom = u.stream<true>()\n let pendingScrollHandle: any = null\n\n function scrollToBottom(followOutputBehavior: FollowOutputScalarType) {\n u.publish(scrollToIndex, {\n index: 'LAST',\n align: 'end',\n behavior: followOutputBehavior,\n })\n }\n\n u.subscribe(\n u.pipe(\n u.combineLatest(u.pipe(u.duc(totalCount), u.skip(1)), didMount),\n u.withLatestFrom(u.duc(followOutput), isAtBottom, scrolledToInitialItem, scrollingInProgress),\n u.map(([[totalCount, didMount], followOutput, isAtBottom, scrolledToInitialItem, scrollingInProgress]) => {\n let shouldFollow = didMount && scrolledToInitialItem\n let followOutputBehavior: FollowOutputScalarType = 'auto'\n\n if (shouldFollow) {\n // if scrolling to index is in progress,\n // assume that a previous followOutput response is going\n followOutputBehavior = behaviorFromFollowOutput(followOutput, isAtBottom || scrollingInProgress)\n shouldFollow = shouldFollow && !!followOutputBehavior\n }\n\n return { totalCount, shouldFollow, followOutputBehavior }\n }),\n u.filter(({ shouldFollow }) => shouldFollow)\n ),\n ({ totalCount, followOutputBehavior }) => {\n if (pendingScrollHandle) {\n pendingScrollHandle()\n pendingScrollHandle = null\n }\n\n pendingScrollHandle = u.handleNext(listRefresh, () => {\n u.getValue(log)('following output to ', { totalCount }, LogLevel.DEBUG)\n scrollToBottom(followOutputBehavior)\n pendingScrollHandle = null\n })\n }\n )\n\n function trapNextSizeIncrease(followOutput: boolean) {\n const cancel = u.handleNext(atBottomState, (state) => {\n if (followOutput && !state.atBottom && state.notAtBottomBecause === 'SIZE_INCREASED' && !pendingScrollHandle) {\n u.getValue(log)('scrolling to bottom due to increased size', {}, LogLevel.DEBUG)\n scrollToBottom('auto')\n }\n })\n setTimeout(cancel, 100)\n }\n\n u.subscribe(\n u.pipe(\n u.combineLatest(u.duc(followOutput), totalCount, propsReady),\n u.filter(([follow, , ready]) => follow && ready),\n u.scan(\n ({ value }, [, next]) => {\n return { refreshed: value === next, value: next }\n },\n { refreshed: false, value: 0 }\n ),\n u.filter(({ refreshed }) => refreshed),\n u.withLatestFrom(followOutput, totalCount)\n ),\n ([, followOutput]) => {\n trapNextSizeIncrease(followOutput !== false)\n }\n )\n\n u.subscribe(autoscrollToBottom, () => {\n trapNextSizeIncrease(u.getValue(followOutput) !== false)\n })\n\n u.subscribe(u.combineLatest(u.duc(followOutput), atBottomState), ([followOutput, state]) => {\n if (followOutput && !state.atBottom && state.notAtBottomBecause === 'VIEWPORT_HEIGHT_DECREASING') {\n scrollToBottom('auto')\n }\n })\n\n return { followOutput, autoscrollToBottom }\n },\n u.tup(sizeSystem, stateFlagsSystem, scrollToIndexSystem, initialTopMostItemIndexSystem, propsReadySystem, loggerSystem, domIOSystem)\n)\n","import * as u from '@virtuoso.dev/urx'\n\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { sizeSystem, hasGroups } from './sizeSystem'\nexport interface GroupIndexesAndCount {\n totalCount: number\n groupIndices: number[]\n}\n\nexport function groupCountsToIndicesAndCount(counts: number[]) {\n return counts.reduce(\n (acc, groupCount) => {\n acc.groupIndices.push(acc.totalCount)\n acc.totalCount += groupCount + 1\n return acc\n },\n {\n totalCount: 0,\n groupIndices: [],\n } as GroupIndexesAndCount\n )\n}\n\nexport const groupedListSystem = u.system(([{ totalCount, groupIndices, sizes }, { scrollTop, headerHeight }]) => {\n const groupCounts = u.stream<number[]>()\n const topItemsIndexes = u.stream<[number]>()\n const groupIndicesAndCount = u.streamFromEmitter(u.pipe(groupCounts, u.map(groupCountsToIndicesAndCount)))\n u.connect(\n u.pipe(\n groupIndicesAndCount,\n u.map((value) => value.totalCount)\n ),\n totalCount\n )\n u.connect(\n u.pipe(\n groupIndicesAndCount,\n u.map((value) => value.groupIndices)\n ),\n groupIndices\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(scrollTop, sizes, headerHeight),\n u.filter(([_, sizes]) => hasGroups(sizes)),\n u.map(([scrollTop, state, headerHeight]) => findMaxKeyValue(state.groupOffsetTree, Math.max(scrollTop - headerHeight, 0), 'v')[0]),\n u.distinctUntilChanged(),\n u.map((index) => [index])\n ),\n topItemsIndexes\n )\n\n return { groupCounts, topItemsIndexes }\n}, u.tup(sizeSystem, domIOSystem))\n","import { ListRange } from './interfaces'\n\nexport function tupleComparator<T1, T2>(prev: [T1, T2] | undefined, current: [T1, T2]) {\n return !!(prev && prev[0] === current[0] && prev[1] === current[1])\n}\n\nexport function rangeComparator(prev: ListRange | undefined, next: ListRange) {\n return !!(prev && prev.startIndex === next.startIndex && prev.endIndex === next.endIndex)\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { UP, DOWN, ScrollDirection } from './stateFlagsSystem'\nimport { tupleComparator } from './comparators'\n\nexport type NumberTuple = [number, number]\nexport type Overscan = number | { main: number; reverse: number }\nexport const TOP = 'top' as const\nexport const BOTTOM = 'bottom' as const\nexport const NONE = 'none' as const\nexport type ListEnd = typeof TOP | typeof BOTTOM\nexport type ViewportIncrease = number | { [k in ListEnd]?: number }\nexport type ChangeDirection = typeof UP | typeof DOWN | typeof NONE\n\nexport function getOverscan(overscan: Overscan, end: ListEnd, direction: ScrollDirection) {\n if (typeof overscan === 'number') {\n return (direction === UP && end === TOP) || (direction === DOWN && end === BOTTOM) ? overscan : 0\n } else {\n if (direction === UP) {\n return end === TOP ? overscan.main : overscan.reverse\n } else {\n return end === BOTTOM ? overscan.main : overscan.reverse\n }\n }\n}\n\nfunction getViewportIncrease(value: ViewportIncrease, end: ListEnd) {\n return typeof value === 'number' ? value : value[end] || 0\n}\n\nexport const sizeRangeSystem = u.system(\n ([{ scrollTop, viewportHeight, deviation, headerHeight, fixedHeaderHeight }]) => {\n const listBoundary = u.stream<NumberTuple>()\n const topListHeight = u.statefulStream(0)\n const increaseViewportBy = u.statefulStream<ViewportIncrease>(0)\n const overscan = u.statefulStream<Overscan>(0)\n\n const visibleRange = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(\n u.duc(scrollTop),\n u.duc(viewportHeight),\n u.duc(headerHeight),\n u.duc(listBoundary, tupleComparator),\n u.duc(overscan),\n u.duc(topListHeight),\n u.duc(fixedHeaderHeight),\n u.duc(deviation),\n u.duc(increaseViewportBy)\n ),\n u.map(\n ([\n scrollTop,\n viewportHeight,\n headerHeight,\n [listTop, listBottom],\n overscan,\n topListHeight,\n fixedHeaderHeight,\n deviation,\n increaseViewportBy,\n ]) => {\n const top = scrollTop - deviation\n const stickyHeaderHeight = topListHeight + fixedHeaderHeight\n const headerVisible = Math.max(headerHeight - top, 0)\n let direction: ChangeDirection = NONE\n const topViewportAddition = getViewportIncrease(increaseViewportBy, TOP)\n const bottomViewportAddition = getViewportIncrease(increaseViewportBy, BOTTOM)\n\n listTop -= deviation\n listTop += headerHeight + fixedHeaderHeight\n listBottom += headerHeight + fixedHeaderHeight\n listBottom -= deviation\n\n // console.log({ listTop, scrollTop, stickyHeaderHeight, topViewportAddition })\n if (listTop > scrollTop + stickyHeaderHeight - topViewportAddition) {\n direction = UP\n }\n\n if (listBottom < scrollTop - headerVisible + viewportHeight + bottomViewportAddition) {\n direction = DOWN\n }\n\n if (direction !== NONE) {\n return [\n Math.max(top - headerHeight - getOverscan(overscan, TOP, direction) - topViewportAddition, 0),\n top -\n headerVisible -\n fixedHeaderHeight +\n viewportHeight +\n getOverscan(overscan, BOTTOM, direction) +\n bottomViewportAddition,\n ] as NumberTuple\n }\n\n return null\n }\n ),\n u.filter((value) => value != null) as u.Operator<NumberTuple | null, NumberTuple>,\n u.distinctUntilChanged(tupleComparator)\n ),\n [0, 0]\n ) as unknown as u.StatefulStream<NumberTuple>\n\n return {\n // input\n listBoundary,\n overscan,\n topListHeight,\n increaseViewportBy,\n\n // output\n visibleRange,\n }\n },\n u.tup(domIOSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { empty, findMaxKeyValue, Range, rangesWithin } from './AATree'\nimport { groupedListSystem } from './groupedListSystem'\nimport { getInitialTopMostItemIndexNumber, initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { Item, ListItem, ListRange } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { Data, originalIndexFromItemIndex, SizeState, sizeSystem, hasGroups, rangesWithinOffsets } from './sizeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { rangeComparator, tupleComparator } from './comparators'\nimport { recalcSystem } from './recalcSystem'\n\nexport type ListItems = ListItem<unknown>[]\nexport interface TopListState {\n items: ListItems\n listHeight: number\n}\n\nexport interface ListState {\n items: ListItems\n topItems: ListItems\n topListHeight: number\n offsetTop: number\n offsetBottom: number\n top: number\n bottom: number\n totalCount: number\n firstItemIndex: number\n}\n\nfunction probeItemSet(index: number, sizes: SizeState, data: Data) {\n if (hasGroups(sizes)) {\n const itemIndex = originalIndexFromItemIndex(index, sizes)\n const groupIndex = findMaxKeyValue(sizes.groupOffsetTree, itemIndex)[0]\n\n return [\n { index: groupIndex, size: 0, offset: 0 },\n { index: itemIndex, size: 0, offset: 0, data: data && data[0] },\n ]\n }\n return [{ index, size: 0, offset: 0, data: data && data[0] }]\n}\n\nconst EMPTY_LIST_STATE: ListState = {\n items: [] as ListItems,\n topItems: [] as ListItems,\n offsetTop: 0,\n offsetBottom: 0,\n top: 0,\n bottom: 0,\n topListHeight: 0,\n totalCount: 0,\n firstItemIndex: 0,\n}\n\nfunction transposeItems(items: Item<any>[], sizes: SizeState, firstItemIndex: number): ListItems {\n if (items.length === 0) {\n return []\n }\n\n if (!hasGroups(sizes)) {\n return items.map((item) => ({ ...item, index: item.index + firstItemIndex, originalIndex: item.index }))\n }\n\n const startIndex = items[0].index\n const endIndex = items[items.length - 1].index\n\n const transposedItems = [] as ListItems\n const groupRanges = rangesWithin(sizes.groupOffsetTree, startIndex, endIndex)\n let currentRange: Range<number> | undefined = undefined\n let currentGroupIndex = 0\n\n for (const item of items) {\n if (!currentRange || currentRange.end < item.index) {\n currentRange = groupRanges.shift()!\n currentGroupIndex = sizes.groupIndices.indexOf(currentRange.start)\n }\n\n let transposedItem: { type: 'group'; index: number } | { index: number; groupIndex: number }\n\n if (item.index === currentRange.start) {\n transposedItem = {\n type: 'group' as const,\n index: currentGroupIndex,\n }\n } else {\n transposedItem = {\n index: item.index - (currentGroupIndex + 1) + firstItemIndex,\n groupIndex: currentGroupIndex,\n }\n }\n\n transposedItems.push({\n ...transposedItem,\n size: item.size,\n offset: item.offset,\n originalIndex: item.index,\n data: item.data,\n })\n }\n\n return transposedItems\n}\n\nexport function buildListState(\n items: Item<any>[],\n topItems: Item<any>[],\n totalCount: number,\n gap: number,\n sizes: SizeState,\n firstItemIndex: number\n): ListState {\n const { lastSize, lastOffset, lastIndex } = sizes\n let offsetTop = 0\n let bottom = 0\n\n if (items.length > 0) {\n offsetTop = items[0].offset\n const lastItem = items[items.length - 1]\n bottom = lastItem.offset + lastItem.size\n }\n\n const itemCount = totalCount - lastIndex\n const total = lastOffset + itemCount * lastSize + (itemCount - 1) * gap\n const top = offsetTop\n const offsetBottom = total - bottom\n\n return {\n items: transposeItems(items, sizes, firstItemIndex),\n topItems: transposeItems(topItems, sizes, firstItemIndex),\n topListHeight: topItems.reduce((height, item) => item.size + height, 0),\n offsetTop,\n offsetBottom,\n top,\n bottom,\n totalCount,\n firstItemIndex,\n }\n}\n\nexport const listStateSystem = u.system(\n ([\n { sizes, totalCount, data, firstItemIndex, gap },\n groupedListSystem,\n { visibleRange, listBoundary, topListHeight: rangeTopListHeight },\n { scrolledToInitialItem, initialTopMostItemIndex },\n { topListHeight },\n stateFlags,\n { didMount },\n { recalcInProgress },\n ]) => {\n const topItemsIndexes = u.statefulStream<Array<number>>([])\n const itemsRendered = u.stream<ListItems>()\n\n u.connect(groupedListSystem.topItemsIndexes, topItemsIndexes)\n\n const listState = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(\n didMount,\n recalcInProgress,\n u.duc(visibleRange, tupleComparator),\n u.duc(totalCount),\n u.duc(sizes),\n u.duc(initialTopMostItemIndex),\n scrolledToInitialItem,\n u.duc(topItemsIndexes),\n u.duc(firstItemIndex),\n u.duc(gap),\n data\n ),\n u.filter(([mount, recalcInProgress]) => {\n return mount && !recalcInProgress\n }),\n u.map(\n ([\n ,\n ,\n [startOffset, endOffset],\n totalCount,\n sizes,\n initialTopMostItemIndex,\n scrolledToInitialItem,\n topItemsIndexes,\n firstItemIndex,\n gap,\n data,\n ]) => {\n const sizesValue = sizes\n const { sizeTree, offsetTree } = sizesValue\n\n if (totalCount === 0 || (startOffset === 0 && endOffset === 0)) {\n return EMPTY_LIST_STATE\n }\n\n if (empty(sizeTree)) {\n return buildListState(\n probeItemSet(getInitialTopMostItemIndexNumber(initialTopMostItemIndex, totalCount), sizesValue, data),\n [],\n totalCount,\n gap,\n sizesValue,\n firstItemIndex\n )\n }\n\n const topItems = [] as Item<any>[]\n\n if (topItemsIndexes.length > 0) {\n const startIndex = topItemsIndexes[0]\n const endIndex = topItemsIndexes[topItemsIndexes.length - 1]\n let offset = 0\n for (const range of rangesWithin(sizeTree, startIndex, endIndex)) {\n const size = range.value\n const rangeStartIndex = Math.max(range.start, startIndex)\n const rangeEndIndex = Math.min(range.end, endIndex)\n for (let i = rangeStartIndex; i <= rangeEndIndex; i++) {\n topItems.push({ index: i, size, offset: offset, data: data && data[i] })\n offset += size\n }\n }\n }\n\n // If the list hasn't scrolled to the initial item because the initial item was set,\n // render empty list.\n //\n // This is a condition to be evaluated past the probe check, do not merge\n // with the totalCount check above\n if (!scrolledToInitialItem) {\n return buildListState([], topItems, totalCount, gap, sizesValue, firstItemIndex)\n }\n\n const minStartIndex = topItemsIndexes.length > 0 ? topItemsIndexes[topItemsIndexes.length - 1] + 1 : 0\n\n const offsetPointRanges = rangesWithinOffsets(offsetTree, startOffset, endOffset, minStartIndex)\n if (offsetPointRanges.length === 0) {\n return null\n }\n\n const maxIndex = totalCount - 1\n\n const items = u.tap([] as Item<any>[], (result) => {\n for (const range of offsetPointRanges) {\n const point = range.value\n let offset = point.offset\n let rangeStartIndex = range.start\n const size = point.size\n\n if (point.offset < startOffset) {\n rangeStartIndex += Math.floor((startOffset - point.offset + gap) / (size + gap))\n const itemCount = rangeStartIndex - range.start\n offset += itemCount * size + itemCount * gap\n }\n\n if (rangeStartIndex < minStartIndex) {\n offset += (minStartIndex - rangeStartIndex) * size\n rangeStartIndex = minStartIndex\n }\n\n const endIndex = Math.min(range.end, maxIndex)\n\n for (let i = rangeStartIndex; i <= endIndex; i++) {\n if (offset >= endOffset) {\n break\n }\n\n result.push({ index: i, size, offset: offset, data: data && data[i] })\n offset += size + gap\n }\n }\n })\n\n return buildListState(items, topItems, totalCount, gap, sizesValue, firstItemIndex)\n }\n ),\n //@ts-expect-error filter needs to be fixed\n u.filter((value) => value !== null),\n u.distinctUntilChanged()\n ),\n EMPTY_LIST_STATE\n )\n\n u.connect(\n u.pipe(\n data,\n u.filter((data) => data !== undefined),\n u.map((data) => data!.length)\n ),\n totalCount\n )\n\n u.connect(\n u.pipe(\n listState,\n u.map((value) => value.topListHeight)\n ),\n topListHeight\n )\n u.connect(topListHeight, rangeTopListHeight)\n\n u.connect(\n u.pipe(\n listState,\n u.map((state) => [state.top, state.bottom])\n ),\n listBoundary\n )\n\n u.connect(\n u.pipe(\n listState,\n u.map((state) => state.items)\n ),\n itemsRendered\n )\n\n const endReached = u.streamFromEmitter(\n u.pipe(\n listState,\n u.filter(({ items }) => items.length > 0),\n u.withLatestFrom(totalCount, data),\n u.filter(([{ items }, totalCount]) => items[items.length - 1].originalIndex === totalCount - 1),\n u.map(([, totalCount, data]) => [totalCount - 1, data] as [number, unknown[]]),\n u.distinctUntilChanged(tupleComparator),\n u.map(([count]) => count)\n )\n )\n\n const startReached = u.streamFromEmitter(\n u.pipe(\n listState,\n u.throttleTime(200),\n u.filter(({ items, topItems }) => {\n return items.length > 0 && items[0].originalIndex === topItems.length\n }),\n u.map(({ items }) => items[0].index),\n u.distinctUntilChanged()\n )\n )\n\n const rangeChanged = u.streamFromEmitter(\n u.pipe(\n listState,\n u.filter(({ items }) => items.length > 0),\n u.map(({ items }) => {\n return {\n startIndex: items[0].index,\n endIndex: items[items.length - 1].index,\n } as ListRange\n }),\n u.distinctUntilChanged(rangeComparator)\n )\n )\n\n return { listState, topItemsIndexes, endReached, startReached, rangeChanged, itemsRendered, ...stateFlags }\n },\n u.tup(\n sizeSystem,\n groupedListSystem,\n sizeRangeSystem,\n initialTopMostItemIndexSystem,\n scrollToIndexSystem,\n stateFlagsSystem,\n propsReadySystem,\n recalcSystem\n ),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem, buildListState } from './listStateSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { propsReadySystem } from './propsReadySystem'\n\nexport const initialItemCountSystem = u.system(\n ([{ sizes, firstItemIndex, data, gap }, { listState }, { didMount }]) => {\n const initialItemCount = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialItemCount),\n u.filter(([, count]) => count !== 0),\n u.withLatestFrom(sizes, firstItemIndex, gap, data),\n u.map(([[, count], sizes, firstItemIndex, gap, data = []]) => {\n let includedGroupsCount = 0\n if (sizes.groupIndices.length > 0) {\n for (const index of sizes.groupIndices) {\n if (index - includedGroupsCount >= count) {\n break\n }\n includedGroupsCount++\n }\n }\n const adjustedCount = count + includedGroupsCount\n const items = Array.from({ length: adjustedCount }).map((_, index) => ({ index, size: 0, offset: 0, data: data[index] }))\n return buildListState(items, [], adjustedCount, gap, sizes, firstItemIndex)\n })\n ),\n listState\n )\n\n return { initialItemCount }\n },\n u.tup(sizeSystem, listStateSystem, propsReadySystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { ListRange } from './interfaces'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { ScrollSeekConfiguration } from './interfaces'\n\nexport const scrollSeekSystem = u.system(\n ([{ scrollVelocity }]) => {\n const isSeeking = u.statefulStream(false)\n const rangeChanged = u.stream<ListRange>()\n const scrollSeekConfiguration = u.statefulStream<ScrollSeekConfiguration | undefined | false>(false)\n\n u.connect(\n u.pipe(\n scrollVelocity,\n u.withLatestFrom(scrollSeekConfiguration, isSeeking, rangeChanged),\n u.filter(([_, config]) => !!config),\n u.map(([speed, config, isSeeking, range]) => {\n const { exit, enter } = config as ScrollSeekConfiguration\n if (isSeeking) {\n if (exit(speed, range)) {\n return false\n }\n } else {\n if (enter(speed, range)) {\n return true\n }\n }\n return isSeeking\n }),\n u.distinctUntilChanged()\n ),\n isSeeking\n )\n\n u.subscribe(\n u.pipe(u.combineLatest(isSeeking, scrollVelocity, rangeChanged), u.withLatestFrom(scrollSeekConfiguration)),\n ([[isSeeking, velocity, range], config]) => isSeeking && config && config.change && config.change(velocity, range)\n )\n\n return { isSeeking, scrollSeekConfiguration, scrollVelocity, scrollSeekRangeChanged: rangeChanged }\n },\n u.tup(stateFlagsSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem } from './listStateSystem'\n\nexport const topItemCountSystem = u.system(([{ topItemsIndexes }]) => {\n const topItemCount = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n topItemCount,\n u.filter((length) => length > 0),\n u.map((length) => Array.from({ length }).map((_, index) => index))\n ),\n topItemsIndexes\n )\n return { topItemCount }\n}, u.tup(listStateSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem } from './listStateSystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const totalListHeightSystem = u.system(\n ([{ footerHeight, headerHeight, fixedHeaderHeight }, { listState }]) => {\n const totalListHeightChanged = u.stream<number>()\n const totalListHeight = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(footerHeight, headerHeight, fixedHeaderHeight, listState),\n u.map(([footerHeight, headerHeight, fixedHeaderHeight, listState]) => {\n return footerHeight + headerHeight + fixedHeaderHeight + listState.offsetBottom + listState.bottom\n })\n ),\n 0\n )\n\n u.connect(u.duc(totalListHeight), totalListHeightChanged)\n\n return { totalListHeight, totalListHeightChanged }\n },\n u.tup(domIOSystem, listStateSystem),\n { singleton: true }\n)\n","export function simpleMemoize<T extends () => any>(func: T): T {\n let called = false\n let result: unknown\n\n return (() => {\n if (!called) {\n called = true\n result = func()\n }\n return result\n }) as T\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { UP, stateFlagsSystem } from './stateFlagsSystem'\nimport { ListItem } from './interfaces'\nimport { loggerSystem, LogLevel } from './loggerSystem'\nimport { simpleMemoize } from './utils/simpleMemoize'\nimport { recalcSystem } from './recalcSystem'\n\nconst isMobileSafari = simpleMemoize(() => {\n return /iP(ad|hone|od).+Version\\/[\\d.]+.*Safari/i.test(navigator.userAgent)\n})\n\ntype UpwardFixState = [number, ListItem<any>[], number, number]\n/**\n * Fixes upward scrolling by calculating and compensation from changed item heights, using scrollBy.\n */\nexport const upwardScrollFixSystem = u.system(\n ([\n { scrollBy, scrollTop, deviation, scrollingInProgress },\n { isScrolling, isAtBottom, scrollDirection, lastJumpDueToItemResize },\n { listState },\n { beforeUnshiftWith, shiftWithOffset, sizes, gap },\n { log },\n { recalcInProgress },\n ]) => {\n const deviationOffset = u.streamFromEmitter(\n u.pipe(\n listState,\n u.withLatestFrom(lastJumpDueToItemResize),\n u.scan(\n ([, prevItems, prevTotalCount, prevTotalHeight], [{ items, totalCount, bottom, offsetBottom }, lastJumpDueToItemResize]) => {\n const totalHeight = bottom + offsetBottom\n\n let newDev = 0\n if (prevTotalCount === totalCount) {\n if (prevItems.length > 0 && items.length > 0) {\n const atStart = items[0].originalIndex === 0 && prevItems[0].originalIndex === 0\n if (!atStart) {\n newDev = totalHeight - prevTotalHeight\n if (newDev !== 0) {\n newDev += lastJumpDueToItemResize\n }\n }\n }\n }\n\n return [newDev, items, totalCount, totalHeight] as UpwardFixState\n },\n [0, [], 0, 0] as UpwardFixState\n ),\n u.filter(([amount]) => amount !== 0),\n u.withLatestFrom(scrollTop, scrollDirection, scrollingInProgress, isAtBottom, log),\n u.filter(([, scrollTop, scrollDirection, scrollingInProgress]) => {\n return !scrollingInProgress && scrollTop !== 0 && scrollDirection === UP\n }),\n u.map(([[amount], , , , , log]) => {\n log('Upward scrolling compensation', { amount }, LogLevel.DEBUG)\n return amount\n })\n )\n )\n\n function scrollByWith(offset: number) {\n if (offset > 0) {\n u.publish(scrollBy, { top: -offset, behavior: 'auto' })\n u.publish(deviation, 0)\n } else {\n u.publish(deviation, 0)\n u.publish(scrollBy, { top: -offset, behavior: 'auto' })\n }\n }\n\n u.subscribe(u.pipe(deviationOffset, u.withLatestFrom(deviation, isScrolling)), ([offset, deviationAmount, isScrolling]) => {\n if (isScrolling && isMobileSafari()) {\n u.publish(deviation, deviationAmount - offset)\n } else {\n scrollByWith(-offset)\n }\n })\n\n // this hack is only necessary for mobile safari which does not support scrollBy while scrolling is in progress.\n // when the browser stops scrolling, restore the position and reset the glitching\n u.subscribe(\n u.pipe(\n u.combineLatest(u.statefulStreamFromEmitter(isScrolling, false), deviation, recalcInProgress),\n u.filter(([is, deviation, recalc]) => !is && !recalc && deviation !== 0),\n u.map(([_, deviation]) => deviation),\n u.throttleTime(1)\n ),\n scrollByWith\n )\n\n u.connect(\n u.pipe(\n shiftWithOffset,\n u.map((offset) => {\n return { top: -offset }\n })\n ),\n scrollBy\n )\n\n u.subscribe(\n u.pipe(\n beforeUnshiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([offset, { lastSize }, gap]) => offset * lastSize + offset * gap)\n ),\n (offset) => {\n u.publish(deviation, offset)\n requestAnimationFrame(() => {\n u.publish(scrollBy, { top: offset })\n requestAnimationFrame(() => {\n u.publish(deviation, 0)\n u.publish(recalcInProgress, false)\n })\n })\n }\n )\n\n return { deviation }\n },\n u.tup(domIOSystem, stateFlagsSystem, listStateSystem, sizeSystem, loggerSystem, recalcSystem)\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const initialScrollTopSystem = u.system(\n ([{ totalListHeight }, { didMount }, { scrollTo }]) => {\n const initialScrollTop = u.statefulStream(0)\n\n u.subscribe(\n u.pipe(\n didMount,\n u.withLatestFrom(initialScrollTop),\n u.filter(([, offset]) => offset !== 0),\n u.map(([, offset]) => ({ top: offset }))\n ),\n (location) => {\n u.handleNext(\n u.pipe(\n totalListHeight,\n u.filter((val) => val !== 0)\n ),\n () => {\n setTimeout(() => {\n u.publish(scrollTo, location)\n })\n }\n )\n }\n )\n\n return {\n initialScrollTop,\n }\n },\n u.tup(totalListHeightSystem, propsReadySystem, domIOSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const alignToBottomSystem = u.system(\n ([{ viewportHeight }, { totalListHeight }]) => {\n const alignToBottom = u.statefulStream(false)\n\n const paddingTopAddition = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(alignToBottom, viewportHeight, totalListHeight),\n u.filter(([enabled]) => enabled),\n u.map(([, viewportHeight, totalListHeight]) => {\n return Math.max(0, viewportHeight - totalListHeight)\n }),\n u.distinctUntilChanged()\n ),\n 0\n )\n\n return { alignToBottom, paddingTopAddition }\n },\n u.tup(domIOSystem, totalListHeightSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { WindowViewportInfo, ScrollContainerState } from './interfaces'\n\nexport const windowScrollerSystem = u.system(([{ scrollTo, scrollContainerState }]) => {\n const windowScrollContainerState = u.stream<ScrollContainerState>()\n const windowViewportRect = u.stream<WindowViewportInfo>()\n const windowScrollTo = u.stream<ScrollToOptions>()\n const useWindowScroll = u.statefulStream(false)\n const customScrollParent = u.statefulStream<HTMLElement | undefined>(undefined)\n\n u.connect(\n u.pipe(\n u.combineLatest(windowScrollContainerState, windowViewportRect),\n u.map(([{ viewportHeight, scrollTop: windowScrollTop, scrollHeight }, { offsetTop }]) => {\n return {\n scrollTop: Math.max(0, windowScrollTop - offsetTop),\n scrollHeight,\n viewportHeight,\n }\n })\n ),\n scrollContainerState\n )\n\n u.connect(\n u.pipe(\n scrollTo,\n u.withLatestFrom(windowViewportRect),\n u.map(([scrollTo, { offsetTop }]) => {\n return {\n ...scrollTo,\n top: scrollTo.top! + offsetTop,\n }\n })\n ),\n windowScrollTo\n )\n\n return {\n // config\n useWindowScroll,\n customScrollParent,\n\n // input\n windowScrollContainerState,\n windowViewportRect,\n\n // signals\n windowScrollTo,\n }\n}, u.tup(domIOSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { offsetOf, originalIndexFromLocation, sizeSystem } from './sizeSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { ScrollIntoViewLocation } from './interfaces'\n\nexport const scrollIntoViewSystem = u.system(\n ([{ sizes, totalCount, gap }, { scrollTop, viewportHeight, headerHeight, scrollingInProgress }, { scrollToIndex }]) => {\n const scrollIntoView = u.stream<ScrollIntoViewLocation>()\n\n u.connect(\n u.pipe(\n scrollIntoView,\n u.withLatestFrom(sizes, viewportHeight, totalCount, headerHeight, scrollTop, gap),\n u.map(([viewLocation, sizes, viewportHeight, totalCount, headerHeight, scrollTop, gap]) => {\n const { done, behavior, ...rest } = viewLocation\n let location = null\n const actualIndex = originalIndexFromLocation(viewLocation, sizes, totalCount - 1)\n\n const itemTop = offsetOf(actualIndex, sizes.offsetTree, gap) + headerHeight\n if (itemTop < scrollTop) {\n location = { ...rest, behavior, align: 'start' }\n } else {\n const itemBottom = itemTop + findMaxKeyValue(sizes.sizeTree, actualIndex)[1]!\n\n if (itemBottom > scrollTop + viewportHeight) {\n location = { ...rest, behavior, align: 'end' }\n }\n }\n\n if (location) {\n done &&\n u.handleNext(\n u.pipe(\n scrollingInProgress,\n u.skip(1),\n u.filter((value) => value === false)\n ),\n done\n )\n } else {\n done && done()\n }\n\n return location\n }),\n u.filter((value) => value !== null)\n ),\n scrollToIndex\n )\n\n return {\n scrollIntoView,\n }\n },\n u.tup(sizeSystem, domIOSystem, scrollToIndexSystem, listStateSystem, loggerSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { followOutputSystem } from './followOutputSystem'\nimport { groupedListSystem } from './groupedListSystem'\nimport { initialItemCountSystem } from './initialItemCountSystem'\nimport { initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollSeekSystem } from './scrollSeekSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { topItemCountSystem } from './topItemCountSystem'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { upwardScrollFixSystem } from './upwardScrollFixSystem'\nimport { initialScrollTopSystem } from './initialScrollTopSystem'\nimport { alignToBottomSystem } from './alignToBottomSystem'\nimport { windowScrollerSystem } from './windowScrollerSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { scrollIntoViewSystem } from './scrollIntoViewSystem'\n\n// workaround the growing list of systems below\n// fix this with 4.1 recursive conditional types\nconst featureGroup1System = u.system(\n ([\n sizeRange,\n initialItemCount,\n propsReady,\n scrollSeek,\n totalListHeight,\n initialScrollTopSystem,\n alignToBottom,\n windowScroller,\n scrollIntoView,\n ]) => {\n return {\n ...sizeRange,\n ...initialItemCount,\n ...propsReady,\n ...scrollSeek,\n ...totalListHeight,\n ...initialScrollTopSystem,\n ...alignToBottom,\n ...windowScroller,\n ...scrollIntoView,\n }\n },\n u.tup(\n sizeRangeSystem,\n initialItemCountSystem,\n propsReadySystem,\n scrollSeekSystem,\n totalListHeightSystem,\n initialScrollTopSystem,\n alignToBottomSystem,\n windowScrollerSystem,\n scrollIntoViewSystem\n )\n)\n\nexport const listSystem = u.system(\n ([\n {\n totalCount,\n sizeRanges,\n fixedItemSize,\n defaultItemSize,\n trackItemSizes,\n itemSize,\n data,\n firstItemIndex,\n groupIndices,\n statefulTotalCount,\n gap,\n },\n { initialTopMostItemIndex, scrolledToInitialItem },\n domIO,\n followOutput,\n { listState, topItemsIndexes, ...flags },\n { scrollToIndex },\n _,\n { topItemCount },\n { groupCounts },\n featureGroup1,\n log,\n ]) => {\n u.connect(flags.rangeChanged, featureGroup1.scrollSeekRangeChanged)\n u.connect(\n u.pipe(\n featureGroup1.windowViewportRect,\n u.map((value) => value.visibleHeight)\n ),\n domIO.viewportHeight\n )\n\n return {\n // input\n totalCount,\n data,\n firstItemIndex,\n sizeRanges,\n initialTopMostItemIndex,\n scrolledToInitialItem,\n topItemsIndexes,\n topItemCount,\n groupCounts,\n fixedItemHeight: fixedItemSize,\n defaultItemHeight: defaultItemSize,\n gap,\n ...followOutput,\n\n // output\n statefulTotalCount,\n listState,\n scrollToIndex,\n trackItemSizes,\n itemSize,\n groupIndices,\n\n // exported from stateFlagsSystem\n ...flags,\n // the bag of IO from featureGroup1System\n ...featureGroup1,\n ...domIO,\n ...log,\n }\n },\n u.tup(\n sizeSystem,\n initialTopMostItemIndexSystem,\n domIOSystem,\n followOutputSystem,\n listStateSystem,\n scrollToIndexSystem,\n upwardScrollFixSystem,\n topItemCountSystem,\n groupedListSystem,\n featureGroup1System,\n loggerSystem\n )\n)\n","import { simpleMemoize } from './simpleMemoize'\n\nconst WEBKIT_STICKY = '-webkit-sticky'\nconst STICKY = 'sticky'\n\nexport const positionStickyCssValue = simpleMemoize(() => {\n if (typeof document === 'undefined') {\n return STICKY\n }\n const node = document.createElement('div')\n node.style.position = WEBKIT_STICKY\n return node.style.position === WEBKIT_STICKY ? WEBKIT_STICKY : STICKY\n})\n","import { useEffect, useRef, useCallback } from 'react'\nimport { useSizeWithElRef } from './useSize'\nimport { WindowViewportInfo } from '../interfaces'\n\nexport default function useWindowViewportRectRef(callback: (info: WindowViewportInfo) => void, customScrollParent?: HTMLElement) {\n const viewportInfo = useRef<WindowViewportInfo | null>(null)\n\n const calculateInfo = useCallback(\n (element: HTMLElement | null) => {\n if (element === null || !element.offsetParent) {\n return\n }\n const rect = element.getBoundingClientRect()\n const visibleWidth = rect.width\n let visibleHeight: number, offsetTop: number\n\n if (customScrollParent) {\n const customScrollParentRect = customScrollParent.getBoundingClientRect()\n const deltaTop = rect.top - customScrollParentRect.top\n\n visibleHeight = customScrollParentRect.height - Math.max(0, deltaTop)\n offsetTop = deltaTop + customScrollParent.scrollTop\n } else {\n visibleHeight = window.innerHeight - Math.max(0, rect.top)\n offsetTop = rect.top + window.pageYOffset\n }\n\n viewportInfo.current = {\n offsetTop,\n visibleHeight,\n visibleWidth,\n }\n\n callback(viewportInfo.current)\n },\n [callback, customScrollParent]\n )\n\n const { callbackRef, ref } = useSizeWithElRef(calculateInfo)\n\n const scrollAndResizeEventHandler = useCallback(() => {\n calculateInfo(ref.current)\n }, [calculateInfo, ref])\n\n useEffect(() => {\n if (customScrollParent) {\n customScrollParent.addEventListener('scroll', scrollAndResizeEventHandler)\n const observer = new ResizeObserver(scrollAndResizeEventHandler)\n observer.observe(customScrollParent)\n return () => {\n customScrollParent.removeEventListener('scroll', scrollAndResizeEventHandler)\n observer.unobserve(customScrollParent)\n }\n } else {\n window.addEventListener('scroll', scrollAndResizeEventHandler)\n window.addEventListener('resize', scrollAndResizeEventHandler)\n return () => {\n window.removeEventListener('scroll', scrollAndResizeEventHandler)\n window.removeEventListener('resize', scrollAndResizeEventHandler)\n }\n }\n }, [scrollAndResizeEventHandler, customScrollParent])\n\n return callbackRef\n}\n","import { RefHandle, systemToComponent } from '@virtuoso.dev/react-urx'\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { ComponentType, createElement, CSSProperties, FC, PropsWithChildren } from 'react'\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect'\nimport useChangedListContentsSizes from './hooks/useChangedChildSizes'\nimport useScrollTop from './hooks/useScrollTop'\nimport useSize from './hooks/useSize'\nimport { Components, ComputeItemKey, GroupContent, GroupItemContent, ItemContent, ListRootProps } from './interfaces'\nimport { listSystem } from './listSystem'\nimport { positionStickyCssValue } from './utils/positionStickyCssValue'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\nimport { correctItemSize } from './utils/correctItemSize'\nimport { ScrollerProps } from '.'\n\nexport function identity<T>(value: T) {\n return value\n}\n\nconst listComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<ItemContent<any, any> | GroupItemContent<any, any>>((index: number) => `Item ${index}`)\n const context = u.statefulStream<unknown>(null)\n const groupContent = u.statefulStream<GroupContent>((index: number) => `Group ${index}`)\n const components = u.statefulStream<Components<any>>({})\n const computeItemKey = u.statefulStream<ComputeItemKey<any, any>>(identity)\n const headerFooterTag = u.statefulStream('div')\n const scrollerRef = u.statefulStream<(ref: HTMLElement | Window | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof Components<any>>(propName: K, defaultValue: Components<any>[K] | null | 'div' = null) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n groupContent,\n components,\n computeItemKey,\n headerFooterTag,\n scrollerRef,\n FooterComponent: distinctProp('Footer'),\n HeaderComponent: distinctProp('Header'),\n TopItemListComponent: distinctProp('TopItemList'),\n ListComponent: distinctProp('List', 'div'),\n ItemComponent: distinctProp('Item', 'div'),\n GroupComponent: distinctProp('Group', 'div'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n EmptyPlaceholder: distinctProp('EmptyPlaceholder'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder'),\n }\n})\n\nexport function addDeprecatedAlias<T>(prop: u.Stream<T>, message: string) {\n const alias = u.stream<T>()\n u.subscribe(alias, () =>\n console.warn(`react-virtuoso: You are using a deprecated property. ${message}`, 'color: red;', 'color: inherit;', 'color: blue;')\n )\n u.connect(alias, prop)\n return alias\n}\n\nconst combinedSystem = u.system(([listSystem, propsSystem]) => {\n const deprecatedProps = {\n item: addDeprecatedAlias(propsSystem.itemContent, 'Rename the %citem%c prop to %citemContent.'),\n group: addDeprecatedAlias(propsSystem.groupContent, 'Rename the %cgroup%c prop to %cgroupContent.'),\n topItems: addDeprecatedAlias(listSystem.topItemCount, 'Rename the %ctopItems%c prop to %ctopItemCount.'),\n itemHeight: addDeprecatedAlias(listSystem.fixedItemHeight, 'Rename the %citemHeight%c prop to %cfixedItemHeight.'),\n scrollingStateChange: addDeprecatedAlias(listSystem.isScrolling, 'Rename the %cscrollingStateChange%c prop to %cisScrolling.'),\n adjustForPrependedItems: u.stream<any>(),\n maxHeightCacheSize: u.stream<any>(),\n footer: u.stream<any>(),\n header: u.stream<any>(),\n HeaderContainer: u.stream<any>(),\n FooterContainer: u.stream<any>(),\n ItemContainer: u.stream<any>(),\n ScrollContainer: u.stream<any>(),\n GroupContainer: u.stream<any>(),\n ListContainer: u.stream<any>(),\n emptyComponent: u.stream<any>(),\n scrollSeek: u.stream<any>(),\n }\n\n u.subscribe(deprecatedProps.adjustForPrependedItems, () => {\n console.warn(\n `react-virtuoso: adjustForPrependedItems is no longer supported. Use the firstItemIndex property instead - https://virtuoso.dev/prepend-items.`,\n 'color: red;',\n 'color: inherit;',\n 'color: blue;'\n )\n })\n\n u.subscribe(deprecatedProps.maxHeightCacheSize, () => {\n console.warn(`react-virtuoso: maxHeightCacheSize is no longer necessary. Setting it has no effect - remove it from your code.`)\n })\n\n u.subscribe(deprecatedProps.HeaderContainer, () => {\n console.warn(\n `react-virtuoso: HeaderContainer is deprecated. Use headerFooterTag if you want to change the wrapper of the header component and pass components.Header to change its contents.`\n )\n })\n\n u.subscribe(deprecatedProps.FooterContainer, () => {\n console.warn(\n `react-virtuoso: FooterContainer is deprecated. Use headerFooterTag if you want to change the wrapper of the footer component and pass components.Footer to change its contents.`\n )\n })\n\n function deprecateComponentProp(stream: u.Stream<any>, componentName: string, propName: string) {\n u.connect(\n u.pipe(\n stream,\n u.withLatestFrom(propsSystem.components),\n u.map(([comp, components]) => {\n console.warn(`react-virtuoso: ${propName} property is deprecated. Pass components.${componentName} instead.`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n return { ...components, [componentName]: comp }\n })\n ),\n propsSystem.components\n )\n }\n\n u.subscribe(deprecatedProps.scrollSeek, ({ placeholder, ...config }) => {\n console.warn(\n `react-virtuoso: scrollSeek property is deprecated. Pass scrollSeekConfiguration and specify the placeholder in components.ScrollSeekPlaceholder instead.`\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n u.publish(propsSystem.components, { ...u.getValue(propsSystem.components), ScrollSeekPlaceholder: placeholder })\n u.publish(listSystem.scrollSeekConfiguration, config)\n })\n\n deprecateComponentProp(deprecatedProps.footer, 'Footer', 'footer')\n deprecateComponentProp(deprecatedProps.header, 'Header', 'header')\n deprecateComponentProp(deprecatedProps.ItemContainer, 'Item', 'ItemContainer')\n deprecateComponentProp(deprecatedProps.ListContainer, 'List', 'ListContainer')\n deprecateComponentProp(deprecatedProps.ScrollContainer, 'Scroller', 'ScrollContainer')\n deprecateComponentProp(deprecatedProps.emptyComponent, 'EmptyPlaceholder', 'emptyComponent')\n deprecateComponentProp(deprecatedProps.GroupContainer, 'Group', 'GroupContainer')\n\n return { ...listSystem, ...propsSystem, ...deprecatedProps }\n}, u.tup(listSystem, listComponentPropsSystem))\n\nconst DefaultScrollSeekPlaceholder = ({ height }: { height: number }) => <div style={{ height }}></div>\n\nconst GROUP_STYLE = { position: positionStickyCssValue(), zIndex: 1, overflowAnchor: 'none' } as const\nconst ITEM_STYLE = { overflowAnchor: 'none' } as const\n\nexport const Items = React.memo(function VirtuosoItems({ showTopList = false }: { showTopList?: boolean }) {\n const listState = useEmitterValue('listState')\n\n const sizeRanges = usePublisher('sizeRanges')\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const windowScrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const _scrollContainerStateCallback = usePublisher('scrollContainerState')\n const scrollContainerStateCallback =\n customScrollParent || useWindowScroll ? windowScrollContainerStateCallback : _scrollContainerStateCallback\n const itemContent = useEmitterValue('itemContent')\n const context = useEmitterValue('context')\n const groupContent = useEmitterValue('groupContent')\n const trackItemSizes = useEmitterValue('trackItemSizes')\n const itemSize = useEmitterValue('itemSize')\n const log = useEmitterValue('log')\n const listGap = usePublisher('gap')\n\n const { callbackRef } = useChangedListContentsSizes(\n sizeRanges,\n itemSize,\n trackItemSizes,\n showTopList ? u.noop : scrollContainerStateCallback,\n log,\n listGap,\n customScrollParent\n )\n\n const [deviation, setDeviation] = React.useState(0)\n useEmitter('deviation', (value) => {\n if (deviation !== value) {\n // ref.current!.style.marginTop = `${value}px`\n setDeviation(value)\n }\n })\n\n const EmptyPlaceholder = useEmitterValue('EmptyPlaceholder')\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder') || DefaultScrollSeekPlaceholder\n const ListComponent = useEmitterValue('ListComponent')!\n const ItemComponent = useEmitterValue('ItemComponent')!\n const GroupComponent = useEmitterValue('GroupComponent')!\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const hasGroups = useEmitterValue('groupIndices').length > 0\n const paddingTopAddition = useEmitterValue('paddingTopAddition')\n\n const containerStyle: CSSProperties = showTopList\n ? {}\n : {\n boxSizing: 'border-box',\n paddingTop: listState.offsetTop + paddingTopAddition,\n paddingBottom: listState.offsetBottom,\n marginTop: deviation,\n }\n\n if (!showTopList && listState.totalCount === 0 && EmptyPlaceholder) {\n return createElement(EmptyPlaceholder, contextPropIfNotDomElement(EmptyPlaceholder, context))\n }\n\n return createElement(\n ListComponent,\n {\n ...contextPropIfNotDomElement(ListComponent, context),\n ref: callbackRef,\n style: containerStyle,\n 'data-test-id': showTopList ? 'virtuoso-top-item-list' : 'virtuoso-item-list',\n },\n (showTopList ? listState.topItems : listState.items).map((item) => {\n const index = item.originalIndex!\n const key = computeItemKey(index + listState.firstItemIndex, item.data, context)\n\n if (isSeeking) {\n return createElement(ScrollSeekPlaceholder, {\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n key,\n index: item.index,\n height: item.size,\n type: item.type || 'item',\n ...(item.type === 'group' ? {} : { groupIndex: item.groupIndex }),\n })\n }\n\n if (item.type === 'group') {\n return createElement(\n GroupComponent,\n {\n ...contextPropIfNotDomElement(GroupComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n style: GROUP_STYLE,\n },\n groupContent(item.index)\n )\n } else {\n return createElement(\n ItemComponent,\n {\n ...contextPropIfNotDomElement(ItemComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n 'data-item-group-index': item.groupIndex,\n style: ITEM_STYLE,\n },\n hasGroups\n ? (itemContent as GroupItemContent<any, any>)(item.index, item.groupIndex!, item.data, context)\n : (itemContent as ItemContent<any, any>)(item.index, item.data, context)\n )\n }\n })\n )\n})\n\nexport const scrollerStyle: CSSProperties = {\n height: '100%',\n outline: 'none',\n overflowY: 'auto',\n position: 'relative',\n WebkitOverflowScrolling: 'touch',\n}\n\nexport const viewportStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n}\n\nconst topItemListStyle: CSSProperties = {\n width: '100%',\n position: positionStickyCssValue(),\n top: 0,\n}\n\nexport function contextPropIfNotDomElement(element: unknown, context: unknown) {\n if (typeof element === 'string') {\n return undefined\n }\n return { context }\n}\n\nconst Header: FC = React.memo(function VirtuosoHeader() {\n const Header = useEmitterValue('HeaderComponent')\n const headerHeight = usePublisher('headerHeight')\n const headerFooterTag = useEmitterValue('headerFooterTag')\n const ref = useSize((el) => headerHeight(correctItemSize(el, 'height')))\n const context = useEmitterValue('context')\n return Header ? createElement(headerFooterTag, { ref }, createElement(Header, contextPropIfNotDomElement(Header, context))) : null\n})\n\nconst Footer: FC = React.memo(function VirtuosoFooter() {\n const Footer = useEmitterValue('FooterComponent')\n const footerHeight = usePublisher('footerHeight')\n const headerFooterTag = useEmitterValue('headerFooterTag')\n const ref = useSize((el) => footerHeight(correctItemSize(el, 'height')))\n const context = useEmitterValue('context')\n return Footer ? createElement(headerFooterTag, { ref }, createElement(Footer, contextPropIfNotDomElement(Footer, context))) : null\n})\n\nexport interface Hooks {\n usePublisher: typeof usePublisher\n useEmitterValue: typeof useEmitterValue\n useEmitter: typeof useEmitter\n}\n\nexport function buildScroller({ usePublisher, useEmitter, useEmitterValue }: Hooks) {\n const Scroller: ComponentType<ScrollerProps> = React.memo(function VirtuosoScroller({ style, children, ...props }) {\n const scrollContainerStateCallback = usePublisher('scrollContainerState')\n const ScrollerComponent = useEmitterValue('ScrollerComponent')!\n const smoothScrollTargetReached = usePublisher('smoothScrollTargetReached')\n const scrollerRefCallback = useEmitterValue('scrollerRef')\n const context = useEmitterValue('context')\n\n const { scrollerRef, scrollByCallback, scrollToCallback } = useScrollTop(\n scrollContainerStateCallback,\n smoothScrollTargetReached,\n ScrollerComponent,\n scrollerRefCallback\n )\n\n useEmitter('scrollTo', scrollToCallback)\n useEmitter('scrollBy', scrollByCallback)\n return createElement(\n ScrollerComponent,\n {\n ref: scrollerRef as React.MutableRefObject<HTMLDivElement | null>,\n style: { ...scrollerStyle, ...style },\n 'data-test-id': 'virtuoso-scroller',\n 'data-virtuoso-scroller': true,\n tabIndex: 0,\n ...props,\n ...contextPropIfNotDomElement(ScrollerComponent, context),\n },\n children\n )\n })\n return Scroller\n}\n\nexport function buildWindowScroller({ usePublisher, useEmitter, useEmitterValue }: Hooks) {\n const Scroller: Components['Scroller'] = React.memo(function VirtuosoWindowScroller({ style, children, ...props }) {\n const scrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const ScrollerComponent = useEmitterValue('ScrollerComponent')!\n const smoothScrollTargetReached = usePublisher('smoothScrollTargetReached')\n const totalListHeight = useEmitterValue('totalListHeight')\n const deviation = useEmitterValue('deviation')\n const customScrollParent = useEmitterValue('customScrollParent')\n const context = useEmitterValue('context')\n const { scrollerRef, scrollByCallback, scrollToCallback } = useScrollTop(\n scrollContainerStateCallback,\n smoothScrollTargetReached,\n ScrollerComponent,\n u.noop,\n customScrollParent\n )\n\n useIsomorphicLayoutEffect(() => {\n scrollerRef.current = customScrollParent ? customScrollParent : window\n return () => {\n scrollerRef.current = null\n }\n }, [scrollerRef, customScrollParent])\n\n useEmitter('windowScrollTo', scrollToCallback)\n useEmitter('scrollBy', scrollByCallback)\n return createElement(\n ScrollerComponent,\n {\n style: { position: 'relative', ...style, ...(totalListHeight !== 0 ? { height: totalListHeight + deviation } : {}) },\n 'data-virtuoso-scroller': true,\n ...props,\n ...contextPropIfNotDomElement(ScrollerComponent, context),\n },\n children\n )\n })\n return Scroller\n}\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportHeight = usePublisher('viewportHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n return (\n <div style={viewportStyle} ref={viewportRef} data-viewport-type=\"element\">\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle} data-viewport-type=\"window\">\n {children}\n </div>\n )\n}\n\nconst TopItemListContainer: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const TopItemList = useEmitterValue('TopItemListComponent')\n const headerHeight = useEmitterValue('headerHeight')\n const style = { ...topItemListStyle, marginTop: `${headerHeight}px` }\n const context = useEmitterValue('context')\n return createElement(TopItemList || 'div', { style, context }, children)\n}\n\nconst ListRoot: FC<ListRootProps> = React.memo(function VirtuosoRoot(props) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const showTopList = useEmitterValue('topItemsIndexes').length > 0\n const customScrollParent = useEmitterValue('customScrollParent')\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n return (\n <TheScroller {...props}>\n <TheViewport>\n <Header />\n <Items />\n <Footer />\n </TheViewport>\n {showTopList && (\n <TopItemListContainer>\n <Items showTopList={true} />\n </TopItemListContainer>\n )}\n </TheScroller>\n )\n})\n\nexport type ListHandle = RefHandle<typeof List>\n\nexport const {\n Component: List,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n required: {},\n optional: {\n context: 'context',\n followOutput: 'followOutput',\n firstItemIndex: 'firstItemIndex',\n itemContent: 'itemContent',\n groupContent: 'groupContent',\n overscan: 'overscan',\n increaseViewportBy: 'increaseViewportBy',\n totalCount: 'totalCount',\n topItemCount: 'topItemCount',\n initialTopMostItemIndex: 'initialTopMostItemIndex',\n components: 'components',\n groupCounts: 'groupCounts',\n atBottomThreshold: 'atBottomThreshold',\n atTopThreshold: 'atTopThreshold',\n computeItemKey: 'computeItemKey',\n defaultItemHeight: 'defaultItemHeight',\n fixedItemHeight: 'fixedItemHeight',\n itemSize: 'itemSize',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n headerFooterTag: 'headerFooterTag',\n data: 'data',\n initialItemCount: 'initialItemCount',\n initialScrollTop: 'initialScrollTop',\n alignToBottom: 'alignToBottom',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n logLevel: 'logLevel',\n react18ConcurrentRendering: 'react18ConcurrentRendering',\n\n // deprecated\n item: 'item',\n group: 'group',\n topItems: 'topItems',\n itemHeight: 'itemHeight',\n scrollingStateChange: 'scrollingStateChange',\n maxHeightCacheSize: 'maxHeightCacheSize',\n footer: 'footer',\n header: 'header',\n ItemContainer: 'ItemContainer',\n ScrollContainer: 'ScrollContainer',\n ListContainer: 'ListContainer',\n GroupContainer: 'GroupContainer',\n emptyComponent: 'emptyComponent',\n HeaderContainer: 'HeaderContainer',\n FooterContainer: 'FooterContainer',\n scrollSeek: 'scrollSeek',\n },\n methods: {\n scrollToIndex: 'scrollToIndex',\n scrollIntoView: 'scrollIntoView',\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n adjustForPrependedItems: 'adjustForPrependedItems',\n autoscrollToBottom: 'autoscrollToBottom',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n totalListHeightChanged: 'totalListHeightChanged',\n itemsRendered: 'itemsRendered',\n groupIndices: 'groupIndices',\n },\n },\n ListRoot\n)\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n","import * as u from '@virtuoso.dev/urx'\nimport { rangeComparator, tupleComparator } from './comparators'\nimport { domIOSystem } from './domIOSystem'\nimport { FlatIndexLocationWithAlign } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollSeekSystem } from './scrollSeekSystem'\nimport { IndexLocation, normalizeIndexLocation } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { windowScrollerSystem } from './windowScrollerSystem'\n\nexport interface Gap {\n row: number\n column: number\n}\n\nexport interface ElementDimensions {\n width: number\n height: number\n}\n\nexport interface GridItem {\n index: number\n}\n\nexport interface GridLayout {\n top: number\n bottom: number\n}\n\nexport interface GridState extends GridLayout {\n items: GridItem[]\n offsetTop: number\n offsetBottom: number\n itemHeight: number\n itemWidth: number\n}\n\nconst INITIAL_GRID_STATE: GridState = {\n items: [],\n offsetBottom: 0,\n offsetTop: 0,\n top: 0,\n bottom: 0,\n itemHeight: 0,\n itemWidth: 0,\n}\n\nconst PROBE_GRID_STATE: GridState = {\n items: [{ index: 0 }],\n offsetBottom: 0,\n offsetTop: 0,\n top: 0,\n bottom: 0,\n itemHeight: 0,\n itemWidth: 0,\n}\n\nconst { round, ceil, floor, min, max } = Math\n\nfunction buildItems(startIndex: number, endIndex: number) {\n return Array.from({ length: endIndex - startIndex + 1 }).map((_, i) => ({ index: i + startIndex } as GridItem))\n}\n\nfunction gapComparator(prev: Gap, next: Gap) {\n return prev && prev.column === next.column && prev.row === next.row\n}\nexport const gridSystem = u.system(\n ([\n { overscan, visibleRange, listBoundary },\n { scrollTop, viewportHeight, scrollBy, scrollTo, smoothScrollTargetReached, scrollContainerState },\n stateFlags,\n scrollSeek,\n { propsReady, didMount },\n { windowViewportRect, windowScrollTo, useWindowScroll, customScrollParent, windowScrollContainerState },\n log,\n ]) => {\n const totalCount = u.statefulStream(0)\n const initialItemCount = u.statefulStream(0)\n const gridState = u.statefulStream(INITIAL_GRID_STATE)\n const viewportDimensions = u.statefulStream<ElementDimensions>({ height: 0, width: 0 })\n const itemDimensions = u.statefulStream<ElementDimensions>({ height: 0, width: 0 })\n const scrollToIndex = u.stream<IndexLocation>()\n const scrollHeight = u.stream<number>()\n const deviation = u.statefulStream(0)\n const gap = u.statefulStream<Gap>({ row: 0, column: 0 })\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialItemCount),\n u.filter(([, count]) => count !== 0),\n u.map(([, count]) => {\n return {\n items: buildItems(0, count - 1),\n top: 0,\n bottom: 0,\n offsetBottom: 0,\n offsetTop: 0,\n itemHeight: 0,\n itemWidth: 0,\n }\n })\n ),\n gridState\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(\n u.duc(totalCount),\n visibleRange,\n u.duc(gap, gapComparator),\n u.duc(itemDimensions, (prev, next) => prev && prev.width === next.width && prev.height === next.height)\n ),\n u.withLatestFrom(viewportDimensions),\n u.map(([[totalCount, [startOffset, endOffset], gap, item], viewport]) => {\n const { row: rowGap, column: columnGap } = gap\n const { height: itemHeight, width: itemWidth } = item\n const { width: viewportWidth } = viewport\n\n if (totalCount === 0 || viewportWidth === 0) {\n return INITIAL_GRID_STATE\n }\n\n if (itemWidth === 0) {\n return PROBE_GRID_STATE\n }\n\n const perRow = itemsPerRow(viewportWidth, itemWidth, columnGap)\n\n let startIndex = perRow * floor((startOffset + rowGap) / (itemHeight + rowGap))\n let endIndex = perRow * ceil((endOffset + rowGap) / (itemHeight + rowGap)) - 1\n endIndex = max(0, min(totalCount - 1, endIndex))\n startIndex = min(endIndex, max(0, startIndex))\n\n const items = buildItems(startIndex, endIndex)\n const { top, bottom } = gridLayout(viewport, gap, item, items)\n const rowCount = ceil(totalCount / perRow)\n const totalHeight = rowCount * itemHeight + (rowCount - 1) * rowGap\n const offsetBottom = totalHeight - bottom\n\n return { items, offsetTop: top, offsetBottom, top, bottom, itemHeight, itemWidth } as GridState\n })\n ),\n gridState\n )\n\n u.connect(\n u.pipe(\n viewportDimensions,\n u.map(({ height }) => height)\n ),\n viewportHeight\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(viewportDimensions, itemDimensions, gridState, gap),\n u.map(([viewportDimensions, item, { items }, gap]) => {\n const { top, bottom } = gridLayout(viewportDimensions, gap, item, items)\n\n return [top, bottom] as [number, number]\n }),\n u.distinctUntilChanged(tupleComparator)\n ),\n listBoundary\n )\n\n const endReached = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => items.length > 0),\n u.withLatestFrom(totalCount),\n u.filter(([{ items }, totalCount]) => items[items.length - 1].index === totalCount - 1),\n u.map(([, totalCount]) => totalCount - 1),\n u.distinctUntilChanged()\n )\n )\n\n const startReached = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => {\n return items.length > 0 && items[0].index === 0\n }),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(0),\n u.distinctUntilChanged()\n )\n )\n\n const rangeChanged = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => items.length > 0),\n u.map(({ items }) => {\n return {\n startIndex: items[0].index,\n endIndex: items[items.length - 1].index,\n }\n }),\n u.distinctUntilChanged(rangeComparator)\n )\n )\n\n u.connect(rangeChanged, scrollSeek.scrollSeekRangeChanged)\n\n u.connect(\n u.pipe(\n scrollToIndex,\n u.withLatestFrom(viewportDimensions, itemDimensions, totalCount, gap),\n u.map(([location, viewport, item, totalCount, gap]) => {\n const normalLocation = normalizeIndexLocation(location) as FlatIndexLocationWithAlign\n const { align, behavior, offset } = normalLocation\n let index = normalLocation.index\n if (index === 'LAST') {\n index = totalCount - 1\n }\n\n index = max(0, index, min(totalCount - 1, index))\n\n let top = itemTop(viewport, gap, item, index)\n\n if (align === 'end') {\n top = round(top - viewport.height + item.height)\n } else if (align === 'center') {\n top = round(top - viewport.height / 2 + item.height / 2)\n }\n\n if (offset) {\n top += offset\n }\n\n return { top, behavior }\n })\n ),\n scrollTo\n )\n\n const totalListHeight = u.statefulStreamFromEmitter(\n u.pipe(\n gridState,\n u.map((gridState) => {\n return gridState.offsetBottom + gridState.bottom\n })\n ),\n 0\n )\n\n u.connect(\n u.pipe(\n windowViewportRect,\n u.map((viewportInfo) => ({ width: viewportInfo.visibleWidth, height: viewportInfo.visibleHeight }))\n ),\n viewportDimensions\n )\n\n return {\n // input\n totalCount,\n viewportDimensions,\n itemDimensions,\n scrollTop,\n scrollHeight,\n overscan,\n scrollBy,\n scrollTo,\n scrollToIndex,\n smoothScrollTargetReached,\n windowViewportRect,\n windowScrollTo,\n useWindowScroll,\n customScrollParent,\n windowScrollContainerState,\n deviation,\n scrollContainerState,\n initialItemCount,\n gap,\n ...scrollSeek,\n\n // output\n gridState,\n totalListHeight,\n ...stateFlags,\n startReached,\n endReached,\n rangeChanged,\n propsReady,\n ...log,\n }\n },\n u.tup(sizeRangeSystem, domIOSystem, stateFlagsSystem, scrollSeekSystem, propsReadySystem, windowScrollerSystem, loggerSystem)\n)\n\nfunction gridLayout(viewport: ElementDimensions, gap: Gap, item: ElementDimensions, items: GridItem[]): GridLayout {\n const { height: itemHeight } = item\n if (itemHeight === undefined || items.length === 0) {\n return { top: 0, bottom: 0 }\n }\n\n const top = itemTop(viewport, gap, item, items[0].index)\n const bottom = itemTop(viewport, gap, item, items[items.length - 1].index) + itemHeight\n return { top, bottom }\n}\n\nfunction itemTop(viewport: ElementDimensions, gap: Gap, item: ElementDimensions, index: number) {\n const perRow = itemsPerRow(viewport.width, item.width, gap.column)\n const rowCount = floor(index / perRow)\n const top = rowCount * item.height + max(0, rowCount - 1) * gap.row\n return top > 0 ? top + gap.row : top\n}\n\nfunction itemsPerRow(viewportWidth: number, itemWidth: number, gap: number) {\n return max(1, floor((viewportWidth + gap) / (itemWidth + gap)))\n}\n","import { RefHandle, systemToComponent } from '@virtuoso.dev/react-urx'\n\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { createElement, FC, PropsWithChildren } from 'react'\nimport { gridSystem } from './gridSystem'\nimport useSize from './hooks/useSize'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\nimport { GridComponents, GridComputeItemKey, GridItemContent, GridRootProps } from './interfaces'\nimport { addDeprecatedAlias, buildScroller, buildWindowScroller, contextPropIfNotDomElement, identity, viewportStyle } from './List'\nimport { Log, LogLevel } from './loggerSystem'\n\nconst gridComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<GridItemContent<any>>((index) => `Item ${index}`)\n const components = u.statefulStream<GridComponents>({})\n const context = u.statefulStream<unknown>(null)\n const itemClassName = u.statefulStream('virtuoso-grid-item')\n const listClassName = u.statefulStream('virtuoso-grid-list')\n const computeItemKey = u.statefulStream<GridComputeItemKey>(identity)\n const scrollerRef = u.statefulStream<(ref: HTMLElement | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof GridComponents>(propName: K, defaultValue: GridComponents[K] | null | 'div' = null) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n components,\n computeItemKey,\n itemClassName,\n listClassName,\n scrollerRef,\n ListComponent: distinctProp('List', 'div'),\n ItemComponent: distinctProp('Item', 'div'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder', 'div'),\n }\n})\n\nconst combinedSystem = u.system(([gridSystem, gridComponentPropsSystem]) => {\n const deprecatedProps = {\n item: addDeprecatedAlias(gridComponentPropsSystem.itemContent, 'Rename the %citem%c prop to %citemContent.'),\n ItemContainer: u.stream<any>(),\n ScrollContainer: u.stream<any>(),\n ListContainer: u.stream<any>(),\n emptyComponent: u.stream<any>(),\n scrollSeek: u.stream<any>(),\n }\n\n function deprecateComponentProp(stream: u.Stream<any>, componentName: string, propName: string) {\n u.connect(\n u.pipe(\n stream,\n u.withLatestFrom(gridComponentPropsSystem.components),\n u.map(([comp, components]) => {\n console.warn(`react-virtuoso: ${propName} property is deprecated. Pass components.${componentName} instead.`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n return { ...components, [componentName]: comp }\n })\n ),\n gridComponentPropsSystem.components\n )\n }\n\n u.subscribe(deprecatedProps.scrollSeek, ({ placeholder, ...config }) => {\n console.warn(\n `react-virtuoso: scrollSeek property is deprecated. Pass scrollSeekConfiguration and specify the placeholder in components.ScrollSeekPlaceholder instead.`\n )\n u.publish(gridComponentPropsSystem.components, {\n ...u.getValue(gridComponentPropsSystem.components),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ScrollSeekPlaceholder: placeholder,\n })\n u.publish(gridSystem.scrollSeekConfiguration, config)\n })\n\n deprecateComponentProp(deprecatedProps.ItemContainer, 'Item', 'ItemContainer')\n deprecateComponentProp(deprecatedProps.ListContainer, 'List', 'ListContainer')\n deprecateComponentProp(deprecatedProps.ScrollContainer, 'Scroller', 'ScrollContainer')\n\n return { ...gridSystem, ...gridComponentPropsSystem, ...deprecatedProps }\n}, u.tup(gridSystem, gridComponentPropsSystem))\n\nconst GridItems: FC = React.memo(function GridItems() {\n const gridState = useEmitterValue('gridState')\n const listClassName = useEmitterValue('listClassName')\n const itemClassName = useEmitterValue('itemClassName')\n const itemContent = useEmitterValue('itemContent')\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const scrollHeightCallback = usePublisher('scrollHeight')\n const ItemComponent = useEmitterValue('ItemComponent')!\n const ListComponent = useEmitterValue('ListComponent')!\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder')!\n const context = useEmitterValue('context')\n const itemDimensions = usePublisher('itemDimensions')\n const gridGap = usePublisher('gap')\n const log = useEmitterValue('log')\n\n const listRef = useSize((el) => {\n const scrollHeight = el.parentElement!.parentElement!.scrollHeight\n scrollHeightCallback(scrollHeight)\n const firstItem = el.firstChild as HTMLElement\n if (firstItem) {\n itemDimensions(firstItem.getBoundingClientRect())\n }\n gridGap({\n row: resolveGapValue('row-gap', getComputedStyle(el).rowGap, log),\n column: resolveGapValue('column-gap', getComputedStyle(el).columnGap, log),\n })\n })\n\n return createElement(\n ListComponent,\n {\n ref: listRef,\n className: listClassName,\n ...contextPropIfNotDomElement(ListComponent, context),\n style: { paddingTop: gridState.offsetTop, paddingBottom: gridState.offsetBottom },\n },\n gridState.items.map((item) => {\n const key = computeItemKey(item.index)\n return isSeeking\n ? createElement(ScrollSeekPlaceholder, {\n key,\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n index: item.index,\n height: gridState.itemHeight,\n width: gridState.itemWidth,\n })\n : createElement(\n ItemComponent,\n { ...contextPropIfNotDomElement(ItemComponent, context), className: itemClassName, 'data-index': item.index, key },\n itemContent(item.index, context)\n )\n })\n )\n})\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportDimensions = usePublisher('viewportDimensions')\n\n const viewportRef = useSize((el) => {\n viewportDimensions(el.getBoundingClientRect())\n })\n\n return (\n <div style={viewportStyle} ref={viewportRef}>\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle}>\n {children}\n </div>\n )\n}\n\nconst GridRoot: FC<GridRootProps> = React.memo(function GridRoot({ ...props }) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n\n return (\n <TheScroller {...props}>\n <TheViewport>\n <GridItems />\n </TheViewport>\n </TheScroller>\n )\n})\n\nconst {\n Component: Grid,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n optional: {\n totalCount: 'totalCount',\n overscan: 'overscan',\n itemContent: 'itemContent',\n components: 'components',\n computeItemKey: 'computeItemKey',\n initialItemCount: 'initialItemCount',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n listClassName: 'listClassName',\n itemClassName: 'itemClassName',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n\n // deprecated\n item: 'item',\n ItemContainer: 'ItemContainer',\n ScrollContainer: 'ScrollContainer',\n ListContainer: 'ListContainer',\n scrollSeek: 'scrollSeek',\n },\n methods: {\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n scrollToIndex: 'scrollToIndex',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n },\n },\n GridRoot\n)\n\nexport type foo<T> = T extends React.ForwardRefExoticComponent<React.RefAttributes<infer Handle>> ? Handle : never\n\nexport type GridHandle = RefHandle<typeof Grid>\nexport { Grid }\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n\nfunction resolveGapValue(property: string, value: string | undefined, log: Log) {\n if (value !== 'normal' && !value?.endsWith('px')) {\n log(`${property} was not resolved to pixel value correctly`, value, LogLevel.WARN)\n }\n if (value === 'normal') {\n return 0\n }\n return parseInt(value ?? '0', 10)\n}\n","import { systemToComponent } from '@virtuoso.dev/react-urx'\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { createElement, FC, PropsWithChildren } from 'react'\nimport useChangedListContentsSizes from './hooks/useChangedChildSizes'\nimport { ComputeItemKey, ItemContent, FixedHeaderContent, TableComponents, TableRootProps } from './interfaces'\nimport { listSystem } from './listSystem'\nimport { identity, buildScroller, buildWindowScroller, viewportStyle, contextPropIfNotDomElement } from './List'\nimport useSize from './hooks/useSize'\nimport { correctItemSize } from './utils/correctItemSize'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\n\nconst tableComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<ItemContent<any, unknown>>((index: number) => <td>Item ${index}</td>)\n const context = u.statefulStream<unknown>(null)\n const fixedHeaderContent = u.statefulStream<FixedHeaderContent>(null)\n const components = u.statefulStream<TableComponents>({})\n const computeItemKey = u.statefulStream<ComputeItemKey<any, unknown>>(identity)\n const scrollerRef = u.statefulStream<(ref: HTMLElement | Window | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof TableComponents>(\n propName: K,\n defaultValue: TableComponents[K] | null | 'thead' | 'table' | 'tbody' | 'tr' | 'div' = null\n ) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n fixedHeaderContent,\n components,\n computeItemKey,\n scrollerRef,\n TableComponent: distinctProp('Table', 'table'),\n TableHeadComponent: distinctProp('TableHead', 'thead'),\n TableBodyComponent: distinctProp('TableBody', 'tbody'),\n TableRowComponent: distinctProp('TableRow', 'tr'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n EmptyPlaceholder: distinctProp('EmptyPlaceholder'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder'),\n FillerRow: distinctProp('FillerRow'),\n }\n})\n\nconst combinedSystem = u.system(([listSystem, propsSystem]) => {\n return { ...listSystem, ...propsSystem }\n}, u.tup(listSystem, tableComponentPropsSystem))\n\nconst DefaultScrollSeekPlaceholder = ({ height }: { height: number }) => (\n <tr>\n <td style={{ height }}></td>\n </tr>\n)\n\nconst DefaultFillerRow = ({ height }: { height: number }) => (\n <tr>\n <td style={{ height: height, padding: 0, border: 0 }}></td>\n </tr>\n)\n\nexport const Items = React.memo(function VirtuosoItems() {\n const listState = useEmitterValue('listState')\n const sizeRanges = usePublisher('sizeRanges')\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const windowScrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const _scrollContainerStateCallback = usePublisher('scrollContainerState')\n const scrollContainerStateCallback =\n customScrollParent || useWindowScroll ? windowScrollContainerStateCallback : _scrollContainerStateCallback\n const itemContent = useEmitterValue('itemContent')\n const trackItemSizes = useEmitterValue('trackItemSizes')\n const itemSize = useEmitterValue('itemSize')\n const log = useEmitterValue('log')\n\n const { callbackRef, ref } = useChangedListContentsSizes(\n sizeRanges,\n itemSize,\n trackItemSizes,\n scrollContainerStateCallback,\n log,\n undefined,\n customScrollParent\n )\n\n const [deviation, setDeviation] = React.useState(0)\n useEmitter('deviation', (value) => {\n if (deviation !== value) {\n ref.current!.style.marginTop = `${value}px`\n setDeviation(value)\n }\n })\n const EmptyPlaceholder = useEmitterValue('EmptyPlaceholder')\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder') || DefaultScrollSeekPlaceholder\n const FillerRow = useEmitterValue('FillerRow') || DefaultFillerRow\n const TableBodyComponent = useEmitterValue('TableBodyComponent')!\n const TableRowComponent = useEmitterValue('TableRowComponent')!\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const paddingTopAddition = useEmitterValue('paddingTopAddition')\n const firstItemIndex = useEmitterValue('firstItemIndex')\n const statefulTotalCount = useEmitterValue('statefulTotalCount')\n const context = useEmitterValue('context')\n\n if (statefulTotalCount === 0 && EmptyPlaceholder) {\n return createElement(EmptyPlaceholder, contextPropIfNotDomElement(EmptyPlaceholder, context))\n }\n\n const paddingTop = listState.offsetTop + paddingTopAddition + deviation\n const paddingBottom = listState.offsetBottom\n\n const paddingTopEl = paddingTop > 0 ? <FillerRow height={paddingTop} key=\"padding-top\" /> : null\n\n const paddingBottomEl = paddingBottom > 0 ? <FillerRow height={paddingBottom} key=\"padding-bottom\" /> : null\n\n const items = listState.items.map((item) => {\n const index = item.originalIndex!\n const key = computeItemKey(index + firstItemIndex, item.data, context)\n\n if (isSeeking) {\n return createElement(ScrollSeekPlaceholder, {\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n key,\n index: item.index,\n height: item.size,\n type: item.type || 'item',\n })\n }\n return createElement(\n TableRowComponent,\n {\n ...contextPropIfNotDomElement(TableRowComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n style: { overflowAnchor: 'none' },\n },\n itemContent(item.index, item.data, context)\n )\n })\n\n return createElement(\n TableBodyComponent,\n { ref: callbackRef, 'data-test-id': 'virtuoso-item-list', ...contextPropIfNotDomElement(TableBodyComponent, context) },\n [paddingTopEl, ...items, paddingBottomEl]\n )\n})\n\nexport interface Hooks {\n usePublisher: typeof usePublisher\n useEmitterValue: typeof useEmitterValue\n useEmitter: typeof useEmitter\n}\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportHeight = usePublisher('viewportHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n return (\n <div style={viewportStyle} ref={viewportRef} data-viewport-type=\"element\">\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle} data-viewport-type=\"window\">\n {children}\n </div>\n )\n}\n\nconst TableRoot: FC<TableRootProps> = React.memo(function TableVirtuosoRoot(props) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const fixedHeaderHeight = usePublisher('fixedHeaderHeight')\n const fixedHeaderContent = useEmitterValue('fixedHeaderContent')\n const context = useEmitterValue('context')\n const theadRef = useSize(u.compose(fixedHeaderHeight, (el) => correctItemSize(el, 'height')))\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n const TheTable = useEmitterValue('TableComponent')\n const TheTHead = useEmitterValue('TableHeadComponent')\n\n const theHead = fixedHeaderContent\n ? React.createElement(\n TheTHead!,\n {\n key: 'TableHead',\n style: { zIndex: 1, position: 'sticky', top: 0 },\n ref: theadRef,\n ...contextPropIfNotDomElement(TheTHead, context),\n },\n fixedHeaderContent()\n )\n : null\n\n return (\n <TheScroller {...props}>\n <TheViewport>\n {React.createElement(TheTable!, { style: { borderSpacing: 0 }, ...contextPropIfNotDomElement(TheTable, context) }, [\n theHead,\n <Items key=\"TableBody\" />,\n ])}\n </TheViewport>\n </TheScroller>\n )\n})\n\nexport const {\n Component: Table,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n required: {},\n optional: {\n context: 'context',\n followOutput: 'followOutput',\n firstItemIndex: 'firstItemIndex',\n itemContent: 'itemContent',\n fixedHeaderContent: 'fixedHeaderContent',\n overscan: 'overscan',\n increaseViewportBy: 'increaseViewportBy',\n totalCount: 'totalCount',\n topItemCount: 'topItemCount',\n initialTopMostItemIndex: 'initialTopMostItemIndex',\n components: 'components',\n groupCounts: 'groupCounts',\n atBottomThreshold: 'atBottomThreshold',\n atTopThreshold: 'atTopThreshold',\n computeItemKey: 'computeItemKey',\n defaultItemHeight: 'defaultItemHeight',\n fixedItemHeight: 'fixedItemHeight',\n itemSize: 'itemSize',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n data: 'data',\n initialItemCount: 'initialItemCount',\n initialScrollTop: 'initialScrollTop',\n alignToBottom: 'alignToBottom',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n logLevel: 'logLevel',\n react18ConcurrentRendering: 'react18ConcurrentRendering',\n },\n methods: {\n scrollToIndex: 'scrollToIndex',\n scrollIntoView: 'scrollIntoView',\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n totalListHeightChanged: 'totalListHeightChanged',\n itemsRendered: 'itemsRendered',\n groupIndices: 'groupIndices',\n },\n },\n TableRoot\n)\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n","import { ReactElement, Ref } from 'react'\n\nimport {\n Components,\n ComputeItemKey,\n FollowOutput,\n GridComponents,\n GridComputeItemKey,\n GridItemContent,\n GroupContent,\n GroupItemContent,\n IndexLocationWithAlign,\n ItemContent,\n ListItem,\n ListRange,\n ScrollSeekConfiguration,\n TableComponents,\n FixedHeaderContent,\n ScrollIntoViewLocation,\n ListRootProps,\n GridRootProps,\n FlatIndexLocationWithAlign,\n FlatScrollIntoViewLocation,\n} from './interfaces'\nimport { List } from './List'\nimport { Grid } from './Grid'\nimport { Table } from './Table'\n\nexport interface VirtuosoProps<D, C> extends ListRootProps {\n /**\n * The total amount of items to be rendered.\n */\n totalCount?: number\n\n /**\n * The data items to be rendered. If data is set, the total count will be inferred from the length of the array.\n */\n data?: readonly D[]\n\n /**\n * Additional context available in the custom components and content callbacks\n */\n context?: C\n\n /**\n * *The property accepts pixel values.*\n *\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n * See the `increaseViewportBy` property for a similar behavior (equivalent to the `overscan` in react-window).\n *\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n *\n * *The property accepts pixel values.*\n *\n * Set the increaseViewportBy property to artificially increase the viewport size, causing items to be rendered before outside of the viewport.\n * The property causes the component to render more items than the necessary, but can help with slow loading content.\n * Using `{ top?: number, bottom?: number }` lets you set the increase for each end separately.\n *\n */\n increaseViewportBy?: number | { top: number; bottom: number }\n\n /**\n * Set the amount of items to remain fixed at the top of the list.\n *\n * For a header that scrolls away when scrolling, check the `components.Header` property.\n */\n topItemCount?: number\n\n /**\n * Set to a value between 0 and totalCount - 1 to make the list start scrolled to that item.\n * Pass in an object to achieve additional effects similar to `scrollToIndex`.\n */\n initialTopMostItemIndex?: number | IndexLocationWithAlign\n\n /**\n * Set this value to offset the initial location of the list.\n * Warning: using this property will still run a render cycle at the scrollTop: 0 list window.\n * If possible, avoid using it and stick to `initialTopMostItemIndex` instead.\n */\n initialScrollTop?: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Use the `components` property for advanced customization of the elements rendered by the list.\n */\n components?: Components<C>\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: ItemContent<D, C>\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: ComputeItemKey<D, C>\n\n /**\n * By default, the component assumes the default item height from the first rendered item (rendering it as a \"probe\").\n *\n * If the first item turns out to be an outlier (very short or tall), the rest of the rendering will be slower,\n * as multiple passes of rendering should happen for the list to fill the viewport.\n *\n * Setting `defaultItemHeight` causes the component to skip the \"probe\" rendering and use the property\n * value as default height instead.\n */\n defaultItemHeight?: number\n\n /**\n * Allows customizing the height/width calculation of `Item` elements.\n *\n * The default implementation reads `el.getBoundingClientRect().height` and `el.getBoundingClientRect().width`.\n */\n itemSize?: (el: HTMLElement, dimension: 'height' | 'width') => number\n\n /**\n * Can be used to improve performance if the rendered items are of known size.\n * Setting it causes the component to skip item measurements.\n */\n fixedItemHeight?: number\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * If set to `true`, the list automatically scrolls to bottom if the total count is changed.\n * Set to `\"smooth\"` for an animated scrolling.\n *\n * By default, `followOutput` scrolls down only if the list is already at the bottom.\n * To implement an arbitrary logic behind that, pass a function:\n *\n * ```tsx\n * <Virtuoso\n * followOutput={(isAtBottom: boolean) => {\n * if (expression) {\n * return 'smooth' // can be 'auto' or false to avoid scrolling\n * } else {\n * return false\n * }\n * }} />\n * ```\n */\n followOutput?: FollowOutput\n\n /**\n * Set to customize the wrapper tag for the header and footer components (default is `div`).\n */\n headerFooterTag?: string\n\n /**\n * Use when implementing inverse infinite scrolling - decrease the value this property\n * in combination with `data` or `totalCount` to prepend items to the top of the list.\n *\n * Warning: the firstItemIndex should **be a positive number**, based on the total amount of items to be displayed.\n */\n firstItemIndex?: number\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Called when the total list height is changed due to new items or viewport resize.\n */\n totalListHeightChanged?: (height: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n itemsRendered?: (items: ListItem<D>[]) => void\n\n /**\n * Setting `alignToBottom` to `true` aligns the items to the bottom of the list if the list is shorter than the viewport.\n * Use `followOutput` property to keep the list aligned when new items are appended.\n */\n alignToBottom?: boolean\n\n /**\n * Uses the document scroller rather than wrapping the list in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the list won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | Window | null) => any\n\n /**\n * *The property accepts pixel values.*\n *\n * By default `0`. Redefine to change how much away from the top the scroller can be before the list is not considered not at top.\n */\n atTopThreshold?: number\n\n /**\n * *The property accepts pixel values.*\n *\n * By default `4`. Redefine to change how much away from the bottom the scroller can be before the list is not considered not at bottom.\n */\n atBottomThreshold?: number\n\n /**\n * No longer necessary after 2.10.2. component should work out of the box.\n */\n react18ConcurrentRendering?: boolean\n}\n\nexport interface GroupedVirtuosoProps<D, C> extends Omit<VirtuosoProps<D, C>, 'totalCount' | 'itemContent'> {\n /**\n * Specifies the amount of items in each group (and, actually, how many groups are there).\n * For example, passing [20, 30] will display 2 groups with 20 and 30 items each.\n */\n groupCounts?: number[]\n\n /**\n * Specifies how each each group header gets rendered. The callback receives the zero-based index of the group.\n */\n groupContent?: GroupContent\n\n /**\n * Specifies how each each item gets rendered.\n */\n itemContent?: GroupItemContent<D, C>\n}\n\nexport interface TableVirtuosoProps<D, C> extends Omit<VirtuosoProps<D, C>, 'components' | 'headerFooterTag' | 'topItemCount'> {\n /**\n * Use the `components` property for advanced customization of the elements rendered by the table.\n */\n components?: TableComponents<C>\n /**\n * Set the contents of the table header.\n */\n fixedHeaderContent?: FixedHeaderContent\n\n /**\n * The total amount of items to be rendered.\n */\n totalCount?: number\n\n /**\n * The data items to be rendered. If data is set, the total count will be inferred from the length of the array.\n */\n data?: readonly D[]\n\n /**\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n * See the `increaseViewportBy` property for a similar behavior (equivalent to the `overscan` in `react-window`).\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n * Set the increaseViewportBy property to artificially increase the viewport size, causing items to be rendered before outside of the viewport.\n * The property causes the component to render more items than the necessary, but can help with slow loading content.\n * Using `{ top?: number, bottom?: number }` lets you set the increase for each end separately.\n */\n increaseViewportBy?: number | { top: number; bottom: number }\n\n /**\n * Set to a value between 0 and totalCount - 1 to make the list start scrolled to that item.\n */\n initialTopMostItemIndex?: number\n\n /**\n * Set this value to offset the initial location of the list.\n * Warning: using this property will still run a render cycle at the scrollTop: 0 list window.\n * If possible, avoid using it and stick to `initialTopMostItemIndex` instead.\n */\n initialScrollTop?: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: ItemContent<D, C>\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: ComputeItemKey<D, C>\n\n /**\n * By default, the component assumes the default item height from the first rendered item (rendering it as a \"probe\").\n *\n * If the first item turns out to be an outlier (very short or tall), the rest of the rendering will be slower,\n * as multiple passes of rendering should happen for the list to fill the viewport.\n *\n * Setting `defaultItemHeight` causes the component to skip the \"probe\" rendering and use the property\n * value as default height instead.\n */\n defaultItemHeight?: number\n\n /**\n * Allows customizing the height/width calculation of `Item` elements.\n *\n * The default implementation reads `el.getBoundingClientRect().height` and `el.getBoundingClientRect().width`.\n */\n itemSize?: (el: HTMLElement, dimension: 'height' | 'width') => number\n\n /**\n * Can be used to improve performance if the rendered items are of known size.\n * Setting it causes the component to skip item measurements.\n */\n fixedItemHeight?: number\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * If set to `true`, the list automatically scrolls to bottom if the total count is changed.\n * Set to `\"smooth\"` for an animated scrolling.\n *\n * By default, `followOutput` scrolls down only if the list is already at the bottom.\n * To implement an arbitrary logic behind that, pass a function:\n *\n * ```tsx\n * <Virtuoso\n * followOutput={(isAtBottom: boolean) => {\n * if (expression) {\n * return 'smooth' // can be 'auto' or false to avoid scrolling\n * } else {\n * return false\n * }\n * }} />\n * ```\n */\n followOutput?: FollowOutput\n\n /**\n * Use when implementing inverse infinite scrolling - decrease the value this property\n * in combination with `data` or `totalCount` to prepend items to the top of the list.\n *\n * Warning: the firstItemIndex should **be a positive number**, based on the total amount of items to be displayed.\n */\n firstItemIndex?: number\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Called when the total list height is changed due to new items or viewport resize.\n */\n totalListHeightChanged?: (height: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n itemsRendered?: (items: ListItem<D>[]) => void\n\n /**\n * Setting `alignToBottom` to `true` aligns the items to the bottom of the list if the list is shorter than the viewport.\n * Use `followOutput` property to keep the list aligned when new items are appended.\n */\n alignToBottom?: boolean\n\n /**\n * Uses the document scroller rather than wrapping the list in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the table won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | Window | null) => any\n\n /**\n * By default `0`. Redefine to change how much away from the top the scroller can be before the list is not considered not at top.\n */\n atTopThreshold?: number\n\n /**\n * By default `4`. Redefine to change how much away from the bottom the scroller can be before the list is not considered not at bottom.\n */\n atBottomThreshold?: number\n\n /**\n * No longer necessary after 2.10.2. component should work out of the box.\n */\n react18ConcurrentRendering?: boolean\n}\n\nexport interface VirtuosoGridProps<C = unknown> extends GridRootProps {\n /**\n * The total amount of items to be rendered.\n */\n totalCount: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: GridItemContent<C>\n\n /**\n * Use the `components` property for advanced customization of the elements rendered by the list.\n */\n components?: GridComponents<C>\n\n /**\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: GridComputeItemKey\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | null) => any\n\n /**\n * Sets the className for the list DOM element\n */\n listClassName?: string\n\n /**\n * Sets the grid items' className\n */\n itemClassName?: string\n\n /**\n * Uses the document scroller rather than wrapping the grid in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the grid won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n}\n\nexport interface VirtuosoHandle {\n /**\n * Scrolls the component to the specified item index. See {@link IndexLocationWithAlign} for more options.\n */\n scrollToIndex(location: number | FlatIndexLocationWithAlign): void\n /**\n * Scrolls the item into view if necessary. See [the website example](http://virtuoso.dev/keyboard-navigation/) for an implementation.\n */\n scrollIntoView(location: FlatScrollIntoViewLocation): void\n /**\n * Scrolls the component to the specified location. See [ScrollToOptions (MDN)](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions)\n */\n scrollTo(location: ScrollToOptions): void\n /**\n * Scrolls the component with the specified amount. See [ScrollToOptions (MDN)](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions)\n */\n scrollBy(location: ScrollToOptions): void\n /**\n * Use this with combination with follow output if you have images loading in the list. Listen to the image loading and call the method.\n */\n autoscrollToBottom(): void\n}\n\nexport interface GroupedVirtuosoHandle {\n scrollToIndex(location: number | IndexLocationWithAlign): void\n scrollIntoView(location: number | ScrollIntoViewLocation): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n autoscrollToBottom(): void\n}\n\nexport interface VirtuosoGridHandle {\n scrollToIndex(location: number | IndexLocationWithAlign): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n}\n\nexport interface TableVirtuosoHandle {\n scrollIntoView(location: number | FlatScrollIntoViewLocation): void\n scrollToIndex(location: number | FlatIndexLocationWithAlign): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n}\n\nexport const Virtuoso = List as <ItemData = any, Context = any>(\n props: VirtuosoProps<ItemData, Context> & { ref?: Ref<VirtuosoHandle> }\n) => ReactElement\n\nexport const GroupedVirtuoso = List as <ItemData = any, Context = any>(\n props: GroupedVirtuosoProps<ItemData, Context> & { ref?: Ref<GroupedVirtuosoHandle> }\n) => ReactElement\n\nexport const TableVirtuoso = Table as <ItemData = any, Context = any>(\n props: TableVirtuosoProps<ItemData, Context> & { ref?: Ref<TableVirtuosoHandle> }\n) => ReactElement\n\nexport const VirtuosoGrid = Grid as <Context = any>(props: VirtuosoGridProps<Context> & { ref?: Ref<VirtuosoGridHandle> }) => ReactElement\n"],"names":["LogLevel","useIsomorphicLayoutEffect","document","useLayoutEffect","useEffect","CONSOLE_METHOD_MAP","DEBUG","INFO","_CONSOLE_METHOD_MAP","WARN","ERROR","loggerSystem","u","system","logLevel","statefulStream","log","label","message","level","_getGlobalThis$VIRTUO","globalThis","window","getValue","console","singleton","useSizeWithElRef","callback","enabled","ref","useRef","callbackRef","_el","ResizeObserver","observer","entries","element","target","offsetParent","elRef","observe","current","unobserve","useSize","useChangedListContentsSizes","itemSize","scrollContainerStateCallback","gap","customScrollParent","el","ranges","children","field","length","results","i","child","item","undefined","dataset","index","parseInt","knownSize","parseFloat","size","lastResult","endIndex","push","startIndex","getChangedChildSizes","scrollableElement","parentElement","scrollTop","firstElementChild","pageYOffset","documentElement","Math","max","scrollHeight","viewportHeight","offsetHeight","property","value","endsWith","resolveGapValue","getComputedStyle","rowGap","correctItemSize","dimension","round","getBoundingClientRect","approximatelyEqual","num1","num2","abs","useScrollTop","smoothScrollTargetReached","scrollerElement","scrollerRefCallback","noop","scrollerRef","scrollTopTarget","timeoutRef","shouldFlushSync","handler","useCallback","ev","windowScroll","innerHeight","call","flushSync","clearTimeout","localRef","addEventListener","passive","removeEventListener","scrollByCallback","location","scrollBy","scrollToCallback","isSmooth","behavior","top","ceil","min","setTimeout","scrollTo","domIOSystem","scrollContainerState","stream","deviation","statefulScrollTop","headerHeight","fixedHeaderHeight","footerHeight","scrollingInProgress","react18ConcurrentRendering","connect","pipe","map","_ref","_ref2","NIL_NODE","lvl","newAANode","k","v","l","r","empty","node","newTree","remove","key","last","adjust","clone","_last","deleteLast","findMaxKeyValue","Infinity","insert","split","skew","rebalance","walkWithin","start","end","result","concat","walk","args","isSingle","Error","rl","rlvl","rangesWithin","arrayToRanges","items","parser","_parser","nextIndex","nextValue","_parser2","findIndexOfClosestSmallerOrEqual","comparator","floor","match","join","findClosestSmallerOrEqual","recalcSystem","recalcInProgress","rangeIncludes","refRange","range","indexComparator","itemIndex","offsetComparator","offset","itemOffset","offsetPointParser","point","createOffsetTree","prevOffsetTree","syncStart","sizeTree","offsetTree","prevIndex","prevSize","prevOffset","arrayBinarySearch","kv","slice","_step3","_iterator3","done","_step3$value","indexOffset","aOffset","lastIndex","lastOffset","lastSize","sizeStateReducer","state","_ref3","groupIndices","newSizeTree","groupSize","reduce","tree","groupIndex","insertRanges","_step","_iterator","overlappingRanges","some","_step2","firstPassDone","shouldInsert","_iterator2","rangeStart","rangeEnd","_step2$value","rangeValue","_insertRanges","_createOffsetTree","newOffsetTree","groupOffsetTree","offsetOf","itemCount","_arrayBinarySearch$fi","originalIndexFromLocation","sizes","isGroupLocation","originalIndexFromItemIndex","hasGroups","groupOffset","SIZE_MAP","offsetWidth","sizeSystem","_ref4","sizeRanges","totalCount","statefulTotalCount","statefulStreamFromEmitter","unshiftWith","shiftWith","firstItemIndex","fixedItemSize","defaultItemSize","data","initial","withLatestFrom","scan","distinctUntilChanged","filter","indexes","_ref5","idx","_extends","_ref6","_ref7","_ref7$","trackItemSizes","listRefresh","streamFromEmitter","_ref8","_ref9","newSizes","changed","subscribe","prev","next","diff","val","publish","_ref10","beforeUnshiftWith","_ref11","acc","_ref12","shiftWithOffset","_ref13","_ref14","_ref15","tup","SUPPORTS_SCROLL_TO_OPTIONS","style","normalizeIndexLocation","align","scrollToIndexSystem","_ref$","_ref$2","scrollToIndex","topListHeight","unsubscribeNextListRefresh","cleartTimeoutRef","unsubscribeListRefresh","cleanup","_ref2$","normalLocation","retry","listChanged","handleNext","UP","INITIAL_BOTTOM_STATE","atBottom","notAtBottomBecause","offsetBottom","stateFlagsSystem","isAtBottom","isAtTop","atBottomStateChange","atTopStateChange","atBottomThreshold","atTopThreshold","isScrolling","merge","duc","skip","mapTo","debounceTime","isScrollingBy","combineLatest","throttleTime","atBottomState","atBottomBecause","scrollTopDelta","_ref3$","_headerHeight","lastJumpDueToItemResize","jump","scrollDirection","direction","prevScrollTop","scrollVelocity","_","propsReadySystem","propsReady","didMount","ready","initialTopMostItemIndexSystem","scrolledToInitialItem","initialTopMostItemIndex","normalizeFollowOutput","follow","followOutputSystem","followOutput","autoscrollToBottom","pendingScrollHandle","scrollToBottom","followOutputBehavior","trapNextSizeIncrease","cancel","shouldFollow","behaviorFromFollowOutput","refreshed","groupCountsToIndicesAndCount","counts","groupCount","groupedListSystem","groupCounts","topItemsIndexes","groupIndicesAndCount","tupleComparator","rangeComparator","getOverscan","overscan","main","reverse","getViewportIncrease","sizeRangeSystem","listBoundary","increaseViewportBy","visibleRange","listTop","listBottom","stickyHeaderHeight","headerVisible","topViewportAddition","bottomViewportAddition","EMPTY_LIST_STATE","topItems","offsetTop","bottom","transposeItems","originalIndex","transposedItems","groupRanges","currentRange","currentGroupIndex","shift","indexOf","transposedItem","type","buildListState","lastItem","height","listStateSystem","rangeTopListHeight","_ref$3","stateFlags","itemsRendered","listState","startOffset","endOffset","sizesValue","probeItemSet","getInitialTopMostItemIndexNumber","rangeStartIndex","rangeEndIndex","minStartIndex","offsetPointRanges","rangesWithinOffsets","endValue","findRange","maxIndex","tap","endReached","startReached","rangeChanged","initialItemCountSystem","initialItemCount","count","_ref3$2","includedGroupsCount","adjustedCount","Array","from","scrollSeekSystem","isSeeking","scrollSeekConfiguration","speed","config","enter","exit","velocity","change","scrollSeekRangeChanged","topItemCountSystem","topItemCount","totalListHeightSystem","totalListHeightChanged","totalListHeight","simpleMemoize","func","called","isMobileSafari","test","navigator","userAgent","upwardScrollFixSystem","deviationOffset","prevItems","totalHeight","newDev","amount","scrollByWith","deviationAmount","recalc","requestAnimationFrame","initialScrollTopSystem","initialScrollTop","alignToBottomSystem","alignToBottom","paddingTopAddition","windowScrollerSystem","windowScrollContainerState","windowViewportRect","windowScrollTo","useWindowScroll","_excluded","scrollIntoViewSystem","scrollIntoView","viewLocation","rest","actualIndex","itemTop","featureGroup1System","windowScroller","listSystem","_ref2$2","domIO","_ref2$3","flags","featureGroup1","visibleHeight","fixedItemHeight","defaultItemHeight","positionStickyCssValue","createElement","position","useWindowViewportRectRef","viewportInfo","calculateInfo","rect","visibleWidth","width","customScrollParentRect","deltaTop","scrollAndResizeEventHandler","_excluded2","_excluded3","identity","listComponentPropsSystem","itemContent","context","groupContent","components","computeItemKey","headerFooterTag","distinctProp","propName","defaultValue","FooterComponent","HeaderComponent","TopItemListComponent","ListComponent","ItemComponent","GroupComponent","ScrollerComponent","EmptyPlaceholder","ScrollSeekPlaceholder","addDeprecatedAlias","prop","alias","warn","combinedSystem","propsSystem","deprecatedProps","group","itemHeight","scrollingStateChange","adjustForPrependedItems","maxHeightCacheSize","footer","header","HeaderContainer","FooterContainer","ItemContainer","ScrollContainer","GroupContainer","ListContainer","emptyComponent","scrollSeek","deprecateComponentProp","componentName","_extends2","comp","placeholder","_objectWithoutPropertiesLoose","DefaultScrollSeekPlaceholder","React","GROUP_STYLE","zIndex","overflowAnchor","ITEM_STYLE","Items","memo","showTopList","_ref5$showTopList","useEmitterValue","usePublisher","windowScrollContainerStateCallback","_scrollContainerStateCallback","listGap","_React$useState","useState","setDeviation","useEmitter","containerStyle","boxSizing","paddingTop","paddingBottom","marginTop","contextPropIfNotDomElement","scrollerStyle","outline","overflowY","WebkitOverflowScrolling","viewportStyle","topItemListStyle","Header","Footer","buildScroller","props","_useScrollTop","tabIndex","buildWindowScroller","_useScrollTop2","Viewport","viewportRef","compose","WindowViewport","TopItemListContainer","TopItemList","ListRoot","TheViewport","WindowScroller","Scroller","_systemToComponent","systemToComponent","required","optional","methods","events","List","Component","INITIAL_GRID_STATE","itemWidth","PROBE_GRID_STATE","buildItems","gapComparator","column","row","gridSystem","_ref$4","gridState","viewportDimensions","itemDimensions","_ref4$$","_ref4$","viewport","viewportWidth","perRow","itemsPerRow","gridLayout","_gridLayout","rowCount","_gridLayout2","gridComponentPropsSystem","itemClassName","listClassName","GridItems","scrollHeightCallback","gridGap","listRef","firstItem","firstChild","columnGap","className","GridRoot","Grid","tableComponentPropsSystem","fixedHeaderContent","TableComponent","TableHeadComponent","TableBodyComponent","TableRowComponent","FillerRow","DefaultFillerRow","padding","border","_useChangedListConten","paddingTopEl","paddingBottomEl","TableRoot","theadRef","TheScroller","TheTable","TheTHead","theHead","borderSpacing","Table","Virtuoso","TableVirtuoso","VirtuosoGrid"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/useIsomorphicLayoutEffect.ts","../src/loggerSystem.ts","../src/hooks/useSize.ts","../src/hooks/useChangedChildSizes.ts","../src/utils/correctItemSize.ts","../src/utils/approximatelyEqual.ts","../src/hooks/useScrollTop.ts","../src/domIOSystem.ts","../src/AATree.ts","../src/utils/binaryArraySearch.ts","../src/recalcSystem.ts","../src/sizeSystem.ts","../src/scrollToIndexSystem.ts","../src/stateFlagsSystem.ts","../src/propsReadySystem.ts","../src/initialTopMostItemIndexSystem.ts","../src/followOutputSystem.ts","../src/groupedListSystem.ts","../src/comparators.tsx","../src/sizeRangeSystem.ts","../src/listStateSystem.ts","../src/initialItemCountSystem.ts","../src/scrollSeekSystem.ts","../src/topItemCountSystem.ts","../src/totalListHeightSystem.ts","../src/utils/simpleMemoize.ts","../src/upwardScrollFixSystem.ts","../src/initialScrollTopSystem.ts","../src/alignToBottomSystem.ts","../src/windowScrollerSystem.ts","../src/scrollIntoViewSystem.ts","../src/listSystem.ts","../src/utils/positionStickyCssValue.ts","../src/hooks/useWindowViewportRect.ts","../src/List.tsx","../src/gridSystem.ts","../src/Grid.tsx","../src/Table.tsx","../src/components.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect } from 'react'\n\nconst useIsomorphicLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default useIsomorphicLayoutEffect\n","import * as u from '@virtuoso.dev/urx'\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace globalThis {\n let VIRTUOSO_LOG_LEVEL: LogLevel | undefined\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\ndeclare namespace window {\n let VIRTUOSO_LOG_LEVEL: LogLevel | undefined\n}\n\nexport enum LogLevel {\n DEBUG,\n INFO,\n WARN,\n ERROR,\n}\nexport interface LogMessage {\n level: LogLevel\n message: any\n label: string\n}\n\nexport type Log = (label: string, message: any, level?: LogLevel) => void\n\nconst CONSOLE_METHOD_MAP = {\n [LogLevel.DEBUG]: 'debug',\n [LogLevel.INFO]: 'log',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error',\n} as const\n\nconst getGlobalThis = () => (typeof globalThis === 'undefined' ? window : globalThis)\n\nexport const loggerSystem = u.system(\n () => {\n const logLevel = u.statefulStream<LogLevel>(LogLevel.ERROR)\n const log = u.statefulStream<Log>((label: string, message: any, level: LogLevel = LogLevel.INFO) => {\n const currentLevel = getGlobalThis()['VIRTUOSO_LOG_LEVEL'] ?? u.getValue(logLevel)\n if (level >= currentLevel) {\n // eslint-disable-next-line no-console\n console[CONSOLE_METHOD_MAP[level]](\n '%creact-virtuoso: %c%s %o',\n 'color: #0253b3; font-weight: bold',\n 'color: initial',\n label,\n message\n )\n }\n })\n\n return {\n log,\n logLevel,\n }\n },\n [],\n { singleton: true }\n)\n","import { useRef } from 'react'\n\nexport type CallbackRefParam = HTMLElement | null\n\nexport function useSizeWithElRef(callback: (e: HTMLElement) => void, enabled = true) {\n const ref = useRef<CallbackRefParam>(null)\n\n let callbackRef = (_el: CallbackRefParam) => {\n void 0\n }\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n const element = entries[0].target as HTMLElement\n if (element.offsetParent !== null) {\n callback(element)\n }\n })\n\n callbackRef = (elRef: CallbackRefParam) => {\n if (elRef && enabled) {\n observer.observe(elRef)\n ref.current = elRef\n } else {\n if (ref.current) {\n observer.unobserve(ref.current)\n }\n ref.current = null\n }\n }\n }\n\n return { ref, callbackRef }\n}\n\nexport default function useSize(callback: (e: HTMLElement) => void, enabled = true) {\n return useSizeWithElRef(callback, enabled).callbackRef\n}\n","import { Log, LogLevel } from '../loggerSystem'\nimport { SizeFunction, SizeRange } from '../sizeSystem'\nimport { useSizeWithElRef } from './useSize'\nimport { ScrollContainerState } from '../interfaces'\nexport default function useChangedListContentsSizes(\n callback: (ranges: SizeRange[]) => void,\n itemSize: SizeFunction,\n enabled: boolean,\n scrollContainerStateCallback: (state: ScrollContainerState) => void,\n log: Log,\n gap?: (gap: number) => void,\n customScrollParent?: HTMLElement\n) {\n return useSizeWithElRef((el: HTMLElement) => {\n const ranges = getChangedChildSizes(el.children, itemSize, 'offsetHeight', log)\n let scrollableElement = el.parentElement!\n\n while (!scrollableElement.dataset['virtuosoScroller']) {\n scrollableElement = scrollableElement.parentElement!\n }\n\n const scrollTop = customScrollParent\n ? customScrollParent.scrollTop\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (scrollableElement.firstElementChild! as HTMLDivElement).dataset['viewportType']! === 'window'\n ? window.pageYOffset || document.documentElement.scrollTop\n : scrollableElement.scrollTop\n\n scrollContainerStateCallback({\n scrollTop: Math.max(scrollTop, 0),\n scrollHeight: (customScrollParent ?? scrollableElement).scrollHeight,\n viewportHeight: (customScrollParent ?? scrollableElement).offsetHeight,\n })\n\n gap?.(resolveGapValue('row-gap', getComputedStyle(el).rowGap, log))\n\n if (ranges !== null) {\n callback(ranges)\n }\n }, enabled)\n}\n\nfunction getChangedChildSizes(children: HTMLCollection, itemSize: SizeFunction, field: 'offsetHeight' | 'offsetWidth', log: Log) {\n const length = children.length\n\n if (length === 0) {\n return null\n }\n\n const results: SizeRange[] = []\n\n for (let i = 0; i < length; i++) {\n const child = children.item(i) as HTMLElement\n\n if (!child || child.dataset.index === undefined) {\n continue\n }\n\n const index = parseInt(child.dataset.index!)\n const knownSize = parseFloat(child.dataset.knownSize!)\n const size = itemSize(child, field)\n\n if (size === 0) {\n log('Zero-sized element, this should not happen', { child }, LogLevel.ERROR)\n }\n\n if (size === knownSize) {\n continue\n }\n\n const lastResult = results[results.length - 1]\n if (results.length === 0 || lastResult.size !== size || lastResult.endIndex !== index - 1) {\n results.push({ startIndex: index, endIndex: index, size })\n } else {\n results[results.length - 1].endIndex++\n }\n }\n\n return results\n}\n\nfunction resolveGapValue(property: string, value: string, log: Log) {\n if (value !== 'normal' && !value.endsWith('px')) {\n log(`${property} was not resolved to pixel value correctly`, value, LogLevel.WARN)\n }\n if (value === 'normal') {\n return 0\n }\n return parseInt(value, 10)\n}\n","export function correctItemSize(el: HTMLElement, dimension: 'height' | 'width') {\n return Math.round(el.getBoundingClientRect()[dimension])\n}\n","export function approximatelyEqual(num1: number, num2: number) {\n return Math.abs(num1 - num2) < 1.01\n}\n","import { useRef, useCallback, useEffect } from 'react'\nimport * as u from '@virtuoso.dev/urx'\nimport { correctItemSize } from '../utils/correctItemSize'\nimport { ScrollContainerState } from '../interfaces'\nimport { flushSync } from 'react-dom'\nimport { approximatelyEqual } from '../utils/approximatelyEqual'\n\nexport type ScrollerRef = Window | HTMLElement | null\n\nexport default function useScrollTop(\n scrollContainerStateCallback: (state: ScrollContainerState) => void,\n smoothScrollTargetReached: (yes: true) => void,\n scrollerElement: any,\n scrollerRefCallback: (ref: ScrollerRef) => void = u.noop,\n customScrollParent?: HTMLElement\n) {\n const scrollerRef = useRef<HTMLElement | null | Window>(null)\n const scrollTopTarget = useRef<any>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const shouldFlushSync = useRef(false)\n\n const handler = useCallback(\n (ev: Event) => {\n const el = ev.target as HTMLElement\n const windowScroll = (el as any) === window || (el as any) === document\n const scrollTop = windowScroll ? window.pageYOffset || document.documentElement.scrollTop : el.scrollTop\n const scrollHeight = windowScroll ? document.documentElement.scrollHeight : el.scrollHeight\n const viewportHeight = windowScroll ? window.innerHeight : el.offsetHeight\n\n const call = () => {\n scrollContainerStateCallback({\n scrollTop: Math.max(scrollTop, 0),\n scrollHeight,\n viewportHeight,\n })\n }\n\n if (shouldFlushSync.current) {\n flushSync(call)\n } else {\n call()\n }\n shouldFlushSync.current = false\n\n if (scrollTopTarget.current !== null) {\n if (scrollTop === scrollTopTarget.current || scrollTop <= 0 || scrollTop === scrollHeight - viewportHeight) {\n scrollTopTarget.current = null\n smoothScrollTargetReached(true)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }\n }\n },\n [scrollContainerStateCallback, smoothScrollTargetReached]\n )\n\n useEffect(() => {\n const localRef = customScrollParent ? customScrollParent : scrollerRef.current!\n\n scrollerRefCallback(customScrollParent ? customScrollParent : scrollerRef.current)\n handler({ target: localRef } as unknown as Event)\n localRef.addEventListener('scroll', handler, { passive: true })\n\n return () => {\n scrollerRefCallback(null)\n localRef.removeEventListener('scroll', handler)\n }\n }, [scrollerRef, handler, scrollerElement, scrollerRefCallback, customScrollParent])\n\n function scrollToCallback(location: ScrollToOptions) {\n const scrollerElement = scrollerRef.current\n if (!scrollerElement || ('offsetHeight' in scrollerElement && scrollerElement.offsetHeight === 0)) {\n return\n }\n\n const isSmooth = location.behavior === 'smooth'\n\n let offsetHeight: number\n let scrollHeight: number\n let scrollTop: number\n\n if (scrollerElement === window) {\n // this is not a mistake\n scrollHeight = Math.max(correctItemSize(document.documentElement, 'height'), document.documentElement.scrollHeight)\n offsetHeight = window.innerHeight\n scrollTop = document.documentElement.scrollTop\n } else {\n scrollHeight = (scrollerElement as HTMLElement).scrollHeight\n offsetHeight = correctItemSize(scrollerElement as HTMLElement, 'height')\n scrollTop = (scrollerElement as HTMLElement).scrollTop\n }\n\n const maxScrollTop = scrollHeight - offsetHeight\n location.top = Math.ceil(Math.max(Math.min(maxScrollTop, location.top!), 0))\n\n // avoid system hanging because the DOM never called back\n // with the scrollTop\n // scroller is already at this location\n if (approximatelyEqual(offsetHeight, scrollHeight) || location.top === scrollTop) {\n scrollContainerStateCallback({ scrollTop, scrollHeight, viewportHeight: offsetHeight })\n if (isSmooth) {\n smoothScrollTargetReached(true)\n }\n return\n }\n\n if (isSmooth) {\n scrollTopTarget.current = location.top\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null\n scrollTopTarget.current = null\n smoothScrollTargetReached(true)\n }, 1000)\n } else {\n scrollTopTarget.current = null\n }\n\n scrollerElement.scrollTo(location)\n }\n\n function scrollByCallback(location: ScrollToOptions) {\n shouldFlushSync.current = true\n scrollerRef.current!.scrollBy(location)\n }\n\n return { scrollerRef, scrollByCallback, scrollToCallback }\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { ScrollContainerState } from './interfaces'\n\nexport const domIOSystem = u.system(\n () => {\n const scrollContainerState = u.stream<ScrollContainerState>()\n const scrollTop = u.stream<number>()\n const deviation = u.statefulStream(0)\n const smoothScrollTargetReached = u.stream<true>()\n const statefulScrollTop = u.statefulStream(0)\n const viewportHeight = u.stream<number>()\n const scrollHeight = u.stream<number>()\n const headerHeight = u.statefulStream(0)\n const fixedHeaderHeight = u.statefulStream(0)\n const footerHeight = u.statefulStream(0)\n const scrollTo = u.stream<ScrollToOptions>()\n const scrollBy = u.stream<ScrollToOptions>()\n const scrollingInProgress = u.statefulStream(false)\n // bogus, has no effect\n const react18ConcurrentRendering = u.statefulStream(false)\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollTop }) => scrollTop)\n ),\n scrollTop\n )\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollHeight }) => scrollHeight)\n ),\n scrollHeight\n )\n\n u.connect(scrollTop, statefulScrollTop)\n\n return {\n // input\n scrollContainerState,\n scrollTop,\n viewportHeight,\n headerHeight,\n fixedHeaderHeight,\n footerHeight,\n scrollHeight,\n smoothScrollTargetReached,\n react18ConcurrentRendering,\n\n // signals\n scrollTo,\n scrollBy,\n\n // state\n statefulScrollTop,\n deviation,\n scrollingInProgress,\n }\n },\n [],\n { singleton: true }\n)\n","interface NilNode {\n lvl: 0\n}\n\nconst NIL_NODE: NilNode = { lvl: 0 }\n\ninterface NodeData<T> {\n k: number\n v: T\n}\n\ninterface NonNilAANode<T> {\n k: number\n v: T\n lvl: number\n l: NonNilAANode<T> | NilNode\n r: NonNilAANode<T> | NilNode\n}\n\nexport interface Range<T> {\n start: number\n end: number\n value: T\n}\n\nexport type AANode<T> = NilNode | NonNilAANode<T>\n\nfunction newAANode<T>(k: number, v: T, lvl: number, l: AANode<T> = NIL_NODE, r: AANode<T> = NIL_NODE): NonNilAANode<T> {\n return { k, v, lvl, l, r }\n}\n\nexport function empty(node: AANode<any>): node is NilNode {\n return node === NIL_NODE\n}\n\nexport function newTree<T>(): AANode<T> {\n return NIL_NODE\n}\n\nexport function remove<T>(node: AANode<T>, key: number): AANode<T> {\n if (empty(node)) return NIL_NODE\n\n const { k, l, r } = node\n\n if (key === k) {\n if (empty(l)) {\n return r\n } else if (empty(r)) {\n return l\n } else {\n const [lastKey, lastValue] = last(l)\n return adjust(clone(node, { k: lastKey, v: lastValue, l: deleteLast(l) }))\n }\n } else if (key < k) {\n return adjust(clone(node, { l: remove(l, key) }))\n } else {\n return adjust(clone(node, { r: remove(r, key) }))\n }\n}\n\nexport function find<T>(node: AANode<T>, key: number): T | undefined {\n if (empty(node)) {\n return\n }\n\n if (key === node.k) {\n return node.v\n } else if (key < node.k) {\n return find(node.l, key)\n } else {\n return find(node.r, key)\n }\n}\n\nexport function findMaxKeyValue<T>(node: AANode<T>, value: number, field: 'k' | 'v' = 'k'): [number, T | undefined] {\n if (empty(node)) {\n return [-Infinity, undefined]\n }\n\n if (node[field] === value) {\n return [node.k, node.v]\n }\n\n if (node[field] < value) {\n const r = findMaxKeyValue(node.r, value, field)\n if (r[0] === -Infinity) {\n return [node.k, node.v]\n } else {\n return r\n }\n }\n\n return findMaxKeyValue(node.l, value, field)\n}\n\nexport function insert<T>(node: AANode<T>, k: number, v: T): NonNilAANode<T> {\n if (empty(node)) {\n return newAANode(k, v, 1)\n }\n if (k === node.k) {\n return clone(node, { k, v })\n } else if (k < node.k) {\n return rebalance(clone(node, { l: insert(node.l, k, v) }))\n } else {\n return rebalance(clone(node, { r: insert(node.r, k, v) }))\n }\n}\n\nexport function walkWithin<T>(node: AANode<T>, start: number, end: number): NodeData<T>[] {\n if (empty(node)) {\n return []\n }\n\n const { k, v, l, r } = node\n let result: NodeData<T>[] = []\n if (k > start) {\n result = result.concat(walkWithin(l, start, end))\n }\n\n if (k >= start && k <= end) {\n result.push({ k, v })\n }\n\n if (k <= end) {\n result = result.concat(walkWithin(r, start, end))\n }\n\n return result\n}\n\nexport function walk<T>(node: AANode<T>): NodeData<T>[] {\n if (empty(node)) {\n return []\n }\n\n return [...walk(node.l), { k: node.k, v: node.v }, ...walk(node.r)]\n}\n\nfunction last<T>(node: NonNilAANode<T>): [number, T] {\n return empty(node.r) ? [node.k, node.v] : last(node.r)\n}\n\nfunction deleteLast<T>(node: NonNilAANode<T>): AANode<T> {\n return empty(node.r) ? node.l : adjust(clone(node, { r: deleteLast(node.r) }))\n}\n\nfunction clone<T>(node: NonNilAANode<T>, args: Partial<NonNilAANode<T>>): NonNilAANode<T> {\n return newAANode(\n args.k !== undefined ? args.k : node.k,\n args.v !== undefined ? args.v : node.v,\n args.lvl !== undefined ? args.lvl : node.lvl,\n args.l !== undefined ? args.l : node.l,\n args.r !== undefined ? args.r : node.r\n )\n}\n\nfunction isSingle(node: AANode<any>) {\n return empty(node) || node.lvl > node.r.lvl\n}\n\nfunction rebalance<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n return split(skew(node))\n}\n\nfunction adjust<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { l, r, lvl } = node\n if (r.lvl >= lvl - 1 && l.lvl >= lvl - 1) {\n return node\n } else if (lvl > r.lvl + 1) {\n if (isSingle(l)) {\n return skew(clone(node, { lvl: lvl - 1 }))\n } else {\n if (!empty(l) && !empty(l.r)) {\n return clone(l.r, {\n l: clone(l, { r: l.r.l }),\n r: clone(node, {\n l: l.r.r,\n lvl: lvl - 1,\n }),\n lvl: lvl,\n })\n } else {\n throw new Error('Unexpected empty nodes')\n }\n }\n } else {\n if (isSingle(node)) {\n return split(clone(node, { lvl: lvl - 1 }))\n } else {\n if (!empty(r) && !empty(r.l)) {\n const rl = r.l\n const rlvl = isSingle(rl) ? r.lvl - 1 : r.lvl\n\n return clone(rl, {\n l: clone(node, {\n r: rl.l,\n lvl: lvl - 1,\n }),\n r: split(clone(r, { l: rl.r, lvl: rlvl })),\n lvl: rl.lvl + 1,\n })\n } else {\n throw new Error('Unexpected empty nodes')\n }\n }\n }\n}\n\nexport function keys(node: AANode<any>): number[] {\n if (empty(node)) {\n return []\n }\n return [...keys(node.l), node.k, ...keys(node.r)]\n}\n\nexport function ranges<T>(node: AANode<T>): Range<T>[] {\n return toRanges(walk(node))\n}\n\nexport function rangesWithin<T>(node: AANode<T>, startIndex: number, endIndex: number): Range<T>[] {\n if (empty(node)) {\n return []\n }\n const adjustedStart = findMaxKeyValue(node, startIndex)[0]\n return toRanges(walkWithin(node, adjustedStart, endIndex))\n}\n\nexport function arrayToRanges<T, V>(\n items: T[],\n parser: (item: T) => { index: number; value: V }\n): Array<{ start: number; end: number; value: V }> {\n const length = items.length\n if (length === 0) {\n return []\n }\n\n let { index: start, value } = parser(items[0])\n\n const result = []\n\n for (let i = 1; i < length; i++) {\n const { index: nextIndex, value: nextValue } = parser(items[i])\n result.push({ start, end: nextIndex - 1, value })\n\n start = nextIndex\n value = nextValue\n }\n\n result.push({ start, end: Infinity, value })\n return result\n}\n\nfunction toRanges<T>(nodes: NodeData<T>[]): Range<T>[] {\n return arrayToRanges(nodes, ({ k: index, v: value }) => ({ index, value }))\n}\n\nfunction split<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { r, lvl } = node\n\n return !empty(r) && !empty(r.r) && r.lvl === lvl && r.r.lvl === lvl ? clone(r, { l: clone(node, { r: r.l }), lvl: lvl + 1 }) : node\n}\n\nfunction skew<T>(node: NonNilAANode<T>): NonNilAANode<T> {\n const { l } = node\n\n return !empty(l) && l.lvl === node.lvl ? clone(l, { r: clone(node, { l: l.r }) }) : node\n}\n","export type Comparator<T> = {\n (item: T, value: number): -1 | 0 | 1\n}\n\nexport function findIndexOfClosestSmallerOrEqual<T>(items: T[], value: number, comparator: Comparator<T>, start = 0): number {\n let end = items.length - 1\n\n while (start <= end) {\n const index = Math.floor((start + end) / 2)\n const item = items[index]\n const match = comparator(item, value)\n if (match === 0) {\n return index\n }\n\n if (match === -1) {\n if (end - start < 2) {\n return index - 1\n }\n end = index - 1\n } else {\n if (end === start) {\n return index\n }\n start = index + 1\n }\n }\n\n throw new Error(`Failed binary finding record in array - ${items.join(',')}, searched for ${value}`)\n}\n\nexport function findClosestSmallerOrEqual<T>(items: T[], value: number, comparator: Comparator<T>): T {\n return items[findIndexOfClosestSmallerOrEqual(items, value, comparator)]\n}\n\nexport function findRange<T>(items: T[], startValue: number, endValue: number, comparator: Comparator<T>): T[] {\n const startIndex = findIndexOfClosestSmallerOrEqual(items, startValue, comparator)\n const endIndex = findIndexOfClosestSmallerOrEqual(items, endValue, comparator, startIndex)\n return items.slice(startIndex, endIndex + 1)\n}\n","import * as u from '@virtuoso.dev/urx'\n\nexport const recalcSystem = u.system(\n () => {\n const recalcInProgress = u.statefulStream(false)\n return { recalcInProgress }\n },\n [],\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { arrayToRanges, AANode, empty, findMaxKeyValue, insert, newTree, Range, rangesWithin, remove, walk } from './AATree'\nimport * as arrayBinarySearch from './utils/binaryArraySearch'\nimport { correctItemSize } from './utils/correctItemSize'\nimport { loggerSystem, Log, LogLevel } from './loggerSystem'\nimport { recalcSystem } from './recalcSystem'\n\nexport interface SizeRange {\n startIndex: number\n endIndex: number\n size: number\n}\n\nexport type Data = readonly unknown[] | undefined\n\nfunction rangeIncludes(refRange: SizeRange) {\n const { size, startIndex, endIndex } = refRange\n return (range: Range<number>) => {\n return range.start === startIndex && (range.end === endIndex || range.end === Infinity) && range.value === size\n }\n}\n\nexport function insertRanges(sizeTree: AANode<number>, ranges: SizeRange[]) {\n let syncStart = empty(sizeTree) ? 0 : Infinity\n\n for (const range of ranges) {\n const { size, startIndex, endIndex } = range\n syncStart = Math.min(syncStart, startIndex)\n\n if (empty(sizeTree)) {\n sizeTree = insert(sizeTree, 0, size)\n continue\n }\n\n // extend the range in both directions, so that we can get adjacent neighbours.\n // if the previous / next ones have the same value as the one we are about to insert,\n // we 'merge' them.\n const overlappingRanges = rangesWithin(sizeTree, startIndex - 1, endIndex + 1)\n\n if (overlappingRanges.some(rangeIncludes(range))) {\n continue\n }\n\n let firstPassDone = false\n let shouldInsert = false\n for (const { start: rangeStart, end: rangeEnd, value: rangeValue } of overlappingRanges) {\n // previous range\n if (!firstPassDone) {\n shouldInsert = rangeValue !== size\n firstPassDone = true\n } else {\n // remove the range if it starts within the new range OR if\n // it has the same value as it, in order to perform a merge\n if (endIndex >= rangeStart || size === rangeValue) {\n sizeTree = remove(sizeTree, rangeStart)\n }\n }\n\n // next range\n if (rangeEnd > endIndex && endIndex >= rangeStart) {\n if (rangeValue !== size) {\n sizeTree = insert(sizeTree, endIndex + 1, rangeValue)\n }\n }\n }\n\n if (shouldInsert) {\n sizeTree = insert(sizeTree, startIndex, size)\n }\n }\n return [sizeTree, syncStart] as const\n}\n\nexport interface OffsetPoint {\n offset: number\n size: number\n index: number\n}\n\nexport interface SizeState {\n sizeTree: AANode<number>\n offsetTree: Array<OffsetPoint>\n groupOffsetTree: AANode<number>\n lastIndex: number\n lastOffset: number\n lastSize: number\n groupIndices: number[]\n}\n\nexport function initialSizeState(): SizeState {\n return {\n offsetTree: [],\n sizeTree: newTree<number>(),\n groupOffsetTree: newTree<number>(),\n lastIndex: 0,\n lastOffset: 0,\n lastSize: 0,\n groupIndices: [],\n }\n}\n\nexport function indexComparator({ index: itemIndex }: OffsetPoint, index: number) {\n return index === itemIndex ? 0 : index < itemIndex ? -1 : 1\n}\n\nexport function offsetComparator({ offset: itemOffset }: OffsetPoint, offset: number) {\n return offset === itemOffset ? 0 : offset < itemOffset ? -1 : 1\n}\n\nfunction offsetPointParser(point: OffsetPoint) {\n return { index: point.index, value: point }\n}\n\nexport function rangesWithinOffsets(\n tree: Array<OffsetPoint>,\n startOffset: number,\n endOffset: number,\n minStartIndex = 0\n): Array<{\n start: number\n end: number\n value: {\n size: number\n offset: number\n index: number\n }\n}> {\n if (minStartIndex > 0) {\n startOffset = Math.max(startOffset, arrayBinarySearch.findClosestSmallerOrEqual(tree, minStartIndex, indexComparator).offset)\n }\n\n return arrayToRanges(arrayBinarySearch.findRange(tree, startOffset, endOffset, offsetComparator), offsetPointParser)\n}\n\nfunction createOffsetTree(prevOffsetTree: OffsetPoint[], syncStart: number, sizeTree: AANode<number>, gap: number) {\n let offsetTree = prevOffsetTree\n let prevIndex = 0\n let prevSize = 0\n\n let prevOffset = 0\n let startIndex = 0\n\n if (syncStart !== 0) {\n startIndex = arrayBinarySearch.findIndexOfClosestSmallerOrEqual(offsetTree, syncStart - 1, indexComparator)\n const offsetInfo = offsetTree[startIndex]\n prevOffset = offsetInfo.offset\n const kv = findMaxKeyValue(sizeTree, syncStart - 1)\n prevIndex = kv[0]\n prevSize = kv[1]!\n\n if (offsetTree.length && offsetTree[startIndex].size === findMaxKeyValue(sizeTree, syncStart)[1]) {\n startIndex -= 1\n }\n\n offsetTree = offsetTree.slice(0, startIndex + 1)\n } else {\n offsetTree = []\n }\n\n for (const { start: startIndex, value } of rangesWithin(sizeTree, syncStart, Infinity)) {\n const indexOffset = startIndex - prevIndex\n const aOffset = indexOffset * prevSize + prevOffset + indexOffset * gap\n offsetTree.push({\n offset: aOffset,\n size: value,\n index: startIndex,\n })\n prevIndex = startIndex\n prevOffset = aOffset\n prevSize = value\n }\n\n return {\n offsetTree,\n lastIndex: prevIndex,\n lastOffset: prevOffset,\n lastSize: prevSize,\n }\n}\n\nexport function sizeStateReducer(state: SizeState, [ranges, groupIndices, log, gap]: [SizeRange[], number[], Log, number]) {\n if (ranges.length > 0) {\n log('received item sizes', ranges, LogLevel.DEBUG)\n }\n const sizeTree = state.sizeTree\n let newSizeTree: AANode<number> = sizeTree\n let syncStart = 0\n\n // We receive probe item results from a group probe,\n // which should always pass an item and a group\n // the results contain two ranges, which we consider to mean that groups and items have different size\n if (groupIndices.length > 0 && empty(sizeTree) && ranges.length === 2) {\n const groupSize = ranges[0].size\n const itemSize = ranges[1].size\n newSizeTree = groupIndices.reduce((tree, groupIndex) => {\n return insert(insert(tree, groupIndex, groupSize), groupIndex + 1, itemSize)\n }, newSizeTree)\n } else {\n ;[newSizeTree, syncStart] = insertRanges(newSizeTree, ranges)\n }\n\n if (newSizeTree === sizeTree) {\n return state\n }\n\n const { offsetTree: newOffsetTree, lastIndex, lastSize, lastOffset } = createOffsetTree(state.offsetTree, syncStart, newSizeTree, gap)\n\n return {\n sizeTree: newSizeTree,\n offsetTree: newOffsetTree,\n lastIndex,\n lastOffset,\n lastSize,\n groupOffsetTree: groupIndices.reduce((tree, index) => {\n return insert(tree, index, offsetOf(index, newOffsetTree, gap))\n }, newTree<number>()),\n groupIndices,\n }\n}\n\nexport function offsetOf(index: number, tree: Array<OffsetPoint>, gap: number) {\n if (tree.length === 0) {\n return 0\n }\n\n const { offset, index: startIndex, size } = arrayBinarySearch.findClosestSmallerOrEqual(tree, index, indexComparator)\n const itemCount = index - startIndex\n const top = size * itemCount + (itemCount - 1) * gap + offset\n return top > 0 ? top + gap : top\n}\n\nexport type FlatOrGroupedLocation = { index: number | 'LAST' } | { groupIndex: number }\n\nexport function isGroupLocation(location: FlatOrGroupedLocation): location is { groupIndex: number } {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return typeof (location as any).groupIndex !== 'undefined'\n}\n\nexport function originalIndexFromLocation(location: FlatOrGroupedLocation, sizes: SizeState, lastIndex: number) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isGroupLocation(location)) {\n // return the index of the first item below the index\n return sizes.groupIndices[location.groupIndex] + 1\n } else {\n const numericIndex = location.index === 'LAST' ? lastIndex : location.index\n let result = originalIndexFromItemIndex(numericIndex, sizes)\n result = Math.max(0, result, Math.min(lastIndex, result))\n return result\n }\n}\n\nexport function originalIndexFromItemIndex(itemIndex: number, sizes: SizeState) {\n if (!hasGroups(sizes)) {\n return itemIndex\n }\n\n let groupOffset = 0\n while (sizes.groupIndices[groupOffset] <= itemIndex + groupOffset) {\n groupOffset++\n }\n // we find the real item index, offsetting it by the number of group items before it\n return itemIndex + groupOffset\n}\n\nexport function hasGroups(sizes: SizeState) {\n return !empty(sizes.groupOffsetTree)\n}\n\ntype OptionalNumber = number | undefined\n\nconst SIZE_MAP = {\n offsetHeight: 'height',\n offsetWidth: 'width',\n} as const\n\n/** Calculates the height of `el`, which will be the `Item` element in the DOM. */\nexport type SizeFunction = (el: HTMLElement, field: 'offsetHeight' | 'offsetWidth') => number\n\nexport const sizeSystem = u.system(\n ([{ log }, { recalcInProgress }]) => {\n const sizeRanges = u.stream<SizeRange[]>()\n const totalCount = u.stream<number>()\n const statefulTotalCount = u.statefulStreamFromEmitter(totalCount, 0)\n const unshiftWith = u.stream<number>()\n const shiftWith = u.stream<number>()\n const firstItemIndex = u.statefulStream(0)\n const groupIndices = u.statefulStream([] as number[])\n const fixedItemSize = u.statefulStream<OptionalNumber>(undefined)\n const defaultItemSize = u.statefulStream<OptionalNumber>(undefined)\n const itemSize = u.statefulStream<SizeFunction>((el, field) => correctItemSize(el, SIZE_MAP[field]))\n const data = u.statefulStream<Data>(undefined)\n const gap = u.statefulStream(0)\n const initial = initialSizeState()\n\n const sizes = u.statefulStreamFromEmitter(\n u.pipe(sizeRanges, u.withLatestFrom(groupIndices, log, gap), u.scan(sizeStateReducer, initial), u.distinctUntilChanged()),\n initial\n )\n\n u.connect(\n u.pipe(\n groupIndices,\n u.filter((indexes) => indexes.length > 0),\n u.withLatestFrom(sizes, gap),\n u.map(([groupIndices, sizes, gap]) => {\n const groupOffsetTree = groupIndices.reduce((tree, index, idx) => {\n return insert(tree, index, offsetOf(index, sizes.offsetTree, gap) || idx)\n }, newTree<number>())\n\n return {\n ...sizes,\n groupIndices,\n groupOffsetTree,\n }\n })\n ),\n sizes\n )\n\n // decreasing the total count should remove any existing entries\n // beyond the last index - do this by publishing the default size as a range over them.\n u.connect(\n u.pipe(\n totalCount,\n u.withLatestFrom(sizes),\n u.filter(([totalCount, { lastIndex }]) => {\n return totalCount < lastIndex\n }),\n u.map(([totalCount, { lastIndex, lastSize }]) => {\n return [\n {\n startIndex: totalCount,\n endIndex: lastIndex,\n size: lastSize,\n },\n ] as SizeRange[]\n })\n ),\n sizeRanges\n )\n\n u.connect(fixedItemSize, defaultItemSize)\n\n const trackItemSizes = u.statefulStreamFromEmitter(\n u.pipe(\n fixedItemSize,\n u.map((size) => size === undefined)\n ),\n true\n )\n\n u.connect(\n u.pipe(\n defaultItemSize,\n u.filter((value) => {\n return value !== undefined && empty(u.getValue(sizes).sizeTree)\n }),\n u.map((size) => [{ startIndex: 0, endIndex: 0, size }] as SizeRange[])\n ),\n sizeRanges\n )\n\n const listRefresh = u.streamFromEmitter(\n u.pipe(\n sizeRanges,\n u.withLatestFrom(sizes),\n u.scan(\n ({ sizes: oldSizes }, [_, newSizes]) => {\n return {\n changed: newSizes !== oldSizes,\n sizes: newSizes,\n }\n },\n { changed: false, sizes: initial }\n ),\n u.map((value) => value.changed)\n )\n )\n\n u.subscribe(\n u.pipe(\n firstItemIndex,\n u.scan(\n (prev, next) => {\n return { diff: prev.prev - next, prev: next }\n },\n { diff: 0, prev: 0 }\n ),\n u.map((val) => val.diff)\n ),\n (offset) => {\n if (offset > 0) {\n u.publish(recalcInProgress, true)\n u.publish(unshiftWith, offset)\n } else if (offset < 0) {\n u.publish(shiftWith, offset)\n }\n }\n )\n\n u.subscribe(u.pipe(firstItemIndex, u.withLatestFrom(log)), ([index, log]) => {\n if (index < 0) {\n log(\n \"`firstItemIndex` prop should not be set to less than zero. If you don't know the total count, just use a very high value\",\n { firstItemIndex },\n LogLevel.ERROR\n )\n }\n })\n\n // Capture the current list top item before the sizes get refreshed\n const beforeUnshiftWith = u.streamFromEmitter(unshiftWith)\n\n u.connect(\n u.pipe(\n unshiftWith,\n u.withLatestFrom(sizes),\n u.map(([unshiftWith, sizes]) => {\n if (sizes.groupIndices.length > 0) {\n throw new Error('Virtuoso: prepending items does not work with groups')\n }\n\n return walk(sizes.sizeTree).reduce(\n (acc, { k: index, v: size }) => {\n return {\n ranges: [...acc.ranges, { startIndex: acc.prevIndex, endIndex: index + unshiftWith - 1, size: acc.prevSize }],\n prevIndex: index + unshiftWith,\n prevSize: size,\n }\n },\n {\n ranges: [] as SizeRange[],\n prevIndex: 0,\n prevSize: sizes.lastSize,\n }\n ).ranges\n })\n ),\n sizeRanges\n )\n\n const shiftWithOffset = u.streamFromEmitter(\n u.pipe(\n shiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([shiftWith, { offsetTree }, gap]) => {\n const newFirstItemIndex = -shiftWith\n return offsetOf(newFirstItemIndex, offsetTree, gap)\n })\n )\n )\n\n u.connect(\n u.pipe(\n shiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([shiftWith, sizes, gap]) => {\n if (sizes.groupIndices.length > 0) {\n throw new Error('Virtuoso: shifting items does not work with groups')\n }\n\n const newSizeTree = walk(sizes.sizeTree).reduce((acc, { k, v }) => {\n return insert(acc, Math.max(0, k + shiftWith), v)\n }, newTree<number>())\n\n return {\n ...sizes,\n sizeTree: newSizeTree,\n ...createOffsetTree(sizes.offsetTree, 0, newSizeTree, gap),\n }\n })\n ),\n sizes\n )\n\n return {\n // input\n data,\n totalCount,\n sizeRanges,\n groupIndices,\n defaultItemSize,\n fixedItemSize,\n unshiftWith,\n shiftWith,\n shiftWithOffset,\n beforeUnshiftWith,\n firstItemIndex,\n gap,\n\n // output\n sizes,\n listRefresh,\n statefulTotalCount,\n trackItemSizes,\n itemSize,\n }\n },\n u.tup(loggerSystem, recalcSystem),\n { singleton: true }\n)\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport * as u from '@virtuoso.dev/urx'\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { offsetOf, originalIndexFromLocation, sizeSystem } from './sizeSystem'\nimport { IndexLocationWithAlign } from './interfaces'\nimport { loggerSystem, LogLevel } from './loggerSystem'\n\nexport type IndexLocation = number | IndexLocationWithAlign\n\nconst SUPPORTS_SCROLL_TO_OPTIONS = typeof document !== 'undefined' && 'scrollBehavior' in document.documentElement.style\n\nexport function normalizeIndexLocation(location: IndexLocation) {\n const result: IndexLocationWithAlign = typeof location === 'number' ? { index: location } : location\n\n if (!result.align) {\n result.align = 'start'\n }\n if (!result.behavior || !SUPPORTS_SCROLL_TO_OPTIONS) {\n result.behavior = 'auto'\n }\n if (!result.offset) {\n result.offset = 0\n }\n\n return result\n}\n\nexport const scrollToIndexSystem = u.system(\n ([\n { sizes, totalCount, listRefresh, gap },\n { scrollingInProgress, viewportHeight, scrollTo, smoothScrollTargetReached, headerHeight, footerHeight },\n { log },\n ]) => {\n const scrollToIndex = u.stream<IndexLocation>()\n const topListHeight = u.statefulStream(0)\n\n let unsubscribeNextListRefresh: any = null\n let cleartTimeoutRef: ReturnType<typeof setTimeout> | null = null\n let unsubscribeListRefresh: any = null\n\n function cleanup() {\n if (unsubscribeNextListRefresh) {\n unsubscribeNextListRefresh()\n unsubscribeNextListRefresh = null\n }\n\n if (unsubscribeListRefresh) {\n unsubscribeListRefresh()\n unsubscribeListRefresh = null\n }\n\n if (cleartTimeoutRef) {\n clearTimeout(cleartTimeoutRef)\n cleartTimeoutRef = null\n }\n u.publish(scrollingInProgress, false)\n }\n\n u.connect(\n u.pipe(\n scrollToIndex,\n u.withLatestFrom(sizes, viewportHeight, totalCount, topListHeight, headerHeight, footerHeight, log),\n u.withLatestFrom(gap),\n u.map(([[location, sizes, viewportHeight, totalCount, topListHeight, headerHeight, footerHeight, log], gap]) => {\n const normalLocation = normalizeIndexLocation(location)\n const { align, behavior, offset } = normalLocation\n const lastIndex = totalCount - 1\n\n const index = originalIndexFromLocation(normalLocation, sizes, lastIndex)\n\n let top = offsetOf(index, sizes.offsetTree, gap) + headerHeight\n if (align === 'end') {\n top = top - viewportHeight + findMaxKeyValue(sizes.sizeTree, index)[1]!\n if (index === lastIndex) {\n top += footerHeight\n }\n } else if (align === 'center') {\n top = top - viewportHeight / 2 + findMaxKeyValue(sizes.sizeTree, index)[1]! / 2\n } else {\n top -= topListHeight\n }\n\n if (offset) {\n top += offset\n }\n\n const retry = (listChanged: boolean) => {\n cleanup()\n if (listChanged) {\n log('retrying to scroll to', { location }, LogLevel.DEBUG)\n u.publish(scrollToIndex, location)\n } else {\n log('list did not change, scroll successful', {}, LogLevel.DEBUG)\n }\n }\n\n cleanup()\n\n if (behavior === 'smooth') {\n let listChanged = false\n unsubscribeListRefresh = u.subscribe(listRefresh, (changed) => {\n listChanged = listChanged || changed\n })\n\n unsubscribeNextListRefresh = u.handleNext(smoothScrollTargetReached, () => {\n retry(listChanged)\n })\n } else {\n unsubscribeNextListRefresh = u.handleNext(u.pipe(listRefresh, watchChangesFor(150)), retry)\n }\n\n // if the scroll jump is too small, the list won't get rerendered.\n // clean this listener\n cleartTimeoutRef = setTimeout(() => {\n cleanup()\n }, 1200)\n\n u.publish(scrollingInProgress, true)\n log('scrolling from index to', { index, top, behavior }, LogLevel.DEBUG)\n return { top, behavior }\n })\n ),\n scrollTo\n )\n\n return {\n scrollToIndex,\n topListHeight,\n }\n },\n u.tup(sizeSystem, domIOSystem, loggerSystem),\n { singleton: true }\n)\n\nfunction watchChangesFor(limit: number): u.Operator<boolean> {\n return (done) => {\n const timeoutRef = setTimeout(() => {\n done(false)\n }, limit)\n return (value) => {\n if (value) {\n done(true)\n clearTimeout(timeoutRef)\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { approximatelyEqual } from './utils/approximatelyEqual'\n\nexport const UP = 'up' as const\nexport const DOWN = 'down' as const\nexport const NONE = 'none' as const\nexport type ScrollDirection = typeof UP | typeof DOWN | typeof NONE\n\nexport interface ListBottomInfo {\n bottom: number\n offsetBottom: number\n}\n\nexport interface AtBottomParams {\n offsetBottom: number\n scrollTop: number\n viewportHeight: number\n scrollHeight: number\n}\n\nexport type NotAtBottomReason =\n | 'SIZE_INCREASED'\n | 'NOT_SHOWING_LAST_ITEM'\n | 'VIEWPORT_HEIGHT_DECREASING'\n | 'SCROLLING_UPWARDS'\n | 'NOT_FULLY_SCROLLED_TO_LAST_ITEM_BOTTOM'\n\nexport type AtBottomReason = 'SIZE_DECREASED' | 'SCROLLED_DOWN'\n\nexport type AtBottomState =\n | {\n atBottom: false\n notAtBottomBecause: NotAtBottomReason\n state: AtBottomParams\n }\n | {\n atBottom: true\n state: AtBottomParams\n atBottomBecause: AtBottomReason\n scrollTopDelta: number\n }\n\nconst INITIAL_BOTTOM_STATE = {\n atBottom: false,\n notAtBottomBecause: 'NOT_SHOWING_LAST_ITEM',\n state: {\n offsetBottom: 0,\n scrollTop: 0,\n viewportHeight: 0,\n scrollHeight: 0,\n },\n} as AtBottomState\n\nconst DEFAULT_AT_TOP_THRESHOLD = 0\n\nexport const stateFlagsSystem = u.system(([{ scrollContainerState, scrollTop, viewportHeight, headerHeight, footerHeight, scrollBy }]) => {\n const isAtBottom = u.statefulStream(false)\n const isAtTop = u.statefulStream(true)\n const atBottomStateChange = u.stream<boolean>()\n const atTopStateChange = u.stream<boolean>()\n const atBottomThreshold = u.statefulStream(4)\n const atTopThreshold = u.statefulStream(DEFAULT_AT_TOP_THRESHOLD)\n\n // skip 1 to avoid an initial on/off flick\n const isScrolling = u.statefulStreamFromEmitter(\n u.pipe(\n u.merge(u.pipe(u.duc(scrollTop), u.skip(1), u.mapTo(true)), u.pipe(u.duc(scrollTop), u.skip(1), u.mapTo(false), u.debounceTime(100))),\n u.distinctUntilChanged()\n ),\n false\n )\n\n const isScrollingBy = u.statefulStreamFromEmitter(\n u.pipe(u.merge(u.pipe(scrollBy, u.mapTo(true)), u.pipe(scrollBy, u.mapTo(false), u.debounceTime(200))), u.distinctUntilChanged()),\n false\n )\n\n // u.subscribe(isScrollingBy, (isScrollingBy) => console.log({ isScrollingBy }))\n\n u.connect(\n u.pipe(\n u.combineLatest(u.duc(scrollTop), u.duc(atTopThreshold)),\n u.map(([top, atTopThreshold]) => top <= atTopThreshold),\n u.distinctUntilChanged()\n ),\n isAtTop\n )\n\n u.connect(u.pipe(isAtTop, u.throttleTime(50)), atTopStateChange)\n\n const atBottomState = u.streamFromEmitter(\n u.pipe(\n u.combineLatest(scrollContainerState, u.duc(viewportHeight), u.duc(headerHeight), u.duc(footerHeight), u.duc(atBottomThreshold)),\n u.scan((current, [{ scrollTop, scrollHeight }, viewportHeight, _headerHeight, _footerHeight, atBottomThreshold]) => {\n const isAtBottom = scrollTop + viewportHeight - scrollHeight > -atBottomThreshold\n const state = {\n viewportHeight,\n scrollTop,\n scrollHeight,\n }\n\n if (isAtBottom) {\n let atBottomBecause: 'SIZE_DECREASED' | 'SCROLLED_DOWN'\n let scrollTopDelta: number\n if (scrollTop > current.state.scrollTop) {\n atBottomBecause = 'SCROLLED_DOWN'\n scrollTopDelta = current.state.scrollTop - scrollTop\n } else {\n atBottomBecause = 'SIZE_DECREASED'\n scrollTopDelta = current.state.scrollTop - scrollTop || (current as { scrollTopDelta: number }).scrollTopDelta\n }\n return {\n atBottom: true,\n state,\n atBottomBecause,\n scrollTopDelta,\n } as AtBottomState\n }\n\n let notAtBottomBecause: NotAtBottomReason\n\n if (state.scrollHeight > current.state.scrollHeight) {\n notAtBottomBecause = 'SIZE_INCREASED'\n } else if (viewportHeight < current.state.viewportHeight) {\n notAtBottomBecause = 'VIEWPORT_HEIGHT_DECREASING'\n } else if (scrollTop < current.state.scrollTop) {\n notAtBottomBecause = 'SCROLLING_UPWARDS'\n } else {\n notAtBottomBecause = 'NOT_FULLY_SCROLLED_TO_LAST_ITEM_BOTTOM'\n }\n\n return {\n atBottom: false,\n notAtBottomBecause,\n state,\n } as AtBottomState\n }, INITIAL_BOTTOM_STATE),\n u.distinctUntilChanged((prev, next) => {\n return prev && prev.atBottom === next.atBottom\n })\n )\n )\n\n const lastJumpDueToItemResize = u.statefulStreamFromEmitter(\n u.pipe(\n scrollContainerState,\n u.scan(\n (current, { scrollTop, scrollHeight, viewportHeight }) => {\n if (!approximatelyEqual(current.scrollHeight, scrollHeight)) {\n const atBottom = scrollHeight - (scrollTop + viewportHeight) < 1\n\n if (current.scrollTop !== scrollTop && atBottom) {\n return {\n scrollHeight,\n scrollTop,\n jump: current.scrollTop - scrollTop,\n changed: true,\n }\n } else {\n return {\n scrollHeight,\n scrollTop,\n jump: 0,\n changed: true,\n }\n }\n } else {\n return {\n scrollTop,\n scrollHeight,\n jump: 0,\n changed: false,\n }\n }\n },\n { scrollHeight: 0, jump: 0, scrollTop: 0, changed: false }\n ),\n u.filter((value) => value.changed),\n u.map((value) => value.jump)\n ),\n 0\n )\n\n u.connect(\n u.pipe(\n atBottomState,\n u.map((state) => state.atBottom)\n ),\n isAtBottom\n )\n\n u.connect(u.pipe(isAtBottom, u.throttleTime(50)), atBottomStateChange)\n\n const scrollDirection = u.statefulStream<ScrollDirection>(DOWN)\n\n u.connect(\n u.pipe(\n scrollContainerState,\n u.map(({ scrollTop }) => scrollTop),\n u.distinctUntilChanged(),\n u.scan(\n (acc, scrollTop) => {\n // if things change while compensating for items, ignore,\n // but store the new scrollTop\n if (u.getValue(isScrollingBy)) {\n return { direction: acc.direction, prevScrollTop: scrollTop }\n }\n\n return { direction: scrollTop < acc.prevScrollTop ? UP : DOWN, prevScrollTop: scrollTop }\n },\n { direction: DOWN, prevScrollTop: 0 } as { direction: ScrollDirection; prevScrollTop: number }\n ),\n u.map((value) => value.direction)\n ),\n scrollDirection\n )\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.connect(u.pipe(scrollContainerState, u.throttleTime(50), u.mapTo(NONE)), scrollDirection)\n\n const scrollVelocity = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n isScrolling,\n u.filter((value) => !value),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(0)\n ),\n scrollVelocity\n )\n\n u.connect(\n u.pipe(\n scrollTop,\n u.throttleTime(100),\n u.withLatestFrom(isScrolling),\n u.filter(([_, isScrolling]) => !!isScrolling),\n u.scan(([_, prev], [next]) => [prev, next], [0, 0]),\n u.map(([prev, next]) => next - prev)\n ),\n scrollVelocity\n )\n\n return {\n isScrolling,\n isAtTop,\n isAtBottom,\n atBottomState,\n atTopStateChange,\n atBottomStateChange,\n scrollDirection,\n atBottomThreshold,\n atTopThreshold,\n scrollVelocity,\n lastJumpDueToItemResize,\n }\n}, u.tup(domIOSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { loggerSystem, LogLevel } from './loggerSystem'\n\nexport const propsReadySystem = u.system(\n ([{ log }]) => {\n const propsReady = u.statefulStream(false)\n\n const didMount = u.streamFromEmitter(\n u.pipe(\n propsReady,\n u.filter((ready) => ready),\n u.distinctUntilChanged()\n )\n )\n u.subscribe(propsReady, (value) => {\n value && u.getValue(log)('props updated', {}, LogLevel.DEBUG)\n })\n\n return { propsReady, didMount }\n },\n u.tup(loggerSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { empty } from './AATree'\nimport { sizeSystem } from './sizeSystem'\nimport { domIOSystem } from './domIOSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { FlatIndexLocationWithAlign } from './interfaces'\n\nexport function getInitialTopMostItemIndexNumber(location: number | FlatIndexLocationWithAlign, totalCount: number): number {\n const lastIndex = totalCount - 1\n const index = typeof location === 'number' ? location : location.index === 'LAST' ? lastIndex : location.index\n return index\n}\n\nexport const initialTopMostItemIndexSystem = u.system(\n ([{ sizes, listRefresh, defaultItemSize }, { scrollTop }, { scrollToIndex }, { didMount }]) => {\n const scrolledToInitialItem = u.statefulStream(true)\n const initialTopMostItemIndex = u.statefulStream<number | FlatIndexLocationWithAlign>(0)\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialTopMostItemIndex),\n u.filter(([_, location]) => !!location),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(false)\n ),\n scrolledToInitialItem\n )\n\n u.subscribe(\n u.pipe(\n u.combineLatest(listRefresh, didMount),\n u.withLatestFrom(scrolledToInitialItem, sizes, defaultItemSize),\n u.filter(([[, didMount], scrolledToInitialItem, { sizeTree }, defaultItemSize]) => {\n return didMount && (!empty(sizeTree) || defaultItemSize !== undefined) && !scrolledToInitialItem\n }),\n u.withLatestFrom(initialTopMostItemIndex)\n ),\n ([, initialTopMostItemIndex]) => {\n setTimeout(() => {\n u.handleNext(scrollTop, () => {\n u.publish(scrolledToInitialItem, true)\n })\n u.publish(scrollToIndex, initialTopMostItemIndex)\n })\n }\n )\n\n return {\n scrolledToInitialItem,\n initialTopMostItemIndex,\n }\n },\n u.tup(sizeSystem, domIOSystem, scrollToIndexSystem, propsReadySystem),\n { singleton: true }\n)\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport * as u from '@virtuoso.dev/urx'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { FollowOutput, FollowOutputScalarType } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { loggerSystem, LogLevel } from './loggerSystem'\nimport { domIOSystem } from './domIOSystem'\n\nfunction normalizeFollowOutput(follow: FollowOutputScalarType): FollowOutputScalarType {\n if (!follow) {\n return false\n }\n return follow === 'smooth' ? 'smooth' : 'auto'\n}\n\nconst behaviorFromFollowOutput = (follow: FollowOutput, isAtBottom: boolean) => {\n if (typeof follow === 'function') {\n return normalizeFollowOutput(follow(isAtBottom))\n }\n return isAtBottom && normalizeFollowOutput(follow)\n}\n\nexport const followOutputSystem = u.system(\n ([\n { totalCount, listRefresh },\n { isAtBottom, atBottomState },\n { scrollToIndex },\n { scrolledToInitialItem },\n { propsReady, didMount },\n { log },\n { scrollingInProgress },\n ]) => {\n const followOutput = u.statefulStream<FollowOutput>(false)\n const autoscrollToBottom = u.stream<true>()\n let pendingScrollHandle: any = null\n\n function scrollToBottom(followOutputBehavior: FollowOutputScalarType) {\n u.publish(scrollToIndex, {\n index: 'LAST',\n align: 'end',\n behavior: followOutputBehavior,\n })\n }\n\n u.subscribe(\n u.pipe(\n u.combineLatest(u.pipe(u.duc(totalCount), u.skip(1)), didMount),\n u.withLatestFrom(u.duc(followOutput), isAtBottom, scrolledToInitialItem, scrollingInProgress),\n u.map(([[totalCount, didMount], followOutput, isAtBottom, scrolledToInitialItem, scrollingInProgress]) => {\n let shouldFollow = didMount && scrolledToInitialItem\n let followOutputBehavior: FollowOutputScalarType = 'auto'\n\n if (shouldFollow) {\n // if scrolling to index is in progress,\n // assume that a previous followOutput response is going\n followOutputBehavior = behaviorFromFollowOutput(followOutput, isAtBottom || scrollingInProgress)\n shouldFollow = shouldFollow && !!followOutputBehavior\n }\n\n return { totalCount, shouldFollow, followOutputBehavior }\n }),\n u.filter(({ shouldFollow }) => shouldFollow)\n ),\n ({ totalCount, followOutputBehavior }) => {\n if (pendingScrollHandle) {\n pendingScrollHandle()\n pendingScrollHandle = null\n }\n\n pendingScrollHandle = u.handleNext(listRefresh, () => {\n u.getValue(log)('following output to ', { totalCount }, LogLevel.DEBUG)\n scrollToBottom(followOutputBehavior)\n pendingScrollHandle = null\n })\n }\n )\n\n function trapNextSizeIncrease(followOutput: boolean) {\n const cancel = u.handleNext(atBottomState, (state) => {\n if (followOutput && !state.atBottom && state.notAtBottomBecause === 'SIZE_INCREASED' && !pendingScrollHandle) {\n u.getValue(log)('scrolling to bottom due to increased size', {}, LogLevel.DEBUG)\n scrollToBottom('auto')\n }\n })\n setTimeout(cancel, 100)\n }\n\n u.subscribe(\n u.pipe(\n u.combineLatest(u.duc(followOutput), totalCount, propsReady),\n u.filter(([follow, , ready]) => follow && ready),\n u.scan(\n ({ value }, [, next]) => {\n return { refreshed: value === next, value: next }\n },\n { refreshed: false, value: 0 }\n ),\n u.filter(({ refreshed }) => refreshed),\n u.withLatestFrom(followOutput, totalCount)\n ),\n ([, followOutput]) => {\n trapNextSizeIncrease(followOutput !== false)\n }\n )\n\n u.subscribe(autoscrollToBottom, () => {\n trapNextSizeIncrease(u.getValue(followOutput) !== false)\n })\n\n u.subscribe(u.combineLatest(u.duc(followOutput), atBottomState), ([followOutput, state]) => {\n if (followOutput && !state.atBottom && state.notAtBottomBecause === 'VIEWPORT_HEIGHT_DECREASING') {\n scrollToBottom('auto')\n }\n })\n\n return { followOutput, autoscrollToBottom }\n },\n u.tup(sizeSystem, stateFlagsSystem, scrollToIndexSystem, initialTopMostItemIndexSystem, propsReadySystem, loggerSystem, domIOSystem)\n)\n","import * as u from '@virtuoso.dev/urx'\n\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { sizeSystem, hasGroups } from './sizeSystem'\nexport interface GroupIndexesAndCount {\n totalCount: number\n groupIndices: number[]\n}\n\nexport function groupCountsToIndicesAndCount(counts: number[]) {\n return counts.reduce(\n (acc, groupCount) => {\n acc.groupIndices.push(acc.totalCount)\n acc.totalCount += groupCount + 1\n return acc\n },\n {\n totalCount: 0,\n groupIndices: [],\n } as GroupIndexesAndCount\n )\n}\n\nexport const groupedListSystem = u.system(([{ totalCount, groupIndices, sizes }, { scrollTop, headerHeight }]) => {\n const groupCounts = u.stream<number[]>()\n const topItemsIndexes = u.stream<[number]>()\n const groupIndicesAndCount = u.streamFromEmitter(u.pipe(groupCounts, u.map(groupCountsToIndicesAndCount)))\n u.connect(\n u.pipe(\n groupIndicesAndCount,\n u.map((value) => value.totalCount)\n ),\n totalCount\n )\n u.connect(\n u.pipe(\n groupIndicesAndCount,\n u.map((value) => value.groupIndices)\n ),\n groupIndices\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(scrollTop, sizes, headerHeight),\n u.filter(([_, sizes]) => hasGroups(sizes)),\n u.map(([scrollTop, state, headerHeight]) => findMaxKeyValue(state.groupOffsetTree, Math.max(scrollTop - headerHeight, 0), 'v')[0]),\n u.distinctUntilChanged(),\n u.map((index) => [index])\n ),\n topItemsIndexes\n )\n\n return { groupCounts, topItemsIndexes }\n}, u.tup(sizeSystem, domIOSystem))\n","import { ListRange } from './interfaces'\n\nexport function tupleComparator<T1, T2>(prev: [T1, T2] | undefined, current: [T1, T2]) {\n return !!(prev && prev[0] === current[0] && prev[1] === current[1])\n}\n\nexport function rangeComparator(prev: ListRange | undefined, next: ListRange) {\n return !!(prev && prev.startIndex === next.startIndex && prev.endIndex === next.endIndex)\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { UP, DOWN, ScrollDirection } from './stateFlagsSystem'\nimport { tupleComparator } from './comparators'\n\nexport type NumberTuple = [number, number]\nexport type Overscan = number | { main: number; reverse: number }\nexport const TOP = 'top' as const\nexport const BOTTOM = 'bottom' as const\nexport const NONE = 'none' as const\nexport type ListEnd = typeof TOP | typeof BOTTOM\nexport type ViewportIncrease = number | { [k in ListEnd]?: number }\nexport type ChangeDirection = typeof UP | typeof DOWN | typeof NONE\n\nexport function getOverscan(overscan: Overscan, end: ListEnd, direction: ScrollDirection) {\n if (typeof overscan === 'number') {\n return (direction === UP && end === TOP) || (direction === DOWN && end === BOTTOM) ? overscan : 0\n } else {\n if (direction === UP) {\n return end === TOP ? overscan.main : overscan.reverse\n } else {\n return end === BOTTOM ? overscan.main : overscan.reverse\n }\n }\n}\n\nfunction getViewportIncrease(value: ViewportIncrease, end: ListEnd) {\n return typeof value === 'number' ? value : value[end] || 0\n}\n\nexport const sizeRangeSystem = u.system(\n ([{ scrollTop, viewportHeight, deviation, headerHeight, fixedHeaderHeight }]) => {\n const listBoundary = u.stream<NumberTuple>()\n const topListHeight = u.statefulStream(0)\n const increaseViewportBy = u.statefulStream<ViewportIncrease>(0)\n const overscan = u.statefulStream<Overscan>(0)\n\n const visibleRange = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(\n u.duc(scrollTop),\n u.duc(viewportHeight),\n u.duc(headerHeight),\n u.duc(listBoundary, tupleComparator),\n u.duc(overscan),\n u.duc(topListHeight),\n u.duc(fixedHeaderHeight),\n u.duc(deviation),\n u.duc(increaseViewportBy)\n ),\n u.map(\n ([\n scrollTop,\n viewportHeight,\n headerHeight,\n [listTop, listBottom],\n overscan,\n topListHeight,\n fixedHeaderHeight,\n deviation,\n increaseViewportBy,\n ]) => {\n const top = scrollTop - deviation\n const stickyHeaderHeight = topListHeight + fixedHeaderHeight\n const headerVisible = Math.max(headerHeight - top, 0)\n let direction: ChangeDirection = NONE\n const topViewportAddition = getViewportIncrease(increaseViewportBy, TOP)\n const bottomViewportAddition = getViewportIncrease(increaseViewportBy, BOTTOM)\n\n listTop -= deviation\n listTop += headerHeight + fixedHeaderHeight\n listBottom += headerHeight + fixedHeaderHeight\n listBottom -= deviation\n\n // console.log({ listTop, scrollTop, stickyHeaderHeight, topViewportAddition })\n if (listTop > scrollTop + stickyHeaderHeight - topViewportAddition) {\n direction = UP\n }\n\n if (listBottom < scrollTop - headerVisible + viewportHeight + bottomViewportAddition) {\n direction = DOWN\n }\n\n if (direction !== NONE) {\n return [\n Math.max(top - headerHeight - getOverscan(overscan, TOP, direction) - topViewportAddition, 0),\n top -\n headerVisible -\n fixedHeaderHeight +\n viewportHeight +\n getOverscan(overscan, BOTTOM, direction) +\n bottomViewportAddition,\n ] as NumberTuple\n }\n\n return null\n }\n ),\n u.filter((value) => value != null) as u.Operator<NumberTuple | null, NumberTuple>,\n u.distinctUntilChanged(tupleComparator)\n ),\n [0, 0]\n ) as unknown as u.StatefulStream<NumberTuple>\n\n return {\n // input\n listBoundary,\n overscan,\n topListHeight,\n increaseViewportBy,\n\n // output\n visibleRange,\n }\n },\n u.tup(domIOSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { empty, findMaxKeyValue, Range, rangesWithin } from './AATree'\nimport { groupedListSystem } from './groupedListSystem'\nimport { getInitialTopMostItemIndexNumber, initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { Item, ListItem, ListRange } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { Data, originalIndexFromItemIndex, SizeState, sizeSystem, hasGroups, rangesWithinOffsets } from './sizeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { rangeComparator, tupleComparator } from './comparators'\nimport { recalcSystem } from './recalcSystem'\n\nexport type ListItems = ListItem<unknown>[]\nexport interface TopListState {\n items: ListItems\n listHeight: number\n}\n\nexport interface ListState {\n items: ListItems\n topItems: ListItems\n topListHeight: number\n offsetTop: number\n offsetBottom: number\n top: number\n bottom: number\n totalCount: number\n firstItemIndex: number\n}\n\nfunction probeItemSet(index: number, sizes: SizeState, data: Data) {\n if (hasGroups(sizes)) {\n const itemIndex = originalIndexFromItemIndex(index, sizes)\n const groupIndex = findMaxKeyValue(sizes.groupOffsetTree, itemIndex)[0]\n\n return [\n { index: groupIndex, size: 0, offset: 0 },\n { index: itemIndex, size: 0, offset: 0, data: data && data[0] },\n ]\n }\n return [{ index, size: 0, offset: 0, data: data && data[0] }]\n}\n\nconst EMPTY_LIST_STATE: ListState = {\n items: [] as ListItems,\n topItems: [] as ListItems,\n offsetTop: 0,\n offsetBottom: 0,\n top: 0,\n bottom: 0,\n topListHeight: 0,\n totalCount: 0,\n firstItemIndex: 0,\n}\n\nfunction transposeItems(items: Item<any>[], sizes: SizeState, firstItemIndex: number): ListItems {\n if (items.length === 0) {\n return []\n }\n\n if (!hasGroups(sizes)) {\n return items.map((item) => ({ ...item, index: item.index + firstItemIndex, originalIndex: item.index }))\n }\n\n const startIndex = items[0].index\n const endIndex = items[items.length - 1].index\n\n const transposedItems = [] as ListItems\n const groupRanges = rangesWithin(sizes.groupOffsetTree, startIndex, endIndex)\n let currentRange: Range<number> | undefined = undefined\n let currentGroupIndex = 0\n\n for (const item of items) {\n if (!currentRange || currentRange.end < item.index) {\n currentRange = groupRanges.shift()!\n currentGroupIndex = sizes.groupIndices.indexOf(currentRange.start)\n }\n\n let transposedItem: { type: 'group'; index: number } | { index: number; groupIndex: number }\n\n if (item.index === currentRange.start) {\n transposedItem = {\n type: 'group' as const,\n index: currentGroupIndex,\n }\n } else {\n transposedItem = {\n index: item.index - (currentGroupIndex + 1) + firstItemIndex,\n groupIndex: currentGroupIndex,\n }\n }\n\n transposedItems.push({\n ...transposedItem,\n size: item.size,\n offset: item.offset,\n originalIndex: item.index,\n data: item.data,\n })\n }\n\n return transposedItems\n}\n\nexport function buildListState(\n items: Item<any>[],\n topItems: Item<any>[],\n totalCount: number,\n gap: number,\n sizes: SizeState,\n firstItemIndex: number\n): ListState {\n const { lastSize, lastOffset, lastIndex } = sizes\n let offsetTop = 0\n let bottom = 0\n\n if (items.length > 0) {\n offsetTop = items[0].offset\n const lastItem = items[items.length - 1]\n bottom = lastItem.offset + lastItem.size\n }\n\n const itemCount = totalCount - lastIndex\n const total = lastOffset + itemCount * lastSize + (itemCount - 1) * gap\n const top = offsetTop\n const offsetBottom = total - bottom\n\n return {\n items: transposeItems(items, sizes, firstItemIndex),\n topItems: transposeItems(topItems, sizes, firstItemIndex),\n topListHeight: topItems.reduce((height, item) => item.size + height, 0),\n offsetTop,\n offsetBottom,\n top,\n bottom,\n totalCount,\n firstItemIndex,\n }\n}\n\nexport const listStateSystem = u.system(\n ([\n { sizes, totalCount, data, firstItemIndex, gap },\n groupedListSystem,\n { visibleRange, listBoundary, topListHeight: rangeTopListHeight },\n { scrolledToInitialItem, initialTopMostItemIndex },\n { topListHeight },\n stateFlags,\n { didMount },\n { recalcInProgress },\n ]) => {\n const topItemsIndexes = u.statefulStream<Array<number>>([])\n const itemsRendered = u.stream<ListItems>()\n\n u.connect(groupedListSystem.topItemsIndexes, topItemsIndexes)\n\n const listState = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(\n didMount,\n recalcInProgress,\n u.duc(visibleRange, tupleComparator),\n u.duc(totalCount),\n u.duc(sizes),\n u.duc(initialTopMostItemIndex),\n scrolledToInitialItem,\n u.duc(topItemsIndexes),\n u.duc(firstItemIndex),\n u.duc(gap),\n data\n ),\n u.filter(([mount, recalcInProgress]) => {\n return mount && !recalcInProgress\n }),\n u.map(\n ([\n ,\n ,\n [startOffset, endOffset],\n totalCount,\n sizes,\n initialTopMostItemIndex,\n scrolledToInitialItem,\n topItemsIndexes,\n firstItemIndex,\n gap,\n data,\n ]) => {\n const sizesValue = sizes\n const { sizeTree, offsetTree } = sizesValue\n\n if (totalCount === 0 || (startOffset === 0 && endOffset === 0)) {\n return EMPTY_LIST_STATE\n }\n\n if (empty(sizeTree)) {\n return buildListState(\n probeItemSet(getInitialTopMostItemIndexNumber(initialTopMostItemIndex, totalCount), sizesValue, data),\n [],\n totalCount,\n gap,\n sizesValue,\n firstItemIndex\n )\n }\n\n const topItems = [] as Item<any>[]\n\n if (topItemsIndexes.length > 0) {\n const startIndex = topItemsIndexes[0]\n const endIndex = topItemsIndexes[topItemsIndexes.length - 1]\n let offset = 0\n for (const range of rangesWithin(sizeTree, startIndex, endIndex)) {\n const size = range.value\n const rangeStartIndex = Math.max(range.start, startIndex)\n const rangeEndIndex = Math.min(range.end, endIndex)\n for (let i = rangeStartIndex; i <= rangeEndIndex; i++) {\n topItems.push({ index: i, size, offset: offset, data: data && data[i] })\n offset += size\n }\n }\n }\n\n // If the list hasn't scrolled to the initial item because the initial item was set,\n // render empty list.\n //\n // This is a condition to be evaluated past the probe check, do not merge\n // with the totalCount check above\n if (!scrolledToInitialItem) {\n return buildListState([], topItems, totalCount, gap, sizesValue, firstItemIndex)\n }\n\n const minStartIndex = topItemsIndexes.length > 0 ? topItemsIndexes[topItemsIndexes.length - 1] + 1 : 0\n\n const offsetPointRanges = rangesWithinOffsets(offsetTree, startOffset, endOffset, minStartIndex)\n if (offsetPointRanges.length === 0) {\n return null\n }\n\n const maxIndex = totalCount - 1\n\n const items = u.tap([] as Item<any>[], (result) => {\n for (const range of offsetPointRanges) {\n const point = range.value\n let offset = point.offset\n let rangeStartIndex = range.start\n const size = point.size\n\n if (point.offset < startOffset) {\n rangeStartIndex += Math.floor((startOffset - point.offset + gap) / (size + gap))\n const itemCount = rangeStartIndex - range.start\n offset += itemCount * size + itemCount * gap\n }\n\n if (rangeStartIndex < minStartIndex) {\n offset += (minStartIndex - rangeStartIndex) * size\n rangeStartIndex = minStartIndex\n }\n\n const endIndex = Math.min(range.end, maxIndex)\n\n for (let i = rangeStartIndex; i <= endIndex; i++) {\n if (offset >= endOffset) {\n break\n }\n\n result.push({ index: i, size, offset: offset, data: data && data[i] })\n offset += size + gap\n }\n }\n })\n\n return buildListState(items, topItems, totalCount, gap, sizesValue, firstItemIndex)\n }\n ),\n //@ts-expect-error filter needs to be fixed\n u.filter((value) => value !== null),\n u.distinctUntilChanged()\n ),\n EMPTY_LIST_STATE\n )\n\n u.connect(\n u.pipe(\n data,\n u.filter((data) => data !== undefined),\n u.map((data) => data!.length)\n ),\n totalCount\n )\n\n u.connect(\n u.pipe(\n listState,\n u.map((value) => value.topListHeight)\n ),\n topListHeight\n )\n u.connect(topListHeight, rangeTopListHeight)\n\n u.connect(\n u.pipe(\n listState,\n u.map((state) => [state.top, state.bottom])\n ),\n listBoundary\n )\n\n u.connect(\n u.pipe(\n listState,\n u.map((state) => state.items)\n ),\n itemsRendered\n )\n\n const endReached = u.streamFromEmitter(\n u.pipe(\n listState,\n u.filter(({ items }) => items.length > 0),\n u.withLatestFrom(totalCount, data),\n u.filter(([{ items }, totalCount]) => items[items.length - 1].originalIndex === totalCount - 1),\n u.map(([, totalCount, data]) => [totalCount - 1, data] as [number, unknown[]]),\n u.distinctUntilChanged(tupleComparator),\n u.map(([count]) => count)\n )\n )\n\n const startReached = u.streamFromEmitter(\n u.pipe(\n listState,\n u.throttleTime(200),\n u.filter(({ items, topItems }) => {\n return items.length > 0 && items[0].originalIndex === topItems.length\n }),\n u.map(({ items }) => items[0].index),\n u.distinctUntilChanged()\n )\n )\n\n const rangeChanged = u.streamFromEmitter(\n u.pipe(\n listState,\n u.filter(({ items }) => items.length > 0),\n u.map(({ items }) => {\n let startIndex = 0\n let endIndex = items.length - 1\n\n while (items[startIndex].type === 'group' && startIndex < endIndex) {\n startIndex++\n }\n\n while (items[endIndex].type === 'group' && endIndex > startIndex) {\n endIndex--\n }\n\n return {\n startIndex: items[startIndex].index,\n endIndex: items[endIndex].index,\n } as ListRange\n }),\n u.distinctUntilChanged(rangeComparator)\n )\n )\n\n return { listState, topItemsIndexes, endReached, startReached, rangeChanged, itemsRendered, ...stateFlags }\n },\n u.tup(\n sizeSystem,\n groupedListSystem,\n sizeRangeSystem,\n initialTopMostItemIndexSystem,\n scrollToIndexSystem,\n stateFlagsSystem,\n propsReadySystem,\n recalcSystem\n ),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem, buildListState } from './listStateSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { propsReadySystem } from './propsReadySystem'\n\nexport const initialItemCountSystem = u.system(\n ([{ sizes, firstItemIndex, data, gap }, { listState }, { didMount }]) => {\n const initialItemCount = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialItemCount),\n u.filter(([, count]) => count !== 0),\n u.withLatestFrom(sizes, firstItemIndex, gap, data),\n u.map(([[, count], sizes, firstItemIndex, gap, data = []]) => {\n let includedGroupsCount = 0\n if (sizes.groupIndices.length > 0) {\n for (const index of sizes.groupIndices) {\n if (index - includedGroupsCount >= count) {\n break\n }\n includedGroupsCount++\n }\n }\n const adjustedCount = count + includedGroupsCount\n const items = Array.from({ length: adjustedCount }).map((_, index) => ({ index, size: 0, offset: 0, data: data[index] }))\n return buildListState(items, [], adjustedCount, gap, sizes, firstItemIndex)\n })\n ),\n listState\n )\n\n return { initialItemCount }\n },\n u.tup(sizeSystem, listStateSystem, propsReadySystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { ListRange } from './interfaces'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { ScrollSeekConfiguration } from './interfaces'\n\nexport const scrollSeekSystem = u.system(\n ([{ scrollVelocity }]) => {\n const isSeeking = u.statefulStream(false)\n const rangeChanged = u.stream<ListRange>()\n const scrollSeekConfiguration = u.statefulStream<ScrollSeekConfiguration | undefined | false>(false)\n\n u.connect(\n u.pipe(\n scrollVelocity,\n u.withLatestFrom(scrollSeekConfiguration, isSeeking, rangeChanged),\n u.filter(([_, config]) => !!config),\n u.map(([speed, config, isSeeking, range]) => {\n const { exit, enter } = config as ScrollSeekConfiguration\n if (isSeeking) {\n if (exit(speed, range)) {\n return false\n }\n } else {\n if (enter(speed, range)) {\n return true\n }\n }\n return isSeeking\n }),\n u.distinctUntilChanged()\n ),\n isSeeking\n )\n\n u.subscribe(\n u.pipe(u.combineLatest(isSeeking, scrollVelocity, rangeChanged), u.withLatestFrom(scrollSeekConfiguration)),\n ([[isSeeking, velocity, range], config]) => isSeeking && config && config.change && config.change(velocity, range)\n )\n\n return { isSeeking, scrollSeekConfiguration, scrollVelocity, scrollSeekRangeChanged: rangeChanged }\n },\n u.tup(stateFlagsSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem } from './listStateSystem'\n\nexport const topItemCountSystem = u.system(([{ topItemsIndexes }]) => {\n const topItemCount = u.statefulStream(0)\n\n u.connect(\n u.pipe(\n topItemCount,\n u.filter((length) => length > 0),\n u.map((length) => Array.from({ length }).map((_, index) => index))\n ),\n topItemsIndexes\n )\n return { topItemCount }\n}, u.tup(listStateSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { listStateSystem } from './listStateSystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const totalListHeightSystem = u.system(\n ([{ footerHeight, headerHeight, fixedHeaderHeight }, { listState }]) => {\n const totalListHeightChanged = u.stream<number>()\n const totalListHeight = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(footerHeight, headerHeight, fixedHeaderHeight, listState),\n u.map(([footerHeight, headerHeight, fixedHeaderHeight, listState]) => {\n return footerHeight + headerHeight + fixedHeaderHeight + listState.offsetBottom + listState.bottom\n })\n ),\n 0\n )\n\n u.connect(u.duc(totalListHeight), totalListHeightChanged)\n\n return { totalListHeight, totalListHeightChanged }\n },\n u.tup(domIOSystem, listStateSystem),\n { singleton: true }\n)\n","export function simpleMemoize<T extends () => any>(func: T): T {\n let called = false\n let result: unknown\n\n return (() => {\n if (!called) {\n called = true\n result = func()\n }\n return result\n }) as T\n}\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { UP, stateFlagsSystem } from './stateFlagsSystem'\nimport { ListItem } from './interfaces'\nimport { loggerSystem, LogLevel } from './loggerSystem'\nimport { simpleMemoize } from './utils/simpleMemoize'\nimport { recalcSystem } from './recalcSystem'\n\nconst isMobileSafari = simpleMemoize(() => {\n return /iP(ad|hone|od).+Version\\/[\\d.]+.*Safari/i.test(navigator.userAgent)\n})\n\ntype UpwardFixState = [number, ListItem<any>[], number, number]\n/**\n * Fixes upward scrolling by calculating and compensation from changed item heights, using scrollBy.\n */\nexport const upwardScrollFixSystem = u.system(\n ([\n { scrollBy, scrollTop, deviation, scrollingInProgress },\n { isScrolling, isAtBottom, scrollDirection, lastJumpDueToItemResize },\n { listState },\n { beforeUnshiftWith, shiftWithOffset, sizes, gap },\n { log },\n { recalcInProgress },\n ]) => {\n const deviationOffset = u.streamFromEmitter(\n u.pipe(\n listState,\n u.withLatestFrom(lastJumpDueToItemResize),\n u.scan(\n ([, prevItems, prevTotalCount, prevTotalHeight], [{ items, totalCount, bottom, offsetBottom }, lastJumpDueToItemResize]) => {\n const totalHeight = bottom + offsetBottom\n\n let newDev = 0\n if (prevTotalCount === totalCount) {\n if (prevItems.length > 0 && items.length > 0) {\n const atStart = items[0].originalIndex === 0 && prevItems[0].originalIndex === 0\n if (!atStart) {\n newDev = totalHeight - prevTotalHeight\n if (newDev !== 0) {\n newDev += lastJumpDueToItemResize\n }\n }\n }\n }\n\n return [newDev, items, totalCount, totalHeight] as UpwardFixState\n },\n [0, [], 0, 0] as UpwardFixState\n ),\n u.filter(([amount]) => amount !== 0),\n u.withLatestFrom(scrollTop, scrollDirection, scrollingInProgress, isAtBottom, log),\n u.filter(([, scrollTop, scrollDirection, scrollingInProgress]) => {\n return !scrollingInProgress && scrollTop !== 0 && scrollDirection === UP\n }),\n u.map(([[amount], , , , , log]) => {\n log('Upward scrolling compensation', { amount }, LogLevel.DEBUG)\n return amount\n })\n )\n )\n\n function scrollByWith(offset: number) {\n if (offset > 0) {\n u.publish(scrollBy, { top: -offset, behavior: 'auto' })\n u.publish(deviation, 0)\n } else {\n u.publish(deviation, 0)\n u.publish(scrollBy, { top: -offset, behavior: 'auto' })\n }\n }\n\n u.subscribe(u.pipe(deviationOffset, u.withLatestFrom(deviation, isScrolling)), ([offset, deviationAmount, isScrolling]) => {\n if (isScrolling && isMobileSafari()) {\n u.publish(deviation, deviationAmount - offset)\n } else {\n scrollByWith(-offset)\n }\n })\n\n // this hack is only necessary for mobile safari which does not support scrollBy while scrolling is in progress.\n // when the browser stops scrolling, restore the position and reset the glitching\n u.subscribe(\n u.pipe(\n u.combineLatest(u.statefulStreamFromEmitter(isScrolling, false), deviation, recalcInProgress),\n u.filter(([is, deviation, recalc]) => !is && !recalc && deviation !== 0),\n u.map(([_, deviation]) => deviation),\n u.throttleTime(1)\n ),\n scrollByWith\n )\n\n u.connect(\n u.pipe(\n shiftWithOffset,\n u.map((offset) => {\n return { top: -offset }\n })\n ),\n scrollBy\n )\n\n u.subscribe(\n u.pipe(\n beforeUnshiftWith,\n u.withLatestFrom(sizes, gap),\n u.map(([offset, { lastSize }, gap]) => offset * lastSize + offset * gap)\n ),\n (offset) => {\n u.publish(deviation, offset)\n requestAnimationFrame(() => {\n u.publish(scrollBy, { top: offset })\n requestAnimationFrame(() => {\n u.publish(deviation, 0)\n u.publish(recalcInProgress, false)\n })\n })\n }\n )\n\n return { deviation }\n },\n u.tup(domIOSystem, stateFlagsSystem, listStateSystem, sizeSystem, loggerSystem, recalcSystem)\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const initialScrollTopSystem = u.system(\n ([{ totalListHeight }, { didMount }, { scrollTo }]) => {\n const initialScrollTop = u.statefulStream(0)\n\n u.subscribe(\n u.pipe(\n didMount,\n u.withLatestFrom(initialScrollTop),\n u.filter(([, offset]) => offset !== 0),\n u.map(([, offset]) => ({ top: offset }))\n ),\n (location) => {\n u.handleNext(\n u.pipe(\n totalListHeight,\n u.filter((val) => val !== 0)\n ),\n () => {\n setTimeout(() => {\n u.publish(scrollTo, location)\n })\n }\n )\n }\n )\n\n return {\n initialScrollTop,\n }\n },\n u.tup(totalListHeightSystem, propsReadySystem, domIOSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { domIOSystem } from './domIOSystem'\n\nexport const alignToBottomSystem = u.system(\n ([{ viewportHeight }, { totalListHeight }]) => {\n const alignToBottom = u.statefulStream(false)\n\n const paddingTopAddition = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(alignToBottom, viewportHeight, totalListHeight),\n u.filter(([enabled]) => enabled),\n u.map(([, viewportHeight, totalListHeight]) => {\n return Math.max(0, viewportHeight - totalListHeight)\n }),\n u.distinctUntilChanged()\n ),\n 0\n )\n\n return { alignToBottom, paddingTopAddition }\n },\n u.tup(domIOSystem, totalListHeightSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { WindowViewportInfo, ScrollContainerState } from './interfaces'\n\nexport const windowScrollerSystem = u.system(([{ scrollTo, scrollContainerState }]) => {\n const windowScrollContainerState = u.stream<ScrollContainerState>()\n const windowViewportRect = u.stream<WindowViewportInfo>()\n const windowScrollTo = u.stream<ScrollToOptions>()\n const useWindowScroll = u.statefulStream(false)\n const customScrollParent = u.statefulStream<HTMLElement | undefined>(undefined)\n\n u.connect(\n u.pipe(\n u.combineLatest(windowScrollContainerState, windowViewportRect),\n u.map(([{ viewportHeight, scrollTop: windowScrollTop, scrollHeight }, { offsetTop }]) => {\n return {\n scrollTop: Math.max(0, windowScrollTop - offsetTop),\n scrollHeight,\n viewportHeight,\n }\n })\n ),\n scrollContainerState\n )\n\n u.connect(\n u.pipe(\n scrollTo,\n u.withLatestFrom(windowViewportRect),\n u.map(([scrollTo, { offsetTop }]) => {\n return {\n ...scrollTo,\n top: scrollTo.top! + offsetTop,\n }\n })\n ),\n windowScrollTo\n )\n\n return {\n // config\n useWindowScroll,\n customScrollParent,\n\n // input\n windowScrollContainerState,\n windowViewportRect,\n\n // signals\n windowScrollTo,\n }\n}, u.tup(domIOSystem))\n","import * as u from '@virtuoso.dev/urx'\nimport { findMaxKeyValue } from './AATree'\nimport { domIOSystem } from './domIOSystem'\nimport { offsetOf, originalIndexFromLocation, sizeSystem } from './sizeSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { ScrollIntoViewLocation } from './interfaces'\n\nexport const scrollIntoViewSystem = u.system(\n ([{ sizes, totalCount, gap }, { scrollTop, viewportHeight, headerHeight, scrollingInProgress }, { scrollToIndex }]) => {\n const scrollIntoView = u.stream<ScrollIntoViewLocation>()\n\n u.connect(\n u.pipe(\n scrollIntoView,\n u.withLatestFrom(sizes, viewportHeight, totalCount, headerHeight, scrollTop, gap),\n u.map(([viewLocation, sizes, viewportHeight, totalCount, headerHeight, scrollTop, gap]) => {\n const { done, behavior, ...rest } = viewLocation\n let location = null\n const actualIndex = originalIndexFromLocation(viewLocation, sizes, totalCount - 1)\n\n const itemTop = offsetOf(actualIndex, sizes.offsetTree, gap) + headerHeight\n if (itemTop < scrollTop) {\n location = { ...rest, behavior, align: 'start' }\n } else {\n const itemBottom = itemTop + findMaxKeyValue(sizes.sizeTree, actualIndex)[1]!\n\n if (itemBottom > scrollTop + viewportHeight) {\n location = { ...rest, behavior, align: 'end' }\n }\n }\n\n if (location) {\n done &&\n u.handleNext(\n u.pipe(\n scrollingInProgress,\n u.skip(1),\n u.filter((value) => value === false)\n ),\n done\n )\n } else {\n done && done()\n }\n\n return location\n }),\n u.filter((value) => value !== null)\n ),\n scrollToIndex\n )\n\n return {\n scrollIntoView,\n }\n },\n u.tup(sizeSystem, domIOSystem, scrollToIndexSystem, listStateSystem, loggerSystem),\n { singleton: true }\n)\n","import * as u from '@virtuoso.dev/urx'\nimport { domIOSystem } from './domIOSystem'\nimport { followOutputSystem } from './followOutputSystem'\nimport { groupedListSystem } from './groupedListSystem'\nimport { initialItemCountSystem } from './initialItemCountSystem'\nimport { initialTopMostItemIndexSystem } from './initialTopMostItemIndexSystem'\nimport { listStateSystem } from './listStateSystem'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollSeekSystem } from './scrollSeekSystem'\nimport { scrollToIndexSystem } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { sizeSystem } from './sizeSystem'\nimport { topItemCountSystem } from './topItemCountSystem'\nimport { totalListHeightSystem } from './totalListHeightSystem'\nimport { upwardScrollFixSystem } from './upwardScrollFixSystem'\nimport { initialScrollTopSystem } from './initialScrollTopSystem'\nimport { alignToBottomSystem } from './alignToBottomSystem'\nimport { windowScrollerSystem } from './windowScrollerSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { scrollIntoViewSystem } from './scrollIntoViewSystem'\n\n// workaround the growing list of systems below\n// fix this with 4.1 recursive conditional types\nconst featureGroup1System = u.system(\n ([\n sizeRange,\n initialItemCount,\n propsReady,\n scrollSeek,\n totalListHeight,\n initialScrollTopSystem,\n alignToBottom,\n windowScroller,\n scrollIntoView,\n ]) => {\n return {\n ...sizeRange,\n ...initialItemCount,\n ...propsReady,\n ...scrollSeek,\n ...totalListHeight,\n ...initialScrollTopSystem,\n ...alignToBottom,\n ...windowScroller,\n ...scrollIntoView,\n }\n },\n u.tup(\n sizeRangeSystem,\n initialItemCountSystem,\n propsReadySystem,\n scrollSeekSystem,\n totalListHeightSystem,\n initialScrollTopSystem,\n alignToBottomSystem,\n windowScrollerSystem,\n scrollIntoViewSystem\n )\n)\n\nexport const listSystem = u.system(\n ([\n {\n totalCount,\n sizeRanges,\n fixedItemSize,\n defaultItemSize,\n trackItemSizes,\n itemSize,\n data,\n firstItemIndex,\n groupIndices,\n statefulTotalCount,\n gap,\n },\n { initialTopMostItemIndex, scrolledToInitialItem },\n domIO,\n followOutput,\n { listState, topItemsIndexes, ...flags },\n { scrollToIndex },\n _,\n { topItemCount },\n { groupCounts },\n featureGroup1,\n log,\n ]) => {\n u.connect(flags.rangeChanged, featureGroup1.scrollSeekRangeChanged)\n u.connect(\n u.pipe(\n featureGroup1.windowViewportRect,\n u.map((value) => value.visibleHeight)\n ),\n domIO.viewportHeight\n )\n\n return {\n // input\n totalCount,\n data,\n firstItemIndex,\n sizeRanges,\n initialTopMostItemIndex,\n scrolledToInitialItem,\n topItemsIndexes,\n topItemCount,\n groupCounts,\n fixedItemHeight: fixedItemSize,\n defaultItemHeight: defaultItemSize,\n gap,\n ...followOutput,\n\n // output\n statefulTotalCount,\n listState,\n scrollToIndex,\n trackItemSizes,\n itemSize,\n groupIndices,\n\n // exported from stateFlagsSystem\n ...flags,\n // the bag of IO from featureGroup1System\n ...featureGroup1,\n ...domIO,\n ...log,\n }\n },\n u.tup(\n sizeSystem,\n initialTopMostItemIndexSystem,\n domIOSystem,\n followOutputSystem,\n listStateSystem,\n scrollToIndexSystem,\n upwardScrollFixSystem,\n topItemCountSystem,\n groupedListSystem,\n featureGroup1System,\n loggerSystem\n )\n)\n","import { simpleMemoize } from './simpleMemoize'\n\nconst WEBKIT_STICKY = '-webkit-sticky'\nconst STICKY = 'sticky'\n\nexport const positionStickyCssValue = simpleMemoize(() => {\n if (typeof document === 'undefined') {\n return STICKY\n }\n const node = document.createElement('div')\n node.style.position = WEBKIT_STICKY\n return node.style.position === WEBKIT_STICKY ? WEBKIT_STICKY : STICKY\n})\n","import { useEffect, useRef, useCallback } from 'react'\nimport { useSizeWithElRef } from './useSize'\nimport { WindowViewportInfo } from '../interfaces'\n\nexport default function useWindowViewportRectRef(callback: (info: WindowViewportInfo) => void, customScrollParent?: HTMLElement) {\n const viewportInfo = useRef<WindowViewportInfo | null>(null)\n\n const calculateInfo = useCallback(\n (element: HTMLElement | null) => {\n if (element === null || !element.offsetParent) {\n return\n }\n const rect = element.getBoundingClientRect()\n const visibleWidth = rect.width\n let visibleHeight: number, offsetTop: number\n\n if (customScrollParent) {\n const customScrollParentRect = customScrollParent.getBoundingClientRect()\n const deltaTop = rect.top - customScrollParentRect.top\n\n visibleHeight = customScrollParentRect.height - Math.max(0, deltaTop)\n offsetTop = deltaTop + customScrollParent.scrollTop\n } else {\n visibleHeight = window.innerHeight - Math.max(0, rect.top)\n offsetTop = rect.top + window.pageYOffset\n }\n\n viewportInfo.current = {\n offsetTop,\n visibleHeight,\n visibleWidth,\n }\n\n callback(viewportInfo.current)\n },\n [callback, customScrollParent]\n )\n\n const { callbackRef, ref } = useSizeWithElRef(calculateInfo)\n\n const scrollAndResizeEventHandler = useCallback(() => {\n calculateInfo(ref.current)\n }, [calculateInfo, ref])\n\n useEffect(() => {\n if (customScrollParent) {\n customScrollParent.addEventListener('scroll', scrollAndResizeEventHandler)\n const observer = new ResizeObserver(scrollAndResizeEventHandler)\n observer.observe(customScrollParent)\n return () => {\n customScrollParent.removeEventListener('scroll', scrollAndResizeEventHandler)\n observer.unobserve(customScrollParent)\n }\n } else {\n window.addEventListener('scroll', scrollAndResizeEventHandler)\n window.addEventListener('resize', scrollAndResizeEventHandler)\n return () => {\n window.removeEventListener('scroll', scrollAndResizeEventHandler)\n window.removeEventListener('resize', scrollAndResizeEventHandler)\n }\n }\n }, [scrollAndResizeEventHandler, customScrollParent])\n\n return callbackRef\n}\n","import { RefHandle, systemToComponent } from '@virtuoso.dev/react-urx'\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { ComponentType, createElement, CSSProperties, FC, PropsWithChildren } from 'react'\nimport useIsomorphicLayoutEffect from './hooks/useIsomorphicLayoutEffect'\nimport useChangedListContentsSizes from './hooks/useChangedChildSizes'\nimport useScrollTop from './hooks/useScrollTop'\nimport useSize from './hooks/useSize'\nimport { Components, ComputeItemKey, GroupContent, GroupItemContent, ItemContent, ListRootProps } from './interfaces'\nimport { listSystem } from './listSystem'\nimport { positionStickyCssValue } from './utils/positionStickyCssValue'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\nimport { correctItemSize } from './utils/correctItemSize'\nimport { ScrollerProps } from '.'\n\nexport function identity<T>(value: T) {\n return value\n}\n\nconst listComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<ItemContent<any, any> | GroupItemContent<any, any>>((index: number) => `Item ${index}`)\n const context = u.statefulStream<unknown>(null)\n const groupContent = u.statefulStream<GroupContent>((index: number) => `Group ${index}`)\n const components = u.statefulStream<Components<any>>({})\n const computeItemKey = u.statefulStream<ComputeItemKey<any, any>>(identity)\n const headerFooterTag = u.statefulStream('div')\n const scrollerRef = u.statefulStream<(ref: HTMLElement | Window | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof Components<any>>(propName: K, defaultValue: Components<any>[K] | null | 'div' = null) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n groupContent,\n components,\n computeItemKey,\n headerFooterTag,\n scrollerRef,\n FooterComponent: distinctProp('Footer'),\n HeaderComponent: distinctProp('Header'),\n TopItemListComponent: distinctProp('TopItemList'),\n ListComponent: distinctProp('List', 'div'),\n ItemComponent: distinctProp('Item', 'div'),\n GroupComponent: distinctProp('Group', 'div'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n EmptyPlaceholder: distinctProp('EmptyPlaceholder'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder'),\n }\n})\n\nexport function addDeprecatedAlias<T>(prop: u.Stream<T>, message: string) {\n const alias = u.stream<T>()\n u.subscribe(alias, () =>\n console.warn(`react-virtuoso: You are using a deprecated property. ${message}`, 'color: red;', 'color: inherit;', 'color: blue;')\n )\n u.connect(alias, prop)\n return alias\n}\n\nconst combinedSystem = u.system(([listSystem, propsSystem]) => {\n const deprecatedProps = {\n item: addDeprecatedAlias(propsSystem.itemContent, 'Rename the %citem%c prop to %citemContent.'),\n group: addDeprecatedAlias(propsSystem.groupContent, 'Rename the %cgroup%c prop to %cgroupContent.'),\n topItems: addDeprecatedAlias(listSystem.topItemCount, 'Rename the %ctopItems%c prop to %ctopItemCount.'),\n itemHeight: addDeprecatedAlias(listSystem.fixedItemHeight, 'Rename the %citemHeight%c prop to %cfixedItemHeight.'),\n scrollingStateChange: addDeprecatedAlias(listSystem.isScrolling, 'Rename the %cscrollingStateChange%c prop to %cisScrolling.'),\n adjustForPrependedItems: u.stream<any>(),\n maxHeightCacheSize: u.stream<any>(),\n footer: u.stream<any>(),\n header: u.stream<any>(),\n HeaderContainer: u.stream<any>(),\n FooterContainer: u.stream<any>(),\n ItemContainer: u.stream<any>(),\n ScrollContainer: u.stream<any>(),\n GroupContainer: u.stream<any>(),\n ListContainer: u.stream<any>(),\n emptyComponent: u.stream<any>(),\n scrollSeek: u.stream<any>(),\n }\n\n u.subscribe(deprecatedProps.adjustForPrependedItems, () => {\n console.warn(\n `react-virtuoso: adjustForPrependedItems is no longer supported. Use the firstItemIndex property instead - https://virtuoso.dev/prepend-items.`,\n 'color: red;',\n 'color: inherit;',\n 'color: blue;'\n )\n })\n\n u.subscribe(deprecatedProps.maxHeightCacheSize, () => {\n console.warn(`react-virtuoso: maxHeightCacheSize is no longer necessary. Setting it has no effect - remove it from your code.`)\n })\n\n u.subscribe(deprecatedProps.HeaderContainer, () => {\n console.warn(\n `react-virtuoso: HeaderContainer is deprecated. Use headerFooterTag if you want to change the wrapper of the header component and pass components.Header to change its contents.`\n )\n })\n\n u.subscribe(deprecatedProps.FooterContainer, () => {\n console.warn(\n `react-virtuoso: FooterContainer is deprecated. Use headerFooterTag if you want to change the wrapper of the footer component and pass components.Footer to change its contents.`\n )\n })\n\n function deprecateComponentProp(stream: u.Stream<any>, componentName: string, propName: string) {\n u.connect(\n u.pipe(\n stream,\n u.withLatestFrom(propsSystem.components),\n u.map(([comp, components]) => {\n console.warn(`react-virtuoso: ${propName} property is deprecated. Pass components.${componentName} instead.`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n return { ...components, [componentName]: comp }\n })\n ),\n propsSystem.components\n )\n }\n\n u.subscribe(deprecatedProps.scrollSeek, ({ placeholder, ...config }) => {\n console.warn(\n `react-virtuoso: scrollSeek property is deprecated. Pass scrollSeekConfiguration and specify the placeholder in components.ScrollSeekPlaceholder instead.`\n )\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n u.publish(propsSystem.components, { ...u.getValue(propsSystem.components), ScrollSeekPlaceholder: placeholder })\n u.publish(listSystem.scrollSeekConfiguration, config)\n })\n\n deprecateComponentProp(deprecatedProps.footer, 'Footer', 'footer')\n deprecateComponentProp(deprecatedProps.header, 'Header', 'header')\n deprecateComponentProp(deprecatedProps.ItemContainer, 'Item', 'ItemContainer')\n deprecateComponentProp(deprecatedProps.ListContainer, 'List', 'ListContainer')\n deprecateComponentProp(deprecatedProps.ScrollContainer, 'Scroller', 'ScrollContainer')\n deprecateComponentProp(deprecatedProps.emptyComponent, 'EmptyPlaceholder', 'emptyComponent')\n deprecateComponentProp(deprecatedProps.GroupContainer, 'Group', 'GroupContainer')\n\n return { ...listSystem, ...propsSystem, ...deprecatedProps }\n}, u.tup(listSystem, listComponentPropsSystem))\n\nconst DefaultScrollSeekPlaceholder = ({ height }: { height: number }) => <div style={{ height }}></div>\n\nconst GROUP_STYLE = { position: positionStickyCssValue(), zIndex: 1, overflowAnchor: 'none' } as const\nconst ITEM_STYLE = { overflowAnchor: 'none' } as const\n\nexport const Items = React.memo(function VirtuosoItems({ showTopList = false }: { showTopList?: boolean }) {\n const listState = useEmitterValue('listState')\n\n const sizeRanges = usePublisher('sizeRanges')\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const windowScrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const _scrollContainerStateCallback = usePublisher('scrollContainerState')\n const scrollContainerStateCallback =\n customScrollParent || useWindowScroll ? windowScrollContainerStateCallback : _scrollContainerStateCallback\n const itemContent = useEmitterValue('itemContent')\n const context = useEmitterValue('context')\n const groupContent = useEmitterValue('groupContent')\n const trackItemSizes = useEmitterValue('trackItemSizes')\n const itemSize = useEmitterValue('itemSize')\n const log = useEmitterValue('log')\n const listGap = usePublisher('gap')\n\n const { callbackRef } = useChangedListContentsSizes(\n sizeRanges,\n itemSize,\n trackItemSizes,\n showTopList ? u.noop : scrollContainerStateCallback,\n log,\n listGap,\n customScrollParent\n )\n\n const [deviation, setDeviation] = React.useState(0)\n useEmitter('deviation', (value) => {\n if (deviation !== value) {\n // ref.current!.style.marginTop = `${value}px`\n setDeviation(value)\n }\n })\n\n const EmptyPlaceholder = useEmitterValue('EmptyPlaceholder')\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder') || DefaultScrollSeekPlaceholder\n const ListComponent = useEmitterValue('ListComponent')!\n const ItemComponent = useEmitterValue('ItemComponent')!\n const GroupComponent = useEmitterValue('GroupComponent')!\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const hasGroups = useEmitterValue('groupIndices').length > 0\n const paddingTopAddition = useEmitterValue('paddingTopAddition')\n\n const containerStyle: CSSProperties = showTopList\n ? {}\n : {\n boxSizing: 'border-box',\n paddingTop: listState.offsetTop + paddingTopAddition,\n paddingBottom: listState.offsetBottom,\n marginTop: deviation,\n }\n\n if (!showTopList && listState.totalCount === 0 && EmptyPlaceholder) {\n return createElement(EmptyPlaceholder, contextPropIfNotDomElement(EmptyPlaceholder, context))\n }\n\n return createElement(\n ListComponent,\n {\n ...contextPropIfNotDomElement(ListComponent, context),\n ref: callbackRef,\n style: containerStyle,\n 'data-test-id': showTopList ? 'virtuoso-top-item-list' : 'virtuoso-item-list',\n },\n (showTopList ? listState.topItems : listState.items).map((item) => {\n const index = item.originalIndex!\n const key = computeItemKey(index + listState.firstItemIndex, item.data, context)\n\n if (isSeeking) {\n return createElement(ScrollSeekPlaceholder, {\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n key,\n index: item.index,\n height: item.size,\n type: item.type || 'item',\n ...(item.type === 'group' ? {} : { groupIndex: item.groupIndex }),\n })\n }\n\n if (item.type === 'group') {\n return createElement(\n GroupComponent,\n {\n ...contextPropIfNotDomElement(GroupComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n style: GROUP_STYLE,\n },\n groupContent(item.index)\n )\n } else {\n return createElement(\n ItemComponent,\n {\n ...contextPropIfNotDomElement(ItemComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n 'data-item-group-index': item.groupIndex,\n style: ITEM_STYLE,\n },\n hasGroups\n ? (itemContent as GroupItemContent<any, any>)(item.index, item.groupIndex!, item.data, context)\n : (itemContent as ItemContent<any, any>)(item.index, item.data, context)\n )\n }\n })\n )\n})\n\nexport const scrollerStyle: CSSProperties = {\n height: '100%',\n outline: 'none',\n overflowY: 'auto',\n position: 'relative',\n WebkitOverflowScrolling: 'touch',\n}\n\nexport const viewportStyle: CSSProperties = {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n}\n\nconst topItemListStyle: CSSProperties = {\n width: '100%',\n position: positionStickyCssValue(),\n top: 0,\n}\n\nexport function contextPropIfNotDomElement(element: unknown, context: unknown) {\n if (typeof element === 'string') {\n return undefined\n }\n return { context }\n}\n\nconst Header: FC = React.memo(function VirtuosoHeader() {\n const Header = useEmitterValue('HeaderComponent')\n const headerHeight = usePublisher('headerHeight')\n const headerFooterTag = useEmitterValue('headerFooterTag')\n const ref = useSize((el) => headerHeight(correctItemSize(el, 'height')))\n const context = useEmitterValue('context')\n return Header ? createElement(headerFooterTag, { ref }, createElement(Header, contextPropIfNotDomElement(Header, context))) : null\n})\n\nconst Footer: FC = React.memo(function VirtuosoFooter() {\n const Footer = useEmitterValue('FooterComponent')\n const footerHeight = usePublisher('footerHeight')\n const headerFooterTag = useEmitterValue('headerFooterTag')\n const ref = useSize((el) => footerHeight(correctItemSize(el, 'height')))\n const context = useEmitterValue('context')\n return Footer ? createElement(headerFooterTag, { ref }, createElement(Footer, contextPropIfNotDomElement(Footer, context))) : null\n})\n\nexport interface Hooks {\n usePublisher: typeof usePublisher\n useEmitterValue: typeof useEmitterValue\n useEmitter: typeof useEmitter\n}\n\nexport function buildScroller({ usePublisher, useEmitter, useEmitterValue }: Hooks) {\n const Scroller: ComponentType<ScrollerProps> = React.memo(function VirtuosoScroller({ style, children, ...props }) {\n const scrollContainerStateCallback = usePublisher('scrollContainerState')\n const ScrollerComponent = useEmitterValue('ScrollerComponent')!\n const smoothScrollTargetReached = usePublisher('smoothScrollTargetReached')\n const scrollerRefCallback = useEmitterValue('scrollerRef')\n const context = useEmitterValue('context')\n\n const { scrollerRef, scrollByCallback, scrollToCallback } = useScrollTop(\n scrollContainerStateCallback,\n smoothScrollTargetReached,\n ScrollerComponent,\n scrollerRefCallback\n )\n\n useEmitter('scrollTo', scrollToCallback)\n useEmitter('scrollBy', scrollByCallback)\n return createElement(\n ScrollerComponent,\n {\n ref: scrollerRef as React.MutableRefObject<HTMLDivElement | null>,\n style: { ...scrollerStyle, ...style },\n 'data-test-id': 'virtuoso-scroller',\n 'data-virtuoso-scroller': true,\n tabIndex: 0,\n ...props,\n ...contextPropIfNotDomElement(ScrollerComponent, context),\n },\n children\n )\n })\n return Scroller\n}\n\nexport function buildWindowScroller({ usePublisher, useEmitter, useEmitterValue }: Hooks) {\n const Scroller: Components['Scroller'] = React.memo(function VirtuosoWindowScroller({ style, children, ...props }) {\n const scrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const ScrollerComponent = useEmitterValue('ScrollerComponent')!\n const smoothScrollTargetReached = usePublisher('smoothScrollTargetReached')\n const totalListHeight = useEmitterValue('totalListHeight')\n const deviation = useEmitterValue('deviation')\n const customScrollParent = useEmitterValue('customScrollParent')\n const context = useEmitterValue('context')\n const { scrollerRef, scrollByCallback, scrollToCallback } = useScrollTop(\n scrollContainerStateCallback,\n smoothScrollTargetReached,\n ScrollerComponent,\n u.noop,\n customScrollParent\n )\n\n useIsomorphicLayoutEffect(() => {\n scrollerRef.current = customScrollParent ? customScrollParent : window\n return () => {\n scrollerRef.current = null\n }\n }, [scrollerRef, customScrollParent])\n\n useEmitter('windowScrollTo', scrollToCallback)\n useEmitter('scrollBy', scrollByCallback)\n return createElement(\n ScrollerComponent,\n {\n style: { position: 'relative', ...style, ...(totalListHeight !== 0 ? { height: totalListHeight + deviation } : {}) },\n 'data-virtuoso-scroller': true,\n ...props,\n ...contextPropIfNotDomElement(ScrollerComponent, context),\n },\n children\n )\n })\n return Scroller\n}\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportHeight = usePublisher('viewportHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n return (\n <div style={viewportStyle} ref={viewportRef} data-viewport-type=\"element\">\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle} data-viewport-type=\"window\">\n {children}\n </div>\n )\n}\n\nconst TopItemListContainer: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const TopItemList = useEmitterValue('TopItemListComponent')\n const headerHeight = useEmitterValue('headerHeight')\n const style = { ...topItemListStyle, marginTop: `${headerHeight}px` }\n const context = useEmitterValue('context')\n return createElement(TopItemList || 'div', { style, context }, children)\n}\n\nconst ListRoot: FC<ListRootProps> = React.memo(function VirtuosoRoot(props) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const showTopList = useEmitterValue('topItemsIndexes').length > 0\n const customScrollParent = useEmitterValue('customScrollParent')\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n return (\n <TheScroller {...props}>\n <TheViewport>\n <Header />\n <Items />\n <Footer />\n </TheViewport>\n {showTopList && (\n <TopItemListContainer>\n <Items showTopList={true} />\n </TopItemListContainer>\n )}\n </TheScroller>\n )\n})\n\nexport type ListHandle = RefHandle<typeof List>\n\nexport const {\n Component: List,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n required: {},\n optional: {\n context: 'context',\n followOutput: 'followOutput',\n firstItemIndex: 'firstItemIndex',\n itemContent: 'itemContent',\n groupContent: 'groupContent',\n overscan: 'overscan',\n increaseViewportBy: 'increaseViewportBy',\n totalCount: 'totalCount',\n topItemCount: 'topItemCount',\n initialTopMostItemIndex: 'initialTopMostItemIndex',\n components: 'components',\n groupCounts: 'groupCounts',\n atBottomThreshold: 'atBottomThreshold',\n atTopThreshold: 'atTopThreshold',\n computeItemKey: 'computeItemKey',\n defaultItemHeight: 'defaultItemHeight',\n fixedItemHeight: 'fixedItemHeight',\n itemSize: 'itemSize',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n headerFooterTag: 'headerFooterTag',\n data: 'data',\n initialItemCount: 'initialItemCount',\n initialScrollTop: 'initialScrollTop',\n alignToBottom: 'alignToBottom',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n logLevel: 'logLevel',\n react18ConcurrentRendering: 'react18ConcurrentRendering',\n\n // deprecated\n item: 'item',\n group: 'group',\n topItems: 'topItems',\n itemHeight: 'itemHeight',\n scrollingStateChange: 'scrollingStateChange',\n maxHeightCacheSize: 'maxHeightCacheSize',\n footer: 'footer',\n header: 'header',\n ItemContainer: 'ItemContainer',\n ScrollContainer: 'ScrollContainer',\n ListContainer: 'ListContainer',\n GroupContainer: 'GroupContainer',\n emptyComponent: 'emptyComponent',\n HeaderContainer: 'HeaderContainer',\n FooterContainer: 'FooterContainer',\n scrollSeek: 'scrollSeek',\n },\n methods: {\n scrollToIndex: 'scrollToIndex',\n scrollIntoView: 'scrollIntoView',\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n adjustForPrependedItems: 'adjustForPrependedItems',\n autoscrollToBottom: 'autoscrollToBottom',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n totalListHeightChanged: 'totalListHeightChanged',\n itemsRendered: 'itemsRendered',\n groupIndices: 'groupIndices',\n },\n },\n ListRoot\n)\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n","import * as u from '@virtuoso.dev/urx'\nimport { rangeComparator, tupleComparator } from './comparators'\nimport { domIOSystem } from './domIOSystem'\nimport { FlatIndexLocationWithAlign } from './interfaces'\nimport { propsReadySystem } from './propsReadySystem'\nimport { scrollSeekSystem } from './scrollSeekSystem'\nimport { IndexLocation, normalizeIndexLocation } from './scrollToIndexSystem'\nimport { sizeRangeSystem } from './sizeRangeSystem'\nimport { stateFlagsSystem } from './stateFlagsSystem'\nimport { loggerSystem } from './loggerSystem'\nimport { windowScrollerSystem } from './windowScrollerSystem'\n\nexport interface Gap {\n row: number\n column: number\n}\n\nexport interface ElementDimensions {\n width: number\n height: number\n}\n\nexport interface GridItem {\n index: number\n}\n\nexport interface GridLayout {\n top: number\n bottom: number\n}\n\nexport interface GridState extends GridLayout {\n items: GridItem[]\n offsetTop: number\n offsetBottom: number\n itemHeight: number\n itemWidth: number\n}\n\nconst INITIAL_GRID_STATE: GridState = {\n items: [],\n offsetBottom: 0,\n offsetTop: 0,\n top: 0,\n bottom: 0,\n itemHeight: 0,\n itemWidth: 0,\n}\n\nconst PROBE_GRID_STATE: GridState = {\n items: [{ index: 0 }],\n offsetBottom: 0,\n offsetTop: 0,\n top: 0,\n bottom: 0,\n itemHeight: 0,\n itemWidth: 0,\n}\n\nconst { round, ceil, floor, min, max } = Math\n\nfunction buildItems(startIndex: number, endIndex: number) {\n return Array.from({ length: endIndex - startIndex + 1 }).map((_, i) => ({ index: i + startIndex } as GridItem))\n}\n\nfunction gapComparator(prev: Gap, next: Gap) {\n return prev && prev.column === next.column && prev.row === next.row\n}\nexport const gridSystem = u.system(\n ([\n { overscan, visibleRange, listBoundary },\n { scrollTop, viewportHeight, scrollBy, scrollTo, smoothScrollTargetReached, scrollContainerState },\n stateFlags,\n scrollSeek,\n { propsReady, didMount },\n { windowViewportRect, windowScrollTo, useWindowScroll, customScrollParent, windowScrollContainerState },\n log,\n ]) => {\n const totalCount = u.statefulStream(0)\n const initialItemCount = u.statefulStream(0)\n const gridState = u.statefulStream(INITIAL_GRID_STATE)\n const viewportDimensions = u.statefulStream<ElementDimensions>({ height: 0, width: 0 })\n const itemDimensions = u.statefulStream<ElementDimensions>({ height: 0, width: 0 })\n const scrollToIndex = u.stream<IndexLocation>()\n const scrollHeight = u.stream<number>()\n const deviation = u.statefulStream(0)\n const gap = u.statefulStream<Gap>({ row: 0, column: 0 })\n\n u.connect(\n u.pipe(\n didMount,\n u.withLatestFrom(initialItemCount),\n u.filter(([, count]) => count !== 0),\n u.map(([, count]) => {\n return {\n items: buildItems(0, count - 1),\n top: 0,\n bottom: 0,\n offsetBottom: 0,\n offsetTop: 0,\n itemHeight: 0,\n itemWidth: 0,\n }\n })\n ),\n gridState\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(\n u.duc(totalCount),\n visibleRange,\n u.duc(gap, gapComparator),\n u.duc(itemDimensions, (prev, next) => prev && prev.width === next.width && prev.height === next.height)\n ),\n u.withLatestFrom(viewportDimensions),\n u.map(([[totalCount, [startOffset, endOffset], gap, item], viewport]) => {\n const { row: rowGap, column: columnGap } = gap\n const { height: itemHeight, width: itemWidth } = item\n const { width: viewportWidth } = viewport\n\n if (totalCount === 0 || viewportWidth === 0) {\n return INITIAL_GRID_STATE\n }\n\n if (itemWidth === 0) {\n return PROBE_GRID_STATE\n }\n\n const perRow = itemsPerRow(viewportWidth, itemWidth, columnGap)\n\n let startIndex = perRow * floor((startOffset + rowGap) / (itemHeight + rowGap))\n let endIndex = perRow * ceil((endOffset + rowGap) / (itemHeight + rowGap)) - 1\n endIndex = max(0, min(totalCount - 1, endIndex))\n startIndex = min(endIndex, max(0, startIndex))\n\n const items = buildItems(startIndex, endIndex)\n const { top, bottom } = gridLayout(viewport, gap, item, items)\n const rowCount = ceil(totalCount / perRow)\n const totalHeight = rowCount * itemHeight + (rowCount - 1) * rowGap\n const offsetBottom = totalHeight - bottom\n\n return { items, offsetTop: top, offsetBottom, top, bottom, itemHeight, itemWidth } as GridState\n })\n ),\n gridState\n )\n\n u.connect(\n u.pipe(\n viewportDimensions,\n u.map(({ height }) => height)\n ),\n viewportHeight\n )\n\n u.connect(\n u.pipe(\n u.combineLatest(viewportDimensions, itemDimensions, gridState, gap),\n u.map(([viewportDimensions, item, { items }, gap]) => {\n const { top, bottom } = gridLayout(viewportDimensions, gap, item, items)\n\n return [top, bottom] as [number, number]\n }),\n u.distinctUntilChanged(tupleComparator)\n ),\n listBoundary\n )\n\n const endReached = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => items.length > 0),\n u.withLatestFrom(totalCount),\n u.filter(([{ items }, totalCount]) => items[items.length - 1].index === totalCount - 1),\n u.map(([, totalCount]) => totalCount - 1),\n u.distinctUntilChanged()\n )\n )\n\n const startReached = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => {\n return items.length > 0 && items[0].index === 0\n }),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n u.mapTo(0),\n u.distinctUntilChanged()\n )\n )\n\n const rangeChanged = u.streamFromEmitter(\n u.pipe(\n u.duc(gridState),\n u.filter(({ items }) => items.length > 0),\n u.map(({ items }) => {\n return {\n startIndex: items[0].index,\n endIndex: items[items.length - 1].index,\n }\n }),\n u.distinctUntilChanged(rangeComparator)\n )\n )\n\n u.connect(rangeChanged, scrollSeek.scrollSeekRangeChanged)\n\n u.connect(\n u.pipe(\n scrollToIndex,\n u.withLatestFrom(viewportDimensions, itemDimensions, totalCount, gap),\n u.map(([location, viewport, item, totalCount, gap]) => {\n const normalLocation = normalizeIndexLocation(location) as FlatIndexLocationWithAlign\n const { align, behavior, offset } = normalLocation\n let index = normalLocation.index\n if (index === 'LAST') {\n index = totalCount - 1\n }\n\n index = max(0, index, min(totalCount - 1, index))\n\n let top = itemTop(viewport, gap, item, index)\n\n if (align === 'end') {\n top = round(top - viewport.height + item.height)\n } else if (align === 'center') {\n top = round(top - viewport.height / 2 + item.height / 2)\n }\n\n if (offset) {\n top += offset\n }\n\n return { top, behavior }\n })\n ),\n scrollTo\n )\n\n const totalListHeight = u.statefulStreamFromEmitter(\n u.pipe(\n gridState,\n u.map((gridState) => {\n return gridState.offsetBottom + gridState.bottom\n })\n ),\n 0\n )\n\n u.connect(\n u.pipe(\n windowViewportRect,\n u.map((viewportInfo) => ({ width: viewportInfo.visibleWidth, height: viewportInfo.visibleHeight }))\n ),\n viewportDimensions\n )\n\n return {\n // input\n totalCount,\n viewportDimensions,\n itemDimensions,\n scrollTop,\n scrollHeight,\n overscan,\n scrollBy,\n scrollTo,\n scrollToIndex,\n smoothScrollTargetReached,\n windowViewportRect,\n windowScrollTo,\n useWindowScroll,\n customScrollParent,\n windowScrollContainerState,\n deviation,\n scrollContainerState,\n initialItemCount,\n gap,\n ...scrollSeek,\n\n // output\n gridState,\n totalListHeight,\n ...stateFlags,\n startReached,\n endReached,\n rangeChanged,\n propsReady,\n ...log,\n }\n },\n u.tup(sizeRangeSystem, domIOSystem, stateFlagsSystem, scrollSeekSystem, propsReadySystem, windowScrollerSystem, loggerSystem)\n)\n\nfunction gridLayout(viewport: ElementDimensions, gap: Gap, item: ElementDimensions, items: GridItem[]): GridLayout {\n const { height: itemHeight } = item\n if (itemHeight === undefined || items.length === 0) {\n return { top: 0, bottom: 0 }\n }\n\n const top = itemTop(viewport, gap, item, items[0].index)\n const bottom = itemTop(viewport, gap, item, items[items.length - 1].index) + itemHeight\n return { top, bottom }\n}\n\nfunction itemTop(viewport: ElementDimensions, gap: Gap, item: ElementDimensions, index: number) {\n const perRow = itemsPerRow(viewport.width, item.width, gap.column)\n const rowCount = floor(index / perRow)\n const top = rowCount * item.height + max(0, rowCount - 1) * gap.row\n return top > 0 ? top + gap.row : top\n}\n\nfunction itemsPerRow(viewportWidth: number, itemWidth: number, gap: number) {\n return max(1, floor((viewportWidth + gap) / (itemWidth + gap)))\n}\n","import { RefHandle, systemToComponent } from '@virtuoso.dev/react-urx'\n\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { createElement, FC, PropsWithChildren } from 'react'\nimport { gridSystem } from './gridSystem'\nimport useSize from './hooks/useSize'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\nimport { GridComponents, GridComputeItemKey, GridItemContent, GridRootProps } from './interfaces'\nimport { addDeprecatedAlias, buildScroller, buildWindowScroller, contextPropIfNotDomElement, identity, viewportStyle } from './List'\nimport { Log, LogLevel } from './loggerSystem'\n\nconst gridComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<GridItemContent<any>>((index) => `Item ${index}`)\n const components = u.statefulStream<GridComponents>({})\n const context = u.statefulStream<unknown>(null)\n const itemClassName = u.statefulStream('virtuoso-grid-item')\n const listClassName = u.statefulStream('virtuoso-grid-list')\n const computeItemKey = u.statefulStream<GridComputeItemKey>(identity)\n const scrollerRef = u.statefulStream<(ref: HTMLElement | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof GridComponents>(propName: K, defaultValue: GridComponents[K] | null | 'div' = null) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n components,\n computeItemKey,\n itemClassName,\n listClassName,\n scrollerRef,\n ListComponent: distinctProp('List', 'div'),\n ItemComponent: distinctProp('Item', 'div'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder', 'div'),\n }\n})\n\nconst combinedSystem = u.system(([gridSystem, gridComponentPropsSystem]) => {\n const deprecatedProps = {\n item: addDeprecatedAlias(gridComponentPropsSystem.itemContent, 'Rename the %citem%c prop to %citemContent.'),\n ItemContainer: u.stream<any>(),\n ScrollContainer: u.stream<any>(),\n ListContainer: u.stream<any>(),\n emptyComponent: u.stream<any>(),\n scrollSeek: u.stream<any>(),\n }\n\n function deprecateComponentProp(stream: u.Stream<any>, componentName: string, propName: string) {\n u.connect(\n u.pipe(\n stream,\n u.withLatestFrom(gridComponentPropsSystem.components),\n u.map(([comp, components]) => {\n console.warn(`react-virtuoso: ${propName} property is deprecated. Pass components.${componentName} instead.`)\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n return { ...components, [componentName]: comp }\n })\n ),\n gridComponentPropsSystem.components\n )\n }\n\n u.subscribe(deprecatedProps.scrollSeek, ({ placeholder, ...config }) => {\n console.warn(\n `react-virtuoso: scrollSeek property is deprecated. Pass scrollSeekConfiguration and specify the placeholder in components.ScrollSeekPlaceholder instead.`\n )\n u.publish(gridComponentPropsSystem.components, {\n ...u.getValue(gridComponentPropsSystem.components),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ScrollSeekPlaceholder: placeholder,\n })\n u.publish(gridSystem.scrollSeekConfiguration, config)\n })\n\n deprecateComponentProp(deprecatedProps.ItemContainer, 'Item', 'ItemContainer')\n deprecateComponentProp(deprecatedProps.ListContainer, 'List', 'ListContainer')\n deprecateComponentProp(deprecatedProps.ScrollContainer, 'Scroller', 'ScrollContainer')\n\n return { ...gridSystem, ...gridComponentPropsSystem, ...deprecatedProps }\n}, u.tup(gridSystem, gridComponentPropsSystem))\n\nconst GridItems: FC = React.memo(function GridItems() {\n const gridState = useEmitterValue('gridState')\n const listClassName = useEmitterValue('listClassName')\n const itemClassName = useEmitterValue('itemClassName')\n const itemContent = useEmitterValue('itemContent')\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const scrollHeightCallback = usePublisher('scrollHeight')\n const ItemComponent = useEmitterValue('ItemComponent')!\n const ListComponent = useEmitterValue('ListComponent')!\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder')!\n const context = useEmitterValue('context')\n const itemDimensions = usePublisher('itemDimensions')\n const gridGap = usePublisher('gap')\n const log = useEmitterValue('log')\n\n const listRef = useSize((el) => {\n const scrollHeight = el.parentElement!.parentElement!.scrollHeight\n scrollHeightCallback(scrollHeight)\n const firstItem = el.firstChild as HTMLElement\n if (firstItem) {\n itemDimensions(firstItem.getBoundingClientRect())\n }\n gridGap({\n row: resolveGapValue('row-gap', getComputedStyle(el).rowGap, log),\n column: resolveGapValue('column-gap', getComputedStyle(el).columnGap, log),\n })\n })\n\n return createElement(\n ListComponent,\n {\n ref: listRef,\n className: listClassName,\n ...contextPropIfNotDomElement(ListComponent, context),\n style: { paddingTop: gridState.offsetTop, paddingBottom: gridState.offsetBottom },\n },\n gridState.items.map((item) => {\n const key = computeItemKey(item.index)\n return isSeeking\n ? createElement(ScrollSeekPlaceholder, {\n key,\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n index: item.index,\n height: gridState.itemHeight,\n width: gridState.itemWidth,\n })\n : createElement(\n ItemComponent,\n { ...contextPropIfNotDomElement(ItemComponent, context), className: itemClassName, 'data-index': item.index, key },\n itemContent(item.index, context)\n )\n })\n )\n})\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportDimensions = usePublisher('viewportDimensions')\n\n const viewportRef = useSize((el) => {\n viewportDimensions(el.getBoundingClientRect())\n })\n\n return (\n <div style={viewportStyle} ref={viewportRef}>\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle}>\n {children}\n </div>\n )\n}\n\nconst GridRoot: FC<GridRootProps> = React.memo(function GridRoot({ ...props }) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n\n return (\n <TheScroller {...props}>\n <TheViewport>\n <GridItems />\n </TheViewport>\n </TheScroller>\n )\n})\n\nconst {\n Component: Grid,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n optional: {\n totalCount: 'totalCount',\n overscan: 'overscan',\n itemContent: 'itemContent',\n components: 'components',\n computeItemKey: 'computeItemKey',\n initialItemCount: 'initialItemCount',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n listClassName: 'listClassName',\n itemClassName: 'itemClassName',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n\n // deprecated\n item: 'item',\n ItemContainer: 'ItemContainer',\n ScrollContainer: 'ScrollContainer',\n ListContainer: 'ListContainer',\n scrollSeek: 'scrollSeek',\n },\n methods: {\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n scrollToIndex: 'scrollToIndex',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n },\n },\n GridRoot\n)\n\nexport type foo<T> = T extends React.ForwardRefExoticComponent<React.RefAttributes<infer Handle>> ? Handle : never\n\nexport type GridHandle = RefHandle<typeof Grid>\nexport { Grid }\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n\nfunction resolveGapValue(property: string, value: string | undefined, log: Log) {\n if (value !== 'normal' && !value?.endsWith('px')) {\n log(`${property} was not resolved to pixel value correctly`, value, LogLevel.WARN)\n }\n if (value === 'normal') {\n return 0\n }\n return parseInt(value ?? '0', 10)\n}\n","import { systemToComponent } from '@virtuoso.dev/react-urx'\nimport * as u from '@virtuoso.dev/urx'\nimport * as React from 'react'\nimport { createElement, FC, PropsWithChildren } from 'react'\nimport useChangedListContentsSizes from './hooks/useChangedChildSizes'\nimport { ComputeItemKey, ItemContent, FixedHeaderContent, TableComponents, TableRootProps } from './interfaces'\nimport { listSystem } from './listSystem'\nimport { identity, buildScroller, buildWindowScroller, viewportStyle, contextPropIfNotDomElement } from './List'\nimport useSize from './hooks/useSize'\nimport { correctItemSize } from './utils/correctItemSize'\nimport useWindowViewportRectRef from './hooks/useWindowViewportRect'\n\nconst tableComponentPropsSystem = u.system(() => {\n const itemContent = u.statefulStream<ItemContent<any, unknown>>((index: number) => <td>Item ${index}</td>)\n const context = u.statefulStream<unknown>(null)\n const fixedHeaderContent = u.statefulStream<FixedHeaderContent>(null)\n const components = u.statefulStream<TableComponents>({})\n const computeItemKey = u.statefulStream<ComputeItemKey<any, unknown>>(identity)\n const scrollerRef = u.statefulStream<(ref: HTMLElement | Window | null) => void>(u.noop)\n\n const distinctProp = <K extends keyof TableComponents>(\n propName: K,\n defaultValue: TableComponents[K] | null | 'thead' | 'table' | 'tbody' | 'tr' | 'div' = null\n ) => {\n return u.statefulStreamFromEmitter(\n u.pipe(\n components,\n u.map((components) => components[propName]),\n u.distinctUntilChanged()\n ),\n defaultValue\n )\n }\n\n return {\n context,\n itemContent,\n fixedHeaderContent,\n components,\n computeItemKey,\n scrollerRef,\n TableComponent: distinctProp('Table', 'table'),\n TableHeadComponent: distinctProp('TableHead', 'thead'),\n TableBodyComponent: distinctProp('TableBody', 'tbody'),\n TableRowComponent: distinctProp('TableRow', 'tr'),\n ScrollerComponent: distinctProp('Scroller', 'div'),\n EmptyPlaceholder: distinctProp('EmptyPlaceholder'),\n ScrollSeekPlaceholder: distinctProp('ScrollSeekPlaceholder'),\n FillerRow: distinctProp('FillerRow'),\n }\n})\n\nconst combinedSystem = u.system(([listSystem, propsSystem]) => {\n return { ...listSystem, ...propsSystem }\n}, u.tup(listSystem, tableComponentPropsSystem))\n\nconst DefaultScrollSeekPlaceholder = ({ height }: { height: number }) => (\n <tr>\n <td style={{ height }}></td>\n </tr>\n)\n\nconst DefaultFillerRow = ({ height }: { height: number }) => (\n <tr>\n <td style={{ height: height, padding: 0, border: 0 }}></td>\n </tr>\n)\n\nexport const Items = React.memo(function VirtuosoItems() {\n const listState = useEmitterValue('listState')\n const sizeRanges = usePublisher('sizeRanges')\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const windowScrollContainerStateCallback = usePublisher('windowScrollContainerState')\n const _scrollContainerStateCallback = usePublisher('scrollContainerState')\n const scrollContainerStateCallback =\n customScrollParent || useWindowScroll ? windowScrollContainerStateCallback : _scrollContainerStateCallback\n const itemContent = useEmitterValue('itemContent')\n const trackItemSizes = useEmitterValue('trackItemSizes')\n const itemSize = useEmitterValue('itemSize')\n const log = useEmitterValue('log')\n\n const { callbackRef, ref } = useChangedListContentsSizes(\n sizeRanges,\n itemSize,\n trackItemSizes,\n scrollContainerStateCallback,\n log,\n undefined,\n customScrollParent\n )\n\n const [deviation, setDeviation] = React.useState(0)\n useEmitter('deviation', (value) => {\n if (deviation !== value) {\n ref.current!.style.marginTop = `${value}px`\n setDeviation(value)\n }\n })\n const EmptyPlaceholder = useEmitterValue('EmptyPlaceholder')\n const ScrollSeekPlaceholder = useEmitterValue('ScrollSeekPlaceholder') || DefaultScrollSeekPlaceholder\n const FillerRow = useEmitterValue('FillerRow') || DefaultFillerRow\n const TableBodyComponent = useEmitterValue('TableBodyComponent')!\n const TableRowComponent = useEmitterValue('TableRowComponent')!\n const computeItemKey = useEmitterValue('computeItemKey')\n const isSeeking = useEmitterValue('isSeeking')\n const paddingTopAddition = useEmitterValue('paddingTopAddition')\n const firstItemIndex = useEmitterValue('firstItemIndex')\n const statefulTotalCount = useEmitterValue('statefulTotalCount')\n const context = useEmitterValue('context')\n\n if (statefulTotalCount === 0 && EmptyPlaceholder) {\n return createElement(EmptyPlaceholder, contextPropIfNotDomElement(EmptyPlaceholder, context))\n }\n\n const paddingTop = listState.offsetTop + paddingTopAddition + deviation\n const paddingBottom = listState.offsetBottom\n\n const paddingTopEl = paddingTop > 0 ? <FillerRow height={paddingTop} key=\"padding-top\" /> : null\n\n const paddingBottomEl = paddingBottom > 0 ? <FillerRow height={paddingBottom} key=\"padding-bottom\" /> : null\n\n const items = listState.items.map((item) => {\n const index = item.originalIndex!\n const key = computeItemKey(index + firstItemIndex, item.data, context)\n\n if (isSeeking) {\n return createElement(ScrollSeekPlaceholder, {\n ...contextPropIfNotDomElement(ScrollSeekPlaceholder, context),\n key,\n index: item.index,\n height: item.size,\n type: item.type || 'item',\n })\n }\n return createElement(\n TableRowComponent,\n {\n ...contextPropIfNotDomElement(TableRowComponent, context),\n key,\n 'data-index': index,\n 'data-known-size': item.size,\n 'data-item-index': item.index,\n style: { overflowAnchor: 'none' },\n },\n itemContent(item.index, item.data, context)\n )\n })\n\n return createElement(\n TableBodyComponent,\n { ref: callbackRef, 'data-test-id': 'virtuoso-item-list', ...contextPropIfNotDomElement(TableBodyComponent, context) },\n [paddingTopEl, ...items, paddingBottomEl]\n )\n})\n\nexport interface Hooks {\n usePublisher: typeof usePublisher\n useEmitterValue: typeof useEmitterValue\n useEmitter: typeof useEmitter\n}\n\nconst Viewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const viewportHeight = usePublisher('viewportHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n return (\n <div style={viewportStyle} ref={viewportRef} data-viewport-type=\"element\">\n {children}\n </div>\n )\n}\n\nconst WindowViewport: FC<PropsWithChildren<unknown>> = ({ children }) => {\n const windowViewportRect = usePublisher('windowViewportRect')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n return (\n <div ref={viewportRef} style={viewportStyle} data-viewport-type=\"window\">\n {children}\n </div>\n )\n}\n\nconst TableRoot: FC<TableRootProps> = React.memo(function TableVirtuosoRoot(props) {\n const useWindowScroll = useEmitterValue('useWindowScroll')\n const customScrollParent = useEmitterValue('customScrollParent')\n const fixedHeaderHeight = usePublisher('fixedHeaderHeight')\n const fixedHeaderContent = useEmitterValue('fixedHeaderContent')\n const context = useEmitterValue('context')\n const theadRef = useSize(u.compose(fixedHeaderHeight, (el) => correctItemSize(el, 'height')))\n const TheScroller = customScrollParent || useWindowScroll ? WindowScroller : Scroller\n const TheViewport = customScrollParent || useWindowScroll ? WindowViewport : Viewport\n const TheTable = useEmitterValue('TableComponent')\n const TheTHead = useEmitterValue('TableHeadComponent')\n\n const theHead = fixedHeaderContent\n ? React.createElement(\n TheTHead!,\n {\n key: 'TableHead',\n style: { zIndex: 1, position: 'sticky', top: 0 },\n ref: theadRef,\n ...contextPropIfNotDomElement(TheTHead, context),\n },\n fixedHeaderContent()\n )\n : null\n\n return (\n <TheScroller {...props}>\n <TheViewport>\n {React.createElement(TheTable!, { style: { borderSpacing: 0 }, ...contextPropIfNotDomElement(TheTable, context) }, [\n theHead,\n <Items key=\"TableBody\" />,\n ])}\n </TheViewport>\n </TheScroller>\n )\n})\n\nexport const {\n Component: Table,\n usePublisher,\n useEmitterValue,\n useEmitter,\n} = systemToComponent(\n combinedSystem,\n {\n required: {},\n optional: {\n context: 'context',\n followOutput: 'followOutput',\n firstItemIndex: 'firstItemIndex',\n itemContent: 'itemContent',\n fixedHeaderContent: 'fixedHeaderContent',\n overscan: 'overscan',\n increaseViewportBy: 'increaseViewportBy',\n totalCount: 'totalCount',\n topItemCount: 'topItemCount',\n initialTopMostItemIndex: 'initialTopMostItemIndex',\n components: 'components',\n groupCounts: 'groupCounts',\n atBottomThreshold: 'atBottomThreshold',\n atTopThreshold: 'atTopThreshold',\n computeItemKey: 'computeItemKey',\n defaultItemHeight: 'defaultItemHeight',\n fixedItemHeight: 'fixedItemHeight',\n itemSize: 'itemSize',\n scrollSeekConfiguration: 'scrollSeekConfiguration',\n data: 'data',\n initialItemCount: 'initialItemCount',\n initialScrollTop: 'initialScrollTop',\n alignToBottom: 'alignToBottom',\n useWindowScroll: 'useWindowScroll',\n customScrollParent: 'customScrollParent',\n scrollerRef: 'scrollerRef',\n logLevel: 'logLevel',\n react18ConcurrentRendering: 'react18ConcurrentRendering',\n },\n methods: {\n scrollToIndex: 'scrollToIndex',\n scrollIntoView: 'scrollIntoView',\n scrollTo: 'scrollTo',\n scrollBy: 'scrollBy',\n },\n events: {\n isScrolling: 'isScrolling',\n endReached: 'endReached',\n startReached: 'startReached',\n rangeChanged: 'rangeChanged',\n atBottomStateChange: 'atBottomStateChange',\n atTopStateChange: 'atTopStateChange',\n totalListHeightChanged: 'totalListHeightChanged',\n itemsRendered: 'itemsRendered',\n groupIndices: 'groupIndices',\n },\n },\n TableRoot\n)\n\nconst Scroller = buildScroller({ usePublisher, useEmitterValue, useEmitter })\nconst WindowScroller = buildWindowScroller({ usePublisher, useEmitterValue, useEmitter })\n","import { ReactElement, Ref } from 'react'\n\nimport {\n Components,\n ComputeItemKey,\n FollowOutput,\n GridComponents,\n GridComputeItemKey,\n GridItemContent,\n GroupContent,\n GroupItemContent,\n IndexLocationWithAlign,\n ItemContent,\n ListItem,\n ListRange,\n ScrollSeekConfiguration,\n TableComponents,\n FixedHeaderContent,\n ScrollIntoViewLocation,\n ListRootProps,\n GridRootProps,\n FlatIndexLocationWithAlign,\n FlatScrollIntoViewLocation,\n} from './interfaces'\nimport { List } from './List'\nimport { Grid } from './Grid'\nimport { Table } from './Table'\n\nexport interface VirtuosoProps<D, C> extends ListRootProps {\n /**\n * The total amount of items to be rendered.\n */\n totalCount?: number\n\n /**\n * The data items to be rendered. If data is set, the total count will be inferred from the length of the array.\n */\n data?: readonly D[]\n\n /**\n * Additional context available in the custom components and content callbacks\n */\n context?: C\n\n /**\n * *The property accepts pixel values.*\n *\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n * See the `increaseViewportBy` property for a similar behavior (equivalent to the `overscan` in react-window).\n *\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n *\n * *The property accepts pixel values.*\n *\n * Set the increaseViewportBy property to artificially increase the viewport size, causing items to be rendered before outside of the viewport.\n * The property causes the component to render more items than the necessary, but can help with slow loading content.\n * Using `{ top?: number, bottom?: number }` lets you set the increase for each end separately.\n *\n */\n increaseViewportBy?: number | { top: number; bottom: number }\n\n /**\n * Set the amount of items to remain fixed at the top of the list.\n *\n * For a header that scrolls away when scrolling, check the `components.Header` property.\n */\n topItemCount?: number\n\n /**\n * Set to a value between 0 and totalCount - 1 to make the list start scrolled to that item.\n * Pass in an object to achieve additional effects similar to `scrollToIndex`.\n */\n initialTopMostItemIndex?: number | IndexLocationWithAlign\n\n /**\n * Set this value to offset the initial location of the list.\n * Warning: using this property will still run a render cycle at the scrollTop: 0 list window.\n * If possible, avoid using it and stick to `initialTopMostItemIndex` instead.\n */\n initialScrollTop?: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Use the `components` property for advanced customization of the elements rendered by the list.\n */\n components?: Components<C>\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: ItemContent<D, C>\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: ComputeItemKey<D, C>\n\n /**\n * By default, the component assumes the default item height from the first rendered item (rendering it as a \"probe\").\n *\n * If the first item turns out to be an outlier (very short or tall), the rest of the rendering will be slower,\n * as multiple passes of rendering should happen for the list to fill the viewport.\n *\n * Setting `defaultItemHeight` causes the component to skip the \"probe\" rendering and use the property\n * value as default height instead.\n */\n defaultItemHeight?: number\n\n /**\n * Allows customizing the height/width calculation of `Item` elements.\n *\n * The default implementation reads `el.getBoundingClientRect().height` and `el.getBoundingClientRect().width`.\n */\n itemSize?: (el: HTMLElement, dimension: 'height' | 'width') => number\n\n /**\n * Can be used to improve performance if the rendered items are of known size.\n * Setting it causes the component to skip item measurements.\n */\n fixedItemHeight?: number\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * If set to `true`, the list automatically scrolls to bottom if the total count is changed.\n * Set to `\"smooth\"` for an animated scrolling.\n *\n * By default, `followOutput` scrolls down only if the list is already at the bottom.\n * To implement an arbitrary logic behind that, pass a function:\n *\n * ```tsx\n * <Virtuoso\n * followOutput={(isAtBottom: boolean) => {\n * if (expression) {\n * return 'smooth' // can be 'auto' or false to avoid scrolling\n * } else {\n * return false\n * }\n * }} />\n * ```\n */\n followOutput?: FollowOutput\n\n /**\n * Set to customize the wrapper tag for the header and footer components (default is `div`).\n */\n headerFooterTag?: string\n\n /**\n * Use when implementing inverse infinite scrolling - decrease the value this property\n * in combination with `data` or `totalCount` to prepend items to the top of the list.\n *\n * Warning: the firstItemIndex should **be a positive number**, based on the total amount of items to be displayed.\n */\n firstItemIndex?: number\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Called when the total list height is changed due to new items or viewport resize.\n */\n totalListHeightChanged?: (height: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n itemsRendered?: (items: ListItem<D>[]) => void\n\n /**\n * Setting `alignToBottom` to `true` aligns the items to the bottom of the list if the list is shorter than the viewport.\n * Use `followOutput` property to keep the list aligned when new items are appended.\n */\n alignToBottom?: boolean\n\n /**\n * Uses the document scroller rather than wrapping the list in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the list won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | Window | null) => any\n\n /**\n * *The property accepts pixel values.*\n *\n * By default `0`. Redefine to change how much away from the top the scroller can be before the list is not considered not at top.\n */\n atTopThreshold?: number\n\n /**\n * *The property accepts pixel values.*\n *\n * By default `4`. Redefine to change how much away from the bottom the scroller can be before the list is not considered not at bottom.\n */\n atBottomThreshold?: number\n\n /**\n * No longer necessary after 2.10.2. component should work out of the box.\n */\n react18ConcurrentRendering?: boolean\n}\n\nexport interface GroupedVirtuosoProps<D, C> extends Omit<VirtuosoProps<D, C>, 'totalCount' | 'itemContent'> {\n /**\n * Specifies the amount of items in each group (and, actually, how many groups are there).\n * For example, passing [20, 30] will display 2 groups with 20 and 30 items each.\n */\n groupCounts?: number[]\n\n /**\n * Specifies how each each group header gets rendered. The callback receives the zero-based index of the group.\n */\n groupContent?: GroupContent\n\n /**\n * Specifies how each each item gets rendered.\n */\n itemContent?: GroupItemContent<D, C>\n}\n\nexport interface TableVirtuosoProps<D, C> extends Omit<VirtuosoProps<D, C>, 'components' | 'headerFooterTag' | 'topItemCount'> {\n /**\n * Use the `components` property for advanced customization of the elements rendered by the table.\n */\n components?: TableComponents<C>\n /**\n * Set the contents of the table header.\n */\n fixedHeaderContent?: FixedHeaderContent\n\n /**\n * The total amount of items to be rendered.\n */\n totalCount?: number\n\n /**\n * The data items to be rendered. If data is set, the total count will be inferred from the length of the array.\n */\n data?: readonly D[]\n\n /**\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n * See the `increaseViewportBy` property for a similar behavior (equivalent to the `overscan` in `react-window`).\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n * Set the increaseViewportBy property to artificially increase the viewport size, causing items to be rendered before outside of the viewport.\n * The property causes the component to render more items than the necessary, but can help with slow loading content.\n * Using `{ top?: number, bottom?: number }` lets you set the increase for each end separately.\n */\n increaseViewportBy?: number | { top: number; bottom: number }\n\n /**\n * Set to a value between 0 and totalCount - 1 to make the list start scrolled to that item.\n */\n initialTopMostItemIndex?: number\n\n /**\n * Set this value to offset the initial location of the list.\n * Warning: using this property will still run a render cycle at the scrollTop: 0 list window.\n * If possible, avoid using it and stick to `initialTopMostItemIndex` instead.\n */\n initialScrollTop?: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: ItemContent<D, C>\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: ComputeItemKey<D, C>\n\n /**\n * By default, the component assumes the default item height from the first rendered item (rendering it as a \"probe\").\n *\n * If the first item turns out to be an outlier (very short or tall), the rest of the rendering will be slower,\n * as multiple passes of rendering should happen for the list to fill the viewport.\n *\n * Setting `defaultItemHeight` causes the component to skip the \"probe\" rendering and use the property\n * value as default height instead.\n */\n defaultItemHeight?: number\n\n /**\n * Allows customizing the height/width calculation of `Item` elements.\n *\n * The default implementation reads `el.getBoundingClientRect().height` and `el.getBoundingClientRect().width`.\n */\n itemSize?: (el: HTMLElement, dimension: 'height' | 'width') => number\n\n /**\n * Can be used to improve performance if the rendered items are of known size.\n * Setting it causes the component to skip item measurements.\n */\n fixedItemHeight?: number\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * If set to `true`, the list automatically scrolls to bottom if the total count is changed.\n * Set to `\"smooth\"` for an animated scrolling.\n *\n * By default, `followOutput` scrolls down only if the list is already at the bottom.\n * To implement an arbitrary logic behind that, pass a function:\n *\n * ```tsx\n * <Virtuoso\n * followOutput={(isAtBottom: boolean) => {\n * if (expression) {\n * return 'smooth' // can be 'auto' or false to avoid scrolling\n * } else {\n * return false\n * }\n * }} />\n * ```\n */\n followOutput?: FollowOutput\n\n /**\n * Use when implementing inverse infinite scrolling - decrease the value this property\n * in combination with `data` or `totalCount` to prepend items to the top of the list.\n *\n * Warning: the firstItemIndex should **be a positive number**, based on the total amount of items to be displayed.\n */\n firstItemIndex?: number\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Called when the total list height is changed due to new items or viewport resize.\n */\n totalListHeightChanged?: (height: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n itemsRendered?: (items: ListItem<D>[]) => void\n\n /**\n * Setting `alignToBottom` to `true` aligns the items to the bottom of the list if the list is shorter than the viewport.\n * Use `followOutput` property to keep the list aligned when new items are appended.\n */\n alignToBottom?: boolean\n\n /**\n * Uses the document scroller rather than wrapping the list in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the table won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | Window | null) => any\n\n /**\n * By default `0`. Redefine to change how much away from the top the scroller can be before the list is not considered not at top.\n */\n atTopThreshold?: number\n\n /**\n * By default `4`. Redefine to change how much away from the bottom the scroller can be before the list is not considered not at bottom.\n */\n atBottomThreshold?: number\n\n /**\n * No longer necessary after 2.10.2. component should work out of the box.\n */\n react18ConcurrentRendering?: boolean\n}\n\nexport interface VirtuosoGridProps<C = unknown> extends GridRootProps {\n /**\n * The total amount of items to be rendered.\n */\n totalCount: number\n\n /**\n * Use for server-side rendering - if set, the list will render the specified amount of items\n * regardless of the container / item size.\n */\n initialItemCount?: number\n\n /**\n * Set the callback to specify the contents of the item.\n */\n itemContent?: GridItemContent<C>\n\n /**\n * Use the `components` property for advanced customization of the elements rendered by the list.\n */\n components?: GridComponents<C>\n\n /**\n * Set the overscan property to make the component \"chunk\" the rendering of new items on scroll.\n * The property causes the component to render more items than the necessary, but reduces the re-renders on scroll.\n * Setting `{ main: number, reverse: number }` lets you extend the list in both the main and the reverse scrollable directions.\n */\n overscan?: number | { main: number; reverse: number }\n\n /**\n * If specified, the component will use the function to generate the `key` property for each list item.\n */\n computeItemKey?: GridComputeItemKey\n\n /**\n * Use to display placeholders if the user scrolls fast through the list.\n *\n * Set `components.ScrollSeekPlaceholder` to change the placeholder content.\n */\n scrollSeekConfiguration?: ScrollSeekConfiguration | false\n\n /**\n * Called when the list starts/stops scrolling.\n */\n isScrolling?: (isScrolling: boolean) => void\n\n /**\n * Gets called when the user scrolls to the end of the list.\n * Receives the last item index as an argument. Can be used to implement endless scrolling.\n */\n endReached?: (index: number) => void\n\n /**\n * Called when the user scrolls to the start of the list.\n */\n startReached?: (index: number) => void\n\n /**\n * Called with the new set of items each time the list items are rendered due to scrolling.\n */\n rangeChanged?: (range: ListRange) => void\n\n /**\n * Called with true / false when the list has reached the bottom / gets scrolled up.\n * Can be used to load newer items, like `tail -f`.\n */\n atBottomStateChange?: (atBottom: boolean) => void\n\n /**\n * Called with `true` / `false` when the list has reached the top / gets scrolled down.\n */\n atTopStateChange?: (atTop: boolean) => void\n\n /**\n * Provides access to the root DOM element\n */\n scrollerRef?: (ref: HTMLElement | null) => any\n\n /**\n * Sets the className for the list DOM element\n */\n listClassName?: string\n\n /**\n * Sets the grid items' className\n */\n itemClassName?: string\n\n /**\n * Uses the document scroller rather than wrapping the grid in its own.\n */\n useWindowScroll?: boolean\n\n /**\n * Pass a reference to a scrollable parent element, so that the grid won't wrap in its own.\n */\n customScrollParent?: HTMLElement\n}\n\nexport interface VirtuosoHandle {\n /**\n * Scrolls the component to the specified item index. See {@link IndexLocationWithAlign} for more options.\n */\n scrollToIndex(location: number | FlatIndexLocationWithAlign): void\n /**\n * Scrolls the item into view if necessary. See [the website example](http://virtuoso.dev/keyboard-navigation/) for an implementation.\n */\n scrollIntoView(location: FlatScrollIntoViewLocation): void\n /**\n * Scrolls the component to the specified location. See [ScrollToOptions (MDN)](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions)\n */\n scrollTo(location: ScrollToOptions): void\n /**\n * Scrolls the component with the specified amount. See [ScrollToOptions (MDN)](https://developer.mozilla.org/en-US/docs/Web/API/ScrollToOptions)\n */\n scrollBy(location: ScrollToOptions): void\n /**\n * Use this with combination with follow output if you have images loading in the list. Listen to the image loading and call the method.\n */\n autoscrollToBottom(): void\n}\n\nexport interface GroupedVirtuosoHandle {\n scrollToIndex(location: number | IndexLocationWithAlign): void\n scrollIntoView(location: number | ScrollIntoViewLocation): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n autoscrollToBottom(): void\n}\n\nexport interface VirtuosoGridHandle {\n scrollToIndex(location: number | IndexLocationWithAlign): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n}\n\nexport interface TableVirtuosoHandle {\n scrollIntoView(location: number | FlatScrollIntoViewLocation): void\n scrollToIndex(location: number | FlatIndexLocationWithAlign): void\n scrollTo(location: ScrollToOptions): void\n scrollBy(location: ScrollToOptions): void\n}\n\nexport const Virtuoso = List as <ItemData = any, Context = any>(\n props: VirtuosoProps<ItemData, Context> & { ref?: Ref<VirtuosoHandle> }\n) => ReactElement\n\nexport const GroupedVirtuoso = List as <ItemData = any, Context = any>(\n props: GroupedVirtuosoProps<ItemData, Context> & { ref?: Ref<GroupedVirtuosoHandle> }\n) => ReactElement\n\nexport const TableVirtuoso = Table as <ItemData = any, Context = any>(\n props: TableVirtuosoProps<ItemData, Context> & { ref?: Ref<TableVirtuosoHandle> }\n) => ReactElement\n\nexport const VirtuosoGrid = Grid as <Context = any>(props: VirtuosoGridProps<Context> & { ref?: Ref<VirtuosoGridHandle> }) => ReactElement\n"],"names":["LogLevel","useIsomorphicLayoutEffect","document","useLayoutEffect","useEffect","CONSOLE_METHOD_MAP","DEBUG","INFO","_CONSOLE_METHOD_MAP","WARN","ERROR","loggerSystem","u","system","logLevel","statefulStream","log","label","message","level","_getGlobalThis$VIRTUO","globalThis","window","getValue","console","singleton","useSizeWithElRef","callback","enabled","ref","useRef","callbackRef","_el","ResizeObserver","observer","entries","element","target","offsetParent","elRef","observe","current","unobserve","useSize","useChangedListContentsSizes","itemSize","scrollContainerStateCallback","gap","customScrollParent","el","ranges","children","field","length","results","i","child","item","undefined","dataset","index","parseInt","knownSize","parseFloat","size","lastResult","endIndex","push","startIndex","getChangedChildSizes","scrollableElement","parentElement","scrollTop","firstElementChild","pageYOffset","documentElement","Math","max","scrollHeight","viewportHeight","offsetHeight","property","value","endsWith","resolveGapValue","getComputedStyle","rowGap","correctItemSize","dimension","round","getBoundingClientRect","approximatelyEqual","num1","num2","abs","useScrollTop","smoothScrollTargetReached","scrollerElement","scrollerRefCallback","noop","scrollerRef","scrollTopTarget","timeoutRef","shouldFlushSync","handler","useCallback","ev","windowScroll","innerHeight","call","flushSync","clearTimeout","localRef","addEventListener","passive","removeEventListener","scrollByCallback","location","scrollBy","scrollToCallback","isSmooth","behavior","top","ceil","min","setTimeout","scrollTo","domIOSystem","scrollContainerState","stream","deviation","statefulScrollTop","headerHeight","fixedHeaderHeight","footerHeight","scrollingInProgress","react18ConcurrentRendering","connect","pipe","map","_ref","_ref2","NIL_NODE","lvl","newAANode","k","v","l","r","empty","node","newTree","remove","key","last","adjust","clone","_last","deleteLast","findMaxKeyValue","Infinity","insert","split","skew","rebalance","walkWithin","start","end","result","concat","walk","args","isSingle","Error","rl","rlvl","rangesWithin","arrayToRanges","items","parser","_parser","nextIndex","nextValue","_parser2","findIndexOfClosestSmallerOrEqual","comparator","floor","match","join","findClosestSmallerOrEqual","recalcSystem","recalcInProgress","rangeIncludes","refRange","range","indexComparator","itemIndex","offsetComparator","offset","itemOffset","offsetPointParser","point","createOffsetTree","prevOffsetTree","syncStart","sizeTree","offsetTree","prevIndex","prevSize","prevOffset","arrayBinarySearch","kv","slice","_step3","_iterator3","done","_step3$value","indexOffset","aOffset","lastIndex","lastOffset","lastSize","sizeStateReducer","state","_ref3","groupIndices","newSizeTree","groupSize","reduce","tree","groupIndex","insertRanges","_step","_iterator","overlappingRanges","some","_step2","firstPassDone","shouldInsert","_iterator2","rangeStart","rangeEnd","_step2$value","rangeValue","_insertRanges","_createOffsetTree","newOffsetTree","groupOffsetTree","offsetOf","itemCount","_arrayBinarySearch$fi","originalIndexFromLocation","sizes","isGroupLocation","originalIndexFromItemIndex","hasGroups","groupOffset","SIZE_MAP","offsetWidth","sizeSystem","_ref4","sizeRanges","totalCount","statefulTotalCount","statefulStreamFromEmitter","unshiftWith","shiftWith","firstItemIndex","fixedItemSize","defaultItemSize","data","initial","withLatestFrom","scan","distinctUntilChanged","filter","indexes","_ref5","idx","_extends","_ref6","_ref7","_ref7$","trackItemSizes","listRefresh","streamFromEmitter","_ref8","_ref9","newSizes","changed","subscribe","prev","next","diff","val","publish","_ref10","beforeUnshiftWith","_ref11","acc","_ref12","shiftWithOffset","_ref13","_ref14","_ref15","tup","SUPPORTS_SCROLL_TO_OPTIONS","style","normalizeIndexLocation","align","scrollToIndexSystem","_ref$","_ref$2","scrollToIndex","topListHeight","unsubscribeNextListRefresh","cleartTimeoutRef","unsubscribeListRefresh","cleanup","_ref2$","normalLocation","retry","listChanged","handleNext","UP","INITIAL_BOTTOM_STATE","atBottom","notAtBottomBecause","offsetBottom","stateFlagsSystem","isAtBottom","isAtTop","atBottomStateChange","atTopStateChange","atBottomThreshold","atTopThreshold","isScrolling","merge","duc","skip","mapTo","debounceTime","isScrollingBy","combineLatest","throttleTime","atBottomState","atBottomBecause","scrollTopDelta","_ref3$","_headerHeight","lastJumpDueToItemResize","jump","scrollDirection","direction","prevScrollTop","scrollVelocity","_","propsReadySystem","propsReady","didMount","ready","initialTopMostItemIndexSystem","scrolledToInitialItem","initialTopMostItemIndex","normalizeFollowOutput","follow","followOutputSystem","followOutput","autoscrollToBottom","pendingScrollHandle","scrollToBottom","followOutputBehavior","trapNextSizeIncrease","cancel","shouldFollow","behaviorFromFollowOutput","refreshed","groupCountsToIndicesAndCount","counts","groupCount","groupedListSystem","groupCounts","topItemsIndexes","groupIndicesAndCount","tupleComparator","rangeComparator","getOverscan","overscan","main","reverse","getViewportIncrease","sizeRangeSystem","listBoundary","increaseViewportBy","visibleRange","listTop","listBottom","stickyHeaderHeight","headerVisible","topViewportAddition","bottomViewportAddition","EMPTY_LIST_STATE","topItems","offsetTop","bottom","transposeItems","originalIndex","transposedItems","groupRanges","currentRange","currentGroupIndex","_createForOfIteratorHelperLoose","shift","indexOf","transposedItem","type","buildListState","lastItem","height","listStateSystem","rangeTopListHeight","stateFlags","itemsRendered","listState","startOffset","endOffset","sizesValue","probeItemSet","getInitialTopMostItemIndexNumber","rangeStartIndex","rangeEndIndex","minStartIndex","offsetPointRanges","rangesWithinOffsets","endValue","findRange","maxIndex","tap","endReached","count","startReached","rangeChanged","initialItemCountSystem","initialItemCount","_ref3$2","includedGroupsCount","adjustedCount","Array","from","scrollSeekSystem","isSeeking","scrollSeekConfiguration","speed","config","enter","exit","velocity","change","scrollSeekRangeChanged","topItemCountSystem","topItemCount","totalListHeightSystem","totalListHeightChanged","totalListHeight","simpleMemoize","func","called","isMobileSafari","test","navigator","userAgent","upwardScrollFixSystem","_ref$3","deviationOffset","prevItems","totalHeight","newDev","amount","scrollByWith","deviationAmount","recalc","requestAnimationFrame","initialScrollTopSystem","initialScrollTop","alignToBottomSystem","alignToBottom","paddingTopAddition","windowScrollerSystem","windowScrollContainerState","windowViewportRect","windowScrollTo","useWindowScroll","_excluded","scrollIntoViewSystem","scrollIntoView","viewLocation","rest","actualIndex","itemTop","featureGroup1System","windowScroller","listSystem","_ref2$2","domIO","_ref2$3","flags","featureGroup1","visibleHeight","fixedItemHeight","defaultItemHeight","positionStickyCssValue","createElement","position","useWindowViewportRectRef","viewportInfo","calculateInfo","rect","visibleWidth","width","customScrollParentRect","deltaTop","scrollAndResizeEventHandler","_excluded2","_excluded3","identity","listComponentPropsSystem","itemContent","context","groupContent","components","computeItemKey","headerFooterTag","distinctProp","propName","defaultValue","FooterComponent","HeaderComponent","TopItemListComponent","ListComponent","ItemComponent","GroupComponent","ScrollerComponent","EmptyPlaceholder","ScrollSeekPlaceholder","addDeprecatedAlias","prop","alias","warn","combinedSystem","propsSystem","deprecatedProps","group","itemHeight","scrollingStateChange","adjustForPrependedItems","maxHeightCacheSize","footer","header","HeaderContainer","FooterContainer","ItemContainer","ScrollContainer","GroupContainer","ListContainer","emptyComponent","scrollSeek","deprecateComponentProp","componentName","_extends2","comp","placeholder","_objectWithoutPropertiesLoose","DefaultScrollSeekPlaceholder","React","GROUP_STYLE","zIndex","overflowAnchor","ITEM_STYLE","Items","memo","showTopList","_ref5$showTopList","useEmitterValue","usePublisher","windowScrollContainerStateCallback","_scrollContainerStateCallback","listGap","_React$useState","useState","setDeviation","useEmitter","containerStyle","boxSizing","paddingTop","paddingBottom","marginTop","contextPropIfNotDomElement","scrollerStyle","outline","overflowY","WebkitOverflowScrolling","viewportStyle","topItemListStyle","Header","Footer","buildScroller","props","_useScrollTop","tabIndex","buildWindowScroller","_useScrollTop2","Viewport","viewportRef","compose","WindowViewport","TopItemListContainer","TopItemList","ListRoot","TheViewport","WindowScroller","Scroller","_systemToComponent","systemToComponent","required","optional","methods","events","List","Component","INITIAL_GRID_STATE","itemWidth","PROBE_GRID_STATE","buildItems","gapComparator","column","row","gridSystem","_ref$4","gridState","viewportDimensions","itemDimensions","_ref4$$","_ref4$","viewport","viewportWidth","perRow","itemsPerRow","gridLayout","_gridLayout","rowCount","_gridLayout2","gridComponentPropsSystem","itemClassName","listClassName","GridItems","scrollHeightCallback","gridGap","listRef","firstItem","firstChild","columnGap","className","GridRoot","Grid","tableComponentPropsSystem","fixedHeaderContent","TableComponent","TableHeadComponent","TableBodyComponent","TableRowComponent","FillerRow","DefaultFillerRow","padding","border","_useChangedListConten","paddingTopEl","paddingBottomEl","TableRoot","theadRef","TheScroller","TheTable","TheTHead","theHead","borderSpacing","Table","Virtuoso","TableVirtuoso","VirtuosoGrid"],"mappings":"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"}