virtua 0.21.1 → 0.22.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
@@ -197,24 +197,26 @@ export default async () => {
197
197
 
198
198
  `vue >= 3.2` is required.
199
199
 
200
+ #### Vertical scroll
201
+
200
202
  ```vue
201
203
  <script setup>
202
204
  import { VList } from "virtua/vue";
203
205
 
204
- const heights = [20, 40, 180, 77];
206
+ const sizes = [20, 40, 180, 77];
205
207
  const data = Array.from({ length: 1000 }).map((_, i) => ({
206
208
  id: i,
207
- height: heights[i % 4] + "px",
209
+ size: sizes[i % 4] + "px",
208
210
  }));
209
211
  </script>
210
212
 
211
213
  <template>
212
- <VList :data="data">
214
+ <VList :data="data" :style="{ height: '800px' }">
213
215
  <template #default="item">
214
216
  <div
215
217
  :key="item.id"
216
218
  :style="{
217
- height: item.height,
219
+ height: item.size,
218
220
  background: 'white',
219
221
  borderBottom: 'solid 1px #ccc',
220
222
  }"
@@ -226,6 +228,70 @@ const data = Array.from({ length: 1000 }).map((_, i) => ({
226
228
  </template>
227
229
  ```
228
230
 
231
+ #### Horizontal scroll
232
+
233
+ ```vue
234
+ <script setup>
235
+ import { VList } from "virtua/vue";
236
+
237
+ const sizes = [40, 180, 77];
238
+ const data = Array.from({ length: 1000 }).map((_, i) => ({
239
+ id: i,
240
+ size: sizes[i % 3] + "px",
241
+ }));
242
+ </script>
243
+
244
+ <template>
245
+ <VList :data="data" horizontal :style="{ height: '400px' }">
246
+ <template #default="item">
247
+ <div
248
+ :key="item.id"
249
+ :style="{
250
+ width: item.size,
251
+ background: 'white',
252
+ borderBottom: 'solid 1px #ccc',
253
+ }"
254
+ >
255
+ {{ item.id }}
256
+ </div>
257
+ </template>
258
+ </VList>
259
+ </template>
260
+ ```
261
+
262
+ #### Window scroll
263
+
264
+ ```vue
265
+ <script setup>
266
+ import { WindowVirtualizer } from "virtua/vue";
267
+
268
+ const sizes = [20, 40, 180, 77];
269
+ const data = Array.from({ length: 1000 }).map((_, i) => ({
270
+ id: i,
271
+ size: sizes[i % 4] + "px",
272
+ }));
273
+ </script>
274
+
275
+ <template>
276
+ <div :style="{ padding: '200px' }">
277
+ <WindowVirtualizer :data="data">
278
+ <template #default="item">
279
+ <div
280
+ :key="item.index"
281
+ :style="{
282
+ height: item.size,
283
+ background: 'white',
284
+ borderBottom: 'solid 1px #ccc',
285
+ }"
286
+ >
287
+ {{ item.index }}
288
+ </div>
289
+ </template>
290
+ </WindowVirtualizer>
291
+ </div>
292
+ </template>
293
+ ```
294
+
229
295
  ## Documentation
230
296
 
231
297
  - [API reference](./docs/API.md)
@@ -1,35 +1,7 @@
1
1
  /** @jsxImportSource vue */
2
2
  import { ComponentOptionsMixin, SlotsType } from "vue";
3
- import { ScrollToIndexOpts } from "../core/types";
4
- interface VListHandle {
5
- /**
6
- * Get current scrollTop or scrollLeft.
7
- */
8
- readonly scrollOffset: number;
9
- /**
10
- * Get current scrollHeight or scrollWidth.
11
- */
12
- readonly scrollSize: number;
13
- /**
14
- * Get current offsetHeight or offsetWidth.
15
- */
16
- readonly viewportSize: number;
17
- /**
18
- * Scroll to the item specified by index.
19
- * @param index index of item
20
- * @param opts options
21
- */
22
- scrollToIndex(index: number, opts?: ScrollToIndexOpts): void;
23
- /**
24
- * Scroll to the given offset.
25
- * @param offset offset from start
26
- */
27
- scrollTo(offset: number): void;
28
- /**
29
- * Scroll by the given offset.
30
- * @param offset offset from current position
31
- */
32
- scrollBy(offset: number): void;
3
+ import { VirtualizerHandle } from "./Virtualizer";
4
+ interface VListHandle extends VirtualizerHandle {
33
5
  }
34
6
  export declare const VList: import("vue").DefineComponent<{
35
7
  /**
@@ -0,0 +1,120 @@
1
+ /** @jsxImportSource vue */
2
+ import { ComponentOptionsMixin, SlotsType } from "vue";
3
+ import { ScrollToIndexOpts } from "../core/types";
4
+ export interface VirtualizerHandle {
5
+ /**
6
+ * Get current scrollTop or scrollLeft.
7
+ */
8
+ readonly scrollOffset: number;
9
+ /**
10
+ * Get current scrollHeight or scrollWidth.
11
+ */
12
+ readonly scrollSize: number;
13
+ /**
14
+ * Get current offsetHeight or offsetWidth.
15
+ */
16
+ readonly viewportSize: number;
17
+ /**
18
+ * Scroll to the item specified by index.
19
+ * @param index index of item
20
+ * @param opts options
21
+ */
22
+ scrollToIndex(index: number, opts?: ScrollToIndexOpts): void;
23
+ /**
24
+ * Scroll to the given offset.
25
+ * @param offset offset from start
26
+ */
27
+ scrollTo(offset: number): void;
28
+ /**
29
+ * Scroll by the given offset.
30
+ * @param offset offset from current position
31
+ */
32
+ scrollBy(offset: number): void;
33
+ }
34
+ export declare const Virtualizer: import("vue").DefineComponent<{
35
+ /**
36
+ * The data items rendered by this component.
37
+ */
38
+ data: {
39
+ type: ArrayConstructor;
40
+ required: true;
41
+ };
42
+ /**
43
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
44
+ * @defaultValue 4
45
+ */
46
+ overscan: {
47
+ type: NumberConstructor;
48
+ default: number;
49
+ };
50
+ /**
51
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
52
+ *
53
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
54
+ * - If set, you can opt out estimation and use the value as initial item size.
55
+ */
56
+ itemSize: NumberConstructor;
57
+ /**
58
+ * While true is set, scroll position will be maintained from the end not usual start when items are added to/removed from start. It's recommended to set false if you add to/remove from mid/end of the list because it can cause unexpected behavior. This prop is useful for reverse infinite scrolling.
59
+ */
60
+ shift: BooleanConstructor;
61
+ /**
62
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
63
+ */
64
+ horizontal: BooleanConstructor;
65
+ }, VirtualizerHandle, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
66
+ /**
67
+ * Callback invoked whenever scroll offset changes.
68
+ * @param offset Current scrollTop or scrollLeft.
69
+ */
70
+ scroll: (offset: number) => void;
71
+ /**
72
+ * Callback invoked when scrolling stops.
73
+ */
74
+ scrollEnd: () => void;
75
+ /**
76
+ * Callback invoked when visible items range changes.
77
+ */
78
+ rangeChange: (startIndex: number, endIndex: number) => void;
79
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
80
+ /**
81
+ * The data items rendered by this component.
82
+ */
83
+ data: {
84
+ type: ArrayConstructor;
85
+ required: true;
86
+ };
87
+ /**
88
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
89
+ * @defaultValue 4
90
+ */
91
+ overscan: {
92
+ type: NumberConstructor;
93
+ default: number;
94
+ };
95
+ /**
96
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
97
+ *
98
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
99
+ * - If set, you can opt out estimation and use the value as initial item size.
100
+ */
101
+ itemSize: NumberConstructor;
102
+ /**
103
+ * While true is set, scroll position will be maintained from the end not usual start when items are added to/removed from start. It's recommended to set false if you add to/remove from mid/end of the list because it can cause unexpected behavior. This prop is useful for reverse infinite scrolling.
104
+ */
105
+ shift: BooleanConstructor;
106
+ /**
107
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
108
+ */
109
+ horizontal: BooleanConstructor;
110
+ }>> & {
111
+ onScroll?: ((offset: number) => any) | undefined;
112
+ onScrollEnd?: (() => any) | undefined;
113
+ onRangeChange?: ((startIndex: number, endIndex: number) => any) | undefined;
114
+ }, {
115
+ shift: boolean;
116
+ overscan: number;
117
+ horizontal: boolean;
118
+ }, SlotsType<{
119
+ default: any;
120
+ }>>;
@@ -0,0 +1,83 @@
1
+ /** @jsxImportSource vue */
2
+ import { ComponentOptionsMixin, SlotsType } from "vue";
3
+ export declare const WindowVirtualizer: import("vue").DefineComponent<{
4
+ /**
5
+ * The data items rendered by this component.
6
+ */
7
+ data: {
8
+ type: ArrayConstructor;
9
+ required: true;
10
+ };
11
+ /**
12
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
13
+ * @defaultValue 4
14
+ */
15
+ overscan: {
16
+ type: NumberConstructor;
17
+ default: number;
18
+ };
19
+ /**
20
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
21
+ *
22
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
23
+ * - If set, you can opt out estimation and use the value as initial item size.
24
+ */
25
+ itemSize: NumberConstructor;
26
+ /**
27
+ * While true is set, scroll position will be maintained from the end not usual start when items are added to/removed from start. It's recommended to set false if you add to/remove from mid/end of the list because it can cause unexpected behavior. This prop is useful for reverse infinite scrolling.
28
+ */
29
+ shift: BooleanConstructor;
30
+ /**
31
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
32
+ */
33
+ horizontal: BooleanConstructor;
34
+ }, void, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
35
+ /**
36
+ * Callback invoked when scrolling stops.
37
+ */
38
+ scrollEnd: () => void;
39
+ /**
40
+ * Callback invoked when visible items range changes.
41
+ */
42
+ rangeChange: (startIndex: number, endIndex: number) => void;
43
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
44
+ /**
45
+ * The data items rendered by this component.
46
+ */
47
+ data: {
48
+ type: ArrayConstructor;
49
+ required: true;
50
+ };
51
+ /**
52
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
53
+ * @defaultValue 4
54
+ */
55
+ overscan: {
56
+ type: NumberConstructor;
57
+ default: number;
58
+ };
59
+ /**
60
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
61
+ *
62
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
63
+ * - If set, you can opt out estimation and use the value as initial item size.
64
+ */
65
+ itemSize: NumberConstructor;
66
+ /**
67
+ * While true is set, scroll position will be maintained from the end not usual start when items are added to/removed from start. It's recommended to set false if you add to/remove from mid/end of the list because it can cause unexpected behavior. This prop is useful for reverse infinite scrolling.
68
+ */
69
+ shift: BooleanConstructor;
70
+ /**
71
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
72
+ */
73
+ horizontal: BooleanConstructor;
74
+ }>> & {
75
+ onScrollEnd?: (() => any) | undefined;
76
+ onRangeChange?: ((startIndex: number, endIndex: number) => any) | undefined;
77
+ }, {
78
+ shift: boolean;
79
+ overscan: number;
80
+ horizontal: boolean;
81
+ }, SlotsType<{
82
+ default: any;
83
+ }>>;
@@ -2,3 +2,5 @@
2
2
  * @module vue
3
3
  */
4
4
  export { VList } from "./VList";
5
+ export { Virtualizer } from "./Virtualizer";
6
+ export { WindowVirtualizer } from "./WindowVirtualizer";
package/lib/vue/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("vue/jsx-runtime"),t=require("vue");const r=Math.min,o=Math.max,n=Math.abs,s=setTimeout,i=(e,t,n)=>r(n,o(t,e)),l=e=>null!=e,c=e=>{let t,r;return(...o)=>(t||(t=!0,r=e(...o)),r)},u=-1,a=(e,t,r)=>{const o=r?"unshift":"push";for(let r=0;r<t;r++)e[o](u);return e},f=(e,t)=>{const r=e.t[t];return r===u?e.o:r},d=(e,t)=>{if(!e.i)return 0;if(e.l>=t)return e.u[t];e.l<0&&(e.u[0]=0,e.l=0);let r=e.l,o=e.u[r];for(;r<t;)o+=f(e,r),e.u[++r]=o;return e.l=t,o},h=(e,t,r)=>{let o=d(e,r);for(;r>=0&&r<e.i;)if(o<=t){const n=f(e,r);if(o+n>t)break;o+=n,r++}else o-=f(e,--r);return i(r,0,e.i-1)},_=(e,t,o,n)=>{const s=h(e,t,r(o,e.i-1));return[s,h(e,t+n,s)]},p=(e,t,o)=>{const n=t-e.i,s=n>0;let i;return s?(i=e.o*n,a(e.t,n,o),a(e.u,n)):(i=(o?e.t.splice(0,-n):e.t.splice(n)).reduce(((t,r)=>t+(r===u?e.o:r)),0),e.u.splice(n)),e.l=o?-1:r(t-1,e.l),e.i=t,[i,s]},g="undefined"!=typeof window,v=()=>document.documentElement,m=/*#__PURE__*/c((()=>!!g&&"rtl"===getComputedStyle(v()).direction)),b=/*#__PURE__*/c((()=>/iP(hone|od|ad)/.test(navigator.userAgent))),y=/*#__PURE__*/c((()=>"scrollBehavior"in v().style)),w=(e,t,r)=>t.reduce(((t,[o,n])=>{const s=n-f(e,o);return(!r||s>0)&&(t+=s),t}),0),S=(e,t)=>t&&m()?-e:e,x=/*#__PURE__*/t.defineComponent({props:{h:{type:Object,required:!0},_:{type:Function,required:!0},p:{type:Number,required:!0},v:{type:Number,required:!0},m:{type:Boolean},S:{type:Boolean},k:{type:String,required:!0}},setup(r){const o=t.ref();return t.watch((()=>o.value&&r.p),((e,t,n)=>{n(r._(o.value,r.p))}),{flush:"post"}),()=>{const{h:t,v:n,m:s,k:i,S:l}=r,c={margin:0,padding:0,position:"absolute",[l?"height":"width"]:"100%",[l?"top":"left"]:"0px",[l?m()?"right":"left":"top"]:n+"px",visibility:s?"hidden":"visible"};return l&&(c.display="flex"),e.jsx(i,{ref:o,style:c,children:t})}}}),z={data:{type:Array,required:!0},overscan:{type:Number,default:4},itemSize:Number,shift:Boolean,horizontal:Boolean},k=/*#__PURE__*/t.defineComponent({props:z,emits:["scroll","scrollEnd","rangeChange"],setup(c,{emit:h,expose:g,slots:v}){var m;const z=c.horizontal,k=t.ref(),I=((e,t=40,s=0,l,c,h=0,g=0)=>{let v=!!s,m=[],y=0,S=0,x=0,z=0,k=0,I=0,q=0,T=0,B=v?[0,o(s-1,0)]:null,O=[0,0];const J=l||((e,t)=>({o:t,i:e,l:-1,t:a([],e),u:a([],e)}))(e,t),N=new Set,C=()=>(e=>e.i?d(e,e.i-1)+f(e,e.i-1):0)(J),E=()=>C()+h+g,H=()=>o(0,E()-y),M=e=>{b()&&0!==q?k+=e:(z+=e,x++)};return{I:()=>m,q:()=>JSON.parse(JSON.stringify(J)),T:()=>B?[r(O[0],B[0]),o(O[1],B[1])]:I?O:O=_(J,S-h+k+z,O[0],y),B:e=>J.t[e]===u,O:()=>!!B&&J.t.slice(o(0,B[0]-1),r(J.i-1,B[1]+1)+1).includes(u),J:e=>d(J,e)-k,N:e=>f(J,e),C:()=>J.i,H:()=>S,M:()=>q,R:()=>y,A:()=>h,j:()=>g,D:C,F:()=>x,L:()=>y>E()?z=0:(I=z,z=0,I),P(e,t){const r=[e,t];return N.add(r),()=>{N.delete(r)}},U(e,t){let o,s,l=0;switch(e){case 1:{const e=t.filter((([e,t])=>J.t[e]!==t));if(!e.length)break;let o=0;if(0===S);else if(S>H()-1.5)o=w(J,e,!0);else if(2===T)o=w(J,e);else{const[t]=O;o=w(J,e.filter((([e])=>e<t)))}o&&M(o);let n=!1;e.forEach((([e,t])=>{((e,t,o)=>{const n=e.t[t]===u;return e.t[t]=o,e.l=r(t,e.l),n})(J,e,t)&&(n=!0)})),c&&n&&!S&&(e=>{const t=e.t.filter((e=>e!==u)),r=t[0];e.o=t.every((e=>e===r))?r:(e=>{const t=[...e].sort(((e,t)=>e-t)),r=e.length/2|0;return t.length%2==0?(t[r-1]+t[r])/2:t[r]})(t)})(J),l=2,s=!0;break}case 2:y!==t&&(y=t,l=2);break;case 3:if(t[1]){const e=H()-S,[o,n]=p(J,t[0],!0);M(n?o:-r(o,e)),n&&(T=2),l=1}else p(J,t[0]);break;case 4:{const e=i(t,0,H()),r=I;if(I=0,e===S)break;const o=e-S,c=n(o);r&&c<n(r)+1||0!==T||(q=o<0?2:1),v&&(B=null,v=!1),s=c>y,S=e,l=5;break}case 5:l=8,0!==q&&(o=!0,l+=1),q=0,T=0,B=null;break;case 6:T=1;break;case 7:B=_(J,t,O[0],y),l=1}l&&(m=[],o&&k&&(z+=k,k=0,x++),N.forEach((([e,t])=>{l&e&&t(s)})))}}})(c.data.length,null!==(m=c.itemSize)&&void 0!==m?m:40,void 0,void 0,!c.itemSize),q=((e,t)=>{let r;const o=t?"width":"height",n=new WeakMap,s=(e=>{let t;return{V(r){var o,n;(t||(t=new(n=r,o=n.ownerDocument,o.defaultView).ResizeObserver(e))).observe(r)},W(e){t.unobserve(e)},X(){t&&t.disconnect()}}})((t=>{const s=[];for(const{target:i,contentRect:c}of t)if(i.offsetParent)if(i===r)e.U(2,c[o]);else{const e=n.get(i);l(e)&&s.push([e,c[o]])}s.length&&e.U(1,s)}));return{Y(e){s.V(r=e)},G:(e,t)=>(n.set(e,t),s.V(e),()=>{n.delete(e),s.W(e)}),X:s.X}})(I,z),T=((e,t)=>{let r,o,n;const c=t?"scrollLeft":"scrollTop",u=t?"overflowX":"overflowY",a=async(o,i)=>{if(!r)return;n&&n();const l=()=>{let t;return[new Promise(((e,r)=>{t=e,s(n=r,150)})),e.P(2,(()=>{t&&t()}))]};if(i&&y()){for(;e.U(7,o()),e.O();){const[e,t]=l();try{await e}catch(e){return}finally{t()}}r.scrollTo({[t?"left":"top"]:S(o(),t),behavior:"smooth"})}else for(;;){const[n,s]=l();try{r[c]=S(o(),t),e.U(6),await n}catch(e){return}finally{s()}}};return{V(n){r=n,o=((e,t,r,o,n)=>{const i=Date.now;let c=0,u=!1,a=!1,f=!1,d=!1;const h=(()=>{let t;const r=()=>{l(t)&&clearTimeout(t)},o=()=>{r(),t=s((()=>{t=null,(()=>{if(u||a)return u=!1,void h();f=!1,e.U(5)})()}),150)};return o.K=r,o})(),_=()=>{c=i(),f&&(d=!0),e.U(4,o()),h()},p=t=>{if(u||0===e.M()||t.ctrlKey)return;const o=i()-c;150>o&&50<o&&(r?t.deltaX:t.deltaY)&&(u=!0)},g=()=>{a=!0,f=d=!1},v=()=>{a=!1,b()&&(f=!0)};return t.addEventListener("scroll",_),t.addEventListener("wheel",p,{passive:!0}),t.addEventListener("touchstart",g,{passive:!0}),t.addEventListener("touchend",v,{passive:!0}),{X:()=>{t.removeEventListener("scroll",_),t.removeEventListener("wheel",p),t.removeEventListener("touchstart",g),t.removeEventListener("touchend",v),h.K()},Z:e=>{n(e,d),d=!1}}})(e,n,t,(()=>S(n[c],t)),((e,r)=>{if(r){const e=n.style,t=e[u];e[u]="hidden",s((()=>{e[u]=t}))}n[c]+=S(e,t)}))},X(){o&&o.X()},$(e){a((()=>e))},ee(t){t+=e.H(),a((()=>t))},te(t,{align:r,smooth:o}={}){if(t=i(t,0,e.C()-1),"nearest"===r){const o=e.J(t),n=e.H();if(o<n)r="start";else{if(!(o+e.N(t)>n+e.R()))return;r="end"}}a((()=>e.A()+("end"===r?e.J(t)+e.N(t)-e.R():"center"===r?e.J(t)+(e.N(t)-e.R())/2:e.J(t))),o)},Z:e=>{o&&o.Z(e)}}})(I,z),B=t.ref(I.I()),O=I.P(3,(()=>{B.value=I.I()})),J=I.P(4,(()=>{h("scroll",I.H())})),N=I.P(8,(()=>{h("scrollEnd")}));return t.onMounted((()=>{const e=k.value;e&&(q.Y(e),T.V(e))})),t.onUnmounted((()=>{O(),J(),N(),q.X(),T.X()})),t.watch((()=>c.data.length),(e=>{I.U(3,[e,c.shift])})),t.watch([B,I.F],(([,e],[,t])=>{if(e===t)return;const r=I.L();r&&T.Z(r)}),{flush:"post"}),t.watch([B,I.T],(([,[e,t]],[,[r,o]])=>{r===e&&o===t||h("rangeChange",e,t)}),{flush:"post"}),g({get scrollOffset(){return I.H()},get scrollSize(){return(e=>o(e.D(),e.R()))(I)},get viewportSize(){return I.R()},scrollToIndex:T.te,scrollTo:T.$,scrollBy:T.ee}),()=>{B.value;const t=c.data.length,[n,s]=I.T(),i=I.M(),u=I.D(),a=(e=>o(e.D(),e.R()-e.A()-e.j()))(I),f=[];for(let u=((e,t,r)=>o(e-(1===r?1:o(1,t)),0))(n,c.overscan,i),a=((e,t,n,s)=>r(e+(2===n?1:o(1,t)),s-1))(s,c.overscan,i,t);u<=a;u++){const t=v.default(c.data[u])[0],r=t.key;f.push(e.jsx(x,{_:q.G,p:u,v:I.J(u),m:I.B(u),k:"div",h:t,S:z},l(r)?r:"_"+u))}return e.jsx("div",{ref:k,style:{display:z?"inline-block":"block",[z?"overflowX":"overflowY"]:"auto",overflowAnchor:"none",contain:"strict",width:"100%",height:"100%"},children:e.jsx("div",{style:{overflowAnchor:"none",flex:"none",position:"relative",visibility:"hidden",width:z?u+"px":"100%",height:z?"100%":u+"px",[z?"minWidth":"minHeight"]:a+"px",pointerEvents:0!==i?"none":"auto"},children:f})})}}});exports.VList=k;
1
+ var e=require("vue/jsx-runtime"),t=require("vue");const r=Math.min,o=Math.max,n=Math.abs,s=setTimeout,i=(e,t,n)=>r(n,o(t,e)),l=e=>null!=e,c=e=>{let t,r;return(...o)=>(t||(t=!0,r=e(...o)),r)},a=-1,u=(e,t,r)=>{const o=r?"unshift":"push";for(let r=0;r<t;r++)e[o](a);return e},f=(e,t)=>{const r=e.t[t];return r===a?e.o:r},d=(e,t)=>{if(!e.i)return 0;if(e.l>=t)return e.u[t];e.l<0&&(e.u[0]=0,e.l=0);let r=e.l,o=e.u[r];for(;r<t;)o+=f(e,r),e.u[++r]=o;return e.l=t,o},h=(e,t,r)=>{let o=d(e,r);for(;r>=0&&r<e.i;)if(o<=t){const n=f(e,r);if(o+n>t)break;o+=n,r++}else o-=f(e,--r);return i(r,0,e.i-1)},p=(e,t,o,n)=>{const s=h(e,t,r(o,e.i-1));return[s,h(e,t+n,s)]},_=(e,t,o)=>{const n=t-e.i,s=n>0;let i;return s?(i=e.o*n,u(e.t,n,o),u(e.u,n)):(i=(o?e.t.splice(0,-n):e.t.splice(n)).reduce(((t,r)=>t+(r===a?e.o:r)),0),e.u.splice(n)),e.l=o?-1:r(t-1,e.l),e.i=t,[i,s]},g="undefined"!=typeof window,v=()=>document.documentElement,m=e=>e.ownerDocument,b=e=>e.defaultView,y=/*#__PURE__*/c((()=>!!g&&"rtl"===getComputedStyle(v()).direction)),S=/*#__PURE__*/c((()=>/iP(hone|od|ad)/.test(navigator.userAgent))),z=/*#__PURE__*/c((()=>"scrollBehavior"in v().style)),w=(e,t,r)=>o(e-(1===r?1:o(1,t)),0),x=(e,t,n,s)=>r(e+(2===n?1:o(1,t)),s-1),k=(e,t,r)=>t.reduce(((t,[o,n])=>{const s=n-f(e,o);return(!r||s>0)&&(t+=s),t}),0),I=(e,t=40,s=0,l,c,h=0,g=0)=>{let v=!!s,m=[],b=0,y=0,z=0,w=0,x=0,I=0,B=0,T=0,q=v?[0,o(s-1,0)]:null,C=[0,0];const E=l||((e,t)=>({o:t,i:e,l:-1,t:u([],e),u:u([],e)}))(e,t),N=new Set,O=()=>(e=>e.i?d(e,e.i-1)+f(e,e.i-1):0)(E),J=()=>O()+h+g,R=()=>o(0,J()-b),H=e=>{S()&&0!==B?x+=e:(w+=e,z++)};return{h:()=>m,p:()=>JSON.parse(JSON.stringify(E)),_:()=>q?[r(C[0],q[0]),o(C[1],q[1])]:I?C:C=p(E,y-h+x+w,C[0],b),v:e=>E.t[e]===a,m:()=>!!q&&E.t.slice(o(0,q[0]-1),r(E.i-1,q[1]+1)+1).includes(a),S:e=>d(E,e)-x,k:e=>f(E,e),I:()=>E.i,B:()=>y,T:()=>B,q:()=>b,C:()=>h,N:()=>g,O,J:()=>z,R:()=>b>J()?w=0:(I=w,w=0,I),H(e,t){const r=[e,t];return N.add(r),()=>{N.delete(r)}},A(e,t){let o,s,l=0;switch(e){case 1:{const e=t.filter((([e,t])=>E.t[e]!==t));if(!e.length)break;let o=0;if(0===y);else if(y>R()-1.5)o=k(E,e,!0);else if(2===T)o=k(E,e);else{const[t]=C;o=k(E,e.filter((([e])=>e<t)))}o&&H(o);let n=!1;e.forEach((([e,t])=>{((e,t,o)=>{const n=e.t[t]===a;return e.t[t]=o,e.l=r(t,e.l),n})(E,e,t)&&(n=!0)})),c&&n&&!y&&(e=>{const t=e.t.filter((e=>e!==a)),r=t[0];e.o=t.every((e=>e===r))?r:(e=>{const t=[...e].sort(((e,t)=>e-t)),r=e.length/2|0;return t.length%2==0?(t[r-1]+t[r])/2:t[r]})(t)})(E),l=2,s=!0;break}case 2:b!==t&&(b=t,l=2);break;case 3:if(t[1]){const e=R()-y,[o,n]=_(E,t[0],!0);H(n?o:-r(o,e)),n&&(T=2),l=1}else _(E,t[0]);break;case 4:{const e=i(t,0,R()),r=I;if(I=0,e===y)break;const o=e-y,c=n(o);r&&c<n(r)+1||0!==T||(B=o<0?2:1),v&&(q=null,v=!1),s=c>b,y=e,l=5;break}case 5:l=8,0!==B&&(o=!0,l+=1),B=0,T=0,q=null;break;case 6:T=1;break;case 7:q=p(E,t,C[0],b),l=1}l&&(m=[],o&&x&&(w+=x,x=0,z++),N.forEach((([e,t])=>{l&e&&t(s)})))}}},B=e=>{let t;return{M(r){(t||(t=new(b(m(r)).ResizeObserver)(e))).observe(r)},W(e){t.unobserve(e)},L(){t&&t.disconnect()}}},T=(e,t)=>t&&y()?-e:e,q=(e,t,r,o,n)=>{const i=Date.now;let c=0,a=!1,u=!1,f=!1,d=!1;const h=(()=>{let t;const r=()=>{l(t)&&clearTimeout(t)},o=()=>{r(),t=s((()=>{t=null,(()=>{if(a||u)return a=!1,void h();f=!1,e.A(5)})()}),150)};return o.X=r,o})(),p=()=>{c=i(),f&&(d=!0),e.A(4,o()),h()},_=t=>{if(a||0===e.T()||t.ctrlKey)return;const o=i()-c;150>o&&50<o&&(r?t.deltaX:t.deltaY)&&(a=!0)},g=()=>{u=!0,f=d=!1},v=()=>{u=!1,S()&&(f=!0)};return t.addEventListener("scroll",p),t.addEventListener("wheel",_,{passive:!0}),t.addEventListener("touchstart",g,{passive:!0}),t.addEventListener("touchend",v,{passive:!0}),{L:()=>{t.removeEventListener("scroll",p),t.removeEventListener("wheel",_),t.removeEventListener("touchstart",g),t.removeEventListener("touchend",v),h.X()},Y:e=>{n(e,d),d=!1}}},C=/*#__PURE__*/t.defineComponent({props:{j:{type:Object,required:!0},D:{type:Function,required:!0},F:{type:Number,required:!0},P:{type:Number,required:!0},U:{type:Boolean},V:{type:Boolean},G:{type:String,required:!0}},setup(r){const o=t.ref();return t.watch((()=>o.value&&r.F),((e,t,n)=>{n(r.D(o.value,r.F))}),{flush:"post"}),()=>{const{j:t,P:n,U:s,G:i,V:l}=r,c={margin:0,padding:0,position:"absolute",[l?"height":"width"]:"100%",[l?"top":"left"]:"0px",[l?y()?"right":"left":"top"]:n+"px",visibility:s?"hidden":"visible"};return l&&(c.display="flex"),e.jsx(i,{ref:o,style:c,children:t})}}}),E={data:{type:Array,required:!0},overscan:{type:Number,default:4},itemSize:Number,shift:Boolean,horizontal:Boolean},N=/*#__PURE__*/t.defineComponent({props:E,emits:["scroll","scrollEnd","rangeChange"],setup(r,{emit:n,expose:c,slots:a}){var u;const f=r.horizontal,d=t.ref(),h=I(r.data.length,null!==(u=r.itemSize)&&void 0!==u?u:40,void 0,void 0,!r.itemSize),p=((e,t)=>{let r;const o=t?"width":"height",n=new WeakMap,s=B((t=>{const s=[];for(const{target:i,contentRect:c}of t)if(i.offsetParent)if(i===r)e.A(2,c[o]);else{const e=n.get(i);l(e)&&s.push([e,c[o]])}s.length&&e.A(1,s)}));return{K(e){s.M(r=e)},Z:(e,t)=>(n.set(e,t),s.M(e),()=>{n.delete(e),s.W(e)}),L:s.L}})(h,f),_=((e,t)=>{let r,o,n;const l=t?"scrollLeft":"scrollTop",c=t?"overflowX":"overflowY",a=async(o,i)=>{if(!r)return;n&&n();const c=()=>{let t;return[new Promise(((e,r)=>{t=e,s(n=r,150)})),e.H(2,(()=>{t&&t()}))]};if(i&&z()){for(;e.A(7,o()),e.m();){const[e,t]=c();try{await e}catch(e){return}finally{t()}}r.scrollTo({[t?"left":"top"]:T(o(),t),behavior:"smooth"})}else for(;;){const[n,s]=c();try{r[l]=T(o(),t),e.A(6),await n}catch(e){return}finally{s()}}};return{M(n){r=n,o=q(e,n,t,(()=>T(n[l],t)),((e,r)=>{if(r){const e=n.style,t=e[c];e[c]="hidden",s((()=>{e[c]=t}))}n[l]+=T(e,t)}))},L(){o&&o.L()},$(e){a((()=>e))},ee(t){t+=e.B(),a((()=>t))},te(t,{align:r,smooth:o}={}){if(t=i(t,0,e.I()-1),"nearest"===r){const o=e.S(t),n=e.B();if(o<n)r="start";else{if(!(o+e.k(t)>n+e.q()))return;r="end"}}a((()=>e.C()+("end"===r?e.S(t)+e.k(t)-e.q():"center"===r?e.S(t)+(e.k(t)-e.q())/2:e.S(t))),o)},Y:e=>{o&&o.Y(e)}}})(h,f),g=t.ref(h.h()),v=h.H(3,(()=>{g.value=h.h()})),m=h.H(4,(()=>{n("scroll",h.B())})),b=h.H(8,(()=>{n("scrollEnd")}));return t.onMounted((()=>{const e=d.value.parentElement;e&&(p.K(e),_.M(e))})),t.onUnmounted((()=>{v(),m(),b(),p.L(),_.L()})),t.watch((()=>r.data.length),(e=>{h.A(3,[e,r.shift])})),t.watch([g,h.J],(([,e],[,t])=>{if(e===t)return;const r=h.R();r&&_.Y(r)}),{flush:"post"}),t.watch([g,h._],(([,[e,t]],[,[r,o]])=>{r===e&&o===t||n("rangeChange",e,t)}),{flush:"post"}),c({get scrollOffset(){return h.B()},get scrollSize(){return(e=>o(e.O(),e.q()))(h)},get viewportSize(){return h.q()},scrollToIndex:_.te,scrollTo:_.$,scrollBy:_.ee}),()=>{g.value;const t=r.data.length,[n,s]=h._(),i=h.T(),c=h.O(),u=(e=>o(e.O(),e.q()-e.C()-e.N()))(h),_=[];for(let o=w(n,r.overscan,i),c=x(s,r.overscan,i,t);o<=c;o++){const t=a.default(r.data[o])[0],n=t.key;_.push(e.jsx(C,{D:p.Z,F:o,P:h.S(o),U:h.v(o),G:"div",j:t,V:f},l(n)?n:"_"+o))}return e.jsx("div",{ref:d,style:{overflowAnchor:"none",flex:"none",position:"relative",visibility:"hidden",width:f?c+"px":"100%",height:f?"100%":c+"px",[f?"minWidth":"minHeight"]:u+"px",pointerEvents:0!==i?"none":"auto"},children:_})}}}),O={data:{type:Array,required:!0},overscan:{type:Number,default:4},itemSize:Number,shift:Boolean,horizontal:Boolean},J=/*#__PURE__*/t.defineComponent({props:O,emits:["scroll","scrollEnd","rangeChange"],setup(r,{emit:o,expose:n,slots:s}){const i=r.horizontal,l=e=>{o("scroll",e)},c=()=>{o("scrollEnd")},a=(e,t)=>{o("rangeChange",e,t)},u=t.ref();return n({get scrollOffset(){return u.value.scrollOffset},get scrollSize(){return u.value.scrollSize},get viewportSize(){return u.value.viewportSize},scrollToIndex:(...e)=>u.value.scrollToIndex(...e),scrollTo:(...e)=>u.value.scrollTo(...e),scrollBy:(...e)=>u.value.scrollBy(...e)}),()=>e.jsx("div",{style:{display:i?"inline-block":"block",[i?"overflowX":"overflowY"]:"auto",contain:"strict",width:"100%",height:"100%"},children:e.jsx(N,{ref:u,data:r.data,overscan:r.overscan,itemSize:r.itemSize,shift:r.shift,horizontal:i,onScroll:l,onScrollEnd:c,onRangeChange:a,children:s})})}}),R={data:{type:Array,required:!0},overscan:{type:Number,default:4},itemSize:Number,shift:Boolean,horizontal:Boolean},H=/*#__PURE__*/t.defineComponent({props:R,emits:["scrollEnd","rangeChange"],setup(r,{emit:o,slots:n}){var s;const i=r.horizontal,c=t.ref(),a=I(r.data.length,null!==(s=r.itemSize)&&void 0!==s?s:40,void 0,void 0,!r.itemSize),u=((e,t)=>{const r=t?"width":"height",o=t?"innerWidth":"innerHeight",n=new WeakMap,s=B((t=>{const o=[];for(const{target:e,contentRect:s}of t){if(!e.offsetParent)continue;const t=n.get(e);l(t)&&o.push([t,s[r]])}o.length&&e.A(1,o)}));let i;return{K(t){const r=b(m(t)),n=()=>{e.A(2,r[o])};r.addEventListener("resize",n),n(),i=()=>{r.removeEventListener("resize",n)}},Z:(e,t)=>(n.set(e,t),s.M(e),()=>{n.delete(e),s.W(e)}),L(){i&&i(),s.L()}}})(a,i),f=((e,t)=>{let r;return{M(o){const n=t?"scrollX":"scrollY",s=m(o),i=b(s),l=s.body,c=(e,t,r,o=0)=>{const n=r?"offsetLeft":"offsetTop",s=o+(r&&y()?i.innerWidth-e[n]-e.offsetWidth:e[n]),l=e.offsetParent;return e!==t&&l?c(l,t,r,s):s};r=q(e,i,t,(()=>T(i[n],t)-c(o,l,t)),(e=>{i.scrollBy(t?T(e,t):0,t?0:e)}))},L(){r&&r.L()},Y:e=>{r&&r.Y(e)}}})(a,i),d=t.ref(a.h()),h=a.H(3,(()=>{d.value=a.h()})),p=a.H(8,(()=>{o("scrollEnd")}));return t.onMounted((()=>{const e=c.value.parentElement;e&&(u.K(e),f.M(e))})),t.onUnmounted((()=>{h(),p(),u.L(),f.L()})),t.watch((()=>r.data.length),(e=>{a.A(3,[e,r.shift])})),t.watch([d,a.J],(([,e],[,t])=>{if(e===t)return;const r=a.R();r&&f.Y(r)}),{flush:"post"}),t.watch([d,a._],(([,[e,t]],[,[r,n]])=>{r===e&&n===t||o("rangeChange",e,t)}),{flush:"post"}),()=>{d.value;const t=r.data.length,[o,s]=a._(),f=a.T(),h=a.O(),p=[];for(let c=w(o,r.overscan,f),d=x(s,r.overscan,f,t);c<=d;c++){const t=n.default(r.data[c])[0],o=t.key;p.push(e.jsx(C,{D:u.Z,F:c,P:a.S(c),U:a.v(c),G:"div",j:t,V:i},l(o)?o:"_"+c))}return e.jsx("div",{ref:c,style:{overflowAnchor:"none",flex:"none",position:"relative",visibility:"hidden",width:i?h+"px":"100%",height:i?"100%":h+"px",pointerEvents:0!==f?"none":"auto"},children:p})}}});exports.VList=J,exports.Virtualizer=N,exports.WindowVirtualizer=H;
2
2
  //# sourceMappingURL=index.js.map