@floor/vlist 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder/index.js +259 -1
- package/dist/compression/index.js +116 -1
- package/dist/core/index.js +137 -1
- package/dist/core-light.js +72 -1
- package/dist/data/index.js +233 -1
- package/dist/grid/index.js +203 -1
- package/dist/groups/index.js +210 -1
- package/dist/index.js +1165 -1
- package/dist/react/index.js +1057 -1
- package/dist/scroll/index.js +121 -1
- package/dist/selection/index.js +104 -1
- package/dist/snapshots/index.js +21 -1
- package/dist/svelte/index.js +1045 -1
- package/dist/vue/index.js +1051 -1
- package/dist/window/index.js +18 -1
- package/package.json +2 -1
package/dist/groups/index.js
CHANGED
|
@@ -1 +1,210 @@
|
|
|
1
|
-
var{defineProperty:a,getOwnPropertyNames:Pj,getOwnPropertyDescriptor:Oj}=Object,Gj=Object.prototype.hasOwnProperty;var Zj=new WeakMap,Lj=(Q)=>{var Z=Zj.get(Q),j;if(Z)return Z;if(Z=a({},"__esModule",{value:!0}),Q&&typeof Q==="object"||typeof Q==="function")Pj(Q).map((J)=>!Gj.call(Z,J)&&a(Z,J,{get:()=>Q[J],enumerable:!(j=Oj(Q,J))||j.enumerable}));return Zj.set(Q,Z),Z};var wj=(Q,Z)=>{for(var j in Z)a(Q,j,{get:Z[j],enumerable:!0,configurable:!0,set:(J)=>Z[j]=()=>J})};var $j=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);var d=(Q)=>{return Q!==null&&typeof Q==="object"&&Q.__groupHeader===!0};var Xj=(Q,Z,j)=>{if(j===0)return 0;if(!Q.isVariable())return Math.floor(Z/Q.getHeight(0));let J=0,$=0;for(let q=j-1;q>=0;q--){let X=Q.getHeight(q);if($+X>Z)break;$+=X,J++}return Math.max(J,1)},t=(Q,Z,j)=>{if(j===0)return 0;let J=Math.floor(Z),$=Z-J,q=Math.max(0,Math.min(J,j-1));return Q.getOffset(q)+$*Q.getHeight(q)};var jj=16000000;var Wj=(Q,Z)=>{let j=Z.getTotalHeight(),J=j>jj,$=J?jj:j,q=j>0?$/j:1;return{isCompressed:J,actualHeight:j,virtualHeight:$,ratio:q}},Mj=(Q,Z,j,J,$,q,X)=>{if(!q.isCompressed||J===0)return j.getOffset(Q);let{virtualHeight:M}=q,B=M-$,D=B-Z;if(D<=$&&D>=-1){if(Z>=B-1){let R=j.getTotalHeight()-j.getOffset(Q);return $-R}let Y=Xj(j,$,J),_=Math.max(0,J-Y),z=Z/M*J,P=Math.max(0,Math.min(1,1-D/$)),L=j.getOffset(Q)-j.getOffset(_),F=j.getOffset(Q)-t(j,z,J);return F+(L-F)*P}let G=Z/M*J;return j.getOffset(Q)-t(j,G,J)};var Dj=()=>{};var Uj={};wj(Uj,{createGridRenderer:()=>bj});var Fj=(Q=200)=>{let Z=[];return{acquire:()=>{let q=Z.pop();if(q)return q;let X=document.createElement("div");return X.setAttribute("role","option"),X},release:(q)=>{if(Z.length<Q)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),Z.push(q)},clear:()=>{Z.length=0}}},bj=(Q,Z,j,J,$,q,X,M)=>{let B=Fj(),D=new Map,b=q,G=!1,Y=null,_=0,E="",z=(N)=>{if(Y&&_===N)return Y;return Y=Wj(N,j),_=N,Y},P={selected:!1,focused:!1},L=(N,K)=>{return P.selected=N,P.focused=K,P},F=`${$}-item ${$}-grid-item`,R=`${$}-item--selected`,H=`${$}-item--focused`,v=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},W=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},w=(N,K)=>{let U=J.getRow(N);if(K){let O=K.totalItems,A=z(O);if(A.isCompressed)return Mj(U,K.scrollTop,j,O,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},S=(N,K,U)=>{let O=N.dataset.id?.startsWith("__group_header"),A=O?0:J.getCol(K),V=O?0:J.getColumnOffset(A,b),y;if(G){let p=J.getRow(K),k=0,C=new Set;for(let f=0;f<K;f++){let x=J.getRow(f);if(x<p&&!C.has(x)){let h=j.getHeight(f);k+=h,C.add(x)}}y=k}else y=w(K,U);N.style.transform=`translate(${Math.round(V)}px, ${Math.round(y)}px)`},I=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),O=U?b:J.getColumnWidth(b),A;if(G||U)A=j.getHeight(K)-J.gap;else{let V=J.getRow(K);A=j.getHeight(V)-J.gap}N.style.width=`${O}px`,N.style.height=`${A}px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);if(V.className=F,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(J.getRow(N)),V.dataset.col=String(J.getCol(N)),V.ariaSelected=String(U),M)V.id=`${M}-item-${N}`;if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));I(V,N);let p=Z(K,N,y);return v(V,p),W(V,U,O),S(V,N,A),V},s=(N,K,U,O,A)=>{if(K.start===0&&N.length>0)G=d(N[0]);for(let[k,C]of D)if(k<K.start||k>K.end)C.element.remove(),B.release(C.element),D.delete(k);let V=!1;if(X){let k=String(X());V=k!==E,E=k}let y=document.createDocumentFragment(),p=[];for(let k=K.start;k<=K.end;k++){let C=k-K.start,f=N[C];if(!f){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${K.start}-${K.end}, items.length: ${N.length})`);continue}let x=U.has(f.id),h=k===O,T=D.get(k);if(T){let c=T.element.dataset.id,Qj=String(f.id);if(c!==Qj){let Vj=L(x,h),Aj=Z(f,k,Vj);v(T.element,Aj),T.element.dataset.id=Qj,T.element.dataset.row=String(J.getRow(k)),T.element.dataset.col=String(J.getCol(k)),I(T.element,k)}if(W(T.element,x,h),T.element.ariaSelected=String(x),S(T.element,k,A),V)T.element.setAttribute("aria-setsize",E)}else{let c=u(k,f,x,h,A);y.appendChild(c),p.push({index:k,element:c})}}if(p.length>0){Q.appendChild(y);for(let{index:k,element:C}of p)D.set(k,{index:k,element:C})}},g=(N)=>{for(let[K,U]of D)S(U.element,K,N)},zj=(N,K,U,O)=>{let A=D.get(N);if(A){let V=L(U,O),y=Z(K,N,V);v(A.element,y),W(A.element,U,O),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),I(A.element,N)}},Bj=(N,K,U)=>{let O=D.get(N);if(O)W(O.element,K,U)},_j=(N)=>{return D.get(N)?.element},Ej=(N)=>{if(Math.abs(N-b)<1)return;b=N;for(let[K,U]of D)I(U.element,K),S(U.element,K)},Jj=()=>{for(let[,N]of D)N.element.remove(),B.release(N.element);D.clear()};return{render:s,updatePositions:g,updateItem:zj,updateItemClasses:Bj,getElement:_j,updateContainerWidth:Ej,clear:Jj,destroy:()=>{Jj(),B.clear()}}};var kj=$j(()=>{Dj()});var n=(Q,Z)=>{let j=0,J=Q.length-1;while(j<J){let $=j+J+1>>>1;if(Q[$].headerLayoutIndex<=Z)j=$;else J=$-1}return j},Nj=(Q,Z)=>{let j=0,J=Q.length-1;while(j<J){let $=j+J+1>>>1;if(Q[$].firstDataIndex<=Z)j=$;else J=$-1}return j},Kj=(Q,Z)=>{if(Q===0)return[];let j=[],J=Z(0),$=0,q=0;for(let X=1;X<Q;X++){let M=Z(X);if(M!==J){let B=X-$;j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:B}),q=q+1+B,J=M,$=X}}return j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:Q-$}),j},l=(Q,Z)=>{if(Q.length===0||Z.length===0)return[];let j=Q.length+Z.length,J=Array(j),$=0;for(let q of Z){J[$]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},$++;for(let X=0;X<q.count;X++)J[$]=Q[q.firstDataIndex+X],$++}return J},r=(Q,Z)=>{let j=typeof Z==="number"?(J)=>Z:Z;return(J)=>{let $=Q.getEntry(J);if($.type==="header")return Q.getHeaderHeight($.group.groupIndex);return j($.dataIndex)}},o=(Q,Z)=>{let j=Kj(Q,Z.getGroupForIndex),J=Q+j.length,$=Z.headerHeight;return{get totalEntries(){return J},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let _=n(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return{type:"header",group:E};let z=Y-E.headerLayoutIndex-1;return{type:"item",dataIndex:E.firstDataIndex+z,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let _=n(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return-1;let z=Y-E.headerLayoutIndex-1;return E.firstDataIndex+z},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let _=Nj(j,Y),E=j[_],z=Y-E.firstDataIndex;return E.headerLayoutIndex+1+z},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=n(j,Y);return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=Nj(j,Y);return j[_]},getHeaderHeight:typeof $==="number"?(Y)=>$:(Y)=>{let _=j[Y];if(!_)return 0;return $(_.key,Y)},rebuild:(Y)=>{j=Kj(Y,Z.getGroupForIndex),J=Y+j.length}}};var i=(Q,Z,j,J,$)=>{let q=document.createElement("div");q.className=`${$}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",Q.insertBefore(q,Q.firstChild);let X=-1,M=!1,B=0,D=(z)=>{if(z===X)return;X=z;let P=Z.groups;if(z<0||z>=P.length){q.textContent="";return}let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);if(q.style.height=`${R}px`,typeof F==="string")q.innerHTML=F;else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;if(P.length===0){Y();return}let L=0;for(let W=P.length-1;W>=0;W--)if(j.getOffset(P[W].headerLayoutIndex)<=z){L=W;break}let F=j.getOffset(P[0].headerLayoutIndex);if(z<F){Y();return}if(!M)G();D(L);let R=Z.getHeaderHeight(L),H=0,v=L+1;if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;if(w<R)H=w-R}if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},G=()=>{if(M)return;M=!0,q.style.display=""},Y=()=>{if(!M)return;M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:b,refresh:_,show:G,hide:Y,destroy:E}};var Yj=(Q,Z,j,J,$,q)=>{if(J===0)return 0;let X=Math.max(0,Math.min(Q,J-1)),M=Z.getOffset(X),B=Z.getHeight(X),D=Z.getTotalHeight(),b=Math.max(0,D-j),G;switch(q){case"center":G=M-j/2+B/2;break;case"end":G=M-j+B;break;case"start":default:G=M;break}return Math.max(0,Math.min(G,b))};var e=(Q,Z,j,J,$="start",q,X=Yj)=>{return X(Q,Z,j,J,q,$)};var Rj=(Q)=>{if(!Q.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(Q.headerHeight==null||Q.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!Q.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let Z=null,j=null,J=[],$=[];return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:B}=q,{classPrefix:D}=M;if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");if(M.reverse)throw Error("[vlist/builder] withGroups cannot be used with reverse: true");let G=B.item.height;J=B.items?[...B.items]:[];let Y=J.length,_={getGroupForIndex:Q.getGroupForIndex,headerHeight:Q.headerHeight,headerTemplate:Q.headerTemplate,sticky:Q.sticky??!1};Z=o(Y,_),$=l(J,Z.groups);let E=r(Z,G);q.setHeightConfig(E),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length);let z=B.item.template,{headerTemplate:P}=Q,L=(W,w,S)=>{if(d(W))return P(W.groupKey,W.groupIndex);return z(W,w,S)},F=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(F&&R){if(H)H((I)=>{let u=$[I];return!!(u&&d(u))});let{createGridRenderer:W}=(kj(),Lj(Uj)),w=F(),S=W(X.items,L,q.heightCache,w,D,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);R(S)}else q.replaceTemplate(L);if(X.root.classList.add(`${D}--grouped`),Q.sticky!==!1){j=i(X.root,Z,q.heightCache,{..._,sticky:_.sticky??!1},D);let W=j;q.afterScroll.push((w,S)=>{W.update(w)}),j.update(q.scrollController.getScrollTop())}let v=()=>{if(!Z)return;Z.rebuild(J.length),$=l(J,Z.groups);let W=r(Z,G);if(q.setHeightConfig(W),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length),j)j.refresh()};q.methods.set("setItems",(W)=>{J=[...W],v()}),q.methods.set("appendItems",(W)=>{J=[...J,...W],v()}),q.methods.set("prependItems",(W)=>{J=[...W,...J],v()}),q.methods.set("removeItem",(W)=>{J=J.filter((w)=>w.id!==W),v()}),q.methods.set("scrollToIndex",(W,w)=>{let S=Z.dataToLayoutIndex(W),{align:I,behavior:u}=vj(w),s=q.dataManager.getTotal(),g=e(S,q.heightCache,q.state.viewportState.containerHeight,s,I,q.getCachedCompression());if(u==="smooth")q.scrollController.scrollTo(g);else q.scrollController.scrollTo(g)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;X.root.classList.remove(`${D}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},qj=300,vj=(Q)=>{if(typeof Q==="string")return{align:Q,behavior:"auto",duration:qj};if(Q&&typeof Q==="object")return{align:Q.align??"start",behavior:Q.behavior??"auto",duration:Q.duration??qj};return{align:"start",behavior:"auto",duration:qj}};export{Rj as withGroups,d as isGroupHeader,i as createStickyHeader,r as createGroupedHeightFn,o as createGroupLayout,l as buildLayoutItems};
|
|
1
|
+
var{defineProperty:a,getOwnPropertyNames:Pj,getOwnPropertyDescriptor:Oj}=Object,Gj=Object.prototype.hasOwnProperty;
|
|
2
|
+
var Zj=new WeakMap,Lj=(Q)=>{var Z=Zj.get(Q),j;
|
|
3
|
+
if(Z)return Z;
|
|
4
|
+
if(Z=a({},"__esModule",{value:!0}),Q&&typeof Q==="object"||typeof Q==="function")Pj(Q).map((J)=>!Gj.call(Z,J)&&a(Z,J,{get:()=>Q[J],enumerable:!(j=Oj(Q,J))||j.enumerable}));
|
|
5
|
+
return Zj.set(Q,Z),Z};
|
|
6
|
+
var wj=(Q,Z)=>{for(var j in Z)a(Q,j,{get:Z[j],enumerable:!0,configurable:!0,set:(J)=>Z[j]=()=>J})};
|
|
7
|
+
var $j=(Q,Z)=>()=>(Q&&(Z=Q(Q=0)),Z);
|
|
8
|
+
var d=(Q)=>{return Q!==null&&typeof Q==="object"&&Q.__groupHeader===!0};
|
|
9
|
+
var Xj=(Q,Z,j)=>{if(j===0)return 0;
|
|
10
|
+
if(!Q.isVariable())return Math.floor(Z/Q.getHeight(0));
|
|
11
|
+
let J=0,$=0;
|
|
12
|
+
for(let q=j-1;
|
|
13
|
+
q>=0;
|
|
14
|
+
q--){let X=Q.getHeight(q);
|
|
15
|
+
if($+X>Z)break;
|
|
16
|
+
$+=X,J++}
|
|
17
|
+
return Math.max(J,1)},t=(Q,Z,j)=>{if(j===0)return 0;
|
|
18
|
+
let J=Math.floor(Z),$=Z-J,q=Math.max(0,Math.min(J,j-1));
|
|
19
|
+
return Q.getOffset(q)+$*Q.getHeight(q)};
|
|
20
|
+
var jj=16000000;
|
|
21
|
+
var Wj=(Q,Z)=>{let j=Z.getTotalHeight(),J=j>jj,$=J?jj:j,q=j>0?$/j:1;
|
|
22
|
+
return{isCompressed:J,actualHeight:j,virtualHeight:$,ratio:q}},Mj=(Q,Z,j,J,$,q,X)=>{if(!q.isCompressed||J===0)return j.getOffset(Q);
|
|
23
|
+
let{virtualHeight:M}=q,B=M-$,D=B-Z;
|
|
24
|
+
if(D<=$&&D>=-1){if(Z>=B-1){let R=j.getTotalHeight()-j.getOffset(Q);
|
|
25
|
+
return $-R}
|
|
26
|
+
let Y=Xj(j,$,J),_=Math.max(0,J-Y),z=Z/M*J,P=Math.max(0,Math.min(1,1-D/$)),L=j.getOffset(Q)-j.getOffset(_),F=j.getOffset(Q)-t(j,z,J);
|
|
27
|
+
return F+(L-F)*P}
|
|
28
|
+
let G=Z/M*J;
|
|
29
|
+
return j.getOffset(Q)-t(j,G,J)};
|
|
30
|
+
var Dj=()=>{};
|
|
31
|
+
var Uj={};
|
|
32
|
+
wj(Uj,{createGridRenderer:()=>bj});
|
|
33
|
+
var Fj=(Q=200)=>{let Z=[];
|
|
34
|
+
return{acquire:()=>{let q=Z.pop();
|
|
35
|
+
if(q)return q;
|
|
36
|
+
let X=document.createElement("div");
|
|
37
|
+
return X.setAttribute("role","option"),X},release:(q)=>{if(Z.length<Q)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),Z.push(q)},clear:()=>{Z.length=0}}},bj=(Q,Z,j,J,$,q,X,M)=>{let B=Fj(),D=new Map,b=q,G=!1,Y=null,_=0,E="",z=(N)=>{if(Y&&_===N)return Y;
|
|
38
|
+
return Y=Wj(N,j),_=N,Y},P={selected:!1,focused:!1},L=(N,K)=>{return P.selected=N,P.focused=K,P},F=`${$}-item ${$}-grid-item`,R=`${$}-item--selected`,H=`${$}-item--focused`,v=(N,K)=>{if(typeof K==="string")N.innerHTML=K;
|
|
39
|
+
else N.replaceChildren(K)},W=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},w=(N,K)=>{let U=J.getRow(N);
|
|
40
|
+
if(K){let O=K.totalItems,A=z(O);
|
|
41
|
+
if(A.isCompressed)return Mj(U,K.scrollTop,j,O,K.containerHeight,A,K.rangeStart)}
|
|
42
|
+
return j.getOffset(U)},S=(N,K,U)=>{let O=N.dataset.id?.startsWith("__group_header"),A=O?0:J.getCol(K),V=O?0:J.getColumnOffset(A,b),y;
|
|
43
|
+
if(G){let p=J.getRow(K),k=0,C=new Set;
|
|
44
|
+
for(let f=0;
|
|
45
|
+
f<K;
|
|
46
|
+
f++){let x=J.getRow(f);
|
|
47
|
+
if(x<p&&!C.has(x)){let h=j.getHeight(f);
|
|
48
|
+
k+=h,C.add(x)}}
|
|
49
|
+
y=k}
|
|
50
|
+
else y=w(K,U);
|
|
51
|
+
N.style.transform=`translate(${Math.round(V)}
|
|
52
|
+
px, ${Math.round(y)}
|
|
53
|
+
px)`},I=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),O=U?b:J.getColumnWidth(b),A;
|
|
54
|
+
if(G||U)A=j.getHeight(K)-J.gap;
|
|
55
|
+
else{let V=J.getRow(K);
|
|
56
|
+
A=j.getHeight(V)-J.gap}
|
|
57
|
+
N.style.width=`${O}
|
|
58
|
+
px`,N.style.height=`${A}
|
|
59
|
+
px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);
|
|
60
|
+
if(V.className=F,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(J.getRow(N)),V.dataset.col=String(J.getCol(N)),V.ariaSelected=String(U),M)V.id=`${M}-item-${N}`;
|
|
61
|
+
if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));
|
|
62
|
+
I(V,N);
|
|
63
|
+
let p=Z(K,N,y);
|
|
64
|
+
return v(V,p),W(V,U,O),S(V,N,A),V},s=(N,K,U,O,A)=>{if(K.start===0&&N.length>0)G=d(N[0]);
|
|
65
|
+
for(let[k,C]of D)if(k<K.start||k>K.end)C.element.remove(),B.release(C.element),D.delete(k);
|
|
66
|
+
let V=!1;
|
|
67
|
+
if(X){let k=String(X());
|
|
68
|
+
V=k!==E,E=k}
|
|
69
|
+
let y=document.createDocumentFragment(),p=[];
|
|
70
|
+
for(let k=K.start;
|
|
71
|
+
k<=K.end;
|
|
72
|
+
k++){let C=k-K.start,f=N[C];
|
|
73
|
+
if(!f){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${K.start}-${K.end}, items.length: ${N.length})`);
|
|
74
|
+
continue}
|
|
75
|
+
let x=U.has(f.id),h=k===O,T=D.get(k);
|
|
76
|
+
if(T){let c=T.element.dataset.id,Qj=String(f.id);
|
|
77
|
+
if(c!==Qj){let Vj=L(x,h),Aj=Z(f,k,Vj);
|
|
78
|
+
v(T.element,Aj),T.element.dataset.id=Qj,T.element.dataset.row=String(J.getRow(k)),T.element.dataset.col=String(J.getCol(k)),I(T.element,k)}
|
|
79
|
+
if(W(T.element,x,h),T.element.ariaSelected=String(x),S(T.element,k,A),V)T.element.setAttribute("aria-setsize",E)}
|
|
80
|
+
else{let c=u(k,f,x,h,A);
|
|
81
|
+
y.appendChild(c),p.push({index:k,element:c})}}
|
|
82
|
+
if(p.length>0){Q.appendChild(y);
|
|
83
|
+
for(let{index:k,element:C}
|
|
84
|
+
of p)D.set(k,{index:k,element:C})}},g=(N)=>{for(let[K,U]of D)S(U.element,K,N)},zj=(N,K,U,O)=>{let A=D.get(N);
|
|
85
|
+
if(A){let V=L(U,O),y=Z(K,N,V);
|
|
86
|
+
v(A.element,y),W(A.element,U,O),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),I(A.element,N)}},Bj=(N,K,U)=>{let O=D.get(N);
|
|
87
|
+
if(O)W(O.element,K,U)},_j=(N)=>{return D.get(N)?.element},Ej=(N)=>{if(Math.abs(N-b)<1)return;
|
|
88
|
+
b=N;
|
|
89
|
+
for(let[K,U]of D)I(U.element,K),S(U.element,K)},Jj=()=>{for(let[,N]of D)N.element.remove(),B.release(N.element);
|
|
90
|
+
D.clear()};
|
|
91
|
+
return{render:s,updatePositions:g,updateItem:zj,updateItemClasses:Bj,getElement:_j,updateContainerWidth:Ej,clear:Jj,destroy:()=>{Jj(),B.clear()}}};
|
|
92
|
+
var kj=$j(()=>{Dj()});
|
|
93
|
+
var n=(Q,Z)=>{let j=0,J=Q.length-1;
|
|
94
|
+
while(j<J){let $=j+J+1>>>1;
|
|
95
|
+
if(Q[$].headerLayoutIndex<=Z)j=$;
|
|
96
|
+
else J=$-1}
|
|
97
|
+
return j},Nj=(Q,Z)=>{let j=0,J=Q.length-1;
|
|
98
|
+
while(j<J){let $=j+J+1>>>1;
|
|
99
|
+
if(Q[$].firstDataIndex<=Z)j=$;
|
|
100
|
+
else J=$-1}
|
|
101
|
+
return j},Kj=(Q,Z)=>{if(Q===0)return[];
|
|
102
|
+
let j=[],J=Z(0),$=0,q=0;
|
|
103
|
+
for(let X=1;
|
|
104
|
+
X<Q;
|
|
105
|
+
X++){let M=Z(X);
|
|
106
|
+
if(M!==J){let B=X-$;
|
|
107
|
+
j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:B}),q=q+1+B,J=M,$=X}}
|
|
108
|
+
return j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:Q-$}),j},l=(Q,Z)=>{if(Q.length===0||Z.length===0)return[];
|
|
109
|
+
let j=Q.length+Z.length,J=Array(j),$=0;
|
|
110
|
+
for(let q of Z){J[$]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},$++;
|
|
111
|
+
for(let X=0;
|
|
112
|
+
X<q.count;
|
|
113
|
+
X++)J[$]=Q[q.firstDataIndex+X],$++}
|
|
114
|
+
return J},r=(Q,Z)=>{let j=typeof Z==="number"?(J)=>Z:Z;
|
|
115
|
+
return(J)=>{let $=Q.getEntry(J);
|
|
116
|
+
if($.type==="header")return Q.getHeaderHeight($.group.groupIndex);
|
|
117
|
+
return j($.dataIndex)}},o=(Q,Z)=>{let j=Kj(Q,Z.getGroupForIndex),J=Q+j.length,$=Z.headerHeight;
|
|
118
|
+
return{get totalEntries(){return J},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};
|
|
119
|
+
let _=n(j,Y),E=j[_];
|
|
120
|
+
if(Y===E.headerLayoutIndex)return{type:"header",group:E};
|
|
121
|
+
let z=Y-E.headerLayoutIndex-1;
|
|
122
|
+
return{type:"item",dataIndex:E.firstDataIndex+z,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;
|
|
123
|
+
let _=n(j,Y),E=j[_];
|
|
124
|
+
if(Y===E.headerLayoutIndex)return-1;
|
|
125
|
+
let z=Y-E.headerLayoutIndex-1;
|
|
126
|
+
return E.firstDataIndex+z},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;
|
|
127
|
+
let _=Nj(j,Y),E=j[_],z=Y-E.firstDataIndex;
|
|
128
|
+
return E.headerLayoutIndex+1+z},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
|
|
129
|
+
let _=n(j,Y);
|
|
130
|
+
return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
|
|
131
|
+
let _=Nj(j,Y);
|
|
132
|
+
return j[_]},getHeaderHeight:typeof $==="number"?(Y)=>$:(Y)=>{let _=j[Y];
|
|
133
|
+
if(!_)return 0;
|
|
134
|
+
return $(_.key,Y)},rebuild:(Y)=>{j=Kj(Y,Z.getGroupForIndex),J=Y+j.length}}};
|
|
135
|
+
var i=(Q,Z,j,J,$)=>{let q=document.createElement("div");
|
|
136
|
+
q.className=`${$}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",Q.insertBefore(q,Q.firstChild);
|
|
137
|
+
let X=-1,M=!1,B=0,D=(z)=>{if(z===X)return;
|
|
138
|
+
X=z;
|
|
139
|
+
let P=Z.groups;
|
|
140
|
+
if(z<0||z>=P.length){q.textContent="";
|
|
141
|
+
return}
|
|
142
|
+
let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);
|
|
143
|
+
if(q.style.height=`${R}
|
|
144
|
+
px`,typeof F==="string")q.innerHTML=F;
|
|
145
|
+
else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;
|
|
146
|
+
if(P.length===0){Y();
|
|
147
|
+
return}
|
|
148
|
+
let L=0;
|
|
149
|
+
for(let W=P.length-1;
|
|
150
|
+
W>=0;
|
|
151
|
+
W--)if(j.getOffset(P[W].headerLayoutIndex)<=z){L=W;
|
|
152
|
+
break}
|
|
153
|
+
let F=j.getOffset(P[0].headerLayoutIndex);
|
|
154
|
+
if(z<F){Y();
|
|
155
|
+
return}
|
|
156
|
+
if(!M)G();
|
|
157
|
+
D(L);
|
|
158
|
+
let R=Z.getHeaderHeight(L),H=0,v=L+1;
|
|
159
|
+
if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;
|
|
160
|
+
if(w<R)H=w-R}
|
|
161
|
+
if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}
|
|
162
|
+
px)`},G=()=>{if(M)return;
|
|
163
|
+
M=!0,q.style.display=""},Y=()=>{if(!M)return;
|
|
164
|
+
M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;
|
|
165
|
+
if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};
|
|
166
|
+
return q.style.display="none",{update:b,refresh:_,show:G,hide:Y,destroy:E}};
|
|
167
|
+
var Yj=(Q,Z,j,J,$,q)=>{if(J===0)return 0;
|
|
168
|
+
let X=Math.max(0,Math.min(Q,J-1)),M=Z.getOffset(X),B=Z.getHeight(X),D=Z.getTotalHeight(),b=Math.max(0,D-j),G;
|
|
169
|
+
switch(q){case"center":G=M-j/2+B/2;
|
|
170
|
+
break;
|
|
171
|
+
case"end":G=M-j+B;
|
|
172
|
+
break;
|
|
173
|
+
case"start":default:G=M;
|
|
174
|
+
break}
|
|
175
|
+
return Math.max(0,Math.min(G,b))};
|
|
176
|
+
var e=(Q,Z,j,J,$="start",q,X=Yj)=>{return X(Q,Z,j,J,q,$)};
|
|
177
|
+
var Rj=(Q)=>{if(!Q.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");
|
|
178
|
+
if(Q.headerHeight==null||Q.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");
|
|
179
|
+
if(!Q.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");
|
|
180
|
+
let Z=null,j=null,J=[],$=[];
|
|
181
|
+
return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:B}=q,{classPrefix:D}=M;
|
|
182
|
+
if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");
|
|
183
|
+
if(M.reverse)throw Error("[vlist/builder] withGroups cannot be used with reverse: true");
|
|
184
|
+
let G=B.item.height;
|
|
185
|
+
J=B.items?[...B.items]:[];
|
|
186
|
+
let Y=J.length,_={getGroupForIndex:Q.getGroupForIndex,headerHeight:Q.headerHeight,headerTemplate:Q.headerTemplate,sticky:Q.sticky??!1};
|
|
187
|
+
Z=o(Y,_),$=l(J,Z.groups);
|
|
188
|
+
let E=r(Z,G);
|
|
189
|
+
q.setHeightConfig(E),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length);
|
|
190
|
+
let z=B.item.template,{headerTemplate:P}=Q,L=(W,w,S)=>{if(d(W))return P(W.groupKey,W.groupIndex);
|
|
191
|
+
return z(W,w,S)},F=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");
|
|
192
|
+
if(F&&R){if(H)H((I)=>{let u=$[I];
|
|
193
|
+
return!!(u&&d(u))});
|
|
194
|
+
let{createGridRenderer:W}=(kj(),Lj(Uj)),w=F(),S=W(X.items,L,q.heightCache,w,D,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);
|
|
195
|
+
R(S)}
|
|
196
|
+
else q.replaceTemplate(L);
|
|
197
|
+
if(X.root.classList.add(`${D}--grouped`),Q.sticky!==!1){j=i(X.root,Z,q.heightCache,{..._,sticky:_.sticky??!1},D);
|
|
198
|
+
let W=j;
|
|
199
|
+
q.afterScroll.push((w,S)=>{W.update(w)}),j.update(q.scrollController.getScrollTop())}
|
|
200
|
+
let v=()=>{if(!Z)return;
|
|
201
|
+
Z.rebuild(J.length),$=l(J,Z.groups);
|
|
202
|
+
let W=r(Z,G);
|
|
203
|
+
if(q.setHeightConfig(W),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length),j)j.refresh()};
|
|
204
|
+
q.methods.set("setItems",(W)=>{J=[...W],v()}),q.methods.set("appendItems",(W)=>{J=[...J,...W],v()}),q.methods.set("prependItems",(W)=>{J=[...W,...J],v()}),q.methods.set("removeItem",(W)=>{J=J.filter((w)=>w.id!==W),v()}),q.methods.set("scrollToIndex",(W,w)=>{let S=Z.dataToLayoutIndex(W),{align:I,behavior:u}=vj(w),s=q.dataManager.getTotal(),g=e(S,q.heightCache,q.state.viewportState.containerHeight,s,I,q.getCachedCompression());
|
|
205
|
+
if(u==="smooth")q.scrollController.scrollTo(g);
|
|
206
|
+
else q.scrollController.scrollTo(g)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;
|
|
207
|
+
X.root.classList.remove(`${D}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},qj=300,vj=(Q)=>{if(typeof Q==="string")return{align:Q,behavior:"auto",duration:qj};
|
|
208
|
+
if(Q&&typeof Q==="object")return{align:Q.align??"start",behavior:Q.behavior??"auto",duration:Q.duration??qj};
|
|
209
|
+
return{align:"start",behavior:"auto",duration:qj}};
|
|
210
|
+
export{Rj as withGroups,d as isGroupHeader,i as createStickyHeader,r as createGroupedHeightFn,o as createGroupLayout,l as buildLayoutItems};
|