@glhrmoura/vue-virtualize 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +72 -63
- package/dist/index.mjs.map +1 -1
- package/dist/utils/layout.d.ts +3 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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
|
+
{"version":3,"file":"index.js","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(\n start: number,\n horizontal: boolean,\n size?: number,\n options?: { fixed?: boolean },\n): CSSProperties {\n const fixed = options?.fixed ?? false\n if (horizontal) {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n height: '100%',\n transform: `translateX(${start}px)`,\n boxSizing: 'border-box',\n ...(fixed && size !== undefined\n ? { width: `${size}px`, overflow: 'hidden', contain: 'layout style' }\n : {}),\n }\n }\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${start}px)`,\n boxSizing: 'border-box',\n ...(fixed && size !== undefined\n ? { height: `${size}px`, overflow: 'hidden', contain: 'layout style' }\n : {}),\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 fixed: typeof props.estimateSize === 'number',\n })\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","fixed","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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"}
|