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/utils/context.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 { SizeRange } from '../sizeSystem'\nimport { useSizeWithElRef } from './useSize'\nimport { SizeFunction, 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const windowScrolling = (scrollableElement.firstElementChild! as HTMLDivElement).dataset['viewportType']! === 'window'\n\n const scrollTop = customScrollParent\n ? customScrollParent.scrollTop\n : windowScrolling\n ? window.pageYOffset || document.documentElement.scrollTop\n : scrollableElement.scrollTop\n\n const scrollHeight = customScrollParent\n ? customScrollParent.scrollHeight\n : windowScrolling\n ? document.documentElement.scrollHeight\n : scrollableElement.scrollHeight\n\n const viewportHeight = customScrollParent\n ? customScrollParent.offsetHeight\n : windowScrolling\n ? window.innerHeight\n : scrollableElement.offsetHeight\n\n scrollContainerStateCallback({\n scrollTop: Math.max(scrollTop, 0),\n scrollHeight,\n viewportHeight,\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 | 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","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 fixedFooterHeight = 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 fixedFooterHeight,\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'\nimport { SizeFunction } from './interfaces'\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\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 {\n scrollingInProgress,\n viewportHeight,\n scrollTo,\n smoothScrollTargetReached,\n headerHeight,\n footerHeight,\n fixedHeaderHeight,\n fixedFooterHeight,\n },\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, fixedHeaderHeight, fixedFooterHeight),\n u.map(\n ([\n [location, sizes, viewportHeight, totalCount, topListHeight, headerHeight, footerHeight, log],\n gap,\n fixedHeaderHeight,\n fixedFooterHeight,\n ]) => {\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 += fixedHeaderHeight + findMaxKeyValue(sizes.sizeTree, index)[1]! - viewportHeight + fixedFooterHeight\n if (index === lastIndex) {\n top += footerHeight\n }\n } else if (align === 'center') {\n top += (fixedHeaderHeight + findMaxKeyValue(sizes.sizeTree, index)[1]! - viewportHeight + fixedFooterHeight) / 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 ),\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, totalCount }\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, fixedFooterHeight }, { listState }]) => {\n const totalListHeightChanged = u.stream<number>()\n const totalListHeight = u.statefulStreamFromEmitter(\n u.pipe(\n u.combineLatest(footerHeight, fixedFooterHeight, headerHeight, fixedHeaderHeight, listState),\n u.map(([footerHeight, fixedFooterHeight, headerHeight, fixedHeaderHeight, listState]) => {\n return footerHeight + fixedFooterHeight + 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 ([\n { sizes, totalCount, gap },\n { scrollTop, viewportHeight, headerHeight, fixedHeaderHeight, fixedFooterHeight, scrollingInProgress },\n { scrollToIndex },\n ]) => {\n const scrollIntoView = u.stream<ScrollIntoViewLocation>()\n\n u.connect(\n u.pipe(\n scrollIntoView,\n u.withLatestFrom(sizes, viewportHeight, totalCount, headerHeight, fixedHeaderHeight, fixedFooterHeight, scrollTop),\n u.withLatestFrom(gap),\n u.map(([[viewLocation, sizes, viewportHeight, totalCount, headerHeight, fixedHeaderHeight, fixedFooterHeight, scrollTop], gap]) => {\n const { done, behavior, align, ...rest } = viewLocation\n let location = null\n const actualIndex = originalIndexFromLocation(viewLocation, sizes, totalCount - 1)\n\n const itemTop = offsetOf(actualIndex, sizes.offsetTree, gap) + headerHeight + fixedHeaderHeight\n if (itemTop < scrollTop + fixedHeaderHeight) {\n location = { ...rest, behavior, align: align ?? 'start' }\n } else {\n const itemBottom = itemTop + findMaxKeyValue(sizes.sizeTree, actualIndex)[1]!\n\n if (itemBottom > scrollTop + viewportHeight - fixedFooterHeight) {\n location = { ...rest, behavior, align: 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 * as React from 'react'\n\nexport interface VirtuosoMockContextValue {\n viewportHeight: number\n itemHeight: number\n}\n\nexport const VirtuosoMockContext = React.createContext<VirtuosoMockContextValue | undefined>(undefined)\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, useContext } 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 { VirtuosoMockContext } from './utils/context'\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 ctx = useContext(VirtuosoMockContext)\n const viewportHeight = usePublisher('viewportHeight')\n const fixedItemHeight = usePublisher('fixedItemHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n React.useEffect(() => {\n if (ctx) {\n viewportHeight(ctx.viewportHeight)\n fixedItemHeight(ctx.itemHeight)\n }\n }, [ctx, viewportHeight, fixedItemHeight])\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 ctx = useContext(VirtuosoMockContext)\n const windowViewportRect = usePublisher('windowViewportRect')\n const fixedItemHeight = usePublisher('fixedItemHeight')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n React.useEffect(() => {\n if (ctx) {\n fixedItemHeight(ctx.itemHeight)\n windowViewportRect({ offsetTop: 0, visibleHeight: ctx.viewportHeight, visibleWidth: 100 })\n }\n }, [ctx, windowViewportRect, fixedItemHeight])\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 context: 'context',\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, useContext } from 'react'\nimport useChangedListContentsSizes from './hooks/useChangedChildSizes'\nimport { ComputeItemKey, ItemContent, FixedHeaderContent, FixedFooterContent, 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'\nimport { VirtuosoMockContext } from './utils/context'\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 fixedFooterContent = u.statefulStream<FixedFooterContent>(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' | 'tfoot' | '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 fixedFooterContent,\n components,\n computeItemKey,\n scrollerRef,\n TableComponent: distinctProp('Table', 'table'),\n TableHeadComponent: distinctProp('TableHead', 'thead'),\n TableFooterComponent: distinctProp('TableFoot', 'tfoot'),\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 ctx = useContext(VirtuosoMockContext)\n const viewportHeight = usePublisher('viewportHeight')\n const fixedItemHeight = usePublisher('fixedItemHeight')\n const viewportRef = useSize(u.compose(viewportHeight, (el) => correctItemSize(el, 'height')))\n\n React.useEffect(() => {\n if (ctx) {\n viewportHeight(ctx.viewportHeight)\n fixedItemHeight(ctx.itemHeight)\n }\n }, [ctx, viewportHeight, fixedItemHeight])\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 ctx = useContext(VirtuosoMockContext)\n const windowViewportRect = usePublisher('windowViewportRect')\n const fixedItemHeight = usePublisher('fixedItemHeight')\n const customScrollParent = useEmitterValue('customScrollParent')\n const viewportRef = useWindowViewportRectRef(windowViewportRect, customScrollParent)\n\n React.useEffect(() => {\n if (ctx) {\n fixedItemHeight(ctx.itemHeight)\n windowViewportRect({ offsetTop: 0, visibleHeight: ctx.viewportHeight, visibleWidth: 100 })\n }\n }, [ctx, windowViewportRect, fixedItemHeight])\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 fixedFooterHeight = usePublisher('fixedFooterHeight')\n const fixedHeaderContent = useEmitterValue('fixedHeaderContent')\n const fixedFooterContent = useEmitterValue('fixedFooterContent')\n const context = useEmitterValue('context')\n const theadRef = useSize(u.compose(fixedHeaderHeight, (el) => correctItemSize(el, 'height')))\n const tfootRef = useSize(u.compose(fixedFooterHeight, (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 const TheTFoot = useEmitterValue('TableFooterComponent')\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 const theFoot = fixedFooterContent\n ? React.createElement(\n TheTFoot!,\n {\n key: 'TableFoot',\n style: { zIndex: 1, position: 'sticky', bottom: 0 },\n ref: tfootRef,\n ...contextPropIfNotDomElement(TheTFoot, context),\n },\n fixedFooterContent()\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 theFoot,\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 fixedFooterContent: 'fixedFooterContent',\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 SizeFunction,\n FixedFooterContent,\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?: SizeFunction\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 * Set the contents of the table footer.\n */\n fixedFooterContent?: FixedFooterContent\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?: SizeFunction\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 * Use the `components` property for advanced customization of the elements rendered by the list.\n */\n context?: 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","windowScrolling","firstElementChild","scrollTop","pageYOffset","documentElement","scrollHeight","viewportHeight","offsetHeight","innerHeight","Math","max","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","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","fixedFooterHeight","footerHeight","scrollingInProgress","react18ConcurrentRendering","connect","pipe","map","_ref","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","_ref2","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","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","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","deviationOffset","prevItems","totalHeight","newDev","amount","scrollByWith","deviationAmount","recalc","requestAnimationFrame","initialScrollTopSystem","initialScrollTop","alignToBottomSystem","alignToBottom","paddingTopAddition","windowScrollerSystem","windowScrollContainerState","windowViewportRect","windowScrollTo","useWindowScroll","scrollIntoViewSystem","scrollIntoView","viewLocation","rest","_objectWithoutPropertiesLoose","_excluded","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","VirtuosoMockContext","React","createContext","_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","comp","_extends2","placeholder","DefaultScrollSeekPlaceholder","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","ctx","useContext","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","fixedFooterContent","TableComponent","TableHeadComponent","TableFooterComponent","TableBodyComponent","TableRowComponent","FillerRow","DefaultFillerRow","padding","border","paddingTopEl","paddingBottomEl","TableRoot","theadRef","tfootRef","TheScroller","TheTable","TheTHead","TheTFoot","theHead","theFoot","borderSpacing","Table","Virtuoso","TableVirtuoso","VirtuosoGrid"],"mappings":"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"}
|