svg-scroll-draw 0.5.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +5 -4
  2. package/dist/angular/index.cjs +3 -3
  3. package/dist/angular/index.d.mts +29 -1
  4. package/dist/angular/index.d.ts +29 -1
  5. package/dist/angular/index.mjs +3 -3
  6. package/dist/astro/index.cjs +3 -0
  7. package/dist/astro/index.d.mts +87 -0
  8. package/dist/astro/index.d.ts +87 -0
  9. package/dist/astro/index.mjs +3 -0
  10. package/dist/cdn/svg-scroll-draw.global.js +3 -3
  11. package/dist/group/index.cjs +3 -0
  12. package/dist/group/index.d.mts +97 -0
  13. package/dist/group/index.d.ts +97 -0
  14. package/dist/group/index.mjs +3 -0
  15. package/dist/index.cjs +3 -3
  16. package/dist/index.d.mts +29 -1
  17. package/dist/index.d.ts +29 -1
  18. package/dist/index.mjs +3 -3
  19. package/dist/nuxt/index.cjs +3 -0
  20. package/dist/nuxt/index.d.mts +174 -0
  21. package/dist/nuxt/index.d.ts +174 -0
  22. package/dist/nuxt/index.mjs +3 -0
  23. package/dist/react/index.cjs +3 -3
  24. package/dist/react/index.d.mts +49 -3
  25. package/dist/react/index.d.ts +49 -3
  26. package/dist/react/index.mjs +3 -3
  27. package/dist/solid/index.cjs +3 -3
  28. package/dist/solid/index.d.mts +29 -1
  29. package/dist/solid/index.d.ts +29 -1
  30. package/dist/solid/index.mjs +3 -3
  31. package/dist/svelte/index.cjs +3 -3
  32. package/dist/svelte/index.d.mts +29 -1
  33. package/dist/svelte/index.d.ts +29 -1
  34. package/dist/svelte/index.mjs +3 -3
  35. package/dist/vue/index.cjs +3 -3
  36. package/dist/vue/index.d.mts +21 -1
  37. package/dist/vue/index.d.ts +21 -1
  38. package/dist/vue/index.mjs +3 -3
  39. package/dist/web-component/index.cjs +3 -0
  40. package/dist/web-component/index.d.mts +2 -0
  41. package/dist/web-component/index.d.ts +2 -0
  42. package/dist/web-component/index.mjs +3 -0
  43. package/package.json +30 -4
@@ -1,3 +1,3 @@
1
- import {useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';var X={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)};function _(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[n="top",o="bottom"]=t.split(/\s+/).filter(Boolean);return {element:n,viewport:o}}function te(e,t,n,o){switch(o){case "top":return e+n;case "center":return e+n+t/2;case "bottom":return e+n+t;default:return e+n}}function re(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 J(e){let t=e.tagName.toLowerCase();if(t==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(n+o)}if(t==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function ye(e,t,n){return Math.min(n,Math.max(t,e))}function N(e,t,n,o){return n===t?0:ye((e-t)/(n-t)*o,0,1)}function oe(e,t,n,o,i){let l=te(e.top,e.height,t,o.element)-re(o.viewport,n),d=te(e.top,e.height,t,i.element)-re(i.viewport,n);return {tStart:l,tEnd:d}}function ne(e){let t=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(t)return [parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let 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 se(e,t,n){let o=ne(e),i=ne(t);return !o||!i?e:`rgb(${Math.round(o[0]+(i[0]-o[0])*n)},${Math.round(o[1]+(i[1]-o[1])*n)},${Math.round(o[2]+(i[2]-o[2])*n)})`}function ie(e,t){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,t);}function ge(e){let t=e.getAttribute("stroke"),n=e.getAttribute("fill");!t||t==="none"?ie("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&ie("Element has a fill \u2014 it may obscure the stroke animation.",e);}function be(e,t,n){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 i(){let l=n==="x"?window.scrollX:window.scrollY,d=e-l,A=t-l,T=n==="x";o.innerHTML=`
2
- <div style="position:absolute;${T?`left:${d}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${d}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;${T?`left:${A}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${A}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",i,{passive:true}),i(),o}function le(e,t={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{}};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:i=1,fade:l=false,easing:d="linear",trigger:A={},stagger:T=0,direction:b="forward",once:K=false,debug:ae=false,axis:p="y",scrollContainer:P,autoReverse:Q=false,delay:U=0,strokeColor:h,strokeWidth:w,waypoints:z,onProgress:ce,onStart:ue,onComplete:Y}=t,Z=typeof d=="function"?d:X[d]??X.linear,fe=_(A.start??"top bottom"),pe=_(A.end??"bottom top"),a=typeof P=="string"?document.querySelector(P):P??null,v=Array.isArray(h)?h[0]:null,x=Array.isArray(h)?h[1]:typeof h=="string"?h:null,m=Array.isArray(w)?w[0]:null,E=Array.isArray(w)?w[1]:typeof w=="number"?w:null,I=Array.from(e.querySelectorAll(o)),y=[],$=0,k=0,L=false,O=false,M=0,W=false,C=-1,F=-1,G=null,V=new Set;function q(){return a?p==="x"?a.scrollLeft:a.scrollTop:p==="x"?window.scrollX:window.scrollY}function de(){return a?p==="x"?a.clientWidth:a.clientHeight:p==="x"?window.innerWidth:window.innerHeight}function j(){let r=e.getBoundingClientRect(),s,D,g;if(a){let u=a.getBoundingClientRect();s=p==="x"?r.left-u.left+a.scrollLeft:r.top-u.top+a.scrollTop,D=p==="x"?r.width:r.height,g=q();}else s=p==="x"?r.left:r.top,D=p==="x"?r.width:r.height,g=q();let c=oe({top:s,height:D},g,de(),fe,pe);$=c.tStart,k=c.tEnd,ae&&process.env.NODE_ENV!=="production"&&(G?.remove(),G=be($,k,p));}function me(){I.forEach((r,s)=>{r.style.strokeDasharray=`${y[s]}`,r.style.strokeDashoffset=b==="reverse"?"0":`${y[s]}`,l?r.style.opacity=b==="reverse"?"1":"0":r.style.opacity="",v&&(r.style.stroke=v),m!==null&&(r.style.strokeWidth=`${m}`);});}if(I.forEach(r=>{ge(r);let s=J(r);y.push(s),n?(r.style.strokeDasharray=`${s}`,r.style.strokeDashoffset=b==="reverse"?`${s}`:"0",l&&(r.style.opacity="1"),x&&(r.style.stroke=x),E!==null&&(r.style.strokeWidth=`${E}`)):(r.style.strokeDasharray=`${s}`,r.style.strokeDashoffset=b==="reverse"?"0":`${s}`,l?r.style.opacity=b==="reverse"?"1":"0":r.style.opacity="",v&&(r.style.stroke=v),m!==null&&(r.style.strokeWidth=`${m}`));}),n)return Y?.(),{destroy:()=>{},replay:()=>{}};j();function ee(){if(!W)return;let r=q(),s=Q?F===-1||r>=F?"forward":"reverse":b;F=r;let D=k-$,g=true;if(I.forEach((c,u)=>{let S=u*T*D,f=Z(N(r,$+S,k+S,i));K&&!Q&&(C=Math.max(C,f),f=C),c.style.strokeDashoffset=s==="reverse"?`${y[u]*f}`:`${y[u]*(1-f)}`,l&&(c.style.opacity=s==="reverse"?`${1-f}`:`${f}`),v&&x?c.style.stroke=se(v,x,f):x&&(c.style.stroke=x),m!==null&&E!==null?c.style.strokeWidth=`${m+(E-m)*f}`:E!==null&&(c.style.strokeWidth=`${E}`),u===0&&ce?.(f),f<1&&(g=false);}),z){let c=Z(N(r,$,k,i));for(let u in z){let S=parseFloat(u);c>=S&&!V.has(S)&&(V.add(S),z[u]?.());}}!O&&N(r,$,k,i)>0&&(O=true,ue?.()),g&&!L?(L=true,Y?.()):!g&&!K&&(L=false),M=requestAnimationFrame(ee);}let B=new IntersectionObserver(r=>{r.forEach(s=>{W=s.isIntersecting,W?M=requestAnimationFrame(ee):cancelAnimationFrame(M);});},{root:a??null}),H;function R(){clearTimeout(H),H=setTimeout(()=>{I.forEach((r,s)=>{y[s]=J(r),r.style.strokeDasharray=`${y[s]}`;}),j();},150);}return window.addEventListener("resize",R),window.addEventListener("orientationchange",R),U>0?setTimeout(()=>B.observe(e),U):B.observe(e),{destroy(){cancelAnimationFrame(M),B.disconnect(),window.removeEventListener("resize",R),window.removeEventListener("orientationchange",R),clearTimeout(H),G?.remove();},replay(){C=-1,F=-1,O=false,L=false,V.clear(),me();}}}function De({children:e,className:t,style:n,...o}){let i=useRef(null);return useEffect(()=>{if(!i.current)return;let l=le(i.current,o);return ()=>l.destroy()},[]),jsx("div",{ref:i,className:t,style:n,children:e})}export{De as ScrollDraw};
1
+ import {useState,useRef,useEffect}from'react';import {jsx}from'react/jsx-runtime';var Z={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)};function ee(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",s="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:s}}function De(e,r,n,s){switch(s){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function Le(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 Te(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),s=parseFloat(e.getAttribute("height")??"0");return 2*(n+s)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function We(e,r,n){return Math.min(n,Math.max(r,e))}function H(e,r,n,s){return n===r?0:We((e-r)/(n-r)*s,0,1)}function he(e,r,n,s,l){let c=De(e.top,e.height,r,s.element)-Le(s.viewport,n),f=De(e.top,e.height,r,l.element)-Le(l.viewport,n);return {tStart:c,tEnd:f}}function Pe(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let s=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i.exec(e);return s?[parseInt(s[1]),parseInt(s[2]),parseInt(s[3])]:null}function $e(e,r,n){let s=Pe(e),l=Pe(r);return !s||!l?e:`rgb(${Math.round(s[0]+(l[0]-s[0])*n)},${Math.round(s[1]+(l[1]-s[1])*n)},${Math.round(s[2]+(l[2]-s[2])*n)})`}function Me(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}function Ve(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?Me("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&Me("Element has a fill \u2014 it may obscure the stroke animation.",e);}function qe(e,r,n){let s=document.createElement("div");s.setAttribute("data-svg-scroll-draw-debug",""),s.style.cssText="position:fixed;pointer-events:none;z-index:9999;font-family:monospace;font-size:11px;top:0;left:0;right:0;bottom:0;";function l(){let c=n==="x"?window.scrollX:window.scrollY,f=e-c,x=r-c,g=n==="x";s.innerHTML=`
2
+ <div style="position:absolute;${g?`left:${f}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${f}px;left:0;right:0;border-top:2px dashed #22c55e;`}padding:2px 6px;color:#22c55e;background:rgba(0,0,0,.6)">\u25B6 start</div>
3
+ <div style="position:absolute;${g?`left:${x}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${x}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(s),window.addEventListener("scroll",l,{passive:true}),l(),s}function Ce(e,r,n){let s=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),l=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,c=>{let f=parseFloat(c),x=s[l++]??f;return String(+(f+(x-f)*n).toFixed(4))})}function Oe(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:s="path, polyline, line, polygon, rect, circle",speed:l=1,fade:c=false,easing:f="linear",trigger:x={},stagger:g=0,direction:y="forward",once:G=false,debug:P=false,axis:h="y",scrollContainer:te,autoReverse:_=false,delay:re=0,strokeColor:E,strokeWidth:b,fillOpacity:M,waypoints:ne,velocityScale:j=false,threshold:ie=0,rootMargin:le="0px",repeat:F=0,repeatDelay:B=0,morphTo:u,clip:w,onProgress:Y,onStart:J,onComplete:C}=r,T=w===true?"left":typeof w=="string"?w:false,be=typeof f=="function"?f:Z[f]??Z.linear,Fe=ee(x.start??"top bottom"),Ie=ee(x.end??"bottom top"),v=typeof te=="string"?document.querySelector(te):te??null,I=Array.isArray(E)?E[0]:null,$=Array.isArray(E)?E[1]:typeof E=="string"?E:null,S=Array.isArray(b)?b[0]:null,A=Array.isArray(b)?b[1]:typeof b=="number"?b:null,k=Array.isArray(M)?M[0]:null,D=Array.isArray(M)?M[1]:typeof M=="number"?M:null;function K(t){let o=t*100;switch(T){case "right":return `inset(0 0 0 ${100-o}%)`;case "top":return `inset(0 0 ${100-o}% 0)`;case "bottom":return `inset(${100-o}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-o}% 0 0)`}}let oe=T?[]:Array.from(e.querySelectorAll(s)),O=[],N=[],z=0,W=0,R=false,U=false,V=0,ae=false,L=-1,ce=-1,X=false,ue=0,se=0,fe,we=null,pe=new Set,me=-1,Se=performance.now();function ve(){return v?h==="x"?v.scrollLeft:v.scrollTop:h==="x"?window.scrollX:window.scrollY}function Ne(){return v?h==="x"?v.clientWidth:v.clientHeight:h==="x"?window.innerWidth:window.innerHeight}function Ae(){let t=e.getBoundingClientRect(),o,a,d;if(v){let Q=v.getBoundingClientRect();o=h==="x"?t.left-Q.left+v.scrollLeft:t.top-Q.top+v.scrollTop,a=h==="x"?t.width:t.height,d=ve();}else o=h==="x"?t.left:t.top,a=h==="x"?t.width:t.height,d=ve();let ye=he({top:o,height:a},d,Ne(),Fe,Ie);z=ye.tStart,W=ye.tEnd,P&&process.env.NODE_ENV!=="production"&&(we?.remove(),we=qe(z,W,h));}function ze(t,o){if(T){let a=o==="reverse"?1-t:t;e.style.clipPath=K(a);return}oe.forEach((a,d)=>{a.style.strokeDashoffset=o==="reverse"?`${O[d]*t}`:`${O[d]*(1-t)}`,c&&(a.style.opacity=o==="reverse"?`${1-t}`:`${t}`),I&&$?a.style.stroke=$e(I,$,t):$&&(a.style.stroke=$),S!==null&&A!==null?a.style.strokeWidth=`${S+(A-S)*t}`:A!==null&&(a.style.strokeWidth=`${A}`),k!==null&&D!==null?a.style.fillOpacity=`${k+(D-k)*t}`:D!==null&&(a.style.fillOpacity=`${D}`),u&&a.tagName.toLowerCase()==="path"&&N[d]&&a.setAttribute("d",Ce(N[d],u,t));});}function ke(){if(T){e.style.clipPath=K(0);return}oe.forEach((t,o)=>{t.style.strokeDasharray=`${O[o]}`,t.style.strokeDashoffset=y==="reverse"?"0":`${O[o]}`,c?t.style.opacity=y==="reverse"?"1":"0":t.style.opacity="",I&&(t.style.stroke=I),S!==null&&(t.style.strokeWidth=`${S}`),k!==null&&(t.style.fillOpacity=`${k}`),u&&t.tagName.toLowerCase()==="path"&&N[o]&&t.setAttribute("d",N[o]);});}if(oe.forEach(t=>{Ve(t);let o=Te(t);O.push(o),t.tagName.toLowerCase()==="path"?N.push(t.getAttribute("d")??""):N.push(""),n?(t.style.strokeDasharray=`${o}`,t.style.strokeDashoffset=y==="reverse"?`${o}`:"0",c&&(t.style.opacity="1"),$&&(t.style.stroke=$),A!==null&&(t.style.strokeWidth=`${A}`),D!==null&&(t.style.fillOpacity=`${D}`),u&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",u)):(t.style.strokeDasharray=`${o}`,t.style.strokeDashoffset=y==="reverse"?"0":`${o}`,c?t.style.opacity=y==="reverse"?"1":"0":t.style.opacity="",I&&(t.style.stroke=I),S!==null&&(t.style.strokeWidth=`${S}`),k!==null&&(t.style.fillOpacity=`${k}`));}),T){if(n)return e.style.clipPath=K(1),C?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=K(0);}else if(n)return C?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};Ae();function de(){if(!ae||X)return;let t=performance.now(),o=ve(),a=l;if(j!==false){let i=t-Se,p=i>0?Math.abs(o-(me<0?o:me))/i:0;a=l*Math.max(.2,1+p*(typeof j=="number"?j:1)*.04);}me=o,Se=t;let d=_?ce===-1||o>=ce?"forward":"reverse":y;ce=o;let ye=W-z,Q=true;if(T){let i=be(H(o,z,W,a));G&&!_&&(L=Math.max(L,i),i=L),ue=i;let p=d==="reverse"?1-i:i;e.style.clipPath=K(p),Y?.(i),!U&&H(o,z,W,a)>0&&(U=true,J?.()),i>=1&&!R?(R=true,C?.(),se<(F==="infinite"?1/0:F??0)&&(se++,fe=setTimeout(()=>{L=-1,U=false,R=false,e.style.clipPath=K(0);},B))):i<1&&!G&&(R=false),V=requestAnimationFrame(de);return}if(oe.forEach((i,p)=>{let q=p*g*ye,m=be(H(o,z+q,W+q,a));G&&!_&&(L=Math.max(L,m),m=L),ue=m,i.style.strokeDashoffset=d==="reverse"?`${O[p]*m}`:`${O[p]*(1-m)}`,c&&(i.style.opacity=d==="reverse"?`${1-m}`:`${m}`),I&&$?i.style.stroke=$e(I,$,m):$&&(i.style.stroke=$),S!==null&&A!==null?i.style.strokeWidth=`${S+(A-S)*m}`:A!==null&&(i.style.strokeWidth=`${A}`),k!==null&&D!==null?i.style.fillOpacity=`${k+(D-k)*m}`:D!==null&&(i.style.fillOpacity=`${D}`),u&&i.tagName.toLowerCase()==="path"&&N[p]&&i.setAttribute("d",Ce(N[p],u,m)),p===0&&Y?.(m),m<1&&(Q=false);}),ne){let i=be(H(o,z,W,a));for(let p in ne){let q=parseFloat(p);i>=q&&!pe.has(q)&&(pe.add(q),ne[p]?.());}}!U&&H(o,z,W,a)>0&&(U=true,J?.()),Q&&!R?(R=true,C?.(),se<(F==="infinite"?1/0:F??0)&&(se++,fe=setTimeout(()=>{L=-1,U=false,R=false,pe.clear(),ke();},B))):!Q&&!G&&(R=false),V=requestAnimationFrame(de);}let xe=new IntersectionObserver(t=>{t.forEach(o=>{ae=o.isIntersecting,ae&&!X?V=requestAnimationFrame(de):cancelAnimationFrame(V);});},{root:v??null,threshold:ie,rootMargin:le}),Ee;function ge(){clearTimeout(Ee),Ee=setTimeout(()=>{oe.forEach((t,o)=>{O[o]=Te(t),t.style.strokeDasharray=`${O[o]}`;}),Ae();},150);}return window.addEventListener("resize",ge),window.addEventListener("orientationchange",ge),re>0?setTimeout(()=>xe.observe(e),re):xe.observe(e),{destroy(){cancelAnimationFrame(V),clearTimeout(fe),xe.disconnect(),window.removeEventListener("resize",ge),window.removeEventListener("orientationchange",ge),clearTimeout(Ee),we?.remove();},replay(){L=-1,ce=-1,me=-1,U=false,R=false,se=0,X=false,pe.clear(),clearTimeout(fe),ke();},pause(){X=true,cancelAnimationFrame(V);},resume(){X&&(X=false,ae&&(V=requestAnimationFrame(de)));},seek(t){let o=Math.min(1,Math.max(0,t));ue=o,L=o,X=true,cancelAnimationFrame(V),ze(o,y);},getProgress(){return ue}}}function Be(e,r={}){let[n,s]=useState(0),l=useRef(r);l.current=r;let c=useRef(-1);return useEffect(()=>{if(typeof window>"u")return;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches){s(1);return}let f=typeof e=="string"?document.querySelector(e):e.current;if(!f)return;let x=f,{axis:g="y",scrollContainer:y,trigger:G={}}=l.current,P=typeof y=="string"?document.querySelector(y):y??null,h=ee(G.start??"top bottom"),te=ee(G.end??"bottom top"),_=0,re=0,E=false,b=0;function M(){return P?g==="x"?P.scrollLeft:P.scrollTop:g==="x"?window.scrollX:window.scrollY}function ne(){return P?g==="x"?P.clientWidth:P.clientHeight:g==="x"?window.innerWidth:window.innerHeight}function j(){let u=x.getBoundingClientRect(),w=M(),Y=g==="x"?u.left:u.top,J=g==="x"?u.width:u.height,C=he({top:Y,height:J},w,ne(),h,te);_=C.tStart,re=C.tEnd;}function ie(){if(!E)return;let{speed:u=1,easing:w="linear",once:Y=false}=l.current,J=typeof w=="function"?w:Z[w]??Z.linear,C=H(M(),_,re,u),T=J(C);Y&&(c.current=Math.max(c.current,T),T=c.current),s(T),b=requestAnimationFrame(ie);}let le=new IntersectionObserver(u=>{u.forEach(w=>{E=w.isIntersecting,E?b=requestAnimationFrame(ie):cancelAnimationFrame(b);});},{root:P??null,threshold:0});j(),le.observe(x);let F;function B(){clearTimeout(F),F=setTimeout(j,150);}return window.addEventListener("resize",B),window.addEventListener("orientationchange",B),()=>{cancelAnimationFrame(b),clearTimeout(F),le.disconnect(),window.removeEventListener("resize",B),window.removeEventListener("orientationchange",B);}},[]),n}function nt({children:e,className:r,style:n,...s}){let l=useRef(null);return useEffect(()=>{if(!l.current)return;let c=Oe(l.current,s);return ()=>c.destroy()},[]),jsx("div",{ref:l,className:r,style:n,children:e})}export{nt as ScrollDraw,Be as useScrollDrawProgress};
@@ -1,3 +1,3 @@
1
- 'use strict';var solidJs=require('solid-js');var X={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)};function _(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[r="top",o="bottom"]=t.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function re(e,t,r,o){switch(o){case "top":return e+r;case "center":return e+r+t/2;case "bottom":return e+r+t;default:return e+r}}function ne(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 j(e){let t=e.tagName.toLowerCase();if(t==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(t==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function be(e,t,r){return Math.min(r,Math.max(t,e))}function z(e,t,r,o){return r===t?0:be((e-t)/(r-t)*o,0,1)}function se(e,t,r,o,i){let f=re(e.top,e.height,t,o.element)-ne(o.viewport,r),d=re(e.top,e.height,t,i.element)-ne(i.viewport,r);return {tStart:f,tEnd:d}}function oe(e){let t=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(t)return [parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[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 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 ie(e,t,r){let o=oe(e),i=oe(t);return !o||!i?e:`rgb(${Math.round(o[0]+(i[0]-o[0])*r)},${Math.round(o[1]+(i[1]-o[1])*r)},${Math.round(o[2]+(i[2]-o[2])*r)})`}function le(e,t){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,t);}function he(e){let t=e.getAttribute("stroke"),r=e.getAttribute("fill");!t||t==="none"?le("Element has no stroke \u2014 path will not be visible.",e):r&&r!=="none"&&r!=="transparent"&&le("Element has a fill \u2014 it may obscure the stroke animation.",e);}function we(e,t,r){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 i(){let f=r==="x"?window.scrollX:window.scrollY,d=e-f,A=t-f,T=r==="x";o.innerHTML=`
2
- <div style="position:absolute;${T?`left:${d}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${d}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;${T?`left:${A}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${A}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",i,{passive:true}),i(),o}function J(e,t={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{}};let r=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:i=1,fade:f=false,easing:d="linear",trigger:A={},stagger:T=0,direction:b="forward",once:K=false,debug:ue=false,axis:p="y",scrollContainer:W,autoReverse:Q=false,delay:U=0,strokeColor:h,strokeWidth:w,waypoints:G,onProgress:fe,onStart:pe,onComplete:Y}=t,Z=typeof d=="function"?d:X[d]??X.linear,de=_(A.start??"top bottom"),me=_(A.end??"bottom top"),l=typeof W=="string"?document.querySelector(W):W??null,v=Array.isArray(h)?h[0]:null,x=Array.isArray(h)?h[1]:typeof h=="string"?h:null,m=Array.isArray(w)?w[0]:null,E=Array.isArray(w)?w[1]:typeof w=="number"?w:null,I=Array.from(e.querySelectorAll(o)),g=[],S=0,$=0,M=false,V=false,L=0,N=false,C=-1,F=-1,P=null,R=new Set;function H(){return l?p==="x"?l.scrollLeft:l.scrollTop:p==="x"?window.scrollX:window.scrollY}function ge(){return l?p==="x"?l.clientWidth:l.clientHeight:p==="x"?window.innerWidth:window.innerHeight}function ee(){let n=e.getBoundingClientRect(),s,D,y;if(l){let c=l.getBoundingClientRect();s=p==="x"?n.left-c.left+l.scrollLeft:n.top-c.top+l.scrollTop,D=p==="x"?n.width:n.height,y=H();}else s=p==="x"?n.left:n.top,D=p==="x"?n.width:n.height,y=H();let a=se({top:s,height:D},y,ge(),de,me);S=a.tStart,$=a.tEnd,ue&&process.env.NODE_ENV!=="production"&&(P?.remove(),P=we(S,$,p));}function ye(){I.forEach((n,s)=>{n.style.strokeDasharray=`${g[s]}`,n.style.strokeDashoffset=b==="reverse"?"0":`${g[s]}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`);});}if(I.forEach(n=>{he(n);let s=j(n);g.push(s),r?(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?`${s}`:"0",f&&(n.style.opacity="1"),x&&(n.style.stroke=x),E!==null&&(n.style.strokeWidth=`${E}`)):(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?"0":`${s}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`));}),r)return Y?.(),{destroy:()=>{},replay:()=>{}};ee();function te(){if(!N)return;let n=H(),s=Q?F===-1||n>=F?"forward":"reverse":b;F=n;let D=$-S,y=true;if(I.forEach((a,c)=>{let k=c*T*D,u=Z(z(n,S+k,$+k,i));K&&!Q&&(C=Math.max(C,u),u=C),a.style.strokeDashoffset=s==="reverse"?`${g[c]*u}`:`${g[c]*(1-u)}`,f&&(a.style.opacity=s==="reverse"?`${1-u}`:`${u}`),v&&x?a.style.stroke=ie(v,x,u):x&&(a.style.stroke=x),m!==null&&E!==null?a.style.strokeWidth=`${m+(E-m)*u}`:E!==null&&(a.style.strokeWidth=`${E}`),c===0&&fe?.(u),u<1&&(y=false);}),G){let a=Z(z(n,S,$,i));for(let c in G){let k=parseFloat(c);a>=k&&!R.has(k)&&(R.add(k),G[c]?.());}}!V&&z(n,S,$,i)>0&&(V=true,pe?.()),y&&!M?(M=true,Y?.()):!y&&!K&&(M=false),L=requestAnimationFrame(te);}let q=new IntersectionObserver(n=>{n.forEach(s=>{N=s.isIntersecting,N?L=requestAnimationFrame(te):cancelAnimationFrame(L);});},{root:l??null}),B;function O(){clearTimeout(B),B=setTimeout(()=>{I.forEach((n,s)=>{g[s]=j(n),n.style.strokeDasharray=`${g[s]}`;}),ee();},150);}return window.addEventListener("resize",O),window.addEventListener("orientationchange",O),U>0?setTimeout(()=>q.observe(e),U):q.observe(e),{destroy(){cancelAnimationFrame(L),q.disconnect(),window.removeEventListener("resize",O),window.removeEventListener("orientationchange",O),clearTimeout(B),P?.remove();},replay(){C=-1,F=-1,V=false,M=false,R.clear(),ye();}}}function ke(e={}){let t,r;return solidJs.onMount(()=>{t&&(r=J(t,e));}),solidJs.onCleanup(()=>{r?.destroy();}),o=>{t=o;}}function Ae(e={}){let t,r;return solidJs.onMount(()=>{t&&(r=J(t,e));}),solidJs.onCleanup(()=>{r?.destroy(),r=void 0;}),{ref:o=>{t=o;},getInstance:()=>r}}exports.createScrollDraw=Ae;exports.useScrollDraw=ke;
1
+ 'use strict';var solidJs=require('solid-js');var me={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)};function de(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",o="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:o}}function Te(e,r,n,o){switch(o){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function ke(e,r){if(/^\d+(\.\d+)?%$/.test(e))return r*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return r/2;case "bottom":return r;default:return r}}function ye(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(n+o)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function Ve(e,r,n){return Math.min(n,Math.max(r,e))}function z(e,r,n,o){return n===r?0:Ve((e-r)/(n-r)*o,0,1)}function Me(e,r,n,o,a){let f=Te(e.top,e.height,r,o.element)-ke(o.viewport,n),p=Te(e.top,e.height,r,a.element)-ke(a.viewport,n);return {tStart:f,tEnd:p}}function Se(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let 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 ge(e,r,n){let o=Se(e),a=Se(r);return !o||!a?e:`rgb(${Math.round(o[0]+(a[0]-o[0])*n)},${Math.round(o[1]+(a[1]-o[1])*n)},${Math.round(o[2]+(a[2]-o[2])*n)})`}function De(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}function ze(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?De("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&De("Element has a fill \u2014 it may obscure the stroke animation.",e);}function Ge(e,r,n){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 a(){let f=n==="x"?window.scrollX:window.scrollY,p=e-f,L=r-f,B=n==="x";o.innerHTML=`
2
+ <div style="position:absolute;${B?`left:${p}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${p}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;${B?`left:${L}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${L}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",a,{passive:true}),a(),o}function Le(e,r,n){let o=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),a=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,f=>{let p=parseFloat(f),L=o[a++]??p;return String(+(p+(L-p)*n).toFixed(4))})}function he(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:a=1,fade:f=false,easing:p="linear",trigger:L={},stagger:B=0,direction:I="forward",once:X=false,debug:Ce=false,axis:x="y",scrollContainer:ne,autoReverse:se=false,delay:be=0,strokeColor:P,strokeWidth:N,fillOpacity:R,waypoints:oe,velocityScale:ie=false,threshold:Fe=0,rootMargin:Pe="0px",repeat:_=0,repeatDelay:we=0,morphTo:O,clip:le,onProgress:ve,onStart:xe,onComplete:j}=r,H=le===true?"left":typeof le=="string"?le:false,ae=typeof p=="function"?p:me[p]??me.linear,Ne=de(L.start??"top bottom"),Re=de(L.end??"bottom top"),d=typeof ne=="string"?document.querySelector(ne):ne??null,A=Array.isArray(P)?P[0]:null,y=Array.isArray(P)?P[1]:typeof P=="string"?P:null,g=Array.isArray(N)?N[0]:null,h=Array.isArray(N)?N[1]:typeof N=="number"?N:null,b=Array.isArray(R)?R[0]:null,w=Array.isArray(R)?R[1]:typeof R=="number"?R:null;function W(t){let s=t*100;switch(H){case "right":return `inset(0 0 0 ${100-s}%)`;case "top":return `inset(0 0 ${100-s}% 0)`;case "bottom":return `inset(${100-s}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-s}% 0 0)`}}let G=H?[]:Array.from(e.querySelectorAll(o)),E=[],T=[],k=0,S=0,$=false,C=false,M=0,J=false,v=-1,K=-1,F=false,Q=0,q=0,U,ue=null,Y=new Set,Z=-1,Ee=performance.now();function ce(){return d?x==="x"?d.scrollLeft:d.scrollTop:x==="x"?window.scrollX:window.scrollY}function He(){return d?x==="x"?d.clientWidth:d.clientHeight:x==="x"?window.innerWidth:window.innerHeight}function $e(){let t=e.getBoundingClientRect(),s,l,m;if(d){let V=d.getBoundingClientRect();s=x==="x"?t.left-V.left+d.scrollLeft:t.top-V.top+d.scrollTop,l=x==="x"?t.width:t.height,m=ce();}else s=x==="x"?t.left:t.top,l=x==="x"?t.width:t.height,m=ce();let re=Me({top:s,height:l},m,He(),Ne,Re);k=re.tStart,S=re.tEnd,Ce&&process.env.NODE_ENV!=="production"&&(ue?.remove(),ue=Ge(k,S,x));}function We(t,s){if(H){let l=s==="reverse"?1-t:t;e.style.clipPath=W(l);return}G.forEach((l,m)=>{l.style.strokeDashoffset=s==="reverse"?`${E[m]*t}`:`${E[m]*(1-t)}`,f&&(l.style.opacity=s==="reverse"?`${1-t}`:`${t}`),A&&y?l.style.stroke=ge(A,y,t):y&&(l.style.stroke=y),g!==null&&h!==null?l.style.strokeWidth=`${g+(h-g)*t}`:h!==null&&(l.style.strokeWidth=`${h}`),b!==null&&w!==null?l.style.fillOpacity=`${b+(w-b)*t}`:w!==null&&(l.style.fillOpacity=`${w}`),O&&l.tagName.toLowerCase()==="path"&&T[m]&&l.setAttribute("d",Le(T[m],O,t));});}function Ae(){if(H){e.style.clipPath=W(0);return}G.forEach((t,s)=>{t.style.strokeDasharray=`${E[s]}`,t.style.strokeDashoffset=I==="reverse"?"0":`${E[s]}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`),O&&t.tagName.toLowerCase()==="path"&&T[s]&&t.setAttribute("d",T[s]);});}if(G.forEach(t=>{ze(t);let s=ye(t);E.push(s),t.tagName.toLowerCase()==="path"?T.push(t.getAttribute("d")??""):T.push(""),n?(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?`${s}`:"0",f&&(t.style.opacity="1"),y&&(t.style.stroke=y),h!==null&&(t.style.strokeWidth=`${h}`),w!==null&&(t.style.fillOpacity=`${w}`),O&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",O)):(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?"0":`${s}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`));}),H){if(n)return e.style.clipPath=W(1),j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=W(0);}else if(n)return j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};$e();function ee(){if(!J||F)return;let t=performance.now(),s=ce(),l=a;if(ie!==false){let i=t-Ee,u=i>0?Math.abs(s-(Z<0?s:Z))/i:0;l=a*Math.max(.2,1+u*(typeof ie=="number"?ie:1)*.04);}Z=s,Ee=t;let m=se?K===-1||s>=K?"forward":"reverse":I;K=s;let re=S-k,V=true;if(H){let i=ae(z(s,k,S,l));X&&!se&&(v=Math.max(v,i),i=v),Q=i;let u=m==="reverse"?1-i:i;e.style.clipPath=W(u),ve?.(i),!C&&z(s,k,S,l)>0&&(C=true,xe?.()),i>=1&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,C=false,$=false,e.style.clipPath=W(0);},we))):i<1&&!X&&($=false),M=requestAnimationFrame(ee);return}if(G.forEach((i,u)=>{let D=u*B*re,c=ae(z(s,k+D,S+D,l));X&&!se&&(v=Math.max(v,c),c=v),Q=c,i.style.strokeDashoffset=m==="reverse"?`${E[u]*c}`:`${E[u]*(1-c)}`,f&&(i.style.opacity=m==="reverse"?`${1-c}`:`${c}`),A&&y?i.style.stroke=ge(A,y,c):y&&(i.style.stroke=y),g!==null&&h!==null?i.style.strokeWidth=`${g+(h-g)*c}`:h!==null&&(i.style.strokeWidth=`${h}`),b!==null&&w!==null?i.style.fillOpacity=`${b+(w-b)*c}`:w!==null&&(i.style.fillOpacity=`${w}`),O&&i.tagName.toLowerCase()==="path"&&T[u]&&i.setAttribute("d",Le(T[u],O,c)),u===0&&ve?.(c),c<1&&(V=false);}),oe){let i=ae(z(s,k,S,l));for(let u in oe){let D=parseFloat(u);i>=D&&!Y.has(D)&&(Y.add(D),oe[u]?.());}}!C&&z(s,k,S,l)>0&&(C=true,xe?.()),V&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,C=false,$=false,Y.clear(),Ae();},we))):!V&&!X&&($=false),M=requestAnimationFrame(ee);}let fe=new IntersectionObserver(t=>{t.forEach(s=>{J=s.isIntersecting,J&&!F?M=requestAnimationFrame(ee):cancelAnimationFrame(M);});},{root:d??null,threshold:Fe,rootMargin:Pe}),pe;function te(){clearTimeout(pe),pe=setTimeout(()=>{G.forEach((t,s)=>{E[s]=ye(t),t.style.strokeDasharray=`${E[s]}`;}),$e();},150);}return window.addEventListener("resize",te),window.addEventListener("orientationchange",te),be>0?setTimeout(()=>fe.observe(e),be):fe.observe(e),{destroy(){cancelAnimationFrame(M),clearTimeout(U),fe.disconnect(),window.removeEventListener("resize",te),window.removeEventListener("orientationchange",te),clearTimeout(pe),ue?.remove();},replay(){v=-1,K=-1,Z=-1,C=false,$=false,q=0,F=false,Y.clear(),clearTimeout(U),Ae();},pause(){F=true,cancelAnimationFrame(M);},resume(){F&&(F=false,J&&(M=requestAnimationFrame(ee)));},seek(t){let s=Math.min(1,Math.max(0,t));Q=s,v=s,F=true,cancelAnimationFrame(M),We(s,I);},getProgress(){return Q}}}function Je(e={}){let r,n;return solidJs.onMount(()=>{r&&(n=he(r,e));}),solidJs.onCleanup(()=>{n?.destroy();}),o=>{r=o;}}function Ke(e={}){let r,n;return solidJs.onMount(()=>{r&&(n=he(r,e));}),solidJs.onCleanup(()=>{n?.destroy(),n=void 0;}),{ref:o=>{r=o;},getInstance:()=>n}}exports.createScrollDraw=Ke;exports.useScrollDraw=Je;
@@ -19,14 +19,34 @@ interface ScrollDrawOptions {
19
19
  scrollContainer?: string | Element;
20
20
  /** Automatically reverse the animation when the user scrolls back up. */
21
21
  autoReverse?: boolean;
22
- /** Delay in milliseconds before the engine starts observing (useful for page-load sequences). */
22
+ /** Delay in milliseconds before the engine starts observing. */
23
23
  delay?: number;
24
24
  /** Animate stroke color. Single string = static override. Tuple = interpolate from → to. */
25
25
  strokeColor?: string | [string, string];
26
26
  /** Animate stroke width. Single number = static override. Tuple = interpolate from → to. */
27
27
  strokeWidth?: number | [number, number];
28
+ /** Animate fill opacity. Single number = static override. Tuple [from, to] = interpolate as the path draws. Use [0, 1] to flood fill in sync with the stroke draw. */
29
+ fillOpacity?: number | [number, number];
30
+ /**
31
+ * Reveal the container using CSS clip-path instead of stroke-dashoffset.
32
+ * Works on any content — SVG, images, text, divs.
33
+ * `true` defaults to `'left'`. Values: `'left' | 'right' | 'top' | 'bottom' | 'center'`.
34
+ */
35
+ clip?: boolean | 'left' | 'right' | 'top' | 'bottom' | 'center';
28
36
  /** Fire callbacks at specific progress thresholds (0–1). Resets on replay(). */
29
37
  waypoints?: Record<number, () => void>;
38
+ /** Scale animation speed by scroll velocity — faster scrolling = faster draw. Pass a number to control sensitivity (default 1). */
39
+ velocityScale?: boolean | number;
40
+ /** IntersectionObserver threshold (0–1). Default 0. */
41
+ threshold?: number;
42
+ /** IntersectionObserver rootMargin. Default "0px". */
43
+ rootMargin?: string;
44
+ /** Repeat the animation N times after completion. Use 'infinite' to loop forever. */
45
+ repeat?: number | 'infinite';
46
+ /** Milliseconds to wait between repeats. Default 0. */
47
+ repeatDelay?: number;
48
+ /** Target path `d` attribute to morph toward as the animation progresses. Paths must have compatible structures. */
49
+ morphTo?: string;
30
50
  onProgress?: (alpha: number) => void;
31
51
  onStart?: () => void;
32
52
  onComplete?: () => void;
@@ -35,6 +55,14 @@ interface ScrollDrawInstance {
35
55
  destroy: () => void;
36
56
  /** Reset and replay the animation from the beginning. */
37
57
  replay: () => void;
58
+ /** Pause the animation at the current progress. */
59
+ pause: () => void;
60
+ /** Resume a paused animation. */
61
+ resume: () => void;
62
+ /** Jump to a specific progress value (0–1) and pause. */
63
+ seek: (progress: number) => void;
64
+ /** Returns current draw progress (0–1). */
65
+ getProgress: () => number;
38
66
  }
39
67
 
40
68
  /**
@@ -19,14 +19,34 @@ interface ScrollDrawOptions {
19
19
  scrollContainer?: string | Element;
20
20
  /** Automatically reverse the animation when the user scrolls back up. */
21
21
  autoReverse?: boolean;
22
- /** Delay in milliseconds before the engine starts observing (useful for page-load sequences). */
22
+ /** Delay in milliseconds before the engine starts observing. */
23
23
  delay?: number;
24
24
  /** Animate stroke color. Single string = static override. Tuple = interpolate from → to. */
25
25
  strokeColor?: string | [string, string];
26
26
  /** Animate stroke width. Single number = static override. Tuple = interpolate from → to. */
27
27
  strokeWidth?: number | [number, number];
28
+ /** Animate fill opacity. Single number = static override. Tuple [from, to] = interpolate as the path draws. Use [0, 1] to flood fill in sync with the stroke draw. */
29
+ fillOpacity?: number | [number, number];
30
+ /**
31
+ * Reveal the container using CSS clip-path instead of stroke-dashoffset.
32
+ * Works on any content — SVG, images, text, divs.
33
+ * `true` defaults to `'left'`. Values: `'left' | 'right' | 'top' | 'bottom' | 'center'`.
34
+ */
35
+ clip?: boolean | 'left' | 'right' | 'top' | 'bottom' | 'center';
28
36
  /** Fire callbacks at specific progress thresholds (0–1). Resets on replay(). */
29
37
  waypoints?: Record<number, () => void>;
38
+ /** Scale animation speed by scroll velocity — faster scrolling = faster draw. Pass a number to control sensitivity (default 1). */
39
+ velocityScale?: boolean | number;
40
+ /** IntersectionObserver threshold (0–1). Default 0. */
41
+ threshold?: number;
42
+ /** IntersectionObserver rootMargin. Default "0px". */
43
+ rootMargin?: string;
44
+ /** Repeat the animation N times after completion. Use 'infinite' to loop forever. */
45
+ repeat?: number | 'infinite';
46
+ /** Milliseconds to wait between repeats. Default 0. */
47
+ repeatDelay?: number;
48
+ /** Target path `d` attribute to morph toward as the animation progresses. Paths must have compatible structures. */
49
+ morphTo?: string;
30
50
  onProgress?: (alpha: number) => void;
31
51
  onStart?: () => void;
32
52
  onComplete?: () => void;
@@ -35,6 +55,14 @@ interface ScrollDrawInstance {
35
55
  destroy: () => void;
36
56
  /** Reset and replay the animation from the beginning. */
37
57
  replay: () => void;
58
+ /** Pause the animation at the current progress. */
59
+ pause: () => void;
60
+ /** Resume a paused animation. */
61
+ resume: () => void;
62
+ /** Jump to a specific progress value (0–1) and pause. */
63
+ seek: (progress: number) => void;
64
+ /** Returns current draw progress (0–1). */
65
+ getProgress: () => number;
38
66
  }
39
67
 
40
68
  /**
@@ -1,3 +1,3 @@
1
- import {onMount,onCleanup}from'solid-js';var X={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)};function _(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[r="top",o="bottom"]=t.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function re(e,t,r,o){switch(o){case "top":return e+r;case "center":return e+r+t/2;case "bottom":return e+r+t;default:return e+r}}function ne(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 j(e){let t=e.tagName.toLowerCase();if(t==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(t==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function be(e,t,r){return Math.min(r,Math.max(t,e))}function z(e,t,r,o){return r===t?0:be((e-t)/(r-t)*o,0,1)}function se(e,t,r,o,i){let f=re(e.top,e.height,t,o.element)-ne(o.viewport,r),d=re(e.top,e.height,t,i.element)-ne(i.viewport,r);return {tStart:f,tEnd:d}}function oe(e){let t=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(t)return [parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[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 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 ie(e,t,r){let o=oe(e),i=oe(t);return !o||!i?e:`rgb(${Math.round(o[0]+(i[0]-o[0])*r)},${Math.round(o[1]+(i[1]-o[1])*r)},${Math.round(o[2]+(i[2]-o[2])*r)})`}function le(e,t){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,t);}function he(e){let t=e.getAttribute("stroke"),r=e.getAttribute("fill");!t||t==="none"?le("Element has no stroke \u2014 path will not be visible.",e):r&&r!=="none"&&r!=="transparent"&&le("Element has a fill \u2014 it may obscure the stroke animation.",e);}function we(e,t,r){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 i(){let f=r==="x"?window.scrollX:window.scrollY,d=e-f,A=t-f,T=r==="x";o.innerHTML=`
2
- <div style="position:absolute;${T?`left:${d}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${d}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;${T?`left:${A}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${A}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",i,{passive:true}),i(),o}function J(e,t={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{}};let r=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:i=1,fade:f=false,easing:d="linear",trigger:A={},stagger:T=0,direction:b="forward",once:K=false,debug:ue=false,axis:p="y",scrollContainer:W,autoReverse:Q=false,delay:U=0,strokeColor:h,strokeWidth:w,waypoints:G,onProgress:fe,onStart:pe,onComplete:Y}=t,Z=typeof d=="function"?d:X[d]??X.linear,de=_(A.start??"top bottom"),me=_(A.end??"bottom top"),l=typeof W=="string"?document.querySelector(W):W??null,v=Array.isArray(h)?h[0]:null,x=Array.isArray(h)?h[1]:typeof h=="string"?h:null,m=Array.isArray(w)?w[0]:null,E=Array.isArray(w)?w[1]:typeof w=="number"?w:null,I=Array.from(e.querySelectorAll(o)),g=[],S=0,$=0,M=false,V=false,L=0,N=false,C=-1,F=-1,P=null,R=new Set;function H(){return l?p==="x"?l.scrollLeft:l.scrollTop:p==="x"?window.scrollX:window.scrollY}function ge(){return l?p==="x"?l.clientWidth:l.clientHeight:p==="x"?window.innerWidth:window.innerHeight}function ee(){let n=e.getBoundingClientRect(),s,D,y;if(l){let c=l.getBoundingClientRect();s=p==="x"?n.left-c.left+l.scrollLeft:n.top-c.top+l.scrollTop,D=p==="x"?n.width:n.height,y=H();}else s=p==="x"?n.left:n.top,D=p==="x"?n.width:n.height,y=H();let a=se({top:s,height:D},y,ge(),de,me);S=a.tStart,$=a.tEnd,ue&&process.env.NODE_ENV!=="production"&&(P?.remove(),P=we(S,$,p));}function ye(){I.forEach((n,s)=>{n.style.strokeDasharray=`${g[s]}`,n.style.strokeDashoffset=b==="reverse"?"0":`${g[s]}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`);});}if(I.forEach(n=>{he(n);let s=j(n);g.push(s),r?(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?`${s}`:"0",f&&(n.style.opacity="1"),x&&(n.style.stroke=x),E!==null&&(n.style.strokeWidth=`${E}`)):(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?"0":`${s}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`));}),r)return Y?.(),{destroy:()=>{},replay:()=>{}};ee();function te(){if(!N)return;let n=H(),s=Q?F===-1||n>=F?"forward":"reverse":b;F=n;let D=$-S,y=true;if(I.forEach((a,c)=>{let k=c*T*D,u=Z(z(n,S+k,$+k,i));K&&!Q&&(C=Math.max(C,u),u=C),a.style.strokeDashoffset=s==="reverse"?`${g[c]*u}`:`${g[c]*(1-u)}`,f&&(a.style.opacity=s==="reverse"?`${1-u}`:`${u}`),v&&x?a.style.stroke=ie(v,x,u):x&&(a.style.stroke=x),m!==null&&E!==null?a.style.strokeWidth=`${m+(E-m)*u}`:E!==null&&(a.style.strokeWidth=`${E}`),c===0&&fe?.(u),u<1&&(y=false);}),G){let a=Z(z(n,S,$,i));for(let c in G){let k=parseFloat(c);a>=k&&!R.has(k)&&(R.add(k),G[c]?.());}}!V&&z(n,S,$,i)>0&&(V=true,pe?.()),y&&!M?(M=true,Y?.()):!y&&!K&&(M=false),L=requestAnimationFrame(te);}let q=new IntersectionObserver(n=>{n.forEach(s=>{N=s.isIntersecting,N?L=requestAnimationFrame(te):cancelAnimationFrame(L);});},{root:l??null}),B;function O(){clearTimeout(B),B=setTimeout(()=>{I.forEach((n,s)=>{g[s]=j(n),n.style.strokeDasharray=`${g[s]}`;}),ee();},150);}return window.addEventListener("resize",O),window.addEventListener("orientationchange",O),U>0?setTimeout(()=>q.observe(e),U):q.observe(e),{destroy(){cancelAnimationFrame(L),q.disconnect(),window.removeEventListener("resize",O),window.removeEventListener("orientationchange",O),clearTimeout(B),P?.remove();},replay(){C=-1,F=-1,V=false,M=false,R.clear(),ye();}}}function ke(e={}){let t,r;return onMount(()=>{t&&(r=J(t,e));}),onCleanup(()=>{r?.destroy();}),o=>{t=o;}}function Ae(e={}){let t,r;return onMount(()=>{t&&(r=J(t,e));}),onCleanup(()=>{r?.destroy(),r=void 0;}),{ref:o=>{t=o;},getInstance:()=>r}}export{Ae as createScrollDraw,ke as useScrollDraw};
1
+ import {onMount,onCleanup}from'solid-js';var me={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)};function de(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",o="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:o}}function Te(e,r,n,o){switch(o){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function ke(e,r){if(/^\d+(\.\d+)?%$/.test(e))return r*(parseFloat(e)/100);switch(e){case "top":return 0;case "center":return r/2;case "bottom":return r;default:return r}}function ye(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(n+o)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function Ve(e,r,n){return Math.min(n,Math.max(r,e))}function z(e,r,n,o){return n===r?0:Ve((e-r)/(n-r)*o,0,1)}function Me(e,r,n,o,a){let f=Te(e.top,e.height,r,o.element)-ke(o.viewport,n),p=Te(e.top,e.height,r,a.element)-ke(a.viewport,n);return {tStart:f,tEnd:p}}function Se(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let 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 ge(e,r,n){let o=Se(e),a=Se(r);return !o||!a?e:`rgb(${Math.round(o[0]+(a[0]-o[0])*n)},${Math.round(o[1]+(a[1]-o[1])*n)},${Math.round(o[2]+(a[2]-o[2])*n)})`}function De(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}function ze(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?De("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&De("Element has a fill \u2014 it may obscure the stroke animation.",e);}function Ge(e,r,n){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 a(){let f=n==="x"?window.scrollX:window.scrollY,p=e-f,L=r-f,B=n==="x";o.innerHTML=`
2
+ <div style="position:absolute;${B?`left:${p}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${p}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;${B?`left:${L}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${L}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",a,{passive:true}),a(),o}function Le(e,r,n){let o=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),a=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,f=>{let p=parseFloat(f),L=o[a++]??p;return String(+(p+(L-p)*n).toFixed(4))})}function he(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:a=1,fade:f=false,easing:p="linear",trigger:L={},stagger:B=0,direction:I="forward",once:X=false,debug:Ce=false,axis:x="y",scrollContainer:ne,autoReverse:se=false,delay:be=0,strokeColor:P,strokeWidth:N,fillOpacity:R,waypoints:oe,velocityScale:ie=false,threshold:Fe=0,rootMargin:Pe="0px",repeat:_=0,repeatDelay:we=0,morphTo:O,clip:le,onProgress:ve,onStart:xe,onComplete:j}=r,H=le===true?"left":typeof le=="string"?le:false,ae=typeof p=="function"?p:me[p]??me.linear,Ne=de(L.start??"top bottom"),Re=de(L.end??"bottom top"),d=typeof ne=="string"?document.querySelector(ne):ne??null,A=Array.isArray(P)?P[0]:null,y=Array.isArray(P)?P[1]:typeof P=="string"?P:null,g=Array.isArray(N)?N[0]:null,h=Array.isArray(N)?N[1]:typeof N=="number"?N:null,b=Array.isArray(R)?R[0]:null,w=Array.isArray(R)?R[1]:typeof R=="number"?R:null;function W(t){let s=t*100;switch(H){case "right":return `inset(0 0 0 ${100-s}%)`;case "top":return `inset(0 0 ${100-s}% 0)`;case "bottom":return `inset(${100-s}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-s}% 0 0)`}}let G=H?[]:Array.from(e.querySelectorAll(o)),E=[],T=[],k=0,S=0,$=false,C=false,M=0,J=false,v=-1,K=-1,F=false,Q=0,q=0,U,ue=null,Y=new Set,Z=-1,Ee=performance.now();function ce(){return d?x==="x"?d.scrollLeft:d.scrollTop:x==="x"?window.scrollX:window.scrollY}function He(){return d?x==="x"?d.clientWidth:d.clientHeight:x==="x"?window.innerWidth:window.innerHeight}function $e(){let t=e.getBoundingClientRect(),s,l,m;if(d){let V=d.getBoundingClientRect();s=x==="x"?t.left-V.left+d.scrollLeft:t.top-V.top+d.scrollTop,l=x==="x"?t.width:t.height,m=ce();}else s=x==="x"?t.left:t.top,l=x==="x"?t.width:t.height,m=ce();let re=Me({top:s,height:l},m,He(),Ne,Re);k=re.tStart,S=re.tEnd,Ce&&process.env.NODE_ENV!=="production"&&(ue?.remove(),ue=Ge(k,S,x));}function We(t,s){if(H){let l=s==="reverse"?1-t:t;e.style.clipPath=W(l);return}G.forEach((l,m)=>{l.style.strokeDashoffset=s==="reverse"?`${E[m]*t}`:`${E[m]*(1-t)}`,f&&(l.style.opacity=s==="reverse"?`${1-t}`:`${t}`),A&&y?l.style.stroke=ge(A,y,t):y&&(l.style.stroke=y),g!==null&&h!==null?l.style.strokeWidth=`${g+(h-g)*t}`:h!==null&&(l.style.strokeWidth=`${h}`),b!==null&&w!==null?l.style.fillOpacity=`${b+(w-b)*t}`:w!==null&&(l.style.fillOpacity=`${w}`),O&&l.tagName.toLowerCase()==="path"&&T[m]&&l.setAttribute("d",Le(T[m],O,t));});}function Ae(){if(H){e.style.clipPath=W(0);return}G.forEach((t,s)=>{t.style.strokeDasharray=`${E[s]}`,t.style.strokeDashoffset=I==="reverse"?"0":`${E[s]}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`),O&&t.tagName.toLowerCase()==="path"&&T[s]&&t.setAttribute("d",T[s]);});}if(G.forEach(t=>{ze(t);let s=ye(t);E.push(s),t.tagName.toLowerCase()==="path"?T.push(t.getAttribute("d")??""):T.push(""),n?(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?`${s}`:"0",f&&(t.style.opacity="1"),y&&(t.style.stroke=y),h!==null&&(t.style.strokeWidth=`${h}`),w!==null&&(t.style.fillOpacity=`${w}`),O&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",O)):(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?"0":`${s}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`));}),H){if(n)return e.style.clipPath=W(1),j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=W(0);}else if(n)return j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};$e();function ee(){if(!J||F)return;let t=performance.now(),s=ce(),l=a;if(ie!==false){let i=t-Ee,u=i>0?Math.abs(s-(Z<0?s:Z))/i:0;l=a*Math.max(.2,1+u*(typeof ie=="number"?ie:1)*.04);}Z=s,Ee=t;let m=se?K===-1||s>=K?"forward":"reverse":I;K=s;let re=S-k,V=true;if(H){let i=ae(z(s,k,S,l));X&&!se&&(v=Math.max(v,i),i=v),Q=i;let u=m==="reverse"?1-i:i;e.style.clipPath=W(u),ve?.(i),!C&&z(s,k,S,l)>0&&(C=true,xe?.()),i>=1&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,C=false,$=false,e.style.clipPath=W(0);},we))):i<1&&!X&&($=false),M=requestAnimationFrame(ee);return}if(G.forEach((i,u)=>{let D=u*B*re,c=ae(z(s,k+D,S+D,l));X&&!se&&(v=Math.max(v,c),c=v),Q=c,i.style.strokeDashoffset=m==="reverse"?`${E[u]*c}`:`${E[u]*(1-c)}`,f&&(i.style.opacity=m==="reverse"?`${1-c}`:`${c}`),A&&y?i.style.stroke=ge(A,y,c):y&&(i.style.stroke=y),g!==null&&h!==null?i.style.strokeWidth=`${g+(h-g)*c}`:h!==null&&(i.style.strokeWidth=`${h}`),b!==null&&w!==null?i.style.fillOpacity=`${b+(w-b)*c}`:w!==null&&(i.style.fillOpacity=`${w}`),O&&i.tagName.toLowerCase()==="path"&&T[u]&&i.setAttribute("d",Le(T[u],O,c)),u===0&&ve?.(c),c<1&&(V=false);}),oe){let i=ae(z(s,k,S,l));for(let u in oe){let D=parseFloat(u);i>=D&&!Y.has(D)&&(Y.add(D),oe[u]?.());}}!C&&z(s,k,S,l)>0&&(C=true,xe?.()),V&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,C=false,$=false,Y.clear(),Ae();},we))):!V&&!X&&($=false),M=requestAnimationFrame(ee);}let fe=new IntersectionObserver(t=>{t.forEach(s=>{J=s.isIntersecting,J&&!F?M=requestAnimationFrame(ee):cancelAnimationFrame(M);});},{root:d??null,threshold:Fe,rootMargin:Pe}),pe;function te(){clearTimeout(pe),pe=setTimeout(()=>{G.forEach((t,s)=>{E[s]=ye(t),t.style.strokeDasharray=`${E[s]}`;}),$e();},150);}return window.addEventListener("resize",te),window.addEventListener("orientationchange",te),be>0?setTimeout(()=>fe.observe(e),be):fe.observe(e),{destroy(){cancelAnimationFrame(M),clearTimeout(U),fe.disconnect(),window.removeEventListener("resize",te),window.removeEventListener("orientationchange",te),clearTimeout(pe),ue?.remove();},replay(){v=-1,K=-1,Z=-1,C=false,$=false,q=0,F=false,Y.clear(),clearTimeout(U),Ae();},pause(){F=true,cancelAnimationFrame(M);},resume(){F&&(F=false,J&&(M=requestAnimationFrame(ee)));},seek(t){let s=Math.min(1,Math.max(0,t));Q=s,v=s,F=true,cancelAnimationFrame(M),We(s,I);},getProgress(){return Q}}}function Je(e={}){let r,n;return onMount(()=>{r&&(n=he(r,e));}),onCleanup(()=>{n?.destroy();}),o=>{r=o;}}function Ke(e={}){let r,n;return onMount(()=>{r&&(n=he(r,e));}),onCleanup(()=>{n?.destroy(),n=void 0;}),{ref:o=>{r=o;},getInstance:()=>n}}export{Ke as createScrollDraw,Je as useScrollDraw};
@@ -1,3 +1,3 @@
1
- 'use strict';var _={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)};function j(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[r="top",o="bottom"]=t.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function re(e,t,r,o){switch(o){case "top":return e+r;case "center":return e+r+t/2;case "bottom":return e+r+t;default:return e+r}}function ne(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 J(e){let t=e.tagName.toLowerCase();if(t==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(t==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function ye(e,t,r){return Math.min(r,Math.max(t,e))}function z(e,t,r,o){return r===t?0:ye((e-t)/(r-t)*o,0,1)}function se(e,t,r,o,i){let f=re(e.top,e.height,t,o.element)-ne(o.viewport,r),d=re(e.top,e.height,t,i.element)-ne(i.viewport,r);return {tStart:f,tEnd:d}}function oe(e){let t=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(t)return [parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[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 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 ie(e,t,r){let o=oe(e),i=oe(t);return !o||!i?e:`rgb(${Math.round(o[0]+(i[0]-o[0])*r)},${Math.round(o[1]+(i[1]-o[1])*r)},${Math.round(o[2]+(i[2]-o[2])*r)})`}function le(e,t){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,t);}function ge(e){let t=e.getAttribute("stroke"),r=e.getAttribute("fill");!t||t==="none"?le("Element has no stroke \u2014 path will not be visible.",e):r&&r!=="none"&&r!=="transparent"&&le("Element has a fill \u2014 it may obscure the stroke animation.",e);}function be(e,t,r){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 i(){let f=r==="x"?window.scrollX:window.scrollY,d=e-f,D=t-f,T=r==="x";o.innerHTML=`
2
- <div style="position:absolute;${T?`left:${d}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${d}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;${T?`left:${D}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${D}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",i,{passive:true}),i(),o}function W(e,t={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{}};let r=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:i=1,fade:f=false,easing:d="linear",trigger:D={},stagger:T=0,direction:b="forward",once:K=false,debug:ae=false,axis:p="y",scrollContainer:G,autoReverse:Q=false,delay:U=0,strokeColor:h,strokeWidth:w,waypoints:V,onProgress:ce,onStart:ue,onComplete:Y}=t,Z=typeof d=="function"?d:_[d]??_.linear,fe=j(D.start??"top bottom"),pe=j(D.end??"bottom top"),l=typeof G=="string"?document.querySelector(G):G??null,v=Array.isArray(h)?h[0]:null,x=Array.isArray(h)?h[1]:typeof h=="string"?h:null,m=Array.isArray(w)?w[0]:null,E=Array.isArray(w)?w[1]:typeof w=="number"?w:null,I=Array.from(e.querySelectorAll(o)),y=[],S=0,$=0,L=false,N=false,M=0,P=false,F=-1,O=-1,R=null,q=new Set;function B(){return l?p==="x"?l.scrollLeft:l.scrollTop:p==="x"?window.scrollX:window.scrollY}function de(){return l?p==="x"?l.clientWidth:l.clientHeight:p==="x"?window.innerWidth:window.innerHeight}function ee(){let n=e.getBoundingClientRect(),s,A,g;if(l){let c=l.getBoundingClientRect();s=p==="x"?n.left-c.left+l.scrollLeft:n.top-c.top+l.scrollTop,A=p==="x"?n.width:n.height,g=B();}else s=p==="x"?n.left:n.top,A=p==="x"?n.width:n.height,g=B();let a=se({top:s,height:A},g,de(),fe,pe);S=a.tStart,$=a.tEnd,ae&&process.env.NODE_ENV!=="production"&&(R?.remove(),R=be(S,$,p));}function me(){I.forEach((n,s)=>{n.style.strokeDasharray=`${y[s]}`,n.style.strokeDashoffset=b==="reverse"?"0":`${y[s]}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`);});}if(I.forEach(n=>{ge(n);let s=J(n);y.push(s),r?(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?`${s}`:"0",f&&(n.style.opacity="1"),x&&(n.style.stroke=x),E!==null&&(n.style.strokeWidth=`${E}`)):(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?"0":`${s}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`));}),r)return Y?.(),{destroy:()=>{},replay:()=>{}};ee();function te(){if(!P)return;let n=B(),s=Q?O===-1||n>=O?"forward":"reverse":b;O=n;let A=$-S,g=true;if(I.forEach((a,c)=>{let k=c*T*A,u=Z(z(n,S+k,$+k,i));K&&!Q&&(F=Math.max(F,u),u=F),a.style.strokeDashoffset=s==="reverse"?`${y[c]*u}`:`${y[c]*(1-u)}`,f&&(a.style.opacity=s==="reverse"?`${1-u}`:`${u}`),v&&x?a.style.stroke=ie(v,x,u):x&&(a.style.stroke=x),m!==null&&E!==null?a.style.strokeWidth=`${m+(E-m)*u}`:E!==null&&(a.style.strokeWidth=`${E}`),c===0&&ce?.(u),u<1&&(g=false);}),V){let a=Z(z(n,S,$,i));for(let c in V){let k=parseFloat(c);a>=k&&!q.has(k)&&(q.add(k),V[c]?.());}}!N&&z(n,S,$,i)>0&&(N=true,ue?.()),g&&!L?(L=true,Y?.()):!g&&!K&&(L=false),M=requestAnimationFrame(te);}let H=new IntersectionObserver(n=>{n.forEach(s=>{P=s.isIntersecting,P?M=requestAnimationFrame(te):cancelAnimationFrame(M);});},{root:l??null}),X;function C(){clearTimeout(X),X=setTimeout(()=>{I.forEach((n,s)=>{y[s]=J(n),n.style.strokeDasharray=`${y[s]}`;}),ee();},150);}return window.addEventListener("resize",C),window.addEventListener("orientationchange",C),U>0?setTimeout(()=>H.observe(e),U):H.observe(e),{destroy(){cancelAnimationFrame(M),H.disconnect(),window.removeEventListener("resize",C),window.removeEventListener("orientationchange",C),clearTimeout(X),R?.remove();},replay(){F=-1,O=-1,N=false,L=false,q.clear(),me();}}}function Ee(e,t={}){let r=W(e,t);return {update(o){r.destroy(),r=W(e,o);},destroy(){r.destroy();}}}function Se(e={}){let t=null;function r(o){return t=W(o,e),{destroy(){t?.destroy(),t=null;}}}return {action:r,getInstance:()=>t}}exports.createScrollDraw=Se;exports.scrollDraw=Ee;
1
+ 'use strict';var de={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>e*(2-e),"ease-in-out":e=>e<.5?2*e*e:-1+(4-2*e)*e,spring:e=>1-Math.cos(e*Math.PI*2.5)*Math.pow(1-e,2.2)};function ye(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",o="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:o}}function Te(e,r,n,o){switch(o){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function ke(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 ge(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(n+o)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function We(e,r,n){return Math.min(n,Math.max(r,e))}function H(e,r,n,o){return n===r?0:We((e-r)/(n-r)*o,0,1)}function De(e,r,n,o,a){let f=Te(e.top,e.height,r,o.element)-ke(o.viewport,n),p=Te(e.top,e.height,r,a.element)-ke(a.viewport,n);return {tStart:f,tEnd:p}}function Se(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let 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 he(e,r,n){let o=Se(e),a=Se(r);return !o||!a?e:`rgb(${Math.round(o[0]+(a[0]-o[0])*n)},${Math.round(o[1]+(a[1]-o[1])*n)},${Math.round(o[2]+(a[2]-o[2])*n)})`}function Me(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}function Ve(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?Me("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&Me("Element has a fill \u2014 it may obscure the stroke animation.",e);}function ze(e,r,n){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 a(){let f=n==="x"?window.scrollX:window.scrollY,p=e-f,L=r-f,B=n==="x";o.innerHTML=`
2
+ <div style="position:absolute;${B?`left:${p}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${p}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;${B?`left:${L}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${L}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",a,{passive:true}),a(),o}function Le(e,r,n){let o=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),a=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,f=>{let p=parseFloat(f),L=o[a++]??p;return String(+(p+(L-p)*n).toFixed(4))})}function ne(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:a=1,fade:f=false,easing:p="linear",trigger:L={},stagger:B=0,direction:I="forward",once:X=false,debug:Ie=false,axis:x="y",scrollContainer:se,autoReverse:oe=false,delay:be=0,strokeColor:C,strokeWidth:N,fillOpacity:R,waypoints:ie,velocityScale:le=false,threshold:Oe=0,rootMargin:Fe="0px",repeat:_=0,repeatDelay:we=0,morphTo:O,clip:ae,onProgress:ve,onStart:xe,onComplete:j}=r,W=ae===true?"left":typeof ae=="string"?ae:false,ce=typeof p=="function"?p:de[p]??de.linear,Pe=ye(L.start??"top bottom"),Ce=ye(L.end??"bottom top"),d=typeof se=="string"?document.querySelector(se):se??null,A=Array.isArray(C)?C[0]:null,y=Array.isArray(C)?C[1]:typeof C=="string"?C:null,g=Array.isArray(N)?N[0]:null,h=Array.isArray(N)?N[1]:typeof N=="number"?N:null,b=Array.isArray(R)?R[0]:null,w=Array.isArray(R)?R[1]:typeof R=="number"?R:null;function V(t){let s=t*100;switch(W){case "right":return `inset(0 0 0 ${100-s}%)`;case "top":return `inset(0 0 ${100-s}% 0)`;case "bottom":return `inset(${100-s}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-s}% 0 0)`}}let G=W?[]:Array.from(e.querySelectorAll(o)),E=[],T=[],k=0,S=0,$=false,F=false,D=0,J=false,v=-1,K=-1,P=false,Q=0,q=0,U,ue=null,Y=new Set,Z=-1,Ee=performance.now();function fe(){return d?x==="x"?d.scrollLeft:d.scrollTop:x==="x"?window.scrollX:window.scrollY}function Ne(){return d?x==="x"?d.clientWidth:d.clientHeight:x==="x"?window.innerWidth:window.innerHeight}function $e(){let t=e.getBoundingClientRect(),s,l,m;if(d){let z=d.getBoundingClientRect();s=x==="x"?t.left-z.left+d.scrollLeft:t.top-z.top+d.scrollTop,l=x==="x"?t.width:t.height,m=fe();}else s=x==="x"?t.left:t.top,l=x==="x"?t.width:t.height,m=fe();let re=De({top:s,height:l},m,Ne(),Pe,Ce);k=re.tStart,S=re.tEnd,Ie&&process.env.NODE_ENV!=="production"&&(ue?.remove(),ue=ze(k,S,x));}function Re(t,s){if(W){let l=s==="reverse"?1-t:t;e.style.clipPath=V(l);return}G.forEach((l,m)=>{l.style.strokeDashoffset=s==="reverse"?`${E[m]*t}`:`${E[m]*(1-t)}`,f&&(l.style.opacity=s==="reverse"?`${1-t}`:`${t}`),A&&y?l.style.stroke=he(A,y,t):y&&(l.style.stroke=y),g!==null&&h!==null?l.style.strokeWidth=`${g+(h-g)*t}`:h!==null&&(l.style.strokeWidth=`${h}`),b!==null&&w!==null?l.style.fillOpacity=`${b+(w-b)*t}`:w!==null&&(l.style.fillOpacity=`${w}`),O&&l.tagName.toLowerCase()==="path"&&T[m]&&l.setAttribute("d",Le(T[m],O,t));});}function Ae(){if(W){e.style.clipPath=V(0);return}G.forEach((t,s)=>{t.style.strokeDasharray=`${E[s]}`,t.style.strokeDashoffset=I==="reverse"?"0":`${E[s]}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`),O&&t.tagName.toLowerCase()==="path"&&T[s]&&t.setAttribute("d",T[s]);});}if(G.forEach(t=>{Ve(t);let s=ge(t);E.push(s),t.tagName.toLowerCase()==="path"?T.push(t.getAttribute("d")??""):T.push(""),n?(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?`${s}`:"0",f&&(t.style.opacity="1"),y&&(t.style.stroke=y),h!==null&&(t.style.strokeWidth=`${h}`),w!==null&&(t.style.fillOpacity=`${w}`),O&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",O)):(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?"0":`${s}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`));}),W){if(n)return e.style.clipPath=V(1),j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=V(0);}else if(n)return j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};$e();function ee(){if(!J||P)return;let t=performance.now(),s=fe(),l=a;if(le!==false){let i=t-Ee,c=i>0?Math.abs(s-(Z<0?s:Z))/i:0;l=a*Math.max(.2,1+c*(typeof le=="number"?le:1)*.04);}Z=s,Ee=t;let m=oe?K===-1||s>=K?"forward":"reverse":I;K=s;let re=S-k,z=true;if(W){let i=ce(H(s,k,S,l));X&&!oe&&(v=Math.max(v,i),i=v),Q=i;let c=m==="reverse"?1-i:i;e.style.clipPath=V(c),ve?.(i),!F&&H(s,k,S,l)>0&&(F=true,xe?.()),i>=1&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,F=false,$=false,e.style.clipPath=V(0);},we))):i<1&&!X&&($=false),D=requestAnimationFrame(ee);return}if(G.forEach((i,c)=>{let M=c*B*re,u=ce(H(s,k+M,S+M,l));X&&!oe&&(v=Math.max(v,u),u=v),Q=u,i.style.strokeDashoffset=m==="reverse"?`${E[c]*u}`:`${E[c]*(1-u)}`,f&&(i.style.opacity=m==="reverse"?`${1-u}`:`${u}`),A&&y?i.style.stroke=he(A,y,u):y&&(i.style.stroke=y),g!==null&&h!==null?i.style.strokeWidth=`${g+(h-g)*u}`:h!==null&&(i.style.strokeWidth=`${h}`),b!==null&&w!==null?i.style.fillOpacity=`${b+(w-b)*u}`:w!==null&&(i.style.fillOpacity=`${w}`),O&&i.tagName.toLowerCase()==="path"&&T[c]&&i.setAttribute("d",Le(T[c],O,u)),c===0&&ve?.(u),u<1&&(z=false);}),ie){let i=ce(H(s,k,S,l));for(let c in ie){let M=parseFloat(c);i>=M&&!Y.has(M)&&(Y.add(M),ie[c]?.());}}!F&&H(s,k,S,l)>0&&(F=true,xe?.()),z&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,F=false,$=false,Y.clear(),Ae();},we))):!z&&!X&&($=false),D=requestAnimationFrame(ee);}let pe=new IntersectionObserver(t=>{t.forEach(s=>{J=s.isIntersecting,J&&!P?D=requestAnimationFrame(ee):cancelAnimationFrame(D);});},{root:d??null,threshold:Oe,rootMargin:Fe}),me;function te(){clearTimeout(me),me=setTimeout(()=>{G.forEach((t,s)=>{E[s]=ge(t),t.style.strokeDasharray=`${E[s]}`;}),$e();},150);}return window.addEventListener("resize",te),window.addEventListener("orientationchange",te),be>0?setTimeout(()=>pe.observe(e),be):pe.observe(e),{destroy(){cancelAnimationFrame(D),clearTimeout(U),pe.disconnect(),window.removeEventListener("resize",te),window.removeEventListener("orientationchange",te),clearTimeout(me),ue?.remove();},replay(){v=-1,K=-1,Z=-1,F=false,$=false,q=0,P=false,Y.clear(),clearTimeout(U),Ae();},pause(){P=true,cancelAnimationFrame(D);},resume(){P&&(P=false,J&&(D=requestAnimationFrame(ee)));},seek(t){let s=Math.min(1,Math.max(0,t));Q=s,v=s,P=true,cancelAnimationFrame(D),Re(s,I);},getProgress(){return Q}}}function Xe(e,r={}){let n=ne(e,r);return {update(o){n.destroy(),n=ne(e,o);},destroy(){n.destroy();}}}function _e(e={}){let r=null;function n(o){return r=ne(o,e),{destroy(){r?.destroy(),r=null;}}}return {action:n,getInstance:()=>r}}exports.createScrollDraw=_e;exports.scrollDraw=Xe;
@@ -19,14 +19,34 @@ interface ScrollDrawOptions {
19
19
  scrollContainer?: string | Element;
20
20
  /** Automatically reverse the animation when the user scrolls back up. */
21
21
  autoReverse?: boolean;
22
- /** Delay in milliseconds before the engine starts observing (useful for page-load sequences). */
22
+ /** Delay in milliseconds before the engine starts observing. */
23
23
  delay?: number;
24
24
  /** Animate stroke color. Single string = static override. Tuple = interpolate from → to. */
25
25
  strokeColor?: string | [string, string];
26
26
  /** Animate stroke width. Single number = static override. Tuple = interpolate from → to. */
27
27
  strokeWidth?: number | [number, number];
28
+ /** Animate fill opacity. Single number = static override. Tuple [from, to] = interpolate as the path draws. Use [0, 1] to flood fill in sync with the stroke draw. */
29
+ fillOpacity?: number | [number, number];
30
+ /**
31
+ * Reveal the container using CSS clip-path instead of stroke-dashoffset.
32
+ * Works on any content — SVG, images, text, divs.
33
+ * `true` defaults to `'left'`. Values: `'left' | 'right' | 'top' | 'bottom' | 'center'`.
34
+ */
35
+ clip?: boolean | 'left' | 'right' | 'top' | 'bottom' | 'center';
28
36
  /** Fire callbacks at specific progress thresholds (0–1). Resets on replay(). */
29
37
  waypoints?: Record<number, () => void>;
38
+ /** Scale animation speed by scroll velocity — faster scrolling = faster draw. Pass a number to control sensitivity (default 1). */
39
+ velocityScale?: boolean | number;
40
+ /** IntersectionObserver threshold (0–1). Default 0. */
41
+ threshold?: number;
42
+ /** IntersectionObserver rootMargin. Default "0px". */
43
+ rootMargin?: string;
44
+ /** Repeat the animation N times after completion. Use 'infinite' to loop forever. */
45
+ repeat?: number | 'infinite';
46
+ /** Milliseconds to wait between repeats. Default 0. */
47
+ repeatDelay?: number;
48
+ /** Target path `d` attribute to morph toward as the animation progresses. Paths must have compatible structures. */
49
+ morphTo?: string;
30
50
  onProgress?: (alpha: number) => void;
31
51
  onStart?: () => void;
32
52
  onComplete?: () => void;
@@ -35,6 +55,14 @@ interface ScrollDrawInstance {
35
55
  destroy: () => void;
36
56
  /** Reset and replay the animation from the beginning. */
37
57
  replay: () => void;
58
+ /** Pause the animation at the current progress. */
59
+ pause: () => void;
60
+ /** Resume a paused animation. */
61
+ resume: () => void;
62
+ /** Jump to a specific progress value (0–1) and pause. */
63
+ seek: (progress: number) => void;
64
+ /** Returns current draw progress (0–1). */
65
+ getProgress: () => number;
38
66
  }
39
67
 
40
68
  /**
@@ -19,14 +19,34 @@ interface ScrollDrawOptions {
19
19
  scrollContainer?: string | Element;
20
20
  /** Automatically reverse the animation when the user scrolls back up. */
21
21
  autoReverse?: boolean;
22
- /** Delay in milliseconds before the engine starts observing (useful for page-load sequences). */
22
+ /** Delay in milliseconds before the engine starts observing. */
23
23
  delay?: number;
24
24
  /** Animate stroke color. Single string = static override. Tuple = interpolate from → to. */
25
25
  strokeColor?: string | [string, string];
26
26
  /** Animate stroke width. Single number = static override. Tuple = interpolate from → to. */
27
27
  strokeWidth?: number | [number, number];
28
+ /** Animate fill opacity. Single number = static override. Tuple [from, to] = interpolate as the path draws. Use [0, 1] to flood fill in sync with the stroke draw. */
29
+ fillOpacity?: number | [number, number];
30
+ /**
31
+ * Reveal the container using CSS clip-path instead of stroke-dashoffset.
32
+ * Works on any content — SVG, images, text, divs.
33
+ * `true` defaults to `'left'`. Values: `'left' | 'right' | 'top' | 'bottom' | 'center'`.
34
+ */
35
+ clip?: boolean | 'left' | 'right' | 'top' | 'bottom' | 'center';
28
36
  /** Fire callbacks at specific progress thresholds (0–1). Resets on replay(). */
29
37
  waypoints?: Record<number, () => void>;
38
+ /** Scale animation speed by scroll velocity — faster scrolling = faster draw. Pass a number to control sensitivity (default 1). */
39
+ velocityScale?: boolean | number;
40
+ /** IntersectionObserver threshold (0–1). Default 0. */
41
+ threshold?: number;
42
+ /** IntersectionObserver rootMargin. Default "0px". */
43
+ rootMargin?: string;
44
+ /** Repeat the animation N times after completion. Use 'infinite' to loop forever. */
45
+ repeat?: number | 'infinite';
46
+ /** Milliseconds to wait between repeats. Default 0. */
47
+ repeatDelay?: number;
48
+ /** Target path `d` attribute to morph toward as the animation progresses. Paths must have compatible structures. */
49
+ morphTo?: string;
30
50
  onProgress?: (alpha: number) => void;
31
51
  onStart?: () => void;
32
52
  onComplete?: () => void;
@@ -35,6 +55,14 @@ interface ScrollDrawInstance {
35
55
  destroy: () => void;
36
56
  /** Reset and replay the animation from the beginning. */
37
57
  replay: () => void;
58
+ /** Pause the animation at the current progress. */
59
+ pause: () => void;
60
+ /** Resume a paused animation. */
61
+ resume: () => void;
62
+ /** Jump to a specific progress value (0–1) and pause. */
63
+ seek: (progress: number) => void;
64
+ /** Returns current draw progress (0–1). */
65
+ getProgress: () => number;
38
66
  }
39
67
 
40
68
  /**
@@ -1,3 +1,3 @@
1
- var _={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)};function j(e="top bottom"){let t=e.trim();if(/^\d+(\.\d+)?%$/.test(t))return {element:"top",viewport:t};let[r="top",o="bottom"]=t.split(/\s+/).filter(Boolean);return {element:r,viewport:o}}function re(e,t,r,o){switch(o){case "top":return e+r;case "center":return e+r+t/2;case "bottom":return e+r+t;default:return e+r}}function ne(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 J(e){let t=e.tagName.toLowerCase();if(t==="rect"){let r=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(r+o)}if(t==="circle"){let r=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*r}return e.getTotalLength()}function ye(e,t,r){return Math.min(r,Math.max(t,e))}function z(e,t,r,o){return r===t?0:ye((e-t)/(r-t)*o,0,1)}function se(e,t,r,o,i){let f=re(e.top,e.height,t,o.element)-ne(o.viewport,r),d=re(e.top,e.height,t,i.element)-ne(i.viewport,r);return {tStart:f,tEnd:d}}function oe(e){let t=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(t)return [parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[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 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 ie(e,t,r){let o=oe(e),i=oe(t);return !o||!i?e:`rgb(${Math.round(o[0]+(i[0]-o[0])*r)},${Math.round(o[1]+(i[1]-o[1])*r)},${Math.round(o[2]+(i[2]-o[2])*r)})`}function le(e,t){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,t);}function ge(e){let t=e.getAttribute("stroke"),r=e.getAttribute("fill");!t||t==="none"?le("Element has no stroke \u2014 path will not be visible.",e):r&&r!=="none"&&r!=="transparent"&&le("Element has a fill \u2014 it may obscure the stroke animation.",e);}function be(e,t,r){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 i(){let f=r==="x"?window.scrollX:window.scrollY,d=e-f,D=t-f,T=r==="x";o.innerHTML=`
2
- <div style="position:absolute;${T?`left:${d}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${d}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;${T?`left:${D}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${D}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",i,{passive:true}),i(),o}function W(e,t={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{}};let r=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:i=1,fade:f=false,easing:d="linear",trigger:D={},stagger:T=0,direction:b="forward",once:K=false,debug:ae=false,axis:p="y",scrollContainer:G,autoReverse:Q=false,delay:U=0,strokeColor:h,strokeWidth:w,waypoints:V,onProgress:ce,onStart:ue,onComplete:Y}=t,Z=typeof d=="function"?d:_[d]??_.linear,fe=j(D.start??"top bottom"),pe=j(D.end??"bottom top"),l=typeof G=="string"?document.querySelector(G):G??null,v=Array.isArray(h)?h[0]:null,x=Array.isArray(h)?h[1]:typeof h=="string"?h:null,m=Array.isArray(w)?w[0]:null,E=Array.isArray(w)?w[1]:typeof w=="number"?w:null,I=Array.from(e.querySelectorAll(o)),y=[],S=0,$=0,L=false,N=false,M=0,P=false,F=-1,O=-1,R=null,q=new Set;function B(){return l?p==="x"?l.scrollLeft:l.scrollTop:p==="x"?window.scrollX:window.scrollY}function de(){return l?p==="x"?l.clientWidth:l.clientHeight:p==="x"?window.innerWidth:window.innerHeight}function ee(){let n=e.getBoundingClientRect(),s,A,g;if(l){let c=l.getBoundingClientRect();s=p==="x"?n.left-c.left+l.scrollLeft:n.top-c.top+l.scrollTop,A=p==="x"?n.width:n.height,g=B();}else s=p==="x"?n.left:n.top,A=p==="x"?n.width:n.height,g=B();let a=se({top:s,height:A},g,de(),fe,pe);S=a.tStart,$=a.tEnd,ae&&process.env.NODE_ENV!=="production"&&(R?.remove(),R=be(S,$,p));}function me(){I.forEach((n,s)=>{n.style.strokeDasharray=`${y[s]}`,n.style.strokeDashoffset=b==="reverse"?"0":`${y[s]}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`);});}if(I.forEach(n=>{ge(n);let s=J(n);y.push(s),r?(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?`${s}`:"0",f&&(n.style.opacity="1"),x&&(n.style.stroke=x),E!==null&&(n.style.strokeWidth=`${E}`)):(n.style.strokeDasharray=`${s}`,n.style.strokeDashoffset=b==="reverse"?"0":`${s}`,f?n.style.opacity=b==="reverse"?"1":"0":n.style.opacity="",v&&(n.style.stroke=v),m!==null&&(n.style.strokeWidth=`${m}`));}),r)return Y?.(),{destroy:()=>{},replay:()=>{}};ee();function te(){if(!P)return;let n=B(),s=Q?O===-1||n>=O?"forward":"reverse":b;O=n;let A=$-S,g=true;if(I.forEach((a,c)=>{let k=c*T*A,u=Z(z(n,S+k,$+k,i));K&&!Q&&(F=Math.max(F,u),u=F),a.style.strokeDashoffset=s==="reverse"?`${y[c]*u}`:`${y[c]*(1-u)}`,f&&(a.style.opacity=s==="reverse"?`${1-u}`:`${u}`),v&&x?a.style.stroke=ie(v,x,u):x&&(a.style.stroke=x),m!==null&&E!==null?a.style.strokeWidth=`${m+(E-m)*u}`:E!==null&&(a.style.strokeWidth=`${E}`),c===0&&ce?.(u),u<1&&(g=false);}),V){let a=Z(z(n,S,$,i));for(let c in V){let k=parseFloat(c);a>=k&&!q.has(k)&&(q.add(k),V[c]?.());}}!N&&z(n,S,$,i)>0&&(N=true,ue?.()),g&&!L?(L=true,Y?.()):!g&&!K&&(L=false),M=requestAnimationFrame(te);}let H=new IntersectionObserver(n=>{n.forEach(s=>{P=s.isIntersecting,P?M=requestAnimationFrame(te):cancelAnimationFrame(M);});},{root:l??null}),X;function C(){clearTimeout(X),X=setTimeout(()=>{I.forEach((n,s)=>{y[s]=J(n),n.style.strokeDasharray=`${y[s]}`;}),ee();},150);}return window.addEventListener("resize",C),window.addEventListener("orientationchange",C),U>0?setTimeout(()=>H.observe(e),U):H.observe(e),{destroy(){cancelAnimationFrame(M),H.disconnect(),window.removeEventListener("resize",C),window.removeEventListener("orientationchange",C),clearTimeout(X),R?.remove();},replay(){F=-1,O=-1,N=false,L=false,q.clear(),me();}}}function Ee(e,t={}){let r=W(e,t);return {update(o){r.destroy(),r=W(e,o);},destroy(){r.destroy();}}}function Se(e={}){let t=null;function r(o){return t=W(o,e),{destroy(){t?.destroy(),t=null;}}}return {action:r,getInstance:()=>t}}export{Se as createScrollDraw,Ee as scrollDraw};
1
+ var de={linear:e=>e,"ease-in":e=>e*e,"ease-out":e=>e*(2-e),"ease-in-out":e=>e<.5?2*e*e:-1+(4-2*e)*e,spring:e=>1-Math.cos(e*Math.PI*2.5)*Math.pow(1-e,2.2)};function ye(e="top bottom"){let r=e.trim();if(/^\d+(\.\d+)?%$/.test(r))return {element:"top",viewport:r};let[n="top",o="bottom"]=r.split(/\s+/).filter(Boolean);return {element:n,viewport:o}}function Te(e,r,n,o){switch(o){case "top":return e+n;case "center":return e+n+r/2;case "bottom":return e+n+r;default:return e+n}}function ke(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 ge(e){let r=e.tagName.toLowerCase();if(r==="rect"){let n=parseFloat(e.getAttribute("width")??"0"),o=parseFloat(e.getAttribute("height")??"0");return 2*(n+o)}if(r==="circle"){let n=parseFloat(e.getAttribute("r")??"0");return 2*Math.PI*n}return e.getTotalLength()}function We(e,r,n){return Math.min(n,Math.max(r,e))}function H(e,r,n,o){return n===r?0:We((e-r)/(n-r)*o,0,1)}function De(e,r,n,o,a){let f=Te(e.top,e.height,r,o.element)-ke(o.viewport,n),p=Te(e.top,e.height,r,a.element)-ke(a.viewport,n);return {tStart:f,tEnd:p}}function Se(e){let r=/^#([a-f\d])([a-f\d])([a-f\d])$/i.exec(e);if(r)return [parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16)];let n=/^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(n)return [parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16)];let 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 he(e,r,n){let o=Se(e),a=Se(r);return !o||!a?e:`rgb(${Math.round(o[0]+(a[0]-o[0])*n)},${Math.round(o[1]+(a[1]-o[1])*n)},${Math.round(o[2]+(a[2]-o[2])*n)})`}function Me(e,r){process.env.NODE_ENV!=="production"&&console.warn(`[svg-scroll-draw] ${e}`,r);}function Ve(e){let r=e.getAttribute("stroke"),n=e.getAttribute("fill");!r||r==="none"?Me("Element has no stroke \u2014 path will not be visible.",e):n&&n!=="none"&&n!=="transparent"&&Me("Element has a fill \u2014 it may obscure the stroke animation.",e);}function ze(e,r,n){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 a(){let f=n==="x"?window.scrollX:window.scrollY,p=e-f,L=r-f,B=n==="x";o.innerHTML=`
2
+ <div style="position:absolute;${B?`left:${p}px;top:0;bottom:0;border-left:2px dashed #22c55e;`:`top:${p}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;${B?`left:${L}px;top:0;bottom:0;border-left:2px dashed #ef4444;`:`top:${L}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",a,{passive:true}),a(),o}function Le(e,r,n){let o=(r.match(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g)??[]).map(Number),a=0;return e.replace(/[-+]?(?:\d*\.)?\d+(?:[eE][-+]?\d+)?/g,f=>{let p=parseFloat(f),L=o[a++]??p;return String(+(p+(L-p)*n).toFixed(4))})}function ne(e,r={}){if(typeof window>"u")return {destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>0};let n=window.matchMedia("(prefers-reduced-motion: reduce)").matches,{selector:o="path, polyline, line, polygon, rect, circle",speed:a=1,fade:f=false,easing:p="linear",trigger:L={},stagger:B=0,direction:I="forward",once:X=false,debug:Ie=false,axis:x="y",scrollContainer:se,autoReverse:oe=false,delay:be=0,strokeColor:C,strokeWidth:N,fillOpacity:R,waypoints:ie,velocityScale:le=false,threshold:Oe=0,rootMargin:Fe="0px",repeat:_=0,repeatDelay:we=0,morphTo:O,clip:ae,onProgress:ve,onStart:xe,onComplete:j}=r,W=ae===true?"left":typeof ae=="string"?ae:false,ce=typeof p=="function"?p:de[p]??de.linear,Pe=ye(L.start??"top bottom"),Ce=ye(L.end??"bottom top"),d=typeof se=="string"?document.querySelector(se):se??null,A=Array.isArray(C)?C[0]:null,y=Array.isArray(C)?C[1]:typeof C=="string"?C:null,g=Array.isArray(N)?N[0]:null,h=Array.isArray(N)?N[1]:typeof N=="number"?N:null,b=Array.isArray(R)?R[0]:null,w=Array.isArray(R)?R[1]:typeof R=="number"?R:null;function V(t){let s=t*100;switch(W){case "right":return `inset(0 0 0 ${100-s}%)`;case "top":return `inset(0 0 ${100-s}% 0)`;case "bottom":return `inset(${100-s}% 0 0 0)`;case "center":return `circle(${t*150}% at 50% 50%)`;default:return `inset(0 ${100-s}% 0 0)`}}let G=W?[]:Array.from(e.querySelectorAll(o)),E=[],T=[],k=0,S=0,$=false,F=false,D=0,J=false,v=-1,K=-1,P=false,Q=0,q=0,U,ue=null,Y=new Set,Z=-1,Ee=performance.now();function fe(){return d?x==="x"?d.scrollLeft:d.scrollTop:x==="x"?window.scrollX:window.scrollY}function Ne(){return d?x==="x"?d.clientWidth:d.clientHeight:x==="x"?window.innerWidth:window.innerHeight}function $e(){let t=e.getBoundingClientRect(),s,l,m;if(d){let z=d.getBoundingClientRect();s=x==="x"?t.left-z.left+d.scrollLeft:t.top-z.top+d.scrollTop,l=x==="x"?t.width:t.height,m=fe();}else s=x==="x"?t.left:t.top,l=x==="x"?t.width:t.height,m=fe();let re=De({top:s,height:l},m,Ne(),Pe,Ce);k=re.tStart,S=re.tEnd,Ie&&process.env.NODE_ENV!=="production"&&(ue?.remove(),ue=ze(k,S,x));}function Re(t,s){if(W){let l=s==="reverse"?1-t:t;e.style.clipPath=V(l);return}G.forEach((l,m)=>{l.style.strokeDashoffset=s==="reverse"?`${E[m]*t}`:`${E[m]*(1-t)}`,f&&(l.style.opacity=s==="reverse"?`${1-t}`:`${t}`),A&&y?l.style.stroke=he(A,y,t):y&&(l.style.stroke=y),g!==null&&h!==null?l.style.strokeWidth=`${g+(h-g)*t}`:h!==null&&(l.style.strokeWidth=`${h}`),b!==null&&w!==null?l.style.fillOpacity=`${b+(w-b)*t}`:w!==null&&(l.style.fillOpacity=`${w}`),O&&l.tagName.toLowerCase()==="path"&&T[m]&&l.setAttribute("d",Le(T[m],O,t));});}function Ae(){if(W){e.style.clipPath=V(0);return}G.forEach((t,s)=>{t.style.strokeDasharray=`${E[s]}`,t.style.strokeDashoffset=I==="reverse"?"0":`${E[s]}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`),O&&t.tagName.toLowerCase()==="path"&&T[s]&&t.setAttribute("d",T[s]);});}if(G.forEach(t=>{Ve(t);let s=ge(t);E.push(s),t.tagName.toLowerCase()==="path"?T.push(t.getAttribute("d")??""):T.push(""),n?(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?`${s}`:"0",f&&(t.style.opacity="1"),y&&(t.style.stroke=y),h!==null&&(t.style.strokeWidth=`${h}`),w!==null&&(t.style.fillOpacity=`${w}`),O&&t.tagName.toLowerCase()==="path"&&t.setAttribute("d",O)):(t.style.strokeDasharray=`${s}`,t.style.strokeDashoffset=I==="reverse"?"0":`${s}`,f?t.style.opacity=I==="reverse"?"1":"0":t.style.opacity="",A&&(t.style.stroke=A),g!==null&&(t.style.strokeWidth=`${g}`),b!==null&&(t.style.fillOpacity=`${b}`));}),W){if(n)return e.style.clipPath=V(1),j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};e.style.clipPath=V(0);}else if(n)return j?.(),{destroy:()=>{},replay:()=>{},pause:()=>{},resume:()=>{},seek:()=>{},getProgress:()=>1};$e();function ee(){if(!J||P)return;let t=performance.now(),s=fe(),l=a;if(le!==false){let i=t-Ee,c=i>0?Math.abs(s-(Z<0?s:Z))/i:0;l=a*Math.max(.2,1+c*(typeof le=="number"?le:1)*.04);}Z=s,Ee=t;let m=oe?K===-1||s>=K?"forward":"reverse":I;K=s;let re=S-k,z=true;if(W){let i=ce(H(s,k,S,l));X&&!oe&&(v=Math.max(v,i),i=v),Q=i;let c=m==="reverse"?1-i:i;e.style.clipPath=V(c),ve?.(i),!F&&H(s,k,S,l)>0&&(F=true,xe?.()),i>=1&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,F=false,$=false,e.style.clipPath=V(0);},we))):i<1&&!X&&($=false),D=requestAnimationFrame(ee);return}if(G.forEach((i,c)=>{let M=c*B*re,u=ce(H(s,k+M,S+M,l));X&&!oe&&(v=Math.max(v,u),u=v),Q=u,i.style.strokeDashoffset=m==="reverse"?`${E[c]*u}`:`${E[c]*(1-u)}`,f&&(i.style.opacity=m==="reverse"?`${1-u}`:`${u}`),A&&y?i.style.stroke=he(A,y,u):y&&(i.style.stroke=y),g!==null&&h!==null?i.style.strokeWidth=`${g+(h-g)*u}`:h!==null&&(i.style.strokeWidth=`${h}`),b!==null&&w!==null?i.style.fillOpacity=`${b+(w-b)*u}`:w!==null&&(i.style.fillOpacity=`${w}`),O&&i.tagName.toLowerCase()==="path"&&T[c]&&i.setAttribute("d",Le(T[c],O,u)),c===0&&ve?.(u),u<1&&(z=false);}),ie){let i=ce(H(s,k,S,l));for(let c in ie){let M=parseFloat(c);i>=M&&!Y.has(M)&&(Y.add(M),ie[c]?.());}}!F&&H(s,k,S,l)>0&&(F=true,xe?.()),z&&!$?($=true,j?.(),q<(_==="infinite"?1/0:_??0)&&(q++,U=setTimeout(()=>{v=-1,F=false,$=false,Y.clear(),Ae();},we))):!z&&!X&&($=false),D=requestAnimationFrame(ee);}let pe=new IntersectionObserver(t=>{t.forEach(s=>{J=s.isIntersecting,J&&!P?D=requestAnimationFrame(ee):cancelAnimationFrame(D);});},{root:d??null,threshold:Oe,rootMargin:Fe}),me;function te(){clearTimeout(me),me=setTimeout(()=>{G.forEach((t,s)=>{E[s]=ge(t),t.style.strokeDasharray=`${E[s]}`;}),$e();},150);}return window.addEventListener("resize",te),window.addEventListener("orientationchange",te),be>0?setTimeout(()=>pe.observe(e),be):pe.observe(e),{destroy(){cancelAnimationFrame(D),clearTimeout(U),pe.disconnect(),window.removeEventListener("resize",te),window.removeEventListener("orientationchange",te),clearTimeout(me),ue?.remove();},replay(){v=-1,K=-1,Z=-1,F=false,$=false,q=0,P=false,Y.clear(),clearTimeout(U),Ae();},pause(){P=true,cancelAnimationFrame(D);},resume(){P&&(P=false,J&&(D=requestAnimationFrame(ee)));},seek(t){let s=Math.min(1,Math.max(0,t));Q=s,v=s,P=true,cancelAnimationFrame(D),Re(s,I);},getProgress(){return Q}}}function Xe(e,r={}){let n=ne(e,r);return {update(o){n.destroy(),n=ne(e,o);},destroy(){n.destroy();}}}function _e(e={}){let r=null;function n(o){return r=ne(o,e),{destroy(){r?.destroy(),r=null;}}}return {action:n,getInstance:()=>r}}export{_e as createScrollDraw,Xe as scrollDraw};