@floor/vlist 0.5.7 → 0.5.8

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,198 +1 @@
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
+ 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,204 +1 @@
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};
1
+ var{defineProperty:t,getOwnPropertyNames:Gj,getOwnPropertyDescriptor:Lj}=Object,Oj=Object.prototype.hasOwnProperty;var Xj=new WeakMap,wj=(J)=>{var $=Xj.get(J),j;if($)return $;if($=t({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")Gj(J).map((Z)=>!Oj.call($,Z)&&t($,Z,{get:()=>J[Z],enumerable:!(j=Lj(J,Z))||j.enumerable}));return Xj.set(J,$),$};var Fj=(J,$)=>{for(var j in $)t(J,j,{get:$[j],enumerable:!0,configurable:!0,set:(Z)=>$[j]=()=>Z})};var Yj=(J,$)=>()=>(J&&($=J(J=0)),$);var m=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var Dj=(J,$,j)=>{if(j===0)return 0;if(!J.isVariable())return Math.floor($/J.getHeight(0));let Z=0,Q=0;for(let q=j-1;q>=0;q--){let X=J.getHeight(q);if(Q+X>$)break;Q+=X,Z++}return Math.max(Z,1)},Jj=(J,$,j)=>{if(j===0)return 0;let Z=Math.floor($),Q=$-Z,q=Math.max(0,Math.min(Z,j-1));return J.getOffset(q)+Q*J.getHeight(q)};var $j=16000000;var zj=(J,$)=>{let j=$.getTotalHeight(),Z=j>$j,Q=Z?$j:j,q=j>0?Q/j:1;return{isCompressed:Z,actualHeight:j,virtualHeight:Q,ratio:q}},kj=(J,$,j,Z,Q,q,X)=>{if(!q.isCompressed||Z===0)return j.getOffset(J);let{virtualHeight:M}=q,D=M-Q,W=D-$;if(W<=Q&&W>=-1){if($>=D-1){let R=j.getTotalHeight()-j.getOffset(J);return Q-R}let Y=Dj(j,Q,Z),_=Math.max(0,Z-Y),k=$/M*Z,G=Math.max(0,Math.min(1,1-W/Q)),O=j.getOffset(J)-j.getOffset(_),b=j.getOffset(J)-Jj(j,k,Z);return b+(O-b)*G}let P=$/M*Z;return j.getOffset(J)-Jj(j,P,Z)};var Bj=()=>{};var _j={};Fj(_j,{createGridRenderer:()=>vj});var bj=(J=200)=>{let $=[];return{acquire:()=>{let q=$.pop();if(q)return q;let X=document.createElement("div");return X.setAttribute("role","option"),X},release:(q)=>{if($.length<J)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),$.push(q)},clear:()=>{$.length=0}}},vj=(J,$,j,Z,Q,q,X,M)=>{let D=bj(),W=new Map,w=q,P=!1,Y=null,_=0,E="",k=(N)=>{if(Y&&_===N)return Y;return Y=zj(N,j),_=N,Y},G={selected:!1,focused:!1},O=(N,K)=>{return G.selected=N,G.focused=K,G},b=`${Q}-item ${Q}-grid-item`,R=`${Q}-item--selected`,H=`${Q}-item--focused`,T=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},v=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},u=(N,K)=>{let U=Z.getRow(N);if(K){let L=K.totalItems,A=k(L);if(A.isCompressed)return kj(U,K.scrollTop,j,L,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},B=(N,K,U)=>{let L=N.dataset.id?.startsWith("__group_header"),A=L?0:Z.getCol(K),V=L?0:Z.getColumnOffset(A,w),y;if(P){let d=Z.getRow(K),z=0,C=new Set;for(let f=0;f<K;f++){let p=Z.getRow(f);if(p<d&&!C.has(p)){let c=j.getHeight(f);z+=c,C.add(p)}}y=z}else y=u(K,U);N.style.transform=`translate(${Math.round(V)}px, ${Math.round(y)}px)`},F=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),L=U?w:Z.getColumnWidth(w),A;if(P||U)A=j.getHeight(K)-Z.gap;else{let V=Z.getRow(K);A=j.getHeight(V)-Z.gap}N.style.width=`${L}px`,N.style.height=`${A}px`},x=(N,K,U,L,A)=>{let V=D.acquire(),y=O(U,L);if(V.className=b,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(Z.getRow(N)),V.dataset.col=String(Z.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));F(V,N);let d=$(K,N,y);return T(V,d),v(V,U,L),B(V,N,A),V},g=(N,K,U,L,A)=>{if(K.start===0&&N.length>0)P=m(N[0]);for(let[z,C]of W)if(z<K.start||z>K.end)C.element.remove(),D.release(C.element),W.delete(z);let V=!1;if(X){let z=String(X());V=z!==E,E=z}let y=document.createDocumentFragment(),d=[];for(let z=K.start;z<=K.end;z++){let C=z-K.start,f=N[C];if(!f){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${K.start}-${K.end}, items.length: ${N.length})`);continue}let p=U.has(f.id),c=z===L,S=W.get(z);if(S){let s=S.element.dataset.id,Kj=String(f.id);if(s!==Kj){let Pj=O(p,c),Aj=$(f,z,Pj);T(S.element,Aj),S.element.dataset.id=Kj,S.element.dataset.row=String(Z.getRow(z)),S.element.dataset.col=String(Z.getCol(z)),F(S.element,z)}if(v(S.element,p,c),S.element.ariaSelected=String(p),B(S.element,z,A),V)S.element.setAttribute("aria-setsize",E)}else{let s=x(z,f,p,c,A);y.appendChild(s),d.push({index:z,element:s})}}if(d.length>0){J.appendChild(y);for(let{index:z,element:C}of d)W.set(z,{index:z,element:C})}},h=(N)=>{for(let[K,U]of W)B(U.element,K,N)},o=(N,K,U,L)=>{let A=W.get(N);if(A){let V=O(U,L),y=$(K,N,V);T(A.element,y),v(A.element,U,L),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),F(A.element,N)}},i=(N,K,U)=>{let L=W.get(N);if(L)v(L.element,K,U)},r=(N)=>{return W.get(N)?.element},Vj=(N)=>{if(Math.abs(N-w)<1)return;w=N;for(let[K,U]of W)F(U.element,K),B(U.element,K)},Nj=()=>{for(let[,N]of W)N.element.remove(),D.release(N.element);W.clear()};return{render:g,updatePositions:h,updateItem:o,updateItemClasses:i,getElement:r,updateContainerWidth:Vj,clear:Nj,destroy:()=>{Nj(),D.clear()}}};var Ej=Yj(()=>{Bj()});var e=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].headerLayoutIndex<=$)j=Q;else Z=Q-1}return j},Wj=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].firstDataIndex<=$)j=Q;else Z=Q-1}return j},Mj=(J,$)=>{if(J===0)return[];let j=[],Z=$(0),Q=0,q=0;for(let X=1;X<J;X++){let M=$(X);if(M!==Z){let D=X-Q;j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:D}),q=q+1+D,Z=M,Q=X}}return j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:J-Q}),j},a=(J,$)=>{if(J.length===0||$.length===0)return[];let j=J.length+$.length,Z=Array(j),Q=0;for(let q of $){Z[Q]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},Q++;for(let X=0;X<q.count;X++)Z[Q]=J[q.firstDataIndex+X],Q++}return Z},n=(J,$)=>{let j=typeof $==="number"?(Z)=>$:$;return(Z)=>{let Q=J.getEntry(Z);if(Q.type==="header")return J.getHeaderHeight(Q.group.groupIndex);return j(Q.dataIndex)}},jj=(J,$)=>{let j=Mj(J,$.getGroupForIndex),Z=J+j.length,Q=$.headerHeight;return{get totalEntries(){return Z},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 _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return{type:"header",group:E};let k=Y-E.headerLayoutIndex-1;return{type:"item",dataIndex:E.firstDataIndex+k,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return-1;let k=Y-E.headerLayoutIndex-1;return E.firstDataIndex+k},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let _=Wj(j,Y),E=j[_],k=Y-E.firstDataIndex;return E.headerLayoutIndex+1+k},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=e(j,Y);return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=Wj(j,Y);return j[_]},getHeaderHeight:typeof Q==="number"?(Y)=>Q:(Y)=>{let _=j[Y];if(!_)return 0;return Q(_.key,Y)},rebuild:(Y)=>{j=Mj(Y,$.getGroupForIndex),Z=Y+j.length}}};var qj=(J,$,j,Z,Q)=>{let q=document.createElement("div");q.className=`${Q}-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",J.insertBefore(q,J.firstChild);let X=-1,M=!1,D=0,W=(k)=>{if(k===X)return;X=k;let G=$.groups;if(k<0||k>=G.length){q.textContent="";return}let O=G[k],b=Z.headerTemplate(O.key,O.groupIndex),R=$.getHeaderHeight(k);if(q.style.height=`${R}px`,typeof b==="string")q.innerHTML=b;else q.replaceChildren(b)},w=(k)=>{let G=$.groups;if(G.length===0){Y();return}let O=0;for(let v=G.length-1;v>=0;v--)if(j.getOffset(G[v].headerLayoutIndex)<=k){O=v;break}let b=j.getOffset(G[0].headerLayoutIndex);if(k<b){Y();return}if(!M)P();W(O);let R=$.getHeaderHeight(O),H=0,T=O+1;if(T<G.length){let u=j.getOffset(G[T].headerLayoutIndex)-k;if(u<R)H=u-R}if(H!==D)D=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},P=()=>{if(M)return;M=!0,q.style.display=""},Y=()=>{if(!M)return;M=!1,q.style.display="none",X=-1,D=0,q.style.transform=""},_=()=>{let k=X;if(X=-1,k>=0)W(k)},E=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:w,refresh:_,show:P,hide:Y,destroy:E}};var Uj=(J,$,j,Z,Q,q)=>{if(Z===0)return 0;let X=Math.max(0,Math.min(J,Z-1)),M=$.getOffset(X),D=$.getHeight(X),W=$.getTotalHeight(),w=Math.max(0,W-j),P;switch(q){case"center":P=M-j/2+D/2;break;case"end":P=M-j+D;break;case"start":default:P=M;break}return Math.max(0,Math.min(P,w))};var Zj=(J,$,j,Z,Q="start",q,X=Uj)=>{return X(J,$,j,Z,q,Q)};var Rj=(J)=>{if(!J.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(J.headerHeight==null||J.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!J.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let $=null,j=null,Z=[],Q=[];return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:D}=q,{classPrefix:W}=M;if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");let P=D.item.height;Z=D.items?[...D.items]:[];let Y=Z.length,_={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};$=jj(Y,_),Q=a(Z,$.groups);let E=n($,P);q.setHeightConfig(E),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length);let k=D.item.template,{headerTemplate:G}=J,O=(B,F,x)=>{if(m(B))return G(B.groupKey,B.groupIndex);return k(B,F,x)},b=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(b&&R){if(H)H((g)=>{let h=Q[g];return!!(h&&m(h))});let{createGridRenderer:B}=(Ej(),wj(_j)),F=b(),x=B(X.items,O,q.heightCache,F,W,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);R(x)}else q.replaceTemplate(O);if(X.root.classList.add(`${W}--grouped`),J.sticky!==!1){j=qj(X.root,$,q.heightCache,{..._,sticky:_.sticky??!1},W);let B=j;q.afterScroll.push((F,x)=>{B.update(F)}),j.update(q.scrollController.getScrollTop())}let T=()=>{if(!$)return;$.rebuild(Z.length),Q=a(Z,$.groups);let B=n($,P);if(q.setHeightConfig(B),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length),j)j.refresh()};q.methods.set("setItems",(B)=>{Z=[...B],T()}),q.methods.set("appendItems",(B)=>{Z=[...Z,...B],T()}),q.methods.set("prependItems",(B)=>{Z=[...B,...Z],T()}),q.methods.set("removeItem",(B)=>{Z=Z.filter((F)=>F.id!==B),T()});let{animateScroll:v,cancelScroll:u}=Sj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(B,F)=>{let x=$.dataToLayoutIndex(B),{align:g,behavior:h,duration:o}=Hj(F),i=q.dataManager.getTotal(),r=Zj(x,q.heightCache,q.state.viewportState.containerHeight,i,g,q.getCachedCompression());if(h==="smooth")v(q.scrollController.getScrollTop(),r,o);else u(),q.scrollController.scrollTo(r)}),q.methods.set("_getItems",()=>Z),q.methods.set("_getTotal",()=>Z.length),q.destroyHandlers.push(()=>{if(I!==null)cancelAnimationFrame(I),I=null;if(j)j.destroy(),j=null;X.root.classList.remove(`${W}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},Qj=300,Tj=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,I=null,Sj=(J,$)=>{let j=()=>{if(I!==null)cancelAnimationFrame(I),I=null};return{animateScroll:(Q,q,X)=>{if(j(),Math.abs(q-Q)<1){J.scrollTo(q);return}let M=performance.now(),D=(W)=>{let w=W-M,P=Math.min(w/X,1),Y=Q+(q-Q)*Tj(P);if(J.scrollTo(Y),$(),P<1)I=requestAnimationFrame(D);else I=null};I=requestAnimationFrame(D)},cancelScroll:j}},Hj=(J)=>{if(typeof J==="string")return{align:J,behavior:"auto",duration:Qj};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??Qj};return{align:"start",behavior:"auto",duration:Qj}};export{Rj as withGroups,m as isGroupHeader,qj as createStickyHeader,n as createGroupedHeightFn,jj as createGroupLayout,a as buildLayoutItems};