@floor/vlist 0.5.7 → 0.6.0
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/README.md +793 -592
- package/dist/async/index.js +1 -0
- package/dist/builder/context.d.ts +3 -3
- package/dist/builder/context.d.ts.map +1 -1
- package/dist/builder/core.d.ts +1 -1
- package/dist/builder/core.d.ts.map +1 -1
- package/dist/builder/index.js +1 -250
- package/dist/builder/types.d.ts +3 -3
- package/dist/builder/types.d.ts.map +1 -1
- package/dist/compression/index.js +1 -104
- package/dist/core/core.js +1 -0
- package/dist/core/full.d.ts +22 -0
- package/dist/core/full.d.ts.map +1 -0
- package/dist/core/index.js +1 -133
- package/dist/core/lite.d.ts +129 -0
- package/dist/core/lite.d.ts.map +1 -0
- package/dist/core/minimal.d.ts +104 -0
- package/dist/core/minimal.d.ts.map +1 -0
- package/dist/core-light.js +1 -68
- package/dist/data/index.js +1 -233
- package/dist/features/async/index.d.ts +9 -0
- package/dist/features/async/index.d.ts.map +1 -0
- package/dist/features/async/manager.d.ts +103 -0
- package/dist/features/async/manager.d.ts.map +1 -0
- package/dist/features/async/placeholder.d.ts +62 -0
- package/dist/features/async/placeholder.d.ts.map +1 -0
- package/dist/features/async/plugin.d.ts +60 -0
- package/dist/features/async/plugin.d.ts.map +1 -0
- package/dist/features/async/sparse.d.ts +91 -0
- package/dist/features/async/sparse.d.ts.map +1 -0
- package/dist/features/grid/index.d.ts +9 -0
- package/dist/features/grid/index.d.ts.map +1 -0
- package/dist/features/grid/layout.d.ts +29 -0
- package/dist/features/grid/layout.d.ts.map +1 -0
- package/dist/features/grid/plugin.d.ts +48 -0
- package/dist/features/grid/plugin.d.ts.map +1 -0
- package/dist/features/grid/renderer.d.ts +55 -0
- package/dist/features/grid/renderer.d.ts.map +1 -0
- package/dist/features/grid/types.d.ts +71 -0
- package/dist/features/grid/types.d.ts.map +1 -0
- package/dist/features/page/index.d.ts +8 -0
- package/dist/features/page/index.d.ts.map +1 -0
- package/dist/features/page/plugin.d.ts +53 -0
- package/dist/features/page/plugin.d.ts.map +1 -0
- package/dist/features/scale/index.d.ts +10 -0
- package/dist/features/scale/index.d.ts.map +1 -0
- package/dist/features/scale/plugin.d.ts +42 -0
- package/dist/features/scale/plugin.d.ts.map +1 -0
- package/dist/features/scrollbar/controller.d.ts +121 -0
- package/dist/features/scrollbar/controller.d.ts.map +1 -0
- package/dist/features/scrollbar/index.d.ts +8 -0
- package/dist/features/scrollbar/index.d.ts.map +1 -0
- package/dist/features/scrollbar/plugin.d.ts +60 -0
- package/dist/features/scrollbar/plugin.d.ts.map +1 -0
- package/dist/features/scrollbar/scrollbar.d.ts +73 -0
- package/dist/features/scrollbar/scrollbar.d.ts.map +1 -0
- package/dist/features/sections/index.d.ts +10 -0
- package/dist/features/sections/index.d.ts.map +1 -0
- package/dist/features/sections/layout.d.ts +46 -0
- package/dist/features/sections/layout.d.ts.map +1 -0
- package/dist/features/sections/plugin.d.ts +64 -0
- package/dist/features/sections/plugin.d.ts.map +1 -0
- package/dist/features/sections/sticky.d.ts +33 -0
- package/dist/features/sections/sticky.d.ts.map +1 -0
- package/dist/features/sections/types.d.ts +86 -0
- package/dist/features/sections/types.d.ts.map +1 -0
- package/dist/features/selection/index.d.ts +7 -0
- package/dist/features/selection/index.d.ts.map +1 -0
- package/dist/features/selection/plugin.d.ts +44 -0
- package/dist/features/selection/plugin.d.ts.map +1 -0
- package/dist/features/selection/state.d.ts +102 -0
- package/dist/features/selection/state.d.ts.map +1 -0
- package/dist/features/snapshots/index.d.ts +8 -0
- package/dist/features/snapshots/index.d.ts.map +1 -0
- package/dist/features/snapshots/plugin.d.ts +44 -0
- package/dist/features/snapshots/plugin.d.ts.map +1 -0
- package/dist/grid/index.js +1 -198
- package/dist/groups/index.js +1 -204
- package/dist/index.d.ts +17 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1129
- package/dist/page/index.js +1 -0
- package/dist/plugins/groups/plugin.d.ts +3 -2
- package/dist/plugins/groups/plugin.d.ts.map +1 -1
- package/dist/react/index.js +1 -1024
- package/dist/react/react.js +1 -0
- package/dist/rendering/heights.d.ts +63 -0
- package/dist/rendering/heights.d.ts.map +1 -0
- package/dist/rendering/index.d.ts +9 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/renderer.d.ts +103 -0
- package/dist/rendering/renderer.d.ts.map +1 -0
- package/dist/rendering/scale.d.ts +116 -0
- package/dist/rendering/scale.d.ts.map +1 -0
- package/dist/rendering/viewport.d.ts +139 -0
- package/dist/rendering/viewport.d.ts.map +1 -0
- package/dist/scale/index.js +1 -0
- package/dist/scroll/index.js +1 -116
- package/dist/scrollbar/index.js +1 -0
- package/dist/sections/index.js +1 -0
- package/dist/selection/index.js +1 -96
- package/dist/snapshots/index.js +1 -21
- package/dist/svelte/index.js +1 -1012
- package/dist/svelte/svelte.js +1 -0
- package/dist/vue/index.js +1 -1018
- package/dist/vue/vue.js +1 -0
- package/dist/window/index.js +1 -18
- package/package.json +1 -1
package/dist/grid/index.js
CHANGED
|
@@ -1,198 +1 @@
|
|
|
1
|
-
var a=(Y)=>{let q=Math.max(1,Math.floor(Y.columns)),J=Y.gap??0,j=Y.isHeaderFn,D={row:0,col:0},X=(K)=>{if(K<=0)return 0;
|
|
2
|
-
if(!j)return Math.ceil(K/q);
|
|
3
|
-
let $=0,N=0,B=0;
|
|
4
|
-
for(let y=0;
|
|
5
|
-
y<K;
|
|
6
|
-
y++)if(j(y)){if(B++,N>0)$++,N=0;
|
|
7
|
-
$++,N=0}
|
|
8
|
-
else if(N++,N>=q)$++,N=0;
|
|
9
|
-
if(N>0)$++;
|
|
10
|
-
return $},G=(K)=>{return D.row=O(K),D.col=b(K),D},O=(K)=>{if(!j)return Math.floor(K/q);
|
|
11
|
-
let $=0,N=0;
|
|
12
|
-
for(let B=0;
|
|
13
|
-
B<=K;
|
|
14
|
-
B++)if(j(B)){if(N>0)$++,N=0;
|
|
15
|
-
if(B===K)return $;
|
|
16
|
-
$++,N=0}
|
|
17
|
-
else{if(B===K)return $;
|
|
18
|
-
if(N++,N>=q)$++,N=0}
|
|
19
|
-
return console.warn(`⚠️ getRow(${K}) fell through - returning ${$}`),$},b=(K)=>{if(!j)return K%q;
|
|
20
|
-
if(j(K))return 0;
|
|
21
|
-
let $=0;
|
|
22
|
-
for(let N=0;
|
|
23
|
-
N<=K;
|
|
24
|
-
N++)if(j(N))$=0;
|
|
25
|
-
else{if(N===K)return $;
|
|
26
|
-
if($++,$>=q)$=0}
|
|
27
|
-
return $},W=(K,$,N)=>{if(N<=0)return{start:0,end:-1};
|
|
28
|
-
if(!j){let M=Math.max(0,K*q),V=Math.min(N-1,($+1)*q-1);
|
|
29
|
-
return{start:M,end:V}}
|
|
30
|
-
let B=-1,y=-1,T=0,k=0;
|
|
31
|
-
for(let M=0;
|
|
32
|
-
M<N;
|
|
33
|
-
M++){if(j(M)){if(k>0)T++,k=0;
|
|
34
|
-
if(T>=K&&T<=$){if(B===-1)B=M;
|
|
35
|
-
y=M}
|
|
36
|
-
T++,k=0}
|
|
37
|
-
else{if(T>=K&&T<=$){if(B===-1)B=M;
|
|
38
|
-
y=M}
|
|
39
|
-
if(k++,k>=q)T++,k=0}
|
|
40
|
-
if(T>$&&k===0)break}
|
|
41
|
-
if(B===-1)return{start:0,end:-1};
|
|
42
|
-
return{start:B,end:y}},P=(K,$,N)=>{if($<0||$>=q)return-1;
|
|
43
|
-
let B=K*q+$;
|
|
44
|
-
if(B<0||B>=N)return-1;
|
|
45
|
-
return B},F=(K)=>{let $=(q-1)*J;
|
|
46
|
-
return Math.max(0,(K-$)/q)};
|
|
47
|
-
return{get columns(){return q},get gap(){return J},update:(K)=>{if(K.columns!==void 0)q=Math.max(1,Math.floor(K.columns));
|
|
48
|
-
if(K.gap!==void 0)J=K.gap;
|
|
49
|
-
if(K.isHeaderFn!==void 0)j=K.isHeaderFn},getTotalRows:X,getPosition:G,getRow:O,getCol:b,getItemRange:W,getItemIndex:P,getColumnWidth:F,getColumnOffset:(K,$)=>{let N=F($);
|
|
50
|
-
return K*(N+J)}}};
|
|
51
|
-
var n=16000000;
|
|
52
|
-
var J2=(Y,q,J)=>{if(J===0)return 0;
|
|
53
|
-
if(!Y.isVariable())return Math.floor(q/Y.getHeight(0));
|
|
54
|
-
let j=0,D=0;
|
|
55
|
-
for(let X=J-1;
|
|
56
|
-
X>=0;
|
|
57
|
-
X--){let G=Y.getHeight(X);
|
|
58
|
-
if(D+G>q)break;
|
|
59
|
-
D+=G,j++}
|
|
60
|
-
return Math.max(j,1)},o=(Y,q,J)=>{if(J===0)return 0;
|
|
61
|
-
let j=Math.floor(q),D=q-j,X=Math.max(0,Math.min(j,J-1));
|
|
62
|
-
return Y.getOffset(X)+D*Y.getHeight(X)};
|
|
63
|
-
var K2=(Y,q)=>{let J=q.getTotalHeight(),j=J>n,D=j?n:J,X=J>0?D/J:1;
|
|
64
|
-
return{isCompressed:j,actualHeight:J,virtualHeight:D,ratio:X}};
|
|
65
|
-
var Q2=(Y,q,J,j,D,X,G)=>{if(!X.isCompressed||j===0)return J.getOffset(Y);
|
|
66
|
-
let{virtualHeight:O}=X,b=O-D,W=b-q;
|
|
67
|
-
if(W<=D&&W>=-1){if(q>=b-1){let T=J.getTotalHeight()-J.getOffset(Y);
|
|
68
|
-
return D-T}
|
|
69
|
-
let w=J2(J,D,j),C=Math.max(0,j-w),$=q/O*j,N=Math.max(0,Math.min(1,1-W/D)),B=J.getOffset(Y)-J.getOffset(C),y=J.getOffset(Y)-o(J,$,j);
|
|
70
|
-
return y+(B-y)*N}
|
|
71
|
-
let F=q/O*j;
|
|
72
|
-
return J.getOffset(Y)-o(J,F,j)};
|
|
73
|
-
var Y2=(Y)=>{return Y!==null&&typeof Y==="object"&&Y.__groupHeader===!0};
|
|
74
|
-
var N2=(Y=200)=>{let q=[];
|
|
75
|
-
return{acquire:()=>{let X=q.pop();
|
|
76
|
-
if(X)return X;
|
|
77
|
-
let G=document.createElement("div");
|
|
78
|
-
return G.setAttribute("role","option"),G},release:(X)=>{if(q.length<Y)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},i=(Y,q,J,j,D,X,G,O)=>{let b=N2(),W=new Map,P=X,F=!1,w=null,C=0,K="",$=(Q)=>{if(w&&C===Q)return w;
|
|
79
|
-
return w=K2(Q,J),C=Q,w},N={selected:!1,focused:!1},B=(Q,Z)=>{return N.selected=Q,N.focused=Z,N},y=`${D}-item ${D}-grid-item`,T=`${D}-item--selected`,k=`${D}-item--focused`,M=(Q,Z)=>{if(typeof Z==="string")Q.innerHTML=Z;
|
|
80
|
-
else Q.replaceChildren(Z)},V=(Q,Z,U)=>{Q.classList.toggle(T,Z),Q.classList.toggle(k,U)},A=(Q,Z)=>{let U=j.getRow(Q);
|
|
81
|
-
if(Z){let L=Z.totalItems,E=$(L);
|
|
82
|
-
if(E.isCompressed)return Q2(U,Z.scrollTop,J,L,Z.containerHeight,E,Z.rangeStart)}
|
|
83
|
-
return J.getOffset(U)},S=(Q,Z,U)=>{let L=Q.dataset.id?.startsWith("__group_header"),E=L?0:j.getCol(Z),_=L?0:j.getColumnOffset(E,P),f;
|
|
84
|
-
if(F){let x=j.getRow(Z),z=0,u=new Set;
|
|
85
|
-
for(let R=0;
|
|
86
|
-
R<Z;
|
|
87
|
-
R++){let p=j.getRow(R);
|
|
88
|
-
if(p<x&&!u.has(p)){let l=J.getHeight(R);
|
|
89
|
-
z+=l,u.add(p)}}
|
|
90
|
-
f=z}
|
|
91
|
-
else f=A(Z,U);
|
|
92
|
-
Q.style.transform=`translate(${Math.round(_)}px, ${Math.round(f)}px)`},v=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?P:j.getColumnWidth(P),E;
|
|
93
|
-
if(F||U)E=J.getHeight(Z)-j.gap;
|
|
94
|
-
else{let _=j.getRow(Z);
|
|
95
|
-
E=J.getHeight(_)-j.gap}
|
|
96
|
-
Q.style.width=`${L}px`,Q.style.height=`${E}px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);
|
|
97
|
-
if(_.className=y,_.dataset.index=String(Q),_.dataset.id=String(Z.id),_.dataset.row=String(j.getRow(Q)),_.dataset.col=String(j.getCol(Q)),_.ariaSelected=String(U),O)_.id=`${O}-item-${Q}`;
|
|
98
|
-
if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));
|
|
99
|
-
v(_,Q);
|
|
100
|
-
let x=q(Z,Q,f);
|
|
101
|
-
return M(_,x),V(_,U,L),S(_,Q,E),_},d=(Q,Z,U,L,E)=>{if(Z.start===0&&Q.length>0)F=Y2(Q[0]);
|
|
102
|
-
for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),b.release(u.element),W.delete(z);
|
|
103
|
-
let _=!1;
|
|
104
|
-
if(G){let z=String(G());
|
|
105
|
-
_=z!==K,K=z}
|
|
106
|
-
let f=document.createDocumentFragment(),x=[];
|
|
107
|
-
for(let z=Z.start;
|
|
108
|
-
z<=Z.end;
|
|
109
|
-
z++){let u=z-Z.start,R=Q[u];
|
|
110
|
-
if(!R){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${Z.start}-${Z.end}, items.length: ${Q.length})`);
|
|
111
|
-
continue}
|
|
112
|
-
let p=U.has(R.id),l=z===L,H=W.get(z);
|
|
113
|
-
if(H){let c=H.element.dataset.id,q2=String(R.id);
|
|
114
|
-
if(c!==q2){let $2=B(p,l),k2=q(R,z,$2);
|
|
115
|
-
M(H.element,k2),H.element.dataset.id=q2,H.element.dataset.row=String(j.getRow(z)),H.element.dataset.col=String(j.getCol(z)),v(H.element,z)}
|
|
116
|
-
if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,E),_)H.element.setAttribute("aria-setsize",K)}
|
|
117
|
-
else{let c=I(z,R,p,l,E);
|
|
118
|
-
f.appendChild(c),x.push({index:z,element:c})}}
|
|
119
|
-
if(x.length>0){Y.appendChild(f);
|
|
120
|
-
for(let{index:z,element:u}
|
|
121
|
-
of x)W.set(z,{index:z,element:u})}},h=(Q)=>{for(let[Z,U]of W)S(U.element,Z,Q)},m=(Q,Z,U,L)=>{let E=W.get(Q);
|
|
122
|
-
if(E){let _=B(U,L),f=q(Z,Q,_);
|
|
123
|
-
M(E.element,f),V(E.element,U,L),E.element.dataset.id=String(Z.id),E.element.ariaSelected=String(U),v(E.element,Q)}},r=(Q,Z,U)=>{let L=W.get(Q);
|
|
124
|
-
if(L)V(L.element,Z,U)},s=(Q)=>{return W.get(Q)?.element},g=(Q)=>{if(Math.abs(Q-P)<1)return;
|
|
125
|
-
P=Q;
|
|
126
|
-
for(let[Z,U]of W)v(U.element,Z),S(U.element,Z)},j2=()=>{for(let[,Q]of W)Q.element.remove(),b.release(Q.element);
|
|
127
|
-
W.clear()};
|
|
128
|
-
return{render:d,updatePositions:h,updateItem:m,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:j2,destroy:()=>{j2(),b.clear()}}};
|
|
129
|
-
var Z2=(Y,q,J,j,D,X)=>{if(j===0)return 0;
|
|
130
|
-
let G=Math.max(0,Math.min(Y,j-1)),O=q.getOffset(G),b=q.getHeight(G),W=q.getTotalHeight(),P=Math.max(0,W-J),F;
|
|
131
|
-
switch(X){case"center":F=O-J/2+b/2;
|
|
132
|
-
break;
|
|
133
|
-
case"end":F=O-J+b;
|
|
134
|
-
break;
|
|
135
|
-
case"start":default:F=O;
|
|
136
|
-
break}
|
|
137
|
-
return Math.max(0,Math.min(F,P))};
|
|
138
|
-
var t=(Y,q,J,j,D="start",X,G=Z2)=>{return G(Y,q,J,j,X,D)};
|
|
139
|
-
var X2=(Y)=>{if(!Y.columns||Y.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");
|
|
140
|
-
let q=null,J=null;
|
|
141
|
-
return{name:"withGrid",priority:10,setup(j){let{dom:D,emitter:X,config:G,rawConfig:O}=j,{classPrefix:b}=G;
|
|
142
|
-
if(G.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");
|
|
143
|
-
if(G.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");
|
|
144
|
-
let W=O.items?.some((k)=>k.__groupHeader===!0),P={columns:Y.columns,gap:Y.gap??0};
|
|
145
|
-
if(W)P.isHeaderFn=(k)=>{let M=j.dataManager.getItem(k);
|
|
146
|
-
return!!(M&&M.__groupHeader===!0)};
|
|
147
|
-
q=a(P);
|
|
148
|
-
let F=q.gap;
|
|
149
|
-
j.setVirtualTotalFn(()=>{let k=j.dataManager.getTotal();
|
|
150
|
-
return q.getTotalRows(k)});
|
|
151
|
-
let w=O.item,C=G.horizontal?w.width:w.height,K={containerWidth:j.getContainerWidth(),columns:q.columns,gap:q.gap};
|
|
152
|
-
if(typeof C==="function")j.setHeightConfig((k)=>{let M=K.containerWidth-2,V=(K.columns-1)*K.gap,A=(M-V)/K.columns,S={containerWidth:K.containerWidth,columns:K.columns,gap:K.gap,columnWidth:A,row:q.getRow(k),column:q.getCol(k),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:K.columns};
|
|
153
|
-
return C(k,S)+K.gap});
|
|
154
|
-
else if(F>0)j.setHeightConfig(C+F);
|
|
155
|
-
j.rebuildHeightCache(),D.root.classList.add(`${b}--grid`);
|
|
156
|
-
let $=j.getContainerWidth(),N=O.item.template,B=()=>{J=i(D.items,N,j.heightCache,q,b,$,()=>j.dataManager.getTotal(),G.ariaIdPrefix),j.replaceRenderer(J)};
|
|
157
|
-
B(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>P),j.methods.set("_replaceGridRenderer",(k)=>{J=k}),j.methods.set("_updateGridLayoutForGroups",(k)=>{q.update({isHeaderFn:k});
|
|
158
|
-
let M=j.dataManager.getTotal(),V=0;
|
|
159
|
-
for(let A=0;
|
|
160
|
-
A<M;
|
|
161
|
-
A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);
|
|
162
|
-
V+=S}
|
|
163
|
-
j.heightCache.getTotalHeight=()=>V,j.dom.content.style.height=`${V}px`,B()}),j.methods.set("updateGrid",(k)=>{if(k.columns!==void 0){if(!Number.isInteger(k.columns)||k.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");
|
|
164
|
-
P.columns=k.columns}
|
|
165
|
-
if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");
|
|
166
|
-
P.gap=k.gap}
|
|
167
|
-
if(q)q.update(P);
|
|
168
|
-
let M=j.getContainerWidth();
|
|
169
|
-
if(K.containerWidth=M,K.columns=P.columns,K.gap=P.gap??0,J)J.updateContainerWidth(M);
|
|
170
|
-
j.rebuildHeightCache(),j.updateContentSize(j.heightCache.getTotalHeight()),j.updateCompressionMode();
|
|
171
|
-
for(let V=0;
|
|
172
|
-
V<j.contentSizeHandlers.length;
|
|
173
|
-
V++)j.contentSizeHandlers[V]();
|
|
174
|
-
if(J)J.clear();
|
|
175
|
-
j.forceRender()});
|
|
176
|
-
let y=()=>{if(j.state.isDestroyed)return;
|
|
177
|
-
let k=j.scrollController.getScrollTop(),M=j.state.viewportState.containerHeight,V=j.getVirtualTotal(),A={start:0,end:0};
|
|
178
|
-
if(V===0||M===0)A.start=0,A.end=0;
|
|
179
|
-
else{A.start=Math.max(0,j.heightCache.indexAtOffset(k));
|
|
180
|
-
let g=j.heightCache.indexAtOffset(k+M);
|
|
181
|
-
if(g<V-1)g++;
|
|
182
|
-
A.end=Math.min(V-1,Math.max(0,g))}
|
|
183
|
-
let S=G.overscan??3,v={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};
|
|
184
|
-
j.state.viewportState.scrollTop=k,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=v;
|
|
185
|
-
let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;
|
|
186
|
-
if(v.start===I.start&&v.end===I.end){if(d)J.updatePositions(j.getCompressionContext());
|
|
187
|
-
return}
|
|
188
|
-
let h=j.dataManager.getTotal(),m=q.getItemRange(v.start,v.end,h),r=j.dataManager.getItemsInRange(m.start,m.end),s=d?j.getCompressionContext():void 0;
|
|
189
|
-
J.render(r,m,new Set,-1,s),j.state.lastRenderRange={...v},X.emit("range:change",{range:v})},T=()=>{if(j.state.isDestroyed)return;
|
|
190
|
-
j.state.lastRenderRange={start:-1,end:-1},y()};
|
|
191
|
-
if(j.setRenderFns(y,T),j.resizeHandlers.push((k,M)=>{if(J)J.updateContainerWidth(k)}),j.methods.set("scrollToIndex",(k,M)=>{let V=Math.floor(k/Y.columns),{align:A,behavior:S}=D2(M),v=j.dataManager.getState(),I=q.getTotalRows(v.total),d=Math.max(0,Math.min(V,I-1)),h=t(d,j.heightCache,j.state.viewportState.containerHeight,I,A,j.getCachedCompression());
|
|
192
|
-
if(S==="smooth")j.scrollController.scrollTo(h);
|
|
193
|
-
else j.scrollController.scrollTo(h)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());
|
|
194
|
-
j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;
|
|
195
|
-
D.root.classList.remove(`${b}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},e=300,D2=(Y)=>{if(typeof Y==="string")return{align:Y,behavior:"auto",duration:e};
|
|
196
|
-
if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??e};
|
|
197
|
-
return{align:"start",behavior:"auto",duration:e}};
|
|
198
|
-
export{X2 as withGrid,i as createGridRenderer,a as createGridLayout};
|
|
1
|
+
var a=(Y)=>{let q=Math.max(1,Math.floor(Y.columns)),J=Y.gap??0,j=Y.isHeaderFn,D={row:0,col:0},X=(K)=>{if(K<=0)return 0;if(!j)return Math.ceil(K/q);let $=0,N=0,B=0;for(let F=0;F<K;F++)if(j(F)){if(B++,N>0)$++,N=0;$++,N=0}else if(N++,N>=q)$++,N=0;if(N>0)$++;return $},G=(K)=>{return D.row=O(K),D.col=b(K),D},O=(K)=>{if(!j)return Math.floor(K/q);let $=0,N=0;for(let B=0;B<=K;B++)if(j(B)){if(N>0)$++,N=0;if(B===K)return $;$++,N=0}else{if(B===K)return $;if(N++,N>=q)$++,N=0}return console.warn(`⚠️ getRow(${K}) fell through - returning ${$}`),$},b=(K)=>{if(!j)return K%q;if(j(K))return 0;let $=0;for(let N=0;N<=K;N++)if(j(N))$=0;else{if(N===K)return $;if($++,$>=q)$=0}return $},W=(K,$,N)=>{if(N<=0)return{start:0,end:-1};if(!j){let M=Math.max(0,K*q),V=Math.min(N-1,($+1)*q-1);return{start:M,end:V}}let B=-1,F=-1,T=0,k=0;for(let M=0;M<N;M++){if(j(M)){if(k>0)T++,k=0;if(T>=K&&T<=$){if(B===-1)B=M;F=M}T++,k=0}else{if(T>=K&&T<=$){if(B===-1)B=M;F=M}if(k++,k>=q)T++,k=0}if(T>$&&k===0)break}if(B===-1)return{start:0,end:-1};return{start:B,end:F}},P=(K,$,N)=>{if($<0||$>=q)return-1;let B=K*q+$;if(B<0||B>=N)return-1;return B},y=(K)=>{let $=(q-1)*J;return Math.max(0,(K-$)/q)};return{get columns(){return q},get gap(){return J},update:(K)=>{if(K.columns!==void 0)q=Math.max(1,Math.floor(K.columns));if(K.gap!==void 0)J=K.gap;if(K.isHeaderFn!==void 0)j=K.isHeaderFn},getTotalRows:X,getPosition:G,getRow:O,getCol:b,getItemRange:W,getItemIndex:P,getColumnWidth:y,getColumnOffset:(K,$)=>{let N=y($);return K*(N+J)}}};var n=16000000;var J2=(Y,q,J)=>{if(J===0)return 0;if(!Y.isVariable())return Math.floor(q/Y.getHeight(0));let j=0,D=0;for(let X=J-1;X>=0;X--){let G=Y.getHeight(X);if(D+G>q)break;D+=G,j++}return Math.max(j,1)},o=(Y,q,J)=>{if(J===0)return 0;let j=Math.floor(q),D=q-j,X=Math.max(0,Math.min(j,J-1));return Y.getOffset(X)+D*Y.getHeight(X)};var K2=(Y,q)=>{let J=q.getTotalHeight(),j=J>n,D=j?n:J,X=J>0?D/J:1;return{isCompressed:j,actualHeight:J,virtualHeight:D,ratio:X}};var Q2=(Y,q,J,j,D,X,G)=>{if(!X.isCompressed||j===0)return J.getOffset(Y);let{virtualHeight:O}=X,b=O-D,W=b-q;if(W<=D&&W>=-1){if(q>=b-1){let T=J.getTotalHeight()-J.getOffset(Y);return D-T}let w=J2(J,D,j),C=Math.max(0,j-w),$=q/O*j,N=Math.max(0,Math.min(1,1-W/D)),B=J.getOffset(Y)-J.getOffset(C),F=J.getOffset(Y)-o(J,$,j);return F+(B-F)*N}let y=q/O*j;return J.getOffset(Y)-o(J,y,j)};var Y2=(Y)=>{return Y!==null&&typeof Y==="object"&&Y.__groupHeader===!0};var N2=(Y=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let G=document.createElement("div");return G.setAttribute("role","option"),G},release:(X)=>{if(q.length<Y)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},i=(Y,q,J,j,D,X,G,O)=>{let b=N2(),W=new Map,P=X,y=!1,w=null,C=0,K="",$=(Q)=>{if(w&&C===Q)return w;return w=K2(Q,J),C=Q,w},N={selected:!1,focused:!1},B=(Q,Z)=>{return N.selected=Q,N.focused=Z,N},F=`${D}-item ${D}-grid-item`,T=`${D}-item--selected`,k=`${D}-item--focused`,M=(Q,Z)=>{if(typeof Z==="string")Q.innerHTML=Z;else Q.replaceChildren(Z)},V=(Q,Z,U)=>{Q.classList.toggle(T,Z),Q.classList.toggle(k,U)},A=(Q,Z)=>{let U=j.getRow(Q);if(Z){let L=Z.totalItems,E=$(L);if(E.isCompressed)return Q2(U,Z.scrollTop,J,L,Z.containerHeight,E,Z.rangeStart)}return J.getOffset(U)},S=(Q,Z,U)=>{let L=Q.dataset.id?.startsWith("__group_header"),E=L?0:j.getCol(Z),_=L?0:j.getColumnOffset(E,P),f;if(y){let x=j.getRow(Z),z=0,u=new Set;for(let R=0;R<Z;R++){let p=j.getRow(R);if(p<x&&!u.has(p)){let l=J.getHeight(R);z+=l,u.add(p)}}f=z}else f=A(Z,U);Q.style.transform=`translate(${Math.round(_)}px, ${Math.round(f)}px)`},v=(Q,Z)=>{let U=Q.dataset.id?.startsWith("__group_header"),L=U?P:j.getColumnWidth(P),E;if(y||U)E=J.getHeight(Z)-j.gap;else{let _=j.getRow(Z);E=J.getHeight(_)-j.gap}Q.style.width=`${L}px`,Q.style.height=`${E}px`},I=(Q,Z,U,L,E)=>{let _=b.acquire(),f=B(U,L);if(_.className=F,_.dataset.index=String(Q),_.dataset.id=String(Z.id),_.dataset.row=String(j.getRow(Q)),_.dataset.col=String(j.getCol(Q)),_.ariaSelected=String(U),O)_.id=`${O}-item-${Q}`;if(G)K=String(G()),_.setAttribute("aria-setsize",K),_.setAttribute("aria-posinset",String(Q+1));v(_,Q);let x=q(Z,Q,f);return M(_,x),V(_,U,L),S(_,Q,E),_},d=(Q,Z,U,L,E)=>{if(Z.start===0&&Q.length>0)y=Y2(Q[0]);for(let[z,u]of W)if(z<Z.start||z>Z.end)u.element.remove(),b.release(u.element),W.delete(z);let _=!1;if(G){let z=String(G());_=z!==K,K=z}let f=document.createDocumentFragment(),x=[];for(let z=Z.start;z<=Z.end;z++){let u=z-Z.start,R=Q[u];if(!R){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${Z.start}-${Z.end}, items.length: ${Q.length})`);continue}let p=U.has(R.id),l=z===L,H=W.get(z);if(H){let c=H.element.dataset.id,q2=String(R.id);if(c!==q2){let $2=B(p,l),k2=q(R,z,$2);M(H.element,k2),H.element.dataset.id=q2,H.element.dataset.row=String(j.getRow(z)),H.element.dataset.col=String(j.getCol(z)),v(H.element,z)}if(V(H.element,p,l),H.element.ariaSelected=String(p),S(H.element,z,E),_)H.element.setAttribute("aria-setsize",K)}else{let c=I(z,R,p,l,E);f.appendChild(c),x.push({index:z,element:c})}}if(x.length>0){Y.appendChild(f);for(let{index:z,element:u}of x)W.set(z,{index:z,element:u})}},h=(Q)=>{for(let[Z,U]of W)S(U.element,Z,Q)},m=(Q,Z,U,L)=>{let E=W.get(Q);if(E){let _=B(U,L),f=q(Z,Q,_);M(E.element,f),V(E.element,U,L),E.element.dataset.id=String(Z.id),E.element.ariaSelected=String(U),v(E.element,Q)}},r=(Q,Z,U)=>{let L=W.get(Q);if(L)V(L.element,Z,U)},s=(Q)=>{return W.get(Q)?.element},g=(Q)=>{if(Math.abs(Q-P)<1)return;P=Q;for(let[Z,U]of W)v(U.element,Z),S(U.element,Z)},j2=()=>{for(let[,Q]of W)Q.element.remove(),b.release(Q.element);W.clear()};return{render:d,updatePositions:h,updateItem:m,updateItemClasses:r,getElement:s,updateContainerWidth:g,clear:j2,destroy:()=>{j2(),b.clear()}}};var Z2=(Y,q,J,j,D,X)=>{if(j===0)return 0;let G=Math.max(0,Math.min(Y,j-1)),O=q.getOffset(G),b=q.getHeight(G),W=q.getTotalHeight(),P=Math.max(0,W-J),y;switch(X){case"center":y=O-J/2+b/2;break;case"end":y=O-J+b;break;case"start":default:y=O;break}return Math.max(0,Math.min(y,P))};var t=(Y,q,J,j,D="start",X,G=Z2)=>{return G(Y,q,J,j,X,D)};var X2=(Y)=>{if(!Y.columns||Y.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let q=null,J=null;return{name:"withGrid",priority:10,setup(j){let{dom:D,emitter:X,config:G,rawConfig:O}=j,{classPrefix:b}=G;if(G.horizontal)throw Error("[vlist/builder] withGrid cannot be used with direction: 'horizontal'");if(G.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let W=O.items?.some((k)=>k.__groupHeader===!0),P={columns:Y.columns,gap:Y.gap??0};if(W)P.isHeaderFn=(k)=>{let M=j.dataManager.getItem(k);return!!(M&&M.__groupHeader===!0)};q=a(P);let y=q.gap;j.setVirtualTotalFn(()=>{let k=j.dataManager.getTotal();return q.getTotalRows(k)});let w=O.item,C=G.horizontal?w.width:w.height,K={containerWidth:j.getContainerWidth(),columns:q.columns,gap:q.gap};if(typeof C==="function")j.setHeightConfig((k)=>{let M=K.containerWidth-2,V=(K.columns-1)*K.gap,A=(M-V)/K.columns,S={containerWidth:K.containerWidth,columns:K.columns,gap:K.gap,columnWidth:A,row:q.getRow(k),column:q.getCol(k),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:K.columns};return C(k,S)+K.gap});else if(y>0)j.setHeightConfig(C+y);j.rebuildHeightCache(),D.root.classList.add(`${b}--grid`);let $=j.getContainerWidth(),N=O.item.template,B=()=>{J=i(D.items,N,j.heightCache,q,b,$,()=>j.dataManager.getTotal(),G.ariaIdPrefix),j.replaceRenderer(J)};B(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>P),j.methods.set("_replaceGridRenderer",(k)=>{J=k}),j.methods.set("_updateGridLayoutForGroups",(k)=>{q.update({isHeaderFn:k});let M=j.dataManager.getTotal(),V=0;for(let A=0;A<M;A++)if(q.getCol(A)===0){let S=j.heightCache.getHeight(A);V+=S}j.heightCache.getTotalHeight=()=>V,j.dom.content.style.height=`${V}px`,B()}),j.methods.set("updateGrid",(k)=>{if(k.columns!==void 0){if(!Number.isInteger(k.columns)||k.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");P.columns=k.columns}if(k.gap!==void 0){if(k.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");P.gap=k.gap}if(q)q.update(P);let M=j.getContainerWidth();if(K.containerWidth=M,K.columns=P.columns,K.gap=P.gap??0,J)J.updateContainerWidth(M);j.rebuildHeightCache(),j.updateContentSize(j.heightCache.getTotalHeight()),j.updateCompressionMode();for(let V=0;V<j.contentSizeHandlers.length;V++)j.contentSizeHandlers[V]();if(J)J.clear();j.forceRender()});let F=()=>{if(j.state.isDestroyed)return;let k=j.scrollController.getScrollTop(),M=j.state.viewportState.containerHeight,V=j.getVirtualTotal(),A={start:0,end:0};if(V===0||M===0)A.start=0,A.end=0;else{A.start=Math.max(0,j.heightCache.indexAtOffset(k));let g=j.heightCache.indexAtOffset(k+M);if(g<V-1)g++;A.end=Math.min(V-1,Math.max(0,g))}let S=G.overscan??3,v={start:Math.max(0,A.start-S),end:Math.min(V-1,A.end+S)};j.state.viewportState.scrollTop=k,j.state.viewportState.visibleRange=A,j.state.viewportState.renderRange=v;let I=j.state.lastRenderRange,d=j.state.viewportState.isCompressed;if(v.start===I.start&&v.end===I.end){if(d)J.updatePositions(j.getCompressionContext());return}let h=j.dataManager.getTotal(),m=q.getItemRange(v.start,v.end,h),r=j.dataManager.getItemsInRange(m.start,m.end),s=d?j.getCompressionContext():void 0;J.render(r,m,new Set,-1,s),j.state.lastRenderRange={...v},X.emit("range:change",{range:v})},T=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange={start:-1,end:-1},F()};if(j.setRenderFns(F,T),j.resizeHandlers.push((k,M)=>{if(J)J.updateContainerWidth(k)}),j.methods.set("scrollToIndex",(k,M)=>{let V=Math.floor(k/Y.columns),{align:A,behavior:S}=D2(M),v=j.dataManager.getState(),I=q.getTotalRows(v.total),d=Math.max(0,Math.min(V,I-1)),h=t(d,j.heightCache,j.state.viewportState.containerHeight,I,A,j.getCachedCompression());if(S==="smooth")j.scrollController.scrollTo(h);else j.scrollController.scrollTo(h)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;D.root.classList.remove(`${b}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},e=300,D2=(Y)=>{if(typeof Y==="string")return{align:Y,behavior:"auto",duration:e};if(Y&&typeof Y==="object")return{align:Y.align??"start",behavior:Y.behavior??"auto",duration:Y.duration??e};return{align:"start",behavior:"auto",duration:e}};export{X2 as withGrid,i as createGridRenderer,a as createGridLayout};
|
package/dist/groups/index.js
CHANGED
|
@@ -1,204 +1 @@
|
|
|
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)}px, ${Math.round(y)}px)`},I=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),O=U?b:J.getColumnWidth(b),A;
|
|
52
|
-
if(G||U)A=j.getHeight(K)-J.gap;
|
|
53
|
-
else{let V=J.getRow(K);
|
|
54
|
-
A=j.getHeight(V)-J.gap}
|
|
55
|
-
N.style.width=`${O}px`,N.style.height=`${A}px`},u=(N,K,U,O,A)=>{let V=B.acquire(),y=L(U,O);
|
|
56
|
-
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}`;
|
|
57
|
-
if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));
|
|
58
|
-
I(V,N);
|
|
59
|
-
let p=Z(K,N,y);
|
|
60
|
-
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]);
|
|
61
|
-
for(let[k,C]of D)if(k<K.start||k>K.end)C.element.remove(),B.release(C.element),D.delete(k);
|
|
62
|
-
let V=!1;
|
|
63
|
-
if(X){let k=String(X());
|
|
64
|
-
V=k!==E,E=k}
|
|
65
|
-
let y=document.createDocumentFragment(),p=[];
|
|
66
|
-
for(let k=K.start;
|
|
67
|
-
k<=K.end;
|
|
68
|
-
k++){let C=k-K.start,f=N[C];
|
|
69
|
-
if(!f){console.warn(`⚠️ RENDER: Missing item at index ${k} (range: ${K.start}-${K.end}, items.length: ${N.length})`);
|
|
70
|
-
continue}
|
|
71
|
-
let x=U.has(f.id),h=k===O,T=D.get(k);
|
|
72
|
-
if(T){let c=T.element.dataset.id,Qj=String(f.id);
|
|
73
|
-
if(c!==Qj){let Vj=L(x,h),Aj=Z(f,k,Vj);
|
|
74
|
-
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)}
|
|
75
|
-
if(W(T.element,x,h),T.element.ariaSelected=String(x),S(T.element,k,A),V)T.element.setAttribute("aria-setsize",E)}
|
|
76
|
-
else{let c=u(k,f,x,h,A);
|
|
77
|
-
y.appendChild(c),p.push({index:k,element:c})}}
|
|
78
|
-
if(p.length>0){Q.appendChild(y);
|
|
79
|
-
for(let{index:k,element:C}
|
|
80
|
-
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);
|
|
81
|
-
if(A){let V=L(U,O),y=Z(K,N,V);
|
|
82
|
-
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);
|
|
83
|
-
if(O)W(O.element,K,U)},_j=(N)=>{return D.get(N)?.element},Ej=(N)=>{if(Math.abs(N-b)<1)return;
|
|
84
|
-
b=N;
|
|
85
|
-
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);
|
|
86
|
-
D.clear()};
|
|
87
|
-
return{render:s,updatePositions:g,updateItem:zj,updateItemClasses:Bj,getElement:_j,updateContainerWidth:Ej,clear:Jj,destroy:()=>{Jj(),B.clear()}}};
|
|
88
|
-
var kj=$j(()=>{Dj()});
|
|
89
|
-
var n=(Q,Z)=>{let j=0,J=Q.length-1;
|
|
90
|
-
while(j<J){let $=j+J+1>>>1;
|
|
91
|
-
if(Q[$].headerLayoutIndex<=Z)j=$;
|
|
92
|
-
else J=$-1}
|
|
93
|
-
return j},Nj=(Q,Z)=>{let j=0,J=Q.length-1;
|
|
94
|
-
while(j<J){let $=j+J+1>>>1;
|
|
95
|
-
if(Q[$].firstDataIndex<=Z)j=$;
|
|
96
|
-
else J=$-1}
|
|
97
|
-
return j},Kj=(Q,Z)=>{if(Q===0)return[];
|
|
98
|
-
let j=[],J=Z(0),$=0,q=0;
|
|
99
|
-
for(let X=1;
|
|
100
|
-
X<Q;
|
|
101
|
-
X++){let M=Z(X);
|
|
102
|
-
if(M!==J){let B=X-$;
|
|
103
|
-
j.push({key:J,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:$,count:B}),q=q+1+B,J=M,$=X}}
|
|
104
|
-
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[];
|
|
105
|
-
let j=Q.length+Z.length,J=Array(j),$=0;
|
|
106
|
-
for(let q of Z){J[$]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},$++;
|
|
107
|
-
for(let X=0;
|
|
108
|
-
X<q.count;
|
|
109
|
-
X++)J[$]=Q[q.firstDataIndex+X],$++}
|
|
110
|
-
return J},r=(Q,Z)=>{let j=typeof Z==="number"?(J)=>Z:Z;
|
|
111
|
-
return(J)=>{let $=Q.getEntry(J);
|
|
112
|
-
if($.type==="header")return Q.getHeaderHeight($.group.groupIndex);
|
|
113
|
-
return j($.dataIndex)}},o=(Q,Z)=>{let j=Kj(Q,Z.getGroupForIndex),J=Q+j.length,$=Z.headerHeight;
|
|
114
|
-
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}};
|
|
115
|
-
let _=n(j,Y),E=j[_];
|
|
116
|
-
if(Y===E.headerLayoutIndex)return{type:"header",group:E};
|
|
117
|
-
let z=Y-E.headerLayoutIndex-1;
|
|
118
|
-
return{type:"item",dataIndex:E.firstDataIndex+z,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;
|
|
119
|
-
let _=n(j,Y),E=j[_];
|
|
120
|
-
if(Y===E.headerLayoutIndex)return-1;
|
|
121
|
-
let z=Y-E.headerLayoutIndex-1;
|
|
122
|
-
return E.firstDataIndex+z},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;
|
|
123
|
-
let _=Nj(j,Y),E=j[_],z=Y-E.firstDataIndex;
|
|
124
|
-
return E.headerLayoutIndex+1+z},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
|
|
125
|
-
let _=n(j,Y);
|
|
126
|
-
return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};
|
|
127
|
-
let _=Nj(j,Y);
|
|
128
|
-
return j[_]},getHeaderHeight:typeof $==="number"?(Y)=>$:(Y)=>{let _=j[Y];
|
|
129
|
-
if(!_)return 0;
|
|
130
|
-
return $(_.key,Y)},rebuild:(Y)=>{j=Kj(Y,Z.getGroupForIndex),J=Y+j.length}}};
|
|
131
|
-
var i=(Q,Z,j,J,$)=>{let q=document.createElement("div");
|
|
132
|
-
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);
|
|
133
|
-
let X=-1,M=!1,B=0,D=(z)=>{if(z===X)return;
|
|
134
|
-
X=z;
|
|
135
|
-
let P=Z.groups;
|
|
136
|
-
if(z<0||z>=P.length){q.textContent="";
|
|
137
|
-
return}
|
|
138
|
-
let L=P[z],F=J.headerTemplate(L.key,L.groupIndex),R=Z.getHeaderHeight(z);
|
|
139
|
-
if(q.style.height=`${R}px`,typeof F==="string")q.innerHTML=F;
|
|
140
|
-
else q.replaceChildren(F)},b=(z)=>{let P=Z.groups;
|
|
141
|
-
if(P.length===0){Y();
|
|
142
|
-
return}
|
|
143
|
-
let L=0;
|
|
144
|
-
for(let W=P.length-1;
|
|
145
|
-
W>=0;
|
|
146
|
-
W--)if(j.getOffset(P[W].headerLayoutIndex)<=z){L=W;
|
|
147
|
-
break}
|
|
148
|
-
let F=j.getOffset(P[0].headerLayoutIndex);
|
|
149
|
-
if(z<F){Y();
|
|
150
|
-
return}
|
|
151
|
-
if(!M)G();
|
|
152
|
-
D(L);
|
|
153
|
-
let R=Z.getHeaderHeight(L),H=0,v=L+1;
|
|
154
|
-
if(v<P.length){let w=j.getOffset(P[v].headerLayoutIndex)-z;
|
|
155
|
-
if(w<R)H=w-R}
|
|
156
|
-
if(H!==B)B=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},G=()=>{if(M)return;
|
|
157
|
-
M=!0,q.style.display=""},Y=()=>{if(!M)return;
|
|
158
|
-
M=!1,q.style.display="none",X=-1,B=0,q.style.transform=""},_=()=>{let z=X;
|
|
159
|
-
if(X=-1,z>=0)D(z)},E=()=>{q.remove(),X=-1,M=!1};
|
|
160
|
-
return q.style.display="none",{update:b,refresh:_,show:G,hide:Y,destroy:E}};
|
|
161
|
-
var Yj=(Q,Z,j,J,$,q)=>{if(J===0)return 0;
|
|
162
|
-
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;
|
|
163
|
-
switch(q){case"center":G=M-j/2+B/2;
|
|
164
|
-
break;
|
|
165
|
-
case"end":G=M-j+B;
|
|
166
|
-
break;
|
|
167
|
-
case"start":default:G=M;
|
|
168
|
-
break}
|
|
169
|
-
return Math.max(0,Math.min(G,b))};
|
|
170
|
-
var e=(Q,Z,j,J,$="start",q,X=Yj)=>{return X(Q,Z,j,J,q,$)};
|
|
171
|
-
var Rj=(Q)=>{if(!Q.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");
|
|
172
|
-
if(Q.headerHeight==null||Q.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");
|
|
173
|
-
if(!Q.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");
|
|
174
|
-
let Z=null,j=null,J=[],$=[];
|
|
175
|
-
return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:B}=q,{classPrefix:D}=M;
|
|
176
|
-
if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");
|
|
177
|
-
if(M.reverse)throw Error("[vlist/builder] withGroups cannot be used with reverse: true");
|
|
178
|
-
let G=B.item.height;
|
|
179
|
-
J=B.items?[...B.items]:[];
|
|
180
|
-
let Y=J.length,_={getGroupForIndex:Q.getGroupForIndex,headerHeight:Q.headerHeight,headerTemplate:Q.headerTemplate,sticky:Q.sticky??!1};
|
|
181
|
-
Z=o(Y,_),$=l(J,Z.groups);
|
|
182
|
-
let E=r(Z,G);
|
|
183
|
-
q.setHeightConfig(E),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length);
|
|
184
|
-
let z=B.item.template,{headerTemplate:P}=Q,L=(W,w,S)=>{if(d(W))return P(W.groupKey,W.groupIndex);
|
|
185
|
-
return z(W,w,S)},F=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");
|
|
186
|
-
if(F&&R){if(H)H((I)=>{let u=$[I];
|
|
187
|
-
return!!(u&&d(u))});
|
|
188
|
-
let{createGridRenderer:W}=(kj(),Lj(Uj)),w=F(),S=W(X.items,L,q.heightCache,w,D,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);
|
|
189
|
-
R(S)}
|
|
190
|
-
else q.replaceTemplate(L);
|
|
191
|
-
if(X.root.classList.add(`${D}--grouped`),Q.sticky!==!1){j=i(X.root,Z,q.heightCache,{..._,sticky:_.sticky??!1},D);
|
|
192
|
-
let W=j;
|
|
193
|
-
q.afterScroll.push((w,S)=>{W.update(w)}),j.update(q.scrollController.getScrollTop())}
|
|
194
|
-
let v=()=>{if(!Z)return;
|
|
195
|
-
Z.rebuild(J.length),$=l(J,Z.groups);
|
|
196
|
-
let W=r(Z,G);
|
|
197
|
-
if(q.setHeightConfig(W),q.rebuildHeightCache($.length),q.dataManager.setItems($,0,$.length),j)j.refresh()};
|
|
198
|
-
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());
|
|
199
|
-
if(u==="smooth")q.scrollController.scrollTo(g);
|
|
200
|
-
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;
|
|
201
|
-
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};
|
|
202
|
-
if(Q&&typeof Q==="object")return{align:Q.align??"start",behavior:Q.behavior??"auto",duration:Q.duration??qj};
|
|
203
|
-
return{align:"start",behavior:"auto",duration:qj}};
|
|
204
|
-
export{Rj as withGroups,d as isGroupHeader,i as createStickyHeader,r as createGroupedHeightFn,o as createGroupLayout,l as buildLayoutItems};
|
|
1
|
+
var{defineProperty:t,getOwnPropertyNames:Gj,getOwnPropertyDescriptor:Lj}=Object,Oj=Object.prototype.hasOwnProperty;var Xj=new WeakMap,wj=(J)=>{var $=Xj.get(J),j;if($)return $;if($=t({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")Gj(J).map((Z)=>!Oj.call($,Z)&&t($,Z,{get:()=>J[Z],enumerable:!(j=Lj(J,Z))||j.enumerable}));return Xj.set(J,$),$};var Fj=(J,$)=>{for(var j in $)t(J,j,{get:$[j],enumerable:!0,configurable:!0,set:(Z)=>$[j]=()=>Z})};var Yj=(J,$)=>()=>(J&&($=J(J=0)),$);var m=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var Dj=(J,$,j)=>{if(j===0)return 0;if(!J.isVariable())return Math.floor($/J.getHeight(0));let Z=0,Q=0;for(let q=j-1;q>=0;q--){let X=J.getHeight(q);if(Q+X>$)break;Q+=X,Z++}return Math.max(Z,1)},Jj=(J,$,j)=>{if(j===0)return 0;let Z=Math.floor($),Q=$-Z,q=Math.max(0,Math.min(Z,j-1));return J.getOffset(q)+Q*J.getHeight(q)};var $j=16000000;var zj=(J,$)=>{let j=$.getTotalHeight(),Z=j>$j,Q=Z?$j:j,q=j>0?Q/j:1;return{isCompressed:Z,actualHeight:j,virtualHeight:Q,ratio:q}},kj=(J,$,j,Z,Q,q,X)=>{if(!q.isCompressed||Z===0)return j.getOffset(J);let{virtualHeight:M}=q,D=M-Q,W=D-$;if(W<=Q&&W>=-1){if($>=D-1){let R=j.getTotalHeight()-j.getOffset(J);return Q-R}let Y=Dj(j,Q,Z),_=Math.max(0,Z-Y),k=$/M*Z,G=Math.max(0,Math.min(1,1-W/Q)),O=j.getOffset(J)-j.getOffset(_),b=j.getOffset(J)-Jj(j,k,Z);return b+(O-b)*G}let P=$/M*Z;return j.getOffset(J)-Jj(j,P,Z)};var Bj=()=>{};var _j={};Fj(_j,{createGridRenderer:()=>vj});var bj=(J=200)=>{let $=[];return{acquire:()=>{let q=$.pop();if(q)return q;let X=document.createElement("div");return X.setAttribute("role","option"),X},release:(q)=>{if($.length<J)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),$.push(q)},clear:()=>{$.length=0}}},vj=(J,$,j,Z,Q,q,X,M)=>{let D=bj(),W=new Map,w=q,P=!1,Y=null,_=0,E="",k=(N)=>{if(Y&&_===N)return Y;return Y=zj(N,j),_=N,Y},G={selected:!1,focused:!1},O=(N,K)=>{return G.selected=N,G.focused=K,G},b=`${Q}-item ${Q}-grid-item`,R=`${Q}-item--selected`,H=`${Q}-item--focused`,T=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},v=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},u=(N,K)=>{let U=Z.getRow(N);if(K){let L=K.totalItems,A=k(L);if(A.isCompressed)return kj(U,K.scrollTop,j,L,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},B=(N,K,U)=>{let L=N.dataset.id?.startsWith("__group_header"),A=L?0:Z.getCol(K),V=L?0:Z.getColumnOffset(A,w),y;if(P){let d=Z.getRow(K),z=0,C=new Set;for(let f=0;f<K;f++){let p=Z.getRow(f);if(p<d&&!C.has(p)){let c=j.getHeight(f);z+=c,C.add(p)}}y=z}else y=u(K,U);N.style.transform=`translate(${Math.round(V)}px, ${Math.round(y)}px)`},F=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),L=U?w:Z.getColumnWidth(w),A;if(P||U)A=j.getHeight(K)-Z.gap;else{let V=Z.getRow(K);A=j.getHeight(V)-Z.gap}N.style.width=`${L}px`,N.style.height=`${A}px`},x=(N,K,U,L,A)=>{let V=D.acquire(),y=O(U,L);if(V.className=b,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(Z.getRow(N)),V.dataset.col=String(Z.getCol(N)),V.ariaSelected=String(U),M)V.id=`${M}-item-${N}`;if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));F(V,N);let d=$(K,N,y);return T(V,d),v(V,U,L),B(V,N,A),V},g=(N,K,U,L,A)=>{if(K.start===0&&N.length>0)P=m(N[0]);for(let[z,C]of W)if(z<K.start||z>K.end)C.element.remove(),D.release(C.element),W.delete(z);let V=!1;if(X){let z=String(X());V=z!==E,E=z}let y=document.createDocumentFragment(),d=[];for(let z=K.start;z<=K.end;z++){let C=z-K.start,f=N[C];if(!f){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${K.start}-${K.end}, items.length: ${N.length})`);continue}let p=U.has(f.id),c=z===L,S=W.get(z);if(S){let s=S.element.dataset.id,Kj=String(f.id);if(s!==Kj){let Pj=O(p,c),Aj=$(f,z,Pj);T(S.element,Aj),S.element.dataset.id=Kj,S.element.dataset.row=String(Z.getRow(z)),S.element.dataset.col=String(Z.getCol(z)),F(S.element,z)}if(v(S.element,p,c),S.element.ariaSelected=String(p),B(S.element,z,A),V)S.element.setAttribute("aria-setsize",E)}else{let s=x(z,f,p,c,A);y.appendChild(s),d.push({index:z,element:s})}}if(d.length>0){J.appendChild(y);for(let{index:z,element:C}of d)W.set(z,{index:z,element:C})}},h=(N)=>{for(let[K,U]of W)B(U.element,K,N)},o=(N,K,U,L)=>{let A=W.get(N);if(A){let V=O(U,L),y=$(K,N,V);T(A.element,y),v(A.element,U,L),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),F(A.element,N)}},i=(N,K,U)=>{let L=W.get(N);if(L)v(L.element,K,U)},r=(N)=>{return W.get(N)?.element},Vj=(N)=>{if(Math.abs(N-w)<1)return;w=N;for(let[K,U]of W)F(U.element,K),B(U.element,K)},Nj=()=>{for(let[,N]of W)N.element.remove(),D.release(N.element);W.clear()};return{render:g,updatePositions:h,updateItem:o,updateItemClasses:i,getElement:r,updateContainerWidth:Vj,clear:Nj,destroy:()=>{Nj(),D.clear()}}};var Ej=Yj(()=>{Bj()});var e=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].headerLayoutIndex<=$)j=Q;else Z=Q-1}return j},Wj=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].firstDataIndex<=$)j=Q;else Z=Q-1}return j},Mj=(J,$)=>{if(J===0)return[];let j=[],Z=$(0),Q=0,q=0;for(let X=1;X<J;X++){let M=$(X);if(M!==Z){let D=X-Q;j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:D}),q=q+1+D,Z=M,Q=X}}return j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:J-Q}),j},a=(J,$)=>{if(J.length===0||$.length===0)return[];let j=J.length+$.length,Z=Array(j),Q=0;for(let q of $){Z[Q]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},Q++;for(let X=0;X<q.count;X++)Z[Q]=J[q.firstDataIndex+X],Q++}return Z},n=(J,$)=>{let j=typeof $==="number"?(Z)=>$:$;return(Z)=>{let Q=J.getEntry(Z);if(Q.type==="header")return J.getHeaderHeight(Q.group.groupIndex);return j(Q.dataIndex)}},jj=(J,$)=>{let j=Mj(J,$.getGroupForIndex),Z=J+j.length,Q=$.headerHeight;return{get totalEntries(){return Z},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return{type:"header",group:E};let k=Y-E.headerLayoutIndex-1;return{type:"item",dataIndex:E.firstDataIndex+k,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return-1;let k=Y-E.headerLayoutIndex-1;return E.firstDataIndex+k},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let _=Wj(j,Y),E=j[_],k=Y-E.firstDataIndex;return E.headerLayoutIndex+1+k},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=e(j,Y);return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=Wj(j,Y);return j[_]},getHeaderHeight:typeof Q==="number"?(Y)=>Q:(Y)=>{let _=j[Y];if(!_)return 0;return Q(_.key,Y)},rebuild:(Y)=>{j=Mj(Y,$.getGroupForIndex),Z=Y+j.length}}};var qj=(J,$,j,Z,Q)=>{let q=document.createElement("div");q.className=`${Q}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",J.insertBefore(q,J.firstChild);let X=-1,M=!1,D=0,W=(k)=>{if(k===X)return;X=k;let G=$.groups;if(k<0||k>=G.length){q.textContent="";return}let O=G[k],b=Z.headerTemplate(O.key,O.groupIndex),R=$.getHeaderHeight(k);if(q.style.height=`${R}px`,typeof b==="string")q.innerHTML=b;else q.replaceChildren(b)},w=(k)=>{let G=$.groups;if(G.length===0){Y();return}let O=0;for(let v=G.length-1;v>=0;v--)if(j.getOffset(G[v].headerLayoutIndex)<=k){O=v;break}let b=j.getOffset(G[0].headerLayoutIndex);if(k<b){Y();return}if(!M)P();W(O);let R=$.getHeaderHeight(O),H=0,T=O+1;if(T<G.length){let u=j.getOffset(G[T].headerLayoutIndex)-k;if(u<R)H=u-R}if(H!==D)D=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},P=()=>{if(M)return;M=!0,q.style.display=""},Y=()=>{if(!M)return;M=!1,q.style.display="none",X=-1,D=0,q.style.transform=""},_=()=>{let k=X;if(X=-1,k>=0)W(k)},E=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:w,refresh:_,show:P,hide:Y,destroy:E}};var Uj=(J,$,j,Z,Q,q)=>{if(Z===0)return 0;let X=Math.max(0,Math.min(J,Z-1)),M=$.getOffset(X),D=$.getHeight(X),W=$.getTotalHeight(),w=Math.max(0,W-j),P;switch(q){case"center":P=M-j/2+D/2;break;case"end":P=M-j+D;break;case"start":default:P=M;break}return Math.max(0,Math.min(P,w))};var Zj=(J,$,j,Z,Q="start",q,X=Uj)=>{return X(J,$,j,Z,q,Q)};var Rj=(J)=>{if(!J.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(J.headerHeight==null||J.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!J.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let $=null,j=null,Z=[],Q=[];return{name:"withGroups",priority:10,setup(q){let{dom:X,config:M,rawConfig:D}=q,{classPrefix:W}=M;if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");let P=D.item.height;Z=D.items?[...D.items]:[];let Y=Z.length,_={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};$=jj(Y,_),Q=a(Z,$.groups);let E=n($,P);q.setHeightConfig(E),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length);let k=D.item.template,{headerTemplate:G}=J,O=(B,F,x)=>{if(m(B))return G(B.groupKey,B.groupIndex);return k(B,F,x)},b=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(b&&R){if(H)H((g)=>{let h=Q[g];return!!(h&&m(h))});let{createGridRenderer:B}=(Ej(),wj(_j)),F=b(),x=B(X.items,O,q.heightCache,F,W,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);R(x)}else q.replaceTemplate(O);if(X.root.classList.add(`${W}--grouped`),J.sticky!==!1){j=qj(X.root,$,q.heightCache,{..._,sticky:_.sticky??!1},W);let B=j;q.afterScroll.push((F,x)=>{B.update(F)}),j.update(q.scrollController.getScrollTop())}let T=()=>{if(!$)return;$.rebuild(Z.length),Q=a(Z,$.groups);let B=n($,P);if(q.setHeightConfig(B),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length),j)j.refresh()};q.methods.set("setItems",(B)=>{Z=[...B],T()}),q.methods.set("appendItems",(B)=>{Z=[...Z,...B],T()}),q.methods.set("prependItems",(B)=>{Z=[...B,...Z],T()}),q.methods.set("removeItem",(B)=>{Z=Z.filter((F)=>F.id!==B),T()});let{animateScroll:v,cancelScroll:u}=Sj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(B,F)=>{let x=$.dataToLayoutIndex(B),{align:g,behavior:h,duration:o}=Hj(F),i=q.dataManager.getTotal(),r=Zj(x,q.heightCache,q.state.viewportState.containerHeight,i,g,q.getCachedCompression());if(h==="smooth")v(q.scrollController.getScrollTop(),r,o);else u(),q.scrollController.scrollTo(r)}),q.methods.set("_getItems",()=>Z),q.methods.set("_getTotal",()=>Z.length),q.destroyHandlers.push(()=>{if(I!==null)cancelAnimationFrame(I),I=null;if(j)j.destroy(),j=null;X.root.classList.remove(`${W}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},Qj=300,Tj=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,I=null,Sj=(J,$)=>{let j=()=>{if(I!==null)cancelAnimationFrame(I),I=null};return{animateScroll:(Q,q,X)=>{if(j(),Math.abs(q-Q)<1){J.scrollTo(q);return}let M=performance.now(),D=(W)=>{let w=W-M,P=Math.min(w/X,1),Y=Q+(q-Q)*Tj(P);if(J.scrollTo(Y),$(),P<1)I=requestAnimationFrame(D);else I=null};I=requestAnimationFrame(D)},cancelScroll:j}},Hj=(J)=>{if(typeof J==="string")return{align:J,behavior:"auto",duration:Qj};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??Qj};return{align:"start",behavior:"auto",duration:Qj}};export{Rj as withGroups,m as isGroupHeader,qj as createStickyHeader,n as createGroupedHeightFn,jj as createGroupLayout,a as buildLayoutItems};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vlist - Lightweight Virtual List
|
|
3
3
|
* High-performance virtual scrolling with zero dependencies
|
|
4
|
-
*
|
|
4
|
+
* Builder-only API for optimal tree-shaking
|
|
5
5
|
*
|
|
6
6
|
* @packageDocumentation
|
|
7
7
|
*/
|
|
8
|
-
export {
|
|
8
|
+
export { vlist } from "./builder";
|
|
9
|
+
export { withScale } from "./features/scale";
|
|
10
|
+
export { withAsync } from "./features/async";
|
|
11
|
+
export { withScrollbar } from "./features/scrollbar";
|
|
12
|
+
export { withPage } from "./features/page";
|
|
13
|
+
export { withSections } from "./features/sections";
|
|
14
|
+
export { withGrid } from "./features/grid";
|
|
15
|
+
export { withSelection } from "./features/selection";
|
|
16
|
+
export { withSnapshots } from "./features/snapshots";
|
|
9
17
|
export type { VList, VListConfig, VListItem, VListEvents, ItemTemplate, ItemState, SelectionMode, SelectionConfig, SelectionState, ScrollbarConfig, ScrollbarOptions, ScrollConfig, ScrollToOptions, ScrollSnapshot, VListAdapter, AdapterParams, AdapterResponse, Range, ViewportState, EventHandler, Unsubscribe, } from "./types";
|
|
10
|
-
export
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
18
|
+
export type { VListBuilder, BuiltVList, BuilderConfig, VListPlugin, BuilderContext, } from "./builder";
|
|
19
|
+
export { createGroupLayout as createSectionLayout, buildLayoutItems, createGroupedHeightFn as createSectionedHeightFn, createStickyHeader, isGroupHeader as isSectionHeader, type GroupsConfig as SectionsConfig, type GroupBoundary as SectionBoundary, type LayoutEntry, type GroupHeaderItem as SectionHeaderItem, type GroupLayout as SectionLayout, type StickyHeader, } from "./features/sections";
|
|
20
|
+
export { createGridLayout, createGridRenderer, type GridConfig, type GridLayout, type GridPosition, type GridRenderer, type ItemRange, } from "./features/grid";
|
|
21
|
+
export { createHeightCache, type HeightCache, simpleVisibleRange, calculateRenderRange, calculateTotalHeight, calculateActualHeight, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, rangesEqual, isInRange, getRangeCount, diffRanges, MAX_VIRTUAL_HEIGHT, getCompressionState as getScaleState, getCompression as getScale, needsCompression as needsScaling, getMaxItemsWithoutCompression as getMaxItemsWithoutScaling, getCompressionInfo as getScaleInfo, calculateCompressedVisibleRange as calculateScaledVisibleRange, calculateCompressedRenderRange as calculateScaledRenderRange, calculateCompressedItemPosition as calculateScaledItemPosition, calculateCompressedScrollToIndex as calculateScaledScrollToIndex, calculateIndexFromScrollPosition, type CompressionState as ScaleState, } from "./rendering";
|
|
22
|
+
export { createSelectionState, selectItems, deselectItems, toggleSelection, selectAll, clearSelection, isSelected, getSelectedIds, getSelectedItems, } from "./features/selection";
|
|
14
23
|
export { createEmitter, type Emitter } from "./events";
|
|
15
|
-
export { createDataManager, createSparseStorage, createPlaceholderManager, isPlaceholderItem, filterPlaceholders, mergeRanges, calculateMissingRanges, type DataManager, type SparseStorage, type PlaceholderManager, } from "./
|
|
16
|
-
export { createScrollController, createScrollbar, rafThrottle, type ScrollController, type Scrollbar, } from "./
|
|
24
|
+
export { createDataManager as createAsyncManager, createSparseStorage, createPlaceholderManager, isPlaceholderItem, filterPlaceholders, mergeRanges, calculateMissingRanges, type DataManager as AsyncManager, type SparseStorage, type PlaceholderManager, } from "./features/async";
|
|
25
|
+
export { createScrollController, createScrollbar, rafThrottle, type ScrollController, type Scrollbar, } from "./features/scrollbar";
|
|
17
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,YAAY,EAEV,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EAGX,YAAY,EACZ,SAAS,EAGT,aAAa,EACb,eAAe,EACf,cAAc,EAGd,eAAe,EACf,gBAAgB,EAGhB,YAAY,EACZ,eAAe,EACf,cAAc,EAGd,YAAY,EACZ,aAAa,EACb,eAAe,EAGf,KAAK,EACL,aAAa,EAGb,YAAY,EACZ,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,iBAAiB,IAAI,mBAAmB,EACxC,gBAAgB,EAChB,qBAAqB,IAAI,uBAAuB,EAChD,kBAAkB,EAClB,aAAa,IAAI,eAAe,EAChC,KAAK,YAAY,IAAI,cAAc,EACnC,KAAK,aAAa,IAAI,eAAe,EACrC,KAAK,WAAW,EAChB,KAAK,eAAe,IAAI,iBAAiB,EACzC,KAAK,WAAW,IAAI,aAAa,EACjC,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAEL,iBAAiB,EACjB,KAAK,WAAW,EAEhB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACX,SAAS,EACT,aAAa,EACb,UAAU,EAEV,kBAAkB,EAClB,mBAAmB,IAAI,aAAa,EACpC,cAAc,IAAI,QAAQ,EAC1B,gBAAgB,IAAI,YAAY,EAChC,6BAA6B,IAAI,yBAAyB,EAC1D,kBAAkB,IAAI,YAAY,EAClC,+BAA+B,IAAI,2BAA2B,EAC9D,8BAA8B,IAAI,0BAA0B,EAC5D,+BAA+B,IAAI,2BAA2B,EAC9D,gCAAgC,IAAI,4BAA4B,EAChE,gCAAgC,EAChC,KAAK,gBAAgB,IAAI,UAAU,GACpC,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,eAAe,EACf,SAAS,EACT,cAAc,EACd,UAAU,EACV,cAAc,EACd,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAGvD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,KAAK,WAAW,IAAI,YAAY,EAChC,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,SAAS,GACf,MAAM,sBAAsB,CAAC"}
|