@floor/vlist 0.5.5 → 0.5.6

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,72 @@
1
- var e=(B,K)=>{let W=K;return{getOffset:(J)=>J*B,getHeight:()=>B,indexAtOffset:(J)=>{if(W===0||B===0)return 0;return Math.max(0,Math.min(Math.floor(J/B),W-1))},getTotalHeight:()=>W*B,getTotal:()=>W,rebuild:(J)=>{W=J}}},jj=()=>{let B={},K=(j,Q)=>{if(!B[j])B[j]=new Set;return B[j].add(Q),()=>W(j,Q)},W=(j,Q)=>{B[j]?.delete(Q)};return{on:K,off:W,emit:(j,Q)=>{B[j]?.forEach((N)=>{try{N(Q)}catch(Z){console.error(`[vlist] Error in "${j}" handler:`,Z)}})},clear:()=>{for(let j in B)delete B[j]}}},qj=(B)=>{if(typeof B==="string"){let K=document.querySelector(B);if(!K)throw Error(`[vlist] Container not found: ${B}`);return K}return B},Bj=(B,K,W)=>{let J=document.createElement("div");if(J.className=K,J.setAttribute("role","listbox"),J.setAttribute("tabindex","0"),W)J.setAttribute("aria-label",W);let G=document.createElement("div");G.className=`${K}-viewport`,G.style.overflow="auto",G.style.height="100%",G.style.width="100%";let j=document.createElement("div");j.className=`${K}-content`,j.style.position="relative",j.style.width="100%";let Q=document.createElement("div");return Q.className=`${K}-items`,Q.style.position="relative",Q.style.width="100%",j.appendChild(Q),G.appendChild(j),J.appendChild(G),B.appendChild(J),{root:J,viewport:G,content:j,items:Q}},Gj=(B=100)=>{let K=[];return{acquire:()=>{let j=K.pop();if(j)return j;let Q=document.createElement("div");return Q.setAttribute("role","option"),Q},release:(j)=>{if(K.length<B)j.className="",j.textContent="",j.removeAttribute("style"),j.removeAttribute("data-index"),j.removeAttribute("data-id"),K.push(j)},clear:()=>{K.length=0}}},Jj=(B,K,W,J,G)=>{if(J===0){G.start=0,G.end=0;return}let j=W.indexAtOffset(B),Q=j,N=W.getOffset(j)-B;while(Q<J-1&&N<K)N+=W.getHeight(Q),Q++;G.start=j,G.end=Math.min(Q,J-1)},Kj=(B,K,W,J)=>{J.start=Math.max(0,B.start-K),J.end=Math.min(W-1,B.end+K)},Qj=0,Uj=(B)=>{let{item:K,items:W,overscan:J=3,classPrefix:G="vlist",ariaLabel:j}=B,{height:Q,template:N}=K,Z=W?[...W]:[],y=!1,H=0,O=null,h=`${G}-${Qj++}`,c=qj(B.container),$=Bj(c,G,j),D=jj(),F=e(Q,Z.length),b=Gj(),w=$.viewport.clientHeight,S={start:0,end:0},M={start:0,end:0},L={start:-1,end:-1},A=new Map,P={selected:!1,focused:!1},m=`${G}-item`,z="",v=(q,U)=>{if(typeof U==="string")q.innerHTML=U;else q.replaceChildren(U)},I=(q,U)=>{q.style.transform=`translateY(${Math.round(F.getOffset(U))}px)`},d=(q,U)=>{let X=b.acquire();X.className=m,X.style.height=`${F.getHeight(q)}px`,X.dataset.index=String(q),X.dataset.id=String(U.id),X.ariaSelected="false",X.id=`${h}-item-${q}`,z=String(Z.length),X.setAttribute("aria-setsize",z),X.setAttribute("aria-posinset",String(q+1));let V=U.id===O;if(P.selected=V,V)X.classList.add(`${G}-item--selected`);else X.classList.remove(`${G}-item--selected`);return v(X,N(U,q,P)),I(X,q),X},f=()=>{$.content.style.height=`${F.getTotalHeight()}px`},C=()=>{if(y)return;if(Jj(H,w,F,Z.length,S),Kj(S,J,Z.length,M),M.start===L.start&&M.end===L.end)return;let q=String(Z.length),U=q!==z;z=q;for(let[Y,k]of A)if(Y<M.start||Y>M.end)k.remove(),b.release(k),A.delete(Y);let X=document.createDocumentFragment(),V=[];for(let Y=M.start;Y<=M.end;Y++){let k=Z[Y];if(!k)continue;let _=A.get(Y);if(_){let T=_.dataset.id,p=String(k.id);if(T!==p)v(_,N(k,Y,P)),_.dataset.id=p,_.style.height=`${F.getHeight(Y)}px`;let g=k.id===O;if(P.selected=g,g)_.classList.add(`${G}-item--selected`);else _.classList.remove(`${G}-item--selected`);if(I(_,Y),U)_.setAttribute("aria-setsize",z)}else{let T=d(Y,k);X.appendChild(T),V.push({index:Y,element:T})}}if(V.length>0){$.items.appendChild(X);for(let{index:Y,element:k}of V)A.set(Y,k)}L.start=M.start,L.end=M.end,D.emit("range:change",{range:{start:M.start,end:M.end}})},u=()=>{L.start=-1,L.end=-1,C()},E=null,x=()=>{if(y)return;let q=$.viewport.scrollTop,U=Math.max(0,q),X=U>=H?"down":"up";if(!$.root.classList.contains(`${G}--scrolling`))$.root.classList.add(`${G}--scrolling`);if(H=U,C(),D.emit("scroll",{scrollTop:U,direction:X}),E)clearTimeout(E);E=setTimeout(()=>{$.root.classList.remove(`${G}--scrolling`)},150)};$.viewport.addEventListener("scroll",x,{passive:!0});let o=(q)=>{if(O===q)return;O=q,u(),D.emit("selection:change",{selectedId:O})},s=()=>{if(O===null)return;O=null,u(),D.emit("selection:change",{selectedId:null})},a=()=>O,r=(q,U="start")=>{let X=Math.max(0,Math.min(q,Z.length-1)),V=F.getOffset(X),Y=F.getHeight(X),k=Math.max(0,F.getTotalHeight()-w),_=V;if(U==="center")_=V-w/2+Y/2;else if(U==="end")_=V-w+Y;_=Math.max(0,Math.min(_,k)),$.viewport.scrollTop=_},R=()=>{F.rebuild(Z.length),f(),u()},l=(q)=>{Z=[...q],R()},n=(q)=>{Z=[...Z,...q],R()},i=(q)=>{Z=[...q,...Z],R()},t=()=>{if(y)return;if(y=!0,$.viewport.removeEventListener("scroll",x),E)clearTimeout(E);for(let[,q]of A)q.remove(),b.release(q);A.clear(),b.clear(),D.clear(),$.root.remove()};return f(),C(),{get element(){return $.root},get items(){return Z},get total(){return Z.length},setItems:l,appendItems:n,prependItems:i,scrollToIndex:r,getScrollPosition:()=>H,selectItem:o,deselectItem:s,getSelectedId:a,on:(q,U)=>D.on(q,U),off:(q,U)=>D.off(q,U),destroy:t}};export{Uj as createVList};
1
+ var e=(B,K)=>{let W=K;
2
+ return{getOffset:(J)=>J*B,getHeight:()=>B,indexAtOffset:(J)=>{if(W===0||B===0)return 0;
3
+ return Math.max(0,Math.min(Math.floor(J/B),W-1))},getTotalHeight:()=>W*B,getTotal:()=>W,rebuild:(J)=>{W=J}}},jj=()=>{let B={},K=(j,Q)=>{if(!B[j])B[j]=new Set;
4
+ return B[j].add(Q),()=>W(j,Q)},W=(j,Q)=>{B[j]?.delete(Q)};
5
+ return{on:K,off:W,emit:(j,Q)=>{B[j]?.forEach((N)=>{try{N(Q)}
6
+ catch(Z){console.error(`[vlist] Error in "${j}" handler:`,Z)}})},clear:()=>{for(let j in B)delete B[j]}}},qj=(B)=>{if(typeof B==="string"){let K=document.querySelector(B);
7
+ if(!K)throw Error(`[vlist] Container not found: ${B}`);
8
+ return K}
9
+ return B},Bj=(B,K,W)=>{let J=document.createElement("div");
10
+ if(J.className=K,J.setAttribute("role","listbox"),J.setAttribute("tabindex","0"),W)J.setAttribute("aria-label",W);
11
+ let G=document.createElement("div");
12
+ G.className=`${K}-viewport`,G.style.overflow="auto",G.style.height="100%",G.style.width="100%";
13
+ let j=document.createElement("div");
14
+ j.className=`${K}-content`,j.style.position="relative",j.style.width="100%";
15
+ let Q=document.createElement("div");
16
+ return Q.className=`${K}-items`,Q.style.position="relative",Q.style.width="100%",j.appendChild(Q),G.appendChild(j),J.appendChild(G),B.appendChild(J),{root:J,viewport:G,content:j,items:Q}},Gj=(B=100)=>{let K=[];
17
+ return{acquire:()=>{let j=K.pop();
18
+ if(j)return j;
19
+ let Q=document.createElement("div");
20
+ return Q.setAttribute("role","option"),Q},release:(j)=>{if(K.length<B)j.className="",j.textContent="",j.removeAttribute("style"),j.removeAttribute("data-index"),j.removeAttribute("data-id"),K.push(j)},clear:()=>{K.length=0}}},Jj=(B,K,W,J,G)=>{if(J===0){G.start=0,G.end=0;
21
+ return}
22
+ let j=W.indexAtOffset(B),Q=j,N=W.getOffset(j)-B;
23
+ while(Q<J-1&&N<K)N+=W.getHeight(Q),Q++;
24
+ G.start=j,G.end=Math.min(Q,J-1)},Kj=(B,K,W,J)=>{J.start=Math.max(0,B.start-K),J.end=Math.min(W-1,B.end+K)},Qj=0,Uj=(B)=>{let{item:K,items:W,overscan:J=3,classPrefix:G="vlist",ariaLabel:j}=B,{height:Q,template:N}=K,Z=W?[...W]:[],y=!1,H=0,O=null,h=`${G}-${Qj++}`,c=qj(B.container),$=Bj(c,G,j),D=jj(),F=e(Q,Z.length),b=Gj(),w=$.viewport.clientHeight,S={start:0,end:0},M={start:0,end:0},L={start:-1,end:-1},A=new Map,P={selected:!1,focused:!1},m=`${G}-item`,z="",v=(q,U)=>{if(typeof U==="string")q.innerHTML=U;
25
+ else q.replaceChildren(U)},I=(q,U)=>{q.style.transform=`translateY(${Math.round(F.getOffset(U))}
26
+ px)`},d=(q,U)=>{let X=b.acquire();
27
+ X.className=m,X.style.height=`${F.getHeight(q)}
28
+ px`,X.dataset.index=String(q),X.dataset.id=String(U.id),X.ariaSelected="false",X.id=`${h}-item-${q}`,z=String(Z.length),X.setAttribute("aria-setsize",z),X.setAttribute("aria-posinset",String(q+1));
29
+ let V=U.id===O;
30
+ if(P.selected=V,V)X.classList.add(`${G}-item--selected`);
31
+ else X.classList.remove(`${G}-item--selected`);
32
+ return v(X,N(U,q,P)),I(X,q),X},f=()=>{$.content.style.height=`${F.getTotalHeight()}
33
+ px`},C=()=>{if(y)return;
34
+ if(Jj(H,w,F,Z.length,S),Kj(S,J,Z.length,M),M.start===L.start&&M.end===L.end)return;
35
+ let q=String(Z.length),U=q!==z;
36
+ z=q;
37
+ for(let[Y,k]of A)if(Y<M.start||Y>M.end)k.remove(),b.release(k),A.delete(Y);
38
+ let X=document.createDocumentFragment(),V=[];
39
+ for(let Y=M.start;
40
+ Y<=M.end;
41
+ Y++){let k=Z[Y];
42
+ if(!k)continue;
43
+ let _=A.get(Y);
44
+ if(_){let T=_.dataset.id,p=String(k.id);
45
+ if(T!==p)v(_,N(k,Y,P)),_.dataset.id=p,_.style.height=`${F.getHeight(Y)}
46
+ px`;
47
+ let g=k.id===O;
48
+ if(P.selected=g,g)_.classList.add(`${G}-item--selected`);
49
+ else _.classList.remove(`${G}-item--selected`);
50
+ if(I(_,Y),U)_.setAttribute("aria-setsize",z)}
51
+ else{let T=d(Y,k);
52
+ X.appendChild(T),V.push({index:Y,element:T})}}
53
+ if(V.length>0){$.items.appendChild(X);
54
+ for(let{index:Y,element:k}
55
+ of V)A.set(Y,k)}
56
+ L.start=M.start,L.end=M.end,D.emit("range:change",{range:{start:M.start,end:M.end}})},u=()=>{L.start=-1,L.end=-1,C()},E=null,x=()=>{if(y)return;
57
+ let q=$.viewport.scrollTop,U=Math.max(0,q),X=U>=H?"down":"up";
58
+ if(!$.root.classList.contains(`${G}--scrolling`))$.root.classList.add(`${G}--scrolling`);
59
+ if(H=U,C(),D.emit("scroll",{scrollTop:U,direction:X}),E)clearTimeout(E);
60
+ E=setTimeout(()=>{$.root.classList.remove(`${G}--scrolling`)},150)};
61
+ $.viewport.addEventListener("scroll",x,{passive:!0});
62
+ let o=(q)=>{if(O===q)return;
63
+ O=q,u(),D.emit("selection:change",{selectedId:O})},s=()=>{if(O===null)return;
64
+ O=null,u(),D.emit("selection:change",{selectedId:null})},a=()=>O,r=(q,U="start")=>{let X=Math.max(0,Math.min(q,Z.length-1)),V=F.getOffset(X),Y=F.getHeight(X),k=Math.max(0,F.getTotalHeight()-w),_=V;
65
+ if(U==="center")_=V-w/2+Y/2;
66
+ else if(U==="end")_=V-w+Y;
67
+ _=Math.max(0,Math.min(_,k)),$.viewport.scrollTop=_},R=()=>{F.rebuild(Z.length),f(),u()},l=(q)=>{Z=[...q],R()},n=(q)=>{Z=[...Z,...q],R()},i=(q)=>{Z=[...q,...Z],R()},t=()=>{if(y)return;
68
+ if(y=!0,$.viewport.removeEventListener("scroll",x),E)clearTimeout(E);
69
+ for(let[,q]of A)q.remove(),b.release(q);
70
+ A.clear(),b.clear(),D.clear(),$.root.remove()};
71
+ return f(),C(),{get element(){return $.root},get items(){return Z},get total(){return Z.length},setItems:l,appendItems:n,prependItems:i,scrollToIndex:r,getScrollPosition:()=>H,selectItem:o,deselectItem:s,getSelectedId:a,on:(q,U)=>D.on(q,U),off:(q,U)=>D.off(q,U),destroy:t}};
72
+ export{Uj as createVList};
@@ -1 +1,233 @@
1
- var $j=(U={})=>{let{chunkSize:G=100,maxCachedItems:Y=5000,evictionBuffer:N=200,onEvict:M}=U,Q=new Map,j=0,D=0,T=(q)=>{let X=Q.get(q);if(!X)X={items:Array(G),count:0,lastAccess:Date.now()},Q.set(q,X);else X.lastAccess=Date.now();return X},z=(q)=>{return Math.floor(q/G)},W=(q)=>{return q%G},y=()=>j,L=(q)=>{j=q},b=(q)=>{if(q<0||q>=j)return;let X=z(q),B=Q.get(X);if(!B)return;return B.items[W(q)]},C=(q)=>{if(q<0||q>=j)return!1;let X=z(q),B=Q.get(X);if(!B)return!1;return B.items[W(q)]!==void 0},u=(q,X)=>{let B=z(q),K=T(B),_=W(q),l=K.items[_]===void 0;if(K.items[_]=X,l)K.count++,D++;if(q>=j)j=q+1},H=(q,X)=>{for(let B=0;B<X.length;B++){let K=X[B];if(K!==void 0)u(q+B,K)}},Z=(q)=>{if(q<0||q>=j)return!1;let X=z(q),B=Q.get(X);if(!B)return!1;let K=W(q);if(B.items[K]===void 0)return!1;if(B.items[K]=void 0,B.count--,D--,B.count===0)Q.delete(X);return!0},F=(q,X)=>{let B=[];for(let K=q;K<=X&&K<j;K++)B.push(b(K));return B},V=(q,X)=>{for(let B=q;B<=X&&B<j;B++)if(!C(B))return!1;return!0},O=()=>{let q=[],X=null,B=Array.from(Q.keys()).sort((K,_)=>K-_);for(let K of B){let _=Q.get(K);if(!_)continue;let l=K*G;for(let R=0;R<G;R++){let p=l+R;if(p>=j)break;if(_.items[R]!==void 0)if(X===null)X={start:p,end:p};else if(p===X.end+1)X.end=p;else q.push(X),X={start:p,end:p};else if(X!==null)q.push(X),X=null}}if(X!==null)q.push(X);return q},h=(q,X)=>{let B=[],K=null;for(let _=q;_<=X&&_<j;_++)if(!C(_))if(K===null)K={start:_,end:_};else K.end=_;else if(K!==null)B.push(K),K=null;if(K!==null)B.push(K);return B},w=(q)=>{return Q.has(q)},k=(q)=>{let X=Q.get(q);if(X)X.lastAccess=Date.now()},A=(q,X)=>{if(q>X||Q.size===0)return;let B=Date.now(),K=z(Math.max(0,q)),_=z(Math.min(j-1,X));for(let l=K;l<=_;l++){let R=Q.get(l);if(R)R.lastAccess=B}},f=(q,X)=>{if(D<=Y)return 0;let B=Math.max(0,q-N),K=Math.min(j-1,X+N),_=z(B),l=z(K),R=0,p=[];for(let[i,qj]of Q)if(i<_||i>l)R+=qj.count,p.push(i),D-=qj.count,Q.delete(i);if(R>0&&M)M(R,p);return R},I=()=>{if(D<=Y)return 0;let q=Array.from(Q.entries()).sort(([,K],[,_])=>K.lastAccess-_.lastAccess),X=0,B=[];for(let[K,_]of q){if(D<=Y)break;X+=_.count,D-=_.count,B.push(K),Q.delete(K)}if(X>0&&M)M(X,B);return X},r=()=>{return{totalItems:j,cachedItems:D,cachedChunks:Q.size,chunkSize:G,maxCachedItems:Y,memoryEfficiency:j>0?1-D/j:1}},t=()=>D,e=()=>{Q.clear(),D=0};return{chunkSize:G,maxCachedItems:Y,getTotal:y,setTotal:L,get:b,has:C,set:u,setRange:H,delete:Z,getRange:F,isRangeLoaded:V,getLoadedRanges:O,findUnloadedRanges:h,getChunkIndex:z,isChunkLoaded:w,touchChunk:k,touchChunksForRange:A,evictDistant:f,evictToLimit:I,getStats:r,getCachedCount:t,clear:e,reset:()=>{e(),j=0}}},Uj=(U)=>{if(U.length===0)return[];let G=[...U].sort((N,M)=>N.start-M.start),Y=[{...G[0]}];for(let N=1;N<G.length;N++){let M=G[N],Q=Y[Y.length-1];if(M.start<=Q.end+1)Q.end=Math.max(Q.end,M.end);else Y.push({...M})}return Y},Xj=(U,G,Y)=>{let N=Math.floor(U.start/Y)*Y,M=Math.ceil((U.end+1)/Y)*Y-1,Q={start:N,end:M};if(G.length===0)return[Q];let j=[],D=Uj(G),T=Q.start;for(let z of D){if(z.end<T)continue;if(z.start>Q.end)break;if(z.start>T)j.push({start:T,end:Math.min(z.start-1,Q.end)});if(T=z.end+1,T>Q.end)break}if(T<=Q.end)j.push({start:T,end:Q.end});return j};var Yj=(U={})=>{let{enabled:G=!0,maskCharacter:Y="█",randomVariance:N=!0,maxSampleSize:M=20,customGenerator:Q}=U,j=null,D=!1,T=0,z=(Z)=>{if(!G||D||Z.length===0)return;let F=new Map,V=new Map,O=Math.min(Z.length,M);for(let h=0;h<O;h++){let w=Z[h];if(!w||typeof w!=="object")continue;for(let[k,A]of Object.entries(w)){if(k.startsWith("_")||k==="id")continue;if(!V.has(k))V.set(k,{lengths:[],types:new Set});let f=V.get(k),I=Array.isArray(A)?"array":typeof A;if(f.types.add(I),typeof A==="string")f.lengths.push(A.length);else if(A!==null&&A!==void 0)f.lengths.push(String(A).length)}}for(let[h,w]of V){if(w.lengths.length===0)continue;let k=Math.min(...w.lengths),A=Math.max(...w.lengths),f=Math.round(w.lengths.reduce((r,t)=>r+t,0)/w.lengths.length),I="string";if(w.types.has("number")&&w.types.size===1)I="number";else if(w.types.has("boolean")&&w.types.size===1)I="boolean";else if(w.types.has("array"))I="array";else if(w.types.has("object")&&!w.types.has("string"))I="object";F.set(h,{minLength:k,maxLength:A,avgLength:f,type:I})}j=F,D=!0},W=()=>D,y=(Z)=>{let F=Z.avgLength;if(N&&Z.minLength!==Z.maxLength){if(F=Math.floor(Math.random()*(Z.maxLength-Z.minLength+1)+Z.minLength),Math.random()<0.3)F=Math.max(1,F+Math.floor(Math.random()*3)-1)}return Y.repeat(Math.max(1,F))},L=(Z)=>{if(Q)return{...Q(Z),["_isPlaceholder"]:!0};let F={id:`__placeholder_${T++}`,["_isPlaceholder"]:!0,_index:Z};if(!j||j.size===0)return F.label=Y.repeat(12),F;for(let[V,O]of j)switch(O.type){case"string":F[V]=y(O);break;case"number":F[V]=0;break;case"boolean":F[V]=!1;break;case"array":F[V]=[];break;case"object":F[V]={};break;default:F[V]=y(O)}return F};return{analyzeStructure:z,hasAnalyzedStructure:W,generate:L,generateRange:(Z,F)=>{let V=[];for(let O=Z;O<=F;O++)V.push(L(O));return V},isPlaceholder:(Z)=>{if(!Z||typeof Z!=="object")return!1;return Z._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{j=null,D=!1,T=0}}},d=(U)=>{if(!U||typeof U!=="object")return!1;return U._isPlaceholder===!0},Nj=(U)=>{return U.filter((G)=>!d(G))},Fj=(U)=>{let G=0;for(let Y of U)if(Y!==void 0&&!d(Y))G++;return G},Ej=(U,G,Y)=>{let N=0;for(let M=0;M<G.length;M++){let Q=Y+M,j=U[Q];if(j===void 0||d(j)){if(U[Q]=G[M],d(j))N++}}return N};var Lj=50,Bj=(U={})=>{let{adapter:G,initialItems:Y,initialTotal:N,storage:M,placeholder:Q,pageSize:j=Lj,onStateChange:D,onItemsLoaded:T,onItemsEvicted:z}=U,W=$j({...M,onEvict:(J,$)=>{z?.(J),O()}}),y=null,L=()=>{if(!y)y=Yj(Q);return y},b=new Map,C=!1,u,H=!0,Z,F=[],V=new Map,O=()=>{D?.(e())},h=()=>{b.clear();let J=W.getLoadedRanges();for(let $ of J)for(let P=$.start;P<=$.end;P++){let E=W.get(P);if(E&&!d(E))b.set(E.id,P)}},w=(J,$)=>{if(!d($))b.set($.id,J)},k=(J)=>{b.delete(J)},A=(J,$)=>{return`${J}-${$}`},f=()=>W.getTotal(),I=()=>W.getCachedCount(),r=()=>C,t=()=>H,e=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:C,pendingRanges:F,error:u,hasMore:H,cursor:Z}),Zj=()=>W,q=()=>L(),X=(J)=>{let $=W.get(J);if($!==void 0)return $;if(J>=0&&J<W.getTotal())return L().generate(J);return},B=(J)=>{let $=b.get(J);if($===void 0)return;return W.get($)},K=(J)=>{return b.get(J)??-1},_=(J)=>{let $=W.get(J);return $!==void 0&&!d($)},l=(J,$)=>{let P=[],E=W.getTotal(),g=0,x=0;W.touchChunksForRange(J,Math.min($,E-1));for(let c=J;c<=$&&c<E;c++){let s=W.get(c);if(s!==void 0)P.push(s),g++;else P.push(L().generate(c)),x++}return P},R=(J)=>{W.setTotal(J),H=W.getCachedCount()<J,O()},p=(J,$=0,P)=>{if(y&&!y.hasAnalyzedStructure()&&J.length>0)y.analyzeStructure(J);for(let E=0;E<J.length;E++){let g=J[E];if(g!==void 0){let x=$+E;W.set(x,g),w(x,g)}}if(P!==void 0)W.setTotal(P);else if($+J.length>W.getTotal())W.setTotal($+J.length);H=W.getCachedCount()<W.getTotal(),T?.(J,$,W.getTotal()),O()},i=(J,$)=>{let P=b.get(J);if(P===void 0)return!1;let E=W.get(P);if(!E)return!1;let g={...E,...$};if(W.set(P,g),$.id!==void 0&&$.id!==J)k(J),w(P,g);return O(),!0},qj=(J)=>{let $=b.get(J);if($===void 0)return!1;W.delete($),k(J);let P=W.getTotal();if(P>0)W.setTotal(P-1);return O(),!0},Jj=async(J,$)=>{if(!G)return;let P=A(J,$);if(V.has(P))return;let E=W.getLoadedRanges(),g=Xj({start:J,end:$},E,W.chunkSize);if(g.length===0)return;let x=W.chunkSize,c=[];for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);for(let S=a;S<=n;S++){let o=S*x,m=o+x-1,Qj=A(o,m);if(!c.some((Wj)=>Wj.start===o)&&!V.has(Qj))c.push({start:o,end:m})}}let s=[];for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);for(let S=a;S<=n;S++){let o=S*x,m=o+x-1,Qj=A(o,m);if(V.has(Qj)){let Wj=V.get(Qj);if(!s.includes(Wj))s.push(Wj)}}}for(let v of c){let a=A(v.start,v.end),n=(async()=>{F.push(v),C=!0,u=void 0,O();try{let S=v.end-v.start+1,o={offset:v.start,limit:S,cursor:void 0},m=await G.read(o);if(p(m.items,v.start,m.total),m.cursor)Z=m.cursor;if(m.hasMore!==void 0)H=m.hasMore;else if(m.total!==void 0)H=W.getCachedCount()<m.total}catch(S){u=S instanceof Error?S:Error(String(S))}finally{V.delete(a),F=F.filter((S)=>S.start!==v.start||S.end!==v.end),C=V.size>0,O()}})();V.set(a,n),s.push(n)}await Promise.all(s)},Aj=async(J,$)=>{if(W.isRangeLoaded(J,$))return;await Jj(J,$)},Dj=async()=>{if(!G)return;await Jj(0,j-1)},Oj=async()=>{if(!G||C||!H)return!1;let J=W.getCachedCount(),$=W.getTotal(),P=J,E=Math.min(P+j-1,$>0?$-1:P+j-1);if(P>=$&&$>0)return H=!1,!1;return await Jj(P,E),W.getCachedCount()>J},zj=async()=>{if(W.clear(),b.clear(),y)y.clear();Z=void 0,H=!0,u=void 0,O(),await Dj()},Hj=(J,$)=>{if(W.evictDistant(J,$)>0)h()},yj=()=>{W.clear(),b.clear(),Z=void 0,u=void 0,F=[],C=!1,O()},bj=()=>{if(W.reset(),b.clear(),y)y.clear();Z=void 0,H=!0,u=void 0,F=[],C=!1,O()};if(Y&&Y.length>0)p(Y,0,N??Y.length);else if(N!==void 0)W.setTotal(N);return{getState:e,getTotal:f,getCached:I,getIsLoading:r,getHasMore:t,getStorage:Zj,getPlaceholders:q,getItem:X,getItemById:B,getIndexById:K,isItemLoaded:_,getItemsInRange:l,setTotal:R,setItems:p,updateItem:i,removeItem:qj,loadRange:Jj,ensureRange:Aj,loadInitial:Dj,loadMore:Oj,reload:zj,evictDistant:Hj,clear:yj,reset:bj}};var Vj=(U,G,Y,N,M,Q)=>{if(N===0||G===0)return Q.start=0,Q.end=-1,Q;let j=Y.indexAtOffset(U),D=Y.indexAtOffset(U+G);if(D<N-1)D++;return Q.start=Math.max(0,j),Q.end=Math.min(N-1,Math.max(0,D)),Q},wj=(U,G,Y,N)=>{if(Y===0)return N.start=0,N.end=-1,N;return N.start=Math.max(0,U.start-G),N.end=Math.min(Y-1,U.end+G),N};var Gj=(U,G,Y,N,M,Q=Vj)=>{return Q(U.scrollTop,U.containerHeight,G,Y,M,U.visibleRange),wj(U.visibleRange,N,Y,U.renderRange),U.totalHeight=M.virtualHeight,U.actualHeight=M.actualHeight,U.isCompressed=M.isCompressed,U.compressionRatio=M.ratio,U};var Kj=200,jj=50;var Mj=15,Pj=2,_j=50;var Tj=(U)=>{let{adapter:G,loading:Y}=U,N=Y?.cancelThreshold??Mj,M=Y?.preloadThreshold??Pj,Q=Y?.preloadAhead??_j;return{name:"withData",priority:20,methods:["reload"],setup(j){let{emitter:D}=j,T=j.config.reverse,z=j.config.overscan,W=Bj({adapter:G,pageSize:jj,onStateChange:()=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.updateCompressionMode(),j.state.viewportState=Gj(j.state.viewportState,j.heightCache,j.getVirtualTotal(),z,j.getCachedCompression()),j.updateContentSize(j.state.viewportState.totalHeight),j.renderIfNeeded()},onItemsLoaded:(Z,F,V)=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.forceRender(),D.emit("load:end",{items:Z,total:V})}});j.replaceDataManager(W);let y=null,L=null,b=0,C=()=>{if(L){let Z=L;L=null,j.dataManager.ensureRange(Z.start,Z.end).catch((F)=>{D.emit("error",{error:F,context:"ensureRange"})})}};j.afterScroll.push((Z,F)=>{if(j.state.isDestroyed)return;let V=j.scrollController.getVelocity(),h=j.scrollController.isTracking()&&V<=N;if(L&&b>N&&V<=N){let A=L;L=null,j.dataManager.ensureRange(A.start,A.end).catch((f)=>{D.emit("error",{error:f,context:"ensureRange"})})}if(b=V,h&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(T){if(Z<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((A)=>{D.emit("error",{error:A,context:"loadMore"})})}else if(j.state.viewportState.totalHeight-Z-j.state.viewportState.containerHeight<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((f)=>{D.emit("error",{error:f,context:"loadMore"})})}let{renderRange:w}=j.state.viewportState;if(!y||w.start!==y.start||w.end!==y.end)if(y={start:w.start,end:w.end},h){L=null;let{start:A,end:f}=w,I=j.getVirtualTotal();if(V>M)if(F==="down")f=Math.min(w.end+Q,I-1);else A=Math.max(w.start-Q,0);j.dataManager.ensureRange(A,f).catch((r)=>{D.emit("error",{error:r,context:"ensureRange"})})}else L={start:w.start,end:w.end}});let u=200,H=null;j.afterScroll.push((Z,F)=>{if(H!==null)clearTimeout(H);H=setTimeout(()=>{H=null,C()},u)}),j.destroyHandlers.push(()=>{if(H!==null)clearTimeout(H),H=null}),D.on("load:start",()=>{j.dom.root.setAttribute("aria-busy","true")}),D.on("load:end",()=>{j.dom.root.removeAttribute("aria-busy")}),j.methods.set("reload",async()=>{await j.dataManager.reload()}),D.emit("load:start",{offset:0,limit:jj}),j.dataManager.loadInitial().catch((Z)=>{D.emit("error",{error:Z,context:"loadInitial"})})}}};export{Tj as withData,Ej as replacePlaceholders,Uj as mergeRanges,d as isPlaceholderItem,Nj as filterPlaceholders,$j as createSparseStorage,Yj as createPlaceholderManager,Bj as createDataManager,Fj as countRealItems,Xj as calculateMissingRanges};
1
+ var $j=(U={})=>{let{chunkSize:G=100,maxCachedItems:Y=5000,evictionBuffer:N=200,onEvict:M}=U,Q=new Map,j=0,D=0,T=(q)=>{let X=Q.get(q);
2
+ if(!X)X={items:Array(G),count:0,lastAccess:Date.now()},Q.set(q,X);
3
+ else X.lastAccess=Date.now();
4
+ return X},z=(q)=>{return Math.floor(q/G)},W=(q)=>{return q%G},y=()=>j,L=(q)=>{j=q},b=(q)=>{if(q<0||q>=j)return;
5
+ let X=z(q),B=Q.get(X);
6
+ if(!B)return;
7
+ return B.items[W(q)]},C=(q)=>{if(q<0||q>=j)return!1;
8
+ let X=z(q),B=Q.get(X);
9
+ if(!B)return!1;
10
+ return B.items[W(q)]!==void 0},u=(q,X)=>{let B=z(q),K=T(B),_=W(q),l=K.items[_]===void 0;
11
+ if(K.items[_]=X,l)K.count++,D++;
12
+ if(q>=j)j=q+1},H=(q,X)=>{for(let B=0;
13
+ B<X.length;
14
+ B++){let K=X[B];
15
+ if(K!==void 0)u(q+B,K)}},Z=(q)=>{if(q<0||q>=j)return!1;
16
+ let X=z(q),B=Q.get(X);
17
+ if(!B)return!1;
18
+ let K=W(q);
19
+ if(B.items[K]===void 0)return!1;
20
+ if(B.items[K]=void 0,B.count--,D--,B.count===0)Q.delete(X);
21
+ return!0},F=(q,X)=>{let B=[];
22
+ for(let K=q;
23
+ K<=X&&K<j;
24
+ K++)B.push(b(K));
25
+ return B},V=(q,X)=>{for(let B=q;
26
+ B<=X&&B<j;
27
+ B++)if(!C(B))return!1;
28
+ return!0},O=()=>{let q=[],X=null,B=Array.from(Q.keys()).sort((K,_)=>K-_);
29
+ for(let K of B){let _=Q.get(K);
30
+ if(!_)continue;
31
+ let l=K*G;
32
+ for(let R=0;
33
+ R<G;
34
+ R++){let p=l+R;
35
+ if(p>=j)break;
36
+ if(_.items[R]!==void 0)if(X===null)X={start:p,end:p};
37
+ else if(p===X.end+1)X.end=p;
38
+ else q.push(X),X={start:p,end:p};
39
+ else if(X!==null)q.push(X),X=null}}
40
+ if(X!==null)q.push(X);
41
+ return q},h=(q,X)=>{let B=[],K=null;
42
+ for(let _=q;
43
+ _<=X&&_<j;
44
+ _++)if(!C(_))if(K===null)K={start:_,end:_};
45
+ else K.end=_;
46
+ else if(K!==null)B.push(K),K=null;
47
+ if(K!==null)B.push(K);
48
+ return B},w=(q)=>{return Q.has(q)},k=(q)=>{let X=Q.get(q);
49
+ if(X)X.lastAccess=Date.now()},A=(q,X)=>{if(q>X||Q.size===0)return;
50
+ let B=Date.now(),K=z(Math.max(0,q)),_=z(Math.min(j-1,X));
51
+ for(let l=K;
52
+ l<=_;
53
+ l++){let R=Q.get(l);
54
+ if(R)R.lastAccess=B}},f=(q,X)=>{if(D<=Y)return 0;
55
+ let B=Math.max(0,q-N),K=Math.min(j-1,X+N),_=z(B),l=z(K),R=0,p=[];
56
+ for(let[i,qj]of Q)if(i<_||i>l)R+=qj.count,p.push(i),D-=qj.count,Q.delete(i);
57
+ if(R>0&&M)M(R,p);
58
+ return R},I=()=>{if(D<=Y)return 0;
59
+ let q=Array.from(Q.entries()).sort(([,K],[,_])=>K.lastAccess-_.lastAccess),X=0,B=[];
60
+ for(let[K,_]of q){if(D<=Y)break;
61
+ X+=_.count,D-=_.count,B.push(K),Q.delete(K)}
62
+ if(X>0&&M)M(X,B);
63
+ return X},r=()=>{return{totalItems:j,cachedItems:D,cachedChunks:Q.size,chunkSize:G,maxCachedItems:Y,memoryEfficiency:j>0?1-D/j:1}},t=()=>D,e=()=>{Q.clear(),D=0};
64
+ return{chunkSize:G,maxCachedItems:Y,getTotal:y,setTotal:L,get:b,has:C,set:u,setRange:H,delete:Z,getRange:F,isRangeLoaded:V,getLoadedRanges:O,findUnloadedRanges:h,getChunkIndex:z,isChunkLoaded:w,touchChunk:k,touchChunksForRange:A,evictDistant:f,evictToLimit:I,getStats:r,getCachedCount:t,clear:e,reset:()=>{e(),j=0}}},Uj=(U)=>{if(U.length===0)return[];
65
+ let G=[...U].sort((N,M)=>N.start-M.start),Y=[{...G[0]}];
66
+ for(let N=1;
67
+ N<G.length;
68
+ N++){let M=G[N],Q=Y[Y.length-1];
69
+ if(M.start<=Q.end+1)Q.end=Math.max(Q.end,M.end);
70
+ else Y.push({...M})}
71
+ return Y},Xj=(U,G,Y)=>{let N=Math.floor(U.start/Y)*Y,M=Math.ceil((U.end+1)/Y)*Y-1,Q={start:N,end:M};
72
+ if(G.length===0)return[Q];
73
+ let j=[],D=Uj(G),T=Q.start;
74
+ for(let z of D){if(z.end<T)continue;
75
+ if(z.start>Q.end)break;
76
+ if(z.start>T)j.push({start:T,end:Math.min(z.start-1,Q.end)});
77
+ if(T=z.end+1,T>Q.end)break}
78
+ if(T<=Q.end)j.push({start:T,end:Q.end});
79
+ return j};
80
+ var Yj=(U={})=>{let{enabled:G=!0,maskCharacter:Y="█",randomVariance:N=!0,maxSampleSize:M=20,customGenerator:Q}=U,j=null,D=!1,T=0,z=(Z)=>{if(!G||D||Z.length===0)return;
81
+ let F=new Map,V=new Map,O=Math.min(Z.length,M);
82
+ for(let h=0;
83
+ h<O;
84
+ h++){let w=Z[h];
85
+ if(!w||typeof w!=="object")continue;
86
+ for(let[k,A]of Object.entries(w)){if(k.startsWith("_")||k==="id")continue;
87
+ if(!V.has(k))V.set(k,{lengths:[],types:new Set});
88
+ let f=V.get(k),I=Array.isArray(A)?"array":typeof A;
89
+ if(f.types.add(I),typeof A==="string")f.lengths.push(A.length);
90
+ else if(A!==null&&A!==void 0)f.lengths.push(String(A).length)}}
91
+ for(let[h,w]of V){if(w.lengths.length===0)continue;
92
+ let k=Math.min(...w.lengths),A=Math.max(...w.lengths),f=Math.round(w.lengths.reduce((r,t)=>r+t,0)/w.lengths.length),I="string";
93
+ if(w.types.has("number")&&w.types.size===1)I="number";
94
+ else if(w.types.has("boolean")&&w.types.size===1)I="boolean";
95
+ else if(w.types.has("array"))I="array";
96
+ else if(w.types.has("object")&&!w.types.has("string"))I="object";
97
+ F.set(h,{minLength:k,maxLength:A,avgLength:f,type:I})}
98
+ j=F,D=!0},W=()=>D,y=(Z)=>{let F=Z.avgLength;
99
+ if(N&&Z.minLength!==Z.maxLength){if(F=Math.floor(Math.random()*(Z.maxLength-Z.minLength+1)+Z.minLength),Math.random()<0.3)F=Math.max(1,F+Math.floor(Math.random()*3)-1)}
100
+ return Y.repeat(Math.max(1,F))},L=(Z)=>{if(Q)return{...Q(Z),["_isPlaceholder"]:!0};
101
+ let F={id:`__placeholder_${T++}`,["_isPlaceholder"]:!0,_index:Z};
102
+ if(!j||j.size===0)return F.label=Y.repeat(12),F;
103
+ for(let[V,O]of j)switch(O.type){case"string":F[V]=y(O);
104
+ break;
105
+ case"number":F[V]=0;
106
+ break;
107
+ case"boolean":F[V]=!1;
108
+ break;
109
+ case"array":F[V]=[];
110
+ break;
111
+ case"object":F[V]={};
112
+ break;
113
+ default:F[V]=y(O)}
114
+ return F};
115
+ return{analyzeStructure:z,hasAnalyzedStructure:W,generate:L,generateRange:(Z,F)=>{let V=[];
116
+ for(let O=Z;
117
+ O<=F;
118
+ O++)V.push(L(O));
119
+ return V},isPlaceholder:(Z)=>{if(!Z||typeof Z!=="object")return!1;
120
+ return Z._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{j=null,D=!1,T=0}}},d=(U)=>{if(!U||typeof U!=="object")return!1;
121
+ return U._isPlaceholder===!0},Nj=(U)=>{return U.filter((G)=>!d(G))},Fj=(U)=>{let G=0;
122
+ for(let Y of U)if(Y!==void 0&&!d(Y))G++;
123
+ return G},Ej=(U,G,Y)=>{let N=0;
124
+ for(let M=0;
125
+ M<G.length;
126
+ M++){let Q=Y+M,j=U[Q];
127
+ if(j===void 0||d(j)){if(U[Q]=G[M],d(j))N++}}
128
+ return N};
129
+ var Lj=50,Bj=(U={})=>{let{adapter:G,initialItems:Y,initialTotal:N,storage:M,placeholder:Q,pageSize:j=Lj,onStateChange:D,onItemsLoaded:T,onItemsEvicted:z}=U,W=$j({...M,onEvict:(J,$)=>{z?.(J),O()}}),y=null,L=()=>{if(!y)y=Yj(Q);
130
+ return y},b=new Map,C=!1,u,H=!0,Z,F=[],V=new Map,O=()=>{D?.(e())},h=()=>{b.clear();
131
+ let J=W.getLoadedRanges();
132
+ for(let $ of J)for(let P=$.start;
133
+ P<=$.end;
134
+ P++){let E=W.get(P);
135
+ if(E&&!d(E))b.set(E.id,P)}},w=(J,$)=>{if(!d($))b.set($.id,J)},k=(J)=>{b.delete(J)},A=(J,$)=>{return`${J}-${$}`},f=()=>W.getTotal(),I=()=>W.getCachedCount(),r=()=>C,t=()=>H,e=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:C,pendingRanges:F,error:u,hasMore:H,cursor:Z}),Zj=()=>W,q=()=>L(),X=(J)=>{let $=W.get(J);
136
+ if($!==void 0)return $;
137
+ if(J>=0&&J<W.getTotal())return L().generate(J);
138
+ return},B=(J)=>{let $=b.get(J);
139
+ if($===void 0)return;
140
+ return W.get($)},K=(J)=>{return b.get(J)??-1},_=(J)=>{let $=W.get(J);
141
+ return $!==void 0&&!d($)},l=(J,$)=>{let P=[],E=W.getTotal(),g=0,x=0;
142
+ W.touchChunksForRange(J,Math.min($,E-1));
143
+ for(let c=J;
144
+ c<=$&&c<E;
145
+ c++){let s=W.get(c);
146
+ if(s!==void 0)P.push(s),g++;
147
+ else P.push(L().generate(c)),x++}
148
+ return P},R=(J)=>{W.setTotal(J),H=W.getCachedCount()<J,O()},p=(J,$=0,P)=>{if(y&&!y.hasAnalyzedStructure()&&J.length>0)y.analyzeStructure(J);
149
+ for(let E=0;
150
+ E<J.length;
151
+ E++){let g=J[E];
152
+ if(g!==void 0){let x=$+E;
153
+ W.set(x,g),w(x,g)}}
154
+ if(P!==void 0)W.setTotal(P);
155
+ else if($+J.length>W.getTotal())W.setTotal($+J.length);
156
+ H=W.getCachedCount()<W.getTotal(),T?.(J,$,W.getTotal()),O()},i=(J,$)=>{let P=b.get(J);
157
+ if(P===void 0)return!1;
158
+ let E=W.get(P);
159
+ if(!E)return!1;
160
+ let g={...E,...$};
161
+ if(W.set(P,g),$.id!==void 0&&$.id!==J)k(J),w(P,g);
162
+ return O(),!0},qj=(J)=>{let $=b.get(J);
163
+ if($===void 0)return!1;
164
+ W.delete($),k(J);
165
+ let P=W.getTotal();
166
+ if(P>0)W.setTotal(P-1);
167
+ return O(),!0},Jj=async(J,$)=>{if(!G)return;
168
+ let P=A(J,$);
169
+ if(V.has(P))return;
170
+ let E=W.getLoadedRanges(),g=Xj({start:J,end:$},E,W.chunkSize);
171
+ if(g.length===0)return;
172
+ let x=W.chunkSize,c=[];
173
+ for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);
174
+ for(let S=a;
175
+ S<=n;
176
+ S++){let o=S*x,m=o+x-1,Qj=A(o,m);
177
+ if(!c.some((Wj)=>Wj.start===o)&&!V.has(Qj))c.push({start:o,end:m})}}
178
+ let s=[];
179
+ for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);
180
+ for(let S=a;
181
+ S<=n;
182
+ S++){let o=S*x,m=o+x-1,Qj=A(o,m);
183
+ if(V.has(Qj)){let Wj=V.get(Qj);
184
+ if(!s.includes(Wj))s.push(Wj)}}}
185
+ for(let v of c){let a=A(v.start,v.end),n=(async()=>{F.push(v),C=!0,u=void 0,O();
186
+ try{let S=v.end-v.start+1,o={offset:v.start,limit:S,cursor:void 0},m=await G.read(o);
187
+ if(p(m.items,v.start,m.total),m.cursor)Z=m.cursor;
188
+ if(m.hasMore!==void 0)H=m.hasMore;
189
+ else if(m.total!==void 0)H=W.getCachedCount()<m.total}
190
+ catch(S){u=S instanceof Error?S:Error(String(S))}
191
+ finally{V.delete(a),F=F.filter((S)=>S.start!==v.start||S.end!==v.end),C=V.size>0,O()}})();
192
+ V.set(a,n),s.push(n)}
193
+ await Promise.all(s)},Aj=async(J,$)=>{if(W.isRangeLoaded(J,$))return;
194
+ await Jj(J,$)},Dj=async()=>{if(!G)return;
195
+ await Jj(0,j-1)},Oj=async()=>{if(!G||C||!H)return!1;
196
+ let J=W.getCachedCount(),$=W.getTotal(),P=J,E=Math.min(P+j-1,$>0?$-1:P+j-1);
197
+ if(P>=$&&$>0)return H=!1,!1;
198
+ return await Jj(P,E),W.getCachedCount()>J},zj=async()=>{if(W.clear(),b.clear(),y)y.clear();
199
+ Z=void 0,H=!0,u=void 0,O(),await Dj()},Hj=(J,$)=>{if(W.evictDistant(J,$)>0)h()},yj=()=>{W.clear(),b.clear(),Z=void 0,u=void 0,F=[],C=!1,O()},bj=()=>{if(W.reset(),b.clear(),y)y.clear();
200
+ Z=void 0,H=!0,u=void 0,F=[],C=!1,O()};
201
+ if(Y&&Y.length>0)p(Y,0,N??Y.length);
202
+ else if(N!==void 0)W.setTotal(N);
203
+ return{getState:e,getTotal:f,getCached:I,getIsLoading:r,getHasMore:t,getStorage:Zj,getPlaceholders:q,getItem:X,getItemById:B,getIndexById:K,isItemLoaded:_,getItemsInRange:l,setTotal:R,setItems:p,updateItem:i,removeItem:qj,loadRange:Jj,ensureRange:Aj,loadInitial:Dj,loadMore:Oj,reload:zj,evictDistant:Hj,clear:yj,reset:bj}};
204
+ var Vj=(U,G,Y,N,M,Q)=>{if(N===0||G===0)return Q.start=0,Q.end=-1,Q;
205
+ let j=Y.indexAtOffset(U),D=Y.indexAtOffset(U+G);
206
+ if(D<N-1)D++;
207
+ return Q.start=Math.max(0,j),Q.end=Math.min(N-1,Math.max(0,D)),Q},wj=(U,G,Y,N)=>{if(Y===0)return N.start=0,N.end=-1,N;
208
+ return N.start=Math.max(0,U.start-G),N.end=Math.min(Y-1,U.end+G),N};
209
+ var Gj=(U,G,Y,N,M,Q=Vj)=>{return Q(U.scrollTop,U.containerHeight,G,Y,M,U.visibleRange),wj(U.visibleRange,N,Y,U.renderRange),U.totalHeight=M.virtualHeight,U.actualHeight=M.actualHeight,U.isCompressed=M.isCompressed,U.compressionRatio=M.ratio,U};
210
+ var Kj=200,jj=50;
211
+ var Mj=15,Pj=2,_j=50;
212
+ var Tj=(U)=>{let{adapter:G,loading:Y}=U,N=Y?.cancelThreshold??Mj,M=Y?.preloadThreshold??Pj,Q=Y?.preloadAhead??_j;
213
+ return{name:"withData",priority:20,methods:["reload"],setup(j){let{emitter:D}=j,T=j.config.reverse,z=j.config.overscan,W=Bj({adapter:G,pageSize:jj,onStateChange:()=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.updateCompressionMode(),j.state.viewportState=Gj(j.state.viewportState,j.heightCache,j.getVirtualTotal(),z,j.getCachedCompression()),j.updateContentSize(j.state.viewportState.totalHeight),j.renderIfNeeded()},onItemsLoaded:(Z,F,V)=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.forceRender(),D.emit("load:end",{items:Z,total:V})}});
214
+ j.replaceDataManager(W);
215
+ let y=null,L=null,b=0,C=()=>{if(L){let Z=L;
216
+ L=null,j.dataManager.ensureRange(Z.start,Z.end).catch((F)=>{D.emit("error",{error:F,context:"ensureRange"})})}};
217
+ j.afterScroll.push((Z,F)=>{if(j.state.isDestroyed)return;
218
+ let V=j.scrollController.getVelocity(),h=j.scrollController.isTracking()&&V<=N;
219
+ if(L&&b>N&&V<=N){let A=L;
220
+ L=null,j.dataManager.ensureRange(A.start,A.end).catch((f)=>{D.emit("error",{error:f,context:"ensureRange"})})}
221
+ if(b=V,h&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(T){if(Z<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((A)=>{D.emit("error",{error:A,context:"loadMore"})})}
222
+ else if(j.state.viewportState.totalHeight-Z-j.state.viewportState.containerHeight<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((f)=>{D.emit("error",{error:f,context:"loadMore"})})}
223
+ let{renderRange:w}=j.state.viewportState;
224
+ if(!y||w.start!==y.start||w.end!==y.end)if(y={start:w.start,end:w.end},h){L=null;
225
+ let{start:A,end:f}=w,I=j.getVirtualTotal();
226
+ if(V>M)if(F==="down")f=Math.min(w.end+Q,I-1);
227
+ else A=Math.max(w.start-Q,0);
228
+ j.dataManager.ensureRange(A,f).catch((r)=>{D.emit("error",{error:r,context:"ensureRange"})})}
229
+ else L={start:w.start,end:w.end}});
230
+ let u=200,H=null;
231
+ j.afterScroll.push((Z,F)=>{if(H!==null)clearTimeout(H);
232
+ H=setTimeout(()=>{H=null,C()},u)}),j.destroyHandlers.push(()=>{if(H!==null)clearTimeout(H),H=null}),D.on("load:start",()=>{j.dom.root.setAttribute("aria-busy","true")}),D.on("load:end",()=>{j.dom.root.removeAttribute("aria-busy")}),j.methods.set("reload",async()=>{await j.dataManager.reload()}),D.emit("load:start",{offset:0,limit:jj}),j.dataManager.loadInitial().catch((Z)=>{D.emit("error",{error:Z,context:"loadInitial"})})}}};
233
+ export{Tj as withData,Ej as replacePlaceholders,Uj as mergeRanges,d as isPlaceholderItem,Nj as filterPlaceholders,$j as createSparseStorage,Yj as createPlaceholderManager,Bj as createDataManager,Fj as countRealItems,Xj as calculateMissingRanges};
@@ -1 +1,203 @@
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(_)}
93
+ px, ${Math.round(f)}
94
+ px)`},v=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?P:j.getColumnWidth(P),E;
95
+ if(F||U)E=J.getHeight(Z)-j.gap;
96
+ else{let _=j.getRow(Z);
97
+ E=J.getHeight(_)-j.gap}
98
+ Q.style.width=`${L}
99
+ px`,Q.style.height=`${E}
100
+ px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);
101
+ if(_.className=y,_.dataset.index=String(Q),_.dataset.id=String(Z.id),_.dataset.row=String(j.getRow(Q)),_.dataset.col=String(j.getCol(Q)),_.ariaSelected=String(U),O)_.id=`${O}-item-${Q}`;
102
+ if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));
103
+ v(_,Q);
104
+ let x=q(Z,Q,f);
105
+ 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]);
106
+ for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),b.release(u.element),W.delete(z);
107
+ let _=!1;
108
+ if(G){let z=String(G());
109
+ _=z!==K,K=z}
110
+ let f=document.createDocumentFragment(),x=[];
111
+ for(let z=Z.start;
112
+ z<=Z.end;
113
+ z++){let u=z-Z.start,R=Q[u];
114
+ if(!R){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${Z.start}-${Z.end}, items.length: ${Q.length})`);
115
+ continue}
116
+ let p=U.has(R.id),l=z===L,H=W.get(z);
117
+ if(H){let c=H.element.dataset.id,q2=String(R.id);
118
+ if(c!==q2){let $2=B(p,l),k2=q(R,z,$2);
119
+ 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)}
120
+ if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,E),_)H.element.setAttribute("aria-setsize",K)}
121
+ else{let c=I(z,R,p,l,E);
122
+ f.appendChild(c),x.push({index:z,element:c})}}
123
+ if(x.length>0){Y.appendChild(f);
124
+ for(let{index:z,element:u}
125
+ 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);
126
+ if(E){let _=B(U,L),f=q(Z,Q,_);
127
+ 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);
128
+ if(L)V(L.element,Z,U)},s=(Q)=>{return W.get(Q)?.element},g=(Q)=>{if(Math.abs(Q-P)<1)return;
129
+ P=Q;
130
+ 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);
131
+ W.clear()};
132
+ return{render:d,updatePositions:h,updateItem:m,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:j2,destroy:()=>{j2(),b.clear()}}};
133
+ var Z2=(Y,q,J,j,D,X)=>{if(j===0)return 0;
134
+ 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;
135
+ switch(X){case"center":F=O-J/2+b/2;
136
+ break;
137
+ case"end":F=O-J+b;
138
+ break;
139
+ case"start":default:F=O;
140
+ break}
141
+ return Math.max(0,Math.min(F,P))};
142
+ var t=(Y,q,J,j,D="start",X,G=Z2)=>{return G(Y,q,J,j,X,D)};
143
+ var X2=(Y)=>{if(!Y.columns||Y.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");
144
+ let q=null,J=null;
145
+ return{name:"withGrid",priority:10,setup(j){let{dom:D,emitter:X,config:G,rawConfig:O}=j,{classPrefix:b}=G;
146
+ if(G.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");
147
+ if(G.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");
148
+ let W=O.items?.some((k)=>k.__groupHeader===!0),P={columns:Y.columns,gap:Y.gap??0};
149
+ if(W)P.isHeaderFn=(k)=>{let M=j.dataManager.getItem(k);
150
+ return!!(M&&M.__groupHeader===!0)};
151
+ q=a(P);
152
+ let F=q.gap;
153
+ j.setVirtualTotalFn(()=>{let k=j.dataManager.getTotal();
154
+ return q.getTotalRows(k)});
155
+ let w=O.item,C=G.horizontal?w.width:w.height,K={containerWidth:j.getContainerWidth(),columns:q.columns,gap:q.gap};
156
+ 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};
157
+ return C(k,S)+K.gap});
158
+ else if(F>0)j.setHeightConfig(C+F);
159
+ j.rebuildHeightCache(),D.root.classList.add(`${b}--grid`);
160
+ 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)};
161
+ 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});
162
+ let M=j.dataManager.getTotal(),V=0;
163
+ for(let A=0;
164
+ A<M;
165
+ A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);
166
+ V+=S}
167
+ j.heightCache.getTotalHeight=()=>V,j.dom.content.style.height=`${V}
168
+ px`,B()}),j.methods.set("updateGrid",(k)=>{if(k.columns!==void 0){if(!Number.isInteger(k.columns)||k.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
169
+ P.columns=k.columns}
170
+ if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
171
+ P.gap=k.gap}
172
+ if(q)q.update(P);
173
+ let M=j.getContainerWidth();
174
+ if(K.containerWidth=M,K.columns=P.columns,K.gap=P.gap??0,J)J.updateContainerWidth(M);
175
+ j.rebuildHeightCache(),j.updateContentSize(j.heightCache.getTotalHeight()),j.updateCompressionMode();
176
+ for(let V=0;
177
+ V<j.contentSizeHandlers.length;
178
+ V++)j.contentSizeHandlers[V]();
179
+ if(J)J.clear();
180
+ j.forceRender()});
181
+ let y=()=>{if(j.state.isDestroyed)return;
182
+ let k=j.scrollController.getScrollTop(),M=j.state.viewportState.containerHeight,V=j.getVirtualTotal(),A={start:0,end:0};
183
+ if(V===0||M===0)A.start=0,A.end=0;
184
+ else{A.start=Math.max(0,j.heightCache.indexAtOffset(k));
185
+ let g=j.heightCache.indexAtOffset(k+M);
186
+ if(g<V-1)g++;
187
+ A.end=Math.min(V-1,Math.max(0,g))}
188
+ let S=G.overscan??3,v={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};
189
+ j.state.viewportState.scrollTop=k,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=v;
190
+ let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;
191
+ if(v.start===I.start&&v.end===I.end){if(d)J.updatePositions(j.getCompressionContext());
192
+ return}
193
+ 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;
194
+ J.render(r,m,new Set,-1,s),j.state.lastRenderRange={...v},X.emit("range:change",{range:v})},T=()=>{if(j.state.isDestroyed)return;
195
+ j.state.lastRenderRange={start:-1,end:-1},y()};
196
+ 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());
197
+ if(S==="smooth")j.scrollController.scrollTo(h);
198
+ else j.scrollController.scrollTo(h)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());
199
+ j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;
200
+ 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};
201
+ if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??e};
202
+ return{align:"start",behavior:"auto",duration:e}};
203
+ export{X2 as withGrid,i as createGridRenderer,a as createGridLayout};