svg-scroll-draw 2.2.0 → 2.7.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 +7 -7
- package/dist/angular/index.cjs +3 -3
- package/dist/angular/index.d.mts +194 -9
- package/dist/angular/index.d.ts +194 -9
- package/dist/angular/index.mjs +3 -3
- package/dist/astro/index.cjs +3 -3
- package/dist/astro/index.d.mts +78 -1
- package/dist/astro/index.d.ts +78 -1
- package/dist/astro/index.mjs +3 -3
- package/dist/cdn/svg-scroll-draw.global.js +3 -3
- package/dist/devtools/index.cjs +1 -1
- package/dist/devtools/index.d.mts +12 -0
- package/dist/devtools/index.d.ts +12 -0
- package/dist/devtools/index.mjs +1 -1
- package/dist/group/index.cjs +3 -3
- package/dist/group/index.d.mts +88 -1
- package/dist/group/index.d.ts +88 -1
- package/dist/group/index.mjs +3 -3
- package/dist/index.cjs +4 -4
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.mjs +4 -4
- package/dist/lenis/index.cjs +1 -0
- package/dist/lenis/index.d.mts +51 -0
- package/dist/lenis/index.d.ts +51 -0
- package/dist/lenis/index.mjs +1 -0
- package/dist/nuxt/index.cjs +3 -3
- package/dist/nuxt/index.d.mts +286 -5
- package/dist/nuxt/index.d.ts +286 -5
- package/dist/nuxt/index.mjs +3 -3
- package/dist/pin/index.cjs +1 -0
- package/dist/pin/index.d.mts +29 -0
- package/dist/pin/index.d.ts +29 -0
- package/dist/pin/index.mjs +1 -0
- package/dist/react/index.cjs +3 -3
- package/dist/react/index.d.mts +16 -0
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.mjs +3 -3
- package/dist/snap/index.cjs +1 -0
- package/dist/snap/index.d.mts +30 -0
- package/dist/snap/index.d.ts +30 -0
- package/dist/snap/index.mjs +1 -0
- package/dist/solid/index.cjs +3 -3
- package/dist/solid/index.d.mts +171 -1
- package/dist/solid/index.d.ts +171 -1
- package/dist/solid/index.mjs +3 -3
- package/dist/svelte/index.cjs +3 -3
- package/dist/svelte/index.d.mts +183 -10
- package/dist/svelte/index.d.ts +183 -10
- package/dist/svelte/index.mjs +3 -3
- package/dist/vue/index.cjs +3 -3
- package/dist/vue/index.d.mts +278 -1
- package/dist/vue/index.d.ts +278 -1
- package/dist/vue/index.mjs +3 -3
- package/dist/web-component/index.cjs +3 -3
- package/dist/web-component/index.mjs +3 -3
- package/package.json +16 -1
package/dist/nuxt/index.d.ts
CHANGED
|
@@ -74,6 +74,14 @@ interface ScrollDrawOptions {
|
|
|
74
74
|
onProgress?: (alpha: number) => void;
|
|
75
75
|
onStart?: () => void;
|
|
76
76
|
onComplete?: () => void;
|
|
77
|
+
/** Fires when scroll position enters the trigger zone (scrolling forward). */
|
|
78
|
+
onEnter?: () => void;
|
|
79
|
+
/** Fires when scroll position exits the trigger zone at the end (scrolling forward). */
|
|
80
|
+
onLeave?: () => void;
|
|
81
|
+
/** Fires when scroll position re-enters the trigger zone from the end (scrolling back). */
|
|
82
|
+
onEnterBack?: () => void;
|
|
83
|
+
/** Fires when scroll position exits the trigger zone at the start (scrolling back). */
|
|
84
|
+
onLeaveBack?: () => void;
|
|
77
85
|
/**
|
|
78
86
|
* Trigger the animation when the element enters the viewport instead of
|
|
79
87
|
* tying it to scroll position. The draw runs over `duration` milliseconds,
|
|
@@ -109,6 +117,67 @@ interface ScrollDrawOptions {
|
|
|
109
117
|
native?: boolean;
|
|
110
118
|
}
|
|
111
119
|
|
|
120
|
+
interface ScrollAnimateOptions {
|
|
121
|
+
props: Record<string, string | number | [string | number, string | number]>;
|
|
122
|
+
trigger?: TriggerConfig;
|
|
123
|
+
easing?: EasingName | ((t: number) => number);
|
|
124
|
+
speed?: number;
|
|
125
|
+
once?: boolean;
|
|
126
|
+
axis?: 'x' | 'y';
|
|
127
|
+
scrollContainer?: string | Element;
|
|
128
|
+
native?: boolean;
|
|
129
|
+
onProgress?: (alpha: number) => void;
|
|
130
|
+
onComplete?: () => void;
|
|
131
|
+
/** Fires when scroll enters the trigger zone (scrolling forward). */
|
|
132
|
+
onEnter?: () => void;
|
|
133
|
+
/** Fires when scroll exits the trigger zone at the end (scrolling forward). */
|
|
134
|
+
onLeave?: () => void;
|
|
135
|
+
/** Fires when scroll re-enters the trigger zone from the end (scrolling back). */
|
|
136
|
+
onEnterBack?: () => void;
|
|
137
|
+
/** Fires when scroll exits the trigger zone at the start (scrolling back). */
|
|
138
|
+
onLeaveBack?: () => void;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
interface ScrollCounterOptions {
|
|
142
|
+
from?: number;
|
|
143
|
+
to: number;
|
|
144
|
+
format?: (value: number) => string;
|
|
145
|
+
easing?: EasingName | ((t: number) => number);
|
|
146
|
+
trigger?: TriggerConfig;
|
|
147
|
+
once?: boolean;
|
|
148
|
+
decimals?: number;
|
|
149
|
+
onComplete?: () => void;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
interface ScrollVideoOptions {
|
|
153
|
+
trigger?: TriggerConfig;
|
|
154
|
+
from?: number;
|
|
155
|
+
to?: number;
|
|
156
|
+
easing?: EasingName | ((t: number) => number);
|
|
157
|
+
once?: boolean;
|
|
158
|
+
axis?: 'x' | 'y';
|
|
159
|
+
preload?: 'auto' | 'metadata';
|
|
160
|
+
onReady?: () => void;
|
|
161
|
+
onComplete?: () => void;
|
|
162
|
+
onProgress?: (alpha: number) => void;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
interface ScrollTextOptions {
|
|
166
|
+
split?: 'chars' | 'words' | 'lines';
|
|
167
|
+
stagger?: number;
|
|
168
|
+
easing?: EasingName | ((t: number) => number);
|
|
169
|
+
from?: {
|
|
170
|
+
opacity?: number;
|
|
171
|
+
y?: number;
|
|
172
|
+
x?: number;
|
|
173
|
+
rotate?: number;
|
|
174
|
+
scale?: number;
|
|
175
|
+
};
|
|
176
|
+
trigger?: TriggerConfig;
|
|
177
|
+
once?: boolean;
|
|
178
|
+
onComplete?: () => void;
|
|
179
|
+
}
|
|
180
|
+
|
|
112
181
|
/** Composable — attach to any container ref. */
|
|
113
182
|
declare function useScrollDraw(options?: ScrollDrawOptions): vue.Ref<HTMLElement | null, HTMLElement | null>;
|
|
114
183
|
/** Component — wraps children in a <div> and initialises the engine. */
|
|
@@ -193,16 +262,226 @@ declare const ScrollDraw: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
193
262
|
once: boolean;
|
|
194
263
|
debug: boolean;
|
|
195
264
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
265
|
+
/**
|
|
266
|
+
* Composable — call with a full options object and bind the returned ref to
|
|
267
|
+
* whichever element you want to animate.
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* <script setup>
|
|
271
|
+
* import { useScrollAnimate } from 'svg-scroll-draw/vue';
|
|
272
|
+
* const el = useScrollAnimate({ props: { opacity: [0, 1] }, easing: 'ease-out', once: true });
|
|
273
|
+
* </script>
|
|
274
|
+
* <div :ref="el">...</div>
|
|
275
|
+
*/
|
|
276
|
+
declare function useScrollAnimate(options: ScrollAnimateOptions): vue.Ref<HTMLElement | null, HTMLElement | null>;
|
|
277
|
+
/**
|
|
278
|
+
* Component — accepts a single `:options` prop and wraps children in a <div>.
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* <ScrollAnimate :options="{ props: { opacity: [0, 1] }, easing: 'ease-out' }">
|
|
282
|
+
* <div>...</div>
|
|
283
|
+
* </ScrollAnimate>
|
|
284
|
+
*/
|
|
285
|
+
declare const ScrollAnimate: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
286
|
+
options: {
|
|
287
|
+
type: () => ScrollAnimateOptions;
|
|
288
|
+
required: true;
|
|
289
|
+
};
|
|
290
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
291
|
+
[key: string]: any;
|
|
292
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
293
|
+
options: {
|
|
294
|
+
type: () => ScrollAnimateOptions;
|
|
295
|
+
required: true;
|
|
296
|
+
};
|
|
297
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
298
|
+
/**
|
|
299
|
+
* Composable — returns a ref to bind to a span/element that will count up on scroll.
|
|
300
|
+
*
|
|
301
|
+
* @example
|
|
302
|
+
* <script setup>
|
|
303
|
+
* import { useScrollCounter } from 'svg-scroll-draw/vue';
|
|
304
|
+
* const el = useScrollCounter({ to: 1000, easing: 'ease-out', once: true });
|
|
305
|
+
* </script>
|
|
306
|
+
* <span :ref="el" />
|
|
307
|
+
*/
|
|
308
|
+
declare function useScrollCounter(options: ScrollCounterOptions): vue.Ref<HTMLElement | null, HTMLElement | null>;
|
|
309
|
+
/**
|
|
310
|
+
* Component — renders a <span> that counts from `from` to `to` on scroll.
|
|
311
|
+
*
|
|
312
|
+
* @example
|
|
313
|
+
* <ScrollCounter :to="1250000" :format="n => '$' + Math.round(n).toLocaleString()" />
|
|
314
|
+
*/
|
|
315
|
+
declare const ScrollCounter: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
316
|
+
to: {
|
|
317
|
+
type: NumberConstructor;
|
|
318
|
+
required: true;
|
|
319
|
+
};
|
|
320
|
+
from: {
|
|
321
|
+
type: NumberConstructor;
|
|
322
|
+
};
|
|
323
|
+
format: {
|
|
324
|
+
type: () => ScrollCounterOptions["format"];
|
|
325
|
+
};
|
|
326
|
+
easing: {
|
|
327
|
+
type: (StringConstructor | FunctionConstructor)[];
|
|
328
|
+
};
|
|
329
|
+
trigger: {
|
|
330
|
+
type: ObjectConstructor;
|
|
331
|
+
};
|
|
332
|
+
once: {
|
|
333
|
+
type: BooleanConstructor;
|
|
334
|
+
};
|
|
335
|
+
decimals: {
|
|
336
|
+
type: NumberConstructor;
|
|
337
|
+
};
|
|
338
|
+
onComplete: {
|
|
339
|
+
type: FunctionConstructor;
|
|
340
|
+
};
|
|
341
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
342
|
+
[key: string]: any;
|
|
343
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
344
|
+
to: {
|
|
345
|
+
type: NumberConstructor;
|
|
346
|
+
required: true;
|
|
347
|
+
};
|
|
348
|
+
from: {
|
|
349
|
+
type: NumberConstructor;
|
|
350
|
+
};
|
|
351
|
+
format: {
|
|
352
|
+
type: () => ScrollCounterOptions["format"];
|
|
353
|
+
};
|
|
354
|
+
easing: {
|
|
355
|
+
type: (StringConstructor | FunctionConstructor)[];
|
|
356
|
+
};
|
|
357
|
+
trigger: {
|
|
358
|
+
type: ObjectConstructor;
|
|
359
|
+
};
|
|
360
|
+
once: {
|
|
361
|
+
type: BooleanConstructor;
|
|
362
|
+
};
|
|
363
|
+
decimals: {
|
|
364
|
+
type: NumberConstructor;
|
|
365
|
+
};
|
|
366
|
+
onComplete: {
|
|
367
|
+
type: FunctionConstructor;
|
|
368
|
+
};
|
|
369
|
+
}>> & Readonly<{}>, {
|
|
370
|
+
once: boolean;
|
|
371
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
372
|
+
/**
|
|
373
|
+
* Composable — returns a ref to bind to a <video> element.
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* <script setup>
|
|
377
|
+
* import { useScrollVideo } from 'svg-scroll-draw/vue';
|
|
378
|
+
* const vid = useScrollVideo({ trigger: { start: 'top top', end: 'bottom top' } });
|
|
379
|
+
* </script>
|
|
380
|
+
* <video :ref="vid" src="..." muted playsinline preload="auto" />
|
|
381
|
+
*/
|
|
382
|
+
declare function useScrollVideo(options?: ScrollVideoOptions): vue.Ref<HTMLVideoElement | null, HTMLVideoElement | null>;
|
|
383
|
+
/**
|
|
384
|
+
* Component — renders a <video> scrubbed by scroll position.
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* <ScrollVideo src="/hero.mp4" :options="{ trigger: { start: 'top top', end: 'bottom top' } }" />
|
|
388
|
+
*/
|
|
389
|
+
declare const ScrollVideo: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
390
|
+
src: {
|
|
391
|
+
type: StringConstructor;
|
|
392
|
+
required: true;
|
|
393
|
+
};
|
|
394
|
+
options: {
|
|
395
|
+
type: () => ScrollVideoOptions;
|
|
396
|
+
};
|
|
397
|
+
muted: {
|
|
398
|
+
type: BooleanConstructor;
|
|
399
|
+
default: boolean;
|
|
400
|
+
};
|
|
401
|
+
playsInline: {
|
|
402
|
+
type: BooleanConstructor;
|
|
403
|
+
default: boolean;
|
|
404
|
+
};
|
|
405
|
+
class: {
|
|
406
|
+
type: StringConstructor;
|
|
407
|
+
};
|
|
408
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
409
|
+
[key: string]: any;
|
|
410
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
411
|
+
src: {
|
|
412
|
+
type: StringConstructor;
|
|
413
|
+
required: true;
|
|
414
|
+
};
|
|
415
|
+
options: {
|
|
416
|
+
type: () => ScrollVideoOptions;
|
|
417
|
+
};
|
|
418
|
+
muted: {
|
|
419
|
+
type: BooleanConstructor;
|
|
420
|
+
default: boolean;
|
|
421
|
+
};
|
|
422
|
+
playsInline: {
|
|
423
|
+
type: BooleanConstructor;
|
|
424
|
+
default: boolean;
|
|
425
|
+
};
|
|
426
|
+
class: {
|
|
427
|
+
type: StringConstructor;
|
|
428
|
+
};
|
|
429
|
+
}>> & Readonly<{}>, {
|
|
430
|
+
muted: boolean;
|
|
431
|
+
playsInline: boolean;
|
|
432
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
433
|
+
/**
|
|
434
|
+
* Composable — returns a ref to bind to any text element; splits and animates on scroll.
|
|
435
|
+
*
|
|
436
|
+
* @example
|
|
437
|
+
* <script setup>
|
|
438
|
+
* import { useScrollText } from 'svg-scroll-draw/vue';
|
|
439
|
+
* const el = useScrollText({ split: 'words', stagger: 0.05, once: true });
|
|
440
|
+
* </script>
|
|
441
|
+
* <h2 :ref="el">Animate on scroll.</h2>
|
|
442
|
+
*/
|
|
443
|
+
declare function useScrollText(options?: ScrollTextOptions): vue.Ref<HTMLElement | null, HTMLElement | null>;
|
|
444
|
+
/**
|
|
445
|
+
* Component — wraps text content in a <p> (or any tag) and animates it on scroll.
|
|
446
|
+
*
|
|
447
|
+
* @example
|
|
448
|
+
* <ScrollText :options="{ split: 'words', stagger: 0.05 }" tag="h2">
|
|
449
|
+
* Animate on scroll.
|
|
450
|
+
* </ScrollText>
|
|
451
|
+
*/
|
|
452
|
+
declare const ScrollText: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
453
|
+
options: {
|
|
454
|
+
type: () => ScrollTextOptions;
|
|
455
|
+
};
|
|
456
|
+
tag: {
|
|
457
|
+
type: StringConstructor;
|
|
458
|
+
default: string;
|
|
459
|
+
};
|
|
460
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
461
|
+
[key: string]: any;
|
|
462
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
463
|
+
options: {
|
|
464
|
+
type: () => ScrollTextOptions;
|
|
465
|
+
};
|
|
466
|
+
tag: {
|
|
467
|
+
type: StringConstructor;
|
|
468
|
+
default: string;
|
|
469
|
+
};
|
|
470
|
+
}>> & Readonly<{}>, {
|
|
471
|
+
tag: string;
|
|
472
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
196
473
|
|
|
197
474
|
/**
|
|
198
475
|
* Nuxt 3 integration for svg-scroll-draw.
|
|
199
476
|
*
|
|
200
|
-
* Re-exports
|
|
201
|
-
* plugin factory for global auto-registration.
|
|
477
|
+
* Re-exports all Vue composables and components (v1 + v2) for direct use,
|
|
478
|
+
* plus a plugin factory for global auto-registration.
|
|
202
479
|
*
|
|
203
480
|
* ## Option A — Import per component (recommended)
|
|
204
481
|
* ```ts
|
|
205
482
|
* import { useScrollDraw, ScrollDraw } from 'svg-scroll-draw/nuxt';
|
|
483
|
+
* import { useScrollAnimate, ScrollAnimate } from 'svg-scroll-draw/nuxt';
|
|
484
|
+
* import { useScrollText, useScrollCounter } from 'svg-scroll-draw/nuxt';
|
|
206
485
|
* ```
|
|
207
486
|
*
|
|
208
487
|
* ## Option B — Global auto-registration via Nuxt plugin
|
|
@@ -214,15 +493,17 @@ declare const ScrollDraw: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
214
493
|
* });
|
|
215
494
|
* ```
|
|
216
495
|
*
|
|
217
|
-
* Then use <ScrollDraw
|
|
496
|
+
* Then use <ScrollDraw>, <ScrollAnimate>, <ScrollCounter>, etc. globally.
|
|
218
497
|
*/
|
|
219
498
|
|
|
220
499
|
/**
|
|
221
|
-
* Vue plugin that globally registers
|
|
500
|
+
* Vue plugin that globally registers all svg-scroll-draw components.
|
|
222
501
|
* Pass to nuxtApp.vueApp.use() inside a Nuxt plugin.
|
|
502
|
+
*
|
|
503
|
+
* Registers: <ScrollDraw>, <ScrollAnimate>, <ScrollCounter>, <ScrollVideo>, <ScrollText>
|
|
223
504
|
*/
|
|
224
505
|
declare function createScrollDrawPlugin(): {
|
|
225
506
|
install(app: App): void;
|
|
226
507
|
};
|
|
227
508
|
|
|
228
|
-
export { ScrollDraw, type ScrollDrawOptions, createScrollDrawPlugin, useScrollDraw };
|
|
509
|
+
export { ScrollAnimate, type ScrollAnimateOptions, ScrollCounter, type ScrollCounterOptions, ScrollDraw, type ScrollDrawOptions, ScrollText, type ScrollTextOptions, ScrollVideo, type ScrollVideoOptions, createScrollDrawPlugin, useScrollAnimate, useScrollCounter, useScrollDraw, useScrollText, useScrollVideo };
|
package/dist/nuxt/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {defineComponent,ref,onMounted,onUnmounted,h}from'vue';function
|
|
2
|
-
<div style="position:absolute;${
|
|
3
|
-
<div style="position:absolute;${M?`left:${E}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${E}px;left:0;right:0;border-top:2px dashed #ef4444;`}padding:2px 6px;color:#ef4444;background:rgba(0,0,0,.6)">\u25A0 end</div>`;}return document.body.appendChild(r),window.addEventListener("scroll",p,{passive:true}),p(),r}function Oe(e,n,s){let r=(n.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),p=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,h=>{let L=parseFloat(h),E=r[p++]??L;return String(+(L+(E-L)*s).toFixed(4))})}function Fe(e,n={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let{preset:s,...r}=n,p=s?{..._e[s],...r}:r,h=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:L="path, polyline, line, polygon, rect, circle",speed:E=1,fade:M=false,easing:d="linear",trigger:S={},stagger:B=0,direction:y="forward",once:K=false,debug:Qe=false,axis:N="y",scrollContainer:xe,autoReverse:me=false,delay:ue=0,strokeColor:Q,strokeWidth:Y,fillOpacity:Z,waypoints:ee,velocityScale:pe=false,threshold:Ie=0,rootMargin:Re="0px",repeat:te=0,repeatDelay:$e=0,morphTo:H,clip:Me,autoplay:Ye=false,duration:Ze=1e3,native:et=true,onProgress:ce,onStart:de,onComplete:ae}=p,_=Me===true?"left":typeof Me=="string"?Me:false,re=typeof d=="function"?d:De[d]??De.linear,Ne=Pe(S.start??"top bottom"),He=Pe(S.end??"bottom top"),O=typeof xe=="string"?document.querySelector(xe):xe??null,W=Array.isArray(Q)?Q[0]:null,T=Array.isArray(Q)?Q[1]:typeof Q=="string"?Q:null,F=Array.isArray(Y)?Y[0]:null,A=Array.isArray(Y)?Y[1]:typeof Y=="number"?Y:null,C=Array.isArray(Z)?Z[0]:null,k=Array.isArray(Z)?Z[1]:typeof Z=="number"?Z:null;function ne(t){let o=t*100;switch(_){case "right":return `inset(0 0 0 ${100-o}%)`;case "top":return `inset(0 0 ${100-o}% 0)`;case "bottom":return `inset(${100-o}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-o}% 0 0)`}}let x=_?[]:Array.from(e.querySelectorAll(L)),w=[],z=[],U=0,X=0,$=false,R=false,v=0,ye=false,q=-1,ge=-1,D=false,se=0,G=0,j,Te=null,J=new Set,he=-1,We=performance.now();function fe(){return O?N==="x"?O.scrollLeft:O.scrollTop:N==="x"?window.scrollX:window.scrollY}function ze(){return O?N==="x"?O.clientWidth:O.clientHeight:N==="x"?window.innerWidth:window.innerHeight}function qe(){let t=e.getBoundingClientRect(),o,l,g;if(O){let P=O.getBoundingClientRect();o=N==="x"?t.left-P.left+O.scrollLeft:t.top-P.top+O.scrollTop,l=N==="x"?t.width:t.height,g=fe();}else o=N==="x"?t.left:t.top,l=N==="x"?t.width:t.height,g=fe();let I=Le({top:o,height:l},g,ze(),Ne,He);U=I.tStart,X=I.tEnd,Qe&&process.env.NODE_ENV!=="production"&&(Te?.remove(),Te=ft(U,X,N));}function tt(t,o){if(e.style.setProperty("--scroll-draw-progress",String(t)),_){let l=o==="reverse"?1-t:t;e.style.clipPath=ne(l);return}x.forEach((l,g)=>{l.style.strokeDashoffset=o==="reverse"?`${w[g]*t}`:`${w[g]*(1-t)}`,M&&(l.style.opacity=o==="reverse"?`${1-t}`:`${t}`),W&&T?l.style.stroke=Ee(W,T,t):T&&(l.style.stroke=T),F!==null&&A!==null?l.style.strokeWidth=`${F+(A-F)*t}`:A!==null&&(l.style.strokeWidth=`${A}`),C!==null&&k!==null?l.style.fillOpacity=`${C+(k-C)*t}`:k!==null&&(l.style.fillOpacity=`${k}`),H&&l.tagName.toLowerCase()==="path"&&z[g]&&l.setAttribute("d",Oe(z[g],H,t));});}function be(){if(e.style.setProperty("--scroll-draw-progress","0"),_){e.style.clipPath=ne(0);return}x.forEach((t,o)=>{t.style.strokeDasharray=`${w[o]}`,t.style.strokeDashoffset=y==="reverse"?"0":`${w[o]}`,M?t.style.opacity=y==="reverse"?"1":"0":t.style.opacity="",W&&(t.style.stroke=W),F!==null&&(t.style.strokeWidth=`${F}`),C!==null&&(t.style.fillOpacity=`${C}`),H&&t.tagName.toLowerCase()==="path"&&z[o]&&t.setAttribute("d",z[o]);});}if(x.forEach(t=>{ct(t);let o=Se(t);w.push(o),t.tagName.toLowerCase()==="path"?z.push(t.getAttribute("d")??""):z.push(""),h?(t.style.strokeDasharray=`${o}`,t.style.strokeDashoffset=y==="reverse"?`${o}`:"0",M&&(t.style.opacity="1"),T&&(t.style.stroke=T),A!==null&&(t.style.strokeWidth=`${A}`),k!==null&&(t.style.fillOpacity=`${k}`),H&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",H)):(t.style.strokeDasharray=`${o}`,t.style.strokeDashoffset=y==="reverse"?"0":`${o}`,M?t.style.opacity=y==="reverse"?"1":"0":t.style.opacity="",W&&(t.style.stroke=W),F!==null&&(t.style.strokeWidth=`${F}`),C!==null&&(t.style.fillOpacity=`${C}`));}),_){if(h)return e.style.clipPath=ne(1),ae?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=ne(0);}else if(h)return ae?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};function rt(){return !(et===false||!ut()||!x.length||typeof d!="string"||!(d in Xe)||_||N!=="y"||O||E!==1||B!==0||K||me||pe!==false||H||ee||te||ue>0||ce||de||ae||Q!=null||Y!=null||Z!=null||(S.start??"top bottom").trim()!=="top bottom"||(S.end??"bottom top").trim()!=="bottom top")}function nt(){let t=`svg-scroll-draw-${++lt}`,o=y==="reverse"?"0":"var(--ssd-len)",l=y==="reverse"?"var(--ssd-len)":"0",g=`stroke-dashoffset:${o};`,I=`stroke-dashoffset:${l};`;M&&(g+=`opacity:${y==="reverse"?1:0};`,I+=`opacity:${y==="reverse"?0:1};`);let P=document.createElement("style");P.setAttribute("data-svg-scroll-draw",""),P.textContent=`@keyframes ${t}{from{${g}}to{${I}}}.${t}{animation-name:${t};animation-duration:auto;animation-timing-function:${Xe[d]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(P);function a(i,c){i.style.setProperty("--ssd-len",String(w[c])),i.style.strokeDasharray=`${w[c]}`,i.style.strokeDashoffset="",i.style.opacity="",i.style.animationPlayState="",i.classList.add(t);}x.forEach(a);let f=false,b=-1;function u(){if(b>=0)return b;let i=e.getBoundingClientRect(),{tStart:c,tEnd:m}=Le({top:i.top,height:i.height},fe(),ze(),Ne,He);return re(ie(fe(),c,m,E))}return {destroy(){x.forEach(i=>{i.classList.remove(t),i.style.removeProperty("--ssd-len"),i.style.animationPlayState="";}),P.remove();},replay(){f=false,b=-1,x.forEach(a);},pause(){f=true,x.forEach(i=>{i.style.animationPlayState="paused";});},resume(){f&&(f=false,x.forEach(i=>{i.style.animationPlayState="running";}));},seek(i){let c=Math.min(1,Math.max(0,i));b=c,f=true,x.forEach((m,oe)=>{m.classList.remove(t),m.style.strokeDashoffset=y==="reverse"?`${w[oe]*c}`:`${w[oe]*(1-c)}`,M&&(m.style.opacity=y==="reverse"?`${1-c}`:`${c}`);});},getProgress(){return u()}}}if(rt())return nt();function st(){let t=Math.max(1,Ze),o=0,l=0;function g(u){let i=true;if(_){let c=Math.min(1,Math.max(0,u/t)),m=re(c);se=m,e.style.setProperty("--scroll-draw-progress",String(m)),e.style.clipPath=ne(y==="reverse"?1-m:m),ce?.(m),c<1&&(i=false);}else x.forEach((c,m)=>{let oe=m*B*t,le=Math.min(1,Math.max(0,(u-oe)/t)),V=re(le);c.style.strokeDashoffset=y==="reverse"?`${w[m]*V}`:`${w[m]*(1-V)}`,M&&(c.style.opacity=y==="reverse"?`${1-V}`:`${V}`),W&&T?c.style.stroke=Ee(W,T,V):T&&(c.style.stroke=T),F!==null&&A!==null?c.style.strokeWidth=`${F+(A-F)*V}`:A!==null&&(c.style.strokeWidth=`${A}`),C!==null&&k!==null?c.style.fillOpacity=`${C+(k-C)*V}`:k!==null&&(c.style.fillOpacity=`${k}`),H&&c.tagName.toLowerCase()==="path"&&z[m]&&c.setAttribute("d",Oe(z[m],H,V)),m===0&&(ce?.(V),e.style.setProperty("--scroll-draw-progress",String(V))),le<1&&(i=false);});if(ee){let c=Math.min(1,Math.max(0,u/t)),m=re(c);for(let oe in ee){let le=parseFloat(oe);m>=le&&!J.has(le)&&(J.add(le),ee[oe]?.());}}return i}function I(u){if(D)return;let i=u-o;R||(R=true,de?.());let c=g(i);if(c&&!$){$=true,g(t*(1+Math.max(0,x.length-1)*B)),ae?.(),G<(te==="infinite"?1/0:te??0)&&(G++,j=setTimeout(()=>{o=performance.now(),R=false,$=false,J.clear(),be(),v=requestAnimationFrame(I);},$e));return}c||(v=requestAnimationFrame(I));}function P(){cancelAnimationFrame(v),clearTimeout(j),o=performance.now(),l=0,D=false,R=false,$=false,G=0,J.clear(),be(),v=requestAnimationFrame(I);}let a=new IntersectionObserver(u=>{u.forEach(i=>{i.isIntersecting&&!(K&&$)?P():!i.isIntersecting&&!K&&!$&&(cancelAnimationFrame(v),clearTimeout(j),o=null);});},{root:O??null,threshold:Ie,rootMargin:Re}),f;function b(){clearTimeout(f),f=setTimeout(()=>{x.forEach((u,i)=>{w[i]=Se(u),u.style.strokeDasharray=`${w[i]}`;});},150);}return window.addEventListener("resize",b),window.addEventListener("orientationchange",b),ue>0?setTimeout(()=>a.observe(e),ue):a.observe(e),{destroy(){cancelAnimationFrame(v),clearTimeout(j),a.disconnect(),window.removeEventListener("resize",b),window.removeEventListener("orientationchange",b),clearTimeout(f);},replay(){G=0,P();},pause(){D||(D=true,l=performance.now()-o,cancelAnimationFrame(v));},resume(){D&&(D=false,o=performance.now()-l,v=requestAnimationFrame(I));},seek(u){let i=Math.min(1,Math.max(0,u));se=i,D=true,l=i*t,o=performance.now()-l,cancelAnimationFrame(v),g(l);},getProgress(){return se}}}if(Ye)return st();qe();function we(){if(!ye||D)return;let t=performance.now(),o=fe(),l=E;if(pe!==false){let a=t-We,f=a>0?Math.abs(o-(he<0?o:he))/a:0;l=E*Math.max(.2,1+f*(typeof pe=="number"?pe:1)*.04);}he=o,We=t;let g=me?ge===-1||o>=ge?"forward":"reverse":y;ge=o;let I=X-U,P=true;if(_){let a=re(ie(o,U,X,l));K&&!me&&(q=Math.max(q,a),a=q),se=a,e.style.setProperty("--scroll-draw-progress",String(a));let f=g==="reverse"?1-a:a;e.style.clipPath=ne(f),ce?.(a),!R&&ie(o,U,X,l)>0&&(R=true,de?.()),a>=1&&!$?($=true,ae?.(),G<(te==="infinite"?1/0:te??0)&&(G++,j=setTimeout(()=>{q=-1,R=false,$=false,e.style.clipPath=ne(0);},$e))):a<1&&!K&&($=false),v=requestAnimationFrame(we);return}if(x.forEach((a,f)=>{let b=f*B*I,u=re(ie(o,U+b,X+b,l));K&&!me&&(q=Math.max(q,u),u=q),se=u,a.style.strokeDashoffset=g==="reverse"?`${w[f]*u}`:`${w[f]*(1-u)}`,M&&(a.style.opacity=g==="reverse"?`${1-u}`:`${u}`),W&&T?a.style.stroke=Ee(W,T,u):T&&(a.style.stroke=T),F!==null&&A!==null?a.style.strokeWidth=`${F+(A-F)*u}`:A!==null&&(a.style.strokeWidth=`${A}`),C!==null&&k!==null?a.style.fillOpacity=`${C+(k-C)*u}`:k!==null&&(a.style.fillOpacity=`${k}`),H&&a.tagName.toLowerCase()==="path"&&z[f]&&a.setAttribute("d",Oe(z[f],H,u)),f===0&&(ce?.(u),e.style.setProperty("--scroll-draw-progress",String(u))),u<1&&(P=false);}),ee){let a=re(ie(o,U,X,l));for(let f in ee){let b=parseFloat(f);a>=b&&!J.has(b)&&(J.add(b),ee[f]?.());}}!R&&ie(o,U,X,l)>0&&(R=true,de?.()),P&&!$?($=true,ae?.(),G<(te==="infinite"?1/0:te??0)&&(G++,j=setTimeout(()=>{q=-1,R=false,$=false,J.clear(),be();},$e))):!P&&!K&&($=false),v=requestAnimationFrame(we);}let Ae=new IntersectionObserver(t=>{t.forEach(o=>{ye=o.isIntersecting,ye&&!D?v=requestAnimationFrame(we):cancelAnimationFrame(v);});},{root:O??null,threshold:Ie,rootMargin:Re}),ke;function ve(){clearTimeout(ke),ke=setTimeout(()=>{x.forEach((t,o)=>{w[o]=Se(t),t.style.strokeDasharray=`${w[o]}`;}),qe();},150);}return window.addEventListener("resize",ve),window.addEventListener("orientationchange",ve),ue>0?setTimeout(()=>Ae.observe(e),ue):Ae.observe(e),{destroy(){cancelAnimationFrame(v),clearTimeout(j),Ae.disconnect(),window.removeEventListener("resize",ve),window.removeEventListener("orientationchange",ve),clearTimeout(ke),Te?.remove();},replay(){q=-1,ge=-1,he=-1,R=false,$=false,G=0,D=false,J.clear(),clearTimeout(j),be();},pause(){D=true,cancelAnimationFrame(v);},resume(){D&&(D=false,ye&&(v=requestAnimationFrame(we)));},seek(t){let o=Math.min(1,Math.max(0,t));se=o,q=o,D=true,cancelAnimationFrame(v),tt(o,y);},getProgress(){return se}}}function dt(e={}){let n=ref(null);return onMounted(()=>{if(!n.value)return;let s=Fe(n.value,e);onUnmounted(()=>s.destroy());}),n}var Ce=defineComponent({name:"ScrollDraw",props:{selector:{type:String},speed:{type:Number},fade:{type:Boolean},stagger:{type:Number},easing:{type:[String,Function]},direction:{type:String},trigger:{type:Object},onProgress:{type:Function},onStart:{type:Function},onComplete:{type:Function},once:{type:Boolean},debug:{type:Boolean}},setup(e,{slots:n}){let s=ref(null);return onMounted(()=>{if(!s.value)return;let r={};e.selector!=null&&(r.selector=e.selector),e.speed!=null&&(r.speed=e.speed),e.fade!=null&&(r.fade=e.fade),e.stagger!=null&&(r.stagger=e.stagger),e.easing!=null&&(r.easing=e.easing),e.direction!=null&&(r.direction=e.direction),e.trigger!=null&&(r.trigger=e.trigger),e.once!=null&&(r.once=e.once),e.debug!=null&&(r.debug=e.debug),e.onProgress!=null&&(r.onProgress=e.onProgress),e.onStart!=null&&(r.onStart=e.onStart),e.onComplete!=null&&(r.onComplete=e.onComplete);let p=Fe(s.value,r);onUnmounted(()=>p.destroy());}),()=>h("div",{ref:s},n.default?.())}});function $t(){return {install(e){e.component("ScrollDraw",Ce);}}}export{Ce as ScrollDraw,$t as createScrollDrawPlugin,dt as useScrollDraw};
|
|
1
|
+
import {defineComponent,ref,onMounted,onUnmounted,h}from'vue';function Ot({bounces:e=3,decay:r=.5}={}){let n=Math.max(1,Math.round(e)),t=Math.max(.01,Math.min(.99,r)),l=Math.sqrt(t),s=0,f=[];for(let h=0;h<n;h++){let L=Math.pow(l,h);f.push(L),s+=L;}let c=[0],u=0;for(let h=0;h<n;h++)u+=f[h]/s,c.push(u);return h=>{if(h<=0)return 0;if(h>=1)return 1;for(let L=0;L<n;L++)if(h<=c[L+1]){let _=(h-c[L])/(c[L+1]-c[L]);if(L===0)return _*(2-_);let E=1-Math.pow(t,L);return E+(1-E)*(2*_-1)*(2*_-1)}return 1}}function kt({amplitude:e=1,period:r=.4}={}){let n=Math.max(1,e),t=Math.max(.1,r),l=n<=1?t/4:t/(2*Math.PI)*Math.asin(1/n);return s=>s<=0?0:s>=1?1:n*Math.pow(2,-10*s)*Math.sin((s-l)*(2*Math.PI)/t)+1}var ie={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>e*(2-e),"ease-in-out":e=>e<.5?2*e*e:-1+(4-2*e)*e,spring:e=>1-Math.cos(e*Math.PI*2.5)*Math.pow(1-e,2.2),bounce:Ot(),elastic:kt()};function ae(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",t="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:t}}function pt(e,r,n,t){switch(t){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function dt(e,r){if(/^\d+(\.\d+)?%$/.test(e))return r*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return r/2;case "bottom":return r;default:return r}}function Ye(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),t=parseFloat(e.getAttribute("height")??"0");return 2*(n+t)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function Ft(e,r,n){return Math.min(n,Math.max(r,e))}function K(e,r,n,t){return n===r?0:Ft((e-r)/(n-r)*t,0,1)}function pe(e,r,n,t,l){let s=pt(e.top,e.height,r,t.element)-dt(t.viewport,n),f=pt(e.top,e.height,r,l.element)-dt(l.viewport,n);return {tStart:s,tEnd:f}}function gt(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let t=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i.exec(e);return t?[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]:null}function Re(e,r,n){let t=gt(e),l=gt(r);return !t||!l?e:`rgb(${Math.round(t[0]+(l[0]-t[0])*n)},${Math.round(t[1]+(l[1]-t[1])*n)},${Math.round(t[2]+(l[2]-t[2])*n)})`}var yt={sketch:{easing:"ease-in",stagger:.1,speed:.9,fade:false},reveal:{easing:"ease-out",fade:true,speed:1.2,once:true},typewriter:{easing:"linear",stagger:.05,speed:1.5},cinematic:{easing:"ease-in-out",fade:true,speed:.75},spring:{easing:"spring",speed:1.1}};function ht(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}var bt={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},Dt=0;function It(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function Nt(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?ht("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&ht("Element has a fill \u2014 it may obscure the stroke animation.",e);}function Rt(e,r,n){let t=document.createElement("div");t.setAttribute("data-svg-scroll-draw-debug",""),t.style.cssText="position:fixed;pointer-events:none;z-index:9999;font-family:monospace;font-size:11px;top:0;left:0;right:0;bottom:0;";function l(){let s=n==="x"?window.scrollX:window.scrollY,f=e-s,c=r-s,u=n==="x";t.innerHTML=`
|
|
2
|
+
<div style="position:absolute;${u?`left:${f}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${f}px;left:0;right:0;border-top:2px dashed #22c55e;`}padding:2px 6px;color:#22c55e;background:rgba(0,0,0,.6)">\u25B6 start</div>
|
|
3
|
+
<div style="position:absolute;${u?`left:${c}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${c}px;left:0;right:0;border-top:2px dashed #ef4444;`}padding:2px 6px;color:#ef4444;background:rgba(0,0,0,.6)">\u25A0 end</div>`;}return document.body.appendChild(t),window.addEventListener("scroll",l,{passive:true}),l(),t}function Ke(e,r,n){let t=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),l=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,s=>{let f=parseFloat(s),c=t[l++]??f;return String(+(f+(c-f)*n).toFixed(4))})}function Qe(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let{preset:n,...t}=r,l=n?{...yt[n],...t}:t,s=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:f="path, polyline, line, polygon, rect, circle",speed:c=1,fade:u=false,easing:h="linear",trigger:L={},stagger:_=0,direction:E="forward",once:Q=false,debug:he=false,axis:H="y",scrollContainer:ee,autoReverse:te=false,delay:q=0,strokeColor:x,strokeWidth:A,fillOpacity:w,waypoints:b,velocityScale:P=false,threshold:O=0,rootMargin:G="0px",repeat:$=0,repeatDelay:I=0,morphTo:M,clip:V,autoplay:ne=false,duration:N=1e3,native:B=true,onProgress:d,onStart:C,onComplete:g,onEnter:y,onLeave:j,onEnterBack:Ae,onLeaveBack:be}=l,we=V===true?"left":typeof V=="string"?V:false,de=typeof h=="function"?h:ie[h]??ie.linear,He=ae(L.start??"top bottom"),De=ae(L.end??"bottom top"),U=typeof ee=="string"?document.querySelector(ee):ee??null,i=Array.isArray(x)?x[0]:null,p=Array.isArray(x)?x[1]:typeof x=="string"?x:null,X=Array.isArray(A)?A[0]:null,R=Array.isArray(A)?A[1]:typeof A=="number"?A:null,Z=Array.isArray(w)?w[0]:null,oe=Array.isArray(w)?w[1]:typeof w=="number"?w:null;function J(o){let a=o*100;switch(we){case "right":return `inset(0 0 0 ${100-a}%)`;case "top":return `inset(0 0 ${100-a}% 0)`;case "bottom":return `inset(${100-a}% 0 0 0)`;case "center":return `circle(${o*150}% at 50% 50%)`;default:return `inset(0 ${100-a}% 0 0)`}}let W=we?[]:Array.from(e.querySelectorAll(f)),k=[],me=[],ge=0,Ce=0,se=false,ye=false,re=0,Be=false,ve=-1,We=-1,le=false,ke=0,Me=0,Le,Ue=null,$e=new Set,_e=-1,ut=performance.now(),Ie=NaN;function Ve(){return U?H==="x"?U.scrollLeft:U.scrollTop:H==="x"?window.scrollX:window.scrollY}function mt(){return U?H==="x"?U.clientWidth:U.clientHeight:H==="x"?window.innerWidth:window.innerHeight}function ft(){let o=e.getBoundingClientRect(),a,S,Y;if(U){let ue=U.getBoundingClientRect();a=H==="x"?o.left-ue.left+U.scrollLeft:o.top-ue.top+U.scrollTop,S=H==="x"?o.width:o.height,Y=Ve();}else a=H==="x"?o.left:o.top,S=H==="x"?o.width:o.height,Y=Ve();let ce=pe({top:a,height:S},Y,mt(),He,De);ge=ce.tStart,Ce=ce.tEnd,he&&process.env.NODE_ENV!=="production"&&(Ue?.remove(),Ue=Rt(ge,Ce,H));}function Ct(o,a){if(e.style.setProperty("--scroll-draw-progress",String(o)),we){let S=a==="reverse"?1-o:o;e.style.clipPath=J(S);return}W.forEach((S,Y)=>{S.style.strokeDashoffset=a==="reverse"?`${k[Y]*o}`:`${k[Y]*(1-o)}`,u&&(S.style.opacity=a==="reverse"?`${1-o}`:`${o}`),i&&p?S.style.stroke=Re(i,p,o):p&&(S.style.stroke=p),X!==null&&R!==null?S.style.strokeWidth=`${X+(R-X)*o}`:R!==null&&(S.style.strokeWidth=`${R}`),Z!==null&&oe!==null?S.style.fillOpacity=`${Z+(oe-Z)*o}`:oe!==null&&(S.style.fillOpacity=`${oe}`),M&&S.tagName.toLowerCase()==="path"&&me[Y]&&S.setAttribute("d",Ke(me[Y],M,o));});}function Ge(){if(e.style.setProperty("--scroll-draw-progress","0"),we){e.style.clipPath=J(0);return}W.forEach((o,a)=>{o.style.strokeDasharray=`${k[a]}`,o.style.strokeDashoffset=E==="reverse"?"0":`${k[a]}`,u?o.style.opacity=E==="reverse"?"1":"0":o.style.opacity="",i&&(o.style.stroke=i),X!==null&&(o.style.strokeWidth=`${X}`),Z!==null&&(o.style.fillOpacity=`${Z}`),M&&o.tagName.toLowerCase()==="path"&&me[a]&&o.setAttribute("d",me[a]);});}if(W.forEach(o=>{Nt(o);let a=Ye(o);k.push(a),o.tagName.toLowerCase()==="path"?me.push(o.getAttribute("d")??""):me.push(""),s?(o.style.strokeDasharray=`${a}`,o.style.strokeDashoffset=E==="reverse"?`${a}`:"0",u&&(o.style.opacity="1"),p&&(o.style.stroke=p),R!==null&&(o.style.strokeWidth=`${R}`),oe!==null&&(o.style.fillOpacity=`${oe}`),M&&o.tagName.toLowerCase()==="path"&&o.setAttribute("d",M)):(o.style.strokeDasharray=`${a}`,o.style.strokeDashoffset=E==="reverse"?"0":`${a}`,u?o.style.opacity=E==="reverse"?"1":"0":o.style.opacity="",i&&(o.style.stroke=i),X!==null&&(o.style.strokeWidth=`${X}`),Z!==null&&(o.style.fillOpacity=`${Z}`));}),we){if(s)return e.style.clipPath=J(1),g?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=J(0);}else if(s)return g?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};function Lt(){return !(B===false||!It()||!W.length||typeof h!="string"||!(h in bt)||we||H!=="y"||U||c!==1||_!==0||Q||te||P!==false||M||b||$||q>0||d||C||g||y||j||Ae||be||x!=null||A!=null||w!=null||(L.start??"top bottom").trim()!=="top bottom"||(L.end??"bottom top").trim()!=="bottom top")}function $t(){let o=`svg-scroll-draw-${++Dt}`,a=E==="reverse"?"0":"var(--ssd-len)",S=E==="reverse"?"var(--ssd-len)":"0",Y=`stroke-dashoffset:${a};`,ce=`stroke-dashoffset:${S};`;u&&(Y+=`opacity:${E==="reverse"?1:0};`,ce+=`opacity:${E==="reverse"?0:1};`);let ue=document.createElement("style");ue.setAttribute("data-svg-scroll-draw",""),ue.textContent=`@keyframes ${o}{from{${Y}}to{${ce}}}.${o}{animation-name:${o};animation-duration:auto;animation-timing-function:${bt[h]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(ue);function fe(m,T){m.style.setProperty("--ssd-len",String(k[T])),m.style.strokeDasharray=`${k[T]}`,m.style.strokeDashoffset="",m.style.opacity="",m.style.animationPlayState="",m.classList.add(o);}W.forEach(fe);let v=false,F=-1;function D(){if(F>=0)return F;let m=e.getBoundingClientRect(),{tStart:T,tEnd:z}=pe({top:m.top,height:m.height},Ve(),mt(),He,De);return de(K(Ve(),T,z,c))}return {destroy(){W.forEach(m=>{m.classList.remove(o),m.style.removeProperty("--ssd-len"),m.style.animationPlayState="";}),ue.remove();},replay(){v=false,F=-1,W.forEach(fe);},pause(){v=true,W.forEach(m=>{m.style.animationPlayState="paused";});},resume(){v&&(v=false,W.forEach(m=>{m.style.animationPlayState="running";}));},seek(m){let T=Math.min(1,Math.max(0,m));F=T,v=true,W.forEach((z,Fe)=>{z.classList.remove(o),z.style.strokeDashoffset=E==="reverse"?`${k[Fe]*T}`:`${k[Fe]*(1-T)}`,u&&(z.style.opacity=E==="reverse"?`${1-T}`:`${T}`);});},getProgress(){return D()}}}if(Lt())return $t();function Pt(){let o=Math.max(1,N),a=0,S=0;function Y(D){let m=true;if(we){let T=Math.min(1,Math.max(0,D/o)),z=de(T);ke=z,e.style.setProperty("--scroll-draw-progress",String(z)),e.style.clipPath=J(E==="reverse"?1-z:z),d?.(z),T<1&&(m=false);}else W.forEach((T,z)=>{let Fe=z*_*o,Ne=Math.min(1,Math.max(0,(D-Fe)/o)),Se=de(Ne);T.style.strokeDashoffset=E==="reverse"?`${k[z]*Se}`:`${k[z]*(1-Se)}`,u&&(T.style.opacity=E==="reverse"?`${1-Se}`:`${Se}`),i&&p?T.style.stroke=Re(i,p,Se):p&&(T.style.stroke=p),X!==null&&R!==null?T.style.strokeWidth=`${X+(R-X)*Se}`:R!==null&&(T.style.strokeWidth=`${R}`),Z!==null&&oe!==null?T.style.fillOpacity=`${Z+(oe-Z)*Se}`:oe!==null&&(T.style.fillOpacity=`${oe}`),M&&T.tagName.toLowerCase()==="path"&&me[z]&&T.setAttribute("d",Ke(me[z],M,Se)),z===0&&(d?.(Se),e.style.setProperty("--scroll-draw-progress",String(Se))),Ne<1&&(m=false);});if(b){let T=Math.min(1,Math.max(0,D/o)),z=de(T);for(let Fe in b){let Ne=parseFloat(Fe);z>=Ne&&!$e.has(Ne)&&($e.add(Ne),b[Fe]?.());}}return m}function ce(D){if(le)return;let m=D-a;ye||(ye=true,C?.());let T=Y(m);if(T&&!se){se=true,Y(o*(1+Math.max(0,W.length-1)*_)),g?.(),Me<($==="infinite"?1/0:$??0)&&(Me++,Le=setTimeout(()=>{a=performance.now(),ye=false,se=false,$e.clear(),Ge(),re=requestAnimationFrame(ce);},I));return}T||(re=requestAnimationFrame(ce));}function ue(){cancelAnimationFrame(re),clearTimeout(Le),a=performance.now(),S=0,le=false,ye=false,se=false,Me=0,$e.clear(),Ge(),re=requestAnimationFrame(ce);}let fe=new IntersectionObserver(D=>{D.forEach(m=>{m.isIntersecting&&!(Q&&se)?ue():!m.isIntersecting&&!Q&&!se&&(cancelAnimationFrame(re),clearTimeout(Le),a=null);});},{root:U??null,threshold:O,rootMargin:G}),v;function F(){clearTimeout(v),v=setTimeout(()=>{W.forEach((D,m)=>{k[m]=Ye(D),D.style.strokeDasharray=`${k[m]}`;});},150);}return window.addEventListener("resize",F),window.addEventListener("orientationchange",F),q>0?setTimeout(()=>fe.observe(e),q):fe.observe(e),{destroy(){cancelAnimationFrame(re),clearTimeout(Le),fe.disconnect(),window.removeEventListener("resize",F),window.removeEventListener("orientationchange",F),clearTimeout(v);},replay(){Me=0,ue();},pause(){le||(le=true,S=performance.now()-a,cancelAnimationFrame(re));},resume(){le&&(le=false,a=performance.now()-S,re=requestAnimationFrame(ce));},seek(D){let m=Math.min(1,Math.max(0,D));ke=m,le=true,S=m*o,a=performance.now()-S,cancelAnimationFrame(re),Y(S);},getProgress(){return ke}}}if(ne)return Pt();ft();function je(){if(!Be||le)return;let o=performance.now(),a=Ve(),S=c;if(P!==false){let v=o-ut,F=v>0?Math.abs(a-(_e<0?a:_e))/v:0;S=c*Math.max(.2,1+F*(typeof P=="number"?P:1)*.04);}_e=a,ut=o;let Y=te?We===-1||a>=We?"forward":"reverse":E;We=a;let ce=Ce-ge,ue=true,fe=ce===0?0:(a-ge)/ce;if(isNaN(Ie)||(Ie<=0&&fe>0?y?.():Ie>0&&fe<=0&&be?.(),Ie<1&&fe>=1?j?.():Ie>=1&&fe<1&&Ae?.()),Ie=fe,we){let v=de(K(a,ge,Ce,S));Q&&!te&&(ve=Math.max(ve,v),v=ve),ke=v,e.style.setProperty("--scroll-draw-progress",String(v));let F=Y==="reverse"?1-v:v;e.style.clipPath=J(F),d?.(v),!ye&&K(a,ge,Ce,S)>0&&(ye=true,C?.()),v>=1&&!se?(se=true,g?.(),Me<($==="infinite"?1/0:$??0)&&(Me++,Le=setTimeout(()=>{ve=-1,ye=false,se=false,e.style.clipPath=J(0);},I))):v<1&&!Q&&(se=false),re=requestAnimationFrame(je);return}if(W.forEach((v,F)=>{let D=F*_*ce,m=de(K(a,ge+D,Ce+D,S));Q&&!te&&(ve=Math.max(ve,m),m=ve),ke=m,v.style.strokeDashoffset=Y==="reverse"?`${k[F]*m}`:`${k[F]*(1-m)}`,u&&(v.style.opacity=Y==="reverse"?`${1-m}`:`${m}`),i&&p?v.style.stroke=Re(i,p,m):p&&(v.style.stroke=p),X!==null&&R!==null?v.style.strokeWidth=`${X+(R-X)*m}`:R!==null&&(v.style.strokeWidth=`${R}`),Z!==null&&oe!==null?v.style.fillOpacity=`${Z+(oe-Z)*m}`:oe!==null&&(v.style.fillOpacity=`${oe}`),M&&v.tagName.toLowerCase()==="path"&&me[F]&&v.setAttribute("d",Ke(me[F],M,m)),F===0&&(d?.(m),e.style.setProperty("--scroll-draw-progress",String(m))),m<1&&(ue=false);}),b){let v=de(K(a,ge,Ce,S));for(let F in b){let D=parseFloat(F);v>=D&&!$e.has(D)&&($e.add(D),b[F]?.());}}!ye&&K(a,ge,Ce,S)>0&&(ye=true,C?.()),ue&&!se?(se=true,g?.(),Me<($==="infinite"?1/0:$??0)&&(Me++,Le=setTimeout(()=>{ve=-1,ye=false,se=false,$e.clear(),Ge();},I))):!ue&&!Q&&(se=false),re=requestAnimationFrame(je);}let Ze=new IntersectionObserver(o=>{o.forEach(a=>{Be=a.isIntersecting,Be&&!le?re=requestAnimationFrame(je):cancelAnimationFrame(re);});},{root:U??null,threshold:O,rootMargin:G}),Je;function Xe(){clearTimeout(Je),Je=setTimeout(()=>{W.forEach((o,a)=>{k[a]=Ye(o),o.style.strokeDasharray=`${k[a]}`;}),ft();},150);}return window.addEventListener("resize",Xe),window.addEventListener("orientationchange",Xe),q>0?setTimeout(()=>Ze.observe(e),q):Ze.observe(e),{destroy(){cancelAnimationFrame(re),clearTimeout(Le),Ze.disconnect(),window.removeEventListener("resize",Xe),window.removeEventListener("orientationchange",Xe),clearTimeout(Je),Ue?.remove();},replay(){ve=-1,We=-1,_e=-1,ye=false,se=false,Me=0,le=false,$e.clear(),clearTimeout(Le),Ge();},pause(){le=true,cancelAnimationFrame(re);},resume(){le&&(le=false,Be&&(re=requestAnimationFrame(je)));},seek(o){let a=Math.min(1,Math.max(0,o));ke=a,ve=a,le=true,cancelAnimationFrame(re),Ct(a,E);},getProgress(){return ke}}}var wt=new Map;function Pe(e,r){wt.set(e,r);}function Oe(e){wt.delete(e);}function Ht(e){return e.startsWith("#")||e.startsWith("rgb")||e.startsWith("hsl")}function vt(e){let r=[],n=/([\w]+)\(([^)]*)\)/g,t;for(;(t=n.exec(e))!==null;){let l=[],s=[],f=t[2].trim();if(f)for(let c of f.split(/[\s,]+/)){let u=c.match(/^([-+]?[\d.eE]+)(.*)$/);l.push(u?parseFloat(u[1]):0),s.push(u?u[2]:"");}r.push({fn:t[1],nums:l,units:s});}return r}function Vt(e,r,n){let t=vt(e),l=vt(r);return t.length===0||t.length!==l.length?n<1?e:r:t.map((s,f)=>{let c=l[f];return s.fn!==c.fn||s.nums.length!==c.nums.length?n<1?`${s.fn}(${s.nums.map((u,h)=>`${u}${s.units[h]}`).join(", ")})`:`${c.fn}(${c.nums.map((u,h)=>`${u}${c.units[h]}`).join(", ")})`:`${s.fn}(${s.nums.map((u,h)=>`${u+(c.nums[h]-u)*n}${s.units[h]}`).join(", ")})`}).join(" ")}function St(e,r,n){if(typeof e=="number"&&typeof r=="number")return String(e+(r-e)*n);let t=String(e),l=String(r);if(Ht(t))return Re(t,l,n);if(t.includes("("))return Vt(t,l,n);let s=t.match(/^([-+]?[\d.]+)(.*)$/),f=l.match(/^([-+]?[\d.]+)(.*)$/);if(s&&f){let c=parseFloat(s[1]),u=parseFloat(f[1]);return `${c+(u-c)*n}${s[2]||f[2]}`}return n<1?t:l}function zt(e){return e.replace(/([A-Z])/g,r=>`-${r.toLowerCase()}`)}var Et={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},qt=new Set(["opacity","transform","background-color","color","filter","scale","translate","rotate"]),Bt=0;function Wt(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function et(e,r){let n={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return n;let{props:t,trigger:l={},easing:s="ease-out",speed:f=1,once:c=false,axis:u="y",scrollContainer:h,native:L=true,onProgress:_,onComplete:E,onEnter:Q,onLeave:he,onEnterBack:H,onLeaveBack:ee}=r,te=window.matchMedia("(prefers-reduced-motion: reduce)").matches,q=typeof s=="function"?s:ie[s]??ie["ease-out"],x=ae(l.start??"top bottom"),A=ae(l.end??"bottom top"),w=typeof h=="string"?document.querySelector(h):h??null,b=Object.entries(t).map(([i,p])=>({prop:zt(i),from:Array.isArray(p)?p[0]:"",to:Array.isArray(p)?p[1]:p}));function P(){let i=window.getComputedStyle(e);for(let p of b)p.from===""&&(p.from=i.getPropertyValue(p.prop).trim()||"0");}function O(){for(let i of b)e.style.setProperty(i.prop,String(i.to));}if(te)return O(),E?.(),n;P();function G(){if(!L||!Wt()||typeof s!="string"||!(s in Et)||u!=="y"||w||c||f!==1||_||E||Q||he||H||ee||(l.start??"top bottom").trim()!=="top bottom"||(l.end??"bottom top").trim()!=="bottom top")return false;for(let i of b)if(!qt.has(i.prop))return false;return true}function $(){let i=`ssd-a-${++Bt}`,p=b.map(J=>`${J.prop}:${J.from}`).join(";"),X=b.map(J=>`${J.prop}:${J.to}`).join(";"),R=document.createElement("style");R.setAttribute("data-ssd-animate",""),R.textContent=`@keyframes ${i}{from{${p}}to{${X}}}.${i}{animation-name:${i};animation-duration:auto;animation-timing-function:${Et[s]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(R),e.classList.add(i);let Z=()=>u==="x"?window.scrollX:window.scrollY,oe=()=>u==="x"?window.innerWidth:window.innerHeight;return {destroy(){e.classList.remove(i),R.remove();},replay(){e.classList.remove(i),e.offsetWidth,e.classList.add(i);},pause(){e.style.animationPlayState="paused";},resume(){e.style.animationPlayState="";},seek(J){let W=Math.min(1,Math.max(0,J));e.classList.remove(i);for(let k of b)e.style.setProperty(k.prop,St(k.from,k.to,W));},getProgress(){let J=e.getBoundingClientRect(),W=Z(),k=oe(),{tStart:me,tEnd:ge}=pe({top:J.top,height:J.height},W,k,x,A);return q(K(W,me,ge,f))}}}if(G())return $();let I=0,M=0,V=0,ne=false,N=false,B=-1,d=0,C=false,g=NaN,y=()=>w?u==="x"?w.scrollLeft:w.scrollTop:u==="x"?window.scrollX:window.scrollY,j=()=>w?u==="x"?w.clientWidth:w.clientHeight:u==="x"?window.innerWidth:window.innerHeight;function Ae(){let i=e.getBoundingClientRect(),p,X;if(w){let Z=w.getBoundingClientRect();p=u==="x"?i.left-Z.left+w.scrollLeft:i.top-Z.top+w.scrollTop,X=u==="x"?i.width:i.height;}else p=u==="x"?i.left:i.top,X=u==="x"?i.width:i.height;let R=pe({top:p,height:X},y(),j(),x,A);I=R.tStart,M=R.tEnd;}function be(i){e.style.setProperty("--scroll-draw-progress",String(i));for(let p of b)e.style.setProperty(p.prop,St(p.from,p.to,i));_?.(i);}function we(i){if(isNaN(g)){g=i;return}g<=0&&i>0?Q?.():g>0&&i<=0&&ee?.(),g<1&&i>=1?he?.():g>=1&&i<1&&H?.(),g=i;}function de(){if(!ne||N)return;let i=M===I?0:(y()-I)/(M-I);we(i);let p=q(K(y(),I,M,f));c&&(B=Math.max(B,p),p=B),d=p,be(p),p>=1&&!C?(C=true,E?.()):p<1&&!c&&(C=false),V=requestAnimationFrame(de);}Ae();{let i=q(K(y(),I,M,f));c&&i>0&&(B=i),d=i,be(i);}let He=new IntersectionObserver(i=>{i.forEach(p=>{ne=p.isIntersecting,ne&&!N?V=requestAnimationFrame(de):cancelAnimationFrame(V);});},{root:w??null}),De;function U(){clearTimeout(De),De=setTimeout(Ae,150);}return window.addEventListener("resize",U),window.addEventListener("orientationchange",U),He.observe(e),Pe(e,{type:"animate",getProgress:()=>d,getTrigger:()=>({tStart:I,tEnd:M})}),{destroy(){cancelAnimationFrame(V),He.disconnect(),window.removeEventListener("resize",U),window.removeEventListener("orientationchange",U),clearTimeout(De),Oe(e);},replay(){B=-1,C=false,d=0,N=false,be(0);},pause(){N=true,cancelAnimationFrame(V);},resume(){N&&(N=false,ne&&(V=requestAnimationFrame(de)));},seek(i){let p=Math.min(1,Math.max(0,i));d=p,B=p,N=true,cancelAnimationFrame(V),be(p);},getProgress(){return d}}}var tt={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function nt(e,r){if(typeof window>"u")return tt;let n=typeof e=="string"?document.querySelector(e):e;if(!n)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollCounter: element not found:",e),tt;let t=n,{from:l=0,to:s,format:f,easing:c="ease-out",trigger:u={},once:h=true,decimals:L,onComplete:_}=r,E=L!==void 0?d=>d.toFixed(L):f??(d=>String(Math.round(d))),Q=typeof c=="function"?c:ie[c]??ie["ease-out"],he=ae(u.start??"top 80%"),H=ae(u.end??"top 20%");if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return t.textContent=E(s),_?.(),tt;t.textContent=E(l);let te=0,q=0,x=0,A=false,w=false,b=-1,P=0,O=false,G=()=>window.scrollY,$=()=>window.innerHeight;function I(){let d=t.getBoundingClientRect(),C=pe({top:d.top,height:d.height},G(),$(),he,H);te=C.tStart,q=C.tEnd;}function M(d){t.textContent=E(l+(s-l)*d),t.style.setProperty("--scroll-draw-progress",String(d));}function V(){if(!A||w)return;let d=Q(K(G(),te,q,1));h&&(b=Math.max(b,d),d=b),P=d,M(d),d>=1&&!O?(O=true,_?.()):d<1&&!h&&(O=false),x=requestAnimationFrame(V);}I();{let d=Q(K(G(),te,q,1));h&&d>0&&(b=d),P=d,M(d);}let ne=new IntersectionObserver(d=>{d.forEach(C=>{A=C.isIntersecting,A&&!w?x=requestAnimationFrame(V):cancelAnimationFrame(x);});}),N;function B(){clearTimeout(N),N=setTimeout(I,150);}return window.addEventListener("resize",B),window.addEventListener("orientationchange",B),ne.observe(t),Pe(t,{type:"counter",getProgress:()=>P,getTrigger:()=>({tStart:te,tEnd:q})}),{destroy(){cancelAnimationFrame(x),ne.disconnect(),window.removeEventListener("resize",B),window.removeEventListener("orientationchange",B),clearTimeout(N),Oe(t);},replay(){b=-1,O=false,P=0,w=false,M(0);},pause(){w=true,cancelAnimationFrame(x);},resume(){w&&(w=false,A&&(x=requestAnimationFrame(V)));},seek(d){let C=Math.min(1,Math.max(0,d));P=C,b=C,w=true,cancelAnimationFrame(x),M(C);},getProgress(){return P}}}var xt={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function rt(e,r={}){if(typeof window>"u")return xt;let n=typeof e=="string"?document.querySelector(e):e;if(!n||n.tagName.toLowerCase()!=="video")return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollVideo: <video> element not found:",e),xt;let t=n,{trigger:l={},easing:s="linear",once:f=false,axis:c="y",preload:u="auto",onReady:h,onComplete:L,onProgress:_}=r,E=window.matchMedia("(prefers-reduced-motion: reduce)").matches,Q=typeof s=="function"?s:ie[s]??ie.linear,he=ae(l.start??"top top"),H=ae(l.end??"bottom top");t.pause(),t.hasAttribute("preload")||(t.preload=u);let ee=r.from??0,te=r.to,q=0,x=0,A=0,w=false,b=false,P=-1,O=0,G=false,$=false,I=()=>c==="x"?window.scrollX:window.scrollY,M=()=>c==="x"?window.innerWidth:window.innerHeight;function V(){let y=t.getBoundingClientRect(),j=c==="x"?y.left:y.top,Ae=c==="x"?y.width:y.height,be=pe({top:j,height:Ae},I(),M(),he,H);q=be.tStart,x=be.tEnd;}function ne(y){if(!$)return;let j=te??t.duration??0;t.currentTime=ee+(j-ee)*y,t.style.setProperty("--scroll-draw-progress",String(y)),_?.(y);}function N(){if(!w||b||!$)return;let y=Q(K(I(),q,x,1));f&&(P=Math.max(P,y),y=P),O=y,ne(y),y>=1&&!G?(G=true,L?.()):y<1&&!f&&(G=false),A=requestAnimationFrame(N);}function B(){if($=true,te===void 0&&(te=t.duration),E){ne(1),h?.();return}V(),h?.(),w&&!b&&(A=requestAnimationFrame(N));}t.readyState>=1?B():t.addEventListener("loadedmetadata",B,{once:true}),$||V();let d=new IntersectionObserver(y=>{y.forEach(j=>{w=j.isIntersecting,w&&!b&&$?A=requestAnimationFrame(N):cancelAnimationFrame(A);});}),C;function g(){clearTimeout(C),C=setTimeout(V,150);}return window.addEventListener("resize",g),window.addEventListener("orientationchange",g),d.observe(t),Pe(t,{type:"video",getProgress:()=>O,getTrigger:()=>({tStart:q,tEnd:x})}),{destroy(){cancelAnimationFrame(A),d.disconnect(),t.removeEventListener("loadedmetadata",B),window.removeEventListener("resize",g),window.removeEventListener("orientationchange",g),clearTimeout(C),Oe(t);},replay(){P=-1,G=false,O=0,b=false,ne(0);},pause(){b=true,cancelAnimationFrame(A);},resume(){b&&(b=false,w&&$&&(A=requestAnimationFrame(N)));},seek(y){let j=Math.min(1,Math.max(0,y));O=j,P=j,b=true,cancelAnimationFrame(A),ne(j);},getProgress(){return O}}}function Mt(e){let r=e.textContent??"";return e.textContent="",r.split(/(\s+)/).filter(Boolean).map(n=>{let t=document.createElement("span");return t.setAttribute("aria-hidden","true"),/^\s+$/.test(n)?(t.textContent=n,t.style.whiteSpace="pre"):(t.textContent=n,t.style.display="inline-block"),e.appendChild(t),/^\s+$/.test(n)?null:t}).filter(n=>n!==null)}function _t(e){let r=e.textContent??"";return e.textContent="",r.split("").map(n=>{let t=document.createElement("span");return t.setAttribute("aria-hidden","true"),t.textContent=n,n===" "?t.style.whiteSpace="pre":t.style.display="inline-block",e.appendChild(t),n===" "?null:t}).filter(n=>n!==null)}function Tt(e){let r=Mt(e),n=new Map;for(let s of r){let f=s.offsetTop;n.has(f)||n.set(f,[]),n.get(f).push(s);}let t=[],l=Array.from(n.keys()).sort((s,f)=>s-f);for(let s of l){let f=n.get(s),c=document.createElement("span");c.setAttribute("aria-hidden","true"),c.style.display="inline-block";for(let u of f)c.appendChild(u);t.push(c);}e.textContent="";for(let s of t)e.appendChild(s),e.appendChild(document.createTextNode(" "));return t}function Gt(e,r,n,t){if(n<=1||t===0)return e;let l=(n-1)*t,s=r*t,f=s+(1-l);return f<=s?e>=s?1:0:Math.min(1,Math.max(0,(e-s)/(f-s)))}function jt(e,r){let n=[];if(r?.y!==void 0&&n.push(`translateY(${r.y*(1-e)}px)`),r?.x!==void 0&&n.push(`translateX(${r.x*(1-e)}px)`),r?.rotate!==void 0&&n.push(`rotate(${r.rotate*(1-e)}deg)`),r?.scale!==void 0){let t=r.scale+(1-r.scale)*e;n.push(`scale(${t})`);}return n.join(" ")||""}var At={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ot(e,r={}){if(typeof window>"u")return At;let n=typeof e=="string"?document.querySelector(e):e;if(!n)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollText: element not found:",e),At;let t=n,{split:l="words",stagger:s=.04,easing:f="ease-out",from:c={opacity:0,y:24},trigger:u={},once:h=true,onComplete:L}=r,_=window.matchMedia("(prefers-reduced-motion: reduce)").matches,E=typeof f=="function"?f:ie[f]??ie["ease-out"],Q=ae(u.start??"top 85%"),he=ae(u.end??"top 40%"),H=t.innerHTML;t.setAttribute("aria-label",t.textContent??"");let ee;l==="chars"?ee=_t(t):l==="lines"?ee=Tt(t):ee=Mt(t);let te=ee.length;function q(g,y){c?.opacity!==void 0&&(g.style.opacity=String(c.opacity+(1-c.opacity)*y));let j=jt(y,c);j&&(g.style.transform=j);}function x(g){t.style.setProperty("--scroll-draw-progress",String(g)),ee.forEach((y,j)=>{let Ae=E(Gt(g,j,te,s));q(y,Ae);});}if(_)return x(1),L?.(),{destroy(){t.innerHTML=H,t.removeAttribute("aria-label");},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};x(0);let A=0,w=0,b=0,P=false,O=false,G=-1,$=0,I=false,M=()=>window.scrollY,V=()=>window.innerHeight;function ne(){let g=t.getBoundingClientRect(),y=pe({top:g.top,height:g.height},M(),V(),Q,he);A=y.tStart,w=y.tEnd;}function N(){if(!P||O)return;let g=K(M(),A,w,1);h&&(G=Math.max(G,g),g=G),$=g,x(g),g>=1&&!I?(I=true,L?.()):g<1&&!h&&(I=false),b=requestAnimationFrame(N);}ne();let B=new IntersectionObserver(g=>{g.forEach(y=>{P=y.isIntersecting,P&&!O?b=requestAnimationFrame(N):cancelAnimationFrame(b);});}),d;function C(){clearTimeout(d),d=setTimeout(()=>{if(l==="lines"){let g=$;t.innerHTML=H,t.setAttribute("aria-label",t.textContent??""),ee=Tt(t),x(g);}ne();},150);}return window.addEventListener("resize",C),window.addEventListener("orientationchange",C),B.observe(t),Pe(t,{type:"text",getProgress:()=>$,getTrigger:()=>({tStart:A,tEnd:w})}),{destroy(){cancelAnimationFrame(b),B.disconnect(),window.removeEventListener("resize",C),window.removeEventListener("orientationchange",C),clearTimeout(d),t.innerHTML=H,t.removeAttribute("aria-label"),Oe(t);},replay(){G=-1,I=false,$=0,O=false,x(0);},pause(){O=true,cancelAnimationFrame(b);},resume(){O&&(O=false,P&&(b=requestAnimationFrame(N)));},seek(g){let y=Math.min(1,Math.max(0,g));$=y,G=y,O=true,cancelAnimationFrame(b),x(y);},getProgress(){return $}}}function Xt(e={}){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=Qe(r.value,e);onUnmounted(()=>n.destroy());}),r}var st=defineComponent({name:"ScrollDraw",props:{selector:{type:String},speed:{type:Number},fade:{type:Boolean},stagger:{type:Number},easing:{type:[String,Function]},direction:{type:String},trigger:{type:Object},onProgress:{type:Function},onStart:{type:Function},onComplete:{type:Function},once:{type:Boolean},debug:{type:Boolean}},setup(e,{slots:r}){let n=ref(null);return onMounted(()=>{if(!n.value)return;let t={};e.selector!=null&&(t.selector=e.selector),e.speed!=null&&(t.speed=e.speed),e.fade!=null&&(t.fade=e.fade),e.stagger!=null&&(t.stagger=e.stagger),e.easing!=null&&(t.easing=e.easing),e.direction!=null&&(t.direction=e.direction),e.trigger!=null&&(t.trigger=e.trigger),e.once!=null&&(t.once=e.once),e.debug!=null&&(t.debug=e.debug),e.onProgress!=null&&(t.onProgress=e.onProgress),e.onStart!=null&&(t.onStart=e.onStart),e.onComplete!=null&&(t.onComplete=e.onComplete);let l=Qe(n.value,t);onUnmounted(()=>l.destroy());}),()=>h("div",{ref:n},r.default?.())}});function Yt(e){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=et(r.value,e);onUnmounted(()=>n.destroy());}),r}var it=defineComponent({name:"ScrollAnimate",props:{options:{type:Object,required:true}},setup(e,{slots:r}){let n=ref(null);return onMounted(()=>{if(!n.value)return;let t=et(n.value,e.options);onUnmounted(()=>t.destroy());}),()=>h("div",{ref:n},r.default?.())}});function Ut(e){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=nt(r.value,e);onUnmounted(()=>n.destroy());}),r}var at=defineComponent({name:"ScrollCounter",props:{to:{type:Number,required:true},from:{type:Number},format:{type:Function},easing:{type:[String,Function]},trigger:{type:Object},once:{type:Boolean},decimals:{type:Number},onComplete:{type:Function}},setup(e){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n={to:e.to};e.from!=null&&(n.from=e.from),e.format!=null&&(n.format=e.format),e.easing!=null&&(n.easing=e.easing),e.trigger!=null&&(n.trigger=e.trigger),e.once!=null&&(n.once=e.once),e.decimals!=null&&(n.decimals=e.decimals),e.onComplete!=null&&(n.onComplete=e.onComplete);let t=nt(r.value,n);onUnmounted(()=>t.destroy());}),()=>h("span",{ref:r})}});function Zt(e={}){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=rt(r.value,e);onUnmounted(()=>n.destroy());}),r}var lt=defineComponent({name:"ScrollVideo",props:{src:{type:String,required:true},options:{type:Object},muted:{type:Boolean,default:true},playsInline:{type:Boolean,default:true},class:{type:String}},setup(e){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=rt(r.value,e.options??{});onUnmounted(()=>n.destroy());}),()=>h("video",{ref:r,src:e.src,muted:e.muted,playsinline:e.playsInline,preload:"auto",class:e.class})}});function Jt(e={}){let r=ref(null);return onMounted(()=>{if(!r.value)return;let n=ot(r.value,e);onUnmounted(()=>n.destroy());}),r}var ct=defineComponent({name:"ScrollText",props:{options:{type:Object},tag:{type:String,default:"p"}},setup(e,{slots:r}){let n=ref(null);return onMounted(()=>{if(!n.value)return;let t=ot(n.value,e.options??{});onUnmounted(()=>t.destroy());}),()=>h(e.tag,{ref:n},r.default?.())}});function An(){return {install(e){e.component("ScrollDraw",st),e.component("ScrollAnimate",it),e.component("ScrollCounter",at),e.component("ScrollVideo",lt),e.component("ScrollText",ct);}}}export{it as ScrollAnimate,at as ScrollCounter,st as ScrollDraw,ct as ScrollText,lt as ScrollVideo,An as createScrollDrawPlugin,Yt as useScrollAnimate,Ut as useScrollCounter,Xt as useScrollDraw,Jt as useScrollText,Zt as useScrollVideo};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';function F({bounces:t=3,decay:a=.5}={}){let s=Math.max(1,Math.round(t)),e=Math.max(.01,Math.min(.99,a)),l=Math.sqrt(e),u=0,b=[];for(let r=0;r<s;r++){let o=Math.pow(l,r);b.push(o),u+=o;}let c=[0],g=0;for(let r=0;r<s;r++)g+=b[r]/u,c.push(g);return r=>{if(r<=0)return 0;if(r>=1)return 1;for(let o=0;o<s;o++)if(r<=c[o+1]){let d=(r-c[o])/(c[o+1]-c[o]);if(o===0)return d*(2-d);let n=1-Math.pow(e,o);return n+(1-n)*(2*d-1)*(2*d-1)}return 1}}function q({amplitude:t=1,period:a=.4}={}){let s=Math.max(1,t),e=Math.max(.1,a),l=s<=1?e/4:e/(2*Math.PI)*Math.asin(1/s);return u=>u<=0?0:u>=1?1:s*Math.pow(2,-10*u)*Math.sin((u-l)*(2*Math.PI)/e)+1}({bounce:F(),elastic:q()});function $(t,a,s){return Math.min(s,Math.max(a,t))}var B=new Map;function A(t,a){B.set(t,a);}function N(t){B.delete(t);}var _={destroy:()=>{},refresh:()=>{},getProgress:()=>0};function W(t,a={}){if(typeof window>"u")return _;let s=typeof t=="string"?document.querySelector(t):t;if(!s)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollPin: element not found:",t),_;let e=s,{top:l=0,scrollContainer:u,onEnter:b,onLeave:c,onEnterBack:g,onLeaveBack:r,onProgress:o}=a,d=typeof u=="string"?document.querySelector(u):u??null,n={position:e.style.position,top:e.style.top,bottom:e.style.bottom,left:e.style.left,width:e.style.width,boxSizing:e.style.boxSizing},i=document.createElement("div");i.setAttribute("data-ssd-pin-wrapper",""),i.style.cssText="position:relative;",e.parentNode?.insertBefore(i,e),i.appendChild(e);let T=0,h=0,w=0,x="before",v=0,L=0,E=false;function M(){T=i.offsetWidth,h=e.offsetHeight,w=a.pinDistance??window.innerHeight,i.style.height=`${h+w}px`;}function P(p){if(x===p)return;let m=x;if(x=p,p==="before")e.style.position=n.position,e.style.top=n.top,e.style.bottom=n.bottom,e.style.left=n.left,e.style.width=n.width,e.style.boxSizing=n.boxSizing,m==="pinned"&&r?.();else if(p==="pinned"){let I=i.getBoundingClientRect();e.style.position="fixed",e.style.top=`${l}px`,e.style.bottom="",e.style.left=`${I.left}px`,e.style.width=`${T}px`,e.style.boxSizing="border-box",m==="before"?b?.():m==="after"&&g?.();}else e.style.position="absolute",e.style.top="",e.style.bottom="0",e.style.left="0",e.style.width="100%",e.style.boxSizing="border-box",m==="pinned"&&c?.();}function C(){E=false;let p=i.getBoundingClientRect(),m=p.top,I=p.bottom,z=$((l-m)/w,0,1);v=z,o?.(z),m>l?P("before"):I-h<=l?P("after"):P("pinned");}function f(){E||(E=true,L=requestAnimationFrame(()=>C()));}let R=d??window;R.addEventListener("scroll",f,{passive:true});let S;function y(){clearTimeout(S),S=setTimeout(()=>{M(),f();},150);}return window.addEventListener("resize",y),window.addEventListener("orientationchange",y),M(),f(),A(i,{type:"pin",getProgress:()=>v,getTrigger:()=>({tStart:0,tEnd:1})}),{destroy(){cancelAnimationFrame(L),clearTimeout(S),R.removeEventListener("scroll",f),window.removeEventListener("resize",y),window.removeEventListener("orientationchange",y),e.style.position=n.position,e.style.top=n.top,e.style.bottom=n.bottom,e.style.left=n.left,e.style.width=n.width,e.style.boxSizing=n.boxSizing,i.parentNode?.insertBefore(e,i),i.remove(),N(i);},refresh(){M(),f();},getProgress(){return v}}}exports.scrollPin=W;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface ScrollPinOptions {
|
|
2
|
+
/** Extra pixels of scroll to stay pinned after the element hits its viewport position. Default: viewport height. */
|
|
3
|
+
pinDistance?: number;
|
|
4
|
+
/** Viewport Y position (px) where the element pins. Default: 0 (top of viewport). */
|
|
5
|
+
top?: number;
|
|
6
|
+
/** Custom scroll container (CSS selector or Element). Default: window. */
|
|
7
|
+
scrollContainer?: string | Element;
|
|
8
|
+
/** Fires when the element begins being pinned (scrolling forward). */
|
|
9
|
+
onEnter?: () => void;
|
|
10
|
+
/** Fires when the element unpins at the end of the pin zone (scrolling forward). */
|
|
11
|
+
onLeave?: () => void;
|
|
12
|
+
/** Fires when the element re-pins after scrolling back into the pin zone. */
|
|
13
|
+
onEnterBack?: () => void;
|
|
14
|
+
/** Fires when the element unpins back before the pin zone (scrolling back). */
|
|
15
|
+
onLeaveBack?: () => void;
|
|
16
|
+
/** Progress through the pin zone (0 = start, 1 = end). */
|
|
17
|
+
onProgress?: (progress: number) => void;
|
|
18
|
+
}
|
|
19
|
+
interface ScrollPinInstance {
|
|
20
|
+
/** Remove pin behaviour and restore the element to its original state. */
|
|
21
|
+
destroy: () => void;
|
|
22
|
+
/** Recalculate pin dimensions after a layout change. */
|
|
23
|
+
refresh: () => void;
|
|
24
|
+
/** Returns progress through the pin zone (0–1). */
|
|
25
|
+
getProgress: () => number;
|
|
26
|
+
}
|
|
27
|
+
declare function scrollPin(target: string | Element, options?: ScrollPinOptions): ScrollPinInstance;
|
|
28
|
+
|
|
29
|
+
export { type ScrollPinInstance, type ScrollPinOptions, scrollPin };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface ScrollPinOptions {
|
|
2
|
+
/** Extra pixels of scroll to stay pinned after the element hits its viewport position. Default: viewport height. */
|
|
3
|
+
pinDistance?: number;
|
|
4
|
+
/** Viewport Y position (px) where the element pins. Default: 0 (top of viewport). */
|
|
5
|
+
top?: number;
|
|
6
|
+
/** Custom scroll container (CSS selector or Element). Default: window. */
|
|
7
|
+
scrollContainer?: string | Element;
|
|
8
|
+
/** Fires when the element begins being pinned (scrolling forward). */
|
|
9
|
+
onEnter?: () => void;
|
|
10
|
+
/** Fires when the element unpins at the end of the pin zone (scrolling forward). */
|
|
11
|
+
onLeave?: () => void;
|
|
12
|
+
/** Fires when the element re-pins after scrolling back into the pin zone. */
|
|
13
|
+
onEnterBack?: () => void;
|
|
14
|
+
/** Fires when the element unpins back before the pin zone (scrolling back). */
|
|
15
|
+
onLeaveBack?: () => void;
|
|
16
|
+
/** Progress through the pin zone (0 = start, 1 = end). */
|
|
17
|
+
onProgress?: (progress: number) => void;
|
|
18
|
+
}
|
|
19
|
+
interface ScrollPinInstance {
|
|
20
|
+
/** Remove pin behaviour and restore the element to its original state. */
|
|
21
|
+
destroy: () => void;
|
|
22
|
+
/** Recalculate pin dimensions after a layout change. */
|
|
23
|
+
refresh: () => void;
|
|
24
|
+
/** Returns progress through the pin zone (0–1). */
|
|
25
|
+
getProgress: () => number;
|
|
26
|
+
}
|
|
27
|
+
declare function scrollPin(target: string | Element, options?: ScrollPinOptions): ScrollPinInstance;
|
|
28
|
+
|
|
29
|
+
export { type ScrollPinInstance, type ScrollPinOptions, scrollPin };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function F({bounces:t=3,decay:a=.5}={}){let s=Math.max(1,Math.round(t)),e=Math.max(.01,Math.min(.99,a)),l=Math.sqrt(e),u=0,b=[];for(let r=0;r<s;r++){let o=Math.pow(l,r);b.push(o),u+=o;}let c=[0],g=0;for(let r=0;r<s;r++)g+=b[r]/u,c.push(g);return r=>{if(r<=0)return 0;if(r>=1)return 1;for(let o=0;o<s;o++)if(r<=c[o+1]){let d=(r-c[o])/(c[o+1]-c[o]);if(o===0)return d*(2-d);let n=1-Math.pow(e,o);return n+(1-n)*(2*d-1)*(2*d-1)}return 1}}function q({amplitude:t=1,period:a=.4}={}){let s=Math.max(1,t),e=Math.max(.1,a),l=s<=1?e/4:e/(2*Math.PI)*Math.asin(1/s);return u=>u<=0?0:u>=1?1:s*Math.pow(2,-10*u)*Math.sin((u-l)*(2*Math.PI)/e)+1}({bounce:F(),elastic:q()});function $(t,a,s){return Math.min(s,Math.max(a,t))}var B=new Map;function A(t,a){B.set(t,a);}function N(t){B.delete(t);}var _={destroy:()=>{},refresh:()=>{},getProgress:()=>0};function W(t,a={}){if(typeof window>"u")return _;let s=typeof t=="string"?document.querySelector(t):t;if(!s)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollPin: element not found:",t),_;let e=s,{top:l=0,scrollContainer:u,onEnter:b,onLeave:c,onEnterBack:g,onLeaveBack:r,onProgress:o}=a,d=typeof u=="string"?document.querySelector(u):u??null,n={position:e.style.position,top:e.style.top,bottom:e.style.bottom,left:e.style.left,width:e.style.width,boxSizing:e.style.boxSizing},i=document.createElement("div");i.setAttribute("data-ssd-pin-wrapper",""),i.style.cssText="position:relative;",e.parentNode?.insertBefore(i,e),i.appendChild(e);let T=0,h=0,w=0,x="before",v=0,L=0,E=false;function M(){T=i.offsetWidth,h=e.offsetHeight,w=a.pinDistance??window.innerHeight,i.style.height=`${h+w}px`;}function P(p){if(x===p)return;let m=x;if(x=p,p==="before")e.style.position=n.position,e.style.top=n.top,e.style.bottom=n.bottom,e.style.left=n.left,e.style.width=n.width,e.style.boxSizing=n.boxSizing,m==="pinned"&&r?.();else if(p==="pinned"){let I=i.getBoundingClientRect();e.style.position="fixed",e.style.top=`${l}px`,e.style.bottom="",e.style.left=`${I.left}px`,e.style.width=`${T}px`,e.style.boxSizing="border-box",m==="before"?b?.():m==="after"&&g?.();}else e.style.position="absolute",e.style.top="",e.style.bottom="0",e.style.left="0",e.style.width="100%",e.style.boxSizing="border-box",m==="pinned"&&c?.();}function C(){E=false;let p=i.getBoundingClientRect(),m=p.top,I=p.bottom,z=$((l-m)/w,0,1);v=z,o?.(z),m>l?P("before"):I-h<=l?P("after"):P("pinned");}function f(){E||(E=true,L=requestAnimationFrame(()=>C()));}let R=d??window;R.addEventListener("scroll",f,{passive:true});let S;function y(){clearTimeout(S),S=setTimeout(()=>{M(),f();},150);}return window.addEventListener("resize",y),window.addEventListener("orientationchange",y),M(),f(),A(i,{type:"pin",getProgress:()=>v,getTrigger:()=>({tStart:0,tEnd:1})}),{destroy(){cancelAnimationFrame(L),clearTimeout(S),R.removeEventListener("scroll",f),window.removeEventListener("resize",y),window.removeEventListener("orientationchange",y),e.style.position=n.position,e.style.top=n.top,e.style.bottom=n.bottom,e.style.left=n.left,e.style.width=n.width,e.style.boxSizing=n.boxSizing,i.parentNode?.insertBefore(e,i),i.remove(),N(i);},refresh(){M(),f();},getProgress(){return v}}}export{W as scrollPin};
|