vlist 0.1.2 → 1.5.4

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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +558 -0
  3. package/dist/builder/a11y.d.ts +16 -0
  4. package/dist/builder/api.d.ts +21 -0
  5. package/dist/builder/context.d.ts +36 -0
  6. package/dist/builder/core.d.ts +16 -0
  7. package/dist/builder/data.d.ts +69 -0
  8. package/dist/builder/dom.d.ts +15 -0
  9. package/dist/builder/index.d.ts +25 -0
  10. package/dist/builder/materialize.d.ts +165 -0
  11. package/dist/builder/pool.d.ts +10 -0
  12. package/dist/builder/range.d.ts +10 -0
  13. package/dist/builder/scroll.d.ts +24 -0
  14. package/dist/builder/types.d.ts +464 -0
  15. package/dist/builder/velocity.d.ts +23 -0
  16. package/dist/constants.d.ts +58 -0
  17. package/dist/events/emitter.d.ts +18 -0
  18. package/dist/events/index.d.ts +6 -0
  19. package/dist/features/async/feature.d.ts +72 -0
  20. package/dist/features/async/index.d.ts +9 -0
  21. package/dist/features/async/manager.d.ts +103 -0
  22. package/dist/features/async/placeholder.d.ts +54 -0
  23. package/dist/features/async/sparse.d.ts +91 -0
  24. package/dist/features/autosize/feature.d.ts +34 -0
  25. package/dist/features/autosize/index.d.ts +2 -0
  26. package/dist/features/grid/feature.d.ts +48 -0
  27. package/dist/features/grid/index.d.ts +9 -0
  28. package/dist/features/grid/layout.d.ts +29 -0
  29. package/dist/features/grid/renderer.d.ts +71 -0
  30. package/dist/features/grid/types.d.ts +71 -0
  31. package/dist/features/groups/feature.d.ts +74 -0
  32. package/dist/features/groups/index.d.ts +10 -0
  33. package/dist/features/groups/layout.d.ts +47 -0
  34. package/dist/features/groups/sticky.d.ts +21 -0
  35. package/dist/features/groups/types.d.ts +86 -0
  36. package/dist/features/masonry/feature.d.ts +45 -0
  37. package/dist/features/masonry/index.d.ts +9 -0
  38. package/dist/features/masonry/layout.d.ts +29 -0
  39. package/dist/features/masonry/renderer.d.ts +55 -0
  40. package/dist/features/masonry/types.d.ts +68 -0
  41. package/dist/features/page/feature.d.ts +53 -0
  42. package/dist/features/page/index.d.ts +8 -0
  43. package/dist/features/scale/feature.d.ts +42 -0
  44. package/dist/features/scale/index.d.ts +10 -0
  45. package/dist/features/scrollbar/controller.d.ts +121 -0
  46. package/dist/features/scrollbar/feature.d.ts +60 -0
  47. package/dist/features/scrollbar/index.d.ts +8 -0
  48. package/dist/features/scrollbar/scrollbar.d.ts +73 -0
  49. package/dist/features/selection/feature.d.ts +75 -0
  50. package/dist/features/selection/index.d.ts +7 -0
  51. package/dist/features/selection/state.d.ts +115 -0
  52. package/dist/features/snapshots/feature.d.ts +79 -0
  53. package/dist/features/snapshots/index.d.ts +9 -0
  54. package/dist/features/table/feature.d.ts +67 -0
  55. package/dist/features/table/header.d.ts +49 -0
  56. package/dist/features/table/index.d.ts +10 -0
  57. package/dist/features/table/layout.d.ts +26 -0
  58. package/dist/features/table/renderer.d.ts +72 -0
  59. package/dist/features/table/types.d.ts +239 -0
  60. package/dist/index.d.ts +28 -0
  61. package/dist/index.js +1 -0
  62. package/dist/internals.d.ts +21 -0
  63. package/dist/internals.js +1 -0
  64. package/dist/rendering/index.d.ts +12 -0
  65. package/dist/rendering/measured.d.ts +52 -0
  66. package/dist/rendering/renderer.d.ts +111 -0
  67. package/dist/rendering/scale.d.ts +121 -0
  68. package/dist/rendering/scroll.d.ts +23 -0
  69. package/dist/rendering/sizes.d.ts +63 -0
  70. package/dist/rendering/sort.d.ts +33 -0
  71. package/dist/rendering/viewport.d.ts +139 -0
  72. package/dist/size.json +1 -0
  73. package/dist/types.d.ts +487 -0
  74. package/dist/utils/padding.d.ts +38 -0
  75. package/dist/utils/stats.d.ts +49 -0
  76. package/dist/vlist-extras.css +1 -0
  77. package/dist/vlist-grid.css +1 -0
  78. package/dist/vlist-masonry.css +1 -0
  79. package/dist/vlist-table.css +1 -0
  80. package/dist/vlist.css +1 -0
  81. package/package.json +66 -14
  82. package/README.MD +0 -80
  83. package/index.d.ts +0 -3
  84. package/index.js +0 -188
  85. package/virtual-scroll.component.d.ts +0 -37
  86. package/vlist.d.ts +0 -4
  87. package/vlist.metadata.json +0 -1
  88. package/vlist.umd.js +0 -189
@@ -0,0 +1 @@
1
+ var b2=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var w2=(J,Q)=>{let $=0,Y=J.length-1;while($<Y){let q=$+Y+1>>>1;if(J[q].headerLayoutIndex<=Q)$=q;else Y=q-1}return $},x2=(J,Q)=>{let $=0,Y=J.length-1;while($<Y){let q=$+Y+1>>>1;if(J[q].firstDataIndex<=Q)$=q;else Y=q-1}return $},g2=(J,Q)=>{if(J===0)return[];let $=[],Y=Q(0),q=0,j=0;for(let B=1;B<J;B++){let V=Q(B);if(V!==Y){let R=B-q;$.push({key:Y,groupIndex:$.length,headerLayoutIndex:j,firstDataIndex:q,count:R}),j=j+1+R,Y=V,q=B}}return $.push({key:Y,groupIndex:$.length,headerLayoutIndex:j,firstDataIndex:q,count:J-q}),$},u2=(J,Q)=>{if(J.length===0||Q.length===0)return[];let $=J.length+Q.length,Y=Array($),q=0;for(let j of Q){Y[q]={id:`__group_header_${j.groupIndex}`,__groupHeader:!0,groupKey:j.key,groupIndex:j.groupIndex},q++;for(let B=0;B<j.count;B++)Y[q]=J[j.firstDataIndex+B],q++}return Y},m2=(J,Q,$=!1)=>{let Y=typeof Q==="number"?(q)=>Q:Q;return(q)=>{let j=J.getEntry(q);if(j.type==="header"){if($&&j.group.groupIndex===0)return 0;return J.getHeaderHeight(j.group.groupIndex)}return Y(j.dataIndex)}},d2=(J,Q)=>{let $=g2(J,Q.getGroupForIndex),Y=J+$.length,q=Q.header?.height??Q.header?.width??Q.headerHeight;return{get totalEntries(){return Y},get groupCount(){return $.length},get groups(){return $},getEntry:(A)=>{if($.length===0)return{type:"item",dataIndex:A,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let z=w2($,A),N=$[z];if(A===N.headerLayoutIndex)return{type:"header",group:N};let _=A-N.headerLayoutIndex-1;return{type:"item",dataIndex:N.firstDataIndex+_,group:N}},layoutToDataIndex:(A)=>{if($.length===0)return A;let z=w2($,A),N=$[z];if(A===N.headerLayoutIndex)return-1;let _=A-N.headerLayoutIndex-1;return N.firstDataIndex+_},dataToLayoutIndex:(A)=>{if($.length===0)return A;let z=x2($,A),N=$[z],_=A-N.firstDataIndex;return N.headerLayoutIndex+1+_},getGroupAtLayoutIndex:(A)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let z=w2($,A);return $[z]},getGroupAtDataIndex:(A)=>{if($.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let z=x2($,A);return $[z]},getHeaderHeight:typeof q==="number"?(A)=>q:(A)=>{let z=$[A];if(!z)return 0;return q(z.key,A)},rebuild:(A)=>{$=g2(A,Q.getGroupForIndex),Y=A+$.length}}};var c2=(J,Q,$,Y,q,j=!1,B=0)=>{let V=j?"width":"height",R=j?"height":"width",W=j?"X":"Y",U=(X,f)=>{X.style[V]=`${f}px`},F=document.createElement("div");F.className=`${q}-sticky-header`,F.setAttribute("role","presentation"),F.setAttribute("aria-hidden","true"),F.style.cssText="position:relative;z-index:5;pointer-events:none;overflow:hidden;"+(j?`top:0;bottom:0;left:${B||0}px`:`top:${B||0}px`);let A=()=>{let X=document.createElement("div");return X.className="sticky-group",X.style.position="absolute",X.style.willChange="transform",X.style[R]="100%",X},z=A(),N=A();F.append(z,N),J.insertBefore(F,J.firstChild);let _=z,K=N,M=Q.groups,y=[],v=[],P=0,u=()=>{M=Q.groups,P=M.length,y=Array(P),v=Array(P);for(let X=0;X<P;X++)y[X]=$.getOffset(M[X].headerLayoutIndex),v[X]=Q.getHeaderHeight(X)};u();let h=-1,l=0,n=-1,J2=!1,j2=0,m=!1,I=(X,f)=>{Y(X,f);let x=v[f];return U(X,x),x},o=(X)=>{X.replaceChildren(),X.style.transform=""},i=(X)=>{if(X===h)return;if(h=X,l=0,X<0||X>=P){o(_);return}l=I(_,X),U(F,l),_.style.transform=""},w=(X)=>{if(X===j2)return;j2=X;let f=Math.round(X);_.style.transform=`translate${W}(${f}px)`,K.style.transform=`translate${W}(${f+l}px)`},E=()=>{j2=0,_.style.transform="",K.style.transform=""},Z=()=>{if(!m)return;let X=_;_=K,K=X,h=n,l=h>=0?v[h]:0,U(F,l),o(K),n=-1,m=!1,E()},L=()=>{if(!m)return;o(K),n=-1,m=!1,E()},T=()=>{if(J2)return;J2=!0,F.style.display=""},a=()=>{if(!J2)return;J2=!1,F.style.display="none",o(_),h=-1,l=0,L()},r=(X)=>{if(P===0){a();return}if(X<y[0]){a();return}let f=0,x=P-1;while(f<x){let C=f+x+1>>>1;if(y[C]+v[C]<=X)f=C;else x=C-1}if(!J2)T();i(f);let k=f+1;if(k<P){let C=y[k]-X;if(C<=0&&C>-l){if(n!==k||!m)n=k,I(K,k),m=!0;w(C)}else if(C<=-l){if(m)Z()}else if(m)L()}else if(m)L()},d=()=>{u();let X=h;if(h=-1,l=0,X>=0)i(X)},O=()=>{F.remove(),h=-1,l=0,n=-1,J2=!1,m=!1};return F.style.display="none",{update:r,refresh:d,show:T,hide:a,destroy:O}};var r2=(J)=>{let Q=Math.max(1,Math.floor(J.columns)),$=J.gap??0,Y=J.isHeaderFn,q={row:0,col:0},j=(N)=>{if(N<=0)return 0;if(!Y)return Math.ceil(N/Q);let _=0,K=0,M=0;for(let y=0;y<N;y++)if(Y(y)){if(M++,K>0)_++,K=0;_++,K=0}else if(K++,K>=Q)_++,K=0;if(K>0)_++;return _},B=(N)=>{return q.row=V(N),q.col=R(N),q},V=(N)=>{if(!Y)return Math.floor(N/Q);let _=0,K=0;for(let M=0;M<=N;M++)if(Y(M)){if(K>0)_++,K=0;if(M===N)return _;_++,K=0}else{if(M===N)return _;if(K++,K>=Q)_++,K=0}return console.warn(`⚠️ getRow(${N}) fell through - returning ${_}`),_},R=(N)=>{if(!Y)return N%Q;if(Y(N))return 0;let _=0;for(let K=0;K<=N;K++)if(Y(K))_=0;else{if(K===N)return _;if(_++,_>=Q)_=0}return _},W=(N,_,K)=>{if(K<=0)return{start:0,end:-1};if(!Y){let u=Math.max(0,N*Q),h=Math.min(K-1,(_+1)*Q-1);return{start:u,end:h}}let M=-1,y=-1,v=0,P=0;for(let u=0;u<K;u++){if(Y(u)){if(P>0)v++,P=0;if(v>=N&&v<=_){if(M===-1)M=u;y=u}v++,P=0}else{if(v>=N&&v<=_){if(M===-1)M=u;y=u}if(P++,P>=Q)v++,P=0}if(v>_&&P===0)break}if(M===-1)return{start:0,end:-1};return{start:M,end:y}},U=(N,_,K)=>{if(_<0||_>=Q)return-1;let M=N*Q+_;if(M<0||M>=K)return-1;return M},F=(N)=>{let _=(Q-1)*$;return Math.max(0,(N-_)/Q)};return{get columns(){return Q},get gap(){return $},update:(N)=>{if(N.columns!==void 0)Q=Math.max(1,Math.floor(N.columns));if(N.gap!==void 0)$=N.gap;if(N.isHeaderFn!==void 0)Y=N.isHeaderFn},getTotalRows:j,getPosition:B,getRow:V,getCol:R,getItemRange:W,getItemIndex:U,getColumnWidth:F,getColumnOffset:(N,_)=>{let K=F(_);return N*(K+$)}}};var G2=16000000;var l2="x",a2=20,v2="_isPlaceholder",D2="__placeholder_";var W2=(J,Q,$)=>{if(String($).startsWith(D2))return!1;let Y=D2+Q;if(J.has(Y))return J.delete(Y),J.add($),!0;return!1},s2=(J)=>({selected:new Set(J??[]),focusedIndex:-1,focusVisible:!1}),C2=(J,Q,$)=>{if($==="none")return J;let Y=new Set(J.selected);if($==="single"){if(Y.clear(),Q.length>0)Y.add(Q[0])}else for(let q of Q)Y.add(q);return{...J,selected:Y}},S2=(J,Q)=>{let $=new Set(J.selected);for(let Y of Q)$.delete(Y);return{...J,selected:$}},o2=(J,Q,$)=>{if($==="none")return J;if(J.selected.has(Q))return S2(J,[Q]);else return C2(J,[Q],$)},n2=(J,Q,$)=>{if($!=="multiple")return J;return{...J,selected:new Set(Q.map((Y)=>Y.id))}},i2=(J)=>({...J,selected:new Set});var t2=(J,Q)=>{return J.selected.has(Q)},e2=(J)=>{return Array.from(J.selected)},JJ=(J,Q)=>{let $=[];for(let Y of J.selected){let q=Q(Y);if(q)$.push(q)}return $};var vJ=(J,Q)=>{let $=Q;return{getOffset:(Y)=>Y*J,getSize:(Y)=>J,indexAtOffset:(Y)=>{if($===0||J===0)return 0;return Math.max(0,Math.min(Math.floor(Y/J),$-1))},getTotalSize:()=>$*J,getTotal:()=>$,rebuild:(Y)=>{$=Y},isVariable:()=>!1}},CJ=(J,Q)=>{let $=Q,Y=new Float64Array(0),q=(B)=>{$=B,Y=new Float64Array(B+1),Y[0]=0;for(let V=0;V<B;V++)Y[V+1]=Y[V]+J(V)};q(Q);let j=(B)=>{if($===0)return 0;if(B<=0)return 0;if(B>=Y[$])return $-1;let V=0,R=$-1;while(V<R){let W=V+R+1>>>1;if(Y[W]<=B)V=W;else R=W-1}return V};return{getOffset:(B)=>{if(B<=0)return 0;if(B>=$)return Y[$];return Y[B]},getSize:(B)=>J(B),indexAtOffset:(B)=>j(B),getTotalSize:()=>Y[$]??0,getTotal:()=>$,rebuild:(B)=>q(B),isVariable:()=>!0}},E2=(J,Q)=>{if(typeof J==="number")return vJ(J,Q);return CJ(J,Q)},f2=(J,Q,$,Y)=>{if(Y===0)return 0;if(!J.isVariable())return Math.ceil($/J.getSize(0));let q=0,j=0,B=Q;while(B<Y&&j<$)j+=J.getSize(B),q++,B++;return Math.max(1,q)};var F2=(J,Q,$)=>{let Y=Q.getTotalSize(),q=$===!0||Y>G2,j=Y>G2?G2:Y,B=Y>0?j/Y:1;return{isCompressed:q,actualSize:Y,virtualSize:j,ratio:B}},QJ=(J,Q,$,Y,q,j)=>{if(Y===0||Q===0)return j.start=0,j.end=-1,j;if(!q.isCompressed||q.ratio===1){let A=$.indexAtOffset(J),z=$.indexAtOffset(J+Q);if(z<Y-1)z++;return j.start=Math.max(0,A),j.end=Math.min(Y-1,Math.max(0,z)),j}let{virtualSize:B}=q,R=J/B*Y,W=Math.floor(R),U=f2($,Math.max(0,W),Q,Y),F=Math.ceil(R)+U;return j.start=Math.max(0,W),j.end=Math.min(Y-1,Math.max(0,F)),j},$J=(J,Q,$,Y)=>{if($===0)return Y.start=0,Y.end=-1,Y;return Y.start=Math.max(0,J.start-Q),Y.end=Math.min($-1,J.end+Q),Y},M2=(J,Q,$,Y,q,j,B)=>{if(!j.isCompressed||Y===0)return $.getOffset(J);if(j.ratio===1)return $.getOffset(J)-Q;let{virtualSize:V}=j,R=Q/V,W=$.getTotalSize(),U=R*W;return $.getOffset(J)-U},YJ=(J,Q,$,Y,q,j="start")=>{if(Y===0)return 0;let B;if(q.isCompressed&&q.ratio!==1){B=J/Y*q.virtualSize;let U=Q.getSize(J);switch(j){case"center":B-=($-U)/2*q.ratio;break;case"end":B-=($-U)*q.ratio;break}return Math.max(0,B)}B=Q.getOffset(J);let V=Q.getSize(J);switch(j){case"center":B-=($-V)/2;break;case"end":B-=$-V;break}let R=q.virtualSize-$;return Math.max(0,Math.min(B,R))},jJ=(J,Q,$,Y)=>{if($===0)return 0;if(Y.isCompressed&&Y.ratio!==1){let q=J/Y.virtualSize;return Math.floor(q*$)}return Q.indexAtOffset(J)},qJ=(J,Q)=>{if(typeof Q==="number")return J*Q>G2;return Q.getTotalSize()>G2},BJ=(J)=>{if(J<=0)return 0;return Math.floor(G2/J)},KJ=(J,Q,$)=>{let Y=F2(J,Q,$);if(!Y.isCompressed)return`No compression needed (${J} items, ${(Y.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(Y.ratio*100).toFixed(1)}% (${J} items, ${(Y.actualSize/1e6).toFixed(1)}M px → ${(Y.virtualSize/1e6).toFixed(1)}M px virtual)`};var T2=(J,Q,$)=>{let Y=Array.from(Q).sort((B,V)=>B-V);if(Y.length<=1)return;let q=[];for(let B=0;B<Y.length;B++){let V=$(Y[B]);if(V)q.push(V)}if(q.length<=1)return;let j=J.firstChild;for(let B=0;B<q.length;B++){let V=q[B];if(V===j)j=j.nextSibling;else J.insertBefore(V,j)}};var SJ=(J=200)=>{let Q=[];return{acquire:()=>{let j=Q.pop();if(j)return j;let B=document.createElement("div");return B.setAttribute("role","option"),B},release:(j)=>{if(j.remove(),Q.length<J)j.className="",j.textContent="",j.removeAttribute("style"),j.removeAttribute("data-index"),j.removeAttribute("data-id"),j.removeAttribute("data-row"),j.removeAttribute("data-col"),Q.push(j)},clear:()=>{Q.length=0}}},fJ=1,UJ=(J,Q,$,Y,q,j,B,V,R=!1)=>{let W=SJ(),U=new Map,F=j,A=!1,z=0,N="",_=-1,K={selected:!1,focused:!1},M=(O,X)=>{return K.selected=O,K.focused=X,K},y=`${q}-item ${q}-grid-item`,v=`${q}-item--selected`,P=`${q}-item--focused`,u=`${q}-item--placeholder`,h=`${q}-item--replaced`,l=(O,X)=>{if(typeof X==="string")O.innerHTML=X;else O.replaceChildren(X)},n=(O,X,f)=>{O.classList.toggle(v,X),O.classList.toggle(P,f)},J2=(O,X)=>{let f=Y.getRow(O);if(X?.compression?.isCompressed)return M2(f,X.scrollPosition,$,X.totalItems,X.containerSize,X.compression,X.rangeStart);return $.getOffset(f)},j2=(O,X)=>{let f=A&&Y.getCol(O)===0,x=f?0:Y.getCol(O),k=f?0:Y.getColumnOffset(x,F),C;if(A){let t=Y.getRow(O),H=0,b=new Set;for(let S=0;S<O;S++){let g=Y.getRow(S);if(g<t&&!b.has(g)){let G=$.getSize(S);H+=G,b.add(g)}}C=H}else C=J2(O,X);if(R)return`translate(${Math.round(C)}px, ${Math.round(k)}px)`;return`translate(${Math.round(k)}px, ${Math.round(C)}px)`},m=(O,X)=>{O.style.transform=X},I=(O,X)=>{let f=O.dataset.id?.startsWith("__group_header"),x=f?F:Y.getColumnWidth(F),k;if(A||f)k=$.getSize(X)-Y.gap;else{let C=Y.getRow(X);k=$.getSize(C)-Y.gap}if(R)O.style.width=`${k}px`,O.style.height=`${x}px`;else O.style.width=`${x}px`,O.style.height=`${k}px`},o=(O,X,f,x,k)=>{let C=W.acquire(),t=M(f,x);if(C.className=y,C.dataset.index=String(O),C.dataset.id=String(X.id),C.dataset.row=String(Y.getRow(O)),C.dataset.col=String(Y.getCol(O)),C.ariaSelected=String(f),V)C.id=`${V}-item-${O}`;if(B){let S=B();if(S!==_)_=S,N=String(S);C.setAttribute("aria-setsize",N),C.setAttribute("aria-posinset",String(O+1))}I(C,O);let H=Q(X,O,t);if(l(C,H),String(X.id).startsWith(D2))C.classList.add(u);return n(C,f,x),m(C,k),{element:C,lastItemId:X.id,lastSelected:f,lastFocused:x,lastTransform:k,lastSeenFrame:z}},i=(O,X,f,x,k)=>{if(z++,X.start===0&&O.length>0)A=b2(O[0]);for(let[H,b]of U)if(H>=X.start&&H<=X.end)b.lastSeenFrame=z;else if(z-b.lastSeenFrame>fJ)W.release(b.element),U.delete(H);let C=!1;if(B){let H=B();if(H!==_)_=H,N=String(H),C=!0}let t=null;for(let H=X.start;H<=X.end;H++){let b=H-X.start,S=O[b];if(!S){console.warn(`⚠️ RENDER: Missing item at index ${H} (range: ${X.start}-${X.end}, items.length: ${O.length})`);continue}let g=f.has(S.id),G=H===x,D=U.get(H);if(D){let p=D.lastItemId!==S.id,e=D.lastSelected!==g,$2=D.lastFocused!==G;if(p){let K2=String(D.lastItemId),Y2=String(S.id),Q2=K2.startsWith(D2),q2=Y2.startsWith(D2);if(!q2&&W2(f,H,S.id))g=!0;let U2=M(g,G),c=Q(S,H,U2);if(l(D.element,c),D.element.dataset.id=Y2,D.element.dataset.row=String(Y.getRow(H)),D.element.dataset.col=String(Y.getCol(H)),I(D.element,H),D.element.classList.toggle(u,q2),Q2&&!q2)D.element.classList.add(h),setTimeout(()=>D.element.classList.remove(h),300);D.lastItemId=S.id}if(p||e||$2)n(D.element,g,G),D.element.ariaSelected=String(g),D.lastSelected=g,D.lastFocused=G;let s=j2(H,k);if(D.lastTransform!==s)m(D.element,s),D.lastTransform=s;if(C)D.element.setAttribute("aria-setsize",N)}else{if(W2(f,H,S.id))g=!0;let p=j2(H,k),e=o(H,S,g,G,p);if(!t)t=document.createDocumentFragment();t.appendChild(e.element),U.set(H,e)}}if(t)J.appendChild(t)},w=(O)=>{for(let[X,f]of U){let x=j2(X,O);if(f.lastTransform!==x)m(f.element,x),f.lastTransform=x}},E=(O,X,f,x)=>{let k=U.get(O);if(!k)return;let C=M(f,x),t=Q(X,O,C);l(k.element,t),n(k.element,f,x),k.element.dataset.id=String(X.id),k.element.ariaSelected=String(f),I(k.element,O),k.lastItemId=X.id,k.lastSelected=f,k.lastFocused=x},Z=(O,X,f)=>{let x=U.get(O);if(!x)return;let k=x.lastSelected!==X,C=x.lastFocused!==f;if(k||C)n(x.element,X,f),x.lastSelected=X,x.lastFocused=f},L=(O)=>{return U.get(O)?.element},T=(O)=>{if(Math.abs(O-F)<1)return;F=O;for(let[X,f]of U){I(f.element,X);let x=j2(X);m(f.element,x),f.lastTransform=x}},a=()=>{T2(J,U.keys(),(O)=>U.get(O)?.element)},r=()=>{for(let[,O]of U)W.release(O.element);U.clear()};return{render:i,updatePositions:w,updateItem:E,updateItemClasses:Z,getElement:L,sortDOM:a,updateContainerWidth:T,clear:r,destroy:()=>{r(),W.clear()}}};var XJ=(J,Q=50,$=1/0,Y=!0)=>{let q=J,j=[],B=0,V=()=>{j=q.map((K,M)=>({def:K,index:M,width:0,minWidth:IJ(K.minWidth??Q,1),maxWidth:K.maxWidth??$,resizable:K.resizable??Y,offset:0}))},R=(K)=>{if(j.length===0){B=0;return}let M=0,y=0;for(let v=0;v<j.length;v++){let P=j[v],u=P.def;if(u.width!==void 0)P.width=I2(u.width,P.minWidth,P.maxWidth),M+=P.width;else y++}if(y>0){let P=Math.max(0,K-M)/y;for(let u=0;u<j.length;u++){let h=j[u];if(h.def.width===void 0)h.width=I2(P,h.minWidth,h.maxWidth)}}W()},W=()=>{let K=0;for(let M=0;M<j.length;M++){let y=j[M];y.offset=K,K+=y.width}B=K},U=(K,M)=>{if(K<0||K>=j.length)return 0;let y=j[K];if(!y.resizable)return y.width;let v=I2(M,y.minWidth,y.maxWidth);return y.width=v,W(),v},F=(K)=>{return j[K]},A=(K)=>{if(j.length===0)return;if(K<0)return j[0];if(K>=B)return j[j.length-1];let M=0,y=j.length-1;while(M<y){let v=M+y>>>1,P=j[v];if(K<P.offset)y=v-1;else if(K>=P.offset+P.width)M=v+1;else return P}return j[M]},z=(K)=>{if(K<0||K>=j.length)return 0;return j[K].offset},N=(K)=>{if(K<0||K>=j.length)return 0;return j[K].width},_=(K)=>{q=K,V()};return V(),{get columns(){return j},get totalWidth(){return B},resolve:R,updateColumns:_,resizeColumn:U,getColumn:F,getColumnAtX:A,getColumnOffset:z,getColumnWidth:N}},I2=(J,Q,$)=>Math.min($,Math.max(Q,J)),IJ=(J,Q)=>Math.max(Q,J);var NJ=(J,Q,$,Y,q,j,B)=>{let V=document.createElement("div");V.setAttribute("role","rowgroup");let R=document.createElement("div");R.className=`${Y}-table-header`,R.setAttribute("role","row"),R.setAttribute("aria-rowindex","1"),R.style.height=`${$}px`;let W=document.createElement("div");W.className=`${Y}-table-header-scroll`,W.setAttribute("role","presentation"),R.appendChild(W),V.appendChild(R),J.insertBefore(V,J.firstChild),Q.style.cssText=`position:absolute;top:${$}px;left:0px;right:0px;bottom:0px;height:auto`;let U=[],F=[],A=[],z=!0,N=null,_="asc",K=null,M=!1,y=-1,v=0,P=0,u=(Z,L)=>{let T=document.createElement("div");T.className=`${Y}-table-header-cell`,T.setAttribute("role","columnheader"),T.setAttribute("aria-colindex",String(L+1)),T.dataset.columnKey=Z.def.key;let a=Z.def.align;if(a==="center")T.classList.add(`${Y}-table-header-cell--center`);else if(a==="right")T.classList.add(`${Y}-table-header-cell--right`);let r=document.createElement("div");r.className=`${Y}-table-header-content`;let d=Z.def.header?Z.def.header(Z.def):Z.def.label;if(typeof d==="string")r.textContent=d;else r.appendChild(d);if(T.appendChild(r),Z.def.sortable){let O=document.createElement("span");O.className=`${Y}-table-header-sort`,O.setAttribute("aria-hidden","true"),T.appendChild(O),A.push(O),T.classList.add(`${Y}-table-header-cell--sortable`)}else A.push(null);if(Z.resizable){let O=document.createElement("div");O.className=`${Y}-table-header-resize`,O.dataset.resizeIndex=String(L),T.appendChild(O),F.push(O)}return T},h=(Z)=>{K=Z,W.textContent="",U=[],F=[],A=[];let L=Z.columns;for(let T=0;T<L.length;T++){let a=L[T],r=u(a,T);U.push(r),W.appendChild(r)}if(l(Z),N)n(N,_)},l=(Z)=>{K=Z;let L=Z.columns;W.style.width=`${Z.totalWidth}px`;for(let T=0;T<U.length&&T<L.length;T++){let a=U[T],r=L[T];a.style.width=`${r.width}px`}},n=(Z,L)=>{if(N=Z,_=L,!K)return;let T=K.columns;for(let a=0;a<A.length&&a<T.length;a++){let r=A[a];if(!r)continue;if(T[a].def.key===Z&&Z!==null)r.textContent=L==="asc"?"▲":"▼",r.style.opacity="0.7",U[a].setAttribute("aria-sort",L==="asc"?"ascending":"descending");else r.textContent="",r.style.opacity="0",U[a].removeAttribute("aria-sort")}},J2=(Z)=>{W.style.transform=`translateX(${-Z}px)`},j2=(Z)=>{let L=Z.target;if(!L.dataset.resizeIndex)return;if(Z.preventDefault(),Z.stopPropagation(),y=parseInt(L.dataset.resizeIndex,10),!K)return;let T=K.getColumn(y);if(!T||!T.resizable)return;M=!0,v=Z.clientX,P=T.width,J.classList.add(`${Y}--col-resizing`),J.style.cursor="col-resize",L.classList.add(`${Y}-table-header-resize--active`),L.setPointerCapture(Z.pointerId),L.addEventListener("pointermove",m),L.addEventListener("pointerup",I),L.addEventListener("pointercancel",I)},m=(Z)=>{if(!M||!K)return;let L=Z.clientX-v;if(Math.abs(L)<1)return;let T=Math.max(0,P+L);q(y,T)},I=(Z)=>{if(!M)return;let L=Z.target;L.removeEventListener("pointermove",m),L.removeEventListener("pointerup",I),L.removeEventListener("pointercancel",I);try{L.releasePointerCapture(Z.pointerId)}catch{}L.classList.remove(`${Y}-table-header-resize--active`),J.classList.remove(`${Y}--col-resizing`),J.style.cursor="",M=!1,y=-1},o=(Z)=>{let L=Z.target;if(L.dataset.resizeIndex!==void 0)return;if(M)return;let T=L;while(T&&!T.dataset.columnKey)if(T=T.parentElement,T===R||T===null)return;if(!T||!T.dataset.columnKey)return;let a=T.dataset.columnKey;if(!K)return;let r=K.columns,d=-1;for(let X=0;X<r.length;X++)if(r[X].def.key===a){d=X;break}if(d===-1)return;let O=r[d];if(B)B({key:a,index:d,event:Z});if(O.def.sortable&&j){let X;if(N===a)if(_==="asc")X="desc";else X=null;else X="asc";j({key:a,index:d,direction:X})}};return R.addEventListener("pointerdown",j2),R.addEventListener("click",o),{element:R,update:l,updateSort:n,rebuild:h,show:()=>{if(z)return;z=!0,R.style.display=""},hide:()=>{if(!z)return;z=!1,R.style.display="none"},destroy:()=>{R.removeEventListener("pointerdown",j2),R.removeEventListener("click",o),Q.style.cssText="",V.remove(),U=[],F=[],A=[],K=null,z=!1},syncScroll:J2}};var pJ=()=>{let J=[];return{acquire:()=>J.pop()||document.createElement("div"),release:(Q)=>{if(Q.parentNode?.removeChild(Q),J.length<200)Q.className="",Q.removeAttribute("data-id"),Q.removeAttribute("data-index"),Q.removeAttribute("aria-selected"),Q.removeAttribute("aria-rowindex"),Q.removeAttribute("role"),Q.style.cssText="",Q.textContent="",J.push(Q)},clear:()=>{J.length=0}}},ZJ=(J,Q,$,Y,q,j,B,V,R)=>{let W=pJ(),U=new Map,F=-1,A=$,z=null,N=null,_=null,K=(H,b)=>{N=H,_=b},M=(H,b)=>{if(b)H.setAttribute("aria-selected","true");else H.removeAttribute("aria-selected")},y=(H,b,S,g)=>{H.setAttribute("role",b),H.setAttribute("data-id",String(S)),H.setAttribute("data-index",String(g))},v=(H)=>String(H).startsWith("__placeholder_"),P=`${q}-item ${q}-table-row`,u=`${q}-item--selected`,h=`${q}-item--focused`,l=`${q}-table-cell`,n=`${q}-table-cell--center`,J2=`${q}-table-cell--right`,j2=`${q}-item--odd`,m=`${q}-item--placeholder`,I=`${q}-item--replaced`,o=`${q}-item ${q}-table-row ${q}-table-group-header`,i=`${q}-table-group-header-content`,w=(H,b,S,g,G=!1)=>{if(S.def.cell){let D=S.def.cell(b,S.def,g);if(typeof D==="string")H.innerHTML=D;else H.replaceChildren(D)}else{let D=b[S.def.key],p=D!=null?String(D):"";if(G&&p)H.innerHTML=`<span>${p}</span>`;else H.textContent=p}},E=(H,b,S,g,G=!1)=>{let D=P;if(V){if(z){let p=z(b);if(p>=0&&(p&1)===1)D+=` ${j2}`}else if((b&1)===1)D+=` ${j2}`}if(G)D+=` ${m}`;if(S)D+=` ${u}`;if(g)D+=` ${h}`;H.className=D},Z=(H,b,S)=>{if(S?.compression?.isCompressed)return Math.round(M2(H,S.scrollPosition,b,S.totalItems,S.containerSize,S.compression,S.rangeStart));return b.getOffset(H)},L=(H,b)=>{let S=b.def.align;if(S==="center")H.classList.add(n),H.classList.remove(J2);else if(S==="right")H.classList.add(J2),H.classList.remove(n);else H.classList.remove(n,J2)},T=(H,b)=>{let g=A.columns.length;if(b.length===g)return b;let G=[];for(let D=0;D<g;D++){let p;if(D<b.length)p=b[D];else p=document.createElement("div"),p.className=l,H.appendChild(p);G.push(p)}for(let D=g;D<b.length;D++)b[D].remove();return G},a=(H,b,S,g)=>{let G=W.acquire(),D=H,p=S.getSize(b),e=Z(b,S,g);G.style.cssText=`width:${A.totalWidth}px;height:${p}px;transform:translateY(${e}px)`,G.className=o,y(G,"presentation",H.id,b),G.removeAttribute("aria-selected"),G.removeAttribute("aria-rowindex"),G.replaceChildren();let $2=document.createElement("div");if($2.className=i,_){let s=_(D.groupKey,D.groupIndex);if(typeof s==="string")$2.innerHTML=s;else $2.appendChild(s)}return G.appendChild($2),{element:G,cells:[],index:b,isGroupHeader:!0,lastItemId:H.id,lastSelected:!1,lastFocused:!1,lastOffset:e,lastHeight:p}},r=(H,b,S,g,G,D)=>{let p=W.acquire(),e=G.getSize(b),$2=Z(b,G,D),s=v(H.id);p.style.cssText=`width:${A.totalWidth}px;height:${e}px;transform:translateY(${$2}px)`,E(p,b,S,g,s),y(p,"row",H.id,b),p.id=`${j}-${b}`,p.setAttribute("aria-rowindex",String(b+2)),M(p,S);let K2=T(p,[]),Y2=A.columns;for(let Q2=0;Q2<K2.length&&Q2<Y2.length;Q2++){let q2=K2[Q2],U2=Y2[Q2];q2.style.cssText=`left:${U2.offset}px;width:${U2.width}px`,q2.setAttribute("role","gridcell"),q2.setAttribute("aria-colindex",String(Q2+1)),L(q2,U2),w(q2,H,U2,b,s)}return{element:p,cells:K2,index:b,isGroupHeader:!1,lastItemId:H.id,lastSelected:S,lastFocused:g,lastOffset:$2,lastHeight:e}},d=(H,b,S,g,G)=>{for(let[s,K2]of U)if(s<b.start||s>b.end)W.release(K2.element),U.delete(s);let D=!1,p=B();if(p!==F)F=p,D=!0;let e=null,$2=Q();z=typeof V==="string"&&R?R():null;for(let s=b.start;s<=b.end;s++){let K2=s-b.start,Y2=H[K2];if(!Y2)continue;let Q2=S.has(Y2.id),q2=s===g,U2=N?N(Y2):!1,c=U.get(s);if(c){if(c.isGroupHeader!==U2){W.release(c.element),U.delete(s);let X2=U2?a(Y2,s,$2,G):r(Y2,s,Q2,q2,$2,G);if(U.set(s,X2),!e)e=document.createDocumentFragment();e.appendChild(X2.element);continue}if(U2){if(c.lastItemId!==Y2.id){let Z2=Y2,V2=c.element.firstElementChild;if(V2&&_){let O2=_(Z2.groupKey,Z2.groupIndex);if(typeof O2==="string")V2.innerHTML=O2;else V2.replaceChildren(O2)}c.element.setAttribute("data-id",String(Y2.id)),c.lastItemId=Y2.id}let B2=Z(s,$2,G);if(c.lastOffset!==B2)c.lastOffset=B2,c.element.style.transform=`translateY(${B2}px)`;let N2=$2.getSize(s);if(c.lastHeight!==N2)c.lastHeight=N2,c.element.style.height=`${N2}px`}else{let X2=c.lastItemId!==Y2.id,B2=c.lastSelected!==Q2,N2=c.lastFocused!==q2;if(X2){let O2=c.lastItemId!=null&&v(c.lastItemId),H2=v(Y2.id);if(!H2&&W2(S,s,Y2.id))Q2=!0;let h2=A.columns;for(let A2=0;A2<c.cells.length&&A2<h2.length;A2++)w(c.cells[A2],Y2,h2[A2],s,H2);if(E(c.element,s,Q2,q2,H2),c.element.setAttribute("data-id",String(Y2.id)),M(c.element,Q2),O2&&!H2)c.element.classList.add(I),setTimeout(()=>{c.element.classList.remove(I)},300);c.lastItemId=Y2.id,c.lastSelected=Q2,c.lastFocused=q2}else if(B2||N2)E(c.element,s,Q2,q2,v(Y2.id)),M(c.element,Q2),c.lastSelected=Q2,c.lastFocused=q2;let Z2=Z(s,$2,G);if(c.lastOffset!==Z2)c.lastOffset=Z2,c.element.style.transform=`translateY(${Z2}px)`;let V2=$2.getSize(s);if(c.lastHeight!==V2)c.lastHeight=V2,c.element.style.height=`${V2}px`;if(D)c.element.setAttribute("aria-rowindex",String(s+2))}}else{if(W2(S,s,Y2.id))Q2=!0;let X2=U2?a(Y2,s,$2,G):r(Y2,s,Q2,q2,$2,G);if(U.set(s,X2),!e)e=document.createDocumentFragment();e.appendChild(X2.element)}}if(e)J.appendChild(e)},O=(H)=>{let b=Q();for(let[S,g]of U){let G=Z(S,b,H);if(g.lastOffset!==G)g.lastOffset=G,g.element.style.transform=`translateY(${G}px)`}},X=(H,b,S,g)=>{let G=U.get(H);if(!G)return;if(G.isGroupHeader)return;let D=A.columns;for(let p=0;p<G.cells.length&&p<D.length;p++)w(G.cells[p],b,D[p],H);G.element.setAttribute("data-id",String(b.id)),G.lastItemId=b.id,E(G.element,H,S,g),M(G.element,S),G.lastSelected=S,G.lastFocused=g},f=(H,b,S)=>{let g=U.get(H);if(!g)return;if(g.isGroupHeader)return;let G=g.lastSelected!==b,D=g.lastFocused!==S;if(G||D)E(g.element,H,b,S),M(g.element,b),g.lastSelected=b,g.lastFocused=S},x=(H)=>{A=H;let b=H.columns;for(let[,S]of U)if(S.element.style.width=`${H.totalWidth}px`,S.cells.length>0)for(let g=0;g<S.cells.length&&g<b.length;g++){let G=S.cells[g],D=b[g];G.style.left=`${D.offset}px`,G.style.width=`${D.width}px`}},k=(H)=>{return U.get(H)?.element},C=()=>{for(let[,H]of U)W.release(H.element);U.clear(),F=-1};return{render:d,updatePositions:O,updateItem:X,updateItemClasses:f,getElement:k,updateColumnLayout:x,setGroupHeaderFn:K,clear:C,destroy:()=>{C(),W.clear()}}};var GJ=(J)=>{let Q=Math.max(1,Math.floor(J.columns)),$=J.gap??0,Y=J.containerSize,q=0,j=[],B=()=>{let K=(Q-1)*$;q=Math.max(0,(Y-K)/Q),j=Array(Q);let M=q+$;for(let y=0;y<Q;y++)j[y]=y*M};B();let V=[],R=0,W=[],U=(K)=>{let M=0,y=K[0];for(let v=1;v<K.length;v++){let P=K[v];if(P<y)y=P,M=v}return M},F=(K,M)=>{if(K<=0)return R=0,V=[],[];let y=Array(Q).fill(0),v=Array(Q);for(let h=0;h<Q;h++)v[h]=[];let P=Array(K);for(let h=0;h<K;h++){let l=U(y),n=M(h),J2=y[l];P[h]={index:h,x:j[l],y:J2,lane:l,size:n,crossSize:q},v[l].push(h),y[l]=J2+n+$}V=v;let u=0;for(let h=0;h<Q;h++){let l=y[h],n=l>0?l-$:0;if(n>u)u=n}return R=u,P},A=(K)=>{if(K.length===0)return R>0?R:0;if(R>0)return R;let M=Array(Q).fill(0);for(let v of K){let P=v.y+v.size,u=M[v.lane];if(P>u)M[v.lane]=P}let y=0;for(let v=0;v<Q;v++)if(M[v]>y)y=M[v];return y},z=(K,M,y)=>{if(K.length===0||y<=M)return W.length=0,W;if(V.length===0||V.length!==Q)return N(K,M,y);W.length=0;for(let v=0;v<Q;v++){let P=V[v],u=P.length;if(u===0)continue;let h=0,l=u;while(h<l){let n=h+l>>>1,J2=K[P[n]];if(J2.y+J2.size<=M)h=n+1;else l=n}for(let n=h;n<u;n++){let J2=K[P[n]];if(J2.y>=y)break;W.push(J2)}}return W},N=(K,M,y)=>{let v=[];for(let P of K)if(P.y+P.size>M&&P.y<y)v.push(P);return v};return{get columns(){return Q},get gap(){return $},get containerSize(){return Y},update:(K)=>{let M=!1;if(K.columns!==void 0){let y=Math.max(1,Math.floor(K.columns));if(y!==Q)Q=y,M=!0}if(K.gap!==void 0&&K.gap!==$)$=K.gap,M=!0;if(K.containerSize!==void 0&&K.containerSize!==Y)Y=K.containerSize,M=!0;if(M)B()},calculateLayout:F,getTotalSize:A,getVisibleItems:z}};var hJ=(J=200)=>{let Q=[];return{acquire:()=>{let j=Q.pop();if(j)return j;let B=document.createElement("div");return B.setAttribute("role","option"),B},release:(j)=>{if(j.remove(),Q.length<J)j.className="",j.textContent="",j.removeAttribute("style"),j.removeAttribute("data-index"),j.removeAttribute("data-id"),j.removeAttribute("data-lane"),Q.push(j)},clear:()=>{Q.length=0}}},xJ=1,DJ=(J,Q,$,Y=!1,q,j)=>{let B=hJ(),V=new Map,R=new Set,W=0,U="",F=-1,A={selected:!1,focused:!1},z=(m,I)=>{return A.selected=m,A.focused=I,A},N=`${$}-item ${$}-masonry-item`,_=`${$}-item--selected`,K=`${$}-item--focused`,M=(m,I)=>{if(typeof I==="string")m.innerHTML=I;else m.replaceChildren(I)},y=(m,I,o)=>{m.classList.toggle(_,I),m.classList.toggle(K,o)},v=(m,I)=>{if(Y)m.style.transform=`translate(${Math.round(I.y)}px, ${Math.round(I.x)}px)`;else m.style.transform=`translate(${Math.round(I.x)}px, ${Math.round(I.y)}px)`},P=(m,I)=>{if(Y)m.style.width=`${I.size}px`,m.style.height=`${I.crossSize}px`;else m.style.width=`${I.crossSize}px`,m.style.height=`${I.size}px`},u=(m,I,o,i,w)=>{let E=B.acquire(),Z=z(i,w);if(E.className=N,E.dataset.index=String(m),E.dataset.id=String(I.id),E.dataset.lane=String(o.lane),E.ariaSelected=String(i),j)E.id=`${j}-item-${m}`;if(q){let T=q();if(T!==F)F=T,U=String(T);E.setAttribute("aria-setsize",U),E.setAttribute("aria-posinset",String(m+1))}P(E,o);let L=Q(I,m,Z);return M(E,L),y(E,i,w),v(E,o),{element:E,lastItemId:I.id,lastSelected:i,lastFocused:w,lastY:o.y,lastX:o.x,lastSize:o.size,lastCrossSize:o.crossSize,lastSeenFrame:W}},h=(m,I,o,i)=>{W++,R.clear();for(let E=0;E<I.length;E++)R.add(I[E].index);for(let[E,Z]of V)if(R.has(E))Z.lastSeenFrame=W;else if(W-Z.lastSeenFrame>xJ)B.release(Z.element),V.delete(E);let w=null;for(let E=0;E<I.length;E++){let Z=I[E],L=Z.index,T=m(L);if(!T)continue;let a=o.has(T.id),r=L===i,d=V.get(L);if(d){let O=d.lastItemId!==T.id,X=d.lastSelected!==a,f=d.lastFocused!==r,x=d.lastY!==Z.y||d.lastX!==Z.x,k=d.lastSize!==Z.size||d.lastCrossSize!==Z.crossSize;if(O){let C=z(a,r),t=Q(T,L,C);M(d.element,t),d.element.dataset.id=String(T.id),d.lastItemId=T.id}if(O||X||f)y(d.element,a,r),d.element.ariaSelected=String(a),d.lastSelected=a,d.lastFocused=r;if(k)P(d.element,Z),d.lastSize=Z.size,d.lastCrossSize=Z.crossSize;if(x)v(d.element,Z),d.lastY=Z.y,d.lastX=Z.x}else{let O=u(L,T,Z,a,r);if(!w)w=document.createDocumentFragment();w.appendChild(O.element),V.set(L,O)}}if(w)J.appendChild(w)},l=()=>{for(let{element:m}of V.values())B.release(m);V.clear(),J.innerHTML=""};return{render:h,getElement:(m)=>V.get(m)?.element,updateItemClasses:(m,I,o)=>{let i=V.get(m);if(!i)return;let w=i.lastSelected!==I,E=i.lastFocused!==o;if(w||E)y(i.element,I,o),i.lastSelected=I,i.lastFocused=o},sortDOM:()=>{T2(J,V.keys(),(m)=>V.get(m)?.element)},clear:l,destroy:()=>{l(),B.clear()}}};var _J=(J,Q)=>{let $=new Map,Y=(j)=>{let B=$.get(j);return B!==void 0?B:J},q=E2(Y,Q);return{getOffset(j){return q.getOffset(j)},getSize(j){return Y(j)},indexAtOffset(j){return q.indexAtOffset(j)},getTotalSize(){return q.getTotalSize()},getTotal(){return q.getTotal()},rebuild(j){if(j<q.getTotal()){for(let B of $.keys())if(B>=j)$.delete(B)}q=E2(Y,j)},isVariable(){return!0},setMeasuredSize(j,B){$.set(j,B)},isMeasured(j){return $.has(j)},getEstimatedSize(){return J},measuredCount(){return $.size}}};var VJ=(J,Q,$,Y,q,j)=>{if(Y===0||Q===0)return j.start=0,j.end=-1,j;let B=$.indexAtOffset(J),V=$.indexAtOffset(J+Q);if(V<Y-1)V++;return j.start=Math.max(0,B),j.end=Math.min(Y-1,Math.max(0,V)),j},WJ=(J,Q,$,Y)=>{if($===0)return Y.start=0,Y.end=-1,Y;return Y.start=Math.max(0,J.start-Q),Y.end=Math.min($-1,J.end+Q),Y},MJ=(J,Q,$,Y,q,j)=>{if(Y===0)return 0;let B=Math.max(0,Math.min(J,Y-1)),V=Q.getOffset(B),R=Q.getSize(B),W=Q.getTotalSize(),U=Math.max(0,W-$),F;switch(j){case"center":F=V-$/2+R/2;break;case"end":F=V-$+R;break;case"start":default:F=V;break}return Math.max(0,Math.min(F,U))},OJ=(J,Q,$)=>{if($&&$.isCompressed)return $.virtualSize;return Q.getTotalSize()},AJ=(J,Q)=>{return Q.getTotalSize()},EJ=(J,Q)=>{return Q.getOffset(J)},FJ=(J,Q,$)=>{let Y=Math.max(0,Q-$);return Math.max(0,Math.min(J,Y))};var LJ=(J,Q,$,Y,q="start",j,B=MJ)=>{return B(J,Q,$,Y,j,q)},HJ=(J,Q)=>{return J.start===Q.start&&J.end===Q.end},bJ=(J,Q)=>{return J>=Q.start&&J<=Q.end},TJ=(J)=>{if(J.end<J.start)return 0;return J.end-J.start+1};var RJ=(J,Q)=>{let $=[],Y=[];for(let q=J.start;q<=J.end;q++)if(q<Q.start||q>Q.end)Y.push(q);for(let q=Q.start;q<=Q.end;q++)if(q<J.start||q>J.end)$.push(q);return{add:$,remove:Y}};var yJ=()=>{let J={},Q=(j,B)=>{if(!J[j])J[j]=new Set;return J[j].add(B),()=>$(j,B)},$=(j,B)=>{J[j]?.delete(B)};return{on:Q,off:$,emit:(j,B)=>{J[j]?.forEach((V)=>{try{V(B)}catch(R){console.error(`[vlist] Error in event handler for "${String(j)}":`,R)}})},clear:(j)=>{if(j)delete J[j];else for(let B in J)delete J[B]}}};var R2=(J={})=>{let{chunkSize:Q=100,maxCachedItems:$=5000,evictionBuffer:Y=200,onEvict:q}=J,j=new Map,B=0,V=0,R=(w)=>{let E=j.get(w);if(!E)E={items:Array(Q),count:0,lastAccess:Date.now()},j.set(w,E);else E.lastAccess=Date.now();return E},W=(w)=>{return Math.floor(w/Q)},U=(w)=>{return w%Q},F=()=>B,A=(w)=>{B=w},z=(w)=>{if(w<0||w>=B)return;let E=W(w),Z=j.get(E);if(!Z)return;return Z.items[U(w)]},N=(w)=>{if(w<0||w>=B)return!1;let E=W(w),Z=j.get(E);if(!Z)return!1;return Z.items[U(w)]!==void 0},_=(w,E)=>{let Z=W(w),L=R(Z),T=U(w),a=L.items[T]===void 0;if(L.items[T]=E,a)L.count++,V++;if(w>=B)B=w+1},K=(w,E)=>{for(let Z=0;Z<E.length;Z++){let L=E[Z];if(L!==void 0)_(w+Z,L)}},M=(w)=>{if(w<0||w>=B)return!1;let E=W(w),Z=j.get(E),L=U(w);if(!(Z!==void 0&&Z.items[L]!==void 0))return!1;let a=E,r=Array.from(j.keys()).filter((O)=>O>=a).sort((O,X)=>O-X),d=[];for(let O of r){let X=j.get(O),f=O*Q;for(let x=0;x<Q;x++){if(X.items[x]===void 0)continue;let k=f+x;if(k<=w)continue;d.push({oldIndex:k,item:X.items[x]})}}if(Z.items[L]=void 0,Z.count--,V--,Z.count===0)j.delete(E);for(let{oldIndex:O}of d){let X=W(O),f=j.get(X);if(!f)continue;let x=U(O);if(f.items[x]!==void 0){if(f.items[x]=void 0,f.count--,V--,f.count===0)j.delete(X)}}for(let{oldIndex:O,item:X}of d){let f=O-1,x=W(f),k=R(x),C=U(f);k.items[C]=X,k.count++,V++}return B--,!0},y=(w,E)=>{let Z=[];for(let L=w;L<=E&&L<B;L++)Z.push(z(L));return Z},v=(w,E)=>{for(let Z=w;Z<=E&&Z<B;Z++)if(!N(Z))return!1;return!0},P=()=>{let w=[],E=null,Z=Array.from(j.keys()).sort((L,T)=>L-T);for(let L of Z){let T=j.get(L);if(!T)continue;let a=L*Q;for(let r=0;r<Q;r++){let d=a+r;if(d>=B)break;if(T.items[r]!==void 0)if(E===null)E={start:d,end:d};else if(d===E.end+1)E.end=d;else w.push(E),E={start:d,end:d};else if(E!==null)w.push(E),E=null}}if(E!==null)w.push(E);return w},u=(w,E)=>{let Z=[],L=null;for(let T=w;T<=E&&T<B;T++)if(!N(T))if(L===null)L={start:T,end:T};else L.end=T;else if(L!==null)Z.push(L),L=null;if(L!==null)Z.push(L);return Z},h=(w)=>{return j.has(w)},l=(w)=>{let E=j.get(w);if(E)E.lastAccess=Date.now()},n=(w,E)=>{if(w>E||j.size===0)return;let Z=Date.now(),L=W(Math.max(0,w)),T=W(Math.min(B-1,E));for(let a=L;a<=T;a++){let r=j.get(a);if(r)r.lastAccess=Z}},J2=(w,E)=>{if(V<=$)return 0;let Z=Math.max(0,w-Y),L=Math.min(B-1,E+Y),T=W(Z),a=W(L),r=0,d=[];for(let[O,X]of j)if(O<T||O>a)r+=X.count,d.push(O),V-=X.count,j.delete(O);if(r>0&&q)q(r,d);return r},j2=()=>{if(V<=$)return 0;let w=Array.from(j.entries()).sort(([,L],[,T])=>L.lastAccess-T.lastAccess),E=0,Z=[];for(let[L,T]of w){if(V<=$)break;E+=T.count,V-=T.count,Z.push(L),j.delete(L)}if(E>0&&q)q(E,Z);return E},m=()=>{return{totalItems:B,cachedItems:V,cachedChunks:j.size,chunkSize:Q,maxCachedItems:$,memoryEfficiency:B>0?1-V/B:1}},I=()=>V,o=()=>{j.clear(),V=0};return{chunkSize:Q,maxCachedItems:$,getTotal:F,setTotal:A,get:z,has:N,set:_,setRange:K,delete:M,getRange:y,isRangeLoaded:v,getLoadedRanges:P,findUnloadedRanges:u,getChunkIndex:W,isChunkLoaded:h,touchChunk:l,touchChunksForRange:n,evictDistant:J2,evictToLimit:j2,getStats:m,getCachedCount:I,clear:o,reset:()=>{o(),B=0}}},y2=(J)=>{if(J.length===0)return[];let Q=[...J].sort((Y,q)=>Y.start-q.start),$=[{...Q[0]}];for(let Y=1;Y<Q.length;Y++){let q=Q[Y],j=$[$.length-1];if(q.start<=j.end+1)j.end=Math.max(j.end,q.end);else $.push({...q})}return $},L2=(J,Q,$)=>{let Y=Math.floor(J.start/$)*$,q=Math.ceil((J.end+1)/$)*$-1,j={start:Y,end:q};if(Q.length===0)return[j];let B=[],V=y2(Q),R=j.start;for(let W of V){if(W.end<R)continue;if(W.start>j.end)break;if(W.start>R)B.push({start:R,end:Math.min(W.start-1,j.end)});if(R=W.end+1,R>j.end)break}if(R<=j.end)B.push({start:R,end:j.end});return B};var P2=(J={})=>{let{maskCharacter:Q=l2,maxSampleSize:$=a2}=J,Y=[],q=!1,j=(U)=>{if(q||U.length===0)return;let F=Math.min(U.length,$);for(let A=0;A<F;A++){let z=U[A];if(!z||typeof z!=="object")continue;let N={};for(let[_,K]of Object.entries(z)){if(_.startsWith("_")||_==="id")continue;N[_]=String(K??"").length}if(Object.keys(N).length>0)Y.push(N)}q=!0},B=()=>q,V=(U)=>{let F={id:`${D2}${U}`,[v2]:!0,_index:U};if(Y.length===0)return F.label=Q.repeat(12),F;let A=Y[U%Y.length];for(let[z,N]of Object.entries(A))F[z]=Q.repeat(Math.max(1,N));return F};return{analyzeStructure:j,hasAnalyzedStructure:B,generate:V,generateRange:(U,F)=>{let A=[];for(let z=U;z<=F;z++)A.push(V(z));return A},clear:()=>{Y=[],q=!1}}},_2=(J)=>{if(!J||typeof J!=="object")return!1;return J[v2]===!0},p2=(J)=>{return J.filter((Q)=>!_2(Q))};var uJ=50,PJ=(J={})=>{let{adapter:Q,initialItems:$,initialTotal:Y,storage:q,placeholder:j,pageSize:B=uJ,onStateChange:V,onItemsLoaded:R,onItemsEvicted:W}=J,U=R2({...q,onEvict:(G,D)=>{W?.(G),u()}}),F=null,A=()=>{if(!F)F=P2(j);return F},z=new Map,N=!1,_,K=!0,M,y=[],v=0,P=new Map,u=()=>{V?.(i())},h=()=>{z.clear();let G=U.getLoadedRanges();for(let D of G)for(let p=D.start;p<=D.end;p++){let e=U.get(p);if(e&&!_2(e))z.set(e.id,p)}},l=(G,D)=>{if(!_2(D))z.set(D.id,G)},n=(G)=>{z.delete(G)},J2=(G,D)=>{return`${G}-${D}`},j2=()=>U.getTotal(),m=()=>U.getCachedCount(),I=()=>N,o=()=>K,i=()=>({total:U.getTotal(),cached:U.getCachedCount(),isLoading:N,pendingRanges:y,error:_,hasMore:K,cursor:M}),w=()=>U,E=()=>A(),Z=(G)=>{let D=U.get(G);if(D!==void 0)return D;if(G>=0&&G<U.getTotal())return A().generate(G);return},L=(G)=>{let D=z.get(G);if(D===void 0)return;return U.get(D)},T=(G)=>{return z.get(G)??-1},a=(G)=>{let D=U.get(G);return D!==void 0&&!_2(D)},r=(G,D)=>{let p=[],e=U.getTotal(),$2=0,s=0;U.touchChunksForRange(G,Math.min(D,e-1));for(let K2=G;K2<=D&&K2<e;K2++){let Y2=U.get(K2);if(Y2!==void 0)p.push(Y2),$2++;else p.push(A().generate(K2)),s++}return p},d=(G)=>{U.setTotal(G),K=U.getCachedCount()<G,u()},O=(G,D=0,p)=>{if(Q&&G.length>0){let e=A();if(!e.hasAnalyzedStructure())e.analyzeStructure(G)}for(let e=0;e<G.length;e++){let $2=G[e];if($2!==void 0){let s=D+e;U.set(s,$2),l(s,$2)}}if(p!==void 0)U.setTotal(p);else if(D+G.length>U.getTotal())U.setTotal(D+G.length);if(U.getCachedCount()>=U.getTotal()&&U.getTotal()>0)K=!1;u(),R?.(G,D,U.getTotal())},X=(G,D)=>{let p=U.get(G);if(!p)return!1;let e=p.id,$2={...p,...D};if(U.set(G,$2),D.id!==void 0&&D.id!==e)n(e);return l(G,$2),u(),!0},f=(G)=>{let D=z.get(G);if(D===void 0)return!1;if(!U.delete(D))return!1;return h(),P.clear(),u(),!0},x=async(G,D)=>{if(!Q)return;let p=J2(G,D);if(P.has(p))return;let e=U.getLoadedRanges(),$2=L2({start:G,end:D},e,U.chunkSize);if($2.length===0)return;let s=U.chunkSize,K2=[];for(let Q2 of $2){let q2=Math.floor(Q2.start/s),U2=Math.floor(Q2.end/s);for(let c=q2;c<=U2;c++){let X2=c*s,B2=X2+s-1,N2=J2(X2,B2);if(!K2.some((Z2)=>Z2.start===X2)&&!P.has(N2))K2.push({start:X2,end:B2})}}let Y2=[];for(let Q2 of $2){let q2=Math.floor(Q2.start/s),U2=Math.floor(Q2.end/s);for(let c=q2;c<=U2;c++){let X2=c*s,B2=X2+s-1,N2=J2(X2,B2);if(P.has(N2)){let Z2=P.get(N2);if(!Y2.includes(Z2))Y2.push(Z2)}}}for(let Q2 of K2){let q2=J2(Q2.start,Q2.end),U2=(async()=>{y.push(Q2),N=!0,_=void 0,u();try{let c=Q2.end-Q2.start+1,X2={offset:Q2.start,limit:c,cursor:void 0},B2=await Q.read(X2);if(O(B2.items,Q2.start,B2.total),B2.cursor)M=B2.cursor;let N2=Q2.start+B2.items.length;if(N2>=v){if(v=N2,B2.hasMore!==void 0)K=B2.hasMore;else if(B2.total!==void 0)K=N2<B2.total}}catch(c){_=c instanceof Error?c:Error(String(c))}finally{P.delete(q2),y=y.filter((c)=>c.start!==Q2.start||c.end!==Q2.end),N=P.size>0,u()}})();P.set(q2,U2),Y2.push(U2)}await Promise.all(Y2)},k=async(G,D)=>{if(U.isRangeLoaded(G,D))return;await x(G,D)},C=async()=>{if(!Q)return;await x(0,B-1)},t=async()=>{if(!Q||N||!K)return!1;let G=U.getCachedCount(),D=U.getTotal(),p=G,e=Math.min(p+B-1,D>0?D-1:p+B-1);if(p>=D&&D>0)return K=!1,!1;return await x(p,e),U.getCachedCount()>G},H=async()=>{if(U.clear(),U.setTotal(0),z.clear(),F)F.clear();P.clear(),y=[],N=!1,M=void 0,K=!0,v=0,_=void 0,u()},b=(G,D)=>{if(U.evictDistant(G,D)>0)h()},S=()=>{U.clear(),z.clear(),M=void 0,_=void 0,y=[],N=!1,u()},g=()=>{if(U.reset(),z.clear(),F)F.clear();M=void 0,K=!0,v=0,_=void 0,y=[],N=!1,u()};if($&&$.length>0)O($,0,Y??$.length);else if(Y!==void 0)U.setTotal(Y),u();return{getState:i,getTotal:j2,getCached:m,getIsLoading:I,getHasMore:o,getStorage:w,getPlaceholders:E,getItem:Z,getItemById:L,getIndexById:T,isItemLoaded:a,getItemsInRange:r,setTotal:d,setItems:O,updateItem:X,removeItem:f,loadRange:x,ensureRange:k,loadInitial:C,loadMore:t,reload:H,evictDistant:b,clear:S,reset:g}};var kJ=(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}},k2=(J,Q)=>{let $=performance.now(),Y=$-J.lastTime;if(Y===0)return J;if(Y>100){J.sampleCount=0,J.sampleIndex=0,J.velocity=0;let j=J.samples[0];return j.position=Q,j.time=$,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=Q,J.lastTime=$,J}let q=J.samples[J.sampleIndex];if(q.position=Q,q.time=$,J.sampleIndex=(J.sampleIndex+1)%8,J.sampleCount=Math.min(J.sampleCount+1,8),J.sampleCount>=2){let j=(J.sampleIndex-J.sampleCount+8)%8,B=J.samples[j],V=Q-B.position,R=$-B.time;J.velocity=R>0?V/R:0}return J.lastPosition=Q,J.lastTime=$,J},mJ=(J)=>J.sampleCount>=3,zJ=(J,Q={})=>{let{wheel:$=!0,sensitivity:Y=1,smoothing:q=!1,idleTimeout:j=150,onScroll:B,onIdle:V,scrollElement:R,horizontal:W=!1}=Q,U=!!R,F=0,A=0,z=U?W?window.innerWidth:window.innerHeight:W?J.clientWidth:J.clientHeight,N=Q.compressed??!1,_=Q.compression,K=kJ(),M=!1,y=null,P=z2(()=>{let k=W?J.scrollLeft:J.scrollTop,C=k>=F?"down":"up";if(K=k2(K,k),F=k,B)B({scrollTop:F,direction:C,velocity:K.velocity});j2()}),h=z2(()=>{let k=J.getBoundingClientRect(),C=W?Math.max(0,-k.left):Math.max(0,-k.top),t=C>=F?"down":"up";if(K=k2(K,C),F=C,!M)M=!0;if(B)B({scrollTop:F,direction:t,velocity:K.velocity});j2()}),l=(k)=>{k.preventDefault()},n=(k)=>{if(k.deltaX)return;k.preventDefault(),J.scrollLeft+=k.deltaY},J2=(k)=>{if(!N)return;k.preventDefault();let C=(W?k.deltaX||k.deltaY:k.deltaY)*Y,t=F+C;if(q)t=F+C*0.3;if(t=Math.max(0,Math.min(t,A)),t!==F){let b=t>=F?"down":"up";if(K=k2(K,t),F=t,!M)M=!0;if(B)B({scrollTop:F,direction:b,velocity:K.velocity});j2()}},j2=()=>{if(y)clearTimeout(y);y=setTimeout(()=>{if(M=!1,K=kJ(F),V)V()},j)},m=(k)=>{if(N)return;if(N=!0,_=k,A=k.virtualSize-z,U)return;if(P.cancel(),J.removeEventListener("scroll",P),!$)J.removeEventListener("wheel",l);else if(W)J.removeEventListener("wheel",n);if(W)J.style.overflowX="hidden";else J.style.overflow="hidden";if($)J.addEventListener("wheel",J2,{passive:!1});let C=W?J.scrollLeft:J.scrollTop;if(C>0){let t=W?_?.actualSize??J.scrollWidth:_?.actualSize??J.scrollHeight;F=C/t*A}if(W)J.scrollLeft=0;else J.scrollTop=0},I=()=>{if(!N)return;if(N=!1,U){_=void 0;return}if(J.removeEventListener("wheel",J2),W)J.style.overflowX="auto";else J.style.overflow="auto";if(J.addEventListener("scroll",P,{passive:!0}),!$)J.addEventListener("wheel",l,{passive:!1});else if(W)J.addEventListener("wheel",n,{passive:!1});if(_&&F>0){let C=F/A*(_.actualSize-z);if(W)J.scrollLeft=C;else J.scrollTop=C}_=void 0},o=()=>{if(U||N)return F;return W?J.scrollLeft:J.scrollTop},i=(k,C=!1)=>{let t=Math.max(0,Math.min(k,A||1/0));if(U){let H=J.getBoundingClientRect();if(W){let b=H.left+window.scrollX;window.scrollTo({left:b+t,behavior:C?"smooth":"auto"})}else{let b=H.top+window.scrollY;window.scrollTo({top:b+t,behavior:C?"smooth":"auto"})}}else if(N){if(t===F)return;let b=t>=F?"down":"up";if(K=k2(K,t),F=t,!M)M=!0;if(B)B({scrollTop:F,direction:b,velocity:K.velocity});j2()}else if(W)J.scrollTo({left:t,behavior:C?"smooth":"auto"});else J.scrollTo({top:t,behavior:C?"smooth":"auto"})},w=(k)=>{i(o()+k)},E=()=>{return o()<=0},Z=(k=0)=>{let C=o(),t=U||N?A:W?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;return C>=t-k},L=()=>{let k=o(),C=U||N?A:W?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;if(C<=0)return 0;return Math.min(1,Math.max(0,k/C))},T=(k)=>{if(k.compression)_=k.compression,A=_.virtualSize-z},a=()=>N,r=()=>Math.abs(K.velocity),d=()=>mJ(K),O=()=>M,X=()=>U,f=(k)=>{if(z=k,_)A=_.virtualSize-z},x=()=>{if(y)clearTimeout(y);if(U)h.cancel(),window.removeEventListener("scroll",h);else P.cancel(),J.removeEventListener("scroll",P),J.removeEventListener("wheel",J2),J.removeEventListener("wheel",l),J.removeEventListener("wheel",n)};if(U){if(N&&_)A=_.virtualSize-z;window.addEventListener("scroll",h,{passive:!0})}else if(N&&_){if(A=_.virtualSize-z,W)J.style.overflowX="hidden";else J.style.overflow="hidden";if($)J.addEventListener("wheel",J2,{passive:!1})}else{if(W)J.style.overflowX="auto",J.style.overflowY="hidden";else J.style.overflow="auto";if(J.addEventListener("scroll",P,{passive:!0}),!$)J.addEventListener("wheel",l,{passive:!1});else if(W)J.addEventListener("wheel",n,{passive:!1})}return{getScrollTop:o,scrollTo:i,scrollBy:w,isAtTop:E,isAtBottom:Z,getScrollPercentage:L,getVelocity:r,isTracking:d,isScrolling:O,updateConfig:T,enableCompression:m,disableCompression:I,isCompressed:a,isWindowMode:X,updateContainerHeight:f,destroy:x}},z2=(J)=>{let Q=null,$=null,Y=(...q)=>{if($=q,Q===null)Q=requestAnimationFrame(()=>{if(Q=null,$)J(...$)})};return Y.cancel=()=>{if(Q!==null)cancelAnimationFrame(Q),Q=null},Y};var wJ=(J,Q,$={},Y="vlist",q=!1)=>{let{autoHide:j=!0,autoHideDelay:B=1000,minThumbSize:V=30,showOnHover:R=!0,hoverZoneWidth:W=16,showOnViewportEnter:U=!0}=$,F=0,A=0,z=0,N=0,_=!1,K=!1,M=0,y=0,v=0,P=null,u=!1,h=null,l=null,n=q?"width":"height",J2=q?"translateX":"translateY",j2=q?(b)=>b.clientX:(b)=>b.clientY,m=q?"left":"top",I=document.createElement("div"),o=document.createElement("div"),i=R?document.createElement("div"):null,w=()=>{if(I.className=`${Y}-scrollbar`,o.className=`${Y}-scrollbar-thumb`,q)I.classList.add(`${Y}-scrollbar--horizontal`);if(I.appendChild(o),J.appendChild(I),i){if(i.className=`${Y}-scrollbar-hover`,q)i.classList.add(`${Y}-scrollbar-hover--horizontal`),i.style.height=`${W}px`;else i.style.width=`${W}px`;J.appendChild(i)}},E=()=>{if(P)clearTimeout(P),P=null},Z=()=>{if(!j)return;E(),P=setTimeout(T,B)},L=()=>{if(F<=A)return;if(E(),!u)I.classList.add(`${Y}-scrollbar--visible`),u=!0;if(j&&!_&&!K)Z()},T=()=>{if(_||K)return;I.classList.remove(`${Y}-scrollbar--visible`),u=!1},a=(b,S)=>{F=b,A=S;let g=F>A;if(I.style.display=g?"":"none",!g){T();return}let G=A/F;z=Math.max(V,G*A),o.style[n]=`${z}px`,N=A-z,r(v)},r=(b)=>{if(v=b,F<=A||N<=0)return;let S=F-A,G=Math.min(1,Math.max(0,b/S))*N;o.style.transform=`${J2}(${G}px)`},d=(b)=>{if(b.target===o)return;let S=I.getBoundingClientRect(),D=j2(b)-S[m]-z/2,e=Math.max(0,Math.min(D,N))/N,$2=F-A,s=e*$2;Q(s),L()},O=(b)=>{b.preventDefault(),b.stopPropagation(),_=!0,M=j2(b),y=v,E(),I.classList.add(`${Y}-scrollbar--dragging`),document.addEventListener("mousemove",X),document.addEventListener("mouseup",f)},X=(b)=>{if(!_)return;let S=j2(b)-M,g=N>0?S/N:0,G=F-A,D=g*G,p=Math.max(0,Math.min(y+D,G)),$2=p/G*N;if(o.style.transform=`${J2}(${$2}px)`,l=p,h===null)h=requestAnimationFrame(()=>{if(l!==null)Q(l);h=null})},f=()=>{if(_=!1,h!==null)cancelAnimationFrame(h),h=null;if(l!==null)Q(l),l=null;if(I.classList.remove(`${Y}-scrollbar--dragging`),j&&!K)Z();document.removeEventListener("mousemove",X),document.removeEventListener("mouseup",f)},x=()=>{if(U)L()},k=()=>{if(!_){if(K=!1,j)Z()}},C=()=>{K=!0,E(),L()},t=()=>{if(K=!1,!_&&j)Z()},H=()=>{if(E(),h!==null)cancelAnimationFrame(h),h=null;if(I.removeEventListener("click",d),I.removeEventListener("mouseenter",C),I.removeEventListener("mouseleave",t),o.removeEventListener("mousedown",O),J.removeEventListener("mouseenter",x),J.removeEventListener("mouseleave",k),document.removeEventListener("mousemove",X),document.removeEventListener("mouseup",f),i){if(i.removeEventListener("mouseenter",C),i.removeEventListener("mouseleave",t),i.parentNode)i.parentNode.removeChild(i)}if(I.parentNode)I.parentNode.removeChild(I)};if(w(),I.addEventListener("click",d),I.addEventListener("mouseenter",C),I.addEventListener("mouseleave",t),o.addEventListener("mousedown",O),J.addEventListener("mouseenter",x),J.addEventListener("mouseleave",k),i)i.addEventListener("mouseenter",C),i.addEventListener("mouseleave",t);return{show:L,hide:T,updateBounds:a,updatePosition:r,isVisible:()=>u,destroy:H}};var dJ=50,cJ=0.1;function rJ(J){let Q=0,$=0,Y=0;function q(){return Y>0?$/Y:0}function j(R){if(Q=R,R>cJ&&R<dJ)$+=R,Y++}function B(){let R=J.getTotal();if(R===0)return 0;let W=J.getItemSize();if(W<=0)return 0;let U=J.getContainerSize();if(U<=0)return 0;let F=J.getScrollPosition(),A=typeof J.getColumns==="function"?J.getColumns():1,N=Math.ceil(R/A)*W,K=Math.min(N,G2)-U,M=N-U,y=K>0?M/K:1,v=F*y,P=Math.ceil((v+U)/W);return Math.min(P*A,R)}function V(){let R=J.getTotal(),W=B();return{progress:R>0?Math.min(100,Math.max(0,W/R*100)):0,velocity:Q,velocityAvg:q(),itemCount:W,total:R}}return{getState:V,onVelocity:j}}export{o2 as toggleSelection,VJ as simpleVisibleRange,C2 as selectItems,n2 as selectAll,HJ as rangesEqual,z2 as rafThrottle,qJ as needsScaling,y2 as mergeRanges,t2 as isSelected,_2 as isPlaceholderItem,bJ as isInRange,b2 as isGroupHeader,JJ as getSelectedItems,e2 as getSelectedIds,F2 as getScaleState,KJ as getScaleInfo,F2 as getScale,TJ as getRangeCount,BJ as getMaxItemsWithoutScaling,p2 as filterPlaceholders,RJ as diffRanges,S2 as deselectItems,ZJ as createTableRenderer,XJ as createTableLayout,NJ as createTableHeader,c2 as createStickyHeader,rJ as createStats,R2 as createSparseStorage,E2 as createSizeCache,s2 as createSelectionState,wJ as createScrollbar,zJ as createScrollController,P2 as createPlaceholderManager,_J as createMeasuredSizeCache,DJ as createMasonryRenderer,GJ as createMasonryLayout,m2 as createGroupedSizeFn,d2 as createGroupLayout,UJ as createGridRenderer,r2 as createGridLayout,yJ as createEmitter,PJ as createAsyncManager,i2 as clearSelection,FJ as clampScrollPosition,OJ as calculateTotalSize,LJ as calculateScrollToIndex,QJ as calculateScaledVisibleRange,YJ as calculateScaledScrollToIndex,$J as calculateScaledRenderRange,M2 as calculateScaledItemPosition,WJ as calculateRenderRange,L2 as calculateMissingRanges,EJ as calculateItemOffset,jJ as calculateIndexFromScrollPosition,AJ as calculateActualSize,u2 as buildLayoutItems,G2 as MAX_VIRTUAL_SIZE};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * vlist - Rendering Domain
3
+ * Rendering, virtualization, and scaling for large datasets
4
+ */
5
+ export { createSizeCache, countVisibleItems, countItemsFittingFromBottom, getOffsetForVirtualIndex, type SizeCache, } from "./sizes";
6
+ export { createMeasuredSizeCache, type MeasuredSizeCache, } from "./measured";
7
+ export { sortRenderedDOM } from "./sort";
8
+ export { createRenderer, createDOMStructure, updateContentHeight, updateContentWidth, resolveContainer, getContainerDimensions, type Renderer, type DOMStructure, type CompressionContext, type CompressedPositionFn, type CompressionStateFn, } from "./renderer";
9
+ export { createViewportState, updateViewportState, updateViewportSize, updateViewportItems, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, getScrollDirection, rangesEqual, isInRange, getRangeCount, rangeToIndices, diffRanges, getSimpleCompressionState, simpleVisibleRange, simpleScrollToIndex, NO_COMPRESSION, type CompressionState, type VisibleRangeFn, type ScrollToIndexFn, } from "./viewport";
10
+ export { MAX_VIRTUAL_SIZE, getCompressionState, getCompressionState as getCompression, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, } from "./scale";
11
+ export { scrollToFocus, scrollToFocusSimple, } from "./scroll";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,52 @@
1
+ /**
2
+ * vlist - Measured Size Cache
3
+ * Auto-measurement support for items with unknown sizes (Mode B)
4
+ *
5
+ * Wraps the existing variable SizeCache with measurement tracking.
6
+ * Once an item is measured, it behaves identically to Mode A (known size).
7
+ * Unmeasured items use the estimated size as a fallback.
8
+ *
9
+ * Fully axis-neutral: works identically for vertical (estimatedHeight)
10
+ * and horizontal (estimatedWidth) orientations. This cache stores plain
11
+ * numbers representing the main-axis dimension — it never knows whether
12
+ * those numbers are heights or widths. The axis-specific translation
13
+ * happens in builder/core.ts at the DOM boundary.
14
+ *
15
+ * Implements the SizeCache interface so all downstream code
16
+ * (viewport, scale, features) works unchanged.
17
+ */
18
+ import type { SizeCache } from "./sizes";
19
+ /** Extended SizeCache with measurement tracking */
20
+ export interface MeasuredSizeCache extends SizeCache {
21
+ /** Record actual measured size for an item */
22
+ setMeasuredSize(index: number, size: number): void;
23
+ /** Check if an item has been measured */
24
+ isMeasured(index: number): boolean;
25
+ /** Get the estimated size (used for unmeasured items) */
26
+ getEstimatedSize(): number;
27
+ /** Number of items that have been measured */
28
+ measuredCount(): number;
29
+ }
30
+ /**
31
+ * Create a measured size cache for auto-measurement (Mode B)
32
+ *
33
+ * Works for both orientations:
34
+ * - Vertical: estimatedSize = estimatedHeight, measures block size
35
+ * - Horizontal: estimatedSize = estimatedWidth, measures inline size
36
+ *
37
+ * The cache itself is axis-neutral — it only stores numbers. The caller
38
+ * (builder/core.ts) is responsible for reading the correct axis from
39
+ * the config and from ResizeObserver entries (blockSize vs inlineSize).
40
+ *
41
+ * Internally maintains a Map of measured sizes keyed by item index.
42
+ * Unmeasured items fall back to the estimated size. The underlying
43
+ * prefix-sum array is rebuilt when measurements change.
44
+ *
45
+ * The size function fed into the variable SizeCache becomes:
46
+ * (index) => measuredSizes.has(index) ? measuredSizes.get(index) : estimatedSize
47
+ *
48
+ * This means all existing viewport, compression, and range calculations
49
+ * work unchanged — they only see a SizeCache with variable sizes.
50
+ */
51
+ export declare const createMeasuredSizeCache: (estimatedSize: number, initialTotal: number) => MeasuredSizeCache;
52
+ //# sourceMappingURL=measured.d.ts.map
@@ -0,0 +1,111 @@
1
+ /**
2
+ * vlist - DOM Rendering
3
+ * Efficient DOM rendering with element pooling
4
+ * Supports compression for large lists (1M+ items)
5
+ */
6
+ import type { VListItem, ItemTemplate, Range } from "../types";
7
+ import type { CompressionState } from "./viewport";
8
+ import type { SizeCache } from "./sizes";
9
+ /**
10
+ * Optional compression position calculator.
11
+ * Injected by the monolithic factory or the withCompression feature.
12
+ * When not provided, the renderer uses simple sizeCache offsets.
13
+ */
14
+ export type CompressedPositionFn = (index: number, scrollTop: number, sizeCache: SizeCache, totalItems: number, containerHeight: number, compression: CompressionState, rangeStart?: number) => number;
15
+ /**
16
+ * Optional compression state getter.
17
+ * Injected by the monolithic factory or the withCompression feature.
18
+ * When not provided, the renderer assumes no compression.
19
+ */
20
+ export type CompressionStateFn = (totalItems: number, sizeCache: SizeCache) => CompressionState;
21
+ /** Element pool for recycling DOM elements */
22
+ export interface ElementPool {
23
+ /** Get an element from the pool (or create new) */
24
+ acquire: () => HTMLElement;
25
+ /** Return an element to the pool */
26
+ release: (element: HTMLElement) => void;
27
+ /** Clear the pool */
28
+ clear: () => void;
29
+ /** Get pool statistics */
30
+ stats: () => {
31
+ poolSize: number;
32
+ created: number;
33
+ reused: number;
34
+ };
35
+ }
36
+ /** Compression context for positioning */
37
+ export interface CompressionContext {
38
+ scrollPosition: number;
39
+ totalItems: number;
40
+ containerSize: number;
41
+ rangeStart: number;
42
+ /** Pre-computed compression state (includes force flag) */
43
+ compression?: CompressionState;
44
+ }
45
+ /** DOM structure created by createDOMStructure */
46
+ export interface DOMStructure {
47
+ root: HTMLElement;
48
+ viewport: HTMLElement;
49
+ content: HTMLElement;
50
+ items: HTMLElement;
51
+ }
52
+ /** Renderer instance */
53
+ export interface Renderer<T extends VListItem = VListItem> {
54
+ /** Render items for a range */
55
+ render: (items: T[], range: Range, selectedIds: Set<string | number>, focusedIndex: number, compressionCtx?: CompressionContext) => void;
56
+ /** Update item positions (for compressed scrolling) */
57
+ updatePositions: (compressionCtx: CompressionContext) => void;
58
+ /** Update a single item */
59
+ updateItem: (index: number, item: T, isSelected: boolean, isFocused: boolean) => void;
60
+ /** Update only CSS classes on a rendered item (no template re-evaluation) */
61
+ updateItemClasses: (index: number, isSelected: boolean, isFocused: boolean) => void;
62
+ /** Get rendered item element by index */
63
+ getElement: (index: number) => HTMLElement | undefined;
64
+ /**
65
+ * Reorder DOM children to match logical item order (by data-index).
66
+ * Called on scroll idle so screen readers encounter items in the correct
67
+ * sequence. Items are position:absolute so visual layout is unaffected.
68
+ */
69
+ sortDOM: () => void;
70
+ /** Clear all rendered items */
71
+ clear: () => void;
72
+ /** Destroy renderer and cleanup */
73
+ destroy: () => void;
74
+ }
75
+ /**
76
+ * Create an element pool for recycling DOM elements
77
+ * Reduces garbage collection and improves performance
78
+ */
79
+ export declare const createElementPool: (tagName?: string, maxSize?: number) => ElementPool;
80
+ /**
81
+ * Create a renderer for managing DOM elements
82
+ * Supports compression for large lists
83
+ */
84
+ export declare const createRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, sizeCache: SizeCache, classPrefix: string, totalItemsGetter?: () => number, ariaIdPrefix?: string, horizontal?: boolean, crossAxisSize?: number, compressionFns?: {
85
+ getState: CompressionStateFn;
86
+ getPosition: CompressedPositionFn;
87
+ }, striped?: boolean | "data" | "even" | "odd", stripeIndexFn?: () => (index: number) => number) => Renderer<T>;
88
+ /**
89
+ * Create the vlist DOM structure
90
+ */
91
+ export declare const createDOMStructure: (container: HTMLElement, classPrefix: string, ariaLabel?: string, horizontal?: boolean, interactive?: boolean) => DOMStructure;
92
+ /**
93
+ * Update content height for virtual scrolling
94
+ */
95
+ export declare const updateContentHeight: (content: HTMLElement, totalHeight: number) => void;
96
+ /**
97
+ * Update content width for horizontal virtual scrolling
98
+ */
99
+ export declare const updateContentWidth: (content: HTMLElement, totalWidth: number) => void;
100
+ /**
101
+ * Get container dimensions
102
+ */
103
+ export declare const getContainerDimensions: (viewport: HTMLElement) => {
104
+ width: number;
105
+ height: number;
106
+ };
107
+ /**
108
+ * Resolve container from selector or element
109
+ */
110
+ export declare const resolveContainer: (container: HTMLElement | string) => HTMLElement;
111
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * vlist - Compression Module
3
+ * Pure functions for handling large lists that exceed browser size limits
4
+ *
5
+ * When a list's total size (sum of all item sizes) exceeds the browser's
6
+ * maximum element size (~16.7M pixels), we "compress" the virtual scroll space.
7
+ *
8
+ * Key concepts:
9
+ * - actualSize: The true size if all items were rendered
10
+ * - virtualSize: The capped size used for the scroll container (≤ MAX_VIRTUAL_SIZE)
11
+ * - compressionRatio: virtualSize / actualSize (1 = no compression, <1 = compressed)
12
+ *
13
+ * When compressed:
14
+ * - Scroll position maps to item index via ratio, not pixel math
15
+ * - Item positions are calculated relative to a "virtual index" at current scroll
16
+ * - Near-bottom interpolation ensures the last items are reachable
17
+ */
18
+ import type { Range } from "../types";
19
+ import { MAX_VIRTUAL_SIZE } from "../constants";
20
+ import type { SizeCache } from "./sizes";
21
+ export { MAX_VIRTUAL_SIZE };
22
+ /** Compression calculation result */
23
+ export interface CompressionState {
24
+ /** Whether compression is active */
25
+ isCompressed: boolean;
26
+ /** The actual total size (uncompressed) */
27
+ actualSize: number;
28
+ /** The virtual size (capped at MAX_VIRTUAL_SIZE) */
29
+ virtualSize: number;
30
+ /** Compression ratio (1 = no compression, <1 = compressed) */
31
+ ratio: number;
32
+ }
33
+ /**
34
+ * Calculate compression state for a list
35
+ * Pure function - no side effects
36
+ *
37
+ * @param _totalItems - Total number of items
38
+ * @param sizeCache - Size cache for item sizes/offsets
39
+ * @param force - When true, enables compressed mode even if total size is under the limit.
40
+ * Useful for testing, consistent UX, or preemptively enabling compression
41
+ * before the list grows past the browser limit.
42
+ */
43
+ export declare const getCompressionState: (_totalItems: number, sizeCache: SizeCache, force?: boolean) => CompressionState;
44
+ /**
45
+ * Calculate visible range with compression support
46
+ * Pure function - no side effects
47
+ *
48
+ * @param scrollTop - Current scroll position
49
+ * @param containerHeight - Viewport container height
50
+ * @param sizeCache - Size cache for item sizes/offsets
51
+ * @param totalItems - Total number of items
52
+ * @param compression - Compression state
53
+ * @param out - Output range to mutate (avoids allocation on hot path)
54
+ */
55
+ export declare const calculateCompressedVisibleRange: (scrollPosition: number, containerHeight: number, sizeCache: SizeCache, totalItems: number, compression: CompressionState, out: Range) => Range;
56
+ /**
57
+ * Calculate render range with compression support (adds overscan)
58
+ * Pure function - no side effects
59
+ *
60
+ * @param out - Output range to mutate (avoids allocation on hot path)
61
+ */
62
+ export declare const calculateCompressedRenderRange: (visibleRange: Range, overscan: number, totalItems: number, out: Range) => Range;
63
+ /**
64
+ * Calculate item position (translateY) with compression support
65
+ * Pure function - no side effects
66
+ *
67
+ * In compressed mode (manual wheel scrolling, overflow: hidden), items are
68
+ * positioned RELATIVE TO THE VIEWPORT. The scroll container doesn't actually
69
+ * scroll - we intercept wheel events and manually position items.
70
+ *
71
+ * Key insight:
72
+ * - Calculate a "virtual scroll index" from the scroll ratio
73
+ * - Items are positioned relative to this virtual index using actual heights
74
+ * - Each item keeps its full height for proper rendering
75
+ *
76
+ * @param index - Item index
77
+ * @param scrollTop - Current (virtual) scroll position
78
+ * @param sizeCache - Size cache for item sizes/offsets
79
+ * @param totalItems - Total number of items
80
+ * @param containerHeight - Viewport container height
81
+ * @param compression - Compression state
82
+ */
83
+ export declare const calculateCompressedItemPosition: (index: number, scrollPosition: number, sizeCache: SizeCache, totalItems: number, _containerHeight: number, compression: CompressionState, _rangeStart?: number) => number;
84
+ /**
85
+ * Calculate scroll position to bring an index into view (with compression)
86
+ * Pure function - no side effects
87
+ *
88
+ * @param index - Target item index
89
+ * @param sizeCache - Size cache for item sizes/offsets
90
+ * @param containerHeight - Viewport container height
91
+ * @param totalItems - Total number of items
92
+ * @param compression - Compression state
93
+ * @param align - Alignment within viewport
94
+ */
95
+ export declare const calculateCompressedScrollToIndex: (index: number, sizeCache: SizeCache, containerHeight: number, totalItems: number, compression: CompressionState, align?: "start" | "center" | "end") => number;
96
+ /**
97
+ * Calculate the approximate item index at a given scroll position
98
+ * Useful for debugging and scroll position restoration
99
+ * Pure function - no side effects
100
+ */
101
+ export declare const calculateIndexFromScrollPosition: (scrollPosition: number, sizeCache: SizeCache, totalItems: number, compression: CompressionState) => number;
102
+ /**
103
+ * Check if compression is needed for a list configuration
104
+ * Pure function - no side effects
105
+ *
106
+ * Note: This overload accepts a HeightCache for variable heights.
107
+ * For simple fixed-height checks, use needsCompressionFixed().
108
+ */
109
+ export declare const needsCompression: (totalItems: number, heightOrCache: number | SizeCache) => boolean;
110
+ /**
111
+ * Calculate maximum items supported without compression
112
+ * Only meaningful for fixed-height items
113
+ * Pure function - no side effects
114
+ */
115
+ export declare const getMaxItemsWithoutCompression: (itemSize: number) => number;
116
+ /**
117
+ * Get human-readable compression info for debugging
118
+ * Pure function - no side effects
119
+ */
120
+ export declare const getCompressionInfo: (totalItems: number, sizeCache: SizeCache, force?: boolean) => string;
121
+ //# sourceMappingURL=scale.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * vlist - Smart Edge Scroll
3
+ * Shared scroll utility used by both core baseline and withSelection feature.
4
+ * Only scrolls when the target item is outside the viewport; aligns to nearest edge.
5
+ *
6
+ * Split into two functions for tree-shaking:
7
+ * - scrollToFocusSimple: normal mode only (used by base builder)
8
+ * - scrollToFocus: handles both normal and compressed modes (used by features)
9
+ */
10
+ import type { SizeCache } from "./sizes";
11
+ import type { CompressionState } from "./scale";
12
+ import type { Range } from "../types";
13
+ /**
14
+ * Simple scroll-to-focus: normal (non-compressed) mode only.
15
+ * Padding-aware: accounts for CSS padding on the content element.
16
+ */
17
+ export declare const scrollToFocusSimple: (index: number, sizeCache: SizeCache, scrollPosition: number, containerSize: number, startPadding?: number, endPadding?: number) => number;
18
+ /**
19
+ * Full scroll-to-focus: handles both normal and compressed (withScale) modes.
20
+ * Used by withSelection feature which must work with compression.
21
+ */
22
+ export declare const scrollToFocus: (index: number, sizeCache: SizeCache, scrollPosition: number, containerSize: number, startPadding?: number, endPadding?: number, compression?: CompressionState | null, totalItems?: number, visibleRange?: Range | null) => number;
23
+ //# sourceMappingURL=scroll.d.ts.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * vlist - Size Cache
3
+ * Efficient size management for fixed and variable item sizes
4
+ *
5
+ * Provides two implementations:
6
+ * - Fixed: O(1) operations using multiplication (zero overhead, matches existing behavior)
7
+ * - Variable: O(1) offset lookup via prefix sums, O(log n) binary search for index-at-offset
8
+ *
9
+ * The SizeCache abstraction allows all virtual scrolling and compression code
10
+ * to work identically with both fixed and variable sizes, for both vertical and horizontal scrolling.
11
+ */
12
+ /** Size cache for efficient offset/index lookups (works for both vertical and horizontal) */
13
+ export interface SizeCache {
14
+ /** Get offset (position along main axis) for an item index — O(1) */
15
+ getOffset(index: number): number;
16
+ /** Get size of a specific item (height for vertical, width for horizontal) */
17
+ getSize(index: number): number;
18
+ /** Find item index at a scroll offset — O(1) fixed, O(log n) variable */
19
+ indexAtOffset(offset: number): number;
20
+ /** Total content size (total height for vertical, total width for horizontal) */
21
+ getTotalSize(): number;
22
+ /** Current total item count */
23
+ getTotal(): number;
24
+ /** Rebuild cache (call when items change) */
25
+ rebuild(totalItems: number): void;
26
+ /** Whether sizes are variable (false = fixed fast path) */
27
+ isVariable(): boolean;
28
+ }
29
+ /**
30
+ * Create a size cache — returns fixed or variable implementation
31
+ *
32
+ * When size is a number, returns a zero-overhead fixed implementation.
33
+ * When size is a function, builds a prefix-sum array for efficient lookups.
34
+ */
35
+ export declare const createSizeCache: (size: number | ((index: number) => number), initialTotal: number) => SizeCache;
36
+ /**
37
+ * Count how many items fit in a given container size starting from startIndex
38
+ * Used for compressed mode visible range calculations
39
+ *
40
+ * For fixed sizes: O(1) via division
41
+ * For variable sizes: O(k) where k = visible item count (typically 10-50)
42
+ */
43
+ export declare const countVisibleItems: (sizeCache: SizeCache, startIndex: number, containerSize: number, totalItems: number) => number;
44
+ /**
45
+ * Count how many items fit starting from the bottom of the list
46
+ * Used for near-bottom interpolation in compressed mode
47
+ *
48
+ * For fixed sizes: O(1) via division
49
+ * For variable sizes: O(k) where k = items fitting (typically 10-50)
50
+ */
51
+ export declare const countItemsFittingFromBottom: (sizeCache: SizeCache, containerSize: number, totalItems: number) => number;
52
+ /**
53
+ * Calculate the pixel offset for a fractional virtual scroll index
54
+ *
55
+ * In compressed mode, the scroll position maps to a fractional item index
56
+ * (e.g., 5.3 means 30% into item 5). This function calculates the actual
57
+ * pixel offset for such a fractional position using variable sizes.
58
+ *
59
+ * For fixed sizes this reduces to: virtualIndex * itemSize
60
+ * For variable sizes: offset(floor) + frac * size(floor)
61
+ */
62
+ export declare const getOffsetForVirtualIndex: (sizeCache: SizeCache, virtualIndex: number, totalItems: number) => number;
63
+ //# sourceMappingURL=sizes.d.ts.map
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared DOM sort utility for accessibility.
3
+ *
4
+ * Virtual list renderers append new elements at the end of the container
5
+ * for performance (batched DocumentFragment insertion). After scrolling,
6
+ * DOM order diverges from logical item order. Screen readers traverse
7
+ * DOM order, so items are encountered in a nonsensical sequence.
8
+ *
9
+ * This utility reorders DOM children to match logical index order.
10
+ * Called on scroll idle — zero cost during scroll, single lightweight
11
+ * reflow when idle (items are position:absolute, no geometry change).
12
+ *
13
+ * **Minimal-move approach**: walks sorted elements and current DOM children
14
+ * in parallel. Elements already at the correct position are never touched
15
+ * — preserving browser :hover state and avoiding CSS transition replays
16
+ * on elements under the cursor.
17
+ *
18
+ * Used by: core renderer, grid renderer, masonry renderer, and core.ts
19
+ * inlined render path.
20
+ */
21
+ /**
22
+ * Reorder DOM children so they follow logical data-index order.
23
+ *
24
+ * Only elements that are out of position are moved via `insertBefore`.
25
+ * Elements already in the correct spot are skipped entirely (no DOM
26
+ * mutation), which preserves :hover state and CSS transitions.
27
+ *
28
+ * @param container - The DOM element that holds rendered items
29
+ * @param keys - The rendered Map's keys (item indices)
30
+ * @param getElement - Lookup function: index → HTMLElement | undefined
31
+ */
32
+ export declare const sortRenderedDOM: (container: HTMLElement, keys: IterableIterator<number>, getElement: (index: number) => HTMLElement | undefined) => void;
33
+ //# sourceMappingURL=sort.d.ts.map