virtua 0.17.6 → 0.18.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
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![npm](https://img.shields.io/npm/v/virtua) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/virtua) ![npm](https://img.shields.io/npm/dw/virtua) [![check](https://github.com/inokawa/virtua/actions/workflows/check.yml/badge.svg)](https://github.com/inokawa/virtua/actions/workflows/check.yml) [![demo](https://github.com/inokawa/virtua/actions/workflows/demo.yml/badge.svg)](https://github.com/inokawa/virtua/actions/workflows/demo.yml)
4
4
 
5
- > A zero-config, fast and small (~3kB) virtual list (and grid) component for [React](https://github.com/facebook/react).
5
+ > A zero-config, fast and small (~3kB) virtual list (and grid) component for [React](https://github.com/facebook/react) and [Vue](https://vuejs.org/).
6
6
 
7
7
  ![example](./example.gif)
8
8
 
@@ -14,9 +14,9 @@ This project is a challenge to rethink virtualization. The goals are...
14
14
 
15
15
  - **Zero-config virtualization:** 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 while reverse scrolling and imperative scrolling, iOS support, etc).
16
16
  - **Fast:** Natural virtual scrolling needs optimization in many aspects (eliminate frame drops by reducing CPU usage and GC and [layout recalculation](https://gist.github.com/paulirish/5d52fb081b3570c81e3a), reduce visual jumps on repaint, optimize with CSS, optimize for frameworks, etc). We are trying to combine the best of them.
17
- - **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 [~5kB gzipped](https://bundlephobia.com/package/virtua).
17
+ - **Small:** Its bundle size should be small as much as possible to be friendly with modern web development. Currently each components are ~3kB gzipped. The total is [~5kB gzipped](https://bundlephobia.com/package/virtua) and tree-shakeable.
18
18
  - **Flexible:** Aiming to support many usecases - fixed size, dynamic size, horizontal scrolling, reverse scrolling, RTL, mobile, infinite scrolling, scroll restoration, DnD, keyboard navigation, sticky, placeholder and more. See [live demo](#demo).
19
- - **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.
19
+ - **Framework agnostic:** Currently [React](https://react.dev/) and [Vue](https://vuejs.org/) are supported. We could support [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.
20
20
 
21
21
  ## Demo
22
22
 
@@ -28,17 +28,17 @@ https://inokawa.github.io/virtua/
28
28
  npm install virtua
29
29
  ```
30
30
 
31
- ### Requirements
31
+ If you use this lib in [legacy browsers which does not have ResizeObserver](https://caniuse.com/?search=resizeobserver), you should use [polyfill](https://github.com/juggle/resize-observer#switching-between-native-and-polyfilled-versions).
32
32
 
33
- - react >= 16.14
33
+ ## Getting started
34
34
 
35
- If you use ESM and webpack 5, use react >= 18 to avoid [Can't resolve `react/jsx-runtime` error](https://github.com/facebook/react/issues/20235).
35
+ ### React
36
36
 
37
- If you use this lib in [legacy browsers which does not have ResizeObserver](https://caniuse.com/?search=resizeobserver), you should use [polyfill](https://github.com/juggle/resize-observer#switching-between-native-and-polyfilled-versions).
37
+ `react >= 16.14` is required.
38
38
 
39
- ## Usage
39
+ If you use ESM and webpack 5, use react >= 18 to avoid [Can't resolve `react/jsx-runtime` error](https://github.com/facebook/react/issues/20235).
40
40
 
41
- ### Vertical scroll
41
+ #### Vertical scroll
42
42
 
43
43
  ```tsx
44
44
  import { VList } from "virtua";
@@ -63,7 +63,7 @@ export const App = () => {
63
63
  };
64
64
  ```
65
65
 
66
- ### Horizontal scroll
66
+ #### Horizontal scroll
67
67
 
68
68
  ```tsx
69
69
  import { VList } from "virtua";
@@ -88,7 +88,7 @@ export const App = () => {
88
88
  };
89
89
  ```
90
90
 
91
- ### Window scroll
91
+ #### Window scroll
92
92
 
93
93
  ```tsx
94
94
  import { WVList } from "virtua";
@@ -115,7 +115,7 @@ export const App = () => {
115
115
  };
116
116
  ```
117
117
 
118
- ### Vertical and horizontal scroll
118
+ #### Vertical and horizontal scroll
119
119
 
120
120
  ```tsx
121
121
  import { experimental_VGrid as VGrid } from "virtua";
@@ -139,7 +139,7 @@ export const App = () => {
139
139
  };
140
140
  ```
141
141
 
142
- ### React Server Components (RSC) support
142
+ #### React Server Components (RSC) support
143
143
 
144
144
  This library is marked as a Client Component. You can render RSC as children of VList or WVList.
145
145
 
@@ -163,11 +163,43 @@ export default async () => {
163
163
  };
164
164
  ```
165
165
 
166
- And see [examples](./stories) for more usages.
166
+ ### Vue
167
+
168
+ `vue >= 3.2` is required.
169
+
170
+ ```vue
171
+ <script setup>
172
+ import { VList } from "virtua/vue";
173
+
174
+ const heights = [20, 40, 180, 77];
175
+ const data = Array.from({ length: 1000 }).map((_, i) => ({
176
+ id: i,
177
+ height: heights[i % 4] + "px",
178
+ }));
179
+ </script>
180
+
181
+ <template>
182
+ <VList :data="data">
183
+ <template #default="item">
184
+ <div
185
+ :key="item.id"
186
+ :style="{
187
+ height: item.height,
188
+ background: 'white',
189
+ borderBottom: 'solid 1px #ccc',
190
+ }"
191
+ >
192
+ {{ item.id }}
193
+ </div>
194
+ </template>
195
+ </VList>
196
+ </template>
197
+ ```
167
198
 
168
199
  ## Documentation
169
200
 
170
201
  - [API reference](./docs/API.md)
202
+ - [Examples](./stories) for more usages
171
203
 
172
204
  ### FAQs
173
205
 
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 o=Math.min,r=Math.max,i=Math.abs,s=Date.now,l=Object.values,c=Array.isArray,a=setTimeout,u=(e,t,n)=>o(n,r(t,e)),h=e=>null!=e,d=(e,t)=>{let n;const o=()=>{h(n)&&clearTimeout(n)},r=()=>{o(),n=a((()=>{n=null,e()}),t)};return r.t=o,r},f=e=>{let t,n;return(...o)=>(t||(t=!0,n=e(...o)),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},v=(e,t)=>{if(!e.l)return 0;if(e.u>=t)return e.h[t];let n=e.u,o=e.h[n];for(;n<t;)o+=p(e,n),e.h[++n]=o;return e.u=t,o},m=(e,t,n)=>{let o=v(e,n);for(;n>=0&&n<e.l;)if(o<=t){const r=p(e,n);if(o+r>t)break;o+=r,n++}else o-=p(e,--n);return u(n,0,e.l-1)},b=(e,t,n,r)=>{const i=m(e,t,o(n,e.l-1));return[i,m(e,t+r,i)]},S=(e,t,n)=>{const o=n?"unshift":"push";for(let n=e.l;n<t;n++)e.o[o](g),e.h.push(0===n?0:g);e.l=t},z=(e,t,n)=>{const o=t-e.l,r=o<0;let i;return r?(i=(n?e.o.splice(0,-o):e.o.splice(o)).reduce(((t,n)=>t+(n===g?e.i:n)),0),e.h.splice(o)):(i=e.i*o,S(e,e.l+o,n)),e.u=n?0:u(t-1,0,e.u),e.l=t,[i,r]},y="undefined"!=typeof window,I=()=>document.documentElement,x=/*#__PURE__*/f((e=>{const t="scrollLeft",n=e[t];e[t]=1;const o=e[t]<1;return e[t]=n,o})),R=/*#__PURE__*/f((()=>!!y&&"rtl"===_(I()).direction)),k=/*#__PURE__*/f((()=>/iP(hone|od|ad)/.test(navigator.userAgent))),O=/*#__PURE__*/f((()=>"scrollBehavior"in I().style)),C=(e,t,n)=>r(e-(n===H?1:r(1,t)),0),T=(e,t,n,i)=>o(e+(n===J?1:r(1,t)),i-1),M=(e,t,n)=>t.reduce(((t,[o,r])=>{const i=r-p(e,o);return(!n||i>0)&&(t+=i),t}),0),H=1,J=2,W=(e,t=40,n=0,s=((e,t)=>{const n={i:t,l:0,u:0,o:[],h:[]};return S(n,e),n})(e,t),l)=>{let c=t*r(n-1,0),a=0,h=0,d=0,f=0,_=0,w=0,m=0,y=0,I=!1,x=!1,R=null,O=[0,n];const C=new Set,T=()=>(e=>e.l?v(e,e.l-1)+p(e,e.l-1):0)(s),W=()=>c-a-h,B=()=>T()-W(),L=e=>{k()&&0!==y?w+=e:(_+=e,f++)};return{_:()=>JSON.parse(JSON.stringify(s)),g:()=>R?[o(O[0],R[0]),r(O[1],R[1])]:m?O:O=b(s,d+w+_,O[0],c),p:e=>s.o[e]===g,v:()=>!!R&&s.o.slice(r(0,R[0]-1),o(s.l-1,R[1]+1)+1).includes(g),m:e=>v(s,e)-w,S:e=>p(s,e),I:()=>s.l,R:()=>d,k:B,O:()=>y,C:()=>c,T:()=>a,M:()=>r(T(),W()),H:T,J:()=>f,W:()=>W()>T()?_=0:(m=_,_=0,m),B(e,t){const n=[e,t];return C.add(n),()=>{C.delete(n)}},L(e,t){let n,r,p=0;switch(e){case 1:{const e=t.filter((([e,t])=>s.o[e]!==t)),n=I;if(I=!1,!e.length)break;let i=0;if(0===d);else if(d>B()-1.5)i=M(s,e,!0);else if(n)i=M(s,e);else{const[t]=O;i=M(s,e.filter((([e])=>e<t)))}i&&L(i);let c=!1;e.forEach((([e,t])=>{((e,t,n)=>{const r=e.o[t]===g;return e.o[t]=n,e.u=o(t,e.u),r})(s,e,t)&&(c=!0)})),l&&c&&!d&&(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)})(s),p=2,r=!0;break}case 2:{const e=t[0]+t[1]+t[2];c!==e&&(c=e,a=t[1],h=t[2],p=2);break}case 3:if(t[1]){const e=B()-d,[n,r]=z(s,t[0],!0);L(r?-o(n,e):n),I=!r,p=1}else z(s,t[0]);break;case 4:{const e=u(t,0,B()),n=m;if(m=0,e===d)break;const o=e-d,s=i(o);n&&s<i(n)+1||x||(y=o<0?J:H),r=s>c,d=e,p=5;break}case 5:p=8,0!==y&&(n=!0,p+=1),y=0,x=!1,R=null;break;case 6:x=!0;break;case 7:R=b(s,t,O[0],c),p=1}p&&(n&&w&&(_+=w,w=0,f++),C.forEach((([e,t])=>{p&e&&t(r)})))}}},B=y?t.useLayoutEffect:t.useEffect,L=(e,t,n)=>(()=>{let o=s()-50;return(...r)=>{const i=s();o+50<i&&(o=i,(o=>{if(0!==e.O()&&!o.ctrlKey&&(t?o.deltaX:o.deltaY)){const t=e.R();t>0&&t<e.k()&&n()}})(...r))}})(),$=(e,t,n,o)=>x(e)||o?-n:t.k()-n,q=(e,t)=>{let n,o,r=!1;const i=t?"scrollLeft":"scrollTop",s=t?"overflowX":"overflowY",l=(o,r)=>t&&R()?$(n,e,o,r):o,c=async(r,s)=>{if(!n)return;o&&o();const c=()=>u(r(),0,e.k()),h=()=>{let t;return[new Promise(((e,n)=>{t=e,a(o=n,150)})),e.B(2,(()=>{t&&t()}))]};if(s&&O()){for(;e.L(7,c()),e.v();){const[e,t]=h();try{await e}catch(e){return}finally{t()}}n.scrollTo({[t?"left":"top"]:l(c()),behavior:"smooth"})}else for(;;){const[t,o]=h();try{n[i]=l(c()),e.L(6),await t}catch(e){return}finally{o()}}};return{$(o){n=o;let s=!1,c=!1;const a=d((()=>{s?a():(c=!1,e.L(5))}),150),u=()=>{c&&(r=!0),e.L(4,l(o[i])),a()},h=L(e,t,a),f=()=>{s=!0,c=r=!1},_=()=>{s=!1,k()&&(c=!0)};return o.addEventListener("scroll",u),o.addEventListener("wheel",h,{passive:!0}),o.addEventListener("touchstart",f,{passive:!0}),o.addEventListener("touchend",_,{passive:!0}),()=>{o.removeEventListener("scroll",u),o.removeEventListener("wheel",h),o.removeEventListener("touchstart",f),o.removeEventListener("touchend",_),a.t()}},q(e){c((()=>e))},A(t){t+=e.R(),c((()=>t))},X(t,{align:n,smooth:o}={}){if(t=u(t,0,e.I()-1),"nearest"===n){const o=e.m(t),r=e.R();if(o<r)n="start";else{if(!(o+e.S(t)>r+e.C()))return;n="end"}}c((()=>e.T()+("end"===n?e.m(t)+e.S(t)-e.C():"center"===n?e.m(t)+(e.S(t)-e.C())/2:e.m(t))),o)},Y:e=>{if(n){if(r){r=!1;const e=n.style,t=e[s];e[s]="hidden",a((()=>{e[s]=t}))}n[i]+=l(e,!0)}}}},A=(e,t)=>{let n;const o=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop",i=(o,r)=>t&&R()?$(n,e,o,r):o;return{$(s){n=s;const l=(e,n)=>{const o=n+(t&&R()?window.innerWidth-e[r]-e.offsetWidth:e[r]),i=e.offsetParent;return e!==document.body&&i?l(i,o):o},c=d((()=>{e.L(5)}),150),a=()=>{e.L(4,i(window[o])-l(s,0)),c()},u=L(e,t,c);return window.addEventListener("scroll",a),window.addEventListener("wheel",u,{passive:!0}),()=>{window.removeEventListener("scroll",a),window.removeEventListener("wheel",u),c.t()}},Y:e=>{window.scrollBy(t?i(e,!0):0,t?0:e)}}},X="current",Y={},j=(e,t)=>{if(c(e))for(const n of e)j(n,t);else h(e)&&"boolean"!=typeof e&&t.push(e)},D=e=>{const n=t.useRef();return n[X]||(n[X]=e())},N=e=>{const n=t.useRef(e);return B((()=>{n[X]=e}),[e]),n},P={box:"border-box"},U=(e,t)=>{let n;const o=t?"width":"height",r=new WeakMap,i=f((()=>new ResizeObserver((i=>{const s=[];for(const{target:l,contentRect:c}of i)if(l.offsetParent)if(l===n)e.L(2,[c[o],c[t?"left":"top"],w(_(n)[t?"paddingRight":"paddingBottom"])]);else{const e=r.get(l);h(e)&&s.push([e,c[o]])}s.length&&e.L(1,s)}))));return{j(e){n=e;const t=i();return t.observe(e,P),()=>{t.disconnect()}},D(e,t){const n=i();return r.set(e,t),n.observe(e),()=>{r.delete(e),n.unobserve(e)}}}},E=(e,t)=>{const n=t?"width":"height",o=t?"innerWidth":"innerHeight",r=new WeakMap,i=f((()=>new ResizeObserver((t=>{const o=[];for(const{target:e,contentRect:i}of t){if(!e.offsetParent)continue;const t=r.get(e);h(t)&&o.push([t,i[n]])}o.length&&e.L(1,o)}))));return{j(){const t=()=>{e.L(2,[window[o],0,0])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),i().disconnect()}},D(e,t){const n=i();return r.set(e,t),n.observe(e),()=>{r.delete(e),n.unobserve(e)}}}},F=(e,t)=>{let n;const o="height",i="width",s=new WeakMap,l=new Set,c=new Set,a=new Map,u=(e,t)=>`${e}-${t}`,h=f((()=>new ResizeObserver((h=>{const d=new Set,f=new Set;for(const{target:r,contentRect:l}of h)if(r.offsetParent)if(r===n){const r=_(n);e.L(2,[l[o],l.top,w(r.paddingBottom)]),t.L(2,[l[i],l.left,w(r.paddingRight)])}else{const e=s.get(r);if(e){const[t,n]=e,r=u(t,n),s=a.get(r),c=[l[o],l[i]];let h,_;s?(s[0]!==c[0]&&(h=!0),s[1]!==c[1]&&(_=!0)):h=_=!0,h&&d.add(t),_&&f.add(n),(h||_)&&a.set(r,c)}}if(d.size){const t=[];d.forEach((e=>{let n=0;c.forEach((t=>{const o=a.get(u(e,t));o&&(n=r(n,o[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 o=a.get(u(e,t));o&&(n=r(n,o[1]))})),n&&e.push([t,n])})),t.L(1,e)}}))));return{j(e){n=e;const t=h();return t.observe(e,P),()=>{t.disconnect()}},D(e,t,n){const o=h();return s.set(e,[t,n]),l.add(t),c.add(n),o.observe(e),()=>{s.delete(e),o.unobserve(e)}}}},V=t.forwardRef((({children:n,attrs:o,width:r,height:i,scrolling:s},l)=>e.jsx("div",{ref:l,...o,children:e.jsx("div",{style:t.useMemo((()=>({position:"relative",visibility:"hidden",width:null!=r?r:"100%",height:null!=i?i:"100%",pointerEvents:s?"none":"auto"})),[r,i,s]),children:n})}))),G=t.memo((({N:n,P:o,U:r,F:i,V:s,G:l,K:c})=>{const a=t.useRef(null);B((()=>o.D(a[X],r)),[r]);const u=t.useMemo((()=>{const e={margin:0,padding:0,position:"absolute",[c?"height":"width"]:"100%",[c?"top":"left"]:0,[c?R()?"right":"left":"top"]:i,visibility:s?"hidden":"visible"};return c&&(e.display="flex"),e}),[i,s]);return"string"==typeof l?e.jsx(l,{ref:a,style:u,children:n}):e.jsx(l,{ref:a,style:u,index:r,children:n})})),K=()=>[],Q=()=>t.useReducer(K,void 0,K)[1],Z=(e,n)=>t.useMemo((()=>{if("function"==typeof e)return[e,n||0];const t=(e=>{const t=[];return j(e,t),t})(e);return[e=>t[e],t.length]}),[e,n]),ee=t.forwardRef((({children:o,count:i,overscan:s=4,initialItemSize:c,initialItemCount:a,shift:u,horizontal:d,reverse:f,cache:_,components:{Root:w=V,Item:g="div"}=Y,onScroll:p,onScrollStop:v,onRangeChange:m,...b},S)=>{const[z,y]=Z(o,i),I=N(p),x=N(v),[R,k,O,M]=D((()=>{const e=!!d,t=W(y,c,a,_,!c);return[t,U(t,e),q(t,e),e]}));y!==R.I()&&R.L(3,[y,u]);const H=Q(),[J,L]=R.g(),$=R.O(),A=R.J(),j=R.M(),P=t.useRef(null);B((()=>{const e=P[X],t=R.B(3,(e=>{e?n.flushSync(H):H()})),o=R.B(4,(()=>{I[X]&&I[X](R.R())})),r=R.B(8,(()=>{x[X]&&x[X]()})),i=k.j(e),s=O.$(e);return()=>{t(),o(),r(),i(),s()}}),[]),B((()=>{const e=R.W();e&&O.Y(e)}),[A]),t.useEffect((()=>{m&&m(J,L)}),[J,L]),t.useImperativeHandle(S,(()=>({get cache(){return R._()},get scrollOffset(){return R.R()},get scrollSize(){return R.M()},get viewportSize(){return R.C()},scrollToIndex:O.X,scrollTo:O.q,scrollBy:O.A})),[]);const E=C(J,s,$),F=T(L,s,$,y),K=[];for(let t=E;t<=F;t++){const n=z(t),o=n.key;let i=R.m(t);f&&(i+=r(0,R.C()-R.H())),K.push(e.jsx(G,{P:k,U:t,F:i,V:R.p(t),G:g,N:n,K:M},h(o)?o:"_"+t))}return e.jsx(w,{ref:P,width:M?j:void 0,height:M?void 0:j,scrolling:0!==$,attrs:t.useMemo((()=>({...b,style:{display:M?"inline-block":"block",[M?"overflowX":"overflowY"]:"auto",overflowAnchor:"none",contain:"strict",width:"100%",height:"100%",...b.style}})),l(b)),children:K})})),te=t.forwardRef((({children:o,count:r,overscan:i=4,initialItemSize:s,initialItemCount:c,shift:a,horizontal:u,cache:d,components:{Root:f=V,Item:_="div"}=Y,onScrollStop:w,onRangeChange:g,...p},v)=>{const[m,b]=Z(o,r),S=N(w),[z,y,I,x]=D((()=>{const e=!!u,t=W(b,s,c,d,!s);return[t,E(t,e),A(t,e),e]}));b!==z.I()&&z.L(3,[b,a]);const R=Q(),[k,O]=z.g(),M=z.O(),H=z.J(),J=z.H(),L=t.useRef(null);B((()=>{const e=L[X],t=z.B(3,(e=>{e?n.flushSync(R):R()})),o=z.B(8,(()=>{S[X]&&S[X]()})),r=y.j(e),i=I.$(e);return()=>{t(),o(),r(),i()}}),[]),B((()=>{const e=z.W();e&&I.Y(e)}),[H]),t.useEffect((()=>{g&&g(k,O)}),[k,O]),t.useImperativeHandle(v,(()=>({get cache(){return z._()}})),[]);const $=C(k,i,M),q=T(O,i,M,b),j=[];for(let t=$;t<=q;t++){const n=m(t),o=n.key;j.push(e.jsx(G,{P:y,U:t,F:z.m(t),V:z.p(t),G:_,N:n,K:x},h(o)?o:"_"+t))}return e.jsx(f,{ref:L,width:x?J:void 0,height:x?void 0:J,scrolling:0!==M,attrs:t.useMemo((()=>({...p,style:{display:x?"inline-block":"block",width:x?"auto":"100%",height:x?"100%":"auto",...p.style}})),l(p)),children:j})})),ne=(e,t)=>`${e}-${t}`,oe=t.memo((({N:n,P:o,Z:r,ee:i,te:s,ne:l,oe:c,re:a,V:u,G:h})=>{const d=t.useRef(null);return B((()=>o.D(d[X],r,i)),[i,r]),e.jsx(h,{ref:d,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:s,[R()?"right":"left"]:l,visibility:u?"hidden":"visible",minHeight:c,minWidth:a})),[s,l,a,c,u]),children:n})})),re=t.forwardRef((({children:o,row:r,col:i,cellHeight:s=40,cellWidth:c=100,overscan:a=2,initialRowCount:u,initialColCount:h,components:{Root:d=V,Cell:f="div"}=Y,..._},w)=>{const[g,p,v,m,b]=D((()=>{const e=W(r,s,u),t=W(i,c,h);return[e,t,F(e,t),q(e,!1),q(t,!0)]}));r!==g.I()&&g.L(3,[r]),i!==p.I()&&p.L(3,[i]);const S=Q(),[z,y]=g.g(),[I,x]=p.g(),R=g.O(),k=p.O(),O=g.J(),M=p.J(),H=g.M(),J=p.M(),L=t.useRef(null);B((()=>{const e=L[X],t=e=>{e?n.flushSync(S):S()},o=g.B(3,t),r=p.B(3,t),i=v.j(e),s=m.$(e),l=b.$(e);return()=>{o(),r(),i(),s(),l()}}),[]),B((()=>{const e=g.W();e&&m.Y(e)}),[O]),B((()=>{const e=p.W();e&&b.Y(e)}),[M]),t.useImperativeHandle(w,(()=>({get scrollOffset(){return[p.R(),g.R()]},get scrollSize(){return[p.M(),g.M()]},get viewportSize(){return[p.C(),g.C()]},scrollToIndex(e,t){b.X(e),m.X(t)},scrollTo(e,t){b.q(e),m.q(t)},scrollBy(e,t){b.A(e),m.A(t)}})),[]);const $=t.useMemo((()=>{const e=new Map;return(t,n)=>{let r=e.get(ne(t,n));return r||e.set(ne(t,n),r=o({rowIndex:t,colIndex:n})),r}}),[o]),A=C(z,a,R),j=T(y,a,R,r),N=C(I,a,k),P=T(x,a,k,i),U=[];for(let t=A;t<=j;t++)for(let n=N;n<=P;n++)U.push(e.jsx(oe,{P:v,Z:t,ee:n,te:g.m(t),ne:p.m(n),oe:g.S(t),re:p.S(n),V:g.p(t)||p.p(n),G:f,N:$(t,n)},ne(t,n)));return e.jsx(d,{ref:L,width:J,height:H,scrolling:0!==R||0!==k,attrs:t.useMemo((()=>({..._,style:{overflow:"auto",overflowAnchor:"none",contain:"strict",width:"100%",height:"100%",..._.style}})),l(_)),children:U})}));exports.VList=ee,exports.WVList=te,exports.experimental_VGrid=re;
2
+ var e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom");const o=Math.min,r=Math.max,i=Math.abs,s=Date.now,l=Object.values,c=Array.isArray,a=setTimeout,u=(e,t,n)=>o(n,r(t,e)),h=e=>null!=e,d=(e,t)=>{let n;const o=()=>{h(n)&&clearTimeout(n)},r=()=>{o(),n=a((()=>{n=null,e()}),t)};return r.t=o,r},f=e=>{let t,n;return(...o)=>(t||(t=!0,n=e(...o)),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},v=(e,t)=>{if(!e.l)return 0;if(e.u>=t)return e.h[t];let n=e.u,o=e.h[n];for(;n<t;)o+=p(e,n),e.h[++n]=o;return e.u=t,o},m=(e,t,n)=>{let o=v(e,n);for(;n>=0&&n<e.l;)if(o<=t){const r=p(e,n);if(o+r>t)break;o+=r,n++}else o-=p(e,--n);return u(n,0,e.l-1)},b=(e,t,n,r)=>{const i=m(e,t,o(n,e.l-1));return[i,m(e,t+r,i)]},S=(e,t,n)=>{const o=n?"unshift":"push";for(let n=e.l;n<t;n++)e.o[o](g),e.h.push(0===n?0:g);e.l=t},z=(e,t,n)=>{const o=t-e.l,r=o<0;let i;return r?(i=(n?e.o.splice(0,-o):e.o.splice(o)).reduce(((t,n)=>t+(n===g?e.i:n)),0),e.h.splice(o)):(i=e.i*o,S(e,e.l+o,n)),e.u=n?0:u(t-1,0,e.u),e.l=t,[i,r]},y="undefined"!=typeof window,I=()=>document.documentElement,x=/*#__PURE__*/f((e=>{const t="scrollLeft",n=e[t];e[t]=1;const o=e[t]<1;return e[t]=n,o})),R=/*#__PURE__*/f((()=>!!y&&"rtl"===_(I()).direction)),k=/*#__PURE__*/f((()=>/iP(hone|od|ad)/.test(navigator.userAgent))),O=/*#__PURE__*/f((()=>"scrollBehavior"in I().style)),C=(e,t,n)=>r(e-(n===H?1:r(1,t)),0),T=(e,t,n,i)=>o(e+(n===J?1:r(1,t)),i-1),M=(e,t,n)=>t.reduce(((t,[o,r])=>{const i=r-p(e,o);return(!n||i>0)&&(t+=i),t}),0),H=1,J=2,W=(e,t=40,n=0,s=((e,t)=>{const n={i:t,l:0,u:0,o:[],h:[]};return S(n,e),n})(e,t),l)=>{let c=[],a=t*r(n-1,0),h=0,d=0,f=0,_=0,w=0,m=0,y=0,I=0,x=!1,R=!1,O=null,C=[0,n];const T=new Set,W=()=>(e=>e.l?v(e,e.l-1)+p(e,e.l-1):0)(s),B=()=>a-h-d,L=()=>W()-B(),$=e=>{k()&&0!==I?m+=e:(w+=e,_++)};return{_:()=>c,g:()=>JSON.parse(JSON.stringify(s)),p:()=>O?[o(C[0],O[0]),r(C[1],O[1])]:y?C:C=b(s,f+m+w,C[0],a),v:e=>s.o[e]===g,m:()=>!!O&&s.o.slice(r(0,O[0]-1),o(s.l-1,O[1]+1)+1).includes(g),S:e=>v(s,e)-m,I:e=>p(s,e),R:()=>s.l,k:()=>f,O:L,C:()=>I,T:()=>a,M:()=>h,H:()=>r(W(),B()),J:W,W:()=>_,B:()=>B()>W()?w=0:(y=w,w=0,y),L(e,t){const n=[e,t];return T.add(n),()=>{T.delete(n)}},$(e,t){let n,r,p=0;switch(e){case 1:{const e=t.filter((([e,t])=>s.o[e]!==t)),n=x;if(x=!1,!e.length)break;let i=0;if(0===f);else if(f>L()-1.5)i=M(s,e,!0);else if(n)i=M(s,e);else{const[t]=C;i=M(s,e.filter((([e])=>e<t)))}i&&$(i);let c=!1;e.forEach((([e,t])=>{((e,t,n)=>{const r=e.o[t]===g;return e.o[t]=n,e.u=o(t,e.u),r})(s,e,t)&&(c=!0)})),l&&c&&!f&&(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)})(s),p=2,r=!0;break}case 2:{const e=t[0]+t[1]+t[2];a!==e&&(a=e,h=t[1],d=t[2],p=2);break}case 3:if(t[1]){const e=L()-f,[n,r]=z(s,t[0],!0);$(r?-o(n,e):n),x=!r,p=1}else z(s,t[0]);break;case 4:{const e=u(t,0,L()),n=y;if(y=0,e===f)break;const o=e-f,s=i(o);n&&s<i(n)+1||R||(I=o<0?J:H),r=s>a,f=e,p=5;break}case 5:p=8,0!==I&&(n=!0,p+=1),I=0,R=!1,O=null;break;case 6:R=!0;break;case 7:O=b(s,t,C[0],a),p=1}p&&(c=[],n&&m&&(w+=m,m=0,_++),T.forEach((([e,t])=>{p&e&&t(r)})))}}},B=y?t.useLayoutEffect:t.useEffect,L=(e,t,n)=>(()=>{let o=s()-50;return(...r)=>{const i=s();o+50<i&&(o=i,(o=>{if(0!==e.C()&&!o.ctrlKey&&(t?o.deltaX:o.deltaY)){const t=e.k();t>0&&t<e.O()&&n()}})(...r))}})(),$=(e,t,n,o)=>x(e)||o?-n:t.O()-n,q=(e,t)=>{let n,o,r=!1;const i=t?"scrollLeft":"scrollTop",s=t?"overflowX":"overflowY",l=(o,r)=>t&&R()?$(n,e,o,r):o,c=async(r,s)=>{if(!n)return;o&&o();const c=()=>u(r(),0,e.O()),h=()=>{let t;return[new Promise(((e,n)=>{t=e,a(o=n,150)})),e.L(2,(()=>{t&&t()}))]};if(s&&O()){for(;e.$(7,c()),e.m();){const[e,t]=h();try{await e}catch(e){return}finally{t()}}n.scrollTo({[t?"left":"top"]:l(c()),behavior:"smooth"})}else for(;;){const[t,o]=h();try{n[i]=l(c()),e.$(6),await t}catch(e){return}finally{o()}}};return{q(o){n=o;let s=!1,c=!1;const a=d((()=>{s?a():(c=!1,e.$(5))}),150),u=()=>{c&&(r=!0),e.$(4,l(o[i])),a()},h=L(e,t,a),f=()=>{s=!0,c=r=!1},_=()=>{s=!1,k()&&(c=!0)};return o.addEventListener("scroll",u),o.addEventListener("wheel",h,{passive:!0}),o.addEventListener("touchstart",f,{passive:!0}),o.addEventListener("touchend",_,{passive:!0}),()=>{o.removeEventListener("scroll",u),o.removeEventListener("wheel",h),o.removeEventListener("touchstart",f),o.removeEventListener("touchend",_),a.t()}},A(e){c((()=>e))},X(t){t+=e.k(),c((()=>t))},Y(t,{align:n,smooth:o}={}){if(t=u(t,0,e.R()-1),"nearest"===n){const o=e.S(t),r=e.k();if(o<r)n="start";else{if(!(o+e.I(t)>r+e.T()))return;n="end"}}c((()=>e.M()+("end"===n?e.S(t)+e.I(t)-e.T():"center"===n?e.S(t)+(e.I(t)-e.T())/2:e.S(t))),o)},j:e=>{if(n){if(r){r=!1;const e=n.style,t=e[s];e[s]="hidden",a((()=>{e[s]=t}))}n[i]+=l(e,!0)}}}},A=(e,t)=>{let n;const o=t?"scrollX":"scrollY",r=t?"offsetLeft":"offsetTop",i=(o,r)=>t&&R()?$(n,e,o,r):o;return{q(s){n=s;const l=(e,n)=>{const o=n+(t&&R()?window.innerWidth-e[r]-e.offsetWidth:e[r]),i=e.offsetParent;return e!==document.body&&i?l(i,o):o},c=d((()=>{e.$(5)}),150),a=()=>{e.$(4,i(window[o])-l(s,0)),c()},u=L(e,t,c);return window.addEventListener("scroll",a),window.addEventListener("wheel",u,{passive:!0}),()=>{window.removeEventListener("scroll",a),window.removeEventListener("wheel",u),c.t()}},j:e=>{window.scrollBy(t?i(e,!0):0,t?0:e)}}},X="current",Y={},j=(e,t)=>{if(c(e))for(const n of e)j(n,t);else h(e)&&"boolean"!=typeof e&&t.push(e)},D=e=>{const n=t.useRef();return n[X]||(n[X]=e())},N=e=>{const n=t.useRef(e);return B((()=>{n[X]=e}),[e]),n},P={box:"border-box"},U=(e,t)=>{let n;const o=t?"width":"height",r=new WeakMap,i=f((()=>new ResizeObserver((i=>{const s=[];for(const{target:l,contentRect:c}of i)if(l.offsetParent)if(l===n)e.$(2,[c[o],c[t?"left":"top"],w(_(n)[t?"paddingRight":"paddingBottom"])]);else{const e=r.get(l);h(e)&&s.push([e,c[o]])}s.length&&e.$(1,s)}))));return{D(e){n=e;const t=i();return t.observe(e,P),()=>{t.disconnect()}},N(e,t){const n=i();return r.set(e,t),n.observe(e),()=>{r.delete(e),n.unobserve(e)}}}},V=(e,t)=>{const n=t?"width":"height",o=t?"innerWidth":"innerHeight",r=new WeakMap,i=f((()=>new ResizeObserver((t=>{const o=[];for(const{target:e,contentRect:i}of t){if(!e.offsetParent)continue;const t=r.get(e);h(t)&&o.push([t,i[n]])}o.length&&e.$(1,o)}))));return{D(){const t=()=>{e.$(2,[window[o],0,0])};return window.addEventListener("resize",t),t(),()=>{window.removeEventListener("resize",t),i().disconnect()}},N(e,t){const n=i();return r.set(e,t),n.observe(e),()=>{r.delete(e),n.unobserve(e)}}}},E=(e,t)=>{let n;const o="height",i="width",s=new WeakMap,l=new Set,c=new Set,a=new Map,u=(e,t)=>`${e}-${t}`,h=f((()=>new ResizeObserver((h=>{const d=new Set,f=new Set;for(const{target:r,contentRect:l}of h)if(r.offsetParent)if(r===n){const r=_(n);e.$(2,[l[o],l.top,w(r.paddingBottom)]),t.$(2,[l[i],l.left,w(r.paddingRight)])}else{const e=s.get(r);if(e){const[t,n]=e,r=u(t,n),s=a.get(r),c=[l[o],l[i]];let h,_;s?(s[0]!==c[0]&&(h=!0),s[1]!==c[1]&&(_=!0)):h=_=!0,h&&d.add(t),_&&f.add(n),(h||_)&&a.set(r,c)}}if(d.size){const t=[];d.forEach((e=>{let n=0;c.forEach((t=>{const o=a.get(u(e,t));o&&(n=r(n,o[0]))})),n&&t.push([e,n])})),e.$(1,t)}if(f.size){const e=[];f.forEach((t=>{let n=0;l.forEach((e=>{const o=a.get(u(e,t));o&&(n=r(n,o[1]))})),n&&e.push([t,n])})),t.$(1,e)}}))));return{D(e){n=e;const t=h();return t.observe(e,P),()=>{t.disconnect()}},N(e,t,n){const o=h();return s.set(e,[t,n]),l.add(t),c.add(n),o.observe(e),()=>{s.delete(e),o.unobserve(e)}}}},F=t.forwardRef((({children:n,attrs:o,width:r,height:i,scrolling:s},l)=>e.jsx("div",{ref:l,...o,children:e.jsx("div",{style:t.useMemo((()=>({position:"relative",visibility:"hidden",width:null!=r?r:"100%",height:null!=i?i:"100%",pointerEvents:s?"none":"auto"})),[r,i,s]),children:n})}))),G=t.memo((({P:n,U:o,V:r,F:i,G:s,K:l,Z:c})=>{const a=t.useRef(null);B((()=>o.N(a[X],r)),[r]);const u=t.useMemo((()=>{const e={margin:0,padding:0,position:"absolute",[c?"height":"width"]:"100%",[c?"top":"left"]:0,[c?R()?"right":"left":"top"]:i,visibility:s?"hidden":"visible"};return c&&(e.display="flex"),e}),[i,s]);return"string"==typeof l?e.jsx(l,{ref:a,style:u,children:n}):e.jsx(l,{ref:a,style:u,index:r,children:n})})),K=e=>t.useReducer(e._,void 0,e._)[1],Q=(e,n)=>t.useMemo((()=>{if("function"==typeof e)return[e,n||0];const t=(e=>{const t=[];return j(e,t),t})(e);return[e=>t[e],t.length]}),[e,n]),Z=t.forwardRef((({children:o,count:i,overscan:s=4,initialItemSize:c,initialItemCount:a,shift:u,horizontal:d,reverse:f,cache:_,components:{Root:w=F,Item:g="div"}=Y,onScroll:p,onScrollStop:v,onRangeChange:m,...b},S)=>{const[z,y]=Q(o,i),I=N(p),x=N(v),[R,k,O,M]=D((()=>{const e=!!d,t=W(y,c,a,_,!c);return[t,U(t,e),q(t,e),e]}));y!==R.R()&&R.$(3,[y,u]);const H=K(R),[J,L]=R.p(),$=R.C(),A=R.W(),j=R.H(),P=t.useRef(null);B((()=>{const e=P[X],t=R.L(3,(e=>{e?n.flushSync(H):H()})),o=R.L(4,(()=>{I[X]&&I[X](R.k())})),r=R.L(8,(()=>{x[X]&&x[X]()})),i=k.D(e),s=O.q(e);return()=>{t(),o(),r(),i(),s()}}),[]),B((()=>{const e=R.B();e&&O.j(e)}),[A]),t.useEffect((()=>{m&&m(J,L)}),[J,L]),t.useImperativeHandle(S,(()=>({get cache(){return R.g()},get scrollOffset(){return R.k()},get scrollSize(){return R.H()},get viewportSize(){return R.T()},scrollToIndex:O.Y,scrollTo:O.A,scrollBy:O.X})),[]);const V=C(J,s,$),E=T(L,s,$,y),Z=[];for(let t=V;t<=E;t++){const n=z(t),o=n.key;let i=R.S(t);f&&(i+=r(0,R.T()-R.J())),Z.push(e.jsx(G,{U:k,V:t,F:i,G:R.v(t),K:g,P:n,Z:M},h(o)?o:"_"+t))}return e.jsx(w,{ref:P,width:M?j:void 0,height:M?void 0:j,scrolling:0!==$,attrs:t.useMemo((()=>({...b,style:{display:M?"inline-block":"block",[M?"overflowX":"overflowY"]:"auto",overflowAnchor:"none",contain:"strict",width:"100%",height:"100%",...b.style}})),l(b)),children:Z})})),ee=t.forwardRef((({children:o,count:r,overscan:i=4,initialItemSize:s,initialItemCount:c,shift:a,horizontal:u,cache:d,components:{Root:f=F,Item:_="div"}=Y,onScrollStop:w,onRangeChange:g,...p},v)=>{const[m,b]=Q(o,r),S=N(w),[z,y,I,x]=D((()=>{const e=!!u,t=W(b,s,c,d,!s);return[t,V(t,e),A(t,e),e]}));b!==z.R()&&z.$(3,[b,a]);const R=K(z),[k,O]=z.p(),M=z.C(),H=z.W(),J=z.J(),L=t.useRef(null);B((()=>{const e=L[X],t=z.L(3,(e=>{e?n.flushSync(R):R()})),o=z.L(8,(()=>{S[X]&&S[X]()})),r=y.D(e),i=I.q(e);return()=>{t(),o(),r(),i()}}),[]),B((()=>{const e=z.B();e&&I.j(e)}),[H]),t.useEffect((()=>{g&&g(k,O)}),[k,O]),t.useImperativeHandle(v,(()=>({get cache(){return z.g()}})),[]);const $=C(k,i,M),q=T(O,i,M,b),j=[];for(let t=$;t<=q;t++){const n=m(t),o=n.key;j.push(e.jsx(G,{U:y,V:t,F:z.S(t),G:z.v(t),K:_,P:n,Z:x},h(o)?o:"_"+t))}return e.jsx(f,{ref:L,width:x?J:void 0,height:x?void 0:J,scrolling:0!==M,attrs:t.useMemo((()=>({...p,style:{display:x?"inline-block":"block",width:x?"auto":"100%",height:x?"100%":"auto",...p.style}})),l(p)),children:j})})),te=(e,t)=>`${e}-${t}`,ne=t.memo((({P:n,U:o,ee:r,te:i,ne:s,oe:l,re:c,ie:a,G:u,K:h})=>{const d=t.useRef(null);return B((()=>o.N(d[X],r,i)),[i,r]),e.jsx(h,{ref:d,style:t.useMemo((()=>({display:"grid",margin:0,padding:0,position:"absolute",top:s,[R()?"right":"left"]:l,visibility:u?"hidden":"visible",minHeight:c,minWidth:a})),[s,l,a,c,u]),children:n})})),oe=t.forwardRef((({children:o,row:r,col:i,cellHeight:s=40,cellWidth:c=100,overscan:a=2,initialRowCount:u,initialColCount:h,components:{Root:d=F,Cell:f="div"}=Y,..._},w)=>{const[g,p,v,m,b]=D((()=>{const e=W(r,s,u),t=W(i,c,h);return[e,t,E(e,t),q(e,!1),q(t,!0)]}));r!==g.R()&&g.$(3,[r]),i!==p.R()&&p.$(3,[i]);const S=K(g),z=K(p),[y,I]=g.p(),[x,R]=p.p(),k=g.C(),O=p.C(),M=g.W(),H=p.W(),J=g.H(),L=p.H(),$=t.useRef(null);B((()=>{const e=$[X],t=g.L(3,(e=>{e?n.flushSync(S):S()})),o=p.L(3,(e=>{e?n.flushSync(z):z()})),r=v.D(e),i=m.q(e),s=b.q(e);return()=>{t(),o(),r(),i(),s()}}),[]),B((()=>{const e=g.B();e&&m.j(e)}),[M]),B((()=>{const e=p.B();e&&b.j(e)}),[H]),t.useImperativeHandle(w,(()=>({get scrollOffset(){return[p.k(),g.k()]},get scrollSize(){return[p.H(),g.H()]},get viewportSize(){return[p.T(),g.T()]},scrollToIndex(e,t){b.Y(e),m.Y(t)},scrollTo(e,t){b.A(e),m.A(t)},scrollBy(e,t){b.X(e),m.X(t)}})),[]);const A=t.useMemo((()=>{const e=new Map;return(t,n)=>{let r=e.get(te(t,n));return r||e.set(te(t,n),r=o({rowIndex:t,colIndex:n})),r}}),[o]),j=C(y,a,k),N=T(I,a,k,r),P=C(x,a,O),U=T(R,a,O,i),V=[];for(let t=j;t<=N;t++)for(let n=P;n<=U;n++)V.push(e.jsx(ne,{U:v,ee:t,te:n,ne:g.S(t),oe:p.S(n),re:g.I(t),ie:p.I(n),G:g.v(t)||p.v(n),K:f,P:A(t,n)},te(t,n)));return e.jsx(d,{ref:$,width:L,height:J,scrolling:0!==k||0!==O,attrs:t.useMemo((()=>({..._,style:{overflow:"auto",overflowAnchor:"none",contain:"strict",width:"100%",height:"100%",..._.style}})),l(_)),children:V})}));exports.VList=Z,exports.WVList=ee,exports.experimental_VGrid=oe;
3
3
  //# sourceMappingURL=index.js.map