@floor/vlist 0.5.6 → 0.5.7

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 CHANGED
@@ -58,35 +58,39 @@ npm install @floor/vlist
58
58
  For smaller bundles, import only what you need:
59
59
 
60
60
  ```typescript
61
- import { createVList } from '@floor/vlist' // full library (48.2 KB / 16.0 KB gzip)
62
- import { createVList } from '@floor/vlist/core' // lightweight core (7.8 KB / 3.2 KB gzip)
61
+ import { createVList } from '@floor/vlist' // full library (70 KB / 23 KB gzip)
62
+ import { createVList } from '@floor/vlist/core' // lightweight core (8 KB / 3 KB gzip)
63
+ import { createVList } from '@floor/vlist/core-light' // ultra-minimal (5 KB / 2 KB gzip)
64
+ import { createVList } from '@floor/vlist/builder' // declarative API (17 KB / 6 KB gzip)
63
65
  import { createGridLayout } from '@floor/vlist/grid' // grid layout utilities only
64
66
  import { createSparseStorage } from '@floor/vlist/data' // data utilities only
65
- import { getCompressionInfo } from '@floor/vlist/compression' // compression utilities only
66
- import { createSelectionState } from '@floor/vlist/selection' // selection utilities only
67
- import { createScrollController } from '@floor/vlist/scroll' // scroll utilities only
68
- import { createGroupLayout } from '@floor/vlist/groups' // group/sticky header utilities only
67
+ import { getCompressionInfo } from '@floor/vlist/compression' // compression utilities only
68
+ import { createSelectionState } from '@floor/vlist/selection' // selection utilities only
69
+ import { createScrollController } from '@floor/vlist/scroll' // scroll utilities only
70
+ import { createGroupLayout } from '@floor/vlist/groups' // group/sticky header utilities only
69
71
  ```
70
72
 
71
73
  | Import | Minified | Gzipped | Description |
72
74
  |--------|----------|---------|-------------|
73
- | `@floor/vlist` | 48.2 KB | 16.0 KB | All features |
74
- | **`@floor/vlist/core`** | **7.8 KB** | **3.2 KB** | **Lightweight83% smaller** |
75
- | `@floor/vlist/data` | 9.2 KB | 3.8 KB | Sparse storage, placeholders, data manager |
76
- | `@floor/vlist/scroll` | 6.0 KB | 2.3 KB | Scroll controller + custom scrollbar |
77
- | `@floor/vlist/grid` | 4.1 KB | 1.9 KB | Grid layout + 2D renderer |
78
- | `@floor/vlist/groups` | 3.6 KB | 1.4 KB | Group layout + sticky headers |
79
- | `@floor/vlist/compression` | 2.6 KB | 1.1 KB | Large-list compression utilities |
80
- | `@floor/vlist/selection` | 1.9 KB | 0.7 KB | Selection state management |
75
+ | `@floor/vlist` | 70 KB | 23 KB | All features (plugins + framework adapters) |
76
+ | **`@floor/vlist/core`** | **8 KB** | **3 KB** | **Core virtual list 88% smaller** |
77
+ | **`@floor/vlist/core-light`** | **5 KB** | **2 KB** | **Ultra-minimal 93% smaller** |
78
+ | `@floor/vlist/builder` | 17 KB | 6 KB | Declarative API with chaining |
79
+ | `@floor/vlist/data` | 12 KB | 5 KB | Sparse storage, placeholders, data manager |
80
+ | `@floor/vlist/scroll` | 9 KB | 3 KB | Scroll controller + custom scrollbar |
81
+ | `@floor/vlist/grid` | 10 KB | 4 KB | Grid layout + 2D renderer |
82
+ | `@floor/vlist/groups` | 11 KB | 5 KB | Group layout + sticky headers |
83
+ | `@floor/vlist/compression` | 8 KB | 3 KB | Large-list compression utilities |
84
+ | `@floor/vlist/selection` | 6 KB | 2 KB | Selection state management |
81
85
 
82
86
  ### Framework Adapters
83
87
 
84
88
  Thin wrappers for React, Vue, and Svelte — each under 1 KB:
85
89
 
86
90
  ```typescript
87
- import { useVList } from '@floor/vlist/react' // React hook (0.7 KB / 0.4 KB gzip)
88
- import { useVList } from '@floor/vlist/vue' // Vue 3 composable (0.5 KB / 0.4 KB gzip)
89
- import { vlist } from '@floor/vlist/svelte' // Svelte action (0.3 KB / 0.2 KB gzip)
91
+ import { useVList } from '@floor/vlist/react' // React hook (62 KB / 21 KB gzip)
92
+ import { useVList } from '@floor/vlist/vue' // Vue 3 composable (62 KB / 21 KB gzip)
93
+ import { vlist } from '@floor/vlist/svelte' // Svelte action (62 KB / 20 KB gzip)
90
94
  ```
91
95
 
92
96
  | Import | Minified | Gzipped | Description |
@@ -93,17 +93,11 @@ let F=null,P=()=>F?F.getTotal():B.length,Bj=[],Gj=[],Wj=[],Dj=[],o=[],Vj=[],L=ne
93
93
  else _.viewport.scrollTop=j},Cj=(j=2)=>{let J=N.getTotalHeight();
94
94
  return O+R>=J-j},pj=!1,y,T,kj=(j,J,Z,q,W)=>{DJ(j,J,Z,q,W)},Xj=(j,J,Z,q,W)=>{return _J(j,J,Z,q,W)},_j=(j,J)=>{if(typeof J==="string")j.innerHTML=J;
95
95
  else j.replaceChildren(J)},Lj=(j,J)=>{let Z=Math.round(N.getOffset(J));
96
- if($)j.style.transform=`translateX(${Z}
97
- px)`;
98
- else j.style.transform=`translateY(${Z}
99
- px)`},hj=(j,J)=>{let Z=e.acquire();
100
- if(Z.className=xj,$){if(Z.style.width=`${N.getHeight(j)}
101
- px`,yj!=null)Z.style.height=`${yj}
102
- px`}
103
- else Z.style.height=`${N.getHeight(j)}
104
- px`;
105
- return Z.dataset.index=String(j),Z.dataset.id=String(J.id),Z.ariaSelected="false",Z.id=`${Rj}-item-${j}`,r=String(P()),Z.setAttribute("aria-setsize",r),Z.setAttribute("aria-posinset",String(j+1)),_j(Z,t(J,j,Uj)),Lj(Z,j),Z},n=()=>{let j=`${N.getTotalHeight()}
106
- px`;
96
+ if($)j.style.transform=`translateX(${Z}px)`;
97
+ else j.style.transform=`translateY(${Z}px)`},hj=(j,J)=>{let Z=e.acquire();
98
+ if(Z.className=xj,$){if(Z.style.width=`${N.getHeight(j)}px`,yj!=null)Z.style.height=`${yj}px`}
99
+ else Z.style.height=`${N.getHeight(j)}px`;
100
+ return Z.dataset.index=String(j),Z.dataset.id=String(J.id),Z.ariaSelected="false",Z.id=`${Rj}-item-${j}`,r=String(P()),Z.setAttribute("aria-setsize",r),Z.setAttribute("aria-posinset",String(j+1)),_j(Z,t(J,j,Uj)),Lj(Z,j),Z},n=()=>{let j=`${N.getTotalHeight()}px`;
107
101
  if($)_.content.style.width=j;
108
102
  else _.content.style.height=j},Nj=new Set,Mj=-1,gj=()=>{if(l)return;
109
103
  let j=P();
@@ -118,10 +112,8 @@ G++){let A=F?F.getItem(G):B[G];
118
112
  if(!A)continue;
119
113
  let b=v.get(G);
120
114
  if(b){let w=b.dataset.id,Qj=String(A.id);
121
- if(w!==Qj)if(_j(b,t(A,G,Uj)),b.dataset.id=Qj,$)b.style.width=`${N.getHeight(G)}
122
- px`;
123
- else b.style.height=`${N.getHeight(G)}
124
- px`;
115
+ if(w!==Qj)if(_j(b,t(A,G,Uj)),b.dataset.id=Qj,$)b.style.width=`${N.getHeight(G)}px`;
116
+ else b.style.height=`${N.getHeight(G)}px`;
125
117
  Lj(b,G);
126
118
  let qj=Nj.has(A.id),$J=G===Mj;
127
119
  if(b.classList.toggle(`${D}-item--selected`,qj),b.classList.toggle(`${D}-item--focused`,$J),b.ariaSelected=qj?"true":"false",Z)b.setAttribute("aria-setsize",r)}
@@ -181,8 +173,7 @@ Z<j;
181
173
  Z++){let q=F.getItem(Z);
182
174
  if(q)J.push(q)}
183
175
  return J}
184
- return[...B]},getVirtualTotal(){return P()},getCachedCompression(){return{isCompressed:!1,actualHeight:N.getTotalHeight(),virtualHeight:N.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:O,totalItems:P(),containerHeight:R,rangeStart:E.start}},renderIfNeeded(){y()},forceRender(){T()},getRenderFns(){return{renderIfNeeded:y,forceRender:T}},setRenderFns(j,J){y=j,T=J},setVirtualTotalFn(j){P=j},rebuildHeightCache(j){N.rebuild(j??P())},setHeightConfig(j){N=Sj(j,P())},updateContentSize(j){let J=`${j}
185
- px`;
176
+ return[...B]},getVirtualTotal(){return P()},getCachedCompression(){return{isCompressed:!1,actualHeight:N.getTotalHeight(),virtualHeight:N.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:O,totalItems:P(),containerHeight:R,rangeStart:E.start}},renderIfNeeded(){y()},forceRender(){T()},getRenderFns(){return{renderIfNeeded:y,forceRender:T}},setRenderFns(j,J){y=j,T=J},setVirtualTotalFn(j){P=j},rebuildHeightCache(j){N.rebuild(j??P())},setHeightConfig(j){N=Sj(j,P())},updateContentSize(j){let J=`${j}px`;
186
177
  if($)_.content.style.width=J;
187
178
  else _.content.style.height=J},updateCompressionMode(){},setVisibleRangeFn(j){kj=j},setScrollToPosFn(j){Xj=j},setPositionElementFn(j){Lj=j},setScrollFns(j,J){u=j,S=(Z)=>{J(Z),i()}},setScrollTarget(j){g.removeEventListener("scroll",i),g=j,g.addEventListener("scroll",i,{passive:!0})},getScrollTarget(){return g},setContainerDimensions(j){dj=j.width,sj=j.height,jj=j.width(),R=j.height(),H.viewportState.containerHeight=R},disableViewportResize(){if(Aj)Aj=!1,bj.unobserve(_.viewport)}};
188
179
  F={getState:()=>({total:B.length,cached:B.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>B.length,getCached:()=>B.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(j)=>B[j],getItemById:(j)=>{let J=z.get(j);
@@ -47,16 +47,11 @@ return Math.floor(N*J)}
47
47
  return K.indexAtOffset(j)},Dy=(j,K)=>{if(typeof K==="number")return j*K>F;
48
48
  return K.getTotalHeight()>F},_y=(j)=>{if(j<=0)return 0;
49
49
  return Math.floor(F/j)},Ey=(j,K)=>{let J=w(j,K);
50
- if(!J.isCompressed)return`No compression needed (${j} items, ${(J.actualHeight/1e6).toFixed(2)}
51
- M px)`;
52
- return`Compressed to ${(J.ratio*100).toFixed(1)}% (${j} items, ${(J.actualHeight/1e6).toFixed(1)}
53
- M px → ${(J.virtualHeight/1e6).toFixed(1)}
54
- M px virtual)`};
50
+ if(!J.isCompressed)return`No compression needed (${j} items, ${(J.actualHeight/1e6).toFixed(2)}M px)`;
51
+ return`Compressed to ${(J.ratio*100).toFixed(1)}% (${j} items, ${(J.actualHeight/1e6).toFixed(1)}M px → ${(J.virtualHeight/1e6).toFixed(1)}M px virtual)`};
55
52
  var i=(j,K,J={},y="vlist",N=!1)=>{let{autoHide:Q=!0,autoHideDelay:q=1000,minThumbSize:V=30,showOnHover:B=!0,hoverZoneWidth:E=16,showOnViewportEnter:L=!0}=J,Y=0,W=0,G=0,X=0,$=!1,D=!1,z=0,M=0,b=0,f=null,T=!1,Z=null,P=null,Qy=N?"width":"height",o=N?"translateX":"translateY",u=N?(_)=>_.clientX:(_)=>_.clientY,Yy=N?"left":"top",U=document.createElement("div"),R=document.createElement("div"),O=B?document.createElement("div"):null,$y=()=>{if(U.className=`${y}-scrollbar`,R.className=`${y}-scrollbar-thumb`,N)U.classList.add(`${y}-scrollbar--horizontal`);
56
- if(U.appendChild(R),j.appendChild(U),O){if(O.className=`${y}-scrollbar-hover`,N)O.classList.add(`${y}-scrollbar-hover--horizontal`),O.style.height=`${E}
57
- px`;
58
- else O.style.width=`${E}
59
- px`;
53
+ if(U.appendChild(R),j.appendChild(U),O){if(O.className=`${y}-scrollbar-hover`,N)O.classList.add(`${y}-scrollbar-hover--horizontal`),O.style.height=`${E}px`;
54
+ else O.style.width=`${E}px`;
60
55
  j.appendChild(O)}},S=()=>{if(f)clearTimeout(f),f=null},v=()=>{if(!Q)return;
61
56
  S(),f=setTimeout(d,q)},H=()=>{if(Y<=W)return;
62
57
  if(S(),!T)U.classList.add(`${y}-scrollbar--visible`),T=!0;
@@ -66,16 +61,13 @@ let C=Y>W;
66
61
  if(U.style.display=C?"":"none",!C){d();
67
62
  return}
68
63
  let k=W/Y;
69
- G=Math.max(V,k*W),R.style[Qy]=`${G}
70
- px`,X=W-G,e(b)},e=(_)=>{if(b=_,Y<=W||X<=0)return;
64
+ G=Math.max(V,k*W),R.style[Qy]=`${G}px`,X=W-G,e(b)},e=(_)=>{if(b=_,Y<=W||X<=0)return;
71
65
  let A=Y-W,k=Math.min(1,Math.max(0,_/A))*X;
72
- R.style.transform=`${o}(${k}
73
- px)`},t=(_)=>{if(_.target===R)return;
66
+ R.style.transform=`${o}(${k}px)`},t=(_)=>{if(_.target===R)return;
74
67
  let A=U.getBoundingClientRect(),m=u(_)-A[Yy]-G/2,Ky=Math.max(0,Math.min(m,X))/X,h=Y-W,qy=Ky*h;
75
68
  K(qy),H()},yy=(_)=>{_.preventDefault(),_.stopPropagation(),$=!0,z=u(_),M=b,S(),U.classList.add(`${y}-scrollbar--dragging`),document.addEventListener("mousemove",x),document.addEventListener("mouseup",g)},x=(_)=>{if(!$)return;
76
69
  let A=u(_)-z,C=X>0?A/X:0,k=Y-W,m=C*k,s=Math.max(0,Math.min(M+m,k)),h=s/k*X;
77
- if(R.style.transform=`${o}(${h}
78
- px)`,P=s,Z===null)Z=requestAnimationFrame(()=>{if(P!==null)K(P);
70
+ if(R.style.transform=`${o}(${h}px)`,P=s,Z===null)Z=requestAnimationFrame(()=>{if(P!==null)K(P);
79
71
  Z=null})},g=()=>{if($=!1,Z!==null)cancelAnimationFrame(Z),Z=null;
80
72
  if(P!==null)K(P),P=null;
81
73
  if(U.classList.remove(`${y}-scrollbar--dragging`),Q&&!D)v();
@@ -106,11 +98,7 @@ return E()},y.setVisibleRangeFn((L,Y,W,G,X)=>{let $=w(G,W);
106
98
  c(L,Y,W,G,$,X)}),y.setScrollToPosFn((L,Y,W,G,X)=>{let $=w(G,Y);
107
99
  return a(L,Y,W,G,$,X)}),y.setPositionElementFn((L,Y)=>{let W=y.getVirtualTotal(),G=w(W,y.heightCache);
108
100
  if(G.isCompressed){let X=Math.round(r(Y,y.scrollController.getScrollTop(),y.heightCache,W,y.state.viewportState.containerHeight,G)),$=y.config.horizontal;
109
- L.style.transform=$?`translateX(${X}
110
- px)`:`translateY(${X}
111
- px)`}
101
+ L.style.transform=$?`translateX(${X}px)`:`translateY(${X}px)`}
112
102
  else{let X=Math.round(y.heightCache.getOffset(Y)),$=y.config.horizontal;
113
- L.style.transform=$?`translateX(${X}
114
- px)`:`translateY(${X}
115
- px)`}}),B(),y.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};
103
+ L.style.transform=$?`translateX(${X}px)`:`translateY(${X}px)`}}),B(),y.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};
116
104
  export{Ly as withCompression,Dy as needsCompression,_y as getMaxItemsWithoutCompression,w as getCompressionState,Ey as getCompressionInfo,Uy as calculateIndexFromScrollPosition,c as calculateCompressedVisibleRange,a as calculateCompressedScrollToIndex,Gy as calculateCompressedRenderRange,r as calculateCompressedItemPosition,F as MAX_VIRTUAL_HEIGHT};
@@ -51,11 +51,8 @@ if(!B.item.template)throw Error("[vlist] item.template is required");
51
51
  let{item:X,items:Y,overscan:U=3,classPrefix:$="vlist",scrollElement:q,ariaLabel:J}=B,{height:F,template:N}=X,k=!!q,_=Y?[...Y]:[],y=!1,R=null,D=0,l=`${$}-${Nj++}`,o=_j(B.container),V=$j(o,$,J),W=Zj(),A=Yj(F,_.length),I=Qj();
52
52
  if(k)V.root.style.overflow="visible",V.root.style.height="auto",V.viewport.style.overflow="visible",V.viewport.style.height="auto";
53
53
  let E=k?window.innerHeight:V.viewport.clientHeight,h={start:0,end:0},M={start:0,end:0},C={start:-1,end:-1},b=new Map,f={selected:!1,focused:!1},n=`${$}-item`,T="",p=(j,K)=>{if(typeof K==="string")j.innerHTML=K;
54
- else j.replaceChildren(K)},c=(j,K)=>{j.style.transform=`translateY(${Math.round(A.getOffset(K))}
55
- px)`},i=(j,K)=>{let G=I.acquire();
56
- return G.className=n,G.style.height=`${A.getHeight(j)}
57
- px`,G.dataset.index=String(j),G.dataset.id=String(K.id),G.ariaSelected="false",G.id=`${l}-item-${j}`,T=String(_.length),G.setAttribute("aria-setsize",T),G.setAttribute("aria-posinset",String(j+1)),p(G,N(K,j,f)),c(G,j),G},v=()=>{V.content.style.height=`${A.getTotalHeight()}
58
- px`},P=()=>{if(y)return;
54
+ else j.replaceChildren(K)},c=(j,K)=>{j.style.transform=`translateY(${Math.round(A.getOffset(K))}px)`},i=(j,K)=>{let G=I.acquire();
55
+ return G.className=n,G.style.height=`${A.getHeight(j)}px`,G.dataset.index=String(j),G.dataset.id=String(K.id),G.ariaSelected="false",G.id=`${l}-item-${j}`,T=String(_.length),G.setAttribute("aria-setsize",T),G.setAttribute("aria-posinset",String(j+1)),p(G,N(K,j,f)),c(G,j),G},v=()=>{V.content.style.height=`${A.getTotalHeight()}px`},P=()=>{if(y)return;
59
56
  if(Vj(D,E,A,_.length,h),Lj(h,U,_.length,M),M.start===C.start&&M.end===C.end)return;
60
57
  let j=String(_.length),K=j!==T;
61
58
  T=j;
@@ -67,8 +64,7 @@ Z++){let L=_[Z];
67
64
  if(!L)continue;
68
65
  let z=b.get(Z);
69
66
  if(z){let H=z.dataset.id,w=String(L.id);
70
- if(H!==w)p(z,N(L,Z,f)),z.dataset.id=w,z.style.height=`${A.getHeight(Z)}
71
- px`;
67
+ if(H!==w)p(z,N(L,Z,f)),z.dataset.id=w,z.style.height=`${A.getHeight(Z)}px`;
72
68
  if(c(z,Z),K)z.setAttribute("aria-setsize",T)}
73
69
  else{let H=i(Z,L);
74
70
  G.appendChild(H),Q.push({index:Z,element:H})}}
@@ -22,15 +22,12 @@ return}
22
22
  let j=W.indexAtOffset(B),Q=j,N=W.getOffset(j)-B;
23
23
  while(Q<J-1&&N<K)N+=W.getHeight(Q),Q++;
24
24
  G.start=j,G.end=Math.min(Q,J-1)},Kj=(B,K,W,J)=>{J.start=Math.max(0,B.start-K),J.end=Math.min(W-1,B.end+K)},Qj=0,Uj=(B)=>{let{item:K,items:W,overscan:J=3,classPrefix:G="vlist",ariaLabel:j}=B,{height:Q,template:N}=K,Z=W?[...W]:[],y=!1,H=0,O=null,h=`${G}-${Qj++}`,c=qj(B.container),$=Bj(c,G,j),D=jj(),F=e(Q,Z.length),b=Gj(),w=$.viewport.clientHeight,S={start:0,end:0},M={start:0,end:0},L={start:-1,end:-1},A=new Map,P={selected:!1,focused:!1},m=`${G}-item`,z="",v=(q,U)=>{if(typeof U==="string")q.innerHTML=U;
25
- else q.replaceChildren(U)},I=(q,U)=>{q.style.transform=`translateY(${Math.round(F.getOffset(U))}
26
- px)`},d=(q,U)=>{let X=b.acquire();
27
- X.className=m,X.style.height=`${F.getHeight(q)}
28
- px`,X.dataset.index=String(q),X.dataset.id=String(U.id),X.ariaSelected="false",X.id=`${h}-item-${q}`,z=String(Z.length),X.setAttribute("aria-setsize",z),X.setAttribute("aria-posinset",String(q+1));
25
+ else q.replaceChildren(U)},I=(q,U)=>{q.style.transform=`translateY(${Math.round(F.getOffset(U))}px)`},d=(q,U)=>{let X=b.acquire();
26
+ X.className=m,X.style.height=`${F.getHeight(q)}px`,X.dataset.index=String(q),X.dataset.id=String(U.id),X.ariaSelected="false",X.id=`${h}-item-${q}`,z=String(Z.length),X.setAttribute("aria-setsize",z),X.setAttribute("aria-posinset",String(q+1));
29
27
  let V=U.id===O;
30
28
  if(P.selected=V,V)X.classList.add(`${G}-item--selected`);
31
29
  else X.classList.remove(`${G}-item--selected`);
32
- return v(X,N(U,q,P)),I(X,q),X},f=()=>{$.content.style.height=`${F.getTotalHeight()}
33
- px`},C=()=>{if(y)return;
30
+ return v(X,N(U,q,P)),I(X,q),X},f=()=>{$.content.style.height=`${F.getTotalHeight()}px`},C=()=>{if(y)return;
34
31
  if(Jj(H,w,F,Z.length,S),Kj(S,J,Z.length,M),M.start===L.start&&M.end===L.end)return;
35
32
  let q=String(Z.length),U=q!==z;
36
33
  z=q;
@@ -42,8 +39,7 @@ Y++){let k=Z[Y];
42
39
  if(!k)continue;
43
40
  let _=A.get(Y);
44
41
  if(_){let T=_.dataset.id,p=String(k.id);
45
- if(T!==p)v(_,N(k,Y,P)),_.dataset.id=p,_.style.height=`${F.getHeight(Y)}
46
- px`;
42
+ if(T!==p)v(_,N(k,Y,P)),_.dataset.id=p,_.style.height=`${F.getHeight(Y)}px`;
47
43
  let g=k.id===O;
48
44
  if(P.selected=g,g)_.classList.add(`${G}-item--selected`);
49
45
  else _.classList.remove(`${G}-item--selected`);
@@ -89,15 +89,11 @@ if(p<x&&!u.has(p)){let l=J.getHeight(R);
89
89
  z+=l,u.add(p)}}
90
90
  f=z}
91
91
  else f=A(Z,U);
92
- Q.style.transform=`translate(${Math.round(_)}
93
- px, ${Math.round(f)}
94
- px)`},v=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?P:j.getColumnWidth(P),E;
92
+ Q.style.transform=`translate(${Math.round(_)}px, ${Math.round(f)}px)`},v=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?P:j.getColumnWidth(P),E;
95
93
  if(F||U)E=J.getHeight(Z)-j.gap;
96
94
  else{let _=j.getRow(Z);
97
95
  E=J.getHeight(_)-j.gap}
98
- Q.style.width=`${L}
99
- px`,Q.style.height=`${E}
100
- px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);
96
+ Q.style.width=`${L}px`,Q.style.height=`${E}px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);
101
97
  if(_.className=y,_.dataset.index=String(Q),_.dataset.id=String(Z.id),_.dataset.row=String(j.getRow(Q)),_.dataset.col=String(j.getCol(Q)),_.ariaSelected=String(U),O)_.id=`${O}-item-${Q}`;
102
98
  if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));
103
99
  v(_,Q);
@@ -164,8 +160,7 @@ for(let A=0;
164
160
  A<M;
165
161
  A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);
166
162
  V+=S}
167
- j.heightCache.getTotalHeight=()=>V,j.dom.content.style.height=`${V}
168
- px`,B()}),j.methods.set("updateGrid",(k)=>{if(k.columns!==void 0){if(!Number.isInteger(k.columns)||k.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
163
+ j.heightCache.getTotalHeight=()=>V,j.dom.content.style.height=`${V}px`,B()}),j.methods.set("updateGrid",(k)=>{if(k.columns!==void 0){if(!Number.isInteger(k.columns)||k.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
169
164
  P.columns=k.columns}
170
165
  if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
171
166
  P.gap=k.gap}
@@ -48,15 +48,11 @@ if(x<p&&!C.has(x)){let h=j.getHeight(f);
48
48
  k+=h,C.add(x)}}
49
49
  y=k}
50
50
  else y=w(K,U);
51
- N.style.transform=`translate(${Math.round(V)}
52
- px, ${Math.round(y)}
53
- px)`},I=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),O=U?b:J.getColumnWidth(b),A;
51
+ N.style.transform=`translate(${Math.round(V)}px, ${Math.round(y)}px)`},I=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),O=U?b:J.getColumnWidth(b),A;
54
52
  if(G||U)A=j.getHeight(K)-J.gap;
55
53
  else{let V=J.getRow(K);
56
54
  A=j.getHeight(V)-J.gap}
57
- N.style.width=`${O}
58
- px`,N.style.height=`${A}
59
- px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);
55
+ N.style.width=`${O}px`,N.style.height=`${A}px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);
60
56
  if(V.className=F,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(J.getRow(N)),V.dataset.col=String(J.getCol(N)),V.ariaSelected=String(U),M)V.id=`${M}-item-${N}`;
61
57
  if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));
62
58
  I(V,N);
@@ -140,8 +136,7 @@ let P=Z.groups;
140
136
  if(z<0||z>=P.length){q.textContent="";
141
137
  return}
142
138
  let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);
143
- if(q.style.height=`${R}
144
- px`,typeof F==="string")q.innerHTML=F;
139
+ if(q.style.height=`${R}px`,typeof F==="string")q.innerHTML=F;
145
140
  else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;
146
141
  if(P.length===0){Y();
147
142
  return}
@@ -158,8 +153,7 @@ D(L);
158
153
  let R=Z.getHeaderHeight(L),H=0,v=L+1;
159
154
  if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;
160
155
  if(w<R)H=w-R}
161
- if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}
162
- px)`},G=()=>{if(M)return;
156
+ if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},G=()=>{if(M)return;
163
157
  M=!0,q.style.display=""},Y=()=>{if(!M)return;
164
158
  M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;
165
159
  if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};
package/dist/index.js CHANGED
@@ -72,11 +72,8 @@ return Math.floor(K*Q)}
72
72
  return $.indexAtOffset(j)},rj=(j,$)=>{if(typeof $==="number")return j*$>L2;
73
73
  return $.getTotalHeight()>L2},nj=(j)=>{if(j<=0)return 0;
74
74
  return Math.floor(L2/j)},oj=(j,$)=>{let Q=M2(j,$);
75
- if(!Q.isCompressed)return`No compression needed (${j} items, ${(Q.actualHeight/1e6).toFixed(2)}
76
- M px)`;
77
- return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${j} items, ${(Q.actualHeight/1e6).toFixed(1)}
78
- M px → ${(Q.virtualHeight/1e6).toFixed(1)}
79
- M px virtual)`};
75
+ if(!Q.isCompressed)return`No compression needed (${j} items, ${(Q.actualHeight/1e6).toFixed(2)}M px)`;
76
+ return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${j} items, ${(Q.actualHeight/1e6).toFixed(1)}M px → ${(Q.virtualHeight/1e6).toFixed(1)}M px virtual)`};
80
77
  var t2=()=>{};
81
78
  var b2=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};
82
79
  var ij={};
@@ -99,15 +96,11 @@ if(J2<Z2&&!d.has(J2)){let o=Q.getHeight(x);
99
96
  k+=o,d.add(J2)}}
100
97
  q2=k}
101
98
  else q2=H(S,h);
102
- b.style.transform=`translate(${Math.round(r)}
103
- px, ${Math.round(q2)}
104
- px)`},T=(b,S)=>{let h=b.dataset.id?.startsWith("__group_header"),m=h?U:J.getColumnWidth(U),s;
99
+ b.style.transform=`translate(${Math.round(r)}px, ${Math.round(q2)}px)`},T=(b,S)=>{let h=b.dataset.id?.startsWith("__group_header"),m=h?U:J.getColumnWidth(U),s;
105
100
  if(_||h)s=Q.getHeight(S)-J.gap;
106
101
  else{let r=J.getRow(S);
107
102
  s=Q.getHeight(r)-J.gap}
108
- b.style.width=`${m}
109
- px`,b.style.height=`${s}
110
- px`},g=(b,S,h,m,s)=>{let r=V.acquire(),q2=F(h,m);
103
+ b.style.width=`${m}px`,b.style.height=`${s}px`},g=(b,S,h,m,s)=>{let r=V.acquire(),q2=F(h,m);
111
104
  if(r.className=O,r.dataset.index=String(b),r.dataset.id=String(S.id),r.dataset.row=String(J.getRow(b)),r.dataset.col=String(J.getCol(b)),r.ariaSelected=String(h),Z)r.id=`${Z}-item-${b}`;
112
105
  if(q)W=String(q()),r.setAttribute("aria-setsize",W),r.setAttribute("aria-posinset",String(b+1));
113
106
  T(r,b);
@@ -236,17 +229,11 @@ let x=null,J2=()=>x?x.getTotal():M.length,o=[],Q2=[],v=[],f=[],n=[],$2=[],c=new
236
229
  else B.viewport.scrollTop=Y},A2=(Y=2)=>{let A=T.getTotalHeight();
237
230
  return C+t>=A-Y},U2=!1,Y2,V2,B2=(Y,A,P,I,i)=>{tJ(Y,A,P,I,i)},G2=(Y,A,P,I,i)=>{return j4(Y,A,P,I,i)},D2=(Y,A)=>{if(typeof A==="string")Y.innerHTML=A;
238
231
  else Y.replaceChildren(A)},F2=(Y,A)=>{let P=Math.round(T.getOffset(A));
239
- if(Q)Y.style.transform=`translateX(${P}
240
- px)`;
241
- else Y.style.transform=`translateY(${P}
242
- px)`},FJ=(Y,A)=>{let P=g.acquire();
243
- if(P.className=q2,Q){if(P.style.width=`${T.getHeight(Y)}
244
- px`,G!=null)P.style.height=`${G}
245
- px`}
246
- else P.style.height=`${T.getHeight(Y)}
247
- px`;
248
- return P.dataset.index=String(Y),P.dataset.id=String(A.id),P.ariaSelected="false",P.id=`${W}-item-${Y}`,Z2=String(J2()),P.setAttribute("aria-setsize",Z2),P.setAttribute("aria-posinset",String(Y+1)),D2(P,F(A,Y,r)),F2(P,Y),P},w2=()=>{let Y=`${T.getTotalHeight()}
249
- px`;
232
+ if(Q)Y.style.transform=`translateX(${P}px)`;
233
+ else Y.style.transform=`translateY(${P}px)`},FJ=(Y,A)=>{let P=g.acquire();
234
+ if(P.className=q2,Q){if(P.style.width=`${T.getHeight(Y)}px`,G!=null)P.style.height=`${G}px`}
235
+ else P.style.height=`${T.getHeight(Y)}px`;
236
+ return P.dataset.index=String(Y),P.dataset.id=String(A.id),P.ariaSelected="false",P.id=`${W}-item-${Y}`,Z2=String(J2()),P.setAttribute("aria-setsize",Z2),P.setAttribute("aria-posinset",String(Y+1)),D2(P,F(A,Y,r)),F2(P,Y),P},w2=()=>{let Y=`${T.getTotalHeight()}px`;
250
237
  if(Q)B.content.style.width=Y;
251
238
  else B.content.style.height=Y},Dj=new Set,Wj=-1,LJ=()=>{if(e)return;
252
239
  let Y=J2();
@@ -261,10 +248,8 @@ a++){let N2=x?x.getItem(a):M[a];
261
248
  if(!N2)continue;
262
249
  let _2=s.get(a);
263
250
  if(_2){let E2=_2.dataset.id,l2=String(N2.id);
264
- if(E2!==l2)if(D2(_2,F(N2,a,r)),_2.dataset.id=l2,Q)_2.style.width=`${T.getHeight(a)}
265
- px`;
266
- else _2.style.height=`${T.getHeight(a)}
267
- px`;
251
+ if(E2!==l2)if(D2(_2,F(N2,a,r)),_2.dataset.id=l2,Q)_2.style.width=`${T.getHeight(a)}px`;
252
+ else _2.style.height=`${T.getHeight(a)}px`;
268
253
  F2(_2,a);
269
254
  let s2=Dj.has(N2.id),uJ=a===Wj;
270
255
  if(_2.classList.toggle(`${Z}-item--selected`,s2),_2.classList.toggle(`${Z}-item--focused`,uJ),_2.ariaSelected=s2?"true":"false",P)_2.setAttribute("aria-setsize",Z2)}
@@ -324,8 +309,7 @@ P<Y;
324
309
  P++){let I=x.getItem(P);
325
310
  if(I)A.push(I)}
326
311
  return A}
327
- return[...M]},getVirtualTotal(){return J2()},getCachedCompression(){return{isCompressed:!1,actualHeight:T.getTotalHeight(),virtualHeight:T.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:C,totalItems:J2(),containerHeight:t,rangeStart:S.start}},renderIfNeeded(){Y2()},forceRender(){V2()},getRenderFns(){return{renderIfNeeded:Y2,forceRender:V2}},setRenderFns(Y,A){Y2=Y,V2=A},setVirtualTotalFn(Y){J2=Y},rebuildHeightCache(Y){T.rebuild(Y??J2())},setHeightConfig(Y){T=mj(Y,J2())},updateContentSize(Y){let A=`${Y}
328
- px`;
312
+ return[...M]},getVirtualTotal(){return J2()},getCachedCompression(){return{isCompressed:!1,actualHeight:T.getTotalHeight(),virtualHeight:T.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:C,totalItems:J2(),containerHeight:t,rangeStart:S.start}},renderIfNeeded(){Y2()},forceRender(){V2()},getRenderFns(){return{renderIfNeeded:Y2,forceRender:V2}},setRenderFns(Y,A){Y2=Y,V2=A},setVirtualTotalFn(Y){J2=Y},rebuildHeightCache(Y){T.rebuild(Y??J2())},setHeightConfig(Y){T=mj(Y,J2())},updateContentSize(Y){let A=`${Y}px`;
329
313
  if(Q)B.content.style.width=A;
330
314
  else B.content.style.height=A},updateCompressionMode(){},setVisibleRangeFn(Y){B2=Y},setScrollToPosFn(Y){G2=Y},setPositionElementFn(Y){F2=Y},setScrollFns(Y,A){X2=Y,K2=(P)=>{A(P),v2()}},setScrollTarget(Y){P2.removeEventListener("scroll",v2),P2=Y,P2.addEventListener("scroll",v2,{passive:!0})},getScrollTarget(){return P2},setContainerDimensions(Y){bJ=Y.width,PJ=Y.height,l=Y.width(),t=Y.height(),m.viewportState.containerHeight=t},disableViewportResize(){if(Nj)Nj=!1,_j.unobserve(B.viewport)}};
331
315
  x={getState:()=>({total:M.length,cached:M.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>M.length,getCached:()=>M.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Y)=>M[Y],getItemById:(Y)=>{let A=k.get(Y);
@@ -500,8 +484,7 @@ for(let H=0;
500
484
  H<R;
501
485
  H++)if($.getCol(H)===0){let M=J.heightCache.getHeight(H);
502
486
  B+=M}
503
- J.heightCache.getTotalHeight=()=>B,J.dom.content.style.height=`${B}
504
- px`,F()}),J.methods.set("updateGrid",(E)=>{if(E.columns!==void 0){if(!Number.isInteger(E.columns)||E.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
487
+ J.heightCache.getTotalHeight=()=>B,J.dom.content.style.height=`${B}px`,F()}),J.methods.set("updateGrid",(E)=>{if(E.columns!==void 0){if(!Number.isInteger(E.columns)||E.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
505
488
  U.columns=E.columns}
506
489
  if(E.gap!==void 0){if(E.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
507
490
  U.gap=E.gap}
@@ -586,8 +569,7 @@ let G=$.groups;
586
569
  if(N<0||N>=G.length){X.textContent="";
587
570
  return}
588
571
  let F=G[N],O=J.headerTemplate(F.key,F.groupIndex),y=$.getHeaderHeight(N);
589
- if(X.style.height=`${y}
590
- px`,typeof O==="string")X.innerHTML=O;
572
+ if(X.style.height=`${y}px`,typeof O==="string")X.innerHTML=O;
591
573
  else X.replaceChildren(O)},U=(N)=>{let G=$.groups;
592
574
  if(G.length===0){L();
593
575
  return}
@@ -604,8 +586,7 @@ D(F);
604
586
  let y=$.getHeaderHeight(F),E=0,R=F+1;
605
587
  if(R<G.length){let H=Q.getOffset(G[R].headerLayoutIndex)-N;
606
588
  if(H<y)E=H-y}
607
- if(E!==V)V=E,X.style.transform=E===0?"":`translateY(${Math.round(E)}
608
- px)`},_=()=>{if(Z)return;
589
+ if(E!==V)V=E,X.style.transform=E===0?"":`translateY(${Math.round(E)}px)`},_=()=>{if(Z)return;
609
590
  Z=!0,X.style.display=""},L=()=>{if(!Z)return;
610
591
  Z=!1,X.style.display="none",q=-1,V=0,X.style.transform=""},z=()=>{let N=q;
611
592
  if(q=-1,N>=0)D(N)},W=()=>{X.remove(),q=-1,Z=!1};
@@ -676,15 +657,7 @@ _(),z()},N=()=>{if(X.state.isDestroyed)return;
676
657
  L(),z()};
677
658
  X.setRenderFns(W,N);
678
659
  let G=()=>{z(),Z.emit("selection:change",{selected:R2(J),items:T2(J,(O)=>X.dataManager.getItemById(O))})};
679
- K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${D}-live-region`,K.style.cssText="position:absolute;
680
- width:1px;
681
- height:1px;
682
- padding:0;
683
- margin:-1px;
684
- overflow:hidden;
685
- clip:rect(0,0,0,0);
686
- white-space:nowrap;
687
- border:0",q.root.appendChild(K);
660
+ K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${D}-live-region`,K.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(K);
688
661
  let F=K;
689
662
  Z.on("selection:change",({selected:O})=>{let y=O.length;
690
663
  if(y===0)F.textContent="";
@@ -727,10 +700,8 @@ let{renderRange:O,isCompressed:y}=X.state.viewportState,E=X.getItemsForRange(O),
727
700
  X.renderer.render(E,O,J.selected,J.focusedIndex,R),Z.emit("selection:change",{selected:[],items:[]})}),X.methods.set("getSelected",()=>{return R2(J)}),X.methods.set("getSelectedItems",()=>{return T2(J,(O)=>X.dataManager.getItemById(O))}),X.destroyHandlers.push(()=>{if(F&&F.parentNode)F.remove()})},destroy(){if(K&&K.parentNode)K.remove();
728
701
  K=null}}};
729
702
  var C2=(j,$,Q={},J="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:V=!0,hoverZoneWidth:D=16,showOnViewportEnter:U=!0}=Q,_=0,L=0,z=0,W=0,N=!1,G=!1,F=0,O=0,y=0,E=null,R=!1,B=null,H=null,M=K?"width":"height",T=K?"translateX":"translateY",g=K?(o)=>o.clientX:(o)=>o.clientY,t=K?"left":"top",l=document.createElement("div"),e=document.createElement("div"),j2=V?document.createElement("div"):null,C=()=>{if(l.className=`${J}-scrollbar`,e.className=`${J}-scrollbar-thumb`,K)l.classList.add(`${J}-scrollbar--horizontal`);
730
- if(l.appendChild(e),j.appendChild(l),j2){if(j2.className=`${J}-scrollbar-hover`,K)j2.classList.add(`${J}-scrollbar-hover--horizontal`),j2.style.height=`${D}
731
- px`;
732
- else j2.style.width=`${D}
733
- px`;
703
+ if(l.appendChild(e),j.appendChild(l),j2){if(j2.className=`${J}-scrollbar-hover`,K)j2.classList.add(`${J}-scrollbar-hover--horizontal`),j2.style.height=`${D}px`;
704
+ else j2.style.width=`${D}px`;
734
705
  j.appendChild(j2)}},w=()=>{if(E)clearTimeout(E),E=null},p=()=>{if(!X)return;
735
706
  w(),E=setTimeout(b,q)},u=()=>{if(_<=L)return;
736
707
  if(w(),!R)l.classList.add(`${J}-scrollbar--visible`),R=!0;
@@ -740,16 +711,13 @@ let v=_>L;
740
711
  if(l.style.display=v?"":"none",!v){b();
741
712
  return}
742
713
  let f=L/_;
743
- z=Math.max(Z,f*L),e.style[M]=`${z}
744
- px`,W=L-z,h(y)},h=(o)=>{if(y=o,_<=L||W<=0)return;
714
+ z=Math.max(Z,f*L),e.style[M]=`${z}px`,W=L-z,h(y)},h=(o)=>{if(y=o,_<=L||W<=0)return;
745
715
  let Q2=_-L,f=Math.min(1,Math.max(0,o/Q2))*W;
746
- e.style.transform=`${T}(${f}
747
- px)`},m=(o)=>{if(o.target===e)return;
716
+ e.style.transform=`${T}(${f}px)`},m=(o)=>{if(o.target===e)return;
748
717
  let Q2=l.getBoundingClientRect(),n=g(o)-Q2[t]-z/2,c=Math.max(0,Math.min(n,W))/W,X2=_-L,K2=c*X2;
749
718
  $(K2),u()},s=(o)=>{o.preventDefault(),o.stopPropagation(),N=!0,F=g(o),O=y,w(),l.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",r),document.addEventListener("mouseup",q2)},r=(o)=>{if(!N)return;
750
719
  let Q2=g(o)-F,v=W>0?Q2/W:0,f=_-L,n=v*f,$2=Math.max(0,Math.min(O+n,f)),X2=$2/f*W;
751
- if(e.style.transform=`${T}(${X2}
752
- px)`,H=$2,B===null)B=requestAnimationFrame(()=>{if(H!==null)$(H);
720
+ if(e.style.transform=`${T}(${X2}px)`,H=$2,B===null)B=requestAnimationFrame(()=>{if(H!==null)$(H);
753
721
  B=null})},q2=()=>{if(N=!1,B!==null)cancelAnimationFrame(B),B=null;
754
722
  if(H!==null)$(H),H=null;
755
723
  if(l.classList.remove(`${J}-scrollbar--dragging`),X&&!G)p();
@@ -867,13 +835,9 @@ return D()},J.setVisibleRangeFn((U,_,L,z,W)=>{let N=M2(z,L);
867
835
  o2(U,_,L,z,N,W)}),J.setScrollToPosFn((U,_,L,z,W)=>{let N=M2(z,_);
868
836
  return i2(U,_,L,z,N,W)}),J.setPositionElementFn((U,_)=>{let L=J.getVirtualTotal(),z=M2(L,J.heightCache);
869
837
  if(z.isCompressed){let W=Math.round(H2(_,J.scrollController.getScrollTop(),J.heightCache,L,J.state.viewportState.containerHeight,z)),N=J.config.horizontal;
870
- U.style.transform=N?`translateX(${W}
871
- px)`:`translateY(${W}
872
- px)`}
838
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}
873
839
  else{let W=Math.round(J.heightCache.getOffset(_)),N=J.config.horizontal;
874
- U.style.transform=N?`translateX(${W}
875
- px)`:`translateY(${W}
876
- px)`}}),V(),J.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};
840
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}}),V(),J.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};
877
841
  var GJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(j){j.methods.set("getScrollSnapshot",()=>{let $=j.scrollController.getScrollTop(),Q=j.getCachedCompression(),J=j.getVirtualTotal(),K=j.methods.get("getSelected"),X=K&&K().length>0?K():void 0;
878
842
  if(J===0){let D={index:0,offsetInItem:0};
879
843
  if(X)D.selectedIds=X;
@@ -70,15 +70,11 @@ if(Qj<Bj&&!Yj.has(Qj)){let t=Q.getHeight(n);
70
70
  x+=t,Yj.add(Qj)}}
71
71
  Xj=x}
72
72
  else Xj=w(T,u);
73
- z.style.transform=`translate(${Math.round(a)}
74
- px, ${Math.round(Xj)}
75
- px)`},v=(z,T)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),l;
73
+ z.style.transform=`translate(${Math.round(a)}px, ${Math.round(Xj)}px)`},v=(z,T)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),l;
76
74
  if(F||u)l=Q.getHeight(T)-j.gap;
77
75
  else{let a=j.getRow(T);
78
76
  l=Q.getHeight(a)-j.gap}
79
- z.style.width=`${h}
80
- px`,z.style.height=`${l}
81
- px`},g=(z,T,u,h,l)=>{let a=E.acquire(),Xj=A(u,h);
77
+ z.style.width=`${h}px`,z.style.height=`${l}px`},g=(z,T,u,h,l)=>{let a=E.acquire(),Xj=A(u,h);
82
78
  if(a.className=L,a.dataset.index=String(z),a.dataset.id=String(T.id),a.dataset.row=String(j.getRow(z)),a.dataset.col=String(j.getCol(z)),a.ariaSelected=String(u),Z)a.id=`${Z}-item-${z}`;
83
79
  if(q)W=String(q()),a.setAttribute("aria-setsize",W),a.setAttribute("aria-posinset",String(z+1));
84
80
  v(a,z);
@@ -209,17 +205,11 @@ let n=null,Qj=()=>n?n.getTotal():D.length,t=[],Jj=[],C=[],S=[],s=[],e=[],m=new M
209
205
  else B.viewport.scrollTop=K},Mj=(K=2)=>{let V=v.getTotalHeight();
210
206
  return H+o>=V-K},Uj=!1,Kj,_j,Zj=(K,V,P,f,r)=>{C2(K,V,P,f,r)},Gj=(K,V,P,f,r)=>{return f2(K,V,P,f,r)},Wj=(K,V)=>{if(typeof V==="string")K.innerHTML=V;
211
207
  else K.replaceChildren(V)},Ej=(K,V)=>{let P=Math.round(v.getOffset(V));
212
- if(Q)K.style.transform=`translateX(${P}
213
- px)`;
214
- else K.style.transform=`translateY(${P}
215
- px)`},J2=(K,V)=>{let P=g.acquire();
216
- if(P.className=Xj,Q){if(P.style.width=`${v.getHeight(K)}
217
- px`,M!=null)P.style.height=`${M}
218
- px`}
219
- else P.style.height=`${v.getHeight(K)}
220
- px`;
221
- return P.dataset.index=String(K),P.dataset.id=String(V.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String(Qj()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(V,K,a)),Ej(P,K),P},bj=()=>{let K=`${v.getTotalHeight()}
222
- px`;
208
+ if(Q)K.style.transform=`translateX(${P}px)`;
209
+ else K.style.transform=`translateY(${P}px)`},J2=(K,V)=>{let P=g.acquire();
210
+ if(P.className=Xj,Q){if(P.style.width=`${v.getHeight(K)}px`,M!=null)P.style.height=`${M}px`}
211
+ else P.style.height=`${v.getHeight(K)}px`;
212
+ return P.dataset.index=String(K),P.dataset.id=String(V.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String(Qj()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(V,K,a)),Ej(P,K),P},bj=()=>{let K=`${v.getTotalHeight()}px`;
223
213
  if(Q)B.content.style.width=K;
224
214
  else B.content.style.height=K},mj=new Set,gj=-1,$2=()=>{if(jj)return;
225
215
  let K=Qj();
@@ -234,10 +224,8 @@ c++){let Vj=n?n.getItem(c):D[c];
234
224
  if(!Vj)continue;
235
225
  let Dj=l.get(c);
236
226
  if(Dj){let Aj=Dj.dataset.id,Sj=String(Vj.id);
237
- if(Aj!==Sj)if(Wj(Dj,A(Vj,c,a)),Dj.dataset.id=Sj,Q)Dj.style.width=`${v.getHeight(c)}
238
- px`;
239
- else Dj.style.height=`${v.getHeight(c)}
240
- px`;
227
+ if(Aj!==Sj)if(Wj(Dj,A(Vj,c,a)),Dj.dataset.id=Sj,Q)Dj.style.width=`${v.getHeight(c)}px`;
228
+ else Dj.style.height=`${v.getHeight(c)}px`;
241
229
  Ej(Dj,c);
242
230
  let fj=mj.has(Vj.id),E2=c===gj;
243
231
  if(Dj.classList.toggle(`${Z}-item--selected`,fj),Dj.classList.toggle(`${Z}-item--focused`,E2),Dj.ariaSelected=fj?"true":"false",P)Dj.setAttribute("aria-setsize",Bj)}
@@ -297,8 +285,7 @@ P<K;
297
285
  P++){let f=n.getItem(P);
298
286
  if(f)V.push(f)}
299
287
  return V}
300
- return[...D]},getVirtualTotal(){return Qj()},getCachedCompression(){return{isCompressed:!1,actualHeight:v.getTotalHeight(),virtualHeight:v.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:Qj(),containerHeight:o,rangeStart:T.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,V){Kj=K,_j=V},setVirtualTotalFn(K){Qj=K},rebuildHeightCache(K){v.rebuild(K??Qj())},setHeightConfig(K){v=EJ(K,Qj())},updateContentSize(K){let V=`${K}
301
- px`;
288
+ return[...D]},getVirtualTotal(){return Qj()},getCachedCompression(){return{isCompressed:!1,actualHeight:v.getTotalHeight(),virtualHeight:v.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:Qj(),containerHeight:o,rangeStart:T.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,V){Kj=K,_j=V},setVirtualTotalFn(K){Qj=K},rebuildHeightCache(K){v.rebuild(K??Qj())},setHeightConfig(K){v=EJ(K,Qj())},updateContentSize(K){let V=`${K}px`;
302
289
  if(Q)B.content.style.width=V;
303
290
  else B.content.style.height=V},updateCompressionMode(){},setVisibleRangeFn(K){Zj=K},setScrollToPosFn(K){Gj=K},setPositionElementFn(K){Ej=K},setScrollFns(K,V){$j=K,qj=(P)=>{V(P),kj()}},setScrollTarget(K){Oj.removeEventListener("scroll",kj),Oj=K,Oj.addEventListener("scroll",kj,{passive:!0})},getScrollTarget(){return Oj},setContainerDimensions(K){q2=K.width,K2=K.height,d=K.width(),o=K.height(),h.viewportState.containerHeight=o},disableViewportResize(){if(dj)dj=!1,lj.unobserve(B.viewport)}};
304
291
  n={getState:()=>({total:D.length,cached:D.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>D.length,getCached:()=>D.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(K)=>D[K],getItemById:(K)=>{let V=x.get(K);
@@ -461,8 +448,7 @@ for(let w=0;
461
448
  w<y;
462
449
  w++)if(X.getCol(w)===0){let D=j.heightCache.getHeight(w);
463
450
  B+=D}
464
- j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}
465
- px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
451
+ j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
466
452
  U.columns=G.columns}
467
453
  if(G.gap!==void 0){if(G.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
468
454
  U.gap=G.gap}
@@ -547,8 +533,7 @@ let M=X.groups;
547
533
  if(N<0||N>=M.length){$.textContent="";
548
534
  return}
549
535
  let A=M[N],L=j.headerTemplate(A.key,A.groupIndex),k=X.getHeaderHeight(N);
550
- if($.style.height=`${k}
551
- px`,typeof L==="string")$.innerHTML=L;
536
+ if($.style.height=`${k}px`,typeof L==="string")$.innerHTML=L;
552
537
  else $.replaceChildren(L)},U=(N)=>{let M=X.groups;
553
538
  if(M.length===0){O();
554
539
  return}
@@ -565,8 +550,7 @@ _(A);
565
550
  let k=X.getHeaderHeight(A),G=0,y=A+1;
566
551
  if(y<M.length){let w=Q.getOffset(M[y].headerLayoutIndex)-N;
567
552
  if(w<k)G=w-k}
568
- if(G!==E)E=G,$.style.transform=G===0?"":`translateY(${Math.round(G)}
569
- px)`},F=()=>{if(Z)return;
553
+ if(G!==E)E=G,$.style.transform=G===0?"":`translateY(${Math.round(G)}px)`},F=()=>{if(Z)return;
570
554
  Z=!0,$.style.display=""},O=()=>{if(!Z)return;
571
555
  Z=!1,$.style.display="none",q=-1,E=0,$.style.transform=""},b=()=>{let N=q;
572
556
  if(q=-1,N>=0)_(N)},W=()=>{$.remove(),q=-1,Z=!1};
@@ -637,15 +621,7 @@ F(),b()},N=()=>{if($.state.isDestroyed)return;
637
621
  O(),b()};
638
622
  $.setRenderFns(W,N);
639
623
  let M=()=>{b(),Z.emit("selection:change",{selected:uj(j),items:hj(j,(L)=>$.dataManager.getItemById(L))})};
640
- Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;
641
- width:1px;
642
- height:1px;
643
- padding:0;
644
- margin:-1px;
645
- overflow:hidden;
646
- clip:rect(0,0,0,0);
647
- white-space:nowrap;
648
- border:0",q.root.appendChild(Y);
624
+ Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(Y);
649
625
  let A=Y;
650
626
  Z.on("selection:change",({selected:L})=>{let k=L.length;
651
627
  if(k===0)A.textContent="";
@@ -688,10 +664,8 @@ let{renderRange:L,isCompressed:k}=$.state.viewportState,G=$.getItemsForRange(L),
688
664
  $.renderer.render(G,L,j.selected,j.focusedIndex,y),Z.emit("selection:change",{selected:[],items:[]})}),$.methods.set("getSelected",()=>{return uj(j)}),$.methods.set("getSelectedItems",()=>{return hj(j,(L)=>$.dataManager.getItemById(L))}),$.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(Y&&Y.parentNode)Y.remove();
689
665
  Y=null}}};
690
666
  var Tj=(J,X,Q={},j="vlist",Y=!1)=>{let{autoHide:$=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:E=!0,hoverZoneWidth:_=16,showOnViewportEnter:U=!0}=Q,F=0,O=0,b=0,W=0,N=!1,M=!1,A=0,L=0,k=0,G=null,y=!1,B=null,w=null,D=Y?"width":"height",v=Y?"translateX":"translateY",g=Y?(t)=>t.clientX:(t)=>t.clientY,o=Y?"left":"top",d=document.createElement("div"),jj=document.createElement("div"),i=E?document.createElement("div"):null,H=()=>{if(d.className=`${j}-scrollbar`,jj.className=`${j}-scrollbar-thumb`,Y)d.classList.add(`${j}-scrollbar--horizontal`);
691
- if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}
692
- px`;
693
- else i.style.width=`${_}
694
- px`;
667
+ if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}px`;
668
+ else i.style.width=`${_}px`;
695
669
  J.appendChild(i)}},R=()=>{if(G)clearTimeout(G),G=null},I=()=>{if(!$)return;
696
670
  R(),G=setTimeout(z,q)},p=()=>{if(F<=O)return;
697
671
  if(R(),!y)d.classList.add(`${j}-scrollbar--visible`),y=!0;
@@ -701,16 +675,13 @@ let C=F>O;
701
675
  if(d.style.display=C?"":"none",!C){z();
702
676
  return}
703
677
  let S=O/F;
704
- b=Math.max(Z,S*O),jj.style[D]=`${b}
705
- px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
678
+ b=Math.max(Z,S*O),jj.style[D]=`${b}px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
706
679
  let Jj=F-O,S=Math.min(1,Math.max(0,t/Jj))*W;
707
- jj.style.transform=`${v}(${S}
708
- px)`},h=(t)=>{if(t.target===jj)return;
680
+ jj.style.transform=`${v}(${S}px)`},h=(t)=>{if(t.target===jj)return;
709
681
  let Jj=d.getBoundingClientRect(),s=g(t)-Jj[o]-b/2,m=Math.max(0,Math.min(s,W))/W,$j=F-O,qj=m*$j;
710
682
  X(qj),p()},l=(t)=>{t.preventDefault(),t.stopPropagation(),N=!0,A=g(t),L=k,R(),d.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",a),document.addEventListener("mouseup",Xj)},a=(t)=>{if(!N)return;
711
683
  let Jj=g(t)-A,C=W>0?Jj/W:0,S=F-O,s=C*S,e=Math.max(0,Math.min(L+s,S)),$j=e/S*W;
712
- if(jj.style.transform=`${v}(${$j}
713
- px)`,w=e,B===null)B=requestAnimationFrame(()=>{if(w!==null)X(w);
684
+ if(jj.style.transform=`${v}(${$j}px)`,w=e,B===null)B=requestAnimationFrame(()=>{if(w!==null)X(w);
714
685
  B=null})},Xj=()=>{if(N=!1,B!==null)cancelAnimationFrame(B),B=null;
715
686
  if(w!==null)X(w),w=null;
716
687
  if(d.classList.remove(`${j}-scrollbar--dragging`),$&&!M)I();
@@ -751,13 +722,9 @@ return _()},j.setVisibleRangeFn((U,F,O,b,W)=>{let N=Fj(b,O);
751
722
  bJ(U,F,O,b,N,W)}),j.setScrollToPosFn((U,F,O,b,W)=>{let N=Fj(b,F);
752
723
  return kJ(U,F,O,b,N,W)}),j.setPositionElementFn((U,F)=>{let O=j.getVirtualTotal(),b=Fj(O,j.heightCache);
753
724
  if(b.isCompressed){let W=Math.round(Ij(F,j.scrollController.getScrollTop(),j.heightCache,O,j.state.viewportState.containerHeight,b)),N=j.config.horizontal;
754
- U.style.transform=N?`translateX(${W}
755
- px)`:`translateY(${W}
756
- px)`}
725
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}
757
726
  else{let W=Math.round(j.heightCache.getOffset(F)),N=j.config.horizontal;
758
- U.style.transform=N?`translateX(${W}
759
- px)`:`translateY(${W}
760
- px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
727
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
761
728
  var rJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(J){J.methods.set("getScrollSnapshot",()=>{let X=J.scrollController.getScrollTop(),Q=J.getCachedCompression(),j=J.getVirtualTotal(),Y=J.methods.get("getSelected"),$=Y&&Y().length>0?Y():void 0;
762
729
  if(j===0){let _={index:0,offsetInItem:0};
763
730
  if($)_.selectedIds=$;
@@ -1,8 +1,6 @@
1
1
  var Gj=(j,J,G={},_="vlist",F=!1)=>{let{autoHide:E=!0,autoHideDelay:D=1000,minThumbSize:H=30,showOnHover:V=!0,hoverZoneWidth:X=16,showOnViewportEnter:Z=!0}=G,Q=0,U=0,W=0,N=0,O=!1,q=!1,y=0,f=0,h=0,I=null,p=!1,R=null,M=null,S=F?"width":"height",x=F?"translateX":"translateY",b=F?(B)=>B.clientX:(B)=>B.clientY,t=F?"left":"top",L=document.createElement("div"),C=document.createElement("div"),A=V?document.createElement("div"):null,i=()=>{if(L.className=`${_}-scrollbar`,C.className=`${_}-scrollbar-thumb`,F)L.classList.add(`${_}-scrollbar--horizontal`);
2
- if(L.appendChild(C),j.appendChild(L),A){if(A.className=`${_}-scrollbar-hover`,F)A.classList.add(`${_}-scrollbar-hover--horizontal`),A.style.height=`${X}
3
- px`;
4
- else A.style.width=`${X}
5
- px`;
2
+ if(L.appendChild(C),j.appendChild(L),A){if(A.className=`${_}-scrollbar-hover`,F)A.classList.add(`${_}-scrollbar-hover--horizontal`),A.style.height=`${X}px`;
3
+ else A.style.width=`${X}px`;
6
4
  j.appendChild(A)}},T=()=>{if(I)clearTimeout(I),I=null},P=()=>{if(!E)return;
7
5
  T(),I=setTimeout(d,D)},k=()=>{if(Q<=U)return;
8
6
  if(T(),!p)L.classList.add(`${_}-scrollbar--visible`),p=!0;
@@ -12,16 +10,13 @@ let m=Q>U;
12
10
  if(L.style.display=m?"":"none",!m){d();
13
11
  return}
14
12
  let z=U/Q;
15
- W=Math.max(H,z*U),C.style[S]=`${W}
16
- px`,N=U-W,s(h)},s=(B)=>{if(h=B,Q<=U||N<=0)return;
13
+ W=Math.max(H,z*U),C.style[S]=`${W}px`,N=U-W,s(h)},s=(B)=>{if(h=B,Q<=U||N<=0)return;
17
14
  let g=Q-U,z=Math.min(1,Math.max(0,B/g))*N;
18
- C.style.transform=`${x}(${z}
19
- px)`},c=(B)=>{if(B.target===C)return;
15
+ C.style.transform=`${x}(${z}px)`},c=(B)=>{if(B.target===C)return;
20
16
  let g=L.getBoundingClientRect(),o=b(B)-g[t]-W/2,Kj=Math.max(0,Math.min(o,N))/N,jj=Q-U,Xj=Kj*jj;
21
17
  J(Xj),k()},n=(B)=>{B.preventDefault(),B.stopPropagation(),O=!0,y=b(B),f=h,T(),L.classList.add(`${_}-scrollbar--dragging`),document.addEventListener("mousemove",w),document.addEventListener("mouseup",v)},w=(B)=>{if(!O)return;
22
18
  let g=b(B)-y,m=N>0?g/N:0,z=Q-U,o=m*z,e=Math.max(0,Math.min(f+o,z)),jj=e/z*N;
23
- if(C.style.transform=`${x}(${jj}
24
- px)`,M=e,R===null)R=requestAnimationFrame(()=>{if(M!==null)J(M);
19
+ if(C.style.transform=`${x}(${jj}px)`,M=e,R===null)R=requestAnimationFrame(()=>{if(M!==null)J(M);
25
20
  R=null})},v=()=>{if(O=!1,R!==null)cancelAnimationFrame(R),R=null;
26
21
  if(M!==null)J(M),M=null;
27
22
  if(L.classList.remove(`${_}-scrollbar--dragging`),E&&!q)P();
@@ -51,15 +51,7 @@ W(),b()},I=()=>{if(q.state.isDestroyed)return;
51
51
  g(),b()};
52
52
  q.setRenderFns(x,I);
53
53
  let A=()=>{b(),U.emit("selection:change",{selected:y(j),items:O(j,(K)=>q.dataManager.getItemById(K))})};
54
- J=document.createElement("div"),J.setAttribute("aria-live","polite"),J.setAttribute("aria-atomic","true"),J.className=`${k}-live-region`,J.style.cssText="position:absolute;
55
- width:1px;
56
- height:1px;
57
- padding:0;
58
- margin:-1px;
59
- overflow:hidden;
60
- clip:rect(0,0,0,0);
61
- white-space:nowrap;
62
- border:0",X.root.appendChild(J);
54
+ J=document.createElement("div"),J.setAttribute("aria-live","polite"),J.setAttribute("aria-atomic","true"),J.className=`${k}-live-region`,J.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",X.root.appendChild(J);
63
55
  let z=J;
64
56
  U.on("selection:change",({selected:K})=>{let Q=K.length;
65
57
  if(Q===0)z.textContent="";
@@ -70,15 +70,11 @@ if($j<Bj&&!Yj.has($j)){let t=$.getHeight(n);
70
70
  x+=t,Yj.add($j)}}
71
71
  Xj=x}
72
72
  else Xj=T(R,u);
73
- z.style.transform=`translate(${Math.round(a)}
74
- px, ${Math.round(Xj)}
75
- px)`},w=(z,R)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),c;
73
+ z.style.transform=`translate(${Math.round(a)}px, ${Math.round(Xj)}px)`},w=(z,R)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),c;
76
74
  if(F||u)c=$.getHeight(R)-j.gap;
77
75
  else{let a=j.getRow(R);
78
76
  c=$.getHeight(a)-j.gap}
79
- z.style.width=`${h}
80
- px`,z.style.height=`${c}
81
- px`},g=(z,R,u,h,c)=>{let a=E.acquire(),Xj=A(u,h);
77
+ z.style.width=`${h}px`,z.style.height=`${c}px`},g=(z,R,u,h,c)=>{let a=E.acquire(),Xj=A(u,h);
82
78
  if(a.className=L,a.dataset.index=String(z),a.dataset.id=String(R.id),a.dataset.row=String(j.getRow(z)),a.dataset.col=String(j.getCol(z)),a.ariaSelected=String(u),Z)a.id=`${Z}-item-${z}`;
83
79
  if(q)W=String(q()),a.setAttribute("aria-setsize",W),a.setAttribute("aria-posinset",String(z+1));
84
80
  w(a,z);
@@ -207,17 +203,11 @@ let n=null,$j=()=>n?n.getTotal():V.length,t=[],Jj=[],C=[],S=[],s=[],e=[],m=new M
207
203
  else B.viewport.scrollTop=K},Mj=(K=2)=>{let D=w.getTotalHeight();
208
204
  return H+o>=D-K},Uj=!1,Kj,_j,Zj=(K,D,P,f,r)=>{w2(K,D,P,f,r)},Gj=(K,D,P,f,r)=>{return C2(K,D,P,f,r)},Wj=(K,D)=>{if(typeof D==="string")K.innerHTML=D;
209
205
  else K.replaceChildren(D)},Ej=(K,D)=>{let P=Math.round(w.getOffset(D));
210
- if($)K.style.transform=`translateX(${P}
211
- px)`;
212
- else K.style.transform=`translateY(${P}
213
- px)`},eJ=(K,D)=>{let P=g.acquire();
214
- if(P.className=Xj,$){if(P.style.width=`${w.getHeight(K)}
215
- px`,M!=null)P.style.height=`${M}
216
- px`}
217
- else P.style.height=`${w.getHeight(K)}
218
- px`;
219
- return P.dataset.index=String(K),P.dataset.id=String(D.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String($j()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(D,K,a)),Ej(P,K),P},bj=()=>{let K=`${w.getTotalHeight()}
220
- px`;
206
+ if($)K.style.transform=`translateX(${P}px)`;
207
+ else K.style.transform=`translateY(${P}px)`},eJ=(K,D)=>{let P=g.acquire();
208
+ if(P.className=Xj,$){if(P.style.width=`${w.getHeight(K)}px`,M!=null)P.style.height=`${M}px`}
209
+ else P.style.height=`${w.getHeight(K)}px`;
210
+ return P.dataset.index=String(K),P.dataset.id=String(D.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String($j()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(D,K,a)),Ej(P,K),P},bj=()=>{let K=`${w.getTotalHeight()}px`;
221
211
  if($)B.content.style.width=K;
222
212
  else B.content.style.height=K},xj=new Set,mj=-1,j2=()=>{if(jj)return;
223
213
  let K=$j();
@@ -232,10 +222,8 @@ l++){let Dj=n?n.getItem(l):V[l];
232
222
  if(!Dj)continue;
233
223
  let Vj=c.get(l);
234
224
  if(Vj){let Aj=Vj.dataset.id,Cj=String(Dj.id);
235
- if(Aj!==Cj)if(Wj(Vj,A(Dj,l,a)),Vj.dataset.id=Cj,$)Vj.style.width=`${w.getHeight(l)}
236
- px`;
237
- else Vj.style.height=`${w.getHeight(l)}
238
- px`;
225
+ if(Aj!==Cj)if(Wj(Vj,A(Dj,l,a)),Vj.dataset.id=Cj,$)Vj.style.width=`${w.getHeight(l)}px`;
226
+ else Vj.style.height=`${w.getHeight(l)}px`;
239
227
  Ej(Vj,l);
240
228
  let Sj=xj.has(Dj.id),M2=l===mj;
241
229
  if(Vj.classList.toggle(`${Z}-item--selected`,Sj),Vj.classList.toggle(`${Z}-item--focused`,M2),Vj.ariaSelected=Sj?"true":"false",P)Vj.setAttribute("aria-setsize",Bj)}
@@ -295,8 +283,7 @@ P<K;
295
283
  P++){let f=n.getItem(P);
296
284
  if(f)D.push(f)}
297
285
  return D}
298
- return[...V]},getVirtualTotal(){return $j()},getCachedCompression(){return{isCompressed:!1,actualHeight:w.getTotalHeight(),virtualHeight:w.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:$j(),containerHeight:o,rangeStart:R.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,D){Kj=K,_j=D},setVirtualTotalFn(K){$j=K},rebuildHeightCache(K){w.rebuild(K??$j())},setHeightConfig(K){w=MJ(K,$j())},updateContentSize(K){let D=`${K}
299
- px`;
286
+ return[...V]},getVirtualTotal(){return $j()},getCachedCompression(){return{isCompressed:!1,actualHeight:w.getTotalHeight(),virtualHeight:w.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:$j(),containerHeight:o,rangeStart:R.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,D){Kj=K,_j=D},setVirtualTotalFn(K){$j=K},rebuildHeightCache(K){w.rebuild(K??$j())},setHeightConfig(K){w=MJ(K,$j())},updateContentSize(K){let D=`${K}px`;
300
287
  if($)B.content.style.width=D;
301
288
  else B.content.style.height=D},updateCompressionMode(){},setVisibleRangeFn(K){Zj=K},setScrollToPosFn(K){Gj=K},setPositionElementFn(K){Ej=K},setScrollFns(K,D){Qj=K,qj=(P)=>{D(P),kj()}},setScrollTarget(K){Oj.removeEventListener("scroll",kj),Oj=K,Oj.addEventListener("scroll",kj,{passive:!0})},getScrollTarget(){return Oj},setContainerDimensions(K){$2=K.width,X2=K.height,d=K.width(),o=K.height(),h.viewportState.containerHeight=o},disableViewportResize(){if(gj)gj=!1,dj.unobserve(B.viewport)}};
302
289
  n={getState:()=>({total:V.length,cached:V.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>V.length,getCached:()=>V.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(K)=>V[K],getItemById:(K)=>{let D=x.get(K);
@@ -459,8 +446,7 @@ for(let T=0;
459
446
  T<y;
460
447
  T++)if(X.getCol(T)===0){let V=j.heightCache.getHeight(T);
461
448
  B+=V}
462
- j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}
463
- px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
449
+ j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
464
450
  U.columns=G.columns}
465
451
  if(G.gap!==void 0){if(G.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
466
452
  U.gap=G.gap}
@@ -545,8 +531,7 @@ let M=X.groups;
545
531
  if(N<0||N>=M.length){Q.textContent="";
546
532
  return}
547
533
  let A=M[N],L=j.headerTemplate(A.key,A.groupIndex),k=X.getHeaderHeight(N);
548
- if(Q.style.height=`${k}
549
- px`,typeof L==="string")Q.innerHTML=L;
534
+ if(Q.style.height=`${k}px`,typeof L==="string")Q.innerHTML=L;
550
535
  else Q.replaceChildren(L)},U=(N)=>{let M=X.groups;
551
536
  if(M.length===0){O();
552
537
  return}
@@ -563,8 +548,7 @@ _(A);
563
548
  let k=X.getHeaderHeight(A),G=0,y=A+1;
564
549
  if(y<M.length){let T=$.getOffset(M[y].headerLayoutIndex)-N;
565
550
  if(T<k)G=T-k}
566
- if(G!==E)E=G,Q.style.transform=G===0?"":`translateY(${Math.round(G)}
567
- px)`},F=()=>{if(Z)return;
551
+ if(G!==E)E=G,Q.style.transform=G===0?"":`translateY(${Math.round(G)}px)`},F=()=>{if(Z)return;
568
552
  Z=!0,Q.style.display=""},O=()=>{if(!Z)return;
569
553
  Z=!1,Q.style.display="none",q=-1,E=0,Q.style.transform=""},b=()=>{let N=q;
570
554
  if(q=-1,N>=0)_(N)},W=()=>{Q.remove(),q=-1,Z=!1};
@@ -635,15 +619,7 @@ F(),b()},N=()=>{if(Q.state.isDestroyed)return;
635
619
  O(),b()};
636
620
  Q.setRenderFns(W,N);
637
621
  let M=()=>{b(),Z.emit("selection:change",{selected:pj(j),items:uj(j,(L)=>Q.dataManager.getItemById(L))})};
638
- Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;
639
- width:1px;
640
- height:1px;
641
- padding:0;
642
- margin:-1px;
643
- overflow:hidden;
644
- clip:rect(0,0,0,0);
645
- white-space:nowrap;
646
- border:0",q.root.appendChild(Y);
622
+ Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(Y);
647
623
  let A=Y;
648
624
  Z.on("selection:change",({selected:L})=>{let k=L.length;
649
625
  if(k===0)A.textContent="";
@@ -686,10 +662,8 @@ let{renderRange:L,isCompressed:k}=Q.state.viewportState,G=Q.getItemsForRange(L),
686
662
  Q.renderer.render(G,L,j.selected,j.focusedIndex,y),Z.emit("selection:change",{selected:[],items:[]})}),Q.methods.set("getSelected",()=>{return pj(j)}),Q.methods.set("getSelectedItems",()=>{return uj(j,(L)=>Q.dataManager.getItemById(L))}),Q.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(Y&&Y.parentNode)Y.remove();
687
663
  Y=null}}};
688
664
  var Rj=(J,X,$={},j="vlist",Y=!1)=>{let{autoHide:Q=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:E=!0,hoverZoneWidth:_=16,showOnViewportEnter:U=!0}=$,F=0,O=0,b=0,W=0,N=!1,M=!1,A=0,L=0,k=0,G=null,y=!1,B=null,T=null,V=Y?"width":"height",w=Y?"translateX":"translateY",g=Y?(t)=>t.clientX:(t)=>t.clientY,o=Y?"left":"top",d=document.createElement("div"),jj=document.createElement("div"),i=E?document.createElement("div"):null,H=()=>{if(d.className=`${j}-scrollbar`,jj.className=`${j}-scrollbar-thumb`,Y)d.classList.add(`${j}-scrollbar--horizontal`);
689
- if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}
690
- px`;
691
- else i.style.width=`${_}
692
- px`;
665
+ if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}px`;
666
+ else i.style.width=`${_}px`;
693
667
  J.appendChild(i)}},v=()=>{if(G)clearTimeout(G),G=null},I=()=>{if(!Q)return;
694
668
  v(),G=setTimeout(z,q)},p=()=>{if(F<=O)return;
695
669
  if(v(),!y)d.classList.add(`${j}-scrollbar--visible`),y=!0;
@@ -699,16 +673,13 @@ let C=F>O;
699
673
  if(d.style.display=C?"":"none",!C){z();
700
674
  return}
701
675
  let S=O/F;
702
- b=Math.max(Z,S*O),jj.style[V]=`${b}
703
- px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
676
+ b=Math.max(Z,S*O),jj.style[V]=`${b}px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
704
677
  let Jj=F-O,S=Math.min(1,Math.max(0,t/Jj))*W;
705
- jj.style.transform=`${w}(${S}
706
- px)`},h=(t)=>{if(t.target===jj)return;
678
+ jj.style.transform=`${w}(${S}px)`},h=(t)=>{if(t.target===jj)return;
707
679
  let Jj=d.getBoundingClientRect(),s=g(t)-Jj[o]-b/2,m=Math.max(0,Math.min(s,W))/W,Qj=F-O,qj=m*Qj;
708
680
  X(qj),p()},c=(t)=>{t.preventDefault(),t.stopPropagation(),N=!0,A=g(t),L=k,v(),d.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",a),document.addEventListener("mouseup",Xj)},a=(t)=>{if(!N)return;
709
681
  let Jj=g(t)-A,C=W>0?Jj/W:0,S=F-O,s=C*S,e=Math.max(0,Math.min(L+s,S)),Qj=e/S*W;
710
- if(jj.style.transform=`${w}(${Qj}
711
- px)`,T=e,B===null)B=requestAnimationFrame(()=>{if(T!==null)X(T);
682
+ if(jj.style.transform=`${w}(${Qj}px)`,T=e,B===null)B=requestAnimationFrame(()=>{if(T!==null)X(T);
712
683
  B=null})},Xj=()=>{if(N=!1,B!==null)cancelAnimationFrame(B),B=null;
713
684
  if(T!==null)X(T),T=null;
714
685
  if(d.classList.remove(`${j}-scrollbar--dragging`),Q&&!M)I();
@@ -749,13 +720,9 @@ return _()},j.setVisibleRangeFn((U,F,O,b,W)=>{let N=Fj(b,O);
749
720
  zJ(U,F,O,b,N,W)}),j.setScrollToPosFn((U,F,O,b,W)=>{let N=Fj(b,F);
750
721
  return PJ(U,F,O,b,N,W)}),j.setPositionElementFn((U,F)=>{let O=j.getVirtualTotal(),b=Fj(O,j.heightCache);
751
722
  if(b.isCompressed){let W=Math.round(fj(F,j.scrollController.getScrollTop(),j.heightCache,O,j.state.viewportState.containerHeight,b)),N=j.config.horizontal;
752
- U.style.transform=N?`translateX(${W}
753
- px)`:`translateY(${W}
754
- px)`}
723
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}
755
724
  else{let W=Math.round(j.heightCache.getOffset(F)),N=j.config.horizontal;
756
- U.style.transform=N?`translateX(${W}
757
- px)`:`translateY(${W}
758
- px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
725
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
759
726
  var lJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(J){J.methods.set("getScrollSnapshot",()=>{let X=J.scrollController.getScrollTop(),$=J.getCachedCompression(),j=J.getVirtualTotal(),Y=J.methods.get("getSelected"),Q=Y&&Y().length>0?Y():void 0;
760
727
  if(j===0){let _={index:0,offsetInItem:0};
761
728
  if(Q)_.selectedIds=Q;
package/dist/vue/index.js CHANGED
@@ -70,15 +70,11 @@ if(Qj<Bj&&!Yj.has(Qj)){let t=Q.getHeight(n);
70
70
  x+=t,Yj.add(Qj)}}
71
71
  Xj=x}
72
72
  else Xj=w(T,u);
73
- z.style.transform=`translate(${Math.round(a)}
74
- px, ${Math.round(Xj)}
75
- px)`},R=(z,T)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),l;
73
+ z.style.transform=`translate(${Math.round(a)}px, ${Math.round(Xj)}px)`},R=(z,T)=>{let u=z.dataset.id?.startsWith("__group_header"),h=u?U:j.getColumnWidth(U),l;
76
74
  if(F||u)l=Q.getHeight(T)-j.gap;
77
75
  else{let a=j.getRow(T);
78
76
  l=Q.getHeight(a)-j.gap}
79
- z.style.width=`${h}
80
- px`,z.style.height=`${l}
81
- px`},g=(z,T,u,h,l)=>{let a=E.acquire(),Xj=A(u,h);
77
+ z.style.width=`${h}px`,z.style.height=`${l}px`},g=(z,T,u,h,l)=>{let a=E.acquire(),Xj=A(u,h);
82
78
  if(a.className=L,a.dataset.index=String(z),a.dataset.id=String(T.id),a.dataset.row=String(j.getRow(z)),a.dataset.col=String(j.getCol(z)),a.ariaSelected=String(u),Z)a.id=`${Z}-item-${z}`;
83
79
  if(q)W=String(q()),a.setAttribute("aria-setsize",W),a.setAttribute("aria-posinset",String(z+1));
84
80
  R(a,z);
@@ -209,17 +205,11 @@ let n=null,Qj=()=>n?n.getTotal():D.length,t=[],Jj=[],C=[],S=[],s=[],e=[],m=new M
209
205
  else B.viewport.scrollTop=K},Mj=(K=2)=>{let V=R.getTotalHeight();
210
206
  return H+o>=V-K},Uj=!1,Kj,_j,Zj=(K,V,P,f,r)=>{C2(K,V,P,f,r)},Gj=(K,V,P,f,r)=>{return f2(K,V,P,f,r)},Wj=(K,V)=>{if(typeof V==="string")K.innerHTML=V;
211
207
  else K.replaceChildren(V)},Ej=(K,V)=>{let P=Math.round(R.getOffset(V));
212
- if(Q)K.style.transform=`translateX(${P}
213
- px)`;
214
- else K.style.transform=`translateY(${P}
215
- px)`},J2=(K,V)=>{let P=g.acquire();
216
- if(P.className=Xj,Q){if(P.style.width=`${R.getHeight(K)}
217
- px`,M!=null)P.style.height=`${M}
218
- px`}
219
- else P.style.height=`${R.getHeight(K)}
220
- px`;
221
- return P.dataset.index=String(K),P.dataset.id=String(V.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String(Qj()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(V,K,a)),Ej(P,K),P},bj=()=>{let K=`${R.getTotalHeight()}
222
- px`;
208
+ if(Q)K.style.transform=`translateX(${P}px)`;
209
+ else K.style.transform=`translateY(${P}px)`},J2=(K,V)=>{let P=g.acquire();
210
+ if(P.className=Xj,Q){if(P.style.width=`${R.getHeight(K)}px`,M!=null)P.style.height=`${M}px`}
211
+ else P.style.height=`${R.getHeight(K)}px`;
212
+ return P.dataset.index=String(K),P.dataset.id=String(V.id),P.ariaSelected="false",P.id=`${W}-item-${K}`,Bj=String(Qj()),P.setAttribute("aria-setsize",Bj),P.setAttribute("aria-posinset",String(K+1)),Wj(P,A(V,K,a)),Ej(P,K),P},bj=()=>{let K=`${R.getTotalHeight()}px`;
223
213
  if(Q)B.content.style.width=K;
224
214
  else B.content.style.height=K},xj=new Set,mj=-1,$2=()=>{if(jj)return;
225
215
  let K=Qj();
@@ -234,10 +224,8 @@ c++){let Vj=n?n.getItem(c):D[c];
234
224
  if(!Vj)continue;
235
225
  let Dj=l.get(c);
236
226
  if(Dj){let Aj=Dj.dataset.id,Cj=String(Vj.id);
237
- if(Aj!==Cj)if(Wj(Dj,A(Vj,c,a)),Dj.dataset.id=Cj,Q)Dj.style.width=`${R.getHeight(c)}
238
- px`;
239
- else Dj.style.height=`${R.getHeight(c)}
240
- px`;
227
+ if(Aj!==Cj)if(Wj(Dj,A(Vj,c,a)),Dj.dataset.id=Cj,Q)Dj.style.width=`${R.getHeight(c)}px`;
228
+ else Dj.style.height=`${R.getHeight(c)}px`;
241
229
  Ej(Dj,c);
242
230
  let Sj=xj.has(Vj.id),E2=c===mj;
243
231
  if(Dj.classList.toggle(`${Z}-item--selected`,Sj),Dj.classList.toggle(`${Z}-item--focused`,E2),Dj.ariaSelected=Sj?"true":"false",P)Dj.setAttribute("aria-setsize",Bj)}
@@ -297,8 +285,7 @@ P<K;
297
285
  P++){let f=n.getItem(P);
298
286
  if(f)V.push(f)}
299
287
  return V}
300
- return[...D]},getVirtualTotal(){return Qj()},getCachedCompression(){return{isCompressed:!1,actualHeight:R.getTotalHeight(),virtualHeight:R.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:Qj(),containerHeight:o,rangeStart:T.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,V){Kj=K,_j=V},setVirtualTotalFn(K){Qj=K},rebuildHeightCache(K){R.rebuild(K??Qj())},setHeightConfig(K){R=MJ(K,Qj())},updateContentSize(K){let V=`${K}
301
- px`;
288
+ return[...D]},getVirtualTotal(){return Qj()},getCachedCompression(){return{isCompressed:!1,actualHeight:R.getTotalHeight(),virtualHeight:R.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:Qj(),containerHeight:o,rangeStart:T.start}},renderIfNeeded(){Kj()},forceRender(){_j()},getRenderFns(){return{renderIfNeeded:Kj,forceRender:_j}},setRenderFns(K,V){Kj=K,_j=V},setVirtualTotalFn(K){Qj=K},rebuildHeightCache(K){R.rebuild(K??Qj())},setHeightConfig(K){R=MJ(K,Qj())},updateContentSize(K){let V=`${K}px`;
302
289
  if(Q)B.content.style.width=V;
303
290
  else B.content.style.height=V},updateCompressionMode(){},setVisibleRangeFn(K){Zj=K},setScrollToPosFn(K){Gj=K},setPositionElementFn(K){Ej=K},setScrollFns(K,V){$j=K,qj=(P)=>{V(P),kj()}},setScrollTarget(K){Oj.removeEventListener("scroll",kj),Oj=K,Oj.addEventListener("scroll",kj,{passive:!0})},getScrollTarget(){return Oj},setContainerDimensions(K){q2=K.width,K2=K.height,d=K.width(),o=K.height(),h.viewportState.containerHeight=o},disableViewportResize(){if(gj)gj=!1,dj.unobserve(B.viewport)}};
304
291
  n={getState:()=>({total:D.length,cached:D.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>D.length,getCached:()=>D.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(K)=>D[K],getItemById:(K)=>{let V=x.get(K);
@@ -461,8 +448,7 @@ for(let w=0;
461
448
  w<y;
462
449
  w++)if(X.getCol(w)===0){let D=j.heightCache.getHeight(w);
463
450
  B+=D}
464
- j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}
465
- px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
451
+ j.heightCache.getTotalHeight=()=>B,j.dom.content.style.height=`${B}px`,A()}),j.methods.set("updateGrid",(G)=>{if(G.columns!==void 0){if(!Number.isInteger(G.columns)||G.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
466
452
  U.columns=G.columns}
467
453
  if(G.gap!==void 0){if(G.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
468
454
  U.gap=G.gap}
@@ -547,8 +533,7 @@ let M=X.groups;
547
533
  if(N<0||N>=M.length){$.textContent="";
548
534
  return}
549
535
  let A=M[N],L=j.headerTemplate(A.key,A.groupIndex),k=X.getHeaderHeight(N);
550
- if($.style.height=`${k}
551
- px`,typeof L==="string")$.innerHTML=L;
536
+ if($.style.height=`${k}px`,typeof L==="string")$.innerHTML=L;
552
537
  else $.replaceChildren(L)},U=(N)=>{let M=X.groups;
553
538
  if(M.length===0){O();
554
539
  return}
@@ -565,8 +550,7 @@ _(A);
565
550
  let k=X.getHeaderHeight(A),G=0,y=A+1;
566
551
  if(y<M.length){let w=Q.getOffset(M[y].headerLayoutIndex)-N;
567
552
  if(w<k)G=w-k}
568
- if(G!==E)E=G,$.style.transform=G===0?"":`translateY(${Math.round(G)}
569
- px)`},F=()=>{if(Z)return;
553
+ if(G!==E)E=G,$.style.transform=G===0?"":`translateY(${Math.round(G)}px)`},F=()=>{if(Z)return;
570
554
  Z=!0,$.style.display=""},O=()=>{if(!Z)return;
571
555
  Z=!1,$.style.display="none",q=-1,E=0,$.style.transform=""},b=()=>{let N=q;
572
556
  if(q=-1,N>=0)_(N)},W=()=>{$.remove(),q=-1,Z=!1};
@@ -637,15 +621,7 @@ F(),b()},N=()=>{if($.state.isDestroyed)return;
637
621
  O(),b()};
638
622
  $.setRenderFns(W,N);
639
623
  let M=()=>{b(),Z.emit("selection:change",{selected:pj(j),items:uj(j,(L)=>$.dataManager.getItemById(L))})};
640
- Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;
641
- width:1px;
642
- height:1px;
643
- padding:0;
644
- margin:-1px;
645
- overflow:hidden;
646
- clip:rect(0,0,0,0);
647
- white-space:nowrap;
648
- border:0",q.root.appendChild(Y);
624
+ Y=document.createElement("div"),Y.setAttribute("aria-live","polite"),Y.setAttribute("aria-atomic","true"),Y.className=`${_}-live-region`,Y.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(Y);
649
625
  let A=Y;
650
626
  Z.on("selection:change",({selected:L})=>{let k=L.length;
651
627
  if(k===0)A.textContent="";
@@ -688,10 +664,8 @@ let{renderRange:L,isCompressed:k}=$.state.viewportState,G=$.getItemsForRange(L),
688
664
  $.renderer.render(G,L,j.selected,j.focusedIndex,y),Z.emit("selection:change",{selected:[],items:[]})}),$.methods.set("getSelected",()=>{return pj(j)}),$.methods.set("getSelectedItems",()=>{return uj(j,(L)=>$.dataManager.getItemById(L))}),$.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(Y&&Y.parentNode)Y.remove();
689
665
  Y=null}}};
690
666
  var Tj=(J,X,Q={},j="vlist",Y=!1)=>{let{autoHide:$=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:E=!0,hoverZoneWidth:_=16,showOnViewportEnter:U=!0}=Q,F=0,O=0,b=0,W=0,N=!1,M=!1,A=0,L=0,k=0,G=null,y=!1,B=null,w=null,D=Y?"width":"height",R=Y?"translateX":"translateY",g=Y?(t)=>t.clientX:(t)=>t.clientY,o=Y?"left":"top",d=document.createElement("div"),jj=document.createElement("div"),i=E?document.createElement("div"):null,H=()=>{if(d.className=`${j}-scrollbar`,jj.className=`${j}-scrollbar-thumb`,Y)d.classList.add(`${j}-scrollbar--horizontal`);
691
- if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}
692
- px`;
693
- else i.style.width=`${_}
694
- px`;
667
+ if(d.appendChild(jj),J.appendChild(d),i){if(i.className=`${j}-scrollbar-hover`,Y)i.classList.add(`${j}-scrollbar-hover--horizontal`),i.style.height=`${_}px`;
668
+ else i.style.width=`${_}px`;
695
669
  J.appendChild(i)}},v=()=>{if(G)clearTimeout(G),G=null},I=()=>{if(!$)return;
696
670
  v(),G=setTimeout(z,q)},p=()=>{if(F<=O)return;
697
671
  if(v(),!y)d.classList.add(`${j}-scrollbar--visible`),y=!0;
@@ -701,16 +675,13 @@ let C=F>O;
701
675
  if(d.style.display=C?"":"none",!C){z();
702
676
  return}
703
677
  let S=O/F;
704
- b=Math.max(Z,S*O),jj.style[D]=`${b}
705
- px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
678
+ b=Math.max(Z,S*O),jj.style[D]=`${b}px`,W=O-b,u(k)},u=(t)=>{if(k=t,F<=O||W<=0)return;
706
679
  let Jj=F-O,S=Math.min(1,Math.max(0,t/Jj))*W;
707
- jj.style.transform=`${R}(${S}
708
- px)`},h=(t)=>{if(t.target===jj)return;
680
+ jj.style.transform=`${R}(${S}px)`},h=(t)=>{if(t.target===jj)return;
709
681
  let Jj=d.getBoundingClientRect(),s=g(t)-Jj[o]-b/2,m=Math.max(0,Math.min(s,W))/W,$j=F-O,qj=m*$j;
710
682
  X(qj),p()},l=(t)=>{t.preventDefault(),t.stopPropagation(),N=!0,A=g(t),L=k,v(),d.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",a),document.addEventListener("mouseup",Xj)},a=(t)=>{if(!N)return;
711
683
  let Jj=g(t)-A,C=W>0?Jj/W:0,S=F-O,s=C*S,e=Math.max(0,Math.min(L+s,S)),$j=e/S*W;
712
- if(jj.style.transform=`${R}(${$j}
713
- px)`,w=e,B===null)B=requestAnimationFrame(()=>{if(w!==null)X(w);
684
+ if(jj.style.transform=`${R}(${$j}px)`,w=e,B===null)B=requestAnimationFrame(()=>{if(w!==null)X(w);
714
685
  B=null})},Xj=()=>{if(N=!1,B!==null)cancelAnimationFrame(B),B=null;
715
686
  if(w!==null)X(w),w=null;
716
687
  if(d.classList.remove(`${j}-scrollbar--dragging`),$&&!M)I();
@@ -751,13 +722,9 @@ return _()},j.setVisibleRangeFn((U,F,O,b,W)=>{let N=Fj(b,O);
751
722
  zJ(U,F,O,b,N,W)}),j.setScrollToPosFn((U,F,O,b,W)=>{let N=Fj(b,F);
752
723
  return PJ(U,F,O,b,N,W)}),j.setPositionElementFn((U,F)=>{let O=j.getVirtualTotal(),b=Fj(O,j.heightCache);
753
724
  if(b.isCompressed){let W=Math.round(fj(F,j.scrollController.getScrollTop(),j.heightCache,O,j.state.viewportState.containerHeight,b)),N=j.config.horizontal;
754
- U.style.transform=N?`translateX(${W}
755
- px)`:`translateY(${W}
756
- px)`}
725
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}
757
726
  else{let W=Math.round(j.heightCache.getOffset(F)),N=j.config.horizontal;
758
- U.style.transform=N?`translateX(${W}
759
- px)`:`translateY(${W}
760
- px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
727
+ U.style.transform=N?`translateX(${W}px)`:`translateY(${W}px)`}}),E(),j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null})},destroy(){if(J)J.destroy(),J=null}}};
761
728
  var cJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(J){J.methods.set("getScrollSnapshot",()=>{let X=J.scrollController.getScrollTop(),Q=J.getCachedCompression(),j=J.getVirtualTotal(),Y=J.methods.get("getSelected"),$=Y&&Y().length>0?Y():void 0;
762
729
  if(j===0){let _={index:0,offsetInItem:0};
763
730
  if($)_.selectedIds=$;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floor/vlist",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",