@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/data/index.js
CHANGED
|
@@ -1,233 +1 @@
|
|
|
1
|
-
var $j=(U={})=>{let{chunkSize:G=100,maxCachedItems:Y=5000,evictionBuffer:N=200,onEvict:M}=U,Q=new Map,j=0,D=0,T=(q)=>{let X=Q.get(q);
|
|
2
|
-
if(!X)X={items:Array(G),count:0,lastAccess:Date.now()},Q.set(q,X);
|
|
3
|
-
else X.lastAccess=Date.now();
|
|
4
|
-
return X},z=(q)=>{return Math.floor(q/G)},W=(q)=>{return q%G},y=()=>j,L=(q)=>{j=q},b=(q)=>{if(q<0||q>=j)return;
|
|
5
|
-
let X=z(q),B=Q.get(X);
|
|
6
|
-
if(!B)return;
|
|
7
|
-
return B.items[W(q)]},C=(q)=>{if(q<0||q>=j)return!1;
|
|
8
|
-
let X=z(q),B=Q.get(X);
|
|
9
|
-
if(!B)return!1;
|
|
10
|
-
return B.items[W(q)]!==void 0},u=(q,X)=>{let B=z(q),K=T(B),_=W(q),l=K.items[_]===void 0;
|
|
11
|
-
if(K.items[_]=X,l)K.count++,D++;
|
|
12
|
-
if(q>=j)j=q+1},H=(q,X)=>{for(let B=0;
|
|
13
|
-
B<X.length;
|
|
14
|
-
B++){let K=X[B];
|
|
15
|
-
if(K!==void 0)u(q+B,K)}},Z=(q)=>{if(q<0||q>=j)return!1;
|
|
16
|
-
let X=z(q),B=Q.get(X);
|
|
17
|
-
if(!B)return!1;
|
|
18
|
-
let K=W(q);
|
|
19
|
-
if(B.items[K]===void 0)return!1;
|
|
20
|
-
if(B.items[K]=void 0,B.count--,D--,B.count===0)Q.delete(X);
|
|
21
|
-
return!0},F=(q,X)=>{let B=[];
|
|
22
|
-
for(let K=q;
|
|
23
|
-
K<=X&&K<j;
|
|
24
|
-
K++)B.push(b(K));
|
|
25
|
-
return B},V=(q,X)=>{for(let B=q;
|
|
26
|
-
B<=X&&B<j;
|
|
27
|
-
B++)if(!C(B))return!1;
|
|
28
|
-
return!0},O=()=>{let q=[],X=null,B=Array.from(Q.keys()).sort((K,_)=>K-_);
|
|
29
|
-
for(let K of B){let _=Q.get(K);
|
|
30
|
-
if(!_)continue;
|
|
31
|
-
let l=K*G;
|
|
32
|
-
for(let R=0;
|
|
33
|
-
R<G;
|
|
34
|
-
R++){let p=l+R;
|
|
35
|
-
if(p>=j)break;
|
|
36
|
-
if(_.items[R]!==void 0)if(X===null)X={start:p,end:p};
|
|
37
|
-
else if(p===X.end+1)X.end=p;
|
|
38
|
-
else q.push(X),X={start:p,end:p};
|
|
39
|
-
else if(X!==null)q.push(X),X=null}}
|
|
40
|
-
if(X!==null)q.push(X);
|
|
41
|
-
return q},h=(q,X)=>{let B=[],K=null;
|
|
42
|
-
for(let _=q;
|
|
43
|
-
_<=X&&_<j;
|
|
44
|
-
_++)if(!C(_))if(K===null)K={start:_,end:_};
|
|
45
|
-
else K.end=_;
|
|
46
|
-
else if(K!==null)B.push(K),K=null;
|
|
47
|
-
if(K!==null)B.push(K);
|
|
48
|
-
return B},w=(q)=>{return Q.has(q)},k=(q)=>{let X=Q.get(q);
|
|
49
|
-
if(X)X.lastAccess=Date.now()},A=(q,X)=>{if(q>X||Q.size===0)return;
|
|
50
|
-
let B=Date.now(),K=z(Math.max(0,q)),_=z(Math.min(j-1,X));
|
|
51
|
-
for(let l=K;
|
|
52
|
-
l<=_;
|
|
53
|
-
l++){let R=Q.get(l);
|
|
54
|
-
if(R)R.lastAccess=B}},f=(q,X)=>{if(D<=Y)return 0;
|
|
55
|
-
let B=Math.max(0,q-N),K=Math.min(j-1,X+N),_=z(B),l=z(K),R=0,p=[];
|
|
56
|
-
for(let[i,qj]of Q)if(i<_||i>l)R+=qj.count,p.push(i),D-=qj.count,Q.delete(i);
|
|
57
|
-
if(R>0&&M)M(R,p);
|
|
58
|
-
return R},I=()=>{if(D<=Y)return 0;
|
|
59
|
-
let q=Array.from(Q.entries()).sort(([,K],[,_])=>K.lastAccess-_.lastAccess),X=0,B=[];
|
|
60
|
-
for(let[K,_]of q){if(D<=Y)break;
|
|
61
|
-
X+=_.count,D-=_.count,B.push(K),Q.delete(K)}
|
|
62
|
-
if(X>0&&M)M(X,B);
|
|
63
|
-
return X},r=()=>{return{totalItems:j,cachedItems:D,cachedChunks:Q.size,chunkSize:G,maxCachedItems:Y,memoryEfficiency:j>0?1-D/j:1}},t=()=>D,e=()=>{Q.clear(),D=0};
|
|
64
|
-
return{chunkSize:G,maxCachedItems:Y,getTotal:y,setTotal:L,get:b,has:C,set:u,setRange:H,delete:Z,getRange:F,isRangeLoaded:V,getLoadedRanges:O,findUnloadedRanges:h,getChunkIndex:z,isChunkLoaded:w,touchChunk:k,touchChunksForRange:A,evictDistant:f,evictToLimit:I,getStats:r,getCachedCount:t,clear:e,reset:()=>{e(),j=0}}},Uj=(U)=>{if(U.length===0)return[];
|
|
65
|
-
let G=[...U].sort((N,M)=>N.start-M.start),Y=[{...G[0]}];
|
|
66
|
-
for(let N=1;
|
|
67
|
-
N<G.length;
|
|
68
|
-
N++){let M=G[N],Q=Y[Y.length-1];
|
|
69
|
-
if(M.start<=Q.end+1)Q.end=Math.max(Q.end,M.end);
|
|
70
|
-
else Y.push({...M})}
|
|
71
|
-
return Y},Xj=(U,G,Y)=>{let N=Math.floor(U.start/Y)*Y,M=Math.ceil((U.end+1)/Y)*Y-1,Q={start:N,end:M};
|
|
72
|
-
if(G.length===0)return[Q];
|
|
73
|
-
let j=[],D=Uj(G),T=Q.start;
|
|
74
|
-
for(let z of D){if(z.end<T)continue;
|
|
75
|
-
if(z.start>Q.end)break;
|
|
76
|
-
if(z.start>T)j.push({start:T,end:Math.min(z.start-1,Q.end)});
|
|
77
|
-
if(T=z.end+1,T>Q.end)break}
|
|
78
|
-
if(T<=Q.end)j.push({start:T,end:Q.end});
|
|
79
|
-
return j};
|
|
80
|
-
var Yj=(U={})=>{let{enabled:G=!0,maskCharacter:Y="█",randomVariance:N=!0,maxSampleSize:M=20,customGenerator:Q}=U,j=null,D=!1,T=0,z=(Z)=>{if(!G||D||Z.length===0)return;
|
|
81
|
-
let F=new Map,V=new Map,O=Math.min(Z.length,M);
|
|
82
|
-
for(let h=0;
|
|
83
|
-
h<O;
|
|
84
|
-
h++){let w=Z[h];
|
|
85
|
-
if(!w||typeof w!=="object")continue;
|
|
86
|
-
for(let[k,A]of Object.entries(w)){if(k.startsWith("_")||k==="id")continue;
|
|
87
|
-
if(!V.has(k))V.set(k,{lengths:[],types:new Set});
|
|
88
|
-
let f=V.get(k),I=Array.isArray(A)?"array":typeof A;
|
|
89
|
-
if(f.types.add(I),typeof A==="string")f.lengths.push(A.length);
|
|
90
|
-
else if(A!==null&&A!==void 0)f.lengths.push(String(A).length)}}
|
|
91
|
-
for(let[h,w]of V){if(w.lengths.length===0)continue;
|
|
92
|
-
let k=Math.min(...w.lengths),A=Math.max(...w.lengths),f=Math.round(w.lengths.reduce((r,t)=>r+t,0)/w.lengths.length),I="string";
|
|
93
|
-
if(w.types.has("number")&&w.types.size===1)I="number";
|
|
94
|
-
else if(w.types.has("boolean")&&w.types.size===1)I="boolean";
|
|
95
|
-
else if(w.types.has("array"))I="array";
|
|
96
|
-
else if(w.types.has("object")&&!w.types.has("string"))I="object";
|
|
97
|
-
F.set(h,{minLength:k,maxLength:A,avgLength:f,type:I})}
|
|
98
|
-
j=F,D=!0},W=()=>D,y=(Z)=>{let F=Z.avgLength;
|
|
99
|
-
if(N&&Z.minLength!==Z.maxLength){if(F=Math.floor(Math.random()*(Z.maxLength-Z.minLength+1)+Z.minLength),Math.random()<0.3)F=Math.max(1,F+Math.floor(Math.random()*3)-1)}
|
|
100
|
-
return Y.repeat(Math.max(1,F))},L=(Z)=>{if(Q)return{...Q(Z),["_isPlaceholder"]:!0};
|
|
101
|
-
let F={id:`__placeholder_${T++}`,["_isPlaceholder"]:!0,_index:Z};
|
|
102
|
-
if(!j||j.size===0)return F.label=Y.repeat(12),F;
|
|
103
|
-
for(let[V,O]of j)switch(O.type){case"string":F[V]=y(O);
|
|
104
|
-
break;
|
|
105
|
-
case"number":F[V]=0;
|
|
106
|
-
break;
|
|
107
|
-
case"boolean":F[V]=!1;
|
|
108
|
-
break;
|
|
109
|
-
case"array":F[V]=[];
|
|
110
|
-
break;
|
|
111
|
-
case"object":F[V]={};
|
|
112
|
-
break;
|
|
113
|
-
default:F[V]=y(O)}
|
|
114
|
-
return F};
|
|
115
|
-
return{analyzeStructure:z,hasAnalyzedStructure:W,generate:L,generateRange:(Z,F)=>{let V=[];
|
|
116
|
-
for(let O=Z;
|
|
117
|
-
O<=F;
|
|
118
|
-
O++)V.push(L(O));
|
|
119
|
-
return V},isPlaceholder:(Z)=>{if(!Z||typeof Z!=="object")return!1;
|
|
120
|
-
return Z._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{j=null,D=!1,T=0}}},d=(U)=>{if(!U||typeof U!=="object")return!1;
|
|
121
|
-
return U._isPlaceholder===!0},Nj=(U)=>{return U.filter((G)=>!d(G))},Fj=(U)=>{let G=0;
|
|
122
|
-
for(let Y of U)if(Y!==void 0&&!d(Y))G++;
|
|
123
|
-
return G},Ej=(U,G,Y)=>{let N=0;
|
|
124
|
-
for(let M=0;
|
|
125
|
-
M<G.length;
|
|
126
|
-
M++){let Q=Y+M,j=U[Q];
|
|
127
|
-
if(j===void 0||d(j)){if(U[Q]=G[M],d(j))N++}}
|
|
128
|
-
return N};
|
|
129
|
-
var Lj=50,Bj=(U={})=>{let{adapter:G,initialItems:Y,initialTotal:N,storage:M,placeholder:Q,pageSize:j=Lj,onStateChange:D,onItemsLoaded:T,onItemsEvicted:z}=U,W=$j({...M,onEvict:(J,$)=>{z?.(J),O()}}),y=null,L=()=>{if(!y)y=Yj(Q);
|
|
130
|
-
return y},b=new Map,C=!1,u,H=!0,Z,F=[],V=new Map,O=()=>{D?.(e())},h=()=>{b.clear();
|
|
131
|
-
let J=W.getLoadedRanges();
|
|
132
|
-
for(let $ of J)for(let P=$.start;
|
|
133
|
-
P<=$.end;
|
|
134
|
-
P++){let E=W.get(P);
|
|
135
|
-
if(E&&!d(E))b.set(E.id,P)}},w=(J,$)=>{if(!d($))b.set($.id,J)},k=(J)=>{b.delete(J)},A=(J,$)=>{return`${J}-${$}`},f=()=>W.getTotal(),I=()=>W.getCachedCount(),r=()=>C,t=()=>H,e=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:C,pendingRanges:F,error:u,hasMore:H,cursor:Z}),Zj=()=>W,q=()=>L(),X=(J)=>{let $=W.get(J);
|
|
136
|
-
if($!==void 0)return $;
|
|
137
|
-
if(J>=0&&J<W.getTotal())return L().generate(J);
|
|
138
|
-
return},B=(J)=>{let $=b.get(J);
|
|
139
|
-
if($===void 0)return;
|
|
140
|
-
return W.get($)},K=(J)=>{return b.get(J)??-1},_=(J)=>{let $=W.get(J);
|
|
141
|
-
return $!==void 0&&!d($)},l=(J,$)=>{let P=[],E=W.getTotal(),g=0,x=0;
|
|
142
|
-
W.touchChunksForRange(J,Math.min($,E-1));
|
|
143
|
-
for(let c=J;
|
|
144
|
-
c<=$&&c<E;
|
|
145
|
-
c++){let s=W.get(c);
|
|
146
|
-
if(s!==void 0)P.push(s),g++;
|
|
147
|
-
else P.push(L().generate(c)),x++}
|
|
148
|
-
return P},R=(J)=>{W.setTotal(J),H=W.getCachedCount()<J,O()},p=(J,$=0,P)=>{if(y&&!y.hasAnalyzedStructure()&&J.length>0)y.analyzeStructure(J);
|
|
149
|
-
for(let E=0;
|
|
150
|
-
E<J.length;
|
|
151
|
-
E++){let g=J[E];
|
|
152
|
-
if(g!==void 0){let x=$+E;
|
|
153
|
-
W.set(x,g),w(x,g)}}
|
|
154
|
-
if(P!==void 0)W.setTotal(P);
|
|
155
|
-
else if($+J.length>W.getTotal())W.setTotal($+J.length);
|
|
156
|
-
H=W.getCachedCount()<W.getTotal(),T?.(J,$,W.getTotal()),O()},i=(J,$)=>{let P=b.get(J);
|
|
157
|
-
if(P===void 0)return!1;
|
|
158
|
-
let E=W.get(P);
|
|
159
|
-
if(!E)return!1;
|
|
160
|
-
let g={...E,...$};
|
|
161
|
-
if(W.set(P,g),$.id!==void 0&&$.id!==J)k(J),w(P,g);
|
|
162
|
-
return O(),!0},qj=(J)=>{let $=b.get(J);
|
|
163
|
-
if($===void 0)return!1;
|
|
164
|
-
W.delete($),k(J);
|
|
165
|
-
let P=W.getTotal();
|
|
166
|
-
if(P>0)W.setTotal(P-1);
|
|
167
|
-
return O(),!0},Jj=async(J,$)=>{if(!G)return;
|
|
168
|
-
let P=A(J,$);
|
|
169
|
-
if(V.has(P))return;
|
|
170
|
-
let E=W.getLoadedRanges(),g=Xj({start:J,end:$},E,W.chunkSize);
|
|
171
|
-
if(g.length===0)return;
|
|
172
|
-
let x=W.chunkSize,c=[];
|
|
173
|
-
for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);
|
|
174
|
-
for(let S=a;
|
|
175
|
-
S<=n;
|
|
176
|
-
S++){let o=S*x,m=o+x-1,Qj=A(o,m);
|
|
177
|
-
if(!c.some((Wj)=>Wj.start===o)&&!V.has(Qj))c.push({start:o,end:m})}}
|
|
178
|
-
let s=[];
|
|
179
|
-
for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);
|
|
180
|
-
for(let S=a;
|
|
181
|
-
S<=n;
|
|
182
|
-
S++){let o=S*x,m=o+x-1,Qj=A(o,m);
|
|
183
|
-
if(V.has(Qj)){let Wj=V.get(Qj);
|
|
184
|
-
if(!s.includes(Wj))s.push(Wj)}}}
|
|
185
|
-
for(let v of c){let a=A(v.start,v.end),n=(async()=>{F.push(v),C=!0,u=void 0,O();
|
|
186
|
-
try{let S=v.end-v.start+1,o={offset:v.start,limit:S,cursor:void 0},m=await G.read(o);
|
|
187
|
-
if(p(m.items,v.start,m.total),m.cursor)Z=m.cursor;
|
|
188
|
-
if(m.hasMore!==void 0)H=m.hasMore;
|
|
189
|
-
else if(m.total!==void 0)H=W.getCachedCount()<m.total}
|
|
190
|
-
catch(S){u=S instanceof Error?S:Error(String(S))}
|
|
191
|
-
finally{V.delete(a),F=F.filter((S)=>S.start!==v.start||S.end!==v.end),C=V.size>0,O()}})();
|
|
192
|
-
V.set(a,n),s.push(n)}
|
|
193
|
-
await Promise.all(s)},Aj=async(J,$)=>{if(W.isRangeLoaded(J,$))return;
|
|
194
|
-
await Jj(J,$)},Dj=async()=>{if(!G)return;
|
|
195
|
-
await Jj(0,j-1)},Oj=async()=>{if(!G||C||!H)return!1;
|
|
196
|
-
let J=W.getCachedCount(),$=W.getTotal(),P=J,E=Math.min(P+j-1,$>0?$-1:P+j-1);
|
|
197
|
-
if(P>=$&&$>0)return H=!1,!1;
|
|
198
|
-
return await Jj(P,E),W.getCachedCount()>J},zj=async()=>{if(W.clear(),b.clear(),y)y.clear();
|
|
199
|
-
Z=void 0,H=!0,u=void 0,O(),await Dj()},Hj=(J,$)=>{if(W.evictDistant(J,$)>0)h()},yj=()=>{W.clear(),b.clear(),Z=void 0,u=void 0,F=[],C=!1,O()},bj=()=>{if(W.reset(),b.clear(),y)y.clear();
|
|
200
|
-
Z=void 0,H=!0,u=void 0,F=[],C=!1,O()};
|
|
201
|
-
if(Y&&Y.length>0)p(Y,0,N??Y.length);
|
|
202
|
-
else if(N!==void 0)W.setTotal(N);
|
|
203
|
-
return{getState:e,getTotal:f,getCached:I,getIsLoading:r,getHasMore:t,getStorage:Zj,getPlaceholders:q,getItem:X,getItemById:B,getIndexById:K,isItemLoaded:_,getItemsInRange:l,setTotal:R,setItems:p,updateItem:i,removeItem:qj,loadRange:Jj,ensureRange:Aj,loadInitial:Dj,loadMore:Oj,reload:zj,evictDistant:Hj,clear:yj,reset:bj}};
|
|
204
|
-
var Vj=(U,G,Y,N,M,Q)=>{if(N===0||G===0)return Q.start=0,Q.end=-1,Q;
|
|
205
|
-
let j=Y.indexAtOffset(U),D=Y.indexAtOffset(U+G);
|
|
206
|
-
if(D<N-1)D++;
|
|
207
|
-
return Q.start=Math.max(0,j),Q.end=Math.min(N-1,Math.max(0,D)),Q},wj=(U,G,Y,N)=>{if(Y===0)return N.start=0,N.end=-1,N;
|
|
208
|
-
return N.start=Math.max(0,U.start-G),N.end=Math.min(Y-1,U.end+G),N};
|
|
209
|
-
var Gj=(U,G,Y,N,M,Q=Vj)=>{return Q(U.scrollTop,U.containerHeight,G,Y,M,U.visibleRange),wj(U.visibleRange,N,Y,U.renderRange),U.totalHeight=M.virtualHeight,U.actualHeight=M.actualHeight,U.isCompressed=M.isCompressed,U.compressionRatio=M.ratio,U};
|
|
210
|
-
var Kj=200,jj=50;
|
|
211
|
-
var Mj=15,Pj=2,_j=50;
|
|
212
|
-
var Tj=(U)=>{let{adapter:G,loading:Y}=U,N=Y?.cancelThreshold??Mj,M=Y?.preloadThreshold??Pj,Q=Y?.preloadAhead??_j;
|
|
213
|
-
return{name:"withData",priority:20,methods:["reload"],setup(j){let{emitter:D}=j,T=j.config.reverse,z=j.config.overscan,W=Bj({adapter:G,pageSize:jj,onStateChange:()=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.updateCompressionMode(),j.state.viewportState=Gj(j.state.viewportState,j.heightCache,j.getVirtualTotal(),z,j.getCachedCompression()),j.updateContentSize(j.state.viewportState.totalHeight),j.renderIfNeeded()},onItemsLoaded:(Z,F,V)=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.forceRender(),D.emit("load:end",{items:Z,total:V})}});
|
|
214
|
-
j.replaceDataManager(W);
|
|
215
|
-
let y=null,L=null,b=0,C=()=>{if(L){let Z=L;
|
|
216
|
-
L=null,j.dataManager.ensureRange(Z.start,Z.end).catch((F)=>{D.emit("error",{error:F,context:"ensureRange"})})}};
|
|
217
|
-
j.afterScroll.push((Z,F)=>{if(j.state.isDestroyed)return;
|
|
218
|
-
let V=j.scrollController.getVelocity(),h=j.scrollController.isTracking()&&V<=N;
|
|
219
|
-
if(L&&b>N&&V<=N){let A=L;
|
|
220
|
-
L=null,j.dataManager.ensureRange(A.start,A.end).catch((f)=>{D.emit("error",{error:f,context:"ensureRange"})})}
|
|
221
|
-
if(b=V,h&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(T){if(Z<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((A)=>{D.emit("error",{error:A,context:"loadMore"})})}
|
|
222
|
-
else if(j.state.viewportState.totalHeight-Z-j.state.viewportState.containerHeight<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((f)=>{D.emit("error",{error:f,context:"loadMore"})})}
|
|
223
|
-
let{renderRange:w}=j.state.viewportState;
|
|
224
|
-
if(!y||w.start!==y.start||w.end!==y.end)if(y={start:w.start,end:w.end},h){L=null;
|
|
225
|
-
let{start:A,end:f}=w,I=j.getVirtualTotal();
|
|
226
|
-
if(V>M)if(F==="down")f=Math.min(w.end+Q,I-1);
|
|
227
|
-
else A=Math.max(w.start-Q,0);
|
|
228
|
-
j.dataManager.ensureRange(A,f).catch((r)=>{D.emit("error",{error:r,context:"ensureRange"})})}
|
|
229
|
-
else L={start:w.start,end:w.end}});
|
|
230
|
-
let u=200,H=null;
|
|
231
|
-
j.afterScroll.push((Z,F)=>{if(H!==null)clearTimeout(H);
|
|
232
|
-
H=setTimeout(()=>{H=null,C()},u)}),j.destroyHandlers.push(()=>{if(H!==null)clearTimeout(H),H=null}),D.on("load:start",()=>{j.dom.root.setAttribute("aria-busy","true")}),D.on("load:end",()=>{j.dom.root.removeAttribute("aria-busy")}),j.methods.set("reload",async()=>{await j.dataManager.reload()}),D.emit("load:start",{offset:0,limit:jj}),j.dataManager.loadInitial().catch((Z)=>{D.emit("error",{error:Z,context:"loadInitial"})})}}};
|
|
233
|
-
export{Tj as withData,Ej as replacePlaceholders,Uj as mergeRanges,d as isPlaceholderItem,Nj as filterPlaceholders,$j as createSparseStorage,Yj as createPlaceholderManager,Bj as createDataManager,Fj as countRealItems,Xj as calculateMissingRanges};
|
|
1
|
+
var $j=(U={})=>{let{chunkSize:G=100,maxCachedItems:Y=5000,evictionBuffer:N=200,onEvict:M}=U,Q=new Map,j=0,D=0,T=(q)=>{let X=Q.get(q);if(!X)X={items:Array(G),count:0,lastAccess:Date.now()},Q.set(q,X);else X.lastAccess=Date.now();return X},z=(q)=>{return Math.floor(q/G)},W=(q)=>{return q%G},y=()=>j,L=(q)=>{j=q},b=(q)=>{if(q<0||q>=j)return;let X=z(q),B=Q.get(X);if(!B)return;return B.items[W(q)]},C=(q)=>{if(q<0||q>=j)return!1;let X=z(q),B=Q.get(X);if(!B)return!1;return B.items[W(q)]!==void 0},u=(q,X)=>{let B=z(q),K=T(B),_=W(q),l=K.items[_]===void 0;if(K.items[_]=X,l)K.count++,D++;if(q>=j)j=q+1},H=(q,X)=>{for(let B=0;B<X.length;B++){let K=X[B];if(K!==void 0)u(q+B,K)}},Z=(q)=>{if(q<0||q>=j)return!1;let X=z(q),B=Q.get(X);if(!B)return!1;let K=W(q);if(B.items[K]===void 0)return!1;if(B.items[K]=void 0,B.count--,D--,B.count===0)Q.delete(X);return!0},F=(q,X)=>{let B=[];for(let K=q;K<=X&&K<j;K++)B.push(b(K));return B},V=(q,X)=>{for(let B=q;B<=X&&B<j;B++)if(!C(B))return!1;return!0},O=()=>{let q=[],X=null,B=Array.from(Q.keys()).sort((K,_)=>K-_);for(let K of B){let _=Q.get(K);if(!_)continue;let l=K*G;for(let R=0;R<G;R++){let p=l+R;if(p>=j)break;if(_.items[R]!==void 0)if(X===null)X={start:p,end:p};else if(p===X.end+1)X.end=p;else q.push(X),X={start:p,end:p};else if(X!==null)q.push(X),X=null}}if(X!==null)q.push(X);return q},h=(q,X)=>{let B=[],K=null;for(let _=q;_<=X&&_<j;_++)if(!C(_))if(K===null)K={start:_,end:_};else K.end=_;else if(K!==null)B.push(K),K=null;if(K!==null)B.push(K);return B},w=(q)=>{return Q.has(q)},k=(q)=>{let X=Q.get(q);if(X)X.lastAccess=Date.now()},A=(q,X)=>{if(q>X||Q.size===0)return;let B=Date.now(),K=z(Math.max(0,q)),_=z(Math.min(j-1,X));for(let l=K;l<=_;l++){let R=Q.get(l);if(R)R.lastAccess=B}},f=(q,X)=>{if(D<=Y)return 0;let B=Math.max(0,q-N),K=Math.min(j-1,X+N),_=z(B),l=z(K),R=0,p=[];for(let[i,qj]of Q)if(i<_||i>l)R+=qj.count,p.push(i),D-=qj.count,Q.delete(i);if(R>0&&M)M(R,p);return R},I=()=>{if(D<=Y)return 0;let q=Array.from(Q.entries()).sort(([,K],[,_])=>K.lastAccess-_.lastAccess),X=0,B=[];for(let[K,_]of q){if(D<=Y)break;X+=_.count,D-=_.count,B.push(K),Q.delete(K)}if(X>0&&M)M(X,B);return X},r=()=>{return{totalItems:j,cachedItems:D,cachedChunks:Q.size,chunkSize:G,maxCachedItems:Y,memoryEfficiency:j>0?1-D/j:1}},t=()=>D,e=()=>{Q.clear(),D=0};return{chunkSize:G,maxCachedItems:Y,getTotal:y,setTotal:L,get:b,has:C,set:u,setRange:H,delete:Z,getRange:F,isRangeLoaded:V,getLoadedRanges:O,findUnloadedRanges:h,getChunkIndex:z,isChunkLoaded:w,touchChunk:k,touchChunksForRange:A,evictDistant:f,evictToLimit:I,getStats:r,getCachedCount:t,clear:e,reset:()=>{e(),j=0}}},Uj=(U)=>{if(U.length===0)return[];let G=[...U].sort((N,M)=>N.start-M.start),Y=[{...G[0]}];for(let N=1;N<G.length;N++){let M=G[N],Q=Y[Y.length-1];if(M.start<=Q.end+1)Q.end=Math.max(Q.end,M.end);else Y.push({...M})}return Y},Xj=(U,G,Y)=>{let N=Math.floor(U.start/Y)*Y,M=Math.ceil((U.end+1)/Y)*Y-1,Q={start:N,end:M};if(G.length===0)return[Q];let j=[],D=Uj(G),T=Q.start;for(let z of D){if(z.end<T)continue;if(z.start>Q.end)break;if(z.start>T)j.push({start:T,end:Math.min(z.start-1,Q.end)});if(T=z.end+1,T>Q.end)break}if(T<=Q.end)j.push({start:T,end:Q.end});return j};var Yj=(U={})=>{let{enabled:G=!0,maskCharacter:Y="█",randomVariance:N=!0,maxSampleSize:M=20,customGenerator:Q}=U,j=null,D=!1,T=0,z=(Z)=>{if(!G||D||Z.length===0)return;let F=new Map,V=new Map,O=Math.min(Z.length,M);for(let h=0;h<O;h++){let w=Z[h];if(!w||typeof w!=="object")continue;for(let[k,A]of Object.entries(w)){if(k.startsWith("_")||k==="id")continue;if(!V.has(k))V.set(k,{lengths:[],types:new Set});let f=V.get(k),I=Array.isArray(A)?"array":typeof A;if(f.types.add(I),typeof A==="string")f.lengths.push(A.length);else if(A!==null&&A!==void 0)f.lengths.push(String(A).length)}}for(let[h,w]of V){if(w.lengths.length===0)continue;let k=Math.min(...w.lengths),A=Math.max(...w.lengths),f=Math.round(w.lengths.reduce((r,t)=>r+t,0)/w.lengths.length),I="string";if(w.types.has("number")&&w.types.size===1)I="number";else if(w.types.has("boolean")&&w.types.size===1)I="boolean";else if(w.types.has("array"))I="array";else if(w.types.has("object")&&!w.types.has("string"))I="object";F.set(h,{minLength:k,maxLength:A,avgLength:f,type:I})}j=F,D=!0},W=()=>D,y=(Z)=>{let F=Z.avgLength;if(N&&Z.minLength!==Z.maxLength){if(F=Math.floor(Math.random()*(Z.maxLength-Z.minLength+1)+Z.minLength),Math.random()<0.3)F=Math.max(1,F+Math.floor(Math.random()*3)-1)}return Y.repeat(Math.max(1,F))},L=(Z)=>{if(Q)return{...Q(Z),["_isPlaceholder"]:!0};let F={id:`__placeholder_${T++}`,["_isPlaceholder"]:!0,_index:Z};if(!j||j.size===0)return F.label=Y.repeat(12),F;for(let[V,O]of j)switch(O.type){case"string":F[V]=y(O);break;case"number":F[V]=0;break;case"boolean":F[V]=!1;break;case"array":F[V]=[];break;case"object":F[V]={};break;default:F[V]=y(O)}return F};return{analyzeStructure:z,hasAnalyzedStructure:W,generate:L,generateRange:(Z,F)=>{let V=[];for(let O=Z;O<=F;O++)V.push(L(O));return V},isPlaceholder:(Z)=>{if(!Z||typeof Z!=="object")return!1;return Z._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{j=null,D=!1,T=0}}},d=(U)=>{if(!U||typeof U!=="object")return!1;return U._isPlaceholder===!0},Nj=(U)=>{return U.filter((G)=>!d(G))},Fj=(U)=>{let G=0;for(let Y of U)if(Y!==void 0&&!d(Y))G++;return G},Ej=(U,G,Y)=>{let N=0;for(let M=0;M<G.length;M++){let Q=Y+M,j=U[Q];if(j===void 0||d(j)){if(U[Q]=G[M],d(j))N++}}return N};var Lj=50,Bj=(U={})=>{let{adapter:G,initialItems:Y,initialTotal:N,storage:M,placeholder:Q,pageSize:j=Lj,onStateChange:D,onItemsLoaded:T,onItemsEvicted:z}=U,W=$j({...M,onEvict:(J,$)=>{z?.(J),O()}}),y=null,L=()=>{if(!y)y=Yj(Q);return y},b=new Map,C=!1,u,H=!0,Z,F=[],V=new Map,O=()=>{D?.(e())},h=()=>{b.clear();let J=W.getLoadedRanges();for(let $ of J)for(let P=$.start;P<=$.end;P++){let E=W.get(P);if(E&&!d(E))b.set(E.id,P)}},w=(J,$)=>{if(!d($))b.set($.id,J)},k=(J)=>{b.delete(J)},A=(J,$)=>{return`${J}-${$}`},f=()=>W.getTotal(),I=()=>W.getCachedCount(),r=()=>C,t=()=>H,e=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:C,pendingRanges:F,error:u,hasMore:H,cursor:Z}),Zj=()=>W,q=()=>L(),X=(J)=>{let $=W.get(J);if($!==void 0)return $;if(J>=0&&J<W.getTotal())return L().generate(J);return},B=(J)=>{let $=b.get(J);if($===void 0)return;return W.get($)},K=(J)=>{return b.get(J)??-1},_=(J)=>{let $=W.get(J);return $!==void 0&&!d($)},l=(J,$)=>{let P=[],E=W.getTotal(),g=0,x=0;W.touchChunksForRange(J,Math.min($,E-1));for(let c=J;c<=$&&c<E;c++){let s=W.get(c);if(s!==void 0)P.push(s),g++;else P.push(L().generate(c)),x++}return P},R=(J)=>{W.setTotal(J),H=W.getCachedCount()<J,O()},p=(J,$=0,P)=>{if(y&&!y.hasAnalyzedStructure()&&J.length>0)y.analyzeStructure(J);for(let E=0;E<J.length;E++){let g=J[E];if(g!==void 0){let x=$+E;W.set(x,g),w(x,g)}}if(P!==void 0)W.setTotal(P);else if($+J.length>W.getTotal())W.setTotal($+J.length);H=W.getCachedCount()<W.getTotal(),T?.(J,$,W.getTotal()),O()},i=(J,$)=>{let P=b.get(J);if(P===void 0)return!1;let E=W.get(P);if(!E)return!1;let g={...E,...$};if(W.set(P,g),$.id!==void 0&&$.id!==J)k(J),w(P,g);return O(),!0},qj=(J)=>{let $=b.get(J);if($===void 0)return!1;W.delete($),k(J);let P=W.getTotal();if(P>0)W.setTotal(P-1);return O(),!0},Jj=async(J,$)=>{if(!G)return;let P=A(J,$);if(V.has(P))return;let E=W.getLoadedRanges(),g=Xj({start:J,end:$},E,W.chunkSize);if(g.length===0)return;let x=W.chunkSize,c=[];for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);for(let S=a;S<=n;S++){let o=S*x,m=o+x-1,Qj=A(o,m);if(!c.some((Wj)=>Wj.start===o)&&!V.has(Qj))c.push({start:o,end:m})}}let s=[];for(let v of g){let a=Math.floor(v.start/x),n=Math.floor(v.end/x);for(let S=a;S<=n;S++){let o=S*x,m=o+x-1,Qj=A(o,m);if(V.has(Qj)){let Wj=V.get(Qj);if(!s.includes(Wj))s.push(Wj)}}}for(let v of c){let a=A(v.start,v.end),n=(async()=>{F.push(v),C=!0,u=void 0,O();try{let S=v.end-v.start+1,o={offset:v.start,limit:S,cursor:void 0},m=await G.read(o);if(p(m.items,v.start,m.total),m.cursor)Z=m.cursor;if(m.hasMore!==void 0)H=m.hasMore;else if(m.total!==void 0)H=W.getCachedCount()<m.total}catch(S){u=S instanceof Error?S:Error(String(S))}finally{V.delete(a),F=F.filter((S)=>S.start!==v.start||S.end!==v.end),C=V.size>0,O()}})();V.set(a,n),s.push(n)}await Promise.all(s)},Aj=async(J,$)=>{if(W.isRangeLoaded(J,$))return;await Jj(J,$)},Dj=async()=>{if(!G)return;await Jj(0,j-1)},Oj=async()=>{if(!G||C||!H)return!1;let J=W.getCachedCount(),$=W.getTotal(),P=J,E=Math.min(P+j-1,$>0?$-1:P+j-1);if(P>=$&&$>0)return H=!1,!1;return await Jj(P,E),W.getCachedCount()>J},zj=async()=>{if(W.clear(),b.clear(),y)y.clear();Z=void 0,H=!0,u=void 0,O(),await Dj()},Hj=(J,$)=>{if(W.evictDistant(J,$)>0)h()},yj=()=>{W.clear(),b.clear(),Z=void 0,u=void 0,F=[],C=!1,O()},bj=()=>{if(W.reset(),b.clear(),y)y.clear();Z=void 0,H=!0,u=void 0,F=[],C=!1,O()};if(Y&&Y.length>0)p(Y,0,N??Y.length);else if(N!==void 0)W.setTotal(N);return{getState:e,getTotal:f,getCached:I,getIsLoading:r,getHasMore:t,getStorage:Zj,getPlaceholders:q,getItem:X,getItemById:B,getIndexById:K,isItemLoaded:_,getItemsInRange:l,setTotal:R,setItems:p,updateItem:i,removeItem:qj,loadRange:Jj,ensureRange:Aj,loadInitial:Dj,loadMore:Oj,reload:zj,evictDistant:Hj,clear:yj,reset:bj}};var Vj=(U,G,Y,N,M,Q)=>{if(N===0||G===0)return Q.start=0,Q.end=-1,Q;let j=Y.indexAtOffset(U),D=Y.indexAtOffset(U+G);if(D<N-1)D++;return Q.start=Math.max(0,j),Q.end=Math.min(N-1,Math.max(0,D)),Q},wj=(U,G,Y,N)=>{if(Y===0)return N.start=0,N.end=-1,N;return N.start=Math.max(0,U.start-G),N.end=Math.min(Y-1,U.end+G),N};var Gj=(U,G,Y,N,M,Q=Vj)=>{return Q(U.scrollTop,U.containerHeight,G,Y,M,U.visibleRange),wj(U.visibleRange,N,Y,U.renderRange),U.totalHeight=M.virtualHeight,U.actualHeight=M.actualHeight,U.isCompressed=M.isCompressed,U.compressionRatio=M.ratio,U};var Kj=200,jj=50;var Mj=15,Pj=2,_j=50;var Tj=(U)=>{let{adapter:G,loading:Y}=U,N=Y?.cancelThreshold??Mj,M=Y?.preloadThreshold??Pj,Q=Y?.preloadAhead??_j;return{name:"withData",priority:20,methods:["reload"],setup(j){let{emitter:D}=j,T=j.config.reverse,z=j.config.overscan,W=Bj({adapter:G,pageSize:jj,onStateChange:()=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.updateCompressionMode(),j.state.viewportState=Gj(j.state.viewportState,j.heightCache,j.getVirtualTotal(),z,j.getCachedCompression()),j.updateContentSize(j.state.viewportState.totalHeight),j.renderIfNeeded()},onItemsLoaded:(Z,F,V)=>{if(j.state.isInitialized)j.heightCache.rebuild(j.getVirtualTotal()),j.forceRender(),D.emit("load:end",{items:Z,total:V})}});j.replaceDataManager(W);let y=null,L=null,b=0,C=()=>{if(L){let Z=L;L=null,j.dataManager.ensureRange(Z.start,Z.end).catch((F)=>{D.emit("error",{error:F,context:"ensureRange"})})}};j.afterScroll.push((Z,F)=>{if(j.state.isDestroyed)return;let V=j.scrollController.getVelocity(),h=j.scrollController.isTracking()&&V<=N;if(L&&b>N&&V<=N){let A=L;L=null,j.dataManager.ensureRange(A.start,A.end).catch((f)=>{D.emit("error",{error:f,context:"ensureRange"})})}if(b=V,h&&!j.dataManager.getIsLoading()&&j.dataManager.getHasMore()){if(T){if(Z<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((A)=>{D.emit("error",{error:A,context:"loadMore"})})}else if(j.state.viewportState.totalHeight-Z-j.state.viewportState.containerHeight<Kj)D.emit("load:start",{offset:j.dataManager.getCached(),limit:jj}),j.dataManager.loadMore().catch((f)=>{D.emit("error",{error:f,context:"loadMore"})})}let{renderRange:w}=j.state.viewportState;if(!y||w.start!==y.start||w.end!==y.end)if(y={start:w.start,end:w.end},h){L=null;let{start:A,end:f}=w,I=j.getVirtualTotal();if(V>M)if(F==="down")f=Math.min(w.end+Q,I-1);else A=Math.max(w.start-Q,0);j.dataManager.ensureRange(A,f).catch((r)=>{D.emit("error",{error:r,context:"ensureRange"})})}else L={start:w.start,end:w.end}});let u=200,H=null;j.afterScroll.push((Z,F)=>{if(H!==null)clearTimeout(H);H=setTimeout(()=>{H=null,C()},u)}),j.destroyHandlers.push(()=>{if(H!==null)clearTimeout(H),H=null}),D.on("load:start",()=>{j.dom.root.setAttribute("aria-busy","true")}),D.on("load:end",()=>{j.dom.root.removeAttribute("aria-busy")}),j.methods.set("reload",async()=>{await j.dataManager.reload()}),D.emit("load:start",{offset:0,limit:jj}),j.dataManager.loadInitial().catch((Z)=>{D.emit("error",{error:Z,context:"loadInitial"})})}}};export{Tj as withData,Ej as replacePlaceholders,Uj as mergeRanges,d as isPlaceholderItem,Nj as filterPlaceholders,$j as createSparseStorage,Yj as createPlaceholderManager,Bj as createDataManager,Fj as countRealItems,Xj as calculateMissingRanges};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Data Domain
|
|
3
|
+
* Data management, sparse storage, and placeholder generation
|
|
4
|
+
*/
|
|
5
|
+
export { withAsync, type DataPluginConfig } from "./plugin";
|
|
6
|
+
export { createDataManager, mergeRanges, calculateMissingRanges, isPlaceholderItem, filterPlaceholders, countRealItems, type DataManager, type DataManagerConfig, type DataState, } from "./manager";
|
|
7
|
+
export { createSparseStorage, type SparseStorage, type SparseStorageConfig, type SparseStorageStats, } from "./sparse";
|
|
8
|
+
export { createPlaceholderManager, replacePlaceholders, type PlaceholderManager, type PlaceholderConfig, } from "./placeholder";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/async/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5D,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Data Management
|
|
3
|
+
* Handles data with sparse storage for million+ item support
|
|
4
|
+
*/
|
|
5
|
+
import type { VListItem, VListAdapter, Range } from "../../types";
|
|
6
|
+
import { type SparseStorage, type SparseStorageConfig } from "./sparse";
|
|
7
|
+
import { type PlaceholderConfig, type PlaceholderManager } from "./placeholder";
|
|
8
|
+
/** Data manager configuration */
|
|
9
|
+
export interface DataManagerConfig<T extends VListItem = VListItem> {
|
|
10
|
+
/** Async data adapter */
|
|
11
|
+
adapter?: VListAdapter<T>;
|
|
12
|
+
/** Initial items (optional) */
|
|
13
|
+
initialItems?: T[];
|
|
14
|
+
/** Initial total count (if known) */
|
|
15
|
+
initialTotal?: number;
|
|
16
|
+
/** Sparse storage configuration */
|
|
17
|
+
storage?: SparseStorageConfig;
|
|
18
|
+
/** Placeholder configuration */
|
|
19
|
+
placeholder?: PlaceholderConfig;
|
|
20
|
+
/** Items per load request (default: 50) */
|
|
21
|
+
pageSize?: number;
|
|
22
|
+
/** Callback when state changes */
|
|
23
|
+
onStateChange?: (state: DataState<T>) => void;
|
|
24
|
+
/** Callback when items are loaded */
|
|
25
|
+
onItemsLoaded?: (items: T[], offset: number, total: number) => void;
|
|
26
|
+
/** Callback when items are evicted */
|
|
27
|
+
onItemsEvicted?: (count: number) => void;
|
|
28
|
+
}
|
|
29
|
+
/** Data state */
|
|
30
|
+
export interface DataState<_T extends VListItem = VListItem> {
|
|
31
|
+
/** Total items (declared, may be larger than loaded) */
|
|
32
|
+
total: number;
|
|
33
|
+
/** Number of items in memory */
|
|
34
|
+
cached: number;
|
|
35
|
+
/** Whether data is loading */
|
|
36
|
+
isLoading: boolean;
|
|
37
|
+
/** Pending load ranges */
|
|
38
|
+
pendingRanges: Range[];
|
|
39
|
+
/** Error from last operation */
|
|
40
|
+
error: Error | undefined;
|
|
41
|
+
/** Whether more items exist */
|
|
42
|
+
hasMore: boolean;
|
|
43
|
+
/** Current cursor (for cursor pagination) */
|
|
44
|
+
cursor: string | undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Data manager instance */
|
|
47
|
+
export interface DataManager<T extends VListItem = VListItem> {
|
|
48
|
+
/** Get current state */
|
|
49
|
+
getState: () => DataState<T>;
|
|
50
|
+
/** Get total item count (direct getter, no allocation) */
|
|
51
|
+
getTotal: () => number;
|
|
52
|
+
/** Get cached item count (direct getter, no allocation) */
|
|
53
|
+
getCached: () => number;
|
|
54
|
+
/** Check if currently loading (direct getter, no allocation) */
|
|
55
|
+
getIsLoading: () => boolean;
|
|
56
|
+
/** Check if more items available (direct getter, no allocation) */
|
|
57
|
+
getHasMore: () => boolean;
|
|
58
|
+
/** Get sparse storage */
|
|
59
|
+
getStorage: () => SparseStorage<T>;
|
|
60
|
+
/** Get placeholder manager */
|
|
61
|
+
getPlaceholders: () => PlaceholderManager<T>;
|
|
62
|
+
/** Get item at index (may return placeholder if not loaded) */
|
|
63
|
+
getItem: (index: number) => T | undefined;
|
|
64
|
+
/** Get item by ID */
|
|
65
|
+
getItemById: (id: string | number) => T | undefined;
|
|
66
|
+
/** Get index by ID (-1 if not found) */
|
|
67
|
+
getIndexById: (id: string | number) => number;
|
|
68
|
+
/** Check if item at index is loaded (not placeholder) */
|
|
69
|
+
isItemLoaded: (index: number) => boolean;
|
|
70
|
+
/** Get items in range (includes placeholders for unloaded) */
|
|
71
|
+
getItemsInRange: (start: number, end: number) => T[];
|
|
72
|
+
/** Set total item count */
|
|
73
|
+
setTotal: (total: number) => void;
|
|
74
|
+
/** Set items at offset */
|
|
75
|
+
setItems: (items: T[], offset?: number, total?: number) => void;
|
|
76
|
+
/** Update item by ID */
|
|
77
|
+
updateItem: (id: string | number, updates: Partial<T>) => boolean;
|
|
78
|
+
/** Remove item by ID */
|
|
79
|
+
removeItem: (id: string | number) => boolean;
|
|
80
|
+
/** Load items for a range */
|
|
81
|
+
loadRange: (start: number, end: number) => Promise<void>;
|
|
82
|
+
/** Ensure range is loaded (no-op if already loaded) */
|
|
83
|
+
ensureRange: (start: number, end: number) => Promise<void>;
|
|
84
|
+
/** Load initial data */
|
|
85
|
+
loadInitial: () => Promise<void>;
|
|
86
|
+
/** Load more items (infinite scroll) */
|
|
87
|
+
loadMore: () => Promise<boolean>;
|
|
88
|
+
/** Reload all data */
|
|
89
|
+
reload: () => Promise<void>;
|
|
90
|
+
/** Evict items far from visible range */
|
|
91
|
+
evictDistant: (visibleStart: number, visibleEnd: number) => void;
|
|
92
|
+
/** Clear all data */
|
|
93
|
+
clear: () => void;
|
|
94
|
+
/** Reset to initial state */
|
|
95
|
+
reset: () => void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a data manager with sparse storage support
|
|
99
|
+
*/
|
|
100
|
+
export declare const createDataManager: <T extends VListItem = VListItem>(config?: DataManagerConfig<T>) => DataManager<T>;
|
|
101
|
+
export { mergeRanges, calculateMissingRanges } from "./sparse";
|
|
102
|
+
export { isPlaceholderItem, filterPlaceholders, countRealItems, } from "./placeholder";
|
|
103
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/features/async/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Placeholder System
|
|
3
|
+
* Smart placeholder generation for loading states
|
|
4
|
+
*
|
|
5
|
+
* Key features:
|
|
6
|
+
* - Analyzes loaded data to generate realistic placeholders
|
|
7
|
+
* - Supports masked text with configurable character
|
|
8
|
+
* - Random length variance for natural appearance
|
|
9
|
+
* - Efficient placeholder detection
|
|
10
|
+
*/
|
|
11
|
+
import type { VListItem } from "../../types";
|
|
12
|
+
/** Placeholder configuration */
|
|
13
|
+
export interface PlaceholderConfig {
|
|
14
|
+
/** Enable placeholder generation (default: true) */
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
/** Character used for masking text (default: '█') */
|
|
17
|
+
maskCharacter?: string;
|
|
18
|
+
/** Add random variance to text lengths (default: true) */
|
|
19
|
+
randomVariance?: boolean;
|
|
20
|
+
/** Maximum items to sample for structure analysis (default: 20) */
|
|
21
|
+
maxSampleSize?: number;
|
|
22
|
+
/** Custom placeholder generator */
|
|
23
|
+
customGenerator?: (index: number) => VListItem;
|
|
24
|
+
}
|
|
25
|
+
/** Placeholder manager instance */
|
|
26
|
+
export interface PlaceholderManager<T extends VListItem = VListItem> {
|
|
27
|
+
/** Analyze data structure from sample items */
|
|
28
|
+
analyzeStructure: (items: T[]) => void;
|
|
29
|
+
/** Check if structure has been analyzed */
|
|
30
|
+
hasAnalyzedStructure: () => boolean;
|
|
31
|
+
/** Generate a single placeholder item */
|
|
32
|
+
generate: (index: number) => T;
|
|
33
|
+
/** Generate multiple placeholder items */
|
|
34
|
+
generateRange: (start: number, end: number) => T[];
|
|
35
|
+
/** Check if an item is a placeholder */
|
|
36
|
+
isPlaceholder: (item: unknown) => boolean;
|
|
37
|
+
/** Get the placeholder flag key */
|
|
38
|
+
getPlaceholderKey: () => string;
|
|
39
|
+
/** Clear analyzed structure */
|
|
40
|
+
clear: () => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a placeholder manager
|
|
44
|
+
*/
|
|
45
|
+
export declare const createPlaceholderManager: <T extends VListItem = VListItem>(config?: PlaceholderConfig) => PlaceholderManager<T>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if an item is a placeholder (standalone function)
|
|
48
|
+
*/
|
|
49
|
+
export declare const isPlaceholderItem: (item: unknown) => boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Filter out placeholder items from an array
|
|
52
|
+
*/
|
|
53
|
+
export declare const filterPlaceholders: <T extends VListItem>(items: T[]) => T[];
|
|
54
|
+
/**
|
|
55
|
+
* Count non-placeholder items in an array
|
|
56
|
+
*/
|
|
57
|
+
export declare const countRealItems: <T extends VListItem>(items: (T | undefined)[]) => number;
|
|
58
|
+
/**
|
|
59
|
+
* Replace placeholders in a sparse array with real items
|
|
60
|
+
*/
|
|
61
|
+
export declare const replacePlaceholders: <T extends VListItem>(target: (T | undefined)[], items: T[], offset: number) => number;
|
|
62
|
+
//# sourceMappingURL=placeholder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder.d.ts","sourceRoot":"","sources":["../../../src/features/async/placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,mCAAmC;IACnC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CAChD;AAiBD,mCAAmC;AACnC,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACjE,+CAA+C;IAC/C,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAEvC,2CAA2C;IAC3C,oBAAoB,EAAE,MAAM,OAAO,CAAC;IAEpC,yCAAyC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;IAE/B,0CAA0C;IAC1C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;IAEnD,wCAAwC;IACxC,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IAE1C,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAEhC,+BAA+B;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAeD;;GAEG;AACH,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,SAAS,GAAG,SAAS,EACtE,SAAQ,iBAAsB,KAC7B,kBAAkB,CAAC,CAAC,CA+OtB,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM,OAAO,KAAG,OAMjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,SAAS,EAAE,OAAO,CAAC,EAAE,KAAG,CAAC,EAErE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,SAAS,EAChD,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,KACvB,MAUF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,SAAS,EACrD,QAAQ,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,EACzB,OAAO,CAAC,EAAE,EACV,QAAQ,MAAM,KACb,MAiBF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/data - Builder Plugin
|
|
3
|
+
* Wraps async data loading with sparse storage into a VListPlugin for the composable builder.
|
|
4
|
+
*
|
|
5
|
+
* Priority: 20 (runs before scrollbar and selection, after grid/groups)
|
|
6
|
+
*
|
|
7
|
+
* What it wires:
|
|
8
|
+
* - Replaces data manager — swaps the simple in-memory store with sparse storage
|
|
9
|
+
* - Scroll boundary detection — triggers loadMore() near the bottom (or top in reverse)
|
|
10
|
+
* - Velocity-aware loading — skips data fetching during fast scrolling, loads on idle
|
|
11
|
+
* - Placeholder generation — creates skeleton items for unloaded ranges
|
|
12
|
+
* - Request deduplication — prevents duplicate fetches for the same range
|
|
13
|
+
* - Idle handler — loads any pending ranges when scrolling stops
|
|
14
|
+
*
|
|
15
|
+
* Added methods: reload
|
|
16
|
+
* Added events: load:start, load:end, error
|
|
17
|
+
*/
|
|
18
|
+
import type { VListItem, VListAdapter } from "../../types";
|
|
19
|
+
import type { VListPlugin } from "../../builder/types";
|
|
20
|
+
/** Data plugin configuration */
|
|
21
|
+
export interface DataPluginConfig<T extends VListItem = VListItem> {
|
|
22
|
+
/** Async data source (required) */
|
|
23
|
+
adapter: VListAdapter<T>;
|
|
24
|
+
/** Loading behavior configuration */
|
|
25
|
+
loading?: {
|
|
26
|
+
/** Velocity threshold above which data loading is skipped (px/ms). Default: 25 */
|
|
27
|
+
cancelThreshold?: number;
|
|
28
|
+
/** Velocity threshold for preloading (px/ms). Default: 2 */
|
|
29
|
+
preloadThreshold?: number;
|
|
30
|
+
/** Number of items to preload in scroll direction. Default: 50 */
|
|
31
|
+
preloadAhead?: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a data plugin for the builder.
|
|
36
|
+
*
|
|
37
|
+
* Adds async data loading with sparse storage, placeholders, and infinite scroll.
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { vlist } from 'vlist/builder'
|
|
41
|
+
* import { withData } from 'vlist/data'
|
|
42
|
+
*
|
|
43
|
+
* const list = vlist({
|
|
44
|
+
* container: '#app',
|
|
45
|
+
* item: { height: 48, template: renderItem },
|
|
46
|
+
* })
|
|
47
|
+
* .use(withData({
|
|
48
|
+
* adapter: {
|
|
49
|
+
* read: async ({ offset, limit }) => {
|
|
50
|
+
* const res = await fetch(`/api/items?offset=${offset}&limit=${limit}`)
|
|
51
|
+
* const data = await res.json()
|
|
52
|
+
* return { items: data.items, total: data.total, hasMore: data.hasMore }
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* }))
|
|
56
|
+
* .build()
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare const withAsync: <T extends VListItem = VListItem>(config: DataPluginConfig<T>) => VListPlugin<T>;
|
|
60
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/features/async/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAS,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAC;AAiBvE,gCAAgC;AAChC,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC/D,mCAAmC;IACnC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAEzB,qCAAqC;IACrC,OAAO,CAAC,EAAE;QACR,kFAAkF;QAClF,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,4DAA4D;QAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAE1B,kEAAkE;QAClE,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,GAAG,SAAS,EACvD,QAAQ,gBAAgB,CAAC,CAAC,CAAC,KAC1B,WAAW,CAAC,CAAC,CAiOf,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Sparse Storage
|
|
3
|
+
* Efficient storage for million+ item virtual lists
|
|
4
|
+
*/
|
|
5
|
+
import type { VListItem, Range } from "../../types";
|
|
6
|
+
/** Configuration for sparse storage */
|
|
7
|
+
export interface SparseStorageConfig {
|
|
8
|
+
/** Number of items per chunk (default: 100) */
|
|
9
|
+
chunkSize?: number;
|
|
10
|
+
/** Maximum items to keep in memory (default: 5000) */
|
|
11
|
+
maxCachedItems?: number;
|
|
12
|
+
/** Extra items to keep around visible range during eviction (default: 200) */
|
|
13
|
+
evictionBuffer?: number;
|
|
14
|
+
/** Callback when items are evicted */
|
|
15
|
+
onEvict?: (evictedCount: number, evictedRanges: number[]) => void;
|
|
16
|
+
}
|
|
17
|
+
/** Storage statistics */
|
|
18
|
+
export interface SparseStorageStats {
|
|
19
|
+
/** Total items declared (may be larger than loaded) */
|
|
20
|
+
totalItems: number;
|
|
21
|
+
/** Number of items currently in memory */
|
|
22
|
+
cachedItems: number;
|
|
23
|
+
/** Number of chunks in memory */
|
|
24
|
+
cachedChunks: number;
|
|
25
|
+
/** Chunk size */
|
|
26
|
+
chunkSize: number;
|
|
27
|
+
/** Maximum cached items allowed */
|
|
28
|
+
maxCachedItems: number;
|
|
29
|
+
/** Memory efficiency (cachedItems / totalItems) */
|
|
30
|
+
memoryEfficiency: number;
|
|
31
|
+
}
|
|
32
|
+
/** Sparse storage instance */
|
|
33
|
+
export interface SparseStorage<T extends VListItem = VListItem> {
|
|
34
|
+
readonly chunkSize: number;
|
|
35
|
+
readonly maxCachedItems: number;
|
|
36
|
+
/** Get total item count */
|
|
37
|
+
getTotal: () => number;
|
|
38
|
+
/** Set total item count (for virtual scrolling height) */
|
|
39
|
+
setTotal: (total: number) => void;
|
|
40
|
+
/** Get item at index (undefined if not loaded) */
|
|
41
|
+
get: (index: number) => T | undefined;
|
|
42
|
+
/** Check if item at index is loaded */
|
|
43
|
+
has: (index: number) => boolean;
|
|
44
|
+
/** Set item at index */
|
|
45
|
+
set: (index: number, item: T) => void;
|
|
46
|
+
/** Set multiple items starting at offset */
|
|
47
|
+
setRange: (offset: number, items: T[]) => void;
|
|
48
|
+
/** Delete item at index */
|
|
49
|
+
delete: (index: number) => boolean;
|
|
50
|
+
/** Get items in range (includes undefined for unloaded) */
|
|
51
|
+
getRange: (start: number, end: number) => (T | undefined)[];
|
|
52
|
+
/** Check if range is fully loaded */
|
|
53
|
+
isRangeLoaded: (start: number, end: number) => boolean;
|
|
54
|
+
/** Get loaded ranges */
|
|
55
|
+
getLoadedRanges: () => Range[];
|
|
56
|
+
/** Find unloaded ranges within a given range */
|
|
57
|
+
findUnloadedRanges: (start: number, end: number) => Range[];
|
|
58
|
+
/** Get chunk index for item index */
|
|
59
|
+
getChunkIndex: (itemIndex: number) => number;
|
|
60
|
+
/** Check if chunk is loaded */
|
|
61
|
+
isChunkLoaded: (chunkIndex: number) => boolean;
|
|
62
|
+
/** Mark chunk as accessed (for LRU) */
|
|
63
|
+
touchChunk: (chunkIndex: number) => void;
|
|
64
|
+
/** Mark all chunks in a range as accessed with a single Date.now() call */
|
|
65
|
+
touchChunksForRange: (start: number, end: number) => void;
|
|
66
|
+
/** Evict chunks far from visible range */
|
|
67
|
+
evictDistant: (visibleStart: number, visibleEnd: number) => number;
|
|
68
|
+
/** Force eviction to meet memory limit */
|
|
69
|
+
evictToLimit: () => number;
|
|
70
|
+
/** Get storage statistics */
|
|
71
|
+
getStats: () => SparseStorageStats;
|
|
72
|
+
/** Get cached item count */
|
|
73
|
+
getCachedCount: () => number;
|
|
74
|
+
/** Clear all data */
|
|
75
|
+
clear: () => void;
|
|
76
|
+
/** Reset to initial state */
|
|
77
|
+
reset: () => void;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create sparse storage for efficient large list handling
|
|
81
|
+
*/
|
|
82
|
+
export declare const createSparseStorage: <T extends VListItem = VListItem>(config?: SparseStorageConfig) => SparseStorage<T>;
|
|
83
|
+
/**
|
|
84
|
+
* Merge adjacent/overlapping ranges
|
|
85
|
+
*/
|
|
86
|
+
export declare const mergeRanges: (ranges: Range[]) => Range[];
|
|
87
|
+
/**
|
|
88
|
+
* Calculate ranges that need to be loaded
|
|
89
|
+
*/
|
|
90
|
+
export declare const calculateMissingRanges: (needed: Range, loaded: Range[], chunkSize: number) => Range[];
|
|
91
|
+
//# sourceMappingURL=sparse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparse.d.ts","sourceRoot":"","sources":["../../../src/features/async/sparse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Grid Domain
|
|
3
|
+
* 2D grid/card layout with virtualized rows
|
|
4
|
+
*/
|
|
5
|
+
export { withGrid, type GridPluginConfig } from "./plugin";
|
|
6
|
+
export { createGridLayout } from "./layout";
|
|
7
|
+
export { createGridRenderer, type GridRenderer } from "./renderer";
|
|
8
|
+
export type { GridConfig, GridLayout, GridPosition, ItemRange } from "./types";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/grid/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAGnE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
|