@floor/vlist 0.5.5 → 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.
@@ -1 +1,198 @@
1
- var a=(Y)=>{let q=Math.max(1,Math.floor(Y.columns)),J=Y.gap??0,j=Y.isHeaderFn,D={row:0,col:0},X=(K)=>{if(K<=0)return 0;if(!j)return Math.ceil(K/q);let $=0,N=0,B=0;for(let y=0;y<K;y++)if(j(y)){if(B++,N>0)$++,N=0;$++,N=0}else if(N++,N>=q)$++,N=0;if(N>0)$++;return $},G=(K)=>{return D.row=O(K),D.col=b(K),D},O=(K)=>{if(!j)return Math.floor(K/q);let $=0,N=0;for(let B=0;B<=K;B++)if(j(B)){if(N>0)$++,N=0;if(B===K)return $;$++,N=0}else{if(B===K)return $;if(N++,N>=q)$++,N=0}return console.warn(`⚠️ getRow(${K}) fell through - returning ${$}`),$},b=(K)=>{if(!j)return K%q;if(j(K))return 0;let $=0;for(let N=0;N<=K;N++)if(j(N))$=0;else{if(N===K)return $;if($++,$>=q)$=0}return $},W=(K,$,N)=>{if(N<=0)return{start:0,end:-1};if(!j){let M=Math.max(0,K*q),V=Math.min(N-1,($+1)*q-1);return{start:M,end:V}}let B=-1,y=-1,T=0,k=0;for(let M=0;M<N;M++){if(j(M)){if(k>0)T++,k=0;if(T>=K&&T<=$){if(B===-1)B=M;y=M}T++,k=0}else{if(T>=K&&T<=$){if(B===-1)B=M;y=M}if(k++,k>=q)T++,k=0}if(T>$&&k===0)break}if(B===-1)return{start:0,end:-1};return{start:B,end:y}},P=(K,$,N)=>{if($<0||$>=q)return-1;let B=K*q+$;if(B<0||B>=N)return-1;return B},F=(K)=>{let $=(q-1)*J;return Math.max(0,(K-$)/q)};return{get columns(){return q},get gap(){return J},update:(K)=>{if(K.columns!==void 0)q=Math.max(1,Math.floor(K.columns));if(K.gap!==void 0)J=K.gap;if(K.isHeaderFn!==void 0)j=K.isHeaderFn},getTotalRows:X,getPosition:G,getRow:O,getCol:b,getItemRange:W,getItemIndex:P,getColumnWidth:F,getColumnOffset:(K,$)=>{let N=F($);return K*(N+J)}}};var n=16000000;var J2=(Y,q,J)=>{if(J===0)return 0;if(!Y.isVariable())return Math.floor(q/Y.getHeight(0));let j=0,D=0;for(let X=J-1;X>=0;X--){let G=Y.getHeight(X);if(D+G>q)break;D+=G,j++}return Math.max(j,1)},o=(Y,q,J)=>{if(J===0)return 0;let j=Math.floor(q),D=q-j,X=Math.max(0,Math.min(j,J-1));return Y.getOffset(X)+D*Y.getHeight(X)};var K2=(Y,q)=>{let J=q.getTotalHeight(),j=J>n,D=j?n:J,X=J>0?D/J:1;return{isCompressed:j,actualHeight:J,virtualHeight:D,ratio:X}};var Q2=(Y,q,J,j,D,X,G)=>{if(!X.isCompressed||j===0)return J.getOffset(Y);let{virtualHeight:O}=X,b=O-D,W=b-q;if(W<=D&&W>=-1){if(q>=b-1){let T=J.getTotalHeight()-J.getOffset(Y);return D-T}let w=J2(J,D,j),C=Math.max(0,j-w),$=q/O*j,N=Math.max(0,Math.min(1,1-W/D)),B=J.getOffset(Y)-J.getOffset(C),y=J.getOffset(Y)-o(J,$,j);return y+(B-y)*N}let F=q/O*j;return J.getOffset(Y)-o(J,F,j)};var Y2=(Y)=>{return Y!==null&&typeof Y==="object"&&Y.__groupHeader===!0};var N2=(Y=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let G=document.createElement("div");return G.setAttribute("role","option"),G},release:(X)=>{if(q.length<Y)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},i=(Y,q,J,j,D,X,G,O)=>{let b=N2(),W=new Map,P=X,F=!1,w=null,C=0,K="",$=(Q)=>{if(w&&C===Q)return w;return w=K2(Q,J),C=Q,w},N={selected:!1,focused:!1},B=(Q,Z)=>{return N.selected=Q,N.focused=Z,N},y=`${D}-item ${D}-grid-item`,T=`${D}-item--selected`,k=`${D}-item--focused`,M=(Q,Z)=>{if(typeof Z==="string")Q.innerHTML=Z;else Q.replaceChildren(Z)},V=(Q,Z,U)=>{Q.classList.toggle(T,Z),Q.classList.toggle(k,U)},A=(Q,Z)=>{let U=j.getRow(Q);if(Z){let L=Z.totalItems,E=$(L);if(E.isCompressed)return Q2(U,Z.scrollTop,J,L,Z.containerHeight,E,Z.rangeStart)}return J.getOffset(U)},S=(Q,Z,U)=>{let L=Q.dataset.id?.startsWith("__group_header"),E=L?0:j.getCol(Z),_=L?0:j.getColumnOffset(E,P),f;if(F){let x=j.getRow(Z),z=0,u=new Set;for(let R=0;R<Z;R++){let p=j.getRow(R);if(p<x&&!u.has(p)){let l=J.getHeight(R);z+=l,u.add(p)}}f=z}else f=A(Z,U);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;if(F||U)E=J.getHeight(Z)-j.gap;else{let _=j.getRow(Z);E=J.getHeight(_)-j.gap}Q.style.width=`${L}px`,Q.style.height=`${E}px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);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}`;if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));v(_,Q);let x=q(Z,Q,f);return M(_,x),V(_,U,L),S(_,Q,E),_},d=(Q,Z,U,L,E)=>{if(Z.start===0&&Q.length>0)F=Y2(Q[0]);for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),b.release(u.element),W.delete(z);let _=!1;if(G){let z=String(G());_=z!==K,K=z}let f=document.createDocumentFragment(),x=[];for(let z=Z.start;z<=Z.end;z++){let u=z-Z.start,R=Q[u];if(!R){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${Z.start}-${Z.end}, items.length: ${Q.length})`);continue}let p=U.has(R.id),l=z===L,H=W.get(z);if(H){let c=H.element.dataset.id,q2=String(R.id);if(c!==q2){let $2=B(p,l),k2=q(R,z,$2);M(H.element,k2),H.element.dataset.id=q2,H.element.dataset.row=String(j.getRow(z)),H.element.dataset.col=String(j.getCol(z)),v(H.element,z)}if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,E),_)H.element.setAttribute("aria-setsize",K)}else{let c=I(z,R,p,l,E);f.appendChild(c),x.push({index:z,element:c})}}if(x.length>0){Y.appendChild(f);for(let{index:z,element:u}of x)W.set(z,{index:z,element:u})}},h=(Q)=>{for(let[Z,U]of W)S(U.element,Z,Q)},m=(Q,Z,U,L)=>{let E=W.get(Q);if(E){let _=B(U,L),f=q(Z,Q,_);M(E.element,f),V(E.element,U,L),E.element.dataset.id=String(Z.id),E.element.ariaSelected=String(U),v(E.element,Q)}},r=(Q,Z,U)=>{let L=W.get(Q);if(L)V(L.element,Z,U)},s=(Q)=>{return W.get(Q)?.element},g=(Q)=>{if(Math.abs(Q-P)<1)return;P=Q;for(let[Z,U]of W)v(U.element,Z),S(U.element,Z)},j2=()=>{for(let[,Q]of W)Q.element.remove(),b.release(Q.element);W.clear()};return{render:d,updatePositions:h,updateItem:m,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:j2,destroy:()=>{j2(),b.clear()}}};var Z2=(Y,q,J,j,D,X)=>{if(j===0)return 0;let G=Math.max(0,Math.min(Y,j-1)),O=q.getOffset(G),b=q.getHeight(G),W=q.getTotalHeight(),P=Math.max(0,W-J),F;switch(X){case"center":F=O-J/2+b/2;break;case"end":F=O-J+b;break;case"start":default:F=O;break}return Math.max(0,Math.min(F,P))};var t=(Y,q,J,j,D="start",X,G=Z2)=>{return G(Y,q,J,j,X,D)};var X2=(Y)=>{if(!Y.columns||Y.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let q=null,J=null;return{name:"withGrid",priority:10,setup(j){let{dom:D,emitter:X,config:G,rawConfig:O}=j,{classPrefix:b}=G;if(G.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(G.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let W=O.items?.some((k)=>k.__groupHeader===!0),P={columns:Y.columns,gap:Y.gap??0};if(W)P.isHeaderFn=(k)=>{let M=j.dataManager.getItem(k);return!!(M&&M.__groupHeader===!0)};q=a(P);let F=q.gap;j.setVirtualTotalFn(()=>{let k=j.dataManager.getTotal();return q.getTotalRows(k)});let w=O.item,C=G.horizontal?w.width:w.height,K={containerWidth:j.getContainerWidth(),columns:q.columns,gap:q.gap};if(typeof C==="function")j.setHeightConfig((k)=>{let M=K.containerWidth-2,V=(K.columns-1)*K.gap,A=(M-V)/K.columns,S={containerWidth:K.containerWidth,columns:K.columns,gap:K.gap,columnWidth:A,row:q.getRow(k),column:q.getCol(k),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:K.columns};return C(k,S)+K.gap});else if(F>0)j.setHeightConfig(C+F);j.rebuildHeightCache(),D.root.classList.add(`${b}--grid`);let $=j.getContainerWidth(),N=O.item.template,B=()=>{J=i(D.items,N,j.heightCache,q,b,$,()=>j.dataManager.getTotal(),G.ariaIdPrefix),j.replaceRenderer(J)};B(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>P),j.methods.set("_replaceGridRenderer",(k)=>{J=k}),j.methods.set("_updateGridLayoutForGroups",(k)=>{q.update({isHeaderFn:k});let M=j.dataManager.getTotal(),V=0;for(let A=0;A<M;A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);V+=S}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");P.columns=k.columns}if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");P.gap=k.gap}if(q)q.update(P);let M=j.getContainerWidth();if(K.containerWidth=M,K.columns=P.columns,K.gap=P.gap??0,J)J.updateContainerWidth(M);j.rebuildHeightCache(),j.updateContentSize(j.heightCache.getTotalHeight()),j.updateCompressionMode();for(let V=0;V<j.contentSizeHandlers.length;V++)j.contentSizeHandlers[V]();if(J)J.clear();j.forceRender()});let y=()=>{if(j.state.isDestroyed)return;let k=j.scrollController.getScrollTop(),M=j.state.viewportState.containerHeight,V=j.getVirtualTotal(),A={start:0,end:0};if(V===0||M===0)A.start=0,A.end=0;else{A.start=Math.max(0,j.heightCache.indexAtOffset(k));let g=j.heightCache.indexAtOffset(k+M);if(g<V-1)g++;A.end=Math.min(V-1,Math.max(0,g))}let S=G.overscan??3,v={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};j.state.viewportState.scrollTop=k,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=v;let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;if(v.start===I.start&&v.end===I.end){if(d)J.updatePositions(j.getCompressionContext());return}let h=j.dataManager.getTotal(),m=q.getItemRange(v.start,v.end,h),r=j.dataManager.getItemsInRange(m.start,m.end),s=d?j.getCompressionContext():void 0;J.render(r,m,new Set,-1,s),j.state.lastRenderRange={...v},X.emit("range:change",{range:v})},T=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange={start:-1,end:-1},y()};if(j.setRenderFns(y,T),j.resizeHandlers.push((k,M)=>{if(J)J.updateContainerWidth(k)}),j.methods.set("scrollToIndex",(k,M)=>{let V=Math.floor(k/Y.columns),{align:A,behavior:S}=D2(M),v=j.dataManager.getState(),I=q.getTotalRows(v.total),d=Math.max(0,Math.min(V,I-1)),h=t(d,j.heightCache,j.state.viewportState.containerHeight,I,A,j.getCachedCompression());if(S==="smooth")j.scrollController.scrollTo(h);else j.scrollController.scrollTo(h)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;D.root.classList.remove(`${b}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},e=300,D2=(Y)=>{if(typeof Y==="string")return{align:Y,behavior:"auto",duration:e};if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??e};return{align:"start",behavior:"auto",duration:e}};export{X2 as withGrid,i as createGridRenderer,a as createGridLayout};
1
+ var a=(Y)=>{let q=Math.max(1,Math.floor(Y.columns)),J=Y.gap??0,j=Y.isHeaderFn,D={row:0,col:0},X=(K)=>{if(K<=0)return 0;
2
+ if(!j)return Math.ceil(K/q);
3
+ let $=0,N=0,B=0;
4
+ for(let y=0;
5
+ y<K;
6
+ y++)if(j(y)){if(B++,N>0)$++,N=0;
7
+ $++,N=0}
8
+ else if(N++,N>=q)$++,N=0;
9
+ if(N>0)$++;
10
+ return $},G=(K)=>{return D.row=O(K),D.col=b(K),D},O=(K)=>{if(!j)return Math.floor(K/q);
11
+ let $=0,N=0;
12
+ for(let B=0;
13
+ B<=K;
14
+ B++)if(j(B)){if(N>0)$++,N=0;
15
+ if(B===K)return $;
16
+ $++,N=0}
17
+ else{if(B===K)return $;
18
+ if(N++,N>=q)$++,N=0}
19
+ return console.warn(`⚠️ getRow(${K}) fell through - returning ${$}`),$},b=(K)=>{if(!j)return K%q;
20
+ if(j(K))return 0;
21
+ let $=0;
22
+ for(let N=0;
23
+ N<=K;
24
+ N++)if(j(N))$=0;
25
+ else{if(N===K)return $;
26
+ if($++,$>=q)$=0}
27
+ return $},W=(K,$,N)=>{if(N<=0)return{start:0,end:-1};
28
+ if(!j){let M=Math.max(0,K*q),V=Math.min(N-1,($+1)*q-1);
29
+ return{start:M,end:V}}
30
+ let B=-1,y=-1,T=0,k=0;
31
+ for(let M=0;
32
+ M<N;
33
+ M++){if(j(M)){if(k>0)T++,k=0;
34
+ if(T>=K&&T<=$){if(B===-1)B=M;
35
+ y=M}
36
+ T++,k=0}
37
+ else{if(T>=K&&T<=$){if(B===-1)B=M;
38
+ y=M}
39
+ if(k++,k>=q)T++,k=0}
40
+ if(T>$&&k===0)break}
41
+ if(B===-1)return{start:0,end:-1};
42
+ return{start:B,end:y}},P=(K,$,N)=>{if($<0||$>=q)return-1;
43
+ let B=K*q+$;
44
+ if(B<0||B>=N)return-1;
45
+ return B},F=(K)=>{let $=(q-1)*J;
46
+ return Math.max(0,(K-$)/q)};
47
+ return{get columns(){return q},get gap(){return J},update:(K)=>{if(K.columns!==void 0)q=Math.max(1,Math.floor(K.columns));
48
+ if(K.gap!==void 0)J=K.gap;
49
+ if(K.isHeaderFn!==void 0)j=K.isHeaderFn},getTotalRows:X,getPosition:G,getRow:O,getCol:b,getItemRange:W,getItemIndex:P,getColumnWidth:F,getColumnOffset:(K,$)=>{let N=F($);
50
+ return K*(N+J)}}};
51
+ var n=16000000;
52
+ var J2=(Y,q,J)=>{if(J===0)return 0;
53
+ if(!Y.isVariable())return Math.floor(q/Y.getHeight(0));
54
+ let j=0,D=0;
55
+ for(let X=J-1;
56
+ X>=0;
57
+ X--){let G=Y.getHeight(X);
58
+ if(D+G>q)break;
59
+ D+=G,j++}
60
+ return Math.max(j,1)},o=(Y,q,J)=>{if(J===0)return 0;
61
+ let j=Math.floor(q),D=q-j,X=Math.max(0,Math.min(j,J-1));
62
+ return Y.getOffset(X)+D*Y.getHeight(X)};
63
+ var K2=(Y,q)=>{let J=q.getTotalHeight(),j=J>n,D=j?n:J,X=J>0?D/J:1;
64
+ return{isCompressed:j,actualHeight:J,virtualHeight:D,ratio:X}};
65
+ var Q2=(Y,q,J,j,D,X,G)=>{if(!X.isCompressed||j===0)return J.getOffset(Y);
66
+ let{virtualHeight:O}=X,b=O-D,W=b-q;
67
+ if(W<=D&&W>=-1){if(q>=b-1){let T=J.getTotalHeight()-J.getOffset(Y);
68
+ return D-T}
69
+ let w=J2(J,D,j),C=Math.max(0,j-w),$=q/O*j,N=Math.max(0,Math.min(1,1-W/D)),B=J.getOffset(Y)-J.getOffset(C),y=J.getOffset(Y)-o(J,$,j);
70
+ return y+(B-y)*N}
71
+ let F=q/O*j;
72
+ return J.getOffset(Y)-o(J,F,j)};
73
+ var Y2=(Y)=>{return Y!==null&&typeof Y==="object"&&Y.__groupHeader===!0};
74
+ var N2=(Y=200)=>{let q=[];
75
+ return{acquire:()=>{let X=q.pop();
76
+ if(X)return X;
77
+ let G=document.createElement("div");
78
+ return G.setAttribute("role","option"),G},release:(X)=>{if(q.length<Y)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},i=(Y,q,J,j,D,X,G,O)=>{let b=N2(),W=new Map,P=X,F=!1,w=null,C=0,K="",$=(Q)=>{if(w&&C===Q)return w;
79
+ return w=K2(Q,J),C=Q,w},N={selected:!1,focused:!1},B=(Q,Z)=>{return N.selected=Q,N.focused=Z,N},y=`${D}-item ${D}-grid-item`,T=`${D}-item--selected`,k=`${D}-item--focused`,M=(Q,Z)=>{if(typeof Z==="string")Q.innerHTML=Z;
80
+ else Q.replaceChildren(Z)},V=(Q,Z,U)=>{Q.classList.toggle(T,Z),Q.classList.toggle(k,U)},A=(Q,Z)=>{let U=j.getRow(Q);
81
+ if(Z){let L=Z.totalItems,E=$(L);
82
+ if(E.isCompressed)return Q2(U,Z.scrollTop,J,L,Z.containerHeight,E,Z.rangeStart)}
83
+ return J.getOffset(U)},S=(Q,Z,U)=>{let L=Q.dataset.id?.startsWith("__group_header"),E=L?0:j.getCol(Z),_=L?0:j.getColumnOffset(E,P),f;
84
+ if(F){let x=j.getRow(Z),z=0,u=new Set;
85
+ for(let R=0;
86
+ R<Z;
87
+ R++){let p=j.getRow(R);
88
+ if(p<x&&!u.has(p)){let l=J.getHeight(R);
89
+ z+=l,u.add(p)}}
90
+ f=z}
91
+ else f=A(Z,U);
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;
93
+ if(F||U)E=J.getHeight(Z)-j.gap;
94
+ else{let _=j.getRow(Z);
95
+ E=J.getHeight(_)-j.gap}
96
+ Q.style.width=`${L}px`,Q.style.height=`${E}px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);
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}`;
98
+ if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));
99
+ v(_,Q);
100
+ let x=q(Z,Q,f);
101
+ return M(_,x),V(_,U,L),S(_,Q,E),_},d=(Q,Z,U,L,E)=>{if(Z.start===0&&Q.length>0)F=Y2(Q[0]);
102
+ for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),b.release(u.element),W.delete(z);
103
+ let _=!1;
104
+ if(G){let z=String(G());
105
+ _=z!==K,K=z}
106
+ let f=document.createDocumentFragment(),x=[];
107
+ for(let z=Z.start;
108
+ z<=Z.end;
109
+ z++){let u=z-Z.start,R=Q[u];
110
+ if(!R){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${Z.start}-${Z.end}, items.length: ${Q.length})`);
111
+ continue}
112
+ let p=U.has(R.id),l=z===L,H=W.get(z);
113
+ if(H){let c=H.element.dataset.id,q2=String(R.id);
114
+ if(c!==q2){let $2=B(p,l),k2=q(R,z,$2);
115
+ M(H.element,k2),H.element.dataset.id=q2,H.element.dataset.row=String(j.getRow(z)),H.element.dataset.col=String(j.getCol(z)),v(H.element,z)}
116
+ if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,E),_)H.element.setAttribute("aria-setsize",K)}
117
+ else{let c=I(z,R,p,l,E);
118
+ f.appendChild(c),x.push({index:z,element:c})}}
119
+ if(x.length>0){Y.appendChild(f);
120
+ for(let{index:z,element:u}
121
+ of x)W.set(z,{index:z,element:u})}},h=(Q)=>{for(let[Z,U]of W)S(U.element,Z,Q)},m=(Q,Z,U,L)=>{let E=W.get(Q);
122
+ if(E){let _=B(U,L),f=q(Z,Q,_);
123
+ M(E.element,f),V(E.element,U,L),E.element.dataset.id=String(Z.id),E.element.ariaSelected=String(U),v(E.element,Q)}},r=(Q,Z,U)=>{let L=W.get(Q);
124
+ if(L)V(L.element,Z,U)},s=(Q)=>{return W.get(Q)?.element},g=(Q)=>{if(Math.abs(Q-P)<1)return;
125
+ P=Q;
126
+ for(let[Z,U]of W)v(U.element,Z),S(U.element,Z)},j2=()=>{for(let[,Q]of W)Q.element.remove(),b.release(Q.element);
127
+ W.clear()};
128
+ return{render:d,updatePositions:h,updateItem:m,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:j2,destroy:()=>{j2(),b.clear()}}};
129
+ var Z2=(Y,q,J,j,D,X)=>{if(j===0)return 0;
130
+ let G=Math.max(0,Math.min(Y,j-1)),O=q.getOffset(G),b=q.getHeight(G),W=q.getTotalHeight(),P=Math.max(0,W-J),F;
131
+ switch(X){case"center":F=O-J/2+b/2;
132
+ break;
133
+ case"end":F=O-J+b;
134
+ break;
135
+ case"start":default:F=O;
136
+ break}
137
+ return Math.max(0,Math.min(F,P))};
138
+ var t=(Y,q,J,j,D="start",X,G=Z2)=>{return G(Y,q,J,j,X,D)};
139
+ var X2=(Y)=>{if(!Y.columns||Y.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");
140
+ let q=null,J=null;
141
+ return{name:"withGrid",priority:10,setup(j){let{dom:D,emitter:X,config:G,rawConfig:O}=j,{classPrefix:b}=G;
142
+ if(G.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");
143
+ if(G.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");
144
+ let W=O.items?.some((k)=>k.__groupHeader===!0),P={columns:Y.columns,gap:Y.gap??0};
145
+ if(W)P.isHeaderFn=(k)=>{let M=j.dataManager.getItem(k);
146
+ return!!(M&&M.__groupHeader===!0)};
147
+ q=a(P);
148
+ let F=q.gap;
149
+ j.setVirtualTotalFn(()=>{let k=j.dataManager.getTotal();
150
+ return q.getTotalRows(k)});
151
+ let w=O.item,C=G.horizontal?w.width:w.height,K={containerWidth:j.getContainerWidth(),columns:q.columns,gap:q.gap};
152
+ if(typeof C==="function")j.setHeightConfig((k)=>{let M=K.containerWidth-2,V=(K.columns-1)*K.gap,A=(M-V)/K.columns,S={containerWidth:K.containerWidth,columns:K.columns,gap:K.gap,columnWidth:A,row:q.getRow(k),column:q.getCol(k),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:K.columns};
153
+ return C(k,S)+K.gap});
154
+ else if(F>0)j.setHeightConfig(C+F);
155
+ j.rebuildHeightCache(),D.root.classList.add(`${b}--grid`);
156
+ let $=j.getContainerWidth(),N=O.item.template,B=()=>{J=i(D.items,N,j.heightCache,q,b,$,()=>j.dataManager.getTotal(),G.ariaIdPrefix),j.replaceRenderer(J)};
157
+ B(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>P),j.methods.set("_replaceGridRenderer",(k)=>{J=k}),j.methods.set("_updateGridLayoutForGroups",(k)=>{q.update({isHeaderFn:k});
158
+ let M=j.dataManager.getTotal(),V=0;
159
+ for(let A=0;
160
+ A<M;
161
+ A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);
162
+ V+=S}
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");
164
+ P.columns=k.columns}
165
+ if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
166
+ P.gap=k.gap}
167
+ if(q)q.update(P);
168
+ let M=j.getContainerWidth();
169
+ if(K.containerWidth=M,K.columns=P.columns,K.gap=P.gap??0,J)J.updateContainerWidth(M);
170
+ j.rebuildHeightCache(),j.updateContentSize(j.heightCache.getTotalHeight()),j.updateCompressionMode();
171
+ for(let V=0;
172
+ V<j.contentSizeHandlers.length;
173
+ V++)j.contentSizeHandlers[V]();
174
+ if(J)J.clear();
175
+ j.forceRender()});
176
+ let y=()=>{if(j.state.isDestroyed)return;
177
+ let k=j.scrollController.getScrollTop(),M=j.state.viewportState.containerHeight,V=j.getVirtualTotal(),A={start:0,end:0};
178
+ if(V===0||M===0)A.start=0,A.end=0;
179
+ else{A.start=Math.max(0,j.heightCache.indexAtOffset(k));
180
+ let g=j.heightCache.indexAtOffset(k+M);
181
+ if(g<V-1)g++;
182
+ A.end=Math.min(V-1,Math.max(0,g))}
183
+ let S=G.overscan??3,v={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};
184
+ j.state.viewportState.scrollTop=k,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=v;
185
+ let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;
186
+ if(v.start===I.start&&v.end===I.end){if(d)J.updatePositions(j.getCompressionContext());
187
+ return}
188
+ let h=j.dataManager.getTotal(),m=q.getItemRange(v.start,v.end,h),r=j.dataManager.getItemsInRange(m.start,m.end),s=d?j.getCompressionContext():void 0;
189
+ J.render(r,m,new Set,-1,s),j.state.lastRenderRange={...v},X.emit("range:change",{range:v})},T=()=>{if(j.state.isDestroyed)return;
190
+ j.state.lastRenderRange={start:-1,end:-1},y()};
191
+ if(j.setRenderFns(y,T),j.resizeHandlers.push((k,M)=>{if(J)J.updateContainerWidth(k)}),j.methods.set("scrollToIndex",(k,M)=>{let V=Math.floor(k/Y.columns),{align:A,behavior:S}=D2(M),v=j.dataManager.getState(),I=q.getTotalRows(v.total),d=Math.max(0,Math.min(V,I-1)),h=t(d,j.heightCache,j.state.viewportState.containerHeight,I,A,j.getCachedCompression());
192
+ if(S==="smooth")j.scrollController.scrollTo(h);
193
+ else j.scrollController.scrollTo(h)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());
194
+ j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;
195
+ D.root.classList.remove(`${b}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},e=300,D2=(Y)=>{if(typeof Y==="string")return{align:Y,behavior:"auto",duration:e};
196
+ if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??e};
197
+ return{align:"start",behavior:"auto",duration:e}};
198
+ export{X2 as withGrid,i as createGridRenderer,a as createGridLayout};
@@ -1 +1,204 @@
1
- var{defineProperty:a,getOwnPropertyNames:Pj,getOwnPropertyDescriptor:Oj}=Object,Gj=Object.prototype.hasOwnProperty;var Zj=new WeakMap,Lj=(Q)=>{var Z=Zj.get(Q),j;if(Z)return Z;if(Z=a({},"__esModule",{value:!0}),Q&&typeof Q==="object"||typeof Q==="function")Pj(Q).map((J)=>!Gj.call(Z,J)&&a(Z,J,{get:()=>Q[J],enumerable:!(j=Oj(Q,J))||j.enumerable}));return Zj.set(Q,Z),Z};var wj=(Q,Z)=>{for(var j in Z)a(Q,j,{get:Z[j],enumerable:!0,configurable:!0,set:(J)=>Z[j]=()=>J})};var $j=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var d=(Q)=>{return Q!==null&&typeof Q==="object"&&Q.__groupHeader===!0};var Xj=(Q,Z,j)=>{if(j===0)return 0;if(!Q.isVariable())return Math.floor(Z/Q.getHeight(0));let J=0,$=0;for(let q=j-1;q>=0;q--){let X=Q.getHeight(q);if($+X>Z)break;$+=X,J++}return Math.max(J,1)},t=(Q,Z,j)=>{if(j===0)return 0;let J=Math.floor(Z),$=Z-J,q=Math.max(0,Math.min(J,j-1));return Q.getOffset(q)+$*Q.getHeight(q)};var jj=16000000;var Wj=(Q,Z)=>{let j=Z.getTotalHeight(),J=j>jj,$=J?jj:j,q=j>0?$/j:1;return{isCompressed:J,actualHeight:j,virtualHeight:$,ratio:q}},Mj=(Q,Z,j,J,$,q,X)=>{if(!q.isCompressed||J===0)return j.getOffset(Q);let{virtualHeight:M}=q,B=M-$,D=B-Z;if(D<=$&&D>=-1){if(Z>=B-1){let R=j.getTotalHeight()-j.getOffset(Q);return $-R}let Y=Xj(j,$,J),_=Math.max(0,J-Y),z=Z/M*J,P=Math.max(0,Math.min(1,1-D/$)),L=j.getOffset(Q)-j.getOffset(_),F=j.getOffset(Q)-t(j,z,J);return F+(L-F)*P}let G=Z/M*J;return j.getOffset(Q)-t(j,G,J)};var Dj=()=>{};var Uj={};wj(Uj,{createGridRenderer:()=>bj});var Fj=(Q=200)=>{let Z=[];return{acquire:()=>{let q=Z.pop();if(q)return q;let X=document.createElement("div");return X.setAttribute("role","option"),X},release:(q)=>{if(Z.length<Q)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),Z.push(q)},clear:()=>{Z.length=0}}},bj=(Q,Z,j,J,$,q,X,M)=>{let B=Fj(),D=new Map,b=q,G=!1,Y=null,_=0,E="",z=(N)=>{if(Y&&_===N)return Y;return Y=Wj(N,j),_=N,Y},P={selected:!1,focused:!1},L=(N,K)=>{return P.selected=N,P.focused=K,P},F=`${$}-item ${$}-grid-item`,R=`${$}-item--selected`,H=`${$}-item--focused`,v=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},W=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},w=(N,K)=>{let U=J.getRow(N);if(K){let O=K.totalItems,A=z(O);if(A.isCompressed)return Mj(U,K.scrollTop,j,O,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},S=(N,K,U)=>{let O=N.dataset.id?.startsWith("__group_header"),A=O?0:J.getCol(K),V=O?0:J.getColumnOffset(A,b),y;if(G){let p=J.getRow(K),k=0,C=new Set;for(let f=0;f<K;f++){let x=J.getRow(f);if(x<p&&!C.has(x)){let h=j.getHeight(f);k+=h,C.add(x)}}y=k}else y=w(K,U);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;if(G||U)A=j.getHeight(K)-J.gap;else{let V=J.getRow(K);A=j.getHeight(V)-J.gap}N.style.width=`${O}px`,N.style.height=`${A}px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);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}`;if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));I(V,N);let p=Z(K,N,y);return v(V,p),W(V,U,O),S(V,N,A),V},s=(N,K,U,O,A)=>{if(K.start===0&&N.length>0)G=d(N[0]);for(let[k,C]of D)if(k<K.start||k>K.end)C.element.remove(),B.release(C.element),D.delete(k);let V=!1;if(X){let k=String(X());V=k!==E,E=k}let y=document.createDocumentFragment(),p=[];for(let k=K.start;k<=K.end;k++){let C=k-K.start,f=N[C];if(!f){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${K.start}-${K.end}, items.length: ${N.length})`);continue}let x=U.has(f.id),h=k===O,T=D.get(k);if(T){let c=T.element.dataset.id,Qj=String(f.id);if(c!==Qj){let Vj=L(x,h),Aj=Z(f,k,Vj);v(T.element,Aj),T.element.dataset.id=Qj,T.element.dataset.row=String(J.getRow(k)),T.element.dataset.col=String(J.getCol(k)),I(T.element,k)}if(W(T.element,x,h),T.element.ariaSelected=String(x),S(T.element,k,A),V)T.element.setAttribute("aria-setsize",E)}else{let c=u(k,f,x,h,A);y.appendChild(c),p.push({index:k,element:c})}}if(p.length>0){Q.appendChild(y);for(let{index:k,element:C}of p)D.set(k,{index:k,element:C})}},g=(N)=>{for(let[K,U]of D)S(U.element,K,N)},zj=(N,K,U,O)=>{let A=D.get(N);if(A){let V=L(U,O),y=Z(K,N,V);v(A.element,y),W(A.element,U,O),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),I(A.element,N)}},Bj=(N,K,U)=>{let O=D.get(N);if(O)W(O.element,K,U)},_j=(N)=>{return D.get(N)?.element},Ej=(N)=>{if(Math.abs(N-b)<1)return;b=N;for(let[K,U]of D)I(U.element,K),S(U.element,K)},Jj=()=>{for(let[,N]of D)N.element.remove(),B.release(N.element);D.clear()};return{render:s,updatePositions:g,updateItem:zj,updateItemClasses:Bj,getElement:_j,updateContainerWidth:Ej,clear:Jj,destroy:()=>{Jj(),B.clear()}}};var kj=$j(()=>{Dj()});var n=(Q,Z)=>{let j=0,J=Q.length-1;while(j<J){let $=j+J+1>>>1;if(Q[$].headerLayoutIndex<=Z)j=$;else J=$-1}return j},Nj=(Q,Z)=>{let j=0,J=Q.length-1;while(j<J){let $=j+J+1>>>1;if(Q[$].firstDataIndex<=Z)j=$;else J=$-1}return j},Kj=(Q,Z)=>{if(Q===0)return[];let j=[],J=Z(0),$=0,q=0;for(let X=1;X<Q;X++){let M=Z(X);if(M!==J){let B=X-$;j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:B}),q=q+1+B,J=M,$=X}}return j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:Q-$}),j},l=(Q,Z)=>{if(Q.length===0||Z.length===0)return[];let j=Q.length+Z.length,J=Array(j),$=0;for(let q of Z){J[$]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},$++;for(let X=0;X<q.count;X++)J[$]=Q[q.firstDataIndex+X],$++}return J},r=(Q,Z)=>{let j=typeof Z==="number"?(J)=>Z:Z;return(J)=>{let $=Q.getEntry(J);if($.type==="header")return Q.getHeaderHeight($.group.groupIndex);return j($.dataIndex)}},o=(Q,Z)=>{let j=Kj(Q,Z.getGroupForIndex),J=Q+j.length,$=Z.headerHeight;return{get totalEntries(){return J},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let _=n(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return{type:"header",group:E};let z=Y-E.headerLayoutIndex-1;return{type:"item",dataIndex:E.firstDataIndex+z,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let _=n(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return-1;let z=Y-E.headerLayoutIndex-1;return E.firstDataIndex+z},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let _=Nj(j,Y),E=j[_],z=Y-E.firstDataIndex;return E.headerLayoutIndex+1+z},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=n(j,Y);return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=Nj(j,Y);return j[_]},getHeaderHeight:typeof $==="number"?(Y)=>$:(Y)=>{let _=j[Y];if(!_)return 0;return $(_.key,Y)},rebuild:(Y)=>{j=Kj(Y,Z.getGroupForIndex),J=Y+j.length}}};var i=(Q,Z,j,J,$)=>{let q=document.createElement("div");q.className=`${$}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",Q.insertBefore(q,Q.firstChild);let X=-1,M=!1,B=0,D=(z)=>{if(z===X)return;X=z;let P=Z.groups;if(z<0||z>=P.length){q.textContent="";return}let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);if(q.style.height=`${R}px`,typeof F==="string")q.innerHTML=F;else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;if(P.length===0){Y();return}let L=0;for(let W=P.length-1;W>=0;W--)if(j.getOffset(P[W].headerLayoutIndex)<=z){L=W;break}let F=j.getOffset(P[0].headerLayoutIndex);if(z<F){Y();return}if(!M)G();D(L);let R=Z.getHeaderHeight(L),H=0,v=L+1;if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;if(w<R)H=w-R}if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},G=()=>{if(M)return;M=!0,q.style.display=""},Y=()=>{if(!M)return;M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:b,refresh:_,show:G,hide:Y,destroy:E}};var Yj=(Q,Z,j,J,$,q)=>{if(J===0)return 0;let X=Math.max(0,Math.min(Q,J-1)),M=Z.getOffset(X),B=Z.getHeight(X),D=Z.getTotalHeight(),b=Math.max(0,D-j),G;switch(q){case"center":G=M-j/2+B/2;break;case"end":G=M-j+B;break;case"start":default:G=M;break}return Math.max(0,Math.min(G,b))};var e=(Q,Z,j,J,$="start",q,X=Yj)=>{return X(Q,Z,j,J,q,$)};var Rj=(Q)=>{if(!Q.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(Q.headerHeight==null||Q.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!Q.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let Z=null,j=null,J=[],$=[];return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:B}=q,{classPrefix:D}=M;if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");if(M.reverse)throw Error("[vlist/builder] withGroups cannot be used with reverse: true");let G=B.item.height;J=B.items?[...B.items]:[];let Y=J.length,_={getGroupForIndex:Q.getGroupForIndex,headerHeight:Q.headerHeight,headerTemplate:Q.headerTemplate,sticky:Q.sticky??!1};Z=o(Y,_),$=l(J,Z.groups);let E=r(Z,G);q.setHeightConfig(E),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length);let z=B.item.template,{headerTemplate:P}=Q,L=(W,w,S)=>{if(d(W))return P(W.groupKey,W.groupIndex);return z(W,w,S)},F=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(F&&R){if(H)H((I)=>{let u=$[I];return!!(u&&d(u))});let{createGridRenderer:W}=(kj(),Lj(Uj)),w=F(),S=W(X.items,L,q.heightCache,w,D,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);R(S)}else q.replaceTemplate(L);if(X.root.classList.add(`${D}--grouped`),Q.sticky!==!1){j=i(X.root,Z,q.heightCache,{..._,sticky:_.sticky??!1},D);let W=j;q.afterScroll.push((w,S)=>{W.update(w)}),j.update(q.scrollController.getScrollTop())}let v=()=>{if(!Z)return;Z.rebuild(J.length),$=l(J,Z.groups);let W=r(Z,G);if(q.setHeightConfig(W),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length),j)j.refresh()};q.methods.set("setItems",(W)=>{J=[...W],v()}),q.methods.set("appendItems",(W)=>{J=[...J,...W],v()}),q.methods.set("prependItems",(W)=>{J=[...W,...J],v()}),q.methods.set("removeItem",(W)=>{J=J.filter((w)=>w.id!==W),v()}),q.methods.set("scrollToIndex",(W,w)=>{let S=Z.dataToLayoutIndex(W),{align:I,behavior:u}=vj(w),s=q.dataManager.getTotal(),g=e(S,q.heightCache,q.state.viewportState.containerHeight,s,I,q.getCachedCompression());if(u==="smooth")q.scrollController.scrollTo(g);else q.scrollController.scrollTo(g)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;X.root.classList.remove(`${D}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},qj=300,vj=(Q)=>{if(typeof Q==="string")return{align:Q,behavior:"auto",duration:qj};if(Q&&typeof Q==="object")return{align:Q.align??"start",behavior:Q.behavior??"auto",duration:Q.duration??qj};return{align:"start",behavior:"auto",duration:qj}};export{Rj as withGroups,d as isGroupHeader,i as createStickyHeader,r as createGroupedHeightFn,o as createGroupLayout,l as buildLayoutItems};
1
+ var{defineProperty:a,getOwnPropertyNames:Pj,getOwnPropertyDescriptor:Oj}=Object,Gj=Object.prototype.hasOwnProperty;
2
+ var Zj=new WeakMap,Lj=(Q)=>{var Z=Zj.get(Q),j;
3
+ if(Z)return Z;
4
+ if(Z=a({},"__esModule",{value:!0}),Q&&typeof Q==="object"||typeof Q==="function")Pj(Q).map((J)=>!Gj.call(Z,J)&&a(Z,J,{get:()=>Q[J],enumerable:!(j=Oj(Q,J))||j.enumerable}));
5
+ return Zj.set(Q,Z),Z};
6
+ var wj=(Q,Z)=>{for(var j in Z)a(Q,j,{get:Z[j],enumerable:!0,configurable:!0,set:(J)=>Z[j]=()=>J})};
7
+ var $j=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);
8
+ var d=(Q)=>{return Q!==null&&typeof Q==="object"&&Q.__groupHeader===!0};
9
+ var Xj=(Q,Z,j)=>{if(j===0)return 0;
10
+ if(!Q.isVariable())return Math.floor(Z/Q.getHeight(0));
11
+ let J=0,$=0;
12
+ for(let q=j-1;
13
+ q>=0;
14
+ q--){let X=Q.getHeight(q);
15
+ if($+X>Z)break;
16
+ $+=X,J++}
17
+ return Math.max(J,1)},t=(Q,Z,j)=>{if(j===0)return 0;
18
+ let J=Math.floor(Z),$=Z-J,q=Math.max(0,Math.min(J,j-1));
19
+ return Q.getOffset(q)+$*Q.getHeight(q)};
20
+ var jj=16000000;
21
+ var Wj=(Q,Z)=>{let j=Z.getTotalHeight(),J=j>jj,$=J?jj:j,q=j>0?$/j:1;
22
+ return{isCompressed:J,actualHeight:j,virtualHeight:$,ratio:q}},Mj=(Q,Z,j,J,$,q,X)=>{if(!q.isCompressed||J===0)return j.getOffset(Q);
23
+ let{virtualHeight:M}=q,B=M-$,D=B-Z;
24
+ if(D<=$&&D>=-1){if(Z>=B-1){let R=j.getTotalHeight()-j.getOffset(Q);
25
+ return $-R}
26
+ let Y=Xj(j,$,J),_=Math.max(0,J-Y),z=Z/M*J,P=Math.max(0,Math.min(1,1-D/$)),L=j.getOffset(Q)-j.getOffset(_),F=j.getOffset(Q)-t(j,z,J);
27
+ return F+(L-F)*P}
28
+ let G=Z/M*J;
29
+ return j.getOffset(Q)-t(j,G,J)};
30
+ var Dj=()=>{};
31
+ var Uj={};
32
+ wj(Uj,{createGridRenderer:()=>bj});
33
+ var Fj=(Q=200)=>{let Z=[];
34
+ return{acquire:()=>{let q=Z.pop();
35
+ if(q)return q;
36
+ let X=document.createElement("div");
37
+ return X.setAttribute("role","option"),X},release:(q)=>{if(Z.length<Q)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),Z.push(q)},clear:()=>{Z.length=0}}},bj=(Q,Z,j,J,$,q,X,M)=>{let B=Fj(),D=new Map,b=q,G=!1,Y=null,_=0,E="",z=(N)=>{if(Y&&_===N)return Y;
38
+ return Y=Wj(N,j),_=N,Y},P={selected:!1,focused:!1},L=(N,K)=>{return P.selected=N,P.focused=K,P},F=`${$}-item ${$}-grid-item`,R=`${$}-item--selected`,H=`${$}-item--focused`,v=(N,K)=>{if(typeof K==="string")N.innerHTML=K;
39
+ else N.replaceChildren(K)},W=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},w=(N,K)=>{let U=J.getRow(N);
40
+ if(K){let O=K.totalItems,A=z(O);
41
+ if(A.isCompressed)return Mj(U,K.scrollTop,j,O,K.containerHeight,A,K.rangeStart)}
42
+ return j.getOffset(U)},S=(N,K,U)=>{let O=N.dataset.id?.startsWith("__group_header"),A=O?0:J.getCol(K),V=O?0:J.getColumnOffset(A,b),y;
43
+ if(G){let p=J.getRow(K),k=0,C=new Set;
44
+ for(let f=0;
45
+ f<K;
46
+ f++){let x=J.getRow(f);
47
+ if(x<p&&!C.has(x)){let h=j.getHeight(f);
48
+ k+=h,C.add(x)}}
49
+ y=k}
50
+ else y=w(K,U);
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;
52
+ if(G||U)A=j.getHeight(K)-J.gap;
53
+ else{let V=J.getRow(K);
54
+ A=j.getHeight(V)-J.gap}
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);
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}`;
57
+ if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));
58
+ I(V,N);
59
+ let p=Z(K,N,y);
60
+ return v(V,p),W(V,U,O),S(V,N,A),V},s=(N,K,U,O,A)=>{if(K.start===0&&N.length>0)G=d(N[0]);
61
+ for(let[k,C]of D)if(k<K.start||k>K.end)C.element.remove(),B.release(C.element),D.delete(k);
62
+ let V=!1;
63
+ if(X){let k=String(X());
64
+ V=k!==E,E=k}
65
+ let y=document.createDocumentFragment(),p=[];
66
+ for(let k=K.start;
67
+ k<=K.end;
68
+ k++){let C=k-K.start,f=N[C];
69
+ if(!f){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${K.start}-${K.end}, items.length: ${N.length})`);
70
+ continue}
71
+ let x=U.has(f.id),h=k===O,T=D.get(k);
72
+ if(T){let c=T.element.dataset.id,Qj=String(f.id);
73
+ if(c!==Qj){let Vj=L(x,h),Aj=Z(f,k,Vj);
74
+ v(T.element,Aj),T.element.dataset.id=Qj,T.element.dataset.row=String(J.getRow(k)),T.element.dataset.col=String(J.getCol(k)),I(T.element,k)}
75
+ if(W(T.element,x,h),T.element.ariaSelected=String(x),S(T.element,k,A),V)T.element.setAttribute("aria-setsize",E)}
76
+ else{let c=u(k,f,x,h,A);
77
+ y.appendChild(c),p.push({index:k,element:c})}}
78
+ if(p.length>0){Q.appendChild(y);
79
+ for(let{index:k,element:C}
80
+ of p)D.set(k,{index:k,element:C})}},g=(N)=>{for(let[K,U]of D)S(U.element,K,N)},zj=(N,K,U,O)=>{let A=D.get(N);
81
+ if(A){let V=L(U,O),y=Z(K,N,V);
82
+ v(A.element,y),W(A.element,U,O),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),I(A.element,N)}},Bj=(N,K,U)=>{let O=D.get(N);
83
+ if(O)W(O.element,K,U)},_j=(N)=>{return D.get(N)?.element},Ej=(N)=>{if(Math.abs(N-b)<1)return;
84
+ b=N;
85
+ for(let[K,U]of D)I(U.element,K),S(U.element,K)},Jj=()=>{for(let[,N]of D)N.element.remove(),B.release(N.element);
86
+ D.clear()};
87
+ return{render:s,updatePositions:g,updateItem:zj,updateItemClasses:Bj,getElement:_j,updateContainerWidth:Ej,clear:Jj,destroy:()=>{Jj(),B.clear()}}};
88
+ var kj=$j(()=>{Dj()});
89
+ var n=(Q,Z)=>{let j=0,J=Q.length-1;
90
+ while(j<J){let $=j+J+1>>>1;
91
+ if(Q[$].headerLayoutIndex<=Z)j=$;
92
+ else J=$-1}
93
+ return j},Nj=(Q,Z)=>{let j=0,J=Q.length-1;
94
+ while(j<J){let $=j+J+1>>>1;
95
+ if(Q[$].firstDataIndex<=Z)j=$;
96
+ else J=$-1}
97
+ return j},Kj=(Q,Z)=>{if(Q===0)return[];
98
+ let j=[],J=Z(0),$=0,q=0;
99
+ for(let X=1;
100
+ X<Q;
101
+ X++){let M=Z(X);
102
+ if(M!==J){let B=X-$;
103
+ j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:B}),q=q+1+B,J=M,$=X}}
104
+ return j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:Q-$}),j},l=(Q,Z)=>{if(Q.length===0||Z.length===0)return[];
105
+ let j=Q.length+Z.length,J=Array(j),$=0;
106
+ for(let q of Z){J[$]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},$++;
107
+ for(let X=0;
108
+ X<q.count;
109
+ X++)J[$]=Q[q.firstDataIndex+X],$++}
110
+ return J},r=(Q,Z)=>{let j=typeof Z==="number"?(J)=>Z:Z;
111
+ return(J)=>{let $=Q.getEntry(J);
112
+ if($.type==="header")return Q.getHeaderHeight($.group.groupIndex);
113
+ return j($.dataIndex)}},o=(Q,Z)=>{let j=Kj(Q,Z.getGroupForIndex),J=Q+j.length,$=Z.headerHeight;
114
+ return{get totalEntries(){return J},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};
115
+ let _=n(j,Y),E=j[_];
116
+ if(Y===E.headerLayoutIndex)return{type:"header",group:E};
117
+ let z=Y-E.headerLayoutIndex-1;
118
+ return{type:"item",dataIndex:E.firstDataIndex+z,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;
119
+ let _=n(j,Y),E=j[_];
120
+ if(Y===E.headerLayoutIndex)return-1;
121
+ let z=Y-E.headerLayoutIndex-1;
122
+ return E.firstDataIndex+z},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;
123
+ let _=Nj(j,Y),E=j[_],z=Y-E.firstDataIndex;
124
+ return E.headerLayoutIndex+1+z},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
125
+ let _=n(j,Y);
126
+ return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
127
+ let _=Nj(j,Y);
128
+ return j[_]},getHeaderHeight:typeof $==="number"?(Y)=>$:(Y)=>{let _=j[Y];
129
+ if(!_)return 0;
130
+ return $(_.key,Y)},rebuild:(Y)=>{j=Kj(Y,Z.getGroupForIndex),J=Y+j.length}}};
131
+ var i=(Q,Z,j,J,$)=>{let q=document.createElement("div");
132
+ q.className=`${$}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",Q.insertBefore(q,Q.firstChild);
133
+ let X=-1,M=!1,B=0,D=(z)=>{if(z===X)return;
134
+ X=z;
135
+ let P=Z.groups;
136
+ if(z<0||z>=P.length){q.textContent="";
137
+ return}
138
+ let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);
139
+ if(q.style.height=`${R}px`,typeof F==="string")q.innerHTML=F;
140
+ else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;
141
+ if(P.length===0){Y();
142
+ return}
143
+ let L=0;
144
+ for(let W=P.length-1;
145
+ W>=0;
146
+ W--)if(j.getOffset(P[W].headerLayoutIndex)<=z){L=W;
147
+ break}
148
+ let F=j.getOffset(P[0].headerLayoutIndex);
149
+ if(z<F){Y();
150
+ return}
151
+ if(!M)G();
152
+ D(L);
153
+ let R=Z.getHeaderHeight(L),H=0,v=L+1;
154
+ if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;
155
+ if(w<R)H=w-R}
156
+ if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},G=()=>{if(M)return;
157
+ M=!0,q.style.display=""},Y=()=>{if(!M)return;
158
+ M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;
159
+ if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};
160
+ return q.style.display="none",{update:b,refresh:_,show:G,hide:Y,destroy:E}};
161
+ var Yj=(Q,Z,j,J,$,q)=>{if(J===0)return 0;
162
+ let X=Math.max(0,Math.min(Q,J-1)),M=Z.getOffset(X),B=Z.getHeight(X),D=Z.getTotalHeight(),b=Math.max(0,D-j),G;
163
+ switch(q){case"center":G=M-j/2+B/2;
164
+ break;
165
+ case"end":G=M-j+B;
166
+ break;
167
+ case"start":default:G=M;
168
+ break}
169
+ return Math.max(0,Math.min(G,b))};
170
+ var e=(Q,Z,j,J,$="start",q,X=Yj)=>{return X(Q,Z,j,J,q,$)};
171
+ var Rj=(Q)=>{if(!Q.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");
172
+ if(Q.headerHeight==null||Q.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");
173
+ if(!Q.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");
174
+ let Z=null,j=null,J=[],$=[];
175
+ return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:B}=q,{classPrefix:D}=M;
176
+ if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");
177
+ if(M.reverse)throw Error("[vlist/builder] withGroups cannot be used with reverse: true");
178
+ let G=B.item.height;
179
+ J=B.items?[...B.items]:[];
180
+ let Y=J.length,_={getGroupForIndex:Q.getGroupForIndex,headerHeight:Q.headerHeight,headerTemplate:Q.headerTemplate,sticky:Q.sticky??!1};
181
+ Z=o(Y,_),$=l(J,Z.groups);
182
+ let E=r(Z,G);
183
+ q.setHeightConfig(E),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length);
184
+ let z=B.item.template,{headerTemplate:P}=Q,L=(W,w,S)=>{if(d(W))return P(W.groupKey,W.groupIndex);
185
+ return z(W,w,S)},F=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");
186
+ if(F&&R){if(H)H((I)=>{let u=$[I];
187
+ return!!(u&&d(u))});
188
+ let{createGridRenderer:W}=(kj(),Lj(Uj)),w=F(),S=W(X.items,L,q.heightCache,w,D,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);
189
+ R(S)}
190
+ else q.replaceTemplate(L);
191
+ if(X.root.classList.add(`${D}--grouped`),Q.sticky!==!1){j=i(X.root,Z,q.heightCache,{..._,sticky:_.sticky??!1},D);
192
+ let W=j;
193
+ q.afterScroll.push((w,S)=>{W.update(w)}),j.update(q.scrollController.getScrollTop())}
194
+ let v=()=>{if(!Z)return;
195
+ Z.rebuild(J.length),$=l(J,Z.groups);
196
+ let W=r(Z,G);
197
+ if(q.setHeightConfig(W),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length),j)j.refresh()};
198
+ q.methods.set("setItems",(W)=>{J=[...W],v()}),q.methods.set("appendItems",(W)=>{J=[...J,...W],v()}),q.methods.set("prependItems",(W)=>{J=[...W,...J],v()}),q.methods.set("removeItem",(W)=>{J=J.filter((w)=>w.id!==W),v()}),q.methods.set("scrollToIndex",(W,w)=>{let S=Z.dataToLayoutIndex(W),{align:I,behavior:u}=vj(w),s=q.dataManager.getTotal(),g=e(S,q.heightCache,q.state.viewportState.containerHeight,s,I,q.getCachedCompression());
199
+ if(u==="smooth")q.scrollController.scrollTo(g);
200
+ else q.scrollController.scrollTo(g)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;
201
+ X.root.classList.remove(`${D}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},qj=300,vj=(Q)=>{if(typeof Q==="string")return{align:Q,behavior:"auto",duration:qj};
202
+ if(Q&&typeof Q==="object")return{align:Q.align??"start",behavior:Q.behavior??"auto",duration:Q.duration??qj};
203
+ return{align:"start",behavior:"auto",duration:qj}};
204
+ export{Rj as withGroups,d as isGroupHeader,i as createStickyHeader,r as createGroupedHeightFn,o as createGroupLayout,l as buildLayoutItems};