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.
- package/LICENSE +21 -0
- package/README.md +558 -0
- package/dist/builder/a11y.d.ts +16 -0
- package/dist/builder/api.d.ts +21 -0
- package/dist/builder/context.d.ts +36 -0
- package/dist/builder/core.d.ts +16 -0
- package/dist/builder/data.d.ts +69 -0
- package/dist/builder/dom.d.ts +15 -0
- package/dist/builder/index.d.ts +25 -0
- package/dist/builder/materialize.d.ts +165 -0
- package/dist/builder/pool.d.ts +10 -0
- package/dist/builder/range.d.ts +10 -0
- package/dist/builder/scroll.d.ts +24 -0
- package/dist/builder/types.d.ts +464 -0
- package/dist/builder/velocity.d.ts +23 -0
- package/dist/constants.d.ts +58 -0
- package/dist/events/emitter.d.ts +18 -0
- package/dist/events/index.d.ts +6 -0
- package/dist/features/async/feature.d.ts +72 -0
- package/dist/features/async/index.d.ts +9 -0
- package/dist/features/async/manager.d.ts +103 -0
- package/dist/features/async/placeholder.d.ts +54 -0
- package/dist/features/async/sparse.d.ts +91 -0
- package/dist/features/autosize/feature.d.ts +34 -0
- package/dist/features/autosize/index.d.ts +2 -0
- package/dist/features/grid/feature.d.ts +48 -0
- package/dist/features/grid/index.d.ts +9 -0
- package/dist/features/grid/layout.d.ts +29 -0
- package/dist/features/grid/renderer.d.ts +71 -0
- package/dist/features/grid/types.d.ts +71 -0
- package/dist/features/groups/feature.d.ts +74 -0
- package/dist/features/groups/index.d.ts +10 -0
- package/dist/features/groups/layout.d.ts +47 -0
- package/dist/features/groups/sticky.d.ts +21 -0
- package/dist/features/groups/types.d.ts +86 -0
- package/dist/features/masonry/feature.d.ts +45 -0
- package/dist/features/masonry/index.d.ts +9 -0
- package/dist/features/masonry/layout.d.ts +29 -0
- package/dist/features/masonry/renderer.d.ts +55 -0
- package/dist/features/masonry/types.d.ts +68 -0
- package/dist/features/page/feature.d.ts +53 -0
- package/dist/features/page/index.d.ts +8 -0
- package/dist/features/scale/feature.d.ts +42 -0
- package/dist/features/scale/index.d.ts +10 -0
- package/dist/features/scrollbar/controller.d.ts +121 -0
- package/dist/features/scrollbar/feature.d.ts +60 -0
- package/dist/features/scrollbar/index.d.ts +8 -0
- package/dist/features/scrollbar/scrollbar.d.ts +73 -0
- package/dist/features/selection/feature.d.ts +75 -0
- package/dist/features/selection/index.d.ts +7 -0
- package/dist/features/selection/state.d.ts +115 -0
- package/dist/features/snapshots/feature.d.ts +79 -0
- package/dist/features/snapshots/index.d.ts +9 -0
- package/dist/features/table/feature.d.ts +67 -0
- package/dist/features/table/header.d.ts +49 -0
- package/dist/features/table/index.d.ts +10 -0
- package/dist/features/table/layout.d.ts +26 -0
- package/dist/features/table/renderer.d.ts +72 -0
- package/dist/features/table/types.d.ts +239 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +1 -0
- package/dist/internals.d.ts +21 -0
- package/dist/internals.js +1 -0
- package/dist/rendering/index.d.ts +12 -0
- package/dist/rendering/measured.d.ts +52 -0
- package/dist/rendering/renderer.d.ts +111 -0
- package/dist/rendering/scale.d.ts +121 -0
- package/dist/rendering/scroll.d.ts +23 -0
- package/dist/rendering/sizes.d.ts +63 -0
- package/dist/rendering/sort.d.ts +33 -0
- package/dist/rendering/viewport.d.ts +139 -0
- package/dist/size.json +1 -0
- package/dist/types.d.ts +487 -0
- package/dist/utils/padding.d.ts +38 -0
- package/dist/utils/stats.d.ts +49 -0
- package/dist/vlist-extras.css +1 -0
- package/dist/vlist-grid.css +1 -0
- package/dist/vlist-masonry.css +1 -0
- package/dist/vlist-table.css +1 -0
- package/dist/vlist.css +1 -0
- package/package.json +66 -14
- package/README.MD +0 -80
- package/index.d.ts +0 -3
- package/index.js +0 -188
- package/virtual-scroll.component.d.ts +0 -37
- package/vlist.d.ts +0 -4
- package/vlist.metadata.json +0 -1
- 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
|