@glhrmoura/vue-virtualize 0.1.3 → 0.1.4
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/composables/useVirtualGrid.d.ts +2 -0
- package/dist/composables/useVirtualList.d.ts +1 -0
- package/dist/composables/useVirtualTable.d.ts +1 -0
- package/dist/composables/useVirtualizer.d.ts +1 -0
- package/dist/core/scrolling.d.ts +4 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +463 -414
- package/dist/index.mjs.map +1 -1
- package/dist/utils/dom.d.ts +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Headless virtualization for Vue 3 lists, grids, and tables.
|
|
|
14
14
|
|
|
15
15
|
### Documentation
|
|
16
16
|
|
|
17
|
-
[**Vue Virtualize**](https://glhrmoura-vue-virtualize.netlify.app)
|
|
17
|
+
[**Vue Virtualize: Documentation**](https://glhrmoura-vue-virtualize.netlify.app)
|
|
18
18
|
|
|
19
19
|
### Install
|
|
20
20
|
|
|
@@ -29,6 +29,8 @@ export declare function useVirtualGrid<T>(options: UseVirtualGridOptions<T>): {
|
|
|
29
29
|
virtualCells: import("vue").ComputedRef<VirtualGridCell<T>[]>;
|
|
30
30
|
totalHeight: import("vue").ComputedRef<number>;
|
|
31
31
|
totalWidth: import("vue").ComputedRef<number>;
|
|
32
|
+
scrollAdjustX: import("vue").ComputedRef<number>;
|
|
33
|
+
scrollAdjustY: import("vue").ComputedRef<number>;
|
|
32
34
|
scrollToIndex: (index: number, scrollOptions?: ScrollToIndexOptions) => void;
|
|
33
35
|
scrollToOffset: (offset: {
|
|
34
36
|
top?: number;
|
|
@@ -23,6 +23,7 @@ export declare function useVirtualList<T>(options: UseVirtualListOptions<T>): {
|
|
|
23
23
|
virtualItems: import("vue").ComputedRef<VirtualListItem<T>[]>;
|
|
24
24
|
totalSize: import("vue").ComputedRef<number>;
|
|
25
25
|
scrollOffset: import("vue").ComputedRef<number>;
|
|
26
|
+
scrollAdjust: import("vue").ComputedRef<number>;
|
|
26
27
|
isScrolling: import("vue").ComputedRef<boolean>;
|
|
27
28
|
scrollToIndex: (index: number, scrollOptions?: import("..").ScrollToIndexOptions) => void;
|
|
28
29
|
scrollToOffset: (offset: number, behavior?: ScrollBehavior) => void;
|
|
@@ -31,6 +31,7 @@ export declare function useVirtualTable<T>(options: UseVirtualTableOptions<T>):
|
|
|
31
31
|
totalHeight: import("vue").ComputedRef<number>;
|
|
32
32
|
totalWidth: import("vue").ComputedRef<number>;
|
|
33
33
|
scrollOffset: import("vue").ComputedRef<number>;
|
|
34
|
+
scrollAdjust: import("vue").ComputedRef<number>;
|
|
34
35
|
isScrolling: import("vue").ComputedRef<boolean>;
|
|
35
36
|
scrollToIndex: (index: number, scrollOptions?: import("..").ScrollToIndexOptions) => void;
|
|
36
37
|
scrollToOffset: (offset: number, behavior?: ScrollBehavior) => void;
|
|
@@ -23,6 +23,7 @@ export declare function useVirtualizer(options: UseVirtualizerOptions): {
|
|
|
23
23
|
virtualItems: import("vue").ComputedRef<VirtualItem[]>;
|
|
24
24
|
totalSize: import("vue").ComputedRef<number>;
|
|
25
25
|
scrollOffset: import("vue").ComputedRef<number>;
|
|
26
|
+
scrollAdjust: import("vue").ComputedRef<number>;
|
|
26
27
|
isScrolling: import("vue").ComputedRef<boolean>;
|
|
27
28
|
scrollToIndex: (index: number, scrollOptions?: ScrollToIndexOptions) => void;
|
|
28
29
|
scrollToOffset: (offset: number, behavior?: ScrollBehavior) => void;
|
package/dist/core/scrolling.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { ScrollAlignment } from './types';
|
|
2
|
+
export declare const MAX_SCROLL_SIZE = 16777216;
|
|
2
3
|
export declare function clampScrollOffset(offset: number, totalSize: number, viewport: number): number;
|
|
4
|
+
export declare function scrollContentSize(totalSize: number, measured?: number): number;
|
|
5
|
+
export declare function mapDomOffsetToVirtual(domOffset: number, virtualSize: number, domSize: number, viewport: number): number;
|
|
6
|
+
export declare function mapVirtualOffsetToDom(virtualOffset: number, virtualSize: number, domSize: number, viewport: number): number;
|
|
3
7
|
export declare function findFirstIndexPast(count: number, target: number, getEnd: (index: number) => number): number;
|
|
4
8
|
export declare function findLastIndexBefore(count: number, target: number, getStart: (index: number) => number): number;
|
|
5
9
|
export declare function resolveScrollOffset(input: {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { Virtualizer } from './core/virtualizer';
|
|
2
2
|
export { MeasurementCache, normalizeSize } from './core/measurements';
|
|
3
|
-
export { clampScrollOffset, resolveScrollOffset } from './core/scrolling';
|
|
3
|
+
export { clampScrollOffset, mapDomOffsetToVirtual, mapVirtualOffsetToDom, resolveScrollOffset, scrollContentSize, } from './core/scrolling';
|
|
4
4
|
export type { ScrollAlignment, ScrollToIndexOptions, VirtualItem, VirtualizerOptions, } from './core/types';
|
|
5
5
|
export { useVirtualizer } from './composables/useVirtualizer';
|
|
6
6
|
export type { UseVirtualizerOptions } from './composables/useVirtualizer';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue");function K(e){return!Number.isFinite(e)||e<0?0:e}class Z{sizes=new Map;divergent=!1;get(n){return this.sizes.get(n)}set(n,i,r){this.sizes.set(n,i),r!==null&&Math.abs(i-r)>=.5&&(this.divergent=!0)}get hasDivergent(){return this.divergent}clear(){this.sizes.clear(),this.divergent=!1}trim(n,i){let r=!1;for(const s of this.sizes.keys())s>=n&&(this.sizes.delete(s),r=!0);if(r&&(this.divergent=!1,i!==null)){for(const s of this.sizes.values())if(Math.abs(s-i)>=.5){this.divergent=!0;return}}}}function ee(e,n,i){return Math.min(i,Math.max(n,e))}function G(e,n,i){const r=Math.max(0,n-Math.max(0,i));return ee(Number.isFinite(e)?e:0,0,r)}function le(e,n,i){if(e<=0)return 0;let r=0,s=e-1,o=e-1;for(;r<=s;){const d=r+s>>>1;i(d)>n?(o=d,s=d-1):r=d+1}return o}function ue(e,n,i){if(e<=0)return 0;let r=0,s=e-1,o=0;for(;r<=s;){const d=r+s>>>1;i(d)<n?(o=d,r=d+1):s=d-1}return o}function te(e){const n=e.start+e.size;let i=e.align;if(i==="auto"){const r=e.current+e.viewport;if(e.start>=e.current&&n<=r)return e.current;i=e.start<e.current?"start":"end"}return i==="center"?e.start-(e.viewport-e.size)/2:i==="end"?n-e.viewport:e.start}class ne{count=0;estimateSize=()=>0;overscan=0;gap=0;paddingStart=0;paddingEnd=0;lanes=1;itemSize=null;viewportSize=0;scrollOffset=0;getItemKey=n=>n;measurements=new Z;built=0;offsets=[];laneCursor=[];laneEnd=[];setOptions(n){const i=Math.max(1,Math.floor(n.lanes??1)),r=n.gap??0,s=n.paddingStart??0,o=n.paddingEnd??0,d=Math.max(0,Math.floor(n.count)),h=n.itemSize===void 0||n.itemSize===null?null:K(n.itemSize),y=this.itemSize,x=i!==this.lanes||r!==this.gap||s!==this.paddingStart||o!==this.paddingEnd||n.estimateSize!==this.estimateSize||h!==this.itemSize;this.count=d,this.lanes=i,this.gap=r,this.paddingStart=s,this.paddingEnd=o,this.overscan=Math.max(0,Math.floor(n.overscan??0)),this.estimateSize=n.estimateSize,this.itemSize=h,this.getItemKey=n.getItemKey??(v=>v),n.viewportSize!==void 0&&(this.viewportSize=Math.max(0,n.viewportSize)),h!==y&&this.measurements.clear(),this.measurements.trim(this.count,this.itemSize),(x||this.built>this.count)&&this.resetGeometry()}setScrollOffset(n){this.scrollOffset=Number.isFinite(n)?n:0}getScrollOffset(){return this.scrollOffset}getViewportSize(){return this.viewportSize}measure(n,i){if(n<0||n>=this.count)return!1;const r=K(i),s=this.measurements.get(n);if(s!==void 0&&Math.abs(s-r)<.5)return!1;const o=this.getItemSize(n);return this.measurements.set(n,r,this.itemSize),Math.abs(o-r)<.5?!1:(this.resetGeometry(),!0)}clearMeasurements(){this.measurements.clear(),this.resetGeometry()}getItemSize(n){const i=this.measurements.get(n);return i!==void 0?i:this.itemSize!==null?this.itemSize:K(this.estimateSize(n))}getItemOffset(n){if(n<=0||this.count<=0)return this.paddingStart;const i=Math.min(n,this.count-1);if(this.usesFixedPath()){const r=Math.floor(i/this.lanes);return this.paddingStart+r*((this.itemSize??0)+this.gap)}return this.ensure(i),this.offsets[i]??this.paddingStart}getTotalSize(){if(this.count<=0)return this.paddingStart+this.paddingEnd;if(this.usesFixedPath()){let i=this.paddingStart;const r=this.itemSize??0;for(let s=0;s<this.lanes&&s<this.count;s+=1){const o=this.laneLength(s),d=this.paddingStart+o*r+Math.max(0,o-1)*this.gap;d>i&&(i=d)}return i+this.paddingEnd}this.ensure(this.count-1);let n=this.paddingStart;for(let i=0;i<this.lanes&&i<this.count;i+=1){const r=this.laneEnd[i]??this.paddingStart;r>n&&(n=r)}return n+this.paddingEnd}getVirtualItems(){if(this.count<=0||this.viewportSize<=0)return[];const n=G(this.scrollOffset,this.getTotalSize(),this.viewportSize),i=n+this.viewportSize,r=[];for(let s=0;s<this.lanes;s+=1){const o=this.laneLength(s);if(o<=0)continue;const d=le(o,n,v=>{const p=this.ordinalIndex(s,v);return this.getItemOffset(p)+this.getItemSize(p)}),h=ue(o,i,v=>this.getItemOffset(this.ordinalIndex(s,v))),y=Math.max(0,Math.min(d,h)-this.overscan),x=Math.min(o-1,Math.max(d,h)+this.overscan);for(let v=y;v<=x;v+=1){const p=this.ordinalIndex(s,v),I=this.getItemOffset(p),E=this.getItemSize(p);r.push({index:p,key:this.getItemKey(p),start:I,size:E,end:I+E,lane:s})}}return r.sort((s,o)=>s.index-o.index),r}getOffsetForIndex(n,i="auto"){if(this.count<=0)return 0;const r=ee(n,0,this.count-1),s=this.getItemOffset(r),o=this.getItemSize(r),d=te({start:s,size:o,viewport:this.viewportSize,current:this.scrollOffset,align:i});return G(d,this.getTotalSize(),this.viewportSize)}usesFixedPath(){return this.itemSize!==null&&!this.measurements.hasDivergent}ordinalIndex(n,i){return n+i*this.lanes}laneLength(n){return n<0||n>=this.lanes||n>=this.count?0:Math.floor((this.count-n-1)/this.lanes)+1}ensure(n){if(n<this.built)return;const i=Math.min(n,this.count-1);for(;this.built<=i;){const r=this.built%this.lanes,s=this.laneCursor[r]??this.paddingStart;this.offsets[this.built]=s;const o=s+this.getItemSize(this.built);this.laneEnd[r]=o,this.laneCursor[r]=o+this.gap,this.built+=1}}resetGeometry(){this.built=0,this.offsets=[],this.laneCursor=Array.from({length:this.lanes},()=>this.paddingStart),this.laneEnd=Array.from({length:this.lanes},()=>this.paddingStart)}}function F(){return typeof window<"u"&&typeof document<"u"}function ie(e){return typeof Element>"u"?null:e instanceof Element?e:null}function N(e,n,i,r){if(r==="smooth"&&typeof e.scrollTo=="function"){e.scrollTo({top:i?e.scrollTop:n,left:i?n:e.scrollLeft,behavior:r});return}i?e.scrollLeft=n:e.scrollTop=n}function P(e,n){return n?e.scrollLeft:e.scrollTop}function U(e,n){return n?e.clientWidth:e.clientHeight}function Y(e){return typeof requestAnimationFrame=="function"?requestAnimationFrame(e):setTimeout(e,0)}function X(e){e&&(typeof cancelAnimationFrame=="function"?cancelAnimationFrame(e):clearTimeout(e))}function ce(e,n){if(e.length!==n.length)return!1;for(let i=0;i<e.length;i+=1){const r=e[i],s=n[i];if(!r||!s||r.index!==s.index||r.start!==s.start||r.size!==s.size||r.end!==s.end||r.lane!==s.lane||r.key!==s.key)return!1}return!0}function A(e){const n=new ne,i=t.shallowRef([]),r=t.ref(0),s=t.ref(0),o=t.ref(!1),d=c=>e.estimateSize(c);let h=null,y=null,x=null,v=0,p=0,I=0,E=t.toValue(e.revision);const l=new Map,u=new Map,a=[];function f(){const c=t.toValue(e.container);return typeof HTMLElement>"u"?null:c instanceof HTMLElement?c:null}function S(){return t.toValue(e.horizontal)??!1}function C(){const c=t.toValue(e.initialRect);return c?S()?c.width:c.height:0}function O(){const c=t.toValue(e.revision);Object.is(c,E)||(E=c,n.clearMeasurements());const z=f(),w=z?U(z,S()):0,V=t.toValue(e.viewportInset)??0,k=Math.max(0,(w>0?w:C())-V),T=t.toValue(e.itemSize);n.setOptions({count:t.toValue(e.count),estimateSize:d,overscan:t.toValue(e.overscan)??5,gap:t.toValue(e.gap)??0,paddingStart:t.toValue(e.paddingStart)??0,paddingEnd:t.toValue(e.paddingEnd)??0,lanes:t.toValue(e.lanes)??1,itemSize:T??null,getItemKey:e.getItemKey,viewportSize:k});const M=Math.max(0,n.getTotalSize()-k);n.getScrollOffset()>M&&(n.setScrollOffset(M),z&&P(z,S())!==M&&N(z,M,S(),"auto"));const _=n.getVirtualItems();ce(i.value,_)||(i.value=_);const j=n.getTotalSize();r.value!==j&&(r.value=j);const q=n.getScrollOffset();s.value!==q&&(s.value=q)}function $(){if(!F()){O();return}v||(v=Y(()=>{v=0,o.value=!0,O(),typeof window<"u"&&(window.clearTimeout(I),I=window.setTimeout(()=>{o.value=!1},150))}))}function m(){const c=f();c&&(n.setScrollOffset(P(c,S())),$())}function b(){const c=f();if(c===h||(h&&(h.removeEventListener("scroll",m),y?.disconnect(),y=null),h=c,!c||!F()))return;const z=S();n.getScrollOffset()>0?N(c,n.getScrollOffset(),z,"auto"):n.setScrollOffset(P(c,z)),c.addEventListener("scroll",m,{passive:!0}),typeof ResizeObserver<"u"&&(y=new ResizeObserver(()=>O()),y.observe(c))}function g(){return!F()||typeof ResizeObserver>"u"?null:(x||(x=new ResizeObserver(c=>{const z=S();let w=!1;for(const V of c){const k=l.get(V.target);if(k===void 0)continue;const T=V.borderBoxSize?.[0],M=z?T?.inlineSize??V.contentRect.width:T?.blockSize??V.contentRect.height;M>0&&n.measure(k,M)&&(w=!0)}w&&O()})),x)}function R(){p=0;const c=a.splice(0,a.length),z=S();let w=!1;for(const V of c){if(!V.element.isConnected)continue;const k=V.element.getBoundingClientRect(),T=z?k.width:k.height;T>0&&n.measure(V.index,T)&&(w=!0)}w&&O()}function L(c,z){const w=ie(c),V=g(),k=u.get(z);k&&k!==w&&(V?.unobserve(k),l.delete(k),u.delete(z)),w&&(u.set(z,w),l.set(w,z),V?.observe(w),a.push({element:w,index:z}),!p&&(p=Y(R)))}function W(c,z="auto"){const w=f(),V=w?U(w,S()):0,k=V>0?V:n.getViewportSize(),T=G(c,n.getTotalSize(),k);n.setScrollOffset(T),w&&N(w,T,S(),z),O()}function oe(c,z){const w=n.getOffsetForIndex(c,z?.align??"auto");W(w,z?.behavior??"auto")}function ae(c,z){n.measure(c,z)&&O()}return O(),t.watch(()=>[t.toValue(e.count),t.toValue(e.overscan),t.toValue(e.gap),t.toValue(e.paddingStart),t.toValue(e.paddingEnd),t.toValue(e.lanes),t.toValue(e.horizontal),t.toValue(e.itemSize),t.toValue(e.viewportInset),t.toValue(e.revision),t.toValue(e.container),t.toValue(e.initialRect)?.width,t.toValue(e.initialRect)?.height],()=>{b(),O()},{flush:"post"}),t.onBeforeUnmount(()=>{h&&h.removeEventListener("scroll",m),y?.disconnect(),x?.disconnect(),X(v),X(p),typeof window<"u"&&window.clearTimeout(I),l.clear(),u.clear(),a.length=0}),{virtualItems:t.computed(()=>i.value),totalSize:t.computed(()=>r.value),scrollOffset:t.computed(()=>s.value),isScrolling:t.computed(()=>o.value),scrollToIndex:oe,scrollToOffset:W,measure:ae,measureElement:L}}function de(e,n,i){return typeof e=="function"?e(n,i):typeof e=="number"?e:48}function H(e){const n=A({count:()=>t.toValue(e.items).length,estimateSize:r=>{const s=t.toValue(e.items);return de(e.estimateSize,r,s[r])},getItemKey:r=>{const o=t.toValue(e.items)[r];return e.getItemKey?.(o,r)??r},itemSize:()=>e.itemSize!==void 0?t.toValue(e.itemSize):typeof e.estimateSize=="number"?e.estimateSize:void 0,container:e.container,horizontal:e.horizontal,overscan:e.overscan,gap:e.gap,paddingStart:e.paddingStart,paddingEnd:e.paddingEnd,initialRect:e.initialRect,viewportInset:e.viewportInset,revision:e.revision});return{virtualItems:t.computed(()=>{const r=t.toValue(e.items);return n.virtualItems.value.map(s=>{const o=r[s.index];return{...s,item:o,key:e.getItemKey?.(o,s.index)??s.key}})}),totalSize:n.totalSize,scrollOffset:n.scrollOffset,isScrolling:n.isScrolling,scrollToIndex:n.scrollToIndex,scrollToOffset:n.scrollToOffset,measure:n.measure,measureElement:n.measureElement}}function J(e,n,i){return typeof e=="function"?e(n):typeof e=="number"?e:i}function re(e){const n=t.computed(()=>Math.max(1,Math.floor(t.toValue(e.columnCount)||1))),i=t.computed(()=>Math.ceil(t.toValue(e.items).length/n.value)),r=new Map,s=A({count:()=>i.value,estimateSize:l=>J(t.toValue(e.estimateRowSize),l,48),itemSize:()=>{const l=t.toValue(e.estimateRowSize);return typeof l=="number"?l:void 0},overscan:()=>t.toValue(e.overscanRows)??t.toValue(e.overscan)??2,gap:()=>t.toValue(e.rowGap)??0,horizontal:!1,container:e.container,initialRect:e.initialRect,revision:e.revision}),o=A({count:()=>n.value,estimateSize:l=>J(t.toValue(e.estimateColumnSize),l,160),itemSize:()=>{const l=t.toValue(e.estimateColumnSize);return typeof l=="number"?l:void 0},overscan:()=>t.toValue(e.overscanColumns)??t.toValue(e.overscan)??1,gap:()=>t.toValue(e.columnGap)??0,horizontal:!0,container:e.container,initialRect:e.initialRect,revision:e.revision}),d=t.computed(()=>{const l=t.toValue(e.items),u=n.value,a=[];for(const f of s.virtualItems.value)for(const S of o.virtualItems.value){const C=f.index*u+S.index;if(C>=l.length)continue;const O=l[C];a.push({index:C,key:e.getItemKey?.(O,C)??C,item:O,row:f,column:S})}return a});function h(l,u){const a=t.toValue(e.items);if(!a.length)return;const f=Math.min(Math.max(l,0),a.length-1),S=n.value;s.scrollToIndex(Math.floor(f/S),u),o.scrollToIndex(f%S,u)}function y(l,u="auto"){l.top!==void 0&&s.scrollToOffset(l.top,u),l.left!==void 0&&o.scrollToOffset(l.left,u)}function x(l,u){const a=Math.max(r.get(l)??0,u);a<=0||a===r.get(l)||(r.set(l,a),s.measure(l,a))}let v=null;const p=new Map;function I(){return!F()||typeof ResizeObserver>"u"?null:(v||(v=new ResizeObserver(l=>{for(const u of l){const a=p.get(u.target);if(a===void 0)continue;const S=u.borderBoxSize?.[0]?.blockSize??u.contentRect.height;S>0&&x(a,S)}})),v)}function E(l,u){const a=ie(l),f=I();if(!a)return;p.set(a,u),f?.observe(a);const S=a.getBoundingClientRect().height;S>0&&x(u,S)}return t.onBeforeUnmount(()=>{v?.disconnect(),p.clear()}),{virtualRows:s.virtualItems,virtualColumns:o.virtualItems,virtualCells:d,totalHeight:s.totalSize,totalWidth:o.totalSize,scrollToIndex:h,scrollToOffset:y,measureRow:x,measureRowElement:E,measureColumn:o.measure}}function se(e){const n=H({items:e.rows,estimateSize:e.estimateRowSize,container:e.container,overscan:e.overscan,getItemKey:e.getRowKey,initialRect:e.initialRect,viewportInset:e.viewportInset,revision:e.revision,itemSize:e.itemSize}),i=t.computed(()=>{const o=t.toValue(e.columns);let d=0;return o.map(h=>{const y=h.width??h.minWidth??160,x={...h,start:d,size:y,end:d+y};return d+=y,x})}),r=t.computed(()=>{const o=i.value;return o.length?o[o.length-1]?.end??0:0});return{virtualRows:t.computed(()=>n.virtualItems.value),columns:i,totalHeight:n.totalSize,totalWidth:r,scrollOffset:n.scrollOffset,isScrolling:n.isScrolling,scrollToIndex:n.scrollToIndex,scrollToOffset:n.scrollToOffset,measure:n.measure,measureElement:n.measureElement}}function Q(e){if(typeof e=="number"&&Number.isFinite(e))return`${e}px`;if(typeof e=="string"&&e.trim())return e}function B(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return 0;const n=/^(-?\d+(?:\.\d+)?)px$/.exec(e.trim());if(!n?.[1])return 0;const i=Number(n[1]);return Number.isFinite(i)?i:0}function D(e){return{overflow:"auto",position:"relative",height:Q(e.height)??(e.horizontal?"100%":void 0),width:Q(e.width)??(e.horizontal?void 0:"100%"),overflowAnchor:"none"}}function fe(e,n){return{position:"relative",width:n?`${e}px`:"100%",height:n?"100%":`${e}px`}}function me(e,n){return{position:"absolute",top:0,left:0,width:n?void 0:"100%",height:n?"100%":void 0,transform:n?`translateX(${e}px)`:`translateY(${e}px)`}}const he=t.defineComponent({__name:"VirtualList",props:{items:{},estimateSize:{type:[Number,Function],default:48},height:{},width:{},horizontal:{type:Boolean,default:!1},overscan:{default:5},gap:{default:0},paddingStart:{default:0},paddingEnd:{default:0},getItemKey:{},tag:{default:"div"},itemTag:{default:"div"},itemAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),{virtualItems:s,totalSize:o,scrollToIndex:d,scrollToOffset:h,measure:y,measureElement:x}=H({items:()=>i.items,estimateSize:(l,u)=>{const a=i.estimateSize;return typeof a=="number"?a:a(l,u)},itemSize:()=>typeof i.estimateSize=="number"?i.estimateSize:void 0,container:r,horizontal:()=>i.horizontal,overscan:()=>i.overscan,gap:()=>i.gap,paddingStart:()=>i.paddingStart,paddingEnd:()=>i.paddingEnd,getItemKey:(l,u)=>i.getItemKey?.(l,u)??u,initialRect:()=>({width:B(i.width),height:B(i.height)}),revision:()=>i.revision}),v=t.computed(()=>D({height:i.height,width:i.width,horizontal:i.horizontal})),p=t.computed(()=>fe(o.value,i.horizontal));function I(l){return me(l,i.horizontal)}function E(l){return u=>{x(u,l)}}return n({scrollToIndex:d,scrollToOffset:h,measure:y}),(l,u)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"list",style:t.normalizeStyle(v.value)},{default:t.withCtx(()=>[e.items.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",style:t.normalizeStyle(p.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(s),a=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.itemTag),t.mergeProps({key:a.key,ref_for:!0,ref:E(a.index),role:"listitem","data-index":a.index,"data-key":String(a.key),"aria-setsize":e.items.length,"aria-posinset":a.index+1,style:I(a.start)},{ref_for:!0},e.itemAttrs),{default:t.withCtx(()=>[t.renderSlot(l.$slots,"default",{item:a.item,index:a.index,start:a.start,size:a.size,end:a.end})]),_:2},1040,["data-index","data-key","aria-setsize","aria-posinset","style"]))),128))],4)):t.renderSlot(l.$slots,"empty",{},void 0,void 0,0)]),_:3},8,["style"]))}}),ge=["data-index","data-key"],ve=t.defineComponent({__name:"VirtualGrid",props:{items:{},columnCount:{default:1},estimateRowSize:{type:[Number,Function],default:48},estimateColumnSize:{type:[Number,Function],default:160},height:{},width:{},overscan:{default:2},overscanRows:{},overscanColumns:{},rowGap:{default:0},columnGap:{default:0},getItemKey:{},tag:{default:"div"},itemAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),{virtualCells:s,totalWidth:o,totalHeight:d,scrollToIndex:h,scrollToOffset:y,measureRow:x,measureRowElement:v}=re({items:()=>i.items,columnCount:()=>i.columnCount,estimateRowSize:()=>i.estimateRowSize,estimateColumnSize:()=>i.estimateColumnSize,container:r,overscan:()=>i.overscan,overscanRows:()=>i.overscanRows,overscanColumns:()=>i.overscanColumns,rowGap:()=>i.rowGap,columnGap:()=>i.columnGap,getItemKey:(u,a)=>i.getItemKey?.(u,a)??a,initialRect:()=>({width:B(i.width),height:B(i.height)}),revision:()=>i.revision}),p=t.computed(()=>D({height:i.height,width:i.width,horizontal:!1})),I=t.computed(()=>({position:"relative",width:`${o.value}px`,height:`${d.value}px`}));function E(u){return a=>{v(a,u)}}function l(u,a,f){return{position:"absolute",top:0,left:0,width:`${a}px`,transform:`translate(${u}px, ${f}px)`}}return n({scrollToIndex:h,scrollToOffset:y,measureRow:x}),(u,a)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"grid",style:t.normalizeStyle(p.value)},{default:t.withCtx(()=>[e.items.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",style:t.normalizeStyle(I.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(s),f=>(t.openBlock(),t.createElementBlock("div",t.mergeProps({key:f.key,ref_for:!0,ref:E(f.row.index),role:"gridcell","data-index":f.index,"data-key":String(f.key),style:l(f.column.start,f.column.size,f.row.start)},{ref_for:!0},e.itemAttrs),[t.renderSlot(u.$slots,"default",{item:f.item,index:f.index,rowIndex:f.row.index,columnIndex:f.column.index,row:f.row,column:f.column})],16,ge))),128))],4)):t.renderSlot(u.$slots,"empty",{},void 0,void 0,0)]),_:3},8,["style"]))}}),Se=["data-index","data-key","aria-rowindex"],ze=t.defineComponent({__name:"VirtualTable",props:{rows:{},columns:{},estimateRowSize:{type:[Number,Function],default:44},height:{},width:{},overscan:{default:5},getRowKey:{},stickyHeader:{type:Boolean,default:!0},tag:{default:"div"},rowAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),s=t.ref(null),o=t.ref(0),{virtualRows:d,columns:h,totalWidth:y,totalHeight:x,scrollToIndex:v,scrollToOffset:p,measure:I,measureElement:E}=se({rows:()=>i.rows,columns:()=>i.columns,estimateRowSize:(m,b)=>{const g=i.estimateRowSize;return typeof g=="number"?g:g(m,b)},container:r,overscan:()=>i.overscan,getRowKey:(m,b)=>i.getRowKey?.(m,b)??b,initialRect:()=>({width:B(i.width),height:B(i.height)}),viewportInset:o,revision:()=>i.revision,itemSize:()=>typeof i.estimateRowSize=="number"?i.estimateRowSize:void 0});t.watch(s,(m,b,g)=>{if(b===m&&!m||!m||!F()||typeof ResizeObserver>"u")return;const R=()=>{o.value=m.getBoundingClientRect().height},L=new ResizeObserver(R);L.observe(m),R(),g(()=>L.disconnect())});const l=t.computed(()=>D({height:i.height,width:i.width,horizontal:!1})),u=t.computed(()=>({minWidth:`${y.value}px`})),a=t.computed(()=>({position:i.stickyHeader?"sticky":"relative",top:i.stickyHeader?"0px":void 0,zIndex:1,display:"flex",width:`${y.value}px`})),f=t.computed(()=>({position:"relative",height:`${x.value}px`,width:`${y.value}px`}));function S(m){return{width:`${m.size}px`,minWidth:`${m.size}px`,flex:"0 0 auto",textAlign:m.align??"left"}}function C(m){return{position:"absolute",top:0,left:0,width:"100%",display:"flex",transform:`translateY(${m}px)`}}function O(m){return b=>{E(b,m)}}function $(m,b,g){return b.accessor?b.accessor(m,g):m&&typeof m=="object"&&b.id in m?m[b.id]:""}return n({scrollToIndex:v,scrollToOffset:p,measure:I}),(m,b)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"table",style:t.normalizeStyle(l.value)},{default:t.withCtx(()=>[t.createElementVNode("div",{style:t.normalizeStyle(u.value)},[t.createElementVNode("div",{ref_key:"header",ref:s,role:"row",style:t.normalizeStyle(a.value)},[t.renderSlot(m.$slots,"header",{columns:t.unref(h)},()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(h),g=>(t.openBlock(),t.createElementBlock("div",{key:g.id,role:"columnheader",style:t.normalizeStyle(S(g))},t.toDisplayString(g.header),5))),128))])],4),e.rows.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",role:"rowgroup",style:t.normalizeStyle(f.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(d),g=>(t.openBlock(),t.createElementBlock("div",t.mergeProps({key:g.key,ref_for:!0,ref:O(g.index),role:"row","data-index":g.index,"data-key":String(g.key),"aria-rowindex":g.index+1,style:C(g.start)},{ref_for:!0},e.rowAttrs),[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(h),R=>(t.openBlock(),t.createElementBlock("div",{key:R.id,role:"cell",style:t.normalizeStyle(S(R))},[t.renderSlot(m.$slots,"cell",{row:g.item,column:R,rowIndex:g.index,value:$(g.item,R,g.index)},()=>[t.createTextVNode(t.toDisplayString($(g.item,R,g.index)),1)])],4))),128))],16,Se))),128))],4)):t.renderSlot(m.$slots,"empty",{},void 0,void 0,0)],4)]),_:3},8,["style"]))}});exports.MeasurementCache=Z;exports.VirtualGrid=ve;exports.VirtualList=he;exports.VirtualTable=ze;exports.Virtualizer=ne;exports.clampScrollOffset=G;exports.normalizeSize=K;exports.resolveScrollOffset=te;exports.useVirtualGrid=re;exports.useVirtualList=H;exports.useVirtualTable=se;exports.useVirtualizer=A;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue");function G(e){return!Number.isFinite(e)||e<0?0:e}class te{sizes=new Map;divergent=!1;get(n){return this.sizes.get(n)}set(n,i,r){this.sizes.set(n,i),r!==null&&Math.abs(i-r)>=.5&&(this.divergent=!0)}get hasDivergent(){return this.divergent}clear(){this.sizes.clear(),this.divergent=!1}trim(n,i){let r=!1;for(const s of this.sizes.keys())s>=n&&(this.sizes.delete(s),r=!0);if(r&&(this.divergent=!1,i!==null)){for(const s of this.sizes.values())if(Math.abs(s-i)>=.5){this.divergent=!0;return}}}}function ne(e,n,i){return Math.min(i,Math.max(n,e))}const ge=16777216;function B(e,n,i){const r=Math.max(0,n-Math.max(0,i));return ne(Number.isFinite(e)?e:0,0,r)}function C(e,n){const i=Math.max(0,Number.isFinite(e)?e:0),r=Math.min(i,ge);return n===void 0||!Number.isFinite(n)||n<=0?r:Math.min(r,n)}function ie(e,n,i,r){const s=Math.max(0,n-Math.max(0,r)),o=Math.max(0,i-Math.max(0,r));return s<=0?0:o<=0||o>=s?B(e,n,r):Math.max(0,e)/o*s}function re(e,n,i,r){const s=Math.max(0,n-Math.max(0,r)),o=Math.max(0,i-Math.max(0,r));return o<=0?0:s<=0||o>=s?B(e,n,r):B(e,n,r)/s*o}function ve(e,n,i){if(e<=0)return 0;let r=0,s=e-1,o=e-1;for(;r<=s;){const d=r+s>>>1;i(d)>n?(o=d,s=d-1):r=d+1}return o}function Se(e,n,i){if(e<=0)return 0;let r=0,s=e-1,o=0;for(;r<=s;){const d=r+s>>>1;i(d)<n?(o=d,r=d+1):s=d-1}return o}function se(e){const n=e.start+e.size;let i=e.align;if(i==="auto"){const r=e.current+e.viewport;if(e.start>=e.current&&n<=r)return e.current;i=e.start<e.current?"start":"end"}return i==="center"?e.start-(e.viewport-e.size)/2:i==="end"?n-e.viewport:e.start}class oe{count=0;estimateSize=()=>0;overscan=0;gap=0;paddingStart=0;paddingEnd=0;lanes=1;itemSize=null;viewportSize=0;scrollOffset=0;getItemKey=n=>n;measurements=new te;built=0;offsets=[];laneCursor=[];laneEnd=[];setOptions(n){const i=Math.max(1,Math.floor(n.lanes??1)),r=n.gap??0,s=n.paddingStart??0,o=n.paddingEnd??0,d=Math.max(0,Math.floor(n.count)),x=n.itemSize===void 0||n.itemSize===null?null:G(n.itemSize),p=this.itemSize,V=i!==this.lanes||r!==this.gap||s!==this.paddingStart||o!==this.paddingEnd||n.estimateSize!==this.estimateSize||x!==this.itemSize;this.count=d,this.lanes=i,this.gap=r,this.paddingStart=s,this.paddingEnd=o,this.overscan=Math.max(0,Math.floor(n.overscan??0)),this.estimateSize=n.estimateSize,this.itemSize=x,this.getItemKey=n.getItemKey??(y=>y),n.viewportSize!==void 0&&(this.viewportSize=Math.max(0,n.viewportSize)),x!==p&&this.measurements.clear(),this.measurements.trim(this.count,this.itemSize),(V||this.built>this.count)&&this.resetGeometry()}setScrollOffset(n){this.scrollOffset=Number.isFinite(n)?n:0}getScrollOffset(){return this.scrollOffset}getViewportSize(){return this.viewportSize}measure(n,i){if(n<0||n>=this.count)return!1;const r=G(i),s=this.measurements.get(n);if(s!==void 0&&Math.abs(s-r)<.5)return!1;const o=this.getItemSize(n);return this.measurements.set(n,r,this.itemSize),Math.abs(o-r)<.5?!1:(this.resetGeometry(),!0)}clearMeasurements(){this.measurements.clear(),this.resetGeometry()}getItemSize(n){const i=this.measurements.get(n);return i!==void 0?i:this.itemSize!==null?this.itemSize:G(this.estimateSize(n))}getItemOffset(n){if(n<=0||this.count<=0)return this.paddingStart;const i=Math.min(n,this.count-1);if(this.usesFixedPath()){const r=Math.floor(i/this.lanes);return this.paddingStart+r*((this.itemSize??0)+this.gap)}return this.ensure(i),this.offsets[i]??this.paddingStart}getTotalSize(){if(this.count<=0)return this.paddingStart+this.paddingEnd;if(this.usesFixedPath()){let i=this.paddingStart;const r=this.itemSize??0;for(let s=0;s<this.lanes&&s<this.count;s+=1){const o=this.laneLength(s),d=this.paddingStart+o*r+Math.max(0,o-1)*this.gap;d>i&&(i=d)}return i+this.paddingEnd}this.ensure(this.count-1);let n=this.paddingStart;for(let i=0;i<this.lanes&&i<this.count;i+=1){const r=this.laneEnd[i]??this.paddingStart;r>n&&(n=r)}return n+this.paddingEnd}getVirtualItems(){if(this.count<=0||this.viewportSize<=0)return[];const n=B(this.scrollOffset,this.getTotalSize(),this.viewportSize),i=n+this.viewportSize,r=[];for(let s=0;s<this.lanes;s+=1){const o=this.laneLength(s);if(o<=0)continue;const d=ve(o,n,y=>{const b=this.ordinalIndex(s,y);return this.getItemOffset(b)+this.getItemSize(b)}),x=Se(o,i,y=>this.getItemOffset(this.ordinalIndex(s,y))),p=Math.max(0,Math.min(d,x)-this.overscan),V=Math.min(o-1,Math.max(d,x)+this.overscan);for(let y=p;y<=V;y+=1){const b=this.ordinalIndex(s,y),I=this.getItemOffset(b),M=this.getItemSize(b);r.push({index:b,key:this.getItemKey(b),start:I,size:M,end:I+M,lane:s})}}return r.sort((s,o)=>s.index-o.index),r}getOffsetForIndex(n,i="auto"){if(this.count<=0)return 0;const r=ne(n,0,this.count-1),s=this.getItemOffset(r),o=this.getItemSize(r),d=se({start:s,size:o,viewport:this.viewportSize,current:this.scrollOffset,align:i});return B(d,this.getTotalSize(),this.viewportSize)}usesFixedPath(){return this.itemSize!==null&&!this.measurements.hasDivergent}ordinalIndex(n,i){return n+i*this.lanes}laneLength(n){return n<0||n>=this.lanes||n>=this.count?0:Math.floor((this.count-n-1)/this.lanes)+1}ensure(n){if(n<this.built)return;const i=Math.min(n,this.count-1);for(;this.built<=i;){const r=this.built%this.lanes,s=this.laneCursor[r]??this.paddingStart;this.offsets[this.built]=s;const o=s+this.getItemSize(this.built);this.laneEnd[r]=o,this.laneCursor[r]=o+this.gap,this.built+=1}}resetGeometry(){this.built=0,this.offsets=[],this.laneCursor=Array.from({length:this.lanes},()=>this.paddingStart),this.laneEnd=Array.from({length:this.lanes},()=>this.paddingStart)}}function L(){return typeof window<"u"&&typeof document<"u"}function ae(e){return typeof Element>"u"?null:e instanceof Element?e:null}function ze(e,n,i,r){if(r==="smooth"&&typeof e.scrollTo=="function"){e.scrollTo({top:i?e.scrollTop:n,left:i?n:e.scrollLeft,behavior:r});return}i?e.scrollLeft=n:e.scrollTop=n}function q(e,n){return n?e.scrollLeft:e.scrollTop}function U(e,n){return n?e.clientWidth:e.clientHeight}function ye(e,n){return n?e.scrollWidth:e.scrollHeight}function Z(e){return typeof requestAnimationFrame=="function"?requestAnimationFrame(e):setTimeout(e,0)}function J(e){e&&(typeof cancelAnimationFrame=="function"?cancelAnimationFrame(e):clearTimeout(e))}function pe(e,n){if(e.length!==n.length)return!1;for(let i=0;i<e.length;i+=1){const r=e[i],s=n[i];if(!r||!s||r.index!==s.index||r.start!==s.start||r.size!==s.size||r.end!==s.end||r.lane!==s.lane||r.key!==s.key)return!1}return!0}function N(e){const n=new oe,i=t.shallowRef([]),r=t.ref(0),s=t.ref(0),o=t.ref(0),d=t.ref(!1),x=a=>e.estimateSize(a);let p=null,V=null,y=null,b=0,I=0,M=0,u=t.toValue(e.revision);const c=new Map,m=new Map,l=[];function S(){const a=t.toValue(e.container);return typeof HTMLElement>"u"?null:a instanceof HTMLElement?a:null}function h(){return t.toValue(e.horizontal)??!1}function F(){const a=t.toValue(e.initialRect);return a?h()?a.width:a.height:0}function K(a,f){return a?C(f,ye(a,h())):C(f)}function $(a,f,g){return ie(q(a,h()),f,K(a,f),g)}function v(a,f,g,O,k){ze(a,re(f,g,K(a,g),O),h(),k)}function w(){const a=t.toValue(e.revision);Object.is(a,u)||(u=a,n.clearMeasurements());const f=S(),g=f?U(f,h()):0,O=t.toValue(e.viewportInset)??0,k=Math.max(0,(g>0?g:F())-O),T=t.toValue(e.itemSize);n.setOptions({count:t.toValue(e.count),estimateSize:x,overscan:t.toValue(e.overscan)??5,gap:t.toValue(e.gap)??0,paddingStart:t.toValue(e.paddingStart)??0,paddingEnd:t.toValue(e.paddingEnd)??0,lanes:t.toValue(e.lanes)??1,itemSize:T??null,getItemKey:e.getItemKey,viewportSize:k});const R=n.getTotalSize(),D=Math.max(0,R-k);n.getScrollOffset()>D&&(n.setScrollOffset(D),f&&v(f,D,R,k,"auto"));const X=n.getVirtualItems();pe(i.value,X)||(i.value=X),r.value!==R&&(r.value=R);const P=n.getScrollOffset();s.value!==P&&(s.value=P);const Y=f?P-q(f,h()):0;o.value!==Y&&(o.value=Y)}function z(){if(!L()){w();return}b||(b=Z(()=>{b=0,d.value=!0,w(),typeof window<"u"&&(window.clearTimeout(M),M=window.setTimeout(()=>{d.value=!1},150))}))}function E(){const a=S();if(!a)return;const f=n.getViewportSize(),g=n.getTotalSize();n.setScrollOffset($(a,g,f)),z()}function j(){const a=S();if(a===p||(p&&(p.removeEventListener("scroll",E),V?.disconnect(),V=null),p=a,!a||!L()))return;const f=n.getViewportSize(),g=n.getTotalSize();n.getScrollOffset()>0?v(a,n.getScrollOffset(),g,f,"auto"):n.setScrollOffset($(a,g,f)),a.addEventListener("scroll",E,{passive:!0}),typeof ResizeObserver<"u"&&(V=new ResizeObserver(()=>w()),V.observe(a))}function ce(){return!L()||typeof ResizeObserver>"u"?null:(y||(y=new ResizeObserver(a=>{const f=h();let g=!1;for(const O of a){const k=c.get(O.target);if(k===void 0)continue;const T=O.borderBoxSize?.[0],R=f?T?.inlineSize??O.contentRect.width:T?.blockSize??O.contentRect.height;R>0&&n.measure(k,R)&&(g=!0)}g&&w()})),y)}function fe(){I=0;const a=l.splice(0,l.length),f=h();let g=!1;for(const O of a){if(!O.element.isConnected)continue;const k=O.element.getBoundingClientRect(),T=f?k.width:k.height;T>0&&n.measure(O.index,T)&&(g=!0)}g&&w()}function de(a,f){const g=ae(a),O=ce(),k=m.get(f);k&&k!==g&&(O?.unobserve(k),c.delete(k),m.delete(f)),g&&(m.set(f,g),c.set(g,f),O?.observe(g),l.push({element:g,index:f}),!I&&(I=Z(fe)))}function _(a,f="auto"){const g=S(),O=g?U(g,h()):0,k=O>0?O:n.getViewportSize(),T=n.getTotalSize(),R=B(a,T,k);n.setScrollOffset(R),g&&v(g,R,T,k,f),w()}function me(a,f){const g=n.getOffsetForIndex(a,f?.align??"auto");_(g,f?.behavior??"auto")}function he(a,f){n.measure(a,f)&&w()}return w(),t.watch(()=>[t.toValue(e.count),t.toValue(e.overscan),t.toValue(e.gap),t.toValue(e.paddingStart),t.toValue(e.paddingEnd),t.toValue(e.lanes),t.toValue(e.horizontal),t.toValue(e.itemSize),t.toValue(e.viewportInset),t.toValue(e.revision),t.toValue(e.container),t.toValue(e.initialRect)?.width,t.toValue(e.initialRect)?.height],()=>{j(),w()},{flush:"post"}),t.onBeforeUnmount(()=>{p&&p.removeEventListener("scroll",E),V?.disconnect(),y?.disconnect(),J(b),J(I),typeof window<"u"&&window.clearTimeout(M),c.clear(),m.clear(),l.length=0}),{virtualItems:t.computed(()=>i.value),totalSize:t.computed(()=>r.value),scrollOffset:t.computed(()=>s.value),scrollAdjust:t.computed(()=>o.value),isScrolling:t.computed(()=>d.value),scrollToIndex:me,scrollToOffset:_,measure:he,measureElement:de}}function we(e,n,i){return typeof e=="function"?e(n,i):typeof e=="number"?e:48}function H(e){const n=N({count:()=>t.toValue(e.items).length,estimateSize:r=>{const s=t.toValue(e.items);return we(e.estimateSize,r,s[r])},getItemKey:r=>{const o=t.toValue(e.items)[r];return e.getItemKey?.(o,r)??r},itemSize:()=>e.itemSize!==void 0?t.toValue(e.itemSize):typeof e.estimateSize=="number"?e.estimateSize:void 0,container:e.container,horizontal:e.horizontal,overscan:e.overscan,gap:e.gap,paddingStart:e.paddingStart,paddingEnd:e.paddingEnd,initialRect:e.initialRect,viewportInset:e.viewportInset,revision:e.revision});return{virtualItems:t.computed(()=>{const r=t.toValue(e.items);return n.virtualItems.value.map(s=>{const o=r[s.index];return{...s,item:o,key:e.getItemKey?.(o,s.index)??s.key}})}),totalSize:n.totalSize,scrollOffset:n.scrollOffset,scrollAdjust:n.scrollAdjust,isScrolling:n.isScrolling,scrollToIndex:n.scrollToIndex,scrollToOffset:n.scrollToOffset,measure:n.measure,measureElement:n.measureElement}}function Q(e,n,i){return typeof e=="function"?e(n):typeof e=="number"?e:i}function le(e){const n=t.computed(()=>Math.max(1,Math.floor(t.toValue(e.columnCount)||1))),i=t.computed(()=>Math.ceil(t.toValue(e.items).length/n.value)),r=new Map,s=N({count:()=>i.value,estimateSize:u=>Q(t.toValue(e.estimateRowSize),u,48),itemSize:()=>{const u=t.toValue(e.estimateRowSize);return typeof u=="number"?u:void 0},overscan:()=>t.toValue(e.overscanRows)??t.toValue(e.overscan)??2,gap:()=>t.toValue(e.rowGap)??0,horizontal:!1,container:e.container,initialRect:e.initialRect,revision:e.revision}),o=N({count:()=>n.value,estimateSize:u=>Q(t.toValue(e.estimateColumnSize),u,160),itemSize:()=>{const u=t.toValue(e.estimateColumnSize);return typeof u=="number"?u:void 0},overscan:()=>t.toValue(e.overscanColumns)??t.toValue(e.overscan)??1,gap:()=>t.toValue(e.columnGap)??0,horizontal:!0,container:e.container,initialRect:e.initialRect,revision:e.revision}),d=t.computed(()=>{const u=t.toValue(e.items),c=n.value,m=[];for(const l of s.virtualItems.value)for(const S of o.virtualItems.value){const h=l.index*c+S.index;if(h>=u.length)continue;const F=u[h];m.push({index:h,key:e.getItemKey?.(F,h)??h,item:F,row:l,column:S})}return m});function x(u,c){const m=t.toValue(e.items);if(!m.length)return;const l=Math.min(Math.max(u,0),m.length-1),S=n.value;s.scrollToIndex(Math.floor(l/S),c),o.scrollToIndex(l%S,c)}function p(u,c="auto"){u.top!==void 0&&s.scrollToOffset(u.top,c),u.left!==void 0&&o.scrollToOffset(u.left,c)}function V(u,c){const m=Math.max(r.get(u)??0,c);m<=0||m===r.get(u)||(r.set(u,m),s.measure(u,m))}let y=null;const b=new Map;function I(){return!L()||typeof ResizeObserver>"u"?null:(y||(y=new ResizeObserver(u=>{for(const c of u){const m=b.get(c.target);if(m===void 0)continue;const S=c.borderBoxSize?.[0]?.blockSize??c.contentRect.height;S>0&&V(m,S)}})),y)}function M(u,c){const m=ae(u),l=I();if(!m)return;b.set(m,c),l?.observe(m);const S=m.getBoundingClientRect().height;S>0&&V(c,S)}return t.onBeforeUnmount(()=>{y?.disconnect(),b.clear()}),{virtualRows:s.virtualItems,virtualColumns:o.virtualItems,virtualCells:d,totalHeight:s.totalSize,totalWidth:o.totalSize,scrollAdjustX:o.scrollAdjust,scrollAdjustY:s.scrollAdjust,scrollToIndex:x,scrollToOffset:p,measureRow:V,measureRowElement:M,measureColumn:o.measure}}function ue(e){const n=H({items:e.rows,estimateSize:e.estimateRowSize,container:e.container,overscan:e.overscan,getItemKey:e.getRowKey,initialRect:e.initialRect,viewportInset:e.viewportInset,revision:e.revision,itemSize:e.itemSize}),i=t.computed(()=>{const o=t.toValue(e.columns);let d=0;return o.map(x=>{const p=x.width??x.minWidth??160,V={...x,start:d,size:p,end:d+p};return d+=p,V})}),r=t.computed(()=>{const o=i.value;return o.length?o[o.length-1]?.end??0:0});return{virtualRows:t.computed(()=>n.virtualItems.value),columns:i,totalHeight:n.totalSize,totalWidth:r,scrollOffset:n.scrollOffset,scrollAdjust:n.scrollAdjust,isScrolling:n.isScrolling,scrollToIndex:n.scrollToIndex,scrollToOffset:n.scrollToOffset,measure:n.measure,measureElement:n.measureElement}}function ee(e){if(typeof e=="number"&&Number.isFinite(e))return`${e}px`;if(typeof e=="string"&&e.trim())return e}function A(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return 0;const n=/^(-?\d+(?:\.\d+)?)px$/.exec(e.trim());if(!n?.[1])return 0;const i=Number(n[1]);return Number.isFinite(i)?i:0}function W(e){return{overflow:"auto",position:"relative",height:ee(e.height)??(e.horizontal?"100%":void 0),width:ee(e.width)??(e.horizontal?void 0:"100%"),overflowAnchor:"none"}}function xe(e,n){const i=C(e);return{position:"relative",width:n?`${i}px`:"100%",height:n?"100%":`${i}px`}}function be(e,n){return{position:"absolute",top:0,left:0,width:n?void 0:"100%",height:n?"100%":void 0,transform:n?`translateX(${e}px)`:`translateY(${e}px)`}}const Ve=t.defineComponent({__name:"VirtualList",props:{items:{},estimateSize:{type:[Number,Function],default:48},height:{},width:{},horizontal:{type:Boolean,default:!1},overscan:{default:5},gap:{default:0},paddingStart:{default:0},paddingEnd:{default:0},getItemKey:{},tag:{default:"div"},itemTag:{default:"div"},itemAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),{virtualItems:s,totalSize:o,scrollAdjust:d,scrollToIndex:x,scrollToOffset:p,measure:V,measureElement:y}=H({items:()=>i.items,estimateSize:(c,m)=>{const l=i.estimateSize;return typeof l=="number"?l:l(c,m)},itemSize:()=>typeof i.estimateSize=="number"?i.estimateSize:void 0,container:r,horizontal:()=>i.horizontal,overscan:()=>i.overscan,gap:()=>i.gap,paddingStart:()=>i.paddingStart,paddingEnd:()=>i.paddingEnd,getItemKey:(c,m)=>i.getItemKey?.(c,m)??m,initialRect:()=>({width:A(i.width),height:A(i.height)}),revision:()=>i.revision}),b=t.computed(()=>W({height:i.height,width:i.width,horizontal:i.horizontal})),I=t.computed(()=>xe(o.value,i.horizontal));function M(c){return be(c,i.horizontal)}function u(c){return m=>{y(m,c)}}return n({scrollToIndex:x,scrollToOffset:p,measure:V}),(c,m)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"list",style:t.normalizeStyle(b.value)},{default:t.withCtx(()=>[e.items.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",style:t.normalizeStyle(I.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(s),l=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.itemTag),t.mergeProps({key:l.key,ref_for:!0,ref:u(l.index),role:"listitem","data-index":l.index,"data-key":String(l.key),"aria-setsize":e.items.length,"aria-posinset":l.index+1,style:M(l.start-t.unref(d))},{ref_for:!0},e.itemAttrs),{default:t.withCtx(()=>[t.renderSlot(c.$slots,"default",{item:l.item,index:l.index,start:l.start,size:l.size,end:l.end})]),_:2},1040,["data-index","data-key","aria-setsize","aria-posinset","style"]))),128))],4)):t.renderSlot(c.$slots,"empty",{},void 0,void 0,0)]),_:3},8,["style"]))}}),ke=["data-index","data-key"],Oe=t.defineComponent({__name:"VirtualGrid",props:{items:{},columnCount:{default:1},estimateRowSize:{type:[Number,Function],default:48},estimateColumnSize:{type:[Number,Function],default:160},height:{},width:{},overscan:{default:2},overscanRows:{},overscanColumns:{},rowGap:{default:0},columnGap:{default:0},getItemKey:{},tag:{default:"div"},itemAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),{virtualCells:s,totalWidth:o,totalHeight:d,scrollAdjustX:x,scrollAdjustY:p,scrollToIndex:V,scrollToOffset:y,measureRow:b,measureRowElement:I}=le({items:()=>i.items,columnCount:()=>i.columnCount,estimateRowSize:()=>i.estimateRowSize,estimateColumnSize:()=>i.estimateColumnSize,container:r,overscan:()=>i.overscan,overscanRows:()=>i.overscanRows,overscanColumns:()=>i.overscanColumns,rowGap:()=>i.rowGap,columnGap:()=>i.columnGap,getItemKey:(l,S)=>i.getItemKey?.(l,S)??S,initialRect:()=>({width:A(i.width),height:A(i.height)}),revision:()=>i.revision}),M=t.computed(()=>W({height:i.height,width:i.width,horizontal:!1})),u=t.computed(()=>({position:"relative",width:`${C(o.value)}px`,height:`${C(d.value)}px`}));function c(l){return S=>{I(S,l)}}function m(l,S,h){return{position:"absolute",top:0,left:0,width:`${S}px`,transform:`translate(${l}px, ${h}px)`}}return n({scrollToIndex:V,scrollToOffset:y,measureRow:b}),(l,S)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"grid",style:t.normalizeStyle(M.value)},{default:t.withCtx(()=>[e.items.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",style:t.normalizeStyle(u.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(s),h=>(t.openBlock(),t.createElementBlock("div",t.mergeProps({key:h.key,ref_for:!0,ref:c(h.row.index),role:"gridcell","data-index":h.index,"data-key":String(h.key),style:m(h.column.start-t.unref(x),h.column.size,h.row.start-t.unref(p))},{ref_for:!0},e.itemAttrs),[t.renderSlot(l.$slots,"default",{item:h.item,index:h.index,rowIndex:h.row.index,columnIndex:h.column.index,row:h.row,column:h.column})],16,ke))),128))],4)):t.renderSlot(l.$slots,"empty",{},void 0,void 0,0)]),_:3},8,["style"]))}}),Ie=["data-index","data-key","aria-rowindex"],Me=t.defineComponent({__name:"VirtualTable",props:{rows:{},columns:{},estimateRowSize:{type:[Number,Function],default:44},height:{},width:{},overscan:{default:5},getRowKey:{},stickyHeader:{type:Boolean,default:!0},tag:{default:"div"},rowAttrs:{},revision:{}},setup(e,{expose:n}){const i=e,r=t.ref(null),s=t.ref(null),o=t.ref(0),{virtualRows:d,columns:x,totalWidth:p,totalHeight:V,scrollAdjust:y,scrollToIndex:b,scrollToOffset:I,measure:M,measureElement:u}=ue({rows:()=>i.rows,columns:()=>i.columns,estimateRowSize:(v,w)=>{const z=i.estimateRowSize;return typeof z=="number"?z:z(v,w)},container:r,overscan:()=>i.overscan,getRowKey:(v,w)=>i.getRowKey?.(v,w)??w,initialRect:()=>({width:A(i.width),height:A(i.height)}),viewportInset:o,revision:()=>i.revision,itemSize:()=>typeof i.estimateRowSize=="number"?i.estimateRowSize:void 0});t.watch(s,(v,w,z)=>{if(w===v&&!v||!v||!L()||typeof ResizeObserver>"u")return;const E=()=>{o.value=v.getBoundingClientRect().height},j=new ResizeObserver(E);j.observe(v),E(),z(()=>j.disconnect())});const c=t.computed(()=>W({height:i.height,width:i.width,horizontal:!1})),m=t.computed(()=>({minWidth:`${p.value}px`})),l=t.computed(()=>({position:i.stickyHeader?"sticky":"relative",top:i.stickyHeader?"0px":void 0,zIndex:1,display:"flex",width:`${p.value}px`})),S=t.computed(()=>({position:"relative",height:`${C(V.value)}px`,width:`${C(p.value)}px`}));function h(v){return{width:`${v.size}px`,minWidth:`${v.size}px`,flex:"0 0 auto",textAlign:v.align??"left"}}function F(v){return{position:"absolute",top:0,left:0,width:"100%",display:"flex",transform:`translateY(${v}px)`}}function K(v){return w=>{u(w,v)}}function $(v,w,z){return w.accessor?w.accessor(v,z):v&&typeof v=="object"&&w.id in v?v[w.id]:""}return n({scrollToIndex:b,scrollToOffset:I,measure:M}),(v,w)=>(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.tag),{ref_key:"container",ref:r,"data-virtual-container":"",role:"table",style:t.normalizeStyle(c.value)},{default:t.withCtx(()=>[t.createElementVNode("div",{style:t.normalizeStyle(m.value)},[t.createElementVNode("div",{ref_key:"header",ref:s,role:"row",style:t.normalizeStyle(l.value)},[t.renderSlot(v.$slots,"header",{columns:t.unref(x)},()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(x),z=>(t.openBlock(),t.createElementBlock("div",{key:z.id,role:"columnheader",style:t.normalizeStyle(h(z))},t.toDisplayString(z.header),5))),128))])],4),e.rows.length?(t.openBlock(),t.createElementBlock("div",{key:1,"data-virtual-spacer":"",role:"rowgroup",style:t.normalizeStyle(S.value)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(d),z=>(t.openBlock(),t.createElementBlock("div",t.mergeProps({key:z.key,ref_for:!0,ref:K(z.index),role:"row","data-index":z.index,"data-key":String(z.key),"aria-rowindex":z.index+1,style:F(z.start-t.unref(y))},{ref_for:!0},e.rowAttrs),[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(x),E=>(t.openBlock(),t.createElementBlock("div",{key:E.id,role:"cell",style:t.normalizeStyle(h(E))},[t.renderSlot(v.$slots,"cell",{row:z.item,column:E,rowIndex:z.index,value:$(z.item,E,z.index)},()=>[t.createTextVNode(t.toDisplayString($(z.item,E,z.index)),1)])],4))),128))],16,Ie))),128))],4)):t.renderSlot(v.$slots,"empty",{},void 0,void 0,0)],4)]),_:3},8,["style"]))}});exports.MeasurementCache=te;exports.VirtualGrid=Oe;exports.VirtualList=Ve;exports.VirtualTable=Me;exports.Virtualizer=oe;exports.clampScrollOffset=B;exports.mapDomOffsetToVirtual=ie;exports.mapVirtualOffsetToDom=re;exports.normalizeSize=G;exports.resolveScrollOffset=se;exports.scrollContentSize=C;exports.useVirtualGrid=le;exports.useVirtualList=H;exports.useVirtualTable=ue;exports.useVirtualizer=N;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
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","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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"}
|
|
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","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 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 './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 readContentSize(element: HTMLElement, horizontal: boolean): number {\n return horizontal ? element.scrollWidth : element.scrollHeight\n}\n\nexport function scheduleFrame(callback: () => void): number {\n if (typeof requestAnimationFrame === 'function') return requestAnimationFrame(callback)\n return setTimeout(callback, 0) as unknown as number\n}\n\nexport function cancelFrame(id: number): void {\n if (!id) return\n if (typeof cancelAnimationFrame === 'function') cancelAnimationFrame(id)\n else clearTimeout(id)\n}\n","import type { VirtualItem } from '../core/types'\n\nexport function sameVirtualItems(\n left: readonly VirtualItem[],\n right: readonly VirtualItem[],\n): boolean {\n if (left.length !== right.length) return false\n for (let index = 0; index < left.length; index += 1) {\n const previous = left[index]\n const next = right[index]\n if (!previous || !next) return false\n if (\n previous.index !== next.index ||\n previous.start !== next.start ||\n previous.size !== next.size ||\n previous.end !== next.end ||\n previous.lane !== next.lane ||\n previous.key !== next.key\n ) {\n return false\n }\n }\n return true\n}\n","import {\n computed,\n onBeforeUnmount,\n ref,\n shallowRef,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from 'vue'\nimport { Virtualizer } from '../core/virtualizer'\nimport type { ScrollToIndexOptions, VirtualItem } from '../core/types'\nimport {\n asElement,\n cancelFrame,\n isBrowser,\n readContentSize,\n readScroll,\n readViewport,\n scheduleFrame,\n writeScroll,\n} from '../utils/dom'\nimport { sameVirtualItems } from '../utils/same-items'\nimport {\n clampScrollOffset,\n mapDomOffsetToVirtual,\n mapVirtualOffsetToDom,\n scrollContentSize,\n} from '../core/scrolling'\n\nexport interface UseVirtualizerOptions {\n count: MaybeRefOrGetter<number>\n estimateSize: (index: number) => number\n container?: MaybeRefOrGetter<HTMLElement | null | undefined>\n horizontal?: MaybeRefOrGetter<boolean>\n overscan?: MaybeRefOrGetter<number>\n gap?: MaybeRefOrGetter<number>\n paddingStart?: MaybeRefOrGetter<number>\n paddingEnd?: MaybeRefOrGetter<number>\n lanes?: MaybeRefOrGetter<number>\n itemSize?: MaybeRefOrGetter<number | null | undefined>\n getItemKey?: (index: number) => string | number\n initialRect?: MaybeRefOrGetter<{ width: number; height: number } | undefined>\n viewportInset?: MaybeRefOrGetter<number>\n revision?: MaybeRefOrGetter<unknown>\n}\n\nexport function useVirtualizer(options: UseVirtualizerOptions) {\n const engine = new Virtualizer()\n const virtualItems = shallowRef<VirtualItem[]>([])\n const totalSize = ref(0)\n const scrollOffset = ref(0)\n const scrollAdjust = ref(0)\n const isScrolling = ref(false)\n const estimateSize = (index: number) => options.estimateSize(index)\n let listeningEl: HTMLElement | null = null\n let resizeObserver: ResizeObserver | null = null\n let itemObserver: ResizeObserver | null = null\n let 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 contentSize(element: HTMLElement | null, total: number): number {\n if (!element) return scrollContentSize(total)\n return scrollContentSize(total, readContentSize(element, horizontal()))\n }\n\n function readVirtualOffset(element: HTMLElement, total: number, viewport: number): number {\n return mapDomOffsetToVirtual(\n readScroll(element, horizontal()),\n total,\n contentSize(element, total),\n viewport,\n )\n }\n\n function writeVirtualOffset(\n element: HTMLElement,\n offset: number,\n total: number,\n viewport: number,\n behavior: ScrollBehavior,\n ): void {\n writeScroll(\n element,\n mapVirtualOffsetToDom(offset, total, contentSize(element, total), viewport),\n horizontal(),\n behavior,\n )\n }\n\n function publish(): void {\n const revision = toValue(options.revision)\n if (!Object.is(revision, seenRevision)) {\n seenRevision = revision\n engine.clearMeasurements()\n }\n const element = currentElement()\n const measured = element ? readViewport(element, horizontal()) : 0\n const inset = toValue(options.viewportInset) ?? 0\n const viewport = Math.max(0, (measured > 0 ? measured : viewportFallback()) - inset)\n const itemSize = toValue(options.itemSize)\n engine.setOptions({\n count: toValue(options.count),\n estimateSize,\n overscan: toValue(options.overscan) ?? 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 nextTotal = engine.getTotalSize()\n const maxOffset = Math.max(0, nextTotal - viewport)\n if (engine.getScrollOffset() > maxOffset) {\n engine.setScrollOffset(maxOffset)\n if (element) writeVirtualOffset(element, maxOffset, nextTotal, viewport, 'auto')\n }\n const items = engine.getVirtualItems()\n if (!sameVirtualItems(virtualItems.value, items)) virtualItems.value = items\n if (totalSize.value !== nextTotal) totalSize.value = nextTotal\n const nextOffset = engine.getScrollOffset()\n if (scrollOffset.value !== nextOffset) scrollOffset.value = nextOffset\n const nextAdjust = element ? nextOffset - readScroll(element, horizontal()) : 0\n if (scrollAdjust.value !== nextAdjust) scrollAdjust.value = nextAdjust\n }\n\n function 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 const viewport = engine.getViewportSize()\n const total = engine.getTotalSize()\n engine.setScrollOffset(readVirtualOffset(element, total, viewport))\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 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 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 total = engine.getTotalSize()\n const next = clampScrollOffset(offset, total, viewport)\n engine.setScrollOffset(next)\n if (element) writeVirtualOffset(element, next, total, viewport, behavior)\n publish()\n }\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const offset = engine.getOffsetForIndex(index, scrollOptions?.align ?? 'auto')\n scrollToOffset(offset, scrollOptions?.behavior ?? 'auto')\n }\n\n function measure(index: number, size: number): void {\n if (engine.measure(index, size)) publish()\n }\n\n publish()\n\n watch(\n () => [\n toValue(options.count),\n toValue(options.overscan),\n toValue(options.gap),\n toValue(options.paddingStart),\n toValue(options.paddingEnd),\n toValue(options.lanes),\n toValue(options.horizontal),\n toValue(options.itemSize),\n toValue(options.viewportInset),\n toValue(options.revision),\n toValue(options.container),\n toValue(options.initialRect)?.width,\n toValue(options.initialRect)?.height,\n ],\n () => {\n bindContainer()\n publish()\n },\n { flush: 'post' },\n )\n\n onBeforeUnmount(() => {\n if (listeningEl) listeningEl.removeEventListener('scroll', onScroll)\n resizeObserver?.disconnect()\n itemObserver?.disconnect()\n cancelFrame(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 scrollAdjust: computed(() => scrollAdjust.value),\n isScrolling: computed(() => isScrolling.value),\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { VirtualItem } from '../core/types'\nimport { useVirtualizer, type UseVirtualizerOptions } from './useVirtualizer'\n\nexport interface VirtualListItem<T> extends VirtualItem {\n item: T\n}\n\nexport interface UseVirtualListOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n estimateSize?: number | ((index: number, item: T) => number)\n container?: UseVirtualizerOptions['container']\n horizontal?: UseVirtualizerOptions['horizontal']\n overscan?: UseVirtualizerOptions['overscan']\n gap?: UseVirtualizerOptions['gap']\n paddingStart?: UseVirtualizerOptions['paddingStart']\n paddingEnd?: UseVirtualizerOptions['paddingEnd']\n itemSize?: UseVirtualizerOptions['itemSize']\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n viewportInset?: UseVirtualizerOptions['viewportInset']\n revision?: UseVirtualizerOptions['revision']\n}\n\nfunction resolveEstimate<T>(\n estimate: UseVirtualListOptions<T>['estimateSize'],\n index: number,\n item: T,\n): number {\n if (typeof estimate === 'function') return estimate(index, item)\n if (typeof estimate === 'number') return estimate\n return 48\n}\n\nexport function useVirtualList<T>(options: UseVirtualListOptions<T>) {\n const virtualizer = useVirtualizer({\n count: () => toValue(options.items).length,\n estimateSize: (index) => {\n const source = toValue(options.items)\n return resolveEstimate(options.estimateSize, index, source[index] as T)\n },\n getItemKey: (index) => {\n const source = toValue(options.items)\n const item = source[index] as T\n return options.getItemKey?.(item, index) ?? index\n },\n itemSize: () => {\n if (options.itemSize !== undefined) return toValue(options.itemSize)\n return typeof options.estimateSize === 'number' ? options.estimateSize : undefined\n },\n container: options.container,\n horizontal: options.horizontal,\n overscan: options.overscan,\n gap: options.gap,\n paddingStart: options.paddingStart,\n paddingEnd: options.paddingEnd,\n initialRect: options.initialRect,\n viewportInset: options.viewportInset,\n revision: options.revision,\n })\n\n const virtualItems = computed<VirtualListItem<T>[]>(() => {\n const source = toValue(options.items)\n return virtualizer.virtualItems.value.map((virtual) => {\n const item = source[virtual.index] as T\n return {\n ...virtual,\n item,\n key: options.getItemKey?.(item, virtual.index) ?? virtual.key,\n }\n })\n })\n\n return {\n virtualItems,\n totalSize: virtualizer.totalSize,\n scrollOffset: virtualizer.scrollOffset,\n scrollAdjust: virtualizer.scrollAdjust,\n isScrolling: virtualizer.isScrolling,\n scrollToIndex: virtualizer.scrollToIndex,\n scrollToOffset: virtualizer.scrollToOffset,\n measure: virtualizer.measure,\n measureElement: virtualizer.measureElement,\n }\n}\n","import { computed, onBeforeUnmount, toValue, type MaybeRefOrGetter } from 'vue'\nimport type { ScrollToIndexOptions, VirtualItem } from '../core/types'\nimport { asElement, isBrowser } from '../utils/dom'\nimport { useVirtualizer, type UseVirtualizerOptions } from './useVirtualizer'\n\nexport interface VirtualGridCell<T> {\n index: number\n key: string | number\n item: T\n row: VirtualItem\n column: VirtualItem\n}\n\nexport interface UseVirtualGridOptions<T> {\n items: MaybeRefOrGetter<readonly T[]>\n columnCount: MaybeRefOrGetter<number>\n estimateRowSize?: MaybeRefOrGetter<number | ((rowIndex: number) => number)>\n estimateColumnSize?: MaybeRefOrGetter<number | ((columnIndex: number) => number)>\n container?: UseVirtualizerOptions['container']\n overscan?: MaybeRefOrGetter<number | undefined>\n overscanRows?: MaybeRefOrGetter<number | undefined>\n overscanColumns?: MaybeRefOrGetter<number | undefined>\n rowGap?: MaybeRefOrGetter<number | undefined>\n columnGap?: MaybeRefOrGetter<number | undefined>\n getItemKey?: (item: T, index: number) => string | number\n initialRect?: UseVirtualizerOptions['initialRect']\n revision?: UseVirtualizerOptions['revision']\n}\n\nfunction resolveSize(\n estimate: number | ((index: number) => number) | undefined,\n index: number,\n fallback: number,\n): number {\n if (typeof estimate === 'function') return estimate(index)\n if (typeof estimate === 'number') return estimate\n return fallback\n}\n\nexport function useVirtualGrid<T>(options: UseVirtualGridOptions<T>) {\n const columnCount = computed(() => Math.max(1, Math.floor(toValue(options.columnCount) || 1)))\n const rowCount = computed(() => Math.ceil(toValue(options.items).length / columnCount.value))\n const rowSizes = new Map<number, number>()\n\n const rows = useVirtualizer({\n count: () => rowCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateRowSize), index, 48),\n itemSize: () => {\n const estimate = toValue(options.estimateRowSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanRows) ?? toValue(options.overscan) ?? 2,\n gap: () => toValue(options.rowGap) ?? 0,\n horizontal: false,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n })\n\n const columns = useVirtualizer({\n count: () => columnCount.value,\n estimateSize: (index) => resolveSize(toValue(options.estimateColumnSize), index, 160),\n itemSize: () => {\n const estimate = toValue(options.estimateColumnSize)\n return typeof estimate === 'number' ? estimate : undefined\n },\n overscan: () => toValue(options.overscanColumns) ?? toValue(options.overscan) ?? 1,\n gap: () => toValue(options.columnGap) ?? 0,\n horizontal: true,\n container: options.container,\n initialRect: options.initialRect,\n revision: options.revision,\n })\n\n const virtualCells = computed<VirtualGridCell<T>[]>(() => {\n const source = toValue(options.items)\n const perRow = columnCount.value\n const cells: VirtualGridCell<T>[] = []\n for (const row of rows.virtualItems.value) {\n for (const column of columns.virtualItems.value) {\n const index = row.index * perRow + column.index\n if (index >= source.length) continue\n const item = source[index] as T\n cells.push({\n index,\n key: options.getItemKey?.(item, index) ?? index,\n item,\n row,\n column,\n })\n }\n }\n return cells\n })\n\n function scrollToIndex(index: number, scrollOptions?: ScrollToIndexOptions): void {\n const source = toValue(options.items)\n if (!source.length) return\n const safe = Math.min(Math.max(index, 0), source.length - 1)\n const perRow = columnCount.value\n rows.scrollToIndex(Math.floor(safe / perRow), scrollOptions)\n columns.scrollToIndex(safe % perRow, scrollOptions)\n }\n\n function scrollToOffset(\n offset: { top?: number; left?: number },\n behavior: ScrollBehavior = 'auto',\n ): void {\n if (offset.top !== undefined) rows.scrollToOffset(offset.top, behavior)\n if (offset.left !== undefined) columns.scrollToOffset(offset.left, behavior)\n }\n\n function measureRow(rowIndex: number, size: number): void {\n const next = Math.max(rowSizes.get(rowIndex) ?? 0, size)\n if (next <= 0 || next === rowSizes.get(rowIndex)) return\n rowSizes.set(rowIndex, next)\n rows.measure(rowIndex, next)\n }\n\n let rowObserver: ResizeObserver | null = null\n const observedRows = new Map<Element, number>()\n\n function ensureRowObserver(): ResizeObserver | null {\n if (!isBrowser() || typeof ResizeObserver === 'undefined') return null\n if (!rowObserver) {\n rowObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const rowIndex = observedRows.get(entry.target)\n if (rowIndex === undefined) continue\n const box = entry.borderBoxSize?.[0]\n const size = box?.blockSize ?? entry.contentRect.height\n if (size > 0) measureRow(rowIndex, size)\n }\n })\n }\n return rowObserver\n }\n\n function measureRowElement(target: unknown, rowIndex: number): void {\n const element = asElement(target)\n const observer = ensureRowObserver()\n if (!element) return\n observedRows.set(element, rowIndex)\n observer?.observe(element)\n const size = element.getBoundingClientRect().height\n if (size > 0) measureRow(rowIndex, size)\n }\n\n onBeforeUnmount(() => {\n rowObserver?.disconnect()\n observedRows.clear()\n })\n\n return {\n virtualRows: rows.virtualItems,\n virtualColumns: columns.virtualItems,\n virtualCells,\n totalHeight: rows.totalSize,\n totalWidth: columns.totalSize,\n scrollAdjustX: columns.scrollAdjust,\n scrollAdjustY: rows.scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n measureColumn: columns.measure,\n }\n}\n","import { computed, toValue, type MaybeRefOrGetter } from 'vue'\nimport { 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 scrollAdjust: list.scrollAdjust,\n isScrolling: list.isScrolling,\n scrollToIndex: list.scrollToIndex,\n scrollToOffset: list.scrollToOffset,\n measure: list.measure,\n measureElement: list.measureElement,\n }\n}\n","import type { CSSProperties } from 'vue'\nimport { scrollContentSize } from '../core/scrolling'\n\nexport function toCssSize(value: number | string | undefined): string | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return `${value}px`\n if (typeof value === 'string' && value.trim()) return value\n return undefined\n}\n\nexport function parseCssPx(value: number | string | undefined): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value !== 'string') return 0\n const match = /^(-?\\d+(?:\\.\\d+)?)px$/.exec(value.trim())\n if (!match?.[1]) return 0\n const parsed = Number(match[1])\n return Number.isFinite(parsed) ? parsed : 0\n}\n\nexport function scrollerStyle(input: {\n height?: number | string\n width?: number | string\n horizontal: boolean\n}): CSSProperties {\n return {\n overflow: 'auto',\n position: 'relative',\n height: toCssSize(input.height) ?? (input.horizontal ? '100%' : undefined),\n width: toCssSize(input.width) ?? (input.horizontal ? undefined : '100%'),\n overflowAnchor: 'none',\n }\n}\n\nexport function spacerStyle(total: number, horizontal: boolean): CSSProperties {\n const size = scrollContentSize(total)\n return {\n position: 'relative',\n width: horizontal ? `${size}px` : '100%',\n height: horizontal ? '100%' : `${size}px`,\n }\n}\n\nexport function itemStyle(start: number, horizontal: boolean): 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, scrollAdjust, scrollToIndex, scrollToOffset, measure, measureElement } =\n useVirtualList<T>({\n items: () => props.items,\n estimateSize: (index, item) => {\n const estimate = props.estimateSize\n return typeof estimate === 'number' ? estimate : estimate(index, item)\n },\n itemSize: () => (typeof props.estimateSize === 'number' ? props.estimateSize : undefined),\n container,\n horizontal: () => props.horizontal,\n overscan: () => props.overscan,\n gap: () => props.gap,\n paddingStart: () => props.paddingStart,\n paddingEnd: () => props.paddingEnd,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n })\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: props.horizontal,\n }),\n)\n\nconst innerStyle = computed(() => spacerStyle(totalSize.value, props.horizontal))\n\nfunction rowStyle(start: number) {\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 - scrollAdjust)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"virtualItem.item\"\n :index=\"virtualItem.index\"\n :start=\"virtualItem.start\"\n :size=\"virtualItem.size\"\n :end=\"virtualItem.end\"\n />\n </component>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualGrid } from '../composables/useVirtualGrid'\nimport { scrollContentSize } from '../core/scrolling'\nimport { parseCssPx, scrollerStyle } from '../utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n items: readonly T[]\n columnCount?: number\n estimateRowSize?: number | ((rowIndex: number) => number)\n estimateColumnSize?: number | ((columnIndex: number) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n overscanRows?: number\n overscanColumns?: number\n rowGap?: number\n columnGap?: number\n getItemKey?: (item: T, index: number) => string | number\n tag?: string\n itemAttrs?: HTMLAttributes\n revision?: unknown\n }>(),\n {\n columnCount: 1,\n estimateRowSize: 48,\n estimateColumnSize: 160,\n overscan: 2,\n rowGap: 0,\n columnGap: 0,\n tag: 'div',\n },\n)\n\nconst container = ref<HTMLElement | null>(null)\n\nconst {\n virtualCells,\n totalWidth,\n totalHeight,\n scrollAdjustX,\n scrollAdjustY,\n scrollToIndex,\n scrollToOffset,\n measureRow,\n measureRowElement,\n} = useVirtualGrid<T>({\n items: () => props.items,\n columnCount: () => props.columnCount,\n estimateRowSize: () => props.estimateRowSize,\n estimateColumnSize: () => props.estimateColumnSize,\n container,\n overscan: () => props.overscan,\n overscanRows: () => props.overscanRows,\n overscanColumns: () => props.overscanColumns,\n rowGap: () => props.rowGap,\n columnGap: () => props.columnGap,\n getItemKey: (item, index) => props.getItemKey?.(item, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n revision: () => props.revision,\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n }),\n)\n\nconst innerStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n width: `${scrollContentSize(totalWidth.value)}px`,\n height: `${scrollContentSize(totalHeight.value)}px`,\n}))\n\nfunction bindCell(rowIndex: number) {\n return (element: unknown) => {\n measureRowElement(element, rowIndex)\n }\n}\n\nfunction cellStyle(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 - scrollAdjustX, cell.column.size, cell.row.start - scrollAdjustY)\"\n v-bind=\"itemAttrs\"\n >\n <slot\n :item=\"cell.item\"\n :index=\"cell.index\"\n :row-index=\"cell.row.index\"\n :column-index=\"cell.column.index\"\n :row=\"cell.row\"\n :column=\"cell.column\"\n />\n </div>\n </div>\n </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, watch, type CSSProperties, type HTMLAttributes } from 'vue'\nimport { useVirtualTable, type VirtualTableColumn } from '../composables/useVirtualTable'\nimport { isBrowser } from '../utils/dom'\nimport { scrollContentSize } from '../core/scrolling'\nimport { parseCssPx, scrollerStyle } from '../utils/layout'\n\nconst props = withDefaults(\n defineProps<{\n rows: readonly T[]\n columns: readonly VirtualTableColumn<T>[]\n estimateRowSize?: number | ((index: number, row: T) => number)\n height?: number | string\n width?: number | string\n overscan?: number\n getRowKey?: (row: T, index: number) => string | number\n stickyHeader?: boolean\n tag?: string\n rowAttrs?: HTMLAttributes\n revision?: unknown\n }>(),\n {\n estimateRowSize: 44,\n overscan: 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 scrollAdjust,\n scrollToIndex,\n scrollToOffset,\n measure,\n measureElement,\n} = useVirtualTable<T>({\n rows: () => props.rows,\n columns: () => props.columns,\n estimateRowSize: (index, row) => {\n const estimate = props.estimateRowSize\n return typeof estimate === 'number' ? estimate : estimate(index, row)\n },\n container,\n overscan: () => props.overscan,\n getRowKey: (row, index) => props.getRowKey?.(row, index) ?? index,\n initialRect: () => ({\n width: parseCssPx(props.width),\n height: parseCssPx(props.height),\n }),\n viewportInset: headerSize,\n revision: () => props.revision,\n itemSize: () => (typeof props.estimateRowSize === 'number' ? props.estimateRowSize : undefined),\n})\n\nwatch(header, (element, previous, onCleanup) => {\n if (previous === element && !element) return\n if (!element || !isBrowser() || typeof ResizeObserver === 'undefined') return\n const read = () => {\n headerSize.value = element.getBoundingClientRect().height\n }\n const observer = new ResizeObserver(read)\n observer.observe(element)\n read()\n onCleanup(() => observer.disconnect())\n})\n\nconst containerStyle = computed(() =>\n scrollerStyle({\n height: props.height,\n width: props.width,\n horizontal: false,\n }),\n)\n\nconst frameStyle = computed<CSSProperties>(() => ({\n minWidth: `${totalWidth.value}px`,\n}))\n\nconst headerStyle = computed<CSSProperties>(() => ({\n position: props.stickyHeader ? 'sticky' : 'relative',\n top: props.stickyHeader ? '0px' : undefined,\n zIndex: 1,\n display: 'flex',\n width: `${totalWidth.value}px`,\n}))\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n height: `${scrollContentSize(totalHeight.value)}px`,\n width: `${scrollContentSize(totalWidth.value)}px`,\n}))\n\nfunction placedStyle(column: { size: number; align?: 'left' | 'center' | 'right' }): CSSProperties {\n return {\n width: `${column.size}px`,\n minWidth: `${column.size}px`,\n flex: '0 0 auto',\n textAlign: column.align ?? 'left',\n }\n}\n\nfunction rowStyle(start: number): 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 - scrollAdjust)\"\n v-bind=\"rowAttrs\"\n >\n <div\n v-for=\"column in placedColumns\"\n :key=\"column.id\"\n role=\"cell\"\n :style=\"placedStyle(column)\"\n >\n <slot\n name=\"cell\"\n :row=\"virtualRow.item\"\n :column=\"column\"\n :row-index=\"virtualRow.index\"\n :value=\"cellValue(virtualRow.item, column, virtualRow.index)\"\n >\n {{ cellValue(virtualRow.item, column, virtualRow.index) }}\n </slot>\n </div>\n </div>\n </div>\n </div>\n </component>\n</template>\n"],"names":["normalizeSize","size","MeasurementCache","index","baseline","count","removed","value","clamp","min","max","MAX_SCROLL_SIZE","clampScrollOffset","offset","totalSize","viewport","scrollContentSize","measured","total","capped","mapDomOffsetToVirtual","domOffset","virtualSize","domSize","maxVirtual","maxDom","mapVirtualOffsetToDom","virtualOffset","findFirstIndexPast","target","getEnd","low","high","answer","mid","findLastIndexBefore","getStart","resolveScrollOffset","input","end","align","visibleEnd","Virtualizer","options","nextLanes","nextGap","nextPaddingStart","nextPaddingEnd","nextCount","nextItemSize","previousItemSize","geometryChanged","next","previous","before","clamped","ordinal","maxEnd","lane","endEdge","items","startOrdinal","endOrdinal","from","to","start","left","right","raw","last","isBrowser","asElement","writeScroll","element","horizontal","behavior","readScroll","readViewport","readContentSize","scheduleFrame","callback","cancelFrame","id","sameVirtualItems","useVirtualizer","engine","virtualItems","shallowRef","ref","scrollOffset","scrollAdjust","isScrolling","estimateSize","listeningEl","resizeObserver","itemObserver","frame","measureFrame","scrollTimer","seenRevision","toValue","observed","elementsByIndex","pendingMeasures","currentElement","viewportFallback","rect","contentSize","readVirtualOffset","writeVirtualOffset","publish","revision","inset","itemSize","nextTotal","maxOffset","nextOffset","nextAdjust","schedulePublish","onScroll","bindContainer","ensureItemObserver","entries","axis","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","scrollAdjustX","scrollAdjustY","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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"}
|