@floor/vlist 0.7.6 → 0.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floor/vlist",
3
- "version": "0.7.6",
3
+ "version": "0.7.7",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",
@@ -39,12 +39,13 @@
39
39
  "./package.json": "./package.json"
40
40
  },
41
41
  "files": [
42
- "dist/**/*.js",
42
+ "dist/index.js",
43
43
  "dist/**/*.d.ts",
44
44
  "dist/**/*.css",
45
45
  "!dist/**/*.d.ts.map",
46
46
  "!dist/core/lite.d.ts",
47
47
  "!dist/core/minimal.d.ts",
48
+ "!dist/core/full.d.ts",
48
49
  "!dist/adapters/**"
49
50
  ],
50
51
  "sideEffects": [
@@ -55,14 +56,7 @@
55
56
  "dev": "bun run build.ts --watch",
56
57
  "test": "bun test",
57
58
  "typecheck": "tsc --noEmit",
58
- "prepublishOnly": "bun run build --types",
59
- "analyze:deps": "madge --circular --extensions ts src",
60
- "analyze:orphans": "madge --orphans --extensions ts src",
61
- "analyze:tree": "madge --extensions ts src",
62
- "analyze:graph": "madge --image deps-graph.svg --extensions ts src",
63
- "analyze:graph:circular": "madge --circular --image deps-circular.svg --extensions ts src",
64
- "analyze:graphs": "bun run analyze:graph && bun run analyze:graph:circular",
65
- "analyze:all": "bun run analyze:deps && bun run analyze:orphans"
59
+ "prepublishOnly": "bun run build --types"
66
60
  },
67
61
  "bugs": {
68
62
  "url": "https://github.com/floor/vlist/issues"
@@ -71,12 +65,7 @@
71
65
  "devDependencies": {
72
66
  "@types/bun": "^1.0.0",
73
67
  "@types/jsdom": "^27.0.0",
74
- "@types/react": "^19.2.13",
75
- "esbuild": "^0.27.3",
76
68
  "jsdom": "^28.0.0",
77
- "madge": "^8.0.0",
78
- "react": "^19.2.4",
79
- "typescript": "^5.0.0",
80
- "vue": "^3.5.28"
69
+ "typescript": "^5.0.0"
81
70
  }
82
71
  }
@@ -1 +0,0 @@
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};
@@ -1 +0,0 @@
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};
@@ -1,24 +0,0 @@
1
- /**
2
- * vlist - Full API with Convenience Wrapper
3
- *
4
- * This file provides `createVList()` - a convenience wrapper around the builder pattern
5
- * that automatically applies plugins based on configuration, maintaining backwards
6
- * compatibility with monolithic-style API while leveraging the modular builder internally.
7
- *
8
- * Import: `import { createVList } from '@floor/vlist'` or `import { createVList } from '@floor/vlist/vlist'`
9
- *
10
- * For the modular builder API, use `import { vlist } from '@floor/vlist'` instead.
11
- */
12
- import type { VListConfig, VListItem, VList } from "../types";
13
- /**
14
- * Create a virtual list instance.
15
- *
16
- * This is a convenience wrapper around the builder pattern that automatically
17
- * includes plugins based on the configuration provided, maintaining full backwards
18
- * compatibility with the monolithic API.
19
- *
20
- * @param config - Virtual list configuration
21
- * @returns Virtual list instance with full API
22
- */
23
- export declare const createVList: <T extends VListItem = VListItem>(config: VListConfig<T>) => VList<T>;
24
- //# sourceMappingURL=full.d.ts.map
@@ -1 +0,0 @@
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};
@@ -1 +0,0 @@
1
- var K=()=>{let E=null;return{name:"withPage",priority:5,setup(P){let{dom:S,state:q,config:V,emitter:I}=P;S.root.style.overflow="visible",S.root.style.height="auto",S.viewport.classList.remove(`${V.classPrefix}-viewport--custom-scrollbar`),P.disableViewportResize(),P.setScrollTarget(window),P.setScrollFns(()=>{let y=S.viewport.getBoundingClientRect();if(V.horizontal)return Math.max(0,-y.left);else return Math.max(0,-y.top)},(y)=>{let b=S.viewport.getBoundingClientRect();if(V.horizontal){let j=b.left+window.scrollX;window.scrollTo(j+y,window.scrollY)}else{let j=b.top+window.scrollY;window.scrollTo(window.scrollX,j+y)}}),P.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),q.viewportState.containerHeight=window.innerHeight;let{innerHeight:B,innerWidth:F}=window,G=()=>{let{innerWidth:y,innerHeight:b}=window,j=V.horizontal?y:b,J=V.horizontal?F:B;if(Math.abs(j-J)<=1)return;B=b,F=y,q.viewportState.containerHeight=b,I.emit("resize",{width:y,height:b});for(let k=0;k<P.resizeHandlers.length;k++)P.resizeHandlers[k](y,b);P.renderIfNeeded()};window.addEventListener("resize",G,{passive:!0}),E=()=>{window.removeEventListener("resize",G)},P.destroyHandlers.push(E)},destroy(){if(E)E(),E=null}}};export{K as withPage};
@@ -1 +0,0 @@
1
- var I=16000000;var Xj=(K,W,Q,J)=>{if(J===0)return 0;if(!K.isVariable())return Math.ceil(Q/K.getHeight(0));let $=0,X=0,D=W;while(D<J&&X<Q)X+=K.getHeight(D),$++,D++;return Math.max(1,$)},a=(K,W,Q)=>{if(Q===0)return 0;if(!K.isVariable())return Math.floor(W/K.getHeight(0));let J=0,$=0;for(let X=Q-1;X>=0;X--){let D=K.getHeight(X);if($+D>W)break;$+=D,J++}return Math.max(J,1)},Yj=(K,W,Q)=>{if(Q===0)return 0;let J=Math.floor(W),$=W-J,X=Math.max(0,Math.min(J,Q-1));return K.getOffset(X)+$*K.getHeight(X)};var u=(K,W)=>{let Q=W.getTotalHeight(),J=Q>I,$=J?I:Q,X=Q>0?$/Q:1;return{isCompressed:J,actualHeight:Q,virtualHeight:$,ratio:X}},i=(K,W,Q,J,$,X)=>{if(J===0||W===0)return X.start=0,X.end=-1,X;if(!$.isCompressed){let _=Q.indexAtOffset(K),k=Q.indexAtOffset(K+W);if(k<J-1)k++;return X.start=Math.max(0,_),X.end=Math.min(J-1,Math.max(0,k)),X}let{virtualHeight:D}=$,E=K/D*J,j=Math.floor(E),P=Xj(Q,Math.max(0,j),W,J),R=Math.ceil(E)+P,A=D-W-K;if(A<=W&&A>=-1){let _=a(Q,W,J),k=Math.max(0,J-_),M=Math.max(0,Math.min(1,1-A/W));j=Math.floor(j+(k-j)*M),R=A<=1?J-1:Math.min(J-1,j+P)}return X.start=Math.max(0,j),X.end=Math.min(J-1,Math.max(0,R)),X},Gj=(K,W,Q,J)=>{if(Q===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,K.start-W),J.end=Math.min(Q-1,K.end+W),J},o=(K,W,Q,J,$,X,D)=>{if(!X.isCompressed||J===0)return Q.getOffset(K);let{virtualHeight:B}=X,E=B-$,j=E-W;if(j<=$&&j>=-1){if(W>=E-1){let O=Q.getTotalHeight()-Q.getOffset(K);return $-O}let A=a(Q,$,J),_=Math.max(0,J-A),M=W/B*J,f=Math.max(0,Math.min(1,1-j/$)),z=Q.getOffset(K)-Q.getOffset(_),q=Q.getOffset(K)-Yj(Q,M,J);return q+(z-q)*f}let P=W/B,R=Q.getTotalHeight(),Z=P*R;return Q.getOffset(K)-Z},e=(K,W,Q,J,$,X="start")=>{if(J===0)return 0;let D;if($.isCompressed){if(X==="end"&&K===J-1)return Math.max(0,$.virtualHeight-Q);D=K/J*$.virtualHeight}else D=W.getOffset(K);let B=W.getHeight(K);switch(X){case"center":D-=(Q-B)/2;break;case"end":D-=Q-B;break}let E=$.virtualHeight-Q;return Math.max(0,Math.min(D,E))},Dj=(K,W,Q,J)=>{if(Q===0)return 0;if(J.isCompressed){let $=K/J.virtualHeight;return Math.floor($*Q)}return W.indexAtOffset(K)},Uj=(K,W)=>{if(typeof W==="number")return K*W>I;return W.getTotalHeight()>I},Bj=(K)=>{if(K<=0)return 0;return Math.floor(I/K)},Zj=(K,W)=>{let Q=u(K,W);if(!Q.isCompressed)return`No compression needed (${K} items, ${(Q.actualHeight/1e6).toFixed(2)}M px)`;return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${K} items, ${(Q.actualHeight/1e6).toFixed(1)}M px → ${(Q.virtualHeight/1e6).toFixed(1)}M px virtual)`};var t=(K,W,Q={},J="vlist",$=!1)=>{let{autoHide:X=!0,autoHideDelay:D=1000,minThumbSize:B=30,showOnHover:E=!0,hoverZoneWidth:j=16,showOnViewportEnter:P=!0}=Q,R=0,Z=0,A=0,_=0,k=!1,M=!1,f=0,z=0,q=0,O=null,y=!1,U=null,L=null,x=$?"width":"height",d=$?"translateX":"translateY",H=$?(V)=>V.clientX:(V)=>V.clientY,jj=$?"left":"top",N=document.createElement("div"),G=document.createElement("div"),Y=E?document.createElement("div"):null,v=()=>{if(N.className=`${J}-scrollbar`,G.className=`${J}-scrollbar-thumb`,$)N.classList.add(`${J}-scrollbar--horizontal`);if(N.appendChild(G),K.appendChild(N),Y){if(Y.className=`${J}-scrollbar-hover`,$)Y.classList.add(`${J}-scrollbar-hover--horizontal`),Y.style.height=`${j}px`;else Y.style.width=`${j}px`;K.appendChild(Y)}},w=()=>{if(O)clearTimeout(O),O=null},T=()=>{if(!X)return;w(),O=setTimeout(b,D)},C=()=>{if(R<=Z)return;if(w(),!y)N.classList.add(`${J}-scrollbar--visible`),y=!0;if(X&&!k&&!M)T()},b=()=>{if(k||M)return;N.classList.remove(`${J}-scrollbar--visible`),y=!1},F=(V,p)=>{R=V,Z=p;let g=R>Z;if(N.style.display=g?"":"none",!g){b();return}let S=Z/R;A=Math.max(B,S*Z),G.style[x]=`${A}px`,_=Z-A,Jj(q)},Jj=(V)=>{if(q=V,R<=Z||_<=0)return;let p=R-Z,S=Math.min(1,Math.max(0,V/p))*_;G.style.transform=`${d}(${S}px)`},Kj=(V)=>{if(V.target===G)return;let p=N.getBoundingClientRect(),r=H(V)-p[jj]-A/2,Nj=Math.max(0,Math.min(r,_))/_,l=R-Z,yj=Nj*l;W(yj),C()},Qj=(V)=>{V.preventDefault(),V.stopPropagation(),k=!0,f=H(V),z=q,w(),N.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",s),document.addEventListener("mouseup",n)},s=(V)=>{if(!k)return;let p=H(V)-f,g=_>0?p/_:0,S=R-Z,r=g*S,c=Math.max(0,Math.min(z+r,S)),l=c/S*_;if(G.style.transform=`${d}(${l}px)`,L=c,U===null)U=requestAnimationFrame(()=>{if(L!==null)W(L);U=null})},n=()=>{if(k=!1,U!==null)cancelAnimationFrame(U),U=null;if(L!==null)W(L),L=null;if(N.classList.remove(`${J}-scrollbar--dragging`),X&&!M)T();document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",n)},$j=()=>{if(P)C()},Wj=()=>{if(!k){if(M=!1,X)T()}},m=()=>{M=!0,w(),C()},h=()=>{if(M=!1,!k&&X)T()},qj=()=>{if(w(),U!==null)cancelAnimationFrame(U),U=null;if(N.removeEventListener("click",Kj),N.removeEventListener("mouseenter",m),N.removeEventListener("mouseleave",h),G.removeEventListener("mousedown",Qj),K.removeEventListener("mouseenter",$j),K.removeEventListener("mouseleave",Wj),document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",n),Y){if(Y.removeEventListener("mouseenter",m),Y.removeEventListener("mouseleave",h),Y.parentNode)Y.parentNode.removeChild(Y)}if(N.parentNode)N.parentNode.removeChild(N)};if(v(),N.addEventListener("click",Kj),N.addEventListener("mouseenter",m),N.addEventListener("mouseleave",h),G.addEventListener("mousedown",Qj),K.addEventListener("mouseenter",$j),K.addEventListener("mouseleave",Wj),Y)Y.addEventListener("mouseenter",m),Y.addEventListener("mouseleave",h);return{show:C,hide:b,updateBounds:F,updatePosition:Jj,isVisible:()=>y,destroy:qj}};var Lj=0.65,_j=0.5,Oj=0.95,Vj=0.1,Ej=5,kj=100,Rj=()=>{let K=null,W=0,Q=!1,J=0,$=null,X=0,D=0,B=null,E=[];return{name:"withScale",priority:20,setup(j){let{dom:P,config:R}=j,{classPrefix:Z,horizontal:A}=R,_=()=>{let z=j.getVirtualTotal(),q=u(z,j.heightCache);if(q.isCompressed&&!Q){Q=!0,j.scrollController.enableCompression(q),j.updateContentSize(q.virtualHeight),j.setScrollFns(()=>W,(N)=>{if(W=N,J=N,$!==null)cancelAnimationFrame($),$=null});let O=()=>{let N=J-W;if(Math.abs(N)<_j)W=J,$=null;else W+=N*Lj,$=requestAnimationFrame(O);j.scrollController.scrollTo(W)},y=P.viewport,U=(N)=>{N.preventDefault();let Y=j.getCachedCompression().virtualHeight-j.state.viewportState.containerHeight;if(J=Math.max(0,Math.min(J+N.deltaY,Y)),$===null)$=requestAnimationFrame(O)};y.addEventListener("wheel",U,{passive:!1});let L=()=>{if(B!==null)cancelAnimationFrame(B),B=null},x=(N)=>{if(L(),$!==null)cancelAnimationFrame($),$=null;let G=N.touches[0];if(!G)return;let Y=A?G.clientX:G.clientY;X=Y,D=W,E=[{time:performance.now(),y:Y}]},d=(N)=>{N.preventDefault();let G=N.touches[0];if(!G)return;let Y=A?G.clientX:G.clientY,v=performance.now();if(E.push({time:v,y:Y}),E.length>Ej)E.shift();let w=X-Y,C=j.getCachedCompression().virtualHeight-j.state.viewportState.containerHeight,b=Math.max(0,Math.min(D+w,C));W=b,J=b,j.scrollController.scrollTo(b)},H=(N)=>{let G=performance.now(),Y=E.filter((C)=>G-C.time<kj),v=0;if(Y.length>=2){let C=Y[0],b=Y[Y.length-1],F=b.time-C.time;if(F>0)v=(C.y-b.y)/F}if(E=[],Math.abs(v)<Vj)return;let w=v*16,T=()=>{if(w*=Oj,Math.abs(w)<0.5){B=null;return}let b=j.getCachedCompression().virtualHeight-j.state.viewportState.containerHeight,F=W+w;if(F=Math.max(0,Math.min(F,b)),F<=0&&w<0||F>=b&&w>0){W=F,J=F,j.scrollController.scrollTo(F),B=null;return}W=F,J=F,j.scrollController.scrollTo(F),B=requestAnimationFrame(T)};B=requestAnimationFrame(T)};if(y.addEventListener("touchstart",x,{passive:!0}),y.addEventListener("touchmove",d,{passive:!1}),y.addEventListener("touchend",H,{passive:!0}),y.addEventListener("touchcancel",H,{passive:!0}),j.destroyHandlers.push(()=>{if(y.removeEventListener("wheel",U),y.removeEventListener("touchstart",x),y.removeEventListener("touchmove",d),y.removeEventListener("touchend",H),y.removeEventListener("touchcancel",H),L(),$!==null)cancelAnimationFrame($),$=null}),!P.viewport.querySelector(`.${Z}-scrollbar-track`)){if(K=t(P.viewport,(G)=>j.scrollController.scrollTo(G),{},Z,A),!P.viewport.classList.contains(`${Z}-viewport--custom-scrollbar`))P.viewport.classList.add(`${Z}-viewport--custom-scrollbar`);K.updateBounds(q.virtualHeight,j.state.viewportState.containerHeight);let N=K;j.afterScroll.push((G,Y)=>{if(N)N.updatePosition(G),N.show()}),j.resizeHandlers.push((G,Y)=>{if(N){let v=j.getCachedCompression();N.updateBounds(v.virtualHeight,j.state.viewportState.containerHeight)}})}}else if(!q.isCompressed&&Q)Q=!1,j.scrollController.disableCompression(),j.updateContentSize(q.actualHeight);else if(q.isCompressed)j.scrollController.updateConfig({compression:q}),j.updateContentSize(q.virtualHeight);if(K)K.updateBounds(q.virtualHeight,j.state.viewportState.containerHeight);j.state.cachedCompression={state:q,totalItems:z}};j.updateCompressionMode=_;let k=j.getCachedCompression.bind(j);j.getCachedCompression=()=>{if(j.state.cachedCompression)return j.state.cachedCompression.state;return k()},j.setVisibleRangeFn((z,q,O,y,U)=>{M=null,f=null;let L=u(y,O);i(z,q,O,y,L,U)}),j.setScrollToPosFn((z,q,O,y,U)=>{let L=u(y,q);return e(z,q,O,y,L,U)});let M=null,f=null;j.setPositionElementFn((z,q)=>{let O=j.getVirtualTotal(),y=u(O,j.heightCache);if(y.isCompressed){let U=j.scrollController.getScrollTop();if(M===null||q<f)f=q,M=Math.round(o(q,U,j.heightCache,O,j.state.viewportState.containerHeight,y));let L=M+j.heightCache.getOffset(q)-j.heightCache.getOffset(f),x=j.config.horizontal;z.style.transform=x?`translateX(${L}px)`:`translateY(${L}px)`}else{let U=Math.round(j.heightCache.getOffset(q)),L=j.config.horizontal;z.style.transform=L?`translateX(${U}px)`:`translateY(${U}px)`}}),_(),j.destroyHandlers.push(()=>{if(K)K.destroy(),K=null;if($!==null)cancelAnimationFrame($),$=null})},destroy(){if(K)K.destroy(),K=null;if($!==null)cancelAnimationFrame($),$=null;if(B!==null)cancelAnimationFrame(B),B=null}}};export{Rj as withScale,Uj as needsCompression,Bj as getMaxItemsWithoutCompression,u as getCompressionState,Zj as getCompressionInfo,Dj as calculateIndexFromScrollPosition,i as calculateCompressedVisibleRange,e as calculateCompressedScrollToIndex,Gj as calculateCompressedRenderRange,o as calculateCompressedItemPosition,I as MAX_VIRTUAL_HEIGHT};
@@ -1 +0,0 @@
1
- var Gj=(j,J,G={},_="vlist",F=!1)=>{let{autoHide:E=!0,autoHideDelay:D=1000,minThumbSize:H=30,showOnHover:V=!0,hoverZoneWidth:X=16,showOnViewportEnter:Z=!0}=G,Q=0,U=0,W=0,N=0,O=!1,q=!1,y=0,f=0,h=0,I=null,p=!1,R=null,M=null,S=F?"width":"height",x=F?"translateX":"translateY",b=F?(B)=>B.clientX:(B)=>B.clientY,t=F?"left":"top",L=document.createElement("div"),C=document.createElement("div"),A=V?document.createElement("div"):null,i=()=>{if(L.className=`${_}-scrollbar`,C.className=`${_}-scrollbar-thumb`,F)L.classList.add(`${_}-scrollbar--horizontal`);if(L.appendChild(C),j.appendChild(L),A){if(A.className=`${_}-scrollbar-hover`,F)A.classList.add(`${_}-scrollbar-hover--horizontal`),A.style.height=`${X}px`;else A.style.width=`${X}px`;j.appendChild(A)}},T=()=>{if(I)clearTimeout(I),I=null},P=()=>{if(!E)return;T(),I=setTimeout(d,D)},k=()=>{if(Q<=U)return;if(T(),!p)L.classList.add(`${_}-scrollbar--visible`),p=!0;if(E&&!O&&!q)P()},d=()=>{if(O||q)return;L.classList.remove(`${_}-scrollbar--visible`),p=!1},r=(B,g)=>{Q=B,U=g;let m=Q>U;if(L.style.display=m?"":"none",!m){d();return}let z=U/Q;W=Math.max(H,z*U),C.style[S]=`${W}px`,N=U-W,s(h)},s=(B)=>{if(h=B,Q<=U||N<=0)return;let g=Q-U,z=Math.min(1,Math.max(0,B/g))*N;C.style.transform=`${x}(${z}px)`},c=(B)=>{if(B.target===C)return;let g=L.getBoundingClientRect(),o=b(B)-g[t]-W/2,Kj=Math.max(0,Math.min(o,N))/N,jj=Q-U,Xj=Kj*jj;J(Xj),k()},n=(B)=>{B.preventDefault(),B.stopPropagation(),O=!0,y=b(B),f=h,T(),L.classList.add(`${_}-scrollbar--dragging`),document.addEventListener("mousemove",w),document.addEventListener("mouseup",v)},w=(B)=>{if(!O)return;let g=b(B)-y,m=N>0?g/N:0,z=Q-U,o=m*z,e=Math.max(0,Math.min(f+o,z)),jj=e/z*N;if(C.style.transform=`${x}(${jj}px)`,M=e,R===null)R=requestAnimationFrame(()=>{if(M!==null)J(M);R=null})},v=()=>{if(O=!1,R!==null)cancelAnimationFrame(R),R=null;if(M!==null)J(M),M=null;if(L.classList.remove(`${_}-scrollbar--dragging`),E&&!q)P();document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",v)},a=()=>{if(Z)k()},K=()=>{if(!O){if(q=!1,E)P()}},Y=()=>{q=!0,T(),k()},$=()=>{if(q=!1,!O&&E)P()},u=()=>{if(T(),R!==null)cancelAnimationFrame(R),R=null;if(L.removeEventListener("click",c),L.removeEventListener("mouseenter",Y),L.removeEventListener("mouseleave",$),C.removeEventListener("mousedown",n),j.removeEventListener("mouseenter",a),j.removeEventListener("mouseleave",K),document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",v),A){if(A.removeEventListener("mouseenter",Y),A.removeEventListener("mouseleave",$),A.parentNode)A.parentNode.removeChild(A)}if(L.parentNode)L.parentNode.removeChild(L)};if(i(),L.addEventListener("click",c),L.addEventListener("mouseenter",Y),L.addEventListener("mouseleave",$),C.addEventListener("mousedown",n),j.addEventListener("mouseenter",a),j.addEventListener("mouseleave",K),A)A.addEventListener("mouseenter",Y),A.addEventListener("mouseleave",$);return{show:k,hide:d,updateBounds:r,updatePosition:s,isVisible:()=>p,destroy:u}};var Yj=(j)=>{let J=null;return{name:"withScrollbar",priority:30,setup(G){let{dom:_,config:F}=G,{classPrefix:E,horizontal:D}=F;if(J=Gj(_.viewport,(X)=>G.scrollController.scrollTo(X),j??{},E,D),!_.viewport.classList.contains(`${E}-viewport--custom-scrollbar`))_.viewport.classList.add(`${E}-viewport--custom-scrollbar`);let H=G.getCachedCompression();J.updateBounds(H.virtualHeight,G.state.viewportState.containerHeight);let V=J;G.afterScroll.push((X,Z)=>{V.updatePosition(X),V.show()}),G.resizeHandlers.push((X,Z)=>{if(V){let Q=G.getCachedCompression();V.updateBounds(Q.virtualHeight,G.state.viewportState.containerHeight)}}),G.contentSizeHandlers.push(()=>{if(V){let X=G.getCachedCompression();V.updateBounds(X.virtualHeight,G.state.viewportState.containerHeight)}}),G.destroyHandlers.push(()=>{if(V)V.destroy()})},destroy(){if(J)J.destroy(),J=null}}};var Qj=(j=0)=>{let J=[,,,,,,,,];for(let G=0;G<8;G++)J[G]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:J,sampleIndex:0,sampleCount:0}},l=(j,J)=>{let G=performance.now(),_=G-j.lastTime;if(_===0)return j;if(_>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let E=j.samples[0];return E.position=J,E.time=G,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=J,j.lastTime=G,j}let F=j.samples[j.sampleIndex];if(F.position=J,F.time=G,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let E=(j.sampleIndex-j.sampleCount+8)%8,D=j.samples[E],H=J-D.position,V=G-D.time;j.velocity=V>0?H/V:0}return j.lastPosition=J,j.lastTime=G,j},_j=(j)=>j.sampleCount>=3,$j=(j,J={})=>{let{wheel:G=!0,sensitivity:_=1,smoothing:F=!1,idleTimeout:E=150,onScroll:D,onIdle:H,scrollElement:V,horizontal:X=!1}=J,Z=!!V,Q=0,U=0,W=Z?X?window.innerWidth:window.innerHeight:X?j.clientWidth:j.clientHeight,N=J.compressed??!1,O=J.compression,q=Qj(),y=!1,f=null,I=Jj(()=>{let K=X?j.scrollLeft:j.scrollTop,Y=K>=Q?"down":"up";if(q=l(q,K),Q=K,D)D({scrollTop:Q,direction:Y,velocity:q.velocity});b()}),R=Jj(()=>{let K=j.getBoundingClientRect(),Y=X?Math.max(0,-K.left):Math.max(0,-K.top),$=Y>=Q?"down":"up";if(q=l(q,Y),Q=Y,!y)y=!0;if(D)D({scrollTop:Q,direction:$,velocity:q.velocity});b()}),M=(K)=>{K.preventDefault()},S=(K)=>{if(K.deltaX)return;K.preventDefault(),j.scrollLeft+=K.deltaY},x=(K)=>{if(!N)return;K.preventDefault();let Y=(X?K.deltaX||K.deltaY:K.deltaY)*_,$=Q+Y;if(F)$=Q+Y*0.3;if($=Math.max(0,Math.min($,U)),$!==Q){let B=$>=Q?"down":"up";if(q=l(q,$),Q=$,!y)y=!0;if(D)D({scrollTop:Q,direction:B,velocity:q.velocity});b()}},b=()=>{if(f)clearTimeout(f);f=setTimeout(()=>{if(y=!1,q=Qj(Q),H)H()},E)},t=(K)=>{if(N)return;if(N=!0,O=K,U=K.virtualHeight-W,Z)return;if(I.cancel(),j.removeEventListener("scroll",I),!G)j.removeEventListener("wheel",M);else if(X)j.removeEventListener("wheel",S);if(X)j.style.overflowX="hidden";else j.style.overflow="hidden";if(G)j.addEventListener("wheel",x,{passive:!1});let Y=X?j.scrollLeft:j.scrollTop;if(Y>0){let $=X?O?.actualHeight??j.scrollWidth:O?.actualHeight??j.scrollHeight;Q=Y/$*U}if(X)j.scrollLeft=0;else j.scrollTop=0},L=()=>{if(!N)return;if(N=!1,Z){O=void 0;return}if(j.removeEventListener("wheel",x),X)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",I,{passive:!0}),!G)j.addEventListener("wheel",M,{passive:!1});else if(X)j.addEventListener("wheel",S,{passive:!1});if(O&&Q>0){let Y=Q/U*(O.actualHeight-W);if(X)j.scrollLeft=Y;else j.scrollTop=Y}O=void 0},C=()=>{if(Z||N)return Q;return X?j.scrollLeft:j.scrollTop},A=(K,Y=!1)=>{let $=Math.max(0,Math.min(K,U||1/0));if(Z){let u=j.getBoundingClientRect();if(X){let B=u.left+window.scrollX;window.scrollTo({left:B+$,behavior:Y?"smooth":"auto"})}else{let B=u.top+window.scrollY;window.scrollTo({top:B+$,behavior:Y?"smooth":"auto"})}}else if(N){if($===Q)return;let B=$>=Q?"down":"up";if(q=l(q,$),Q=$,!y)y=!0;if(D)D({scrollTop:Q,direction:B,velocity:q.velocity});b()}else if(X)j.scrollTo({left:$,behavior:Y?"smooth":"auto"});else j.scrollTo({top:$,behavior:Y?"smooth":"auto"})},i=(K)=>{A(C()+K)},T=()=>{return C()<=0},P=(K=0)=>{let Y=C(),$=Z||N?U:X?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return Y>=$-K},k=()=>{let K=C(),Y=Z||N?U:X?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(Y<=0)return 0;return Math.min(1,Math.max(0,K/Y))},d=(K)=>{if(K.compression)O=K.compression,U=O.virtualHeight-W},r=()=>N,s=()=>Math.abs(q.velocity),c=()=>_j(q),n=()=>y,w=()=>Z,v=(K)=>{if(W=K,O)U=O.virtualHeight-W},a=()=>{if(f)clearTimeout(f);if(Z)R.cancel(),window.removeEventListener("scroll",R);else I.cancel(),j.removeEventListener("scroll",I),j.removeEventListener("wheel",x),j.removeEventListener("wheel",M),j.removeEventListener("wheel",S)};if(Z){if(N&&O)U=O.virtualHeight-W;window.addEventListener("scroll",R,{passive:!0})}else if(N&&O){if(U=O.virtualHeight-W,X)j.style.overflowX="hidden";else j.style.overflow="hidden";if(G)j.addEventListener("wheel",x,{passive:!1})}else{if(X)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",I,{passive:!0}),!G)j.addEventListener("wheel",M,{passive:!1});else if(X)j.addEventListener("wheel",S,{passive:!1})}return{getScrollTop:C,scrollTo:A,scrollBy:i,isAtTop:T,isAtBottom:P,getScrollPercentage:k,getVelocity:s,isTracking:c,isScrolling:n,updateConfig:d,enableCompression:t,disableCompression:L,isCompressed:r,isWindowMode:w,updateContainerHeight:v,destroy:a}},Jj=(j)=>{let J=null,G=null,_=(...F)=>{if(G=F,J===null)J=requestAnimationFrame(()=>{if(J=null,G)j(...G)})};return _.cancel=()=>{if(J!==null)cancelAnimationFrame(J),J=null},_},Bj=(j,J,G,_=0)=>{return j+G>=J-_},Oj=(j,J=0)=>{return j<=J},Uj=(j,J,G)=>{let _=J-G;if(_<=0)return 0;return Math.min(1,Math.max(0,j/_))},qj=(j,J,G,_)=>{return j<=_&&J>=G};export{Yj as withScrollbar,Jj as rafThrottle,qj as isRangeVisible,Oj as isAtTop,Bj as isAtBottom,Uj as getScrollPercentage,Gj as createScrollbar,$j as createScrollController};
@@ -1 +0,0 @@
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};
@@ -1 +0,0 @@
1
- var H=(D)=>({selected:new Set(D??[]),focusedIndex:-1}),E=(D,B,G)=>{if(G==="none")return D;let j=new Set(D.selected);if(G==="single"){if(j.clear(),B.length>0)j.add(B[0])}else for(let J of B)j.add(J);return{...D,selected:j}},F=(D,B)=>{let G=new Set(D.selected);for(let j of B)G.delete(j);return{...D,selected:G}},V=(D,B,G)=>{if(G==="none")return D;if(D.selected.has(B))return F(D,[B]);else return E(D,[B],G)},C=(D,B,G)=>{if(G!=="multiple")return D;return{...D,selected:new Set(B.map((j)=>j.id))}},f=(D)=>({...D,selected:new Set}),w=(D,B)=>{return D.focusedIndex=B,D},u=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex-1;if(j<0)j=G?B-1:0;return D.focusedIndex=j,D},v=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex+1;if(j>=B)j=G?0:B-1;return D.focusedIndex=j,D},R=(D,B)=>{if(B===0)return D;return D.focusedIndex=0,D},S=(D,B)=>{if(B===0)return D;return D.focusedIndex=B-1,D},r=(D,B,G,j)=>{if(B===0)return D;let J=j==="up"?D.focusedIndex-G:D.focusedIndex+G;return J=Math.max(0,Math.min(B-1,J)),D.focusedIndex=J,D},m=(D,B)=>{return D.selected.has(B)},y=(D)=>{return Array.from(D.selected)},O=(D,B)=>{let G=[];for(let j of D.selected){let J=B(j);if(J)G.push(J)}return G},d=(D)=>{return D.selected.size},l=(D)=>{return D.selected.size===0},c=(D,B,G)=>{if(G==="none"||D.focusedIndex<0||D.focusedIndex>=B.length)return D;let j=B[D.focusedIndex];if(!j)return D;return V(D,j.id,G)},o=(D,B,G,j,J)=>{if(J!=="multiple")return D;let q=Math.min(G,j),X=Math.max(G,j),U=[];for(let $=q;$<=X;$++){let k=B[$];if(k)U.push(k.id)}return E(D,U,J)};var h=(D,B,G,j,J,q)=>{if(j===0)return 0;let X=Math.max(0,Math.min(D,j-1)),U=B.getOffset(X),$=B.getHeight(X),k=B.getTotalHeight(),T=Math.max(0,k-G),W;switch(q){case"center":W=U-G/2+$/2;break;case"end":W=U-G+$;break;case"start":default:W=U;break}return Math.max(0,Math.min(W,T))};var p=(D,B,G,j,J="start",q,X=h)=>{return X(D,B,G,j,q,J)};var n=(D)=>{let B=D?.mode??"single",G=D?.initial,j=H(G),J=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(q){let{dom:X,emitter:U,config:$}=q,{classPrefix:k,ariaIdPrefix:T}=$;if(B==="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:W,forceRender:x}=q.getRenderFns(),b=()=>{q.dom.items.querySelectorAll("[data-index]").forEach((Q)=>{let M=Q,L=M.dataset.id;if(L!==void 0){let Y=/^\d+$/.test(L)?parseInt(L,10):L,_=j.selected.has(Y),N=parseInt(M.dataset.index??"-1",10)===j.focusedIndex;M.classList.toggle(`${k}-item--selected`,_),M.classList.toggle(`${k}-item--focused`,N),M.ariaSelected=_?"true":"false"}})},g=()=>{if(q.state.isDestroyed)return;W(),b()},I=()=>{if(q.state.isDestroyed)return;x(),b()};q.setRenderFns(g,I);let A=()=>{b(),U.emit("selection:change",{selected:y(j),items:O(j,(K)=>q.dataManager.getItemById(K))})};J=document.createElement("div"),J.setAttribute("aria-live","polite"),J.setAttribute("aria-atomic","true"),J.className=`${k}-live-region`,J.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",X.root.appendChild(J);let z=J;U.on("selection:change",({selected:K})=>{let Q=K.length;if(Q===0)z.textContent="";else if(Q===1)z.textContent="1 item selected";else z.textContent=`${Q} items selected`}),q.clickHandlers.push((K)=>{if(q.state.isDestroyed)return;let M=K.target.closest("[data-index]");if(!M)return;let L=parseInt(M.dataset.index??"-1",10);if(L<0)return;let Y=q.dataManager.getItem(L);if(!Y)return;U.emit("item:click",{item:Y,index:L,event:K}),j=w(j,L),X.root.setAttribute("aria-activedescendant",`${T}-item-${L}`),j=V(j,Y.id,B),A()}),q.keydownHandlers.push((K)=>{if(q.state.isDestroyed)return;let Q=q.dataManager.getTotal(),M=j.focusedIndex,L=!1,Y=!1,_=j;switch(K.key){case"ArrowUp":_=u(j,Q),L=!0,Y=!0;break;case"ArrowDown":_=v(j,Q),L=!0,Y=!0;break;case"Home":_=R(j,Q),L=!0,Y=!0;break;case"End":_=S(j,Q),L=!0,Y=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let Z=q.dataManager.getItem(j.focusedIndex);if(Z)_=V(j,Z.id,B);L=!0}break}if(L){K.preventDefault(),j=_;let Z=j.focusedIndex;if(Z>=0){let N=q.dataManager.getState(),P=p(Z,q.heightCache,q.state.viewportState.containerHeight,N.total,"center",q.getCachedCompression());q.scrollController.scrollTo(P),X.root.setAttribute("aria-activedescendant",`${T}-item-${Z}`)}else X.root.removeAttribute("aria-activedescendant");if(Y){let{selected:N}=j;if(M>=0&&M!==Z){let P=q.dataManager.getItem(M);if(P)q.renderer.updateItemClasses(M,N.has(P.id),!1)}if(Z>=0){let P=q.dataManager.getItem(Z);if(P)q.renderer.updateItemClasses(Z,N.has(P.id),!0)}}else I(),U.emit("selection:change",{selected:y(j),items:O(j,(N)=>q.dataManager.getItemById(N))})}}),q.methods.set("select",(...K)=>{j=E(j,K,B),A()}),q.methods.set("deselect",(...K)=>{j=F(j,K),A()}),q.methods.set("toggleSelect",(K)=>{j=V(j,K,B),A()}),q.methods.set("selectAll",()=>{if(B!=="multiple")return;let K=q.getAllLoadedItems();j=C(j,K,B),A()}),q.methods.set("clearSelection",()=>{j=f(j);let{renderRange:K,isCompressed:Q}=q.state.viewportState,M=q.getItemsForRange(K),L=Q?q.getCompressionContext():void 0;q.renderer.render(M,K,j.selected,j.focusedIndex,L),U.emit("selection:change",{selected:[],items:[]})}),q.methods.set("getSelected",()=>{return y(j)}),q.methods.set("getSelectedItems",()=>{return O(j,(K)=>q.dataManager.getItemById(K))}),q.destroyHandlers.push(()=>{if(z&&z.parentNode)z.remove()})},destroy(){if(J&&J.parentNode)J.remove();J=null}}};export{n as withSelection,V as toggleSelection,w as setFocusedIndex,o as selectRange,E as selectItems,c as selectFocused,C as selectAll,u as moveFocusUp,S as moveFocusToLast,R as moveFocusToFirst,v as moveFocusDown,r as moveFocusByPage,l as isSelectionEmpty,m as isSelected,d as getSelectionCount,O as getSelectedItems,y as getSelectedIds,F as deselectItems,H as createSelectionState,f as clearSelection};
@@ -1 +0,0 @@
1
- var B=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(v){v.methods.set("getScrollSnapshot",()=>{let q=v.scrollController.getScrollTop(),y=v.getCachedCompression(),k=v.getVirtualTotal(),j=v.methods.get("getSelected"),A=j&&j().length>0?j():void 0;if(k===0){let u={index:0,offsetInItem:0};if(A)u.selectedIds=A;return u}let w,b;if(y.isCompressed){let U=q/y.virtualHeight*k;w=Math.max(0,Math.min(Math.floor(U),k-1)),b=(U-w)*v.heightCache.getHeight(w)}else w=v.heightCache.indexAtOffset(q),b=q-v.heightCache.getOffset(w);b=Math.max(0,b);let S={index:w,offsetInItem:b};if(A)S.selectedIds=A;return S}),v.methods.set("restoreScroll",(q)=>{let{index:y,offsetInItem:k,selectedIds:j}=q,A=v.getCachedCompression(),w=v.getVirtualTotal();if(w===0)return;let b=Math.max(0,Math.min(y,w-1)),S;if(A.isCompressed){let U=v.heightCache.getHeight(b),z=U>0?k/U:0;S=(b+z)/w*A.virtualHeight}else S=v.heightCache.getOffset(b)+k;let u=Math.max(0,A.virtualHeight-v.state.viewportState.containerHeight);if(S=Math.max(0,Math.min(S,u)),v.scrollController.scrollTo(S),j&&j.length>0){let U=v.methods.get("select");if(U)U(...j)}})}}};export{B as withSnapshots};