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.
Files changed (57) hide show
  1. package/README.md +7 -7
  2. package/dist/angular/index.cjs +3 -3
  3. package/dist/angular/index.d.mts +194 -9
  4. package/dist/angular/index.d.ts +194 -9
  5. package/dist/angular/index.mjs +3 -3
  6. package/dist/astro/index.cjs +3 -3
  7. package/dist/astro/index.d.mts +78 -1
  8. package/dist/astro/index.d.ts +78 -1
  9. package/dist/astro/index.mjs +3 -3
  10. package/dist/cdn/svg-scroll-draw.global.js +3 -3
  11. package/dist/devtools/index.cjs +1 -1
  12. package/dist/devtools/index.d.mts +12 -0
  13. package/dist/devtools/index.d.ts +12 -0
  14. package/dist/devtools/index.mjs +1 -1
  15. package/dist/group/index.cjs +3 -3
  16. package/dist/group/index.d.mts +88 -1
  17. package/dist/group/index.d.ts +88 -1
  18. package/dist/group/index.mjs +3 -3
  19. package/dist/index.cjs +4 -4
  20. package/dist/index.d.mts +16 -0
  21. package/dist/index.d.ts +16 -0
  22. package/dist/index.mjs +4 -4
  23. package/dist/lenis/index.cjs +1 -0
  24. package/dist/lenis/index.d.mts +51 -0
  25. package/dist/lenis/index.d.ts +51 -0
  26. package/dist/lenis/index.mjs +1 -0
  27. package/dist/nuxt/index.cjs +3 -3
  28. package/dist/nuxt/index.d.mts +286 -5
  29. package/dist/nuxt/index.d.ts +286 -5
  30. package/dist/nuxt/index.mjs +3 -3
  31. package/dist/pin/index.cjs +1 -0
  32. package/dist/pin/index.d.mts +29 -0
  33. package/dist/pin/index.d.ts +29 -0
  34. package/dist/pin/index.mjs +1 -0
  35. package/dist/react/index.cjs +3 -3
  36. package/dist/react/index.d.mts +16 -0
  37. package/dist/react/index.d.ts +16 -0
  38. package/dist/react/index.mjs +3 -3
  39. package/dist/snap/index.cjs +1 -0
  40. package/dist/snap/index.d.mts +30 -0
  41. package/dist/snap/index.d.ts +30 -0
  42. package/dist/snap/index.mjs +1 -0
  43. package/dist/solid/index.cjs +3 -3
  44. package/dist/solid/index.d.mts +171 -1
  45. package/dist/solid/index.d.ts +171 -1
  46. package/dist/solid/index.mjs +3 -3
  47. package/dist/svelte/index.cjs +3 -3
  48. package/dist/svelte/index.d.mts +183 -10
  49. package/dist/svelte/index.d.ts +183 -10
  50. package/dist/svelte/index.mjs +3 -3
  51. package/dist/vue/index.cjs +3 -3
  52. package/dist/vue/index.d.mts +278 -1
  53. package/dist/vue/index.d.ts +278 -1
  54. package/dist/vue/index.mjs +3 -3
  55. package/dist/web-component/index.cjs +3 -3
  56. package/dist/web-component/index.mjs +3 -3
  57. package/package.json +16 -1
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Lenis smooth-scroll adapter for svg-scroll-draw.
3
+ *
4
+ * Lenis v2+ patches `window.scrollY` natively — no adapter needed.
5
+ * This adapter targets Lenis v1, which uses a virtual scroll value
6
+ * and does NOT update `window.scrollY`. It patches `window.scrollY` /
7
+ * `window.pageYOffset` so all svg-scroll-draw engines read the correct value.
8
+ *
9
+ * Usage:
10
+ * import Lenis from '@studio-freight/lenis'
11
+ * import { createLenisAdapter } from 'svg-scroll-draw/lenis'
12
+ *
13
+ * const lenis = new Lenis()
14
+ * const adapter = createLenisAdapter(lenis)
15
+ *
16
+ * // RAF loop — let Lenis drive the tick
17
+ * function raf(time: number) {
18
+ * lenis.raf(time)
19
+ * requestAnimationFrame(raf)
20
+ * }
21
+ * requestAnimationFrame(raf)
22
+ *
23
+ * // On cleanup:
24
+ * adapter.destroy()
25
+ */
26
+ interface LenisScrollEvent {
27
+ scroll: number;
28
+ velocity: number;
29
+ direction: number;
30
+ progress: number;
31
+ }
32
+ interface LenisLike {
33
+ on(event: 'scroll', callback: (e: LenisScrollEvent) => void): void;
34
+ off(event: 'scroll', callback: (e: LenisScrollEvent) => void): void;
35
+ }
36
+ interface LenisAdapterInstance {
37
+ /** Restore native `window.scrollY` and remove the Lenis listener. */
38
+ destroy: () => void;
39
+ /** Returns the current virtual scroll Y value Lenis last reported. */
40
+ getScrollY: () => number;
41
+ }
42
+ /**
43
+ * Patches `window.scrollY` and `window.pageYOffset` to return Lenis's
44
+ * virtual scroll position so all svg-scroll-draw engines stay in sync
45
+ * with smooth scroll.
46
+ *
47
+ * Only needed for Lenis v1. Lenis v2+ patches scrollY itself.
48
+ */
49
+ declare function createLenisAdapter(lenis: LenisLike): LenisAdapterInstance;
50
+
51
+ export { type LenisAdapterInstance, type LenisLike, type LenisScrollEvent, createLenisAdapter };
@@ -0,0 +1 @@
1
+ var t={destroy:()=>{},getScrollY:()=>0};function l(n){if(typeof window>"u")return t;let e=window.scrollY,r=o=>{e=o.scroll;try{Object.defineProperty(window,"scrollY",{get:()=>e,configurable:!0}),Object.defineProperty(window,"pageYOffset",{get:()=>e,configurable:!0});}catch{}};return n.on("scroll",r),{destroy(){n.off("scroll",r);try{delete window.scrollY,delete window.pageYOffset;}catch{}},getScrollY(){return e}}}export{l as createLenisAdapter};
@@ -1,3 +1,3 @@
1
- 'use strict';var vue=require('vue');function ot({bounces:e=3,decay:n=.5}={}){let s=Math.max(1,Math.round(e)),r=Math.max(.01,Math.min(.99,n)),p=Math.sqrt(r),h=0,L=[];for(let d=0;d<s;d++){let S=Math.pow(p,d);L.push(S),h+=S;}let E=[0],M=0;for(let d=0;d<s;d++)M+=L[d]/h,E.push(M);return d=>{if(d<=0)return 0;if(d>=1)return 1;for(let S=0;S<s;S++)if(d<=E[S+1]){let B=(d-E[S])/(E[S+1]-E[S]);if(S===0)return B*(2-B);let y=1-Math.pow(r,S);return y+(1-y)*(2*B-1)*(2*B-1)}return 1}}function it({amplitude:e=1,period:n=.4}={}){let s=Math.max(1,e),r=Math.max(.1,n),p=s<=1?r/4:r/(2*Math.PI)*Math.asin(1/s);return h=>h<=0?0:h>=1?1:s*Math.pow(2,-10*h)*Math.sin((h-p)*(2*Math.PI)/r)+1}var De={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:it()};function Pe(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[s="top",r="bottom"]=n.split(/\s+/).filter(Boolean);return {element:s,viewport:r}}function Ve(e,n,s,r){switch(r){case "top":return e+s;case "center":return e+s+n/2;case "bottom":return e+s+n;default:return e+s}}function Be(e,n){if(/^\d+(\.\d+)?%$/.test(e))return n*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return n/2;case "bottom":return n;default:return n}}function Se(e){let n=e.tagName.toLowerCase();if(n==="rect"){let s=parseFloat(e.getAttribute("width")??"0"),r=parseFloat(e.getAttribute("height")??"0");return 2*(s+r)}if(n==="circle"){let s=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*s}return e.getTotalLength()}function at(e,n,s){return Math.min(s,Math.max(n,e))}function ie(e,n,s,r){return s===n?0:at((e-n)/(s-n)*r,0,1)}function Le(e,n,s,r,p){let h=Ve(e.top,e.height,n,r.element)-Be(r.viewport,s),L=Ve(e.top,e.height,n,p.element)-Be(p.viewport,s);return {tStart:h,tEnd:L}}function Ge(e){let n=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(n)return [parseInt(n[1]+n[1],16),parseInt(n[2]+n[2],16),parseInt(n[3]+n[3],16)];let s=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(s)return [parseInt(s[1],16),parseInt(s[2],16),parseInt(s[3],16)];let r=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i.exec(e);return r?[parseInt(r[1]),parseInt(r[2]),parseInt(r[3])]:null}function Ee(e,n,s){let r=Ge(e),p=Ge(n);return !r||!p?e:`rgb(${Math.round(r[0]+(p[0]-r[0])*s)},${Math.round(r[1]+(p[1]-r[1])*s)},${Math.round(r[2]+(p[2]-r[2])*s)})`}var _e={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 Ue(e,n){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,n);}var Xe={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},lt=0;function ut(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function ct(e){let n=e.getAttribute("stroke"),s=e.getAttribute("fill");!n||n==="none"?Ue("Element has no stroke \u2014 path will not be visible.",e):s&&s!=="none"&&s!=="transparent"&&Ue("Element has a fill \u2014 it may obscure the stroke animation.",e);}function ft(e,n,s){let r=document.createElement("div");r.setAttribute("data-svg-scroll-draw-debug",""),r.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 p(){let h=s==="x"?window.scrollX:window.scrollY,L=e-h,E=n-h,M=s==="x";r.innerHTML=`
2
- <div style="position:absolute;${M?`left:${L}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${L}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;${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=vue.ref(null);return vue.onMounted(()=>{if(!n.value)return;let s=Fe(n.value,e);vue.onUnmounted(()=>s.destroy());}),n}var Ce=vue.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=vue.ref(null);return vue.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);vue.onUnmounted(()=>p.destroy());}),()=>vue.h("div",{ref:s},n.default?.())}});function $t(){return {install(e){e.component("ScrollDraw",Ce);}}}exports.ScrollDraw=Ce;exports.createScrollDrawPlugin=$t;exports.useScrollDraw=dt;
1
+ 'use strict';var vue=require('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=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=Qe(r.value,e);vue.onUnmounted(()=>n.destroy());}),r}var st=vue.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=vue.ref(null);return vue.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);vue.onUnmounted(()=>l.destroy());}),()=>vue.h("div",{ref:n},r.default?.())}});function Yt(e){let r=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=et(r.value,e);vue.onUnmounted(()=>n.destroy());}),r}var it=vue.defineComponent({name:"ScrollAnimate",props:{options:{type:Object,required:true}},setup(e,{slots:r}){let n=vue.ref(null);return vue.onMounted(()=>{if(!n.value)return;let t=et(n.value,e.options);vue.onUnmounted(()=>t.destroy());}),()=>vue.h("div",{ref:n},r.default?.())}});function Ut(e){let r=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=nt(r.value,e);vue.onUnmounted(()=>n.destroy());}),r}var at=vue.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=vue.ref(null);return vue.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);vue.onUnmounted(()=>t.destroy());}),()=>vue.h("span",{ref:r})}});function Zt(e={}){let r=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=rt(r.value,e);vue.onUnmounted(()=>n.destroy());}),r}var lt=vue.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=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=rt(r.value,e.options??{});vue.onUnmounted(()=>n.destroy());}),()=>vue.h("video",{ref:r,src:e.src,muted:e.muted,playsinline:e.playsInline,preload:"auto",class:e.class})}});function Jt(e={}){let r=vue.ref(null);return vue.onMounted(()=>{if(!r.value)return;let n=ot(r.value,e);vue.onUnmounted(()=>n.destroy());}),r}var ct=vue.defineComponent({name:"ScrollText",props:{options:{type:Object},tag:{type:String,default:"p"}},setup(e,{slots:r}){let n=vue.ref(null);return vue.onMounted(()=>{if(!n.value)return;let t=ot(n.value,e.options??{});vue.onUnmounted(()=>t.destroy());}),()=>vue.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);}}}exports.ScrollAnimate=it;exports.ScrollCounter=at;exports.ScrollDraw=st;exports.ScrollText=ct;exports.ScrollVideo=lt;exports.createScrollDrawPlugin=An;exports.useScrollAnimate=Yt;exports.useScrollCounter=Ut;exports.useScrollDraw=Xt;exports.useScrollText=Jt;exports.useScrollVideo=Zt;
@@ -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 the Vue composable and component for direct use, plus a
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> globally with no imports.
496
+ * Then use <ScrollDraw>, <ScrollAnimate>, <ScrollCounter>, etc. globally.
218
497
  */
219
498
 
220
499
  /**
221
- * Vue plugin that globally registers the <ScrollDraw> component.
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 };