svg-scroll-draw 1.6.0 → 2.2.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.
@@ -1,3 +1,3 @@
1
- import {useState,useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';function rt({bounces:e=3,decay:r=.5}={}){let s=Math.max(1,Math.round(e)),o=Math.max(.01,Math.min(.99,r)),f=Math.sqrt(o),m=0,T=[];for(let p=0;p<s;p++){let b=Math.pow(f,p);T.push(b),m+=b;}let v=[0],y=0;for(let p=0;p<s;p++)y+=T[p]/m,v.push(y);return p=>{if(p<=0)return 0;if(p>=1)return 1;for(let b=0;b<s;b++)if(p<=v[b+1]){let x=(p-v[b])/(v[b+1]-v[b]);if(b===0)return x*(2-x);let g=1-Math.pow(o,b);return g+(1-g)*(2*x-1)*(2*x-1)}return 1}}function nt({amplitude:e=1,period:r=.4}={}){let s=Math.max(1,e),o=Math.max(.1,r),f=s<=1?o/4:o/(2*Math.PI)*Math.asin(1/s);return m=>m<=0?0:m>=1?1:s*Math.pow(2,-10*m)*Math.sin((m-f)*(2*Math.PI)/o)+1}var he={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:rt(),elastic:nt()};function be(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[s="top",o="bottom"]=r.split(/\s+/).filter(Boolean);return {element:s,viewport:o}}function Ve(e,r,s,o){switch(o){case "top":return e+s;case "center":return e+s+r/2;case "bottom":return e+s+r;default:return e+s}}function Ge(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 Le(e){let r=e.tagName.toLowerCase();if(r==="rect"){let s=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(s+o)}if(r==="circle"){let s=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*s}return e.getTotalLength()}function st(e,r,s){return Math.min(s,Math.max(r,e))}function Z(e,r,s,o){return s===r?0:st((e-r)/(s-r)*o,0,1)}function xe(e,r,s,o,f){let m=Ve(e.top,e.height,r,o.element)-Ge(o.viewport,s),T=Ve(e.top,e.height,r,f.element)-Ge(f.viewport,s);return {tStart:m,tEnd:T}}function Be(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 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 o=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i.exec(e);return o?[parseInt(o[1]),parseInt(o[2]),parseInt(o[3])]:null}function Oe(e,r,s){let o=Be(e),f=Be(r);return !o||!f?e:`rgb(${Math.round(o[0]+(f[0]-o[0])*s)},${Math.round(o[1]+(f[1]-o[1])*s)},${Math.round(o[2]+(f[2]-o[2])*s)})`}var Ue={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 Xe(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}var _e={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},ot=0;function it(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function at(e){let r=e.getAttribute("stroke"),s=e.getAttribute("fill");!r||r==="none"?Xe("Element has no stroke \u2014 path will not be visible.",e):s&&s!=="none"&&s!=="transparent"&&Xe("Element has a fill \u2014 it may obscure the stroke animation.",e);}function lt(e,r,s){let o=document.createElement("div");o.setAttribute("data-svg-scroll-draw-debug",""),o.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 f(){let m=s==="x"?window.scrollX:window.scrollY,T=e-m,v=r-m,y=s==="x";o.innerHTML=`
2
- <div style="position:absolute;${y?`left:${T}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${T}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;${y?`left:${v}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${v}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(o),window.addEventListener("scroll",f,{passive:true}),f(),o}function Ie(e,r,s){let o=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),f=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,m=>{let T=parseFloat(m),v=o[f++]??T;return String(+(T+(v-T)*s).toFixed(4))})}function je(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let{preset:s,...o}=r,f=s?{...Ue[s],...o}:o,m=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:T="path, polyline, line, polygon, rect, circle",speed:v=1,fade:y=false,easing:p="linear",trigger:b={},stagger:x=0,direction:g="forward",once:Y=false,debug:Se=false,axis:F="y",scrollContainer:le,autoReverse:J=false,delay:ee=0,strokeColor:K,strokeWidth:V,fillOpacity:G,waypoints:B,velocityScale:te=false,threshold:ue=0,rootMargin:W="0px",repeat:M=0,repeatDelay:ce=0,morphTo:P,clip:re,autoplay:we=false,duration:Je=1e3,native:Ke=true,onProgress:ve,onStart:$e,onComplete:ye}=f,ne=re===true?"left":typeof re=="string"?re:false,fe=typeof p=="function"?p:he[p]??he.linear,Ne=be(b.start??"top bottom"),ze=be(b.end??"bottom top"),I=typeof le=="string"?document.querySelector(le):le??null,U=Array.isArray(K)?K[0]:null,D=Array.isArray(K)?K[1]:typeof K=="string"?K:null,N=Array.isArray(V)?V[0]:null,L=Array.isArray(V)?V[1]:typeof V=="number"?V:null,z=Array.isArray(G)?G[0]:null,O=Array.isArray(G)?G[1]:typeof G=="number"?G:null;function me(t){let n=t*100;switch(ne){case "right":return `inset(0 0 0 ${100-n}%)`;case "top":return `inset(0 0 ${100-n}% 0)`;case "bottom":return `inset(${100-n}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-n}% 0 0)`}}let A=ne?[]:Array.from(e.querySelectorAll(T)),S=[],X=[],se=0,oe=0,k=false,q=false,$=0,Te=false,_=-1,Me=-1,R=false,pe=0,Q=0,ie,Re=null,ae=new Set,Ae=-1,He=performance.now();function Ee(){return I?F==="x"?I.scrollLeft:I.scrollTop:F==="x"?window.scrollX:window.scrollY}function We(){return I?F==="x"?I.clientWidth:I.clientHeight:F==="x"?window.innerWidth:window.innerHeight}function qe(){let t=e.getBoundingClientRect(),n,l,w;if(I){let C=I.getBoundingClientRect();n=F==="x"?t.left-C.left+I.scrollLeft:t.top-C.top+I.scrollTop,l=F==="x"?t.width:t.height,w=Ee();}else n=F==="x"?t.left:t.top,l=F==="x"?t.width:t.height,w=Ee();let H=xe({top:n,height:l},w,We(),Ne,ze);se=H.tStart,oe=H.tEnd,Se&&process.env.NODE_ENV!=="production"&&(Re?.remove(),Re=lt(se,oe,F));}function Qe(t,n){if(e.style.setProperty("--scroll-draw-progress",String(t)),ne){let l=n==="reverse"?1-t:t;e.style.clipPath=me(l);return}A.forEach((l,w)=>{l.style.strokeDashoffset=n==="reverse"?`${S[w]*t}`:`${S[w]*(1-t)}`,y&&(l.style.opacity=n==="reverse"?`${1-t}`:`${t}`),U&&D?l.style.stroke=Oe(U,D,t):D&&(l.style.stroke=D),N!==null&&L!==null?l.style.strokeWidth=`${N+(L-N)*t}`:L!==null&&(l.style.strokeWidth=`${L}`),z!==null&&O!==null?l.style.fillOpacity=`${z+(O-z)*t}`:O!==null&&(l.style.fillOpacity=`${O}`),P&&l.tagName.toLowerCase()==="path"&&X[w]&&l.setAttribute("d",Ie(X[w],P,t));});}function ke(){if(e.style.setProperty("--scroll-draw-progress","0"),ne){e.style.clipPath=me(0);return}A.forEach((t,n)=>{t.style.strokeDasharray=`${S[n]}`,t.style.strokeDashoffset=g==="reverse"?"0":`${S[n]}`,y?t.style.opacity=g==="reverse"?"1":"0":t.style.opacity="",U&&(t.style.stroke=U),N!==null&&(t.style.strokeWidth=`${N}`),z!==null&&(t.style.fillOpacity=`${z}`),P&&t.tagName.toLowerCase()==="path"&&X[n]&&t.setAttribute("d",X[n]);});}if(A.forEach(t=>{at(t);let n=Le(t);S.push(n),t.tagName.toLowerCase()==="path"?X.push(t.getAttribute("d")??""):X.push(""),m?(t.style.strokeDasharray=`${n}`,t.style.strokeDashoffset=g==="reverse"?`${n}`:"0",y&&(t.style.opacity="1"),D&&(t.style.stroke=D),L!==null&&(t.style.strokeWidth=`${L}`),O!==null&&(t.style.fillOpacity=`${O}`),P&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",P)):(t.style.strokeDasharray=`${n}`,t.style.strokeDashoffset=g==="reverse"?"0":`${n}`,y?t.style.opacity=g==="reverse"?"1":"0":t.style.opacity="",U&&(t.style.stroke=U),N!==null&&(t.style.strokeWidth=`${N}`),z!==null&&(t.style.fillOpacity=`${z}`));}),ne){if(m)return e.style.clipPath=me(1),ye?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=me(0);}else if(m)return ye?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};function Ze(){return !(Ke===false||!it()||!A.length||typeof p!="string"||!(p in _e)||ne||F!=="y"||I||v!==1||x!==0||Y||J||te!==false||P||B||M||ee>0||ve||$e||ye||K!=null||V!=null||G!=null||(b.start??"top bottom").trim()!=="top bottom"||(b.end??"bottom top").trim()!=="bottom top")}function et(){let t=`svg-scroll-draw-${++ot}`,n=g==="reverse"?"0":"var(--ssd-len)",l=g==="reverse"?"var(--ssd-len)":"0",w=`stroke-dashoffset:${n};`,H=`stroke-dashoffset:${l};`;y&&(w+=`opacity:${g==="reverse"?1:0};`,H+=`opacity:${g==="reverse"?0:1};`);let C=document.createElement("style");C.setAttribute("data-svg-scroll-draw",""),C.textContent=`@keyframes ${t}{from{${w}}to{${H}}}.${t}{animation-name:${t};animation-duration:auto;animation-timing-function:${_e[p]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(C);function a(i,c){i.style.setProperty("--ssd-len",String(S[c])),i.style.strokeDasharray=`${S[c]}`,i.style.strokeDashoffset="",i.style.opacity="",i.style.animationPlayState="",i.classList.add(t);}A.forEach(a);let d=false,E=-1;function u(){if(E>=0)return E;let i=e.getBoundingClientRect(),{tStart:c,tEnd:h}=xe({top:i.top,height:i.height},Ee(),We(),Ne,ze);return fe(Z(Ee(),c,h,v))}return {destroy(){A.forEach(i=>{i.classList.remove(t),i.style.removeProperty("--ssd-len"),i.style.animationPlayState="";}),C.remove();},replay(){d=false,E=-1,A.forEach(a);},pause(){d=true,A.forEach(i=>{i.style.animationPlayState="paused";});},resume(){d&&(d=false,A.forEach(i=>{i.style.animationPlayState="running";}));},seek(i){let c=Math.min(1,Math.max(0,i));E=c,d=true,A.forEach((h,de)=>{h.classList.remove(t),h.style.strokeDashoffset=g==="reverse"?`${S[de]*c}`:`${S[de]*(1-c)}`,y&&(h.style.opacity=g==="reverse"?`${1-c}`:`${c}`);});},getProgress(){return u()}}}if(Ze())return et();function tt(){let t=Math.max(1,Je),n=0,l=0;function w(u){let i=true;if(ne){let c=Math.min(1,Math.max(0,u/t)),h=fe(c);pe=h,e.style.setProperty("--scroll-draw-progress",String(h)),e.style.clipPath=me(g==="reverse"?1-h:h),ve?.(h),c<1&&(i=false);}else A.forEach((c,h)=>{let de=h*x*t,ge=Math.min(1,Math.max(0,(u-de)/t)),j=fe(ge);c.style.strokeDashoffset=g==="reverse"?`${S[h]*j}`:`${S[h]*(1-j)}`,y&&(c.style.opacity=g==="reverse"?`${1-j}`:`${j}`),U&&D?c.style.stroke=Oe(U,D,j):D&&(c.style.stroke=D),N!==null&&L!==null?c.style.strokeWidth=`${N+(L-N)*j}`:L!==null&&(c.style.strokeWidth=`${L}`),z!==null&&O!==null?c.style.fillOpacity=`${z+(O-z)*j}`:O!==null&&(c.style.fillOpacity=`${O}`),P&&c.tagName.toLowerCase()==="path"&&X[h]&&c.setAttribute("d",Ie(X[h],P,j)),h===0&&(ve?.(j),e.style.setProperty("--scroll-draw-progress",String(j))),ge<1&&(i=false);});if(B){let c=Math.min(1,Math.max(0,u/t)),h=fe(c);for(let de in B){let ge=parseFloat(de);h>=ge&&!ae.has(ge)&&(ae.add(ge),B[de]?.());}}return i}function H(u){if(R)return;let i=u-n;q||(q=true,$e?.());let c=w(i);if(c&&!k){k=true,w(t*(1+Math.max(0,A.length-1)*x)),ye?.(),Q<(M==="infinite"?1/0:M??0)&&(Q++,ie=setTimeout(()=>{n=performance.now(),q=false,k=false,ae.clear(),ke(),$=requestAnimationFrame(H);},ce));return}c||($=requestAnimationFrame(H));}function C(){cancelAnimationFrame($),clearTimeout(ie),n=performance.now(),l=0,R=false,q=false,k=false,Q=0,ae.clear(),ke(),$=requestAnimationFrame(H);}let a=new IntersectionObserver(u=>{u.forEach(i=>{i.isIntersecting&&!(Y&&k)?C():!i.isIntersecting&&!Y&&!k&&(cancelAnimationFrame($),clearTimeout(ie),n=null);});},{root:I??null,threshold:ue,rootMargin:W}),d;function E(){clearTimeout(d),d=setTimeout(()=>{A.forEach((u,i)=>{S[i]=Le(u),u.style.strokeDasharray=`${S[i]}`;});},150);}return window.addEventListener("resize",E),window.addEventListener("orientationchange",E),ee>0?setTimeout(()=>a.observe(e),ee):a.observe(e),{destroy(){cancelAnimationFrame($),clearTimeout(ie),a.disconnect(),window.removeEventListener("resize",E),window.removeEventListener("orientationchange",E),clearTimeout(d);},replay(){Q=0,C();},pause(){R||(R=true,l=performance.now()-n,cancelAnimationFrame($));},resume(){R&&(R=false,n=performance.now()-l,$=requestAnimationFrame(H));},seek(u){let i=Math.min(1,Math.max(0,u));pe=i,R=true,l=i*t,n=performance.now()-l,cancelAnimationFrame($),w(l);},getProgress(){return pe}}}if(we)return tt();qe();function Pe(){if(!Te||R)return;let t=performance.now(),n=Ee(),l=v;if(te!==false){let a=t-He,d=a>0?Math.abs(n-(Ae<0?n:Ae))/a:0;l=v*Math.max(.2,1+d*(typeof te=="number"?te:1)*.04);}Ae=n,He=t;let w=J?Me===-1||n>=Me?"forward":"reverse":g;Me=n;let H=oe-se,C=true;if(ne){let a=fe(Z(n,se,oe,l));Y&&!J&&(_=Math.max(_,a),a=_),pe=a,e.style.setProperty("--scroll-draw-progress",String(a));let d=w==="reverse"?1-a:a;e.style.clipPath=me(d),ve?.(a),!q&&Z(n,se,oe,l)>0&&(q=true,$e?.()),a>=1&&!k?(k=true,ye?.(),Q<(M==="infinite"?1/0:M??0)&&(Q++,ie=setTimeout(()=>{_=-1,q=false,k=false,e.style.clipPath=me(0);},ce))):a<1&&!Y&&(k=false),$=requestAnimationFrame(Pe);return}if(A.forEach((a,d)=>{let E=d*x*H,u=fe(Z(n,se+E,oe+E,l));Y&&!J&&(_=Math.max(_,u),u=_),pe=u,a.style.strokeDashoffset=w==="reverse"?`${S[d]*u}`:`${S[d]*(1-u)}`,y&&(a.style.opacity=w==="reverse"?`${1-u}`:`${u}`),U&&D?a.style.stroke=Oe(U,D,u):D&&(a.style.stroke=D),N!==null&&L!==null?a.style.strokeWidth=`${N+(L-N)*u}`:L!==null&&(a.style.strokeWidth=`${L}`),z!==null&&O!==null?a.style.fillOpacity=`${z+(O-z)*u}`:O!==null&&(a.style.fillOpacity=`${O}`),P&&a.tagName.toLowerCase()==="path"&&X[d]&&a.setAttribute("d",Ie(X[d],P,u)),d===0&&(ve?.(u),e.style.setProperty("--scroll-draw-progress",String(u))),u<1&&(C=false);}),B){let a=fe(Z(n,se,oe,l));for(let d in B){let E=parseFloat(d);a>=E&&!ae.has(E)&&(ae.add(E),B[d]?.());}}!q&&Z(n,se,oe,l)>0&&(q=true,$e?.()),C&&!k?(k=true,ye?.(),Q<(M==="infinite"?1/0:M??0)&&(Q++,ie=setTimeout(()=>{_=-1,q=false,k=false,ae.clear(),ke();},ce))):!C&&!Y&&(k=false),$=requestAnimationFrame(Pe);}let Ce=new IntersectionObserver(t=>{t.forEach(n=>{Te=n.isIntersecting,Te&&!R?$=requestAnimationFrame(Pe):cancelAnimationFrame($);});},{root:I??null,threshold:ue,rootMargin:W}),Fe;function De(){clearTimeout(Fe),Fe=setTimeout(()=>{A.forEach((t,n)=>{S[n]=Le(t),t.style.strokeDasharray=`${S[n]}`;}),qe();},150);}return window.addEventListener("resize",De),window.addEventListener("orientationchange",De),ee>0?setTimeout(()=>Ce.observe(e),ee):Ce.observe(e),{destroy(){cancelAnimationFrame($),clearTimeout(ie),Ce.disconnect(),window.removeEventListener("resize",De),window.removeEventListener("orientationchange",De),clearTimeout(Fe),Re?.remove();},replay(){_=-1,Me=-1,Ae=-1,q=false,k=false,Q=0,R=false,ae.clear(),clearTimeout(ie),ke();},pause(){R=true,cancelAnimationFrame($);},resume(){R&&(R=false,Te&&($=requestAnimationFrame(Pe)));},seek(t){let n=Math.min(1,Math.max(0,t));pe=n,_=n,R=true,cancelAnimationFrame($),Qe(n,g);},getProgress(){return pe}}}function ft(e,r={}){let[s,o]=useState(0),f=useRef(r);f.current=r;let m=useRef(-1);return useEffect(()=>{if(typeof window>"u")return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches){o(1);return}let T=typeof e=="string"?document.querySelector(e):e.current;if(!T)return;let v=T,{axis:y="y",scrollContainer:p,trigger:b={}}=f.current,x=typeof p=="string"?document.querySelector(p):p??null,g=be(b.start??"top bottom"),Y=be(b.end??"bottom top"),Se=0,F=0,le=false,J=0;function ee(){return x?y==="x"?x.scrollLeft:x.scrollTop:y==="x"?window.scrollX:window.scrollY}function K(){return x?y==="x"?x.clientWidth:x.clientHeight:y==="x"?window.innerWidth:window.innerHeight}function V(){let W=v.getBoundingClientRect(),M=ee(),ce=y==="x"?W.left:W.top,P=y==="x"?W.width:W.height,re=xe({top:ce,height:P},M,K(),g,Y);Se=re.tStart,F=re.tEnd;}function G(){if(!le)return;let{speed:W=1,easing:M="linear",once:ce=false}=f.current,P=typeof M=="function"?M:he[M]??he.linear,re=Z(ee(),Se,F,W),we=P(re);ce&&(m.current=Math.max(m.current,we),we=m.current),o(we),J=requestAnimationFrame(G);}let B=new IntersectionObserver(W=>{W.forEach(M=>{le=M.isIntersecting,le?J=requestAnimationFrame(G):cancelAnimationFrame(J);});},{root:x??null,threshold:0});V(),B.observe(v);let te;function ue(){clearTimeout(te),te=setTimeout(V,150);}return window.addEventListener("resize",ue),window.addEventListener("orientationchange",ue),()=>{cancelAnimationFrame(J),clearTimeout(te),B.disconnect(),window.removeEventListener("resize",ue),window.removeEventListener("orientationchange",ue);}},[]),s}function Mt({children:e,className:r,style:s,...o}){let f=useRef(null);return useEffect(()=>{if(!f.current)return;let m=je(f.current,o);return ()=>m.destroy()},[]),jsx("div",{ref:f,className:r,style:s,children:e})}export{Mt as ScrollDraw,ft as useScrollDrawProgress};
1
+ import zt,{useState,useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';function vt({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),t=Math.max(.01,Math.min(.99,n)),i=Math.sqrt(t),o=0,l=[];for(let p=0;p<r;p++){let I=Math.pow(i,p);l.push(I),o+=I;}let c=[0],a=0;for(let p=0;p<r;p++)a+=l[p]/o,c.push(a);return p=>{if(p<=0)return 0;if(p>=1)return 1;for(let I=0;I<r;I++)if(p<=c[I+1]){let k=(p-c[I])/(c[I+1]-c[I]);if(I===0)return k*(2-k);let E=1-Math.pow(t,I);return E+(1-E)*(2*k-1)*(2*k-1)}return 1}}function Et({amplitude:e=1,period:n=.4}={}){let r=Math.max(1,e),t=Math.max(.1,n),i=r<=1?t/4:t/(2*Math.PI)*Math.asin(1/r);return o=>o<=0?0:o>=1?1:r*Math.pow(2,-10*o)*Math.sin((o-i)*(2*Math.PI)/t)+1}var te={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:vt(),elastic:Et()};function re(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[r="top",t="bottom"]=n.split(/\s+/).filter(Boolean);return {element:r,viewport:t}}function Je(e,n,r,t){switch(t){case "top":return e+r;case "center":return e+r+n/2;case "bottom":return e+r+n;default:return e+r}}function Ze(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 Ve(e){let n=e.tagName.toLowerCase();if(n==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),t=parseFloat(e.getAttribute("height")??"0");return 2*(r+t)}if(n==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function St(e,n,r){return Math.min(r,Math.max(n,e))}function Y(e,n,r,t){return r===n?0:St((e-n)/(r-n)*t,0,1)}function fe(e,n,r,t,i){let o=Je(e.top,e.height,n,t.element)-Ze(t.viewport,r),l=Je(e.top,e.height,n,i.element)-Ze(i.viewport,r);return {tStart:o,tEnd:l}}function Ke(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 r=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(r)return [parseInt(r[1],16),parseInt(r[2],16),parseInt(r[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 Le(e,n,r){let t=Ke(e),i=Ke(n);return !t||!i?e:`rgb(${Math.round(t[0]+(i[0]-t[0])*r)},${Math.round(t[1]+(i[1]-t[1])*r)},${Math.round(t[2]+(i[2]-t[2])*r)})`}var Qe={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 et(e,n){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,n);}var tt={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},xt=0;function Tt(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function At(e){let n=e.getAttribute("stroke"),r=e.getAttribute("fill");!n||n==="none"?et("Element has no stroke \u2014 path will not be visible.",e):r&&r!=="none"&&r!=="transparent"&&et("Element has a fill \u2014 it may obscure the stroke animation.",e);}function Mt(e,n,r){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 i(){let o=r==="x"?window.scrollX:window.scrollY,l=e-o,c=n-o,a=r==="x";t.innerHTML=`
2
+ <div style="position:absolute;${a?`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;${a?`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",i,{passive:true}),i(),t}function Ge(e,n,r){let t=(n.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),i=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,o=>{let l=parseFloat(o),c=t[i++]??l;return String(+(l+(c-l)*r).toFixed(4))})}function rt(e,n={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let{preset:r,...t}=n,i=r?{...Qe[r],...t}:t,o=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:l="path, polyline, line, polygon, rect, circle",speed:c=1,fade:a=false,easing:p="linear",trigger:I={},stagger:k=0,direction:E="forward",once:Z=false,debug:ce=false,axis:V="y",scrollContainer:B,autoReverse:S=false,delay:R=0,strokeColor:C,strokeWidth:$,fillOpacity:L,waypoints:h,velocityScale:A=false,threshold:M=0,rootMargin:w="0px",repeat:b=0,repeatDelay:D=0,morphTo:P,clip:z,autoplay:G=false,duration:K=1e3,native:ae=true,onProgress:d,onStart:N,onComplete:y}=i,f=z===true?"left":typeof z=="string"?z:false,H=typeof p=="function"?p:te[p]??te.linear,ge=re(I.start??"top bottom"),m=re(I.end??"bottom top"),g=typeof B=="string"?document.querySelector(B):B??null,se=Array.isArray(C)?C[0]:null,_=Array.isArray(C)?C[1]:typeof C=="string"?C:null,Q=Array.isArray($)?$[0]:null,ie=Array.isArray($)?$[1]:typeof $=="number"?$:null,q=Array.isArray(L)?L[0]:null,j=Array.isArray(L)?L[1]:typeof L=="number"?L:null;function pe(s){let u=s*100;switch(f){case "right":return `inset(0 0 0 ${100-u}%)`;case "top":return `inset(0 0 ${100-u}% 0)`;case "bottom":return `inset(${100-u}% 0 0 0)`;case "center":return `circle(${s*150}% at 50% 50%)`;default:return `inset(0 ${100-u}% 0 0)`}}let ne=f?[]:Array.from(e.querySelectorAll(l)),U=[],he=[],Ee=0,Se=0,le=false,ye=false,oe=0,ke=false,be=-1,Re=-1,ue=false,Pe=0,ve=0,xe,We=null,Te=new Set,Ne=-1,Ye=performance.now();function Ie(){return g?V==="x"?g.scrollLeft:g.scrollTop:V==="x"?window.scrollX:window.scrollY}function je(){return g?V==="x"?g.clientWidth:g.clientHeight:V==="x"?window.innerWidth:window.innerHeight}function Ue(){let s=e.getBoundingClientRect(),u,T,J;if(g){let me=g.getBoundingClientRect();u=V==="x"?s.left-me.left+g.scrollLeft:s.top-me.top+g.scrollTop,T=V==="x"?s.width:s.height,J=Ie();}else u=V==="x"?s.left:s.top,T=V==="x"?s.width:s.height,J=Ie();let de=fe({top:u,height:T},J,je(),ge,m);Ee=de.tStart,Se=de.tEnd,ce&&process.env.NODE_ENV!=="production"&&(We?.remove(),We=Mt(Ee,Se,V));}function yt(s,u){if(e.style.setProperty("--scroll-draw-progress",String(s)),f){let T=u==="reverse"?1-s:s;e.style.clipPath=pe(T);return}ne.forEach((T,J)=>{T.style.strokeDashoffset=u==="reverse"?`${U[J]*s}`:`${U[J]*(1-s)}`,a&&(T.style.opacity=u==="reverse"?`${1-s}`:`${s}`),se&&_?T.style.stroke=Le(se,_,s):_&&(T.style.stroke=_),Q!==null&&ie!==null?T.style.strokeWidth=`${Q+(ie-Q)*s}`:ie!==null&&(T.style.strokeWidth=`${ie}`),q!==null&&j!==null?T.style.fillOpacity=`${q+(j-q)*s}`:j!==null&&(T.style.fillOpacity=`${j}`),P&&T.tagName.toLowerCase()==="path"&&he[J]&&T.setAttribute("d",Ge(he[J],P,s));});}function De(){if(e.style.setProperty("--scroll-draw-progress","0"),f){e.style.clipPath=pe(0);return}ne.forEach((s,u)=>{s.style.strokeDasharray=`${U[u]}`,s.style.strokeDashoffset=E==="reverse"?"0":`${U[u]}`,a?s.style.opacity=E==="reverse"?"1":"0":s.style.opacity="",se&&(s.style.stroke=se),Q!==null&&(s.style.strokeWidth=`${Q}`),q!==null&&(s.style.fillOpacity=`${q}`),P&&s.tagName.toLowerCase()==="path"&&he[u]&&s.setAttribute("d",he[u]);});}if(ne.forEach(s=>{At(s);let u=Ve(s);U.push(u),s.tagName.toLowerCase()==="path"?he.push(s.getAttribute("d")??""):he.push(""),o?(s.style.strokeDasharray=`${u}`,s.style.strokeDashoffset=E==="reverse"?`${u}`:"0",a&&(s.style.opacity="1"),_&&(s.style.stroke=_),ie!==null&&(s.style.strokeWidth=`${ie}`),j!==null&&(s.style.fillOpacity=`${j}`),P&&s.tagName.toLowerCase()==="path"&&s.setAttribute("d",P)):(s.style.strokeDasharray=`${u}`,s.style.strokeDashoffset=E==="reverse"?"0":`${u}`,a?s.style.opacity=E==="reverse"?"1":"0":s.style.opacity="",se&&(s.style.stroke=se),Q!==null&&(s.style.strokeWidth=`${Q}`),q!==null&&(s.style.fillOpacity=`${q}`));}),f){if(o)return e.style.clipPath=pe(1),y?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=pe(0);}else if(o)return y?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};function ht(){return !(ae===false||!Tt()||!ne.length||typeof p!="string"||!(p in tt)||f||V!=="y"||g||c!==1||k!==0||Z||S||A!==false||P||h||b||R>0||d||N||y||C!=null||$!=null||L!=null||(I.start??"top bottom").trim()!=="top bottom"||(I.end??"bottom top").trim()!=="bottom top")}function bt(){let s=`svg-scroll-draw-${++xt}`,u=E==="reverse"?"0":"var(--ssd-len)",T=E==="reverse"?"var(--ssd-len)":"0",J=`stroke-dashoffset:${u};`,de=`stroke-dashoffset:${T};`;a&&(J+=`opacity:${E==="reverse"?1:0};`,de+=`opacity:${E==="reverse"?0:1};`);let me=document.createElement("style");me.setAttribute("data-svg-scroll-draw",""),me.textContent=`@keyframes ${s}{from{${J}}to{${de}}}.${s}{animation-name:${s};animation-duration:auto;animation-timing-function:${tt[p]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(me);function x(v,F){v.style.setProperty("--ssd-len",String(U[F])),v.style.strokeDasharray=`${U[F]}`,v.style.strokeDashoffset="",v.style.opacity="",v.style.animationPlayState="",v.classList.add(s);}ne.forEach(x);let W=false,ee=-1;function O(){if(ee>=0)return ee;let v=e.getBoundingClientRect(),{tStart:F,tEnd:X}=fe({top:v.top,height:v.height},Ie(),je(),ge,m);return H(Y(Ie(),F,X,c))}return {destroy(){ne.forEach(v=>{v.classList.remove(s),v.style.removeProperty("--ssd-len"),v.style.animationPlayState="";}),me.remove();},replay(){W=false,ee=-1,ne.forEach(x);},pause(){W=true,ne.forEach(v=>{v.style.animationPlayState="paused";});},resume(){W&&(W=false,ne.forEach(v=>{v.style.animationPlayState="running";}));},seek(v){let F=Math.min(1,Math.max(0,v));ee=F,W=true,ne.forEach((X,Ce)=>{X.classList.remove(s),X.style.strokeDashoffset=E==="reverse"?`${U[Ce]*F}`:`${U[Ce]*(1-F)}`,a&&(X.style.opacity=E==="reverse"?`${1-F}`:`${F}`);});},getProgress(){return O()}}}if(ht())return bt();function wt(){let s=Math.max(1,K),u=0,T=0;function J(O){let v=true;if(f){let F=Math.min(1,Math.max(0,O/s)),X=H(F);Pe=X,e.style.setProperty("--scroll-draw-progress",String(X)),e.style.clipPath=pe(E==="reverse"?1-X:X),d?.(X),F<1&&(v=false);}else ne.forEach((F,X)=>{let Ce=X*k*s,$e=Math.min(1,Math.max(0,(O-Ce)/s)),we=H($e);F.style.strokeDashoffset=E==="reverse"?`${U[X]*we}`:`${U[X]*(1-we)}`,a&&(F.style.opacity=E==="reverse"?`${1-we}`:`${we}`),se&&_?F.style.stroke=Le(se,_,we):_&&(F.style.stroke=_),Q!==null&&ie!==null?F.style.strokeWidth=`${Q+(ie-Q)*we}`:ie!==null&&(F.style.strokeWidth=`${ie}`),q!==null&&j!==null?F.style.fillOpacity=`${q+(j-q)*we}`:j!==null&&(F.style.fillOpacity=`${j}`),P&&F.tagName.toLowerCase()==="path"&&he[X]&&F.setAttribute("d",Ge(he[X],P,we)),X===0&&(d?.(we),e.style.setProperty("--scroll-draw-progress",String(we))),$e<1&&(v=false);});if(h){let F=Math.min(1,Math.max(0,O/s)),X=H(F);for(let Ce in h){let $e=parseFloat(Ce);X>=$e&&!Te.has($e)&&(Te.add($e),h[Ce]?.());}}return v}function de(O){if(ue)return;let v=O-u;ye||(ye=true,N?.());let F=J(v);if(F&&!le){le=true,J(s*(1+Math.max(0,ne.length-1)*k)),y?.(),ve<(b==="infinite"?1/0:b??0)&&(ve++,xe=setTimeout(()=>{u=performance.now(),ye=false,le=false,Te.clear(),De(),oe=requestAnimationFrame(de);},D));return}F||(oe=requestAnimationFrame(de));}function me(){cancelAnimationFrame(oe),clearTimeout(xe),u=performance.now(),T=0,ue=false,ye=false,le=false,ve=0,Te.clear(),De(),oe=requestAnimationFrame(de);}let x=new IntersectionObserver(O=>{O.forEach(v=>{v.isIntersecting&&!(Z&&le)?me():!v.isIntersecting&&!Z&&!le&&(cancelAnimationFrame(oe),clearTimeout(xe),u=null);});},{root:g??null,threshold:M,rootMargin:w}),W;function ee(){clearTimeout(W),W=setTimeout(()=>{ne.forEach((O,v)=>{U[v]=Ve(O),O.style.strokeDasharray=`${U[v]}`;});},150);}return window.addEventListener("resize",ee),window.addEventListener("orientationchange",ee),R>0?setTimeout(()=>x.observe(e),R):x.observe(e),{destroy(){cancelAnimationFrame(oe),clearTimeout(xe),x.disconnect(),window.removeEventListener("resize",ee),window.removeEventListener("orientationchange",ee),clearTimeout(W);},replay(){ve=0,me();},pause(){ue||(ue=true,T=performance.now()-u,cancelAnimationFrame(oe));},resume(){ue&&(ue=false,u=performance.now()-T,oe=requestAnimationFrame(de));},seek(O){let v=Math.min(1,Math.max(0,O));Pe=v,ue=true,T=v*s,u=performance.now()-T,cancelAnimationFrame(oe),J(T);},getProgress(){return Pe}}}if(G)return wt();Ue();function He(){if(!ke||ue)return;let s=performance.now(),u=Ie(),T=c;if(A!==false){let x=s-Ye,W=x>0?Math.abs(u-(Ne<0?u:Ne))/x:0;T=c*Math.max(.2,1+W*(typeof A=="number"?A:1)*.04);}Ne=u,Ye=s;let J=S?Re===-1||u>=Re?"forward":"reverse":E;Re=u;let de=Se-Ee,me=true;if(f){let x=H(Y(u,Ee,Se,T));Z&&!S&&(be=Math.max(be,x),x=be),Pe=x,e.style.setProperty("--scroll-draw-progress",String(x));let W=J==="reverse"?1-x:x;e.style.clipPath=pe(W),d?.(x),!ye&&Y(u,Ee,Se,T)>0&&(ye=true,N?.()),x>=1&&!le?(le=true,y?.(),ve<(b==="infinite"?1/0:b??0)&&(ve++,xe=setTimeout(()=>{be=-1,ye=false,le=false,e.style.clipPath=pe(0);},D))):x<1&&!Z&&(le=false),oe=requestAnimationFrame(He);return}if(ne.forEach((x,W)=>{let ee=W*k*de,O=H(Y(u,Ee+ee,Se+ee,T));Z&&!S&&(be=Math.max(be,O),O=be),Pe=O,x.style.strokeDashoffset=J==="reverse"?`${U[W]*O}`:`${U[W]*(1-O)}`,a&&(x.style.opacity=J==="reverse"?`${1-O}`:`${O}`),se&&_?x.style.stroke=Le(se,_,O):_&&(x.style.stroke=_),Q!==null&&ie!==null?x.style.strokeWidth=`${Q+(ie-Q)*O}`:ie!==null&&(x.style.strokeWidth=`${ie}`),q!==null&&j!==null?x.style.fillOpacity=`${q+(j-q)*O}`:j!==null&&(x.style.fillOpacity=`${j}`),P&&x.tagName.toLowerCase()==="path"&&he[W]&&x.setAttribute("d",Ge(he[W],P,O)),W===0&&(d?.(O),e.style.setProperty("--scroll-draw-progress",String(O))),O<1&&(me=false);}),h){let x=H(Y(u,Ee,Se,T));for(let W in h){let ee=parseFloat(W);x>=ee&&!Te.has(ee)&&(Te.add(ee),h[W]?.());}}!ye&&Y(u,Ee,Se,T)>0&&(ye=true,N?.()),me&&!le?(le=true,y?.(),ve<(b==="infinite"?1/0:b??0)&&(ve++,xe=setTimeout(()=>{be=-1,ye=false,le=false,Te.clear(),De();},D))):!me&&!Z&&(le=false),oe=requestAnimationFrame(He);}let _e=new IntersectionObserver(s=>{s.forEach(u=>{ke=u.isIntersecting,ke&&!ue?oe=requestAnimationFrame(He):cancelAnimationFrame(oe);});},{root:g??null,threshold:M,rootMargin:w}),Be;function ze(){clearTimeout(Be),Be=setTimeout(()=>{ne.forEach((s,u)=>{U[u]=Ve(s),s.style.strokeDasharray=`${U[u]}`;}),Ue();},150);}return window.addEventListener("resize",ze),window.addEventListener("orientationchange",ze),R>0?setTimeout(()=>_e.observe(e),R):_e.observe(e),{destroy(){cancelAnimationFrame(oe),clearTimeout(xe),_e.disconnect(),window.removeEventListener("resize",ze),window.removeEventListener("orientationchange",ze),clearTimeout(Be),We?.remove();},replay(){be=-1,Re=-1,Ne=-1,ye=false,le=false,ve=0,ue=false,Te.clear(),clearTimeout(xe),De();},pause(){ue=true,cancelAnimationFrame(oe);},resume(){ue&&(ue=false,ke&&(oe=requestAnimationFrame(He)));},seek(s){let u=Math.min(1,Math.max(0,s));Pe=u,be=u,ue=true,cancelAnimationFrame(oe),yt(u,E);},getProgress(){return Pe}}}var nt=new Map;function Ae(e,n){nt.set(e,n);}function Me(e){nt.delete(e);}function Pt(e){return e.startsWith("#")||e.startsWith("rgb")||e.startsWith("hsl")}function ot(e){let n=[],r=/([\w]+)\(([^)]*)\)/g,t;for(;(t=r.exec(e))!==null;){let i=[],o=[],l=t[2].trim();if(l)for(let c of l.split(/[\s,]+/)){let a=c.match(/^([-+]?[\d.eE]+)(.*)$/);i.push(a?parseFloat(a[1]):0),o.push(a?a[2]:"");}n.push({fn:t[1],nums:i,units:o});}return n}function Ct(e,n,r){let t=ot(e),i=ot(n);return t.length===0||t.length!==i.length?r<1?e:n:t.map((o,l)=>{let c=i[l];return o.fn!==c.fn||o.nums.length!==c.nums.length?r<1?`${o.fn}(${o.nums.map((a,p)=>`${a}${o.units[p]}`).join(", ")})`:`${c.fn}(${c.nums.map((a,p)=>`${a}${c.units[p]}`).join(", ")})`:`${o.fn}(${o.nums.map((a,p)=>`${a+(c.nums[p]-a)*r}${o.units[p]}`).join(", ")})`}).join(" ")}function st(e,n,r){if(typeof e=="number"&&typeof n=="number")return String(e+(n-e)*r);let t=String(e),i=String(n);if(Pt(t))return Le(t,i,r);if(t.includes("("))return Ct(t,i,r);let o=t.match(/^([-+]?[\d.]+)(.*)$/),l=i.match(/^([-+]?[\d.]+)(.*)$/);if(o&&l){let c=parseFloat(o[1]),a=parseFloat(l[1]);return `${c+(a-c)*r}${o[2]||l[2]}`}return r<1?t:i}function $t(e){return e.replace(/([A-Z])/g,n=>`-${n.toLowerCase()}`)}var it={linear:"linear","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out"},Lt=new Set(["opacity","transform","background-color","color","filter","scale","translate","rotate"]),It=0;function Ot(){return typeof CSS<"u"&&typeof CSS.supports=="function"&&CSS.supports("animation-timeline: view()")}function at(e,n){let r={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return r;let{props:t,trigger:i={},easing:o="ease-out",speed:l=1,once:c=false,axis:a="y",scrollContainer:p,native:I=true,onProgress:k,onComplete:E}=n,Z=window.matchMedia("(prefers-reduced-motion: reduce)").matches,ce=typeof o=="function"?o:te[o]??te["ease-out"],V=re(i.start??"top bottom"),B=re(i.end??"bottom top"),S=typeof p=="string"?document.querySelector(p):p??null,R=Object.entries(t).map(([m,g])=>({prop:$t(m),from:Array.isArray(g)?g[0]:"",to:Array.isArray(g)?g[1]:g}));function C(){let m=window.getComputedStyle(e);for(let g of R)g.from===""&&(g.from=m.getPropertyValue(g.prop).trim()||"0");}function $(){for(let m of R)e.style.setProperty(m.prop,String(m.to));}if(Z)return $(),E?.(),r;C();function L(){if(!I||!Ot()||typeof o!="string"||!(o in it)||a!=="y"||S||c||l!==1||k||E||(i.start??"top bottom").trim()!=="top bottom"||(i.end??"bottom top").trim()!=="bottom top")return false;for(let m of R)if(!Lt.has(m.prop))return false;return true}function h(){let m=`ssd-a-${++It}`,g=R.map(q=>`${q.prop}:${q.from}`).join(";"),se=R.map(q=>`${q.prop}:${q.to}`).join(";"),_=document.createElement("style");_.setAttribute("data-ssd-animate",""),_.textContent=`@keyframes ${m}{from{${g}}to{${se}}}.${m}{animation-name:${m};animation-duration:auto;animation-timing-function:${it[o]};animation-fill-mode:both;animation-timeline:view();animation-range:cover 0% cover 100%;}`,document.head.appendChild(_),e.classList.add(m);let Q=()=>a==="x"?window.scrollX:window.scrollY,ie=()=>a==="x"?window.innerWidth:window.innerHeight;return {destroy(){e.classList.remove(m),_.remove();},replay(){e.classList.remove(m),e.offsetWidth,e.classList.add(m);},pause(){e.style.animationPlayState="paused";},resume(){e.style.animationPlayState="";},seek(q){let j=Math.min(1,Math.max(0,q));e.classList.remove(m);for(let pe of R)e.style.setProperty(pe.prop,st(pe.from,pe.to,j));},getProgress(){let q=e.getBoundingClientRect(),j=Q(),pe=ie(),{tStart:ne,tEnd:U}=fe({top:q.top,height:q.height},j,pe,V,B);return ce(Y(j,ne,U,l))}}}if(L())return h();let A=0,M=0,w=0,b=false,D=false,P=-1,z=0,G=false,K=()=>S?a==="x"?S.scrollLeft:S.scrollTop:a==="x"?window.scrollX:window.scrollY,ae=()=>S?a==="x"?S.clientWidth:S.clientHeight:a==="x"?window.innerWidth:window.innerHeight;function d(){let m=e.getBoundingClientRect(),g,se;if(S){let Q=S.getBoundingClientRect();g=a==="x"?m.left-Q.left+S.scrollLeft:m.top-Q.top+S.scrollTop,se=a==="x"?m.width:m.height;}else g=a==="x"?m.left:m.top,se=a==="x"?m.width:m.height;let _=fe({top:g,height:se},K(),ae(),V,B);A=_.tStart,M=_.tEnd;}function N(m){e.style.setProperty("--scroll-draw-progress",String(m));for(let g of R)e.style.setProperty(g.prop,st(g.from,g.to,m));k?.(m);}function y(){if(!b||D)return;let m=ce(Y(K(),A,M,l));c&&(P=Math.max(P,m),m=P),z=m,N(m),m>=1&&!G?(G=true,E?.()):m<1&&!c&&(G=false),w=requestAnimationFrame(y);}d();{let m=ce(Y(K(),A,M,l));c&&m>0&&(P=m),z=m,N(m);}let f=new IntersectionObserver(m=>{m.forEach(g=>{b=g.isIntersecting,b&&!D?w=requestAnimationFrame(y):cancelAnimationFrame(w);});},{root:S??null}),H;function ge(){clearTimeout(H),H=setTimeout(d,150);}return window.addEventListener("resize",ge),window.addEventListener("orientationchange",ge),f.observe(e),Ae(e,{type:"animate",getProgress:()=>z,getTrigger:()=>({tStart:A,tEnd:M})}),{destroy(){cancelAnimationFrame(w),f.disconnect(),window.removeEventListener("resize",ge),window.removeEventListener("orientationchange",ge),clearTimeout(H),Me(e);},replay(){P=-1,G=false,z=0,D=false,N(0);},pause(){D=true,cancelAnimationFrame(w);},resume(){D&&(D=false,b&&(w=requestAnimationFrame(y)));},seek(m){let g=Math.min(1,Math.max(0,m));z=g,P=g,D=true,cancelAnimationFrame(w),N(g);},getProgress(){return z}}}var Xe={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function lt(e,n){if(typeof window>"u")return Xe;let r=typeof e=="string"?document.querySelector(e):e;if(!r)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollCounter: element not found:",e),Xe;let t=r,{from:i=0,to:o,format:l,easing:c="ease-out",trigger:a={},once:p=true,decimals:I,onComplete:k}=n,E=I!==void 0?d=>d.toFixed(I):l??(d=>String(Math.round(d))),Z=typeof c=="function"?c:te[c]??te["ease-out"],ce=re(a.start??"top 80%"),V=re(a.end??"top 20%");if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return t.textContent=E(o),k?.(),Xe;t.textContent=E(i);let S=0,R=0,C=0,$=false,L=false,h=-1,A=0,M=false,w=()=>window.scrollY,b=()=>window.innerHeight;function D(){let d=t.getBoundingClientRect(),N=fe({top:d.top,height:d.height},w(),b(),ce,V);S=N.tStart,R=N.tEnd;}function P(d){t.textContent=E(i+(o-i)*d),t.style.setProperty("--scroll-draw-progress",String(d));}function z(){if(!$||L)return;let d=Z(Y(w(),S,R,1));p&&(h=Math.max(h,d),d=h),A=d,P(d),d>=1&&!M?(M=true,k?.()):d<1&&!p&&(M=false),C=requestAnimationFrame(z);}D();{let d=Z(Y(w(),S,R,1));p&&d>0&&(h=d),A=d,P(d);}let G=new IntersectionObserver(d=>{d.forEach(N=>{$=N.isIntersecting,$&&!L?C=requestAnimationFrame(z):cancelAnimationFrame(C);});}),K;function ae(){clearTimeout(K),K=setTimeout(D,150);}return window.addEventListener("resize",ae),window.addEventListener("orientationchange",ae),G.observe(t),Ae(t,{type:"counter",getProgress:()=>A,getTrigger:()=>({tStart:S,tEnd:R})}),{destroy(){cancelAnimationFrame(C),G.disconnect(),window.removeEventListener("resize",ae),window.removeEventListener("orientationchange",ae),clearTimeout(K),Me(t);},replay(){h=-1,M=false,A=0,L=false,P(0);},pause(){L=true,cancelAnimationFrame(C);},resume(){L&&(L=false,$&&(C=requestAnimationFrame(z)));},seek(d){let N=Math.min(1,Math.max(0,d));A=N,h=N,L=true,cancelAnimationFrame(C),P(N);},getProgress(){return A}}}var ct={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ut(e,n={}){if(typeof window>"u")return ct;let r=typeof e=="string"?document.querySelector(e):e;if(!r||r.tagName.toLowerCase()!=="video")return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollVideo: <video> element not found:",e),ct;let t=r,{trigger:i={},easing:o="linear",once:l=false,axis:c="y",preload:a="auto",onReady:p,onComplete:I,onProgress:k}=n,E=window.matchMedia("(prefers-reduced-motion: reduce)").matches,Z=typeof o=="function"?o:te[o]??te.linear,ce=re(i.start??"top top"),V=re(i.end??"bottom top");t.pause(),t.hasAttribute("preload")||(t.preload=a);let B=n.from??0,S=n.to,R=0,C=0,$=0,L=false,h=false,A=-1,M=0,w=false,b=false,D=()=>c==="x"?window.scrollX:window.scrollY,P=()=>c==="x"?window.innerWidth:window.innerHeight;function z(){let f=t.getBoundingClientRect(),H=c==="x"?f.left:f.top,ge=c==="x"?f.width:f.height,m=fe({top:H,height:ge},D(),P(),ce,V);R=m.tStart,C=m.tEnd;}function G(f){if(!b)return;let H=S??t.duration??0;t.currentTime=B+(H-B)*f,t.style.setProperty("--scroll-draw-progress",String(f)),k?.(f);}function K(){if(!L||h||!b)return;let f=Z(Y(D(),R,C,1));l&&(A=Math.max(A,f),f=A),M=f,G(f),f>=1&&!w?(w=true,I?.()):f<1&&!l&&(w=false),$=requestAnimationFrame(K);}function ae(){if(b=true,S===void 0&&(S=t.duration),E){G(1),p?.();return}z(),p?.(),L&&!h&&($=requestAnimationFrame(K));}t.readyState>=1?ae():t.addEventListener("loadedmetadata",ae,{once:true}),b||z();let d=new IntersectionObserver(f=>{f.forEach(H=>{L=H.isIntersecting,L&&!h&&b?$=requestAnimationFrame(K):cancelAnimationFrame($);});}),N;function y(){clearTimeout(N),N=setTimeout(z,150);}return window.addEventListener("resize",y),window.addEventListener("orientationchange",y),d.observe(t),Ae(t,{type:"video",getProgress:()=>M,getTrigger:()=>({tStart:R,tEnd:C})}),{destroy(){cancelAnimationFrame($),d.disconnect(),t.removeEventListener("loadedmetadata",ae),window.removeEventListener("resize",y),window.removeEventListener("orientationchange",y),clearTimeout(N),Me(t);},replay(){A=-1,w=false,M=0,h=false,G(0);},pause(){h=true,cancelAnimationFrame($);},resume(){h&&(h=false,L&&b&&($=requestAnimationFrame(K)));},seek(f){let H=Math.min(1,Math.max(0,f));M=H,A=H,h=true,cancelAnimationFrame($),G(H);},getProgress(){return M}}}function pt(e){let n=e.textContent??"";return e.textContent="",n.split(/(\s+)/).filter(Boolean).map(r=>{let t=document.createElement("span");return t.setAttribute("aria-hidden","true"),/^\s+$/.test(r)?(t.textContent=r,t.style.whiteSpace="pre"):(t.textContent=r,t.style.display="inline-block"),e.appendChild(t),/^\s+$/.test(r)?null:t}).filter(r=>r!==null)}function Ft(e){let n=e.textContent??"";return e.textContent="",n.split("").map(r=>{let t=document.createElement("span");return t.setAttribute("aria-hidden","true"),t.textContent=r,r===" "?t.style.whiteSpace="pre":t.style.display="inline-block",e.appendChild(t),r===" "?null:t}).filter(r=>r!==null)}function mt(e){let n=pt(e),r=new Map;for(let o of n){let l=o.offsetTop;r.has(l)||r.set(l,[]),r.get(l).push(o);}let t=[],i=Array.from(r.keys()).sort((o,l)=>o-l);for(let o of i){let l=r.get(o),c=document.createElement("span");c.setAttribute("aria-hidden","true"),c.style.display="inline-block";for(let a of l)c.appendChild(a);t.push(c);}e.textContent="";for(let o of t)e.appendChild(o),e.appendChild(document.createTextNode(" "));return t}function kt(e,n,r,t){if(r<=1||t===0)return e;let i=(r-1)*t,o=n*t,l=o+(1-i);return l<=o?e>=o?1:0:Math.min(1,Math.max(0,(e-o)/(l-o)))}function Rt(e,n){let r=[];if(n?.y!==void 0&&r.push(`translateY(${n.y*(1-e)}px)`),n?.x!==void 0&&r.push(`translateX(${n.x*(1-e)}px)`),n?.rotate!==void 0&&r.push(`rotate(${n.rotate*(1-e)}deg)`),n?.scale!==void 0){let t=n.scale+(1-n.scale)*e;r.push(`scale(${t})`);}return r.join(" ")||""}var ft={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function dt(e,n={}){if(typeof window>"u")return ft;let r=typeof e=="string"?document.querySelector(e):e;if(!r)return process.env.NODE_ENV!=="production"&&console.warn("[svg-scroll-draw] scrollText: element not found:",e),ft;let t=r,{split:i="words",stagger:o=.04,easing:l="ease-out",from:c={opacity:0,y:24},trigger:a={},once:p=true,onComplete:I}=n,k=window.matchMedia("(prefers-reduced-motion: reduce)").matches,E=typeof l=="function"?l:te[l]??te["ease-out"],Z=re(a.start??"top 85%"),ce=re(a.end??"top 40%"),V=t.innerHTML;t.setAttribute("aria-label",t.textContent??"");let B;i==="chars"?B=Ft(t):i==="lines"?B=mt(t):B=pt(t);let S=B.length;function R(y,f){c?.opacity!==void 0&&(y.style.opacity=String(c.opacity+(1-c.opacity)*f));let H=Rt(f,c);H&&(y.style.transform=H);}function C(y){t.style.setProperty("--scroll-draw-progress",String(y)),B.forEach((f,H)=>{let ge=E(kt(y,H,S,o));R(f,ge);});}if(k)return C(1),I?.(),{destroy(){t.innerHTML=V,t.removeAttribute("aria-label");},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};C(0);let $=0,L=0,h=0,A=false,M=false,w=-1,b=0,D=false,P=()=>window.scrollY,z=()=>window.innerHeight;function G(){let y=t.getBoundingClientRect(),f=fe({top:y.top,height:y.height},P(),z(),Z,ce);$=f.tStart,L=f.tEnd;}function K(){if(!A||M)return;let y=Y(P(),$,L,1);p&&(w=Math.max(w,y),y=w),b=y,C(y),y>=1&&!D?(D=true,I?.()):y<1&&!p&&(D=false),h=requestAnimationFrame(K);}G();let ae=new IntersectionObserver(y=>{y.forEach(f=>{A=f.isIntersecting,A&&!M?h=requestAnimationFrame(K):cancelAnimationFrame(h);});}),d;function N(){clearTimeout(d),d=setTimeout(()=>{if(i==="lines"){let y=b;t.innerHTML=V,t.setAttribute("aria-label",t.textContent??""),B=mt(t),C(y);}G();},150);}return window.addEventListener("resize",N),window.addEventListener("orientationchange",N),ae.observe(t),Ae(t,{type:"text",getProgress:()=>b,getTrigger:()=>({tStart:$,tEnd:L})}),{destroy(){cancelAnimationFrame(h),ae.disconnect(),window.removeEventListener("resize",N),window.removeEventListener("orientationchange",N),clearTimeout(d),t.innerHTML=V,t.removeAttribute("aria-label"),Me(t);},replay(){w=-1,D=false,b=0,M=false,C(0);},pause(){M=true,cancelAnimationFrame(h);},resume(){M&&(M=false,A&&(h=requestAnimationFrame(K)));},seek(y){let f=Math.min(1,Math.max(0,y));b=f,w=f,M=true,cancelAnimationFrame(h),C(f);},getProgress(){return b}}}function Ht(e,n={}){let[r,t]=useState(0),i=useRef(n);i.current=n;let o=useRef(-1);return useEffect(()=>{if(typeof window>"u")return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches){t(1);return}let l=typeof e=="string"?document.querySelector(e):e.current;if(!l)return;let c=l,{axis:a="y",scrollContainer:p,trigger:I={}}=i.current,k=typeof p=="string"?document.querySelector(p):p??null,E=re(I.start??"top bottom"),Z=re(I.end??"bottom top"),ce=0,V=0,B=false,S=0;function R(){return k?a==="x"?k.scrollLeft:k.scrollTop:a==="x"?window.scrollX:window.scrollY}function C(){return k?a==="x"?k.clientWidth:k.clientHeight:a==="x"?window.innerWidth:window.innerHeight}function $(){let w=c.getBoundingClientRect(),b=R(),D=a==="x"?w.left:w.top,P=a==="x"?w.width:w.height,z=fe({top:D,height:P},b,C(),E,Z);ce=z.tStart,V=z.tEnd;}function L(){if(!B)return;let{speed:w=1,easing:b="linear",once:D=false}=i.current,P=typeof b=="function"?b:te[b]??te.linear,z=Y(R(),ce,V,w),G=P(z);D&&(o.current=Math.max(o.current,G),G=o.current),t(G),S=requestAnimationFrame(L);}let h=new IntersectionObserver(w=>{w.forEach(b=>{B=b.isIntersecting,B?S=requestAnimationFrame(L):cancelAnimationFrame(S);});},{root:k??null,threshold:0});$(),h.observe(c);let A;function M(){clearTimeout(A),A=setTimeout($,150);}return window.addEventListener("resize",M),window.addEventListener("orientationchange",M),()=>{cancelAnimationFrame(S),clearTimeout(A),h.disconnect(),window.removeEventListener("resize",M),window.removeEventListener("orientationchange",M);}},[]),r}function pr({children:e,className:n,style:r,...t}){let i=useRef(null);return useEffect(()=>{if(!i.current)return;let o=rt(i.current,t);return ()=>o.destroy()},[]),jsx("div",{ref:i,className:n,style:r,children:e})}function dr({children:e,className:n,style:r,...t}){let i=useRef(null);return useEffect(()=>{if(!i.current)return;let o=at(i.current,t);return ()=>o.destroy()},[]),jsx("div",{ref:i,className:n,style:r,children:e})}function gr({className:e,style:n,...r}){let t=useRef(null);return useEffect(()=>{if(!t.current)return;let i=lt(t.current,r);return ()=>i.destroy()},[]),jsx("span",{ref:t,className:e,style:n})}function yr({src:e,className:n,style:r,muted:t=true,playsInline:i=true,...o}){let l=useRef(null);return useEffect(()=>{if(!l.current)return;let c=ut(l.current,o);return ()=>c.destroy()},[]),jsx("video",{ref:l,src:e,className:n,style:r,muted:t,playsInline:i,preload:"auto"})}function hr({children:e,as:n="p",className:r,style:t,...i}){let o=useRef(null);return useEffect(()=>{if(!o.current)return;let l=dt(o.current,i);return ()=>l.destroy()},[]),zt.createElement(n,{ref:o,className:r,style:t},e)}export{dr as ScrollAnimate,gr as ScrollCounter,pr as ScrollDraw,hr as ScrollText,yr as ScrollVideo,Ht as useScrollDrawProgress};
@@ -0,0 +1 @@
1
+ 'use strict';function Q({bounces:e=3,decay:r=.5}={}){let n=Math.max(1,Math.round(e)),t=Math.max(.01,Math.min(.99,r)),c=Math.sqrt(t),o=0,i=[];for(let u=0;u<n;u++){let l=Math.pow(c,u);i.push(l),o+=l;}let a=[0],m=0;for(let u=0;u<n;u++)m+=i[u]/o,a.push(m);return u=>{if(u<=0)return 0;if(u>=1)return 1;for(let l=0;l<n;l++)if(u<=a[l+1]){let b=(u-a[l])/(a[l+1]-a[l]);if(l===0)return b*(2-b);let w=1-Math.pow(t,l);return w+(1-w)*(2*b-1)*(2*b-1)}return 1}}function Y({amplitude:e=1,period:r=.4}={}){let n=Math.max(1,e),t=Math.max(.1,r),c=n<=1?t/4:t/(2*Math.PI)*Math.asin(1/n);return o=>o<=0?0:o>=1?1:n*Math.pow(2,-10*o)*Math.sin((o-c)*(2*Math.PI)/t)+1}var P={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:Q(),elastic:Y()};function $(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 N(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 O(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 Z(e,r,n){return Math.min(n,Math.max(r,e))}function _(e,r,n,t){return n===r?0:Z((e-r)/(n-r)*t,0,1)}function q(e,r,n,t,c){let o=N(e.top,e.height,r,t.element)-O(t.viewport,n),i=N(e.top,e.height,r,c.element)-O(c.viewport,n);return {tStart:o,tEnd:i}}var z=new Map;function D(e,r){z.set(e,r);}function G(e){z.delete(e);}function V(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 ee(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 k(e){let r=V(e),n=new Map;for(let o of r){let i=o.offsetTop;n.has(i)||n.set(i,[]),n.get(i).push(o);}let t=[],c=Array.from(n.keys()).sort((o,i)=>o-i);for(let o of c){let i=n.get(o),a=document.createElement("span");a.setAttribute("aria-hidden","true"),a.style.display="inline-block";for(let m of i)a.appendChild(m);t.push(a);}e.textContent="";for(let o of t)e.appendChild(o),e.appendChild(document.createTextNode(" "));return t}function te(e,r,n,t){if(n<=1||t===0)return e;let c=(n-1)*t,o=r*t,i=o+(1-c);return i<=o?e>=o?1:0:Math.min(1,Math.max(0,(e-o)/(i-o)))}function ne(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 B={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ae(e,r={}){if(typeof window>"u")return B;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),B;let t=n,{split:c="words",stagger:o=.04,easing:i="ease-out",from:a={opacity:0,y:24},trigger:m={},once:u=true,onComplete:l}=r,b=window.matchMedia("(prefers-reduced-motion: reduce)").matches,w=typeof i=="function"?i:P[i]??P["ease-out"],W=$(m.start??"top 85%"),j=$(m.end??"top 40%"),v=t.innerHTML;t.setAttribute("aria-label",t.textContent??"");let g;c==="chars"?g=ee(t):c==="lines"?g=k(t):g=V(t);let U=g.length;function X(s,p){a?.opacity!==void 0&&(s.style.opacity=String(a.opacity+(1-a.opacity)*p));let S=ne(p,a);S&&(s.style.transform=S);}function h(s){t.style.setProperty("--scroll-draw-progress",String(s)),g.forEach((p,S)=>{let K=w(te(s,S,U,o));X(p,K);});}if(b)return h(1),l?.(),{destroy(){t.innerHTML=v,t.removeAttribute("aria-label");},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};h(0);let I=0,A=0,d=0,M=false,f=false,x=-1,y=0,E=false,F=()=>window.scrollY,J=()=>window.innerHeight;function H(){let s=t.getBoundingClientRect(),p=q({top:s.top,height:s.height},F(),J(),W,j);I=p.tStart,A=p.tEnd;}function C(){if(!M||f)return;let s=_(F(),I,A,1);u&&(x=Math.max(x,s),s=x),y=s,h(s),s>=1&&!E?(E=true,l?.()):s<1&&!u&&(E=false),d=requestAnimationFrame(C);}H();let R=new IntersectionObserver(s=>{s.forEach(p=>{M=p.isIntersecting,M&&!f?d=requestAnimationFrame(C):cancelAnimationFrame(d);});}),L;function T(){clearTimeout(L),L=setTimeout(()=>{if(c==="lines"){let s=y;t.innerHTML=v,t.setAttribute("aria-label",t.textContent??""),g=k(t),h(s);}H();},150);}return window.addEventListener("resize",T),window.addEventListener("orientationchange",T),R.observe(t),D(t,{type:"text",getProgress:()=>y,getTrigger:()=>({tStart:I,tEnd:A})}),{destroy(){cancelAnimationFrame(d),R.disconnect(),window.removeEventListener("resize",T),window.removeEventListener("orientationchange",T),clearTimeout(L),t.innerHTML=v,t.removeAttribute("aria-label"),G(t);},replay(){x=-1,E=false,y=0,f=false,h(0);},pause(){f=true,cancelAnimationFrame(d);},resume(){f&&(f=false,M&&(d=requestAnimationFrame(C)));},seek(s){let p=Math.min(1,Math.max(0,s));y=p,x=p,f=true,cancelAnimationFrame(d),h(p);},getProgress(){return y}}}exports.scrollText=ae;
@@ -0,0 +1,37 @@
1
+ type EasingName = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | 'bounce' | 'elastic';
2
+ interface TriggerConfig {
3
+ start?: string;
4
+ end?: string;
5
+ }
6
+ interface ScrollDrawInstance {
7
+ destroy: () => void;
8
+ /** Reset and replay the animation from the beginning. */
9
+ replay: () => void;
10
+ /** Pause the animation at the current progress. */
11
+ pause: () => void;
12
+ /** Resume a paused animation. */
13
+ resume: () => void;
14
+ /** Jump to a specific progress value (0–1) and pause. */
15
+ seek: (progress: number) => void;
16
+ /** Returns current draw progress (0–1). */
17
+ getProgress: () => number;
18
+ }
19
+
20
+ interface ScrollTextOptions {
21
+ split?: 'chars' | 'words' | 'lines';
22
+ stagger?: number;
23
+ easing?: EasingName | ((t: number) => number);
24
+ from?: {
25
+ opacity?: number;
26
+ y?: number;
27
+ x?: number;
28
+ rotate?: number;
29
+ scale?: number;
30
+ };
31
+ trigger?: TriggerConfig;
32
+ once?: boolean;
33
+ onComplete?: () => void;
34
+ }
35
+ declare function scrollText(target: string | Element, options?: ScrollTextOptions): ScrollDrawInstance;
36
+
37
+ export { type ScrollTextOptions, scrollText };
@@ -0,0 +1,37 @@
1
+ type EasingName = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | 'bounce' | 'elastic';
2
+ interface TriggerConfig {
3
+ start?: string;
4
+ end?: string;
5
+ }
6
+ interface ScrollDrawInstance {
7
+ destroy: () => void;
8
+ /** Reset and replay the animation from the beginning. */
9
+ replay: () => void;
10
+ /** Pause the animation at the current progress. */
11
+ pause: () => void;
12
+ /** Resume a paused animation. */
13
+ resume: () => void;
14
+ /** Jump to a specific progress value (0–1) and pause. */
15
+ seek: (progress: number) => void;
16
+ /** Returns current draw progress (0–1). */
17
+ getProgress: () => number;
18
+ }
19
+
20
+ interface ScrollTextOptions {
21
+ split?: 'chars' | 'words' | 'lines';
22
+ stagger?: number;
23
+ easing?: EasingName | ((t: number) => number);
24
+ from?: {
25
+ opacity?: number;
26
+ y?: number;
27
+ x?: number;
28
+ rotate?: number;
29
+ scale?: number;
30
+ };
31
+ trigger?: TriggerConfig;
32
+ once?: boolean;
33
+ onComplete?: () => void;
34
+ }
35
+ declare function scrollText(target: string | Element, options?: ScrollTextOptions): ScrollDrawInstance;
36
+
37
+ export { type ScrollTextOptions, scrollText };
@@ -0,0 +1 @@
1
+ function Q({bounces:e=3,decay:r=.5}={}){let n=Math.max(1,Math.round(e)),t=Math.max(.01,Math.min(.99,r)),c=Math.sqrt(t),o=0,i=[];for(let u=0;u<n;u++){let l=Math.pow(c,u);i.push(l),o+=l;}let a=[0],m=0;for(let u=0;u<n;u++)m+=i[u]/o,a.push(m);return u=>{if(u<=0)return 0;if(u>=1)return 1;for(let l=0;l<n;l++)if(u<=a[l+1]){let b=(u-a[l])/(a[l+1]-a[l]);if(l===0)return b*(2-b);let w=1-Math.pow(t,l);return w+(1-w)*(2*b-1)*(2*b-1)}return 1}}function Y({amplitude:e=1,period:r=.4}={}){let n=Math.max(1,e),t=Math.max(.1,r),c=n<=1?t/4:t/(2*Math.PI)*Math.asin(1/n);return o=>o<=0?0:o>=1?1:n*Math.pow(2,-10*o)*Math.sin((o-c)*(2*Math.PI)/t)+1}var P={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:Q(),elastic:Y()};function $(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 N(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 O(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 Z(e,r,n){return Math.min(n,Math.max(r,e))}function _(e,r,n,t){return n===r?0:Z((e-r)/(n-r)*t,0,1)}function q(e,r,n,t,c){let o=N(e.top,e.height,r,t.element)-O(t.viewport,n),i=N(e.top,e.height,r,c.element)-O(c.viewport,n);return {tStart:o,tEnd:i}}var z=new Map;function D(e,r){z.set(e,r);}function G(e){z.delete(e);}function V(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 ee(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 k(e){let r=V(e),n=new Map;for(let o of r){let i=o.offsetTop;n.has(i)||n.set(i,[]),n.get(i).push(o);}let t=[],c=Array.from(n.keys()).sort((o,i)=>o-i);for(let o of c){let i=n.get(o),a=document.createElement("span");a.setAttribute("aria-hidden","true"),a.style.display="inline-block";for(let m of i)a.appendChild(m);t.push(a);}e.textContent="";for(let o of t)e.appendChild(o),e.appendChild(document.createTextNode(" "));return t}function te(e,r,n,t){if(n<=1||t===0)return e;let c=(n-1)*t,o=r*t,i=o+(1-c);return i<=o?e>=o?1:0:Math.min(1,Math.max(0,(e-o)/(i-o)))}function ne(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 B={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ae(e,r={}){if(typeof window>"u")return B;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),B;let t=n,{split:c="words",stagger:o=.04,easing:i="ease-out",from:a={opacity:0,y:24},trigger:m={},once:u=true,onComplete:l}=r,b=window.matchMedia("(prefers-reduced-motion: reduce)").matches,w=typeof i=="function"?i:P[i]??P["ease-out"],W=$(m.start??"top 85%"),j=$(m.end??"top 40%"),v=t.innerHTML;t.setAttribute("aria-label",t.textContent??"");let g;c==="chars"?g=ee(t):c==="lines"?g=k(t):g=V(t);let U=g.length;function X(s,p){a?.opacity!==void 0&&(s.style.opacity=String(a.opacity+(1-a.opacity)*p));let S=ne(p,a);S&&(s.style.transform=S);}function h(s){t.style.setProperty("--scroll-draw-progress",String(s)),g.forEach((p,S)=>{let K=w(te(s,S,U,o));X(p,K);});}if(b)return h(1),l?.(),{destroy(){t.innerHTML=v,t.removeAttribute("aria-label");},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};h(0);let I=0,A=0,d=0,M=false,f=false,x=-1,y=0,E=false,F=()=>window.scrollY,J=()=>window.innerHeight;function H(){let s=t.getBoundingClientRect(),p=q({top:s.top,height:s.height},F(),J(),W,j);I=p.tStart,A=p.tEnd;}function C(){if(!M||f)return;let s=_(F(),I,A,1);u&&(x=Math.max(x,s),s=x),y=s,h(s),s>=1&&!E?(E=true,l?.()):s<1&&!u&&(E=false),d=requestAnimationFrame(C);}H();let R=new IntersectionObserver(s=>{s.forEach(p=>{M=p.isIntersecting,M&&!f?d=requestAnimationFrame(C):cancelAnimationFrame(d);});}),L;function T(){clearTimeout(L),L=setTimeout(()=>{if(c==="lines"){let s=y;t.innerHTML=v,t.setAttribute("aria-label",t.textContent??""),g=k(t),h(s);}H();},150);}return window.addEventListener("resize",T),window.addEventListener("orientationchange",T),R.observe(t),D(t,{type:"text",getProgress:()=>y,getTrigger:()=>({tStart:I,tEnd:A})}),{destroy(){cancelAnimationFrame(d),R.disconnect(),window.removeEventListener("resize",T),window.removeEventListener("orientationchange",T),clearTimeout(L),t.innerHTML=v,t.removeAttribute("aria-label"),G(t);},replay(){x=-1,E=false,y=0,f=false,h(0);},pause(){f=true,cancelAnimationFrame(d);},resume(){f&&(f=false,M&&(d=requestAnimationFrame(C)));},seek(s){let p=Math.min(1,Math.max(0,s));y=p,x=p,f=true,cancelAnimationFrame(d),h(p);},getProgress(){return y}}}export{ae as scrollText};
@@ -1,13 +1,13 @@
1
- 'use strict';function ie({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),o=Math.max(.01,Math.min(.99,n)),p=Math.sqrt(o),m=0,y=[];for(let a=0;a<r;a++){let c=Math.pow(p,a);y.push(c),m+=c;}let d=[0],h=0;for(let a=0;a<r;a++)h+=y[a]/m,d.push(h);return a=>{if(a<=0)return 0;if(a>=1)return 1;for(let c=0;c<r;c++)if(a<=d[c+1]){let f=(a-d[c])/(d[c+1]-d[c]);if(c===0)return f*(2-f);let T=1-Math.pow(o,c);return T+(1-T)*(2*f-1)*(2*f-1)}return 1}}function se({amplitude:e=1,period:n=.4}={}){let r=Math.max(1,e),o=Math.max(.1,n),p=r<=1?o/4:o/(2*Math.PI)*Math.asin(1/r);return m=>m<=0?0:m>=1?1:r*Math.pow(2,-10*m)*Math.sin((m-p)*(2*Math.PI)/o)+1}var R={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:ie(),elastic:se()};function G(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[r="top",o="bottom"]=n.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function X(e,n,r,o){switch(o){case "top":return e+r;case "center":return e+r+n/2;case "bottom":return e+r+n;default:return e+r}}function _(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 q(e){let n=e.tagName.toLowerCase();if(n==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(n==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function ae(e,n,r){return Math.min(r,Math.max(n,e))}function J(e,n,r,o){return r===n?0:ae((e-n)/(r-n)*o,0,1)}function K(e,n,r,o,p){let m=X(e.top,e.height,n,o.element)-_(o.viewport,r),y=X(e.top,e.height,n,p.element)-_(p.viewport,r);return {tStart:m,tEnd:y}}var Q=["#ff90e8","#ffc900","#5865F2","#22c55e","#f59e0b","#ef4444","#aaa","#60a5fa"];function ce(e,n){let r={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return r;let o=typeof e=="string"?document.querySelector(e):e;if(!o)return console.warn("[svg-scroll-draw/timeline] Container not found:",e),r;let p=o,{trigger:m={},speed:y=1,once:d=false,axis:h="y",tracks:a,onComplete:c,repeat:f,repeatDelay:T=0,debug:Z=false,label:Y}=n,ee=G(m.start??"top bottom"),te=G(m.end??"bottom top"),I=f==="infinite"?1/0:f??0,k,L=a.map(t=>{let u=typeof t.easing=="function"?t.easing:R[t.easing??"linear"]??R.linear,l=Array.from(p.querySelectorAll(t.selector)),s=l.map(i=>q(i));return l.forEach((i,b)=>{i.style.strokeDasharray=`${s[b]}`,i.style.strokeDashoffset=`${s[b]}`,t.fade&&(i.style.opacity="0");}),{...t,elements:l,lengths:s,easeFn:u}}),O=0,N=0,$=false,x=false,w=0,S=false,M=-1,E=0,g=null;Z&&(g=document.createElement("div"),Object.assign(g.style,{position:"fixed",bottom:"16px",left:"16px",zIndex:"9999",background:"rgba(0,0,0,0.88)",backdropFilter:"blur(8px)",border:"1px solid rgba(255,255,255,0.1)",borderRadius:"10px",padding:"10px 14px",fontFamily:"monospace",fontSize:"11px",color:"#fff",minWidth:"240px",pointerEvents:"none",lineHeight:"1.4"}),document.body.appendChild(g));function ne(t){if(!g)return;let u=Y??(typeof e=="string"?e:"timeline"),l=a.map(({selector:s,from:i,to:b},C)=>{let v=Q[C%Q.length],A=b>i?Math.min(1,Math.max(0,(t-i)/(b-i))):0,F=Math.round(A*100);return `<div style="margin:4px 0">
1
+ 'use strict';function pe({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),o=Math.max(.01,Math.min(.99,n)),p=Math.sqrt(o),m=0,M=[];for(let a=0;a<r;a++){let c=Math.pow(p,a);M.push(c),m+=c;}let d=[0],x=0;for(let a=0;a<r;a++)x+=M[a]/m,d.push(x);return a=>{if(a<=0)return 0;if(a>=1)return 1;for(let c=0;c<r;c++)if(a<=d[c+1]){let b=(a-d[c])/(d[c+1]-d[c]);if(c===0)return b*(2-b);let E=1-Math.pow(o,c);return E+(1-E)*(2*b-1)*(2*b-1)}return 1}}function me({amplitude:e=1,period:n=.4}={}){let r=Math.max(1,e),o=Math.max(.1,n),p=r<=1?o/4:o/(2*Math.PI)*Math.asin(1/r);return m=>m<=0?0:m>=1?1:r*Math.pow(2,-10*m)*Math.sin((m-p)*(2*Math.PI)/o)+1}var B={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:pe(),elastic:me()};function V(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[r="top",o="bottom"]=n.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function Z(e,n,r,o){switch(o){case "top":return e+r;case "center":return e+r+n/2;case "bottom":return e+r+n;default:return e+r}}function Y(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 W(e){let n=e.tagName.toLowerCase();if(n==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(n==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function fe(e,n,r){return Math.min(r,Math.max(n,e))}function ee(e,n,r,o){return r===n?0:fe((e-n)/(r-n)*o,0,1)}function te(e,n,r,o,p){let m=Z(e.top,e.height,n,o.element)-Y(o.viewport,r),M=Z(e.top,e.height,n,p.element)-Y(p.viewport,r);return {tStart:m,tEnd:M}}var ne=["#ff90e8","#ffc900","#5865F2","#22c55e","#f59e0b","#ef4444","#aaa","#60a5fa"];function ge(e,n){let r={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return r;let o=typeof e=="string"?document.querySelector(e):e;if(!o)return console.warn("[svg-scroll-draw/timeline] Container not found:",e),r;let p=o,{trigger:m={},speed:M=1,once:d=false,axis:x="y",tracks:a,onComplete:c,repeat:b,repeatDelay:E=0,loop:R=false,loopDuration:re=1500,debug:oe=false,label:ie}=n,se=V(m.start??"top bottom"),ae=V(m.end??"bottom top"),A=b==="infinite"?1/0:b??0,f,L=R===true?1/0:typeof R=="number"?R:0,h=false,G=0,T=L,q=a.map(t=>{let u=typeof t.easing=="function"?t.easing:B[t.easing??"linear"]??B.linear,l=Array.from(p.querySelectorAll(t.selector)),s=l.map(i=>W(i));return l.forEach((i,g)=>{i.style.strokeDasharray=`${s[g]}`,i.style.strokeDashoffset=`${s[g]}`,t.fade&&(i.style.opacity="0");}),{...t,elements:l,lengths:s,easeFn:u}}),H=0,U=0,F=false,y=false,v=0,S=false,D=-1,I=0,w=null;oe&&(w=document.createElement("div"),Object.assign(w.style,{position:"fixed",bottom:"16px",left:"16px",zIndex:"9999",background:"rgba(0,0,0,0.88)",backdropFilter:"blur(8px)",border:"1px solid rgba(255,255,255,0.1)",borderRadius:"10px",padding:"10px 14px",fontFamily:"monospace",fontSize:"11px",color:"#fff",minWidth:"240px",pointerEvents:"none",lineHeight:"1.4"}),document.body.appendChild(w));function ue(t){if(!w)return;let u=ie??(typeof e=="string"?e:"timeline"),l=a.map(({selector:s,from:i,to:g},j)=>{let $=ne[j%ne.length],z=g>i?Math.min(1,Math.max(0,(t-i)/(g-i))):0,C=Math.round(z*100);return `<div style="margin:4px 0">
2
2
  <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:2px">
3
- <span style="color:${v};max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${s}</span>
4
- <span style="color:#666;margin-left:8px">${F}%</span>
3
+ <span style="color:${$};max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${s}</span>
4
+ <span style="color:#666;margin-left:8px">${C}%</span>
5
5
  </div>
6
6
  <div style="height:3px;background:#2a2a2a;border-radius:2px;position:relative;overflow:hidden">
7
- <div style="position:absolute;left:${i*100}%;width:${(b-i)*100}%;height:100%;background:${v}33;border-radius:2px"></div>
8
- <div style="position:absolute;left:${i*100}%;width:${(b-i)*A*100}%;height:100%;background:${v};border-radius:2px;transition:width 0.05s linear"></div>
7
+ <div style="position:absolute;left:${i*100}%;width:${(g-i)*100}%;height:100%;background:${$}33;border-radius:2px"></div>
8
+ <div style="position:absolute;left:${i*100}%;width:${(g-i)*z*100}%;height:100%;background:${$};border-radius:2px;transition:width 0.05s linear"></div>
9
9
  </div>
10
- </div>`}).join("");g.innerHTML=`
10
+ </div>`}).join("");w.innerHTML=`
11
11
  <div style="color:#555;margin-bottom:8px;font-size:10px;text-transform:uppercase;letter-spacing:0.12em;border-bottom:1px solid rgba(255,255,255,0.06);padding-bottom:6px">
12
12
  scrollDrawTimeline \xB7 ${u}
13
13
  </div>
@@ -20,4 +20,4 @@
20
20
  <div style="height:2px;background:#2a2a2a;border-radius:1px;overflow:hidden">
21
21
  <div style="height:100%;background:#fff;border-radius:1px;width:${t*100}%;transition:width 0.05s linear"></div>
22
22
  </div>
23
- </div>`;}function j(){return h==="x"?window.scrollX:window.scrollY}function re(){return h==="x"?window.innerWidth:window.innerHeight}function B(){let t=p.getBoundingClientRect(),u=j(),l=h==="x"?t.left:t.top,s=h==="x"?t.width:t.height,i=K({top:l,height:s},u,re(),ee,te);O=i.tStart,N=i.tEnd;}function V(t){p.style.setProperty("--scroll-draw-progress",String(t)),L.forEach(({elements:u,lengths:l,from:s,to:i,easeFn:b,fade:C})=>{let v=i-s,A=v>0?Math.min(1,Math.max(0,(t-s)/v)):0,F=b(A);u.forEach((U,oe)=>{U.style.strokeDashoffset=`${l[oe]*(1-F)}`,C&&(U.style.opacity=String(F));});}),ne(t);}function W(){M=-1,S=false,L.forEach(({elements:t,lengths:u,fade:l})=>{t.forEach((s,i)=>{s.style.strokeDashoffset=`${u[i]}`,l&&(s.style.opacity="0");});}),p.style.setProperty("--scroll-draw-progress","0");}function P(){if(!$||x)return;let t=J(j(),O,N,y);d&&(M=Math.max(M,t),t=M),E=t,V(t),t>=1&&!S?(S=true,c?.(),I>0&&d&&(k=setTimeout(()=>{I!==1/0&&I--,W();},T))):t<1&&!d&&(S=false),w=requestAnimationFrame(P);}B();let H=new IntersectionObserver(t=>{t.forEach(u=>{$=u.isIntersecting,$&&!x?w=requestAnimationFrame(P):cancelAnimationFrame(w);});},{threshold:0});H.observe(p);let z;function D(){clearTimeout(z),z=setTimeout(()=>{L.forEach(({elements:t,lengths:u})=>{t.forEach((l,s)=>{u[s]=q(l),l.style.strokeDasharray=`${u[s]}`;});}),B();},150);}return window.addEventListener("resize",D),window.addEventListener("orientationchange",D),{destroy(){cancelAnimationFrame(w),clearTimeout(z),clearTimeout(k),H.disconnect(),window.removeEventListener("resize",D),window.removeEventListener("orientationchange",D),g&&(g.remove(),g=null);},replay(){I=f==="infinite"?1/0:f??0,clearTimeout(k),W(),x=false;},pause(){x=true,cancelAnimationFrame(w);},resume(){x&&(x=false,$&&(w=requestAnimationFrame(P)));},seek(t){E=Math.min(1,Math.max(0,t)),M=E,x=true,cancelAnimationFrame(w),V(E);},getProgress(){return E}}}exports.scrollDrawTimeline=ce;
23
+ </div>`;}function X(){return x==="x"?window.scrollX:window.scrollY}function le(){return x==="x"?window.innerWidth:window.innerHeight}function _(){let t=p.getBoundingClientRect(),u=X(),l=x==="x"?t.left:t.top,s=x==="x"?t.width:t.height,i=te({top:l,height:s},u,le(),se,ae);H=i.tStart,U=i.tEnd;}function J(t){p.style.setProperty("--scroll-draw-progress",String(t)),q.forEach(({elements:u,lengths:l,from:s,to:i,easeFn:g,fade:j})=>{let $=i-s,z=$>0?Math.min(1,Math.max(0,(t-s)/$)):0,C=g(z);u.forEach((Q,ce)=>{Q.style.strokeDashoffset=`${l[ce]*(1-C)}`,j&&(Q.style.opacity=String(C));});}),ue(t);}function k(){D=-1,I=0,S=false,q.forEach(({elements:t,lengths:u,fade:l})=>{t.forEach((s,i)=>{s.style.strokeDashoffset=`${u[i]}`,l&&(s.style.opacity="0");});}),p.style.setProperty("--scroll-draw-progress","0");}function O(){if(!F||y)return;let t;h?t=Math.min(1,(performance.now()-G)/re):(t=ee(X(),H,U,M),(d||L>0)&&(D=Math.max(D,t),t=D)),I=t,J(t),t>=1&&!S?(S=true,c?.(),L>0&&!h&&!f?f=setTimeout(()=>{f=void 0,T!==1/0&&T--,k(),h=true,G=performance.now();},E):A>0&&d&&!h&&!f&&(f=setTimeout(()=>{f=void 0,A!==1/0&&A--,k();},E))):!h&&t<1&&!d&&(S=false),h&&t>=1&&!f&&(S=false,T>0?f=setTimeout(()=>{f=void 0,T!==1/0&&T--,k(),G=performance.now();},E):h=false),v=requestAnimationFrame(O);}_();let K=new IntersectionObserver(t=>{t.forEach(u=>{F=u.isIntersecting,F&&!y?v=requestAnimationFrame(O):cancelAnimationFrame(v);});},{threshold:0});K.observe(p);let N;function P(){clearTimeout(N),N=setTimeout(()=>{q.forEach(({elements:t,lengths:u})=>{t.forEach((l,s)=>{u[s]=W(l),l.style.strokeDasharray=`${u[s]}`;});}),_();},150);}return window.addEventListener("resize",P),window.addEventListener("orientationchange",P),{destroy(){cancelAnimationFrame(v),clearTimeout(N),clearTimeout(f),K.disconnect(),window.removeEventListener("resize",P),window.removeEventListener("orientationchange",P),w&&(w.remove(),w=null);},replay(){A=b==="infinite"?1/0:b??0,T=L,h=false,clearTimeout(f),f=void 0,k(),y=false;},pause(){y=true,cancelAnimationFrame(v);},resume(){y&&(y=false,F&&(v=requestAnimationFrame(O)));},seek(t){I=Math.min(1,Math.max(0,t)),D=I,y=true,cancelAnimationFrame(v),J(I);},getProgress(){return I}}}exports.scrollDrawTimeline=ge;
@@ -50,6 +50,17 @@ interface ScrollDrawTimelineOptions {
50
50
  repeat?: number | 'infinite';
51
51
  /** Milliseconds to wait before each repeat. Default 0. */
52
52
  repeatDelay?: number;
53
+ /**
54
+ * After the scroll-driven animation completes, automatically replay the full
55
+ * timeline as a time-driven loop — no further scroll input needed. Use `true`
56
+ * to loop infinitely or a number to loop N additional times.
57
+ *
58
+ * Each iteration plays over `loopDuration` milliseconds, then waits
59
+ * `repeatDelay` before the next iteration begins.
60
+ */
61
+ loop?: boolean | number;
62
+ /** Duration of each time-driven loop iteration in milliseconds. Default 1500. */
63
+ loopDuration?: number;
53
64
  /**
54
65
  * Show a developer overlay panel visualising each track's window and live
55
66
  * fill progress. Injected into document.body as a fixed HUD, removed on destroy().
@@ -50,6 +50,17 @@ interface ScrollDrawTimelineOptions {
50
50
  repeat?: number | 'infinite';
51
51
  /** Milliseconds to wait before each repeat. Default 0. */
52
52
  repeatDelay?: number;
53
+ /**
54
+ * After the scroll-driven animation completes, automatically replay the full
55
+ * timeline as a time-driven loop — no further scroll input needed. Use `true`
56
+ * to loop infinitely or a number to loop N additional times.
57
+ *
58
+ * Each iteration plays over `loopDuration` milliseconds, then waits
59
+ * `repeatDelay` before the next iteration begins.
60
+ */
61
+ loop?: boolean | number;
62
+ /** Duration of each time-driven loop iteration in milliseconds. Default 1500. */
63
+ loopDuration?: number;
53
64
  /**
54
65
  * Show a developer overlay panel visualising each track's window and live
55
66
  * fill progress. Injected into document.body as a fixed HUD, removed on destroy().
@@ -1,13 +1,13 @@
1
- function ie({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),o=Math.max(.01,Math.min(.99,n)),p=Math.sqrt(o),m=0,y=[];for(let a=0;a<r;a++){let c=Math.pow(p,a);y.push(c),m+=c;}let d=[0],h=0;for(let a=0;a<r;a++)h+=y[a]/m,d.push(h);return a=>{if(a<=0)return 0;if(a>=1)return 1;for(let c=0;c<r;c++)if(a<=d[c+1]){let f=(a-d[c])/(d[c+1]-d[c]);if(c===0)return f*(2-f);let T=1-Math.pow(o,c);return T+(1-T)*(2*f-1)*(2*f-1)}return 1}}function se({amplitude:e=1,period:n=.4}={}){let r=Math.max(1,e),o=Math.max(.1,n),p=r<=1?o/4:o/(2*Math.PI)*Math.asin(1/r);return m=>m<=0?0:m>=1?1:r*Math.pow(2,-10*m)*Math.sin((m-p)*(2*Math.PI)/o)+1}var R={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:ie(),elastic:se()};function G(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[r="top",o="bottom"]=n.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function X(e,n,r,o){switch(o){case "top":return e+r;case "center":return e+r+n/2;case "bottom":return e+r+n;default:return e+r}}function _(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 q(e){let n=e.tagName.toLowerCase();if(n==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(n==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function ae(e,n,r){return Math.min(r,Math.max(n,e))}function J(e,n,r,o){return r===n?0:ae((e-n)/(r-n)*o,0,1)}function K(e,n,r,o,p){let m=X(e.top,e.height,n,o.element)-_(o.viewport,r),y=X(e.top,e.height,n,p.element)-_(p.viewport,r);return {tStart:m,tEnd:y}}var Q=["#ff90e8","#ffc900","#5865F2","#22c55e","#f59e0b","#ef4444","#aaa","#60a5fa"];function ce(e,n){let r={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return r;let o=typeof e=="string"?document.querySelector(e):e;if(!o)return console.warn("[svg-scroll-draw/timeline] Container not found:",e),r;let p=o,{trigger:m={},speed:y=1,once:d=false,axis:h="y",tracks:a,onComplete:c,repeat:f,repeatDelay:T=0,debug:Z=false,label:Y}=n,ee=G(m.start??"top bottom"),te=G(m.end??"bottom top"),I=f==="infinite"?1/0:f??0,k,L=a.map(t=>{let u=typeof t.easing=="function"?t.easing:R[t.easing??"linear"]??R.linear,l=Array.from(p.querySelectorAll(t.selector)),s=l.map(i=>q(i));return l.forEach((i,b)=>{i.style.strokeDasharray=`${s[b]}`,i.style.strokeDashoffset=`${s[b]}`,t.fade&&(i.style.opacity="0");}),{...t,elements:l,lengths:s,easeFn:u}}),O=0,N=0,$=false,x=false,w=0,S=false,M=-1,E=0,g=null;Z&&(g=document.createElement("div"),Object.assign(g.style,{position:"fixed",bottom:"16px",left:"16px",zIndex:"9999",background:"rgba(0,0,0,0.88)",backdropFilter:"blur(8px)",border:"1px solid rgba(255,255,255,0.1)",borderRadius:"10px",padding:"10px 14px",fontFamily:"monospace",fontSize:"11px",color:"#fff",minWidth:"240px",pointerEvents:"none",lineHeight:"1.4"}),document.body.appendChild(g));function ne(t){if(!g)return;let u=Y??(typeof e=="string"?e:"timeline"),l=a.map(({selector:s,from:i,to:b},C)=>{let v=Q[C%Q.length],A=b>i?Math.min(1,Math.max(0,(t-i)/(b-i))):0,F=Math.round(A*100);return `<div style="margin:4px 0">
1
+ function pe({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),o=Math.max(.01,Math.min(.99,n)),p=Math.sqrt(o),m=0,M=[];for(let a=0;a<r;a++){let c=Math.pow(p,a);M.push(c),m+=c;}let d=[0],x=0;for(let a=0;a<r;a++)x+=M[a]/m,d.push(x);return a=>{if(a<=0)return 0;if(a>=1)return 1;for(let c=0;c<r;c++)if(a<=d[c+1]){let b=(a-d[c])/(d[c+1]-d[c]);if(c===0)return b*(2-b);let E=1-Math.pow(o,c);return E+(1-E)*(2*b-1)*(2*b-1)}return 1}}function me({amplitude:e=1,period:n=.4}={}){let r=Math.max(1,e),o=Math.max(.1,n),p=r<=1?o/4:o/(2*Math.PI)*Math.asin(1/r);return m=>m<=0?0:m>=1?1:r*Math.pow(2,-10*m)*Math.sin((m-p)*(2*Math.PI)/o)+1}var B={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:pe(),elastic:me()};function V(e="top bottom"){let n=e.trim();if(/^\d+(\.\d+)?%$/.test(n))return {element:"top",viewport:n};let[r="top",o="bottom"]=n.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function Z(e,n,r,o){switch(o){case "top":return e+r;case "center":return e+r+n/2;case "bottom":return e+r+n;default:return e+r}}function Y(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 W(e){let n=e.tagName.toLowerCase();if(n==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(n==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function fe(e,n,r){return Math.min(r,Math.max(n,e))}function ee(e,n,r,o){return r===n?0:fe((e-n)/(r-n)*o,0,1)}function te(e,n,r,o,p){let m=Z(e.top,e.height,n,o.element)-Y(o.viewport,r),M=Z(e.top,e.height,n,p.element)-Y(p.viewport,r);return {tStart:m,tEnd:M}}var ne=["#ff90e8","#ffc900","#5865F2","#22c55e","#f59e0b","#ef4444","#aaa","#60a5fa"];function ge(e,n){let r={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};if(typeof window>"u")return r;let o=typeof e=="string"?document.querySelector(e):e;if(!o)return console.warn("[svg-scroll-draw/timeline] Container not found:",e),r;let p=o,{trigger:m={},speed:M=1,once:d=false,axis:x="y",tracks:a,onComplete:c,repeat:b,repeatDelay:E=0,loop:R=false,loopDuration:re=1500,debug:oe=false,label:ie}=n,se=V(m.start??"top bottom"),ae=V(m.end??"bottom top"),A=b==="infinite"?1/0:b??0,f,L=R===true?1/0:typeof R=="number"?R:0,h=false,G=0,T=L,q=a.map(t=>{let u=typeof t.easing=="function"?t.easing:B[t.easing??"linear"]??B.linear,l=Array.from(p.querySelectorAll(t.selector)),s=l.map(i=>W(i));return l.forEach((i,g)=>{i.style.strokeDasharray=`${s[g]}`,i.style.strokeDashoffset=`${s[g]}`,t.fade&&(i.style.opacity="0");}),{...t,elements:l,lengths:s,easeFn:u}}),H=0,U=0,F=false,y=false,v=0,S=false,D=-1,I=0,w=null;oe&&(w=document.createElement("div"),Object.assign(w.style,{position:"fixed",bottom:"16px",left:"16px",zIndex:"9999",background:"rgba(0,0,0,0.88)",backdropFilter:"blur(8px)",border:"1px solid rgba(255,255,255,0.1)",borderRadius:"10px",padding:"10px 14px",fontFamily:"monospace",fontSize:"11px",color:"#fff",minWidth:"240px",pointerEvents:"none",lineHeight:"1.4"}),document.body.appendChild(w));function ue(t){if(!w)return;let u=ie??(typeof e=="string"?e:"timeline"),l=a.map(({selector:s,from:i,to:g},j)=>{let $=ne[j%ne.length],z=g>i?Math.min(1,Math.max(0,(t-i)/(g-i))):0,C=Math.round(z*100);return `<div style="margin:4px 0">
2
2
  <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:2px">
3
- <span style="color:${v};max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${s}</span>
4
- <span style="color:#666;margin-left:8px">${F}%</span>
3
+ <span style="color:${$};max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${s}</span>
4
+ <span style="color:#666;margin-left:8px">${C}%</span>
5
5
  </div>
6
6
  <div style="height:3px;background:#2a2a2a;border-radius:2px;position:relative;overflow:hidden">
7
- <div style="position:absolute;left:${i*100}%;width:${(b-i)*100}%;height:100%;background:${v}33;border-radius:2px"></div>
8
- <div style="position:absolute;left:${i*100}%;width:${(b-i)*A*100}%;height:100%;background:${v};border-radius:2px;transition:width 0.05s linear"></div>
7
+ <div style="position:absolute;left:${i*100}%;width:${(g-i)*100}%;height:100%;background:${$}33;border-radius:2px"></div>
8
+ <div style="position:absolute;left:${i*100}%;width:${(g-i)*z*100}%;height:100%;background:${$};border-radius:2px;transition:width 0.05s linear"></div>
9
9
  </div>
10
- </div>`}).join("");g.innerHTML=`
10
+ </div>`}).join("");w.innerHTML=`
11
11
  <div style="color:#555;margin-bottom:8px;font-size:10px;text-transform:uppercase;letter-spacing:0.12em;border-bottom:1px solid rgba(255,255,255,0.06);padding-bottom:6px">
12
12
  scrollDrawTimeline \xB7 ${u}
13
13
  </div>
@@ -20,4 +20,4 @@ function ie({bounces:e=3,decay:n=.5}={}){let r=Math.max(1,Math.round(e)),o=Math.
20
20
  <div style="height:2px;background:#2a2a2a;border-radius:1px;overflow:hidden">
21
21
  <div style="height:100%;background:#fff;border-radius:1px;width:${t*100}%;transition:width 0.05s linear"></div>
22
22
  </div>
23
- </div>`;}function j(){return h==="x"?window.scrollX:window.scrollY}function re(){return h==="x"?window.innerWidth:window.innerHeight}function B(){let t=p.getBoundingClientRect(),u=j(),l=h==="x"?t.left:t.top,s=h==="x"?t.width:t.height,i=K({top:l,height:s},u,re(),ee,te);O=i.tStart,N=i.tEnd;}function V(t){p.style.setProperty("--scroll-draw-progress",String(t)),L.forEach(({elements:u,lengths:l,from:s,to:i,easeFn:b,fade:C})=>{let v=i-s,A=v>0?Math.min(1,Math.max(0,(t-s)/v)):0,F=b(A);u.forEach((U,oe)=>{U.style.strokeDashoffset=`${l[oe]*(1-F)}`,C&&(U.style.opacity=String(F));});}),ne(t);}function W(){M=-1,S=false,L.forEach(({elements:t,lengths:u,fade:l})=>{t.forEach((s,i)=>{s.style.strokeDashoffset=`${u[i]}`,l&&(s.style.opacity="0");});}),p.style.setProperty("--scroll-draw-progress","0");}function P(){if(!$||x)return;let t=J(j(),O,N,y);d&&(M=Math.max(M,t),t=M),E=t,V(t),t>=1&&!S?(S=true,c?.(),I>0&&d&&(k=setTimeout(()=>{I!==1/0&&I--,W();},T))):t<1&&!d&&(S=false),w=requestAnimationFrame(P);}B();let H=new IntersectionObserver(t=>{t.forEach(u=>{$=u.isIntersecting,$&&!x?w=requestAnimationFrame(P):cancelAnimationFrame(w);});},{threshold:0});H.observe(p);let z;function D(){clearTimeout(z),z=setTimeout(()=>{L.forEach(({elements:t,lengths:u})=>{t.forEach((l,s)=>{u[s]=q(l),l.style.strokeDasharray=`${u[s]}`;});}),B();},150);}return window.addEventListener("resize",D),window.addEventListener("orientationchange",D),{destroy(){cancelAnimationFrame(w),clearTimeout(z),clearTimeout(k),H.disconnect(),window.removeEventListener("resize",D),window.removeEventListener("orientationchange",D),g&&(g.remove(),g=null);},replay(){I=f==="infinite"?1/0:f??0,clearTimeout(k),W(),x=false;},pause(){x=true,cancelAnimationFrame(w);},resume(){x&&(x=false,$&&(w=requestAnimationFrame(P)));},seek(t){E=Math.min(1,Math.max(0,t)),M=E,x=true,cancelAnimationFrame(w),V(E);},getProgress(){return E}}}export{ce as scrollDrawTimeline};
23
+ </div>`;}function X(){return x==="x"?window.scrollX:window.scrollY}function le(){return x==="x"?window.innerWidth:window.innerHeight}function _(){let t=p.getBoundingClientRect(),u=X(),l=x==="x"?t.left:t.top,s=x==="x"?t.width:t.height,i=te({top:l,height:s},u,le(),se,ae);H=i.tStart,U=i.tEnd;}function J(t){p.style.setProperty("--scroll-draw-progress",String(t)),q.forEach(({elements:u,lengths:l,from:s,to:i,easeFn:g,fade:j})=>{let $=i-s,z=$>0?Math.min(1,Math.max(0,(t-s)/$)):0,C=g(z);u.forEach((Q,ce)=>{Q.style.strokeDashoffset=`${l[ce]*(1-C)}`,j&&(Q.style.opacity=String(C));});}),ue(t);}function k(){D=-1,I=0,S=false,q.forEach(({elements:t,lengths:u,fade:l})=>{t.forEach((s,i)=>{s.style.strokeDashoffset=`${u[i]}`,l&&(s.style.opacity="0");});}),p.style.setProperty("--scroll-draw-progress","0");}function O(){if(!F||y)return;let t;h?t=Math.min(1,(performance.now()-G)/re):(t=ee(X(),H,U,M),(d||L>0)&&(D=Math.max(D,t),t=D)),I=t,J(t),t>=1&&!S?(S=true,c?.(),L>0&&!h&&!f?f=setTimeout(()=>{f=void 0,T!==1/0&&T--,k(),h=true,G=performance.now();},E):A>0&&d&&!h&&!f&&(f=setTimeout(()=>{f=void 0,A!==1/0&&A--,k();},E))):!h&&t<1&&!d&&(S=false),h&&t>=1&&!f&&(S=false,T>0?f=setTimeout(()=>{f=void 0,T!==1/0&&T--,k(),G=performance.now();},E):h=false),v=requestAnimationFrame(O);}_();let K=new IntersectionObserver(t=>{t.forEach(u=>{F=u.isIntersecting,F&&!y?v=requestAnimationFrame(O):cancelAnimationFrame(v);});},{threshold:0});K.observe(p);let N;function P(){clearTimeout(N),N=setTimeout(()=>{q.forEach(({elements:t,lengths:u})=>{t.forEach((l,s)=>{u[s]=W(l),l.style.strokeDasharray=`${u[s]}`;});}),_();},150);}return window.addEventListener("resize",P),window.addEventListener("orientationchange",P),{destroy(){cancelAnimationFrame(v),clearTimeout(N),clearTimeout(f),K.disconnect(),window.removeEventListener("resize",P),window.removeEventListener("orientationchange",P),w&&(w.remove(),w=null);},replay(){A=b==="infinite"?1/0:b??0,T=L,h=false,clearTimeout(f),f=void 0,k(),y=false;},pause(){y=true,cancelAnimationFrame(v);},resume(){y&&(y=false,F&&(v=requestAnimationFrame(O)));},seek(t){I=Math.min(1,Math.max(0,t)),D=I,y=true,cancelAnimationFrame(v),J(I);},getProgress(){return I}}}export{ge as scrollDrawTimeline};
@@ -0,0 +1 @@
1
+ 'use strict';function U({bounces:e=3,decay:t=.5}={}){let n=Math.max(1,Math.round(e)),r=Math.max(.01,Math.min(.99,t)),m=Math.sqrt(r),s=0,p=[];for(let i=0;i<n;i++){let a=Math.pow(m,i);p.push(a),s+=a;}let u=[0],y=0;for(let i=0;i<n;i++)y+=p[i]/s,u.push(y);return i=>{if(i<=0)return 0;if(i>=1)return 1;for(let a=0;a<n;a++)if(i<=u[a+1]){let f=(i-u[a])/(u[a+1]-u[a]);if(a===0)return f*(2-f);let x=1-Math.pow(r,a);return x+(1-x)*(2*f-1)*(2*f-1)}return 1}}function Z({amplitude:e=1,period:t=.4}={}){let n=Math.max(1,e),r=Math.max(.1,t),m=n<=1?r/4:r/(2*Math.PI)*Math.asin(1/n);return s=>s<=0?0:s>=1?1:n*Math.pow(2,-10*s)*Math.sin((s-m)*(2*Math.PI)/r)+1}var R={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:U(),elastic:Z()};function V(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[n="top",r="bottom"]=t.split(/\s+/).filter(Boolean);return {element:n,viewport:r}}function z(e,t,n,r){switch(r){case "top":return e+n;case "center":return e+n+t/2;case "bottom":return e+n+t;default:return e+n}}function _(e,t){if(/^\d+(\.\d+)?%$/.test(e))return t*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return t/2;case "bottom":return t;default:return t}}function H(e,t,n){return Math.min(n,Math.max(t,e))}function O(e,t,n,r){return n===t?0:H((e-t)/(n-t)*r,0,1)}function D(e,t,n,r,m){let s=z(e.top,e.height,t,r.element)-_(r.viewport,n),p=z(e.top,e.height,t,m.element)-_(m.viewport,n);return {tStart:s,tEnd:p}}var G=new Map;function B(e,t){G.set(e,t);}function W(e){G.delete(e);}var k={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ne(e,t={}){if(typeof window>"u")return k;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),k;let r=n,{trigger:m={},easing:s="linear",once:p=false,axis:u="y",preload:y="auto",onReady:i,onComplete:a,onProgress:f}=t,x=window.matchMedia("(prefers-reduced-motion: reduce)").matches,X=typeof s=="function"?s:R[s]??R.linear,j=V(m.start??"top top"),J=V(m.end??"bottom top");r.pause(),r.hasAttribute("preload")||(r.preload=y);let C=t.from??0,T=t.to,A=0,S=0,l=0,b=false,d=false,h=-1,w=0,v=false,g=false,N=()=>u==="x"?window.scrollX:window.scrollY,K=()=>u==="x"?window.innerWidth:window.innerHeight;function P(){let o=r.getBoundingClientRect(),c=u==="x"?o.left:o.top,Q=u==="x"?o.width:o.height,q=D({top:c,height:Q},N(),K(),j,J);A=q.tStart,S=q.tEnd;}function M(o){if(!g)return;let c=T??r.duration??0;r.currentTime=C+(c-C)*o,r.style.setProperty("--scroll-draw-progress",String(o)),f?.(o);}function E(){if(!b||d||!g)return;let o=X(O(N(),A,S,1));p&&(h=Math.max(h,o),o=h),w=o,M(o),o>=1&&!v?(v=true,a?.()):o<1&&!p&&(v=false),l=requestAnimationFrame(E);}function F(){if(g=true,T===void 0&&(T=r.duration),x){M(1),i?.();return}P(),i?.(),b&&!d&&(l=requestAnimationFrame(E));}r.readyState>=1?F():r.addEventListener("loadedmetadata",F,{once:true}),g||P();let $=new IntersectionObserver(o=>{o.forEach(c=>{b=c.isIntersecting,b&&!d&&g?l=requestAnimationFrame(E):cancelAnimationFrame(l);});}),L;function I(){clearTimeout(L),L=setTimeout(P,150);}return window.addEventListener("resize",I),window.addEventListener("orientationchange",I),$.observe(r),B(r,{type:"video",getProgress:()=>w,getTrigger:()=>({tStart:A,tEnd:S})}),{destroy(){cancelAnimationFrame(l),$.disconnect(),r.removeEventListener("loadedmetadata",F),window.removeEventListener("resize",I),window.removeEventListener("orientationchange",I),clearTimeout(L),W(r);},replay(){h=-1,v=false,w=0,d=false,M(0);},pause(){d=true,cancelAnimationFrame(l);},resume(){d&&(d=false,b&&g&&(l=requestAnimationFrame(E)));},seek(o){let c=Math.min(1,Math.max(0,o));w=c,h=c,d=true,cancelAnimationFrame(l),M(c);},getProgress(){return w}}}exports.scrollVideo=ne;
@@ -0,0 +1,34 @@
1
+ type EasingName = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | 'bounce' | 'elastic';
2
+ interface TriggerConfig {
3
+ start?: string;
4
+ end?: string;
5
+ }
6
+ interface ScrollDrawInstance {
7
+ destroy: () => void;
8
+ /** Reset and replay the animation from the beginning. */
9
+ replay: () => void;
10
+ /** Pause the animation at the current progress. */
11
+ pause: () => void;
12
+ /** Resume a paused animation. */
13
+ resume: () => void;
14
+ /** Jump to a specific progress value (0–1) and pause. */
15
+ seek: (progress: number) => void;
16
+ /** Returns current draw progress (0–1). */
17
+ getProgress: () => number;
18
+ }
19
+
20
+ interface ScrollVideoOptions {
21
+ trigger?: TriggerConfig;
22
+ from?: number;
23
+ to?: number;
24
+ easing?: EasingName | ((t: number) => number);
25
+ once?: boolean;
26
+ axis?: 'x' | 'y';
27
+ preload?: 'auto' | 'metadata';
28
+ onReady?: () => void;
29
+ onComplete?: () => void;
30
+ onProgress?: (alpha: number) => void;
31
+ }
32
+ declare function scrollVideo(target: string | HTMLVideoElement, options?: ScrollVideoOptions): ScrollDrawInstance;
33
+
34
+ export { type ScrollVideoOptions, scrollVideo };
@@ -0,0 +1,34 @@
1
+ type EasingName = 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | 'bounce' | 'elastic';
2
+ interface TriggerConfig {
3
+ start?: string;
4
+ end?: string;
5
+ }
6
+ interface ScrollDrawInstance {
7
+ destroy: () => void;
8
+ /** Reset and replay the animation from the beginning. */
9
+ replay: () => void;
10
+ /** Pause the animation at the current progress. */
11
+ pause: () => void;
12
+ /** Resume a paused animation. */
13
+ resume: () => void;
14
+ /** Jump to a specific progress value (0–1) and pause. */
15
+ seek: (progress: number) => void;
16
+ /** Returns current draw progress (0–1). */
17
+ getProgress: () => number;
18
+ }
19
+
20
+ interface ScrollVideoOptions {
21
+ trigger?: TriggerConfig;
22
+ from?: number;
23
+ to?: number;
24
+ easing?: EasingName | ((t: number) => number);
25
+ once?: boolean;
26
+ axis?: 'x' | 'y';
27
+ preload?: 'auto' | 'metadata';
28
+ onReady?: () => void;
29
+ onComplete?: () => void;
30
+ onProgress?: (alpha: number) => void;
31
+ }
32
+ declare function scrollVideo(target: string | HTMLVideoElement, options?: ScrollVideoOptions): ScrollDrawInstance;
33
+
34
+ export { type ScrollVideoOptions, scrollVideo };
@@ -0,0 +1 @@
1
+ function U({bounces:e=3,decay:t=.5}={}){let n=Math.max(1,Math.round(e)),r=Math.max(.01,Math.min(.99,t)),m=Math.sqrt(r),s=0,p=[];for(let i=0;i<n;i++){let a=Math.pow(m,i);p.push(a),s+=a;}let u=[0],y=0;for(let i=0;i<n;i++)y+=p[i]/s,u.push(y);return i=>{if(i<=0)return 0;if(i>=1)return 1;for(let a=0;a<n;a++)if(i<=u[a+1]){let f=(i-u[a])/(u[a+1]-u[a]);if(a===0)return f*(2-f);let x=1-Math.pow(r,a);return x+(1-x)*(2*f-1)*(2*f-1)}return 1}}function Z({amplitude:e=1,period:t=.4}={}){let n=Math.max(1,e),r=Math.max(.1,t),m=n<=1?r/4:r/(2*Math.PI)*Math.asin(1/n);return s=>s<=0?0:s>=1?1:n*Math.pow(2,-10*s)*Math.sin((s-m)*(2*Math.PI)/r)+1}var R={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:U(),elastic:Z()};function V(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[n="top",r="bottom"]=t.split(/\s+/).filter(Boolean);return {element:n,viewport:r}}function z(e,t,n,r){switch(r){case "top":return e+n;case "center":return e+n+t/2;case "bottom":return e+n+t;default:return e+n}}function _(e,t){if(/^\d+(\.\d+)?%$/.test(e))return t*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return t/2;case "bottom":return t;default:return t}}function H(e,t,n){return Math.min(n,Math.max(t,e))}function O(e,t,n,r){return n===t?0:H((e-t)/(n-t)*r,0,1)}function D(e,t,n,r,m){let s=z(e.top,e.height,t,r.element)-_(r.viewport,n),p=z(e.top,e.height,t,m.element)-_(m.viewport,n);return {tStart:s,tEnd:p}}var G=new Map;function B(e,t){G.set(e,t);}function W(e){G.delete(e);}var k={destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};function ne(e,t={}){if(typeof window>"u")return k;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),k;let r=n,{trigger:m={},easing:s="linear",once:p=false,axis:u="y",preload:y="auto",onReady:i,onComplete:a,onProgress:f}=t,x=window.matchMedia("(prefers-reduced-motion: reduce)").matches,X=typeof s=="function"?s:R[s]??R.linear,j=V(m.start??"top top"),J=V(m.end??"bottom top");r.pause(),r.hasAttribute("preload")||(r.preload=y);let C=t.from??0,T=t.to,A=0,S=0,l=0,b=false,d=false,h=-1,w=0,v=false,g=false,N=()=>u==="x"?window.scrollX:window.scrollY,K=()=>u==="x"?window.innerWidth:window.innerHeight;function P(){let o=r.getBoundingClientRect(),c=u==="x"?o.left:o.top,Q=u==="x"?o.width:o.height,q=D({top:c,height:Q},N(),K(),j,J);A=q.tStart,S=q.tEnd;}function M(o){if(!g)return;let c=T??r.duration??0;r.currentTime=C+(c-C)*o,r.style.setProperty("--scroll-draw-progress",String(o)),f?.(o);}function E(){if(!b||d||!g)return;let o=X(O(N(),A,S,1));p&&(h=Math.max(h,o),o=h),w=o,M(o),o>=1&&!v?(v=true,a?.()):o<1&&!p&&(v=false),l=requestAnimationFrame(E);}function F(){if(g=true,T===void 0&&(T=r.duration),x){M(1),i?.();return}P(),i?.(),b&&!d&&(l=requestAnimationFrame(E));}r.readyState>=1?F():r.addEventListener("loadedmetadata",F,{once:true}),g||P();let $=new IntersectionObserver(o=>{o.forEach(c=>{b=c.isIntersecting,b&&!d&&g?l=requestAnimationFrame(E):cancelAnimationFrame(l);});}),L;function I(){clearTimeout(L),L=setTimeout(P,150);}return window.addEventListener("resize",I),window.addEventListener("orientationchange",I),$.observe(r),B(r,{type:"video",getProgress:()=>w,getTrigger:()=>({tStart:A,tEnd:S})}),{destroy(){cancelAnimationFrame(l),$.disconnect(),r.removeEventListener("loadedmetadata",F),window.removeEventListener("resize",I),window.removeEventListener("orientationchange",I),clearTimeout(L),W(r);},replay(){h=-1,v=false,w=0,d=false,M(0);},pause(){d=true,cancelAnimationFrame(l);},resume(){d&&(d=false,b&&g&&(l=requestAnimationFrame(E)));},seek(o){let c=Math.min(1,Math.max(0,o));w=c,h=c,d=true,cancelAnimationFrame(l),M(c);},getProgress(){return w}}}export{ne as scrollVideo};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svg-scroll-draw",
3
- "version": "1.6.0",
3
+ "version": "2.2.0",
4
4
  "description": "Scroll-driven SVG path drawing animation library — zero dependencies, ~4.4 KB gzipped, works with React, Vue, and vanilla JS",
5
5
  "keywords": [
6
6
  "svg",
@@ -126,6 +126,21 @@
126
126
  "types": "./dist/web-component/index.d.ts",
127
127
  "import": "./dist/web-component/index.mjs",
128
128
  "require": "./dist/web-component/index.cjs"
129
+ },
130
+ "./video": {
131
+ "types": "./dist/video/index.d.ts",
132
+ "import": "./dist/video/index.mjs",
133
+ "require": "./dist/video/index.cjs"
134
+ },
135
+ "./text": {
136
+ "types": "./dist/text/index.d.ts",
137
+ "import": "./dist/text/index.mjs",
138
+ "require": "./dist/text/index.cjs"
139
+ },
140
+ "./devtools": {
141
+ "types": "./dist/devtools/index.d.ts",
142
+ "import": "./dist/devtools/index.mjs",
143
+ "require": "./dist/devtools/index.cjs"
129
144
  }
130
145
  },
131
146
  "scripts": {