@glhrmoura/vue-virtualize 0.1.5 → 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.
@@ -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","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 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 readScroll(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollLeft : element.scrollTop\n}\n\nexport function readViewport(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.clientWidth : element.clientHeight\n}\n\nexport function readContentSize(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollWidth : element.scrollHeight\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 } from '@/core/types'\nimport {\n asElement,\n cancelFrame,\n isBrowser,\n readContentSize,\n readScroll,\n readViewport,\n scheduleFrame,\n writeScroll,\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}\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 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 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 viewportFallback(): number {\n const rect = toValue(options.initialRect)\n if (!rect) return 0\n return horizontal() ? rect.width : rect.height\n }\n\n function contentSize(element: HTMLElement | null, total: number): number {\n if (!element) return scrollContentSize(total)\n return scrollContentSize(total, readContentSize(element, horizontal()))\n }\n\n function readVirtualOffset(element: HTMLElement, total: number, viewport: number): number {\n return mapDomOffsetToVirtual(\n readScroll(element, horizontal()),\n total,\n contentSize(element, total),\n viewport,\n )\n }\n\n function writeVirtualOffset(\n element: HTMLElement,\n offset: number,\n total: number,\n viewport: number,\n behavior: ScrollBehavior,\n ): void {\n writeScroll(\n element,\n mapVirtualOffsetToDom(offset, total, contentSize(element, total), viewport),\n horizontal(),\n behavior,\n )\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 element = currentElement()\n const measured = element ? readViewport(element, horizontal()) : 0\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: toValue(options.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 const nextTotal = engine.getTotalSize()\n const maxOffset = Math.max(0, nextTotal - viewport)\n if (engine.getScrollOffset() > maxOffset) {\n engine.setScrollOffset(maxOffset)\n if (element) writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\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 ? nextOffset - readScroll(element, horizontal()) : 0\n if (scrollAdjust.value !== nextAdjust) scrollAdjust.value = nextAdjust\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 }\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 (!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 bindContainer(): void {\n const element = currentElement()\n if (element === listeningEl) return\n if (listeningEl) {\n listeningEl.removeEventListener('scroll', onScroll)\n resizeObserver?.disconnect()\n resizeObserver = null\n }\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 = element ? readViewport(element, horizontal()) : 0\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 if (element) 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.initialRect)?.width,\n toValue(options.initialRect)?.height,\n ],\n () => {\n bindContainer()\n publish()\n },\n { flush: 'post' },\n )\n\n onBeforeUnmount(() => {\n if (listeningEl) listeningEl.removeEventListener('scroll', onScroll)\n resizeObserver?.disconnect()\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 } 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}\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 })\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 } 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}\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 })\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 })\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 MaybeRefOrGetter } from 'vue'\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 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}\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}\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 })\n\n const columns = computed<PlacedVirtualTableColumn<T>[]>(() => {\n const source = toValue(options.columns)\n let start = 0\n return source.map((column) => {\n const size = column.width ?? column.minWidth ?? 160\n const placed: PlacedVirtualTableColumn<T> = {\n ...column,\n start,\n size,\n end: start + size,\n }\n start += size\n return placed\n })\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}): CSSProperties {\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 { 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 }>(),\n {\n estimateSize: 48,\n overscan: 8,\n gap: 0,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n tag: 'div',\n itemTag: 'div',\n },\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 })\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: props.horizontal,\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 { 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 }>(),\n {\n columnCount: 1,\n estimateRowSize: 48,\n estimateColumnSize: 160,\n overscan: 2,\n rowGap: 0,\n columnGap: 0,\n tag: 'div',\n },\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})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\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 { 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 }>(),\n {\n estimateRowSize: 44,\n overscan: 8,\n stickyHeader: true,\n tag: 'div',\n },\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})\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 }),\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: 1,\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: { size: number; align?: 'left' | 'center' | 'right' }): CSSProperties {\n return {\n width: `${column.size}px`,\n minWidth: `${column.size}px`,\n flex: '0 0 auto',\n textAlign: column.align ?? 'left',\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","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","next","previous","before","clamped","ordinal","maxEnd","lane","endEdge","items","startOrdinal","endOrdinal","from","to","start","left","right","raw","last","isBrowser","asElement","writeScroll","element","horizontal","behavior","readScroll","readViewport","readContentSize","scheduleFrame","callback","cancelFrame","id","sameVirtualItems","useVirtualizer","engine","virtualItems","shallowRef","ref","scrollOffset","scrollAdjust","isScrolling","estimateSize","listeningEl","resizeObserver","itemObserver","measureFrame","scrollTimer","travelOverscan","seenRevision","toValue","observed","elementsByIndex","pendingMeasures","currentElement","viewportFallback","rect","contentSize","readVirtualOffset","writeVirtualOffset","publish","revision","inset","itemSize","nextTotal","maxOffset","nextOffset","nextAdjust","settleScroll","flushMeasures","markScrolling","onScroll","sizeHint","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","totalWidth","toCssSize","parseCssPx","match","parsed","scrollerStyle","spacerStyle","itemStyle","props","__props","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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"}
@@ -1,8 +1,12 @@
1
1
  export declare function isBrowser(): boolean;
2
2
  export declare function asElement(target: unknown): Element | null;
3
3
  export declare function writeScroll(element: HTMLElement, offset: number, horizontal: boolean, behavior: ScrollBehavior): void;
4
+ export declare function writeWindowScroll(offset: number, horizontal: boolean, behavior: ScrollBehavior): void;
4
5
  export declare function readScroll(element: HTMLElement, horizontal: boolean): number;
6
+ export declare function readWindowScroll(horizontal: boolean): number;
5
7
  export declare function readViewport(element: HTMLElement, horizontal: boolean): number;
8
+ export declare function readWindowViewport(horizontal: boolean): number;
6
9
  export declare function readContentSize(element: HTMLElement, horizontal: boolean): number;
10
+ export declare function documentOffset(element: HTMLElement, horizontal: boolean): number;
7
11
  export declare function scheduleFrame(callback: () => void): number;
8
12
  export declare function cancelFrame(id: number): void;
@@ -5,6 +5,7 @@ export declare function scrollerStyle(input: {
5
5
  height?: number | string;
6
6
  width?: number | string;
7
7
  horizontal: boolean;
8
+ windowScroll?: boolean;
8
9
  }): CSSProperties;
9
10
  export declare function spacerStyle(total: number, horizontal: boolean): CSSProperties;
10
11
  export declare function itemStyle(start: number, horizontal: boolean, size?: number): CSSProperties;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glhrmoura/vue-virtualize",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "description": "Headless virtualization for Vue 3 lists, grids, and tables",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -52,19 +52,15 @@
52
52
  "build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly && tsc-alias -p tsconfig.build.json",
53
53
  "test": "vitest run",
54
54
  "test:watch": "vitest",
55
- "bench": "vitest bench",
56
55
  "typecheck": "vue-tsc --noEmit -p tsconfig.json",
57
56
  "lint": "eslint .",
58
57
  "format": "prettier --write .",
59
- "format:check": "prettier --check .",
60
- "changeset": "changeset",
61
- "version-packages": "changeset version"
58
+ "format:check": "prettier --check ."
62
59
  },
63
60
  "peerDependencies": {
64
61
  "vue": "^3.5.0"
65
62
  },
66
63
  "devDependencies": {
67
- "@changesets/cli": "^3.0.3",
68
64
  "@eslint/js": "^10.0.1",
69
65
  "@vitejs/plugin-vue": "^6.0.1",
70
66
  "@vue/test-utils": "^2.4.6",