virtua 0.4.4 → 0.4.5

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 CHANGED
@@ -13,7 +13,7 @@ This project is a challenge to rethink virtualization. The goals are...
13
13
  - **Zero configuration:** This library is designed to give the best performance without configuration. It also handles common hard things in the real world (dynamic size measurement, scroll position adjustment in bottom-up scrolling and imperative scrolling, etc).
14
14
  - **Fast:** Scrolling without frame drop needs optimization in many aspects (reduce CPU usage, reduce GC, [reduce layout recalculation](https://gist.github.com/paulirish/5d52fb081b3570c81e3a), optimize with CSS, optimize for frameworks, etc). We are trying to combine the best of them.
15
15
  - **Small:** Its bundle size should be small as much as possible to be friendly with modern web development. Currently each components are ~3kB gzipped and the total is [~4kB gzipped](https://bundlephobia.com/package/virtua).
16
- - **Flexible:** Aiming to support many usecases - fixed size, dynamic size, horizontal scrolling, reverse scrolling, rtl direction, sticky, infinite scrolling, placeholder, scrollTo, dnd, table, and more. See [live demo](#demo).
16
+ - **Flexible:** Aiming to support many usecases - fixed size, dynamic size, horizontal scrolling, reverse scrolling, rtl direction, sticky, infinite scrolling, placeholder, scrollTo, scroll restoration, dnd, table, and more. See [live demo](#demo).
17
17
  - **Framework agnostic (WIP):** Currently only for [React](https://react.dev/) but we could support [Vue](https://vuejs.org/), [Svelte](https://svelte.dev/), [Solid](https://www.solidjs.com/), [Angular](https://angular.io/), [Web Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components) and more in the future.
18
18
 
19
19
  ## Demo
@@ -143,16 +143,16 @@ This library is marked as a Client Component. You can render RSC as children of
143
143
 
144
144
  ```tsx
145
145
  // page.tsx in App Router of Next.js
146
- import { VList } from "virtua";
147
146
 
148
147
  export default async () => {
148
+ const articles = await fetchArticles();
149
149
  return (
150
150
  <div>
151
151
  <div>This is Server Component</div>
152
152
  <VList style={{ height: 300 }}>
153
- {Array.from({ length: 1000 }).map((_, i) => (
154
- <div key={i} style={{ border: "solid 1px gray", height: 80 }}>
155
- {i}
153
+ {articles.map((a) => (
154
+ <div key={a.id} style={{ border: "solid 1px gray", height: 80 }}>
155
+ {a.content}
156
156
  </div>
157
157
  ))}
158
158
  </VList>
@@ -173,6 +173,9 @@ And see [examples](./stories) for more usages.
173
173
 
174
174
  WIP
175
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
+
176
179
  ### Features
177
180
 
178
181
  | | [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) |
@@ -186,8 +189,12 @@ WIP
186
189
  | Dynamic list size | ✅ | ✅ | 🟠 (needs [AutoSizer](https://github.com/bvaughn/react-virtualized/blob/master/docs/AutoSizer.md)) | 🟠 (needs [AutoSizer](https://github.com/bvaughn/react-virtualized/blob/master/docs/AutoSizer.md)) | ✅ | ✅ |
187
190
  | Dynamic item size | ✅ | ✅ | 🟠 (needs additional codes and has wrong destination when scrolling to item imperatively) | 🟠 (needs [CellMeasurer](https://github.com/bvaughn/react-virtualized/blob/master/docs/CellMeasurer.md) and has wrong destination when scrolling to item imperatively) | 🟠 (has wrong destination when scrolling to item imperatively) | 🟠 (has wrong destination when scrolling to item imperatively) |
188
191
  | Reverse scroll | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
192
+ | Reverse scroll in iOS Safari | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
189
193
  | Infinite scroll | ✅ | ✅ | 🟠 (needs [react-window-infinite-loader](https://github.com/bvaughn/react-window-infinite-loader)) | 🟠 (needs [InfiniteLoader](https://github.com/bvaughn/react-virtualized/blob/master/docs/InfiniteLoader.md)) | ✅ | ✅ |
190
- | RTL | | | | ❌ | ❌ | ❌ |
194
+ | Bi-directional infinite scroll | | | | ❌ | ❌ | ❌ |
195
+ | Scroll restoration | ✅ | ✅ (getState) | ❌ | ❌ | ❌ | ❌ |
196
+ | Smooth scroll | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ |
197
+ | RTL direction | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
191
198
  | SSR support | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
192
199
  | React Server Components (RSC) support | ✅ | ? | ? | ? | ✅ (hook) | ✅ (hook) |
193
200
  | Display exceeding browser's max element size limit | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
@@ -1,3 +1,4 @@
1
+ import type { CacheSnapshot } from "./types";
1
2
  export type ScrollJump = Readonly<number>;
2
3
  export type ItemResize = Readonly<[index: number, size: number]>;
3
4
  type ItemsRange = Readonly<[startIndex: number, endIndex: number]>;
@@ -13,7 +14,11 @@ export declare const ACTION_MANUAL_SCROLL = 4;
13
14
  export declare const ACTION_SCROLL_END = 5;
14
15
  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_MANUAL_SCROLL, offset: number] | [type: typeof ACTION_SCROLL_END, isManual: boolean];
15
16
  type Subscriber = (sync?: boolean) => void;
17
+ export declare const UPDATE_SCROLL = 1;
18
+ export declare const UPDATE_SIZE = 2;
19
+ export declare const UPDATE_JUMP = 4;
16
20
  export type VirtualStore = {
21
+ _getCache(): CacheSnapshot;
17
22
  _getRange(): ItemsRange;
18
23
  _isUnmeasuredItem(index: number): boolean;
19
24
  _hasUnmeasuredItemsInRange(startIndex: number): boolean;
@@ -28,11 +33,10 @@ export type VirtualStore = {
28
33
  _getJumpCount(): number;
29
34
  _flushJump(): ScrollJump | undefined;
30
35
  _getItemIndexForScrollTo(offset: number): number;
31
- _waitForScrollDestinationItemsMeasured(): Promise<void>;
32
- _subscribe(cb: Subscriber): () => void;
36
+ _subscribe(target: number, cb: Subscriber): () => void;
33
37
  _update(...action: Actions): void;
34
38
  _getScrollDirection(): ScrollDirection;
35
39
  _updateCacheLength(length: number): void;
36
40
  };
37
- export declare const createVirtualStore: (elementsCount: number, itemSize: number | undefined, initialItemCount: number | undefined, isReverse: boolean, onScrollStateChange: (scrolling: boolean) => void, onScrollOffsetChange: (offset: number) => void) => VirtualStore;
41
+ export declare const createVirtualStore: (elementsCount: number, itemSize: number | undefined, initialItemCount: number | undefined, isReverse: boolean, onScrollStateChange: (scrolling: boolean) => void, cacheSnapshot?: CacheSnapshot, onScrollOffsetChange?: ((offset: number) => void) | undefined) => VirtualStore;
38
42
  export {};
@@ -4,3 +4,13 @@ export type DeepReadonly<T> = {
4
4
  export type Writeable<T> = {
5
5
  -readonly [key in keyof T]: Writeable<T[key]>;
6
6
  };
7
+ declare const cacheSymbol: unique symbol;
8
+ /**
9
+ * Serializable cache snapshot.
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 ot this package.**
12
+ */
13
+ export interface CacheSnapshot {
14
+ [cacheSymbol]: never;
15
+ }
16
+ export {};
@@ -10,7 +10,6 @@ export declare const values: {
10
10
  };
11
11
  export declare const timeout: typeof setTimeout;
12
12
  export declare const exists: <T>(v: T) => v is Exclude<T, null | undefined>;
13
- export declare const range: <T>(length: number, cb: (i: number) => T) => T[];
14
13
  export declare const median: (arr: number[]) => number;
15
14
  export declare const debounce: <T extends (...args: any[]) => void>(fn: T, ms: number) => {
16
15
  (): void;
package/lib/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
+ export type { CacheSnapshot } from "./core/types";
1
2
  export { VList } from "./react/VList";
2
3
  export type { VListProps, VListHandle, ScrollMode } from "./react/VList";
3
4
  export { VGrid } from "./react/VGrid";
4
5
  export type { VGridProps, VGridHandle, CustomCellComponent, CustomCellComponentProps, } from "./react/VGrid";
5
6
  export { WVList } from "./react/WVList";
6
- export type { WVListProps } from "./react/WVList";
7
+ export type { WVListProps, WVListHandle } from "./react/WVList";
7
8
  export type { WindowComponentAttributes, CustomWindowComponent, CustomWindowComponentProps, } from "./react/Window";
8
9
  export type { CustomItemComponent, CustomItemComponentProps, } from "./react/ListItem";
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,d=(e,t)=>Array.from({length:e},((e,n)=>t(n))),a=(e,t)=>{let n;const r=()=>{u(n)&&clearTimeout(n)},o=()=>{r(),n=c((()=>{n=null,e()}),t)};return o.t=r,o},h=e=>{let t,n;return(...r)=>(t||(t=!0,n=e(...r)),n)},f=-1,_=(e,t)=>{const n=e.o[t];return n===f?e.i:n},w=(e,t,n)=>{if(!e.l)return 0;if(e.u>=t)return n?e.h[t]+_(e,t):e.h[t];let r=e.u,o=e.h[r];for(;r<=t&&(e.h[r]=o,r!==t||n);)o+=_(e,r),r++;return e.u=t,o},g=(e,t)=>w(e,t),m=(e,t,n)=>{let i=0;if(n>=0)for(;t<e.l-1;){const r=_(e,t++);if((i+=r)>=n){i-r/2>=n&&t--;break}}else for(;t>0;){const r=_(e,--t);if((i-=r)<=n){i+r/2<n&&t++;break}}return r(o(t,0),e.l-1)},v=(e,t,n,r)=>m(e,n,t-r),p=(e,t,n)=>({i:n?n.i:t,l:e,u:n?r(n.u,e-1):0,o:d(e,(e=>{const t=n&&n.o[e];return u(t)?t:f})),h:d(e,(e=>{if(0===e)return 0;const t=n&&n.h[e];return u(t)?t:f}))}),S=e=>e.reduce(((e,[t])=>e+t),0),b=(e,t)=>t.map((([t,n])=>[n-_(e,t),t])),z=(e,t,n=0,s,l,d)=>{const a=!t,h=t||40;let z,I,x=h*o(n-1,0),R=0,y=0,k=p(e,h),O=0,T=!1,C=[0,n];const M=new Set,H=()=>(e=>w(e,e.l-1,!0))(k),W=()=>H()-x,L=e=>{const t=O;return O=e,0!==O&&(0===t&&(1===O||2===O)||void 0)};return{_(){const[e,t]=C,n=g(k,e),r=v(k,R,e,n),o=m(k,r,x);return e===r&&t===o?C:C=[r,o]},g:e=>k.o[e]===f,m:e=>((e,t,n)=>{for(let r=t;r<=n;r++)if(e.o[r]===f)return!0;return!1})(k,o(0,e-2),r(k.l-1,e+2)),v(e){const t=g(k,e);return s?t+o(0,x-H()):t},p:e=>_(k,e),S:()=>k.l,I:()=>R,R:W,k:()=>x,O:H,T:()=>o(H(),x),C:()=>y,M(){const e=z;return z=void 0,e},H:e=>v(k,e,0,0),W:()=>(I&&I[1](),new Promise(((e,t)=>{let n=!1;const r=()=>{n||(n=!0,e(),I=void 0)};I=[r,t],c(r,250)}))),L:e=>(M.add(e),()=>{M.delete(e)}),J(e,t){let n,s,c=!1;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=S(b(k,e));else if(3===O){const t=b(k,e),[n]=C;0===R||(o=R>W()-1.5?S(t):S(t.filter((([,e])=>e<n))))}o&&(z=o,y++);let i=!1;e.forEach((([e,t])=>{((e,t,n)=>{const o=e.o[t]===f;return e.o[t]=n,e.u=r(t,e.u),o})(k,e,t)&&(i=!0)})),a&&i&&!R&&(e=>{const t=e.o.filter((e=>e!==f)),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),T=n=c=!0;break}case 2:c=x!==t,x=t;break;case 3:case 4:if(R===t)break;if(3===e){const e=(()=>{const e=T;return T=!1,e})();0!==O&&e||3===O||(s=L(R>t?2:1)),n=i(R-t)>x}R=o(0,r(W(),t)),c=!0;break;case 5:s=L(t?3:0)}c&&(M.forEach((e=>{e(n)})),3===e&&d(R)),I&&1===e&&I[0](),u(s)&&l(s)},$:()=>O,q(e){k.l!==e&&(k=p(e,h,k))}}},I="undefined"!=typeof window?t.useLayoutEffect:t.useEffect,x="current",R=e=>{const n=[];return t.Children.forEach(e,(e=>{u(e)&&"boolean"!=typeof e&&n.push(e)})),n},y=e=>{const n=t.useRef(e);return I((()=>{n[x]=e}),[e]),n},k=(e,r,o)=>{const[i,s]=t.useState(r),l=y(r);if(t.useLayoutEffect((()=>{const t=()=>{s((()=>l[x]()))};return e.L((e=>{e?n.flushSync(t):t()}))}),[]),o){const e=r();i!==e&&s(e)}return i},O=/*#__PURE__*/h((e=>{const t="scrollLeft",n=e[t];e[t]=1;const r=e[t]<1;return e[t]=n,r})),T=(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.I();t>0&&t<e.R()&&n()}})(...o))}})(),C=(e,t,n)=>{let i;const s=t?"scrollLeft":"scrollTop",l=()=>i?t?i.scrollWidth:i.scrollHeight:0,c=(r,o)=>t&&n?O(i)||o?-r:e.R()-r:r,u=async(t,n)=>{if(!i)return;const o=()=>r(n(),l()-e.k());for(;e.J(4,o()),e.m(t);)try{await e.W()}catch(e){return}i[s]=c(o()),e.J(5,!0)};return{D(n){i=n;const r=()=>{e.J(3,c(n[s]))},o=a((()=>{r(),e.J(5,!1)}),150),l=()=>{r(),o()},u=T(e,t,o);return n.addEventListener("scroll",l),n.addEventListener("wheel",u,{passive:!0}),()=>{n.removeEventListener("scroll",l),n.removeEventListener("wheel",u),o.t()}},j:l,A(t){t=o(t,0),u(e.H(t),(()=>t))},B(t){t=o(r(t,e.S()-1),0),u(t,(()=>e.v(t)))},F:e=>{i&&(i[s]+=c(e,!0))}}},M=(e,t)=>{const n=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop";return{D(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.J(3,window[n]-s(o,0))},c=a((()=>{l(),e.J(5,!1)}),150),u=()=>{l(),c()},d=T(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()}},F:e=>{window.scrollBy(t?e:0,t?0:e)}}},H=e=>{const n=t.useRef();return n[x]||(n[x]=e())},W=(e,t)=>{let n;const r=t?"width":"height",o=new WeakMap,i=h((()=>new ResizeObserver((t=>{const i=[];for(const{target:s,contentRect:l}of t)if(s===n)e.J(2,l[r]);else{const e=o.get(s);u(e)&&i.push([e,l[r]])}i.length&&e.J(1,i)}))));return{U(e){n=e;const t=i();return t.observe(e),()=>{t.disconnect()}},P(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},L=(e,t)=>{const n=t?"width":"height",r=t?"innerWidth":"innerHeight",o=new WeakMap,i=h((()=>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.J(1,r)}))));return{U(){const t=()=>{e.J(2,window[r])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),i().disconnect()}},P(e,t){const n=i();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},E=(e,t)=>{let n;const r="height",i="width",s=new WeakMap,l=new Set,c=new Set,u=new Map,d=(e,t)=>`${e}-${t}`,a=h((()=>new ResizeObserver((a=>{const h=new Set,f=new Set;for(const{target:o,contentRect:l}of a)if(o===n)e.J(2,l[r]),t.J(2,l[i]);else{const e=s.get(o);if(e){const[t,n]=e,o=d(t,n),s=u.get(o),c=[l[r],l[i]];let a,_;s?(s[0]!==c[0]&&(a=!0),s[1]!==c[1]&&(_=!0)):a=_=!0,a&&h.add(t),_&&f.add(n),(a||_)&&u.set(o,c)}}if(h.size){const t=[];h.forEach((e=>{let n=0;c.forEach((t=>{const r=u.get(d(e,t));r&&(n=o(n,r[0]))})),n&&t.push([e,n])})),e.J(1,t)}if(f.size){const e=[];f.forEach((t=>{let n=0;l.forEach((e=>{const r=u.get(d(e,t));r&&(n=o(n,r[1]))})),n&&e.push([t,n])})),t.J(1,e)}}))));return{U(e){n=e;const t=a();return t.observe(e),()=>{t.disconnect()}},P(e,t,n){const r=a();return s.set(e,[t,n]),l.add(t),c.add(n),r.observe(e),()=>{s.delete(e),r.unobserve(e)}}}},J=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})}))),$=t.memo((({V:n,X:r,Y:o,G:i,K:s,N:l,Z:c})=>{const u=t.useRef(null),d=k(o,(()=>o.v(i)),!0),a=k(o,(()=>o.g(i)),!0);return I((()=>r.P(u[x],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"]:d,visibility:a?"hidden":"visible"};return l&&(t.display="flex"),t}),[d,a]),children:n})})),q=t.forwardRef((({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:d,mode:a,element:h=J,itemElement:f="div",onScroll:_,onScrollStop:w,onRangeChange:g,...m},v)=>{const p=t.useMemo((()=>R(n)),[n]),S=p.length,b=y(_),O=y(w),[T,M]=t.useState(!1),[L,E,q,D,j]=H((()=>{const e=!!d,t="rtl"===a,n=z(S,s,c,"reverse"===a,(e=>{M(e),e||O[x]&&O[x]()}),(e=>{b[x]&&b[x](e)}));return[n,W(n,e),C(n,e,t),e,t]}));L.q(S);const[A,B]=k(L,L._),F=k(L,L.C),U=k(L,L.T,!0),P=t.useRef(null);I((()=>{const e=P[x],t=E.U(e),n=q.D(e);return()=>{t(),n()}}),[]),I((()=>{const e=L.M();e&&q.F(e)}),[F]),t.useEffect((()=>{g&&g({start:A,end:B,count:S})}),[A,B]),t.useImperativeHandle(v,(()=>({get scrollOffset(){return L.I()},get scrollSize(){return q.j()},get viewportSize(){return L.k()},scrollToIndex:q.B,scrollTo:q.A,scrollBy(e){q.A(L.I()+e)}})),[]);const V=o(A-i,0),X=r(B+i,S-1),Y=t.useMemo((()=>{const t=[];for(let n=V;n<=X;n++){const r=p[n];u(r)&&t.push(e.jsx($,{X:E,Y:L,G:n,K:f,V:r,N:D,Z:j},(null==r?void 0:r.key)||n))}return t}),[p,V,X]);return e.jsx(h,{ref:P,width:D?U:void 0,height:D?void 0:U,scrolling:T,attrs:t.useMemo((()=>({...m,style:{overflow:D?"auto hidden":"hidden auto",display:D?"inline-block":"block",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...m.style}})),l(m)),children:Y})})),D=(e,t)=>`${e}-${t}`,j=t.memo((({V:n,X:r,ee:o,te:i,ne:s,re:l,K:c,Z:u})=>{const d=t.useRef(null),a=k(o,(()=>o.v(s)),!0),h=k(i,(()=>i.v(l)),!0),f=k(o,(()=>o.g(s)),!0),_=k(i,(()=>i.g(l)),!0),w=k(o,(()=>o.p(s)),!0),g=k(i,(()=>i.p(l)),!0);return I((()=>r.P(d[x],s,l)),[l,s]),e.jsx(c,{ref:d,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:a,[u?"right":"left"]:h,visibility:f||_?"hidden":"visible",minHeight:w,minWidth:g})),[a,h,g,w,f,_]),children:n})})),A=t.forwardRef((({children:n,row:i,col:s,cellHeight:c=40,cellWidth:u=100,overscan:d=2,initialRowCount:a,initialColCount:h,rtl:f,element:_=J,cellElement:w="div",...g},m)=>{const[v,p]=t.useState(!1),[S,b]=t.useState(!1),[R,y,O,T,M,W]=H((()=>{const e=!!f,t=()=>{},n=z(i,c,a,!1,p,t),r=z(s,u,h,!1,b,t);return[n,r,E(n,r),C(n,!1,e),C(r,!0,e),e]}));R.q(i),y.q(s);const[L,$]=k(R,R._),[q,A]=k(y,y._),B=k(R,R.C),F=k(y,y.C),U=k(R,R.T,!0),P=k(y,y.T,!0),V=t.useRef(null);I((()=>{const e=V[x],t=O.U(e),n=T.D(e),r=M.D(e);return()=>{t(),n(),r()}}),[]),I((()=>{const e=R.M();e&&T.F(e)}),[B]),I((()=>{const e=y.M();e&&M.F(e)}),[F]),t.useImperativeHandle(m,(()=>({get scrollOffset(){return[y.I(),R.I()]},get scrollSize(){return[M.j(),T.j()]},get viewportSize(){return[y.k(),R.k()]},scrollToIndex(e,t){M.B(e),T.B(t)},scrollTo(e,t){M.A(e),T.A(t)},scrollBy(e,t){M.A(y.I()+e),T.A(R.I()+t)}})),[]);const X=t.useMemo((()=>{const e=new Map;return(t,r)=>{let o=e.get(D(t,r));return o||e.set(D(t,r),o=n({rowIndex:t,colIndex:r})),o}}),[n]),Y=o(L-d,0),G=r($+d,i-1),K=o(q-d,0),N=r(A+d,s-1),Q=t.useMemo((()=>{const t=[];for(let n=Y;n<=G;n++)for(let r=K;r<=N;r++)t.push(e.jsx(j,{X:O,ee:R,te:y,ne:n,re:r,K:w,V:X(n,r),Z:W},D(n,r)));return t}),[X,Y,G,K,N]);return e.jsx(_,{ref:V,width:P,height:U,scrolling:v||S,attrs:t.useMemo((()=>({...g,style:{overflow:"auto",contain:"strict",width:"100%",height:"100%",padding:0,margin:0,...g.style}})),l(g)),children:Q})}));exports.VGrid=A,exports.VList=q,exports.WVList=({children:n,overscan:i=4,initialItemSize:s,initialItemCount:c,horizontal:d,element:a=J,itemElement:h="div",onScrollStop:f,onRangeChange:_,...w})=>{const g=t.useMemo((()=>R(n)),[n]),m=g.length,v=y(f),[p,S]=t.useState(!1),[b,O,T,C]=H((()=>{const e=!!d,t=z(m,s,c,!1,(e=>{S(e),e||v[x]&&v[x]()}),(()=>{}));return[t,L(t,e),M(t,e),e]}));b.q(m);const[W,E]=k(b,b._),q=k(b,b.C),D=k(b,b.T,!0),j=t.useRef(null);I((()=>{const e=j[x],t=O.U(e),n=T.D(e);return()=>{t(),n()}}),[]),I((()=>{const e=b.M();e&&T.F(e)}),[q]),t.useEffect((()=>{_&&_({start:W,end:E,count:m})}),[W,E]);const A=o(W-i,0),B=r(E+i,m-1),F=t.useMemo((()=>{const t=[];for(let n=A;n<=B;n++){const r=g[n];u(r)&&t.push(e.jsx($,{X:O,Y:b,G:n,K:h,V:r,N:C,Z:!1},(null==r?void 0:r.key)||n))}return t}),[g,A,B]);return e.jsx(a,{ref:j,width:C?D:void 0,height:C?void 0:D,scrolling:p,attrs:t.useMemo((()=>({...w,style:{overflow:"visible",display:C?"inline-block":"block",width:C?"auto":"100%",height:C?"100%":"auto",padding:0,margin:0,...w.style}})),l(w)),children:F})};
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;
3
3
  //# sourceMappingURL=index.js.map