virtua 0.30.4 → 0.31.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.
@@ -0,0 +1,238 @@
1
+ <script lang="ts" generics="T">
2
+ import { onMount, onDestroy, createEventDispatcher } from "svelte";
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+ import {
5
+ SCROLL_IDLE,
6
+ type StateVersion,
7
+ getOverscanedRange,
8
+ CHANGE_ITEM_LENGTH,
9
+ createVirtualizer,
10
+ FIX_SCROLL_JUMP,
11
+ GET_ITEM_OFFSET,
12
+ GET_JUMP_COUNT,
13
+ GET_RANGE,
14
+ GET_SCROLL_DIRECTION,
15
+ GET_SCROLL_OFFSET,
16
+ GET_SCROLL_SIZE,
17
+ GET_TOTAL_SIZE,
18
+ GET_VIEWPORT_SIZE,
19
+ IS_ITEM_HIDDEN,
20
+ OBSERVE_ITEM_RESIZE,
21
+ ON_MOUNT,
22
+ ON_UN_MOUNT,
23
+ SCROLL_BY,
24
+ SCROLL_TO,
25
+ SCROLL_TO_INDEX,
26
+ } from "./core";
27
+ import {
28
+ effect,
29
+ type UnwrapCustomEvents,
30
+ defaultGetKey,
31
+ styleToString,
32
+ } from "./utils";
33
+ import ListItem from "./ListItem.svelte";
34
+
35
+ // https://github.com/sveltejs/rfcs/pull/38
36
+ interface $$Props extends HTMLAttributes<HTMLDivElement> {
37
+ /**
38
+ * The data items rendered by this component.
39
+ */
40
+ data: T[];
41
+ /**
42
+ * Function that returns the key of an item in the list. It's recommended to specify whenever possible for performance.
43
+ * @default defaultGetKey (returns index of item)
44
+ */
45
+ getKey?: (data: T, index: number) => string | number;
46
+ /**
47
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
48
+ * @defaultValue 4
49
+ */
50
+ overscan?: number;
51
+ /**
52
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
53
+ *
54
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
55
+ * - If set, you can opt out estimation and use the value as initial item size.
56
+ */
57
+ itemSize?: number;
58
+ /**
59
+ * 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.
60
+ */
61
+ shift?: boolean;
62
+ /**
63
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
64
+ */
65
+ horizontal?: boolean;
66
+ }
67
+
68
+ // https://github.com/kitschpatrol/svelte-tweakpane-ui/blob/248fd7c24926af1e485a0676b6a8c053177e92db/src/lib/control/Button.svelte#L50-L51
69
+ interface $$Events {
70
+ /**
71
+ * Callback invoked whenever scroll offset changes.
72
+ * @param offset Current scrollTop or scrollLeft.
73
+ */
74
+ scroll: CustomEvent<number>;
75
+ /**
76
+ * Callback invoked when scrolling stops.
77
+ */
78
+ scrollEnd: CustomEvent<void>;
79
+ /**
80
+ * Callback invoked when visible items range changes.
81
+ */
82
+ rangeChange: CustomEvent<[start: number, end: number]>;
83
+ }
84
+
85
+ export let data: $$Props["data"];
86
+ export let getKey: NonNullable<$$Props["getKey"]> = defaultGetKey;
87
+ export let overscan: NonNullable<$$Props["overscan"]> = 4;
88
+ export let itemSize: $$Props["itemSize"] = undefined;
89
+ export let shift: NonNullable<$$Props["shift"]> = false;
90
+ export let horizontal: NonNullable<$$Props["horizontal"]> = false;
91
+
92
+ let containerRef: HTMLDivElement;
93
+
94
+ let rerender: StateVersion = [];
95
+
96
+ const dispatchEvent = createEventDispatcher<UnwrapCustomEvents<$$Events>>();
97
+
98
+ const virtualizer = createVirtualizer(
99
+ data.length,
100
+ itemSize,
101
+ horizontal,
102
+ (v) => {
103
+ rerender = v;
104
+ },
105
+ (offset) => {
106
+ dispatchEvent("scroll", offset);
107
+ },
108
+ () => {
109
+ dispatchEvent("scrollEnd");
110
+ }
111
+ );
112
+
113
+ $: range = rerender && virtualizer[GET_RANGE]();
114
+ $: scrollDirection = rerender && virtualizer[GET_SCROLL_DIRECTION]();
115
+ $: totalSize = rerender && virtualizer[GET_TOTAL_SIZE]();
116
+ $: jumpCount = rerender && virtualizer[GET_JUMP_COUNT]();
117
+ $: extendedRange = getOverscanedRange(
118
+ range[0],
119
+ range[1],
120
+ overscan,
121
+ scrollDirection,
122
+ data.length
123
+ );
124
+
125
+ onMount(() => {
126
+ const root = containerRef.parentElement!;
127
+ virtualizer[ON_MOUNT](root);
128
+ });
129
+ onDestroy(() => {
130
+ virtualizer[ON_UN_MOUNT]();
131
+ });
132
+
133
+ let prevLength = data.length;
134
+ effect(() => {
135
+ if (prevLength === data.length) return;
136
+ virtualizer[CHANGE_ITEM_LENGTH]((prevLength = data.length), shift);
137
+ }, true);
138
+
139
+ let prevJumpCount: number | undefined;
140
+ effect(() => {
141
+ if (prevJumpCount === jumpCount) return;
142
+ prevJumpCount = jumpCount;
143
+ virtualizer[FIX_SCROLL_JUMP]();
144
+ });
145
+
146
+ let prevRange: typeof range | undefined;
147
+ effect(() => {
148
+ if (prevRange && prevRange[0] === range[0] && prevRange[1] === range[1])
149
+ return;
150
+ prevRange = range;
151
+ dispatchEvent("rangeChange", [range[0], range[1]]);
152
+ });
153
+
154
+ /**
155
+ * Get current scrollTop or scrollLeft.
156
+ */
157
+ export const getScrollOffset = virtualizer[GET_SCROLL_OFFSET];
158
+ /**
159
+ * Get current scrollHeight or scrollWidth.
160
+ */
161
+ export const getScrollSize = virtualizer[GET_SCROLL_SIZE];
162
+ /**
163
+ * Get current offsetHeight or offsetWidth.
164
+ */
165
+ export const getViewportSize = virtualizer[GET_VIEWPORT_SIZE];
166
+ /**
167
+ * Scroll to the item specified by index.
168
+ * @param index index of item
169
+ * @param opts options
170
+ */
171
+ export const scrollToIndex = virtualizer[SCROLL_TO_INDEX];
172
+ /**
173
+ * Scroll to the given offset.
174
+ * @param offset offset from start
175
+ */
176
+ export const scrollTo = virtualizer[SCROLL_TO];
177
+ /**
178
+ * Scroll by the given offset.
179
+ * @param offset offset from current position
180
+ */
181
+ export const scrollBy = virtualizer[SCROLL_BY];
182
+
183
+ let items: T[];
184
+ $: {
185
+ const [startIndex, endIndex] = extendedRange;
186
+ const newItems: T[] = [];
187
+ for (let i = startIndex, j = endIndex; i <= j; i++) {
188
+ newItems.push(data[i]!);
189
+ }
190
+ items = newItems;
191
+ }
192
+
193
+ const viewportStyle = styleToString({
194
+ display: horizontal ? "inline-block" : "block",
195
+ [horizontal ? "overflow-x" : "overflow-y"]: "auto",
196
+ contain: "strict",
197
+ width: "100%",
198
+ height: "100%",
199
+ });
200
+
201
+ const containerStyle = styleToString({
202
+ // contain: "content",
203
+ "overflow-anchor": "none", // opt out browser's scroll anchoring because it will conflict to scroll anchoring of virtualizer
204
+ flex: "none", // flex style can break layout
205
+ position: "relative",
206
+ visibility: "hidden",
207
+ });
208
+
209
+ $: dynamicContainerStyle = styleToString({
210
+ width: horizontal ? totalSize + "px" : "100%",
211
+ height: horizontal ? "100%" : totalSize + "px",
212
+ "pointer-events": scrollDirection !== SCROLL_IDLE ? "none" : "auto",
213
+ });
214
+ </script>
215
+
216
+ <!--
217
+ @component
218
+ Virtualized list component.
219
+ -->
220
+ <div {...$$restProps} style={`${viewportStyle} ${$$restProps["style"] || ""}`}>
221
+ <div
222
+ bind:this={containerRef}
223
+ style={`${containerStyle} ${dynamicContainerStyle}`}
224
+ >
225
+ {#each items as item, index (getKey(item, index + extendedRange[0]))}
226
+ <ListItem
227
+ index={index + extendedRange[0]}
228
+ offset={rerender &&
229
+ virtualizer[GET_ITEM_OFFSET](index + extendedRange[0])}
230
+ hide={rerender && virtualizer[IS_ITEM_HIDDEN](index + extendedRange[0])}
231
+ {horizontal}
232
+ resizer={virtualizer[OBSERVE_ITEM_RESIZE]}
233
+ >
234
+ <slot {item} />
235
+ </ListItem>
236
+ {/each}
237
+ </div>
238
+ </div>
@@ -0,0 +1,91 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { HTMLAttributes } from "svelte/elements";
3
+ declare class __sveltets_Render<T> {
4
+ props(): {
5
+ /**
6
+ * Get current scrollTop or scrollLeft.
7
+ */ getScrollOffset?: (() => number) | undefined;
8
+ /**
9
+ * Get current scrollHeight or scrollWidth.
10
+ */ getScrollSize?: (() => number) | undefined;
11
+ /**
12
+ * Get current offsetHeight or offsetWidth.
13
+ */ getViewportSize?: (() => number) | undefined;
14
+ /**
15
+ * Scroll to the item specified by index.
16
+ * @param index index of item
17
+ * @param opts options
18
+ */ scrollToIndex?: ((index: number, opts?: import("../core/types").ScrollToIndexOpts | undefined) => void) | undefined;
19
+ /**
20
+ * Scroll to the given offset.
21
+ * @param offset offset from start
22
+ */ scrollTo?: ((offset: number) => void) | undefined;
23
+ /**
24
+ * Scroll by the given offset.
25
+ * @param offset offset from current position
26
+ */ scrollBy?: ((offset: number) => void) | undefined;
27
+ } & HTMLAttributes<HTMLDivElement> & {
28
+ /**
29
+ * The data items rendered by this component.
30
+ */
31
+ data: T[];
32
+ /**
33
+ * Function that returns the key of an item in the list. It's recommended to specify whenever possible for performance.
34
+ * @default defaultGetKey (returns index of item)
35
+ */
36
+ getKey?: ((data: T, index: number) => string | number) | undefined;
37
+ /**
38
+ * Number of items to render above/below the visible bounds of the list. You can increase to avoid showing blank items in fast scrolling.
39
+ * @defaultValue 4
40
+ */
41
+ overscan?: number | undefined;
42
+ /**
43
+ * Item size hint for unmeasured items. It will help to reduce scroll jump when items are measured if used properly.
44
+ *
45
+ * - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
46
+ * - If set, you can opt out estimation and use the value as initial item size.
47
+ */
48
+ itemSize?: number | undefined;
49
+ /**
50
+ * 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.
51
+ */
52
+ shift?: boolean | undefined;
53
+ /**
54
+ * If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
55
+ */
56
+ horizontal?: boolean | undefined;
57
+ };
58
+ events(): {
59
+ /**
60
+ * Callback invoked whenever scroll offset changes.
61
+ * @param offset Current scrollTop or scrollLeft.
62
+ */
63
+ scroll: CustomEvent<number>;
64
+ /**
65
+ * Callback invoked when scrolling stops.
66
+ */
67
+ scrollEnd: CustomEvent<void>;
68
+ /**
69
+ * Callback invoked when visible items range changes.
70
+ */
71
+ rangeChange: CustomEvent<[start: number, end: number]>;
72
+ };
73
+ slots(): {
74
+ default: {
75
+ item: T;
76
+ };
77
+ };
78
+ }
79
+ export type VListProps<T> = ReturnType<__sveltets_Render<T>['props']>;
80
+ export type VListEvents<T> = ReturnType<__sveltets_Render<T>['events']>;
81
+ export type VListSlots<T> = ReturnType<__sveltets_Render<T>['slots']>;
82
+ /** Virtualized list component. */
83
+ export default class VList<T> extends SvelteComponent<VListProps<T>, VListEvents<T>, VListSlots<T>> {
84
+ get getScrollOffset(): () => number;
85
+ get getScrollSize(): () => number;
86
+ get getViewportSize(): () => number;
87
+ get scrollToIndex(): (index: number, opts?: import("../core/types").ScrollToIndexOpts | undefined) => void;
88
+ get scrollTo(): (offset: number) => void;
89
+ get scrollBy(): (offset: number) => void;
90
+ }
91
+ export {};
@@ -0,0 +1,45 @@
1
+ // @ts-nocheck
2
+ import { type StateVersion } from "../core/store";
3
+ export { SCROLL_IDLE, type StateVersion, getOverscanedRange, } from "../core/store";
4
+ export { isRTLDocument } from "../core/environment";
5
+ export type { ItemResizeObserver } from "../core/resizer";
6
+ export declare const ON_MOUNT = 0;
7
+ export declare const ON_UN_MOUNT = 1;
8
+ export declare const GET_RANGE = 2;
9
+ export declare const GET_TOTAL_SIZE = 3;
10
+ export declare const GET_VIEWPORT_SIZE = 4;
11
+ export declare const GET_SCROLL_OFFSET = 5;
12
+ export declare const GET_SCROLL_DIRECTION = 6;
13
+ export declare const GET_JUMP_COUNT = 7;
14
+ export declare const GET_ITEM_OFFSET = 8;
15
+ export declare const IS_ITEM_HIDDEN = 9;
16
+ export declare const OBSERVE_ITEM_RESIZE = 10;
17
+ export declare const FIX_SCROLL_JUMP = 11;
18
+ export declare const CHANGE_ITEM_LENGTH = 12;
19
+ export declare const GET_SCROLL_SIZE = 13;
20
+ export declare const SCROLL_TO = 14;
21
+ export declare const SCROLL_BY = 15;
22
+ export declare const SCROLL_TO_INDEX = 16;
23
+ /**
24
+ * This function is workaround for terser minification.
25
+ * Svelte doesn't seem to have a good way to modify and print its AST.
26
+ */
27
+ export declare const createVirtualizer: (count: number, itemSize: number | undefined, horizontal: boolean, onUpdate: (v: StateVersion) => void, onScroll: (offset: number) => void, onScrollEnd: () => void) => {
28
+ 0: (scrollable: HTMLElement) => void;
29
+ 1: () => void;
30
+ 2: () => readonly [startIndex: number, endIndex: number];
31
+ 3: () => number;
32
+ 4: () => number;
33
+ 5: () => number;
34
+ 6: () => import("../core/store").ScrollDirection;
35
+ 7: () => number;
36
+ 8: (index: number) => number;
37
+ 9: (index: number) => boolean;
38
+ 10: import("../core/resizer").ItemResizeObserver;
39
+ 11: () => void;
40
+ 12: (len: number, shift?: boolean) => void;
41
+ 13: () => number;
42
+ 14: (offset: number) => void;
43
+ 15: (offset: number) => void;
44
+ 16: (index: number, opts?: import("..").ScrollToIndexOpts | undefined) => void;
45
+ };
@@ -0,0 +1 @@
1
+ const e=Math.min,t=Math.max,r=Math.abs,o=setTimeout,n=(r,o,n)=>e(n,t(o,r)),s=e=>null!=e,c="function"==typeof queueMicrotask?queueMicrotask:e=>{Promise.resolve().then(e)},l=e=>{let t,r;return(...o)=>(t||(t=!0,r=e(...o)),r)},a=-1,i=(e,t,r)=>{const o=r?"unshift":"push";for(let r=0;r<t;r++)e[o](a);return e},u=(e,t)=>{const r=e.t[t];return r===a?e.o:r},f=(t,r,o)=>{const n=t.t[r]===a;return t.t[r]=o,t.l=e(r,t.l),n},_=(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+=u(e,r),e.u[++r]=o;return e.l=t,o},h=(e,t,r)=>{for(;r>=0&&r<e.i;){const o=_(e,r);if(o<=t){if(o+u(e,r)>t)break;r++}else r--}return n(r,0,e.i-1)},d=(t,r,o)=>{const n=r-t.i;return t.l=o?-1:e(r-1,t.l),t.i=r,n>0?(i(t.u,n),i(t.t,n,o),t.o*n):(t.u.splice(n),(o?t.t.splice(0,-n):t.t.splice(n)).reduce(((e,r)=>e-(r===a?t.o:r)),0))},p="undefined"!=typeof window,m=()=>document.documentElement,g=/*#__PURE__*/l((()=>!!p&&"rtl"===getComputedStyle(m()).direction)),b=/*#__PURE__*/l((()=>/iP(hone|od|ad)/.test(navigator.userAgent))),v=/*#__PURE__*/l((()=>"scrollBehavior"in m().style)),w=0,S=(r,o,n,s,c)=>(1!==s&&(r-=t(0,n)),2!==s&&(o+=t(0,n)),[t(r,0),e(o,c-1)]),k=(e,t)=>t&&g()?-e:e,I=0,y=1,z=2,M=3,T=4,x=5,J=6,R=7,C=8,O=9,P=10,q=11,B=12,D=13,L=14,U=15,V=16,F=(l,p,m,g,w,S)=>{const F=((o,n=40,s=0,c,l=!1,p=0)=>{let m=!!s,g=[],v=0,w=0,S=0,k=0,I=0,y=0,z=0,M=0,T=m?[0,t(s-1,0)]:null,x=[0,0],J=0;const R=((e,t)=>({o:t,t:i([],e),i:e,l:-1,u:i([],e)}))(o,n),C=new Set,O=()=>w-p,P=t=>((t,r,o,n)=>{const s=h(t,r,e(o,t.i-1));return[s,h(t,r+n,s)]})(R,t,x[0],v),q=()=>(e=>e.i?_(e,e.i-1)+u(e,e.i-1):0)(R),B=e=>_(R,e)-I,D=e=>u(R,e),L=e=>{e&&(b()&&0!==z?I+=e:(k+=e,S++))};return{_:()=>g,h:()=>(e=>[[...e.t],e.o])(R),p:()=>y?x:(x=P(t(0,O()+I+k)),T?[e(x[0],T[0]),t(x[1],T[1])]:x),m:e=>R.t[e]===a,v:()=>!!T&&R.t.slice(t(0,T[0]-1),e(R.i-1,T[1]+1)+1).includes(a),S:B,k:D,I:()=>R.i,M:()=>w,T:()=>z,J:()=>v,R:()=>p,C:q,O:()=>S,P:()=>(y=k,k=0,[y,2===M]),q(e,t){const r=[e,t];return C.add(r),()=>{C.delete(r)}},B(e,o){let n,s,c=0;switch(e){case 1:{const e=y;y=0;const t=o-w,n=r(t);e&&n<r(e)+1||0!==M||(z=t<0?2:1),m&&(T=null,m=!1),w=o,c=4;const l=O();l>=-v&&l<=q()&&(c+=1,s=n>v);break}case 2:c=8,0!==z&&(n=!0,c+=1),z=0,M=0,T=null;break;case 3:{const e=o.filter((([e,t])=>R.t[e]!==t));if(!e.length)break;L(e.reduce(((e,[t,r])=>((2===M||(T?t<T[0]:B(t)+(0===z&&0===M?D(t):0)<O()))&&(e+=r-D(t)),e)),0));for(const[t,r]of e){const e=D(t),o=f(R,t,r);l&&(J+=r,o||(J-=e))}l&&v&&J>v&&(L(((e,r)=>{let o=0;const n=e.t.filter(((e,t)=>{const n=e!==a;return n&&t<r&&o++,n})),s=e.o;return e.l=-1,((e.o=(e=>{const t=(e=>[...e].sort(((e,t)=>e-t)))(e),r=e.length/2|0;return t.length%2==0?(t[r-1]+t[r])/2:t[r]})(n))-s)*t(r-o,0)})(R,x[0])),l=!1),c=3,s=!0;break}case 4:v!==o&&(v=o,c=3);break;case 5:o[1]?(L(d(R,o[0],!0)),M=2,c=1):d(R,o[0]);break;case 6:p=o;break;case 7:M=1;break;case 8:T=P(o),c=1}c&&(g=[],n&&I&&(k+=I,I=0,S++),C.forEach((([e,t])=>{c&e&&t(s)})))}}})(l,null!=p?p:40,void 0,0,!p),W=((e,t)=>{let r;const o=t?"width":"height",n=new WeakMap,c=(e=>{let t;return{D(r){var o,n;(t||(t=new(n=r,o=n.ownerDocument,o.defaultView).ResizeObserver(e))).observe(r)},L(e){t.unobserve(e)},U(){t&&t.disconnect()}}})((t=>{const c=[];for(const{target:l,contentRect:a}of t)if(l.offsetParent)if(l===r)e.B(4,a[o]);else{const e=n.get(l);s(e)&&c.push([e,a[o]])}c.length&&e.B(3,c)}));return{V(e){c.D(r=e)},F:(e,t)=>(n.set(e,t),c.D(e),()=>{n.delete(e),c.L(e)}),U:c.U}})(F,m),X=((e,t)=>{let r,l,a;const i=t?"scrollLeft":"scrollTop",u=t?"overflowX":"overflowY",f=async(n,s)=>{if(!r)return void c((()=>f(n,s)));a&&a();const l=()=>{let t;return[new Promise(((e,r)=>{t=e,o(a=r,150)})),e.q(2,(()=>{t&&t()}))]};if(s&&v()){for(;e.B(8,n()),e.v();){const[e,t]=l();try{await e}catch(e){return}finally{t()}}r.scrollTo({[t?"left":"top"]:k(n(),t),behavior:"smooth"})}else for(;;){const[o,s]=l();try{r[i]=k(n(),t),e.B(7),await o}catch(e){return}finally{s()}}};return{D(n){r=n,l=((e,t,r,n,c)=>{const l=Date.now;let a=0,i=!1,u=!1,f=!1,_=!1;const h=(()=>{let t;const r=()=>{s(t)&&clearTimeout(t)},n=()=>{r(),t=o((()=>{t=null,(()=>{if(i||u)return i=!1,void h();f=!1,e.B(2)})()}),150)};return n.W=r,n})(),d=()=>{a=l(),f&&(_=!0),e.B(1,n()),h()},p=t=>{if(i||0===e.T()||t.ctrlKey)return;const o=l()-a;150>o&&50<o&&(r?t.deltaX:t.deltaY)&&(i=!0)},m=()=>{u=!0,f=_=!1},g=()=>{u=!1,b()&&(f=!0)};return t.addEventListener("scroll",d),t.addEventListener("wheel",p,{passive:!0}),t.addEventListener("touchstart",m,{passive:!0}),t.addEventListener("touchend",g,{passive:!0}),{U:()=>{t.removeEventListener("scroll",d),t.removeEventListener("wheel",p),t.removeEventListener("touchstart",m),t.removeEventListener("touchend",g),h.W()},X:()=>{const[t,o]=e.P();t&&(c(k(t,r),o,_),_=!1,o&&e.J()>e.C()&&e.B(1,n()))}}})(e,n,t,(()=>k(n[i],t)),((t,r,s)=>{if(s){const e=n.style,t=e[u];e[u]="hidden",o((()=>{e[u]=t}))}r?(n[i]=e.M()+t,a&&a()):n[i]+=t}))},U(){l&&l.U()},Y(e){f((()=>e))},j(t){t+=e.M(),f((()=>t))},A(t,{align:r,smooth:o,offset:s=0}={}){if(t=n(t,0,e.I()-1),"nearest"===r){const o=e.S(t),n=e.M();if(o<n)r="start";else{if(!(o+e.k(t)>n+e.J()))return;r="end"}}f((()=>s+e.R()+e.S(t)+("end"===r?e.k(t)-e.J():"center"===r?(e.k(t)-e.J())/2:0)),o)},X:()=>{l&&l.X()}}})(F,m),Y=F.q(1,(()=>{g(F._())})),j=F.q(4,(()=>{w(F.M())})),A=F.q(8,(()=>{S()}));return{[I]:e=>{W.V(e),X.D(e)},[y]:()=>{Y(),j(),A(),W.U(),X.U()},[z]:F.p,[M]:F.C,[T]:F.J,[x]:F.M,[J]:F.T,[R]:F.O,[C]:F.S,[O]:F.m,[P]:W.F,[q]:X.X,[B]:(e,t)=>{F.B(5,[e,t])},[D]:()=>(e=>t(e.C(),e.J()))(F),[L]:X.Y,[U]:X.j,[V]:X.A}};export{B as CHANGE_ITEM_LENGTH,q as FIX_SCROLL_JUMP,C as GET_ITEM_OFFSET,R as GET_JUMP_COUNT,z as GET_RANGE,J as GET_SCROLL_DIRECTION,x as GET_SCROLL_OFFSET,D as GET_SCROLL_SIZE,M as GET_TOTAL_SIZE,T as GET_VIEWPORT_SIZE,O as IS_ITEM_HIDDEN,P as OBSERVE_ITEM_RESIZE,I as ON_MOUNT,y as ON_UN_MOUNT,U as SCROLL_BY,w as SCROLL_IDLE,L as SCROLL_TO,V as SCROLL_TO_INDEX,F as createVirtualizer,S as getOverscanedRange,g as isRTLDocument};
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @module svelte
3
+ */
4
+ export { default as VList } from "./VList.svelte";
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @module svelte
3
+ */
4
+ export { default as VList } from "./VList.svelte";
@@ -0,0 +1,10 @@
1
+ // @ts-nocheck
2
+ export declare const effect: (cb: () => (() => void) | void, before?: boolean) => void;
3
+ export declare const styleToString: (obj: Record<string, string>) => string;
4
+ export declare const defaultGetKey: (_data: unknown, i: number) => string;
5
+ /**
6
+ * https://github.com/kitschpatrol/svelte-tweakpane-ui/blob/248fd7c24926af1e485a0676b6a8c053177e92db/src/lib/utils.ts#L57-L59
7
+ */
8
+ export type UnwrapCustomEvents<T> = {
9
+ [P in keyof T]: T[P] extends CustomEvent<infer detail> ? detail : never;
10
+ };
@@ -0,0 +1,17 @@
1
+ import { afterUpdate, beforeUpdate, onDestroy } from "svelte";
2
+ export const effect = (cb, before) => {
3
+ let cleanup;
4
+ (before ? beforeUpdate : afterUpdate)(() => {
5
+ if (cleanup)
6
+ cleanup();
7
+ cleanup = cb();
8
+ });
9
+ onDestroy(() => {
10
+ if (cleanup)
11
+ cleanup();
12
+ });
13
+ };
14
+ export const styleToString = (obj) => {
15
+ return Object.keys(obj).reduce((acc, k) => acc + `${k}:${obj[k]};`, "");
16
+ };
17
+ export const defaultGetKey = (_data, i) => "_" + i;