virtua 0.4.5 → 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 +8 -8
- package/lib/core/cache.d.ts +2 -1
- package/lib/core/store.d.ts +8 -7
- package/lib/core/types.d.ts +1 -1
- package/lib/index.d.ts +1 -8
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +1 -1
- package/lib/index.mjs.map +1 -1
- package/lib/react/VGrid.d.ts +15 -10
- package/lib/react/VList.d.ts +25 -25
- package/lib/react/{Window.d.ts → Viewport.d.ts} +5 -5
- package/lib/react/WVList.d.ts +26 -26
- package/lib/react/index.d.ts +8 -0
- package/lib/react/useSelector.d.ts +6 -1
- package/lib/react/utils.d.ts +1 -0
- package/package.json +16 -16
package/README.md
CHANGED
|
@@ -139,7 +139,7 @@ export const App = () => {
|
|
|
139
139
|
|
|
140
140
|
### React Server Components (RSC) support
|
|
141
141
|
|
|
142
|
-
This library is marked as a Client Component. You can render RSC as children of VList.
|
|
142
|
+
This library is marked as a Client Component. You can render RSC as children of VList or WVList.
|
|
143
143
|
|
|
144
144
|
```tsx
|
|
145
145
|
// page.tsx in App Router of Next.js
|
|
@@ -169,13 +169,6 @@ And see [examples](./stories) for more usages.
|
|
|
169
169
|
|
|
170
170
|
## Comparison
|
|
171
171
|
|
|
172
|
-
### Benchmarks
|
|
173
|
-
|
|
174
|
-
WIP
|
|
175
|
-
|
|
176
|
-
Basically by design, this library uses children instead of render prop like other virtual scrollers.
|
|
177
|
-
It reduces rerender during scrolling with [caching element instances](https://github.com/facebook/react/issues/8669#issuecomment-270032204). However it may make component's mount slower if you display million items.
|
|
178
|
-
|
|
179
172
|
### Features
|
|
180
173
|
|
|
181
174
|
| | [virtua](https://github.com/inokawa/virtua) | [react-virtuoso](https://github.com/petyosi/react-virtuoso) | [react-window](https://github.com/bvaughn/react-window) | [react-virtualized](https://github.com/bvaughn/react-virtualized) | [@tanstack/react-virtual](https://github.com/TanStack/virtual) | [react-cool-virtual](https://github.com/wellyshen/react-cool-virtual) |
|
|
@@ -203,6 +196,13 @@ It reduces rerender during scrolling with [caching element instances](https://gi
|
|
|
203
196
|
- 🟠 - Supported but partial, limited or requires some user custom code
|
|
204
197
|
- ❌ - Not officially supported
|
|
205
198
|
|
|
199
|
+
### Benchmarks
|
|
200
|
+
|
|
201
|
+
WIP
|
|
202
|
+
|
|
203
|
+
Basically by design, this library uses children instead of render prop like other virtual scrollers.
|
|
204
|
+
It reduces rerender during scrolling with [caching element instances](https://github.com/facebook/react/issues/8669#issuecomment-270032204). However it may make component's mount slower if you display million items.
|
|
205
|
+
|
|
206
206
|
## Contribute
|
|
207
207
|
|
|
208
208
|
All contributions are welcome.
|
package/lib/core/cache.d.ts
CHANGED
|
@@ -16,4 +16,5 @@ export declare const findStartIndexWithOffset: (cache: Cache, offset: number, pr
|
|
|
16
16
|
export { findIndex as findEndIndex };
|
|
17
17
|
export declare const hasUnmeasuredItemsInRange: (cache: Cache, startIndex: number, endIndex: number) => boolean;
|
|
18
18
|
export declare const estimateDefaultItemSize: (cache: Writeable<Cache>) => void;
|
|
19
|
-
export declare const
|
|
19
|
+
export declare const initCache: (length: number, itemSize: number) => Cache;
|
|
20
|
+
export declare const updateCache: (cache: Writeable<Cache>, length: number) => void;
|
package/lib/core/store.d.ts
CHANGED
|
@@ -5,18 +5,19 @@ type ItemsRange = Readonly<[startIndex: number, endIndex: number]>;
|
|
|
5
5
|
export declare const SCROLL_IDLE = 0;
|
|
6
6
|
export declare const SCROLL_DOWN = 1;
|
|
7
7
|
export declare const SCROLL_UP = 2;
|
|
8
|
-
export declare const SCROLL_MANUAL = 3;
|
|
9
|
-
type ScrollDirection = typeof SCROLL_IDLE | typeof SCROLL_DOWN | typeof SCROLL_UP | typeof SCROLL_MANUAL;
|
|
10
8
|
export declare const ACTION_ITEM_RESIZE = 1;
|
|
11
9
|
export declare const ACTION_WINDOW_RESIZE = 2;
|
|
12
10
|
export declare const ACTION_SCROLL = 3;
|
|
13
|
-
export declare const
|
|
11
|
+
export declare const ACTION_BEFORE_MANUAL_SCROLL = 4;
|
|
14
12
|
export declare const ACTION_SCROLL_END = 5;
|
|
15
|
-
|
|
13
|
+
export declare const ACTION_MANUAL_SCROLL = 6;
|
|
14
|
+
type Actions = [type: typeof ACTION_ITEM_RESIZE, entries: ItemResize[]] | [type: typeof ACTION_WINDOW_RESIZE, size: number] | [type: typeof ACTION_SCROLL, offset: number] | [type: typeof ACTION_BEFORE_MANUAL_SCROLL, offset: number] | [type: typeof ACTION_SCROLL_END, dummy?: void] | [type: typeof ACTION_MANUAL_SCROLL, dummy?: void];
|
|
16
15
|
type Subscriber = (sync?: boolean) => void;
|
|
17
16
|
export declare const UPDATE_SCROLL = 1;
|
|
18
17
|
export declare const UPDATE_SIZE = 2;
|
|
19
18
|
export declare const UPDATE_JUMP = 4;
|
|
19
|
+
export declare const UPDATE_IS_SCROLLING = 8;
|
|
20
|
+
export declare const UPDATE_SCROLL_WITH_EVENT = 16;
|
|
20
21
|
export type VirtualStore = {
|
|
21
22
|
_getCache(): CacheSnapshot;
|
|
22
23
|
_getRange(): ItemsRange;
|
|
@@ -31,12 +32,12 @@ export type VirtualStore = {
|
|
|
31
32
|
_getScrollSize(): number;
|
|
32
33
|
_getCorrectedScrollSize(): number;
|
|
33
34
|
_getJumpCount(): number;
|
|
34
|
-
_flushJump(): ScrollJump
|
|
35
|
+
_flushJump(): ScrollJump;
|
|
35
36
|
_getItemIndexForScrollTo(offset: number): number;
|
|
36
37
|
_subscribe(target: number, cb: Subscriber): () => void;
|
|
37
38
|
_update(...action: Actions): void;
|
|
38
|
-
|
|
39
|
+
_getIsScrolling(): boolean;
|
|
39
40
|
_updateCacheLength(length: number): void;
|
|
40
41
|
};
|
|
41
|
-
export declare const createVirtualStore: (elementsCount: number, itemSize: number | undefined, initialItemCount: number | undefined, isReverse: boolean,
|
|
42
|
+
export declare const createVirtualStore: (elementsCount: number, itemSize: number | undefined, initialItemCount: number | undefined, isReverse: boolean, cacheSnapshot?: CacheSnapshot) => VirtualStore;
|
|
42
43
|
export {};
|
package/lib/core/types.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ declare const cacheSymbol: unique symbol;
|
|
|
8
8
|
/**
|
|
9
9
|
* Serializable cache snapshot.
|
|
10
10
|
*
|
|
11
|
-
* **This is not intended to be modified by users. And it is not guaranteed to work if you pass it to the different version
|
|
11
|
+
* **This is not intended to be modified by users. And it is not guaranteed to work if you pass it to the different version of this package.**
|
|
12
12
|
*/
|
|
13
13
|
export interface CacheSnapshot {
|
|
14
14
|
[cacheSymbol]: never;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
1
|
export type { CacheSnapshot } from "./core/types";
|
|
2
|
-
export
|
|
3
|
-
export type { VListProps, VListHandle, ScrollMode } from "./react/VList";
|
|
4
|
-
export { VGrid } from "./react/VGrid";
|
|
5
|
-
export type { VGridProps, VGridHandle, CustomCellComponent, CustomCellComponentProps, } from "./react/VGrid";
|
|
6
|
-
export { WVList } from "./react/WVList";
|
|
7
|
-
export type { WVListProps, WVListHandle } from "./react/WVList";
|
|
8
|
-
export type { WindowComponentAttributes, CustomWindowComponent, CustomWindowComponentProps, } from "./react/Window";
|
|
9
|
-
export type { CustomItemComponent, CustomItemComponentProps, } from "./react/ListItem";
|
|
2
|
+
export * from "./react";
|
package/lib/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom");const r=Math.min,o=Math.max,i=Math.abs,s=Date.now,l=Object.values,c=setTimeout,u=e=>null!=e,a=(e,t)=>{let n;const r=()=>{u(n)&&clearTimeout(n)},o=()=>{r(),n=c((()=>{n=null,e()}),t)};return o.t=r,o},d=e=>{let t,n;return(...r)=>(t||(t=!0,n=e(...r)),n)},h=-1,f=(e,t)=>{const n=e.o[t];return n===h?e.i:n},_=(e,t,n)=>{if(!e.l)return 0;if(e.u>=t)return n?e.h[t]+f(e,t):e.h[t];let r=e.u,o=e.h[r];for(;r<=t&&(e.h[r]=o,r!==t||n);)o+=f(e,r),r++;return e.u=t,o},g=(e,t)=>_(e,t),w=(e,t,n)=>{let i=0;if(n>=0)for(;t<e.l-1;){const r=f(e,t++);if((i+=r)>=n){i-r/2>=n&&t--;break}}else for(;t>0;){const r=f(e,--t);if((i-=r)<=n){i+r/2<n&&t++;break}}return r(o(t,0),e.l-1)},m=(e,t,n,r)=>w(e,n,t-r),v=(e,t,n)=>{const o=[],i=[];for(let t=0;t<e;t++){const e=n&&n.o[t];if(o.push(u(e)?e:h),0===t)i.push(0);else{const e=n&&n.h[t];i.push(u(e)?e:h)}}return{i:n?n.i:t,l:e,u:n?r(n.u,e-1):0,o,h:i}},p=e=>e.reduce(((e,[t])=>e+t),0),S=(e,t)=>t.map((([t,n])=>[n-f(e,t),t])),b=(e,t,n=0,s,l,c,a)=>{var d;const b=!t,z=t||40;let I=z*o(n-1,0),x=0,R=0,y=0,k=null!==(d=c)&&void 0!==d?d:v(e,z),O=0,C=!1,T=[0,n];const M=new Set,H=()=>(e=>_(e,e.l-1,!0))(k),J=()=>H()-I,W=e=>{const t=O;return O=e,0!==O&&(0===t&&(1===O||2===O)||void 0)};return{_:()=>JSON.parse(JSON.stringify(k)),g(){const[e,t]=T,n=g(k,e),r=m(k,x,e,n),o=w(k,r,I);return e===r&&t===o?T:T=[r,o]},m:e=>k.o[e]===h,v:e=>((e,t,n)=>{for(let r=t;r<=n;r++)if(e.o[r]===h)return!0;return!1})(k,o(0,e-2),r(k.l-1,e+2)),p(e){const t=g(k,e);return s?t+o(0,I-H()):t},S:e=>f(k,e),I:()=>k.l,R:()=>x,k:J,O:()=>I,C:H,T:()=>o(H(),I),M:()=>R,H(){const e=y;return y=0,e},J:e=>m(k,e,0,0),W(e,t){const n=[e,t];return M.add(n),()=>{M.delete(n)}},L(e,t){let n,s,c=0;switch(e){case 1:{const e=t.filter((([e,t])=>k.o[e]!==t));if(!e.length)break;let o=0;if(2===O)o=p(S(k,e));else if(3===O){const t=S(k,e),[n]=T;0===x||(o=x>J()-1.5?p(t):p(t.filter((([,e])=>e<n))))}o&&(y=o,R++,c+=4);let i=!1;e.forEach((([e,t])=>{((e,t,n)=>{const o=e.o[t]===h;return e.o[t]=n,e.u=r(t,e.u),o})(k,e,t)&&(i=!0)})),b&&i&&!x&&(e=>{const t=e.o.filter((e=>e!==h)),n=t[0];e.i=t.every((e=>e===n))?n:(e=>{const t=[...e].sort(((e,t)=>e-t)),n=e.length/2|0;return t.length%2==0?(t[n-1]+t[n])/2:t[n]})(t)})(k),c+=2,C=n=!0;break}case 2:I!==t&&(I=t,c=2);break;case 3:case 4:if(x===t)break;if(3===e){const e=(()=>{const e=C;return C=!1,e})();0!==O&&e||3===O||(s=W(x>t?2:1)),n=i(x-t)>I}x=o(0,r(J(),t)),c=1;break;case 5:s=W(t?3:0)}c&&(M.forEach((([e,t])=>{c&e&&t(n)})),3===e&&a&&a(x)),u(s)&&l(s)},$:()=>O,q(e){k.l!==e&&(k=v(e,z,k))}}},z="undefined"!=typeof window?t.useLayoutEffect:t.useEffect,I="current",x=e=>{const n=[];return t.Children.forEach(e,(e=>{u(e)&&"boolean"!=typeof e&&n.push(e)})),n},R=e=>{const n=t.useRef(e);return z((()=>{n[I]=e}),[e]),n},y=(e,r,o)=>{const[i,s]=t.useState(r),l=R(r);if(t.useLayoutEffect((()=>{let t;t=r===e.g?3:r===e.T?2:r===e.M?4:2;const o=()=>{s((()=>l[I]()))};return e.W(t,(e=>{e?n.flushSync(o):o()}))}),[]),o){const e=r();i!==e&&s(e)}return i},k=/*#__PURE__*/d((e=>{const t="scrollLeft",n=e[t];e[t]=1;const r=e[t]<1;return e[t]=n,r})),O=(e,t,n)=>(()=>{let r=s()-50;return(...o)=>{const i=s();r+50<i&&(r=i,(r=>{if(0!==e.$()&&!r.ctrlKey&&(t?r.deltaX:r.deltaY)){const t=e.R();t>0&&t<e.k()&&n()}})(...o))}})(),C=(e,t,n)=>{let i,s;const l=t?"scrollLeft":"scrollTop",u=()=>i?t?i.scrollWidth:i.scrollHeight:0,d=(r,o)=>t&&n?k(i)||o?-r:e.k()-r:r,h=async(t,n)=>{if(!i)return;const o=()=>r(n(),u()-e.O());for(;e.L(4,o()),e.v(t);){s&&s[1]();const t=e.W(2,(()=>{s&&s[0]()}));try{await new Promise(((e,t)=>{let n=!1;const r=()=>{n||(n=!0,e(),s=void 0)};s=[r,t],c(r,250)}))}catch(e){return}finally{t()}}i[l]=d(o()),e.L(5,!0)};return{j(n){i=n;const r=()=>{e.L(3,d(n[l]))},o=a((()=>{r(),e.L(5,!1)}),150),s=()=>{r(),o()},c=O(e,t,o);return n.addEventListener("scroll",s),n.addEventListener("wheel",c,{passive:!0}),()=>{n.removeEventListener("scroll",s),n.removeEventListener("wheel",c),o.t()}},B:u,D(t){t=o(t,0),h(e.J(t),(()=>t))},N(t){t=o(r(t,e.I()-1),0),h(t,(()=>e.p(t)))},U:e=>{i&&(i[l]+=d(e,!0))}}},T=(e,t)=>{const n=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop";return{j(o){let i=!1;const s=(e,t)=>{const n=t+e[r],o=e.offsetParent;return e!==document.body&&o?s(o,n):n},l=()=>{i&&e.L(3,window[n]-s(o,0))},c=a((()=>{l(),e.L(5,!1)}),150),u=()=>{l(),c()},d=O(e,t,c),h=new IntersectionObserver((([e])=>{i=e.isIntersecting}));return h.observe(o),window.addEventListener("scroll",u),window.addEventListener("wheel",d,{passive:!0}),()=>{h.disconnect(),window.removeEventListener("scroll",u),window.removeEventListener("wheel",d),c.t()}},U:e=>{window.scrollBy(t?e:0,t?0:e)}}},M=e=>{const n=t.useRef();return n[I]||(n[I]=e())},H=(e,t)=>{let n;const r=t?"width":"height",o=new WeakMap,i=d((()=>new ResizeObserver((t=>{const i=[];for(const{target:s,contentRect:l}of t)if(s===n)e.L(2,l[r]);else{const e=o.get(s);u(e)&&i.push([e,l[r]])}i.length&&e.L(1,i)}))));return{A(e){n=e;const t=i();return t.observe(e),()=>{t.disconnect()}},F(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},J=(e,t)=>{const n=t?"width":"height",r=t?"innerWidth":"innerHeight",o=new WeakMap,i=d((()=>new ResizeObserver((t=>{const r=[];for(const{target:e,contentRect:i}of t){const t=o.get(e);u(t)&&r.push([t,i[n]])}r.length&&e.L(1,r)}))));return{A(){const t=()=>{e.L(2,window[r])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),i().disconnect()}},F(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},W=(e,t)=>{let n;const r="height",i="width",s=new WeakMap,l=new Set,c=new Set,u=new Map,a=(e,t)=>`${e}-${t}`,h=d((()=>new ResizeObserver((d=>{const h=new Set,f=new Set;for(const{target:o,contentRect:l}of d)if(o===n)e.L(2,l[r]),t.L(2,l[i]);else{const e=s.get(o);if(e){const[t,n]=e,o=a(t,n),s=u.get(o),c=[l[r],l[i]];let d,_;s?(s[0]!==c[0]&&(d=!0),s[1]!==c[1]&&(_=!0)):d=_=!0,d&&h.add(t),_&&f.add(n),(d||_)&&u.set(o,c)}}if(h.size){const t=[];h.forEach((e=>{let n=0;c.forEach((t=>{const r=u.get(a(e,t));r&&(n=o(n,r[0]))})),n&&t.push([e,n])})),e.L(1,t)}if(f.size){const e=[];f.forEach((t=>{let n=0;l.forEach((e=>{const r=u.get(a(e,t));r&&(n=o(n,r[1]))})),n&&e.push([t,n])})),t.L(1,e)}}))));return{A(e){n=e;const t=h();return t.observe(e),()=>{t.disconnect()}},F(e,t,n){const r=h();return s.set(e,[t,n]),l.add(t),c.add(n),r.observe(e),()=>{s.delete(e),r.unobserve(e)}}}},L=t.forwardRef((({children:n,attrs:r,width:o,height:i,scrolling:s},l)=>e.jsx("div",{ref:l,...r,children:e.jsx("div",{style:t.useMemo((()=>({position:"relative",visibility:"hidden",width:null!=o?o:"100%",height:null!=i?i:"100%",pointerEvents:s?"none":"auto"})),[o,i,s]),children:n})}))),E=t.memo((({P:n,V:r,X:o,Y:i,G:s,K:l,Z:c})=>{const u=t.useRef(null),a=y(o,(()=>o.p(i)),!0),d=y(o,(()=>o.m(i)),!0);return z((()=>r.F(u[I],i)),[i]),e.jsx(s,{ref:u,style:t.useMemo((()=>{const e=c?"right":"left",t={margin:0,padding:0,position:"absolute",[l?"height":"width"]:"100%",[l?"top":e]:0,[l?e:"top"]:a,visibility:d?"hidden":"visible"};return l&&(t.display="flex"),t}),[a,d]),children:n})})),$=t.forwardRef((({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:a,mode:d,cache:h,element:f=L,itemElement:_="div",onScroll:g,onScrollStop:w,onRangeChange:m,...v},p)=>{const S=t.useMemo((()=>x(n)),[n]),k=S.length,O=R(g),T=R(w),[J,W]=t.useState(!1),[$,q,j,B,D]=M((()=>{const e=!!a,t="rtl"===d,n=b(k,s,c,"reverse"===d,(e=>{W(e),e||T[I]&&T[I]()}),h,(e=>{O[I]&&O[I](e)}));return[n,H(n,e),C(n,e,t),e,t]}));$.q(k);const[N,U]=y($,$.g),A=y($,$.M),F=y($,$.T,!0),P=t.useRef(null);z((()=>{const e=P[I],t=q.A(e),n=j.j(e);return()=>{t(),n()}}),[]),z((()=>{const e=$.H();e&&j.U(e)}),[A]),t.useEffect((()=>{m&&m({start:N,end:U,count:k})}),[N,U]),t.useImperativeHandle(p,(()=>({get cache(){return $._()},get scrollOffset(){return $.R()},get scrollSize(){return j.B()},get viewportSize(){return $.O()},scrollToIndex:j.N,scrollTo:j.D,scrollBy(e){j.D($.R()+e)}})),[]);const V=o(N-i,0),X=r(U+i,k-1),Y=t.useMemo((()=>{const t=[];for(let n=V;n<=X;n++){const r=S[n];u(r)&&t.push(e.jsx(E,{V:q,X:$,Y:n,G:_,P:r,K:B,Z:D},r.key||n))}return t}),[S,V,X]);return e.jsx(f,{ref:P,width:B?F:void 0,height:B?void 0:F,scrolling:J,attrs:t.useMemo((()=>({...v,style:{overflow:B?"auto hidden":"hidden auto",display:B?"inline-block":"block",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...v.style}})),l(v)),children:Y})})),q=(e,t)=>`${e}-${t}`,j=t.memo((({P:n,V:r,ee:o,te:i,ne:s,re:l,G:c,Z:u})=>{const a=t.useRef(null),d=y(o,(()=>o.p(s)),!0),h=y(i,(()=>i.p(l)),!0),f=y(o,(()=>o.m(s)),!0),_=y(i,(()=>i.m(l)),!0),g=y(o,(()=>o.S(s)),!0),w=y(i,(()=>i.S(l)),!0);return z((()=>r.F(a[I],s,l)),[l,s]),e.jsx(c,{ref:a,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:d,[u?"right":"left"]:h,visibility:f||_?"hidden":"visible",minHeight:g,minWidth:w})),[d,h,w,g,f,_]),children:n})})),B=t.forwardRef((({children:n,row:i,col:s,cellHeight:c=40,cellWidth:u=100,overscan:a=2,initialRowCount:d,initialColCount:h,rtl:f,element:_=L,cellElement:g="div",...w},m)=>{const[v,p]=t.useState(!1),[S,x]=t.useState(!1),[R,k,O,T,H,J]=M((()=>{const e=!!f,t=b(i,c,d,!1,p),n=b(s,u,h,!1,x);return[t,n,W(t,n),C(t,!1,e),C(n,!0,e),e]}));R.q(i),k.q(s);const[E,$]=y(R,R.g),[B,D]=y(k,k.g),N=y(R,R.M),U=y(k,k.M),A=y(R,R.T,!0),F=y(k,k.T,!0),P=t.useRef(null);z((()=>{const e=P[I],t=O.A(e),n=T.j(e),r=H.j(e);return()=>{t(),n(),r()}}),[]),z((()=>{const e=R.H();e&&T.U(e)}),[N]),z((()=>{const e=k.H();e&&H.U(e)}),[U]),t.useImperativeHandle(m,(()=>({get scrollOffset(){return[k.R(),R.R()]},get scrollSize(){return[H.B(),T.B()]},get viewportSize(){return[k.O(),R.O()]},scrollToIndex(e,t){H.N(e),T.N(t)},scrollTo(e,t){H.D(e),T.D(t)},scrollBy(e,t){H.D(k.R()+e),T.D(R.R()+t)}})),[]);const V=t.useMemo((()=>{const e=new Map;return(t,r)=>{let o=e.get(q(t,r));return o||e.set(q(t,r),o=n({rowIndex:t,colIndex:r})),o}}),[n]),X=o(E-a,0),Y=r($+a,i-1),G=o(B-a,0),K=r(D+a,s-1),Q=t.useMemo((()=>{const t=[];for(let n=X;n<=Y;n++)for(let r=G;r<=K;r++)t.push(e.jsx(j,{V:O,ee:R,te:k,ne:n,re:r,G:g,P:V(n,r),Z:J},q(n,r)));return t}),[V,X,Y,G,K]);return e.jsx(_,{ref:P,width:F,height:A,scrolling:v||S,attrs:t.useMemo((()=>({...w,style:{overflow:"auto",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...w.style}})),l(w)),children:Q})})),D=t.forwardRef((({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:a,cache:d,element:h=L,itemElement:f="div",onScrollStop:_,onRangeChange:g,...w},m)=>{const v=t.useMemo((()=>x(n)),[n]),p=v.length,S=R(_),[k,O]=t.useState(!1),[C,H,W,$]=M((()=>{const e=!!a,t=b(p,s,c,!1,(e=>{O(e),e||S[I]&&S[I]()}),d);return[t,J(t,e),T(t,e),e]}));C.q(p);const[q,j]=y(C,C.g),B=y(C,C.M),D=y(C,C.T,!0),N=t.useRef(null);z((()=>{const e=N[I],t=H.A(e),n=W.j(e);return()=>{t(),n()}}),[]),z((()=>{const e=C.H();e&&W.U(e)}),[B]),t.useEffect((()=>{g&&g({start:q,end:j,count:p})}),[q,j]),t.useImperativeHandle(m,(()=>({get cache(){return C._()}})),[]);const U=o(q-i,0),A=r(j+i,p-1),F=t.useMemo((()=>{const t=[];for(let n=U;n<=A;n++){const r=v[n];u(r)&&t.push(e.jsx(E,{V:H,X:C,Y:n,G:f,P:r,K:$,Z:!1},r.key||n))}return t}),[v,U,A]);return e.jsx(h,{ref:N,width:$?D:void 0,height:$?void 0:D,scrolling:k,attrs:t.useMemo((()=>({...w,style:{overflow:"visible",display:$?"inline-block":"block",width:$?"auto":"100%",height:$?"100%":"auto",padding:0,margin:0,...w.style}})),l(w)),children:F})}));exports.VGrid=B,exports.VList=$,exports.WVList=D;
|
|
2
|
+
var e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom");const r=Math.min,o=Math.max,i=Math.abs,s=Date.now,l=Object.values,c=setTimeout,u=e=>null!=e,a=(e,t)=>{let n;const r=()=>{u(n)&&clearTimeout(n)},o=()=>{r(),n=c((()=>{n=null,e()}),t)};return o.t=r,o},d=e=>{let t,n;return(...r)=>(t||(t=!0,n=e(...r)),n)},h=-1,f=(e,t)=>{const n=e.o[t];return n===h?e.i:n},_=(e,t,n)=>{if(!e.l)return 0;if(e.u>=t)return n?e.h[t]+f(e,t):e.h[t];let r=e.u,o=e.h[r];for(;r<=t&&(e.h[r]=o,r!==t||n);)o+=f(e,r),r++;return e.u=t,o},g=(e,t)=>_(e,t),w=(e,t,n)=>{let i=0;if(n>=0)for(;t<e.l-1;){const r=f(e,t++);if((i+=r)>=n){i-r/2>=n&&t--;break}}else for(;t>0;){const r=f(e,--t);if((i-=r)<=n){i+r/2<n&&t++;break}}return r(o(t,0),e.l-1)},m=(e,t,n,r)=>w(e,n,t-r),p=(e,t)=>t.reduce(((t,[n,r])=>t+(r-f(e,n))),0),v=(e,t,n=0,s,l)=>{const c=!t,a=t||40,d=l||((e,t)=>{const n=[],r=[];for(let t=0;t<e;t++)n.push(h),r.push(0===t?0:h);return{i:t,l:e,u:0,o:n,h:r}})(e,a);let v=a*o(n-1,0),S=0,b=0,I=0,z=0,R=!1,x=!1,y=[0,n];const k=new Set,O=()=>(e=>_(e,e.l-1,!0))(d),C=()=>O()-v,T=e=>{const t=z;return z=e,z!==t&&(0===z||0===t)};return{_:()=>JSON.parse(JSON.stringify(d)),g(){const[e,t]=y,n=g(d,e),r=m(d,S,e,n),o=w(d,r,v);return e===r&&t===o?y:y=[r,o]},m:e=>d.o[e]===h,p:e=>((e,t,n)=>{for(let r=t;r<=n;r++)if(e.o[r]===h)return!0;return!1})(d,o(0,e-2),r(d.l-1,e+2)),v(e){const t=g(d,e);return s?t+o(0,v-O()):t},S:e=>f(d,e),I:()=>d.l,R:()=>S,k:C,O:()=>v,C:O,T:()=>o(O(),v),M:()=>b,H(){const e=I;return I=0,e},J:e=>m(d,e,0,0),W(e,t){const n=[e,t];return k.add(n),()=>{k.delete(n)}},L(e,t){let n,s=0;switch(e){case 1:{const e=t.filter((([e,t])=>d.o[e]!==t));if(!e.length)break;let o=0;if(2===z)o=p(d,e);else if(R){const[t]=y;0===S||(o=S>C()-1.5?p(d,e):p(d,e.filter((([e])=>e<t))))}o&&(I=o,b++,s+=4);let i=!1;e.forEach((([e,t])=>{((e,t,n)=>{const o=e.o[t]===h;return e.o[t]=n,e.u=r(t,e.u),o})(d,e,t)&&(i=!0)})),c&&i&&!S&&(e=>{const t=e.o.filter((e=>e!==h)),n=t[0];e.i=t.every((e=>e===n))?n:(e=>{const t=[...e].sort(((e,t)=>e-t)),n=e.length/2|0;return t.length%2==0?(t[n-1]+t[n])/2:t[n]})(t)})(d),s+=2,x=n=!0;break}case 2:v!==t&&(v=t,s=2);break;case 3:case 4:if(S===t)break;if(3===e){const e=x;x=!1,0!==z&&e||R||T(S>t?2:1)&&(s+=8),n=i(S-t)>v,s+=16}S=o(0,r(C(),t)),s+=1;break;case 5:T(0)&&(s=8),R=!1;break;case 6:R=!0}s&&k.forEach((([e,t])=>{s&e&&t(n)}))},$:()=>0!==z,q(e){d.l!==e&&((e,t)=>{const n=[],o=[];for(let r=0;r<t;r++){const t=e.o[r];if(n.push(u(t)?t:h),0===r)o.push(0);else{const t=e.h[r];o.push(u(t)?t:h)}}e.l=t,e.u=r(e.u,t-1),e.o=n,e.h=o})(d,e)}}},S="undefined"!=typeof window?t.useLayoutEffect:t.useEffect,b="current",I={},z=e=>{const n=[];return t.Children.forEach(e,(e=>{u(e)&&"boolean"!=typeof e&&n.push(e)})),n},R=e=>{const n=t.useRef(e);return S((()=>{n[b]=e}),[e]),n},x=(e,r,o,i)=>{const[s,l]=t.useState(r),c=R(r);if(t.useLayoutEffect((()=>{const t=()=>{l((()=>c[b]()))};return e.W(o,(e=>{e?n.flushSync(t):t()}))}),[]),i){const e=r();s!==e&&l(e)}return s},y=/*#__PURE__*/d((e=>{const t="scrollLeft",n=e[t];e[t]=1;const r=e[t]<1;return e[t]=n,r})),k=(e,t,n)=>(()=>{let r=s()-50;return(...o)=>{const i=s();r+50<i&&(r=i,(r=>{if(e.$()&&!r.ctrlKey&&(t?r.deltaX:r.deltaY)){const t=e.R();t>0&&t<e.k()&&n()}})(...o))}})(),O=(e,t,n)=>{let i,s;const l=t?"scrollLeft":"scrollTop",u=()=>i?t?i.scrollWidth:i.scrollHeight:0,d=(r,o)=>t&&n?y(i)||o?-r:e.k()-r:r,h=async(t,n)=>{if(!i)return;const o=()=>r(n(),u()-e.O());for(;e.L(4,o()),e.p(t);){s&&s[1]();const t=e.W(2,(()=>{s&&s[0]()}));try{await new Promise(((e,t)=>{let n=!1;const r=()=>{n||(n=!0,e(),s=void 0)};s=[r,t],c(r,250)}))}catch(e){return}finally{t()}}i[l]=d(o()),e.L(6)};return{j(n){i=n;const r=()=>{e.L(3,d(n[l]))},o=a((()=>{r(),e.L(5)}),150),s=()=>{r(),o()},c=k(e,t,o);return n.addEventListener("scroll",s),n.addEventListener("wheel",c,{passive:!0}),()=>{n.removeEventListener("scroll",s),n.removeEventListener("wheel",c),o.t()}},B:u,N(t){t=o(t,0),h(e.J(t),(()=>t))},U(t){t=o(r(t,e.I()-1),0),h(t,(()=>e.v(t)))},A:e=>{i&&(i[l]+=d(e,!0))}}},C=(e,t)=>{const n=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop";return{j(o){let i=!1;const s=(e,t)=>{const n=t+e[r],o=e.offsetParent;return e!==document.body&&o?s(o,n):n},l=()=>{i&&e.L(3,window[n]-s(o,0))},c=a((()=>{l(),e.L(5)}),150),u=()=>{l(),c()},d=k(e,t,c),h=new IntersectionObserver((([e])=>{i=e.isIntersecting}));return h.observe(o),window.addEventListener("scroll",u),window.addEventListener("wheel",d,{passive:!0}),()=>{h.disconnect(),window.removeEventListener("scroll",u),window.removeEventListener("wheel",d),c.t()}},A:e=>{window.scrollBy(t?e:0,t?0:e)}}},T=e=>{const n=t.useRef();return n[b]||(n[b]=e())},M=(e,t)=>{let n;const r=t?"width":"height",o=new WeakMap,i=d((()=>new ResizeObserver((t=>{const i=[];for(const{target:s,contentRect:l}of t)if(s===n)e.L(2,l[r]);else{const e=o.get(s);u(e)&&i.push([e,l[r]])}i.length&&e.L(1,i)}))));return{D(e){n=e;const t=i();return t.observe(e),()=>{t.disconnect()}},F(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},H=(e,t)=>{const n=t?"width":"height",r=t?"innerWidth":"innerHeight",o=new WeakMap,i=d((()=>new ResizeObserver((t=>{const r=[];for(const{target:e,contentRect:i}of t){const t=o.get(e);u(t)&&r.push([t,i[n]])}r.length&&e.L(1,r)}))));return{D(){const t=()=>{e.L(2,window[r])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),i().disconnect()}},F(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},J=(e,t)=>{let n;const r="height",i="width",s=new WeakMap,l=new Set,c=new Set,u=new Map,a=(e,t)=>`${e}-${t}`,h=d((()=>new ResizeObserver((d=>{const h=new Set,f=new Set;for(const{target:o,contentRect:l}of d)if(o===n)e.L(2,l[r]),t.L(2,l[i]);else{const e=s.get(o);if(e){const[t,n]=e,o=a(t,n),s=u.get(o),c=[l[r],l[i]];let d,_;s?(s[0]!==c[0]&&(d=!0),s[1]!==c[1]&&(_=!0)):d=_=!0,d&&h.add(t),_&&f.add(n),(d||_)&&u.set(o,c)}}if(h.size){const t=[];h.forEach((e=>{let n=0;c.forEach((t=>{const r=u.get(a(e,t));r&&(n=o(n,r[0]))})),n&&t.push([e,n])})),e.L(1,t)}if(f.size){const e=[];f.forEach((t=>{let n=0;l.forEach((e=>{const r=u.get(a(e,t));r&&(n=o(n,r[1]))})),n&&e.push([t,n])})),t.L(1,e)}}))));return{D(e){n=e;const t=h();return t.observe(e),()=>{t.disconnect()}},F(e,t,n){const r=h();return s.set(e,[t,n]),l.add(t),c.add(n),r.observe(e),()=>{s.delete(e),r.unobserve(e)}}}},W=t.forwardRef((({children:n,attrs:r,width:o,height:i,scrolling:s},l)=>e.jsx("div",{ref:l,...r,children:e.jsx("div",{style:t.useMemo((()=>({position:"relative",visibility:"hidden",width:null!=o?o:"100%",height:null!=i?i:"100%",pointerEvents:s?"none":"auto"})),[o,i,s]),children:n})}))),L=t.memo((({P:n,V:r,X:o,Y:i,G:s,K:l,Z:c})=>{const u=t.useRef(null),a=x(o,(()=>o.v(i)),2,!0),d=x(o,(()=>o.m(i)),2,!0);return S((()=>r.F(u[b],i)),[i]),e.jsx(s,{ref:u,style:t.useMemo((()=>{const e=c?"right":"left",t={margin:0,padding:0,position:"absolute",[l?"height":"width"]:"100%",[l?"top":e]:0,[l?e:"top"]:a,visibility:d?"hidden":"visible"};return l&&(t.display="flex"),t}),[a,d]),children:n})})),$=t.forwardRef((({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:a,mode:d,cache:h,components:{Root:f=W,Item:_="div"}=I,onScroll:g,onScrollStop:w,onRangeChange:m,...p},y)=>{const k=t.useMemo((()=>z(n)),[n]),C=k.length,H=R(g),J=R(w),[$,q,j,B,N]=T((()=>{const e=!!a,t="rtl"===d,n=v(C,s,c,"reverse"===d,h);return[n,M(n,e),O(n,e,t),e,t]}));$.q(C);const[U,A]=x($,$.g,3),D=x($,$.$,8),E=x($,$.M,4),F=x($,$.T,2,!0),P=t.useRef(null);S((()=>{const e=P[b],t=q.D(e),n=j.j(e),r=$.W(16,(()=>{H[b]&&H[b]($.R())}));return()=>{t(),n(),r()}}),[]),S((()=>{const e=$.H();e&&j.A(e)}),[E]),t.useEffect((()=>{D||J[b]&&J[b]()}),[D]),t.useEffect((()=>{m&&m(U,A)}),[U,A]),t.useImperativeHandle(y,(()=>({get cache(){return $._()},get scrollOffset(){return $.R()},get scrollSize(){return j.B()},get viewportSize(){return $.O()},scrollToIndex:j.U,scrollTo:j.N,scrollBy(e){j.N($.R()+e)}})),[]);const V=o(U-i,0),X=r(A+i,C-1),Y=t.useMemo((()=>{const t=[];for(let n=V;n<=X;n++){const r=k[n];u(r)&&t.push(e.jsx(L,{V:q,X:$,Y:n,G:_,P:r,K:B,Z:N},r.key||n))}return t}),[k,V,X]);return e.jsx(f,{ref:P,width:B?F:void 0,height:B?void 0:F,scrolling:D,attrs:t.useMemo((()=>({...p,style:{overflow:B?"auto hidden":"hidden auto",display:B?"inline-block":"block",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...p.style}})),l(p)),children:Y})})),q=(e,t)=>`${e}-${t}`,j=t.memo((({P:n,V:r,ee:o,te:i,ne:s,re:l,G:c,Z:u})=>{const a=t.useRef(null),d=x(o,(()=>o.v(s)),2,!0),h=x(i,(()=>i.v(l)),2,!0),f=x(o,(()=>o.m(s)),2,!0),_=x(i,(()=>i.m(l)),2,!0),g=x(o,(()=>o.S(s)),2,!0),w=x(i,(()=>i.S(l)),2,!0);return S((()=>r.F(a[b],s,l)),[l,s]),e.jsx(c,{ref:a,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:d,[u?"right":"left"]:h,visibility:f||_?"hidden":"visible",minHeight:g,minWidth:w})),[d,h,w,g,f,_]),children:n})})),B=t.forwardRef((({children:n,row:i,col:s,cellHeight:c=40,cellWidth:u=100,overscan:a=2,initialRowCount:d,initialColCount:h,rtl:f,components:{Root:_=W,Cell:g="div"}=I,...w},m)=>{const[p,z,R,y,k,C]=T((()=>{const e=!!f,t=v(i,c,d,!1),n=v(s,u,h,!1);return[t,n,J(t,n),O(t,!1,e),O(n,!0,e),e]}));p.q(i),z.q(s);const[M,H]=x(p,p.g,3),[L,$]=x(z,z.g,3),B=x(p,p.$,8),N=x(z,z.$,8),U=x(p,p.M,4),A=x(z,z.M,4),D=x(p,p.T,2,!0),E=x(z,z.T,2,!0),F=t.useRef(null);S((()=>{const e=F[b],t=R.D(e),n=y.j(e),r=k.j(e);return()=>{t(),n(),r()}}),[]),S((()=>{const e=p.H();e&&y.A(e)}),[U]),S((()=>{const e=z.H();e&&k.A(e)}),[A]),t.useImperativeHandle(m,(()=>({get scrollOffset(){return[z.R(),p.R()]},get scrollSize(){return[k.B(),y.B()]},get viewportSize(){return[z.O(),p.O()]},scrollToIndex(e,t){k.U(e),y.U(t)},scrollTo(e,t){k.N(e),y.N(t)},scrollBy(e,t){k.N(z.R()+e),y.N(p.R()+t)}})),[]);const P=t.useMemo((()=>{const e=new Map;return(t,r)=>{let o=e.get(q(t,r));return o||e.set(q(t,r),o=n({rowIndex:t,colIndex:r})),o}}),[n]),V=o(M-a,0),X=r(H+a,i-1),Y=o(L-a,0),G=r($+a,s-1),K=t.useMemo((()=>{const t=[];for(let n=V;n<=X;n++)for(let r=Y;r<=G;r++)t.push(e.jsx(j,{V:R,ee:p,te:z,ne:n,re:r,G:g,P:P(n,r),Z:C},q(n,r)));return t}),[P,V,X,Y,G]);return e.jsx(_,{ref:F,width:E,height:D,scrolling:B||N,attrs:t.useMemo((()=>({...w,style:{overflow:"auto",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...w.style}})),l(w)),children:K})})),N=t.forwardRef((({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:a,cache:d,components:{Root:h=W,Item:f="div"}=I,onScrollStop:_,onRangeChange:g,...w},m)=>{const p=t.useMemo((()=>z(n)),[n]),y=p.length,k=R(_),[O,M,J,$]=T((()=>{const e=!!a,t=v(y,s,c,!1,d);return[t,H(t,e),C(t,e),e]}));O.q(y);const[q,j]=x(O,O.g,3),B=x(O,O.$,8),N=x(O,O.M,4),U=x(O,O.T,2,!0),A=t.useRef(null);S((()=>{const e=A[b],t=M.D(e),n=J.j(e);return()=>{t(),n()}}),[]),S((()=>{const e=O.H();e&&J.A(e)}),[N]),t.useEffect((()=>{B||k[b]&&k[b]()}),[B]),t.useEffect((()=>{g&&g(q,j)}),[q,j]),t.useImperativeHandle(m,(()=>({get cache(){return O._()}})),[]);const D=o(q-i,0),E=r(j+i,y-1),F=t.useMemo((()=>{const t=[];for(let n=D;n<=E;n++){const r=p[n];u(r)&&t.push(e.jsx(L,{V:M,X:O,Y:n,G:f,P:r,K:$,Z:!1},r.key||n))}return t}),[p,D,E]);return e.jsx(h,{ref:A,width:$?U:void 0,height:$?void 0:U,scrolling:B,attrs:t.useMemo((()=>({...w,style:{overflow:"visible",display:$?"inline-block":"block",width:$?"auto":"100%",height:$?"100%":"auto",padding:0,margin:0,...w.style}})),l(w)),children:F})}));exports.VGrid=B,exports.VList=$,exports.WVList=N;
|
|
3
3
|
//# sourceMappingURL=index.js.map
|