virtua 0.10.0 → 0.12.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 CHANGED
@@ -200,7 +200,7 @@ It may be dispatched by ResizeObserver in this lib [as described in spec](https:
200
200
 
201
201
  | | [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) |
202
202
  | :------------------------------------------------- | :------------------------------------------------------- | :---------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------ | :-------------------------------------------------------------------- |
203
- | Bundle size | [4.7kB gzipped](https://bundlephobia.com/package/virtua) | [16.3kB gzipped](https://bundlephobia.com/package/react-virtuoso) | [6.4kB gzipped](https://bundlephobia.com/package/react-window) | [27.3kB gzipped](https://bundlephobia.com/package/react-virtualized) | [2.3kB gzipped](https://bundlephobia.com/package/@tanstack/react-virtual) | [3.1kB gzipped](https://bundlephobia.com/package/react-cool-virtual) |
203
+ | Bundle size | [5.0kB gzipped](https://bundlephobia.com/package/virtua) | [16.9kB gzipped](https://bundlephobia.com/package/react-virtuoso) | [6.4kB gzipped](https://bundlephobia.com/package/react-window) | [27.3kB gzipped](https://bundlephobia.com/package/react-virtualized) | [2.3kB gzipped](https://bundlephobia.com/package/@tanstack/react-virtual) | [3.1kB gzipped](https://bundlephobia.com/package/react-cool-virtual) |
204
204
  | Vertical scroll | ✅ | ✅ | ✅ | ✅ | 🟠 (needs customization) | 🟠 (needs customization) |
205
205
  | Horizontal scroll | ✅ | ❌ | ✅ | ✅ | 🟠 (needs customization) | 🟠 (needs customization) |
206
206
  | Grid (Virtualization for two dimension) | ✅ (VGrid) | ❌ | ✅ (FixedSizeGrid / VariableSizeGrid) | ✅ ([Grid](https://github.com/bvaughn/react-virtualized/blob/master/docs/Grid.md)) | 🟠 (needs customization) | 🟠 (needs customization) |
@@ -214,7 +214,7 @@ It may be dispatched by ResizeObserver in this lib [as described in spec](https:
214
214
  | Reverse (bi-directional) infinite scroll | ✅ | ✅ | ❌ | ❌ | ❌ | 🟠 (has startItem method but its scroll position can be inaccurate) |
215
215
  | Scroll restoration | ✅ | ✅ (getState) | ❌ | ❌ | ❌ | ❌ |
216
216
  | Smooth scroll | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ |
217
- | RTL direction | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
217
+ | RTL support | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
218
218
  | SSR support | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
219
219
  | Render React Server Components (RSC) as children | ✅ | ❌ | ❌ | ❌ | 🟠(needs customization) | 🟠 (needs customization) |
220
220
  | Display exceeding browser's max element size limit | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
@@ -4,15 +4,15 @@ export type Cache = DeepReadonly<{
4
4
  _defaultItemSize: number;
5
5
  _length: number;
6
6
  _sizes: number[];
7
- _measuredOffsetIndex: number;
7
+ _computedOffsetIndex: number;
8
8
  _offsets: number[];
9
9
  }>;
10
10
  export declare const getItemSize: (cache: Cache, index: number) => number;
11
11
  export declare const setItemSize: (cache: Writeable<Cache>, index: number, size: number) => boolean;
12
12
  export declare const computeOffset: (cache: Writeable<Cache>, index: number) => number;
13
13
  export declare const computeTotalSize: (cache: Writeable<Cache>) => number;
14
- export declare const findIndex: (cache: Cache, i: number, distance: number) => number;
15
- export declare const findStartIndexWithOffset: (cache: Writeable<Cache>, offset: number, initialIndex: number) => number;
14
+ export declare const findIndex: (cache: Writeable<Cache>, offset: number, i: number) => number;
15
+ export declare const computeRange: (cache: Writeable<Cache>, scrollOffset: number, prevStartIndex: number, viewportSize: number) => [number, number];
16
16
  export declare const hasUnmeasuredItemsInRange: (cache: Cache, startIndex: number, endIndex: number) => boolean;
17
17
  export declare const estimateDefaultItemSize: (cache: Writeable<Cache>) => void;
18
18
  export declare const initCache: (length: number, itemSize: number) => Cache;
@@ -1 +1,3 @@
1
- export declare const hasNegativeOffsetInRtl: (scrollable: HTMLElement) => boolean;
1
+ export declare const isBrowser: boolean;
2
+ export declare const hasNegativeOffsetInRTL: (scrollable: HTMLElement) => boolean;
3
+ export declare const isRTLDocument: () => boolean;
@@ -7,7 +7,7 @@ export type Scroller = {
7
7
  _scrollToIndex: (index: number, align?: ScrollToIndexAlign) => void;
8
8
  _fixScrollJump: (jump: ScrollJump) => void;
9
9
  };
10
- export declare const createScroller: (store: VirtualStore, isHorizontal: boolean, isRtl: boolean) => Scroller;
10
+ export declare const createScroller: (store: VirtualStore, isHorizontal: boolean) => Scroller;
11
11
  export type WindowScroller = {
12
12
  _initRoot: (rootElement: HTMLElement) => () => void;
13
13
  _fixScrollJump: (jump: ScrollJump) => void;
@@ -6,6 +6,7 @@ type ItemsRange = Readonly<[startIndex: number, endIndex: number]>;
6
6
  export declare const SCROLL_IDLE = 0;
7
7
  export declare const SCROLL_DOWN = 1;
8
8
  export declare const SCROLL_UP = 2;
9
+ export type ScrollDirection = typeof SCROLL_IDLE | typeof SCROLL_DOWN | typeof SCROLL_UP;
9
10
  export declare const ACTION_ITEM_RESIZE = 1;
10
11
  export declare const ACTION_VIEWPORT_RESIZE = 2;
11
12
  export declare const ACTION_ITEMS_LENGTH_CHANGE = 3;
@@ -21,7 +22,7 @@ type Subscriber = () => void;
21
22
  export declare const UPDATE_SCROLL = 1;
22
23
  export declare const UPDATE_SIZE = 2;
23
24
  export declare const UPDATE_JUMP = 4;
24
- export declare const UPDATE_IS_SCROLLING = 8;
25
+ export declare const UPDATE_SCROLL_DIRECTION = 8;
25
26
  export declare const UPDATE_SCROLL_WITH_EVENT = 16;
26
27
  export type VirtualStore = {
27
28
  _getCache(): CacheSnapshot;
@@ -33,7 +34,7 @@ export type VirtualStore = {
33
34
  _getItemsLength(): number;
34
35
  _getScrollOffset(): number;
35
36
  _getScrollOffsetMax(): number;
36
- _getIsScrolling(): boolean;
37
+ _getScrollDirection(): ScrollDirection;
37
38
  _getViewportSize(): number;
38
39
  _getCorrectedScrollSize(): number;
39
40
  _getJumpCount(): number;
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,s=Math.abs,i=Date.now,l=Object.values,c=Array.isArray,u=setTimeout,a=(e,t,n)=>r(n,o(t,e)),d=e=>null!=e,h=(e,t)=>{let n;const r=()=>{d(n)&&clearTimeout(n)},o=()=>{r(),n=u((()=>{n=null,e()}),t)};return o.t=r,o},f=e=>{let t,n;return(...r)=>(t||(t=!0,n=e(...r)),n)},_=e=>getComputedStyle(e),w=e=>e?parseFloat(e):0,g=-1,p=(e,t)=>{const n=e.o[t];return n===g?e.i:n},m=(e,t)=>{if(!e.l)return 0;if(e.u>=t)return e.h[t];let n=e.u,r=e.h[n];for(;n<t;)r+=p(e,n),e.h[++n]=r;return e.u=t,r},v=(e,t,n)=>{let r=0;if(n>=0)for(;t<e.l-1;){const o=p(e,t++);if((r+=o)>=n){r-o/2>=n&&t--;break}}else for(;t>0;){const o=p(e,--t);if((r-=o)<=n){r+o/2<n&&t++;break}}return a(t,0,e.l-1)},b=(e,t,n)=>v(e,n,t-m(e,n)),S=(e,t,n)=>{const r=n?"unshift":"push";for(let n=e.l;n<t;n++)e.o[r](g),e.h.push(0===n?0:g);e.l=t},I=(e,t,n)=>{const r=t-e.l,o=r<0;let s;return o?(s=(n?e.o.splice(0,-r):e.o.splice(r)).reduce(((t,n)=>t+(n===g?e.i:n)),0),e.h.splice(r)):(s=e.i*r,S(e,e.l+r,n)),e.u=n?0:a(t-1,0,e.u),e.l=t,[s,o]},z=(e,t,n)=>t.reduce(((t,[r,o])=>{const s=o-p(e,r);return(!n||s>0)&&(t+=s),t}),0),x=(e,t,n=40,i=0,l=((e,t)=>{const n={i:t,l:0,u:0,o:[],h:[]};return S(n,e),n})(t,n),c,u)=>{let d=n*o(i-1,0),h=0,f=0,_=0,w=0,x=!1,R=!1,y=!1,k=[0,i];const O=new Set,C=()=>(e=>e.l?m(e,e.l-1)+p(e,e.l-1):0)(l),T=()=>C()-d,M=e=>a(e,0,T()),H=e=>{const t=w;return w=e,w!==t&&(0===w||0===t)};return{_:()=>JSON.parse(JSON.stringify(l)),g(){const[e,t]=k,n=b(l,h,r(e,l.l-1)),o=v(l,n,d);return e===n&&t===o?k:k=[n,o]},p:e=>l.o[e]===g,m(e){const t=b(l,e,k[0]);return((e,t,n)=>e.o.slice(t,n+1).includes(g))(l,o(0,t-1),r(l.l-1,v(l,t,d)+1))},v(e){const t=m(l,e);return c?t+o(0,d-C()):t},S:e=>p(l,e),I:()=>l.l,R:()=>h,k:T,O:()=>0!==w,C:()=>d,T:()=>o(C(),d),M:()=>f,H(){const e=_;return _=0,e},J(e,t){const n=[e,t];return O.add(n),()=>{O.delete(n)}},W(t,n){let o,i=0;switch(t){case 1:{const e=n.filter((([e,t])=>l.o[e]!==t));if(!e.length)break;let t=0;if(x||R){const[n]=k;0===h||(t=h>T()-1.5?z(l,e,!0):z(l,e.filter((([e])=>e<n))))}else 2===w&&(t=z(l,e));t&&(_=t,f++,i+=4);let s=!1;e.forEach((([e,t])=>{((e,t,n)=>{const o=e.o[t]===g;return e.o[t]=n,e.u=r(t,e.u),o})(l,e,t)&&(s=!0)})),u&&s&&!h&&(e=>{const t=e.o.filter((e=>e!==g)),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)})(l),i+=2,y=o=!0;break}case 2:d!==n&&(d=n,i=2);break;case 3:if(n[1]){const e=T()-h,[t,o]=I(l,n[0],!0),s=o?-r(t,e):t;_+=s,h=M(h+s),f++,i=5,x=!0}else I(l,n[0]);break;case 4:case 5:if(h===n)break;if(4===t){const e=n-h,t=y;y=!1,0!==w&&t||R||H(e<0?2:1)&&(i+=8),o=s(e)>d,i+=16,t||(x=!1)}h=M(n),i+=1;break;case 6:H(0)&&(i=8),x=R=!1;break;case 7:R=!0}if(i){const t=()=>{O.forEach((([e,t])=>{i&e&&t()}))};o?e(t):t()}}}},R="undefined"!=typeof window?t.useLayoutEffect:t.useEffect,y="current",k={},O=(e,t)=>{if(c(e))for(const n of e)O(n,t);else d(e)&&"boolean"!=typeof e&&t.push(e)},C=e=>{const t=[];return O(e,t),t},T=e=>{const n=t.useRef(e);return R((()=>{n[y]=e}),[e]),n},M=(e,n,r,o)=>{const[s,i]=t.useState(n),l=T(n);if(R((()=>e.J(r,(()=>{i((()=>l[y]()))}))),[]),o){const e=n();s!==e&&i(e)}return s},H=/*#__PURE__*/f((e=>{const t="scrollLeft",n=e[t];e[t]=1;const r=e[t]<1;return e[t]=n,r})),J=(e,t,n)=>(()=>{let r=i()-50;return(...o)=>{const s=i();r+50<s&&(r=s,(r=>{if(e.O()&&!r.ctrlKey&&(t?r.deltaX:r.deltaY)){const t=e.R();t>0&&t<e.k()&&n()}})(...o))}})(),W=(e,t,n)=>{let r,o;const s=t?"scrollLeft":"scrollTop",i=(o,s)=>t&&n?H(r)||s?-o:e.k()-o:o,l=async t=>{if(!r)return;const n=()=>a(t(),0,e.k());for(;;){const t=n();if(e.W(5,t),!e.m(t))break;o&&o[1]();const r=e.J(2,(()=>{o&&o[0]()}));try{await new Promise(((e,t)=>{let n=!1;const r=()=>{n||(n=!0,e(),o=void 0)};o=[r,t],u(r,250)}))}catch(e){return}finally{r()}}r[s]=i(n()),e.W(7)};return{L(n){r=n;const o=()=>{e.W(4,i(n[s]))},l=h((()=>{o(),e.W(6)}),150),c=()=>{o(),l()},u=J(e,t,l);return n.addEventListener("scroll",c),n.addEventListener("wheel",u,{passive:!0}),()=>{n.removeEventListener("scroll",c),n.removeEventListener("wheel",u),l.t()}},$(e){l((()=>e))},q(t){t+=e.R(),l((()=>t))},B(t,n){t=a(t,0,e.I()-1),l("end"===n?()=>e.v(t)+e.S(t)-e.C():()=>e.v(t))},j:e=>{r&&(r[s]+=i(e,!0))}}},L=(e,t)=>{const n=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop";return{L(o){let s=!1;const i=(e,t)=>{const n=t+e[r],o=e.offsetParent;return e!==document.body&&o?i(o,n):n},l=()=>{s&&e.W(4,window[n]-i(o,0))},c=h((()=>{l(),e.W(6)}),150),u=()=>{l(),c()},a=J(e,t,c),d=new IntersectionObserver((([e])=>{s=e.isIntersecting}));return d.observe(o),window.addEventListener("scroll",u),window.addEventListener("wheel",a,{passive:!0}),()=>{d.disconnect(),window.removeEventListener("scroll",u),window.removeEventListener("wheel",a),c.t()}},j:e=>{window.scrollBy(t?e:0,t?0:e)}}},$=e=>{const n=t.useRef();return n[y]||(n[y]=e())},q={box:"border-box"},B=(e,t)=>{let n;const r=t?"width":"height",o=new WeakMap,s=f((()=>new ResizeObserver((s=>{const i=[];for(const{target:l,contentRect:c}of s)if(l.offsetParent)if(l===n)e.W(2,c[r]+c[t?"left":"top"]+w(_(n)[t?"paddingRight":"paddingBottom"]));else{const e=o.get(l);d(e)&&i.push([e,c[r]])}i.length&&e.W(1,i)}))));return{N(e){n=e;const t=s();return t.observe(e,q),()=>{t.disconnect()}},U(e,t){const n=s();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,s=f((()=>new ResizeObserver((t=>{const r=[];for(const{target:e,contentRect:s}of t){if(!e.offsetParent)continue;const t=o.get(e);d(t)&&r.push([t,s[n]])}r.length&&e.W(1,r)}))));return{N(){const t=()=>{e.W(2,window[r])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),s().disconnect()}},U(e,t){const n=s();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},N=(e,t)=>{let n;const r="height",s="width",i=new WeakMap,l=new Set,c=new Set,u=new Map,a=(e,t)=>`${e}-${t}`,d=f((()=>new ResizeObserver((d=>{const h=new Set,f=new Set;for(const{target:o,contentRect:l}of d)if(o.offsetParent)if(o===n){const o=_(n);e.W(2,l[r]+l.top+w(o.paddingBottom)),t.W(2,l[s]+l.left+w(o.paddingRight))}else{const e=i.get(o);if(e){const[t,n]=e,o=a(t,n),i=u.get(o),c=[l[r],l[s]];let d,_;i?(i[0]!==c[0]&&(d=!0),i[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.W(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.W(1,e)}}))));return{N(e){n=e;const t=d();return t.observe(e,q),()=>{t.disconnect()}},U(e,t,n){const r=d();return i.set(e,[t,n]),l.add(t),c.add(n),r.observe(e),()=>{i.delete(e),r.unobserve(e)}}}},U=t.forwardRef((({children:n,attrs:r,width:o,height:s,scrolling:i},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!=s?s:"100%",pointerEvents:i?"none":"auto"})),[o,s,i]),children:n})}))),V=t.memo((({V:n,A:r,D:o,F:s,P:i,X:l,Y:c})=>{const u=t.useRef(null),a=M(o,(()=>o.v(s)),2,!0),d=M(o,(()=>o.p(s)),2,!0);return R((()=>r.U(u[y],s)),[s]),e.jsx(i,{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})})),A=t.forwardRef((({children:s,overscan:i=4,initialItemSize:c,initialItemCount:u,shift:a,horizontal:h,mode:f,cache:_,components:{Root:w=U,Item:g="div"}=k,onScroll:p,onScrollStop:m,onRangeChange:v,...b},S)=>{const I=t.useMemo((()=>C(s)),[s]),z=I.length,O=T(p),H=T(m),[J,L,q,j,N]=$((()=>{const e=!!h,t="rtl"===f,r=x(n.flushSync,z,c,u,_,"reverse"===f,!c);return[r,B(r,e),W(r,e,t),e,t]}));z!==J.I()&&J.W(3,[z,a]);const[A,D]=M(J,J.g,3),E=M(J,J.O,8),F=M(J,J.M,4),P=M(J,J.T,2,!0),X=t.useRef(null);R((()=>{const e=X[y],t=L.N(e),n=q.L(e),r=J.J(16,(()=>{O[y]&&O[y](J.R())}));return()=>{t(),n(),r()}}),[]),R((()=>{const e=J.H();e&&q.j(e)}),[F]),t.useEffect((()=>{E||H[y]&&H[y]()}),[E]),t.useEffect((()=>{v&&v(A,D)}),[A,D]),t.useImperativeHandle(S,(()=>({get cache(){return J._()},get scrollOffset(){return J.R()},get scrollSize(){return J.T()},get viewportSize(){return J.C()},scrollToIndex:q.B,scrollTo:q.$,scrollBy:q.q})),[]);const Y=o(A-i,0),G=r(D+i,z-1),K=t.useMemo((()=>{const t=[];for(let n=Y;n<=G;n++){const r=I[n],o=r.key;t.push(e.jsx(V,{A:L,D:J,F:n,P:g,V:r,X:j,Y:N},d(o)?o:"_"+n))}return t}),[I,Y,G]);return e.jsx(w,{ref:X,width:j?P:void 0,height:j?void 0:P,scrolling:E,attrs:t.useMemo((()=>({...b,style:{overflow:"auto",display:j?"inline-block":"block",contain:"strict",width:"100%",height:"100%",...b.style}})),l(b)),children:K})})),D=(e,t)=>`${e}-${t}`,E=t.memo((({V:n,A:r,G:o,K:s,Z:i,ee:l,P:c,Y:u})=>{const a=t.useRef(null),d=M(o,(()=>o.v(i)),2,!0),h=M(s,(()=>s.v(l)),2,!0),f=M(o,(()=>o.p(i)),2,!0),_=M(s,(()=>s.p(l)),2,!0),w=M(o,(()=>o.S(i)),2,!0),g=M(s,(()=>s.S(l)),2,!0);return R((()=>r.U(a[y],i,l)),[l,i]),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:w,minWidth:g})),[d,h,g,w,f,_]),children:n})})),F=t.forwardRef((({children:s,row:i,col:c,cellHeight:u=40,cellWidth:a=100,overscan:d=2,initialRowCount:h,initialColCount:f,rtl:_,components:{Root:w=U,Cell:g="div"}=k,...p},m)=>{const[v,b,S,I,z,O]=$((()=>{const e=!!_,t=x(n.flushSync,i,u,h),r=x(n.flushSync,c,a,f);return[t,r,N(t,r),W(t,!1,e),W(r,!0,e),e]}));i!==v.I()&&v.W(3,[i]),c!==b.I()&&b.W(3,[c]);const[C,T]=M(v,v.g,3),[H,J]=M(b,b.g,3),L=M(v,v.O,8),q=M(b,b.O,8),B=M(v,v.M,4),j=M(b,b.M,4),V=M(v,v.T,2,!0),A=M(b,b.T,2,!0),F=t.useRef(null);R((()=>{const e=F[y],t=S.N(e),n=I.L(e),r=z.L(e);return()=>{t(),n(),r()}}),[]),R((()=>{const e=v.H();e&&I.j(e)}),[B]),R((()=>{const e=b.H();e&&z.j(e)}),[j]),t.useImperativeHandle(m,(()=>({get scrollOffset(){return[b.R(),v.R()]},get scrollSize(){return[b.T(),v.T()]},get viewportSize(){return[b.C(),v.C()]},scrollToIndex(e,t){z.B(e),I.B(t)},scrollTo(e,t){z.$(e),I.$(t)},scrollBy(e,t){z.q(e),I.q(t)}})),[]);const P=t.useMemo((()=>{const e=new Map;return(t,n)=>{let r=e.get(D(t,n));return r||e.set(D(t,n),r=s({rowIndex:t,colIndex:n})),r}}),[s]),X=o(C-d,0),Y=r(T+d,i-1),G=o(H-d,0),K=r(J+d,c-1),Q=t.useMemo((()=>{const t=[];for(let n=X;n<=Y;n++)for(let r=G;r<=K;r++)t.push(e.jsx(E,{A:S,G:v,K:b,Z:n,ee:r,P:g,V:P(n,r),Y:O},D(n,r)));return t}),[P,X,Y,G,K]);return e.jsx(w,{ref:F,width:A,height:V,scrolling:L||q,attrs:t.useMemo((()=>({...p,style:{overflow:"auto",contain:"strict",width:"100%",height:"100%",...p.style}})),l(p)),children:Q})})),P=t.forwardRef((({children:s,overscan:i=4,initialItemSize:c,initialItemCount:u,horizontal:a,cache:h,components:{Root:f=U,Item:_="div"}=k,onScrollStop:w,onRangeChange:g,...p},m)=>{const v=t.useMemo((()=>C(s)),[s]),b=v.length,S=T(w),[I,z,O,H]=$((()=>{const e=!!a,t=x(n.flushSync,b,c,u,h,!1,!c);return[t,j(t,e),L(t,e),e]}));b!==I.I()&&I.W(3,[b]);const[J,W]=M(I,I.g,3),q=M(I,I.O,8),B=M(I,I.M,4),N=M(I,I.T,2,!0),A=t.useRef(null);R((()=>{const e=A[y],t=z.N(e),n=O.L(e);return()=>{t(),n()}}),[]),R((()=>{const e=I.H();e&&O.j(e)}),[B]),t.useEffect((()=>{q||S[y]&&S[y]()}),[q]),t.useEffect((()=>{g&&g(J,W)}),[J,W]),t.useImperativeHandle(m,(()=>({get cache(){return I._()}})),[]);const D=o(J-i,0),E=r(W+i,b-1),F=t.useMemo((()=>{const t=[];for(let n=D;n<=E;n++){const r=v[n],o=r.key;t.push(e.jsx(V,{A:z,D:I,F:n,P:_,V:r,X:H,Y:!1},d(o)?o:"_"+n))}return t}),[v,D,E]);return e.jsx(f,{ref:A,width:H?N:void 0,height:H?void 0:N,scrolling:q,attrs:t.useMemo((()=>({...p,style:{display:H?"inline-block":"block",width:H?"auto":"100%",height:H?"100%":"auto",...p.style}})),l(p)),children:F})}));exports.VGrid=F,exports.VList=A,exports.WVList=P;
2
+ var e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom");const r=Math.min,o=Math.max,s=Math.abs,i=Date.now,c=Object.values,l=Array.isArray,u=setTimeout,a=(e,t,n)=>r(n,o(t,e)),d=e=>null!=e,h=(e,t)=>{let n;const r=()=>{d(n)&&clearTimeout(n)},o=()=>{r(),n=u((()=>{n=null,e()}),t)};return o.t=r,o},f=e=>{let t,n;return(...r)=>(t||(t=!0,n=e(...r)),n)},_=e=>getComputedStyle(e),w=e=>e?parseFloat(e):0,g=-1,p=(e,t)=>{const n=e.o[t];return n===g?e.i:n},m=(e,t)=>{if(!e.l)return 0;if(e.u>=t)return e.h[t];let n=e.u,r=e.h[n];for(;n<t;)r+=p(e,n),e.h[++n]=r;return e.u=t,r},v=(e,t,n)=>{let r=m(e,n);for(;n>=0&&n<e.l;)if(r<=t){const o=p(e,n);if(r+o>t)break;r+=o,n++}else r-=p(e,--n);return a(n,0,e.l-1)},b=(e,t,n,o)=>{const s=v(e,t,r(n,e.l-1));return[s,v(e,t+o,s)]},S=(e,t,n)=>{const r=n?"unshift":"push";for(let n=e.l;n<t;n++)e.o[r](g),e.h.push(0===n?0:g);e.l=t},I=(e,t,n)=>{const r=t-e.l,o=r<0;let s;return o?(s=(n?e.o.splice(0,-r):e.o.splice(r)).reduce(((t,n)=>t+(n===g?e.i:n)),0),e.h.splice(r)):(s=e.i*r,S(e,e.l+r,n)),e.u=n?0:a(t-1,0,e.u),e.l=t,[s,o]},z=(e,t,n)=>t.reduce(((t,[r,o])=>{const s=o-p(e,r);return(!n||s>0)&&(t+=s),t}),0),x=(e,t,n=40,i=0,c=((e,t)=>{const n={i:t,l:0,u:0,o:[],h:[]};return S(n,e),n})(t,n),l,u)=>{let d=n*o(i-1,0),h=0,f=0,_=0,w=0,v=!1,x=!1,y=!1,R=[0,i];const k=new Set,O=()=>(e=>e.l?m(e,e.l-1)+p(e,e.l-1):0)(c),C=()=>O()-d,T=e=>a(e,0,C()),M=e=>{const t=w;return w=e,w!==t};return{_:()=>JSON.parse(JSON.stringify(c)),g(){const[e,t]=R,[n,r]=b(c,h,e,d);return e===n&&t===r?R:R=[n,r]},p:e=>c.o[e]===g,m(e){const[t,n]=b(c,e,R[0],d);return((e,t,n)=>e.o.slice(o(0,t-1),r(e.l-1,n+1)+1).includes(g))(c,t,n)},v(e){const t=m(c,e);return l?t+o(0,d-O()):t},S:e=>p(c,e),I:()=>c.l,R:()=>h,k:C,O:()=>w,C:()=>d,T:()=>o(O(),d),M:()=>f,H(){const e=_;return _=0,e},J(e,t){const n=[e,t];return k.add(n),()=>{k.delete(n)}},W(t,n){let o,i=0;switch(t){case 1:{const e=n.filter((([e,t])=>c.o[e]!==t));if(!e.length)break;let t=0;if(v||x){const[n]=R;0===h||(t=h>C()-1.5?z(c,e,!0):z(c,e.filter((([e])=>e<n))))}else 2===w&&(t=z(c,e));t&&(_=t,f++,i+=4);let s=!1;e.forEach((([e,t])=>{((e,t,n)=>{const o=e.o[t]===g;return e.o[t]=n,e.u=r(t,e.u),o})(c,e,t)&&(s=!0)})),u&&s&&!h&&(e=>{const t=e.o.filter((e=>e!==g)),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)})(c),i+=2,y=o=!0;break}case 2:d!==n&&(d=n,i=2);break;case 3:if(n[1]){const e=C()-h,[t,o]=I(c,n[0],!0),s=o?-r(t,e):t;_+=s,h=T(h+s),f++,i=5,v=!0}else I(c,n[0]);break;case 4:case 5:if(h===n)break;if(4===t){const e=n-h,t=y;y=!1,0!==w&&t||x||M(e<0?2:1)&&(i+=8),o=s(e)>d,i+=16,t||(v=!1)}h=T(n),i+=1;break;case 6:M(0)&&(i=8),v=x=!1;break;case 7:x=!0}if(i){const t=()=>{k.forEach((([e,t])=>{i&e&&t()}))};o?e(t):t()}}}},y="undefined"!=typeof window,R=/*#__PURE__*/f((e=>{const t="scrollLeft",n=e[t];e[t]=1;const r=e[t]<1;return e[t]=n,r})),k=/*#__PURE__*/f((()=>!!y&&"rtl"===_(document.body).direction)),O=y?t.useLayoutEffect:t.useEffect,C="current",T={},M=(e,t)=>{if(l(e))for(const n of e)M(n,t);else d(e)&&"boolean"!=typeof e&&t.push(e)},H=e=>{const t=[];return M(e,t),t},J=(e,t,n)=>o(e-(1===n?1:o(1,t)),0),W=(e,t,n,s)=>r(e+(2===n?1:o(1,t)),s-1),L=e=>{const n=t.useRef(e);return O((()=>{n[C]=e}),[e]),n},$=(e,n,r,o)=>{const[s,i]=t.useState(n),c=L(n);if(O((()=>e.J(r,(()=>{i((()=>c[C]()))}))),[]),o){const e=n();s!==e&&i(e)}return s},q=(e,t,n)=>(()=>{let r=i()-50;return(...o)=>{const s=i();r+50<s&&(r=s,(r=>{if(0!==e.O()&&!r.ctrlKey&&(t?r.deltaX:r.deltaY)){const t=e.R();t>0&&t<e.k()&&n()}})(...o))}})(),B=(e,t,n,r)=>R(e)||r?-n:t.k()-n,j=(e,t)=>{let n,r;const o=t?"scrollLeft":"scrollTop",s=(r,o)=>t&&k()?B(n,e,r,o):r,i=async t=>{if(!n)return;const i=()=>a(t(),0,e.k());for(;;){const t=i();if(e.W(5,t),!e.m(t))break;r&&r[1]();const n=e.J(2,(()=>{r&&r[0]()}));try{await new Promise(((e,t)=>{let n=!1;const o=()=>{n||(n=!0,e(),r=void 0)};r=[o,t],u(o,250)}))}catch(e){return}finally{n()}}n[o]=s(i()),e.W(7)};return{L(r){n=r;const i=()=>{e.W(4,s(r[o]))},c=h((()=>{i(),e.W(6)}),150),l=()=>{i(),c()},u=q(e,t,c);return r.addEventListener("scroll",l),r.addEventListener("wheel",u,{passive:!0}),()=>{r.removeEventListener("scroll",l),r.removeEventListener("wheel",u),c.t()}},$(e){i((()=>e))},q(t){t+=e.R(),i((()=>t))},B(t,n){t=a(t,0,e.I()-1),i("end"===n?()=>e.v(t)+e.S(t)-e.C():()=>e.v(t))},j:e=>{n&&(n[o]+=s(e,!0))}}},D=(e,t)=>{let n;const r=t?"scrollX":"scrollY",o=t?"offsetLeft":"offsetTop",s=(r,o)=>t&&k()?B(n,e,r,o):r;return{L(i){n=i;let c=!1;const l=(e,n)=>{const r=n+(t&&k()?window.innerWidth-e[o]-e.offsetWidth:e[o]),s=e.offsetParent;return e!==document.body&&s?l(s,r):r},u=()=>{c&&e.W(4,s(window[r])-l(i,0))},a=h((()=>{u(),e.W(6)}),150),d=()=>{u(),a()},f=q(e,t,a),_=new IntersectionObserver((([e])=>{c=e.isIntersecting}));return _.observe(i),window.addEventListener("scroll",d),window.addEventListener("wheel",f,{passive:!0}),()=>{_.disconnect(),window.removeEventListener("scroll",d),window.removeEventListener("wheel",f),a.t()}},j:e=>{window.scrollBy(t?s(e,!0):0,t?0:e)}}},N=e=>{const n=t.useRef();return n[C]||(n[C]=e())},U={box:"border-box"},V=(e,t)=>{let n;const r=t?"width":"height",o=new WeakMap,s=f((()=>new ResizeObserver((s=>{const i=[];for(const{target:c,contentRect:l}of s)if(c.offsetParent)if(c===n)e.W(2,l[r]+l[t?"left":"top"]+w(_(n)[t?"paddingRight":"paddingBottom"]));else{const e=o.get(c);d(e)&&i.push([e,l[r]])}i.length&&e.W(1,i)}))));return{D(e){n=e;const t=s();return t.observe(e,U),()=>{t.disconnect()}},N(e,t){const n=s();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},A=(e,t)=>{const n=t?"width":"height",r=t?"innerWidth":"innerHeight",o=new WeakMap,s=f((()=>new ResizeObserver((t=>{const r=[];for(const{target:e,contentRect:s}of t){if(!e.offsetParent)continue;const t=o.get(e);d(t)&&r.push([t,s[n]])}r.length&&e.W(1,r)}))));return{D(){const t=()=>{e.W(2,window[r])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),s().disconnect()}},N(e,t){const n=s();return o.set(e,t),n.observe(e),()=>{o.delete(e),n.unobserve(e)}}}},E=(e,t)=>{let n;const r="height",s="width",i=new WeakMap,c=new Set,l=new Set,u=new Map,a=(e,t)=>`${e}-${t}`,d=f((()=>new ResizeObserver((d=>{const h=new Set,f=new Set;for(const{target:o,contentRect:c}of d)if(o.offsetParent)if(o===n){const o=_(n);e.W(2,c[r]+c.top+w(o.paddingBottom)),t.W(2,c[s]+c.left+w(o.paddingRight))}else{const e=i.get(o);if(e){const[t,n]=e,o=a(t,n),i=u.get(o),l=[c[r],c[s]];let d,_;i?(i[0]!==l[0]&&(d=!0),i[1]!==l[1]&&(_=!0)):d=_=!0,d&&h.add(t),_&&f.add(n),(d||_)&&u.set(o,l)}}if(h.size){const t=[];h.forEach((e=>{let n=0;l.forEach((t=>{const r=u.get(a(e,t));r&&(n=o(n,r[0]))})),n&&t.push([e,n])})),e.W(1,t)}if(f.size){const e=[];f.forEach((t=>{let n=0;c.forEach((e=>{const r=u.get(a(e,t));r&&(n=o(n,r[1]))})),n&&e.push([t,n])})),t.W(1,e)}}))));return{D(e){n=e;const t=d();return t.observe(e,U),()=>{t.disconnect()}},N(e,t,n){const r=d();return i.set(e,[t,n]),c.add(t),l.add(n),r.observe(e),()=>{i.delete(e),r.unobserve(e)}}}},F=t.forwardRef((({children:n,attrs:r,width:o,height:s,scrolling:i},c)=>e.jsx("div",{ref:c,...r,children:e.jsx("div",{style:t.useMemo((()=>({position:"relative",visibility:"hidden",width:null!=o?o:"100%",height:null!=s?s:"100%",pointerEvents:i?"none":"auto"})),[o,s,i]),children:n})}))),P=t.memo((({U:n,V:r,A:o,F:s,P:i,X:c})=>{const l=t.useRef(null),u=$(o,(()=>o.v(s)),2,!0),a=$(o,(()=>o.p(s)),2,!0);return O((()=>r.N(l[C],s)),[s]),e.jsx(i,{ref:l,style:t.useMemo((()=>{const e=k()?"right":"left",t={margin:0,padding:0,position:"absolute",[c?"height":"width"]:"100%",[c?"top":e]:0,[c?e:"top"]:u,visibility:a?"hidden":"visible"};return c&&(t.display="flex"),t}),[u,a]),children:n})})),X=t.forwardRef((({children:r,overscan:o=4,initialItemSize:s,initialItemCount:i,shift:l,horizontal:u,reverse:a,cache:h,components:{Root:f=F,Item:_="div"}=T,onScroll:w,onScrollStop:g,onRangeChange:p,...m},v)=>{const b=t.useMemo((()=>H(r)),[r]),S=b.length,I=L(w),z=L(g),[y,R,k,M]=N((()=>{const e=!!u,t=x(n.flushSync,S,s,i,h,!!a,!s);return[t,V(t,e),j(t,e),e]}));S!==y.I()&&y.W(3,[S,l]);const[q,B]=$(y,y.g,3),D=$(y,y.O,8),U=$(y,y.M,4),A=$(y,y.T,2,!0),E=t.useRef(null),X=0!==D;O((()=>{const e=E[C],t=R.D(e),n=k.L(e),r=y.J(16,(()=>{I[C]&&I[C](y.R())}));return()=>{t(),n(),r()}}),[]),O((()=>{const e=y.H();e&&k.j(e)}),[U]),t.useEffect((()=>{X||z[C]&&z[C]()}),[X]),t.useEffect((()=>{p&&p(q,B)}),[q,B]),t.useImperativeHandle(v,(()=>({get cache(){return y._()},get scrollOffset(){return y.R()},get scrollSize(){return y.T()},get viewportSize(){return y.C()},scrollToIndex:k.B,scrollTo:k.$,scrollBy:k.q})),[]);const Y=J(q,o,D),G=W(B,o,D,S),K=t.useMemo((()=>{const t=[];for(let n=Y;n<=G;n++){const r=b[n],o=r.key;t.push(e.jsx(P,{V:R,A:y,F:n,P:_,U:r,X:M},d(o)?o:"_"+n))}return t}),[b,Y,G]);return e.jsx(f,{ref:E,width:M?A:void 0,height:M?void 0:A,scrolling:X,attrs:t.useMemo((()=>({...m,style:{overflow:"auto",display:M?"inline-block":"block",contain:"strict",width:"100%",height:"100%",...m.style}})),c(m)),children:K})})),Y=(e,t)=>`${e}-${t}`,G=t.memo((({U:n,V:r,Y:o,G:s,K:i,Z:c,P:l})=>{const u=t.useRef(null),a=$(o,(()=>o.v(i)),2,!0),d=$(s,(()=>s.v(c)),2,!0),h=$(o,(()=>o.p(i)),2,!0),f=$(s,(()=>s.p(c)),2,!0),_=$(o,(()=>o.S(i)),2,!0),w=$(s,(()=>s.S(c)),2,!0);return O((()=>r.N(u[C],i,c)),[c,i]),e.jsx(l,{ref:u,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:a,[k()?"right":"left"]:d,visibility:h||f?"hidden":"visible",minHeight:_,minWidth:w})),[a,d,w,_,h,f]),children:n})})),K=t.forwardRef((({children:r,row:o,col:s,cellHeight:i=40,cellWidth:l=100,overscan:u=2,initialRowCount:a,initialColCount:d,components:{Root:h=F,Cell:f="div"}=T,..._},w)=>{const[g,p,m,v,b]=N((()=>{const e=x(n.flushSync,o,i,a),t=x(n.flushSync,s,l,d);return[e,t,E(e,t),j(e,!1),j(t,!0)]}));o!==g.I()&&g.W(3,[o]),s!==p.I()&&p.W(3,[s]);const[S,I]=$(g,g.g,3),[z,y]=$(p,p.g,3),R=$(g,g.O,8),k=$(p,p.O,8),M=$(g,g.M,4),H=$(p,p.M,4),L=$(g,g.T,2,!0),q=$(p,p.T,2,!0),B=t.useRef(null),D=0!==R,U=0!==k;O((()=>{const e=B[C],t=m.D(e),n=v.L(e),r=b.L(e);return()=>{t(),n(),r()}}),[]),O((()=>{const e=g.H();e&&v.j(e)}),[M]),O((()=>{const e=p.H();e&&b.j(e)}),[H]),t.useImperativeHandle(w,(()=>({get scrollOffset(){return[p.R(),g.R()]},get scrollSize(){return[p.T(),g.T()]},get viewportSize(){return[p.C(),g.C()]},scrollToIndex(e,t){b.B(e),v.B(t)},scrollTo(e,t){b.$(e),v.$(t)},scrollBy(e,t){b.q(e),v.q(t)}})),[]);const V=t.useMemo((()=>{const e=new Map;return(t,n)=>{let o=e.get(Y(t,n));return o||e.set(Y(t,n),o=r({rowIndex:t,colIndex:n})),o}}),[r]),A=J(S,u,R),P=W(I,u,R,o),X=J(z,u,k),K=W(y,u,k,s),Q=t.useMemo((()=>{const t=[];for(let n=A;n<=P;n++)for(let r=X;r<=K;r++)t.push(e.jsx(G,{V:m,Y:g,G:p,K:n,Z:r,P:f,U:V(n,r)},Y(n,r)));return t}),[V,A,P,X,K]);return e.jsx(h,{ref:B,width:q,height:L,scrolling:D||U,attrs:t.useMemo((()=>({..._,style:{overflow:"auto",contain:"strict",width:"100%",height:"100%",..._.style}})),c(_)),children:Q})})),Q=t.forwardRef((({children:r,overscan:o=4,initialItemSize:s,initialItemCount:i,horizontal:l,cache:u,components:{Root:a=F,Item:h="div"}=T,onScrollStop:f,onRangeChange:_,...w},g)=>{const p=t.useMemo((()=>H(r)),[r]),m=p.length,v=L(f),[b,S,I,z]=N((()=>{const e=!!l,t=x(n.flushSync,m,s,i,u,!1,!s);return[t,A(t,e),D(t,e),e]}));m!==b.I()&&b.W(3,[m]);const[y,R]=$(b,b.g,3),k=$(b,b.O,8),M=$(b,b.M,4),q=$(b,b.T,2,!0),B=t.useRef(null),j=0!==k;O((()=>{const e=B[C],t=S.D(e),n=I.L(e);return()=>{t(),n()}}),[]),O((()=>{const e=b.H();e&&I.j(e)}),[M]),t.useEffect((()=>{j||v[C]&&v[C]()}),[j]),t.useEffect((()=>{_&&_(y,R)}),[y,R]),t.useImperativeHandle(g,(()=>({get cache(){return b._()}})),[]);const U=J(y,o,k),V=W(R,o,k,m),E=t.useMemo((()=>{const t=[];for(let n=U;n<=V;n++){const r=p[n],o=r.key;t.push(e.jsx(P,{V:S,A:b,F:n,P:h,U:r,X:z},d(o)?o:"_"+n))}return t}),[p,U,V]);return e.jsx(a,{ref:B,width:z?q:void 0,height:z?void 0:q,scrolling:j,attrs:t.useMemo((()=>({...w,style:{display:z?"inline-block":"block",width:z?"auto":"100%",height:z?"100%":"auto",...w.style}})),c(w)),children:E})}));exports.VGrid=K,exports.VList=X,exports.WVList=Q;
3
3
  //# sourceMappingURL=index.js.map