@floor/vlist 0.7.3 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async/index.js +1 -1
- package/dist/builder/index.js +1 -1
- package/dist/builder/types.d.ts +6 -0
- package/dist/features/scale/plugin.d.ts +1 -0
- package/dist/grid/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/rendering/scale.d.ts +0 -1
- package/dist/scale/index.js +1 -1
- package/dist/sections/index.js +1 -1
- package/dist/vlist.css +1 -1
- package/package.json +1 -1
package/dist/async/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var $j=(U={})=>{let{chunkSize:G=100,maxCachedItems:Y=5000,evictionBuffer:N=200,onEvict:M}=U,Q=new Map,j=0,D=0,f=(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=f(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}},T=(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:T,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),f=Q.start;for(let z of D){if(z.end<f)continue;if(z.start>Q.end)break;if(z.start>f)j.push({start:f,end:Math.min(z.start-1,Q.end)});if(f=z.end+1,f>Q.end)break}if(f<=Q.end)j.push({start:f,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,f=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 T=V.get(k),I=Array.isArray(A)?"array":typeof A;if(T.types.add(I),typeof A==="string")T.lengths.push(A.length);else if(A!==null&&A!==void 0)T.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),T=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:T,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_${f++}`,["_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,f=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:f,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}-${$}`},T=()=>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(),f?.(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:T,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 fj=(U)=>{let{adapter:G,loading:Y}=U,N=Y?.cancelThreshold??Mj,M=Y?.preloadThreshold??Pj,Q=Y?.preloadAhead??_j;return{name:"withAsync",priority:20,methods:["reload"],setup(j){let{emitter:D}=j,f=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((T)=>{D.emit("error",{error:T,context:"ensureRange"})})}if(b=V,h&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(f){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((T)=>{D.emit("error",{error:T,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:T}=w,I=j.getVirtualTotal();if(V>M)if(F==="down")T=Math.min(w.end+Q,I-1);else A=Math.max(w.start-Q,0);j.dataManager.ensureRange(A,T).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{fj as withAsync,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 Yj=(b={})=>{let{chunkSize:Z=100,maxCachedItems:K=5000,evictionBuffer:P=200,onEvict:M}=b,U=new Map,j=0,F=0,S=(J)=>{let X=U.get(J);if(!X)X={items:Array(Z),count:0,lastAccess:Date.now()},U.set(J,X);else X.lastAccess=Date.now();return X},O=(J)=>{return Math.floor(J/Z)},q=(J)=>{return J%Z},H=()=>j,g=(J)=>{j=J},T=(J)=>{if(J<0||J>=j)return;let X=O(J),Y=U.get(X);if(!Y)return;return Y.items[q(J)]},R=(J)=>{if(J<0||J>=j)return!1;let X=O(J),Y=U.get(X);if(!Y)return!1;return Y.items[q(J)]!==void 0},v=(J,X)=>{let Y=O(J),w=S(Y),N=q(J),u=w.items[N]===void 0;if(w.items[N]=X,u)w.count++,F++;if(J>=j)j=J+1},G=(J,X)=>{for(let Y=0;Y<X.length;Y++){let w=X[Y];if(w!==void 0)v(J+Y,w)}},W=(J)=>{if(J<0||J>=j)return!1;let X=O(J),Y=U.get(X);if(!Y)return!1;let w=q(J);if(Y.items[w]===void 0)return!1;if(Y.items[w]=void 0,Y.count--,F--,Y.count===0)U.delete(X);return!0},B=(J,X)=>{let Y=[];for(let w=J;w<=X&&w<j;w++)Y.push(T(w));return Y},_=(J,X)=>{for(let Y=J;Y<=X&&Y<j;Y++)if(!R(Y))return!1;return!0},A=()=>{let J=[],X=null,Y=Array.from(U.keys()).sort((w,N)=>w-N);for(let w of Y){let N=U.get(w);if(!N)continue;let u=w*Z;for(let k=0;k<Z;k++){let h=u+k;if(h>=j)break;if(N.items[k]!==void 0)if(X===null)X={start:h,end:h};else if(h===X.end+1)X.end=h;else J.push(X),X={start:h,end:h};else if(X!==null)J.push(X),X=null}}if(X!==null)J.push(X);return J},V=(J,X)=>{let Y=[],w=null;for(let N=J;N<=X&&N<j;N++)if(!R(N))if(w===null)w={start:N,end:N};else w.end=N;else if(w!==null)Y.push(w),w=null;if(w!==null)Y.push(w);return Y},z=(J)=>{return U.has(J)},y=(J)=>{let X=U.get(J);if(X)X.lastAccess=Date.now()},E=(J,X)=>{if(J>X||U.size===0)return;let Y=Date.now(),w=O(Math.max(0,J)),N=O(Math.min(j-1,X));for(let u=w;u<=N;u++){let k=U.get(u);if(k)k.lastAccess=Y}},p=(J,X)=>{if(F<=K)return 0;let Y=Math.max(0,J-P),w=Math.min(j-1,X+P),N=O(Y),u=O(w),k=0,h=[];for(let[d,Jj]of U)if(d<N||d>u)k+=Jj.count,h.push(d),F-=Jj.count,U.delete(d);if(k>0&&M)M(k,h);return k},m=()=>{if(F<=K)return 0;let J=Array.from(U.entries()).sort(([,w],[,N])=>w.lastAccess-N.lastAccess),X=0,Y=[];for(let[w,N]of J){if(F<=K)break;X+=N.count,F-=N.count,Y.push(w),U.delete(w)}if(X>0&&M)M(X,Y);return X},t=()=>{return{totalItems:j,cachedItems:F,cachedChunks:U.size,chunkSize:Z,maxCachedItems:K,memoryEfficiency:j>0?1-F/j:1}},e=()=>F,qj=()=>{U.clear(),F=0};return{chunkSize:Z,maxCachedItems:K,getTotal:H,setTotal:g,get:T,has:R,set:v,setRange:G,delete:W,getRange:B,isRangeLoaded:_,getLoadedRanges:A,findUnloadedRanges:V,getChunkIndex:O,isChunkLoaded:z,touchChunk:y,touchChunksForRange:E,evictDistant:p,evictToLimit:m,getStats:t,getCachedCount:e,clear:qj,reset:()=>{qj(),j=0}}},wj=(b)=>{if(b.length===0)return[];let Z=[...b].sort((P,M)=>P.start-M.start),K=[{...Z[0]}];for(let P=1;P<Z.length;P++){let M=Z[P],U=K[K.length-1];if(M.start<=U.end+1)U.end=Math.max(U.end,M.end);else K.push({...M})}return K},$j=(b,Z,K)=>{let P=Math.floor(b.start/K)*K,M=Math.ceil((b.end+1)/K)*K-1,U={start:P,end:M};if(Z.length===0)return[U];let j=[],F=wj(Z),S=U.start;for(let O of F){if(O.end<S)continue;if(O.start>U.end)break;if(O.start>S)j.push({start:S,end:Math.min(O.start-1,U.end)});if(S=O.end+1,S>U.end)break}if(S<=U.end)j.push({start:S,end:U.end});return j};var Bj=(b={})=>{let{enabled:Z=!0,maskCharacter:K="█",randomVariance:P=!0,maxSampleSize:M=20,customGenerator:U}=b,j=null,F=!1,S=0,O=(W)=>{if(!Z||F||W.length===0)return;let B=new Map,_=new Map,A=Math.min(W.length,M);for(let V=0;V<A;V++){let z=W[V];if(!z||typeof z!=="object")continue;for(let[y,E]of Object.entries(z)){if(y.startsWith("_")||y==="id")continue;if(!_.has(y))_.set(y,{lengths:[],types:new Set});let p=_.get(y),m=Array.isArray(E)?"array":typeof E;if(p.types.add(m),typeof E==="string")p.lengths.push(E.length);else if(E!==null&&E!==void 0)p.lengths.push(String(E).length)}}for(let[V,z]of _){if(z.lengths.length===0)continue;let y=Math.min(...z.lengths),E=Math.max(...z.lengths),p=Math.round(z.lengths.reduce((t,e)=>t+e,0)/z.lengths.length),m="string";if(z.types.has("number")&&z.types.size===1)m="number";else if(z.types.has("boolean")&&z.types.size===1)m="boolean";else if(z.types.has("array"))m="array";else if(z.types.has("object")&&!z.types.has("string"))m="object";B.set(V,{minLength:y,maxLength:E,avgLength:p,type:m})}j=B,F=!0},q=()=>F,H=(W)=>{let B=W.avgLength;if(P&&W.minLength!==W.maxLength){if(B=Math.floor(Math.random()*(W.maxLength-W.minLength+1)+W.minLength),Math.random()<0.3)B=Math.max(1,B+Math.floor(Math.random()*3)-1)}return K.repeat(Math.max(1,B))},g=(W)=>{if(U)return{...U(W),["_isPlaceholder"]:!0};let B={id:`__placeholder_${S++}`,["_isPlaceholder"]:!0,_index:W};if(!j||j.size===0)return B.label=K.repeat(12),B;for(let[_,A]of j)switch(A.type){case"string":B[_]=H(A);break;case"number":B[_]=0;break;case"boolean":B[_]=!1;break;case"array":B[_]=[];break;case"object":B[_]={};break;default:B[_]=H(A)}return B};return{analyzeStructure:O,hasAnalyzedStructure:q,generate:g,generateRange:(W,B)=>{let _=[];for(let A=W;A<=B;A++)_.push(g(A));return _},isPlaceholder:(W)=>{if(!W||typeof W!=="object")return!1;return W._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{j=null,F=!1,S=0}}},o=(b)=>{if(!b||typeof b!=="object")return!1;return b._isPlaceholder===!0},Wj=(b)=>{return b.filter((Z)=>!o(Z))},Kj=(b)=>{let Z=0;for(let K of b)if(K!==void 0&&!o(K))Z++;return Z},zj=(b,Z,K)=>{let P=0;for(let M=0;M<Z.length;M++){let U=K+M,j=b[U];if(j===void 0||o(j)){if(b[U]=Z[M],o(j))P++}}return P};var yj=50,Gj=(b={})=>{let{adapter:Z,initialItems:K,initialTotal:P,storage:M,placeholder:U,pageSize:j=yj,onStateChange:F,onItemsLoaded:S,onItemsEvicted:O}=b,q=Yj({...M,onEvict:(Q,$)=>{O?.(Q),V()}}),H=null,g=()=>{if(!H)H=Bj(U);return H},T=new Map,R=!1,v,G=!0,W,B=[],_=0,A=new Map,V=()=>{F?.(Uj())},z=()=>{T.clear();let Q=q.getLoadedRanges();for(let $ of Q)for(let D=$.start;D<=$.end;D++){let L=q.get(D);if(L&&!o(L))T.set(L.id,D)}},y=(Q,$)=>{if(!o($))T.set($.id,Q)},E=(Q)=>{T.delete(Q)},p=(Q,$)=>{return`${Q}-${$}`},m=()=>q.getTotal(),t=()=>q.getCachedCount(),e=()=>R,qj=()=>G,Uj=()=>({total:q.getTotal(),cached:q.getCachedCount(),isLoading:R,pendingRanges:B,error:v,hasMore:G,cursor:W}),J=()=>q,X=()=>g(),Y=(Q)=>{let $=q.get(Q);if($!==void 0)return $;if(Q>=0&&Q<q.getTotal())return g().generate(Q);return},w=(Q)=>{let $=T.get(Q);if($===void 0)return;return q.get($)},N=(Q)=>{return T.get(Q)??-1},u=(Q)=>{let $=q.get(Q);return $!==void 0&&!o($)},k=(Q,$)=>{let D=[],L=q.getTotal(),l=0,x=0;q.touchChunksForRange(Q,Math.min($,L-1));for(let c=Q;c<=$&&c<L;c++){let i=q.get(c);if(i!==void 0)D.push(i),l++;else D.push(g().generate(c)),x++}return D},h=(Q)=>{q.setTotal(Q),G=q.getCachedCount()<Q,V()},d=(Q,$=0,D)=>{if(H&&!H.hasAnalyzedStructure()&&Q.length>0)H.analyzeStructure(Q);for(let L=0;L<Q.length;L++){let l=Q[L];if(l!==void 0){let x=$+L;q.set(x,l),y(x,l)}}if(D!==void 0)q.setTotal(D);else if($+Q.length>q.getTotal())q.setTotal($+Q.length);if(q.getCachedCount()>=q.getTotal()&&q.getTotal()>0)G=!1;S?.(Q,$,q.getTotal()),V()},Jj=(Q,$)=>{let D=T.get(Q);if(D===void 0)return!1;let L=q.get(D);if(!L)return!1;let l={...L,...$};if(q.set(D,l),$.id!==void 0&&$.id!==Q)E(Q),y(D,l);return V(),!0},Nj=(Q)=>{let $=T.get(Q);if($===void 0)return!1;q.delete($),E(Q);let D=q.getTotal();if(D>0)q.setTotal(D-1);return V(),!0},Qj=async(Q,$)=>{if(!Z)return;let D=p(Q,$);if(A.has(D))return;let L=q.getLoadedRanges(),l=$j({start:Q,end:$},L,q.chunkSize);if(l.length===0)return;let x=q.chunkSize,c=[];for(let f of l){let a=Math.floor(f.start/x),n=Math.floor(f.end/x);for(let C=a;C<=n;C++){let s=C*x,I=s+x-1,r=p(s,I);if(!c.some((Xj)=>Xj.start===s)&&!A.has(r))c.push({start:s,end:I})}}let i=[];for(let f of l){let a=Math.floor(f.start/x),n=Math.floor(f.end/x);for(let C=a;C<=n;C++){let s=C*x,I=s+x-1,r=p(s,I);if(A.has(r)){let Xj=A.get(r);if(!i.includes(Xj))i.push(Xj)}}}for(let f of c){let a=p(f.start,f.end),n=(async()=>{B.push(f),R=!0,v=void 0,V();try{let C=f.end-f.start+1,s={offset:f.start,limit:C,cursor:void 0},I=await Z.read(s);if(d(I.items,f.start,I.total),I.cursor)W=I.cursor;let r=f.start+I.items.length;if(r>=_){if(_=r,I.hasMore!==void 0)G=I.hasMore;else if(I.total!==void 0)G=r<I.total}}catch(C){v=C instanceof Error?C:Error(String(C))}finally{A.delete(a),B=B.filter((C)=>C.start!==f.start||C.end!==f.end),R=A.size>0,V()}})();A.set(a,n),i.push(n)}await Promise.all(i)},Hj=async(Q,$)=>{if(q.isRangeLoaded(Q,$))return;await Qj(Q,$)},bj=async()=>{if(!Z)return;await Qj(0,j-1)},Pj=async()=>{if(!Z||R||!G)return!1;let Q=q.getCachedCount(),$=q.getTotal(),D=Q,L=Math.min(D+j-1,$>0?$-1:D+j-1);if(D>=$&&$>0)return G=!1,!1;return await Qj(D,L),q.getCachedCount()>Q},Mj=async()=>{if(q.clear(),T.clear(),H)H.clear();A.clear(),B=[],R=!1,W=void 0,G=!0,_=0,v=void 0,V()},_j=(Q,$)=>{if(q.evictDistant(Q,$)>0)z()},Aj=()=>{q.clear(),T.clear(),W=void 0,v=void 0,B=[],R=!1,V()},Oj=()=>{if(q.reset(),T.clear(),H)H.clear();W=void 0,G=!0,_=0,v=void 0,B=[],R=!1,V()};if(K&&K.length>0)d(K,0,P??K.length);else if(P!==void 0)q.setTotal(P);return{getState:Uj,getTotal:m,getCached:t,getIsLoading:e,getHasMore:qj,getStorage:J,getPlaceholders:X,getItem:Y,getItemById:w,getIndexById:N,isItemLoaded:u,getItemsInRange:k,setTotal:h,setItems:d,updateItem:Jj,removeItem:Nj,loadRange:Qj,ensureRange:Hj,loadInitial:bj,loadMore:Pj,reload:Mj,evictDistant:_j,clear:Aj,reset:Oj}};var Fj=200,jj=50;var Zj=15,Vj=2,Dj=50;var Ej=(b)=>{let{adapter:Z,loading:K}=b,P=K?.cancelThreshold??Zj,M=K?.preloadThreshold??Vj,U=K?.preloadAhead??Dj;return{name:"withAsync",priority:20,methods:["reload"],setup(j){let{emitter:F}=j,S=j.config.reverse,O=Gj({adapter:Z,pageSize:jj,onStateChange:()=>{if(j.state.isInitialized){j.heightCache.rebuild(j.getVirtualTotal()),j.updateCompressionMode();let G=j.getCachedCompression();j.state.viewportState.totalHeight=G.virtualHeight,j.state.viewportState.actualHeight=G.actualHeight,j.state.viewportState.isCompressed=G.isCompressed,j.state.viewportState.compressionRatio=G.ratio,j.updateContentSize(G.virtualHeight),j.renderIfNeeded()}},onItemsLoaded:(G,W,B)=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.forceRender(),F.emit("load:end",{items:G,total:B})}});j.replaceDataManager(O);let q=null,H=null,g=0,T=()=>{if(H){let G=H;H=null,j.dataManager.ensureRange(G.start,G.end).catch((W)=>{F.emit("error",{error:W,context:"ensureRange"})})}};j.afterScroll.push((G,W)=>{if(j.state.isDestroyed)return;let B=j.scrollController.getVelocity(),A=j.scrollController.isTracking()&&B<=P;if(H&&g>P&&B<=P){let y=H;H=null,j.dataManager.ensureRange(y.start,y.end).catch((E)=>{F.emit("error",{error:E,context:"ensureRange"})})}if(g=B,A&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(S){if(G<Fj)F.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((y)=>{F.emit("error",{error:y,context:"loadMore"})})}else if(j.state.viewportState.totalHeight-G-j.state.viewportState.containerHeight<Fj)F.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((E)=>{F.emit("error",{error:E,context:"loadMore"})})}let{renderRange:V}=j.state.viewportState;if(!q||V.start!==q.start||V.end!==q.end)if(q={start:V.start,end:V.end},A){H=null;let{start:y,end:E}=V,p=j.getVirtualTotal();if(B>M)if(W==="down")E=Math.min(V.end+U,p-1);else y=Math.max(V.start-U,0);j.dataManager.ensureRange(y,E).catch((m)=>{F.emit("error",{error:m,context:"ensureRange"})})}else H={start:V.start,end:V.end}});let R=200,v=null;j.afterScroll.push((G,W)=>{if(v!==null)clearTimeout(v);v=setTimeout(()=>{v=null,T()},R)}),j.destroyHandlers.push(()=>{if(v!==null)clearTimeout(v),v=null}),F.on("load:start",()=>{j.dom.root.setAttribute("aria-busy","true")}),F.on("load:end",()=>{j.dom.root.removeAttribute("aria-busy")}),j.methods.set("reload",async()=>{q=null,H=null,j.invalidateRendered(),await j.dataManager.reload(),j.forceRender();let{renderRange:G}=j.state.viewportState;if(G.end>0)await j.dataManager.ensureRange(G.start,G.end)}),F.emit("load:start",{offset:0,limit:jj}),j.dataManager.loadInitial().catch((G)=>{F.emit("error",{error:G,context:"loadInitial"})})}}};export{Ej as withAsync,zj as replacePlaceholders,wj as mergeRanges,o as isPlaceholderItem,Wj as filterPlaceholders,Yj as createSparseStorage,Bj as createPlaceholderManager,Gj as createDataManager,Kj as countRealItems,$j as calculateMissingRanges};
|
package/dist/builder/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var QJ=0,m=5,qJ=100,Oj=2,KJ=(X=0)=>{let U=Array(m);for(let $=0;$<m;$++)U[$]={position:0,time:0};return{velocity:0,lastPosition:X,lastTime:performance.now(),samples:U,sampleIndex:0,sampleCount:0}},UJ=(X,U)=>{let $=performance.now(),Y=$-X.lastTime;if(Y===0)return X;if(Y>qJ){X.sampleCount=0,X.sampleIndex=0,X.velocity=0;let Q=X.samples[0];return Q.position=U,Q.time=$,X.sampleIndex=1,X.sampleCount=1,X.lastPosition=U,X.lastTime=$,X}let V=X.samples[X.sampleIndex];if(V.position=U,V.time=$,X.sampleIndex=(X.sampleIndex+1)%m,X.sampleCount=Math.min(X.sampleCount+1,m),X.sampleCount>=Oj){let Q=(X.sampleIndex-X.sampleCount+m)%m,K=X.samples[Q],D=U-K.position,C=$-K.time;X.velocity=C>0?Math.abs(D)/C:0}return X.lastPosition=U,X.lastTime=$,X},Sj=(X,U)=>{if(typeof X==="number"){let Q=U;return{getOffset:(K)=>K*X,getHeight:()=>X,indexAtOffset:(K)=>{if(Q===0||X===0)return 0;return Math.max(0,Math.min(Math.floor(K/X),Q-1))},getTotalHeight:()=>Q*X,getTotal:()=>Q,rebuild:(K)=>{Q=K},isVariable:()=>!1}}let $=U,Y=new Float64Array(0),V=(Q)=>{$=Q,Y=new Float64Array(Q+1),Y[0]=0;for(let K=0;K<Q;K++)Y[K+1]=Y[K]+X(K)};return V(U),{getOffset:(Q)=>{if(Q<=0)return 0;if(Q>=$)return Y[$];return Y[Q]},getHeight:(Q)=>X(Q),indexAtOffset:(Q)=>{if($===0)return 0;if(Q<=0)return 0;if(Q>=Y[$])return $-1;let K=0,D=$-1;while(K<D){let C=K+D+1>>>1;if(Y[C]<=Q)K=C;else D=C-1}return K},getTotalHeight:()=>Y[$]??0,getTotal:()=>$,rebuild:(Q)=>V(Q),isVariable:()=>!0}},YJ=()=>{let X={},U=(Q,K)=>{if(!X[Q])X[Q]=new Set;return X[Q].add(K),()=>$(Q,K)},$=(Q,K)=>{X[Q]?.delete(K)};return{on:U,off:$,emit:(Q,K)=>{X[Q]?.forEach((D)=>{try{D(K)}catch(C){console.error(`[vlist] Error in "${Q}" handler:`,C)}})},clear:()=>{for(let Q in X)delete X[Q]}}},BJ=(X)=>{if(typeof X==="string"){let U=document.querySelector(X);if(!U)throw Error(`[vlist/builder] Container not found: ${X}`);return U}return X},GJ=(X,U,$,Y)=>{let V=document.createElement("div");if(V.className=U,Y)V.classList.add(`${U}--horizontal`);if(V.setAttribute("role","listbox"),V.setAttribute("tabindex","0"),$)V.setAttribute("aria-label",$);if(Y)V.setAttribute("aria-orientation","horizontal");let Q=document.createElement("div");if(Q.className=`${U}-viewport`,Y)Q.style.overflowX="auto",Q.style.overflowY="hidden";else Q.style.overflow="auto";Q.style.height="100%",Q.style.width="100%";let K=document.createElement("div");if(K.className=`${U}-content`,K.style.position="relative",Y)K.style.height="100%";else K.style.width="100%";let D=document.createElement("div");if(D.className=`${U}-items`,D.style.position="relative",Y)D.style.height="100%";else D.style.width="100%";return K.appendChild(D),Q.appendChild(K),V.appendChild(Q),X.appendChild(V),{root:V,viewport:Q,content:K,items:D}},WJ=(X=100)=>{let U=[];return{acquire:()=>{let $=U.pop();if($)return $;let Y=document.createElement("div");return Y.setAttribute("role","option"),Y},release:($)=>{if(U.length<X)$.className="",$.textContent="",$.removeAttribute("style"),$.removeAttribute("data-index"),$.removeAttribute("data-id"),U.push($)},clear:()=>{U.length=0}}},DJ=(X,U,$,Y,V)=>{if(Y===0||U===0){V.start=0,V.end=0;return}let Q=$.indexAtOffset(X),K=$.indexAtOffset(X+U);if(K<Y-1)K++;V.start=Math.max(0,Q),V.end=Math.min(Y-1,Math.max(0,K))},VJ=(X,U,$,Y)=>{if($===0){Y.start=0,Y.end=0;return}Y.start=Math.max(0,X.start-U),Y.end=Math.min($-1,X.end+U)},_J=(X,U,$,Y,V)=>{if(Y===0)return 0;let Q=Math.max(0,Math.min(X,Y-1)),K=U.getOffset(Q),D=U.getHeight(Q),C=Math.max(0,U.getTotalHeight()-$),f;switch(V){case"center":f=K-($-D)/2;break;case"end":f=K-$+D;break;default:f=K}return Math.max(0,Math.min(f,C))},LJ=(X)=>X<0.5?2*X*X:-1+(4-2*X)*X,NJ=(X)=>{if(typeof X==="string")return{align:X,behavior:"auto",duration:300};if(X&&typeof X==="object")return{align:X.align??"start",behavior:X.behavior??"auto",duration:X.duration??300};return{align:"start",behavior:"auto",duration:300}},MJ=(X)=>{if(!X.container)throw Error("[vlist/builder] Container is required");if(!X.item)throw Error("[vlist/builder] item configuration is required");let U=X.direction==="horizontal",$=U?"width":"height",Y=U?X.item.width:X.item.height;if(Y==null)throw Error(`[vlist/builder] item.${$} is required${U?" when direction is 'horizontal'":""}`);if(typeof Y==="number"&&Y<=0)throw Error(`[vlist/builder] item.${$} must be a positive number`);if(typeof Y!=="number"&&typeof Y!=="function")throw Error(`[vlist/builder] item.${$} must be a number or a function (index) => number`);if(!X.item.template)throw Error("[vlist/builder] item.template is required");if(U&&X.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let V=new Map,Q=!1,K={use(D){if(Q)throw Error("[vlist/builder] Cannot call .use() after .build()");return V.set(D.name,D),K},build(){if(Q)throw Error("[vlist/builder] .build() can only be called once");return Q=!0,AJ(X,V,U,Y)}};return K};function AJ(X,U,$,Y){let{item:V,items:Q,overscan:K=3,classPrefix:D="vlist",ariaLabel:C,reverse:f=!1,scroll:Kj}=X,Ij=Kj?.wheel??!0,Fj=Kj?.wrap??!1,c=f,Rj=`${D}-${QJ++}`,Tj=Y,yj=$?typeof V.height==="number"?V.height:void 0:typeof V.width==="number"?V.width:void 0,i=V.template,uj={overscan:K,classPrefix:D,reverse:c,wrap:Fj,horizontal:$,ariaIdPrefix:Rj},d=Array.from(U.values()).sort((j,J)=>(j.priority??50)-(J.priority??50)),t=new Set(d.map((j)=>j.name));for(let j of d)if(j.conflicts){for(let J of j.conflicts)if(t.has(J))throw Error(`[vlist/builder] ${j.name} and ${J} cannot be combined`)}if($){if(t.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(t.has("withGroups"))throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'")}if(c){if(t.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let fj=BJ(X.container),_=GJ(fj,D,C,$),k=YJ(),B=Q?[...Q]:[],N=Sj(Tj,B.length),e=WJ(),R=_.viewport.clientHeight,jj=_.viewport.clientWidth,s=!1,x=!1,O=0,p=null,l=null,I=KJ(0),Jj={start:0,end:0},E={start:0,end:0},h={start:-1,end:-1},H={viewportState:{scrollTop:0,containerHeight:R,totalHeight:N.getTotalHeight(),actualHeight:N.getTotalHeight(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},v=new Map,Uj={selected:!1,focused:!1},xj=`${D}-item`,a="",P=new Map,Yj=()=>{P.clear();for(let j=0;j<B.length;j++){let J=B[j];if(J)P.set(J.id,j)}};Yj();let F=null,z=()=>F?F.getTotal():B.length,Bj=[],Gj=[],Wj=[],Dj=[],r=[],Vj=[],L=new Map,u=()=>{return $?_.viewport.scrollLeft:_.viewport.scrollTop},S=(j)=>{if($)_.viewport.scrollLeft=j;else _.viewport.scrollTop=j},Cj=(j=2)=>{let J=N.getTotalHeight();return O+R>=J-j},pj=!1,y,T,kj=(j,J,Z,q,W)=>{DJ(j,J,Z,q,W)},Xj=(j,J,Z,q,W)=>{return _J(j,J,Z,q,W)},_j=(j,J)=>{if(typeof J==="string")j.innerHTML=J;else j.replaceChildren(J)},Lj=(j,J)=>{let Z=Math.round(N.getOffset(J));if($)j.style.transform=`translateX(${Z}px)`;else j.style.transform=`translateY(${Z}px)`},hj=(j,J)=>{let Z=e.acquire();if(Z.className=xj,$){if(Z.style.width=`${N.getHeight(j)}px`,yj!=null)Z.style.height=`${yj}px`}else Z.style.height=`${N.getHeight(j)}px`;return Z.dataset.index=String(j),Z.dataset.id=String(J.id),Z.ariaSelected="false",Z.id=`${Rj}-item-${j}`,a=String(z()),Z.setAttribute("aria-setsize",a),Z.setAttribute("aria-posinset",String(j+1)),_j(Z,i(J,j,Uj)),Lj(Z,j),Z},o=()=>{let j=`${N.getTotalHeight()}px`;if($)_.content.style.width=j;else _.content.style.height=j},Nj=new Set,Mj=-1,gj=()=>{if(s)return;let j=z();if(kj(O,R,N,j,Jj),VJ(Jj,K,j,E),E.start===h.start&&E.end===h.end)return;let J=String(j),Z=J!==a;a=J;for(let[G,A]of v)if(G<E.start||G>E.end)A.remove(),e.release(A),v.delete(G);let q=document.createDocumentFragment(),W=[];for(let G=E.start;G<=E.end;G++){let A=F?F.getItem(G):B[G];if(!A)continue;let b=v.get(G);if(b){let w=b.dataset.id,Qj=String(A.id);if(w!==Qj)if(_j(b,i(A,G,Uj)),b.dataset.id=Qj,$)b.style.width=`${N.getHeight(G)}px`;else b.style.height=`${N.getHeight(G)}px`;Lj(b,G);let qj=Nj.has(A.id),$J=G===Mj;if(b.classList.toggle(`${D}-item--selected`,qj),b.classList.toggle(`${D}-item--focused`,$J),b.ariaSelected=qj?"true":"false",Z)b.setAttribute("aria-setsize",a)}else{let w=hj(G,A),Qj=Nj.has(A.id),qj=G===Mj;if(Qj)w.classList.add(`${D}-item--selected`),w.ariaSelected="true";if(qj)w.classList.add(`${D}-item--focused`);q.appendChild(w),W.push({index:G,element:w})}}if(W.length>0){_.items.appendChild(q);for(let{index:G,element:A}of W)v.set(G,A)}h.start=E.start,h.end=E.end,H.lastRenderRange.start=E.start,H.lastRenderRange.end=E.end,H.viewportState.scrollTop=O,H.viewportState.visibleRange.start=Jj.start,H.viewportState.visibleRange.end=Jj.end,H.viewportState.renderRange.start=E.start,H.viewportState.renderRange.end=E.end,k.emit("range:change",{range:{start:E.start,end:E.end}})},mj=()=>{h.start=-1,h.end=-1,y()};y=gj,T=mj;let n=()=>{if(s)return;let j=u(),J=j>=O?"down":"up";if(I=UJ(I,j),!_.root.classList.contains(`${D}--scrolling`))_.root.classList.add(`${D}--scrolling`);O=j,y(),k.emit("scroll",{scrollTop:j,direction:J}),k.emit("velocity:change",{velocity:I.velocity,reliable:I.sampleCount>=Oj});for(let Z=0;Z<Bj.length;Z++)Bj[Z](j,J);if(l)clearTimeout(l);l=setTimeout(()=>{_.root.classList.remove(`${D}--scrolling`),I.velocity=0,I.sampleCount=0,k.emit("velocity:change",{velocity:0,reliable:!1})},Kj?.idleTimeout??150)},Zj=null,g=_.viewport;if(g.addEventListener("scroll",n,{passive:!0}),$&&Ij)Zj=(j)=>{if(j.deltaX)return;j.preventDefault(),_.viewport.scrollLeft+=j.deltaY},_.viewport.addEventListener("wheel",Zj);let Pj=(j)=>{let Z=j.target.closest("[data-index]");if(Z){let q=parseInt(Z.dataset.index??"-1",10);if(q>=0){let W=F?.getItem(q)??B[q];if(W){if(W.__groupHeader)return;k.emit("item:click",{item:W,index:q,event:j})}}}for(let q=0;q<Gj.length;q++)Gj[q](j)},cj=(j)=>{let Z=j.target.closest("[data-index]");if(Z){let q=parseInt(Z.dataset.index??"-1",10);if(q>=0){let W=F?.getItem(q)??B[q];if(W){if(W.__groupHeader)return;k.emit("item:dblclick",{item:W,index:q,event:j})}}}},zj=(j)=>{for(let J=0;J<Wj.length;J++)Wj[J](j)};_.items.addEventListener("click",Pj),_.items.addEventListener("dblclick",cj),_.root.addEventListener("keydown",zj);let Aj=!0,dj=()=>jj,sj=()=>R,bj=new ResizeObserver((j)=>{if(s)return;for(let J of j){let Z=J.contentRect.height,q=J.contentRect.width,W=$?q:Z;if(jj=q,Math.abs(W-R)>1){if(R=W,H.viewportState.containerHeight=W,x)o(),y(),k.emit("resize",{height:Z,width:q})}if(x)for(let G=0;G<Dj.length;G++)Dj[G](q,Z)}});if(Aj)bj.observe(_.viewport);let M={get dom(){return _},get heightCache(){return N},get emitter(){return k},get config(){return uj},get rawConfig(){return X},get renderer(){return{render:(j,J,Z,q,W)=>{Nj=Z,Mj=q,T()},updateItemClasses:(j,J,Z)=>{let q=v.get(j);if(!q)return;q.classList.toggle(`${D}-item--selected`,J),q.classList.toggle(`${D}-item--focused`,Z),q.ariaSelected=J?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(j)=>v.get(j)??null,clear:()=>{},destroy:()=>{}}},set renderer(j){},get dataManager(){return F},set dataManager(j){F=j},get scrollController(){return Ej},set scrollController(j){Ej=j},state:H,getContainerWidth(){return jj},afterScroll:Bj,clickHandlers:Gj,keydownHandlers:Wj,resizeHandlers:Dj,contentSizeHandlers:r,destroyHandlers:Vj,methods:L,replaceTemplate(j){i=j},replaceRenderer(j){},replaceDataManager(j){F=j},replaceScrollController(j){Ej=j},getItemsForRange(j){let J=[];for(let Z=j.start;Z<=j.end;Z++){let q=F?F.getItem(Z):B[Z];if(q)J.push(q)}return J},getAllLoadedItems(){if(F){let j=F.getTotal(),J=[];for(let Z=0;Z<j;Z++){let q=F.getItem(Z);if(q)J.push(q)}return J}return[...B]},getVirtualTotal(){return z()},getCachedCompression(){return{isCompressed:!1,actualHeight:N.getTotalHeight(),virtualHeight:N.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:O,totalItems:z(),containerHeight:R,rangeStart:E.start}},renderIfNeeded(){y()},forceRender(){T()},getRenderFns(){return{renderIfNeeded:y,forceRender:T}},setRenderFns(j,J){y=j,T=J},setVirtualTotalFn(j){z=j},rebuildHeightCache(j){N.rebuild(j??z())},setHeightConfig(j){N=Sj(j,z())},updateContentSize(j){let J=`${j}px`;if($)_.content.style.width=J;else _.content.style.height=J},updateCompressionMode(){},setVisibleRangeFn(j){kj=j},setScrollToPosFn(j){Xj=j},setPositionElementFn(j){Lj=j},setScrollFns(j,J){u=j,S=(Z)=>{J(Z),n()}},setScrollTarget(j){g.removeEventListener("scroll",n),g=j,g.addEventListener("scroll",n,{passive:!0})},getScrollTarget(){return g},setContainerDimensions(j){dj=j.width,sj=j.height,jj=j.width(),R=j.height(),H.viewportState.containerHeight=R},disableViewportResize(){if(Aj)Aj=!1,bj.unobserve(_.viewport)}};F={getState:()=>({total:B.length,cached:B.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>B.length,getCached:()=>B.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(j)=>B[j],getItemById:(j)=>{let J=P.get(j);return J!==void 0?B[J]:void 0},getIndexById:(j)=>P.get(j)??-1,isItemLoaded:(j)=>j>=0&&j<B.length&&B[j]!==void 0,getItemsInRange:(j,J)=>{let Z=[],q=Math.max(0,j),W=Math.min(J,B.length-1);for(let G=q;G<=W;G++)Z.push(B[G]);return Z},setTotal:(j)=>{},setItems:(j,J=0,Z)=>{if(J===0&&(Z!==void 0||B.length===0))B=[...j];else{let q=J+j.length;if(B.length<q)B.length=q;for(let W=0;W<j.length;W++)B[J+W]=j[W]}if(Yj(),x){N.rebuild(z()),o(),M.updateCompressionMode();for(let q=0;q<r.length;q++)r[q]();T()}},updateItem:(j,J)=>{let Z=P.get(j);if(Z===void 0)return!1;let q=B[Z];if(!q)return!1;if(B[Z]={...q,...J},J.id!==void 0&&J.id!==j)P.delete(j),P.set(J.id,Z);let W=v.get(Z);if(W)_j(W,i(B[Z],Z,Uj)),W.dataset.id=String(B[Z].id);return!0},removeItem:(j)=>{let J=P.get(j);if(J===void 0)return!1;if(B.splice(J,1),Yj(),x){N.rebuild(z()),o(),M.updateCompressionMode();for(let Z=0;Z<r.length;Z++)r[Z]();T()}return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{B=[],P.clear()},reset:()=>{if(B=[],P.clear(),x)N.rebuild(0),o(),T()}};let Ej={getScrollTop:()=>u(),scrollTo:(j)=>{S(j),O=j,y()},scrollBy:(j)=>{let J=u()+j;S(J),O=J,y()},isAtTop:()=>O<=2,isAtBottom:(j=2)=>Cj(j),getScrollPercentage:()=>{let j=N.getTotalHeight(),J=Math.max(0,j-R);return J>0?O/J:0},getVelocity:()=>I.velocity,isTracking:()=>I.sampleCount>=Oj,isScrolling:()=>_.root.classList.contains(`${D}--scrolling`),updateConfig:()=>{},enableCompression:()=>{},disableCompression:()=>{},isCompressed:()=>pj,isWindowMode:()=>!1,updateContainerHeight:(j)=>{R=j},destroy:()=>{}},Hj=new Map;for(let j of d)if(j.methods)for(let J of j.methods){let Z=Hj.get(J);if(Z)throw Error(`[vlist/builder] Method "${J}" is registered by both "${Z}" and "${j.name}"`);Hj.set(J,j.name)}for(let j of d)j.setup(M);if(x=!0,M.state.isInitialized=!0,o(),y(),c&&B.length>0){let j=Xj(B.length-1,N,R,B.length,"end");S(j),O=j,y()}let lj=(j)=>{M.dataManager.setItems(j,0,j.length)},aj=c?(j)=>{let J=Cj(2),Z=B.length;if(M.dataManager.setItems(j,Z),J&&B.length>0){let q=Xj(B.length-1,N,R,B.length,"end");S(q),O=q,y()}}:(j)=>{let J=B.length;M.dataManager.setItems(j,J)},rj=c?(j)=>{let J=u(),Z=N.getTotalHeight(),q=[...B];M.dataManager.clear(),M.dataManager.setItems([...j,...q],0);let G=N.getTotalHeight()-Z;if(G>0)S(J+G),O=J+G}:(j)=>{let J=[...B];M.dataManager.clear(),M.dataManager.setItems([...j,...J],0)},oj=(j,J)=>{M.dataManager.updateItem(j,J)},nj=(j)=>{M.dataManager.removeItem(j)},ij=async()=>{if(M.dataManager.reload)await M.dataManager.reload()},$j=()=>{if(p!==null)cancelAnimationFrame(p),p=null},tj=(j,J,Z)=>{if($j(),Math.abs(J-j)<1){S(J),O=J,y();return}let q=performance.now(),W=(G)=>{let A=G-q,b=Math.min(A/Z,1),w=j+(J-j)*LJ(b);if(S(w),O=w,y(),b<1)p=requestAnimationFrame(W);else p=null};p=requestAnimationFrame(W)},wj=(j,J)=>{let{align:Z,behavior:q,duration:W}=NJ(J),G=z(),A=j;if(Fj&&G>0)A=(A%G+G)%G;let b=Xj(A,N,R,G,Z);if(q==="smooth")tj(u(),b,W);else $j(),S(b)},ej=(j,J)=>{let Z=P.get(j)??M.dataManager.getIndexById(j);if(Z>=0)wj(Z,J)},jJ=()=>u(),JJ=(j,J)=>{return k.on(j,J)},XJ=(j,J)=>{k.off(j,J)},ZJ=()=>{if(s)return;if(s=!0,M.state.isDestroyed=!0,_.items.removeEventListener("click",Pj),_.root.removeEventListener("keydown",zj),g.removeEventListener("scroll",n),bj.disconnect(),Zj)_.viewport.removeEventListener("wheel",Zj);if(l)clearTimeout(l);for(let j=0;j<Vj.length;j++)Vj[j]();for(let j of d)if(j.destroy)j.destroy();$j();for(let[,j]of v)j.remove(),e.release(j);v.clear(),e.clear(),k.clear(),_.root.remove()},vj={get element(){return _.root},get items(){if(L.has("_getItems"))return L.get("_getItems")();return B},get total(){if(L.has("_getTotal"))return L.get("_getTotal")();return z()},setItems:L.has("setItems")?L.get("setItems"):lj,appendItems:L.has("appendItems")?L.get("appendItems"):aj,prependItems:L.has("prependItems")?L.get("prependItems"):rj,updateItem:L.has("updateItem")?L.get("updateItem"):oj,removeItem:L.has("removeItem")?L.get("removeItem"):nj,reload:L.has("reload")?L.get("reload"):ij,scrollToIndex:L.has("scrollToIndex")?L.get("scrollToIndex"):wj,scrollToItem:L.has("scrollToItem")?L.get("scrollToItem"):ej,cancelScroll:L.has("cancelScroll")?L.get("cancelScroll"):$j,getScrollPosition:L.has("getScrollPosition")?L.get("getScrollPosition"):jJ,on:JJ,off:XJ,destroy:ZJ};for(let[j,J]of L){if(j==="setItems"||j==="appendItems"||j==="prependItems"||j==="updateItem"||j==="removeItem"||j==="reload"||j==="scrollToIndex"||j==="scrollToItem"||j==="cancelScroll"||j==="getScrollPosition")continue;vj[j]=J}return vj}export{MJ as vlist};
|
|
1
|
+
var KJ=0,m=5,UJ=100,Rj=2,YJ=(X=0)=>{let U=Array(m);for(let $=0;$<m;$++)U[$]={position:0,time:0};return{velocity:0,lastPosition:X,lastTime:performance.now(),samples:U,sampleIndex:0,sampleCount:0}},BJ=(X,U)=>{let $=performance.now(),Y=$-X.lastTime;if(Y===0)return X;if(Y>UJ){X.sampleCount=0,X.sampleIndex=0,X.velocity=0;let Q=X.samples[0];return Q.position=U,Q.time=$,X.sampleIndex=1,X.sampleCount=1,X.lastPosition=U,X.lastTime=$,X}let V=X.samples[X.sampleIndex];if(V.position=U,V.time=$,X.sampleIndex=(X.sampleIndex+1)%m,X.sampleCount=Math.min(X.sampleCount+1,m),X.sampleCount>=Rj){let Q=(X.sampleIndex-X.sampleCount+m)%m,K=X.samples[Q],W=U-K.position,C=$-K.time;X.velocity=C>0?Math.abs(W)/C:0}return X.lastPosition=U,X.lastTime=$,X},Tj=(X,U)=>{if(typeof X==="number"){let Q=U;return{getOffset:(K)=>K*X,getHeight:()=>X,indexAtOffset:(K)=>{if(Q===0||X===0)return 0;return Math.max(0,Math.min(Math.floor(K/X),Q-1))},getTotalHeight:()=>Q*X,getTotal:()=>Q,rebuild:(K)=>{Q=K},isVariable:()=>!1}}let $=U,Y=new Float64Array(0),V=(Q)=>{$=Q,Y=new Float64Array(Q+1),Y[0]=0;for(let K=0;K<Q;K++)Y[K+1]=Y[K]+X(K)};return V(U),{getOffset:(Q)=>{if(Q<=0)return 0;if(Q>=$)return Y[$];return Y[Q]},getHeight:(Q)=>X(Q),indexAtOffset:(Q)=>{if($===0)return 0;if(Q<=0)return 0;if(Q>=Y[$])return $-1;let K=0,W=$-1;while(K<W){let C=K+W+1>>>1;if(Y[C]<=Q)K=C;else W=C-1}return K},getTotalHeight:()=>Y[$]??0,getTotal:()=>$,rebuild:(Q)=>V(Q),isVariable:()=>!0}},GJ=()=>{let X={},U=(Q,K)=>{if(!X[Q])X[Q]=new Set;return X[Q].add(K),()=>$(Q,K)},$=(Q,K)=>{X[Q]?.delete(K)};return{on:U,off:$,emit:(Q,K)=>{X[Q]?.forEach((W)=>{try{W(K)}catch(C){console.error(`[vlist] Error in "${Q}" handler:`,C)}})},clear:()=>{for(let Q in X)delete X[Q]}}},WJ=(X)=>{if(typeof X==="string"){let U=document.querySelector(X);if(!U)throw Error(`[vlist/builder] Container not found: ${X}`);return U}return X},DJ=(X,U,$,Y)=>{let V=document.createElement("div");if(V.className=U,Y)V.classList.add(`${U}--horizontal`);if(V.setAttribute("role","listbox"),V.setAttribute("tabindex","0"),$)V.setAttribute("aria-label",$);if(Y)V.setAttribute("aria-orientation","horizontal");let Q=document.createElement("div");if(Q.className=`${U}-viewport`,Y)Q.style.overflowX="auto",Q.style.overflowY="hidden";else Q.style.overflow="auto";Q.style.height="100%",Q.style.width="100%";let K=document.createElement("div");if(K.className=`${U}-content`,K.style.position="relative",Y)K.style.height="100%";else K.style.width="100%";let W=document.createElement("div");if(W.className=`${U}-items`,W.style.position="relative",Y)W.style.height="100%";else W.style.width="100%";return K.appendChild(W),Q.appendChild(K),V.appendChild(Q),X.appendChild(V),{root:V,viewport:Q,content:K,items:W}},VJ=(X=100)=>{let U=[];return{acquire:()=>{let $=U.pop();if($)return $;let Y=document.createElement("div");return Y.setAttribute("role","option"),Y},release:($)=>{if(U.length<X)$.className="",$.textContent="",$.removeAttribute("style"),$.removeAttribute("data-index"),$.removeAttribute("data-id"),U.push($)},clear:()=>{U.length=0}}},_J=(X,U,$,Y,V)=>{if(Y===0||U===0){V.start=0,V.end=0;return}let Q=$.indexAtOffset(X),K=$.indexAtOffset(X+U);if(K<Y-1)K++;V.start=Math.max(0,Q),V.end=Math.min(Y-1,Math.max(0,K))},LJ=(X,U,$,Y)=>{if($===0){Y.start=0,Y.end=0;return}Y.start=Math.max(0,X.start-U),Y.end=Math.min($-1,X.end+U)},NJ=(X,U,$,Y,V)=>{if(Y===0)return 0;let Q=Math.max(0,Math.min(X,Y-1)),K=U.getOffset(Q),W=U.getHeight(Q),C=Math.max(0,U.getTotalHeight()-$),f;switch(V){case"center":f=K-($-W)/2;break;case"end":f=K-$+W;break;default:f=K}return Math.max(0,Math.min(f,C))},MJ=(X)=>X<0.5?2*X*X:-1+(4-2*X)*X,AJ=(X)=>{if(typeof X==="string")return{align:X,behavior:"auto",duration:300};if(X&&typeof X==="object")return{align:X.align??"start",behavior:X.behavior??"auto",duration:X.duration??300};return{align:"start",behavior:"auto",duration:300}},bJ=(X)=>{if(!X.container)throw Error("[vlist/builder] Container is required");if(!X.item)throw Error("[vlist/builder] item configuration is required");let U=X.direction==="horizontal",$=U?"width":"height",Y=U?X.item.width:X.item.height;if(Y==null)throw Error(`[vlist/builder] item.${$} is required${U?" when direction is 'horizontal'":""}`);if(typeof Y==="number"&&Y<=0)throw Error(`[vlist/builder] item.${$} must be a positive number`);if(typeof Y!=="number"&&typeof Y!=="function")throw Error(`[vlist/builder] item.${$} must be a number or a function (index) => number`);if(!X.item.template)throw Error("[vlist/builder] item.template is required");if(U&&X.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let V=new Map,Q=!1,K={use(W){if(Q)throw Error("[vlist/builder] Cannot call .use() after .build()");return V.set(W.name,W),K},build(){if(Q)throw Error("[vlist/builder] .build() can only be called once");return Q=!0,EJ(X,V,U,Y)}};return K};function EJ(X,U,$,Y){let{item:V,items:Q,overscan:K=3,classPrefix:W="vlist",ariaLabel:C,reverse:f=!1,scroll:Yj}=X,uj=Yj?.wheel??!0,Fj=Yj?.wrap??!1,c=f,yj=`${W}-${KJ++}`,fj=Y,Cj=$?typeof V.height==="number"?V.height:void 0:typeof V.width==="number"?V.width:void 0,e=V.template,pj={overscan:K,classPrefix:W,reverse:c,wrap:Fj,horizontal:$,ariaIdPrefix:yj},d=Array.from(U.values()).sort((j,J)=>(j.priority??50)-(J.priority??50)),jj=new Set(d.map((j)=>j.name));for(let j of d)if(j.conflicts){for(let J of j.conflicts)if(jj.has(J))throw Error(`[vlist/builder] ${j.name} and ${J} cannot be combined`)}if($){if(jj.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(jj.has("withGroups"))throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'")}if(c){if(jj.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let xj=WJ(X.container),_=DJ(xj,W,C,$),z=GJ(),B=Q?[...Q]:[],N=Tj(fj,B.length),s=VJ(),F=_.viewport.clientHeight,Jj=_.viewport.clientWidth,l=!1,p=!1,O=0,x=null,a=null,I=YJ(0),Xj={start:0,end:0},E={start:0,end:0},h={start:-1,end:-1},v={viewportState:{scrollTop:0,containerHeight:F,totalHeight:N.getTotalHeight(),actualHeight:N.getTotalHeight(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},k=new Map,Bj={selected:!1,focused:!1},hj=`${W}-item`,r="",H=new Map,Gj=()=>{H.clear();for(let j=0;j<B.length;j++){let J=B[j];if(J)H.set(J.id,j)}};Gj();let R=null,P=()=>R?R.getTotal():B.length,Wj=[],Dj=[],Vj=[],_j=[],o=[],Lj=[],L=new Map,u=()=>{return $?_.viewport.scrollLeft:_.viewport.scrollTop},S=(j)=>{if($)_.viewport.scrollLeft=j;else _.viewport.scrollTop=j},kj=(j=2)=>{let J=N.getTotalHeight();return O+F>=J-j},Zj=!1,y,T,zj=(j,J,Z,q,D)=>{_J(j,J,Z,q,D)},$j=(j,J,Z,q,D)=>{return NJ(j,J,Z,q,D)},Nj=(j,J)=>{if(typeof J==="string")j.innerHTML=J;else j.replaceChildren(J)},Qj=(j,J)=>{let Z=Math.round(N.getOffset(J));if($)j.style.transform=`translateX(${Z}px)`;else j.style.transform=`translateY(${Z}px)`},gj=(j,J)=>{let Z=s.acquire();if(Z.className=hj,$){if(Z.style.width=`${N.getHeight(j)}px`,Cj!=null)Z.style.height=`${Cj}px`}else Z.style.height=`${N.getHeight(j)}px`;if(Z.dataset.index=String(j),Z.dataset.id=String(J.id),Z.ariaSelected="false",Z.id=`${yj}-item-${j}`,r=String(P()),Z.setAttribute("aria-setsize",r),Z.setAttribute("aria-posinset",String(j+1)),String(J.id).startsWith("__placeholder_"))Z.classList.add(`${W}-item--placeholder`);return Nj(Z,e(J,j,Bj)),Qj(Z,j),Z},n=()=>{let j=`${N.getTotalHeight()}px`;if($)_.content.style.width=j;else _.content.style.height=j},Mj=new Set,Aj=-1,mj=()=>{if(l)return;let j=P();if(zj(O,F,N,j,Xj),LJ(Xj,K,j,E),E.start===h.start&&E.end===h.end){if(Zj)for(let[G,A]of k)Qj(A,G);return}let J=String(j),Z=J!==r;r=J;for(let[G,A]of k)if(G<E.start||G>E.end)A.remove(),s.release(A),k.delete(G);let q=document.createDocumentFragment(),D=[];for(let G=E.start;G<=E.end;G++){let A=R?R.getItem(G):B[G];if(!A)continue;let M=k.get(G);if(M){let w=M.dataset.id,t=String(A.id);if(w!==t){let qJ=w?.startsWith("__placeholder_"),Ij=t.startsWith("__placeholder_");if(Nj(M,e(A,G,Bj)),M.dataset.id=t,$)M.style.width=`${N.getHeight(G)}px`;else M.style.height=`${N.getHeight(G)}px`;if(Ij)M.classList.add(`${W}-item--placeholder`);else M.classList.remove(`${W}-item--placeholder`);if(qJ&&!Ij)M.classList.add(`${W}-item--replaced`),setTimeout(()=>{M.classList.remove(`${W}-item--replaced`)},300)}Qj(M,G);let Uj=Mj.has(A.id),QJ=G===Aj;if(M.classList.toggle(`${W}-item--selected`,Uj),M.classList.toggle(`${W}-item--focused`,QJ),M.ariaSelected=Uj?"true":"false",Z)M.setAttribute("aria-setsize",r)}else{let w=gj(G,A),t=Mj.has(A.id),Uj=G===Aj;if(t)w.classList.add(`${W}-item--selected`),w.ariaSelected="true";if(Uj)w.classList.add(`${W}-item--focused`);q.appendChild(w),D.push({index:G,element:w})}}if(D.length>0){_.items.appendChild(q);for(let{index:G,element:A}of D)k.set(G,A)}h.start=E.start,h.end=E.end,v.lastRenderRange.start=E.start,v.lastRenderRange.end=E.end,v.viewportState.scrollTop=O,v.viewportState.visibleRange.start=Xj.start,v.viewportState.visibleRange.end=Xj.end,v.viewportState.renderRange.start=E.start,v.viewportState.renderRange.end=E.end,z.emit("range:change",{range:{start:E.start,end:E.end}})},cj=()=>{h.start=-1,h.end=-1,y()};y=mj,T=cj;let i=()=>{if(l)return;let j=u(),J=j>=O?"down":"up";if(I=BJ(I,j),!_.root.classList.contains(`${W}--scrolling`))_.root.classList.add(`${W}--scrolling`);O=j,y(),z.emit("scroll",{scrollTop:j,direction:J}),z.emit("velocity:change",{velocity:I.velocity,reliable:I.sampleCount>=Rj});for(let Z=0;Z<Wj.length;Z++)Wj[Z](j,J);if(a)clearTimeout(a);a=setTimeout(()=>{_.root.classList.remove(`${W}--scrolling`),I.velocity=0,I.sampleCount=0,z.emit("velocity:change",{velocity:0,reliable:!1})},Yj?.idleTimeout??150)},qj=null,g=_.viewport;if(g.addEventListener("scroll",i,{passive:!0}),$&&uj)qj=(j)=>{if(j.deltaX)return;j.preventDefault(),_.viewport.scrollLeft+=j.deltaY},_.viewport.addEventListener("wheel",qj);let Hj=(j)=>{let Z=j.target.closest("[data-index]");if(Z){let q=parseInt(Z.dataset.index??"-1",10);if(q>=0){let D=R?.getItem(q)??B[q];if(D){if(D.__groupHeader)return;z.emit("item:click",{item:D,index:q,event:j})}}}for(let q=0;q<Dj.length;q++)Dj[q](j)},dj=(j)=>{let Z=j.target.closest("[data-index]");if(Z){let q=parseInt(Z.dataset.index??"-1",10);if(q>=0){let D=R?.getItem(q)??B[q];if(D){if(D.__groupHeader)return;z.emit("item:dblclick",{item:D,index:q,event:j})}}}},Pj=(j)=>{for(let J=0;J<Vj.length;J++)Vj[J](j)};_.items.addEventListener("click",Hj),_.items.addEventListener("dblclick",dj),_.root.addEventListener("keydown",Pj);let bj=!0,sj=()=>Jj,lj=()=>F,Ej=new ResizeObserver((j)=>{if(l)return;for(let J of j){let Z=J.contentRect.height,q=J.contentRect.width,D=$?q:Z;if(Jj=q,Math.abs(D-F)>1){if(F=D,v.viewportState.containerHeight=D,p)n(),y(),z.emit("resize",{height:Z,width:q})}if(p)for(let G=0;G<_j.length;G++)_j[G](q,Z)}});if(bj)Ej.observe(_.viewport);let b={get dom(){return _},get heightCache(){return N},get emitter(){return z},get config(){return pj},get rawConfig(){return X},get renderer(){return{render:(j,J,Z,q,D)=>{Mj=Z,Aj=q,T()},updateItemClasses:(j,J,Z)=>{let q=k.get(j);if(!q)return;q.classList.toggle(`${W}-item--selected`,J),q.classList.toggle(`${W}-item--focused`,Z),q.ariaSelected=J?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(j)=>k.get(j)??null,clear:()=>{},destroy:()=>{}}},set renderer(j){},get dataManager(){return R},set dataManager(j){R=j},get scrollController(){return Oj},set scrollController(j){Oj=j},state:v,getContainerWidth(){return Jj},afterScroll:Wj,clickHandlers:Dj,keydownHandlers:Vj,resizeHandlers:_j,contentSizeHandlers:o,destroyHandlers:Lj,methods:L,replaceTemplate(j){e=j},replaceRenderer(j){},replaceDataManager(j){R=j},replaceScrollController(j){Oj=j},getItemsForRange(j){let J=[];for(let Z=j.start;Z<=j.end;Z++){let q=R?R.getItem(Z):B[Z];if(q)J.push(q)}return J},getAllLoadedItems(){if(R){let j=R.getTotal(),J=[];for(let Z=0;Z<j;Z++){let q=R.getItem(Z);if(q)J.push(q)}return J}return[...B]},getVirtualTotal(){return P()},getCachedCompression(){return{isCompressed:!1,actualHeight:N.getTotalHeight(),virtualHeight:N.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:O,totalItems:P(),containerHeight:F,rangeStart:E.start}},renderIfNeeded(){y()},forceRender(){T()},invalidateRendered(){for(let[,j]of k)j.remove(),s.release(j);k.clear()},getRenderFns(){return{renderIfNeeded:y,forceRender:T}},setRenderFns(j,J){y=j,T=J},setVirtualTotalFn(j){P=j},rebuildHeightCache(j){N.rebuild(j??P())},setHeightConfig(j){N=Tj(j,P())},updateContentSize(j){let J=`${j}px`;if($)_.content.style.width=J;else _.content.style.height=J},updateCompressionMode(){},setVisibleRangeFn(j){zj=j},setScrollToPosFn(j){$j=j},setPositionElementFn(j){Qj=j},setScrollFns(j,J){u=j,S=(Z)=>{J(Z),i()}},setScrollTarget(j){g.removeEventListener("scroll",i),g=j,g.addEventListener("scroll",i,{passive:!0})},getScrollTarget(){return g},setContainerDimensions(j){sj=j.width,lj=j.height,Jj=j.width(),F=j.height(),v.viewportState.containerHeight=F},disableViewportResize(){if(bj)bj=!1,Ej.unobserve(_.viewport)}};R={getState:()=>({total:B.length,cached:B.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>B.length,getCached:()=>B.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(j)=>B[j],getItemById:(j)=>{let J=H.get(j);return J!==void 0?B[J]:void 0},getIndexById:(j)=>H.get(j)??-1,isItemLoaded:(j)=>j>=0&&j<B.length&&B[j]!==void 0,getItemsInRange:(j,J)=>{let Z=[],q=Math.max(0,j),D=Math.min(J,B.length-1);for(let G=q;G<=D;G++)Z.push(B[G]);return Z},setTotal:(j)=>{},setItems:(j,J=0,Z)=>{if(J===0&&(Z!==void 0||B.length===0))B=[...j];else{let q=J+j.length;if(B.length<q)B.length=q;for(let D=0;D<j.length;D++)B[J+D]=j[D]}if(Gj(),p){N.rebuild(P()),n(),b.updateCompressionMode();for(let q=0;q<o.length;q++)o[q]();T()}},updateItem:(j,J)=>{let Z=H.get(j);if(Z===void 0)return!1;let q=B[Z];if(!q)return!1;if(B[Z]={...q,...J},J.id!==void 0&&J.id!==j)H.delete(j),H.set(J.id,Z);let D=k.get(Z);if(D)Nj(D,e(B[Z],Z,Bj)),D.dataset.id=String(B[Z].id);return!0},removeItem:(j)=>{let J=H.get(j);if(J===void 0)return!1;if(B.splice(J,1),Gj(),p){N.rebuild(P()),n(),b.updateCompressionMode();for(let Z=0;Z<o.length;Z++)o[Z]();T()}return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{B=[],H.clear()},reset:()=>{if(B=[],H.clear(),p)N.rebuild(0),n(),T()}};let Oj={getScrollTop:()=>u(),scrollTo:(j)=>{S(j),O=j,y()},scrollBy:(j)=>{let J=u()+j;S(J),O=J,y()},isAtTop:()=>O<=2,isAtBottom:(j=2)=>kj(j),getScrollPercentage:()=>{let j=N.getTotalHeight(),J=Math.max(0,j-F);return J>0?O/J:0},getVelocity:()=>I.velocity,isTracking:()=>I.sampleCount>=Rj,isScrolling:()=>_.root.classList.contains(`${W}--scrolling`),updateConfig:()=>{},enableCompression:()=>{Zj=!0},disableCompression:()=>{Zj=!1},isCompressed:()=>Zj,isWindowMode:()=>!1,updateContainerHeight:(j)=>{F=j},destroy:()=>{}},wj=new Map;for(let j of d)if(j.methods)for(let J of j.methods){let Z=wj.get(J);if(Z)throw Error(`[vlist/builder] Method "${J}" is registered by both "${Z}" and "${j.name}"`);wj.set(J,j.name)}for(let j of d)j.setup(b);if(p=!0,b.state.isInitialized=!0,n(),y(),c&&B.length>0){let j=$j(B.length-1,N,F,B.length,"end");S(j),O=j,y()}let aj=(j)=>{b.dataManager.setItems(j,0,j.length)},rj=c?(j)=>{let J=kj(2),Z=B.length;if(b.dataManager.setItems(j,Z),J&&B.length>0){let q=$j(B.length-1,N,F,B.length,"end");S(q),O=q,y()}}:(j)=>{let J=B.length;b.dataManager.setItems(j,J)},oj=c?(j)=>{let J=u(),Z=N.getTotalHeight(),q=[...B];b.dataManager.clear(),b.dataManager.setItems([...j,...q],0);let G=N.getTotalHeight()-Z;if(G>0)S(J+G),O=J+G}:(j)=>{let J=[...B];b.dataManager.clear(),b.dataManager.setItems([...j,...J],0)},nj=(j,J)=>{b.dataManager.updateItem(j,J)},ij=(j)=>{b.dataManager.removeItem(j)},tj=async()=>{if(b.dataManager.reload)await b.dataManager.reload()},Kj=()=>{if(x!==null)cancelAnimationFrame(x),x=null},ej=(j,J,Z)=>{if(Kj(),Math.abs(J-j)<1){S(J),O=J,y();return}let q=performance.now(),D=(G)=>{let A=G-q,M=Math.min(A/Z,1),w=j+(J-j)*MJ(M);if(S(w),O=w,y(),M<1)x=requestAnimationFrame(D);else x=null};x=requestAnimationFrame(D)},vj=(j,J)=>{let{align:Z,behavior:q,duration:D}=AJ(J),G=P(),A=j;if(Fj&&G>0)A=(A%G+G)%G;let M=$j(A,N,F,G,Z);if(q==="smooth")ej(u(),M,D);else Kj(),S(M)},jJ=(j,J)=>{let Z=H.get(j)??b.dataManager.getIndexById(j);if(Z>=0)vj(Z,J)},JJ=()=>u(),XJ=(j,J)=>{return z.on(j,J)},ZJ=(j,J)=>{z.off(j,J)},$J=()=>{if(l)return;if(l=!0,b.state.isDestroyed=!0,_.items.removeEventListener("click",Hj),_.root.removeEventListener("keydown",Pj),g.removeEventListener("scroll",i),Ej.disconnect(),qj)_.viewport.removeEventListener("wheel",qj);if(a)clearTimeout(a);for(let j=0;j<Lj.length;j++)Lj[j]();for(let j of d)if(j.destroy)j.destroy();Kj();for(let[,j]of k)j.remove(),s.release(j);k.clear(),s.clear(),z.clear(),_.root.remove()},Sj={get element(){return _.root},get items(){if(L.has("_getItems"))return L.get("_getItems")();return B},get total(){if(L.has("_getTotal"))return L.get("_getTotal")();return P()},setItems:L.has("setItems")?L.get("setItems"):aj,appendItems:L.has("appendItems")?L.get("appendItems"):rj,prependItems:L.has("prependItems")?L.get("prependItems"):oj,updateItem:L.has("updateItem")?L.get("updateItem"):nj,removeItem:L.has("removeItem")?L.get("removeItem"):ij,reload:L.has("reload")?L.get("reload"):tj,scrollToIndex:L.has("scrollToIndex")?L.get("scrollToIndex"):vj,scrollToItem:L.has("scrollToItem")?L.get("scrollToItem"):jJ,cancelScroll:L.has("cancelScroll")?L.get("cancelScroll"):Kj,getScrollPosition:L.has("getScrollPosition")?L.get("getScrollPosition"):JJ,on:XJ,off:ZJ,destroy:$J};for(let[j,J]of L){if(j==="setItems"||j==="appendItems"||j==="prependItems"||j==="updateItem"||j==="removeItem"||j==="reload"||j==="scrollToIndex"||j==="scrollToItem"||j==="cancelScroll"||j==="getScrollPosition")continue;Sj[j]=J}return Sj}export{bJ as vlist};
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -109,6 +109,12 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
109
109
|
getCompressionContext(): CompressionContext;
|
|
110
110
|
renderIfNeeded(): void;
|
|
111
111
|
forceRender(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Remove all rendered DOM elements and return them to the pool.
|
|
114
|
+
* Used by reload to force a full re-render from scratch, bypassing
|
|
115
|
+
* the ID-based optimization that skips template updates for same-ID items.
|
|
116
|
+
*/
|
|
117
|
+
invalidateRendered(): void;
|
|
112
118
|
/**
|
|
113
119
|
* Get current render functions (for wrapping by selection/other plugins).
|
|
114
120
|
* Call this BEFORE setRenderFns to capture the current functions.
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* - Custom scrollbar fallback — forces custom scrollbar in compressed mode
|
|
13
13
|
* - Near-bottom interpolation — smooth blending near the end of the list
|
|
14
14
|
* - Cached compression state — recalculates only when total item count changes
|
|
15
|
+
* - Smooth scroll interpolation — lerp-based wheel handling for cross-browser consistency
|
|
15
16
|
*
|
|
16
17
|
* No configuration needed — compression activates automatically when the total
|
|
17
18
|
* height exceeds the browser limit, and deactivates when items are removed.
|
package/dist/grid/index.js
CHANGED
|
@@ -1 +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;if(!j)return Math.ceil(K/q);let $=0,N=0,B=0;for(let F=0;F<K;F++)if(j(F)){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,F=-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;F=M}T++,k=0}else{if(T>=K&&T<=$){if(B===-1)B=M;F=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:F}},P=(K,$,N)=>{if($<0||$>=q)return-1;let B=K*q+$;if(B<0||B>=N)return-1;return B},y=(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:y,getColumnOffset:(K,$)=>{let N=y($);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),F=J.getOffset(Y)-o(J,$,j);return F+(B-F)*N}let y=q/O*j;return J.getOffset(Y)-o(J,y,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,y=!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},F=`${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(y){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(y||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=F,_.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)y=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),y;switch(X){case"center":y=O-J/2+b/2;break;case"end":y=O-J+b;break;case"start":default:y=O;break}return Math.max(0,Math.min(y,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 y=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(y>0)j.setHeightConfig(C+y);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 F=()=>{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},F()};if(j.setRenderFns(F,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;if(!j)return Math.ceil(K/q);let k=0,N=0,B=0;for(let y=0;y<K;y++)if(j(y)){if(B++,N>0)k++,N=0;k++,N=0}else if(N++,N>=q)k++,N=0;if(N>0)k++;return k},G=(K)=>{return D.row=O(K),D.col=F(K),D},O=(K)=>{if(!j)return Math.floor(K/q);let k=0,N=0;for(let B=0;B<=K;B++)if(j(B)){if(N>0)k++,N=0;if(B===K)return k;k++,N=0}else{if(B===K)return k;if(N++,N>=q)k++,N=0}return console.warn(`⚠️ getRow(${K}) fell through - returning ${k}`),k},F=(K)=>{if(!j)return K%q;if(j(K))return 0;let k=0;for(let N=0;N<=K;N++)if(j(N))k=0;else{if(N===K)return k;if(k++,k>=q)k=0}return k},W=(K,k,N)=>{if(N<=0)return{start:0,end:-1};if(!j){let M=Math.max(0,K*q),V=Math.min(N-1,(k+1)*q-1);return{start:M,end:V}}let B=-1,y=-1,v=0,$=0;for(let M=0;M<N;M++){if(j(M)){if($>0)v++,$=0;if(v>=K&&v<=k){if(B===-1)B=M;y=M}v++,$=0}else{if(v>=K&&v<=k){if(B===-1)B=M;y=M}if($++,$>=q)v++,$=0}if(v>k&&$===0)break}if(B===-1)return{start:0,end:-1};return{start:B,end:y}},E=(K,k,N)=>{if(k<0||k>=q)return-1;let B=K*q+k;if(B<0||B>=N)return-1;return B},b=(K)=>{let k=(q-1)*J;return Math.max(0,(K-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:F,getItemRange:W,getItemIndex:E,getColumnWidth:b,getColumnOffset:(K,k)=>{let N=b(k);return K*(N+J)}}};var n=16000000;var q2=(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)},J2=(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,F=O-D,W=F-q;if(W<=D&&W>=-1){if(q>=F-1){let $=J.getTotalHeight()-J.getOffset(Y);return D-$}let C=q2(J,D,j),K=Math.max(0,j-C),N=q/O*j,B=Math.max(0,Math.min(1,1-W/D)),y=J.getOffset(Y)-J.getOffset(K),v=J.getOffset(Y)-J2(J,N,j);return v+(y-v)*B}let E=q/O,b=J.getTotalHeight(),w=E*b;return J.getOffset(Y)-w};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}}},o=(Y,q,J,j,D,X,G,O)=>{let F=N2(),W=new Map,E=X,b=!1,w=null,C=0,K="",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`,v=`${D}-item--selected`,$=`${D}-item--focused`,M=(Q,Z)=>{if(typeof Z==="string")Q.innerHTML=Z;else Q.replaceChildren(Z)},V=(Q,Z,U)=>{Q.classList.toggle(v,Z),Q.classList.toggle($,U)},A=(Q,Z)=>{let U=j.getRow(Q);if(Z){let L=Z.totalItems,P=k(L);if(P.isCompressed)return Q2(U,Z.scrollTop,J,L,Z.containerHeight,P,Z.rangeStart)}return J.getOffset(U)},S=(Q,Z,U)=>{let L=Q.dataset.id?.startsWith("__group_header"),P=L?0:j.getCol(Z),_=L?0:j.getColumnOffset(P,E),f;if(b){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)`},T=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?E:j.getColumnWidth(E),P;if(b||U)P=J.getHeight(Z)-j.gap;else{let _=j.getRow(Z);P=J.getHeight(_)-j.gap}Q.style.width=`${L}px`,Q.style.height=`${P}px`},I=(Q,Z,U,L,P)=>{let _=F.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));T(_,Q);let x=q(Z,Q,f);return M(_,x),V(_,U,L),S(_,Q,P),_},d=(Q,Z,U,L,P)=>{if(Z.start===0&&Q.length>0)b=Y2(Q[0]);for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),F.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,j2=String(R.id);if(c!==j2){let $2=B(p,l),k2=q(R,z,$2);M(H.element,k2),H.element.dataset.id=j2,H.element.dataset.row=String(j.getRow(z)),H.element.dataset.col=String(j.getCol(z)),T(H.element,z)}if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,P),_)H.element.setAttribute("aria-setsize",K)}else{let c=I(z,R,p,l,P);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})}},m=(Q)=>{for(let[Z,U]of W)S(U.element,Z,Q)},h=(Q,Z,U,L)=>{let P=W.get(Q);if(P){let _=B(U,L),f=q(Z,Q,_);M(P.element,f),V(P.element,U,L),P.element.dataset.id=String(Z.id),P.element.ariaSelected=String(U),T(P.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-E)<1)return;E=Q;for(let[Z,U]of W)T(U.element,Z),S(U.element,Z)},e=()=>{for(let[,Q]of W)Q.element.remove(),F.release(Q.element);W.clear()};return{render:d,updatePositions:m,updateItem:h,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:e,destroy:()=>{e(),F.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),F=q.getHeight(G),W=q.getTotalHeight(),E=Math.max(0,W-J),b;switch(X){case"center":b=O-J/2+F/2;break;case"end":b=O-J+F;break;case"start":default:b=O;break}return Math.max(0,Math.min(b,E))};var i=(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:F}=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(($)=>$.__groupHeader===!0),E={columns:Y.columns,gap:Y.gap??0};if(W)E.isHeaderFn=($)=>{let M=j.dataManager.getItem($);return!!(M&&M.__groupHeader===!0)};q=a(E);let b=q.gap;j.setVirtualTotalFn(()=>{let $=j.dataManager.getTotal();return q.getTotalRows($)});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(($)=>{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($),column:q.getCol($),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:K.columns};return C($,S)+K.gap});else if(b>0)j.setHeightConfig(C+b);j.rebuildHeightCache(),D.root.classList.add(`${F}--grid`);let k=j.getContainerWidth(),N=O.item.template,B=()=>{J=o(D.items,N,j.heightCache,q,F,k,()=>j.dataManager.getTotal(),G.ariaIdPrefix),j.replaceRenderer(J)};B(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>E),j.methods.set("_replaceGridRenderer",($)=>{J=$}),j.methods.set("_updateGridLayoutForGroups",($)=>{q.update({isHeaderFn:$});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",($)=>{if($.columns!==void 0){if(!Number.isInteger($.columns)||$.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");E.columns=$.columns}if($.gap!==void 0){if($.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");E.gap=$.gap}if(q)q.update(E);let M=j.getContainerWidth();if(K.containerWidth=M,K.columns=E.columns,K.gap=E.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 $=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($));let g=j.heightCache.indexAtOffset($+M);if(g<V-1)g++;A.end=Math.min(V-1,Math.max(0,g))}let S=G.overscan??3,T={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};j.state.viewportState.scrollTop=$,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=T;let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;if(T.start===I.start&&T.end===I.end){if(d)J.updatePositions(j.getCompressionContext());return}let m=j.dataManager.getTotal(),h=q.getItemRange(T.start,T.end,m),r=j.dataManager.getItemsInRange(h.start,h.end),s=d?j.getCompressionContext():void 0;J.render(r,h,new Set,-1,s),j.state.lastRenderRange={...T},X.emit("range:change",{range:T})},v=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange={start:-1,end:-1},y()};if(j.setRenderFns(y,v),j.resizeHandlers.push(($,M)=>{if(J)J.updateContainerWidth($)}),j.methods.set("scrollToIndex",($,M)=>{let V=Math.floor($/Y.columns),{align:A,behavior:S}=D2(M),T=j.dataManager.getState(),I=q.getTotalRows(T.total),d=Math.max(0,Math.min(V,I-1)),m=i(d,j.heightCache,j.state.viewportState.containerHeight,I,A,j.getCachedCompression());if(S==="smooth")j.scrollController.scrollTo(m);else j.scrollController.scrollTo(m)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;D.root.classList.remove(`${F}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},t=300,D2=(Y)=>{if(typeof Y==="string")return{align:Y,behavior:"auto",duration:t};if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??t};return{align:"start",behavior:"auto",duration:t}};export{X2 as withGrid,o as createGridRenderer,a as createGridLayout};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var{defineProperty:Mj,getOwnPropertyNames:hJ,getOwnPropertyDescriptor:gJ}=Object,mJ=Object.prototype.hasOwnProperty;var uj=new WeakMap,dJ=(j)=>{var Q=uj.get(j),$;if(Q)return Q;if(Q=Mj({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")hJ(j).map((J)=>!mJ.call(Q,J)&&Mj(Q,J,{get:()=>j[J],enumerable:!($=gJ(j,J))||$.enumerable}));return uj.set(j,Q),Q};var cJ=(j,Q)=>{for(var $ in Q)Mj(j,$,{get:Q[$],enumerable:!0,configurable:!0,set:(J)=>Q[$]=()=>J})};var xj=(j,Q)=>()=>(j&&(Q=j(j=0)),Q);var Aj=200,p2=50,mj=15,dj=2,cj=50,O2=16000000;var q4=(j,Q)=>{let $=Q;return{getOffset:(J)=>J*j,getHeight:(J)=>j,indexAtOffset:(J)=>{if($===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(J/j),$-1))},getTotalHeight:()=>$*j,getTotal:()=>$,rebuild:(J)=>{$=J},isVariable:()=>!1}},K4=(j,Q)=>{let $=Q,J=new Float64Array(0),K=(q)=>{$=q,J=new Float64Array(q+1),J[0]=0;for(let Z=0;Z<q;Z++)J[Z+1]=J[Z]+j(Z)};K(Q);let X=(q)=>{if($===0)return 0;if(q<=0)return 0;if(q>=J[$])return $-1;let Z=0,G=$-1;while(Z<G){let U=Z+G+1>>>1;if(J[U]<=q)Z=U;else G=U-1}return Z};return{getOffset:(q)=>{if(q<=0)return 0;if(q>=$)return J[$];return J[q]},getHeight:(q)=>j(q),indexAtOffset:(q)=>X(q),getTotalHeight:()=>J[$]??0,getTotal:()=>$,rebuild:(q)=>K(q),isVariable:()=>!0}},lj=(j,Q)=>{if(typeof j==="number")return q4(j,Q);return K4(j,Q)},Fj=(j,Q,$,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.ceil($/j.getHeight(0));let K=0,X=0,q=Q;while(q<J&&X<$)X+=j.getHeight(q),K++,q++;return Math.max(1,K)},r2=(j,Q,$)=>{if($===0)return 0;if(!j.isVariable())return Math.floor(Q/j.getHeight(0));let J=0,K=0;for(let X=$-1;X>=0;X--){let q=j.getHeight(X);if(K+q>Q)break;K+=q,J++}return Math.max(J,1)},n2=(j,Q,$)=>{if($===0)return 0;let J=Math.floor(Q),K=Q-J,X=Math.max(0,Math.min(J,$-1));return j.getOffset(X)+K*j.getHeight(X)};var M2=(j,Q)=>{let $=Q.getTotalHeight(),J=$>O2,K=J?O2:$,X=$>0?K/$:1;return{isCompressed:J,actualHeight:$,virtualHeight:K,ratio:X}},o2=(j,Q,$,J,K,X)=>{if(J===0||Q===0)return X.start=0,X.end=-1,X;if(!K.isCompressed){let D=$.indexAtOffset(j),W=$.indexAtOffset(j+Q);if(W<J-1)W++;return X.start=Math.max(0,D),X.end=Math.min(J-1,Math.max(0,W)),X}let{virtualHeight:q}=K,G=j/q*J,U=Math.floor(G),B=Fj($,Math.max(0,U),Q,J),_=Math.ceil(G)+B,z=q-Q-j;if(z<=Q&&z>=-1){let D=r2($,Q,J),W=Math.max(0,J-D),M=Math.max(0,Math.min(1,1-z/Q));U=Math.floor(U+(W-U)*M),_=z<=1?J-1:Math.min(J-1,U+B)}return X.start=Math.max(0,U),X.end=Math.min(J-1,Math.max(0,_)),X},sj=(j,Q,$,J)=>{if($===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-Q),J.end=Math.min($-1,j.end+Q),J},R2=(j,Q,$,J,K,X,q)=>{if(!X.isCompressed||J===0)return $.getOffset(j);let{virtualHeight:Z}=X,G=Z-K,U=G-Q;if(U<=K&&U>=-1){if(Q>=G-1){let R=$.getTotalHeight()-$.getOffset(j);return K-R}let L=r2($,K,J),z=Math.max(0,J-L),W=Q/Z*J,M=Math.max(0,Math.min(1,1-U/K)),F=$.getOffset(j)-$.getOffset(z),O=$.getOffset(j)-n2($,W,J);return O+(F-O)*M}let _=Q/Z*J;return $.getOffset(j)-n2($,_,J)},i2=(j,Q,$,J,K,X="start")=>{if(J===0)return 0;let q;if(K.isCompressed){if(X==="end"&&j===J-1)return Math.max(0,K.virtualHeight-$);q=j/J*K.virtualHeight}else q=Q.getOffset(j);let Z=Q.getHeight(j);switch(X){case"center":q-=($-Z)/2;break;case"end":q-=$-Z;break}let G=K.virtualHeight-$;return Math.max(0,Math.min(q,G))},aj=(j,Q,$,J)=>{if($===0)return 0;if(J.isCompressed){let K=j/J.virtualHeight;return Math.floor(K*$)}return Q.indexAtOffset(j)},rj=(j,Q)=>{if(typeof Q==="number")return j*Q>O2;return Q.getTotalHeight()>O2},nj=(j)=>{if(j<=0)return 0;return Math.floor(O2/j)},oj=(j,Q)=>{let $=M2(j,Q);if(!$.isCompressed)return`No compression needed (${j} items, ${($.actualHeight/1e6).toFixed(2)}M px)`;return`Compressed to ${($.ratio*100).toFixed(1)}% (${j} items, ${($.actualHeight/1e6).toFixed(1)}M px → ${($.virtualHeight/1e6).toFixed(1)}M px virtual)`};var t2=()=>{};var P2=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};var VJ={};cJ(VJ,{createGridRenderer:()=>g2});var U4=(j=200)=>{let Q=[];return{acquire:()=>{let X=Q.pop();if(X)return X;let q=document.createElement("div");return q.setAttribute("role","option"),q},release:(X)=>{if(Q.length<j)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}}},g2=(j,Q,$,J,K,X,q,Z)=>{let G=U4(),U=new Map,B=X,_=!1,L=null,z=0,D="",W=(b)=>{if(L&&z===b)return L;return L=M2(b,$),z=b,L},M={selected:!1,focused:!1},F=(b,C)=>{return M.selected=b,M.focused=C,M},O=`${K}-item ${K}-grid-item`,R=`${K}-item--selected`,A=`${K}-item--focused`,T=(b,C)=>{if(typeof C==="string")b.innerHTML=C;else b.replaceChildren(C)},V=(b,C,h)=>{b.classList.toggle(R,C),b.classList.toggle(A,h)},S=(b,C)=>{let h=J.getRow(b);if(C){let m=C.totalItems,s=W(m);if(s.isCompressed)return R2(h,C.scrollTop,$,m,C.containerHeight,s,C.rangeStart)}return $.getOffset(h)},N=(b,C,h)=>{let m=b.dataset.id?.startsWith("__group_header"),s=m?0:J.getCol(C),r=m?0:J.getColumnOffset(s,B),q2;if(_){let Z2=J.getRow(C),k=0,d=new Set;for(let x=0;x<C;x++){let J2=J.getRow(x);if(J2<Z2&&!d.has(J2)){let i=$.getHeight(x);k+=i,d.add(J2)}}q2=k}else q2=S(C,h);b.style.transform=`translate(${Math.round(r)}px, ${Math.round(q2)}px)`},P=(b,C)=>{let h=b.dataset.id?.startsWith("__group_header"),m=h?B:J.getColumnWidth(B),s;if(_||h)s=$.getHeight(C)-J.gap;else{let r=J.getRow(C);s=$.getHeight(r)-J.gap}b.style.width=`${m}px`,b.style.height=`${s}px`},g=(b,C,h,m,s)=>{let r=G.acquire(),q2=F(h,m);if(r.className=O,r.dataset.index=String(b),r.dataset.id=String(C.id),r.dataset.row=String(J.getRow(b)),r.dataset.col=String(J.getCol(b)),r.ariaSelected=String(h),Z)r.id=`${Z}-item-${b}`;if(q)D=String(q()),r.setAttribute("aria-setsize",D),r.setAttribute("aria-posinset",String(b+1));P(r,b);let Z2=Q(C,b,q2);return T(r,Z2),V(r,h,m),N(r,b,s),r},o=(b,C,h,m,s)=>{if(C.start===0&&b.length>0)_=P2(b[0]);for(let[k,d]of U)if(k<C.start||k>C.end)d.element.remove(),G.release(d.element),U.delete(k);let r=!1;if(q){let k=String(q());r=k!==D,D=k}let q2=document.createDocumentFragment(),Z2=[];for(let k=C.start;k<=C.end;k++){let d=k-C.start,x=b[d];if(!x){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${C.start}-${C.end}, items.length: ${b.length})`);continue}let J2=h.has(x.id),i=k===m,Q2=U.get(k);if(Q2){let v=Q2.element.dataset.id,f=String(x.id);if(v!==f){let $2=F(J2,i),l=Q(x,k,$2);T(Q2.element,l),Q2.element.dataset.id=f,Q2.element.dataset.row=String(J.getRow(k)),Q2.element.dataset.col=String(J.getCol(k)),P(Q2.element,k)}if(V(Q2.element,J2,i),Q2.element.ariaSelected=String(J2),N(Q2.element,k,s),r)Q2.element.setAttribute("aria-setsize",D)}else{let v=g(k,x,J2,i,s);q2.appendChild(v),Z2.push({index:k,element:v})}}if(Z2.length>0){j.appendChild(q2);for(let{index:k,element:d}of Z2)U.set(k,{index:k,element:d})}},c=(b)=>{for(let[C,h]of U)N(h.element,C,b)},e=(b,C,h,m)=>{let s=U.get(b);if(s){let r=F(h,m),q2=Q(C,b,r);T(s.element,q2),V(s.element,h,m),s.element.dataset.id=String(C.id),s.element.ariaSelected=String(h),P(s.element,b)}},j2=(b,C,h)=>{let m=U.get(b);if(m)V(m.element,C,h)},H=(b)=>{return U.get(b)?.element},w=(b)=>{if(Math.abs(b-B)<1)return;B=b;for(let[C,h]of U)P(h.element,C),N(h.element,C)},p=()=>{for(let[,b]of U)b.element.remove(),G.release(b.element);U.clear()};return{render:o,updatePositions:c,updateItem:e,updateItemClasses:j2,getElement:H,updateContainerWidth:w,clear:p,destroy:()=>{p(),G.clear()}}};var Yj=xj(()=>{t2()});var lJ=0,H2=5,sJ=100,Ej=2,aJ=(j=0)=>{let Q=Array(H2);for(let $=0;$<H2;$++)Q[$]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:Q,sampleIndex:0,sampleCount:0}},rJ=(j,Q)=>{let $=performance.now(),J=$-j.lastTime;if(J===0)return j;if(J>sJ){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let X=j.samples[0];return X.position=Q,X.time=$,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=Q,j.lastTime=$,j}let K=j.samples[j.sampleIndex];if(K.position=Q,K.time=$,j.sampleIndex=(j.sampleIndex+1)%H2,j.sampleCount=Math.min(j.sampleCount+1,H2),j.sampleCount>=Ej){let X=(j.sampleIndex-j.sampleCount+H2)%H2,q=j.samples[X],Z=Q-q.position,G=$-q.time;j.velocity=G>0?Math.abs(Z)/G:0}return j.lastPosition=Q,j.lastTime=$,j},hj=(j,Q)=>{if(typeof j==="number"){let X=Q;return{getOffset:(q)=>q*j,getHeight:()=>j,indexAtOffset:(q)=>{if(X===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(q/j),X-1))},getTotalHeight:()=>X*j,getTotal:()=>X,rebuild:(q)=>{X=q},isVariable:()=>!1}}let $=Q,J=new Float64Array(0),K=(X)=>{$=X,J=new Float64Array(X+1),J[0]=0;for(let q=0;q<X;q++)J[q+1]=J[q]+j(q)};return K(Q),{getOffset:(X)=>{if(X<=0)return 0;if(X>=$)return J[$];return J[X]},getHeight:(X)=>j(X),indexAtOffset:(X)=>{if($===0)return 0;if(X<=0)return 0;if(X>=J[$])return $-1;let q=0,Z=$-1;while(q<Z){let G=q+Z+1>>>1;if(J[G]<=X)q=G;else Z=G-1}return q},getTotalHeight:()=>J[$]??0,getTotal:()=>$,rebuild:(X)=>K(X),isVariable:()=>!0}},nJ=()=>{let j={},Q=(X,q)=>{if(!j[X])j[X]=new Set;return j[X].add(q),()=>$(X,q)},$=(X,q)=>{j[X]?.delete(q)};return{on:Q,off:$,emit:(X,q)=>{j[X]?.forEach((Z)=>{try{Z(q)}catch(G){console.error(`[vlist] Error in "${X}" handler:`,G)}})},clear:()=>{for(let X in j)delete j[X]}}},oJ=(j)=>{if(typeof j==="string"){let Q=document.querySelector(j);if(!Q)throw Error(`[vlist/builder] Container not found: ${j}`);return Q}return j},iJ=(j,Q,$,J)=>{let K=document.createElement("div");if(K.className=Q,J)K.classList.add(`${Q}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),$)K.setAttribute("aria-label",$);if(J)K.setAttribute("aria-orientation","horizontal");let X=document.createElement("div");if(X.className=`${Q}-viewport`,J)X.style.overflowX="auto",X.style.overflowY="hidden";else X.style.overflow="auto";X.style.height="100%",X.style.width="100%";let q=document.createElement("div");if(q.className=`${Q}-content`,q.style.position="relative",J)q.style.height="100%";else q.style.width="100%";let Z=document.createElement("div");if(Z.className=`${Q}-items`,Z.style.position="relative",J)Z.style.height="100%";else Z.style.width="100%";return q.appendChild(Z),X.appendChild(q),K.appendChild(X),j.appendChild(K),{root:K,viewport:X,content:q,items:Z}},tJ=(j=100)=>{let Q=[];return{acquire:()=>{let $=Q.pop();if($)return $;let J=document.createElement("div");return J.setAttribute("role","option"),J},release:($)=>{if(Q.length<j)$.className="",$.textContent="",$.removeAttribute("style"),$.removeAttribute("data-index"),$.removeAttribute("data-id"),Q.push($)},clear:()=>{Q.length=0}}},eJ=(j,Q,$,J,K)=>{if(J===0||Q===0){K.start=0,K.end=0;return}let X=$.indexAtOffset(j),q=$.indexAtOffset(j+Q);if(q<J-1)q++;K.start=Math.max(0,X),K.end=Math.min(J-1,Math.max(0,q))},j4=(j,Q,$,J)=>{if($===0){J.start=0,J.end=0;return}J.start=Math.max(0,j.start-Q),J.end=Math.min($-1,j.end+Q)},J4=(j,Q,$,J,K)=>{if(J===0)return 0;let X=Math.max(0,Math.min(j,J-1)),q=Q.getOffset(X),Z=Q.getHeight(X),G=Math.max(0,Q.getTotalHeight()-$),U;switch(K){case"center":U=q-($-Z)/2;break;case"end":U=q-$+Z;break;default:U=q}return Math.max(0,Math.min(U,G))},$4=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,Q4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:300};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??300};return{align:"start",behavior:"auto",duration:300}},gj=(j)=>{if(!j.container)throw Error("[vlist/builder] Container is required");if(!j.item)throw Error("[vlist/builder] item configuration is required");let Q=j.direction==="horizontal",$=Q?"width":"height",J=Q?j.item.width:j.item.height;if(J==null)throw Error(`[vlist/builder] item.${$} is required${Q?" when direction is 'horizontal'":""}`);if(typeof J==="number"&&J<=0)throw Error(`[vlist/builder] item.${$} must be a positive number`);if(typeof J!=="number"&&typeof J!=="function")throw Error(`[vlist/builder] item.${$} must be a number or a function (index) => number`);if(!j.item.template)throw Error("[vlist/builder] item.template is required");if(Q&&j.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let K=new Map,X=!1,q={use(Z){if(X)throw Error("[vlist/builder] Cannot call .use() after .build()");return K.set(Z.name,Z),q},build(){if(X)throw Error("[vlist/builder] .build() can only be called once");return X=!0,X4(j,K,Q,J)}};return q};function X4(j,Q,$,J){let{item:K,items:X,overscan:q=3,classPrefix:Z="vlist",ariaLabel:G,reverse:U=!1,scroll:B}=j,_=B?.wheel??!0,L=B?.wrap??!1,z=U,D=`${Z}-${lJ++}`,W=J,M=$?typeof K.height==="number"?K.height:void 0:typeof K.width==="number"?K.width:void 0,F=K.template,O={overscan:q,classPrefix:Z,reverse:z,wrap:L,horizontal:$,ariaIdPrefix:D},R=Array.from(Q.values()).sort((Y,E)=>(Y.priority??50)-(E.priority??50)),A=new Set(R.map((Y)=>Y.name));for(let Y of R)if(Y.conflicts){for(let E of Y.conflicts)if(A.has(E))throw Error(`[vlist/builder] ${Y.name} and ${E} cannot be combined`)}if($){if(A.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(A.has("withGroups"))throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'")}if(z){if(A.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let T=oJ(j.container),V=iJ(T,Z,G,$),S=nJ(),N=X?[...X]:[],P=hj(W,N.length),g=tJ(),o=V.viewport.clientHeight,c=V.viewport.clientWidth,e=!1,j2=!1,H=0,w=null,p=null,u=aJ(0),b={start:0,end:0},C={start:0,end:0},h={start:-1,end:-1},m={viewportState:{scrollTop:0,containerHeight:o,totalHeight:P.getTotalHeight(),actualHeight:P.getTotalHeight(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},s=new Map,r={selected:!1,focused:!1},q2=`${Z}-item`,Z2="",k=new Map,d=()=>{k.clear();for(let Y=0;Y<N.length;Y++){let E=N[Y];if(E)k.set(E.id,Y)}};d();let x=null,J2=()=>x?x.getTotal():N.length,i=[],Q2=[],v=[],f=[],n=[],$2=[],l=new Map,X2=()=>{return $?V.viewport.scrollLeft:V.viewport.scrollTop},K2=(Y)=>{if($)V.viewport.scrollLeft=Y;else V.viewport.scrollTop=Y},E2=(Y=2)=>{let E=P.getTotalHeight();return H+o>=E-Y},U2=!1,Y2,_2,B2=(Y,E,y,I,t)=>{eJ(Y,E,y,I,t)},G2=(Y,E,y,I,t)=>{return J4(Y,E,y,I,t)},D2=(Y,E)=>{if(typeof E==="string")Y.innerHTML=E;else Y.replaceChildren(E)},L2=(Y,E)=>{let y=Math.round(P.getOffset(E));if($)Y.style.transform=`translateX(${y}px)`;else Y.style.transform=`translateY(${y}px)`},LJ=(Y,E)=>{let y=g.acquire();if(y.className=q2,$){if(y.style.width=`${P.getHeight(Y)}px`,M!=null)y.style.height=`${M}px`}else y.style.height=`${P.getHeight(Y)}px`;return y.dataset.index=String(Y),y.dataset.id=String(E.id),y.ariaSelected="false",y.id=`${D}-item-${Y}`,Z2=String(J2()),y.setAttribute("aria-setsize",Z2),y.setAttribute("aria-posinset",String(Y+1)),D2(y,F(E,Y,r)),L2(y,Y),y},v2=()=>{let Y=`${P.getTotalHeight()}px`;if($)V.content.style.width=Y;else V.content.style.height=Y},Wj=new Set,Nj=-1,OJ=()=>{if(e)return;let Y=J2();if(B2(H,o,P,Y,b),j4(b,q,Y,C),C.start===h.start&&C.end===h.end)return;let E=String(Y),y=E!==Z2;Z2=E;for(let[a,N2]of s)if(a<C.start||a>C.end)N2.remove(),g.release(N2),s.delete(a);let I=document.createDocumentFragment(),t=[];for(let a=C.start;a<=C.end;a++){let N2=x?x.getItem(a):N[a];if(!N2)continue;let V2=s.get(a);if(V2){let A2=V2.dataset.id,s2=String(N2.id);if(A2!==s2)if(D2(V2,F(N2,a,r)),V2.dataset.id=s2,$)V2.style.width=`${P.getHeight(a)}px`;else V2.style.height=`${P.getHeight(a)}px`;L2(V2,a);let a2=Wj.has(N2.id),xJ=a===Nj;if(V2.classList.toggle(`${Z}-item--selected`,a2),V2.classList.toggle(`${Z}-item--focused`,xJ),V2.ariaSelected=a2?"true":"false",y)V2.setAttribute("aria-setsize",Z2)}else{let A2=LJ(a,N2),s2=Wj.has(N2.id),a2=a===Nj;if(s2)A2.classList.add(`${Z}-item--selected`),A2.ariaSelected="true";if(a2)A2.classList.add(`${Z}-item--focused`);I.appendChild(A2),t.push({index:a,element:A2})}}if(t.length>0){V.items.appendChild(I);for(let{index:a,element:N2}of t)s.set(a,N2)}h.start=C.start,h.end=C.end,m.lastRenderRange.start=C.start,m.lastRenderRange.end=C.end,m.viewportState.scrollTop=H,m.viewportState.visibleRange.start=b.start,m.viewportState.visibleRange.end=b.end,m.viewportState.renderRange.start=C.start,m.viewportState.renderRange.end=C.end,S.emit("range:change",{range:{start:C.start,end:C.end}})},zJ=()=>{h.start=-1,h.end=-1,Y2()};Y2=OJ,_2=zJ;let f2=()=>{if(e)return;let Y=X2(),E=Y>=H?"down":"up";if(u=rJ(u,Y),!V.root.classList.contains(`${Z}--scrolling`))V.root.classList.add(`${Z}--scrolling`);H=Y,Y2(),S.emit("scroll",{scrollTop:Y,direction:E}),S.emit("velocity:change",{velocity:u.velocity,reliable:u.sampleCount>=Ej});for(let y=0;y<i.length;y++)i[y](Y,E);if(p)clearTimeout(p);p=setTimeout(()=>{V.root.classList.remove(`${Z}--scrolling`),u.velocity=0,u.sampleCount=0,S.emit("velocity:change",{velocity:0,reliable:!1})},B?.idleTimeout??150)},c2=null,y2=V.viewport;if(y2.addEventListener("scroll",f2,{passive:!0}),$&&_)c2=(Y)=>{if(Y.deltaX)return;Y.preventDefault(),V.viewport.scrollLeft+=Y.deltaY},V.viewport.addEventListener("wheel",c2);let wj=(Y)=>{let y=Y.target.closest("[data-index]");if(y){let I=parseInt(y.dataset.index??"-1",10);if(I>=0){let t=x?.getItem(I)??N[I];if(t){if(t.__groupHeader)return;S.emit("item:click",{item:t,index:I,event:Y})}}}for(let I=0;I<Q2.length;I++)Q2[I](Y)},bJ=(Y)=>{let y=Y.target.closest("[data-index]");if(y){let I=parseInt(y.dataset.index??"-1",10);if(I>=0){let t=x?.getItem(I)??N[I];if(t){if(t.__groupHeader)return;S.emit("item:dblclick",{item:t,index:I,event:Y})}}}},vj=(Y)=>{for(let E=0;E<v.length;E++)v[E](Y)};V.items.addEventListener("click",wj),V.items.addEventListener("dblclick",bJ),V.root.addEventListener("keydown",vj);let Vj=!0,PJ=()=>c,yJ=()=>o,_j=new ResizeObserver((Y)=>{if(e)return;for(let E of Y){let y=E.contentRect.height,I=E.contentRect.width,t=$?I:y;if(c=I,Math.abs(t-o)>1){if(o=t,m.viewportState.containerHeight=t,j2)v2(),Y2(),S.emit("resize",{height:y,width:I})}if(j2)for(let a=0;a<f.length;a++)f[a](I,y)}});if(Vj)_j.observe(V.viewport);let W2={get dom(){return V},get heightCache(){return P},get emitter(){return S},get config(){return O},get rawConfig(){return j},get renderer(){return{render:(Y,E,y,I,t)=>{Wj=y,Nj=I,_2()},updateItemClasses:(Y,E,y)=>{let I=s.get(Y);if(!I)return;I.classList.toggle(`${Z}-item--selected`,E),I.classList.toggle(`${Z}-item--focused`,y),I.ariaSelected=E?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(Y)=>s.get(Y)??null,clear:()=>{},destroy:()=>{}}},set renderer(Y){},get dataManager(){return x},set dataManager(Y){x=Y},get scrollController(){return Gj},set scrollController(Y){Gj=Y},state:m,getContainerWidth(){return c},afterScroll:i,clickHandlers:Q2,keydownHandlers:v,resizeHandlers:f,contentSizeHandlers:n,destroyHandlers:$2,methods:l,replaceTemplate(Y){F=Y},replaceRenderer(Y){},replaceDataManager(Y){x=Y},replaceScrollController(Y){Gj=Y},getItemsForRange(Y){let E=[];for(let y=Y.start;y<=Y.end;y++){let I=x?x.getItem(y):N[y];if(I)E.push(I)}return E},getAllLoadedItems(){if(x){let Y=x.getTotal(),E=[];for(let y=0;y<Y;y++){let I=x.getItem(y);if(I)E.push(I)}return E}return[...N]},getVirtualTotal(){return J2()},getCachedCompression(){return{isCompressed:!1,actualHeight:P.getTotalHeight(),virtualHeight:P.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:H,totalItems:J2(),containerHeight:o,rangeStart:C.start}},renderIfNeeded(){Y2()},forceRender(){_2()},getRenderFns(){return{renderIfNeeded:Y2,forceRender:_2}},setRenderFns(Y,E){Y2=Y,_2=E},setVirtualTotalFn(Y){J2=Y},rebuildHeightCache(Y){P.rebuild(Y??J2())},setHeightConfig(Y){P=hj(Y,J2())},updateContentSize(Y){let E=`${Y}px`;if($)V.content.style.width=E;else V.content.style.height=E},updateCompressionMode(){},setVisibleRangeFn(Y){B2=Y},setScrollToPosFn(Y){G2=Y},setPositionElementFn(Y){L2=Y},setScrollFns(Y,E){X2=Y,K2=(y)=>{E(y),f2()}},setScrollTarget(Y){y2.removeEventListener("scroll",f2),y2=Y,y2.addEventListener("scroll",f2,{passive:!0})},getScrollTarget(){return y2},setContainerDimensions(Y){PJ=Y.width,yJ=Y.height,c=Y.width(),o=Y.height(),m.viewportState.containerHeight=o},disableViewportResize(){if(Vj)Vj=!1,_j.unobserve(V.viewport)}};x={getState:()=>({total:N.length,cached:N.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>N.length,getCached:()=>N.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Y)=>N[Y],getItemById:(Y)=>{let E=k.get(Y);return E!==void 0?N[E]:void 0},getIndexById:(Y)=>k.get(Y)??-1,isItemLoaded:(Y)=>Y>=0&&Y<N.length&&N[Y]!==void 0,getItemsInRange:(Y,E)=>{let y=[],I=Math.max(0,Y),t=Math.min(E,N.length-1);for(let a=I;a<=t;a++)y.push(N[a]);return y},setTotal:(Y)=>{},setItems:(Y,E=0,y)=>{if(E===0&&(y!==void 0||N.length===0))N=[...Y];else{let I=E+Y.length;if(N.length<I)N.length=I;for(let t=0;t<Y.length;t++)N[E+t]=Y[t]}if(d(),j2){P.rebuild(J2()),v2(),W2.updateCompressionMode();for(let I=0;I<n.length;I++)n[I]();_2()}},updateItem:(Y,E)=>{let y=k.get(Y);if(y===void 0)return!1;let I=N[y];if(!I)return!1;if(N[y]={...I,...E},E.id!==void 0&&E.id!==Y)k.delete(Y),k.set(E.id,y);let t=s.get(y);if(t)D2(t,F(N[y],y,r)),t.dataset.id=String(N[y].id);return!0},removeItem:(Y)=>{let E=k.get(Y);if(E===void 0)return!1;if(N.splice(E,1),d(),j2){P.rebuild(J2()),v2(),W2.updateCompressionMode();for(let y=0;y<n.length;y++)n[y]();_2()}return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{N=[],k.clear()},reset:()=>{if(N=[],k.clear(),j2)P.rebuild(0),v2(),_2()}};let Gj={getScrollTop:()=>X2(),scrollTo:(Y)=>{K2(Y),H=Y,Y2()},scrollBy:(Y)=>{let E=X2()+Y;K2(E),H=E,Y2()},isAtTop:()=>H<=2,isAtBottom:(Y=2)=>E2(Y),getScrollPercentage:()=>{let Y=P.getTotalHeight(),E=Math.max(0,Y-o);return E>0?H/E:0},getVelocity:()=>u.velocity,isTracking:()=>u.sampleCount>=Ej,isScrolling:()=>V.root.classList.contains(`${Z}--scrolling`),updateConfig:()=>{},enableCompression:()=>{},disableCompression:()=>{},isCompressed:()=>U2,isWindowMode:()=>!1,updateContainerHeight:(Y)=>{o=Y},destroy:()=>{}},fj=new Map;for(let Y of R)if(Y.methods)for(let E of Y.methods){let y=fj.get(E);if(y)throw Error(`[vlist/builder] Method "${E}" is registered by both "${y}" and "${Y.name}"`);fj.set(E,Y.name)}for(let Y of R)Y.setup(W2);if(j2=!0,W2.state.isInitialized=!0,v2(),Y2(),z&&N.length>0){let Y=G2(N.length-1,P,o,N.length,"end");K2(Y),H=Y,Y2()}let HJ=(Y)=>{W2.dataManager.setItems(Y,0,Y.length)},RJ=z?(Y)=>{let E=E2(2),y=N.length;if(W2.dataManager.setItems(Y,y),E&&N.length>0){let I=G2(N.length-1,P,o,N.length,"end");K2(I),H=I,Y2()}}:(Y)=>{let E=N.length;W2.dataManager.setItems(Y,E)},kJ=z?(Y)=>{let E=X2(),y=P.getTotalHeight(),I=[...N];W2.dataManager.clear(),W2.dataManager.setItems([...Y,...I],0);let a=P.getTotalHeight()-y;if(a>0)K2(E+a),H=E+a}:(Y)=>{let E=[...N];W2.dataManager.clear(),W2.dataManager.setItems([...Y,...E],0)},TJ=(Y,E)=>{W2.dataManager.updateItem(Y,E)},CJ=(Y)=>{W2.dataManager.removeItem(Y)},SJ=async()=>{if(W2.dataManager.reload)await W2.dataManager.reload()},l2=()=>{if(w!==null)cancelAnimationFrame(w),w=null},wJ=(Y,E,y)=>{if(l2(),Math.abs(E-Y)<1){K2(E),H=E,Y2();return}let I=performance.now(),t=(a)=>{let N2=a-I,V2=Math.min(N2/y,1),A2=Y+(E-Y)*$4(V2);if(K2(A2),H=A2,Y2(),V2<1)w=requestAnimationFrame(t);else w=null};w=requestAnimationFrame(t)},Ij=(Y,E)=>{let{align:y,behavior:I,duration:t}=Q4(E),a=J2(),N2=Y;if(L&&a>0)N2=(N2%a+a)%a;let V2=G2(N2,P,o,a,y);if(I==="smooth")wJ(X2(),V2,t);else l2(),K2(V2)},vJ=(Y,E)=>{let y=k.get(Y)??W2.dataManager.getIndexById(Y);if(y>=0)Ij(y,E)},fJ=()=>X2(),IJ=(Y,E)=>{return S.on(Y,E)},pJ=(Y,E)=>{S.off(Y,E)},uJ=()=>{if(e)return;if(e=!0,W2.state.isDestroyed=!0,V.items.removeEventListener("click",wj),V.root.removeEventListener("keydown",vj),y2.removeEventListener("scroll",f2),_j.disconnect(),c2)V.viewport.removeEventListener("wheel",c2);if(p)clearTimeout(p);for(let Y=0;Y<$2.length;Y++)$2[Y]();for(let Y of R)if(Y.destroy)Y.destroy();l2();for(let[,Y]of s)Y.remove(),g.release(Y);s.clear(),g.clear(),S.clear(),V.root.remove()},pj={get element(){return V.root},get items(){if(l.has("_getItems"))return l.get("_getItems")();return N},get total(){if(l.has("_getTotal"))return l.get("_getTotal")();return J2()},setItems:l.has("setItems")?l.get("setItems"):HJ,appendItems:l.has("appendItems")?l.get("appendItems"):RJ,prependItems:l.has("prependItems")?l.get("prependItems"):kJ,updateItem:l.has("updateItem")?l.get("updateItem"):TJ,removeItem:l.has("removeItem")?l.get("removeItem"):CJ,reload:l.has("reload")?l.get("reload"):SJ,scrollToIndex:l.has("scrollToIndex")?l.get("scrollToIndex"):Ij,scrollToItem:l.has("scrollToItem")?l.get("scrollToItem"):vJ,cancelScroll:l.has("cancelScroll")?l.get("cancelScroll"):l2,getScrollPosition:l.has("getScrollPosition")?l.get("getScrollPosition"):fJ,on:IJ,off:pJ,destroy:uJ};for(let[Y,E]of l){if(Y==="setItems"||Y==="appendItems"||Y==="prependItems"||Y==="updateItem"||Y==="removeItem"||Y==="reload"||Y==="scrollToIndex"||Y==="scrollToItem"||Y==="cancelScroll"||Y==="getScrollPosition")continue;pj[Y]=E}return pj}t2();var k2=(j,Q,$={},J="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:G=!0,hoverZoneWidth:U=16,showOnViewportEnter:B=!0}=$,_=0,L=0,z=0,D=0,W=!1,M=!1,F=0,O=0,R=0,A=null,T=!1,V=null,S=null,N=K?"width":"height",P=K?"translateX":"translateY",g=K?(i)=>i.clientX:(i)=>i.clientY,o=K?"left":"top",c=document.createElement("div"),e=document.createElement("div"),j2=G?document.createElement("div"):null,H=()=>{if(c.className=`${J}-scrollbar`,e.className=`${J}-scrollbar-thumb`,K)c.classList.add(`${J}-scrollbar--horizontal`);if(c.appendChild(e),j.appendChild(c),j2){if(j2.className=`${J}-scrollbar-hover`,K)j2.classList.add(`${J}-scrollbar-hover--horizontal`),j2.style.height=`${U}px`;else j2.style.width=`${U}px`;j.appendChild(j2)}},w=()=>{if(A)clearTimeout(A),A=null},p=()=>{if(!X)return;w(),A=setTimeout(b,q)},u=()=>{if(_<=L)return;if(w(),!T)c.classList.add(`${J}-scrollbar--visible`),T=!0;if(X&&!W&&!M)p()},b=()=>{if(W||M)return;c.classList.remove(`${J}-scrollbar--visible`),T=!1},C=(i,Q2)=>{_=i,L=Q2;let v=_>L;if(c.style.display=v?"":"none",!v){b();return}let f=L/_;z=Math.max(Z,f*L),e.style[N]=`${z}px`,D=L-z,h(R)},h=(i)=>{if(R=i,_<=L||D<=0)return;let Q2=_-L,f=Math.min(1,Math.max(0,i/Q2))*D;e.style.transform=`${P}(${f}px)`},m=(i)=>{if(i.target===e)return;let Q2=c.getBoundingClientRect(),n=g(i)-Q2[o]-z/2,l=Math.max(0,Math.min(n,D))/D,X2=_-L,K2=l*X2;Q(K2),u()},s=(i)=>{i.preventDefault(),i.stopPropagation(),W=!0,F=g(i),O=R,w(),c.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",r),document.addEventListener("mouseup",q2)},r=(i)=>{if(!W)return;let Q2=g(i)-F,v=D>0?Q2/D:0,f=_-L,n=v*f,$2=Math.max(0,Math.min(O+n,f)),X2=$2/f*D;if(e.style.transform=`${P}(${X2}px)`,S=$2,V===null)V=requestAnimationFrame(()=>{if(S!==null)Q(S);V=null})},q2=()=>{if(W=!1,V!==null)cancelAnimationFrame(V),V=null;if(S!==null)Q(S),S=null;if(c.classList.remove(`${J}-scrollbar--dragging`),X&&!M)p();document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",q2)},Z2=()=>{if(B)u()},k=()=>{if(!W){if(M=!1,X)p()}},d=()=>{M=!0,w(),u()},x=()=>{if(M=!1,!W&&X)p()},J2=()=>{if(w(),V!==null)cancelAnimationFrame(V),V=null;if(c.removeEventListener("click",m),c.removeEventListener("mouseenter",d),c.removeEventListener("mouseleave",x),e.removeEventListener("mousedown",s),j.removeEventListener("mouseenter",Z2),j.removeEventListener("mouseleave",k),document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",q2),j2){if(j2.removeEventListener("mouseenter",d),j2.removeEventListener("mouseleave",x),j2.parentNode)j2.parentNode.removeChild(j2)}if(c.parentNode)c.parentNode.removeChild(c)};if(H(),c.addEventListener("click",m),c.addEventListener("mouseenter",d),c.addEventListener("mouseleave",x),e.addEventListener("mousedown",s),j.addEventListener("mouseenter",Z2),j.addEventListener("mouseleave",k),j2)j2.addEventListener("mouseenter",d),j2.addEventListener("mouseleave",x);return{show:u,hide:b,updateBounds:C,updatePosition:h,isVisible:()=>T,destroy:J2}};var ij=(j)=>{let Q=null;return{name:"withScrollbar",priority:30,setup($){let{dom:J,config:K}=$,{classPrefix:X,horizontal:q}=K;if(Q=k2(J.viewport,(U)=>$.scrollController.scrollTo(U),j??{},X,q),!J.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))J.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let Z=$.getCachedCompression();Q.updateBounds(Z.virtualHeight,$.state.viewportState.containerHeight);let G=Q;$.afterScroll.push((U,B)=>{G.updatePosition(U),G.show()}),$.resizeHandlers.push((U,B)=>{if(G){let _=$.getCachedCompression();G.updateBounds(_.virtualHeight,$.state.viewportState.containerHeight)}}),$.contentSizeHandlers.push(()=>{if(G){let U=$.getCachedCompression();G.updateBounds(U.virtualHeight,$.state.viewportState.containerHeight)}}),$.destroyHandlers.push(()=>{if(G)G.destroy()})},destroy(){if(Q)Q.destroy(),Q=null}}};var tj=(j=0)=>{let Q=[,,,,,,,,];for(let $=0;$<8;$++)Q[$]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:Q,sampleIndex:0,sampleCount:0}},e2=(j,Q)=>{let $=performance.now(),J=$-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let X=j.samples[0];return X.position=Q,X.time=$,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=Q,j.lastTime=$,j}let K=j.samples[j.sampleIndex];if(K.position=Q,K.time=$,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let X=(j.sampleIndex-j.sampleCount+8)%8,q=j.samples[X],Z=Q-q.position,G=$-q.time;j.velocity=G>0?Z/G:0}return j.lastPosition=Q,j.lastTime=$,j},Y4=(j)=>j.sampleCount>=3,ej=(j,Q={})=>{let{wheel:$=!0,sensitivity:J=1,smoothing:K=!1,idleTimeout:X=150,onScroll:q,onIdle:Z,scrollElement:G,horizontal:U=!1}=Q,B=!!G,_=0,L=0,z=B?U?window.innerWidth:window.innerHeight:U?j.clientWidth:j.clientHeight,D=Q.compressed??!1,W=Q.compression,M=tj(),F=!1,O=null,A=jj(()=>{let k=U?j.scrollLeft:j.scrollTop,d=k>=_?"down":"up";if(M=e2(M,k),_=k,q)q({scrollTop:_,direction:d,velocity:M.velocity});g()}),V=jj(()=>{let k=j.getBoundingClientRect(),d=U?Math.max(0,-k.left):Math.max(0,-k.top),x=d>=_?"down":"up";if(M=e2(M,d),_=d,!F)F=!0;if(q)q({scrollTop:_,direction:x,velocity:M.velocity});g()}),S=(k)=>{k.preventDefault()},N=(k)=>{if(k.deltaX)return;k.preventDefault(),j.scrollLeft+=k.deltaY},P=(k)=>{if(!D)return;k.preventDefault();let d=(U?k.deltaX||k.deltaY:k.deltaY)*J,x=_+d;if(K)x=_+d*0.3;if(x=Math.max(0,Math.min(x,L)),x!==_){let i=x>=_?"down":"up";if(M=e2(M,x),_=x,!F)F=!0;if(q)q({scrollTop:_,direction:i,velocity:M.velocity});g()}},g=()=>{if(O)clearTimeout(O);O=setTimeout(()=>{if(F=!1,M=tj(_),Z)Z()},X)},o=(k)=>{if(D)return;if(D=!0,W=k,L=k.virtualHeight-z,B)return;if(A.cancel(),j.removeEventListener("scroll",A),!$)j.removeEventListener("wheel",S);else if(U)j.removeEventListener("wheel",N);if(U)j.style.overflowX="hidden";else j.style.overflow="hidden";if($)j.addEventListener("wheel",P,{passive:!1});let d=U?j.scrollLeft:j.scrollTop;if(d>0){let x=U?W?.actualHeight??j.scrollWidth:W?.actualHeight??j.scrollHeight;_=d/x*L}if(U)j.scrollLeft=0;else j.scrollTop=0},c=()=>{if(!D)return;if(D=!1,B){W=void 0;return}if(j.removeEventListener("wheel",P),U)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",A,{passive:!0}),!$)j.addEventListener("wheel",S,{passive:!1});else if(U)j.addEventListener("wheel",N,{passive:!1});if(W&&_>0){let d=_/L*(W.actualHeight-z);if(U)j.scrollLeft=d;else j.scrollTop=d}W=void 0},e=()=>{if(B||D)return _;return U?j.scrollLeft:j.scrollTop},j2=(k,d=!1)=>{let x=Math.max(0,Math.min(k,L||1/0));if(B){let J2=j.getBoundingClientRect();if(U){let i=J2.left+window.scrollX;window.scrollTo({left:i+x,behavior:d?"smooth":"auto"})}else{let i=J2.top+window.scrollY;window.scrollTo({top:i+x,behavior:d?"smooth":"auto"})}}else if(D){if(x===_)return;let i=x>=_?"down":"up";if(M=e2(M,x),_=x,!F)F=!0;if(q)q({scrollTop:_,direction:i,velocity:M.velocity});g()}else if(U)j.scrollTo({left:x,behavior:d?"smooth":"auto"});else j.scrollTo({top:x,behavior:d?"smooth":"auto"})},H=(k)=>{j2(e()+k)},w=()=>{return e()<=0},p=(k=0)=>{let d=e(),x=B||D?L:U?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return d>=x-k},u=()=>{let k=e(),d=B||D?L:U?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(d<=0)return 0;return Math.min(1,Math.max(0,k/d))},b=(k)=>{if(k.compression)W=k.compression,L=W.virtualHeight-z},C=()=>D,h=()=>Math.abs(M.velocity),m=()=>Y4(M),s=()=>F,r=()=>B,q2=(k)=>{if(z=k,W)L=W.virtualHeight-z},Z2=()=>{if(O)clearTimeout(O);if(B)V.cancel(),window.removeEventListener("scroll",V);else A.cancel(),j.removeEventListener("scroll",A),j.removeEventListener("wheel",P),j.removeEventListener("wheel",S),j.removeEventListener("wheel",N)};if(B){if(D&&W)L=W.virtualHeight-z;window.addEventListener("scroll",V,{passive:!0})}else if(D&&W){if(L=W.virtualHeight-z,U)j.style.overflowX="hidden";else j.style.overflow="hidden";if($)j.addEventListener("wheel",P,{passive:!1})}else{if(U)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",A,{passive:!0}),!$)j.addEventListener("wheel",S,{passive:!1});else if(U)j.addEventListener("wheel",N,{passive:!1})}return{getScrollTop:e,scrollTo:j2,scrollBy:H,isAtTop:w,isAtBottom:p,getScrollPercentage:u,getVelocity:h,isTracking:m,isScrolling:s,updateConfig:b,enableCompression:o,disableCompression:c,isCompressed:C,isWindowMode:r,updateContainerHeight:q2,destroy:Z2}},jj=(j)=>{let Q=null,$=null,J=(...K)=>{if($=K,Q===null)Q=requestAnimationFrame(()=>{if(Q=null,$)j(...$)})};return J.cancel=()=>{if(Q!==null)cancelAnimationFrame(Q),Q=null},J};var jJ=()=>{let j=null,Q=0,$=!1;return{name:"withScale",priority:20,setup(J){let{dom:K,config:X}=J,{classPrefix:q,horizontal:Z}=X,G=()=>{let B=J.getVirtualTotal(),_=M2(B,J.heightCache);if(_.isCompressed&&!$){$=!0,J.scrollController.enableCompression(_),J.updateContentSize(_.virtualHeight),J.setScrollFns(()=>Q,(W)=>{Q=W});let L=K.viewport,z=(W)=>{W.preventDefault();let M=_.virtualHeight-J.state.viewportState.containerHeight;Q=Math.max(0,Math.min(Q+W.deltaY,M)),J.scrollController.scrollTo(Q)};if(L.addEventListener("wheel",z,{passive:!1}),J.destroyHandlers.push(()=>{L.removeEventListener("wheel",z)}),!K.viewport.querySelector(`.${q}-scrollbar-track`)){if(j=k2(K.viewport,(M)=>J.scrollController.scrollTo(M),{},q,Z),!K.viewport.classList.contains(`${q}-viewport--custom-scrollbar`))K.viewport.classList.add(`${q}-viewport--custom-scrollbar`);j.updateBounds(_.virtualHeight,J.state.viewportState.containerHeight);let W=j;J.afterScroll.push((M,F)=>{if(W)W.updatePosition(M),W.show()}),J.resizeHandlers.push((M,F)=>{if(W){let O=J.getCachedCompression();W.updateBounds(O.virtualHeight,J.state.viewportState.containerHeight)}})}}else if(!_.isCompressed&&$)$=!1,J.scrollController.disableCompression(),J.updateContentSize(_.actualHeight);else if(_.isCompressed)J.scrollController.updateConfig({compression:_}),J.updateContentSize(_.virtualHeight);if(j)j.updateBounds(_.virtualHeight,J.state.viewportState.containerHeight);J.state.cachedCompression={state:_,totalItems:B}};J.updateCompressionMode=G;let U=J.getCachedCompression.bind(J);J.getCachedCompression=()=>{if(J.state.cachedCompression)return J.state.cachedCompression.state;return U()},J.setVisibleRangeFn((B,_,L,z,D)=>{let W=M2(z,L);o2(B,_,L,z,W,D)}),J.setScrollToPosFn((B,_,L,z,D)=>{let W=M2(z,_);return i2(B,_,L,z,W,D)}),J.setPositionElementFn((B,_)=>{let L=J.getVirtualTotal(),z=M2(L,J.heightCache);if(z.isCompressed){let D=Math.round(R2(_,J.scrollController.getScrollTop(),J.heightCache,L,J.state.viewportState.containerHeight,z)),W=J.config.horizontal;B.style.transform=W?`translateX(${D}px)`:`translateY(${D}px)`}else{let D=Math.round(J.heightCache.getOffset(_)),W=J.config.horizontal;B.style.transform=W?`translateX(${D}px)`:`translateY(${D}px)`}}),G(),J.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};var Jj=(j={})=>{let{chunkSize:Q=100,maxCachedItems:$=5000,evictionBuffer:J=200,onEvict:K}=j,X=new Map,q=0,Z=0,G=(H)=>{let w=X.get(H);if(!w)w={items:Array(Q),count:0,lastAccess:Date.now()},X.set(H,w);else w.lastAccess=Date.now();return w},U=(H)=>{return Math.floor(H/Q)},B=(H)=>{return H%Q},_=()=>q,L=(H)=>{q=H},z=(H)=>{if(H<0||H>=q)return;let w=U(H),p=X.get(w);if(!p)return;return p.items[B(H)]},D=(H)=>{if(H<0||H>=q)return!1;let w=U(H),p=X.get(w);if(!p)return!1;return p.items[B(H)]!==void 0},W=(H,w)=>{let p=U(H),u=G(p),b=B(H),C=u.items[b]===void 0;if(u.items[b]=w,C)u.count++,Z++;if(H>=q)q=H+1},M=(H,w)=>{for(let p=0;p<w.length;p++){let u=w[p];if(u!==void 0)W(H+p,u)}},F=(H)=>{if(H<0||H>=q)return!1;let w=U(H),p=X.get(w);if(!p)return!1;let u=B(H);if(p.items[u]===void 0)return!1;if(p.items[u]=void 0,p.count--,Z--,p.count===0)X.delete(w);return!0},O=(H,w)=>{let p=[];for(let u=H;u<=w&&u<q;u++)p.push(z(u));return p},R=(H,w)=>{for(let p=H;p<=w&&p<q;p++)if(!D(p))return!1;return!0},A=()=>{let H=[],w=null,p=Array.from(X.keys()).sort((u,b)=>u-b);for(let u of p){let b=X.get(u);if(!b)continue;let C=u*Q;for(let h=0;h<Q;h++){let m=C+h;if(m>=q)break;if(b.items[h]!==void 0)if(w===null)w={start:m,end:m};else if(m===w.end+1)w.end=m;else H.push(w),w={start:m,end:m};else if(w!==null)H.push(w),w=null}}if(w!==null)H.push(w);return H},T=(H,w)=>{let p=[],u=null;for(let b=H;b<=w&&b<q;b++)if(!D(b))if(u===null)u={start:b,end:b};else u.end=b;else if(u!==null)p.push(u),u=null;if(u!==null)p.push(u);return p},V=(H)=>{return X.has(H)},S=(H)=>{let w=X.get(H);if(w)w.lastAccess=Date.now()},N=(H,w)=>{if(H>w||X.size===0)return;let p=Date.now(),u=U(Math.max(0,H)),b=U(Math.min(q-1,w));for(let C=u;C<=b;C++){let h=X.get(C);if(h)h.lastAccess=p}},P=(H,w)=>{if(Z<=$)return 0;let p=Math.max(0,H-J),u=Math.min(q-1,w+J),b=U(p),C=U(u),h=0,m=[];for(let[s,r]of X)if(s<b||s>C)h+=r.count,m.push(s),Z-=r.count,X.delete(s);if(h>0&&K)K(h,m);return h},g=()=>{if(Z<=$)return 0;let H=Array.from(X.entries()).sort(([,u],[,b])=>u.lastAccess-b.lastAccess),w=0,p=[];for(let[u,b]of H){if(Z<=$)break;w+=b.count,Z-=b.count,p.push(u),X.delete(u)}if(w>0&&K)K(w,p);return w},o=()=>{return{totalItems:q,cachedItems:Z,cachedChunks:X.size,chunkSize:Q,maxCachedItems:$,memoryEfficiency:q>0?1-Z/q:1}},c=()=>Z,e=()=>{X.clear(),Z=0};return{chunkSize:Q,maxCachedItems:$,getTotal:_,setTotal:L,get:z,has:D,set:W,setRange:M,delete:F,getRange:O,isRangeLoaded:R,getLoadedRanges:A,findUnloadedRanges:T,getChunkIndex:U,isChunkLoaded:V,touchChunk:S,touchChunksForRange:N,evictDistant:P,evictToLimit:g,getStats:o,getCachedCount:c,clear:e,reset:()=>{e(),q=0}}},$j=(j)=>{if(j.length===0)return[];let Q=[...j].sort((J,K)=>J.start-K.start),$=[{...Q[0]}];for(let J=1;J<Q.length;J++){let K=Q[J],X=$[$.length-1];if(K.start<=X.end+1)X.end=Math.max(X.end,K.end);else $.push({...K})}return $},u2=(j,Q,$)=>{let J=Math.floor(j.start/$)*$,K=Math.ceil((j.end+1)/$)*$-1,X={start:J,end:K};if(Q.length===0)return[X];let q=[],Z=$j(Q),G=X.start;for(let U of Z){if(U.end<G)continue;if(U.start>X.end)break;if(U.start>G)q.push({start:G,end:Math.min(U.start-1,X.end)});if(G=U.end+1,G>X.end)break}if(G<=X.end)q.push({start:G,end:X.end});return q};var Qj=(j={})=>{let{enabled:Q=!0,maskCharacter:$="█",randomVariance:J=!0,maxSampleSize:K=20,customGenerator:X}=j,q=null,Z=!1,G=0,U=(F)=>{if(!Q||Z||F.length===0)return;let O=new Map,R=new Map,A=Math.min(F.length,K);for(let T=0;T<A;T++){let V=F[T];if(!V||typeof V!=="object")continue;for(let[S,N]of Object.entries(V)){if(S.startsWith("_")||S==="id")continue;if(!R.has(S))R.set(S,{lengths:[],types:new Set});let P=R.get(S),g=Array.isArray(N)?"array":typeof N;if(P.types.add(g),typeof N==="string")P.lengths.push(N.length);else if(N!==null&&N!==void 0)P.lengths.push(String(N).length)}}for(let[T,V]of R){if(V.lengths.length===0)continue;let S=Math.min(...V.lengths),N=Math.max(...V.lengths),P=Math.round(V.lengths.reduce((o,c)=>o+c,0)/V.lengths.length),g="string";if(V.types.has("number")&&V.types.size===1)g="number";else if(V.types.has("boolean")&&V.types.size===1)g="boolean";else if(V.types.has("array"))g="array";else if(V.types.has("object")&&!V.types.has("string"))g="object";O.set(T,{minLength:S,maxLength:N,avgLength:P,type:g})}q=O,Z=!0},B=()=>Z,_=(F)=>{let O=F.avgLength;if(J&&F.minLength!==F.maxLength){if(O=Math.floor(Math.random()*(F.maxLength-F.minLength+1)+F.minLength),Math.random()<0.3)O=Math.max(1,O+Math.floor(Math.random()*3)-1)}return $.repeat(Math.max(1,O))},L=(F)=>{if(X)return{...X(F),["_isPlaceholder"]:!0};let O={id:`__placeholder_${G++}`,["_isPlaceholder"]:!0,_index:F};if(!q||q.size===0)return O.label=$.repeat(12),O;for(let[R,A]of q)switch(A.type){case"string":O[R]=_(A);break;case"number":O[R]=0;break;case"boolean":O[R]=!1;break;case"array":O[R]=[];break;case"object":O[R]={};break;default:O[R]=_(A)}return O};return{analyzeStructure:U,hasAnalyzedStructure:B,generate:L,generateRange:(F,O)=>{let R=[];for(let A=F;A<=O;A++)R.push(L(A));return R},isPlaceholder:(F)=>{if(!F||typeof F!=="object")return!1;return F._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{q=null,Z=!1,G=0}}},z2=(j)=>{if(!j||typeof j!=="object")return!1;return j._isPlaceholder===!0},Lj=(j)=>{return j.filter((Q)=>!z2(Q))};var B4=50,Xj=(j={})=>{let{adapter:Q,initialItems:$,initialTotal:J,storage:K,placeholder:X,pageSize:q=B4,onStateChange:Z,onItemsLoaded:G,onItemsEvicted:U}=j,B=Jj({...K,onEvict:(v,f)=>{U?.(v),A()}}),_=null,L=()=>{if(!_)_=Qj(X);return _},z=new Map,D=!1,W,M=!0,F,O=[],R=new Map,A=()=>{Z?.(e())},T=()=>{z.clear();let v=B.getLoadedRanges();for(let f of v)for(let n=f.start;n<=f.end;n++){let $2=B.get(n);if($2&&!z2($2))z.set($2.id,n)}},V=(v,f)=>{if(!z2(f))z.set(f.id,v)},S=(v)=>{z.delete(v)},N=(v,f)=>{return`${v}-${f}`},P=()=>B.getTotal(),g=()=>B.getCachedCount(),o=()=>D,c=()=>M,e=()=>({total:B.getTotal(),cached:B.getCachedCount(),isLoading:D,pendingRanges:O,error:W,hasMore:M,cursor:F}),j2=()=>B,H=()=>L(),w=(v)=>{let f=B.get(v);if(f!==void 0)return f;if(v>=0&&v<B.getTotal())return L().generate(v);return},p=(v)=>{let f=z.get(v);if(f===void 0)return;return B.get(f)},u=(v)=>{return z.get(v)??-1},b=(v)=>{let f=B.get(v);return f!==void 0&&!z2(f)},C=(v,f)=>{let n=[],$2=B.getTotal(),l=0,X2=0;B.touchChunksForRange(v,Math.min(f,$2-1));for(let K2=v;K2<=f&&K2<$2;K2++){let E2=B.get(K2);if(E2!==void 0)n.push(E2),l++;else n.push(L().generate(K2)),X2++}return n},h=(v)=>{B.setTotal(v),M=B.getCachedCount()<v,A()},m=(v,f=0,n)=>{if(_&&!_.hasAnalyzedStructure()&&v.length>0)_.analyzeStructure(v);for(let $2=0;$2<v.length;$2++){let l=v[$2];if(l!==void 0){let X2=f+$2;B.set(X2,l),V(X2,l)}}if(n!==void 0)B.setTotal(n);else if(f+v.length>B.getTotal())B.setTotal(f+v.length);M=B.getCachedCount()<B.getTotal(),G?.(v,f,B.getTotal()),A()},s=(v,f)=>{let n=z.get(v);if(n===void 0)return!1;let $2=B.get(n);if(!$2)return!1;let l={...$2,...f};if(B.set(n,l),f.id!==void 0&&f.id!==v)S(v),V(n,l);return A(),!0},r=(v)=>{let f=z.get(v);if(f===void 0)return!1;B.delete(f),S(v);let n=B.getTotal();if(n>0)B.setTotal(n-1);return A(),!0},q2=async(v,f)=>{if(!Q)return;let n=N(v,f);if(R.has(n))return;let $2=B.getLoadedRanges(),l=u2({start:v,end:f},$2,B.chunkSize);if(l.length===0)return;let X2=B.chunkSize,K2=[];for(let U2 of l){let Y2=Math.floor(U2.start/X2),_2=Math.floor(U2.end/X2);for(let B2=Y2;B2<=_2;B2++){let G2=B2*X2,D2=G2+X2-1,w2=N(G2,D2);if(!K2.some((L2)=>L2.start===G2)&&!R.has(w2))K2.push({start:G2,end:D2})}}let E2=[];for(let U2 of l){let Y2=Math.floor(U2.start/X2),_2=Math.floor(U2.end/X2);for(let B2=Y2;B2<=_2;B2++){let G2=B2*X2,D2=G2+X2-1,w2=N(G2,D2);if(R.has(w2)){let L2=R.get(w2);if(!E2.includes(L2))E2.push(L2)}}}for(let U2 of K2){let Y2=N(U2.start,U2.end),_2=(async()=>{O.push(U2),D=!0,W=void 0,A();try{let B2=U2.end-U2.start+1,G2={offset:U2.start,limit:B2,cursor:void 0},D2=await Q.read(G2);if(m(D2.items,U2.start,D2.total),D2.cursor)F=D2.cursor;if(D2.hasMore!==void 0)M=D2.hasMore;else if(D2.total!==void 0)M=B.getCachedCount()<D2.total}catch(B2){W=B2 instanceof Error?B2:Error(String(B2))}finally{R.delete(Y2),O=O.filter((B2)=>B2.start!==U2.start||B2.end!==U2.end),D=R.size>0,A()}})();R.set(Y2,_2),E2.push(_2)}await Promise.all(E2)},Z2=async(v,f)=>{if(B.isRangeLoaded(v,f))return;await q2(v,f)},k=async()=>{if(!Q)return;await q2(0,q-1)},d=async()=>{if(!Q||D||!M)return!1;let v=B.getCachedCount(),f=B.getTotal(),n=v,$2=Math.min(n+q-1,f>0?f-1:n+q-1);if(n>=f&&f>0)return M=!1,!1;return await q2(n,$2),B.getCachedCount()>v},x=async()=>{if(B.clear(),z.clear(),_)_.clear();F=void 0,M=!0,W=void 0,A(),await k()},J2=(v,f)=>{if(B.evictDistant(v,f)>0)T()},i=()=>{B.clear(),z.clear(),F=void 0,W=void 0,O=[],D=!1,A()},Q2=()=>{if(B.reset(),z.clear(),_)_.clear();F=void 0,M=!0,W=void 0,O=[],D=!1,A()};if($&&$.length>0)m($,0,J??$.length);else if(J!==void 0)B.setTotal(J);return{getState:e,getTotal:P,getCached:g,getIsLoading:o,getHasMore:c,getStorage:j2,getPlaceholders:H,getItem:w,getItemById:p,getIndexById:u,isItemLoaded:b,getItemsInRange:C,setTotal:h,setItems:m,updateItem:s,removeItem:r,loadRange:q2,ensureRange:Z2,loadInitial:k,loadMore:d,reload:x,evictDistant:J2,clear:i,reset:Q2}};var Oj=(j,Q,$,J,K,X)=>{if(J===0||Q===0)return X.start=0,X.end=-1,X;let q=$.indexAtOffset(j),Z=$.indexAtOffset(j+Q);if(Z<J-1)Z++;return X.start=Math.max(0,q),X.end=Math.min(J-1,Math.max(0,Z)),X},zj=(j,Q,$,J)=>{if($===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-Q),J.end=Math.min($-1,j.end+Q),J},JJ=(j,Q,$,J,K,X)=>{if(J===0)return 0;let q=Math.max(0,Math.min(j,J-1)),Z=Q.getOffset(q),G=Q.getHeight(q),U=Q.getTotalHeight(),B=Math.max(0,U-$),_;switch(X){case"center":_=Z-$/2+G/2;break;case"end":_=Z-$+G;break;case"start":default:_=Z;break}return Math.max(0,Math.min(_,B))},$J=(j,Q,$)=>{if($&&$.isCompressed)return $.virtualHeight;return Q.getTotalHeight()},QJ=(j,Q)=>{return Q.getTotalHeight()},XJ=(j,Q)=>{return Q.getOffset(j)},qJ=(j,Q,$)=>{let J=Math.max(0,Q-$);return Math.max(0,Math.min(j,J))};var bj=(j,Q,$,J,K,X=Oj)=>{return X(j.scrollTop,j.containerHeight,Q,$,K,j.visibleRange),zj(j.visibleRange,J,$,j.renderRange),j.totalHeight=K.virtualHeight,j.actualHeight=K.actualHeight,j.isCompressed=K.isCompressed,j.compressionRatio=K.ratio,j},b2=(j,Q,$,J,K="start",X,q=JJ)=>{return q(j,Q,$,J,X,K)},KJ=(j,Q)=>{return j.start===Q.start&&j.end===Q.end},YJ=(j,Q)=>{return j>=Q.start&&j<=Q.end},ZJ=(j)=>{if(j.end<j.start)return 0;return j.end-j.start+1};var BJ=(j,Q)=>{let $=[],J=[];for(let K=j.start;K<=j.end;K++)if(K<Q.start||K>Q.end)J.push(K);for(let K=Q.start;K<=Q.end;K++)if(K<j.start||K>j.end)$.push(K);return{add:$,remove:J}};t2();var UJ=(j)=>{let{adapter:Q,loading:$}=j,J=$?.cancelThreshold??mj,K=$?.preloadThreshold??dj,X=$?.preloadAhead??cj;return{name:"withAsync",priority:20,methods:["reload"],setup(q){let{emitter:Z}=q,G=q.config.reverse,U=q.config.overscan,B=Xj({adapter:Q,pageSize:p2,onStateChange:()=>{if(q.state.isInitialized)q.heightCache.rebuild(q.getVirtualTotal()),q.updateCompressionMode(),q.state.viewportState=bj(q.state.viewportState,q.heightCache,q.getVirtualTotal(),U,q.getCachedCompression()),q.updateContentSize(q.state.viewportState.totalHeight),q.renderIfNeeded()},onItemsLoaded:(F,O,R)=>{if(q.state.isInitialized)q.heightCache.rebuild(q.getVirtualTotal()),q.forceRender(),Z.emit("load:end",{items:F,total:R})}});q.replaceDataManager(B);let _=null,L=null,z=0,D=()=>{if(L){let F=L;L=null,q.dataManager.ensureRange(F.start,F.end).catch((O)=>{Z.emit("error",{error:O,context:"ensureRange"})})}};q.afterScroll.push((F,O)=>{if(q.state.isDestroyed)return;let R=q.scrollController.getVelocity(),T=q.scrollController.isTracking()&&R<=J;if(L&&z>J&&R<=J){let N=L;L=null,q.dataManager.ensureRange(N.start,N.end).catch((P)=>{Z.emit("error",{error:P,context:"ensureRange"})})}if(z=R,T&&!q.dataManager.getIsLoading()&&q.dataManager.getHasMore()){if(G){if(F<Aj)Z.emit("load:start",{offset:q.dataManager.getCached(),limit:p2}),q.dataManager.loadMore().catch((N)=>{Z.emit("error",{error:N,context:"loadMore"})})}else if(q.state.viewportState.totalHeight-F-q.state.viewportState.containerHeight<Aj)Z.emit("load:start",{offset:q.dataManager.getCached(),limit:p2}),q.dataManager.loadMore().catch((P)=>{Z.emit("error",{error:P,context:"loadMore"})})}let{renderRange:V}=q.state.viewportState;if(!_||V.start!==_.start||V.end!==_.end)if(_={start:V.start,end:V.end},T){L=null;let{start:N,end:P}=V,g=q.getVirtualTotal();if(R>K)if(O==="down")P=Math.min(V.end+X,g-1);else N=Math.max(V.start-X,0);q.dataManager.ensureRange(N,P).catch((o)=>{Z.emit("error",{error:o,context:"ensureRange"})})}else L={start:V.start,end:V.end}});let W=200,M=null;q.afterScroll.push((F,O)=>{if(M!==null)clearTimeout(M);M=setTimeout(()=>{M=null,D()},W)}),q.destroyHandlers.push(()=>{if(M!==null)clearTimeout(M),M=null}),Z.on("load:start",()=>{q.dom.root.setAttribute("aria-busy","true")}),Z.on("load:end",()=>{q.dom.root.removeAttribute("aria-busy")}),q.methods.set("reload",async()=>{await q.dataManager.reload()}),Z.emit("load:start",{offset:0,limit:p2}),q.dataManager.loadInitial().catch((F)=>{Z.emit("error",{error:F,context:"loadInitial"})})}}};var DJ=()=>{let j=null;return{name:"withPage",priority:5,setup(Q){let{dom:$,state:J,config:K,emitter:X}=Q;$.root.style.overflow="visible",$.root.style.height="auto",$.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),Q.disableViewportResize(),Q.setScrollTarget(window),Q.setScrollFns(()=>{let U=$.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-U.left);else return Math.max(0,-U.top)},(U)=>{let B=$.viewport.getBoundingClientRect();if(K.horizontal){let _=B.left+window.scrollX;window.scrollTo(_+U,window.scrollY)}else{let _=B.top+window.scrollY;window.scrollTo(window.scrollX,_+U)}}),Q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),J.viewportState.containerHeight=window.innerHeight;let{innerHeight:q,innerWidth:Z}=window,G=()=>{let{innerWidth:U,innerHeight:B}=window,_=K.horizontal?U:B,L=K.horizontal?Z:q;if(Math.abs(_-L)<=1)return;q=B,Z=U,J.viewportState.containerHeight=B,X.emit("resize",{width:U,height:B});for(let z=0;z<Q.resizeHandlers.length;z++)Q.resizeHandlers[z](U,B);Q.renderIfNeeded()};window.addEventListener("resize",G,{passive:!0}),j=()=>{window.removeEventListener("resize",G)},Q.destroyHandlers.push(j)},destroy(){if(j)j(),j=null}}};var Pj=(j,Q)=>{let $=0,J=j.length-1;while($<J){let K=$+J+1>>>1;if(j[K].headerLayoutIndex<=Q)$=K;else J=K-1}return $},WJ=(j,Q)=>{let $=0,J=j.length-1;while($<J){let K=$+J+1>>>1;if(j[K].firstDataIndex<=Q)$=K;else J=K-1}return $},NJ=(j,Q)=>{if(j===0)return[];let $=[],J=Q(0),K=0,X=0;for(let q=1;q<j;q++){let Z=Q(q);if(Z!==J){let G=q-K;$.push({key:J,groupIndex:$.length,headerLayoutIndex:X,firstDataIndex:K,count:G}),X=X+1+G,J=Z,K=q}}return $.push({key:J,groupIndex:$.length,headerLayoutIndex:X,firstDataIndex:K,count:j-K}),$},x2=(j,Q)=>{if(j.length===0||Q.length===0)return[];let $=j.length+Q.length,J=Array($),K=0;for(let X of Q){J[K]={id:`__group_header_${X.groupIndex}`,__groupHeader:!0,groupKey:X.key,groupIndex:X.groupIndex},K++;for(let q=0;q<X.count;q++)J[K]=j[X.firstDataIndex+q],K++}return J},h2=(j,Q)=>{let $=typeof Q==="number"?(J)=>Q:Q;return(J)=>{let K=j.getEntry(J);if(K.type==="header")return j.getHeaderHeight(K.group.groupIndex);return $(K.dataIndex)}},qj=(j,Q)=>{let $=NJ(j,Q.getGroupForIndex),J=j+$.length,K=Q.headerHeight;return{get totalEntries(){return J},get groupCount(){return $.length},get groups(){return $},getEntry:(L)=>{if($.length===0)return{type:"item",dataIndex:L,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let z=Pj($,L),D=$[z];if(L===D.headerLayoutIndex)return{type:"header",group:D};let W=L-D.headerLayoutIndex-1;return{type:"item",dataIndex:D.firstDataIndex+W,group:D}},layoutToDataIndex:(L)=>{if($.length===0)return L;let z=Pj($,L),D=$[z];if(L===D.headerLayoutIndex)return-1;let W=L-D.headerLayoutIndex-1;return D.firstDataIndex+W},dataToLayoutIndex:(L)=>{if($.length===0)return L;let z=WJ($,L),D=$[z],W=L-D.firstDataIndex;return D.headerLayoutIndex+1+W},getGroupAtLayoutIndex:(L)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let z=Pj($,L);return $[z]},getGroupAtDataIndex:(L)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let z=WJ($,L);return $[z]},getHeaderHeight:typeof K==="number"?(L)=>K:(L)=>{let z=$[L];if(!z)return 0;return K(z.key,L)},rebuild:(L)=>{$=NJ(L,Q.getGroupForIndex),J=L+$.length}}};var Kj=(j,Q,$,J,K)=>{let X=document.createElement("div");X.className=`${K}-sticky-header`,X.setAttribute("role","presentation"),X.setAttribute("aria-hidden","true"),X.style.position="absolute",X.style.top="0",X.style.left="0",X.style.right="0",X.style.zIndex="5",X.style.pointerEvents="none",X.style.willChange="transform",X.style.overflow="hidden",j.insertBefore(X,j.firstChild);let q=-1,Z=!1,G=0,U=(W)=>{if(W===q)return;q=W;let M=Q.groups;if(W<0||W>=M.length){X.textContent="";return}let F=M[W],O=J.headerTemplate(F.key,F.groupIndex),R=Q.getHeaderHeight(W);if(X.style.height=`${R}px`,typeof O==="string")X.innerHTML=O;else X.replaceChildren(O)},B=(W)=>{let M=Q.groups;if(M.length===0){L();return}let F=0;for(let V=M.length-1;V>=0;V--)if($.getOffset(M[V].headerLayoutIndex)<=W){F=V;break}let O=$.getOffset(M[0].headerLayoutIndex);if(W<O){L();return}if(!Z)_();U(F);let R=Q.getHeaderHeight(F),A=0,T=F+1;if(T<M.length){let S=$.getOffset(M[T].headerLayoutIndex)-W;if(S<R)A=S-R}if(A!==G)G=A,X.style.transform=A===0?"":`translateY(${Math.round(A)}px)`},_=()=>{if(Z)return;Z=!0,X.style.display=""},L=()=>{if(!Z)return;Z=!1,X.style.display="none",q=-1,G=0,X.style.transform=""},z=()=>{let W=q;if(q=-1,W>=0)U(W)},D=()=>{X.remove(),q=-1,Z=!1};return X.style.display="none",{update:B,refresh:z,show:_,hide:L,destroy:D}};var _J=(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 Q=null,$=null,J=[],K=[];return{name:"withSections",priority:10,setup(X){let{dom:q,config:Z,rawConfig:G}=X,{classPrefix:U}=Z;if(Z.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");let _=G.item.height;J=G.items?[...G.items]:[];let L=J.length,z={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};Q=qj(L,z),K=x2(J,Q.groups);let D=h2(Q,_);X.setHeightConfig(D),X.rebuildHeightCache(K.length),X.dataManager.setItems(K,0,K.length);let W=G.item.template,{headerTemplate:M}=j,F=(N,P,g)=>{if(P2(N))return M(N.groupKey,N.groupIndex);return W(N,P,g)},O=X.methods.get("_getGridLayout"),R=X.methods.get("_replaceGridRenderer"),A=X.methods.get("_updateGridLayoutForGroups");if(O&&R){if(A)A((o)=>{let c=K[o];return!!(c&&P2(c))});let{createGridRenderer:N}=(Yj(),dJ(VJ)),P=O(),g=N(q.items,F,X.heightCache,P,U,X.getContainerWidth(),()=>X.dataManager.getTotal(),Z.ariaIdPrefix);R(g)}else X.replaceTemplate(F);if(q.root.classList.add(`${U}--grouped`),j.sticky!==!1){$=Kj(q.root,Q,X.heightCache,{...z,sticky:z.sticky??!1},U);let N=$;X.afterScroll.push((P,g)=>{N.update(P)}),$.update(X.scrollController.getScrollTop())}let T=()=>{if(!Q)return;Q.rebuild(J.length),K=x2(J,Q.groups);let N=h2(Q,_);if(X.setHeightConfig(N),X.rebuildHeightCache(K.length),X.dataManager.setItems(K,0,K.length),$)$.refresh()};X.methods.set("setItems",(N)=>{J=[...N],T()}),X.methods.set("appendItems",(N)=>{J=[...J,...N],T()}),X.methods.set("prependItems",(N)=>{J=[...N,...J],T()}),X.methods.set("removeItem",(N)=>{J=J.filter((P)=>P.id!==N),T()});let{animateScroll:V,cancelScroll:S}=W4(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(N,P)=>{let g=Q.dataToLayoutIndex(N),{align:o,behavior:c,duration:e}=N4(P),j2=X.dataManager.getTotal(),H=b2(g,X.heightCache,X.state.viewportState.containerHeight,j2,o,X.getCachedCompression());if(c==="smooth")V(X.scrollController.getScrollTop(),H,e);else S(),X.scrollController.scrollTo(H)}),X.methods.set("_getItems",()=>J),X.methods.set("_getTotal",()=>J.length),X.destroyHandlers.push(()=>{if(F2!==null)cancelAnimationFrame(F2),F2=null;if($)$.destroy(),$=null;q.root.classList.remove(`${U}--grouped`)})},destroy(){if($)$.destroy(),$=null}}},yj=300,D4=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,F2=null,W4=(j,Q)=>{let $=()=>{if(F2!==null)cancelAnimationFrame(F2),F2=null};return{animateScroll:(K,X,q)=>{if($(),Math.abs(X-K)<1){j.scrollTo(X);return}let Z=performance.now(),G=(U)=>{let B=U-Z,_=Math.min(B/q,1),L=K+(X-K)*D4(_);if(j.scrollTo(L),Q(),_<1)F2=requestAnimationFrame(G);else F2=null};F2=requestAnimationFrame(G)},cancelScroll:$}},N4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:yj};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??yj};return{align:"start",behavior:"auto",duration:yj}};var Zj=(j)=>{let Q=Math.max(1,Math.floor(j.columns)),$=j.gap??0,J=j.isHeaderFn,K={row:0,col:0},X=(D)=>{if(D<=0)return 0;if(!J)return Math.ceil(D/Q);let W=0,M=0,F=0;for(let O=0;O<D;O++)if(J(O)){if(F++,M>0)W++,M=0;W++,M=0}else if(M++,M>=Q)W++,M=0;if(M>0)W++;return W},q=(D)=>{return K.row=Z(D),K.col=G(D),K},Z=(D)=>{if(!J)return Math.floor(D/Q);let W=0,M=0;for(let F=0;F<=D;F++)if(J(F)){if(M>0)W++,M=0;if(F===D)return W;W++,M=0}else{if(F===D)return W;if(M++,M>=Q)W++,M=0}return console.warn(`⚠️ getRow(${D}) fell through - returning ${W}`),W},G=(D)=>{if(!J)return D%Q;if(J(D))return 0;let W=0;for(let M=0;M<=D;M++)if(J(M))W=0;else{if(M===D)return W;if(W++,W>=Q)W=0}return W},U=(D,W,M)=>{if(M<=0)return{start:0,end:-1};if(!J){let T=Math.max(0,D*Q),V=Math.min(M-1,(W+1)*Q-1);return{start:T,end:V}}let F=-1,O=-1,R=0,A=0;for(let T=0;T<M;T++){if(J(T)){if(A>0)R++,A=0;if(R>=D&&R<=W){if(F===-1)F=T;O=T}R++,A=0}else{if(R>=D&&R<=W){if(F===-1)F=T;O=T}if(A++,A>=Q)R++,A=0}if(R>W&&A===0)break}if(F===-1)return{start:0,end:-1};return{start:F,end:O}},B=(D,W,M)=>{if(W<0||W>=Q)return-1;let F=D*Q+W;if(F<0||F>=M)return-1;return F},_=(D)=>{let W=(Q-1)*$;return Math.max(0,(D-W)/Q)};return{get columns(){return Q},get gap(){return $},update:(D)=>{if(D.columns!==void 0)Q=Math.max(1,Math.floor(D.columns));if(D.gap!==void 0)$=D.gap;if(D.isHeaderFn!==void 0)J=D.isHeaderFn},getTotalRows:X,getPosition:q,getRow:Z,getCol:G,getItemRange:U,getItemIndex:B,getColumnWidth:_,getColumnOffset:(D,W)=>{let M=_(W);return D*(M+$)}}};Yj();var GJ=(j)=>{if(!j.columns||j.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let Q=null,$=null;return{name:"withGrid",priority:10,setup(J){let{dom:K,emitter:X,config:q,rawConfig:Z}=J,{classPrefix:G}=q;if(q.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(q.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let U=Z.items?.some((A)=>A.__groupHeader===!0),B={columns:j.columns,gap:j.gap??0};if(U)B.isHeaderFn=(A)=>{let T=J.dataManager.getItem(A);return!!(T&&T.__groupHeader===!0)};Q=Zj(B);let _=Q.gap;J.setVirtualTotalFn(()=>{let A=J.dataManager.getTotal();return Q.getTotalRows(A)});let L=Z.item,z=q.horizontal?L.width:L.height,D={containerWidth:J.getContainerWidth(),columns:Q.columns,gap:Q.gap};if(typeof z==="function")J.setHeightConfig((A)=>{let T=D.containerWidth-2,V=(D.columns-1)*D.gap,S=(T-V)/D.columns,N={containerWidth:D.containerWidth,columns:D.columns,gap:D.gap,columnWidth:S,row:Q.getRow(A),column:Q.getCol(A),totalRows:Q.getTotalRows(J.dataManager.getTotal()),totalColumns:D.columns};return z(A,N)+D.gap});else if(_>0)J.setHeightConfig(z+_);J.rebuildHeightCache(),K.root.classList.add(`${G}--grid`);let W=J.getContainerWidth(),M=Z.item.template,F=()=>{$=g2(K.items,M,J.heightCache,Q,G,W,()=>J.dataManager.getTotal(),q.ariaIdPrefix),J.replaceRenderer($)};F(),J.methods.set("_getGridLayout",()=>Q),J.methods.set("_getGridConfig",()=>B),J.methods.set("_replaceGridRenderer",(A)=>{$=A}),J.methods.set("_updateGridLayoutForGroups",(A)=>{Q.update({isHeaderFn:A});let T=J.dataManager.getTotal(),V=0;for(let S=0;S<T;S++)if(Q.getCol(S)===0){let N=J.heightCache.getHeight(S);V+=N}J.heightCache.getTotalHeight=()=>V,J.dom.content.style.height=`${V}px`,F()}),J.methods.set("updateGrid",(A)=>{if(A.columns!==void 0){if(!Number.isInteger(A.columns)||A.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");B.columns=A.columns}if(A.gap!==void 0){if(A.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");B.gap=A.gap}if(Q)Q.update(B);let T=J.getContainerWidth();if(D.containerWidth=T,D.columns=B.columns,D.gap=B.gap??0,$)$.updateContainerWidth(T);J.rebuildHeightCache(),J.updateContentSize(J.heightCache.getTotalHeight()),J.updateCompressionMode();for(let V=0;V<J.contentSizeHandlers.length;V++)J.contentSizeHandlers[V]();if($)$.clear();J.forceRender()});let O=()=>{if(J.state.isDestroyed)return;let A=J.scrollController.getScrollTop(),T=J.state.viewportState.containerHeight,V=J.getVirtualTotal(),S={start:0,end:0};if(V===0||T===0)S.start=0,S.end=0;else{S.start=Math.max(0,J.heightCache.indexAtOffset(A));let w=J.heightCache.indexAtOffset(A+T);if(w<V-1)w++;S.end=Math.min(V-1,Math.max(0,w))}let N=q.overscan??3,P={start:Math.max(0,S.start-N),end:Math.min(V-1,S.end+N)};J.state.viewportState.scrollTop=A,J.state.viewportState.visibleRange=S,J.state.viewportState.renderRange=P;let g=J.state.lastRenderRange,o=J.state.viewportState.isCompressed;if(P.start===g.start&&P.end===g.end){if(o)$.updatePositions(J.getCompressionContext());return}let c=J.dataManager.getTotal(),e=Q.getItemRange(P.start,P.end,c),j2=J.dataManager.getItemsInRange(e.start,e.end),H=o?J.getCompressionContext():void 0;$.render(j2,e,new Set,-1,H),J.state.lastRenderRange={...P},X.emit("range:change",{range:P})},R=()=>{if(J.state.isDestroyed)return;J.state.lastRenderRange={start:-1,end:-1},O()};if(J.setRenderFns(O,R),J.resizeHandlers.push((A,T)=>{if($)$.updateContainerWidth(A)}),J.methods.set("scrollToIndex",(A,T)=>{let V=Math.floor(A/j.columns),{align:S,behavior:N}=V4(T),P=J.dataManager.getState(),g=Q.getTotalRows(P.total),o=Math.max(0,Math.min(V,g-1)),c=b2(o,J.heightCache,J.state.viewportState.containerHeight,g,S,J.getCachedCompression());if(N==="smooth")J.scrollController.scrollTo(c);else J.scrollController.scrollTo(c)}),!J.methods.has("_getTotal"))J.methods.set("_getTotal",()=>J.dataManager.getTotal());J.destroyHandlers.push(()=>{if($)$.destroy(),$=null;K.root.classList.remove(`${G}--grid`)})},destroy(){if($)$.destroy(),$=null}}},Hj=300,V4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:Hj};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??Hj};return{align:"start",behavior:"auto",duration:Hj}};Yj();var Bj=(j)=>({selected:new Set(j??[]),focusedIndex:-1}),m2=(j,Q,$)=>{if($==="none")return j;let J=new Set(j.selected);if($==="single"){if(J.clear(),Q.length>0)J.add(Q[0])}else for(let K of Q)J.add(K);return{...j,selected:J}},d2=(j,Q)=>{let $=new Set(j.selected);for(let J of Q)$.delete(J);return{...j,selected:$}},T2=(j,Q,$)=>{if($==="none")return j;if(j.selected.has(Q))return d2(j,[Q]);else return m2(j,[Q],$)},Uj=(j,Q,$)=>{if($!=="multiple")return j;return{...j,selected:new Set(Q.map((J)=>J.id))}},Dj=(j)=>({...j,selected:new Set}),Rj=(j,Q)=>{return j.focusedIndex=Q,j},kj=(j,Q,$=!0)=>{if(Q===0)return j;let J=j.focusedIndex-1;if(J<0)J=$?Q-1:0;return j.focusedIndex=J,j},Tj=(j,Q,$=!0)=>{if(Q===0)return j;let J=j.focusedIndex+1;if(J>=Q)J=$?0:Q-1;return j.focusedIndex=J,j},Cj=(j,Q)=>{if(Q===0)return j;return j.focusedIndex=0,j},Sj=(j,Q)=>{if(Q===0)return j;return j.focusedIndex=Q-1,j};var MJ=(j,Q)=>{return j.selected.has(Q)},C2=(j)=>{return Array.from(j.selected)},S2=(j,Q)=>{let $=[];for(let J of j.selected){let K=Q(J);if(K)$.push(K)}return $};var EJ=(j)=>{let Q=j?.mode??"single",$=j?.initial,J=Bj($),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(X){let{dom:q,emitter:Z,config:G}=X,{classPrefix:U,ariaIdPrefix:B}=G;if(Q==="none"){X.methods.set("select",()=>{}),X.methods.set("deselect",()=>{}),X.methods.set("toggleSelect",()=>{}),X.methods.set("selectAll",()=>{}),X.methods.set("clearSelection",()=>{}),X.methods.set("getSelected",()=>[]),X.methods.set("getSelectedItems",()=>[]),X.methods.set("setSelectionMode",()=>{});return}let{renderIfNeeded:_,forceRender:L}=X.getRenderFns(),z=()=>{X.dom.items.querySelectorAll("[data-index]").forEach((R)=>{let A=R,T=A.dataset.id;if(T!==void 0){let V=/^\d+$/.test(T)?parseInt(T,10):T,S=J.selected.has(V),P=parseInt(A.dataset.index??"-1",10)===J.focusedIndex;A.classList.toggle(`${U}-item--selected`,S),A.classList.toggle(`${U}-item--focused`,P),A.ariaSelected=S?"true":"false"}})},D=()=>{if(X.state.isDestroyed)return;_(),z()},W=()=>{if(X.state.isDestroyed)return;L(),z()};X.setRenderFns(D,W);let M=()=>{z(),Z.emit("selection:change",{selected:C2(J),items:S2(J,(O)=>X.dataManager.getItemById(O))})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${U}-live-region`,K.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(K);let F=K;Z.on("selection:change",({selected:O})=>{let R=O.length;if(R===0)F.textContent="";else if(R===1)F.textContent="1 item selected";else F.textContent=`${R} items selected`}),X.clickHandlers.push((O)=>{if(X.state.isDestroyed)return;let A=O.target.closest("[data-index]");if(!A)return;let T=parseInt(A.dataset.index??"-1",10);if(T<0)return;let V=X.dataManager.getItem(T);if(!V)return;Z.emit("item:click",{item:V,index:T,event:O}),J=Rj(J,T),q.root.setAttribute("aria-activedescendant",`${B}-item-${T}`),J=T2(J,V.id,Q),M()}),X.keydownHandlers.push((O)=>{if(X.state.isDestroyed)return;let R=X.dataManager.getTotal(),A=J.focusedIndex,T=!1,V=!1,S=J;switch(O.key){case"ArrowUp":S=kj(J,R),T=!0,V=!0;break;case"ArrowDown":S=Tj(J,R),T=!0,V=!0;break;case"Home":S=Cj(J,R),T=!0,V=!0;break;case"End":S=Sj(J,R),T=!0,V=!0;break;case" ":case"Enter":if(J.focusedIndex>=0){let N=X.dataManager.getItem(J.focusedIndex);if(N)S=T2(J,N.id,Q);T=!0}break}if(T){O.preventDefault(),J=S;let N=J.focusedIndex;if(N>=0){let P=X.dataManager.getState(),g=b2(N,X.heightCache,X.state.viewportState.containerHeight,P.total,"center",X.getCachedCompression());X.scrollController.scrollTo(g),q.root.setAttribute("aria-activedescendant",`${B}-item-${N}`)}else q.root.removeAttribute("aria-activedescendant");if(V){let{selected:P}=J;if(A>=0&&A!==N){let g=X.dataManager.getItem(A);if(g)X.renderer.updateItemClasses(A,P.has(g.id),!1)}if(N>=0){let g=X.dataManager.getItem(N);if(g)X.renderer.updateItemClasses(N,P.has(g.id),!0)}}else W(),Z.emit("selection:change",{selected:C2(J),items:S2(J,(P)=>X.dataManager.getItemById(P))})}}),X.methods.set("select",(...O)=>{J=m2(J,O,Q),M()}),X.methods.set("deselect",(...O)=>{J=d2(J,O),M()}),X.methods.set("toggleSelect",(O)=>{J=T2(J,O,Q),M()}),X.methods.set("selectAll",()=>{if(Q!=="multiple")return;let O=X.getAllLoadedItems();J=Uj(J,O,Q),M()}),X.methods.set("clearSelection",()=>{J=Dj(J);let{renderRange:O,isCompressed:R}=X.state.viewportState,A=X.getItemsForRange(O),T=R?X.getCompressionContext():void 0;X.renderer.render(A,O,J.selected,J.focusedIndex,T),Z.emit("selection:change",{selected:[],items:[]})}),X.methods.set("getSelected",()=>{return C2(J)}),X.methods.set("getSelectedItems",()=>{return S2(J,(O)=>X.dataManager.getItemById(O))}),X.destroyHandlers.push(()=>{if(F&&F.parentNode)F.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var AJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(j){j.methods.set("getScrollSnapshot",()=>{let Q=j.scrollController.getScrollTop(),$=j.getCachedCompression(),J=j.getVirtualTotal(),K=j.methods.get("getSelected"),X=K&&K().length>0?K():void 0;if(J===0){let U={index:0,offsetInItem:0};if(X)U.selectedIds=X;return U}let q,Z;if($.isCompressed){let B=Q/$.virtualHeight*J;q=Math.max(0,Math.min(Math.floor(B),J-1)),Z=(B-q)*j.heightCache.getHeight(q)}else q=j.heightCache.indexAtOffset(Q),Z=Q-j.heightCache.getOffset(q);Z=Math.max(0,Z);let G={index:q,offsetInItem:Z};if(X)G.selectedIds=X;return G}),j.methods.set("restoreScroll",(Q)=>{let{index:$,offsetInItem:J,selectedIds:K}=Q,X=j.getCachedCompression(),q=j.getVirtualTotal();if(q===0)return;let Z=Math.max(0,Math.min($,q-1)),G;if(X.isCompressed){let B=j.heightCache.getHeight(Z),_=B>0?J/B:0;G=(Z+_)/q*X.virtualHeight}else G=j.heightCache.getOffset(Z)+J;let U=Math.max(0,X.virtualHeight-j.state.viewportState.containerHeight);if(G=Math.max(0,Math.min(G,U)),j.scrollController.scrollTo(G),K&&K.length>0){let B=j.methods.get("select");if(B)B(...K)}})}}};var FJ=()=>{let j={},Q=(Z,G)=>{if(!j[Z])j[Z]=new Set;return j[Z].add(G),()=>$(Z,G)},$=(Z,G)=>{j[Z]?.delete(G)};return{on:Q,off:$,emit:(Z,G)=>{j[Z]?.forEach((U)=>{try{U(G)}catch(B){console.error(`[vlist] Error in event handler for "${String(Z)}":`,B)}})},once:(Z,G)=>{let U=(B)=>{$(Z,U),G(B)};return Q(Z,U)},clear:(Z)=>{if(Z)delete j[Z];else for(let G in j)delete j[G]},listenerCount:(Z)=>{return j[Z]?.size??0}}};export{AJ as withSnapshots,EJ as withSelection,_J as withSections,ij as withScrollbar,jJ as withScale,DJ as withPage,GJ as withGrid,UJ as withAsync,gj as vlist,T2 as toggleSelection,Oj as simpleVisibleRange,m2 as selectItems,Uj as selectAll,KJ as rangesEqual,jj as rafThrottle,rj as needsScaling,$j as mergeRanges,MJ as isSelected,P2 as isSectionHeader,z2 as isPlaceholderItem,YJ as isInRange,S2 as getSelectedItems,C2 as getSelectedIds,M2 as getScaleState,oj as getScaleInfo,M2 as getScale,ZJ as getRangeCount,nj as getMaxItemsWithoutScaling,Lj as filterPlaceholders,BJ as diffRanges,d2 as deselectItems,Kj as createStickyHeader,Jj as createSparseStorage,Bj as createSelectionState,h2 as createSectionedHeightFn,qj as createSectionLayout,k2 as createScrollbar,ej as createScrollController,Qj as createPlaceholderManager,lj as createHeightCache,g2 as createGridRenderer,Zj as createGridLayout,FJ as createEmitter,Xj as createAsyncManager,Dj as clearSelection,qJ as clampScrollPosition,$J as calculateTotalHeight,b2 as calculateScrollToIndex,o2 as calculateScaledVisibleRange,i2 as calculateScaledScrollToIndex,sj as calculateScaledRenderRange,R2 as calculateScaledItemPosition,zj as calculateRenderRange,u2 as calculateMissingRanges,XJ as calculateItemOffset,aj as calculateIndexFromScrollPosition,QJ as calculateActualHeight,x2 as buildLayoutItems,O2 as MAX_VIRTUAL_HEIGHT};
|
|
1
|
+
var{defineProperty:Mj,getOwnPropertyNames:gJ,getOwnPropertyDescriptor:mJ}=Object,dJ=Object.prototype.hasOwnProperty;var pj=new WeakMap,cJ=(j)=>{var X=pj.get(j),$;if(X)return X;if(X=Mj({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")gJ(j).map((J)=>!dJ.call(X,J)&&Mj(X,J,{get:()=>j[J],enumerable:!($=mJ(j,J))||$.enumerable}));return pj.set(j,X),X};var lJ=(j,X)=>{for(var $ in X)Mj(j,$,{get:X[$],enumerable:!0,configurable:!0,set:(J)=>X[$]=()=>J})};var uj=(j,X)=>()=>(j&&(X=j(j=0)),X);var Ej=200,x2=50,gj=15,mj=2,dj=50,z2=16000000;var K4=(j,X)=>{let $=X;return{getOffset:(J)=>J*j,getHeight:(J)=>j,indexAtOffset:(J)=>{if($===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(J/j),$-1))},getTotalHeight:()=>$*j,getTotal:()=>$,rebuild:(J)=>{$=J},isVariable:()=>!1}},Y4=(j,X)=>{let $=X,J=new Float64Array(0),K=(q)=>{$=q,J=new Float64Array(q+1),J[0]=0;for(let Z=0;Z<q;Z++)J[Z+1]=J[Z]+j(Z)};K(X);let Q=(q)=>{if($===0)return 0;if(q<=0)return 0;if(q>=J[$])return $-1;let Z=0,_=$-1;while(Z<_){let U=Z+_+1>>>1;if(J[U]<=q)Z=U;else _=U-1}return Z};return{getOffset:(q)=>{if(q<=0)return 0;if(q>=$)return J[$];return J[q]},getHeight:(q)=>j(q),indexAtOffset:(q)=>Q(q),getTotalHeight:()=>J[$]??0,getTotal:()=>$,rebuild:(q)=>K(q),isVariable:()=>!0}},cj=(j,X)=>{if(typeof j==="number")return K4(j,X);return Y4(j,X)},Fj=(j,X,$,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.ceil($/j.getHeight(0));let K=0,Q=0,q=X;while(q<J&&Q<$)Q+=j.getHeight(q),K++,q++;return Math.max(1,K)},n2=(j,X,$)=>{if($===0)return 0;if(!j.isVariable())return Math.floor(X/j.getHeight(0));let J=0,K=0;for(let Q=$-1;Q>=0;Q--){let q=j.getHeight(Q);if(K+q>X)break;K+=q,J++}return Math.max(J,1)},Lj=(j,X,$)=>{if($===0)return 0;let J=Math.floor(X),K=X-J,Q=Math.max(0,Math.min(J,$-1));return j.getOffset(Q)+K*j.getHeight(Q)};var E2=(j,X)=>{let $=X.getTotalHeight(),J=$>z2,K=J?z2:$,Q=$>0?K/$:1;return{isCompressed:J,actualHeight:$,virtualHeight:K,ratio:Q}},o2=(j,X,$,J,K,Q)=>{if(J===0||X===0)return Q.start=0,Q.end=-1,Q;if(!K.isCompressed){let N=$.indexAtOffset(j),B=$.indexAtOffset(j+X);if(B<J-1)B++;return Q.start=Math.max(0,N),Q.end=Math.min(J-1,Math.max(0,B)),Q}let{virtualHeight:q}=K,_=j/q*J,U=Math.floor(_),D=Fj($,Math.max(0,U),X,J),L=Math.ceil(_)+D,y=q-X-j;if(y<=X&&y>=-1){let N=n2($,X,J),B=Math.max(0,J-N),W=Math.max(0,Math.min(1,1-y/X));U=Math.floor(U+(B-U)*W),L=y<=1?J-1:Math.min(J-1,U+D)}return Q.start=Math.max(0,U),Q.end=Math.min(J-1,Math.max(0,L)),Q},lj=(j,X,$,J)=>{if($===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min($-1,j.end+X),J},T2=(j,X,$,J,K,Q,q)=>{if(!Q.isCompressed||J===0)return $.getOffset(j);let{virtualHeight:Z}=Q,_=Z-K,U=_-X;if(U<=K&&U>=-1){if(X>=_-1){let V=$.getTotalHeight()-$.getOffset(j);return K-V}let y=n2($,K,J),N=Math.max(0,J-y),W=X/Z*J,A=Math.max(0,Math.min(1,1-U/K)),E=$.getOffset(j)-$.getOffset(N),H=$.getOffset(j)-Lj($,W,J);return H+(E-H)*A}let D=X/Z,L=$.getTotalHeight(),z=D*L;return $.getOffset(j)-z},i2=(j,X,$,J,K,Q="start")=>{if(J===0)return 0;let q;if(K.isCompressed){if(Q==="end"&&j===J-1)return Math.max(0,K.virtualHeight-$);q=j/J*K.virtualHeight}else q=X.getOffset(j);let Z=X.getHeight(j);switch(Q){case"center":q-=($-Z)/2;break;case"end":q-=$-Z;break}let _=K.virtualHeight-$;return Math.max(0,Math.min(q,_))},sj=(j,X,$,J)=>{if($===0)return 0;if(J.isCompressed){let K=j/J.virtualHeight;return Math.floor(K*$)}return X.indexAtOffset(j)},aj=(j,X)=>{if(typeof X==="number")return j*X>z2;return X.getTotalHeight()>z2},rj=(j)=>{if(j<=0)return 0;return Math.floor(z2/j)},nj=(j,X)=>{let $=E2(j,X);if(!$.isCompressed)return`No compression needed (${j} items, ${($.actualHeight/1e6).toFixed(2)}M px)`;return`Compressed to ${($.ratio*100).toFixed(1)}% (${j} items, ${($.actualHeight/1e6).toFixed(1)}M px → ${($.virtualHeight/1e6).toFixed(1)}M px virtual)`};var t2=()=>{};var P2=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};var _J={};lJ(_J,{createGridRenderer:()=>d2});var W4=(j=200)=>{let X=[];return{acquire:()=>{let Q=X.pop();if(Q)return Q;let q=document.createElement("div");return q.setAttribute("role","option"),q},release:(Q)=>{if(X.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"),X.push(Q)},clear:()=>{X.length=0}}},d2=(j,X,$,J,K,Q,q,Z)=>{let _=W4(),U=new Map,D=Q,L=!1,z=null,y=0,N="",B=(b)=>{if(z&&y===b)return z;return z=E2(b,$),y=b,z},W={selected:!1,focused:!1},A=(b,w)=>{return W.selected=b,W.focused=w,W},E=`${K}-item ${K}-grid-item`,H=`${K}-item--selected`,V=`${K}-item--focused`,O=(b,w)=>{if(typeof w==="string")b.innerHTML=w;else b.replaceChildren(w)},M=(b,w,h)=>{b.classList.toggle(H,w),b.classList.toggle(V,h)},R=(b,w)=>{let h=J.getRow(b);if(w){let d=w.totalItems,c=B(d);if(c.isCompressed)return T2(h,w.scrollTop,$,d,w.containerHeight,c,w.rangeStart)}return $.getOffset(h)},G=(b,w,h)=>{let d=b.dataset.id?.startsWith("__group_header"),c=d?0:J.getCol(w),r=d?0:J.getColumnOffset(c,D),B2;if(L){let K2=J.getRow(w),C=0,l=new Set;for(let u=0;u<w;u++){let $2=J.getRow(u);if($2<K2&&!l.has($2)){let n=$.getHeight(u);C+=n,l.add($2)}}B2=C}else B2=R(w,h);b.style.transform=`translate(${Math.round(r)}px, ${Math.round(B2)}px)`},k=(b,w)=>{let h=b.dataset.id?.startsWith("__group_header"),d=h?D:J.getColumnWidth(D),c;if(L||h)c=$.getHeight(w)-J.gap;else{let r=J.getRow(w);c=$.getHeight(r)-J.gap}b.style.width=`${d}px`,b.style.height=`${c}px`},g=(b,w,h,d,c)=>{let r=_.acquire(),B2=A(h,d);if(r.className=E,r.dataset.index=String(b),r.dataset.id=String(w.id),r.dataset.row=String(J.getRow(b)),r.dataset.col=String(J.getCol(b)),r.ariaSelected=String(h),Z)r.id=`${Z}-item-${b}`;if(q)N=String(q()),r.setAttribute("aria-setsize",N),r.setAttribute("aria-posinset",String(b+1));k(r,b);let K2=X(w,b,B2);return O(r,K2),M(r,h,d),G(r,b,c),r},t=(b,w,h,d,c)=>{if(w.start===0&&b.length>0)L=P2(b[0]);for(let[C,l]of U)if(C<w.start||C>w.end)l.element.remove(),_.release(l.element),U.delete(C);let r=!1;if(q){let C=String(q());r=C!==N,N=C}let B2=document.createDocumentFragment(),K2=[];for(let C=w.start;C<=w.end;C++){let l=C-w.start,u=b[l];if(!u){console.warn(`⚠️ RENDER: Missing item at index ${C} (range: ${w.start}-${w.end}, items.length: ${b.length})`);continue}let $2=h.has(u.id),n=C===d,Q2=U.get(C);if(Q2){let D2=Q2.element.dataset.id,v=String(u.id);if(D2!==v){let o=A($2,n),m=X(u,C,o);O(Q2.element,m),Q2.element.dataset.id=v,Q2.element.dataset.row=String(J.getRow(C)),Q2.element.dataset.col=String(J.getCol(C)),k(Q2.element,C)}if(M(Q2.element,$2,n),Q2.element.ariaSelected=String($2),G(Q2.element,C,c),r)Q2.element.setAttribute("aria-setsize",N)}else{let D2=g(C,u,$2,n,c);B2.appendChild(D2),K2.push({index:C,element:D2})}}if(K2.length>0){j.appendChild(B2);for(let{index:C,element:l}of K2)U.set(C,{index:C,element:l})}},s=(b)=>{for(let[w,h]of U)G(h.element,w,b)},j2=(b,w,h,d)=>{let c=U.get(b);if(c){let r=A(h,d),B2=X(w,b,r);O(c.element,B2),M(c.element,h,d),c.element.dataset.id=String(w.id),c.element.ariaSelected=String(h),k(c.element,b)}},e=(b,w,h)=>{let d=U.get(b);if(d)M(d.element,w,h)},T=(b)=>{return U.get(b)?.element},S=(b)=>{if(Math.abs(b-D)<1)return;D=b;for(let[w,h]of U)k(h.element,w),G(h.element,w)},I=()=>{for(let[,b]of U)b.element.remove(),_.release(b.element);U.clear()};return{render:t,updatePositions:s,updateItem:j2,updateItemClasses:e,getElement:T,updateContainerWidth:S,clear:I,destroy:()=>{I(),_.clear()}}};var Yj=uj(()=>{t2()});var sJ=0,k2=5,aJ=100,Aj=2,rJ=(j=0)=>{let X=Array(k2);for(let $=0;$<k2;$++)X[$]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},nJ=(j,X)=>{let $=performance.now(),J=$-j.lastTime;if(J===0)return j;if(J>aJ){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let Q=j.samples[0];return Q.position=X,Q.time=$,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=$,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=$,j.sampleIndex=(j.sampleIndex+1)%k2,j.sampleCount=Math.min(j.sampleCount+1,k2),j.sampleCount>=Aj){let Q=(j.sampleIndex-j.sampleCount+k2)%k2,q=j.samples[Q],Z=X-q.position,_=$-q.time;j.velocity=_>0?Math.abs(Z)/_:0}return j.lastPosition=X,j.lastTime=$,j},xj=(j,X)=>{if(typeof j==="number"){let Q=X;return{getOffset:(q)=>q*j,getHeight:()=>j,indexAtOffset:(q)=>{if(Q===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(q/j),Q-1))},getTotalHeight:()=>Q*j,getTotal:()=>Q,rebuild:(q)=>{Q=q},isVariable:()=>!1}}let $=X,J=new Float64Array(0),K=(Q)=>{$=Q,J=new Float64Array(Q+1),J[0]=0;for(let q=0;q<Q;q++)J[q+1]=J[q]+j(q)};return K(X),{getOffset:(Q)=>{if(Q<=0)return 0;if(Q>=$)return J[$];return J[Q]},getHeight:(Q)=>j(Q),indexAtOffset:(Q)=>{if($===0)return 0;if(Q<=0)return 0;if(Q>=J[$])return $-1;let q=0,Z=$-1;while(q<Z){let _=q+Z+1>>>1;if(J[_]<=Q)q=_;else Z=_-1}return q},getTotalHeight:()=>J[$]??0,getTotal:()=>$,rebuild:(Q)=>K(Q),isVariable:()=>!0}},oJ=()=>{let j={},X=(Q,q)=>{if(!j[Q])j[Q]=new Set;return j[Q].add(q),()=>$(Q,q)},$=(Q,q)=>{j[Q]?.delete(q)};return{on:X,off:$,emit:(Q,q)=>{j[Q]?.forEach((Z)=>{try{Z(q)}catch(_){console.error(`[vlist] Error in "${Q}" handler:`,_)}})},clear:()=>{for(let Q in j)delete j[Q]}}},iJ=(j)=>{if(typeof j==="string"){let X=document.querySelector(j);if(!X)throw Error(`[vlist/builder] Container not found: ${j}`);return X}return j},tJ=(j,X,$,J)=>{let K=document.createElement("div");if(K.className=X,J)K.classList.add(`${X}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),$)K.setAttribute("aria-label",$);if(J)K.setAttribute("aria-orientation","horizontal");let Q=document.createElement("div");if(Q.className=`${X}-viewport`,J)Q.style.overflowX="auto",Q.style.overflowY="hidden";else Q.style.overflow="auto";Q.style.height="100%",Q.style.width="100%";let q=document.createElement("div");if(q.className=`${X}-content`,q.style.position="relative",J)q.style.height="100%";else q.style.width="100%";let Z=document.createElement("div");if(Z.className=`${X}-items`,Z.style.position="relative",J)Z.style.height="100%";else Z.style.width="100%";return q.appendChild(Z),Q.appendChild(q),K.appendChild(Q),j.appendChild(K),{root:K,viewport:Q,content:q,items:Z}},eJ=(j=100)=>{let X=[];return{acquire:()=>{let $=X.pop();if($)return $;let J=document.createElement("div");return J.setAttribute("role","option"),J},release:($)=>{if(X.length<j)$.className="",$.textContent="",$.removeAttribute("style"),$.removeAttribute("data-index"),$.removeAttribute("data-id"),X.push($)},clear:()=>{X.length=0}}},j4=(j,X,$,J,K)=>{if(J===0||X===0){K.start=0,K.end=0;return}let Q=$.indexAtOffset(j),q=$.indexAtOffset(j+X);if(q<J-1)q++;K.start=Math.max(0,Q),K.end=Math.min(J-1,Math.max(0,q))},J4=(j,X,$,J)=>{if($===0){J.start=0,J.end=0;return}J.start=Math.max(0,j.start-X),J.end=Math.min($-1,j.end+X)},$4=(j,X,$,J,K)=>{if(J===0)return 0;let Q=Math.max(0,Math.min(j,J-1)),q=X.getOffset(Q),Z=X.getHeight(Q),_=Math.max(0,X.getTotalHeight()-$),U;switch(K){case"center":U=q-($-Z)/2;break;case"end":U=q-$+Z;break;default:U=q}return Math.max(0,Math.min(U,_))},Q4=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,X4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:300};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??300};return{align:"start",behavior:"auto",duration:300}},hj=(j)=>{if(!j.container)throw Error("[vlist/builder] Container is required");if(!j.item)throw Error("[vlist/builder] item configuration is required");let X=j.direction==="horizontal",$=X?"width":"height",J=X?j.item.width:j.item.height;if(J==null)throw Error(`[vlist/builder] item.${$} is required${X?" when direction is 'horizontal'":""}`);if(typeof J==="number"&&J<=0)throw Error(`[vlist/builder] item.${$} must be a positive number`);if(typeof J!=="number"&&typeof J!=="function")throw Error(`[vlist/builder] item.${$} must be a number or a function (index) => number`);if(!j.item.template)throw Error("[vlist/builder] item.template is required");if(X&&j.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let K=new Map,Q=!1,q={use(Z){if(Q)throw Error("[vlist/builder] Cannot call .use() after .build()");return K.set(Z.name,Z),q},build(){if(Q)throw Error("[vlist/builder] .build() can only be called once");return Q=!0,q4(j,K,X,J)}};return q};function q4(j,X,$,J){let{item:K,items:Q,overscan:q=3,classPrefix:Z="vlist",ariaLabel:_,reverse:U=!1,scroll:D}=j,L=D?.wheel??!0,z=D?.wrap??!1,y=U,N=`${Z}-${sJ++}`,B=J,W=$?typeof K.height==="number"?K.height:void 0:typeof K.width==="number"?K.width:void 0,A=K.template,E={overscan:q,classPrefix:Z,reverse:y,wrap:z,horizontal:$,ariaIdPrefix:N},H=Array.from(X.values()).sort((Y,F)=>(Y.priority??50)-(F.priority??50)),V=new Set(H.map((Y)=>Y.name));for(let Y of H)if(Y.conflicts){for(let F of Y.conflicts)if(V.has(F))throw Error(`[vlist/builder] ${Y.name} and ${F} cannot be combined`)}if($){if(V.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(V.has("withGroups"))throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'")}if(y){if(V.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let O=iJ(j.container),M=tJ(O,Z,_,$),R=oJ(),G=Q?[...Q]:[],k=xj(B,G.length),g=eJ(),t=M.viewport.clientHeight,s=M.viewport.clientWidth,j2=!1,e=!1,T=0,S=null,I=null,p=rJ(0),b={start:0,end:0},w={start:0,end:0},h={start:-1,end:-1},d={viewportState:{scrollTop:0,containerHeight:t,totalHeight:k.getTotalHeight(),actualHeight:k.getTotalHeight(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},c=new Map,r={selected:!1,focused:!1},B2=`${Z}-item`,K2="",C=new Map,l=()=>{C.clear();for(let Y=0;Y<G.length;Y++){let F=G[Y];if(F)C.set(F.id,Y)}};l();let u=null,$2=()=>u?u.getTotal():G.length,n=[],Q2=[],D2=[],v=[],x=[],o=[],m=new Map,q2=()=>{return $?M.viewport.scrollLeft:M.viewport.scrollTop},X2=(Y)=>{if($)M.viewport.scrollLeft=Y;else M.viewport.scrollTop=Y},M2=(Y=2)=>{let F=k.getTotalHeight();return T+t>=F-Y},A2=!1,J2,W2,L2=(Y,F,P,f,i)=>{j4(Y,F,P,f,i)},Y2=(Y,F,P,f,i)=>{return $4(Y,F,P,f,i)},_2=(Y,F)=>{if(typeof F==="string")Y.innerHTML=F;else Y.replaceChildren(F)},G2=(Y,F)=>{let P=Math.round(k.getOffset(F));if($)Y.style.transform=`translateX(${P}px)`;else Y.style.transform=`translateY(${P}px)`},H2=(Y,F)=>{let P=g.acquire();if(P.className=B2,$){if(P.style.width=`${k.getHeight(Y)}px`,W!=null)P.style.height=`${W}px`}else P.style.height=`${k.getHeight(Y)}px`;if(P.dataset.index=String(Y),P.dataset.id=String(F.id),P.ariaSelected="false",P.id=`${N}-item-${Y}`,K2=String($2()),P.setAttribute("aria-setsize",K2),P.setAttribute("aria-posinset",String(Y+1)),String(F.id).startsWith("__placeholder_"))P.classList.add(`${Z}-item--placeholder`);return _2(P,A(F,Y,r)),G2(P,Y),P},f2=()=>{let Y=`${k.getTotalHeight()}px`;if($)M.content.style.width=Y;else M.content.style.height=Y},Nj=new Set,Wj=-1,OJ=()=>{if(j2)return;let Y=$2();if(L2(T,t,k,Y,b),J4(b,q,Y,w),w.start===h.start&&w.end===h.end){if(A2)for(let[a,U2]of c)G2(U2,a);return}let F=String(Y),P=F!==K2;K2=F;for(let[a,U2]of c)if(a<w.start||a>w.end)U2.remove(),g.release(U2),c.delete(a);let f=document.createDocumentFragment(),i=[];for(let a=w.start;a<=w.end;a++){let U2=u?u.getItem(a):G[a];if(!U2)continue;let Z2=c.get(a);if(Z2){let F2=Z2.dataset.id,p2=String(U2.id);if(F2!==p2){let hJ=F2?.startsWith("__placeholder_"),Ij=p2.startsWith("__placeholder_");if(_2(Z2,A(U2,a,r)),Z2.dataset.id=p2,$)Z2.style.width=`${k.getHeight(a)}px`;else Z2.style.height=`${k.getHeight(a)}px`;if(Ij)Z2.classList.add(`${Z}-item--placeholder`);else Z2.classList.remove(`${Z}-item--placeholder`);if(hJ&&!Ij)Z2.classList.add(`${Z}-item--replaced`),setTimeout(()=>{Z2.classList.remove(`${Z}-item--replaced`)},300)}G2(Z2,a);let r2=Nj.has(U2.id),xJ=a===Wj;if(Z2.classList.toggle(`${Z}-item--selected`,r2),Z2.classList.toggle(`${Z}-item--focused`,xJ),Z2.ariaSelected=r2?"true":"false",P)Z2.setAttribute("aria-setsize",K2)}else{let F2=H2(a,U2),p2=Nj.has(U2.id),r2=a===Wj;if(p2)F2.classList.add(`${Z}-item--selected`),F2.ariaSelected="true";if(r2)F2.classList.add(`${Z}-item--focused`);f.appendChild(F2),i.push({index:a,element:F2})}}if(i.length>0){M.items.appendChild(f);for(let{index:a,element:U2}of i)c.set(a,U2)}h.start=w.start,h.end=w.end,d.lastRenderRange.start=w.start,d.lastRenderRange.end=w.end,d.viewportState.scrollTop=T,d.viewportState.visibleRange.start=b.start,d.viewportState.visibleRange.end=b.end,d.viewportState.renderRange.start=w.start,d.viewportState.renderRange.end=w.end,R.emit("range:change",{range:{start:w.start,end:w.end}})},zJ=()=>{h.start=-1,h.end=-1,J2()};J2=OJ,W2=zJ;let I2=()=>{if(j2)return;let Y=q2(),F=Y>=T?"down":"up";if(p=nJ(p,Y),!M.root.classList.contains(`${Z}--scrolling`))M.root.classList.add(`${Z}--scrolling`);T=Y,J2(),R.emit("scroll",{scrollTop:Y,direction:F}),R.emit("velocity:change",{velocity:p.velocity,reliable:p.sampleCount>=Aj});for(let P=0;P<n.length;P++)n[P](Y,F);if(I)clearTimeout(I);I=setTimeout(()=>{M.root.classList.remove(`${Z}--scrolling`),p.velocity=0,p.sampleCount=0,R.emit("velocity:change",{velocity:0,reliable:!1})},D?.idleTimeout??150)},s2=null,R2=M.viewport;if(R2.addEventListener("scroll",I2,{passive:!0}),$&&L)s2=(Y)=>{if(Y.deltaX)return;Y.preventDefault(),M.viewport.scrollLeft+=Y.deltaY},M.viewport.addEventListener("wheel",s2);let Cj=(Y)=>{let P=Y.target.closest("[data-index]");if(P){let f=parseInt(P.dataset.index??"-1",10);if(f>=0){let i=u?.getItem(f)??G[f];if(i){if(i.__groupHeader)return;R.emit("item:click",{item:i,index:f,event:Y})}}}for(let f=0;f<Q2.length;f++)Q2[f](Y)},bJ=(Y)=>{let P=Y.target.closest("[data-index]");if(P){let f=parseInt(P.dataset.index??"-1",10);if(f>=0){let i=u?.getItem(f)??G[f];if(i){if(i.__groupHeader)return;R.emit("item:dblclick",{item:i,index:f,event:Y})}}}},wj=(Y)=>{for(let F=0;F<D2.length;F++)D2[F](Y)};M.items.addEventListener("click",Cj),M.items.addEventListener("dblclick",bJ),M.root.addEventListener("keydown",wj);let Vj=!0,PJ=()=>s,yJ=()=>t,_j=new ResizeObserver((Y)=>{if(j2)return;for(let F of Y){let P=F.contentRect.height,f=F.contentRect.width,i=$?f:P;if(s=f,Math.abs(i-t)>1){if(t=i,d.viewportState.containerHeight=i,e)f2(),J2(),R.emit("resize",{height:P,width:f})}if(e)for(let a=0;a<v.length;a++)v[a](f,P)}});if(Vj)_j.observe(M.viewport);let N2={get dom(){return M},get heightCache(){return k},get emitter(){return R},get config(){return E},get rawConfig(){return j},get renderer(){return{render:(Y,F,P,f,i)=>{Nj=P,Wj=f,W2()},updateItemClasses:(Y,F,P)=>{let f=c.get(Y);if(!f)return;f.classList.toggle(`${Z}-item--selected`,F),f.classList.toggle(`${Z}-item--focused`,P),f.ariaSelected=F?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(Y)=>c.get(Y)??null,clear:()=>{},destroy:()=>{}}},set renderer(Y){},get dataManager(){return u},set dataManager(Y){u=Y},get scrollController(){return Gj},set scrollController(Y){Gj=Y},state:d,getContainerWidth(){return s},afterScroll:n,clickHandlers:Q2,keydownHandlers:D2,resizeHandlers:v,contentSizeHandlers:x,destroyHandlers:o,methods:m,replaceTemplate(Y){A=Y},replaceRenderer(Y){},replaceDataManager(Y){u=Y},replaceScrollController(Y){Gj=Y},getItemsForRange(Y){let F=[];for(let P=Y.start;P<=Y.end;P++){let f=u?u.getItem(P):G[P];if(f)F.push(f)}return F},getAllLoadedItems(){if(u){let Y=u.getTotal(),F=[];for(let P=0;P<Y;P++){let f=u.getItem(P);if(f)F.push(f)}return F}return[...G]},getVirtualTotal(){return $2()},getCachedCompression(){return{isCompressed:!1,actualHeight:k.getTotalHeight(),virtualHeight:k.getTotalHeight(),ratio:1}},getCompressionContext(){return{scrollTop:T,totalItems:$2(),containerHeight:t,rangeStart:w.start}},renderIfNeeded(){J2()},forceRender(){W2()},invalidateRendered(){for(let[,Y]of c)Y.remove(),g.release(Y);c.clear()},getRenderFns(){return{renderIfNeeded:J2,forceRender:W2}},setRenderFns(Y,F){J2=Y,W2=F},setVirtualTotalFn(Y){$2=Y},rebuildHeightCache(Y){k.rebuild(Y??$2())},setHeightConfig(Y){k=xj(Y,$2())},updateContentSize(Y){let F=`${Y}px`;if($)M.content.style.width=F;else M.content.style.height=F},updateCompressionMode(){},setVisibleRangeFn(Y){L2=Y},setScrollToPosFn(Y){Y2=Y},setPositionElementFn(Y){G2=Y},setScrollFns(Y,F){q2=Y,X2=(P)=>{F(P),I2()}},setScrollTarget(Y){R2.removeEventListener("scroll",I2),R2=Y,R2.addEventListener("scroll",I2,{passive:!0})},getScrollTarget(){return R2},setContainerDimensions(Y){PJ=Y.width,yJ=Y.height,s=Y.width(),t=Y.height(),d.viewportState.containerHeight=t},disableViewportResize(){if(Vj)Vj=!1,_j.unobserve(M.viewport)}};u={getState:()=>({total:G.length,cached:G.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>G.length,getCached:()=>G.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Y)=>G[Y],getItemById:(Y)=>{let F=C.get(Y);return F!==void 0?G[F]:void 0},getIndexById:(Y)=>C.get(Y)??-1,isItemLoaded:(Y)=>Y>=0&&Y<G.length&&G[Y]!==void 0,getItemsInRange:(Y,F)=>{let P=[],f=Math.max(0,Y),i=Math.min(F,G.length-1);for(let a=f;a<=i;a++)P.push(G[a]);return P},setTotal:(Y)=>{},setItems:(Y,F=0,P)=>{if(F===0&&(P!==void 0||G.length===0))G=[...Y];else{let f=F+Y.length;if(G.length<f)G.length=f;for(let i=0;i<Y.length;i++)G[F+i]=Y[i]}if(l(),e){k.rebuild($2()),f2(),N2.updateCompressionMode();for(let f=0;f<x.length;f++)x[f]();W2()}},updateItem:(Y,F)=>{let P=C.get(Y);if(P===void 0)return!1;let f=G[P];if(!f)return!1;if(G[P]={...f,...F},F.id!==void 0&&F.id!==Y)C.delete(Y),C.set(F.id,P);let i=c.get(P);if(i)_2(i,A(G[P],P,r)),i.dataset.id=String(G[P].id);return!0},removeItem:(Y)=>{let F=C.get(Y);if(F===void 0)return!1;if(G.splice(F,1),l(),e){k.rebuild($2()),f2(),N2.updateCompressionMode();for(let P=0;P<x.length;P++)x[P]();W2()}return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{G=[],C.clear()},reset:()=>{if(G=[],C.clear(),e)k.rebuild(0),f2(),W2()}};let Gj={getScrollTop:()=>q2(),scrollTo:(Y)=>{X2(Y),T=Y,J2()},scrollBy:(Y)=>{let F=q2()+Y;X2(F),T=F,J2()},isAtTop:()=>T<=2,isAtBottom:(Y=2)=>M2(Y),getScrollPercentage:()=>{let Y=k.getTotalHeight(),F=Math.max(0,Y-t);return F>0?T/F:0},getVelocity:()=>p.velocity,isTracking:()=>p.sampleCount>=Aj,isScrolling:()=>M.root.classList.contains(`${Z}--scrolling`),updateConfig:()=>{},enableCompression:()=>{A2=!0},disableCompression:()=>{A2=!1},isCompressed:()=>A2,isWindowMode:()=>!1,updateContainerHeight:(Y)=>{t=Y},destroy:()=>{}},Sj=new Map;for(let Y of H)if(Y.methods)for(let F of Y.methods){let P=Sj.get(F);if(P)throw Error(`[vlist/builder] Method "${F}" is registered by both "${P}" and "${Y.name}"`);Sj.set(F,Y.name)}for(let Y of H)Y.setup(N2);if(e=!0,N2.state.isInitialized=!0,f2(),J2(),y&&G.length>0){let Y=Y2(G.length-1,k,t,G.length,"end");X2(Y),T=Y,J2()}let HJ=(Y)=>{N2.dataManager.setItems(Y,0,Y.length)},RJ=y?(Y)=>{let F=M2(2),P=G.length;if(N2.dataManager.setItems(Y,P),F&&G.length>0){let f=Y2(G.length-1,k,t,G.length,"end");X2(f),T=f,J2()}}:(Y)=>{let F=G.length;N2.dataManager.setItems(Y,F)},kJ=y?(Y)=>{let F=q2(),P=k.getTotalHeight(),f=[...G];N2.dataManager.clear(),N2.dataManager.setItems([...Y,...f],0);let a=k.getTotalHeight()-P;if(a>0)X2(F+a),T=F+a}:(Y)=>{let F=[...G];N2.dataManager.clear(),N2.dataManager.setItems([...Y,...F],0)},TJ=(Y,F)=>{N2.dataManager.updateItem(Y,F)},CJ=(Y)=>{N2.dataManager.removeItem(Y)},wJ=async()=>{if(N2.dataManager.reload)await N2.dataManager.reload()},a2=()=>{if(S!==null)cancelAnimationFrame(S),S=null},SJ=(Y,F,P)=>{if(a2(),Math.abs(F-Y)<1){X2(F),T=F,J2();return}let f=performance.now(),i=(a)=>{let U2=a-f,Z2=Math.min(U2/P,1),F2=Y+(F-Y)*Q4(Z2);if(X2(F2),T=F2,J2(),Z2<1)S=requestAnimationFrame(i);else S=null};S=requestAnimationFrame(i)},vj=(Y,F)=>{let{align:P,behavior:f,duration:i}=X4(F),a=$2(),U2=Y;if(z&&a>0)U2=(U2%a+a)%a;let Z2=Y2(U2,k,t,a,P);if(f==="smooth")SJ(q2(),Z2,i);else a2(),X2(Z2)},vJ=(Y,F)=>{let P=C.get(Y)??N2.dataManager.getIndexById(Y);if(P>=0)vj(P,F)},fJ=()=>q2(),IJ=(Y,F)=>{return R.on(Y,F)},pJ=(Y,F)=>{R.off(Y,F)},uJ=()=>{if(j2)return;if(j2=!0,N2.state.isDestroyed=!0,M.items.removeEventListener("click",Cj),M.root.removeEventListener("keydown",wj),R2.removeEventListener("scroll",I2),_j.disconnect(),s2)M.viewport.removeEventListener("wheel",s2);if(I)clearTimeout(I);for(let Y=0;Y<o.length;Y++)o[Y]();for(let Y of H)if(Y.destroy)Y.destroy();a2();for(let[,Y]of c)Y.remove(),g.release(Y);c.clear(),g.clear(),R.clear(),M.root.remove()},fj={get element(){return M.root},get items(){if(m.has("_getItems"))return m.get("_getItems")();return G},get total(){if(m.has("_getTotal"))return m.get("_getTotal")();return $2()},setItems:m.has("setItems")?m.get("setItems"):HJ,appendItems:m.has("appendItems")?m.get("appendItems"):RJ,prependItems:m.has("prependItems")?m.get("prependItems"):kJ,updateItem:m.has("updateItem")?m.get("updateItem"):TJ,removeItem:m.has("removeItem")?m.get("removeItem"):CJ,reload:m.has("reload")?m.get("reload"):wJ,scrollToIndex:m.has("scrollToIndex")?m.get("scrollToIndex"):vj,scrollToItem:m.has("scrollToItem")?m.get("scrollToItem"):vJ,cancelScroll:m.has("cancelScroll")?m.get("cancelScroll"):a2,getScrollPosition:m.has("getScrollPosition")?m.get("getScrollPosition"):fJ,on:IJ,off:pJ,destroy:uJ};for(let[Y,F]of m){if(Y==="setItems"||Y==="appendItems"||Y==="prependItems"||Y==="updateItem"||Y==="removeItem"||Y==="reload"||Y==="scrollToIndex"||Y==="scrollToItem"||Y==="cancelScroll"||Y==="getScrollPosition")continue;fj[Y]=F}return fj}t2();var C2=(j,X,$={},J="vlist",K=!1)=>{let{autoHide:Q=!0,autoHideDelay:q=1000,minThumbSize:Z=30,showOnHover:_=!0,hoverZoneWidth:U=16,showOnViewportEnter:D=!0}=$,L=0,z=0,y=0,N=0,B=!1,W=!1,A=0,E=0,H=0,V=null,O=!1,M=null,R=null,G=K?"width":"height",k=K?"translateX":"translateY",g=K?(n)=>n.clientX:(n)=>n.clientY,t=K?"left":"top",s=document.createElement("div"),j2=document.createElement("div"),e=_?document.createElement("div"):null,T=()=>{if(s.className=`${J}-scrollbar`,j2.className=`${J}-scrollbar-thumb`,K)s.classList.add(`${J}-scrollbar--horizontal`);if(s.appendChild(j2),j.appendChild(s),e){if(e.className=`${J}-scrollbar-hover`,K)e.classList.add(`${J}-scrollbar-hover--horizontal`),e.style.height=`${U}px`;else e.style.width=`${U}px`;j.appendChild(e)}},S=()=>{if(V)clearTimeout(V),V=null},I=()=>{if(!Q)return;S(),V=setTimeout(b,q)},p=()=>{if(L<=z)return;if(S(),!O)s.classList.add(`${J}-scrollbar--visible`),O=!0;if(Q&&!B&&!W)I()},b=()=>{if(B||W)return;s.classList.remove(`${J}-scrollbar--visible`),O=!1},w=(n,Q2)=>{L=n,z=Q2;let D2=L>z;if(s.style.display=D2?"":"none",!D2){b();return}let v=z/L;y=Math.max(Z,v*z),j2.style[G]=`${y}px`,N=z-y,h(H)},h=(n)=>{if(H=n,L<=z||N<=0)return;let Q2=L-z,v=Math.min(1,Math.max(0,n/Q2))*N;j2.style.transform=`${k}(${v}px)`},d=(n)=>{if(n.target===j2)return;let Q2=s.getBoundingClientRect(),x=g(n)-Q2[t]-y/2,m=Math.max(0,Math.min(x,N))/N,q2=L-z,X2=m*q2;X(X2),p()},c=(n)=>{n.preventDefault(),n.stopPropagation(),B=!0,A=g(n),E=H,S(),s.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",r),document.addEventListener("mouseup",B2)},r=(n)=>{if(!B)return;let Q2=g(n)-A,D2=N>0?Q2/N:0,v=L-z,x=D2*v,o=Math.max(0,Math.min(E+x,v)),q2=o/v*N;if(j2.style.transform=`${k}(${q2}px)`,R=o,M===null)M=requestAnimationFrame(()=>{if(R!==null)X(R);M=null})},B2=()=>{if(B=!1,M!==null)cancelAnimationFrame(M),M=null;if(R!==null)X(R),R=null;if(s.classList.remove(`${J}-scrollbar--dragging`),Q&&!W)I();document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",B2)},K2=()=>{if(D)p()},C=()=>{if(!B){if(W=!1,Q)I()}},l=()=>{W=!0,S(),p()},u=()=>{if(W=!1,!B&&Q)I()},$2=()=>{if(S(),M!==null)cancelAnimationFrame(M),M=null;if(s.removeEventListener("click",d),s.removeEventListener("mouseenter",l),s.removeEventListener("mouseleave",u),j2.removeEventListener("mousedown",c),j.removeEventListener("mouseenter",K2),j.removeEventListener("mouseleave",C),document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",B2),e){if(e.removeEventListener("mouseenter",l),e.removeEventListener("mouseleave",u),e.parentNode)e.parentNode.removeChild(e)}if(s.parentNode)s.parentNode.removeChild(s)};if(T(),s.addEventListener("click",d),s.addEventListener("mouseenter",l),s.addEventListener("mouseleave",u),j2.addEventListener("mousedown",c),j.addEventListener("mouseenter",K2),j.addEventListener("mouseleave",C),e)e.addEventListener("mouseenter",l),e.addEventListener("mouseleave",u);return{show:p,hide:b,updateBounds:w,updatePosition:h,isVisible:()=>O,destroy:$2}};var oj=(j)=>{let X=null;return{name:"withScrollbar",priority:30,setup($){let{dom:J,config:K}=$,{classPrefix:Q,horizontal:q}=K;if(X=C2(J.viewport,(U)=>$.scrollController.scrollTo(U),j??{},Q,q),!J.viewport.classList.contains(`${Q}-viewport--custom-scrollbar`))J.viewport.classList.add(`${Q}-viewport--custom-scrollbar`);let Z=$.getCachedCompression();X.updateBounds(Z.virtualHeight,$.state.viewportState.containerHeight);let _=X;$.afterScroll.push((U,D)=>{_.updatePosition(U),_.show()}),$.resizeHandlers.push((U,D)=>{if(_){let L=$.getCachedCompression();_.updateBounds(L.virtualHeight,$.state.viewportState.containerHeight)}}),$.contentSizeHandlers.push(()=>{if(_){let U=$.getCachedCompression();_.updateBounds(U.virtualHeight,$.state.viewportState.containerHeight)}}),$.destroyHandlers.push(()=>{if(_)_.destroy()})},destroy(){if(X)X.destroy(),X=null}}};var ij=(j=0)=>{let X=[,,,,,,,,];for(let $=0;$<8;$++)X[$]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},e2=(j,X)=>{let $=performance.now(),J=$-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let Q=j.samples[0];return Q.position=X,Q.time=$,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=$,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=$,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let Q=(j.sampleIndex-j.sampleCount+8)%8,q=j.samples[Q],Z=X-q.position,_=$-q.time;j.velocity=_>0?Z/_:0}return j.lastPosition=X,j.lastTime=$,j},Z4=(j)=>j.sampleCount>=3,tj=(j,X={})=>{let{wheel:$=!0,sensitivity:J=1,smoothing:K=!1,idleTimeout:Q=150,onScroll:q,onIdle:Z,scrollElement:_,horizontal:U=!1}=X,D=!!_,L=0,z=0,y=D?U?window.innerWidth:window.innerHeight:U?j.clientWidth:j.clientHeight,N=X.compressed??!1,B=X.compression,W=ij(),A=!1,E=null,V=jj(()=>{let C=U?j.scrollLeft:j.scrollTop,l=C>=L?"down":"up";if(W=e2(W,C),L=C,q)q({scrollTop:L,direction:l,velocity:W.velocity});g()}),M=jj(()=>{let C=j.getBoundingClientRect(),l=U?Math.max(0,-C.left):Math.max(0,-C.top),u=l>=L?"down":"up";if(W=e2(W,l),L=l,!A)A=!0;if(q)q({scrollTop:L,direction:u,velocity:W.velocity});g()}),R=(C)=>{C.preventDefault()},G=(C)=>{if(C.deltaX)return;C.preventDefault(),j.scrollLeft+=C.deltaY},k=(C)=>{if(!N)return;C.preventDefault();let l=(U?C.deltaX||C.deltaY:C.deltaY)*J,u=L+l;if(K)u=L+l*0.3;if(u=Math.max(0,Math.min(u,z)),u!==L){let n=u>=L?"down":"up";if(W=e2(W,u),L=u,!A)A=!0;if(q)q({scrollTop:L,direction:n,velocity:W.velocity});g()}},g=()=>{if(E)clearTimeout(E);E=setTimeout(()=>{if(A=!1,W=ij(L),Z)Z()},Q)},t=(C)=>{if(N)return;if(N=!0,B=C,z=C.virtualHeight-y,D)return;if(V.cancel(),j.removeEventListener("scroll",V),!$)j.removeEventListener("wheel",R);else if(U)j.removeEventListener("wheel",G);if(U)j.style.overflowX="hidden";else j.style.overflow="hidden";if($)j.addEventListener("wheel",k,{passive:!1});let l=U?j.scrollLeft:j.scrollTop;if(l>0){let u=U?B?.actualHeight??j.scrollWidth:B?.actualHeight??j.scrollHeight;L=l/u*z}if(U)j.scrollLeft=0;else j.scrollTop=0},s=()=>{if(!N)return;if(N=!1,D){B=void 0;return}if(j.removeEventListener("wheel",k),U)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",V,{passive:!0}),!$)j.addEventListener("wheel",R,{passive:!1});else if(U)j.addEventListener("wheel",G,{passive:!1});if(B&&L>0){let l=L/z*(B.actualHeight-y);if(U)j.scrollLeft=l;else j.scrollTop=l}B=void 0},j2=()=>{if(D||N)return L;return U?j.scrollLeft:j.scrollTop},e=(C,l=!1)=>{let u=Math.max(0,Math.min(C,z||1/0));if(D){let $2=j.getBoundingClientRect();if(U){let n=$2.left+window.scrollX;window.scrollTo({left:n+u,behavior:l?"smooth":"auto"})}else{let n=$2.top+window.scrollY;window.scrollTo({top:n+u,behavior:l?"smooth":"auto"})}}else if(N){if(u===L)return;let n=u>=L?"down":"up";if(W=e2(W,u),L=u,!A)A=!0;if(q)q({scrollTop:L,direction:n,velocity:W.velocity});g()}else if(U)j.scrollTo({left:u,behavior:l?"smooth":"auto"});else j.scrollTo({top:u,behavior:l?"smooth":"auto"})},T=(C)=>{e(j2()+C)},S=()=>{return j2()<=0},I=(C=0)=>{let l=j2(),u=D||N?z:U?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return l>=u-C},p=()=>{let C=j2(),l=D||N?z:U?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(l<=0)return 0;return Math.min(1,Math.max(0,C/l))},b=(C)=>{if(C.compression)B=C.compression,z=B.virtualHeight-y},w=()=>N,h=()=>Math.abs(W.velocity),d=()=>Z4(W),c=()=>A,r=()=>D,B2=(C)=>{if(y=C,B)z=B.virtualHeight-y},K2=()=>{if(E)clearTimeout(E);if(D)M.cancel(),window.removeEventListener("scroll",M);else V.cancel(),j.removeEventListener("scroll",V),j.removeEventListener("wheel",k),j.removeEventListener("wheel",R),j.removeEventListener("wheel",G)};if(D){if(N&&B)z=B.virtualHeight-y;window.addEventListener("scroll",M,{passive:!0})}else if(N&&B){if(z=B.virtualHeight-y,U)j.style.overflowX="hidden";else j.style.overflow="hidden";if($)j.addEventListener("wheel",k,{passive:!1})}else{if(U)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",V,{passive:!0}),!$)j.addEventListener("wheel",R,{passive:!1});else if(U)j.addEventListener("wheel",G,{passive:!1})}return{getScrollTop:j2,scrollTo:e,scrollBy:T,isAtTop:S,isAtBottom:I,getScrollPercentage:p,getVelocity:h,isTracking:d,isScrolling:c,updateConfig:b,enableCompression:t,disableCompression:s,isCompressed:w,isWindowMode:r,updateContainerHeight:B2,destroy:K2}},jj=(j)=>{let X=null,$=null,J=(...K)=>{if($=K,X===null)X=requestAnimationFrame(()=>{if(X=null,$)j(...$)})};return J.cancel=()=>{if(X!==null)cancelAnimationFrame(X),X=null},J};var B4=0.65,U4=0.5,ej=()=>{let j=null,X=0,$=!1,J=0,K=null;return{name:"withScale",priority:20,setup(Q){let{dom:q,config:Z}=Q,{classPrefix:_,horizontal:U}=Z,D=()=>{let N=Q.getVirtualTotal(),B=E2(N,Q.heightCache);if(B.isCompressed&&!$){$=!0,Q.scrollController.enableCompression(B),Q.updateContentSize(B.virtualHeight),Q.setScrollFns(()=>X,(V)=>{if(X=V,J=V,K!==null)cancelAnimationFrame(K),K=null});let W=()=>{let V=J-X;if(Math.abs(V)<U4)X=J,K=null;else X+=V*B4,K=requestAnimationFrame(W);Q.scrollController.scrollTo(X)},A=q.viewport,E=(V)=>{V.preventDefault();let M=Q.getCachedCompression().virtualHeight-Q.state.viewportState.containerHeight;if(J=Math.max(0,Math.min(J+V.deltaY,M)),K===null)K=requestAnimationFrame(W)};if(A.addEventListener("wheel",E,{passive:!1}),Q.destroyHandlers.push(()=>{if(A.removeEventListener("wheel",E),K!==null)cancelAnimationFrame(K),K=null}),!q.viewport.querySelector(`.${_}-scrollbar-track`)){if(j=C2(q.viewport,(O)=>Q.scrollController.scrollTo(O),{},_,U),!q.viewport.classList.contains(`${_}-viewport--custom-scrollbar`))q.viewport.classList.add(`${_}-viewport--custom-scrollbar`);j.updateBounds(B.virtualHeight,Q.state.viewportState.containerHeight);let V=j;Q.afterScroll.push((O,M)=>{if(V)V.updatePosition(O),V.show()}),Q.resizeHandlers.push((O,M)=>{if(V){let R=Q.getCachedCompression();V.updateBounds(R.virtualHeight,Q.state.viewportState.containerHeight)}})}}else if(!B.isCompressed&&$)$=!1,Q.scrollController.disableCompression(),Q.updateContentSize(B.actualHeight);else if(B.isCompressed)Q.scrollController.updateConfig({compression:B}),Q.updateContentSize(B.virtualHeight);if(j)j.updateBounds(B.virtualHeight,Q.state.viewportState.containerHeight);Q.state.cachedCompression={state:B,totalItems:N}};Q.updateCompressionMode=D;let L=Q.getCachedCompression.bind(Q);Q.getCachedCompression=()=>{if(Q.state.cachedCompression)return Q.state.cachedCompression.state;return L()},Q.setVisibleRangeFn((N,B,W,A,E)=>{z=null,y=null;let H=E2(A,W);o2(N,B,W,A,H,E)}),Q.setScrollToPosFn((N,B,W,A,E)=>{let H=E2(A,B);return i2(N,B,W,A,H,E)});let z=null,y=null;Q.setPositionElementFn((N,B)=>{let W=Q.getVirtualTotal(),A=E2(W,Q.heightCache);if(A.isCompressed){let E=Q.scrollController.getScrollTop();if(z===null||B<y)y=B,z=Math.round(T2(B,E,Q.heightCache,W,Q.state.viewportState.containerHeight,A));let H=z+Q.heightCache.getOffset(B)-Q.heightCache.getOffset(y),V=Q.config.horizontal;N.style.transform=V?`translateX(${H}px)`:`translateY(${H}px)`}else{let E=Math.round(Q.heightCache.getOffset(B)),H=Q.config.horizontal;N.style.transform=H?`translateX(${E}px)`:`translateY(${E}px)`}}),D(),Q.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null})},destroy(){if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null}}};var Jj=(j={})=>{let{chunkSize:X=100,maxCachedItems:$=5000,evictionBuffer:J=200,onEvict:K}=j,Q=new Map,q=0,Z=0,_=(T)=>{let S=Q.get(T);if(!S)S={items:Array(X),count:0,lastAccess:Date.now()},Q.set(T,S);else S.lastAccess=Date.now();return S},U=(T)=>{return Math.floor(T/X)},D=(T)=>{return T%X},L=()=>q,z=(T)=>{q=T},y=(T)=>{if(T<0||T>=q)return;let S=U(T),I=Q.get(S);if(!I)return;return I.items[D(T)]},N=(T)=>{if(T<0||T>=q)return!1;let S=U(T),I=Q.get(S);if(!I)return!1;return I.items[D(T)]!==void 0},B=(T,S)=>{let I=U(T),p=_(I),b=D(T),w=p.items[b]===void 0;if(p.items[b]=S,w)p.count++,Z++;if(T>=q)q=T+1},W=(T,S)=>{for(let I=0;I<S.length;I++){let p=S[I];if(p!==void 0)B(T+I,p)}},A=(T)=>{if(T<0||T>=q)return!1;let S=U(T),I=Q.get(S);if(!I)return!1;let p=D(T);if(I.items[p]===void 0)return!1;if(I.items[p]=void 0,I.count--,Z--,I.count===0)Q.delete(S);return!0},E=(T,S)=>{let I=[];for(let p=T;p<=S&&p<q;p++)I.push(y(p));return I},H=(T,S)=>{for(let I=T;I<=S&&I<q;I++)if(!N(I))return!1;return!0},V=()=>{let T=[],S=null,I=Array.from(Q.keys()).sort((p,b)=>p-b);for(let p of I){let b=Q.get(p);if(!b)continue;let w=p*X;for(let h=0;h<X;h++){let d=w+h;if(d>=q)break;if(b.items[h]!==void 0)if(S===null)S={start:d,end:d};else if(d===S.end+1)S.end=d;else T.push(S),S={start:d,end:d};else if(S!==null)T.push(S),S=null}}if(S!==null)T.push(S);return T},O=(T,S)=>{let I=[],p=null;for(let b=T;b<=S&&b<q;b++)if(!N(b))if(p===null)p={start:b,end:b};else p.end=b;else if(p!==null)I.push(p),p=null;if(p!==null)I.push(p);return I},M=(T)=>{return Q.has(T)},R=(T)=>{let S=Q.get(T);if(S)S.lastAccess=Date.now()},G=(T,S)=>{if(T>S||Q.size===0)return;let I=Date.now(),p=U(Math.max(0,T)),b=U(Math.min(q-1,S));for(let w=p;w<=b;w++){let h=Q.get(w);if(h)h.lastAccess=I}},k=(T,S)=>{if(Z<=$)return 0;let I=Math.max(0,T-J),p=Math.min(q-1,S+J),b=U(I),w=U(p),h=0,d=[];for(let[c,r]of Q)if(c<b||c>w)h+=r.count,d.push(c),Z-=r.count,Q.delete(c);if(h>0&&K)K(h,d);return h},g=()=>{if(Z<=$)return 0;let T=Array.from(Q.entries()).sort(([,p],[,b])=>p.lastAccess-b.lastAccess),S=0,I=[];for(let[p,b]of T){if(Z<=$)break;S+=b.count,Z-=b.count,I.push(p),Q.delete(p)}if(S>0&&K)K(S,I);return S},t=()=>{return{totalItems:q,cachedItems:Z,cachedChunks:Q.size,chunkSize:X,maxCachedItems:$,memoryEfficiency:q>0?1-Z/q:1}},s=()=>Z,j2=()=>{Q.clear(),Z=0};return{chunkSize:X,maxCachedItems:$,getTotal:L,setTotal:z,get:y,has:N,set:B,setRange:W,delete:A,getRange:E,isRangeLoaded:H,getLoadedRanges:V,findUnloadedRanges:O,getChunkIndex:U,isChunkLoaded:M,touchChunk:R,touchChunksForRange:G,evictDistant:k,evictToLimit:g,getStats:t,getCachedCount:s,clear:j2,reset:()=>{j2(),q=0}}},$j=(j)=>{if(j.length===0)return[];let X=[...j].sort((J,K)=>J.start-K.start),$=[{...X[0]}];for(let J=1;J<X.length;J++){let K=X[J],Q=$[$.length-1];if(K.start<=Q.end+1)Q.end=Math.max(Q.end,K.end);else $.push({...K})}return $},h2=(j,X,$)=>{let J=Math.floor(j.start/$)*$,K=Math.ceil((j.end+1)/$)*$-1,Q={start:J,end:K};if(X.length===0)return[Q];let q=[],Z=$j(X),_=Q.start;for(let U of Z){if(U.end<_)continue;if(U.start>Q.end)break;if(U.start>_)q.push({start:_,end:Math.min(U.start-1,Q.end)});if(_=U.end+1,_>Q.end)break}if(_<=Q.end)q.push({start:_,end:Q.end});return q};var Qj=(j={})=>{let{enabled:X=!0,maskCharacter:$="█",randomVariance:J=!0,maxSampleSize:K=20,customGenerator:Q}=j,q=null,Z=!1,_=0,U=(A)=>{if(!X||Z||A.length===0)return;let E=new Map,H=new Map,V=Math.min(A.length,K);for(let O=0;O<V;O++){let M=A[O];if(!M||typeof M!=="object")continue;for(let[R,G]of Object.entries(M)){if(R.startsWith("_")||R==="id")continue;if(!H.has(R))H.set(R,{lengths:[],types:new Set});let k=H.get(R),g=Array.isArray(G)?"array":typeof G;if(k.types.add(g),typeof G==="string")k.lengths.push(G.length);else if(G!==null&&G!==void 0)k.lengths.push(String(G).length)}}for(let[O,M]of H){if(M.lengths.length===0)continue;let R=Math.min(...M.lengths),G=Math.max(...M.lengths),k=Math.round(M.lengths.reduce((t,s)=>t+s,0)/M.lengths.length),g="string";if(M.types.has("number")&&M.types.size===1)g="number";else if(M.types.has("boolean")&&M.types.size===1)g="boolean";else if(M.types.has("array"))g="array";else if(M.types.has("object")&&!M.types.has("string"))g="object";E.set(O,{minLength:R,maxLength:G,avgLength:k,type:g})}q=E,Z=!0},D=()=>Z,L=(A)=>{let E=A.avgLength;if(J&&A.minLength!==A.maxLength){if(E=Math.floor(Math.random()*(A.maxLength-A.minLength+1)+A.minLength),Math.random()<0.3)E=Math.max(1,E+Math.floor(Math.random()*3)-1)}return $.repeat(Math.max(1,E))},z=(A)=>{if(Q)return{...Q(A),["_isPlaceholder"]:!0};let E={id:`__placeholder_${_++}`,["_isPlaceholder"]:!0,_index:A};if(!q||q.size===0)return E.label=$.repeat(12),E;for(let[H,V]of q)switch(V.type){case"string":E[H]=L(V);break;case"number":E[H]=0;break;case"boolean":E[H]=!1;break;case"array":E[H]=[];break;case"object":E[H]={};break;default:E[H]=L(V)}return E};return{analyzeStructure:U,hasAnalyzedStructure:D,generate:z,generateRange:(A,E)=>{let H=[];for(let V=A;V<=E;V++)H.push(z(V));return H},isPlaceholder:(A)=>{if(!A||typeof A!=="object")return!1;return A._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{q=null,Z=!1,_=0}}},b2=(j)=>{if(!j||typeof j!=="object")return!1;return j._isPlaceholder===!0},Oj=(j)=>{return j.filter((X)=>!b2(X))};var N4=50,Xj=(j={})=>{let{adapter:X,initialItems:$,initialTotal:J,storage:K,placeholder:Q,pageSize:q=N4,onStateChange:Z,onItemsLoaded:_,onItemsEvicted:U}=j,D=Jj({...K,onEvict:(v,x)=>{U?.(v),O()}}),L=null,z=()=>{if(!L)L=Qj(Q);return L},y=new Map,N=!1,B,W=!0,A,E=[],H=0,V=new Map,O=()=>{Z?.(e())},M=()=>{y.clear();let v=D.getLoadedRanges();for(let x of v)for(let o=x.start;o<=x.end;o++){let m=D.get(o);if(m&&!b2(m))y.set(m.id,o)}},R=(v,x)=>{if(!b2(x))y.set(x.id,v)},G=(v)=>{y.delete(v)},k=(v,x)=>{return`${v}-${x}`},g=()=>D.getTotal(),t=()=>D.getCachedCount(),s=()=>N,j2=()=>W,e=()=>({total:D.getTotal(),cached:D.getCachedCount(),isLoading:N,pendingRanges:E,error:B,hasMore:W,cursor:A}),T=()=>D,S=()=>z(),I=(v)=>{let x=D.get(v);if(x!==void 0)return x;if(v>=0&&v<D.getTotal())return z().generate(v);return},p=(v)=>{let x=y.get(v);if(x===void 0)return;return D.get(x)},b=(v)=>{return y.get(v)??-1},w=(v)=>{let x=D.get(v);return x!==void 0&&!b2(x)},h=(v,x)=>{let o=[],m=D.getTotal(),q2=0,X2=0;D.touchChunksForRange(v,Math.min(x,m-1));for(let M2=v;M2<=x&&M2<m;M2++){let A2=D.get(M2);if(A2!==void 0)o.push(A2),q2++;else o.push(z().generate(M2)),X2++}return o},d=(v)=>{D.setTotal(v),W=D.getCachedCount()<v,O()},c=(v,x=0,o)=>{if(L&&!L.hasAnalyzedStructure()&&v.length>0)L.analyzeStructure(v);for(let m=0;m<v.length;m++){let q2=v[m];if(q2!==void 0){let X2=x+m;D.set(X2,q2),R(X2,q2)}}if(o!==void 0)D.setTotal(o);else if(x+v.length>D.getTotal())D.setTotal(x+v.length);if(D.getCachedCount()>=D.getTotal()&&D.getTotal()>0)W=!1;_?.(v,x,D.getTotal()),O()},r=(v,x)=>{let o=y.get(v);if(o===void 0)return!1;let m=D.get(o);if(!m)return!1;let q2={...m,...x};if(D.set(o,q2),x.id!==void 0&&x.id!==v)G(v),R(o,q2);return O(),!0},B2=(v)=>{let x=y.get(v);if(x===void 0)return!1;D.delete(x),G(v);let o=D.getTotal();if(o>0)D.setTotal(o-1);return O(),!0},K2=async(v,x)=>{if(!X)return;let o=k(v,x);if(V.has(o))return;let m=D.getLoadedRanges(),q2=h2({start:v,end:x},m,D.chunkSize);if(q2.length===0)return;let X2=D.chunkSize,M2=[];for(let J2 of q2){let W2=Math.floor(J2.start/X2),L2=Math.floor(J2.end/X2);for(let Y2=W2;Y2<=L2;Y2++){let _2=Y2*X2,V2=_2+X2-1,G2=k(_2,V2);if(!M2.some((H2)=>H2.start===_2)&&!V.has(G2))M2.push({start:_2,end:V2})}}let A2=[];for(let J2 of q2){let W2=Math.floor(J2.start/X2),L2=Math.floor(J2.end/X2);for(let Y2=W2;Y2<=L2;Y2++){let _2=Y2*X2,V2=_2+X2-1,G2=k(_2,V2);if(V.has(G2)){let H2=V.get(G2);if(!A2.includes(H2))A2.push(H2)}}}for(let J2 of M2){let W2=k(J2.start,J2.end),L2=(async()=>{E.push(J2),N=!0,B=void 0,O();try{let Y2=J2.end-J2.start+1,_2={offset:J2.start,limit:Y2,cursor:void 0},V2=await X.read(_2);if(c(V2.items,J2.start,V2.total),V2.cursor)A=V2.cursor;let G2=J2.start+V2.items.length;if(G2>=H){if(H=G2,V2.hasMore!==void 0)W=V2.hasMore;else if(V2.total!==void 0)W=G2<V2.total}}catch(Y2){B=Y2 instanceof Error?Y2:Error(String(Y2))}finally{V.delete(W2),E=E.filter((Y2)=>Y2.start!==J2.start||Y2.end!==J2.end),N=V.size>0,O()}})();V.set(W2,L2),A2.push(L2)}await Promise.all(A2)},C=async(v,x)=>{if(D.isRangeLoaded(v,x))return;await K2(v,x)},l=async()=>{if(!X)return;await K2(0,q-1)},u=async()=>{if(!X||N||!W)return!1;let v=D.getCachedCount(),x=D.getTotal(),o=v,m=Math.min(o+q-1,x>0?x-1:o+q-1);if(o>=x&&x>0)return W=!1,!1;return await K2(o,m),D.getCachedCount()>v},$2=async()=>{if(D.clear(),y.clear(),L)L.clear();V.clear(),E=[],N=!1,A=void 0,W=!0,H=0,B=void 0,O()},n=(v,x)=>{if(D.evictDistant(v,x)>0)M()},Q2=()=>{D.clear(),y.clear(),A=void 0,B=void 0,E=[],N=!1,O()},D2=()=>{if(D.reset(),y.clear(),L)L.clear();A=void 0,W=!0,H=0,B=void 0,E=[],N=!1,O()};if($&&$.length>0)c($,0,J??$.length);else if(J!==void 0)D.setTotal(J);return{getState:e,getTotal:g,getCached:t,getIsLoading:s,getHasMore:j2,getStorage:T,getPlaceholders:S,getItem:I,getItemById:p,getIndexById:b,isItemLoaded:w,getItemsInRange:h,setTotal:d,setItems:c,updateItem:r,removeItem:B2,loadRange:K2,ensureRange:C,loadInitial:l,loadMore:u,reload:$2,evictDistant:n,clear:Q2,reset:D2}};var jJ=(j)=>{let{adapter:X,loading:$}=j,J=$?.cancelThreshold??gj,K=$?.preloadThreshold??mj,Q=$?.preloadAhead??dj;return{name:"withAsync",priority:20,methods:["reload"],setup(q){let{emitter:Z}=q,_=q.config.reverse,U=Xj({adapter:X,pageSize:x2,onStateChange:()=>{if(q.state.isInitialized){q.heightCache.rebuild(q.getVirtualTotal()),q.updateCompressionMode();let W=q.getCachedCompression();q.state.viewportState.totalHeight=W.virtualHeight,q.state.viewportState.actualHeight=W.actualHeight,q.state.viewportState.isCompressed=W.isCompressed,q.state.viewportState.compressionRatio=W.ratio,q.updateContentSize(W.virtualHeight),q.renderIfNeeded()}},onItemsLoaded:(W,A,E)=>{if(q.state.isInitialized)q.heightCache.rebuild(q.getVirtualTotal()),q.forceRender(),Z.emit("load:end",{items:W,total:E})}});q.replaceDataManager(U);let D=null,L=null,z=0,y=()=>{if(L){let W=L;L=null,q.dataManager.ensureRange(W.start,W.end).catch((A)=>{Z.emit("error",{error:A,context:"ensureRange"})})}};q.afterScroll.push((W,A)=>{if(q.state.isDestroyed)return;let E=q.scrollController.getVelocity(),V=q.scrollController.isTracking()&&E<=J;if(L&&z>J&&E<=J){let R=L;L=null,q.dataManager.ensureRange(R.start,R.end).catch((G)=>{Z.emit("error",{error:G,context:"ensureRange"})})}if(z=E,V&&!q.dataManager.getIsLoading()&&q.dataManager.getHasMore()){if(_){if(W<Ej)Z.emit("load:start",{offset:q.dataManager.getCached(),limit:x2}),q.dataManager.loadMore().catch((R)=>{Z.emit("error",{error:R,context:"loadMore"})})}else if(q.state.viewportState.totalHeight-W-q.state.viewportState.containerHeight<Ej)Z.emit("load:start",{offset:q.dataManager.getCached(),limit:x2}),q.dataManager.loadMore().catch((G)=>{Z.emit("error",{error:G,context:"loadMore"})})}let{renderRange:O}=q.state.viewportState;if(!D||O.start!==D.start||O.end!==D.end)if(D={start:O.start,end:O.end},V){L=null;let{start:R,end:G}=O,k=q.getVirtualTotal();if(E>K)if(A==="down")G=Math.min(O.end+Q,k-1);else R=Math.max(O.start-Q,0);q.dataManager.ensureRange(R,G).catch((g)=>{Z.emit("error",{error:g,context:"ensureRange"})})}else L={start:O.start,end:O.end}});let N=200,B=null;q.afterScroll.push((W,A)=>{if(B!==null)clearTimeout(B);B=setTimeout(()=>{B=null,y()},N)}),q.destroyHandlers.push(()=>{if(B!==null)clearTimeout(B),B=null}),Z.on("load:start",()=>{q.dom.root.setAttribute("aria-busy","true")}),Z.on("load:end",()=>{q.dom.root.removeAttribute("aria-busy")}),q.methods.set("reload",async()=>{D=null,L=null,q.invalidateRendered(),await q.dataManager.reload(),q.forceRender();let{renderRange:W}=q.state.viewportState;if(W.end>0)await q.dataManager.ensureRange(W.start,W.end)}),Z.emit("load:start",{offset:0,limit:x2}),q.dataManager.loadInitial().catch((W)=>{Z.emit("error",{error:W,context:"loadInitial"})})}}};var JJ=()=>{let j=null;return{name:"withPage",priority:5,setup(X){let{dom:$,state:J,config:K,emitter:Q}=X;$.root.style.overflow="visible",$.root.style.height="auto",$.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),X.disableViewportResize(),X.setScrollTarget(window),X.setScrollFns(()=>{let U=$.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-U.left);else return Math.max(0,-U.top)},(U)=>{let D=$.viewport.getBoundingClientRect();if(K.horizontal){let L=D.left+window.scrollX;window.scrollTo(L+U,window.scrollY)}else{let L=D.top+window.scrollY;window.scrollTo(window.scrollX,L+U)}}),X.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),J.viewportState.containerHeight=window.innerHeight;let{innerHeight:q,innerWidth:Z}=window,_=()=>{let{innerWidth:U,innerHeight:D}=window,L=K.horizontal?U:D,z=K.horizontal?Z:q;if(Math.abs(L-z)<=1)return;q=D,Z=U,J.viewportState.containerHeight=D,Q.emit("resize",{width:U,height:D});for(let y=0;y<X.resizeHandlers.length;y++)X.resizeHandlers[y](U,D);X.renderIfNeeded()};window.addEventListener("resize",_,{passive:!0}),j=()=>{window.removeEventListener("resize",_)},X.destroyHandlers.push(j)},destroy(){if(j)j(),j=null}}};var zj=(j,X)=>{let $=0,J=j.length-1;while($<J){let K=$+J+1>>>1;if(j[K].headerLayoutIndex<=X)$=K;else J=K-1}return $},$J=(j,X)=>{let $=0,J=j.length-1;while($<J){let K=$+J+1>>>1;if(j[K].firstDataIndex<=X)$=K;else J=K-1}return $},QJ=(j,X)=>{if(j===0)return[];let $=[],J=X(0),K=0,Q=0;for(let q=1;q<j;q++){let Z=X(q);if(Z!==J){let _=q-K;$.push({key:J,groupIndex:$.length,headerLayoutIndex:Q,firstDataIndex:K,count:_}),Q=Q+1+_,J=Z,K=q}}return $.push({key:J,groupIndex:$.length,headerLayoutIndex:Q,firstDataIndex:K,count:j-K}),$},g2=(j,X)=>{if(j.length===0||X.length===0)return[];let $=j.length+X.length,J=Array($),K=0;for(let Q of X){J[K]={id:`__group_header_${Q.groupIndex}`,__groupHeader:!0,groupKey:Q.key,groupIndex:Q.groupIndex},K++;for(let q=0;q<Q.count;q++)J[K]=j[Q.firstDataIndex+q],K++}return J},m2=(j,X)=>{let $=typeof X==="number"?(J)=>X:X;return(J)=>{let K=j.getEntry(J);if(K.type==="header")return j.getHeaderHeight(K.group.groupIndex);return $(K.dataIndex)}},qj=(j,X)=>{let $=QJ(j,X.getGroupForIndex),J=j+$.length,K=X.headerHeight;return{get totalEntries(){return J},get groupCount(){return $.length},get groups(){return $},getEntry:(z)=>{if($.length===0)return{type:"item",dataIndex:z,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let y=zj($,z),N=$[y];if(z===N.headerLayoutIndex)return{type:"header",group:N};let B=z-N.headerLayoutIndex-1;return{type:"item",dataIndex:N.firstDataIndex+B,group:N}},layoutToDataIndex:(z)=>{if($.length===0)return z;let y=zj($,z),N=$[y];if(z===N.headerLayoutIndex)return-1;let B=z-N.headerLayoutIndex-1;return N.firstDataIndex+B},dataToLayoutIndex:(z)=>{if($.length===0)return z;let y=$J($,z),N=$[y],B=z-N.firstDataIndex;return N.headerLayoutIndex+1+B},getGroupAtLayoutIndex:(z)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let y=zj($,z);return $[y]},getGroupAtDataIndex:(z)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let y=$J($,z);return $[y]},getHeaderHeight:typeof K==="number"?(z)=>K:(z)=>{let y=$[z];if(!y)return 0;return K(y.key,z)},rebuild:(z)=>{$=QJ(z,X.getGroupForIndex),J=z+$.length}}};var Kj=(j,X,$,J,K)=>{let Q=document.createElement("div");Q.className=`${K}-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 q=-1,Z=!1,_=0,U=(B)=>{if(B===q)return;q=B;let W=X.groups;if(B<0||B>=W.length){Q.textContent="";return}let A=W[B],E=J.headerTemplate(A.key,A.groupIndex),H=X.getHeaderHeight(B);if(Q.style.height=`${H}px`,typeof E==="string")Q.innerHTML=E;else Q.replaceChildren(E)},D=(B)=>{let W=X.groups;if(W.length===0){z();return}let A=0;for(let M=W.length-1;M>=0;M--)if($.getOffset(W[M].headerLayoutIndex)<=B){A=M;break}let E=$.getOffset(W[0].headerLayoutIndex);if(B<E){z();return}if(!Z)L();U(A);let H=X.getHeaderHeight(A),V=0,O=A+1;if(O<W.length){let R=$.getOffset(W[O].headerLayoutIndex)-B;if(R<H)V=R-H}if(V!==_)_=V,Q.style.transform=V===0?"":`translateY(${Math.round(V)}px)`},L=()=>{if(Z)return;Z=!0,Q.style.display=""},z=()=>{if(!Z)return;Z=!1,Q.style.display="none",q=-1,_=0,Q.style.transform=""},y=()=>{let B=q;if(q=-1,B>=0)U(B)},N=()=>{Q.remove(),q=-1,Z=!1};return Q.style.display="none",{update:D,refresh:y,show:L,hide:z,destroy:N}};var XJ=(j,X,$,J,K,Q)=>{if(J===0||X===0)return Q.start=0,Q.end=-1,Q;let q=$.indexAtOffset(j),Z=$.indexAtOffset(j+X);if(Z<J-1)Z++;return Q.start=Math.max(0,q),Q.end=Math.min(J-1,Math.max(0,Z)),Q},qJ=(j,X,$,J)=>{if($===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min($-1,j.end+X),J},KJ=(j,X,$,J,K,Q)=>{if(J===0)return 0;let q=Math.max(0,Math.min(j,J-1)),Z=X.getOffset(q),_=X.getHeight(q),U=X.getTotalHeight(),D=Math.max(0,U-$),L;switch(Q){case"center":L=Z-$/2+_/2;break;case"end":L=Z-$+_;break;case"start":default:L=Z;break}return Math.max(0,Math.min(L,D))},YJ=(j,X,$)=>{if($&&$.isCompressed)return $.virtualHeight;return X.getTotalHeight()},ZJ=(j,X)=>{return X.getTotalHeight()},BJ=(j,X)=>{return X.getOffset(j)},UJ=(j,X,$)=>{let J=Math.max(0,X-$);return Math.max(0,Math.min(j,J))};var y2=(j,X,$,J,K="start",Q,q=KJ)=>{return q(j,X,$,J,Q,K)},DJ=(j,X)=>{return j.start===X.start&&j.end===X.end},NJ=(j,X)=>{return j>=X.start&&j<=X.end},WJ=(j)=>{if(j.end<j.start)return 0;return j.end-j.start+1};var VJ=(j,X)=>{let $=[],J=[];for(let K=j.start;K<=j.end;K++)if(K<X.start||K>X.end)J.push(K);for(let K=X.start;K<=X.end;K++)if(K<j.start||K>j.end)$.push(K);return{add:$,remove:J}};t2();var GJ=(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 X=null,$=null,J=[],K=[];return{name:"withSections",priority:10,setup(Q){let{dom:q,config:Z,rawConfig:_}=Q,{classPrefix:U}=Z;if(Z.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");let L=_.item.height;J=_.items?[..._.items]:[];let z=J.length,y={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};X=qj(z,y),K=g2(J,X.groups);let N=m2(X,L);Q.setHeightConfig(N),Q.rebuildHeightCache(K.length),Q.dataManager.setItems(K,0,K.length);let B=_.item.template,{headerTemplate:W}=j,A=(G,k,g)=>{if(P2(G))return W(G.groupKey,G.groupIndex);return B(G,k,g)},E=Q.methods.get("_getGridLayout"),H=Q.methods.get("_replaceGridRenderer"),V=Q.methods.get("_updateGridLayoutForGroups");if(E&&H){if(V)V((t)=>{let s=K[t];return!!(s&&P2(s))});let{createGridRenderer:G}=(Yj(),cJ(_J)),k=E(),g=G(q.items,A,Q.heightCache,k,U,Q.getContainerWidth(),()=>Q.dataManager.getTotal(),Z.ariaIdPrefix);H(g)}else Q.replaceTemplate(A);if(q.root.classList.add(`${U}--grouped`),j.sticky!==!1){$=Kj(q.root,X,Q.heightCache,{...y,sticky:y.sticky??!1},U);let G=$;Q.afterScroll.push((k,g)=>{G.update(k)}),$.update(Q.scrollController.getScrollTop())}let O=()=>{if(!X)return;X.rebuild(J.length),K=g2(J,X.groups);let G=m2(X,L);if(Q.setHeightConfig(G),Q.rebuildHeightCache(K.length),Q.dataManager.setItems(K,0,K.length),$)$.refresh()};Q.methods.set("setItems",(G)=>{J=[...G],O()}),Q.methods.set("appendItems",(G)=>{J=[...J,...G],O()}),Q.methods.set("prependItems",(G)=>{J=[...G,...J],O()}),Q.methods.set("removeItem",(G)=>{J=J.filter((k)=>k.id!==G),O()});let{animateScroll:M,cancelScroll:R}=_4(Q.scrollController,Q.renderIfNeeded);Q.methods.set("scrollToIndex",(G,k)=>{let g=X.dataToLayoutIndex(G),{align:t,behavior:s,duration:j2}=G4(k),e=Q.dataManager.getTotal(),T=y2(g,Q.heightCache,Q.state.viewportState.containerHeight,e,t,Q.getCachedCompression());if(s==="smooth")M(Q.scrollController.getScrollTop(),T,j2);else R(),Q.scrollController.scrollTo(T)}),Q.methods.set("_getItems",()=>J),Q.methods.set("_getTotal",()=>J.length),Q.destroyHandlers.push(()=>{if(O2!==null)cancelAnimationFrame(O2),O2=null;if($)$.destroy(),$=null;q.root.classList.remove(`${U}--grouped`)})},destroy(){if($)$.destroy(),$=null}}},bj=300,V4=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,O2=null,_4=(j,X)=>{let $=()=>{if(O2!==null)cancelAnimationFrame(O2),O2=null};return{animateScroll:(K,Q,q)=>{if($(),Math.abs(Q-K)<1){j.scrollTo(Q);return}let Z=performance.now(),_=(U)=>{let D=U-Z,L=Math.min(D/q,1),z=K+(Q-K)*V4(L);if(j.scrollTo(z),X(),L<1)O2=requestAnimationFrame(_);else O2=null};O2=requestAnimationFrame(_)},cancelScroll:$}},G4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:bj};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??bj};return{align:"start",behavior:"auto",duration:bj}};var Zj=(j)=>{let X=Math.max(1,Math.floor(j.columns)),$=j.gap??0,J=j.isHeaderFn,K={row:0,col:0},Q=(N)=>{if(N<=0)return 0;if(!J)return Math.ceil(N/X);let B=0,W=0,A=0;for(let E=0;E<N;E++)if(J(E)){if(A++,W>0)B++,W=0;B++,W=0}else if(W++,W>=X)B++,W=0;if(W>0)B++;return B},q=(N)=>{return K.row=Z(N),K.col=_(N),K},Z=(N)=>{if(!J)return Math.floor(N/X);let B=0,W=0;for(let A=0;A<=N;A++)if(J(A)){if(W>0)B++,W=0;if(A===N)return B;B++,W=0}else{if(A===N)return B;if(W++,W>=X)B++,W=0}return console.warn(`⚠️ getRow(${N}) fell through - returning ${B}`),B},_=(N)=>{if(!J)return N%X;if(J(N))return 0;let B=0;for(let W=0;W<=N;W++)if(J(W))B=0;else{if(W===N)return B;if(B++,B>=X)B=0}return B},U=(N,B,W)=>{if(W<=0)return{start:0,end:-1};if(!J){let O=Math.max(0,N*X),M=Math.min(W-1,(B+1)*X-1);return{start:O,end:M}}let A=-1,E=-1,H=0,V=0;for(let O=0;O<W;O++){if(J(O)){if(V>0)H++,V=0;if(H>=N&&H<=B){if(A===-1)A=O;E=O}H++,V=0}else{if(H>=N&&H<=B){if(A===-1)A=O;E=O}if(V++,V>=X)H++,V=0}if(H>B&&V===0)break}if(A===-1)return{start:0,end:-1};return{start:A,end:E}},D=(N,B,W)=>{if(B<0||B>=X)return-1;let A=N*X+B;if(A<0||A>=W)return-1;return A},L=(N)=>{let B=(X-1)*$;return Math.max(0,(N-B)/X)};return{get columns(){return X},get gap(){return $},update:(N)=>{if(N.columns!==void 0)X=Math.max(1,Math.floor(N.columns));if(N.gap!==void 0)$=N.gap;if(N.isHeaderFn!==void 0)J=N.isHeaderFn},getTotalRows:Q,getPosition:q,getRow:Z,getCol:_,getItemRange:U,getItemIndex:D,getColumnWidth:L,getColumnOffset:(N,B)=>{let W=L(B);return N*(W+$)}}};Yj();var MJ=(j)=>{if(!j.columns||j.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let X=null,$=null;return{name:"withGrid",priority:10,setup(J){let{dom:K,emitter:Q,config:q,rawConfig:Z}=J,{classPrefix:_}=q;if(q.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(q.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let U=Z.items?.some((V)=>V.__groupHeader===!0),D={columns:j.columns,gap:j.gap??0};if(U)D.isHeaderFn=(V)=>{let O=J.dataManager.getItem(V);return!!(O&&O.__groupHeader===!0)};X=Zj(D);let L=X.gap;J.setVirtualTotalFn(()=>{let V=J.dataManager.getTotal();return X.getTotalRows(V)});let z=Z.item,y=q.horizontal?z.width:z.height,N={containerWidth:J.getContainerWidth(),columns:X.columns,gap:X.gap};if(typeof y==="function")J.setHeightConfig((V)=>{let O=N.containerWidth-2,M=(N.columns-1)*N.gap,R=(O-M)/N.columns,G={containerWidth:N.containerWidth,columns:N.columns,gap:N.gap,columnWidth:R,row:X.getRow(V),column:X.getCol(V),totalRows:X.getTotalRows(J.dataManager.getTotal()),totalColumns:N.columns};return y(V,G)+N.gap});else if(L>0)J.setHeightConfig(y+L);J.rebuildHeightCache(),K.root.classList.add(`${_}--grid`);let B=J.getContainerWidth(),W=Z.item.template,A=()=>{$=d2(K.items,W,J.heightCache,X,_,B,()=>J.dataManager.getTotal(),q.ariaIdPrefix),J.replaceRenderer($)};A(),J.methods.set("_getGridLayout",()=>X),J.methods.set("_getGridConfig",()=>D),J.methods.set("_replaceGridRenderer",(V)=>{$=V}),J.methods.set("_updateGridLayoutForGroups",(V)=>{X.update({isHeaderFn:V});let O=J.dataManager.getTotal(),M=0;for(let R=0;R<O;R++)if(X.getCol(R)===0){let G=J.heightCache.getHeight(R);M+=G}J.heightCache.getTotalHeight=()=>M,J.dom.content.style.height=`${M}px`,A()}),J.methods.set("updateGrid",(V)=>{if(V.columns!==void 0){if(!Number.isInteger(V.columns)||V.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");D.columns=V.columns}if(V.gap!==void 0){if(V.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");D.gap=V.gap}if(X)X.update(D);let O=J.getContainerWidth();if(N.containerWidth=O,N.columns=D.columns,N.gap=D.gap??0,$)$.updateContainerWidth(O);J.rebuildHeightCache(),J.updateContentSize(J.heightCache.getTotalHeight()),J.updateCompressionMode();for(let M=0;M<J.contentSizeHandlers.length;M++)J.contentSizeHandlers[M]();if($)$.clear();J.forceRender()});let E=()=>{if(J.state.isDestroyed)return;let V=J.scrollController.getScrollTop(),O=J.state.viewportState.containerHeight,M=J.getVirtualTotal(),R={start:0,end:0};if(M===0||O===0)R.start=0,R.end=0;else{R.start=Math.max(0,J.heightCache.indexAtOffset(V));let S=J.heightCache.indexAtOffset(V+O);if(S<M-1)S++;R.end=Math.min(M-1,Math.max(0,S))}let G=q.overscan??3,k={start:Math.max(0,R.start-G),end:Math.min(M-1,R.end+G)};J.state.viewportState.scrollTop=V,J.state.viewportState.visibleRange=R,J.state.viewportState.renderRange=k;let g=J.state.lastRenderRange,t=J.state.viewportState.isCompressed;if(k.start===g.start&&k.end===g.end){if(t)$.updatePositions(J.getCompressionContext());return}let s=J.dataManager.getTotal(),j2=X.getItemRange(k.start,k.end,s),e=J.dataManager.getItemsInRange(j2.start,j2.end),T=t?J.getCompressionContext():void 0;$.render(e,j2,new Set,-1,T),J.state.lastRenderRange={...k},Q.emit("range:change",{range:k})},H=()=>{if(J.state.isDestroyed)return;J.state.lastRenderRange={start:-1,end:-1},E()};if(J.setRenderFns(E,H),J.resizeHandlers.push((V,O)=>{if($)$.updateContainerWidth(V)}),J.methods.set("scrollToIndex",(V,O)=>{let M=Math.floor(V/j.columns),{align:R,behavior:G}=M4(O),k=J.dataManager.getState(),g=X.getTotalRows(k.total),t=Math.max(0,Math.min(M,g-1)),s=y2(t,J.heightCache,J.state.viewportState.containerHeight,g,R,J.getCachedCompression());if(G==="smooth")J.scrollController.scrollTo(s);else J.scrollController.scrollTo(s)}),!J.methods.has("_getTotal"))J.methods.set("_getTotal",()=>J.dataManager.getTotal());J.destroyHandlers.push(()=>{if($)$.destroy(),$=null;K.root.classList.remove(`${_}--grid`)})},destroy(){if($)$.destroy(),$=null}}},Pj=300,M4=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:Pj};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??Pj};return{align:"start",behavior:"auto",duration:Pj}};Yj();var Bj=(j)=>({selected:new Set(j??[]),focusedIndex:-1}),c2=(j,X,$)=>{if($==="none")return j;let J=new Set(j.selected);if($==="single"){if(J.clear(),X.length>0)J.add(X[0])}else for(let K of X)J.add(K);return{...j,selected:J}},l2=(j,X)=>{let $=new Set(j.selected);for(let J of X)$.delete(J);return{...j,selected:$}},w2=(j,X,$)=>{if($==="none")return j;if(j.selected.has(X))return l2(j,[X]);else return c2(j,[X],$)},Uj=(j,X,$)=>{if($!=="multiple")return j;return{...j,selected:new Set(X.map((J)=>J.id))}},Dj=(j)=>({...j,selected:new Set}),yj=(j,X)=>{return j.focusedIndex=X,j},Hj=(j,X,$=!0)=>{if(X===0)return j;let J=j.focusedIndex-1;if(J<0)J=$?X-1:0;return j.focusedIndex=J,j},Rj=(j,X,$=!0)=>{if(X===0)return j;let J=j.focusedIndex+1;if(J>=X)J=$?0:X-1;return j.focusedIndex=J,j},kj=(j,X)=>{if(X===0)return j;return j.focusedIndex=0,j},Tj=(j,X)=>{if(X===0)return j;return j.focusedIndex=X-1,j};var AJ=(j,X)=>{return j.selected.has(X)},S2=(j)=>{return Array.from(j.selected)},v2=(j,X)=>{let $=[];for(let J of j.selected){let K=X(J);if(K)$.push(K)}return $};var EJ=(j)=>{let X=j?.mode??"single",$=j?.initial,J=Bj($),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(Q){let{dom:q,emitter:Z,config:_}=Q,{classPrefix:U,ariaIdPrefix:D}=_;if(X==="none"){Q.methods.set("select",()=>{}),Q.methods.set("deselect",()=>{}),Q.methods.set("toggleSelect",()=>{}),Q.methods.set("selectAll",()=>{}),Q.methods.set("clearSelection",()=>{}),Q.methods.set("getSelected",()=>[]),Q.methods.set("getSelectedItems",()=>[]),Q.methods.set("setSelectionMode",()=>{});return}let{renderIfNeeded:L,forceRender:z}=Q.getRenderFns(),y=()=>{Q.dom.items.querySelectorAll("[data-index]").forEach((H)=>{let V=H,O=V.dataset.id;if(O!==void 0){let M=/^\d+$/.test(O)?parseInt(O,10):O,R=J.selected.has(M),k=parseInt(V.dataset.index??"-1",10)===J.focusedIndex;V.classList.toggle(`${U}-item--selected`,R),V.classList.toggle(`${U}-item--focused`,k),V.ariaSelected=R?"true":"false"}})},N=()=>{if(Q.state.isDestroyed)return;L(),y()},B=()=>{if(Q.state.isDestroyed)return;z(),y()};Q.setRenderFns(N,B);let W=()=>{y(),Z.emit("selection:change",{selected:S2(J),items:v2(J,(E)=>Q.dataManager.getItemById(E))})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${U}-live-region`,K.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",q.root.appendChild(K);let A=K;Z.on("selection:change",({selected:E})=>{let H=E.length;if(H===0)A.textContent="";else if(H===1)A.textContent="1 item selected";else A.textContent=`${H} items selected`}),Q.clickHandlers.push((E)=>{if(Q.state.isDestroyed)return;let V=E.target.closest("[data-index]");if(!V)return;let O=parseInt(V.dataset.index??"-1",10);if(O<0)return;let M=Q.dataManager.getItem(O);if(!M)return;Z.emit("item:click",{item:M,index:O,event:E}),J=yj(J,O),q.root.setAttribute("aria-activedescendant",`${D}-item-${O}`),J=w2(J,M.id,X),W()}),Q.keydownHandlers.push((E)=>{if(Q.state.isDestroyed)return;let H=Q.dataManager.getTotal(),V=J.focusedIndex,O=!1,M=!1,R=J;switch(E.key){case"ArrowUp":R=Hj(J,H),O=!0,M=!0;break;case"ArrowDown":R=Rj(J,H),O=!0,M=!0;break;case"Home":R=kj(J,H),O=!0,M=!0;break;case"End":R=Tj(J,H),O=!0,M=!0;break;case" ":case"Enter":if(J.focusedIndex>=0){let G=Q.dataManager.getItem(J.focusedIndex);if(G)R=w2(J,G.id,X);O=!0}break}if(O){E.preventDefault(),J=R;let G=J.focusedIndex;if(G>=0){let k=Q.dataManager.getState(),g=y2(G,Q.heightCache,Q.state.viewportState.containerHeight,k.total,"center",Q.getCachedCompression());Q.scrollController.scrollTo(g),q.root.setAttribute("aria-activedescendant",`${D}-item-${G}`)}else q.root.removeAttribute("aria-activedescendant");if(M){let{selected:k}=J;if(V>=0&&V!==G){let g=Q.dataManager.getItem(V);if(g)Q.renderer.updateItemClasses(V,k.has(g.id),!1)}if(G>=0){let g=Q.dataManager.getItem(G);if(g)Q.renderer.updateItemClasses(G,k.has(g.id),!0)}}else B(),Z.emit("selection:change",{selected:S2(J),items:v2(J,(k)=>Q.dataManager.getItemById(k))})}}),Q.methods.set("select",(...E)=>{J=c2(J,E,X),W()}),Q.methods.set("deselect",(...E)=>{J=l2(J,E),W()}),Q.methods.set("toggleSelect",(E)=>{J=w2(J,E,X),W()}),Q.methods.set("selectAll",()=>{if(X!=="multiple")return;let E=Q.getAllLoadedItems();J=Uj(J,E,X),W()}),Q.methods.set("clearSelection",()=>{J=Dj(J);let{renderRange:E,isCompressed:H}=Q.state.viewportState,V=Q.getItemsForRange(E),O=H?Q.getCompressionContext():void 0;Q.renderer.render(V,E,J.selected,J.focusedIndex,O),Z.emit("selection:change",{selected:[],items:[]})}),Q.methods.set("getSelected",()=>{return S2(J)}),Q.methods.set("getSelectedItems",()=>{return v2(J,(E)=>Q.dataManager.getItemById(E))}),Q.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var FJ=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(j){j.methods.set("getScrollSnapshot",()=>{let X=j.scrollController.getScrollTop(),$=j.getCachedCompression(),J=j.getVirtualTotal(),K=j.methods.get("getSelected"),Q=K&&K().length>0?K():void 0;if(J===0){let U={index:0,offsetInItem:0};if(Q)U.selectedIds=Q;return U}let q,Z;if($.isCompressed){let D=X/$.virtualHeight*J;q=Math.max(0,Math.min(Math.floor(D),J-1)),Z=(D-q)*j.heightCache.getHeight(q)}else q=j.heightCache.indexAtOffset(X),Z=X-j.heightCache.getOffset(q);Z=Math.max(0,Z);let _={index:q,offsetInItem:Z};if(Q)_.selectedIds=Q;return _}),j.methods.set("restoreScroll",(X)=>{let{index:$,offsetInItem:J,selectedIds:K}=X,Q=j.getCachedCompression(),q=j.getVirtualTotal();if(q===0)return;let Z=Math.max(0,Math.min($,q-1)),_;if(Q.isCompressed){let D=j.heightCache.getHeight(Z),L=D>0?J/D:0;_=(Z+L)/q*Q.virtualHeight}else _=j.heightCache.getOffset(Z)+J;let U=Math.max(0,Q.virtualHeight-j.state.viewportState.containerHeight);if(_=Math.max(0,Math.min(_,U)),j.scrollController.scrollTo(_),K&&K.length>0){let D=j.methods.get("select");if(D)D(...K)}})}}};var LJ=()=>{let j={},X=(Z,_)=>{if(!j[Z])j[Z]=new Set;return j[Z].add(_),()=>$(Z,_)},$=(Z,_)=>{j[Z]?.delete(_)};return{on:X,off:$,emit:(Z,_)=>{j[Z]?.forEach((U)=>{try{U(_)}catch(D){console.error(`[vlist] Error in event handler for "${String(Z)}":`,D)}})},once:(Z,_)=>{let U=(D)=>{$(Z,U),_(D)};return X(Z,U)},clear:(Z)=>{if(Z)delete j[Z];else for(let _ in j)delete j[_]},listenerCount:(Z)=>{return j[Z]?.size??0}}};export{FJ as withSnapshots,EJ as withSelection,GJ as withSections,oj as withScrollbar,ej as withScale,JJ as withPage,MJ as withGrid,jJ as withAsync,hj as vlist,w2 as toggleSelection,XJ as simpleVisibleRange,c2 as selectItems,Uj as selectAll,DJ as rangesEqual,jj as rafThrottle,aj as needsScaling,$j as mergeRanges,AJ as isSelected,P2 as isSectionHeader,b2 as isPlaceholderItem,NJ as isInRange,v2 as getSelectedItems,S2 as getSelectedIds,E2 as getScaleState,nj as getScaleInfo,E2 as getScale,WJ as getRangeCount,rj as getMaxItemsWithoutScaling,Oj as filterPlaceholders,VJ as diffRanges,l2 as deselectItems,Kj as createStickyHeader,Jj as createSparseStorage,Bj as createSelectionState,m2 as createSectionedHeightFn,qj as createSectionLayout,C2 as createScrollbar,tj as createScrollController,Qj as createPlaceholderManager,cj as createHeightCache,d2 as createGridRenderer,Zj as createGridLayout,LJ as createEmitter,Xj as createAsyncManager,Dj as clearSelection,UJ as clampScrollPosition,YJ as calculateTotalHeight,y2 as calculateScrollToIndex,o2 as calculateScaledVisibleRange,i2 as calculateScaledScrollToIndex,lj as calculateScaledRenderRange,T2 as calculateScaledItemPosition,qJ as calculateRenderRange,h2 as calculateMissingRanges,BJ as calculateItemOffset,sj as calculateIndexFromScrollPosition,ZJ as calculateActualHeight,g2 as buildLayoutItems,z2 as MAX_VIRTUAL_HEIGHT};
|
|
@@ -73,7 +73,6 @@ export declare const calculateCompressedRenderRange: (visibleRange: Range, overs
|
|
|
73
73
|
* @param totalItems - Total number of items
|
|
74
74
|
* @param containerHeight - Viewport container height
|
|
75
75
|
* @param compression - Compression state
|
|
76
|
-
* @param _rangeStart - (unused, kept for API compatibility)
|
|
77
76
|
*/
|
|
78
77
|
export declare const calculateCompressedItemPosition: (index: number, scrollTop: number, heightCache: HeightCache, totalItems: number, containerHeight: number, compression: CompressionState, _rangeStart?: number) => number;
|
|
79
78
|
/**
|
package/dist/scale/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var b=16000000;var Ky=(j,Y,K,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.ceil(K/j.getHeight(0));let Q=0,y=0,N=Y;while(N<J&&y<K)y+=j.getHeight(N),Q++,N++;return Math.max(1,Q)},s=(j,Y,K)=>{if(K===0)return 0;if(!j.isVariable())return Math.floor(Y/j.getHeight(0));let J=0,Q=0;for(let y=K-1;y>=0;y--){let N=j.getHeight(y);if(Q+N>Y)break;Q+=N,J++}return Math.max(J,1)},Qy=(j,Y,K)=>{if(K===0)return 0;let J=Math.floor(Y),Q=Y-J,y=Math.max(0,Math.min(J,K-1));return j.getOffset(y)+Q*j.getHeight(y)};var v=(j,Y)=>{let K=Y.getTotalHeight(),J=K>b,Q=J?b:K,y=K>0?Q/K:1;return{isCompressed:J,actualHeight:K,virtualHeight:Q,ratio:y}},c=(j,Y,K,J,Q,y)=>{if(J===0||Y===0)return y.start=0,y.end=-1,y;if(!Q.isCompressed){let W=K.indexAtOffset(j),$=K.indexAtOffset(j+Y);if($<J-1)$++;return y.start=Math.max(0,W),y.end=Math.min(J-1,Math.max(0,$)),y}let{virtualHeight:N}=Q,M=j/N*J,_=Math.floor(M),F=Ky(K,Math.max(0,_),Y,J),V=Math.ceil(M)+F,E=N-Y-j;if(E<=Y&&E>=-1){let W=s(K,Y,J),$=Math.max(0,J-W),q=Math.max(0,Math.min(1,1-E/Y));_=Math.floor(_+($-_)*q),V=E<=1?J-1:Math.min(J-1,_+F)}return y.start=Math.max(0,_),y.end=Math.min(J-1,Math.max(0,V)),y},Gy=(j,Y,K,J)=>{if(K===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-Y),J.end=Math.min(K-1,j.end+Y),J},r=(j,Y,K,J,Q,y,N)=>{if(!y.isCompressed||J===0)return K.getOffset(j);let{virtualHeight:k}=y,M=k-Q,_=M-Y;if(_<=Q&&_>=-1){if(Y>=M-1){let X=K.getTotalHeight()-K.getOffset(j);return Q-X}let E=s(K,Q,J),W=Math.max(0,J-E),q=Y/k*J,L=Math.max(0,Math.min(1,1-_/Q)),O=K.getOffset(j)-K.getOffset(W),B=K.getOffset(j)-Qy(K,q,J);return B+(O-B)*L}let F=Y/k,V=K.getTotalHeight(),U=F*V;return K.getOffset(j)-U},l=(j,Y,K,J,Q,y="start")=>{if(J===0)return 0;let N;if(Q.isCompressed){if(y==="end"&&j===J-1)return Math.max(0,Q.virtualHeight-K);N=j/J*Q.virtualHeight}else N=Y.getOffset(j);let k=Y.getHeight(j);switch(y){case"center":N-=(K-k)/2;break;case"end":N-=K-k;break}let M=Q.virtualHeight-K;return Math.max(0,Math.min(N,M))},Uy=(j,Y,K,J)=>{if(K===0)return 0;if(J.isCompressed){let Q=j/J.virtualHeight;return Math.floor(Q*K)}return Y.indexAtOffset(j)},Dy=(j,Y)=>{if(typeof Y==="number")return j*Y>b;return Y.getTotalHeight()>b},_y=(j)=>{if(j<=0)return 0;return Math.floor(b/j)},Ey=(j,Y)=>{let K=v(j,Y);if(!K.isCompressed)return`No compression needed (${j} items, ${(K.actualHeight/1e6).toFixed(2)}M px)`;return`Compressed to ${(K.ratio*100).toFixed(1)}% (${j} items, ${(K.actualHeight/1e6).toFixed(1)}M px → ${(K.virtualHeight/1e6).toFixed(1)}M px virtual)`};var a=(j,Y,K={},J="vlist",Q=!1)=>{let{autoHide:y=!0,autoHideDelay:N=1000,minThumbSize:k=30,showOnHover:M=!0,hoverZoneWidth:_=16,showOnViewportEnter:F=!0}=K,V=0,U=0,E=0,W=0,$=!1,q=!1,L=0,O=0,B=0,X=null,A=!1,R=null,w=null,Yy=Q?"width":"height",i=Q?"translateX":"translateY",u=Q?(D)=>D.clientX:(D)=>D.clientY,$y=Q?"left":"top",G=document.createElement("div"),z=document.createElement("div"),Z=M?document.createElement("div"):null,Ny=()=>{if(G.className=`${J}-scrollbar`,z.className=`${J}-scrollbar-thumb`,Q)G.classList.add(`${J}-scrollbar--horizontal`);if(G.appendChild(z),j.appendChild(G),Z){if(Z.className=`${J}-scrollbar-hover`,Q)Z.classList.add(`${J}-scrollbar-hover--horizontal`),Z.style.height=`${_}px`;else Z.style.width=`${_}px`;j.appendChild(Z)}},f=()=>{if(X)clearTimeout(X),X=null},T=()=>{if(!y)return;f(),X=setTimeout(x,N)},H=()=>{if(V<=U)return;if(f(),!A)G.classList.add(`${J}-scrollbar--visible`),A=!0;if(y&&!$&&!q)T()},x=()=>{if($||q)return;G.classList.remove(`${J}-scrollbar--visible`),A=!1},Wy=(D,C)=>{V=D,U=C;let S=V>U;if(G.style.display=S?"":"none",!S){x();return}let P=U/V;E=Math.max(k,P*U),z.style[Yy]=`${E}px`,W=U-E,o(B)},o=(D)=>{if(B=D,V<=U||W<=0)return;let C=V-U,P=Math.min(1,Math.max(0,D/C))*W;z.style.transform=`${i}(${P}px)`},e=(D)=>{if(D.target===z)return;let C=G.getBoundingClientRect(),m=u(D)-C[$y]-E/2,Jy=Math.max(0,Math.min(m,W))/W,n=V-U,qy=Jy*n;Y(qy),H()},t=(D)=>{D.preventDefault(),D.stopPropagation(),$=!0,L=u(D),O=B,f(),G.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",d),document.addEventListener("mouseup",g)},d=(D)=>{if(!$)return;let C=u(D)-L,S=W>0?C/W:0,P=V-U,m=S*P,h=Math.max(0,Math.min(O+m,P)),n=h/P*W;if(z.style.transform=`${i}(${n}px)`,w=h,R===null)R=requestAnimationFrame(()=>{if(w!==null)Y(w);R=null})},g=()=>{if($=!1,R!==null)cancelAnimationFrame(R),R=null;if(w!==null)Y(w),w=null;if(G.classList.remove(`${J}-scrollbar--dragging`),y&&!q)T();document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",g)},yy=()=>{if(F)H()},jy=()=>{if(!$){if(q=!1,y)T()}},p=()=>{q=!0,f(),H()},I=()=>{if(q=!1,!$&&y)T()},Xy=()=>{if(f(),R!==null)cancelAnimationFrame(R),R=null;if(G.removeEventListener("click",e),G.removeEventListener("mouseenter",p),G.removeEventListener("mouseleave",I),z.removeEventListener("mousedown",t),j.removeEventListener("mouseenter",yy),j.removeEventListener("mouseleave",jy),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",g),Z){if(Z.removeEventListener("mouseenter",p),Z.removeEventListener("mouseleave",I),Z.parentNode)Z.parentNode.removeChild(Z)}if(G.parentNode)G.parentNode.removeChild(G)};if(Ny(),G.addEventListener("click",e),G.addEventListener("mouseenter",p),G.addEventListener("mouseleave",I),z.addEventListener("mousedown",t),j.addEventListener("mouseenter",yy),j.addEventListener("mouseleave",jy),Z)Z.addEventListener("mouseenter",p),Z.addEventListener("mouseleave",I);return{show:H,hide:x,updateBounds:Wy,updatePosition:o,isVisible:()=>A,destroy:Xy}};var Ly=0.65,Oy=0.5,By=()=>{let j=null,Y=0,K=!1,J=0,Q=null;return{name:"withScale",priority:20,setup(y){let{dom:N,config:k}=y,{classPrefix:M,horizontal:_}=k,F=()=>{let W=y.getVirtualTotal(),$=v(W,y.heightCache);if($.isCompressed&&!K){K=!0,y.scrollController.enableCompression($),y.updateContentSize($.virtualHeight),y.setScrollFns(()=>Y,(X)=>{if(Y=X,J=X,Q!==null)cancelAnimationFrame(Q),Q=null});let q=()=>{let X=J-Y;if(Math.abs(X)<Oy)Y=J,Q=null;else Y+=X*Ly,Q=requestAnimationFrame(q);y.scrollController.scrollTo(Y)},L=N.viewport,O=(X)=>{X.preventDefault();let R=y.getCachedCompression().virtualHeight-y.state.viewportState.containerHeight;if(J=Math.max(0,Math.min(J+X.deltaY,R)),Q===null)Q=requestAnimationFrame(q)};if(L.addEventListener("wheel",O,{passive:!1}),y.destroyHandlers.push(()=>{if(L.removeEventListener("wheel",O),Q!==null)cancelAnimationFrame(Q),Q=null}),!N.viewport.querySelector(`.${M}-scrollbar-track`)){if(j=a(N.viewport,(A)=>y.scrollController.scrollTo(A),{},M,_),!N.viewport.classList.contains(`${M}-viewport--custom-scrollbar`))N.viewport.classList.add(`${M}-viewport--custom-scrollbar`);j.updateBounds($.virtualHeight,y.state.viewportState.containerHeight);let X=j;y.afterScroll.push((A,R)=>{if(X)X.updatePosition(A),X.show()}),y.resizeHandlers.push((A,R)=>{if(X){let w=y.getCachedCompression();X.updateBounds(w.virtualHeight,y.state.viewportState.containerHeight)}})}}else if(!$.isCompressed&&K)K=!1,y.scrollController.disableCompression(),y.updateContentSize($.actualHeight);else if($.isCompressed)y.scrollController.updateConfig({compression:$}),y.updateContentSize($.virtualHeight);if(j)j.updateBounds($.virtualHeight,y.state.viewportState.containerHeight);y.state.cachedCompression={state:$,totalItems:W}};y.updateCompressionMode=F;let V=y.getCachedCompression.bind(y);y.getCachedCompression=()=>{if(y.state.cachedCompression)return y.state.cachedCompression.state;return V()},y.setVisibleRangeFn((W,$,q,L,O)=>{U=null,E=null;let B=v(L,q);c(W,$,q,L,B,O)}),y.setScrollToPosFn((W,$,q,L,O)=>{let B=v(L,$);return l(W,$,q,L,B,O)});let U=null,E=null;y.setPositionElementFn((W,$)=>{let q=y.getVirtualTotal(),L=v(q,y.heightCache);if(L.isCompressed){let O=y.scrollController.getScrollTop();if(U===null||$<E)E=$,U=Math.round(r($,O,y.heightCache,q,y.state.viewportState.containerHeight,L));let B=U+y.heightCache.getOffset($)-y.heightCache.getOffset(E),X=y.config.horizontal;W.style.transform=X?`translateX(${B}px)`:`translateY(${B}px)`}else{let O=Math.round(y.heightCache.getOffset($)),B=y.config.horizontal;W.style.transform=B?`translateX(${O}px)`:`translateY(${O}px)`}}),F(),y.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;if(Q!==null)cancelAnimationFrame(Q),Q=null})},destroy(){if(j)j.destroy(),j=null;if(Q!==null)cancelAnimationFrame(Q),Q=null}}};export{By as withScale,Dy as needsCompression,_y as getMaxItemsWithoutCompression,v as getCompressionState,Ey as getCompressionInfo,Uy as calculateIndexFromScrollPosition,c as calculateCompressedVisibleRange,l as calculateCompressedScrollToIndex,Gy as calculateCompressedRenderRange,r as calculateCompressedItemPosition,b as MAX_VIRTUAL_HEIGHT};
|
package/dist/sections/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var{defineProperty:t,getOwnPropertyNames:Gj,getOwnPropertyDescriptor:Lj}=Object,Oj=Object.prototype.hasOwnProperty;var Xj=new WeakMap,Fj=(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 bj=(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 h=(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(_),w=j.getOffset(J)-Jj(j,k,Z);return w+(O-w)*G}let P=$/M*Z;return j.getOffset(J)-Jj(j,P,Z)};var Bj=()=>{};var _j={};bj(_j,{createGridRenderer:()=>vj});var wj=(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=wj(),W=new Map,F=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},w=`${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,F),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)`},b=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),L=U?F:Z.getColumnWidth(F),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=w,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));b(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=h(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)),b(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})}},m=(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),b(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-F)<1)return;F=N;for(let[K,U]of W)b(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:m,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],w=Z.headerTemplate(O.key,O.groupIndex),R=$.getHeaderHeight(k);if(q.style.height=`${R}px`,typeof w==="string")q.innerHTML=w;else q.replaceChildren(w)},F=(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 w=j.getOffset(G[0].headerLayoutIndex);if(k<w){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:F,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(),F=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,F))};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:"withSections",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,b,x)=>{if(h(B))return G(B.groupKey,B.groupIndex);return k(B,b,x)},w=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(w&&R){if(H)H((g)=>{let m=Q[g];return!!(m&&h(m))});let{createGridRenderer:B}=(Ej(),Fj(_j)),b=w(),x=B(X.items,O,q.heightCache,b,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((b,x)=>{B.update(b)}),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((b)=>b.id!==B),T()});let{animateScroll:v,cancelScroll:u}=Sj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(B,b)=>{let x=$.dataToLayoutIndex(B),{align:g,behavior:m,duration:o}=Hj(b),i=q.dataManager.getTotal(),r=Zj(x,q.heightCache,q.state.viewportState.containerHeight,i,g,q.getCachedCompression());if(m==="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 F=W-M,P=Math.min(F/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 withSections,h as isSectionHeader,h as isGroupHeader,qj as createStickyHeader,n as createGroupedHeightFn,jj as createGroupLayout,a as buildLayoutItems};
|
|
1
|
+
var{defineProperty:t,getOwnPropertyNames:Gj,getOwnPropertyDescriptor:Lj}=Object,Oj=Object.prototype.hasOwnProperty;var Kj=new WeakMap,Fj=(J)=>{var $=Kj.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 Kj.set(J,$),$};var bj=(J,$)=>{for(var j in $)t(J,j,{get:$[j],enumerable:!0,configurable:!0,set:(Z)=>$[j]=()=>Z})};var Xj=(J,$)=>()=>(J&&($=J(J=0)),$);var h=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var Mj=(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)},Dj=(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 Zj=16000000;var zj=(J,$)=>{let j=$.getTotalHeight(),Z=j>Zj,Q=Z?Zj: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 V=Mj(j,Q,Z),B=Math.max(0,Z-V),G=$/M*Z,O=Math.max(0,Math.min(1,1-W/Q)),w=j.getOffset(J)-j.getOffset(B),v=j.getOffset(J)-Dj(j,G,Z);return v+(w-v)*O}let F=$/M,P=j.getTotalHeight(),Y=F*P;return j.getOffset(J)-Y};var Bj=()=>{};var _j={};bj(_j,{createGridRenderer:()=>vj});var wj=(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=wj(),W=new Map,F=q,P=!1,Y=null,V=0,B="",_=(N)=>{if(Y&&V===N)return Y;return Y=zj(N,j),V=N,Y},G={selected:!1,focused:!1},O=(N,K)=>{return G.selected=N,G.focused=K,G},w=`${Q}-item ${Q}-grid-item`,v=`${Q}-item--selected`,R=`${Q}-item--focused`,S=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},T=(N,K,U)=>{N.classList.toggle(v,K),N.classList.toggle(R,U)},u=(N,K)=>{let U=Z.getRow(N);if(K){let L=K.totalItems,A=_(L);if(A.isCompressed)return kj(U,K.scrollTop,j,L,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},k=(N,K,U)=>{let L=N.dataset.id?.startsWith("__group_header"),A=L?0:Z.getCol(K),E=L?0:Z.getColumnOffset(A,F),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(E)}px, ${Math.round(y)}px)`},b=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),L=U?F:Z.getColumnWidth(F),A;if(P||U)A=j.getHeight(K)-Z.gap;else{let E=Z.getRow(K);A=j.getHeight(E)-Z.gap}N.style.width=`${L}px`,N.style.height=`${A}px`},x=(N,K,U,L,A)=>{let E=D.acquire(),y=O(U,L);if(E.className=w,E.dataset.index=String(N),E.dataset.id=String(K.id),E.dataset.row=String(Z.getRow(N)),E.dataset.col=String(Z.getCol(N)),E.ariaSelected=String(U),M)E.id=`${M}-item-${N}`;if(X)B=String(X()),E.setAttribute("aria-setsize",B),E.setAttribute("aria-posinset",String(N+1));b(E,N);let d=$(K,N,y);return S(E,d),T(E,U,L),k(E,N,A),E},g=(N,K,U,L,A)=>{if(K.start===0&&N.length>0)P=h(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 E=!1;if(X){let z=String(X());E=z!==B,B=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,H=W.get(z);if(H){let s=H.element.dataset.id,Nj=String(f.id);if(s!==Nj){let Pj=O(p,c),Aj=$(f,z,Pj);S(H.element,Aj),H.element.dataset.id=Nj,H.element.dataset.row=String(Z.getRow(z)),H.element.dataset.col=String(Z.getCol(z)),b(H.element,z)}if(T(H.element,p,c),H.element.ariaSelected=String(p),k(H.element,z,A),E)H.element.setAttribute("aria-setsize",B)}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})}},m=(N)=>{for(let[K,U]of W)k(U.element,K,N)},o=(N,K,U,L)=>{let A=W.get(N);if(A){let E=O(U,L),y=$(K,N,E);S(A.element,y),T(A.element,U,L),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),b(A.element,N)}},i=(N,K,U)=>{let L=W.get(N);if(L)T(L.element,K,U)},r=(N)=>{return W.get(N)?.element},Ej=(N)=>{if(Math.abs(N-F)<1)return;F=N;for(let[K,U]of W)b(U.element,K),k(U.element,K)},Qj=()=>{for(let[,N]of W)N.element.remove(),D.release(N.element);W.clear()};return{render:g,updatePositions:m,updateItem:o,updateItemClasses:i,getElement:r,updateContainerWidth:Ej,clear:Qj,destroy:()=>{Qj(),D.clear()}}};var Vj=Xj(()=>{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},Yj=(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},Wj=(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=Wj(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 V=e(j,Y),B=j[V];if(Y===B.headerLayoutIndex)return{type:"header",group:B};let _=Y-B.headerLayoutIndex-1;return{type:"item",dataIndex:B.firstDataIndex+_,group:B}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let V=e(j,Y),B=j[V];if(Y===B.headerLayoutIndex)return-1;let _=Y-B.headerLayoutIndex-1;return B.firstDataIndex+_},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let V=Yj(j,Y),B=j[V],_=Y-B.firstDataIndex;return B.headerLayoutIndex+1+_},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let V=e(j,Y);return j[V]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let V=Yj(j,Y);return j[V]},getHeaderHeight:typeof Q==="number"?(Y)=>Q:(Y)=>{let V=j[Y];if(!V)return 0;return Q(V.key,Y)},rebuild:(Y)=>{j=Wj(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=(_)=>{if(_===X)return;X=_;let G=$.groups;if(_<0||_>=G.length){q.textContent="";return}let O=G[_],w=Z.headerTemplate(O.key,O.groupIndex),v=$.getHeaderHeight(_);if(q.style.height=`${v}px`,typeof w==="string")q.innerHTML=w;else q.replaceChildren(w)},F=(_)=>{let G=$.groups;if(G.length===0){Y();return}let O=0;for(let T=G.length-1;T>=0;T--)if(j.getOffset(G[T].headerLayoutIndex)<=_){O=T;break}let w=j.getOffset(G[0].headerLayoutIndex);if(_<w){Y();return}if(!M)P();W(O);let v=$.getHeaderHeight(O),R=0,S=O+1;if(S<G.length){let u=j.getOffset(G[S].headerLayoutIndex)-_;if(u<v)R=u-v}if(R!==D)D=R,q.style.transform=R===0?"":`translateY(${Math.round(R)}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=""},V=()=>{let _=X;if(X=-1,_>=0)W(_)},B=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:F,refresh:V,show:P,hide:Y,destroy:B}};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(),F=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,F))};var Jj=(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:"withSections",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,V={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};$=jj(Y,V),Q=a(Z,$.groups);let B=n($,P);q.setHeightConfig(B),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length);let _=D.item.template,{headerTemplate:G}=J,O=(k,b,x)=>{if(h(k))return G(k.groupKey,k.groupIndex);return _(k,b,x)},w=q.methods.get("_getGridLayout"),v=q.methods.get("_replaceGridRenderer"),R=q.methods.get("_updateGridLayoutForGroups");if(w&&v){if(R)R((g)=>{let m=Q[g];return!!(m&&h(m))});let{createGridRenderer:k}=(Vj(),Fj(_j)),b=w(),x=k(X.items,O,q.heightCache,b,W,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);v(x)}else q.replaceTemplate(O);if(X.root.classList.add(`${W}--grouped`),J.sticky!==!1){j=qj(X.root,$,q.heightCache,{...V,sticky:V.sticky??!1},W);let k=j;q.afterScroll.push((b,x)=>{k.update(b)}),j.update(q.scrollController.getScrollTop())}let S=()=>{if(!$)return;$.rebuild(Z.length),Q=a(Z,$.groups);let k=n($,P);if(q.setHeightConfig(k),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length),j)j.refresh()};q.methods.set("setItems",(k)=>{Z=[...k],S()}),q.methods.set("appendItems",(k)=>{Z=[...Z,...k],S()}),q.methods.set("prependItems",(k)=>{Z=[...k,...Z],S()}),q.methods.set("removeItem",(k)=>{Z=Z.filter((b)=>b.id!==k),S()});let{animateScroll:T,cancelScroll:u}=Sj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(k,b)=>{let x=$.dataToLayoutIndex(k),{align:g,behavior:m,duration:o}=Hj(b),i=q.dataManager.getTotal(),r=Jj(x,q.heightCache,q.state.viewportState.containerHeight,i,g,q.getCachedCompression());if(m==="smooth")T(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}}},$j=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 F=W-M,P=Math.min(F/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:$j};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??$j};return{align:"start",behavior:"auto",duration:$j}};export{Rj as withSections,h as isSectionHeader,h as isGroupHeader,qj as createStickyHeader,n as createGroupedHeightFn,jj as createGroupLayout,a as buildLayoutItems};
|
package/dist/vlist.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--vlist-bg:#ffffff;--vlist-bg-hover:#f9fafb;--vlist-bg-selected:#eff6ff;--vlist-bg-selected-hover:#dbeafe;--vlist-border:#e5e7eb;--vlist-border-selected:#3b82f6;--vlist-text:#111827;--vlist-text-muted:#6b7280;--vlist-focus-ring:#3b82f6;--vlist-scrollbar-thumb:#d1d5db;--vlist-scrollbar-thumb-hover:#9ca3af;--vlist-scrollbar-width:8px;--vlist-scrollbar-track-bg:transparent;--vlist-scrollbar-custom-thumb-bg:rgba(0,0,0,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(0,0,0,0.5);--vlist-scrollbar-custom-thumb-radius:4px;--vlist-item-padding-x:1rem;--vlist-item-padding-y:0.75rem;--vlist-border-radius:0.5rem;--vlist-transition-duration:150ms;--vlist-transition-timing:ease-in-out}@media (prefers-color-scheme:dark){:root{--vlist-bg:#111827;--vlist-bg-hover:#1f2937;--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.3);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-scrollbar-thumb:#4b5563;--vlist-scrollbar-thumb-hover:#6b7280;--vlist-scrollbar-custom-thumb-bg:rgba(255,255,255,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(255,255,255,0.5)}}.dark{--vlist-bg:#111827;--vlist-bg-hover:#1f2937;--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.3);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-scrollbar-thumb:#4b5563;--vlist-scrollbar-thumb-hover:#6b7280;--vlist-scrollbar-custom-thumb-bg:rgba(255,255,255,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(255,255,255,0.5)}.vlist{position:relative;width:100%;height:100%;overflow:hidden;background-color:var(--vlist-bg);color:var(--vlist-text);border:1px solid var(--vlist-border);border-radius:var(--vlist-border-radius);outline:none}.vlist:focus{outline:none}.vlist:focus-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:2px}.vlist-viewport{width:100%;height:100%;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--vlist-scrollbar-thumb) transparent}.vlist-viewport::-webkit-scrollbar{width:6px;height:6px}.vlist-viewport::-webkit-scrollbar-track{background:transparent}.vlist-viewport::-webkit-scrollbar-thumb{background-color:var(--vlist-scrollbar-thumb);border-radius:3px}.vlist-viewport::-webkit-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-thumb-hover)}.vlist-content{position:relative;width:100%}.vlist-items{position:relative;width:100%;contain:layout style}.vlist-item{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);border-bottom:1px solid var(--vlist-border);background-color:var(--vlist-bg);cursor:pointer;user-select:none;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box}.vlist--scrolling .vlist-item{transition:none}.vlist-item:hover{background-color:var(--vlist-bg-hover)}.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist-item--selected.vlist-item--focused{outline-color:var(--vlist-border-selected)}.vlist-scrollbar{position:absolute;top:0;right:0;width:var(--vlist-scrollbar-width);height:100%;background-color:var(--vlist-scrollbar-track-bg);opacity:0;transition:opacity 0.2s ease-out;z-index:10;pointer-events:none}.vlist-scrollbar-hover{position:absolute;top:0;right:0;height:100%;z-index:9;pointer-events:auto}.vlist-scrollbar-hover--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:auto}.vlist-scrollbar--visible{opacity:1;pointer-events:auto}.vlist-scrollbar-thumb{position:absolute;top:0;left:0;right:0;width:100%;background-color:var(--vlist-scrollbar-custom-thumb-bg);border-radius:var(--vlist-scrollbar-custom-thumb-radius);cursor:pointer;transition:background-color 0.15s ease-out}.vlist-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist-scrollbar--dragging{opacity:1;pointer-events:auto}.vlist-scrollbar--dragging .vlist-scrollbar-thumb{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist--grouped .vlist-item[data-id^="__group_header_"]{cursor:default;background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);z-index:1}.vlist--grouped .vlist-item[data-id^="__group_header_"]:hover{background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist-sticky-header{background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);contain:content}@media (prefers-color-scheme:dark){:root{--vlist-group-header-bg:#1e2433}}.dark{--vlist-group-header-bg:#1e2433}.vlist--scrolling .vlist-sticky-header{transition:none}.vlist--grid .vlist-items{contain:layout style}.vlist-grid-item{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);background-color:var(--vlist-bg);cursor:pointer;user-select:none;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;overflow:hidden}.vlist--grid .vlist-item{right:auto;border-bottom:none}.vlist--scrolling .vlist-grid-item{transition:none}.vlist-grid-item:hover{background-color:var(--vlist-bg-hover)}.vlist-grid-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-grid-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-grid-item.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist--horizontal{overflow:hidden}.vlist--horizontal .vlist-viewport{overflow-x:auto;overflow-y:hidden}.vlist--horizontal .vlist-content{height:100%;width:auto}.vlist--horizontal .vlist-items{height:100%;width:auto}.vlist--horizontal .vlist-item{position:absolute;top:0;bottom:0;left:0;right:auto;display:flex;align-items:center;justify-content:center;border-bottom:none;border-right:1px solid var(--vlist-border)}.vlist-scrollbar--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:var(--vlist-scrollbar-width)}.vlist-scrollbar--horizontal .vlist-scrollbar-thumb{top:0;left:0;width:auto;height:100%}.vlist-viewport--custom-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--custom-scrollbar::-webkit-scrollbar{display:none}
|
|
1
|
+
@keyframes vlist-fade-in{from{opacity:0.6}to{opacity:1}}@keyframes vlist-placeholder-pulse{0%,100%{opacity:0.6}50%{opacity:0.4}}:root{--vlist-bg:#ffffff;--vlist-bg-hover:#f9fafb;--vlist-bg-selected:#eff6ff;--vlist-bg-selected-hover:#dbeafe;--vlist-border:#e5e7eb;--vlist-border-selected:#3b82f6;--vlist-text:#111827;--vlist-text-muted:#6b7280;--vlist-focus-ring:#3b82f6;--vlist-scrollbar-thumb:#d1d5db;--vlist-scrollbar-thumb-hover:#9ca3af;--vlist-scrollbar-width:8px;--vlist-scrollbar-track-bg:transparent;--vlist-scrollbar-custom-thumb-bg:rgba(0,0,0,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(0,0,0,0.5);--vlist-scrollbar-custom-thumb-radius:4px;--vlist-item-padding-x:1rem;--vlist-item-padding-y:0.75rem;--vlist-border-radius:0.5rem;--vlist-transition-duration:150ms;--vlist-transition-timing:ease-in-out}@media (prefers-color-scheme:dark){:root{--vlist-bg:#111827;--vlist-bg-hover:#1f2937;--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.3);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-scrollbar-thumb:#4b5563;--vlist-scrollbar-thumb-hover:#6b7280;--vlist-scrollbar-custom-thumb-bg:rgba(255,255,255,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(255,255,255,0.5)}}.dark{--vlist-bg:#111827;--vlist-bg-hover:#1f2937;--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.3);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-scrollbar-thumb:#4b5563;--vlist-scrollbar-thumb-hover:#6b7280;--vlist-scrollbar-custom-thumb-bg:rgba(255,255,255,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(255,255,255,0.5)}.vlist{position:relative;width:100%;height:100%;overflow:hidden;background-color:var(--vlist-bg);color:var(--vlist-text);border:1px solid var(--vlist-border);border-radius:var(--vlist-border-radius);outline:none}.vlist:focus{outline:none}.vlist:focus-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:2px}.vlist-viewport{width:100%;height:100%;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--vlist-scrollbar-thumb) transparent}.vlist-viewport::-webkit-scrollbar{width:6px;height:6px}.vlist-viewport::-webkit-scrollbar-track{background:transparent}.vlist-viewport::-webkit-scrollbar-thumb{background-color:var(--vlist-scrollbar-thumb);border-radius:3px}.vlist-viewport::-webkit-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-thumb-hover)}.vlist-content{position:relative;width:100%}.vlist-items{position:relative;width:100%;contain:layout style}.vlist-item{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);border-bottom:1px solid var(--vlist-border);background-color:var(--vlist-bg);cursor:pointer;user-select:none;opacity:1;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing),opacity var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;will-change:transform}.vlist--scrolling .vlist-item{transition:none}.vlist-item:hover{background-color:var(--vlist-bg-hover)}.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist-item--replaced{animation:animation:fade-in 0.3s ease-out}.vlist-item--placeholder{opacity:0.6;animation:vlist-placeholder-pulse 2s ease-in-out infinite}.vlist-item--selected.vlist-item--focused{outline-color:var(--vlist-border-selected)}.vlist-scrollbar{position:absolute;top:0;right:0;width:var(--vlist-scrollbar-width);height:100%;background-color:var(--vlist-scrollbar-track-bg);opacity:0;transition:opacity 0.2s ease-out;z-index:10;pointer-events:none}.vlist-scrollbar-hover{position:absolute;top:0;right:0;height:100%;z-index:9;pointer-events:auto}.vlist-scrollbar-hover--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:auto}.vlist-scrollbar--visible{opacity:1;pointer-events:auto}.vlist-scrollbar-thumb{position:absolute;top:0;left:0;right:0;width:100%;background-color:var(--vlist-scrollbar-custom-thumb-bg);border-radius:var(--vlist-scrollbar-custom-thumb-radius);cursor:pointer;transition:background-color 0.15s ease-out}.vlist-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist-scrollbar--dragging{opacity:1;pointer-events:auto}.vlist-scrollbar--dragging .vlist-scrollbar-thumb{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist--grouped .vlist-item[data-id^="__group_header_"]{cursor:default;background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);z-index:1}.vlist--grouped .vlist-item[data-id^="__group_header_"]:hover{background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist-sticky-header{background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);contain:content}@media (prefers-color-scheme:dark){:root{--vlist-group-header-bg:#1e2433}}.dark{--vlist-group-header-bg:#1e2433}.vlist--scrolling .vlist-sticky-header{transition:none}.vlist--grid .vlist-items{contain:layout style}.vlist-grid-item{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);background-color:var(--vlist-bg);cursor:pointer;user-select:none;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;overflow:hidden}.vlist--grid .vlist-item{right:auto;border-bottom:none}.vlist--scrolling .vlist-grid-item{transition:none}.vlist-grid-item:hover{background-color:var(--vlist-bg-hover)}.vlist-grid-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-grid-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-grid-item.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist--horizontal{overflow:hidden}.vlist--horizontal .vlist-viewport{overflow-x:auto;overflow-y:hidden}.vlist--horizontal .vlist-content{height:100%;width:auto}.vlist--horizontal .vlist-items{height:100%;width:auto}.vlist--horizontal .vlist-item{position:absolute;top:0;bottom:0;left:0;right:auto;display:flex;align-items:center;justify-content:center;border-bottom:none;border-right:1px solid var(--vlist-border)}.vlist-scrollbar--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:var(--vlist-scrollbar-width)}.vlist-scrollbar--horizontal .vlist-scrollbar-thumb{top:0;left:0;width:auto;height:100%}.vlist-viewport--custom-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--custom-scrollbar::-webkit-scrollbar{display:none}
|