@glhrmoura/vue-virtualize 0.1.0
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/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/components/VirtualGrid.vue.d.ts +53 -0
- package/dist/components/VirtualList.vue.d.ts +48 -0
- package/dist/components/VirtualTable.vue.d.ts +49 -0
- package/dist/composables/useVirtualGrid.d.ts +40 -0
- package/dist/composables/useVirtualList.d.ts +31 -0
- package/dist/composables/useVirtualTable.d.ts +39 -0
- package/dist/composables/useVirtualizer.d.ts +31 -0
- package/dist/core/measurements.d.ts +10 -0
- package/dist/core/scrolling.d.ts +11 -0
- package/dist/core/types.d.ts +25 -0
- package/dist/core/virtualizer.d.ts +35 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +974 -0
- package/dist/index.mjs.map +1 -0
- package/dist/utils/clamp.d.ts +1 -0
- package/dist/utils/dom.d.ts +7 -0
- package/dist/utils/layout.d.ts +10 -0
- package/dist/utils/same-items.d.ts +2 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/core/measurements.ts","../src/utils/clamp.ts","../src/core/scrolling.ts","../src/core/virtualizer.ts","../src/utils/dom.ts","../src/utils/same-items.ts","../src/composables/useVirtualizer.ts","../src/composables/useVirtualList.ts","../src/composables/useVirtualGrid.ts","../src/composables/useVirtualTable.ts","../src/utils/layout.ts","../src/components/VirtualList.vue","../src/components/VirtualGrid.vue","../src/components/VirtualTable.vue"],"sourcesContent":["export function normalizeSize(size: number): number {\n if (!Number.isFinite(size) || size < 0) return 0\n return size\n}\n\nexport class MeasurementCache {\n private readonly sizes = new Map<number, number>()\n private divergent = false\n\n get(index: number): number | undefined {\n return this.sizes.get(index)\n }\n\n set(index: number, size: number, baseline: number | null): void {\n this.sizes.set(index, size)\n if (baseline !== null && Math.abs(size - baseline) >= 0.5) this.divergent = true\n }\n\n get hasDivergent(): boolean {\n return this.divergent\n }\n\n clear(): void {\n this.sizes.clear()\n this.divergent = false\n }\n\n trim(count: number, baseline: number | null): void {\n let removed = false\n for (const index of this.sizes.keys()) {\n if (index >= count) {\n this.sizes.delete(index)\n removed = true\n }\n }\n if (!removed) return\n this.divergent = false\n if (baseline === null) return\n for (const value of this.sizes.values()) {\n if (Math.abs(value - baseline) >= 0.5) {\n this.divergent = true\n return\n }\n }\n }\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n","import type { ScrollAlignment } from './types'\nimport { clamp } from '../utils/clamp'\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 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 './measurements'\nimport {\n clampScrollOffset,\n findFirstIndexPast,\n findLastIndexBefore,\n resolveScrollOffset,\n} from './scrolling'\nimport type { ScrollAlignment, VirtualItem, VirtualizerOptions } from './types'\nimport { clamp } from '../utils/clamp'\n\nexport class Virtualizer {\n private count = 0\n private estimateSize: (index: number) => number = () => 0\n private overscan = 0\n private gap = 0\n private paddingStart = 0\n private paddingEnd = 0\n private lanes = 1\n private itemSize: number | null = null\n private viewportSize = 0\n private scrollOffset = 0\n private getItemKey: (index: number) => string | number = (index) => index\n private readonly measurements = new MeasurementCache()\n private built = 0\n private offsets: number[] = []\n private laneCursor: number[] = []\n private laneEnd: number[] = []\n\n setOptions(options: VirtualizerOptions): void {\n const nextLanes = Math.max(1, Math.floor(options.lanes ?? 1))\n const nextGap = options.gap ?? 0\n const nextPaddingStart = options.paddingStart ?? 0\n const nextPaddingEnd = options.paddingEnd ?? 0\n const nextCount = Math.max(0, Math.floor(options.count))\n const nextItemSize =\n options.itemSize === undefined || options.itemSize === null\n ? null\n : normalizeSize(options.itemSize)\n const previousItemSize = this.itemSize\n const geometryChanged =\n nextLanes !== this.lanes ||\n nextGap !== this.gap ||\n nextPaddingStart !== this.paddingStart ||\n nextPaddingEnd !== this.paddingEnd ||\n options.estimateSize !== this.estimateSize ||\n nextItemSize !== this.itemSize\n\n this.count = nextCount\n this.lanes = nextLanes\n this.gap = nextGap\n this.paddingStart = nextPaddingStart\n this.paddingEnd = nextPaddingEnd\n this.overscan = Math.max(0, Math.floor(options.overscan ?? 0))\n this.estimateSize = options.estimateSize\n this.itemSize = nextItemSize\n this.getItemKey = options.getItemKey ?? ((index) => index)\n if (options.viewportSize !== undefined) this.viewportSize = Math.max(0, options.viewportSize)\n if (nextItemSize !== previousItemSize) this.measurements.clear()\n this.measurements.trim(this.count, this.itemSize)\n if (geometryChanged || this.built > this.count) this.resetGeometry()\n }\n\n setScrollOffset(offset: number): void {\n this.scrollOffset = Number.isFinite(offset) ? offset : 0\n }\n\n getScrollOffset(): number {\n return this.scrollOffset\n }\n\n getViewportSize(): number {\n return this.viewportSize\n }\n\n measure(index: number, size: number): boolean {\n if (index < 0 || index >= this.count) return false\n const next = normalizeSize(size)\n const previous = this.measurements.get(index)\n if (previous !== undefined && Math.abs(previous - next) < 0.5) return false\n const before = this.getItemSize(index)\n this.measurements.set(index, next, this.itemSize)\n if (Math.abs(before - next) < 0.5) return false\n this.resetGeometry()\n return true\n }\n\n clearMeasurements(): void {\n this.measurements.clear()\n this.resetGeometry()\n }\n\n getItemSize(index: number): number {\n const measured = this.measurements.get(index)\n if (measured !== undefined) return measured\n if (this.itemSize !== null) return this.itemSize\n return normalizeSize(this.estimateSize(index))\n }\n\n getItemOffset(index: number): number {\n if (index <= 0 || this.count <= 0) return this.paddingStart\n const clamped = Math.min(index, this.count - 1)\n if (this.usesFixedPath()) {\n const ordinal = Math.floor(clamped / this.lanes)\n return this.paddingStart + ordinal * ((this.itemSize ?? 0) + this.gap)\n }\n this.ensure(clamped)\n return this.offsets[clamped] ?? this.paddingStart\n }\n\n getTotalSize(): number {\n if (this.count <= 0) return this.paddingStart + this.paddingEnd\n if (this.usesFixedPath()) {\n let maxEnd = this.paddingStart\n const size = this.itemSize ?? 0\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const total = this.laneLength(lane)\n const end = this.paddingStart + total * size + Math.max(0, total - 1) * this.gap\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n this.ensure(this.count - 1)\n let maxEnd = this.paddingStart\n for (let lane = 0; lane < this.lanes && lane < this.count; lane += 1) {\n const end = this.laneEnd[lane] ?? this.paddingStart\n if (end > maxEnd) maxEnd = end\n }\n return maxEnd + this.paddingEnd\n }\n\n getVirtualItems(): VirtualItem[] {\n if (this.count <= 0 || this.viewportSize <= 0) return []\n const offset = clampScrollOffset(this.scrollOffset, this.getTotalSize(), this.viewportSize)\n const endEdge = offset + this.viewportSize\n const items: VirtualItem[] = []\n for (let lane = 0; lane < this.lanes; lane += 1) {\n const total = this.laneLength(lane)\n if (total <= 0) continue\n const startOrdinal = findFirstIndexPast(total, offset, (ordinal) => {\n const index = this.ordinalIndex(lane, ordinal)\n return this.getItemOffset(index) + this.getItemSize(index)\n })\n const endOrdinal = findLastIndexBefore(total, endEdge, (ordinal) =>\n this.getItemOffset(this.ordinalIndex(lane, ordinal)),\n )\n const from = Math.max(0, Math.min(startOrdinal, endOrdinal) - this.overscan)\n const to = Math.min(total - 1, Math.max(startOrdinal, endOrdinal) + this.overscan)\n for (let ordinal = from; ordinal <= to; ordinal += 1) {\n const index = this.ordinalIndex(lane, ordinal)\n const start = this.getItemOffset(index)\n const size = this.getItemSize(index)\n items.push({\n index,\n key: this.getItemKey(index),\n start,\n size,\n end: start + size,\n lane,\n })\n }\n }\n items.sort((left, right) => left.index - right.index)\n return items\n }\n\n getOffsetForIndex(index: number, align: ScrollAlignment = 'auto'): number {\n if (this.count <= 0) return 0\n const clamped = clamp(index, 0, this.count - 1)\n const start = this.getItemOffset(clamped)\n const size = this.getItemSize(clamped)\n const raw = resolveScrollOffset({\n start,\n size,\n viewport: this.viewportSize,\n current: this.scrollOffset,\n align,\n })\n return clampScrollOffset(raw, this.getTotalSize(), this.viewportSize)\n }\n\n private usesFixedPath(): boolean {\n return this.itemSize !== null && !this.measurements.hasDivergent\n }\n\n private ordinalIndex(lane: number, ordinal: number): number {\n return lane + ordinal * this.lanes\n }\n\n private laneLength(lane: number): number {\n if (lane < 0 || lane >= this.lanes || lane >= this.count) return 0\n return Math.floor((this.count - lane - 1) / this.lanes) + 1\n }\n\n private ensure(index: number): void {\n if (index < this.built) return\n const last = Math.min(index, this.count - 1)\n while (this.built <= last) {\n const lane = this.built % this.lanes\n const start = this.laneCursor[lane] ?? this.paddingStart\n this.offsets[this.built] = start\n const end = start + this.getItemSize(this.built)\n this.laneEnd[lane] = end\n this.laneCursor[lane] = end + this.gap\n this.built += 1\n }\n }\n\n private resetGeometry(): void {\n this.built = 0\n this.offsets = []\n this.laneCursor = Array.from({ length: this.lanes }, () => this.paddingStart)\n this.laneEnd = Array.from({ length: this.lanes }, () => this.paddingStart)\n }\n}\n","export function isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\nexport function asElement(target: unknown): Element | null {\n if (typeof Element === 'undefined') return null\n return target instanceof Element ? target : null\n}\n\nexport function writeScroll(\n element: HTMLElement,\n offset: number,\n horizontal: boolean,\n behavior: ScrollBehavior,\n): void {\n if (behavior === 'smooth' && typeof element.scrollTo === 'function') {\n element.scrollTo({\n top: horizontal ? element.scrollTop : offset,\n left: horizontal ? offset : element.scrollLeft,\n behavior,\n })\n return\n }\n if (horizontal) element.scrollLeft = offset\n else element.scrollTop = offset\n}\n\nexport function readScroll(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollLeft : element.scrollTop\n}\n\nexport function readViewport(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.clientWidth : element.clientHeight\n}\n\nexport function scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 0) as unknown as number\n}\n\nexport function cancelFrame(id: number): void {\n if (!id) return\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(id)\n else clearTimeout(id)\n}\n","import type { VirtualItem } from '../core/types'\n\nexport function sameVirtualItems(\n left: readonly VirtualItem[],\n right: readonly VirtualItem[],\n): boolean {\n if (left.length !== right.length) return false\n for (let index = 0; index < left.length; index += 1) {\n const previous = left[index]\n const next = right[index]\n if (!previous || !next) return false\n if (\n previous.index !== next.index ||\n previous.start !== next.start ||\n previous.size !== next.size ||\n previous.end !== next.end ||\n previous.lane !== next.lane ||\n previous.key !== next.key\n ) {\n return false\n }\n }\n return true\n}\n","import {\n computed,\n onBeforeUnmount,\n ref,\n shallowRef,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from 'vue'\nimport { Virtualizer } from '../core/virtualizer'\nimport type { ScrollToIndexOptions, VirtualItem } from '../core/types'\nimport {\n asElement,\n cancelFrame,\n isBrowser,\n readScroll,\n readViewport,\n scheduleFrame,\n writeScroll,\n} from '../utils/dom'\nimport { sameVirtualItems } from '../utils/same-items'\nimport { clampScrollOffset } from '../core/scrolling'\n\nexport interface UseVirtualizerOptions {\n count: MaybeRefOrGetter<number>\n estimateSize: (index: number) => number\n container?: MaybeRefOrGetter<HTMLElement | null | undefined>\n horizontal?: MaybeRefOrGetter<boolean>\n overscan?: MaybeRefOrGetter<number>\n gap?: MaybeRefOrGetter<number>\n paddingStart?: MaybeRefOrGetter<number>\n paddingEnd?: MaybeRefOrGetter<number>\n lanes?: MaybeRefOrGetter<number>\n itemSize?: MaybeRefOrGetter<number | null | undefined>\n getItemKey?: (index: number) => string | number\n initialRect?: MaybeRefOrGetter<{ width: number; height: number } | undefined>\n viewportInset?: MaybeRefOrGetter<number>\n revision?: MaybeRefOrGetter<unknown>\n}\n\nexport function useVirtualizer(options: UseVirtualizerOptions) {\n const engine = new Virtualizer()\n const virtualItems = shallowRef<VirtualItem[]>([])\n const totalSize = ref(0)\n const scrollOffset = ref(0)\n const isScrolling = ref(false)\n const estimateSize = (index: number) => options.estimateSize(index)\n let listeningEl: HTMLElement | null = null\n let resizeObserver: ResizeObserver | null = null\n let itemObserver: ResizeObserver | null = null\n let frame = 0\n let measureFrame = 0\n let scrollTimer = 0\n let seenRevision = toValue(options.revision)\n const observed = new Map<Element, number>()\n const elementsByIndex = new Map<number, Element>()\n const pendingMeasures: { element: Element; index: number }[] = []\n\n function currentElement(): HTMLElement | null {\n const value = toValue(options.container)\n if (typeof HTMLElement === 'undefined') return null\n return value instanceof HTMLElement ? value : null\n }\n\n function horizontal(): boolean {\n return toValue(options.horizontal) ?? false\n }\n\n function viewportFallback(): number {\n const rect = toValue(options.initialRect)\n if (!rect) return 0\n return horizontal() ? rect.width : rect.height\n }\n\n function publish(): void {\n const revision = toValue(options.revision)\n if (!Object.is(revision, seenRevision)) {\n seenRevision = revision\n engine.clearMeasurements()\n }\n const element = currentElement()\n const measured = element ? readViewport(element, horizontal()) : 0\n const inset = toValue(options.viewportInset) ?? 0\n const viewport = Math.max(0, (measured > 0 ? measured : viewportFallback()) - inset)\n const itemSize = toValue(options.itemSize)\n engine.setOptions({\n count: toValue(options.count),\n estimateSize,\n overscan: toValue(options.overscan) ?? 5,\n gap: toValue(options.gap) ?? 0,\n paddingStart: toValue(options.paddingStart) ?? 0,\n paddingEnd: toValue(options.paddingEnd) ?? 0,\n lanes: toValue(options.lanes) ?? 1,\n itemSize: itemSize ?? null,\n getItemKey: options.getItemKey,\n viewportSize: viewport,\n })\n const maxOffset = Math.max(0, engine.getTotalSize() - viewport)\n if (engine.getScrollOffset() > maxOffset) {\n engine.setScrollOffset(maxOffset)\n if (element) {\n const current = readScroll(element, horizontal())\n if (current !== maxOffset) writeScroll(element, maxOffset, horizontal(), 'auto')\n }\n }\n const items = engine.getVirtualItems()\n if (!sameVirtualItems(virtualItems.value, items)) virtualItems.value = items\n const nextTotal = engine.getTotalSize()\n if (totalSize.value !== nextTotal) totalSize.value = nextTotal\n const nextOffset = engine.getScrollOffset()\n if (scrollOffset.value !== nextOffset) scrollOffset.value = nextOffset\n }\n\n function schedulePublish(): void {\n if (!isBrowser()) {\n publish()\n return\n }\n if (frame) return\n frame = scheduleFrame(() => {\n frame = 0\n isScrolling.value = true\n publish()\n if (typeof window !== 'undefined') {\n window.clearTimeout(scrollTimer)\n scrollTimer = window.setTimeout(() => {\n isScrolling.value = false\n }, 150)\n }\n })\n }\n\n function onScroll(): void {\n const element = currentElement()\n if (!element) return\n engine.setScrollOffset(readScroll(element, horizontal()))\n schedulePublish()\n }\n\n function bindContainer(): void {\n const element = currentElement()\n if (element === listeningEl) return\n if (listeningEl) {\n listeningEl.removeEventListener('scroll', onScroll)\n resizeObserver?.disconnect()\n resizeObserver = null\n }\n listeningEl = element\n if (!element || !isBrowser()) return\n const axis = horizontal()\n if (engine.getScrollOffset() > 0) writeScroll(element, engine.getScrollOffset(), axis, 'auto')\n else engine.setScrollOffset(readScroll(element, axis))\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 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 = axis\n ? (box?.inlineSize ?? entry.contentRect.width)\n : (box?.blockSize ?? entry.contentRect.height)\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 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 = 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 (measureFrame) return\n measureFrame = scheduleFrame(flushMeasures)\n }\n\n function scrollToOffset(offset: number, behavior: ScrollBehavior = 'auto'): void {\n const element = currentElement()\n const measured = element ? readViewport(element, horizontal()) : 0\n const viewport = measured > 0 ? measured : engine.getViewportSize()\n const next = clampScrollOffset(offset, engine.getTotalSize(), viewport)\n engine.setScrollOffset(next)\n if (element) writeScroll(element, next, horizontal(), behavior)\n publish()\n }\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const offset = engine.getOffsetForIndex(index, scrollOptions?.align ?? 'auto')\n scrollToOffset(offset, scrollOptions?.behavior ?? 'auto')\n }\n\n function measure(index: number, size: number): void {\n if (engine.measure(index, size)) publish()\n }\n\n publish()\n\n watch(\n () => [\n toValue(options.count),\n toValue(options.overscan),\n toValue(options.gap),\n toValue(options.paddingStart),\n toValue(options.paddingEnd),\n toValue(options.lanes),\n toValue(options.horizontal),\n toValue(options.itemSize),\n toValue(options.viewportInset),\n toValue(options.revision),\n toValue(options.container),\n toValue(options.initialRect)?.width,\n toValue(options.initialRect)?.height,\n ],\n () => {\n bindContainer()\n publish()\n },\n { flush: 'post' },\n )\n\n onBeforeUnmount(() => {\n if (listeningEl) listeningEl.removeEventListener('scroll', onScroll)\n resizeObserver?.disconnect()\n itemObserver?.disconnect()\n cancelFrame(frame)\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 isScrolling: computed(() => isScrolling.value),\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { VirtualItem } from '../core/types'\nimport { useVirtualizer, type UseVirtualizerOptions } from './useVirtualizer'\n\nexport interface VirtualListItem<T> extends VirtualItem {\n item: T\n}\n\nexport interface UseVirtualListOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n estimateSize?: number | ((index: number, item: T) => number)\n container?: UseVirtualizerOptions['container']\n horizontal?: UseVirtualizerOptions['horizontal']\n overscan?: UseVirtualizerOptions['overscan']\n gap?: UseVirtualizerOptions['gap']\n paddingStart?: UseVirtualizerOptions['paddingStart']\n paddingEnd?: UseVirtualizerOptions['paddingEnd']\n itemSize?: UseVirtualizerOptions['itemSize']\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n viewportInset?: UseVirtualizerOptions['viewportInset']\n revision?: UseVirtualizerOptions['revision']\n}\n\nfunction resolveEstimate<T>(\n estimate: UseVirtualListOptions<T>['estimateSize'],\n index: number,\n item: T,\n): number {\n if (typeof estimate === 'function') return estimate(index, item)\n if (typeof estimate === 'number') return estimate\n return 48\n}\n\nexport function useVirtualList<T>(options: UseVirtualListOptions<T>) {\n const virtualizer = useVirtualizer({\n count: () => toValue(options.items).length,\n estimateSize: (index) => {\n const source = toValue(options.items)\n return resolveEstimate(options.estimateSize, index, source[index] as T)\n },\n getItemKey: (index) => {\n const source = toValue(options.items)\n const item = source[index] as T\n return options.getItemKey?.(item, index) ?? index\n },\n itemSize: () => {\n if (options.itemSize !== undefined) return toValue(options.itemSize)\n return typeof options.estimateSize === 'number' ? options.estimateSize : undefined\n },\n container: options.container,\n horizontal: options.horizontal,\n overscan: options.overscan,\n gap: options.gap,\n paddingStart: options.paddingStart,\n paddingEnd: options.paddingEnd,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n })\n\n const virtualItems = computed<VirtualListItem<T>[]>(() => {\n const source = toValue(options.items)\n return virtualizer.virtualItems.value.map((virtual) => {\n const item = source[virtual.index] as T\n return {\n ...virtual,\n item,\n key: options.getItemKey?.(item, virtual.index) ?? virtual.key,\n }\n })\n })\n\n return {\n virtualItems,\n totalSize: virtualizer.totalSize,\n scrollOffset: virtualizer.scrollOffset,\n isScrolling: virtualizer.isScrolling,\n scrollToIndex: virtualizer.scrollToIndex,\n scrollToOffset: virtualizer.scrollToOffset,\n measure: virtualizer.measure,\n measureElement: virtualizer.measureElement,\n }\n}\n","import { computed, onBeforeUnmount, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { ScrollToIndexOptions, VirtualItem } from '../core/types'\nimport { asElement, isBrowser } from '../utils/dom'\nimport { useVirtualizer, type UseVirtualizerOptions } from './useVirtualizer'\n\nexport interface VirtualGridCell<T> {\n index: number\n key: string | number\n item: T\n row: VirtualItem\n column: VirtualItem\n}\n\nexport interface UseVirtualGridOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n columnCount: MaybeRefOrGetter<number>\n estimateRowSize?: MaybeRefOrGetter<number | ((rowIndex: number) => number)>\n estimateColumnSize?: MaybeRefOrGetter<number | ((columnIndex: number) => number)>\n container?: UseVirtualizerOptions['container']\n overscan?: MaybeRefOrGetter<number | undefined>\n overscanRows?: MaybeRefOrGetter<number | undefined>\n overscanColumns?: MaybeRefOrGetter<number | undefined>\n rowGap?: MaybeRefOrGetter<number | undefined>\n columnGap?: MaybeRefOrGetter<number | undefined>\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n revision?: UseVirtualizerOptions['revision']\n}\n\nfunction resolveSize(\n estimate: number | ((index: number) => number) | undefined,\n index: number,\n fallback: number,\n): number {\n if (typeof estimate === 'function') return estimate(index)\n if (typeof estimate === 'number') return estimate\n return fallback\n}\n\nexport function useVirtualGrid<T>(options: UseVirtualGridOptions<T>) {\n const columnCount = computed(() => Math.max(1, Math.floor(toValue(options.columnCount) || 1)))\n const rowCount = computed(() => Math.ceil(toValue(options.items).length / columnCount.value))\n const rowSizes = new Map<number, number>()\n\n const rows = useVirtualizer({\n count: () => rowCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateRowSize), index, 48),\n itemSize: () => {\n const estimate = toValue(options.estimateRowSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanRows) ?? toValue(options.overscan) ?? 2,\n gap: () => toValue(options.rowGap) ?? 0,\n horizontal: false,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n })\n\n const columns = useVirtualizer({\n count: () => columnCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateColumnSize), index, 160),\n itemSize: () => {\n const estimate = toValue(options.estimateColumnSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanColumns) ?? toValue(options.overscan) ?? 1,\n gap: () => toValue(options.columnGap) ?? 0,\n horizontal: true,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n })\n\n const virtualCells = computed<VirtualGridCell<T>[]>(() => {\n const source = toValue(options.items)\n const perRow = columnCount.value\n const cells: VirtualGridCell<T>[] = []\n for (const row of rows.virtualItems.value) {\n for (const column of columns.virtualItems.value) {\n const index = row.index * perRow + column.index\n if (index >= source.length) continue\n const item = source[index] as T\n cells.push({\n index,\n key: options.getItemKey?.(item, index) ?? index,\n item,\n row,\n column,\n })\n }\n }\n return cells\n })\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const source = toValue(options.items)\n if (!source.length) return\n const safe = Math.min(Math.max(index, 0), source.length - 1)\n const perRow = columnCount.value\n rows.scrollToIndex(Math.floor(safe / perRow), scrollOptions)\n columns.scrollToIndex(safe % perRow, scrollOptions)\n }\n\n function scrollToOffset(\n offset: { top?: number; left?: number },\n behavior: ScrollBehavior = 'auto',\n ): void {\n if (offset.top !== undefined) rows.scrollToOffset(offset.top, behavior)\n if (offset.left !== undefined) columns.scrollToOffset(offset.left, behavior)\n }\n\n function measureRow(rowIndex: number, size: number): void {\n const next = Math.max(rowSizes.get(rowIndex) ?? 0, size)\n if (next <= 0 || next === rowSizes.get(rowIndex)) return\n rowSizes.set(rowIndex, next)\n rows.measure(rowIndex, next)\n }\n\n let rowObserver: ResizeObserver | null = null\n const observedRows = new Map<Element, number>()\n\n function ensureRowObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!rowObserver) {\n rowObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const rowIndex = observedRows.get(entry.target)\n if (rowIndex === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = box?.blockSize ?? entry.contentRect.height\n if (size > 0) measureRow(rowIndex, size)\n }\n })\n }\n return rowObserver\n }\n\n function measureRowElement(target: unknown, rowIndex: number): void {\n const element = asElement(target)\n const observer = ensureRowObserver()\n if (!element) return\n observedRows.set(element, rowIndex)\n observer?.observe(element)\n const size = element.getBoundingClientRect().height\n if (size > 0) measureRow(rowIndex, size)\n }\n\n onBeforeUnmount(() => {\n rowObserver?.disconnect()\n observedRows.clear()\n })\n\n return {\n virtualRows: rows.virtualItems,\n virtualColumns: columns.virtualItems,\n virtualCells,\n totalHeight: rows.totalSize,\n totalWidth: columns.totalSize,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n measureColumn: columns.measure,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport { useVirtualList, type UseVirtualListOptions, type VirtualListItem } from './useVirtualList'\n\nexport interface VirtualTableColumn<T> {\n id: string\n header: string\n width?: number\n minWidth?: number\n align?: 'left' | 'center' | 'right'\n accessor?: (row: T, index: number) => unknown\n}\n\nexport interface PlacedVirtualTableColumn<T> extends VirtualTableColumn<T> {\n start: number\n size: number\n end: number\n}\n\nexport interface UseVirtualTableOptions<T> {\n rows: MaybeRefOrGetter<readonly T[]>\n columns: MaybeRefOrGetter<readonly VirtualTableColumn<T>[]>\n estimateRowSize?: number | ((index: number, row: T) => number)\n container?: UseVirtualListOptions<T>['container']\n overscan?: UseVirtualListOptions<T>['overscan']\n getRowKey?: (row: T, index: number) => string | number\n initialRect?: UseVirtualListOptions<T>['initialRect']\n viewportInset?: UseVirtualListOptions<T>['viewportInset']\n revision?: UseVirtualListOptions<T>['revision']\n itemSize?: UseVirtualListOptions<T>['itemSize']\n}\n\nexport function useVirtualTable<T>(options: UseVirtualTableOptions<T>) {\n const list = useVirtualList<T>({\n items: options.rows,\n estimateSize: options.estimateRowSize,\n container: options.container,\n overscan: options.overscan,\n getItemKey: options.getRowKey,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n itemSize: options.itemSize,\n })\n\n const columns = computed<PlacedVirtualTableColumn<T>[]>(() => {\n const source = toValue(options.columns)\n let start = 0\n return source.map((column) => {\n const size = column.width ?? column.minWidth ?? 160\n const placed: PlacedVirtualTableColumn<T> = {\n ...column,\n start,\n size,\n end: start + size,\n }\n start += size\n return placed\n })\n })\n\n const totalWidth = computed(() => {\n const placed = columns.value\n if (!placed.length) return 0\n return placed[placed.length - 1]?.end ?? 0\n })\n\n const virtualRows = computed<VirtualListItem<T>[]>(() => list.virtualItems.value)\n\n return {\n virtualRows,\n columns,\n totalHeight: list.totalSize,\n totalWidth,\n scrollOffset: list.scrollOffset,\n 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'\n\nexport function toCssSize(value: number | string | undefined): string | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return `${value}px`\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nexport function parseCssPx(value: number | string | undefined): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value !== 'string') return 0\n const match = /^(-?\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!match?.[1]) return 0\n const parsed = Number(match[1])\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nexport function scrollerStyle(input: {\n height?: number | string\n width?: number | string\n horizontal: boolean\n}): CSSProperties {\n return {\n overflow: 'auto',\n position: 'relative',\n height: toCssSize(input.height) ?? (input.horizontal ? '100%' : undefined),\n width: toCssSize(input.width) ?? (input.horizontal ? undefined : '100%'),\n overflowAnchor: 'none',\n }\n}\n\nexport function spacerStyle(total: number, horizontal: boolean): CSSProperties {\n return {\n position: 'relative',\n width: horizontal ? `${total}px` : '100%',\n height: horizontal ? '100%' : `${total}px`,\n }\n}\n\nexport function itemStyle(start: number, horizontal: boolean): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: horizontal ? undefined : '100%',\n height: horizontal ? '100%' : undefined,\n transform: horizontal ? `translateX(${start}px)` : `translateY(${start}px)`,\n }\n}\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type HTMLAttributes } from 'vue'\nimport { useVirtualList } from '../composables/useVirtualList'\nimport { itemStyle, parseCssPx, scrollerStyle, spacerStyle } from '../utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n estimateSize?: number | ((index: number, item: T) => number)\n height?: number | string\n width?: number | string\n horizontal?: boolean\n overscan?: number\n gap?: number\n paddingStart?: number\n paddingEnd?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemTag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n }>(),\n {\n estimateSize: 48,\n overscan: 5,\n gap: 0,\n paddingStart: 0,\n paddingEnd: 0,\n horizontal: false,\n tag: 'div',\n itemTag: 'div',\n },\n)\n\nconst container = ref<HTMLElement | null>(null)\n\nconst { virtualItems, totalSize, scrollToIndex, scrollToOffset, measure, measureElement } =\n useVirtualList<T>({\n items: () => props.items,\n estimateSize: (index, item) => {\n const estimate = props.estimateSize\n return typeof estimate === 'number' ? estimate : estimate(index, item)\n },\n itemSize: () => (typeof props.estimateSize === 'number' ? props.estimateSize : undefined),\n container,\n horizontal: () => props.horizontal,\n overscan: () => props.overscan,\n gap: () => props.gap,\n paddingStart: () => props.paddingStart,\n paddingEnd: () => props.paddingEnd,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n })\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: props.horizontal,\n }),\n)\n\nconst innerStyle = computed(() => spacerStyle(totalSize.value, props.horizontal))\n\nfunction rowStyle(start: number) {\n return itemStyle(start, props.horizontal)\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)\"\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 { parseCssPx, scrollerStyle } from '../utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n columnCount?: number\n estimateRowSize?: number | ((rowIndex: number) => number)\n estimateColumnSize?: number | ((columnIndex: number) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n overscanRows?: number\n overscanColumns?: number\n rowGap?: number\n columnGap?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n }>(),\n {\n columnCount: 1,\n estimateRowSize: 48,\n estimateColumnSize: 160,\n overscan: 2,\n rowGap: 0,\n columnGap: 0,\n tag: 'div',\n },\n)\n\nconst container = ref<HTMLElement | null>(null)\n\nconst {\n virtualCells,\n totalWidth,\n totalHeight,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n} = useVirtualGrid<T>({\n items: () => props.items,\n columnCount: () => props.columnCount,\n estimateRowSize: () => props.estimateRowSize,\n estimateColumnSize: () => props.estimateColumnSize,\n container,\n overscan: () => props.overscan,\n overscanRows: () => props.overscanRows,\n overscanColumns: () => props.overscanColumns,\n rowGap: () => props.rowGap,\n columnGap: () => props.columnGap,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n }),\n)\n\nconst innerStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n width: `${totalWidth.value}px`,\n height: `${totalHeight.value}px`,\n}))\n\nfunction bindCell(rowIndex: number) {\n return (element: unknown) => {\n measureRowElement(element, rowIndex)\n }\n}\n\nfunction cellStyle(columnStart: number, columnSize: number, rowStart: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: `${columnSize}px`,\n transform: `translate(${columnStart}px, ${rowStart}px)`,\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, cell.column.size, cell.row.start)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"cell.item\"\n :index=\"cell.index\"\n :row-index=\"cell.row.index\"\n :column-index=\"cell.column.index\"\n :row=\"cell.row\"\n :column=\"cell.column\"\n />\n </div>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, watch, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualTable, type VirtualTableColumn } from '../composables/useVirtualTable'\nimport { isBrowser } from '../utils/dom'\nimport { parseCssPx, scrollerStyle } from '../utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n rows: readonly T[]\n columns: readonly VirtualTableColumn<T>[]\n estimateRowSize?: number | ((index: number, row: T) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n getRowKey?: (row: T, index: number) => string | number\n stickyHeader?: boolean\n tag?: string\n rowAttrs?: HTMLAttributes\n revision?: unknown\n }>(),\n {\n estimateRowSize: 44,\n overscan: 5,\n stickyHeader: true,\n tag: 'div',\n },\n)\n\nconst container = ref<HTMLElement | null>(null)\nconst header = ref<HTMLElement | null>(null)\nconst headerSize = ref(0)\n\nconst {\n virtualRows,\n columns: placedColumns,\n totalWidth,\n totalHeight,\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n} = useVirtualTable<T>({\n rows: () => props.rows,\n columns: () => props.columns,\n estimateRowSize: (index, row) => {\n const estimate = props.estimateRowSize\n return typeof estimate === 'number' ? estimate : estimate(index, row)\n },\n container,\n overscan: () => props.overscan,\n getRowKey: (row, index) => props.getRowKey?.(row, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n viewportInset: headerSize,\n revision: () => props.revision,\n itemSize: () => (typeof props.estimateRowSize === 'number' ? props.estimateRowSize : undefined),\n})\n\nwatch(header, (element, previous, onCleanup) => {\n if (previous === element && !element) return\n if (!element || !isBrowser() || typeof ResizeObserver === 'undefined') return\n const read = () => {\n headerSize.value = element.getBoundingClientRect().height\n }\n const observer = new ResizeObserver(read)\n observer.observe(element)\n read()\n onCleanup(() => observer.disconnect())\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n }),\n)\n\nconst frameStyle = computed<CSSProperties>(() => ({\n minWidth: `${totalWidth.value}px`,\n}))\n\nconst headerStyle = computed<CSSProperties>(() => ({\n position: props.stickyHeader ? 'sticky' : 'relative',\n top: props.stickyHeader ? '0px' : undefined,\n zIndex: 1,\n display: 'flex',\n width: `${totalWidth.value}px`,\n}))\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n height: `${totalHeight.value}px`,\n width: `${totalWidth.value}px`,\n}))\n\nfunction placedStyle(column: { size: number; align?: 'left' | 'center' | 'right' }): CSSProperties {\n return {\n width: `${column.size}px`,\n minWidth: `${column.size}px`,\n flex: '0 0 auto',\n textAlign: column.align ?? 'left',\n }\n}\n\nfunction rowStyle(start: number): CSSProperties {\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n display: 'flex',\n transform: `translateY(${start}px)`,\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)\"\n v-bind=\"rowAttrs\"\n >\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"cell\"\n :style=\"placedStyle(column)\"\n >\n <slot\n name=\"cell\"\n :row=\"virtualRow.item\"\n :column=\"column\"\n :row-index=\"virtualRow.index\"\n :value=\"cellValue(virtualRow.item, column, virtualRow.index)\"\n >\n {{ cellValue(virtualRow.item, column, virtualRow.index) }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </component>\n</template>\n"],"names":["normalizeSize","size","MeasurementCache","index","baseline","count","removed","value","clamp","min","max","clampScrollOffset","offset","totalSize","viewport","findFirstIndexPast","target","getEnd","low","high","answer","mid","findLastIndexBefore","getStart","resolveScrollOffset","input","end","align","visibleEnd","Virtualizer","options","nextLanes","nextGap","nextPaddingStart","nextPaddingEnd","nextCount","nextItemSize","previousItemSize","geometryChanged","next","previous","before","measured","clamped","ordinal","maxEnd","lane","total","endEdge","items","startOrdinal","endOrdinal","from","to","start","left","right","raw","last","isBrowser","asElement","writeScroll","element","horizontal","behavior","readScroll","readViewport","scheduleFrame","callback","cancelFrame","id","sameVirtualItems","useVirtualizer","engine","virtualItems","shallowRef","ref","scrollOffset","isScrolling","estimateSize","listeningEl","resizeObserver","itemObserver","frame","measureFrame","scrollTimer","seenRevision","toValue","observed","elementsByIndex","pendingMeasures","currentElement","viewportFallback","rect","publish","revision","inset","itemSize","maxOffset","nextTotal","nextOffset","schedulePublish","onScroll","bindContainer","axis","ensureItemObserver","entries","changed","entry","box","flushMeasures","batch","pending","measureElement","observer","current","scrollToOffset","scrollToIndex","scrollOptions","measure","watch","onBeforeUnmount","computed","resolveEstimate","estimate","item","useVirtualList","virtualizer","source","virtual","resolveSize","fallback","useVirtualGrid","columnCount","rowCount","rowSizes","rows","columns","virtualCells","perRow","cells","row","column","safe","measureRow","rowIndex","rowObserver","observedRows","ensureRowObserver","measureRowElement","useVirtualTable","list","placed","totalWidth","toCssSize","parseCssPx","match","parsed","scrollerStyle","spacerStyle","itemStyle","props","__props","container","containerStyle","innerStyle","rowStyle","bindItem","__expose","_openBlock","_createBlock","_resolveDynamicComponent","_createElementBlock","_Fragment","_renderList","_unref","virtualItem","_mergeProps","_renderSlot","_ctx","totalHeight","bindCell","cellStyle","columnStart","columnSize","rowStart","cell","header","headerSize","virtualRows","placedColumns","onCleanup","read","frameStyle","headerStyle","bodyStyle","placedStyle","bindRow","cellValue","_createElementVNode","_normalizeStyle","_toDisplayString","virtualRow"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isBrowser(): boolean;
|
|
2
|
+
export declare function asElement(target: unknown): Element | null;
|
|
3
|
+
export declare function writeScroll(element: HTMLElement, offset: number, horizontal: boolean, behavior: ScrollBehavior): void;
|
|
4
|
+
export declare function readScroll(element: HTMLElement, horizontal: boolean): number;
|
|
5
|
+
export declare function readViewport(element: HTMLElement, horizontal: boolean): number;
|
|
6
|
+
export declare function scheduleFrame(callback: () => void): number;
|
|
7
|
+
export declare function cancelFrame(id: number): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CSSProperties } from 'vue';
|
|
2
|
+
export declare function toCssSize(value: number | string | undefined): string | undefined;
|
|
3
|
+
export declare function parseCssPx(value: number | string | undefined): number;
|
|
4
|
+
export declare function scrollerStyle(input: {
|
|
5
|
+
height?: number | string;
|
|
6
|
+
width?: number | string;
|
|
7
|
+
horizontal: boolean;
|
|
8
|
+
}): CSSProperties;
|
|
9
|
+
export declare function spacerStyle(total: number, horizontal: boolean): CSSProperties;
|
|
10
|
+
export declare function itemStyle(start: number, horizontal: boolean): CSSProperties;
|
package/package.json
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@glhrmoura/vue-virtualize",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Headless virtualization for Vue 3 lists, grids, and tables",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Guilherme Moura <mouraggui@gmail.com>",
|
|
8
|
+
"homepage": "https://github.com/glhrmoura/vue-virtualize",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/glhrmoura/vue-virtualize.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/glhrmoura/vue-virtualize/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"vue",
|
|
18
|
+
"vue3",
|
|
19
|
+
"virtual",
|
|
20
|
+
"virtualization",
|
|
21
|
+
"list",
|
|
22
|
+
"grid",
|
|
23
|
+
"table",
|
|
24
|
+
"scroll",
|
|
25
|
+
"performance"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"module": "./dist/index.mjs",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.mjs",
|
|
35
|
+
"require": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"LICENSE",
|
|
41
|
+
"README.md"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public",
|
|
45
|
+
"registry": "https://registry.npmjs.org/"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=22"
|
|
49
|
+
},
|
|
50
|
+
"packageManager": "yarn@4.18.1",
|
|
51
|
+
"scripts": {
|
|
52
|
+
"dev": "vite --config playground/vite.config.ts",
|
|
53
|
+
"build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
54
|
+
"build:playground": "vite build --config playground/vite.config.ts",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest",
|
|
57
|
+
"bench": "vitest bench",
|
|
58
|
+
"typecheck": "vue-tsc --noEmit -p tsconfig.json && vue-tsc --noEmit -p playground/tsconfig.json",
|
|
59
|
+
"lint": "eslint .",
|
|
60
|
+
"format": "prettier --write .",
|
|
61
|
+
"format:check": "prettier --check .",
|
|
62
|
+
"docs:dev": "vitepress dev docs",
|
|
63
|
+
"docs:build": "vitepress build docs",
|
|
64
|
+
"changeset": "changeset",
|
|
65
|
+
"version-packages": "changeset version"
|
|
66
|
+
},
|
|
67
|
+
"peerDependencies": {
|
|
68
|
+
"vue": "^3.5.0"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@changesets/cli": "^3.0.3",
|
|
72
|
+
"@eslint/js": "^10.0.1",
|
|
73
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
74
|
+
"@vitejs/plugin-vue": "^6.0.1",
|
|
75
|
+
"@vue/test-utils": "^2.4.6",
|
|
76
|
+
"eslint": "^10.0.0",
|
|
77
|
+
"eslint-config-prettier": "^10.1.8",
|
|
78
|
+
"eslint-plugin-vue": "^10.5.0",
|
|
79
|
+
"happy-dom": "^20.0.10",
|
|
80
|
+
"prettier": "^3.6.2",
|
|
81
|
+
"tailwindcss": "^4.3.3",
|
|
82
|
+
"typescript": "~5.9.3",
|
|
83
|
+
"typescript-eslint": "^8.46.0",
|
|
84
|
+
"vite": "^7.1.10",
|
|
85
|
+
"vitepress": "^1.6.4",
|
|
86
|
+
"vitest": "^3.2.4",
|
|
87
|
+
"vue": "^3.5.22",
|
|
88
|
+
"vue-eslint-parser": "^10.2.0",
|
|
89
|
+
"vue-tsc": "^3.1.0"
|
|
90
|
+
}
|
|
91
|
+
}
|