@glhrmoura/vue-virtualize 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +448 -431
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/core/measurements.ts","../src/utils/clamp.ts","../src/core/scrolling.ts","../src/core/virtualizer.ts","../src/utils/dom.ts","../src/utils/same-items.ts","../src/composables/useVirtualizer.ts","../src/composables/useVirtualList.ts","../src/composables/useVirtualGrid.ts","../src/composables/useVirtualTable.ts","../src/utils/layout.ts","../src/components/VirtualList.vue","../src/components/VirtualGrid.vue","../src/components/VirtualTable.vue"],"sourcesContent":["export function normalizeSize(size: number): number {\n if (!Number.isFinite(size) || size < 0) return 0\n return size\n}\n\nexport class MeasurementCache {\n private readonly sizes = new Map<number, number>()\n private divergent = false\n\n get(index: number): number | undefined {\n return this.sizes.get(index)\n }\n\n set(index: number, size: number, baseline: number | null): void {\n this.sizes.set(index, size)\n if (baseline !== null && Math.abs(size - baseline) >= 0.5) this.divergent = true\n }\n\n get hasDivergent(): boolean {\n return this.divergent\n }\n\n clear(): void {\n this.sizes.clear()\n this.divergent = false\n }\n\n trim(count: number, baseline: number | null): void {\n let removed = false\n for (const index of this.sizes.keys()) {\n if (index >= count) {\n this.sizes.delete(index)\n removed = true\n }\n }\n if (!removed) return\n this.divergent = false\n if (baseline === null) return\n for (const value of this.sizes.values()) {\n if (Math.abs(value - baseline) >= 0.5) {\n this.divergent = true\n return\n }\n }\n }\n\n shift(delta: number): void {\n if (!delta) return\n const next = new Map<number, number>()\n for (const [index, size] of this.sizes) {\n const moved = index + delta\n if (moved >= 0) next.set(moved, size)\n }\n this.sizes.clear()\n for (const [index, size] of next) this.sizes.set(index, size)\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n","import type { ScrollAlignment } from '@/core/types'\nimport { clamp } from '@/utils/clamp'\n\nexport const MAX_SCROLL_SIZE = 16_777_216\n\nexport function clampScrollOffset(offset: number, totalSize: number, viewport: number): number {\n const max = Math.max(0, totalSize - Math.max(0, viewport))\n return clamp(Number.isFinite(offset) ? offset : 0, 0, max)\n}\n\nexport function scrollContentSize(totalSize: number, measured?: number): number {\n const total = Math.max(0, Number.isFinite(totalSize) ? totalSize : 0)\n const capped = Math.min(total, MAX_SCROLL_SIZE)\n if (measured === undefined || !Number.isFinite(measured) || measured <= 0) return capped\n return Math.min(capped, measured)\n}\n\nexport function mapDomOffsetToVirtual(\n domOffset: number,\n virtualSize: number,\n domSize: number,\n viewport: number,\n): number {\n const maxVirtual = Math.max(0, virtualSize - Math.max(0, viewport))\n const maxDom = Math.max(0, domSize - Math.max(0, viewport))\n if (maxVirtual <= 0) return 0\n if (maxDom <= 0 || maxDom >= maxVirtual) return clampScrollOffset(domOffset, virtualSize, viewport)\n return (Math.max(0, domOffset) / maxDom) * maxVirtual\n}\n\nexport function mapVirtualOffsetToDom(\n virtualOffset: number,\n virtualSize: number,\n domSize: number,\n viewport: number,\n): number {\n const maxVirtual = Math.max(0, virtualSize - Math.max(0, viewport))\n const maxDom = Math.max(0, domSize - Math.max(0, viewport))\n if (maxDom <= 0) return 0\n if (maxVirtual <= 0 || maxDom >= maxVirtual) {\n return clampScrollOffset(virtualOffset, virtualSize, viewport)\n }\n return (clampScrollOffset(virtualOffset, virtualSize, viewport) / maxVirtual) * maxDom\n}\n\nexport function findFirstIndexPast(\n count: number,\n target: number,\n getEnd: (index: number) => number,\n): number {\n if (count <= 0) return 0\n let low = 0\n let high = count - 1\n let answer = count - 1\n while (low <= high) {\n const mid = (low + high) >>> 1\n if (getEnd(mid) > target) {\n answer = mid\n high = mid - 1\n } else {\n low = mid + 1\n }\n }\n return answer\n}\n\nexport function findLastIndexBefore(\n count: number,\n target: number,\n getStart: (index: number) => number,\n): number {\n if (count <= 0) return 0\n let low = 0\n let high = count - 1\n let answer = 0\n while (low <= high) {\n const mid = (low + high) >>> 1\n if (getStart(mid) < target) {\n answer = mid\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n return answer\n}\n\nexport function resolveScrollOffset(input: {\n start: number\n size: number\n viewport: number\n current: number\n align: ScrollAlignment\n}): number {\n const end = input.start + input.size\n let align = input.align\n if (align === 'auto') {\n const visibleEnd = input.current + input.viewport\n const fullyVisible = input.start >= input.current && end <= visibleEnd\n if (fullyVisible) return input.current\n align = input.start < input.current ? 'start' : 'end'\n }\n if (align === 'center') return input.start - (input.viewport - input.size) / 2\n if (align === 'end') return end - input.viewport\n return input.start\n}\n","import { MeasurementCache, normalizeSize } from '@/core/measurements'\nimport {\n clampScrollOffset,\n findFirstIndexPast,\n findLastIndexBefore,\n resolveScrollOffset,\n} from '@/core/scrolling'\nimport type { ScrollAlignment, VirtualItem, VirtualizerOptions } from '@/core/types'\nimport { clamp } from '@/utils/clamp'\n\nexport class Virtualizer {\n private count = 0\n private estimateSize: (index: number) => number = () => 0\n private overscan = 0\n private gap = 0\n private paddingStart = 0\n private paddingEnd = 0\n private lanes = 1\n private itemSize: number | null = null\n private viewportSize = 0\n private scrollOffset = 0\n private getItemKey: (index: number) => string | number = (index) => index\n private readonly measurements = new MeasurementCache()\n private built = 0\n private offsets: number[] = []\n private laneCursor: number[] = []\n private laneEnd: number[] = []\n\n setOptions(options: VirtualizerOptions): void {\n const nextLanes = Math.max(1, Math.floor(options.lanes ?? 1))\n const nextGap = options.gap ?? 0\n const nextPaddingStart = options.paddingStart ?? 0\n const nextPaddingEnd = options.paddingEnd ?? 0\n const nextCount = Math.max(0, Math.floor(options.count))\n const nextItemSize =\n options.itemSize === undefined || options.itemSize === null\n ? null\n : normalizeSize(options.itemSize)\n const previousItemSize = this.itemSize\n const geometryChanged =\n nextLanes !== this.lanes ||\n nextGap !== this.gap ||\n nextPaddingStart !== this.paddingStart ||\n nextPaddingEnd !== this.paddingEnd ||\n options.estimateSize !== this.estimateSize ||\n nextItemSize !== this.itemSize\n\n this.count = nextCount\n this.lanes = nextLanes\n this.gap = nextGap\n this.paddingStart = nextPaddingStart\n this.paddingEnd = nextPaddingEnd\n this.overscan = Math.max(0, Math.floor(options.overscan ?? 0))\n this.estimateSize = options.estimateSize\n this.itemSize = nextItemSize\n this.getItemKey = options.getItemKey ?? ((index) => index)\n if (options.viewportSize !== undefined) this.viewportSize = Math.max(0, options.viewportSize)\n if (nextItemSize !== previousItemSize) this.measurements.clear()\n this.measurements.trim(this.count, this.itemSize)\n if (geometryChanged || this.built > this.count) this.resetGeometry()\n }\n\n setScrollOffset(offset: number): void {\n this.scrollOffset = Number.isFinite(offset) ? offset : 0\n }\n\n getScrollOffset(): number {\n return this.scrollOffset\n }\n\n getViewportSize(): number {\n return this.viewportSize\n }\n\n measure(index: number, size: number): boolean {\n if (index < 0 || index >= this.count) return false\n const next = normalizeSize(size)\n const previous = this.measurements.get(index)\n if (previous !== undefined && Math.abs(previous - next) < 0.5) return false\n const before = this.getItemSize(index)\n this.measurements.set(index, next, this.itemSize)\n if (Math.abs(before - next) < 0.5) return false\n this.resetGeometry()\n return true\n }\n\n clearMeasurements(): void {\n this.measurements.clear()\n this.resetGeometry()\n }\n\n shiftMeasurements(delta: number): void {\n if (!delta) return\n this.measurements.shift(delta)\n this.resetGeometry()\n }\n\n getItemSize(index: number): number {\n const measured = this.measurements.get(index)\n if (measured !== undefined) return measured\n if (this.itemSize !== null) return this.itemSize\n return normalizeSize(this.estimateSize(index))\n }\n\n getItemOffset(index: number): number {\n if (index <= 0 || this.count <= 0) return this.paddingStart\n const clamped = Math.min(index, this.count - 1)\n if (this.usesFixedPath()) {\n const ordinal = Math.floor(clamped / this.lanes)\n return this.paddingStart + ordinal * ((this.itemSize ?? 0) + this.gap)\n }\n this.ensure(clamped)\n return this.offsets[clamped] ?? this.paddingStart\n }\n\n getTotalSize(): number {\n if (this.count <= 0) return this.paddingStart + this.paddingEnd\n if (this.usesFixedPath()) {\n let maxEnd = this.paddingStart\n const size = this.itemSize ?? 0\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const total = this.laneLength(lane)\n const end = this.paddingStart + total * size + Math.max(0, total - 1) * this.gap\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n this.ensure(this.count - 1)\n let maxEnd = this.paddingStart\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const end = this.laneEnd[lane] ?? this.paddingStart\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n\n getVirtualItems(): VirtualItem[] {\n if (this.count <= 0 || this.viewportSize <= 0) return []\n const offset = clampScrollOffset(this.scrollOffset, this.getTotalSize(), this.viewportSize)\n const endEdge = offset + this.viewportSize\n const items: VirtualItem[] = []\n for (let lane = 0; lane < this.lanes; lane += 1) {\n const total = this.laneLength(lane)\n if (total <= 0) continue\n const startOrdinal = findFirstIndexPast(total, offset, (ordinal) => {\n const index = this.ordinalIndex(lane, ordinal)\n return this.getItemOffset(index) + this.getItemSize(index)\n })\n const endOrdinal = findLastIndexBefore(total, endEdge, (ordinal) =>\n this.getItemOffset(this.ordinalIndex(lane, ordinal)),\n )\n const from = Math.max(0, Math.min(startOrdinal, endOrdinal) - this.overscan)\n const to = Math.min(total - 1, Math.max(startOrdinal, endOrdinal) + this.overscan)\n for (let ordinal = from; ordinal <= to; ordinal += 1) {\n const index = this.ordinalIndex(lane, ordinal)\n const start = this.getItemOffset(index)\n const size = this.getItemSize(index)\n items.push({\n index,\n key: this.getItemKey(index),\n start,\n size,\n end: start + size,\n lane,\n })\n }\n }\n items.sort((left, right) => left.index - right.index)\n return items\n }\n\n getOffsetForIndex(index: number, align: ScrollAlignment = 'auto'): number {\n if (this.count <= 0) return 0\n const clamped = clamp(index, 0, this.count - 1)\n const start = this.getItemOffset(clamped)\n const size = this.getItemSize(clamped)\n const raw = resolveScrollOffset({\n start,\n size,\n viewport: this.viewportSize,\n current: this.scrollOffset,\n align,\n })\n return clampScrollOffset(raw, this.getTotalSize(), this.viewportSize)\n }\n\n private usesFixedPath(): boolean {\n return this.itemSize !== null && !this.measurements.hasDivergent\n }\n\n private ordinalIndex(lane: number, ordinal: number): number {\n return lane + ordinal * this.lanes\n }\n\n private laneLength(lane: number): number {\n if (lane < 0 || lane >= this.lanes || lane >= this.count) return 0\n return Math.floor((this.count - lane - 1) / this.lanes) + 1\n }\n\n private ensure(index: number): void {\n if (index < this.built) return\n const last = Math.min(index, this.count - 1)\n while (this.built <= last) {\n const lane = this.built % this.lanes\n const start = this.laneCursor[lane] ?? this.paddingStart\n this.offsets[this.built] = start\n const end = start + this.getItemSize(this.built)\n this.laneEnd[lane] = end\n this.laneCursor[lane] = end + this.gap\n this.built += 1\n }\n }\n\n private resetGeometry(): void {\n this.built = 0\n this.offsets = []\n this.laneCursor = Array.from({ length: this.lanes }, () => this.paddingStart)\n this.laneEnd = Array.from({ length: this.lanes }, () => this.paddingStart)\n }\n}\n","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\nexport function asElement(target: unknown): Element | null {\n if (typeof Element === 'undefined') return null\n return target instanceof Element ? target : null\n}\n\nexport function writeScroll(\n element: HTMLElement,\n offset: number,\n horizontal: boolean,\n behavior: ScrollBehavior,\n): void {\n if (behavior === 'smooth' && typeof element.scrollTo === 'function') {\n element.scrollTo({\n top: horizontal ? element.scrollTop : offset,\n left: horizontal ? offset : element.scrollLeft,\n behavior,\n })\n return\n }\n if (horizontal) element.scrollLeft = offset\n else element.scrollTop = offset\n}\n\nexport function writeWindowScroll(offset: number, horizontal: boolean, behavior: ScrollBehavior): void {\n if (typeof window === 'undefined') return\n if (behavior === 'smooth') {\n window.scrollTo({\n top: horizontal ? window.scrollY : offset,\n left: horizontal ? offset : window.scrollX,\n behavior,\n })\n return\n }\n if (horizontal) window.scrollTo(offset, window.scrollY)\n else window.scrollTo(window.scrollX, offset)\n}\n\nexport function readScroll(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollLeft : element.scrollTop\n}\n\nexport function readWindowScroll(horizontal: boolean): number {\n if (typeof window === 'undefined') return 0\n return horizontal ? window.scrollX : window.scrollY\n}\n\nexport function readViewport(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.clientWidth : element.clientHeight\n}\n\nexport function readWindowViewport(horizontal: boolean): number {\n if (typeof window === 'undefined') return 0\n return horizontal ? window.innerWidth : window.innerHeight\n}\n\nexport function readContentSize(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollWidth : element.scrollHeight\n}\n\nexport function documentOffset(element: HTMLElement, horizontal: boolean): number {\n const rect = element.getBoundingClientRect()\n if (typeof window === 'undefined') return horizontal ? rect.left : rect.top\n return horizontal ? rect.left + window.scrollX : rect.top + window.scrollY\n}\n\nexport function scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 0) as unknown as number\n}\n\nexport function cancelFrame(id: number): void {\n if (!id) return\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(id)\n else clearTimeout(id)\n}\n","import type { VirtualItem } from '@/core/types'\n\nexport function sameVirtualItems(\n left: readonly VirtualItem[],\n right: readonly VirtualItem[],\n): boolean {\n if (left.length !== right.length) return false\n for (let index = 0; index < left.length; index += 1) {\n const previous = left[index]\n const next = right[index]\n if (!previous || !next) return false\n if (\n previous.index !== next.index ||\n previous.start !== next.start ||\n previous.size !== next.size ||\n previous.end !== next.end ||\n previous.lane !== next.lane ||\n previous.key !== next.key\n ) {\n return false\n }\n }\n return true\n}\n","import {\n computed,\n onBeforeUnmount,\n ref,\n shallowRef,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from 'vue'\nimport { Virtualizer } from '@/core/virtualizer'\nimport type { ScrollToIndexOptions, VirtualItem, VisibleRange } from '@/core/types'\nimport {\n asElement,\n cancelFrame,\n documentOffset,\n isBrowser,\n readContentSize,\n readScroll,\n readViewport,\n readWindowScroll,\n readWindowViewport,\n scheduleFrame,\n writeScroll,\n writeWindowScroll,\n} from '@/utils/dom'\nimport { sameVirtualItems } from '@/utils/same-items'\nimport {\n clampScrollOffset,\n mapDomOffsetToVirtual,\n mapVirtualOffsetToDom,\n scrollContentSize,\n} from '@/core/scrolling'\n\nexport interface UseVirtualizerOptions {\n count: MaybeRefOrGetter<number>\n estimateSize: (index: number) => number\n container?: MaybeRefOrGetter<HTMLElement | null | undefined>\n horizontal?: MaybeRefOrGetter<boolean>\n overscan?: MaybeRefOrGetter<number>\n gap?: MaybeRefOrGetter<number>\n paddingStart?: MaybeRefOrGetter<number>\n paddingEnd?: MaybeRefOrGetter<number>\n lanes?: MaybeRefOrGetter<number>\n itemSize?: MaybeRefOrGetter<number | null | undefined>\n getItemKey?: (index: number) => string | number\n initialRect?: MaybeRefOrGetter<{ width: number; height: number } | undefined>\n viewportInset?: MaybeRefOrGetter<number>\n revision?: MaybeRefOrGetter<unknown>\n windowScroll?: MaybeRefOrGetter<boolean>\n scrollMargin?: MaybeRefOrGetter<number>\n reverse?: MaybeRefOrGetter<boolean>\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nexport function useVirtualizer(options: UseVirtualizerOptions) {\n const engine = new Virtualizer()\n const virtualItems = shallowRef<VirtualItem[]>([])\n const totalSize = ref(0)\n const scrollOffset = ref(0)\n const scrollAdjust = ref(0)\n const isScrolling = ref(false)\n const estimateSize = (index: number) => options.estimateSize(index)\n let listeningEl: HTMLElement | null = null\n let listeningWindow = false\n let resizeObserver: ResizeObserver | null = null\n let itemObserver: ResizeObserver | null = null\n let measureFrame = 0\n let scrollTimer = 0\n let travelOverscan = 0\n let seenRevision = toValue(options.revision)\n let previousCount = toValue(options.count)\n let previousFirstKey: string | number | undefined = options.getItemKey?.(0) ?? 0\n let didInitialReverse = false\n let lastRangeKey = ''\n const observed = new Map<Element, number>()\n const elementsByIndex = new Map<number, Element>()\n const pendingMeasures: { element: Element; index: number }[] = []\n\n function currentElement(): HTMLElement | null {\n const value = toValue(options.container)\n if (typeof HTMLElement === 'undefined') return null\n return value instanceof HTMLElement ? value : null\n }\n\n function horizontal(): boolean {\n return toValue(options.horizontal) ?? false\n }\n\n function windowScroll(): boolean {\n return toValue(options.windowScroll) ?? false\n }\n\n function reverse(): boolean {\n return toValue(options.reverse) ?? false\n }\n\n function viewportFallback(): number {\n const rect = toValue(options.initialRect)\n if (!rect) return 0\n return horizontal() ? rect.width : rect.height\n }\n\n function origin(): number {\n const element = currentElement()\n const margin = toValue(options.scrollMargin) ?? 0\n if (!element || !isBrowser()) return margin\n return documentOffset(element, horizontal()) + margin\n }\n\n function contentSize(element: HTMLElement | null, total: number): number {\n if (windowScroll()) return scrollContentSize(total)\n if (!element) return scrollContentSize(total)\n return scrollContentSize(total, readContentSize(element, horizontal()))\n }\n\n function readDomScroll(element: HTMLElement | null): number {\n if (windowScroll()) return Math.max(0, readWindowScroll(horizontal()) - origin())\n if (!element) return 0\n return readScroll(element, horizontal())\n }\n\n function readDomViewport(element: HTMLElement | null): number {\n if (windowScroll()) return readWindowViewport(horizontal())\n if (!element) return 0\n return readViewport(element, horizontal())\n }\n\n function writeDomScroll(element: HTMLElement | null, offset: number, behavior: ScrollBehavior): void {\n if (windowScroll()) {\n writeWindowScroll(offset + origin(), horizontal(), behavior)\n return\n }\n if (!element) return\n writeScroll(element, offset, horizontal(), behavior)\n }\n\n function readVirtualOffset(element: HTMLElement | null, total: number, viewport: number): number {\n return mapDomOffsetToVirtual(\n readDomScroll(element),\n total,\n contentSize(element, total),\n viewport,\n )\n }\n\n function writeVirtualOffset(\n element: HTMLElement | null,\n offset: number,\n total: number,\n viewport: number,\n behavior: ScrollBehavior,\n ): void {\n writeDomScroll(\n element,\n mapVirtualOffsetToDom(offset, total, contentSize(element, total), viewport),\n behavior,\n )\n }\n\n function emitRange(): void {\n const callback = options.onVisibleRangeChange\n if (!callback) return\n const items = virtualItems.value\n const count = toValue(options.count)\n const range: VisibleRange = items.length\n ? {\n startIndex: items[0]?.index ?? 0,\n endIndex: items[items.length - 1]?.index ?? -1,\n count,\n }\n : { startIndex: 0, endIndex: -1, count }\n const key = `${range.startIndex}:${range.endIndex}:${range.count}`\n if (key === lastRangeKey) return\n lastRangeKey = key\n callback(range)\n }\n\n function publish(): void {\n const revision = toValue(options.revision)\n if (!Object.is(revision, seenRevision)) {\n seenRevision = revision\n engine.clearMeasurements()\n }\n const count = toValue(options.count)\n const firstKey = options.getItemKey?.(0) ?? 0\n const prepended =\n reverse() &&\n previousCount > 0 &&\n count > previousCount &&\n firstKey !== previousFirstKey\n const appended =\n reverse() &&\n previousCount > 0 &&\n count > previousCount &&\n firstKey === previousFirstKey\n const added = prepended || appended ? count - previousCount : 0\n const nearEnd =\n reverse() &&\n engine.getViewportSize() > 0 &&\n engine.getScrollOffset() + engine.getViewportSize() >= engine.getTotalSize() - 64\n\n if (prepended && added > 0) engine.shiftMeasurements(added)\n\n const element = currentElement()\n const measured = readDomViewport(element)\n const inset = toValue(options.viewportInset) ?? 0\n const viewport = Math.max(0, (measured > 0 ? measured : viewportFallback()) - inset)\n const itemSize = toValue(options.itemSize)\n engine.setOptions({\n count,\n estimateSize,\n overscan: (toValue(options.overscan) ?? 8) + travelOverscan,\n gap: toValue(options.gap) ?? 0,\n paddingStart: toValue(options.paddingStart) ?? 0,\n paddingEnd: toValue(options.paddingEnd) ?? 0,\n lanes: toValue(options.lanes) ?? 1,\n itemSize: itemSize ?? null,\n getItemKey: options.getItemKey,\n viewportSize: viewport,\n })\n\n if (prepended && added > 0) {\n let delta = 0\n const gap = toValue(options.gap) ?? 0\n for (let index = 0; index < added; index += 1) {\n delta += engine.getItemSize(index)\n if (index < added - 1) delta += gap\n }\n if (delta > 0) engine.setScrollOffset(engine.getScrollOffset() + delta)\n }\n\n const nextTotal = engine.getTotalSize()\n const maxOffset = Math.max(0, nextTotal - viewport)\n if (reverse() && !didInitialReverse && nextTotal > 0 && viewport > 0) {\n didInitialReverse = true\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n } else if (appended && nearEnd) {\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n } else if (engine.getScrollOffset() > maxOffset) {\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n } else if (prepended && added > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), nextTotal, viewport, 'auto')\n }\n\n previousCount = count\n previousFirstKey = firstKey\n\n const items = engine.getVirtualItems()\n if (!sameVirtualItems(virtualItems.value, items)) virtualItems.value = items\n if (totalSize.value !== nextTotal) totalSize.value = nextTotal\n const nextOffset = engine.getScrollOffset()\n if (scrollOffset.value !== nextOffset) scrollOffset.value = nextOffset\n const nextAdjust = element && !windowScroll() ? nextOffset - readScroll(element, horizontal()) : 0\n if (scrollAdjust.value !== nextAdjust) scrollAdjust.value = nextAdjust\n emitRange()\n }\n\n function settleScroll(): void {\n isScrolling.value = false\n travelOverscan = 0\n for (const [element, index] of observed) {\n pendingMeasures.push({ element, index })\n }\n flushMeasures()\n publish()\n options.onScrollEnd?.()\n }\n\n function markScrolling(): void {\n isScrolling.value = true\n if (typeof window === 'undefined') return\n window.clearTimeout(scrollTimer)\n scrollTimer = window.setTimeout(settleScroll, 120)\n }\n\n function onScroll(): void {\n const element = currentElement()\n if (!windowScroll() && !element) return\n markScrolling()\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n const next = readVirtualOffset(element, total, viewport)\n const previous = engine.getScrollOffset()\n const sizeHint = Math.max(1, toValue(options.itemSize) ?? 48)\n travelOverscan = Math.min(24, Math.ceil(Math.abs(next - previous) / sizeHint))\n engine.setScrollOffset(next)\n publish()\n }\n\n function unbindScroll(): void {\n if (listeningEl) {\n listeningEl.removeEventListener('scroll', onScroll)\n listeningEl = null\n }\n if (listeningWindow && typeof window !== 'undefined') {\n window.removeEventListener('scroll', onScroll)\n window.removeEventListener('resize', publish)\n listeningWindow = false\n }\n resizeObserver?.disconnect()\n resizeObserver = null\n }\n\n function bindContainer(): void {\n const element = currentElement()\n const useWindow = windowScroll()\n if (useWindow) {\n if (listeningWindow && listeningEl === element) return\n unbindScroll()\n listeningEl = element\n if (!isBrowser()) return\n listeningWindow = true\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n if (engine.getScrollOffset() > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), total, viewport, 'auto')\n } else {\n engine.setScrollOffset(readVirtualOffset(element, total, viewport))\n }\n window.addEventListener('scroll', onScroll, { passive: true })\n window.addEventListener('resize', publish)\n if (element && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => publish())\n resizeObserver.observe(element)\n }\n return\n }\n if (element === listeningEl && !listeningWindow) return\n unbindScroll()\n listeningEl = element\n if (!element || !isBrowser()) return\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n if (engine.getScrollOffset() > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), total, viewport, 'auto')\n } else {\n engine.setScrollOffset(readVirtualOffset(element, total, viewport))\n }\n element.addEventListener('scroll', onScroll, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => publish())\n resizeObserver.observe(element)\n }\n }\n\n function ensureItemObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!itemObserver) {\n itemObserver = new ResizeObserver((entries) => {\n const axis = horizontal()\n let changed = false\n if (isScrolling.value) return\n for (const entry of entries) {\n const index = observed.get(entry.target)\n if (index === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = Math.round(\n axis ? (box?.inlineSize ?? entry.contentRect.width) : (box?.blockSize ?? entry.contentRect.height),\n )\n if (size > 0 && engine.measure(index, size)) changed = true\n }\n if (changed) publish()\n })\n }\n return itemObserver\n }\n\n function flushMeasures(): void {\n measureFrame = 0\n if (isScrolling.value) return\n const batch = pendingMeasures.splice(0, pendingMeasures.length)\n const axis = horizontal()\n let changed = false\n for (const pending of batch) {\n if (!pending.element.isConnected) continue\n const rect = pending.element.getBoundingClientRect()\n const size = Math.round(axis ? rect.width : rect.height)\n if (size > 0 && engine.measure(pending.index, size)) changed = true\n }\n if (changed) publish()\n }\n\n function measureElement(target: unknown, index: number): void {\n const element = asElement(target)\n const observer = ensureItemObserver()\n const current = elementsByIndex.get(index)\n if (current && current !== element) {\n observer?.unobserve(current)\n observed.delete(current)\n elementsByIndex.delete(index)\n }\n if (!element) return\n elementsByIndex.set(index, element)\n observed.set(element, index)\n observer?.observe(element)\n pendingMeasures.push({ element, index })\n if (isScrolling.value || measureFrame) return\n measureFrame = scheduleFrame(flushMeasures)\n }\n\n function scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n const element = currentElement()\n const measured = readDomViewport(element)\n const viewport = measured > 0 ? measured : engine.getViewportSize()\n const total = engine.getTotalSize()\n const next = clampScrollOffset(offset, total, viewport)\n engine.setScrollOffset(next)\n writeVirtualOffset(element, next, total, viewport, behavior)\n publish()\n }\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const offset = engine.getOffsetForIndex(index, scrollOptions?.align ?? 'auto')\n scrollToOffset(offset, scrollOptions?.behavior ?? 'auto')\n }\n\n function measure(index: number, size: number): void {\n if (engine.measure(index, size)) publish()\n }\n\n publish()\n\n watch(\n () => [\n toValue(options.count),\n toValue(options.overscan),\n toValue(options.gap),\n toValue(options.paddingStart),\n toValue(options.paddingEnd),\n toValue(options.lanes),\n toValue(options.horizontal),\n toValue(options.itemSize),\n toValue(options.viewportInset),\n toValue(options.revision),\n toValue(options.container),\n toValue(options.windowScroll),\n toValue(options.scrollMargin),\n toValue(options.reverse),\n toValue(options.initialRect)?.width,\n toValue(options.initialRect)?.height,\n ],\n () => {\n bindContainer()\n publish()\n },\n { flush: 'post' },\n )\n\n onBeforeUnmount(() => {\n unbindScroll()\n itemObserver?.disconnect()\n cancelFrame(measureFrame)\n if (typeof window !== 'undefined') window.clearTimeout(scrollTimer)\n observed.clear()\n elementsByIndex.clear()\n pendingMeasures.length = 0\n })\n\n return {\n virtualItems: computed(() => virtualItems.value),\n totalSize: computed(() => totalSize.value),\n scrollOffset: computed(() => scrollOffset.value),\n scrollAdjust: computed(() => scrollAdjust.value),\n isScrolling: computed(() => isScrolling.value),\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { VirtualItem, VisibleRange } from '@/core/types'\nimport { useVirtualizer, type UseVirtualizerOptions } from '@/composables/useVirtualizer'\n\nexport interface VirtualListItem<T> extends VirtualItem {\n item: T\n}\n\nexport interface UseVirtualListOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n estimateSize?: number | ((index: number, item: T) => number)\n container?: UseVirtualizerOptions['container']\n horizontal?: UseVirtualizerOptions['horizontal']\n overscan?: UseVirtualizerOptions['overscan']\n gap?: UseVirtualizerOptions['gap']\n paddingStart?: UseVirtualizerOptions['paddingStart']\n paddingEnd?: UseVirtualizerOptions['paddingEnd']\n itemSize?: UseVirtualizerOptions['itemSize']\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n viewportInset?: UseVirtualizerOptions['viewportInset']\n revision?: UseVirtualizerOptions['revision']\n windowScroll?: UseVirtualizerOptions['windowScroll']\n scrollMargin?: UseVirtualizerOptions['scrollMargin']\n reverse?: UseVirtualizerOptions['reverse']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nfunction resolveEstimate<T>(\n estimate: UseVirtualListOptions<T>['estimateSize'],\n index: number,\n item: T,\n): number {\n if (typeof estimate === 'function') return estimate(index, item)\n if (typeof estimate === 'number') return estimate\n return 48\n}\n\nexport function useVirtualList<T>(options: UseVirtualListOptions<T>) {\n const virtualizer = useVirtualizer({\n count: () => toValue(options.items).length,\n estimateSize: (index) => {\n const source = toValue(options.items)\n return resolveEstimate(options.estimateSize, index, source[index] as T)\n },\n getItemKey: (index) => {\n const source = toValue(options.items)\n const item = source[index] as T\n return options.getItemKey?.(item, index) ?? index\n },\n itemSize: () => {\n if (options.itemSize !== undefined) return toValue(options.itemSize)\n return typeof options.estimateSize === 'number' ? options.estimateSize : undefined\n },\n container: options.container,\n horizontal: options.horizontal,\n overscan: options.overscan,\n gap: options.gap,\n paddingStart: options.paddingStart,\n paddingEnd: options.paddingEnd,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n reverse: options.reverse,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const virtualItems = computed<VirtualListItem<T>[]>(() => {\n const source = toValue(options.items)\n return virtualizer.virtualItems.value.map((virtual) => {\n const item = source[virtual.index] as T\n return {\n ...virtual,\n item,\n key: options.getItemKey?.(item, virtual.index) ?? virtual.key,\n }\n })\n })\n\n return {\n virtualItems,\n totalSize: virtualizer.totalSize,\n scrollOffset: virtualizer.scrollOffset,\n scrollAdjust: virtualizer.scrollAdjust,\n isScrolling: virtualizer.isScrolling,\n scrollToIndex: virtualizer.scrollToIndex,\n scrollToOffset: virtualizer.scrollToOffset,\n measure: virtualizer.measure,\n measureElement: virtualizer.measureElement,\n }\n}\n","import { computed, onBeforeUnmount, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { ScrollToIndexOptions, VirtualItem, VisibleRange } from '@/core/types'\nimport { asElement, isBrowser } from '@/utils/dom'\nimport { useVirtualizer, type UseVirtualizerOptions } from '@/composables/useVirtualizer'\n\nexport interface VirtualGridCell<T> {\n index: number\n key: string | number\n item: T\n row: VirtualItem\n column: VirtualItem\n}\n\nexport interface UseVirtualGridOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n columnCount: MaybeRefOrGetter<number>\n estimateRowSize?: MaybeRefOrGetter<number | ((rowIndex: number) => number)>\n estimateColumnSize?: MaybeRefOrGetter<number | ((columnIndex: number) => number)>\n container?: UseVirtualizerOptions['container']\n overscan?: MaybeRefOrGetter<number | undefined>\n overscanRows?: MaybeRefOrGetter<number | undefined>\n overscanColumns?: MaybeRefOrGetter<number | undefined>\n rowGap?: MaybeRefOrGetter<number | undefined>\n columnGap?: MaybeRefOrGetter<number | undefined>\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n revision?: UseVirtualizerOptions['revision']\n windowScroll?: UseVirtualizerOptions['windowScroll']\n scrollMargin?: UseVirtualizerOptions['scrollMargin']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nfunction resolveSize(\n estimate: number | ((index: number) => number) | undefined,\n index: number,\n fallback: number,\n): number {\n if (typeof estimate === 'function') return estimate(index)\n if (typeof estimate === 'number') return estimate\n return fallback\n}\n\nexport function useVirtualGrid<T>(options: UseVirtualGridOptions<T>) {\n const columnCount = computed(() => Math.max(1, Math.floor(toValue(options.columnCount) || 1)))\n const rowCount = computed(() => Math.ceil(toValue(options.items).length / columnCount.value))\n const rowSizes = new Map<number, number>()\n\n const rows = useVirtualizer({\n count: () => rowCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateRowSize), index, 48),\n itemSize: () => {\n const estimate = toValue(options.estimateRowSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanRows) ?? toValue(options.overscan) ?? 2,\n gap: () => toValue(options.rowGap) ?? 0,\n horizontal: false,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const columns = useVirtualizer({\n count: () => columnCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateColumnSize), index, 160),\n itemSize: () => {\n const estimate = toValue(options.estimateColumnSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanColumns) ?? toValue(options.overscan) ?? 1,\n gap: () => toValue(options.columnGap) ?? 0,\n horizontal: true,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n })\n\n const virtualCells = computed<VirtualGridCell<T>[]>(() => {\n const source = toValue(options.items)\n const perRow = columnCount.value\n const cells: VirtualGridCell<T>[] = []\n for (const row of rows.virtualItems.value) {\n for (const column of columns.virtualItems.value) {\n const index = row.index * perRow + column.index\n if (index >= source.length) continue\n const item = source[index] as T\n cells.push({\n index,\n key: options.getItemKey?.(item, index) ?? index,\n item,\n row,\n column,\n })\n }\n }\n return cells\n })\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const source = toValue(options.items)\n if (!source.length) return\n const safe = Math.min(Math.max(index, 0), source.length - 1)\n const perRow = columnCount.value\n rows.scrollToIndex(Math.floor(safe / perRow), scrollOptions)\n columns.scrollToIndex(safe % perRow, scrollOptions)\n }\n\n function scrollToOffset(\n offset: { top?: number; left?: number },\n behavior: ScrollBehavior = 'auto',\n ): void {\n if (offset.top !== undefined) rows.scrollToOffset(offset.top, behavior)\n if (offset.left !== undefined) columns.scrollToOffset(offset.left, behavior)\n }\n\n function measureRow(rowIndex: number, size: number): void {\n const next = Math.max(rowSizes.get(rowIndex) ?? 0, size)\n if (next <= 0 || next === rowSizes.get(rowIndex)) return\n rowSizes.set(rowIndex, next)\n rows.measure(rowIndex, next)\n }\n\n let rowObserver: ResizeObserver | null = null\n const observedRows = new Map<Element, number>()\n\n function ensureRowObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!rowObserver) {\n rowObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const rowIndex = observedRows.get(entry.target)\n if (rowIndex === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = box?.blockSize ?? entry.contentRect.height\n if (size > 0) measureRow(rowIndex, size)\n }\n })\n }\n return rowObserver\n }\n\n function measureRowElement(target: unknown, rowIndex: number): void {\n const element = asElement(target)\n const observer = ensureRowObserver()\n if (!element) return\n observedRows.set(element, rowIndex)\n observer?.observe(element)\n const size = element.getBoundingClientRect().height\n if (size > 0) measureRow(rowIndex, size)\n }\n\n onBeforeUnmount(() => {\n rowObserver?.disconnect()\n observedRows.clear()\n })\n\n return {\n virtualRows: rows.virtualItems,\n virtualColumns: columns.virtualItems,\n virtualCells,\n totalHeight: rows.totalSize,\n totalWidth: columns.totalSize,\n scrollAdjustX: columns.scrollAdjust,\n scrollAdjustY: rows.scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n measureColumn: columns.measure,\n }\n}\n","import { computed, toValue, type CSSProperties, type MaybeRefOrGetter } from 'vue'\nimport type { VisibleRange } from '@/core/types'\nimport {\n useVirtualList,\n type UseVirtualListOptions,\n type VirtualListItem,\n} from '@/composables/useVirtualList'\n\nexport interface VirtualTableColumn<T> {\n id: string\n header: string\n width?: number\n minWidth?: number\n align?: 'left' | 'center' | 'right'\n pin?: 'start' | 'end'\n accessor?: (row: T, index: number) => unknown\n}\n\nexport interface PlacedVirtualTableColumn<T> extends VirtualTableColumn<T> {\n start: number\n size: number\n end: number\n pinOffset: number\n stickyStyle: CSSProperties\n}\n\nexport interface UseVirtualTableOptions<T> {\n rows: MaybeRefOrGetter<readonly T[]>\n columns: MaybeRefOrGetter<readonly VirtualTableColumn<T>[]>\n estimateRowSize?: number | ((index: number, row: T) => number)\n container?: UseVirtualListOptions<T>['container']\n overscan?: UseVirtualListOptions<T>['overscan']\n getRowKey?: (row: T, index: number) => string | number\n initialRect?: UseVirtualListOptions<T>['initialRect']\n viewportInset?: UseVirtualListOptions<T>['viewportInset']\n revision?: UseVirtualListOptions<T>['revision']\n itemSize?: UseVirtualListOptions<T>['itemSize']\n windowScroll?: UseVirtualListOptions<T>['windowScroll']\n scrollMargin?: UseVirtualListOptions<T>['scrollMargin']\n reverse?: UseVirtualListOptions<T>['reverse']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nexport function useVirtualTable<T>(options: UseVirtualTableOptions<T>) {\n const list = useVirtualList<T>({\n items: options.rows,\n estimateSize: options.estimateRowSize,\n container: options.container,\n overscan: options.overscan,\n getItemKey: options.getRowKey,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n itemSize: options.itemSize,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n reverse: options.reverse,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const columns = computed<PlacedVirtualTableColumn<T>[]>(() => {\n const source = toValue(options.columns)\n let start = 0\n const placed = source.map((column) => {\n const size = column.width ?? column.minWidth ?? 160\n const next: PlacedVirtualTableColumn<T> = {\n ...column,\n start,\n size,\n end: start + size,\n pinOffset: 0,\n stickyStyle: {},\n }\n start += size\n return next\n })\n\n let startPin = 0\n for (const column of placed) {\n if (column.pin !== 'start') continue\n column.pinOffset = startPin\n column.stickyStyle = {\n position: 'sticky',\n left: `${startPin}px`,\n zIndex: 2,\n }\n startPin += column.size\n }\n\n let endPin = 0\n for (let index = placed.length - 1; index >= 0; index -= 1) {\n const column = placed[index]\n if (!column || column.pin !== 'end') continue\n column.pinOffset = endPin\n column.stickyStyle = {\n position: 'sticky',\n right: `${endPin}px`,\n zIndex: 2,\n }\n endPin += column.size\n }\n\n return placed\n })\n\n const totalWidth = computed(() => {\n const placed = columns.value\n if (!placed.length) return 0\n return placed[placed.length - 1]?.end ?? 0\n })\n\n const virtualRows = computed<VirtualListItem<T>[]>(() => list.virtualItems.value)\n\n return {\n virtualRows,\n columns,\n totalHeight: list.totalSize,\n totalWidth,\n scrollOffset: list.scrollOffset,\n scrollAdjust: list.scrollAdjust,\n isScrolling: list.isScrolling,\n scrollToIndex: list.scrollToIndex,\n scrollToOffset: list.scrollToOffset,\n measure: list.measure,\n measureElement: list.measureElement,\n }\n}\n","import type { CSSProperties } from 'vue'\nimport { scrollContentSize } from '@/core/scrolling'\n\nexport function toCssSize(value: number | string | undefined): string | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return `${value}px`\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nexport function parseCssPx(value: number | string | undefined): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value !== 'string') return 0\n const match = /^(-?\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!match?.[1]) return 0\n const parsed = Number(match[1])\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nexport function scrollerStyle(input: {\n height?: number | string\n width?: number | string\n horizontal: boolean\n windowScroll?: boolean\n}): CSSProperties {\n if (input.windowScroll) {\n return {\n position: 'relative',\n width: toCssSize(input.width) ?? '100%',\n height: toCssSize(input.height),\n overflowAnchor: 'none',\n }\n }\n return {\n overflow: 'auto',\n position: 'relative',\n height: toCssSize(input.height) ?? (input.horizontal ? '100%' : undefined),\n width: toCssSize(input.width) ?? (input.horizontal ? undefined : '100%'),\n overflowAnchor: 'none',\n }\n}\n\nexport function spacerStyle(total: number, horizontal: boolean): CSSProperties {\n const size = scrollContentSize(total)\n return {\n position: 'relative',\n width: horizontal ? `${size}px` : '100%',\n height: horizontal ? '100%' : `${size}px`,\n }\n}\n\nexport function itemStyle(start: number, horizontal: boolean, size?: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: horizontal ? (size === undefined ? undefined : `${size}px`) : '100%',\n height: horizontal ? '100%' : size === undefined ? undefined : `${size}px`,\n transform: horizontal ? `translateX(${start}px)` : `translateY(${start}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type HTMLAttributes } from 'vue'\nimport { useVirtualList } from '@/composables/useVirtualList'\nimport type { VisibleRange } from '@/core/types'\nimport { itemStyle, parseCssPx, scrollerStyle, spacerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n estimateSize?: number | ((index: number, item: T) => number)\n height?: number | string\n width?: number | string\n horizontal?: boolean\n overscan?: number\n gap?: number\n paddingStart?: number\n paddingEnd?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemTag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n reverse?: boolean\n }>(),\n {\n estimateSize: 48,\n overscan: 8,\n gap: 0,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n windowScroll: false,\n scrollMargin: 0,\n reverse: false,\n tag: 'div',\n itemTag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst { virtualItems, totalSize, scrollAdjust, scrollToIndex, scrollToOffset, measure, measureElement } =\n useVirtualList<T>({\n items: () => props.items,\n estimateSize: (index, item) => {\n const estimate = props.estimateSize\n return typeof estimate === 'number' ? estimate : estimate(index, item)\n },\n itemSize: () => (typeof props.estimateSize === 'number' ? props.estimateSize : undefined),\n container,\n horizontal: () => props.horizontal,\n overscan: () => props.overscan,\n gap: () => props.gap,\n paddingStart: () => props.paddingStart,\n paddingEnd: () => props.paddingEnd,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n reverse: () => props.reverse,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n })\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: props.horizontal,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst innerStyle = computed(() => spacerStyle(totalSize.value, props.horizontal))\n\nfunction rowStyle(start: number, size: number) {\n return itemStyle(start, props.horizontal, size)\n}\n\nfunction bindItem(index: number) {\n return (element: unknown) => {\n measureElement(element, index)\n }\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measure,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"list\" :style=\"containerStyle\">\n <slot v-if=\"!items.length\" name=\"empty\" />\n <div v-else data-virtual-spacer :style=\"innerStyle\">\n <component\n :is=\"itemTag\"\n v-for=\"virtualItem in virtualItems\"\n :key=\"virtualItem.key\"\n :ref=\"bindItem(virtualItem.index)\"\n role=\"listitem\"\n :data-index=\"virtualItem.index\"\n :data-key=\"String(virtualItem.key)\"\n :aria-setsize=\"items.length\"\n :aria-posinset=\"virtualItem.index + 1\"\n :style=\"rowStyle(virtualItem.start - scrollAdjust, virtualItem.size)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"virtualItem.item\"\n :index=\"virtualItem.index\"\n :start=\"virtualItem.start\"\n :size=\"virtualItem.size\"\n :end=\"virtualItem.end\"\n />\n </component>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualGrid } from '@/composables/useVirtualGrid'\nimport type { VisibleRange } from '@/core/types'\nimport { scrollContentSize } from '@/core/scrolling'\nimport { parseCssPx, scrollerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n columnCount?: number\n estimateRowSize?: number | ((rowIndex: number) => number)\n estimateColumnSize?: number | ((columnIndex: number) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n overscanRows?: number\n overscanColumns?: number\n rowGap?: number\n columnGap?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n }>(),\n {\n columnCount: 1,\n estimateRowSize: 48,\n estimateColumnSize: 160,\n overscan: 2,\n rowGap: 0,\n columnGap: 0,\n windowScroll: false,\n scrollMargin: 0,\n tag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst {\n virtualCells,\n totalWidth,\n totalHeight,\n scrollAdjustX,\n scrollAdjustY,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n} = useVirtualGrid<T>({\n items: () => props.items,\n columnCount: () => props.columnCount,\n estimateRowSize: () => props.estimateRowSize,\n estimateColumnSize: () => props.estimateColumnSize,\n container,\n overscan: () => props.overscan,\n overscanRows: () => props.overscanRows,\n overscanColumns: () => props.overscanColumns,\n rowGap: () => props.rowGap,\n columnGap: () => props.columnGap,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst innerStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n width: `${scrollContentSize(totalWidth.value)}px`,\n height: `${scrollContentSize(totalHeight.value)}px`,\n}))\n\nfunction bindCell(rowIndex: number) {\n return (element: unknown) => {\n measureRowElement(element, rowIndex)\n }\n}\n\nfunction cellStyle(\n columnStart: number,\n columnSize: number,\n rowStart: number,\n rowSize: number,\n): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: `${columnSize}px`,\n height: `${rowSize}px`,\n transform: `translate(${columnStart}px, ${rowStart}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measureRow,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"grid\" :style=\"containerStyle\">\n <slot v-if=\"!items.length\" name=\"empty\" />\n <div v-else data-virtual-spacer :style=\"innerStyle\">\n <div\n v-for=\"cell in virtualCells\"\n :key=\"cell.key\"\n :ref=\"bindCell(cell.row.index)\"\n role=\"gridcell\"\n :data-index=\"cell.index\"\n :data-key=\"String(cell.key)\"\n :style=\"cellStyle(cell.column.start - scrollAdjustX, cell.column.size, cell.row.start - scrollAdjustY, cell.row.size)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"cell.item\"\n :index=\"cell.index\"\n :row-index=\"cell.row.index\"\n :column-index=\"cell.column.index\"\n :row=\"cell.row\"\n :column=\"cell.column\"\n />\n </div>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, watch, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualTable, type VirtualTableColumn } from '@/composables/useVirtualTable'\nimport type { VisibleRange } from '@/core/types'\nimport { isBrowser } from '@/utils/dom'\nimport { scrollContentSize } from '@/core/scrolling'\nimport { parseCssPx, scrollerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n rows: readonly T[]\n columns: readonly VirtualTableColumn<T>[]\n estimateRowSize?: number | ((index: number, row: T) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n getRowKey?: (row: T, index: number) => string | number\n stickyHeader?: boolean\n tag?: string\n rowAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n reverse?: boolean\n }>(),\n {\n estimateRowSize: 44,\n overscan: 8,\n stickyHeader: true,\n windowScroll: false,\n scrollMargin: 0,\n reverse: false,\n tag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\nconst header = ref<HTMLElement | null>(null)\nconst headerSize = ref(0)\n\nconst {\n virtualRows,\n columns: placedColumns,\n totalWidth,\n totalHeight,\n scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n} = useVirtualTable<T>({\n rows: () => props.rows,\n columns: () => props.columns,\n estimateRowSize: (index, row) => {\n const estimate = props.estimateRowSize\n return typeof estimate === 'number' ? estimate : estimate(index, row)\n },\n container,\n overscan: () => props.overscan,\n getRowKey: (row, index) => props.getRowKey?.(row, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n viewportInset: headerSize,\n revision: () => props.revision,\n itemSize: () => (typeof props.estimateRowSize === 'number' ? props.estimateRowSize : undefined),\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n reverse: () => props.reverse,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n})\n\nwatch(header, (element, previous, onCleanup) => {\n if (previous === element && !element) return\n if (!element || !isBrowser() || typeof ResizeObserver === 'undefined') return\n const read = () => {\n headerSize.value = element.getBoundingClientRect().height\n }\n const observer = new ResizeObserver(read)\n observer.observe(element)\n read()\n onCleanup(() => observer.disconnect())\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst frameStyle = computed<CSSProperties>(() => ({\n minWidth: `${totalWidth.value}px`,\n}))\n\nconst headerStyle = computed<CSSProperties>(() => ({\n position: props.stickyHeader ? 'sticky' : 'relative',\n top: props.stickyHeader ? '0px' : undefined,\n zIndex: 3,\n display: 'flex',\n width: `${totalWidth.value}px`,\n}))\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n height: `${scrollContentSize(totalHeight.value)}px`,\n width: `${scrollContentSize(totalWidth.value)}px`,\n}))\n\nfunction placedStyle(column: {\n size: number\n align?: 'left' | 'center' | 'right'\n stickyStyle: CSSProperties\n pin?: 'start' | 'end'\n}): CSSProperties {\n return {\n width: `${column.size}px`,\n minWidth: `${column.size}px`,\n flex: '0 0 auto',\n textAlign: column.align ?? 'left',\n ...column.stickyStyle,\n zIndex: column.pin ? (props.stickyHeader ? 4 : 2) : column.stickyStyle.zIndex,\n }\n}\n\nfunction rowStyle(start: number, size: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${size}px`,\n display: 'flex',\n transform: `translateY(${start}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n\nfunction bindRow(index: number) {\n return (element: unknown) => {\n measureElement(element, index)\n }\n}\n\nfunction cellValue(row: T, column: VirtualTableColumn<T>, index: number): unknown {\n if (column.accessor) return column.accessor(row, index)\n if (row && typeof row === 'object' && column.id in row) {\n return (row as Record<string, unknown>)[column.id]\n }\n return ''\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measure,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"table\" :style=\"containerStyle\">\n <div :style=\"frameStyle\">\n <div ref=\"header\" role=\"row\" :style=\"headerStyle\">\n <slot name=\"header\" :columns=\"placedColumns\">\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"columnheader\"\n :style=\"placedStyle(column)\"\n >\n {{ column.header }}\n </div>\n </slot>\n </div>\n <slot v-if=\"!rows.length\" name=\"empty\" />\n <div v-else data-virtual-spacer role=\"rowgroup\" :style=\"bodyStyle\">\n <div\n v-for=\"virtualRow in virtualRows\"\n :key=\"virtualRow.key\"\n :ref=\"bindRow(virtualRow.index)\"\n role=\"row\"\n :data-index=\"virtualRow.index\"\n :data-key=\"String(virtualRow.key)\"\n :aria-rowindex=\"virtualRow.index + 1\"\n :style=\"rowStyle(virtualRow.start - scrollAdjust, virtualRow.size)\"\n v-bind=\"rowAttrs\"\n >\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"cell\"\n :style=\"placedStyle(column)\"\n >\n <slot\n name=\"cell\"\n :row=\"virtualRow.item\"\n :column=\"column\"\n :row-index=\"virtualRow.index\"\n :value=\"cellValue(virtualRow.item, column, virtualRow.index)\"\n >\n {{ cellValue(virtualRow.item, column, virtualRow.index) }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </component>\n</template>\n"],"names":["normalizeSize","size","MeasurementCache","index","baseline","count","removed","value","delta","next","moved","clamp","min","max","MAX_SCROLL_SIZE","clampScrollOffset","offset","totalSize","viewport","scrollContentSize","measured","total","capped","mapDomOffsetToVirtual","domOffset","virtualSize","domSize","maxVirtual","maxDom","mapVirtualOffsetToDom","virtualOffset","findFirstIndexPast","target","getEnd","low","high","answer","mid","findLastIndexBefore","getStart","resolveScrollOffset","input","end","align","visibleEnd","Virtualizer","options","nextLanes","nextGap","nextPaddingStart","nextPaddingEnd","nextCount","nextItemSize","previousItemSize","geometryChanged","previous","before","clamped","ordinal","maxEnd","lane","endEdge","items","startOrdinal","endOrdinal","from","to","start","left","right","raw","last","isBrowser","asElement","writeScroll","element","horizontal","behavior","writeWindowScroll","readScroll","readWindowScroll","readViewport","readWindowViewport","readContentSize","documentOffset","rect","scheduleFrame","callback","cancelFrame","id","sameVirtualItems","useVirtualizer","engine","virtualItems","shallowRef","ref","scrollOffset","scrollAdjust","isScrolling","estimateSize","listeningEl","listeningWindow","resizeObserver","itemObserver","measureFrame","scrollTimer","travelOverscan","seenRevision","toValue","previousCount","previousFirstKey","didInitialReverse","lastRangeKey","observed","elementsByIndex","pendingMeasures","currentElement","windowScroll","reverse","viewportFallback","origin","margin","contentSize","readDomScroll","readDomViewport","writeDomScroll","readVirtualOffset","writeVirtualOffset","emitRange","range","key","publish","revision","firstKey","prepended","appended","added","nearEnd","inset","itemSize","gap","nextTotal","maxOffset","nextOffset","nextAdjust","settleScroll","flushMeasures","markScrolling","onScroll","sizeHint","unbindScroll","bindContainer","ensureItemObserver","entries","axis","changed","entry","box","batch","pending","measureElement","observer","current","scrollToOffset","scrollToIndex","scrollOptions","measure","watch","onBeforeUnmount","computed","resolveEstimate","estimate","item","useVirtualList","virtualizer","source","virtual","resolveSize","fallback","useVirtualGrid","columnCount","rowCount","rowSizes","rows","columns","virtualCells","perRow","cells","row","column","safe","measureRow","rowIndex","rowObserver","observedRows","ensureRowObserver","measureRowElement","useVirtualTable","list","placed","startPin","endPin","totalWidth","toCssSize","parseCssPx","match","parsed","scrollerStyle","spacerStyle","itemStyle","props","__props","emit","__emit","container","containerStyle","innerStyle","rowStyle","bindItem","__expose","_openBlock","_createBlock","_resolveDynamicComponent","_createElementBlock","_Fragment","_renderList","_unref","virtualItem","_mergeProps","_renderSlot","_ctx","totalHeight","scrollAdjustX","scrollAdjustY","bindCell","cellStyle","columnStart","columnSize","rowStart","rowSize","cell","header","headerSize","virtualRows","placedColumns","onCleanup","read","frameStyle","headerStyle","bodyStyle","placedStyle","bindRow","cellValue","_createElementVNode","_normalizeStyle","_toDisplayString","virtualRow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/core/measurements.ts","../src/utils/clamp.ts","../src/core/scrolling.ts","../src/core/virtualizer.ts","../src/utils/dom.ts","../src/utils/same-items.ts","../src/composables/useVirtualizer.ts","../src/composables/useVirtualList.ts","../src/composables/useVirtualGrid.ts","../src/composables/useVirtualTable.ts","../src/utils/layout.ts","../src/components/VirtualList.vue","../src/components/VirtualGrid.vue","../src/components/VirtualTable.vue"],"sourcesContent":["export function normalizeSize(size: number): number {\n if (!Number.isFinite(size) || size < 0) return 0\n return size\n}\n\nexport class MeasurementCache {\n private readonly sizes = new Map<number, number>()\n private divergent = false\n\n get(index: number): number | undefined {\n return this.sizes.get(index)\n }\n\n set(index: number, size: number, baseline: number | null): void {\n this.sizes.set(index, size)\n if (baseline !== null && Math.abs(size - baseline) >= 0.5) this.divergent = true\n }\n\n get hasDivergent(): boolean {\n return this.divergent\n }\n\n clear(): void {\n this.sizes.clear()\n this.divergent = false\n }\n\n trim(count: number, baseline: number | null): void {\n let removed = false\n for (const index of this.sizes.keys()) {\n if (index >= count) {\n this.sizes.delete(index)\n removed = true\n }\n }\n if (!removed) return\n this.divergent = false\n if (baseline === null) return\n for (const value of this.sizes.values()) {\n if (Math.abs(value - baseline) >= 0.5) {\n this.divergent = true\n return\n }\n }\n }\n\n shift(delta: number): void {\n if (!delta) return\n const next = new Map<number, number>()\n for (const [index, size] of this.sizes) {\n const moved = index + delta\n if (moved >= 0) next.set(moved, size)\n }\n this.sizes.clear()\n for (const [index, size] of next) this.sizes.set(index, size)\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n","import type { ScrollAlignment } from '@/core/types'\nimport { clamp } from '@/utils/clamp'\n\nexport const MAX_SCROLL_SIZE = 16_777_216\n\nexport function clampScrollOffset(offset: number, totalSize: number, viewport: number): number {\n const max = Math.max(0, totalSize - Math.max(0, viewport))\n return clamp(Number.isFinite(offset) ? offset : 0, 0, max)\n}\n\nexport function scrollContentSize(totalSize: number, measured?: number): number {\n const total = Math.max(0, Number.isFinite(totalSize) ? totalSize : 0)\n const capped = Math.min(total, MAX_SCROLL_SIZE)\n if (measured === undefined || !Number.isFinite(measured) || measured <= 0) return capped\n return Math.min(capped, measured)\n}\n\nexport function mapDomOffsetToVirtual(\n domOffset: number,\n virtualSize: number,\n domSize: number,\n viewport: number,\n): number {\n const maxVirtual = Math.max(0, virtualSize - Math.max(0, viewport))\n const maxDom = Math.max(0, domSize - Math.max(0, viewport))\n if (maxVirtual <= 0) return 0\n if (maxDom <= 0 || maxDom >= maxVirtual) return clampScrollOffset(domOffset, virtualSize, viewport)\n return (Math.max(0, domOffset) / maxDom) * maxVirtual\n}\n\nexport function mapVirtualOffsetToDom(\n virtualOffset: number,\n virtualSize: number,\n domSize: number,\n viewport: number,\n): number {\n const maxVirtual = Math.max(0, virtualSize - Math.max(0, viewport))\n const maxDom = Math.max(0, domSize - Math.max(0, viewport))\n if (maxDom <= 0) return 0\n if (maxVirtual <= 0 || maxDom >= maxVirtual) {\n return clampScrollOffset(virtualOffset, virtualSize, viewport)\n }\n return (clampScrollOffset(virtualOffset, virtualSize, viewport) / maxVirtual) * maxDom\n}\n\nexport function findFirstIndexPast(\n count: number,\n target: number,\n getEnd: (index: number) => number,\n): number {\n if (count <= 0) return 0\n let low = 0\n let high = count - 1\n let answer = count - 1\n while (low <= high) {\n const mid = (low + high) >>> 1\n if (getEnd(mid) > target) {\n answer = mid\n high = mid - 1\n } else {\n low = mid + 1\n }\n }\n return answer\n}\n\nexport function findLastIndexBefore(\n count: number,\n target: number,\n getStart: (index: number) => number,\n): number {\n if (count <= 0) return 0\n let low = 0\n let high = count - 1\n let answer = 0\n while (low <= high) {\n const mid = (low + high) >>> 1\n if (getStart(mid) < target) {\n answer = mid\n low = mid + 1\n } else {\n high = mid - 1\n }\n }\n return answer\n}\n\nexport function resolveScrollOffset(input: {\n start: number\n size: number\n viewport: number\n current: number\n align: ScrollAlignment\n}): number {\n const end = input.start + input.size\n let align = input.align\n if (align === 'auto') {\n const visibleEnd = input.current + input.viewport\n const fullyVisible = input.start >= input.current && end <= visibleEnd\n if (fullyVisible) return input.current\n align = input.start < input.current ? 'start' : 'end'\n }\n if (align === 'center') return input.start - (input.viewport - input.size) / 2\n if (align === 'end') return end - input.viewport\n return input.start\n}\n","import { MeasurementCache, normalizeSize } from '@/core/measurements'\nimport {\n clampScrollOffset,\n findFirstIndexPast,\n findLastIndexBefore,\n resolveScrollOffset,\n} from '@/core/scrolling'\nimport type { ScrollAlignment, VirtualItem, VirtualizerOptions } from '@/core/types'\nimport { clamp } from '@/utils/clamp'\n\nexport class Virtualizer {\n private count = 0\n private estimateSize: (index: number) => number = () => 0\n private overscan = 0\n private gap = 0\n private paddingStart = 0\n private paddingEnd = 0\n private lanes = 1\n private itemSize: number | null = null\n private viewportSize = 0\n private scrollOffset = 0\n private getItemKey: (index: number) => string | number = (index) => index\n private readonly measurements = new MeasurementCache()\n private built = 0\n private offsets: number[] = []\n private laneCursor: number[] = []\n private laneEnd: number[] = []\n\n setOptions(options: VirtualizerOptions): void {\n const nextLanes = Math.max(1, Math.floor(options.lanes ?? 1))\n const nextGap = options.gap ?? 0\n const nextPaddingStart = options.paddingStart ?? 0\n const nextPaddingEnd = options.paddingEnd ?? 0\n const nextCount = Math.max(0, Math.floor(options.count))\n const nextItemSize =\n options.itemSize === undefined || options.itemSize === null\n ? null\n : normalizeSize(options.itemSize)\n const previousItemSize = this.itemSize\n const geometryChanged =\n nextLanes !== this.lanes ||\n nextGap !== this.gap ||\n nextPaddingStart !== this.paddingStart ||\n nextPaddingEnd !== this.paddingEnd ||\n options.estimateSize !== this.estimateSize ||\n nextItemSize !== this.itemSize\n\n this.count = nextCount\n this.lanes = nextLanes\n this.gap = nextGap\n this.paddingStart = nextPaddingStart\n this.paddingEnd = nextPaddingEnd\n this.overscan = Math.max(0, Math.floor(options.overscan ?? 0))\n this.estimateSize = options.estimateSize\n this.itemSize = nextItemSize\n this.getItemKey = options.getItemKey ?? ((index) => index)\n if (options.viewportSize !== undefined) this.viewportSize = Math.max(0, options.viewportSize)\n if (nextItemSize !== previousItemSize) this.measurements.clear()\n this.measurements.trim(this.count, this.itemSize)\n if (geometryChanged || this.built > this.count) this.resetGeometry()\n }\n\n setScrollOffset(offset: number): void {\n this.scrollOffset = Number.isFinite(offset) ? offset : 0\n }\n\n getScrollOffset(): number {\n return this.scrollOffset\n }\n\n getViewportSize(): number {\n return this.viewportSize\n }\n\n measure(index: number, size: number): boolean {\n if (index < 0 || index >= this.count) return false\n const next = normalizeSize(size)\n const previous = this.measurements.get(index)\n if (previous !== undefined && Math.abs(previous - next) < 0.5) return false\n const before = this.getItemSize(index)\n this.measurements.set(index, next, this.itemSize)\n if (Math.abs(before - next) < 0.5) return false\n this.resetGeometry()\n return true\n }\n\n clearMeasurements(): void {\n this.measurements.clear()\n this.resetGeometry()\n }\n\n shiftMeasurements(delta: number): void {\n if (!delta) return\n this.measurements.shift(delta)\n this.resetGeometry()\n }\n\n getItemSize(index: number): number {\n const measured = this.measurements.get(index)\n if (measured !== undefined) return measured\n if (this.itemSize !== null) return this.itemSize\n return normalizeSize(this.estimateSize(index))\n }\n\n getItemOffset(index: number): number {\n if (index <= 0 || this.count <= 0) return this.paddingStart\n const clamped = Math.min(index, this.count - 1)\n if (this.usesFixedPath()) {\n const ordinal = Math.floor(clamped / this.lanes)\n return this.paddingStart + ordinal * ((this.itemSize ?? 0) + this.gap)\n }\n this.ensure(clamped)\n return this.offsets[clamped] ?? this.paddingStart\n }\n\n getTotalSize(): number {\n if (this.count <= 0) return this.paddingStart + this.paddingEnd\n if (this.usesFixedPath()) {\n let maxEnd = this.paddingStart\n const size = this.itemSize ?? 0\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const total = this.laneLength(lane)\n const end = this.paddingStart + total * size + Math.max(0, total - 1) * this.gap\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n this.ensure(this.count - 1)\n let maxEnd = this.paddingStart\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const end = this.laneEnd[lane] ?? this.paddingStart\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n\n getVirtualItems(): VirtualItem[] {\n if (this.count <= 0 || this.viewportSize <= 0) return []\n const offset = clampScrollOffset(this.scrollOffset, this.getTotalSize(), this.viewportSize)\n const endEdge = offset + this.viewportSize\n const items: VirtualItem[] = []\n for (let lane = 0; lane < this.lanes; lane += 1) {\n const total = this.laneLength(lane)\n if (total <= 0) continue\n const startOrdinal = findFirstIndexPast(total, offset, (ordinal) => {\n const index = this.ordinalIndex(lane, ordinal)\n return this.getItemOffset(index) + this.getItemSize(index)\n })\n const endOrdinal = findLastIndexBefore(total, endEdge, (ordinal) =>\n this.getItemOffset(this.ordinalIndex(lane, ordinal)),\n )\n const from = Math.max(0, Math.min(startOrdinal, endOrdinal) - this.overscan)\n const to = Math.min(total - 1, Math.max(startOrdinal, endOrdinal) + this.overscan)\n for (let ordinal = from; ordinal <= to; ordinal += 1) {\n const index = this.ordinalIndex(lane, ordinal)\n const start = this.getItemOffset(index)\n const size = this.getItemSize(index)\n items.push({\n index,\n key: this.getItemKey(index),\n start,\n size,\n end: start + size,\n lane,\n })\n }\n }\n items.sort((left, right) => left.index - right.index)\n return items\n }\n\n getOffsetForIndex(index: number, align: ScrollAlignment = 'auto'): number {\n if (this.count <= 0) return 0\n const clamped = clamp(index, 0, this.count - 1)\n const start = this.getItemOffset(clamped)\n const size = this.getItemSize(clamped)\n const raw = resolveScrollOffset({\n start,\n size,\n viewport: this.viewportSize,\n current: this.scrollOffset,\n align,\n })\n return clampScrollOffset(raw, this.getTotalSize(), this.viewportSize)\n }\n\n private usesFixedPath(): boolean {\n return this.itemSize !== null && !this.measurements.hasDivergent\n }\n\n private ordinalIndex(lane: number, ordinal: number): number {\n return lane + ordinal * this.lanes\n }\n\n private laneLength(lane: number): number {\n if (lane < 0 || lane >= this.lanes || lane >= this.count) return 0\n return Math.floor((this.count - lane - 1) / this.lanes) + 1\n }\n\n private ensure(index: number): void {\n if (index < this.built) return\n const last = Math.min(index, this.count - 1)\n while (this.built <= last) {\n const lane = this.built % this.lanes\n const start = this.laneCursor[lane] ?? this.paddingStart\n this.offsets[this.built] = start\n const end = start + this.getItemSize(this.built)\n this.laneEnd[lane] = end\n this.laneCursor[lane] = end + this.gap\n this.built += 1\n }\n }\n\n private resetGeometry(): void {\n this.built = 0\n this.offsets = []\n this.laneCursor = Array.from({ length: this.lanes }, () => this.paddingStart)\n this.laneEnd = Array.from({ length: this.lanes }, () => this.paddingStart)\n }\n}\n","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\nexport function asElement(target: unknown): Element | null {\n if (typeof Element === 'undefined') return null\n return target instanceof Element ? target : null\n}\n\nexport function writeScroll(\n element: HTMLElement,\n offset: number,\n horizontal: boolean,\n behavior: ScrollBehavior,\n): void {\n if (behavior === 'smooth' && typeof element.scrollTo === 'function') {\n element.scrollTo({\n top: horizontal ? element.scrollTop : offset,\n left: horizontal ? offset : element.scrollLeft,\n behavior,\n })\n return\n }\n if (horizontal) element.scrollLeft = offset\n else element.scrollTop = offset\n}\n\nexport function writeWindowScroll(offset: number, horizontal: boolean, behavior: ScrollBehavior): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return\n const scrolling = document.scrollingElement\n if (behavior === 'smooth') {\n if (scrolling && typeof (scrolling as HTMLElement).scrollTo === 'function') {\n ;(scrolling as HTMLElement).scrollTo({\n top: horizontal ? (scrolling as HTMLElement).scrollTop : offset,\n left: horizontal ? offset : (scrolling as HTMLElement).scrollLeft,\n behavior,\n })\n return\n }\n window.scrollTo({\n top: horizontal ? window.scrollY : offset,\n left: horizontal ? offset : window.scrollX,\n behavior,\n })\n return\n }\n if (scrolling) {\n if (horizontal) (scrolling as HTMLElement).scrollLeft = offset\n else (scrolling as HTMLElement).scrollTop = offset\n return\n }\n if (horizontal) window.scrollTo(offset, window.scrollY)\n else window.scrollTo(window.scrollX, offset)\n}\n\nexport function readScroll(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollLeft : element.scrollTop\n}\n\nexport function readWindowScroll(horizontal: boolean): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0\n const scrolling = document.scrollingElement\n if (scrolling) return horizontal ? scrolling.scrollLeft : scrolling.scrollTop\n return horizontal ? window.scrollX : window.scrollY\n}\n\nexport function readViewport(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.clientWidth : element.clientHeight\n}\n\nexport function readWindowViewport(horizontal: boolean): number {\n if (typeof window === 'undefined') return 0\n return horizontal ? window.innerWidth : window.innerHeight\n}\n\nexport function readContentSize(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollWidth : element.scrollHeight\n}\n\nexport function documentOffset(element: HTMLElement, horizontal: boolean): number {\n const rect = element.getBoundingClientRect()\n if (typeof window === 'undefined') return horizontal ? rect.left : rect.top\n return horizontal ? rect.left + window.scrollX : rect.top + window.scrollY\n}\n\nexport function scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 0) as unknown as number\n}\n\nexport function cancelFrame(id: number): void {\n if (!id) return\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(id)\n else clearTimeout(id)\n}\n","import type { VirtualItem } from '@/core/types'\n\nexport function sameVirtualItems(\n left: readonly VirtualItem[],\n right: readonly VirtualItem[],\n): boolean {\n if (left.length !== right.length) return false\n for (let index = 0; index < left.length; index += 1) {\n const previous = left[index]\n const next = right[index]\n if (!previous || !next) return false\n if (\n previous.index !== next.index ||\n previous.start !== next.start ||\n previous.size !== next.size ||\n previous.end !== next.end ||\n previous.lane !== next.lane ||\n previous.key !== next.key\n ) {\n return false\n }\n }\n return true\n}\n","import {\n computed,\n onBeforeUnmount,\n ref,\n shallowRef,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from 'vue'\nimport { Virtualizer } from '@/core/virtualizer'\nimport type { ScrollToIndexOptions, VirtualItem, VisibleRange } from '@/core/types'\nimport {\n asElement,\n cancelFrame,\n isBrowser,\n readContentSize,\n readScroll,\n readViewport,\n readWindowScroll,\n readWindowViewport,\n scheduleFrame,\n writeScroll,\n writeWindowScroll,\n} from '@/utils/dom'\nimport { sameVirtualItems } from '@/utils/same-items'\nimport {\n clampScrollOffset,\n mapDomOffsetToVirtual,\n mapVirtualOffsetToDom,\n scrollContentSize,\n} from '@/core/scrolling'\n\nexport interface UseVirtualizerOptions {\n count: MaybeRefOrGetter<number>\n estimateSize: (index: number) => number\n container?: MaybeRefOrGetter<HTMLElement | null | undefined>\n horizontal?: MaybeRefOrGetter<boolean>\n overscan?: MaybeRefOrGetter<number>\n gap?: MaybeRefOrGetter<number>\n paddingStart?: MaybeRefOrGetter<number>\n paddingEnd?: MaybeRefOrGetter<number>\n lanes?: MaybeRefOrGetter<number>\n itemSize?: MaybeRefOrGetter<number | null | undefined>\n getItemKey?: (index: number) => string | number\n initialRect?: MaybeRefOrGetter<{ width: number; height: number } | undefined>\n viewportInset?: MaybeRefOrGetter<number>\n revision?: MaybeRefOrGetter<unknown>\n windowScroll?: MaybeRefOrGetter<boolean>\n scrollMargin?: MaybeRefOrGetter<number>\n reverse?: MaybeRefOrGetter<boolean>\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nexport function useVirtualizer(options: UseVirtualizerOptions) {\n const engine = new Virtualizer()\n const virtualItems = shallowRef<VirtualItem[]>([])\n const totalSize = ref(0)\n const scrollOffset = ref(0)\n const scrollAdjust = ref(0)\n const isScrolling = ref(false)\n const estimateSize = (index: number) => options.estimateSize(index)\n let listeningEl: HTMLElement | null = null\n let listeningWindow = false\n let resizeObserver: ResizeObserver | null = null\n let itemObserver: ResizeObserver | null = null\n let measureFrame = 0\n let scrollTimer = 0\n let travelOverscan = 0\n let seenRevision = toValue(options.revision)\n let previousCount = toValue(options.count)\n let previousFirstKey: string | number | undefined = options.getItemKey?.(0) ?? 0\n let didInitialReverse = false\n let lastRangeKey = ''\n const observed = new Map<Element, number>()\n const elementsByIndex = new Map<number, Element>()\n const pendingMeasures: { element: Element; index: number }[] = []\n\n function currentElement(): HTMLElement | null {\n const value = toValue(options.container)\n if (typeof HTMLElement === 'undefined') return null\n return value instanceof HTMLElement ? value : null\n }\n\n function horizontal(): boolean {\n return toValue(options.horizontal) ?? false\n }\n\n function windowScroll(): boolean {\n return toValue(options.windowScroll) ?? false\n }\n\n function reverse(): boolean {\n return toValue(options.reverse) ?? false\n }\n\n function viewportFallback(): number {\n const rect = toValue(options.initialRect)\n if (!rect) return 0\n return horizontal() ? rect.width : rect.height\n }\n\n function windowListOffset(element: HTMLElement): number {\n const rect = element.getBoundingClientRect()\n const margin = toValue(options.scrollMargin) ?? 0\n const local = horizontal() ? -rect.left : -rect.top\n return Math.max(0, local - margin)\n }\n\n function contentSize(element: HTMLElement | null, total: number): number {\n if (windowScroll()) return scrollContentSize(total)\n if (!element) return scrollContentSize(total)\n return scrollContentSize(total, readContentSize(element, horizontal()))\n }\n\n function readDomScroll(element: HTMLElement | null): number {\n if (windowScroll()) {\n if (!element || !isBrowser()) return 0\n return windowListOffset(element)\n }\n if (!element) return 0\n return readScroll(element, horizontal())\n }\n\n function readDomViewport(element: HTMLElement | null): number {\n if (windowScroll()) return readWindowViewport(horizontal())\n if (!element) return 0\n return readViewport(element, horizontal())\n }\n\n function writeDomScroll(element: HTMLElement | null, offset: number, behavior: ScrollBehavior): void {\n if (windowScroll()) {\n if (!element || !isBrowser()) return\n const current = readWindowScroll(horizontal())\n const local = windowListOffset(element)\n writeWindowScroll(current + (offset - local), horizontal(), behavior)\n return\n }\n if (!element) return\n writeScroll(element, offset, horizontal(), behavior)\n }\n\n function readVirtualOffset(element: HTMLElement | null, total: number, viewport: number): number {\n return mapDomOffsetToVirtual(\n readDomScroll(element),\n total,\n contentSize(element, total),\n viewport,\n )\n }\n\n function writeVirtualOffset(\n element: HTMLElement | null,\n offset: number,\n total: number,\n viewport: number,\n behavior: ScrollBehavior,\n ): void {\n writeDomScroll(\n element,\n mapVirtualOffsetToDom(offset, total, contentSize(element, total), viewport),\n behavior,\n )\n }\n\n function emitRange(): void {\n const callback = options.onVisibleRangeChange\n if (!callback) return\n const items = virtualItems.value\n const count = toValue(options.count)\n const range: VisibleRange = items.length\n ? {\n startIndex: items[0]?.index ?? 0,\n endIndex: items[items.length - 1]?.index ?? -1,\n count,\n }\n : { startIndex: 0, endIndex: -1, count }\n const key = `${range.startIndex}:${range.endIndex}:${range.count}`\n if (key === lastRangeKey) return\n lastRangeKey = key\n callback(range)\n }\n\n function publish(): void {\n const revision = toValue(options.revision)\n if (!Object.is(revision, seenRevision)) {\n seenRevision = revision\n engine.clearMeasurements()\n }\n const count = toValue(options.count)\n const firstKey = options.getItemKey?.(0) ?? 0\n const prepended =\n reverse() &&\n previousCount > 0 &&\n count > previousCount &&\n firstKey !== previousFirstKey\n const appended =\n reverse() &&\n previousCount > 0 &&\n count > previousCount &&\n firstKey === previousFirstKey\n const added = prepended || appended ? count - previousCount : 0\n const nearEnd =\n reverse() &&\n engine.getViewportSize() > 0 &&\n engine.getScrollOffset() + engine.getViewportSize() >= engine.getTotalSize() - 64\n\n if (prepended && added > 0) engine.shiftMeasurements(added)\n\n const element = currentElement()\n const measured = readDomViewport(element)\n const inset = toValue(options.viewportInset) ?? 0\n const viewport = Math.max(0, (measured > 0 ? measured : viewportFallback()) - inset)\n const itemSize = toValue(options.itemSize)\n engine.setOptions({\n count,\n estimateSize,\n overscan: (toValue(options.overscan) ?? 8) + travelOverscan,\n gap: toValue(options.gap) ?? 0,\n paddingStart: toValue(options.paddingStart) ?? 0,\n paddingEnd: toValue(options.paddingEnd) ?? 0,\n lanes: toValue(options.lanes) ?? 1,\n itemSize: itemSize ?? null,\n getItemKey: options.getItemKey,\n viewportSize: viewport,\n })\n\n if (prepended && added > 0) {\n let delta = 0\n const gap = toValue(options.gap) ?? 0\n for (let index = 0; index < added; index += 1) {\n delta += engine.getItemSize(index)\n if (index < added - 1) delta += gap\n }\n if (delta > 0) engine.setScrollOffset(engine.getScrollOffset() + delta)\n }\n\n const nextTotal = engine.getTotalSize()\n const maxOffset = Math.max(0, nextTotal - viewport)\n let wroteScroll = false\n if (reverse() && !didInitialReverse && nextTotal > 0 && viewport > 0) {\n didInitialReverse = true\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n wroteScroll = true\n } else if (appended && nearEnd) {\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n wroteScroll = true\n } else if (prepended && added > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), nextTotal, viewport, 'auto')\n wroteScroll = true\n }\n\n if (!wroteScroll && windowScroll() && element) {\n engine.setScrollOffset(\n clampScrollOffset(readVirtualOffset(element, nextTotal, viewport), nextTotal, viewport),\n )\n } else if (engine.getScrollOffset() > maxOffset) {\n engine.setScrollOffset(maxOffset)\n writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n }\n\n previousCount = count\n previousFirstKey = firstKey\n\n const items = engine.getVirtualItems()\n if (!sameVirtualItems(virtualItems.value, items)) virtualItems.value = items\n if (totalSize.value !== nextTotal) totalSize.value = nextTotal\n const nextOffset = engine.getScrollOffset()\n if (scrollOffset.value !== nextOffset) scrollOffset.value = nextOffset\n const nextAdjust = element && !windowScroll() ? nextOffset - readScroll(element, horizontal()) : 0\n if (scrollAdjust.value !== nextAdjust) scrollAdjust.value = nextAdjust\n emitRange()\n }\n\n function settleScroll(): void {\n isScrolling.value = false\n travelOverscan = 0\n for (const [element, index] of observed) {\n pendingMeasures.push({ element, index })\n }\n flushMeasures()\n publish()\n options.onScrollEnd?.()\n }\n\n function markScrolling(): void {\n isScrolling.value = true\n if (typeof window === 'undefined') return\n window.clearTimeout(scrollTimer)\n scrollTimer = window.setTimeout(settleScroll, 120)\n }\n\n function onScroll(): void {\n const element = currentElement()\n if (!windowScroll() && !element) return\n markScrolling()\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n const next = readVirtualOffset(element, total, viewport)\n const previous = engine.getScrollOffset()\n const sizeHint = Math.max(1, toValue(options.itemSize) ?? 48)\n travelOverscan = Math.min(24, Math.ceil(Math.abs(next - previous) / sizeHint))\n engine.setScrollOffset(next)\n publish()\n }\n\n function unbindScroll(): void {\n if (listeningEl) {\n listeningEl.removeEventListener('scroll', onScroll)\n listeningEl = null\n }\n if (listeningWindow && typeof window !== 'undefined') {\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('scroll', onScroll)\n document.removeEventListener('scroll', onScroll, true)\n document.documentElement.removeEventListener('scroll', onScroll)\n document.body?.removeEventListener('scroll', onScroll)\n document.scrollingElement?.removeEventListener('scroll', onScroll)\n window.removeEventListener('resize', publish)\n listeningWindow = false\n }\n resizeObserver?.disconnect()\n resizeObserver = null\n }\n\n function bindContainer(): void {\n const element = currentElement()\n const useWindow = windowScroll()\n if (useWindow) {\n if (listeningWindow && listeningEl === element) return\n unbindScroll()\n listeningEl = element\n if (!isBrowser()) return\n listeningWindow = true\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n if (engine.getScrollOffset() > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), total, viewport, 'auto')\n } else if (element) {\n engine.setScrollOffset(readVirtualOffset(element, total, viewport))\n }\n window.addEventListener('scroll', onScroll, { passive: true, capture: true })\n document.addEventListener('scroll', onScroll, { passive: true, capture: true })\n document.documentElement.addEventListener('scroll', onScroll, { passive: true })\n document.body?.addEventListener('scroll', onScroll, { passive: true })\n const scrolling = document.scrollingElement\n if (scrolling && scrolling !== document.documentElement && scrolling !== document.body) {\n scrolling.addEventListener('scroll', onScroll, { passive: true })\n }\n window.addEventListener('resize', publish)\n if (element && typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => publish())\n resizeObserver.observe(element)\n }\n return\n }\n if (element === listeningEl && !listeningWindow) return\n unbindScroll()\n listeningEl = element\n if (!element || !isBrowser()) return\n const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n if (engine.getScrollOffset() > 0) {\n writeVirtualOffset(element, engine.getScrollOffset(), total, viewport, 'auto')\n } else {\n engine.setScrollOffset(readVirtualOffset(element, total, viewport))\n }\n element.addEventListener('scroll', onScroll, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(() => publish())\n resizeObserver.observe(element)\n }\n }\n\n function ensureItemObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!itemObserver) {\n itemObserver = new ResizeObserver((entries) => {\n const axis = horizontal()\n let changed = false\n if (isScrolling.value) return\n for (const entry of entries) {\n const index = observed.get(entry.target)\n if (index === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = Math.round(\n axis ? (box?.inlineSize ?? entry.contentRect.width) : (box?.blockSize ?? entry.contentRect.height),\n )\n if (size > 0 && engine.measure(index, size)) changed = true\n }\n if (changed) publish()\n })\n }\n return itemObserver\n }\n\n function flushMeasures(): void {\n measureFrame = 0\n if (isScrolling.value) return\n const batch = pendingMeasures.splice(0, pendingMeasures.length)\n const axis = horizontal()\n let changed = false\n for (const pending of batch) {\n if (!pending.element.isConnected) continue\n const rect = pending.element.getBoundingClientRect()\n const size = Math.round(axis ? rect.width : rect.height)\n if (size > 0 && engine.measure(pending.index, size)) changed = true\n }\n if (changed) publish()\n }\n\n function measureElement(target: unknown, index: number): void {\n const element = asElement(target)\n const observer = ensureItemObserver()\n const current = elementsByIndex.get(index)\n if (current && current !== element) {\n observer?.unobserve(current)\n observed.delete(current)\n elementsByIndex.delete(index)\n }\n if (!element) return\n elementsByIndex.set(index, element)\n observed.set(element, index)\n observer?.observe(element)\n pendingMeasures.push({ element, index })\n if (isScrolling.value || measureFrame) return\n measureFrame = scheduleFrame(flushMeasures)\n }\n\n function scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n const element = currentElement()\n const measured = readDomViewport(element)\n const viewport = measured > 0 ? measured : engine.getViewportSize()\n const total = engine.getTotalSize()\n const next = clampScrollOffset(offset, total, viewport)\n engine.setScrollOffset(next)\n writeVirtualOffset(element, next, total, viewport, behavior)\n publish()\n }\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const offset = engine.getOffsetForIndex(index, scrollOptions?.align ?? 'auto')\n scrollToOffset(offset, scrollOptions?.behavior ?? 'auto')\n }\n\n function measure(index: number, size: number): void {\n if (engine.measure(index, size)) publish()\n }\n\n publish()\n\n watch(\n () => [\n toValue(options.count),\n toValue(options.overscan),\n toValue(options.gap),\n toValue(options.paddingStart),\n toValue(options.paddingEnd),\n toValue(options.lanes),\n toValue(options.horizontal),\n toValue(options.itemSize),\n toValue(options.viewportInset),\n toValue(options.revision),\n toValue(options.container),\n toValue(options.windowScroll),\n toValue(options.scrollMargin),\n toValue(options.reverse),\n toValue(options.initialRect)?.width,\n toValue(options.initialRect)?.height,\n ],\n () => {\n bindContainer()\n publish()\n },\n { flush: 'post', immediate: true },\n )\n\n onBeforeUnmount(() => {\n unbindScroll()\n itemObserver?.disconnect()\n cancelFrame(measureFrame)\n if (typeof window !== 'undefined') window.clearTimeout(scrollTimer)\n observed.clear()\n elementsByIndex.clear()\n pendingMeasures.length = 0\n })\n\n return {\n virtualItems: computed(() => virtualItems.value),\n totalSize: computed(() => totalSize.value),\n scrollOffset: computed(() => scrollOffset.value),\n scrollAdjust: computed(() => scrollAdjust.value),\n isScrolling: computed(() => isScrolling.value),\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { VirtualItem, VisibleRange } from '@/core/types'\nimport { useVirtualizer, type UseVirtualizerOptions } from '@/composables/useVirtualizer'\n\nexport interface VirtualListItem<T> extends VirtualItem {\n item: T\n}\n\nexport interface UseVirtualListOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n estimateSize?: number | ((index: number, item: T) => number)\n container?: UseVirtualizerOptions['container']\n horizontal?: UseVirtualizerOptions['horizontal']\n overscan?: UseVirtualizerOptions['overscan']\n gap?: UseVirtualizerOptions['gap']\n paddingStart?: UseVirtualizerOptions['paddingStart']\n paddingEnd?: UseVirtualizerOptions['paddingEnd']\n itemSize?: UseVirtualizerOptions['itemSize']\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n viewportInset?: UseVirtualizerOptions['viewportInset']\n revision?: UseVirtualizerOptions['revision']\n windowScroll?: UseVirtualizerOptions['windowScroll']\n scrollMargin?: UseVirtualizerOptions['scrollMargin']\n reverse?: UseVirtualizerOptions['reverse']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nfunction resolveEstimate<T>(\n estimate: UseVirtualListOptions<T>['estimateSize'],\n index: number,\n item: T,\n): number {\n if (typeof estimate === 'function') return estimate(index, item)\n if (typeof estimate === 'number') return estimate\n return 48\n}\n\nexport function useVirtualList<T>(options: UseVirtualListOptions<T>) {\n const virtualizer = useVirtualizer({\n count: () => toValue(options.items).length,\n estimateSize: (index) => {\n const source = toValue(options.items)\n return resolveEstimate(options.estimateSize, index, source[index] as T)\n },\n getItemKey: (index) => {\n const source = toValue(options.items)\n const item = source[index] as T\n return options.getItemKey?.(item, index) ?? index\n },\n itemSize: () => {\n if (options.itemSize !== undefined) return toValue(options.itemSize)\n return typeof options.estimateSize === 'number' ? options.estimateSize : undefined\n },\n container: options.container,\n horizontal: options.horizontal,\n overscan: options.overscan,\n gap: options.gap,\n paddingStart: options.paddingStart,\n paddingEnd: options.paddingEnd,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n reverse: options.reverse,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const virtualItems = computed<VirtualListItem<T>[]>(() => {\n const source = toValue(options.items)\n return virtualizer.virtualItems.value.map((virtual) => {\n const item = source[virtual.index] as T\n return {\n ...virtual,\n item,\n key: options.getItemKey?.(item, virtual.index) ?? virtual.key,\n }\n })\n })\n\n return {\n virtualItems,\n totalSize: virtualizer.totalSize,\n scrollOffset: virtualizer.scrollOffset,\n scrollAdjust: virtualizer.scrollAdjust,\n isScrolling: virtualizer.isScrolling,\n scrollToIndex: virtualizer.scrollToIndex,\n scrollToOffset: virtualizer.scrollToOffset,\n measure: virtualizer.measure,\n measureElement: virtualizer.measureElement,\n }\n}\n","import { computed, onBeforeUnmount, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { ScrollToIndexOptions, VirtualItem, VisibleRange } from '@/core/types'\nimport { asElement, isBrowser } from '@/utils/dom'\nimport { useVirtualizer, type UseVirtualizerOptions } from '@/composables/useVirtualizer'\n\nexport interface VirtualGridCell<T> {\n index: number\n key: string | number\n item: T\n row: VirtualItem\n column: VirtualItem\n}\n\nexport interface UseVirtualGridOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n columnCount: MaybeRefOrGetter<number>\n estimateRowSize?: MaybeRefOrGetter<number | ((rowIndex: number) => number)>\n estimateColumnSize?: MaybeRefOrGetter<number | ((columnIndex: number) => number)>\n container?: UseVirtualizerOptions['container']\n overscan?: MaybeRefOrGetter<number | undefined>\n overscanRows?: MaybeRefOrGetter<number | undefined>\n overscanColumns?: MaybeRefOrGetter<number | undefined>\n rowGap?: MaybeRefOrGetter<number | undefined>\n columnGap?: MaybeRefOrGetter<number | undefined>\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n revision?: UseVirtualizerOptions['revision']\n windowScroll?: UseVirtualizerOptions['windowScroll']\n scrollMargin?: UseVirtualizerOptions['scrollMargin']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nfunction resolveSize(\n estimate: number | ((index: number) => number) | undefined,\n index: number,\n fallback: number,\n): number {\n if (typeof estimate === 'function') return estimate(index)\n if (typeof estimate === 'number') return estimate\n return fallback\n}\n\nexport function useVirtualGrid<T>(options: UseVirtualGridOptions<T>) {\n const columnCount = computed(() => Math.max(1, Math.floor(toValue(options.columnCount) || 1)))\n const rowCount = computed(() => Math.ceil(toValue(options.items).length / columnCount.value))\n const rowSizes = new Map<number, number>()\n\n const rows = useVirtualizer({\n count: () => rowCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateRowSize), index, 48),\n itemSize: () => {\n const estimate = toValue(options.estimateRowSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanRows) ?? toValue(options.overscan) ?? 2,\n gap: () => toValue(options.rowGap) ?? 0,\n horizontal: false,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const columns = useVirtualizer({\n count: () => columnCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateColumnSize), index, 160),\n itemSize: () => {\n const estimate = toValue(options.estimateColumnSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanColumns) ?? toValue(options.overscan) ?? 1,\n gap: () => toValue(options.columnGap) ?? 0,\n horizontal: true,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n })\n\n const virtualCells = computed<VirtualGridCell<T>[]>(() => {\n const source = toValue(options.items)\n const perRow = columnCount.value\n const cells: VirtualGridCell<T>[] = []\n for (const row of rows.virtualItems.value) {\n for (const column of columns.virtualItems.value) {\n const index = row.index * perRow + column.index\n if (index >= source.length) continue\n const item = source[index] as T\n cells.push({\n index,\n key: options.getItemKey?.(item, index) ?? index,\n item,\n row,\n column,\n })\n }\n }\n return cells\n })\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const source = toValue(options.items)\n if (!source.length) return\n const safe = Math.min(Math.max(index, 0), source.length - 1)\n const perRow = columnCount.value\n rows.scrollToIndex(Math.floor(safe / perRow), scrollOptions)\n columns.scrollToIndex(safe % perRow, scrollOptions)\n }\n\n function scrollToOffset(\n offset: { top?: number; left?: number },\n behavior: ScrollBehavior = 'auto',\n ): void {\n if (offset.top !== undefined) rows.scrollToOffset(offset.top, behavior)\n if (offset.left !== undefined) columns.scrollToOffset(offset.left, behavior)\n }\n\n function measureRow(rowIndex: number, size: number): void {\n const next = Math.max(rowSizes.get(rowIndex) ?? 0, size)\n if (next <= 0 || next === rowSizes.get(rowIndex)) return\n rowSizes.set(rowIndex, next)\n rows.measure(rowIndex, next)\n }\n\n let rowObserver: ResizeObserver | null = null\n const observedRows = new Map<Element, number>()\n\n function ensureRowObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!rowObserver) {\n rowObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const rowIndex = observedRows.get(entry.target)\n if (rowIndex === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = box?.blockSize ?? entry.contentRect.height\n if (size > 0) measureRow(rowIndex, size)\n }\n })\n }\n return rowObserver\n }\n\n function measureRowElement(target: unknown, rowIndex: number): void {\n const element = asElement(target)\n const observer = ensureRowObserver()\n if (!element) return\n observedRows.set(element, rowIndex)\n observer?.observe(element)\n const size = element.getBoundingClientRect().height\n if (size > 0) measureRow(rowIndex, size)\n }\n\n onBeforeUnmount(() => {\n rowObserver?.disconnect()\n observedRows.clear()\n })\n\n return {\n virtualRows: rows.virtualItems,\n virtualColumns: columns.virtualItems,\n virtualCells,\n totalHeight: rows.totalSize,\n totalWidth: columns.totalSize,\n scrollAdjustX: columns.scrollAdjust,\n scrollAdjustY: rows.scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n measureColumn: columns.measure,\n }\n}\n","import { computed, toValue, type CSSProperties, type MaybeRefOrGetter } from 'vue'\nimport type { VisibleRange } from '@/core/types'\nimport {\n useVirtualList,\n type UseVirtualListOptions,\n type VirtualListItem,\n} from '@/composables/useVirtualList'\n\nexport interface VirtualTableColumn<T> {\n id: string\n header: string\n width?: number\n minWidth?: number\n align?: 'left' | 'center' | 'right'\n pin?: 'start' | 'end'\n accessor?: (row: T, index: number) => unknown\n}\n\nexport interface PlacedVirtualTableColumn<T> extends VirtualTableColumn<T> {\n start: number\n size: number\n end: number\n pinOffset: number\n stickyStyle: CSSProperties\n}\n\nexport interface UseVirtualTableOptions<T> {\n rows: MaybeRefOrGetter<readonly T[]>\n columns: MaybeRefOrGetter<readonly VirtualTableColumn<T>[]>\n estimateRowSize?: number | ((index: number, row: T) => number)\n container?: UseVirtualListOptions<T>['container']\n overscan?: UseVirtualListOptions<T>['overscan']\n getRowKey?: (row: T, index: number) => string | number\n initialRect?: UseVirtualListOptions<T>['initialRect']\n viewportInset?: UseVirtualListOptions<T>['viewportInset']\n revision?: UseVirtualListOptions<T>['revision']\n itemSize?: UseVirtualListOptions<T>['itemSize']\n windowScroll?: UseVirtualListOptions<T>['windowScroll']\n scrollMargin?: UseVirtualListOptions<T>['scrollMargin']\n reverse?: UseVirtualListOptions<T>['reverse']\n onVisibleRangeChange?: (range: VisibleRange) => void\n onScrollEnd?: () => void\n}\n\nexport function useVirtualTable<T>(options: UseVirtualTableOptions<T>) {\n const list = useVirtualList<T>({\n items: options.rows,\n estimateSize: options.estimateRowSize,\n container: options.container,\n overscan: options.overscan,\n getItemKey: options.getRowKey,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n itemSize: options.itemSize,\n windowScroll: options.windowScroll,\n scrollMargin: options.scrollMargin,\n reverse: options.reverse,\n onVisibleRangeChange: options.onVisibleRangeChange,\n onScrollEnd: options.onScrollEnd,\n })\n\n const columns = computed<PlacedVirtualTableColumn<T>[]>(() => {\n const source = toValue(options.columns)\n let start = 0\n const placed = source.map((column) => {\n const size = column.width ?? column.minWidth ?? 160\n const next: PlacedVirtualTableColumn<T> = {\n ...column,\n start,\n size,\n end: start + size,\n pinOffset: 0,\n stickyStyle: {},\n }\n start += size\n return next\n })\n\n let startPin = 0\n for (const column of placed) {\n if (column.pin !== 'start') continue\n column.pinOffset = startPin\n column.stickyStyle = {\n position: 'sticky',\n left: `${startPin}px`,\n zIndex: 2,\n }\n startPin += column.size\n }\n\n let endPin = 0\n for (let index = placed.length - 1; index >= 0; index -= 1) {\n const column = placed[index]\n if (!column || column.pin !== 'end') continue\n column.pinOffset = endPin\n column.stickyStyle = {\n position: 'sticky',\n right: `${endPin}px`,\n zIndex: 2,\n }\n endPin += column.size\n }\n\n return placed\n })\n\n const totalWidth = computed(() => {\n const placed = columns.value\n if (!placed.length) return 0\n return placed[placed.length - 1]?.end ?? 0\n })\n\n const virtualRows = computed<VirtualListItem<T>[]>(() => list.virtualItems.value)\n\n return {\n virtualRows,\n columns,\n totalHeight: list.totalSize,\n totalWidth,\n scrollOffset: list.scrollOffset,\n scrollAdjust: list.scrollAdjust,\n isScrolling: list.isScrolling,\n scrollToIndex: list.scrollToIndex,\n scrollToOffset: list.scrollToOffset,\n measure: list.measure,\n measureElement: list.measureElement,\n }\n}\n","import type { CSSProperties } from 'vue'\nimport { scrollContentSize } from '@/core/scrolling'\n\nexport function toCssSize(value: number | string | undefined): string | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return `${value}px`\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nexport function parseCssPx(value: number | string | undefined): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value !== 'string') return 0\n const match = /^(-?\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!match?.[1]) return 0\n const parsed = Number(match[1])\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nexport function scrollerStyle(input: {\n height?: number | string\n width?: number | string\n horizontal: boolean\n windowScroll?: boolean\n}): CSSProperties {\n if (input.windowScroll) {\n return {\n position: 'relative',\n width: toCssSize(input.width) ?? '100%',\n height: toCssSize(input.height),\n overflowAnchor: 'none',\n }\n }\n return {\n overflow: 'auto',\n position: 'relative',\n height: toCssSize(input.height) ?? (input.horizontal ? '100%' : undefined),\n width: toCssSize(input.width) ?? (input.horizontal ? undefined : '100%'),\n overflowAnchor: 'none',\n }\n}\n\nexport function spacerStyle(total: number, horizontal: boolean): CSSProperties {\n const size = scrollContentSize(total)\n return {\n position: 'relative',\n width: horizontal ? `${size}px` : '100%',\n height: horizontal ? '100%' : `${size}px`,\n }\n}\n\nexport function itemStyle(start: number, horizontal: boolean, size?: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: horizontal ? (size === undefined ? undefined : `${size}px`) : '100%',\n height: horizontal ? '100%' : size === undefined ? undefined : `${size}px`,\n transform: horizontal ? `translateX(${start}px)` : `translateY(${start}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type HTMLAttributes } from 'vue'\nimport { useVirtualList } from '@/composables/useVirtualList'\nimport type { VisibleRange } from '@/core/types'\nimport { itemStyle, parseCssPx, scrollerStyle, spacerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n estimateSize?: number | ((index: number, item: T) => number)\n height?: number | string\n width?: number | string\n horizontal?: boolean\n overscan?: number\n gap?: number\n paddingStart?: number\n paddingEnd?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemTag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n reverse?: boolean\n }>(),\n {\n estimateSize: 48,\n overscan: 8,\n gap: 0,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n windowScroll: false,\n scrollMargin: 0,\n reverse: false,\n tag: 'div',\n itemTag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst { virtualItems, totalSize, scrollAdjust, scrollToIndex, scrollToOffset, measure, measureElement } =\n useVirtualList<T>({\n items: () => props.items,\n estimateSize: (index, item) => {\n const estimate = props.estimateSize\n return typeof estimate === 'number' ? estimate : estimate(index, item)\n },\n itemSize: () => (typeof props.estimateSize === 'number' ? props.estimateSize : undefined),\n container,\n horizontal: () => props.horizontal,\n overscan: () => props.overscan,\n gap: () => props.gap,\n paddingStart: () => props.paddingStart,\n paddingEnd: () => props.paddingEnd,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n reverse: () => props.reverse,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n })\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: props.horizontal,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst innerStyle = computed(() => spacerStyle(totalSize.value, props.horizontal))\n\nfunction rowStyle(start: number, size: number) {\n return itemStyle(start, props.horizontal, size)\n}\n\nfunction bindItem(index: number) {\n return (element: unknown) => {\n measureElement(element, index)\n }\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measure,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"list\" :style=\"containerStyle\">\n <slot v-if=\"!items.length\" name=\"empty\" />\n <div v-else data-virtual-spacer :style=\"innerStyle\">\n <component\n :is=\"itemTag\"\n v-for=\"virtualItem in virtualItems\"\n :key=\"virtualItem.key\"\n :ref=\"bindItem(virtualItem.index)\"\n role=\"listitem\"\n :data-index=\"virtualItem.index\"\n :data-key=\"String(virtualItem.key)\"\n :aria-setsize=\"items.length\"\n :aria-posinset=\"virtualItem.index + 1\"\n :style=\"rowStyle(virtualItem.start - scrollAdjust, virtualItem.size)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"virtualItem.item\"\n :index=\"virtualItem.index\"\n :start=\"virtualItem.start\"\n :size=\"virtualItem.size\"\n :end=\"virtualItem.end\"\n />\n </component>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualGrid } from '@/composables/useVirtualGrid'\nimport type { VisibleRange } from '@/core/types'\nimport { scrollContentSize } from '@/core/scrolling'\nimport { parseCssPx, scrollerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n columnCount?: number\n estimateRowSize?: number | ((rowIndex: number) => number)\n estimateColumnSize?: number | ((columnIndex: number) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n overscanRows?: number\n overscanColumns?: number\n rowGap?: number\n columnGap?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n }>(),\n {\n columnCount: 1,\n estimateRowSize: 48,\n estimateColumnSize: 160,\n overscan: 2,\n rowGap: 0,\n columnGap: 0,\n windowScroll: false,\n scrollMargin: 0,\n tag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\n\nconst {\n virtualCells,\n totalWidth,\n totalHeight,\n scrollAdjustX,\n scrollAdjustY,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n} = useVirtualGrid<T>({\n items: () => props.items,\n columnCount: () => props.columnCount,\n estimateRowSize: () => props.estimateRowSize,\n estimateColumnSize: () => props.estimateColumnSize,\n container,\n overscan: () => props.overscan,\n overscanRows: () => props.overscanRows,\n overscanColumns: () => props.overscanColumns,\n rowGap: () => props.rowGap,\n columnGap: () => props.columnGap,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst innerStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n width: `${scrollContentSize(totalWidth.value)}px`,\n height: `${scrollContentSize(totalHeight.value)}px`,\n}))\n\nfunction bindCell(rowIndex: number) {\n return (element: unknown) => {\n measureRowElement(element, rowIndex)\n }\n}\n\nfunction cellStyle(\n columnStart: number,\n columnSize: number,\n rowStart: number,\n rowSize: number,\n): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: `${columnSize}px`,\n height: `${rowSize}px`,\n transform: `translate(${columnStart}px, ${rowStart}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measureRow,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"grid\" :style=\"containerStyle\">\n <slot v-if=\"!items.length\" name=\"empty\" />\n <div v-else data-virtual-spacer :style=\"innerStyle\">\n <div\n v-for=\"cell in virtualCells\"\n :key=\"cell.key\"\n :ref=\"bindCell(cell.row.index)\"\n role=\"gridcell\"\n :data-index=\"cell.index\"\n :data-key=\"String(cell.key)\"\n :style=\"cellStyle(cell.column.start - scrollAdjustX, cell.column.size, cell.row.start - scrollAdjustY, cell.row.size)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"cell.item\"\n :index=\"cell.index\"\n :row-index=\"cell.row.index\"\n :column-index=\"cell.column.index\"\n :row=\"cell.row\"\n :column=\"cell.column\"\n />\n </div>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, watch, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualTable, type VirtualTableColumn } from '@/composables/useVirtualTable'\nimport type { VisibleRange } from '@/core/types'\nimport { isBrowser } from '@/utils/dom'\nimport { scrollContentSize } from '@/core/scrolling'\nimport { parseCssPx, scrollerStyle } from '@/utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n rows: readonly T[]\n columns: readonly VirtualTableColumn<T>[]\n estimateRowSize?: number | ((index: number, row: T) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n getRowKey?: (row: T, index: number) => string | number\n stickyHeader?: boolean\n tag?: string\n rowAttrs?: HTMLAttributes\n revision?: unknown\n windowScroll?: boolean\n scrollMargin?: number\n reverse?: boolean\n }>(),\n {\n estimateRowSize: 44,\n overscan: 8,\n stickyHeader: true,\n windowScroll: false,\n scrollMargin: 0,\n reverse: false,\n tag: 'div',\n },\n)\n\nconst emit = defineEmits<{\n visibleRangeChange: [range: VisibleRange]\n scrollEnd: []\n}>()\n\nconst container = ref<HTMLElement | null>(null)\nconst header = ref<HTMLElement | null>(null)\nconst headerSize = ref(0)\n\nconst {\n virtualRows,\n columns: placedColumns,\n totalWidth,\n totalHeight,\n scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n} = useVirtualTable<T>({\n rows: () => props.rows,\n columns: () => props.columns,\n estimateRowSize: (index, row) => {\n const estimate = props.estimateRowSize\n return typeof estimate === 'number' ? estimate : estimate(index, row)\n },\n container,\n overscan: () => props.overscan,\n getRowKey: (row, index) => props.getRowKey?.(row, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n viewportInset: headerSize,\n revision: () => props.revision,\n itemSize: () => (typeof props.estimateRowSize === 'number' ? props.estimateRowSize : undefined),\n windowScroll: () => props.windowScroll,\n scrollMargin: () => props.scrollMargin,\n reverse: () => props.reverse,\n onVisibleRangeChange: (range) => emit('visibleRangeChange', range),\n onScrollEnd: () => emit('scrollEnd'),\n})\n\nwatch(header, (element, previous, onCleanup) => {\n if (previous === element && !element) return\n if (!element || !isBrowser() || typeof ResizeObserver === 'undefined') return\n const read = () => {\n headerSize.value = element.getBoundingClientRect().height\n }\n const observer = new ResizeObserver(read)\n observer.observe(element)\n read()\n onCleanup(() => observer.disconnect())\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n windowScroll: props.windowScroll,\n }),\n)\n\nconst frameStyle = computed<CSSProperties>(() => ({\n minWidth: `${totalWidth.value}px`,\n}))\n\nconst headerStyle = computed<CSSProperties>(() => ({\n position: props.stickyHeader ? 'sticky' : 'relative',\n top: props.stickyHeader ? '0px' : undefined,\n zIndex: 3,\n display: 'flex',\n width: `${totalWidth.value}px`,\n}))\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n height: `${scrollContentSize(totalHeight.value)}px`,\n width: `${scrollContentSize(totalWidth.value)}px`,\n}))\n\nfunction placedStyle(column: {\n size: number\n align?: 'left' | 'center' | 'right'\n stickyStyle: CSSProperties\n pin?: 'start' | 'end'\n}): CSSProperties {\n return {\n width: `${column.size}px`,\n minWidth: `${column.size}px`,\n flex: '0 0 auto',\n textAlign: column.align ?? 'left',\n ...column.stickyStyle,\n zIndex: column.pin ? (props.stickyHeader ? 4 : 2) : column.stickyStyle.zIndex,\n }\n}\n\nfunction rowStyle(start: number, size: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: `${size}px`,\n display: 'flex',\n transform: `translateY(${start}px)`,\n contain: 'layout style',\n boxSizing: 'border-box',\n overflow: 'hidden',\n }\n}\n\nfunction bindRow(index: number) {\n return (element: unknown) => {\n measureElement(element, index)\n }\n}\n\nfunction cellValue(row: T, column: VirtualTableColumn<T>, index: number): unknown {\n if (column.accessor) return column.accessor(row, index)\n if (row && typeof row === 'object' && column.id in row) {\n return (row as Record<string, unknown>)[column.id]\n }\n return ''\n}\n\ndefineExpose({\n scrollToIndex,\n scrollToOffset,\n measure,\n})\n</script>\n\n<template>\n <component :is=\"tag\" ref=\"container\" data-virtual-container role=\"table\" :style=\"containerStyle\">\n <div :style=\"frameStyle\">\n <div ref=\"header\" role=\"row\" :style=\"headerStyle\">\n <slot name=\"header\" :columns=\"placedColumns\">\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"columnheader\"\n :style=\"placedStyle(column)\"\n >\n {{ column.header }}\n </div>\n </slot>\n </div>\n <slot v-if=\"!rows.length\" name=\"empty\" />\n <div v-else data-virtual-spacer role=\"rowgroup\" :style=\"bodyStyle\">\n <div\n v-for=\"virtualRow in virtualRows\"\n :key=\"virtualRow.key\"\n :ref=\"bindRow(virtualRow.index)\"\n role=\"row\"\n :data-index=\"virtualRow.index\"\n :data-key=\"String(virtualRow.key)\"\n :aria-rowindex=\"virtualRow.index + 1\"\n :style=\"rowStyle(virtualRow.start - scrollAdjust, virtualRow.size)\"\n v-bind=\"rowAttrs\"\n >\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"cell\"\n :style=\"placedStyle(column)\"\n >\n <slot\n name=\"cell\"\n :row=\"virtualRow.item\"\n :column=\"column\"\n :row-index=\"virtualRow.index\"\n :value=\"cellValue(virtualRow.item, column, virtualRow.index)\"\n >\n {{ cellValue(virtualRow.item, column, virtualRow.index) }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </component>\n</template>\n"],"names":["normalizeSize","size","MeasurementCache","index","baseline","count","removed","value","delta","next","moved","clamp","min","max","MAX_SCROLL_SIZE","clampScrollOffset","offset","totalSize","viewport","scrollContentSize","measured","total","capped","mapDomOffsetToVirtual","domOffset","virtualSize","domSize","maxVirtual","maxDom","mapVirtualOffsetToDom","virtualOffset","findFirstIndexPast","target","getEnd","low","high","answer","mid","findLastIndexBefore","getStart","resolveScrollOffset","input","end","align","visibleEnd","Virtualizer","options","nextLanes","nextGap","nextPaddingStart","nextPaddingEnd","nextCount","nextItemSize","previousItemSize","geometryChanged","previous","before","clamped","ordinal","maxEnd","lane","endEdge","items","startOrdinal","endOrdinal","from","to","start","left","right","raw","last","isBrowser","asElement","writeScroll","element","horizontal","behavior","writeWindowScroll","scrolling","readScroll","readWindowScroll","readViewport","readWindowViewport","readContentSize","scheduleFrame","callback","cancelFrame","id","sameVirtualItems","useVirtualizer","engine","virtualItems","shallowRef","ref","scrollOffset","scrollAdjust","isScrolling","estimateSize","listeningEl","listeningWindow","resizeObserver","itemObserver","measureFrame","scrollTimer","travelOverscan","seenRevision","toValue","previousCount","previousFirstKey","didInitialReverse","lastRangeKey","observed","elementsByIndex","pendingMeasures","currentElement","windowScroll","reverse","viewportFallback","rect","windowListOffset","margin","local","contentSize","readDomScroll","readDomViewport","writeDomScroll","current","readVirtualOffset","writeVirtualOffset","emitRange","range","key","publish","revision","firstKey","prepended","appended","added","nearEnd","inset","itemSize","gap","nextTotal","maxOffset","wroteScroll","nextOffset","nextAdjust","settleScroll","flushMeasures","markScrolling","onScroll","sizeHint","unbindScroll","bindContainer","ensureItemObserver","entries","axis","changed","entry","box","batch","pending","measureElement","observer","scrollToOffset","scrollToIndex","scrollOptions","measure","watch","onBeforeUnmount","computed","resolveEstimate","estimate","item","useVirtualList","virtualizer","source","virtual","resolveSize","fallback","useVirtualGrid","columnCount","rowCount","rowSizes","rows","columns","virtualCells","perRow","cells","row","column","safe","measureRow","rowIndex","rowObserver","observedRows","ensureRowObserver","measureRowElement","useVirtualTable","list","placed","startPin","endPin","totalWidth","toCssSize","parseCssPx","match","parsed","scrollerStyle","spacerStyle","itemStyle","props","__props","emit","__emit","container","containerStyle","innerStyle","rowStyle","bindItem","__expose","_openBlock","_createBlock","_resolveDynamicComponent","_createElementBlock","_Fragment","_renderList","_unref","virtualItem","_mergeProps","_renderSlot","_ctx","totalHeight","scrollAdjustX","scrollAdjustY","bindCell","cellStyle","columnStart","columnSize","rowStart","rowSize","cell","header","headerSize","virtualRows","placedColumns","onCleanup","read","frameStyle","headerStyle","bodyStyle","placedStyle","bindRow","cellValue","_createElementVNode","_normalizeStyle","_toDisplayString","virtualRow"],"mappings":"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"}
|