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 +70 -4
- package/lib/vue/VList.d.ts +2 -30
- package/lib/vue/Virtualizer.d.ts +120 -0
- package/lib/vue/WindowVirtualizer.d.ts +83 -0
- package/lib/vue/index.d.ts +2 -0
- package/lib/vue/index.js +1 -1
- package/lib/vue/index.js.map +1 -1
- package/lib/vue/index.mjs +1 -1
- package/lib/vue/index.mjs.map +1 -1
- package/package.json +11 -8
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
|
|
206
|
+
const sizes = [20, 40, 180, 77];
|
|
205
207
|
const data = Array.from({ length: 1000 }).map((_, i) => ({
|
|
206
208
|
id: i,
|
|
207
|
-
|
|
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.
|
|
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)
|
package/lib/vue/VList.d.ts
CHANGED
|
@@ -1,35 +1,7 @@
|
|
|
1
1
|
/** @jsxImportSource vue */
|
|
2
2
|
import { ComponentOptionsMixin, SlotsType } from "vue";
|
|
3
|
-
import {
|
|
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
|
+
}>>;
|
package/lib/vue/index.d.ts
CHANGED
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
|