@nitesh-tyagi/vectorflow 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/vectorflow.umd.js +1 -1
- package/dist/vectorflow.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/engine.js +16 -12
package/dist/vectorflow.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.VectorFlow=e():t.VectorFlow=e()}(this,()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},e={};function n(t){if(!t||"none"===t)return null;3===(t=t.trim().replace("#","")).length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const e=parseInt(t,16);return isNaN(e)?null:{r:e>>16&255,g:e>>8&255,b:255&e}}function r({r:t,g:e,b:n}){const r=t=>Math.round(Math.max(0,Math.min(255,t))).toString(16).padStart(2,"0");return`#${r(t)}${r(e)}${r(n)}`}function o(t,e,n){return t+(e-t)*n}function a(t,e,a){const i=n(t),s=n(e);return i&&s?r({r:o(i.r,s.r,a),g:o(i.g,s.g,a),b:o(i.b,s.b,a)}):e||t||"#000000"}t.d(e,{default:()=>_t});const i=["x","y","width","height","rx","ry","cx","cy","r","opacity"],s=["fill","stroke"];function u(t,e){const n=t.style.getPropertyValue(e);if(n&&"none"!==n)return c(n);const r=t.getAttribute(e);if(r&&"none"!==r)return c(r);const o=window.getComputedStyle(t).getPropertyValue(e);return o&&"none"!==o?c(o):null}function c(t){if(!t||"none"===t)return null;if((t=t.trim()).startsWith("#"))return t;const e=t.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i);if(e)return r({r:parseInt(e[1],10),g:parseInt(e[2],10),b:parseInt(e[3],10)});if("undefined"!=typeof document){const e=document.createElement("canvas").getContext("2d");e.fillStyle=t;const n=e.fillStyle;if(n.startsWith("#"))return n}return t}function l(t){const e={numericAttrs:{},colors:{},transform:null};for(const n of i){const r=t.getAttribute(n);if(null!==r&&""!==r){const t=parseFloat(r);isNaN(t)||(e.numericAttrs[n]=t)}}for(const n of s){const r=u(t,n);r&&(e.colors[n]=r)}const n=t.getAttribute("transform");return n&&(e.transform=n),e}function f(t){const e={translateX:0,translateY:0,scaleX:1,scaleY:1,rotate:0};if(!t)return e;const n=t.match(/translate\(\s*([-\d.]+)\s*[,\s]\s*([-\d.]+)\s*\)/);n&&(e.translateX=parseFloat(n[1]),e.translateY=parseFloat(n[2]));const r=t.match(/scale\(\s*([-\d.]+)(?:\s*[,\s]\s*([-\d.]+))?\s*\)/);r&&(e.scaleX=parseFloat(r[1]),e.scaleY=void 0!==r[2]?parseFloat(r[2]):e.scaleX);const o=t.match(/rotate\(\s*([-\d.]+)/);return o&&(e.rotate=parseFloat(o[1])),e}function d({translateX:t,translateY:e,scaleX:n,scaleY:r,rotate:o}){const a=[];return 0===t&&0===e||a.push(`translate(${t},${e})`),0!==o&&a.push(`rotate(${o})`),1===n&&1===r||a.push(`scale(${n},${r})`),a.length>0?a.join(" "):null}function h(t,e,n){const r=n[t];return r?Array.isArray(r[e])?r[e]:Array.isArray(r["*"])?r["*"]:[t]:[t]}function p(t,e){return t.length>0&&t[0]===e?t.slice(1):t}function m(t,e,n){return"number"==typeof t&&t>0?t:"number"==typeof e&&e>0?e:"number"==typeof n&&n>0?n:120}function g(t,e,n,r,o,a){const i=[];let s=e;for(const e of t){if(a&&!a.has(e))throw new Error(`VectorFlow: State not found in SVG: "${e}"`);const t=p(h(e,s,n),s);for(const e of t){if(a&&!a.has(e))throw new Error(`VectorFlow: State not found in SVG: "${e}"`);const t=n[e]?.ms,u=m(r,t,o);i.push({state:e,ms:u}),s=e}}return{steps:i,finalState:s}}function v(t,e,n,r,o,a){const i=[];let s=e;for(const e of t){if(a&&!a.has(e))throw new Error(`VectorFlow: State not found in SVG: "${e}"`);if(e===s)continue;const t=n[e]?.ms,u=m(r,t,o);i.push({state:e,ms:u}),s=e}return{steps:i,finalState:s}}var y={update:null,begin:null,loopBegin:null,changeBegin:null,change:null,changeComplete:null,loopComplete:null,complete:null,loop:1,direction:"normal",autoplay:!0,timelineOffset:0},w={duration:1e3,delay:0,endDelay:0,easing:"easeOutElastic(1, .5)",round:0},b=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","scale","scaleX","scaleY","scaleZ","skew","skewX","skewY","perspective","matrix","matrix3d"],_={CSS:{},springs:{}};function M(t,e,n){return Math.min(Math.max(t,e),n)}function S(t,e){return t.indexOf(e)>-1}function x(t,e){return t.apply(null,e)}var E={arr:function(t){return Array.isArray(t)},obj:function(t){return S(Object.prototype.toString.call(t),"Object")},pth:function(t){return E.obj(t)&&t.hasOwnProperty("totalLength")},svg:function(t){return t instanceof SVGElement},inp:function(t){return t instanceof HTMLInputElement},dom:function(t){return t.nodeType||E.svg(t)},str:function(t){return"string"==typeof t},fnc:function(t){return"function"==typeof t},und:function(t){return void 0===t},nil:function(t){return E.und(t)||null===t},hex:function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},rgb:function(t){return/^rgb/.test(t)},hsl:function(t){return/^hsl/.test(t)},col:function(t){return E.hex(t)||E.rgb(t)||E.hsl(t)},key:function(t){return!y.hasOwnProperty(t)&&!w.hasOwnProperty(t)&&"targets"!==t&&"keyframes"!==t}};function A(t){var e=/\(([^)]+)\)/.exec(t);return e?e[1].split(",").map(function(t){return parseFloat(t)}):[]}function F(t,e){var n=A(t),r=M(E.und(n[0])?1:n[0],.1,100),o=M(E.und(n[1])?100:n[1],.1,100),a=M(E.und(n[2])?10:n[2],.1,100),i=M(E.und(n[3])?0:n[3],.1,100),s=Math.sqrt(o/r),u=a/(2*Math.sqrt(o*r)),c=u<1?s*Math.sqrt(1-u*u):0,l=u<1?(u*s-i)/c:-i+s;function f(t){var n=e?e*t/1e3:t;return n=u<1?Math.exp(-n*u*s)*(1*Math.cos(c*n)+l*Math.sin(c*n)):(1+l*n)*Math.exp(-n*s),0===t||1===t?t:1-n}return e?f:function(){var e=_.springs[t];if(e)return e;for(var n=1/6,r=0,o=0;;)if(1===f(r+=n)){if(++o>=16)break}else o=0;var a=r*n*1e3;return _.springs[t]=a,a}}function O(t){return void 0===t&&(t=10),function(e){return Math.ceil(M(e,1e-6,1)*t)*(1/t)}}var V,N,P=function(){var t=.1;function e(t,e){return 1-3*e+3*t}function n(t,e){return 3*e-6*t}function r(t){return 3*t}function o(t,o,a){return((e(o,a)*t+n(o,a))*t+r(o))*t}function a(t,o,a){return 3*e(o,a)*t*t+2*n(o,a)*t+r(o)}return function(e,n,r,i){if(0<=e&&e<=1&&0<=r&&r<=1){var s=new Float32Array(11);if(e!==n||r!==i)for(var u=0;u<11;++u)s[u]=o(u*t,e,r);return function(u){return e===n&&r===i||0===u||1===u?u:o(function(n){for(var i=0,u=1;10!==u&&s[u]<=n;++u)i+=t;--u;var c=i+(n-s[u])/(s[u+1]-s[u])*t,l=a(c,e,r);return l>=.001?function(t,e,n,r){for(var i=0;i<4;++i){var s=a(e,n,r);if(0===s)return e;e-=(o(e,n,r)-t)/s}return e}(n,c,e,r):0===l?c:function(t,e,n,r,a){var i,s,u=0;do{(i=o(s=e+(n-e)/2,r,a)-t)>0?n=s:e=s}while(Math.abs(i)>1e-7&&++u<10);return s}(n,i,i+t,e,r)}(u),n,i)}}}}(),C=(V={linear:function(){return function(t){return t}}},N={Sine:function(){return function(t){return 1-Math.cos(t*Math.PI/2)}},Expo:function(){return function(t){return t?Math.pow(2,10*t-10):0}},Circ:function(){return function(t){return 1-Math.sqrt(1-t*t)}},Back:function(){return function(t){return t*t*(3*t-2)}},Bounce:function(){return function(t){for(var e,n=4;t<((e=Math.pow(2,--n))-1)/11;);return 1/Math.pow(4,3-n)-7.5625*Math.pow((3*e-2)/22-t,2)}},Elastic:function(t,e){void 0===t&&(t=1),void 0===e&&(e=.5);var n=M(t,1,10),r=M(e,.1,2);return function(t){return 0===t||1===t?t:-n*Math.pow(2,10*(t-1))*Math.sin((t-1-r/(2*Math.PI)*Math.asin(1/n))*(2*Math.PI)/r)}}},["Quad","Cubic","Quart","Quint"].forEach(function(t,e){N[t]=function(){return function(t){return Math.pow(t,e+2)}}}),Object.keys(N).forEach(function(t){var e=N[t];V["easeIn"+t]=e,V["easeOut"+t]=function(t,n){return function(r){return 1-e(t,n)(1-r)}},V["easeInOut"+t]=function(t,n){return function(r){return r<.5?e(t,n)(2*r)/2:1-e(t,n)(-2*r+2)/2}},V["easeOutIn"+t]=function(t,n){return function(r){return r<.5?(1-e(t,n)(1-2*r))/2:(e(t,n)(2*r-1)+1)/2}}}),V);function $(t,e){if(E.fnc(t))return t;var n=t.split("(")[0],r=C[n],o=A(t);switch(n){case"spring":return F(t,e);case"cubicBezier":return x(P,o);case"steps":return x(O,o);default:return x(r,o)}}function j(t){try{return document.querySelectorAll(t)}catch(t){return}}function k(t,e){for(var n=t.length,r=arguments.length>=2?arguments[1]:void 0,o=[],a=0;a<n;a++)if(a in t){var i=t[a];e.call(r,i,a,t)&&o.push(i)}return o}function D(t){return t.reduce(function(t,e){return t.concat(E.arr(e)?D(e):e)},[])}function I(t){return E.arr(t)?t:(E.str(t)&&(t=j(t)||t),t instanceof NodeList||t instanceof HTMLCollection?[].slice.call(t):[t])}function B(t,e){return t.some(function(t){return t===e})}function G(t){var e={};for(var n in t)e[n]=t[n];return e}function T(t,e){var n=G(t);for(var r in t)n[r]=e.hasOwnProperty(r)?e[r]:t[r];return n}function q(t,e){var n=G(t);for(var r in e)n[r]=E.und(t[r])?e[r]:t[r];return n}function X(t){var e=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(t);if(e)return e[1]}function Y(t,e){return E.fnc(t)?t(e.target,e.id,e.total):t}function L(t,e){return t.getAttribute(e)}function H(t,e,n){if(B([n,"deg","rad","turn"],X(e)))return e;var r=_.CSS[e+n];if(!E.und(r))return r;var o=document.createElement(t.tagName),a=t.parentNode&&t.parentNode!==document?t.parentNode:document.body;a.appendChild(o),o.style.position="absolute",o.style.width=100+n;var i=100/o.offsetWidth;a.removeChild(o);var s=i*parseFloat(e);return _.CSS[e+n]=s,s}function J(t,e,n){if(e in t.style){var r=e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),o=t.style[e]||getComputedStyle(t).getPropertyValue(r)||"0";return n?H(t,o,n):o}}function W(t,e){return E.dom(t)&&!E.inp(t)&&(!E.nil(L(t,e))||E.svg(t)&&t[e])?"attribute":E.dom(t)&&B(b,e)?"transform":E.dom(t)&&"transform"!==e&&J(t,e)?"css":null!=t[e]?"object":void 0}function z(t){if(E.dom(t)){for(var e,n=t.style.transform||"",r=/(\w+)\(([^)]*)\)/g,o=new Map;e=r.exec(n);)o.set(e[1],e[2]);return o}}function Z(t,e,n,r){switch(W(t,e)){case"transform":return function(t,e,n,r){var o=S(e,"scale")?1:0+function(t){return S(t,"translate")||"perspective"===t?"px":S(t,"rotate")||S(t,"skew")?"deg":void 0}(e),a=z(t).get(e)||o;return n&&(n.transforms.list.set(e,a),n.transforms.last=e),r?H(t,a,r):a}(t,e,r,n);case"css":return J(t,e,n);case"attribute":return L(t,e);default:return t[e]||0}}function Q(t,e){var n=/^(\*=|\+=|-=)/.exec(t);if(!n)return t;var r=X(t)||0,o=parseFloat(e),a=parseFloat(t.replace(n[0],""));switch(n[0][0]){case"+":return o+a+r;case"-":return o-a+r;case"*":return o*a+r}}function R(t,e){if(E.col(t))return function(t){return E.rgb(t)?(n=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(e=t))?"rgba("+n[1]+",1)":e:E.hex(t)?function(t){var e=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(t,e,n,r){return e+e+n+n+r+r}),n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return"rgba("+parseInt(n[1],16)+","+parseInt(n[2],16)+","+parseInt(n[3],16)+",1)"}(t):E.hsl(t)?function(t){var e,n,r,o=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t),a=parseInt(o[1],10)/360,i=parseInt(o[2],10)/100,s=parseInt(o[3],10)/100,u=o[4]||1;function c(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}if(0==i)e=n=r=s;else{var l=s<.5?s*(1+i):s+i-s*i,f=2*s-l;e=c(f,l,a+1/3),n=c(f,l,a),r=c(f,l,a-1/3)}return"rgba("+255*e+","+255*n+","+255*r+","+u+")"}(t):void 0;var e,n}(t);if(/\s/g.test(t))return t;var n=X(t),r=n?t.substr(0,t.length-n.length):t;return e?r+e:r}function U(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t){for(var e,n=t.points,r=0,o=0;o<n.numberOfItems;o++){var a=n.getItem(o);o>0&&(r+=U(e,a)),e=a}return r}function tt(t){if(t.getTotalLength)return t.getTotalLength();switch(t.tagName.toLowerCase()){case"circle":return function(t){return 2*Math.PI*L(t,"r")}(t);case"rect":return function(t){return 2*L(t,"width")+2*L(t,"height")}(t);case"line":return function(t){return U({x:L(t,"x1"),y:L(t,"y1")},{x:L(t,"x2"),y:L(t,"y2")})}(t);case"polyline":return K(t);case"polygon":return function(t){var e=t.points;return K(t)+U(e.getItem(e.numberOfItems-1),e.getItem(0))}(t)}}function et(t,e){var n=e||{},r=n.el||function(t){for(var e=t.parentNode;E.svg(e)&&E.svg(e.parentNode);)e=e.parentNode;return e}(t),o=r.getBoundingClientRect(),a=L(r,"viewBox"),i=o.width,s=o.height,u=n.viewBox||(a?a.split(" "):[0,0,i,s]);return{el:r,viewBox:u,x:u[0]/1,y:u[1]/1,w:i,h:s,vW:u[2],vH:u[3]}}function nt(t,e,n){function r(n){void 0===n&&(n=0);var r=e+n>=1?e+n:0;return t.el.getPointAtLength(r)}var o=et(t.el,t.svg),a=r(),i=r(-1),s=r(1),u=n?1:o.w/o.vW,c=n?1:o.h/o.vH;switch(t.property){case"x":return(a.x-o.x)*u;case"y":return(a.y-o.y)*c;case"angle":return 180*Math.atan2(s.y-i.y,s.x-i.x)/Math.PI}}function rt(t,e){var n=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g,r=R(E.pth(t)?t.totalLength:t,e)+"";return{original:r,numbers:r.match(n)?r.match(n).map(Number):[0],strings:E.str(t)||e?r.split(n):[]}}function ot(t){return k(t?D(E.arr(t)?t.map(I):I(t)):[],function(t,e,n){return n.indexOf(t)===e})}function at(t){var e=ot(t);return e.map(function(t,n){return{target:t,id:n,total:e.length,transforms:{list:z(t)}}})}function it(t,e){var n=G(e);if(/^spring/.test(n.easing)&&(n.duration=F(n.easing)),E.arr(t)){var r=t.length;2!==r||E.obj(t[0])?E.fnc(e.duration)||(n.duration=e.duration/r):t={value:t}}var o=E.arr(t)?t:[t];return o.map(function(t,n){var r=E.obj(t)&&!E.pth(t)?t:{value:t};return E.und(r.delay)&&(r.delay=n?0:e.delay),E.und(r.endDelay)&&(r.endDelay=n===o.length-1?e.endDelay:0),r}).map(function(t){return q(t,n)})}var st={css:function(t,e,n){return t.style[e]=n},attribute:function(t,e,n){return t.setAttribute(e,n)},object:function(t,e,n){return t[e]=n},transform:function(t,e,n,r,o){if(r.list.set(e,n),e===r.last||o){var a="";r.list.forEach(function(t,e){a+=e+"("+t+") "}),t.style.transform=a}}};function ut(t,e){at(t).forEach(function(t){for(var n in e){var r=Y(e[n],t),o=t.target,a=X(r),i=Z(o,n,a,t),s=Q(R(r,a||X(i)),i),u=W(o,n);st[u](o,n,s,t.transforms,!0)}})}function ct(t,e){return k(D(t.map(function(t){return e.map(function(e){return function(t,e){var n=W(t.target,e.name);if(n){var r=function(t,e){var n;return t.tweens.map(function(r){var o=function(t,e){var n={};for(var r in t){var o=Y(t[r],e);E.arr(o)&&1===(o=o.map(function(t){return Y(t,e)})).length&&(o=o[0]),n[r]=o}return n.duration=parseFloat(n.duration),n.delay=parseFloat(n.delay),n}(r,e),a=o.value,i=E.arr(a)?a[1]:a,s=X(i),u=Z(e.target,t.name,s,e),c=n?n.to.original:u,l=E.arr(a)?a[0]:c,f=X(l)||X(u),d=s||f;return E.und(i)&&(i=c),o.from=rt(l,d),o.to=rt(Q(i,l),d),o.start=n?n.end:0,o.end=o.start+o.delay+o.duration+o.endDelay,o.easing=$(o.easing,o.duration),o.isPath=E.pth(a),o.isPathTargetInsideSVG=o.isPath&&E.svg(e.target),o.isColor=E.col(o.from.original),o.isColor&&(o.round=1),n=o,o})}(e,t),o=r[r.length-1];return{type:n,property:e.name,animatable:t,tweens:r,duration:o.end,delay:r[0].delay,endDelay:o.endDelay}}}(t,e)})})),function(t){return!E.und(t)})}function lt(t,e){var n=t.length,r=function(t){return t.timelineOffset?t.timelineOffset:0},o={};return o.duration=n?Math.max.apply(Math,t.map(function(t){return r(t)+t.duration})):e.duration,o.delay=n?Math.min.apply(Math,t.map(function(t){return r(t)+t.delay})):e.delay,o.endDelay=n?o.duration-Math.max.apply(Math,t.map(function(t){return r(t)+t.duration-t.endDelay})):e.endDelay,o}var ft=0,dt=[],ht=function(){var t;function e(n){for(var r=dt.length,o=0;o<r;){var a=dt[o];a.paused?(dt.splice(o,1),r--):(a.tick(n),o++)}t=o>0?requestAnimationFrame(e):void 0}return"undefined"!=typeof document&&document.addEventListener("visibilitychange",function(){mt.suspendWhenDocumentHidden&&(pt()?t=cancelAnimationFrame(t):(dt.forEach(function(t){return t._onDocumentVisibility()}),ht()))}),function(){t||pt()&&mt.suspendWhenDocumentHidden||!(dt.length>0)||(t=requestAnimationFrame(e))}}();function pt(){return!!document&&document.hidden}function mt(t){void 0===t&&(t={});var e,n=0,r=0,o=0,a=0,i=null;function s(t){var e=window.Promise&&new Promise(function(t){return i=t});return t.finished=e,e}var u=function(t){var e=T(y,t),n=T(w,t),r=function(t,e){var n=[],r=e.keyframes;for(var o in r&&(e=q(function(t){for(var e=k(D(t.map(function(t){return Object.keys(t)})),function(t){return E.key(t)}).reduce(function(t,e){return t.indexOf(e)<0&&t.push(e),t},[]),n={},r=function(r){var o=e[r];n[o]=t.map(function(t){var e={};for(var n in t)E.key(n)?n==o&&(e.value=t[n]):e[n]=t[n];return e})},o=0;o<e.length;o++)r(o);return n}(r),e)),e)E.key(o)&&n.push({name:o,tweens:it(e[o],t)});return n}(n,t),o=at(t.targets),a=ct(o,r),i=lt(a,n),s=ft;return ft++,q(e,{id:s,children:[],animatables:o,animations:a,duration:i.duration,delay:i.delay,endDelay:i.endDelay})}(t);function c(){var t=u.direction;"alternate"!==t&&(u.direction="normal"!==t?"normal":"reverse"),u.reversed=!u.reversed,e.forEach(function(t){return t.reversed=u.reversed})}function l(t){return u.reversed?u.duration-t:t}function f(){n=0,r=l(u.currentTime)*(1/mt.speed)}function d(t,e){e&&e.seek(t-e.timelineOffset)}function h(t){for(var e=0,n=u.animations,r=n.length;e<r;){var o=n[e],a=o.animatable,i=o.tweens,s=i.length-1,c=i[s];s&&(c=k(i,function(e){return t<e.end})[0]||c);for(var l=M(t-c.start-c.delay,0,c.duration)/c.duration,f=isNaN(l)?1:c.easing(l),d=c.to.strings,h=c.round,p=[],m=c.to.numbers.length,g=void 0,v=0;v<m;v++){var y=void 0,w=c.to.numbers[v],b=c.from.numbers[v]||0;y=c.isPath?nt(c.value,f*w,c.isPathTargetInsideSVG):b+f*(w-b),h&&(c.isColor&&v>2||(y=Math.round(y*h)/h)),p.push(y)}var _=d.length;if(_){g=d[0];for(var S=0;S<_;S++){d[S];var x=d[S+1],E=p[S];isNaN(E)||(g+=x?E+x:E+" ")}}else g=p[0];st[o.type](a.target,o.property,g,a.transforms),o.currentValue=g,e++}}function p(t){u[t]&&!u.passThrough&&u[t](u)}function m(t){var f=u.duration,m=u.delay,g=f-u.endDelay,v=l(t);u.progress=M(v/f*100,0,100),u.reversePlayback=v<u.currentTime,e&&function(t){if(u.reversePlayback)for(var n=a;n--;)d(t,e[n]);else for(var r=0;r<a;r++)d(t,e[r])}(v),!u.began&&u.currentTime>0&&(u.began=!0,p("begin")),!u.loopBegan&&u.currentTime>0&&(u.loopBegan=!0,p("loopBegin")),v<=m&&0!==u.currentTime&&h(0),(v>=g&&u.currentTime!==f||!f)&&h(f),v>m&&v<g?(u.changeBegan||(u.changeBegan=!0,u.changeCompleted=!1,p("changeBegin")),p("change"),h(v)):u.changeBegan&&(u.changeCompleted=!0,u.changeBegan=!1,p("changeComplete")),u.currentTime=M(v,0,f),u.began&&p("update"),t>=f&&(r=0,u.remaining&&!0!==u.remaining&&u.remaining--,u.remaining?(n=o,p("loopComplete"),u.loopBegan=!1,"alternate"===u.direction&&c()):(u.paused=!0,u.completed||(u.completed=!0,p("loopComplete"),p("complete"),!u.passThrough&&"Promise"in window&&(i(),s(u)))))}return s(u),u.reset=function(){var t=u.direction;u.passThrough=!1,u.currentTime=0,u.progress=0,u.paused=!0,u.began=!1,u.loopBegan=!1,u.changeBegan=!1,u.completed=!1,u.changeCompleted=!1,u.reversePlayback=!1,u.reversed="reverse"===t,u.remaining=u.loop,e=u.children;for(var n=a=e.length;n--;)u.children[n].reset();(u.reversed&&!0!==u.loop||"alternate"===t&&1===u.loop)&&u.remaining++,h(u.reversed?u.duration:0)},u._onDocumentVisibility=f,u.set=function(t,e){return ut(t,e),u},u.tick=function(t){o=t,n||(n=o),m((o+(r-n))*mt.speed)},u.seek=function(t){m(l(t))},u.pause=function(){u.paused=!0,f()},u.play=function(){u.paused&&(u.completed&&u.reset(),u.paused=!1,dt.push(u),f(),ht())},u.reverse=function(){c(),u.completed=!u.reversed,f()},u.restart=function(){u.reset(),u.play()},u.remove=function(t){vt(ot(t),u)},u.reset(),u.autoplay&&u.play(),u}function gt(t,e){for(var n=e.length;n--;)B(t,e[n].animatable.target)&&e.splice(n,1)}function vt(t,e){var n=e.animations,r=e.children;gt(t,n);for(var o=r.length;o--;){var a=r[o],i=a.animations;gt(t,i),i.length||a.children.length||r.splice(o,1)}n.length||r.length||e.pause()}mt.version="3.2.1",mt.speed=1,mt.suspendWhenDocumentHidden=!0,mt.running=dt,mt.remove=function(t){for(var e=ot(t),n=dt.length;n--;)vt(e,dt[n])},mt.get=Z,mt.set=ut,mt.convertPx=H,mt.path=function(t,e){var n=E.str(t)?j(t)[0]:t,r=e||100;return function(t){return{property:t,el:n,svg:et(n),totalLength:tt(n)*(r/100)}}},mt.setDashoffset=function(t){var e=tt(t);return t.setAttribute("stroke-dasharray",e),e},mt.stagger=function(t,e){void 0===e&&(e={});var n=e.direction||"normal",r=e.easing?$(e.easing):null,o=e.grid,a=e.axis,i=e.from||0,s="first"===i,u="center"===i,c="last"===i,l=E.arr(t),f=l?parseFloat(t[0]):parseFloat(t),d=l?parseFloat(t[1]):0,h=X(l?t[1]:t)||0,p=e.start||0+(l?f:0),m=[],g=0;return function(t,e,v){if(s&&(i=0),u&&(i=(v-1)/2),c&&(i=v-1),!m.length){for(var y=0;y<v;y++){if(o){var w=u?(o[0]-1)/2:i%o[0],b=u?(o[1]-1)/2:Math.floor(i/o[0]),_=w-y%o[0],M=b-Math.floor(y/o[0]),S=Math.sqrt(_*_+M*M);"x"===a&&(S=-_),"y"===a&&(S=-M),m.push(S)}else m.push(Math.abs(i-y));g=Math.max.apply(Math,m)}r&&(m=m.map(function(t){return r(t/g)*g})),"reverse"===n&&(m=m.map(function(t){return a?t<0?-1*t:-t:Math.abs(g-t)}))}return p+(l?(d-f)/g:f)*(Math.round(100*m[e])/100)+h}},mt.timeline=function(t){void 0===t&&(t={});var e=mt(t);return e.duration=0,e.add=function(n,r){var o=dt.indexOf(e),a=e.children;function i(t){t.passThrough=!0}o>-1&&dt.splice(o,1);for(var s=0;s<a.length;s++)i(a[s]);var u=q(n,T(w,t));u.targets=u.targets||t.targets;var c=e.duration;u.autoplay=!1,u.direction=e.direction,u.timelineOffset=E.und(r)?c:Q(r,c),i(e),e.seek(u.timelineOffset);var l=mt(u);i(l),a.push(l);var f=lt(a,t);return e.delay=f.delay,e.endDelay=f.endDelay,e.duration=f.duration,e.seek(0),e.reset(),e.autoplay&&e.play(),e},e},mt.easing=$,mt.penner=C,mt.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t};const yt=mt;function wt(t,e,n,r){return new Promise((i,s)=>{if(r?.aborted)return void s(new DOMException("Aborted","AbortError"));const u=[];let c=0;const h=t.size;if(0===h)return void i();for(const[r,s]of t){const t=e.get(r);if(!t)continue;const p=l(s),m={targets:s,duration:n,easing:"linear",complete:()=>{c++,c>=h&&i()}};for(const[e,n]of Object.entries(t.numericAttrs))(p.numericAttrs[e]??n)!==n&&(m[e]=n);const g=[];for(const[e,n]of Object.entries(t.colors)){const t=p.colors[e];t&&t!==n?g.push({prop:e,from:t,to:n}):!t&&n&&s.style.setProperty(e,n)}let v=null;if(t.transform||p.transform){const e=f(p.transform),n=f(t.transform);JSON.stringify(e)!==JSON.stringify(n)&&(v={from:e,to:n})}if(g.length>0||v){const t={t:0},e=yt({targets:t,t:1,duration:n,easing:"linear",update:()=>{const e=t.t;for(const{prop:t,from:n,to:r}of g){const o=a(n,r,e);s.style.setProperty(t,o)}if(v){const{from:t,to:n}=v,r=d({translateX:o(t.translateX,n.translateX,e),translateY:o(t.translateY,n.translateY,e),scaleX:o(t.scaleX,n.scaleX,e),scaleY:o(t.scaleY,n.scaleY,e),rotate:o(t.rotate,n.rotate,e)});r?s.setAttribute("transform",r):s.removeAttribute("transform")}}});u.push(e)}if(Object.keys(m).some(t=>!["targets","duration","easing","complete"].includes(t))){const t=yt(m);u.push(t)}else m.complete()}r&&r.addEventListener("abort",()=>{for(const t of u)yt.remove(t.targets||t),t.pause&&t.pause();s(new DOMException("Aborted","AbortError"))},{once:!0})})}async function bt(t,e,n,r,o){let a=null;for(const i of t){if(r?.aborted)throw new DOMException("Aborted","AbortError");const t=n.get(i.state);if(!t)throw new Error(`VectorFlow: No snapshots for state "${i.state}"`);await wt(e,t,i.ms,r),a=i.state,o&&o(i.state)}return a}const _t=class{constructor({svgElement:t,json:e}){if(this._listeners={stateChange:[],actionStart:[],actionEnd:[],error:[]},this._abortController=null,this._currentActionName=null,this._config=function(t){let e;if("string"==typeof t)try{e=JSON.parse(t)}catch(t){throw new Error(`VectorFlow: Invalid JSON — ${t.message}`)}else{if("object"!=typeof t||null===t)throw new Error("VectorFlow: JSON input must be a string or object");e=t}if(!e.initial_state||"string"!=typeof e.initial_state)throw new Error('VectorFlow: JSON must have a string "initial_state" field');if(!e.routes||"object"!=typeof e.routes)throw new Error('VectorFlow: JSON must have a "routes" object');if(!e.actions||"object"!=typeof e.actions)throw new Error('VectorFlow: JSON must have an "actions" object');const n="number"==typeof e.ms&&e.ms>0?e.ms:120,r={};for(const[t,n]of Object.entries(e.routes)){if("object"!=typeof n||null===n)throw new Error(`VectorFlow: routes["${t}"] must be an object`);r[t]={};for(const[e,o]of Object.entries(n))if("ms"===e){if("number"!=typeof o)throw new Error(`VectorFlow: routes["${t}"].ms must be a number`);r[t].ms=o}else{if(!Array.isArray(o)||!o.every(t=>"string"==typeof t))throw new Error(`VectorFlow: routes["${t}"]["${e}"] must be an array of strings`);r[t][e]=o}}const o={};for(const[t,n]of Object.entries(e.actions)){const e="loop"===n.type?"loop":"sequence";if(!Array.isArray(n.order)||0===n.order.length){console.warn(`VectorFlow: action "${t}" has no valid order — will be a no-op`),o[t]={type:e,order:[],ms:void 0,count:void 0,mode:void 0};continue}const r="number"==typeof n.ms&&n.ms>0?n.ms:void 0;let a,i;"loop"===e&&(a="number"==typeof n.count&&n.count>0?n.count:99999,i="string"==typeof n.mode?n.mode:void 0),o[t]={type:e,order:n.order,ms:r,count:a,mode:i}}return{name:e.name||"untitled",initial_state:e.initial_state,ms:n,routes:r,actions:o}}(e),"string"==typeof t){const e=document.createElement("div");if(e.innerHTML=t.trim(),this._svgElement=e.querySelector("svg"),!this._svgElement)throw new Error("VectorFlow: Provided SVG string does not contain an <svg> element.")}else{if(!(t instanceof SVGElement))throw new Error("VectorFlow: svgElement must be an SVG DOM element or an SVG string.");this._svgElement=t}if(this._stateMap=function(t){const e=t.querySelectorAll('g[id^="state_"]');if(0===e.length)throw new Error('VectorFlow: No state groups found in SVG. Expected groups with id="state_{name}".');const n=new Map;for(const t of e){const e=t.id.replace(/^state_/,"");e&&n.set(e,t)}if(0===n.size)throw new Error("VectorFlow: No valid state groups found in SVG.");return n}(this._svgElement),this._stateParts=function(t){const e=new Map;let n=null,r=null;for(const[o,a]of t){const t=new Map,i=a.querySelectorAll("[data-part]");for(const e of i){const n=e.getAttribute("data-part");n&&t.set(n,e)}if(0===t.size)throw new Error(`VectorFlow: State "${o}" has no parts (elements with data-part attribute).`);const s=Array.from(t.keys()).sort().join(",");if(null===n)n=s,r=o;else if(s!==n)throw new Error(`VectorFlow: Part mismatch between states. State "${r}" has parts [${n}] but state "${o}" has parts [${s}].`);e.set(o,t)}return e}(this._stateMap),this._validStates=new Set(this._stateMap.keys()),!this._validStates.has(this._config.initial_state)){const t=Array.from(this._validStates).join(", ");throw new Error(`VectorFlow: initial_state "${this._config.initial_state}" not found in SVG. Available states: ${t}`)}this._stateSnapshots=function(t){const e=new Map;for(const[n,r]of t){const t=new Map;for(const[e,n]of r)t.set(e,l(n));e.set(n,t)}return e}(this._stateParts);const{liveGroup:n,liveParts:r}=function(t,e,n){const r=e.get(n);if(!r){const t=Array.from(e.keys()).join(", ");throw new Error(`VectorFlow: initial_state "${n}" not found in SVG. Available states: ${t}`)}const o=t.querySelector("#live_character");o&&o.remove();const a=r.cloneNode(!0);a.id="live_character",a.removeAttribute("style"),a.style.display="",t.appendChild(a);for(const[,t]of e)t.style.display="none";const i=new Map,s=a.querySelectorAll("[data-part]");for(const t of s){const e=t.getAttribute("data-part");e&&i.set(e,t)}return{liveGroup:a,liveParts:i}}(this._svgElement,this._stateMap,this._config.initial_state);this._liveGroup=n,this._liveParts=r,this._currentState=this._config.initial_state}get states(){return Array.from(this._validStates)}get currentState(){return this._currentState}get actions(){return{...this._config.actions}}get svgElement(){return this._svgElement}get isPlaying(){return null!==this._abortController&&!this._abortController.signal.aborted}get currentAction(){return this._currentActionName}async play(t){const e=this._config.actions[t];if(!e){const e=new Error(`VectorFlow: Unknown action "${t}"`);throw this._emit("error",e),e}if(0!==e.order.length){this.stop(),this._abortController=new AbortController,this._currentActionName=t,this._emit("actionStart",t);try{const n=await async function(t,e,n,r,o,a,i,s,u,c){const{expandSequence:l,expandDirect:f}=c;if("loop"===t.type){const c=t.count||99999;let d=e;for(let e=0;e<c;e++){if(s?.aborted)throw new DOMException("Aborted","AbortError");let e;e="direct"===t.mode?f(t.order,d,n,t.ms,r,o):l(t.order,d,n,t.ms,r,o),e.steps.length>0&&(d=await bt(e.steps,a,i,s,u)||d)}return d}{const c=l(t.order,e,n,t.ms,r,o);return c.steps.length>0&&await bt(c.steps,a,i,s,u)||e}}(e,this._currentState,this._config.routes,this._config.ms,this._validStates,this._liveParts,this._stateSnapshots,this._abortController.signal,t=>{this._currentState=t,this._emit("stateChange",t)},{expandSequence:g,expandDirect:v});n&&(this._currentState=n),this._currentActionName=null,this._emit("actionEnd",t)}catch(t){if("AbortError"===t.name)return;throw this._currentActionName=null,this._emit("error",t),t}}else console.warn(`VectorFlow: Action "${t}" has empty order — no-op.`)}stop(){if(this._abortController&&(this._abortController.abort(),this._abortController=null,this._currentActionName)){const t=this._currentActionName;this._currentActionName=null,this._emit("actionEnd",t)}}on(t,e){return this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e),this}off(t,e){return this._listeners[t]&&(this._listeners[t]=this._listeners[t].filter(t=>t!==e)),this}destroy(){if(this.stop(),this._stateMap)for(const[,t]of this._stateMap)t.style.display="";this._liveGroup&&this._liveGroup.parentNode&&this._liveGroup.remove(),this._listeners={stateChange:[],actionStart:[],actionEnd:[],error:[]}}_emit(t,e){if(this._listeners[t])for(const n of this._listeners[t])try{n(e)}catch(e){console.error(`VectorFlow: Error in "${t}" listener:`,e)}}};return e.default})());
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.VectorFlow=e():t.VectorFlow=e()}(this,()=>(()=>{"use strict";var t={d:(e,n)=>{for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},e={};function n(t){if(!t||"none"===t)return null;3===(t=t.trim().replace("#","")).length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const e=parseInt(t,16);return isNaN(e)?null:{r:e>>16&255,g:e>>8&255,b:255&e}}function r({r:t,g:e,b:n}){const r=t=>Math.round(Math.max(0,Math.min(255,t))).toString(16).padStart(2,"0");return`#${r(t)}${r(e)}${r(n)}`}function o(t,e,n){return t+(e-t)*n}function a(t,e,a){const i=n(t),s=n(e);return i&&s?r({r:o(i.r,s.r,a),g:o(i.g,s.g,a),b:o(i.b,s.b,a)}):e||t||"#000000"}t.d(e,{default:()=>_t});const i=["x","y","width","height","rx","ry","cx","cy","r","opacity"],s=["fill","stroke"];function u(t,e){const n=t.style.getPropertyValue(e);if(n&&"none"!==n)return c(n);const r=t.getAttribute(e);if(r&&"none"!==r)return c(r);const o=window.getComputedStyle(t).getPropertyValue(e);return o&&"none"!==o?c(o):null}function c(t){if(!t||"none"===t)return null;if((t=t.trim()).startsWith("#"))return t;const e=t.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i);if(e)return r({r:parseInt(e[1],10),g:parseInt(e[2],10),b:parseInt(e[3],10)});if("undefined"!=typeof document){const e=document.createElement("canvas").getContext("2d");e.fillStyle=t;const n=e.fillStyle;if(n.startsWith("#"))return n}return t}function l(t){const e={numericAttrs:{},colors:{},transform:null};for(const n of i){const r=t.getAttribute(n);if(null!==r&&""!==r){const t=parseFloat(r);isNaN(t)||(e.numericAttrs[n]=t)}}for(const n of s){const r=u(t,n);r&&(e.colors[n]=r)}const n=t.getAttribute("transform");return n&&(e.transform=n),e}function f(t){const e={translateX:0,translateY:0,scaleX:1,scaleY:1,rotate:0};if(!t)return e;const n=t.match(/translate\(\s*([-\d.]+)\s*[,\s]\s*([-\d.]+)\s*\)/);n&&(e.translateX=parseFloat(n[1]),e.translateY=parseFloat(n[2]));const r=t.match(/scale\(\s*([-\d.]+)(?:\s*[,\s]\s*([-\d.]+))?\s*\)/);r&&(e.scaleX=parseFloat(r[1]),e.scaleY=void 0!==r[2]?parseFloat(r[2]):e.scaleX);const o=t.match(/rotate\(\s*([-\d.]+)/);return o&&(e.rotate=parseFloat(o[1])),e}function d({translateX:t,translateY:e,scaleX:n,scaleY:r,rotate:o}){const a=[];return 0===t&&0===e||a.push(`translate(${t},${e})`),0!==o&&a.push(`rotate(${o})`),1===n&&1===r||a.push(`scale(${n},${r})`),a.length>0?a.join(" "):null}function h(t,e,n){const r=n[t];return r?Array.isArray(r[e])?r[e]:Array.isArray(r["*"])?r["*"]:[t]:[t]}function p(t,e){return t.length>0&&t[0]===e?t.slice(1):t}function m(t,e,n){return"number"==typeof t&&t>0?t:"number"==typeof e&&e>0?e:"number"==typeof n&&n>0?n:120}function g(t,e,n,r,o,a){const i=[];let s=e;for(const e of t){const t=p(h(e,s,n),s);if(0!==t.length)for(const u of t){if(a&&!a.has(u))throw new Error(`VectorFlow: Route "${e}" resolves to unknown state "${u}"`);const t=m(r,n[e]?.ms??n[u]?.ms,o);i.push({state:u,ms:t}),s=u}}return{steps:i,finalState:s}}function v(t,e,n,r,o,a){const i=[];let s=e;for(const e of t){const t=h(e,s,n),u=t[t.length-1];if(a&&!a.has(u))throw new Error(`VectorFlow: Route "${e}" resolves to unknown state "${u}"`);if(u===s)continue;const c=m(r,n[e]?.ms??n[u]?.ms,o);i.push({state:u,ms:c}),s=u}return{steps:i,finalState:s}}var y={update:null,begin:null,loopBegin:null,changeBegin:null,change:null,changeComplete:null,loopComplete:null,complete:null,loop:1,direction:"normal",autoplay:!0,timelineOffset:0},w={duration:1e3,delay:0,endDelay:0,easing:"easeOutElastic(1, .5)",round:0},b=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","scale","scaleX","scaleY","scaleZ","skew","skewX","skewY","perspective","matrix","matrix3d"],_={CSS:{},springs:{}};function M(t,e,n){return Math.min(Math.max(t,e),n)}function x(t,e){return t.indexOf(e)>-1}function A(t,e){return t.apply(null,e)}var E={arr:function(t){return Array.isArray(t)},obj:function(t){return x(Object.prototype.toString.call(t),"Object")},pth:function(t){return E.obj(t)&&t.hasOwnProperty("totalLength")},svg:function(t){return t instanceof SVGElement},inp:function(t){return t instanceof HTMLInputElement},dom:function(t){return t.nodeType||E.svg(t)},str:function(t){return"string"==typeof t},fnc:function(t){return"function"==typeof t},und:function(t){return void 0===t},nil:function(t){return E.und(t)||null===t},hex:function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},rgb:function(t){return/^rgb/.test(t)},hsl:function(t){return/^hsl/.test(t)},col:function(t){return E.hex(t)||E.rgb(t)||E.hsl(t)},key:function(t){return!y.hasOwnProperty(t)&&!w.hasOwnProperty(t)&&"targets"!==t&&"keyframes"!==t}};function S(t){var e=/\(([^)]+)\)/.exec(t);return e?e[1].split(",").map(function(t){return parseFloat(t)}):[]}function F(t,e){var n=S(t),r=M(E.und(n[0])?1:n[0],.1,100),o=M(E.und(n[1])?100:n[1],.1,100),a=M(E.und(n[2])?10:n[2],.1,100),i=M(E.und(n[3])?0:n[3],.1,100),s=Math.sqrt(o/r),u=a/(2*Math.sqrt(o*r)),c=u<1?s*Math.sqrt(1-u*u):0,l=u<1?(u*s-i)/c:-i+s;function f(t){var n=e?e*t/1e3:t;return n=u<1?Math.exp(-n*u*s)*(1*Math.cos(c*n)+l*Math.sin(c*n)):(1+l*n)*Math.exp(-n*s),0===t||1===t?t:1-n}return e?f:function(){var e=_.springs[t];if(e)return e;for(var n=1/6,r=0,o=0;;)if(1===f(r+=n)){if(++o>=16)break}else o=0;var a=r*n*1e3;return _.springs[t]=a,a}}function O(t){return void 0===t&&(t=10),function(e){return Math.ceil(M(e,1e-6,1)*t)*(1/t)}}var V,N,P=function(){var t=.1;function e(t,e){return 1-3*e+3*t}function n(t,e){return 3*e-6*t}function r(t){return 3*t}function o(t,o,a){return((e(o,a)*t+n(o,a))*t+r(o))*t}function a(t,o,a){return 3*e(o,a)*t*t+2*n(o,a)*t+r(o)}return function(e,n,r,i){if(0<=e&&e<=1&&0<=r&&r<=1){var s=new Float32Array(11);if(e!==n||r!==i)for(var u=0;u<11;++u)s[u]=o(u*t,e,r);return function(u){return e===n&&r===i||0===u||1===u?u:o(function(n){for(var i=0,u=1;10!==u&&s[u]<=n;++u)i+=t;--u;var c=i+(n-s[u])/(s[u+1]-s[u])*t,l=a(c,e,r);return l>=.001?function(t,e,n,r){for(var i=0;i<4;++i){var s=a(e,n,r);if(0===s)return e;e-=(o(e,n,r)-t)/s}return e}(n,c,e,r):0===l?c:function(t,e,n,r,a){var i,s,u=0;do{(i=o(s=e+(n-e)/2,r,a)-t)>0?n=s:e=s}while(Math.abs(i)>1e-7&&++u<10);return s}(n,i,i+t,e,r)}(u),n,i)}}}}(),C=(V={linear:function(){return function(t){return t}}},N={Sine:function(){return function(t){return 1-Math.cos(t*Math.PI/2)}},Expo:function(){return function(t){return t?Math.pow(2,10*t-10):0}},Circ:function(){return function(t){return 1-Math.sqrt(1-t*t)}},Back:function(){return function(t){return t*t*(3*t-2)}},Bounce:function(){return function(t){for(var e,n=4;t<((e=Math.pow(2,--n))-1)/11;);return 1/Math.pow(4,3-n)-7.5625*Math.pow((3*e-2)/22-t,2)}},Elastic:function(t,e){void 0===t&&(t=1),void 0===e&&(e=.5);var n=M(t,1,10),r=M(e,.1,2);return function(t){return 0===t||1===t?t:-n*Math.pow(2,10*(t-1))*Math.sin((t-1-r/(2*Math.PI)*Math.asin(1/n))*(2*Math.PI)/r)}}},["Quad","Cubic","Quart","Quint"].forEach(function(t,e){N[t]=function(){return function(t){return Math.pow(t,e+2)}}}),Object.keys(N).forEach(function(t){var e=N[t];V["easeIn"+t]=e,V["easeOut"+t]=function(t,n){return function(r){return 1-e(t,n)(1-r)}},V["easeInOut"+t]=function(t,n){return function(r){return r<.5?e(t,n)(2*r)/2:1-e(t,n)(-2*r+2)/2}},V["easeOutIn"+t]=function(t,n){return function(r){return r<.5?(1-e(t,n)(1-2*r))/2:(e(t,n)(2*r-1)+1)/2}}}),V);function $(t,e){if(E.fnc(t))return t;var n=t.split("(")[0],r=C[n],o=S(t);switch(n){case"spring":return F(t,e);case"cubicBezier":return A(P,o);case"steps":return A(O,o);default:return A(r,o)}}function j(t){try{return document.querySelectorAll(t)}catch(t){return}}function k(t,e){for(var n=t.length,r=arguments.length>=2?arguments[1]:void 0,o=[],a=0;a<n;a++)if(a in t){var i=t[a];e.call(r,i,a,t)&&o.push(i)}return o}function D(t){return t.reduce(function(t,e){return t.concat(E.arr(e)?D(e):e)},[])}function I(t){return E.arr(t)?t:(E.str(t)&&(t=j(t)||t),t instanceof NodeList||t instanceof HTMLCollection?[].slice.call(t):[t])}function B(t,e){return t.some(function(t){return t===e})}function T(t){var e={};for(var n in t)e[n]=t[n];return e}function q(t,e){var n=T(t);for(var r in t)n[r]=e.hasOwnProperty(r)?e[r]:t[r];return n}function G(t,e){var n=T(t);for(var r in e)n[r]=E.und(t[r])?e[r]:t[r];return n}function X(t){var e=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(t);if(e)return e[1]}function Y(t,e){return E.fnc(t)?t(e.target,e.id,e.total):t}function L(t,e){return t.getAttribute(e)}function H(t,e,n){if(B([n,"deg","rad","turn"],X(e)))return e;var r=_.CSS[e+n];if(!E.und(r))return r;var o=document.createElement(t.tagName),a=t.parentNode&&t.parentNode!==document?t.parentNode:document.body;a.appendChild(o),o.style.position="absolute",o.style.width=100+n;var i=100/o.offsetWidth;a.removeChild(o);var s=i*parseFloat(e);return _.CSS[e+n]=s,s}function J(t,e,n){if(e in t.style){var r=e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),o=t.style[e]||getComputedStyle(t).getPropertyValue(r)||"0";return n?H(t,o,n):o}}function W(t,e){return E.dom(t)&&!E.inp(t)&&(!E.nil(L(t,e))||E.svg(t)&&t[e])?"attribute":E.dom(t)&&B(b,e)?"transform":E.dom(t)&&"transform"!==e&&J(t,e)?"css":null!=t[e]?"object":void 0}function z(t){if(E.dom(t)){for(var e,n=t.style.transform||"",r=/(\w+)\(([^)]*)\)/g,o=new Map;e=r.exec(n);)o.set(e[1],e[2]);return o}}function Z(t,e,n,r){switch(W(t,e)){case"transform":return function(t,e,n,r){var o=x(e,"scale")?1:0+function(t){return x(t,"translate")||"perspective"===t?"px":x(t,"rotate")||x(t,"skew")?"deg":void 0}(e),a=z(t).get(e)||o;return n&&(n.transforms.list.set(e,a),n.transforms.last=e),r?H(t,a,r):a}(t,e,r,n);case"css":return J(t,e,n);case"attribute":return L(t,e);default:return t[e]||0}}function Q(t,e){var n=/^(\*=|\+=|-=)/.exec(t);if(!n)return t;var r=X(t)||0,o=parseFloat(e),a=parseFloat(t.replace(n[0],""));switch(n[0][0]){case"+":return o+a+r;case"-":return o-a+r;case"*":return o*a+r}}function R(t,e){if(E.col(t))return function(t){return E.rgb(t)?(n=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(e=t))?"rgba("+n[1]+",1)":e:E.hex(t)?function(t){var e=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(t,e,n,r){return e+e+n+n+r+r}),n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return"rgba("+parseInt(n[1],16)+","+parseInt(n[2],16)+","+parseInt(n[3],16)+",1)"}(t):E.hsl(t)?function(t){var e,n,r,o=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t),a=parseInt(o[1],10)/360,i=parseInt(o[2],10)/100,s=parseInt(o[3],10)/100,u=o[4]||1;function c(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+(e-t)*(2/3-n)*6:t}if(0==i)e=n=r=s;else{var l=s<.5?s*(1+i):s+i-s*i,f=2*s-l;e=c(f,l,a+1/3),n=c(f,l,a),r=c(f,l,a-1/3)}return"rgba("+255*e+","+255*n+","+255*r+","+u+")"}(t):void 0;var e,n}(t);if(/\s/g.test(t))return t;var n=X(t),r=n?t.substr(0,t.length-n.length):t;return e?r+e:r}function U(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t){for(var e,n=t.points,r=0,o=0;o<n.numberOfItems;o++){var a=n.getItem(o);o>0&&(r+=U(e,a)),e=a}return r}function tt(t){if(t.getTotalLength)return t.getTotalLength();switch(t.tagName.toLowerCase()){case"circle":return function(t){return 2*Math.PI*L(t,"r")}(t);case"rect":return function(t){return 2*L(t,"width")+2*L(t,"height")}(t);case"line":return function(t){return U({x:L(t,"x1"),y:L(t,"y1")},{x:L(t,"x2"),y:L(t,"y2")})}(t);case"polyline":return K(t);case"polygon":return function(t){var e=t.points;return K(t)+U(e.getItem(e.numberOfItems-1),e.getItem(0))}(t)}}function et(t,e){var n=e||{},r=n.el||function(t){for(var e=t.parentNode;E.svg(e)&&E.svg(e.parentNode);)e=e.parentNode;return e}(t),o=r.getBoundingClientRect(),a=L(r,"viewBox"),i=o.width,s=o.height,u=n.viewBox||(a?a.split(" "):[0,0,i,s]);return{el:r,viewBox:u,x:u[0]/1,y:u[1]/1,w:i,h:s,vW:u[2],vH:u[3]}}function nt(t,e,n){function r(n){void 0===n&&(n=0);var r=e+n>=1?e+n:0;return t.el.getPointAtLength(r)}var o=et(t.el,t.svg),a=r(),i=r(-1),s=r(1),u=n?1:o.w/o.vW,c=n?1:o.h/o.vH;switch(t.property){case"x":return(a.x-o.x)*u;case"y":return(a.y-o.y)*c;case"angle":return 180*Math.atan2(s.y-i.y,s.x-i.x)/Math.PI}}function rt(t,e){var n=/[+-]?\d*\.?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g,r=R(E.pth(t)?t.totalLength:t,e)+"";return{original:r,numbers:r.match(n)?r.match(n).map(Number):[0],strings:E.str(t)||e?r.split(n):[]}}function ot(t){return k(t?D(E.arr(t)?t.map(I):I(t)):[],function(t,e,n){return n.indexOf(t)===e})}function at(t){var e=ot(t);return e.map(function(t,n){return{target:t,id:n,total:e.length,transforms:{list:z(t)}}})}function it(t,e){var n=T(e);if(/^spring/.test(n.easing)&&(n.duration=F(n.easing)),E.arr(t)){var r=t.length;2!==r||E.obj(t[0])?E.fnc(e.duration)||(n.duration=e.duration/r):t={value:t}}var o=E.arr(t)?t:[t];return o.map(function(t,n){var r=E.obj(t)&&!E.pth(t)?t:{value:t};return E.und(r.delay)&&(r.delay=n?0:e.delay),E.und(r.endDelay)&&(r.endDelay=n===o.length-1?e.endDelay:0),r}).map(function(t){return G(t,n)})}var st={css:function(t,e,n){return t.style[e]=n},attribute:function(t,e,n){return t.setAttribute(e,n)},object:function(t,e,n){return t[e]=n},transform:function(t,e,n,r,o){if(r.list.set(e,n),e===r.last||o){var a="";r.list.forEach(function(t,e){a+=e+"("+t+") "}),t.style.transform=a}}};function ut(t,e){at(t).forEach(function(t){for(var n in e){var r=Y(e[n],t),o=t.target,a=X(r),i=Z(o,n,a,t),s=Q(R(r,a||X(i)),i),u=W(o,n);st[u](o,n,s,t.transforms,!0)}})}function ct(t,e){return k(D(t.map(function(t){return e.map(function(e){return function(t,e){var n=W(t.target,e.name);if(n){var r=function(t,e){var n;return t.tweens.map(function(r){var o=function(t,e){var n={};for(var r in t){var o=Y(t[r],e);E.arr(o)&&1===(o=o.map(function(t){return Y(t,e)})).length&&(o=o[0]),n[r]=o}return n.duration=parseFloat(n.duration),n.delay=parseFloat(n.delay),n}(r,e),a=o.value,i=E.arr(a)?a[1]:a,s=X(i),u=Z(e.target,t.name,s,e),c=n?n.to.original:u,l=E.arr(a)?a[0]:c,f=X(l)||X(u),d=s||f;return E.und(i)&&(i=c),o.from=rt(l,d),o.to=rt(Q(i,l),d),o.start=n?n.end:0,o.end=o.start+o.delay+o.duration+o.endDelay,o.easing=$(o.easing,o.duration),o.isPath=E.pth(a),o.isPathTargetInsideSVG=o.isPath&&E.svg(e.target),o.isColor=E.col(o.from.original),o.isColor&&(o.round=1),n=o,o})}(e,t),o=r[r.length-1];return{type:n,property:e.name,animatable:t,tweens:r,duration:o.end,delay:r[0].delay,endDelay:o.endDelay}}}(t,e)})})),function(t){return!E.und(t)})}function lt(t,e){var n=t.length,r=function(t){return t.timelineOffset?t.timelineOffset:0},o={};return o.duration=n?Math.max.apply(Math,t.map(function(t){return r(t)+t.duration})):e.duration,o.delay=n?Math.min.apply(Math,t.map(function(t){return r(t)+t.delay})):e.delay,o.endDelay=n?o.duration-Math.max.apply(Math,t.map(function(t){return r(t)+t.duration-t.endDelay})):e.endDelay,o}var ft=0,dt=[],ht=function(){var t;function e(n){for(var r=dt.length,o=0;o<r;){var a=dt[o];a.paused?(dt.splice(o,1),r--):(a.tick(n),o++)}t=o>0?requestAnimationFrame(e):void 0}return"undefined"!=typeof document&&document.addEventListener("visibilitychange",function(){mt.suspendWhenDocumentHidden&&(pt()?t=cancelAnimationFrame(t):(dt.forEach(function(t){return t._onDocumentVisibility()}),ht()))}),function(){t||pt()&&mt.suspendWhenDocumentHidden||!(dt.length>0)||(t=requestAnimationFrame(e))}}();function pt(){return!!document&&document.hidden}function mt(t){void 0===t&&(t={});var e,n=0,r=0,o=0,a=0,i=null;function s(t){var e=window.Promise&&new Promise(function(t){return i=t});return t.finished=e,e}var u=function(t){var e=q(y,t),n=q(w,t),r=function(t,e){var n=[],r=e.keyframes;for(var o in r&&(e=G(function(t){for(var e=k(D(t.map(function(t){return Object.keys(t)})),function(t){return E.key(t)}).reduce(function(t,e){return t.indexOf(e)<0&&t.push(e),t},[]),n={},r=function(r){var o=e[r];n[o]=t.map(function(t){var e={};for(var n in t)E.key(n)?n==o&&(e.value=t[n]):e[n]=t[n];return e})},o=0;o<e.length;o++)r(o);return n}(r),e)),e)E.key(o)&&n.push({name:o,tweens:it(e[o],t)});return n}(n,t),o=at(t.targets),a=ct(o,r),i=lt(a,n),s=ft;return ft++,G(e,{id:s,children:[],animatables:o,animations:a,duration:i.duration,delay:i.delay,endDelay:i.endDelay})}(t);function c(){var t=u.direction;"alternate"!==t&&(u.direction="normal"!==t?"normal":"reverse"),u.reversed=!u.reversed,e.forEach(function(t){return t.reversed=u.reversed})}function l(t){return u.reversed?u.duration-t:t}function f(){n=0,r=l(u.currentTime)*(1/mt.speed)}function d(t,e){e&&e.seek(t-e.timelineOffset)}function h(t){for(var e=0,n=u.animations,r=n.length;e<r;){var o=n[e],a=o.animatable,i=o.tweens,s=i.length-1,c=i[s];s&&(c=k(i,function(e){return t<e.end})[0]||c);for(var l=M(t-c.start-c.delay,0,c.duration)/c.duration,f=isNaN(l)?1:c.easing(l),d=c.to.strings,h=c.round,p=[],m=c.to.numbers.length,g=void 0,v=0;v<m;v++){var y=void 0,w=c.to.numbers[v],b=c.from.numbers[v]||0;y=c.isPath?nt(c.value,f*w,c.isPathTargetInsideSVG):b+f*(w-b),h&&(c.isColor&&v>2||(y=Math.round(y*h)/h)),p.push(y)}var _=d.length;if(_){g=d[0];for(var x=0;x<_;x++){d[x];var A=d[x+1],E=p[x];isNaN(E)||(g+=A?E+A:E+" ")}}else g=p[0];st[o.type](a.target,o.property,g,a.transforms),o.currentValue=g,e++}}function p(t){u[t]&&!u.passThrough&&u[t](u)}function m(t){var f=u.duration,m=u.delay,g=f-u.endDelay,v=l(t);u.progress=M(v/f*100,0,100),u.reversePlayback=v<u.currentTime,e&&function(t){if(u.reversePlayback)for(var n=a;n--;)d(t,e[n]);else for(var r=0;r<a;r++)d(t,e[r])}(v),!u.began&&u.currentTime>0&&(u.began=!0,p("begin")),!u.loopBegan&&u.currentTime>0&&(u.loopBegan=!0,p("loopBegin")),v<=m&&0!==u.currentTime&&h(0),(v>=g&&u.currentTime!==f||!f)&&h(f),v>m&&v<g?(u.changeBegan||(u.changeBegan=!0,u.changeCompleted=!1,p("changeBegin")),p("change"),h(v)):u.changeBegan&&(u.changeCompleted=!0,u.changeBegan=!1,p("changeComplete")),u.currentTime=M(v,0,f),u.began&&p("update"),t>=f&&(r=0,u.remaining&&!0!==u.remaining&&u.remaining--,u.remaining?(n=o,p("loopComplete"),u.loopBegan=!1,"alternate"===u.direction&&c()):(u.paused=!0,u.completed||(u.completed=!0,p("loopComplete"),p("complete"),!u.passThrough&&"Promise"in window&&(i(),s(u)))))}return s(u),u.reset=function(){var t=u.direction;u.passThrough=!1,u.currentTime=0,u.progress=0,u.paused=!0,u.began=!1,u.loopBegan=!1,u.changeBegan=!1,u.completed=!1,u.changeCompleted=!1,u.reversePlayback=!1,u.reversed="reverse"===t,u.remaining=u.loop,e=u.children;for(var n=a=e.length;n--;)u.children[n].reset();(u.reversed&&!0!==u.loop||"alternate"===t&&1===u.loop)&&u.remaining++,h(u.reversed?u.duration:0)},u._onDocumentVisibility=f,u.set=function(t,e){return ut(t,e),u},u.tick=function(t){o=t,n||(n=o),m((o+(r-n))*mt.speed)},u.seek=function(t){m(l(t))},u.pause=function(){u.paused=!0,f()},u.play=function(){u.paused&&(u.completed&&u.reset(),u.paused=!1,dt.push(u),f(),ht())},u.reverse=function(){c(),u.completed=!u.reversed,f()},u.restart=function(){u.reset(),u.play()},u.remove=function(t){vt(ot(t),u)},u.reset(),u.autoplay&&u.play(),u}function gt(t,e){for(var n=e.length;n--;)B(t,e[n].animatable.target)&&e.splice(n,1)}function vt(t,e){var n=e.animations,r=e.children;gt(t,n);for(var o=r.length;o--;){var a=r[o],i=a.animations;gt(t,i),i.length||a.children.length||r.splice(o,1)}n.length||r.length||e.pause()}mt.version="3.2.1",mt.speed=1,mt.suspendWhenDocumentHidden=!0,mt.running=dt,mt.remove=function(t){for(var e=ot(t),n=dt.length;n--;)vt(e,dt[n])},mt.get=Z,mt.set=ut,mt.convertPx=H,mt.path=function(t,e){var n=E.str(t)?j(t)[0]:t,r=e||100;return function(t){return{property:t,el:n,svg:et(n),totalLength:tt(n)*(r/100)}}},mt.setDashoffset=function(t){var e=tt(t);return t.setAttribute("stroke-dasharray",e),e},mt.stagger=function(t,e){void 0===e&&(e={});var n=e.direction||"normal",r=e.easing?$(e.easing):null,o=e.grid,a=e.axis,i=e.from||0,s="first"===i,u="center"===i,c="last"===i,l=E.arr(t),f=l?parseFloat(t[0]):parseFloat(t),d=l?parseFloat(t[1]):0,h=X(l?t[1]:t)||0,p=e.start||0+(l?f:0),m=[],g=0;return function(t,e,v){if(s&&(i=0),u&&(i=(v-1)/2),c&&(i=v-1),!m.length){for(var y=0;y<v;y++){if(o){var w=u?(o[0]-1)/2:i%o[0],b=u?(o[1]-1)/2:Math.floor(i/o[0]),_=w-y%o[0],M=b-Math.floor(y/o[0]),x=Math.sqrt(_*_+M*M);"x"===a&&(x=-_),"y"===a&&(x=-M),m.push(x)}else m.push(Math.abs(i-y));g=Math.max.apply(Math,m)}r&&(m=m.map(function(t){return r(t/g)*g})),"reverse"===n&&(m=m.map(function(t){return a?t<0?-1*t:-t:Math.abs(g-t)}))}return p+(l?(d-f)/g:f)*(Math.round(100*m[e])/100)+h}},mt.timeline=function(t){void 0===t&&(t={});var e=mt(t);return e.duration=0,e.add=function(n,r){var o=dt.indexOf(e),a=e.children;function i(t){t.passThrough=!0}o>-1&&dt.splice(o,1);for(var s=0;s<a.length;s++)i(a[s]);var u=G(n,q(w,t));u.targets=u.targets||t.targets;var c=e.duration;u.autoplay=!1,u.direction=e.direction,u.timelineOffset=E.und(r)?c:Q(r,c),i(e),e.seek(u.timelineOffset);var l=mt(u);i(l),a.push(l);var f=lt(a,t);return e.delay=f.delay,e.endDelay=f.endDelay,e.duration=f.duration,e.seek(0),e.reset(),e.autoplay&&e.play(),e},e},mt.easing=$,mt.penner=C,mt.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t};const yt=mt;function wt(t,e,n,r){return new Promise((i,s)=>{if(r?.aborted)return void s(new DOMException("Aborted","AbortError"));const u=[];let c=0;const h=t.size;if(0===h)return void i();for(const[r,s]of t){const t=e.get(r);if(!t)continue;const p=l(s),m={targets:s,duration:n,easing:"linear",complete:()=>{c++,c>=h&&i()}};for(const[e,n]of Object.entries(t.numericAttrs))(p.numericAttrs[e]??n)!==n&&(m[e]=n);const g=[];for(const[e,n]of Object.entries(t.colors)){const t=p.colors[e];t&&t!==n?g.push({prop:e,from:t,to:n}):!t&&n&&s.style.setProperty(e,n)}let v=null;if(t.transform||p.transform){const e=f(p.transform),n=f(t.transform);JSON.stringify(e)!==JSON.stringify(n)&&(v={from:e,to:n})}if(g.length>0||v){const t={t:0},e=yt({targets:t,t:1,duration:n,easing:"linear",update:()=>{const e=t.t;for(const{prop:t,from:n,to:r}of g){const o=a(n,r,e);s.style.setProperty(t,o)}if(v){const{from:t,to:n}=v,r=d({translateX:o(t.translateX,n.translateX,e),translateY:o(t.translateY,n.translateY,e),scaleX:o(t.scaleX,n.scaleX,e),scaleY:o(t.scaleY,n.scaleY,e),rotate:o(t.rotate,n.rotate,e)});r?s.setAttribute("transform",r):s.removeAttribute("transform")}}});u.push(e)}if(Object.keys(m).some(t=>!["targets","duration","easing","complete"].includes(t))){const t=yt(m);u.push(t)}else m.complete()}r&&r.addEventListener("abort",()=>{for(const t of u)yt.remove(t.targets||t),t.pause&&t.pause();s(new DOMException("Aborted","AbortError"))},{once:!0})})}async function bt(t,e,n,r,o){let a=null;for(const i of t){if(r?.aborted)throw new DOMException("Aborted","AbortError");const t=n.get(i.state);if(!t)throw new Error(`VectorFlow: No snapshots for state "${i.state}"`);await wt(e,t,i.ms,r),a=i.state,o&&o(i.state)}return a}const _t=class{constructor({svgElement:t,json:e}){if(this._listeners={stateChange:[],actionStart:[],actionEnd:[],error:[]},this._abortController=null,this._currentActionName=null,this._config=function(t){let e;if("string"==typeof t)try{e=JSON.parse(t)}catch(t){throw new Error(`VectorFlow: Invalid JSON — ${t.message}`)}else{if("object"!=typeof t||null===t)throw new Error("VectorFlow: JSON input must be a string or object");e=t}if(!e.initial_state||"string"!=typeof e.initial_state)throw new Error('VectorFlow: JSON must have a string "initial_state" field');if(!e.routes||"object"!=typeof e.routes)throw new Error('VectorFlow: JSON must have a "routes" object');if(!e.actions||"object"!=typeof e.actions)throw new Error('VectorFlow: JSON must have an "actions" object');const n="number"==typeof e.ms&&e.ms>0?e.ms:120,r={};for(const[t,n]of Object.entries(e.routes)){if("object"!=typeof n||null===n)throw new Error(`VectorFlow: routes["${t}"] must be an object`);r[t]={};for(const[e,o]of Object.entries(n))if("ms"===e){if("number"!=typeof o)throw new Error(`VectorFlow: routes["${t}"].ms must be a number`);r[t].ms=o}else{if(!Array.isArray(o)||!o.every(t=>"string"==typeof t))throw new Error(`VectorFlow: routes["${t}"]["${e}"] must be an array of strings`);r[t][e]=o}}const o={};for(const[t,n]of Object.entries(e.actions)){const e="loop"===n.type?"loop":"sequence";if(!Array.isArray(n.order)||0===n.order.length){console.warn(`VectorFlow: action "${t}" has no valid order — will be a no-op`),o[t]={type:e,order:[],ms:void 0,count:void 0,mode:void 0};continue}const r="number"==typeof n.ms&&n.ms>0?n.ms:void 0;let a,i;"loop"===e&&(a="number"==typeof n.count&&n.count>0?n.count:99999,i="string"==typeof n.mode?n.mode:void 0),o[t]={type:e,order:n.order,ms:r,count:a,mode:i}}return{name:e.name||"untitled",initial_state:e.initial_state,ms:n,routes:r,actions:o}}(e),"string"==typeof t){const e=document.createElement("div");if(e.innerHTML=t.trim(),this._svgElement=e.querySelector("svg"),!this._svgElement)throw new Error("VectorFlow: Provided SVG string does not contain an <svg> element.")}else{if(!(t instanceof SVGElement))throw new Error("VectorFlow: svgElement must be an SVG DOM element or an SVG string.");this._svgElement=t}if(this._stateMap=function(t){const e=t.querySelectorAll('g[id^="state_"]');if(0===e.length)throw new Error('VectorFlow: No state groups found in SVG. Expected groups with id="state_{name}".');const n=new Map;for(const t of e){const e=t.id.replace(/^state_/,"");e&&n.set(e,t)}if(0===n.size)throw new Error("VectorFlow: No valid state groups found in SVG.");return n}(this._svgElement),this._stateParts=function(t){const e=new Map;let n=null,r=null;for(const[o,a]of t){const t=new Map,i=a.querySelectorAll("[data-part]");for(const e of i){const n=e.getAttribute("data-part");n&&t.set(n,e)}if(0===t.size)throw new Error(`VectorFlow: State "${o}" has no parts (elements with data-part attribute).`);const s=Array.from(t.keys()).sort().join(",");if(null===n)n=s,r=o;else if(s!==n)throw new Error(`VectorFlow: Part mismatch between states. State "${r}" has parts [${n}] but state "${o}" has parts [${s}].`);e.set(o,t)}return e}(this._stateMap),this._validStates=new Set(this._stateMap.keys()),!this._validStates.has(this._config.initial_state)){const t=Array.from(this._validStates).join(", ");throw new Error(`VectorFlow: initial_state "${this._config.initial_state}" not found in SVG. Available states: ${t}`)}this._stateSnapshots=function(t){const e=new Map;for(const[n,r]of t){const t=new Map;for(const[e,n]of r)t.set(e,l(n));e.set(n,t)}return e}(this._stateParts);const{liveGroup:n,liveParts:r}=function(t,e,n){const r=e.get(n);if(!r){const t=Array.from(e.keys()).join(", ");throw new Error(`VectorFlow: initial_state "${n}" not found in SVG. Available states: ${t}`)}const o=t.querySelector("#live_character");o&&o.remove();const a=r.cloneNode(!0);a.id="live_character",a.removeAttribute("style"),a.style.display="",t.appendChild(a);for(const[,t]of e)t.style.display="none";const i=new Map,s=a.querySelectorAll("[data-part]");for(const t of s){const e=t.getAttribute("data-part");e&&i.set(e,t)}return{liveGroup:a,liveParts:i}}(this._svgElement,this._stateMap,this._config.initial_state);this._liveGroup=n,this._liveParts=r,this._currentState=this._config.initial_state}get states(){return Array.from(this._validStates)}get currentState(){return this._currentState}get actions(){return{...this._config.actions}}get svgElement(){return this._svgElement}get isPlaying(){return null!==this._abortController&&!this._abortController.signal.aborted}get currentAction(){return this._currentActionName}async play(t){const e=this._config.actions[t];if(!e){const e=new Error(`VectorFlow: Unknown action "${t}"`);throw this._emit("error",e),e}if(0!==e.order.length){this.stop(),this._abortController=new AbortController,this._currentActionName=t,this._emit("actionStart",t);try{const n=await async function(t,e,n,r,o,a,i,s,u,c){const{expandSequence:l,expandDirect:f}=c;if("loop"===t.type){const c=t.count||99999;let d=e;for(let e=0;e<c;e++){if(s?.aborted)throw new DOMException("Aborted","AbortError");let e;e="direct"===t.mode?f(t.order,d,n,t.ms,r,o):l(t.order,d,n,t.ms,r,o),e.steps.length>0&&(d=await bt(e.steps,a,i,s,u)||d)}return d}{const c=l(t.order,e,n,t.ms,r,o);return c.steps.length>0&&await bt(c.steps,a,i,s,u)||e}}(e,this._currentState,this._config.routes,this._config.ms,this._validStates,this._liveParts,this._stateSnapshots,this._abortController.signal,t=>{this._currentState=t,this._emit("stateChange",t)},{expandSequence:g,expandDirect:v});n&&(this._currentState=n),this._currentActionName=null,this._emit("actionEnd",t)}catch(t){if("AbortError"===t.name)return;throw this._currentActionName=null,this._emit("error",t),t}}else console.warn(`VectorFlow: Action "${t}" has empty order — no-op.`)}stop(){if(this._abortController&&(this._abortController.abort(),this._abortController=null,this._currentActionName)){const t=this._currentActionName;this._currentActionName=null,this._emit("actionEnd",t)}}on(t,e){return this._listeners[t]||(this._listeners[t]=[]),this._listeners[t].push(e),this}off(t,e){return this._listeners[t]&&(this._listeners[t]=this._listeners[t].filter(t=>t!==e)),this}destroy(){if(this.stop(),this._stateMap)for(const[,t]of this._stateMap)t.style.display="";this._liveGroup&&this._liveGroup.parentNode&&this._liveGroup.remove(),this._listeners={stateChange:[],actionStart:[],actionEnd:[],error:[]}}_emit(t,e){if(this._listeners[t])for(const n of this._listeners[t])try{n(e)}catch(e){console.error(`VectorFlow: Error in "${t}" listener:`,e)}}};return e.default})());
|
|
2
2
|
//# sourceMappingURL=vectorflow.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorflow.umd.js","mappings":"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","sources":["webpack://VectorFlow/webpack/universalModuleDefinition","webpack://VectorFlow/webpack/bootstrap","webpack://VectorFlow/webpack/runtime/define property getters","webpack://VectorFlow/webpack/runtime/hasOwnProperty shorthand","webpack://VectorFlow/./src/utils.js","webpack://VectorFlow/./src/engine.js","webpack://VectorFlow/./node_modules/animejs/lib/anime.es.js","webpack://VectorFlow/./src/player.js","webpack://VectorFlow/./src/index.js","webpack://VectorFlow/./src/parser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VectorFlow\"] = factory();\n\telse\n\t\troot[\"VectorFlow\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\r\n * VectorFlow — Utility helpers\r\n * Color parsing, attribute reading, interpolation helpers.\r\n */\r\n\r\n/**\r\n * Parse a hex color string to { r, g, b } (0-255).\r\n * Supports #RGB, #RRGGBB.\r\n */\r\nexport function hexToRgb(hex) {\r\n if (!hex || hex === 'none') return null;\r\n hex = hex.trim().replace('#', '');\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const num = parseInt(hex, 16);\r\n if (isNaN(num)) return null;\r\n return {\r\n r: (num >> 16) & 255,\r\n g: (num >> 8) & 255,\r\n b: num & 255,\r\n };\r\n}\r\n\r\n/**\r\n * Convert { r, g, b } back to a hex string.\r\n */\r\nexport function rgbToHex({ r, g, b }) {\r\n const toHex = (n) => Math.round(Math.max(0, Math.min(255, n)))\r\n .toString(16)\r\n .padStart(2, '0');\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two numbers.\r\n */\r\nexport function lerp(a, b, t) {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two colors (hex strings).\r\n * Returns a hex string.\r\n */\r\nexport function lerpColor(colorA, colorB, t) {\r\n const a = hexToRgb(colorA);\r\n const b = hexToRgb(colorB);\r\n if (!a || !b) return colorB || colorA || '#000000';\r\n return rgbToHex({\r\n r: lerp(a.r, b.r, t),\r\n g: lerp(a.g, b.g, t),\r\n b: lerp(a.b, b.b, t),\r\n });\r\n}\r\n\r\n/**\r\n * Numeric SVG attributes we want to interpolate.\r\n */\r\nexport const NUMERIC_ATTRS = ['x', 'y', 'width', 'height', 'rx', 'ry', 'cx', 'cy', 'r', 'opacity'];\r\n\r\n/**\r\n * Style properties that may contain colors.\r\n */\r\nexport const COLOR_PROPS = ['fill', 'stroke'];\r\n\r\n/**\r\n * Read a numeric attribute from an SVG element.\r\n * Falls back to computed style, then to defaultVal.\r\n */\r\nexport function readNumericAttr(el, attr, defaultVal = 0) {\r\n // Try direct attribute first\r\n const raw = el.getAttribute(attr);\r\n if (raw !== null && raw !== '') {\r\n const val = parseFloat(raw);\r\n if (!isNaN(val)) return val;\r\n }\r\n return defaultVal;\r\n}\r\n\r\n/**\r\n * Read a color property from an SVG element.\r\n * Checks inline style first, then attribute, then computed style.\r\n * Returns a hex color string or null.\r\n */\r\nexport function readColorProp(el, prop) {\r\n // 1. Inline style\r\n const styleVal = el.style.getPropertyValue(prop);\r\n if (styleVal && styleVal !== 'none') {\r\n return normalizeColor(styleVal);\r\n }\r\n // 2. Direct attribute\r\n const attrVal = el.getAttribute(prop);\r\n if (attrVal && attrVal !== 'none') {\r\n return normalizeColor(attrVal);\r\n }\r\n // 3. Computed style\r\n const computed = window.getComputedStyle(el).getPropertyValue(prop);\r\n if (computed && computed !== 'none') {\r\n return normalizeColor(computed);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Normalize a color value to hex. Handles:\r\n * - hex: #fff, #ff0000\r\n * - rgb(...): rgb(255, 0, 0)\r\n */\r\nexport function normalizeColor(val) {\r\n if (!val || val === 'none') return null;\r\n val = val.trim();\r\n\r\n // Already hex\r\n if (val.startsWith('#')) return val;\r\n\r\n // rgb(r, g, b) or rgb(r,g,b)\r\n const match = val.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i);\r\n if (match) {\r\n return rgbToHex({\r\n r: parseInt(match[1], 10),\r\n g: parseInt(match[2], 10),\r\n b: parseInt(match[3], 10),\r\n });\r\n }\r\n\r\n // Named colors — use a canvas trick\r\n if (typeof document !== 'undefined') {\r\n const ctx = document.createElement('canvas').getContext('2d');\r\n ctx.fillStyle = val;\r\n const resolved = ctx.fillStyle; // returns hex\r\n if (resolved.startsWith('#')) return resolved;\r\n }\r\n\r\n return val;\r\n}\r\n\r\n/**\r\n * Read all animatable snapshot from an SVG element.\r\n * Returns { numericAttrs: {attr: value}, colors: {prop: hexString}, transform: string|null }\r\n */\r\nexport function readSnapshot(el) {\r\n const snapshot = {\r\n numericAttrs: {},\r\n colors: {},\r\n transform: null,\r\n };\r\n\r\n // Numeric attributes\r\n for (const attr of NUMERIC_ATTRS) {\r\n const raw = el.getAttribute(attr);\r\n if (raw !== null && raw !== '') {\r\n const val = parseFloat(raw);\r\n if (!isNaN(val)) {\r\n snapshot.numericAttrs[attr] = val;\r\n }\r\n }\r\n }\r\n\r\n // Colors\r\n for (const prop of COLOR_PROPS) {\r\n const color = readColorProp(el, prop);\r\n if (color) {\r\n snapshot.colors[prop] = color;\r\n }\r\n }\r\n\r\n // Transform\r\n const transform = el.getAttribute('transform');\r\n if (transform) {\r\n snapshot.transform = transform;\r\n }\r\n\r\n return snapshot;\r\n}\r\n\r\n/**\r\n * Parse a simple SVG transform string into components.\r\n * Only handles translate, scale, rotate as simple cases.\r\n * Returns an object like { translateX, translateY, scaleX, scaleY, rotate }.\r\n */\r\nexport function parseTransform(transformStr) {\r\n const result = { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, rotate: 0 };\r\n if (!transformStr) return result;\r\n\r\n const translateMatch = transformStr.match(/translate\\(\\s*([-\\d.]+)\\s*[,\\s]\\s*([-\\d.]+)\\s*\\)/);\r\n if (translateMatch) {\r\n result.translateX = parseFloat(translateMatch[1]);\r\n result.translateY = parseFloat(translateMatch[2]);\r\n }\r\n\r\n const scaleMatch = transformStr.match(/scale\\(\\s*([-\\d.]+)(?:\\s*[,\\s]\\s*([-\\d.]+))?\\s*\\)/);\r\n if (scaleMatch) {\r\n result.scaleX = parseFloat(scaleMatch[1]);\r\n result.scaleY = scaleMatch[2] !== undefined ? parseFloat(scaleMatch[2]) : result.scaleX;\r\n }\r\n\r\n const rotateMatch = transformStr.match(/rotate\\(\\s*([-\\d.]+)/);\r\n if (rotateMatch) {\r\n result.rotate = parseFloat(rotateMatch[1]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build a transform string from parsed components.\r\n */\r\nexport function buildTransform({ translateX, translateY, scaleX, scaleY, rotate }) {\r\n const parts = [];\r\n if (translateX !== 0 || translateY !== 0) {\r\n parts.push(`translate(${translateX},${translateY})`);\r\n }\r\n if (rotate !== 0) {\r\n parts.push(`rotate(${rotate})`);\r\n }\r\n if (scaleX !== 1 || scaleY !== 1) {\r\n parts.push(`scale(${scaleX},${scaleY})`);\r\n }\r\n return parts.length > 0 ? parts.join(' ') : null;\r\n}\r\n","/**\r\n * VectorFlow — Engine\r\n * Route resolution, ms precedence, step expansion.\r\n */\r\n\r\n/**\r\n * Resolve the path from currentState to targetState using routes.\r\n * Returns an array of state names to visit.\r\n *\r\n * @param {string} targetState\r\n * @param {string} currentState\r\n * @param {object} routes — normalized routes object\r\n * @returns {string[]}\r\n */\r\nexport function resolvePath(targetState, currentState, routes) {\r\n const routeBlock = routes[targetState];\r\n if (!routeBlock) {\r\n return [targetState]; // fallback: direct\r\n }\r\n\r\n // Try specific path for current state\r\n if (Array.isArray(routeBlock[currentState])) {\r\n return routeBlock[currentState];\r\n }\r\n\r\n // Try wildcard\r\n if (Array.isArray(routeBlock['*'])) {\r\n return routeBlock['*'];\r\n }\r\n\r\n // Fallback: direct\r\n return [targetState];\r\n}\r\n\r\n/**\r\n * Normalize a path by removing a leading state that matches currentState\r\n * to avoid a no-op step.\r\n *\r\n * @param {string[]} path\r\n * @param {string} currentState\r\n * @returns {string[]}\r\n */\r\nexport function normalizePath(path, currentState) {\r\n if (path.length > 0 && path[0] === currentState) {\r\n return path.slice(1);\r\n }\r\n return path;\r\n}\r\n\r\n/**\r\n * Resolve the ms for a step using the precedence chain:\r\n * action.ms > routes[target].ms > json.ms > 120\r\n *\r\n * @param {number|undefined} actionMs\r\n * @param {number|undefined} routeMs — routes[targetState].ms\r\n * @param {number} jsonMs\r\n * @returns {number}\r\n */\r\nexport function resolveMs(actionMs, routeMs, jsonMs) {\r\n if (typeof actionMs === 'number' && actionMs > 0) return actionMs;\r\n if (typeof routeMs === 'number' && routeMs > 0) return routeMs;\r\n if (typeof jsonMs === 'number' && jsonMs > 0) return jsonMs;\r\n return 120;\r\n}\r\n\r\n/**\r\n * Expand a sequence action into a list of normalized steps.\r\n *\r\n * @param {string[]} order — target states to visit\r\n * @param {string} currentState\r\n * @param {object} routes\r\n * @param {number|undefined} actionMs\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates — set of known state names\r\n * @returns {{ steps: Array<{state: string, ms: number}>, finalState: string }}\r\n */\r\nexport function expandSequence(order, currentState, routes, actionMs, jsonMs, validStates) {\r\n const steps = [];\r\n let current = currentState;\r\n\r\n for (const targetState of order) {\r\n // Validate state exists\r\n if (validStates && !validStates.has(targetState)) {\r\n throw new Error(`VectorFlow: State not found in SVG: \"${targetState}\"`);\r\n }\r\n\r\n const path = normalizePath(resolvePath(targetState, current, routes), current);\r\n\r\n for (const nextState of path) {\r\n if (validStates && !validStates.has(nextState)) {\r\n throw new Error(`VectorFlow: State not found in SVG: \"${nextState}\"`);\r\n }\r\n\r\n const routeMs = routes[nextState]?.ms;\r\n const ms = resolveMs(actionMs, routeMs, jsonMs);\r\n steps.push({ state: nextState, ms });\r\n current = nextState;\r\n }\r\n }\r\n\r\n return { steps, finalState: current };\r\n}\r\n\r\n/**\r\n * Expand a direct-mode action into steps (skip route resolution).\r\n *\r\n * @param {string[]} order\r\n * @param {string} currentState\r\n * @param {object} routes — still needed for ms lookup\r\n * @param {number|undefined} actionMs\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates\r\n * @returns {{ steps: Array<{state: string, ms: number}>, finalState: string }}\r\n */\r\nexport function expandDirect(order, currentState, routes, actionMs, jsonMs, validStates) {\r\n const steps = [];\r\n let current = currentState;\r\n\r\n for (const targetState of order) {\r\n if (validStates && !validStates.has(targetState)) {\r\n throw new Error(`VectorFlow: State not found in SVG: \"${targetState}\"`);\r\n }\r\n\r\n // In direct mode, skip if already at target\r\n if (targetState === current) continue;\r\n\r\n const routeMs = routes[targetState]?.ms;\r\n const ms = resolveMs(actionMs, routeMs, jsonMs);\r\n steps.push({ state: targetState, ms });\r\n current = targetState;\r\n }\r\n\r\n return { steps, finalState: current };\r\n}\r\n","/*\n * anime.js v3.2.2\n * (c) 2023 Julian Garnier\n * Released under the MIT license\n * animejs.com\n */\n\n// Defaults\n\nvar defaultInstanceSettings = {\n update: null,\n begin: null,\n loopBegin: null,\n changeBegin: null,\n change: null,\n changeComplete: null,\n loopComplete: null,\n complete: null,\n loop: 1,\n direction: 'normal',\n autoplay: true,\n timelineOffset: 0\n};\n\nvar defaultTweenSettings = {\n duration: 1000,\n delay: 0,\n endDelay: 0,\n easing: 'easeOutElastic(1, .5)',\n round: 0\n};\n\nvar validTransforms = ['translateX', 'translateY', 'translateZ', 'rotate', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'perspective', 'matrix', 'matrix3d'];\n\n// Caching\n\nvar cache = {\n CSS: {},\n springs: {}\n};\n\n// Utils\n\nfunction minMax(val, min, max) {\n return Math.min(Math.max(val, min), max);\n}\n\nfunction stringContains(str, text) {\n return str.indexOf(text) > -1;\n}\n\nfunction applyArguments(func, args) {\n return func.apply(null, args);\n}\n\nvar is = {\n arr: function (a) { return Array.isArray(a); },\n obj: function (a) { return stringContains(Object.prototype.toString.call(a), 'Object'); },\n pth: function (a) { return is.obj(a) && a.hasOwnProperty('totalLength'); },\n svg: function (a) { return a instanceof SVGElement; },\n inp: function (a) { return a instanceof HTMLInputElement; },\n dom: function (a) { return a.nodeType || is.svg(a); },\n str: function (a) { return typeof a === 'string'; },\n fnc: function (a) { return typeof a === 'function'; },\n und: function (a) { return typeof a === 'undefined'; },\n nil: function (a) { return is.und(a) || a === null; },\n hex: function (a) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a); },\n rgb: function (a) { return /^rgb/.test(a); },\n hsl: function (a) { return /^hsl/.test(a); },\n col: function (a) { return (is.hex(a) || is.rgb(a) || is.hsl(a)); },\n key: function (a) { return !defaultInstanceSettings.hasOwnProperty(a) && !defaultTweenSettings.hasOwnProperty(a) && a !== 'targets' && a !== 'keyframes'; },\n};\n\n// Easings\n\nfunction parseEasingParameters(string) {\n var match = /\\(([^)]+)\\)/.exec(string);\n return match ? match[1].split(',').map(function (p) { return parseFloat(p); }) : [];\n}\n\n// Spring solver inspired by Webkit Copyright © 2016 Apple Inc. All rights reserved. https://webkit.org/demos/spring/spring.js\n\nfunction spring(string, duration) {\n\n var params = parseEasingParameters(string);\n var mass = minMax(is.und(params[0]) ? 1 : params[0], .1, 100);\n var stiffness = minMax(is.und(params[1]) ? 100 : params[1], .1, 100);\n var damping = minMax(is.und(params[2]) ? 10 : params[2], .1, 100);\n var velocity = minMax(is.und(params[3]) ? 0 : params[3], .1, 100);\n var w0 = Math.sqrt(stiffness / mass);\n var zeta = damping / (2 * Math.sqrt(stiffness * mass));\n var wd = zeta < 1 ? w0 * Math.sqrt(1 - zeta * zeta) : 0;\n var a = 1;\n var b = zeta < 1 ? (zeta * w0 + -velocity) / wd : -velocity + w0;\n\n function solver(t) {\n var progress = duration ? (duration * t) / 1000 : t;\n if (zeta < 1) {\n progress = Math.exp(-progress * zeta * w0) * (a * Math.cos(wd * progress) + b * Math.sin(wd * progress));\n } else {\n progress = (a + b * progress) * Math.exp(-progress * w0);\n }\n if (t === 0 || t === 1) { return t; }\n return 1 - progress;\n }\n\n function getDuration() {\n var cached = cache.springs[string];\n if (cached) { return cached; }\n var frame = 1/6;\n var elapsed = 0;\n var rest = 0;\n while(true) {\n elapsed += frame;\n if (solver(elapsed) === 1) {\n rest++;\n if (rest >= 16) { break; }\n } else {\n rest = 0;\n }\n }\n var duration = elapsed * frame * 1000;\n cache.springs[string] = duration;\n return duration;\n }\n\n return duration ? solver : getDuration;\n\n}\n\n// Basic steps easing implementation https://developer.mozilla.org/fr/docs/Web/CSS/transition-timing-function\n\nfunction steps(steps) {\n if ( steps === void 0 ) steps = 10;\n\n return function (t) { return Math.ceil((minMax(t, 0.000001, 1)) * steps) * (1 / steps); };\n}\n\n// BezierEasing https://github.com/gre/bezier-easing\n\nvar bezier = (function () {\n\n var kSplineTableSize = 11;\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\n function A(aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1 }\n function B(aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1 }\n function C(aA1) { return 3.0 * aA1 }\n\n function calcBezier(aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT }\n function getSlope(aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1) }\n\n function binarySubdivide(aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) { aB = currentT; } else { aA = currentT; }\n } while (Math.abs(currentX) > 0.0000001 && ++i < 10);\n return currentT;\n }\n\n function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < 4; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) { return aGuessT; }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n }\n\n function bezier(mX1, mY1, mX2, mY2) {\n\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { return; }\n var sampleValues = new Float32Array(kSplineTableSize);\n\n if (mX1 !== mY1 || mX2 !== mY2) {\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n }\n\n function getTForX(aX) {\n\n var intervalStart = 0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n\n --currentSample;\n\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n var initialSlope = getSlope(guessForT, mX1, mX2);\n\n if (initialSlope >= 0.001) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n\n }\n\n return function (x) {\n if (mX1 === mY1 && mX2 === mY2) { return x; }\n if (x === 0 || x === 1) { return x; }\n return calcBezier(getTForX(x), mY1, mY2);\n }\n\n }\n\n return bezier;\n\n})();\n\nvar penner = (function () {\n\n // Based on jQuery UI's implemenation of easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\n var eases = { linear: function () { return function (t) { return t; }; } };\n\n var functionEasings = {\n Sine: function () { return function (t) { return 1 - Math.cos(t * Math.PI / 2); }; },\n Expo: function () { return function (t) { return t ? Math.pow(2, 10 * t - 10) : 0; }; },\n Circ: function () { return function (t) { return 1 - Math.sqrt(1 - t * t); }; },\n Back: function () { return function (t) { return t * t * (3 * t - 2); }; },\n Bounce: function () { return function (t) {\n var pow2, b = 4;\n while (t < (( pow2 = Math.pow(2, --b)) - 1) / 11) {}\n return 1 / Math.pow(4, 3 - b) - 7.5625 * Math.pow(( pow2 * 3 - 2 ) / 22 - t, 2)\n }; },\n Elastic: function (amplitude, period) {\n if ( amplitude === void 0 ) amplitude = 1;\n if ( period === void 0 ) period = .5;\n\n var a = minMax(amplitude, 1, 10);\n var p = minMax(period, .1, 2);\n return function (t) {\n return (t === 0 || t === 1) ? t : \n -a * Math.pow(2, 10 * (t - 1)) * Math.sin((((t - 1) - (p / (Math.PI * 2) * Math.asin(1 / a))) * (Math.PI * 2)) / p);\n }\n }\n };\n\n var baseEasings = ['Quad', 'Cubic', 'Quart', 'Quint'];\n\n baseEasings.forEach(function (name, i) {\n functionEasings[name] = function () { return function (t) { return Math.pow(t, i + 2); }; };\n });\n\n Object.keys(functionEasings).forEach(function (name) {\n var easeIn = functionEasings[name];\n eases['easeIn' + name] = easeIn;\n eases['easeOut' + name] = function (a, b) { return function (t) { return 1 - easeIn(a, b)(1 - t); }; };\n eases['easeInOut' + name] = function (a, b) { return function (t) { return t < 0.5 ? easeIn(a, b)(t * 2) / 2 : \n 1 - easeIn(a, b)(t * -2 + 2) / 2; }; };\n eases['easeOutIn' + name] = function (a, b) { return function (t) { return t < 0.5 ? (1 - easeIn(a, b)(1 - t * 2)) / 2 : \n (easeIn(a, b)(t * 2 - 1) + 1) / 2; }; };\n });\n\n return eases;\n\n})();\n\nfunction parseEasings(easing, duration) {\n if (is.fnc(easing)) { return easing; }\n var name = easing.split('(')[0];\n var ease = penner[name];\n var args = parseEasingParameters(easing);\n switch (name) {\n case 'spring' : return spring(easing, duration);\n case 'cubicBezier' : return applyArguments(bezier, args);\n case 'steps' : return applyArguments(steps, args);\n default : return applyArguments(ease, args);\n }\n}\n\n// Strings\n\nfunction selectString(str) {\n try {\n var nodes = document.querySelectorAll(str);\n return nodes;\n } catch(e) {\n return;\n }\n}\n\n// Arrays\n\nfunction filterArray(arr, callback) {\n var len = arr.length;\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n var result = [];\n for (var i = 0; i < len; i++) {\n if (i in arr) {\n var val = arr[i];\n if (callback.call(thisArg, val, i, arr)) {\n result.push(val);\n }\n }\n }\n return result;\n}\n\nfunction flattenArray(arr) {\n return arr.reduce(function (a, b) { return a.concat(is.arr(b) ? flattenArray(b) : b); }, []);\n}\n\nfunction toArray(o) {\n if (is.arr(o)) { return o; }\n if (is.str(o)) { o = selectString(o) || o; }\n if (o instanceof NodeList || o instanceof HTMLCollection) { return [].slice.call(o); }\n return [o];\n}\n\nfunction arrayContains(arr, val) {\n return arr.some(function (a) { return a === val; });\n}\n\n// Objects\n\nfunction cloneObject(o) {\n var clone = {};\n for (var p in o) { clone[p] = o[p]; }\n return clone;\n}\n\nfunction replaceObjectProps(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o1) { o[p] = o2.hasOwnProperty(p) ? o2[p] : o1[p]; }\n return o;\n}\n\nfunction mergeObjects(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o2) { o[p] = is.und(o1[p]) ? o2[p] : o1[p]; }\n return o;\n}\n\n// Colors\n\nfunction rgbToRgba(rgbValue) {\n var rgb = /rgb\\((\\d+,\\s*[\\d]+,\\s*[\\d]+)\\)/g.exec(rgbValue);\n return rgb ? (\"rgba(\" + (rgb[1]) + \",1)\") : rgbValue;\n}\n\nfunction hexToRgba(hexValue) {\n var rgx = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n var hex = hexValue.replace(rgx, function (m, r, g, b) { return r + r + g + g + b + b; } );\n var rgb = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n var r = parseInt(rgb[1], 16);\n var g = parseInt(rgb[2], 16);\n var b = parseInt(rgb[3], 16);\n return (\"rgba(\" + r + \",\" + g + \",\" + b + \",1)\");\n}\n\nfunction hslToRgba(hslValue) {\n var hsl = /hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(hslValue) || /hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(hslValue);\n var h = parseInt(hsl[1], 10) / 360;\n var s = parseInt(hsl[2], 10) / 100;\n var l = parseInt(hsl[3], 10) / 100;\n var a = hsl[4] || 1;\n function hue2rgb(p, q, t) {\n if (t < 0) { t += 1; }\n if (t > 1) { t -= 1; }\n if (t < 1/6) { return p + (q - p) * 6 * t; }\n if (t < 1/2) { return q; }\n if (t < 2/3) { return p + (q - p) * (2/3 - t) * 6; }\n return p;\n }\n var r, g, b;\n if (s == 0) {\n r = g = b = l;\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n return (\"rgba(\" + (r * 255) + \",\" + (g * 255) + \",\" + (b * 255) + \",\" + a + \")\");\n}\n\nfunction colorToRgb(val) {\n if (is.rgb(val)) { return rgbToRgba(val); }\n if (is.hex(val)) { return hexToRgba(val); }\n if (is.hsl(val)) { return hslToRgba(val); }\n}\n\n// Units\n\nfunction getUnit(val) {\n var split = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(val);\n if (split) { return split[1]; }\n}\n\nfunction getTransformUnit(propName) {\n if (stringContains(propName, 'translate') || propName === 'perspective') { return 'px'; }\n if (stringContains(propName, 'rotate') || stringContains(propName, 'skew')) { return 'deg'; }\n}\n\n// Values\n\nfunction getFunctionValue(val, animatable) {\n if (!is.fnc(val)) { return val; }\n return val(animatable.target, animatable.id, animatable.total);\n}\n\nfunction getAttribute(el, prop) {\n return el.getAttribute(prop);\n}\n\nfunction convertPxToUnit(el, value, unit) {\n var valueUnit = getUnit(value);\n if (arrayContains([unit, 'deg', 'rad', 'turn'], valueUnit)) { return value; }\n var cached = cache.CSS[value + unit];\n if (!is.und(cached)) { return cached; }\n var baseline = 100;\n var tempEl = document.createElement(el.tagName);\n var parentEl = (el.parentNode && (el.parentNode !== document)) ? el.parentNode : document.body;\n parentEl.appendChild(tempEl);\n tempEl.style.position = 'absolute';\n tempEl.style.width = baseline + unit;\n var factor = baseline / tempEl.offsetWidth;\n parentEl.removeChild(tempEl);\n var convertedUnit = factor * parseFloat(value);\n cache.CSS[value + unit] = convertedUnit;\n return convertedUnit;\n}\n\nfunction getCSSValue(el, prop, unit) {\n if (prop in el.style) {\n var uppercasePropName = prop.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n var value = el.style[prop] || getComputedStyle(el).getPropertyValue(uppercasePropName) || '0';\n return unit ? convertPxToUnit(el, value, unit) : value;\n }\n}\n\nfunction getAnimationType(el, prop) {\n if (is.dom(el) && !is.inp(el) && (!is.nil(getAttribute(el, prop)) || (is.svg(el) && el[prop]))) { return 'attribute'; }\n if (is.dom(el) && arrayContains(validTransforms, prop)) { return 'transform'; }\n if (is.dom(el) && (prop !== 'transform' && getCSSValue(el, prop))) { return 'css'; }\n if (el[prop] != null) { return 'object'; }\n}\n\nfunction getElementTransforms(el) {\n if (!is.dom(el)) { return; }\n var str = el.style.transform || '';\n var reg = /(\\w+)\\(([^)]*)\\)/g;\n var transforms = new Map();\n var m; while (m = reg.exec(str)) { transforms.set(m[1], m[2]); }\n return transforms;\n}\n\nfunction getTransformValue(el, propName, animatable, unit) {\n var defaultVal = stringContains(propName, 'scale') ? 1 : 0 + getTransformUnit(propName);\n var value = getElementTransforms(el).get(propName) || defaultVal;\n if (animatable) {\n animatable.transforms.list.set(propName, value);\n animatable.transforms['last'] = propName;\n }\n return unit ? convertPxToUnit(el, value, unit) : value;\n}\n\nfunction getOriginalTargetValue(target, propName, unit, animatable) {\n switch (getAnimationType(target, propName)) {\n case 'transform': return getTransformValue(target, propName, animatable, unit);\n case 'css': return getCSSValue(target, propName, unit);\n case 'attribute': return getAttribute(target, propName);\n default: return target[propName] || 0;\n }\n}\n\nfunction getRelativeValue(to, from) {\n var operator = /^(\\*=|\\+=|-=)/.exec(to);\n if (!operator) { return to; }\n var u = getUnit(to) || 0;\n var x = parseFloat(from);\n var y = parseFloat(to.replace(operator[0], ''));\n switch (operator[0][0]) {\n case '+': return x + y + u;\n case '-': return x - y + u;\n case '*': return x * y + u;\n }\n}\n\nfunction validateValue(val, unit) {\n if (is.col(val)) { return colorToRgb(val); }\n if (/\\s/g.test(val)) { return val; }\n var originalUnit = getUnit(val);\n var unitLess = originalUnit ? val.substr(0, val.length - originalUnit.length) : val;\n if (unit) { return unitLess + unit; }\n return unitLess;\n}\n\n// getTotalLength() equivalent for circle, rect, polyline, polygon and line shapes\n// adapted from https://gist.github.com/SebLambla/3e0550c496c236709744\n\nfunction getDistance(p1, p2) {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\nfunction getCircleLength(el) {\n return Math.PI * 2 * getAttribute(el, 'r');\n}\n\nfunction getRectLength(el) {\n return (getAttribute(el, 'width') * 2) + (getAttribute(el, 'height') * 2);\n}\n\nfunction getLineLength(el) {\n return getDistance(\n {x: getAttribute(el, 'x1'), y: getAttribute(el, 'y1')}, \n {x: getAttribute(el, 'x2'), y: getAttribute(el, 'y2')}\n );\n}\n\nfunction getPolylineLength(el) {\n var points = el.points;\n var totalLength = 0;\n var previousPos;\n for (var i = 0 ; i < points.numberOfItems; i++) {\n var currentPos = points.getItem(i);\n if (i > 0) { totalLength += getDistance(previousPos, currentPos); }\n previousPos = currentPos;\n }\n return totalLength;\n}\n\nfunction getPolygonLength(el) {\n var points = el.points;\n return getPolylineLength(el) + getDistance(points.getItem(points.numberOfItems - 1), points.getItem(0));\n}\n\n// Path animation\n\nfunction getTotalLength(el) {\n if (el.getTotalLength) { return el.getTotalLength(); }\n switch(el.tagName.toLowerCase()) {\n case 'circle': return getCircleLength(el);\n case 'rect': return getRectLength(el);\n case 'line': return getLineLength(el);\n case 'polyline': return getPolylineLength(el);\n case 'polygon': return getPolygonLength(el);\n }\n}\n\nfunction setDashoffset(el) {\n var pathLength = getTotalLength(el);\n el.setAttribute('stroke-dasharray', pathLength);\n return pathLength;\n}\n\n// Motion path\n\nfunction getParentSvgEl(el) {\n var parentEl = el.parentNode;\n while (is.svg(parentEl)) {\n if (!is.svg(parentEl.parentNode)) { break; }\n parentEl = parentEl.parentNode;\n }\n return parentEl;\n}\n\nfunction getParentSvg(pathEl, svgData) {\n var svg = svgData || {};\n var parentSvgEl = svg.el || getParentSvgEl(pathEl);\n var rect = parentSvgEl.getBoundingClientRect();\n var viewBoxAttr = getAttribute(parentSvgEl, 'viewBox');\n var width = rect.width;\n var height = rect.height;\n var viewBox = svg.viewBox || (viewBoxAttr ? viewBoxAttr.split(' ') : [0, 0, width, height]);\n return {\n el: parentSvgEl,\n viewBox: viewBox,\n x: viewBox[0] / 1,\n y: viewBox[1] / 1,\n w: width,\n h: height,\n vW: viewBox[2],\n vH: viewBox[3]\n }\n}\n\nfunction getPath(path, percent) {\n var pathEl = is.str(path) ? selectString(path)[0] : path;\n var p = percent || 100;\n return function(property) {\n return {\n property: property,\n el: pathEl,\n svg: getParentSvg(pathEl),\n totalLength: getTotalLength(pathEl) * (p / 100)\n }\n }\n}\n\nfunction getPathProgress(path, progress, isPathTargetInsideSVG) {\n function point(offset) {\n if ( offset === void 0 ) offset = 0;\n\n var l = progress + offset >= 1 ? progress + offset : 0;\n return path.el.getPointAtLength(l);\n }\n var svg = getParentSvg(path.el, path.svg);\n var p = point();\n var p0 = point(-1);\n var p1 = point(+1);\n var scaleX = isPathTargetInsideSVG ? 1 : svg.w / svg.vW;\n var scaleY = isPathTargetInsideSVG ? 1 : svg.h / svg.vH;\n switch (path.property) {\n case 'x': return (p.x - svg.x) * scaleX;\n case 'y': return (p.y - svg.y) * scaleY;\n case 'angle': return Math.atan2(p1.y - p0.y, p1.x - p0.x) * 180 / Math.PI;\n }\n}\n\n// Decompose value\n\nfunction decomposeValue(val, unit) {\n // const rgx = /-?\\d*\\.?\\d+/g; // handles basic numbers\n // const rgx = /[+-]?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var rgx = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var value = validateValue((is.pth(val) ? val.totalLength : val), unit) + '';\n return {\n original: value,\n numbers: value.match(rgx) ? value.match(rgx).map(Number) : [0],\n strings: (is.str(val) || unit) ? value.split(rgx) : []\n }\n}\n\n// Animatables\n\nfunction parseTargets(targets) {\n var targetsArray = targets ? (flattenArray(is.arr(targets) ? targets.map(toArray) : toArray(targets))) : [];\n return filterArray(targetsArray, function (item, pos, self) { return self.indexOf(item) === pos; });\n}\n\nfunction getAnimatables(targets) {\n var parsed = parseTargets(targets);\n return parsed.map(function (t, i) {\n return {target: t, id: i, total: parsed.length, transforms: { list: getElementTransforms(t) } };\n });\n}\n\n// Properties\n\nfunction normalizePropertyTweens(prop, tweenSettings) {\n var settings = cloneObject(tweenSettings);\n // Override duration if easing is a spring\n if (/^spring/.test(settings.easing)) { settings.duration = spring(settings.easing); }\n if (is.arr(prop)) {\n var l = prop.length;\n var isFromTo = (l === 2 && !is.obj(prop[0]));\n if (!isFromTo) {\n // Duration divided by the number of tweens\n if (!is.fnc(tweenSettings.duration)) { settings.duration = tweenSettings.duration / l; }\n } else {\n // Transform [from, to] values shorthand to a valid tween value\n prop = {value: prop};\n }\n }\n var propArray = is.arr(prop) ? prop : [prop];\n return propArray.map(function (v, i) {\n var obj = (is.obj(v) && !is.pth(v)) ? v : {value: v};\n // Default delay value should only be applied to the first tween\n if (is.und(obj.delay)) { obj.delay = !i ? tweenSettings.delay : 0; }\n // Default endDelay value should only be applied to the last tween\n if (is.und(obj.endDelay)) { obj.endDelay = i === propArray.length - 1 ? tweenSettings.endDelay : 0; }\n return obj;\n }).map(function (k) { return mergeObjects(k, settings); });\n}\n\n\nfunction flattenKeyframes(keyframes) {\n var propertyNames = filterArray(flattenArray(keyframes.map(function (key) { return Object.keys(key); })), function (p) { return is.key(p); })\n .reduce(function (a,b) { if (a.indexOf(b) < 0) { a.push(b); } return a; }, []);\n var properties = {};\n var loop = function ( i ) {\n var propName = propertyNames[i];\n properties[propName] = keyframes.map(function (key) {\n var newKey = {};\n for (var p in key) {\n if (is.key(p)) {\n if (p == propName) { newKey.value = key[p]; }\n } else {\n newKey[p] = key[p];\n }\n }\n return newKey;\n });\n };\n\n for (var i = 0; i < propertyNames.length; i++) loop( i );\n return properties;\n}\n\nfunction getProperties(tweenSettings, params) {\n var properties = [];\n var keyframes = params.keyframes;\n if (keyframes) { params = mergeObjects(flattenKeyframes(keyframes), params); }\n for (var p in params) {\n if (is.key(p)) {\n properties.push({\n name: p,\n tweens: normalizePropertyTweens(params[p], tweenSettings)\n });\n }\n }\n return properties;\n}\n\n// Tweens\n\nfunction normalizeTweenValues(tween, animatable) {\n var t = {};\n for (var p in tween) {\n var value = getFunctionValue(tween[p], animatable);\n if (is.arr(value)) {\n value = value.map(function (v) { return getFunctionValue(v, animatable); });\n if (value.length === 1) { value = value[0]; }\n }\n t[p] = value;\n }\n t.duration = parseFloat(t.duration);\n t.delay = parseFloat(t.delay);\n return t;\n}\n\nfunction normalizeTweens(prop, animatable) {\n var previousTween;\n return prop.tweens.map(function (t) {\n var tween = normalizeTweenValues(t, animatable);\n var tweenValue = tween.value;\n var to = is.arr(tweenValue) ? tweenValue[1] : tweenValue;\n var toUnit = getUnit(to);\n var originalValue = getOriginalTargetValue(animatable.target, prop.name, toUnit, animatable);\n var previousValue = previousTween ? previousTween.to.original : originalValue;\n var from = is.arr(tweenValue) ? tweenValue[0] : previousValue;\n var fromUnit = getUnit(from) || getUnit(originalValue);\n var unit = toUnit || fromUnit;\n if (is.und(to)) { to = previousValue; }\n tween.from = decomposeValue(from, unit);\n tween.to = decomposeValue(getRelativeValue(to, from), unit);\n tween.start = previousTween ? previousTween.end : 0;\n tween.end = tween.start + tween.delay + tween.duration + tween.endDelay;\n tween.easing = parseEasings(tween.easing, tween.duration);\n tween.isPath = is.pth(tweenValue);\n tween.isPathTargetInsideSVG = tween.isPath && is.svg(animatable.target);\n tween.isColor = is.col(tween.from.original);\n if (tween.isColor) { tween.round = 1; }\n previousTween = tween;\n return tween;\n });\n}\n\n// Tween progress\n\nvar setProgressValue = {\n css: function (t, p, v) { return t.style[p] = v; },\n attribute: function (t, p, v) { return t.setAttribute(p, v); },\n object: function (t, p, v) { return t[p] = v; },\n transform: function (t, p, v, transforms, manual) {\n transforms.list.set(p, v);\n if (p === transforms.last || manual) {\n var str = '';\n transforms.list.forEach(function (value, prop) { str += prop + \"(\" + value + \") \"; });\n t.style.transform = str;\n }\n }\n};\n\n// Set Value helper\n\nfunction setTargetsValue(targets, properties) {\n var animatables = getAnimatables(targets);\n animatables.forEach(function (animatable) {\n for (var property in properties) {\n var value = getFunctionValue(properties[property], animatable);\n var target = animatable.target;\n var valueUnit = getUnit(value);\n var originalValue = getOriginalTargetValue(target, property, valueUnit, animatable);\n var unit = valueUnit || getUnit(originalValue);\n var to = getRelativeValue(validateValue(value, unit), originalValue);\n var animType = getAnimationType(target, property);\n setProgressValue[animType](target, property, to, animatable.transforms, true);\n }\n });\n}\n\n// Animations\n\nfunction createAnimation(animatable, prop) {\n var animType = getAnimationType(animatable.target, prop.name);\n if (animType) {\n var tweens = normalizeTweens(prop, animatable);\n var lastTween = tweens[tweens.length - 1];\n return {\n type: animType,\n property: prop.name,\n animatable: animatable,\n tweens: tweens,\n duration: lastTween.end,\n delay: tweens[0].delay,\n endDelay: lastTween.endDelay\n }\n }\n}\n\nfunction getAnimations(animatables, properties) {\n return filterArray(flattenArray(animatables.map(function (animatable) {\n return properties.map(function (prop) {\n return createAnimation(animatable, prop);\n });\n })), function (a) { return !is.und(a); });\n}\n\n// Create Instance\n\nfunction getInstanceTimings(animations, tweenSettings) {\n var animLength = animations.length;\n var getTlOffset = function (anim) { return anim.timelineOffset ? anim.timelineOffset : 0; };\n var timings = {};\n timings.duration = animLength ? Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration; })) : tweenSettings.duration;\n timings.delay = animLength ? Math.min.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.delay; })) : tweenSettings.delay;\n timings.endDelay = animLength ? timings.duration - Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration - anim.endDelay; })) : tweenSettings.endDelay;\n return timings;\n}\n\nvar instanceID = 0;\n\nfunction createNewInstance(params) {\n var instanceSettings = replaceObjectProps(defaultInstanceSettings, params);\n var tweenSettings = replaceObjectProps(defaultTweenSettings, params);\n var properties = getProperties(tweenSettings, params);\n var animatables = getAnimatables(params.targets);\n var animations = getAnimations(animatables, properties);\n var timings = getInstanceTimings(animations, tweenSettings);\n var id = instanceID;\n instanceID++;\n return mergeObjects(instanceSettings, {\n id: id,\n children: [],\n animatables: animatables,\n animations: animations,\n duration: timings.duration,\n delay: timings.delay,\n endDelay: timings.endDelay\n });\n}\n\n// Core\n\nvar activeInstances = [];\n\nvar engine = (function () {\n var raf;\n\n function play() {\n if (!raf && (!isDocumentHidden() || !anime.suspendWhenDocumentHidden) && activeInstances.length > 0) {\n raf = requestAnimationFrame(step);\n }\n }\n function step(t) {\n // memo on algorithm issue:\n // dangerous iteration over mutable `activeInstances`\n // (that collection may be updated from within callbacks of `tick`-ed animation instances)\n var activeInstancesLength = activeInstances.length;\n var i = 0;\n while (i < activeInstancesLength) {\n var activeInstance = activeInstances[i];\n if (!activeInstance.paused) {\n activeInstance.tick(t);\n i++;\n } else {\n activeInstances.splice(i, 1);\n activeInstancesLength--;\n }\n }\n raf = i > 0 ? requestAnimationFrame(step) : undefined;\n }\n\n function handleVisibilityChange() {\n if (!anime.suspendWhenDocumentHidden) { return; }\n\n if (isDocumentHidden()) {\n // suspend ticks\n raf = cancelAnimationFrame(raf);\n } else { // is back to active tab\n // first adjust animations to consider the time that ticks were suspended\n activeInstances.forEach(\n function (instance) { return instance ._onDocumentVisibility(); }\n );\n engine();\n }\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n }\n\n return play;\n})();\n\nfunction isDocumentHidden() {\n return !!document && document.hidden;\n}\n\n// Public Instance\n\nfunction anime(params) {\n if ( params === void 0 ) params = {};\n\n\n var startTime = 0, lastTime = 0, now = 0;\n var children, childrenLength = 0;\n var resolve = null;\n\n function makePromise(instance) {\n var promise = window.Promise && new Promise(function (_resolve) { return resolve = _resolve; });\n instance.finished = promise;\n return promise;\n }\n\n var instance = createNewInstance(params);\n var promise = makePromise(instance);\n\n function toggleInstanceDirection() {\n var direction = instance.direction;\n if (direction !== 'alternate') {\n instance.direction = direction !== 'normal' ? 'normal' : 'reverse';\n }\n instance.reversed = !instance.reversed;\n children.forEach(function (child) { return child.reversed = instance.reversed; });\n }\n\n function adjustTime(time) {\n return instance.reversed ? instance.duration - time : time;\n }\n\n function resetTime() {\n startTime = 0;\n lastTime = adjustTime(instance.currentTime) * (1 / anime.speed);\n }\n\n function seekChild(time, child) {\n if (child) { child.seek(time - child.timelineOffset); }\n }\n\n function syncInstanceChildren(time) {\n if (!instance.reversePlayback) {\n for (var i = 0; i < childrenLength; i++) { seekChild(time, children[i]); }\n } else {\n for (var i$1 = childrenLength; i$1--;) { seekChild(time, children[i$1]); }\n }\n }\n\n function setAnimationsProgress(insTime) {\n var i = 0;\n var animations = instance.animations;\n var animationsLength = animations.length;\n while (i < animationsLength) {\n var anim = animations[i];\n var animatable = anim.animatable;\n var tweens = anim.tweens;\n var tweenLength = tweens.length - 1;\n var tween = tweens[tweenLength];\n // Only check for keyframes if there is more than one tween\n if (tweenLength) { tween = filterArray(tweens, function (t) { return (insTime < t.end); })[0] || tween; }\n var elapsed = minMax(insTime - tween.start - tween.delay, 0, tween.duration) / tween.duration;\n var eased = isNaN(elapsed) ? 1 : tween.easing(elapsed);\n var strings = tween.to.strings;\n var round = tween.round;\n var numbers = [];\n var toNumbersLength = tween.to.numbers.length;\n var progress = (void 0);\n for (var n = 0; n < toNumbersLength; n++) {\n var value = (void 0);\n var toNumber = tween.to.numbers[n];\n var fromNumber = tween.from.numbers[n] || 0;\n if (!tween.isPath) {\n value = fromNumber + (eased * (toNumber - fromNumber));\n } else {\n value = getPathProgress(tween.value, eased * toNumber, tween.isPathTargetInsideSVG);\n }\n if (round) {\n if (!(tween.isColor && n > 2)) {\n value = Math.round(value * round) / round;\n }\n }\n numbers.push(value);\n }\n // Manual Array.reduce for better performances\n var stringsLength = strings.length;\n if (!stringsLength) {\n progress = numbers[0];\n } else {\n progress = strings[0];\n for (var s = 0; s < stringsLength; s++) {\n var a = strings[s];\n var b = strings[s + 1];\n var n$1 = numbers[s];\n if (!isNaN(n$1)) {\n if (!b) {\n progress += n$1 + ' ';\n } else {\n progress += n$1 + b;\n }\n }\n }\n }\n setProgressValue[anim.type](animatable.target, anim.property, progress, animatable.transforms);\n anim.currentValue = progress;\n i++;\n }\n }\n\n function setCallback(cb) {\n if (instance[cb] && !instance.passThrough) { instance[cb](instance); }\n }\n\n function countIteration() {\n if (instance.remaining && instance.remaining !== true) {\n instance.remaining--;\n }\n }\n\n function setInstanceProgress(engineTime) {\n var insDuration = instance.duration;\n var insDelay = instance.delay;\n var insEndDelay = insDuration - instance.endDelay;\n var insTime = adjustTime(engineTime);\n instance.progress = minMax((insTime / insDuration) * 100, 0, 100);\n instance.reversePlayback = insTime < instance.currentTime;\n if (children) { syncInstanceChildren(insTime); }\n if (!instance.began && instance.currentTime > 0) {\n instance.began = true;\n setCallback('begin');\n }\n if (!instance.loopBegan && instance.currentTime > 0) {\n instance.loopBegan = true;\n setCallback('loopBegin');\n }\n if (insTime <= insDelay && instance.currentTime !== 0) {\n setAnimationsProgress(0);\n }\n if ((insTime >= insEndDelay && instance.currentTime !== insDuration) || !insDuration) {\n setAnimationsProgress(insDuration);\n }\n if (insTime > insDelay && insTime < insEndDelay) {\n if (!instance.changeBegan) {\n instance.changeBegan = true;\n instance.changeCompleted = false;\n setCallback('changeBegin');\n }\n setCallback('change');\n setAnimationsProgress(insTime);\n } else {\n if (instance.changeBegan) {\n instance.changeCompleted = true;\n instance.changeBegan = false;\n setCallback('changeComplete');\n }\n }\n instance.currentTime = minMax(insTime, 0, insDuration);\n if (instance.began) { setCallback('update'); }\n if (engineTime >= insDuration) {\n lastTime = 0;\n countIteration();\n if (!instance.remaining) {\n instance.paused = true;\n if (!instance.completed) {\n instance.completed = true;\n setCallback('loopComplete');\n setCallback('complete');\n if (!instance.passThrough && 'Promise' in window) {\n resolve();\n promise = makePromise(instance);\n }\n }\n } else {\n startTime = now;\n setCallback('loopComplete');\n instance.loopBegan = false;\n if (instance.direction === 'alternate') {\n toggleInstanceDirection();\n }\n }\n }\n }\n\n instance.reset = function() {\n var direction = instance.direction;\n instance.passThrough = false;\n instance.currentTime = 0;\n instance.progress = 0;\n instance.paused = true;\n instance.began = false;\n instance.loopBegan = false;\n instance.changeBegan = false;\n instance.completed = false;\n instance.changeCompleted = false;\n instance.reversePlayback = false;\n instance.reversed = direction === 'reverse';\n instance.remaining = instance.loop;\n children = instance.children;\n childrenLength = children.length;\n for (var i = childrenLength; i--;) { instance.children[i].reset(); }\n if (instance.reversed && instance.loop !== true || (direction === 'alternate' && instance.loop === 1)) { instance.remaining++; }\n setAnimationsProgress(instance.reversed ? instance.duration : 0);\n };\n\n // internal method (for engine) to adjust animation timings before restoring engine ticks (rAF)\n instance._onDocumentVisibility = resetTime;\n\n // Set Value helper\n\n instance.set = function(targets, properties) {\n setTargetsValue(targets, properties);\n return instance;\n };\n\n instance.tick = function(t) {\n now = t;\n if (!startTime) { startTime = now; }\n setInstanceProgress((now + (lastTime - startTime)) * anime.speed);\n };\n\n instance.seek = function(time) {\n setInstanceProgress(adjustTime(time));\n };\n\n instance.pause = function() {\n instance.paused = true;\n resetTime();\n };\n\n instance.play = function() {\n if (!instance.paused) { return; }\n if (instance.completed) { instance.reset(); }\n instance.paused = false;\n activeInstances.push(instance);\n resetTime();\n engine();\n };\n\n instance.reverse = function() {\n toggleInstanceDirection();\n instance.completed = instance.reversed ? false : true;\n resetTime();\n };\n\n instance.restart = function() {\n instance.reset();\n instance.play();\n };\n\n instance.remove = function(targets) {\n var targetsArray = parseTargets(targets);\n removeTargetsFromInstance(targetsArray, instance);\n };\n\n instance.reset();\n\n if (instance.autoplay) { instance.play(); }\n\n return instance;\n\n}\n\n// Remove targets from animation\n\nfunction removeTargetsFromAnimations(targetsArray, animations) {\n for (var a = animations.length; a--;) {\n if (arrayContains(targetsArray, animations[a].animatable.target)) {\n animations.splice(a, 1);\n }\n }\n}\n\nfunction removeTargetsFromInstance(targetsArray, instance) {\n var animations = instance.animations;\n var children = instance.children;\n removeTargetsFromAnimations(targetsArray, animations);\n for (var c = children.length; c--;) {\n var child = children[c];\n var childAnimations = child.animations;\n removeTargetsFromAnimations(targetsArray, childAnimations);\n if (!childAnimations.length && !child.children.length) { children.splice(c, 1); }\n }\n if (!animations.length && !children.length) { instance.pause(); }\n}\n\nfunction removeTargetsFromActiveInstances(targets) {\n var targetsArray = parseTargets(targets);\n for (var i = activeInstances.length; i--;) {\n var instance = activeInstances[i];\n removeTargetsFromInstance(targetsArray, instance);\n }\n}\n\n// Stagger helpers\n\nfunction stagger(val, params) {\n if ( params === void 0 ) params = {};\n\n var direction = params.direction || 'normal';\n var easing = params.easing ? parseEasings(params.easing) : null;\n var grid = params.grid;\n var axis = params.axis;\n var fromIndex = params.from || 0;\n var fromFirst = fromIndex === 'first';\n var fromCenter = fromIndex === 'center';\n var fromLast = fromIndex === 'last';\n var isRange = is.arr(val);\n var val1 = isRange ? parseFloat(val[0]) : parseFloat(val);\n var val2 = isRange ? parseFloat(val[1]) : 0;\n var unit = getUnit(isRange ? val[1] : val) || 0;\n var start = params.start || 0 + (isRange ? val1 : 0);\n var values = [];\n var maxValue = 0;\n return function (el, i, t) {\n if (fromFirst) { fromIndex = 0; }\n if (fromCenter) { fromIndex = (t - 1) / 2; }\n if (fromLast) { fromIndex = t - 1; }\n if (!values.length) {\n for (var index = 0; index < t; index++) {\n if (!grid) {\n values.push(Math.abs(fromIndex - index));\n } else {\n var fromX = !fromCenter ? fromIndex%grid[0] : (grid[0]-1)/2;\n var fromY = !fromCenter ? Math.floor(fromIndex/grid[0]) : (grid[1]-1)/2;\n var toX = index%grid[0];\n var toY = Math.floor(index/grid[0]);\n var distanceX = fromX - toX;\n var distanceY = fromY - toY;\n var value = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n if (axis === 'x') { value = -distanceX; }\n if (axis === 'y') { value = -distanceY; }\n values.push(value);\n }\n maxValue = Math.max.apply(Math, values);\n }\n if (easing) { values = values.map(function (val) { return easing(val / maxValue) * maxValue; }); }\n if (direction === 'reverse') { values = values.map(function (val) { return axis ? (val < 0) ? val * -1 : -val : Math.abs(maxValue - val); }); }\n }\n var spacing = isRange ? (val2 - val1) / maxValue : val1;\n return start + (spacing * (Math.round(values[i] * 100) / 100)) + unit;\n }\n}\n\n// Timeline\n\nfunction timeline(params) {\n if ( params === void 0 ) params = {};\n\n var tl = anime(params);\n tl.duration = 0;\n tl.add = function(instanceParams, timelineOffset) {\n var tlIndex = activeInstances.indexOf(tl);\n var children = tl.children;\n if (tlIndex > -1) { activeInstances.splice(tlIndex, 1); }\n function passThrough(ins) { ins.passThrough = true; }\n for (var i = 0; i < children.length; i++) { passThrough(children[i]); }\n var insParams = mergeObjects(instanceParams, replaceObjectProps(defaultTweenSettings, params));\n insParams.targets = insParams.targets || params.targets;\n var tlDuration = tl.duration;\n insParams.autoplay = false;\n insParams.direction = tl.direction;\n insParams.timelineOffset = is.und(timelineOffset) ? tlDuration : getRelativeValue(timelineOffset, tlDuration);\n passThrough(tl);\n tl.seek(insParams.timelineOffset);\n var ins = anime(insParams);\n passThrough(ins);\n children.push(ins);\n var timings = getInstanceTimings(children, params);\n tl.delay = timings.delay;\n tl.endDelay = timings.endDelay;\n tl.duration = timings.duration;\n tl.seek(0);\n tl.reset();\n if (tl.autoplay) { tl.play(); }\n return tl;\n };\n return tl;\n}\n\nanime.version = '3.2.1';\nanime.speed = 1;\n// TODO:#review: naming, documentation\nanime.suspendWhenDocumentHidden = true;\nanime.running = activeInstances;\nanime.remove = removeTargetsFromActiveInstances;\nanime.get = getOriginalTargetValue;\nanime.set = setTargetsValue;\nanime.convertPx = convertPxToUnit;\nanime.path = getPath;\nanime.setDashoffset = setDashoffset;\nanime.stagger = stagger;\nanime.timeline = timeline;\nanime.easing = parseEasings;\nanime.penner = penner;\nanime.random = function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; };\n\nexport default anime;\n","/**\r\n * VectorFlow — Player\r\n * Animation playback using anime.js, with cancel/interrupt support.\r\n */\r\n\r\nimport anime from 'animejs/lib/anime.es.js';\r\nimport { readSnapshot, lerpColor, parseTransform, buildTransform, lerp } from './utils.js';\r\n\r\n/**\r\n * Animate a single step: transition all live parts to target state.\r\n * Returns a Promise that resolves when the animation completes.\r\n *\r\n * @param {Map<string, Element>} liveParts — partName → live element\r\n * @param {Map<string, object>} targetSnapshots — partName → snapshot for target state\r\n * @param {number} ms — animation duration\r\n * @param {AbortSignal} signal — for cancellation\r\n * @returns {Promise<void>}\r\n */\r\nexport function playStep(liveParts, targetSnapshots, ms, signal) {\r\n return new Promise((resolve, reject) => {\r\n if (signal?.aborted) {\r\n reject(new DOMException('Aborted', 'AbortError'));\r\n return;\r\n }\r\n\r\n const animations = [];\r\n let completedCount = 0;\r\n const totalParts = liveParts.size;\r\n\r\n if (totalParts === 0) {\r\n resolve();\r\n return;\r\n }\r\n\r\n for (const [partName, liveEl] of liveParts) {\r\n const targetSnap = targetSnapshots.get(partName);\r\n if (!targetSnap) continue;\r\n\r\n // Read current snapshot from the live element\r\n const currentSnap = readSnapshot(liveEl);\r\n\r\n // Build anime.js animation targets\r\n const animeConfig = {\r\n targets: liveEl,\r\n duration: ms,\r\n easing: 'linear',\r\n complete: () => {\r\n completedCount++;\r\n if (completedCount >= totalParts) {\r\n resolve();\r\n }\r\n },\r\n };\r\n\r\n // Animate numeric attributes\r\n for (const [attr, targetVal] of Object.entries(targetSnap.numericAttrs)) {\r\n const currentVal = currentSnap.numericAttrs[attr] ?? targetVal;\r\n if (currentVal !== targetVal) {\r\n animeConfig[attr] = targetVal;\r\n }\r\n }\r\n\r\n // Animate colors using update callback\r\n const colorAnimations = [];\r\n for (const [prop, targetColor] of Object.entries(targetSnap.colors)) {\r\n const currentColor = currentSnap.colors[prop];\r\n if (currentColor && currentColor !== targetColor) {\r\n colorAnimations.push({ prop, from: currentColor, to: targetColor });\r\n } else if (!currentColor && targetColor) {\r\n // Set directly if no current\r\n liveEl.style.setProperty(prop, targetColor);\r\n }\r\n }\r\n\r\n // Animate transform\r\n let transformAnim = null;\r\n if (targetSnap.transform || currentSnap.transform) {\r\n const fromT = parseTransform(currentSnap.transform);\r\n const toT = parseTransform(targetSnap.transform);\r\n if (JSON.stringify(fromT) !== JSON.stringify(toT)) {\r\n transformAnim = { from: fromT, to: toT };\r\n }\r\n }\r\n\r\n // If we have color or transform animations, use the update callback\r\n if (colorAnimations.length > 0 || transformAnim) {\r\n const progressObj = { t: 0 };\r\n const colorTransformAnim = anime({\r\n targets: progressObj,\r\n t: 1,\r\n duration: ms,\r\n easing: 'linear',\r\n update: () => {\r\n const t = progressObj.t;\r\n // Colors\r\n for (const { prop, from, to } of colorAnimations) {\r\n const interpolated = lerpColor(from, to, t);\r\n liveEl.style.setProperty(prop, interpolated);\r\n }\r\n // Transform\r\n if (transformAnim) {\r\n const { from, to } = transformAnim;\r\n const interpolated = {\r\n translateX: lerp(from.translateX, to.translateX, t),\r\n translateY: lerp(from.translateY, to.translateY, t),\r\n scaleX: lerp(from.scaleX, to.scaleX, t),\r\n scaleY: lerp(from.scaleY, to.scaleY, t),\r\n rotate: lerp(from.rotate, to.rotate, t),\r\n };\r\n const transformStr = buildTransform(interpolated);\r\n if (transformStr) {\r\n liveEl.setAttribute('transform', transformStr);\r\n } else {\r\n liveEl.removeAttribute('transform');\r\n }\r\n }\r\n },\r\n });\r\n animations.push(colorTransformAnim);\r\n }\r\n\r\n // Create the main numeric attributes animation\r\n const hasNumericChanges = Object.keys(animeConfig).some(\r\n k => !['targets', 'duration', 'easing', 'complete'].includes(k)\r\n );\r\n\r\n if (hasNumericChanges) {\r\n const anim = anime(animeConfig);\r\n animations.push(anim);\r\n } else {\r\n // If no numeric changes, still count this part as complete\r\n animeConfig.complete();\r\n }\r\n }\r\n\r\n // Handle abort\r\n const onAbort = () => {\r\n for (const anim of animations) {\r\n anime.remove(anim.targets || anim);\r\n if (anim.pause) anim.pause();\r\n }\r\n reject(new DOMException('Aborted', 'AbortError'));\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Play a sequence of steps.\r\n *\r\n * @param {Array<{state: string, ms: number}>} steps\r\n * @param {Map<string, Element>} liveParts\r\n * @param {Map<string, Map<string, object>>} stateSnapshots — stateName → partName → snapshot\r\n * @param {AbortSignal} signal\r\n * @param {function(string)} onStateChange — callback when a step completes\r\n * @returns {Promise<string>} — resolves with the final state\r\n */\r\nexport async function playSteps(steps, liveParts, stateSnapshots, signal, onStateChange) {\r\n let lastState = null;\r\n\r\n for (const step of steps) {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n const targetSnapshots = stateSnapshots.get(step.state);\r\n if (!targetSnapshots) {\r\n throw new Error(`VectorFlow: No snapshots for state \"${step.state}\"`);\r\n }\r\n\r\n await playStep(liveParts, targetSnapshots, step.ms, signal);\r\n lastState = step.state;\r\n\r\n if (onStateChange) {\r\n onStateChange(step.state);\r\n }\r\n }\r\n\r\n return lastState;\r\n}\r\n\r\n/**\r\n * Run a full action (sequence or loop).\r\n *\r\n * @param {object} action — normalized action object\r\n * @param {string} currentState\r\n * @param {object} routes\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates\r\n * @param {Map<string, Element>} liveParts\r\n * @param {Map<string, Map<string, object>>} stateSnapshots\r\n * @param {AbortSignal} signal\r\n * @param {function(string)} onStateChange\r\n * @param {object} expandFns — { expandSequence, expandDirect } from engine\r\n * @returns {Promise<string>} — final state\r\n */\r\nexport async function runAction(\r\n action, currentState, routes, jsonMs, validStates,\r\n liveParts, stateSnapshots, signal, onStateChange, expandFns\r\n) {\r\n const { expandSequence, expandDirect } = expandFns;\r\n\r\n if (action.type === 'loop') {\r\n const count = action.count || 99999;\r\n let current = currentState;\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n let result;\r\n if (action.mode === 'direct') {\r\n result = expandDirect(action.order, current, routes, action.ms, jsonMs, validStates);\r\n } else {\r\n result = expandSequence(action.order, current, routes, action.ms, jsonMs, validStates);\r\n }\r\n\r\n if (result.steps.length > 0) {\r\n const finalState = await playSteps(\r\n result.steps, liveParts, stateSnapshots, signal, onStateChange\r\n );\r\n current = finalState || current;\r\n }\r\n }\r\n\r\n return current;\r\n } else {\r\n // sequence (default)\r\n const result = expandSequence(\r\n action.order, currentState, routes, action.ms, jsonMs, validStates\r\n );\r\n\r\n if (result.steps.length > 0) {\r\n const finalState = await playSteps(\r\n result.steps, liveParts, stateSnapshots, signal, onStateChange\r\n );\r\n return finalState || currentState;\r\n }\r\n\r\n return currentState;\r\n }\r\n}\r\n","/**\r\n * VectorFlow — Main entry point\r\n * Public API: VectorFlow class.\r\n */\r\n\r\nimport {\r\n parseAndValidateJSON,\r\n discoverStates,\r\n discoverParts,\r\n setupLiveCharacter,\r\n buildStateSnapshots,\r\n} from './parser.js';\r\n\r\nimport {\r\n expandSequence,\r\n expandDirect,\r\n} from './engine.js';\r\n\r\nimport { runAction } from './player.js';\r\n\r\n/**\r\n * VectorFlow — A JSON-driven SVG pose animation runner.\r\n *\r\n * Usage:\r\n * const vf = new VectorFlow({ svgElement, json });\r\n * vf.play('shuffle');\r\n * vf.stop();\r\n * vf.on('stateChange', (state) => console.log(state));\r\n */\r\nclass VectorFlow {\r\n /**\r\n * @param {object} options\r\n * @param {SVGElement|string} options.svgElement — An SVG DOM element or an SVG string\r\n * @param {object|string} options.json — A VectorFlow JSON config (object or string)\r\n */\r\n constructor({ svgElement, json }) {\r\n // Event listeners\r\n this._listeners = {\r\n stateChange: [],\r\n actionStart: [],\r\n actionEnd: [],\r\n error: [],\r\n };\r\n\r\n // Current abort controller for cancellation\r\n this._abortController = null;\r\n this._currentActionName = null;\r\n\r\n // Parse JSON\r\n this._config = parseAndValidateJSON(json);\r\n\r\n // Resolve SVG element\r\n if (typeof svgElement === 'string') {\r\n const container = document.createElement('div');\r\n container.innerHTML = svgElement.trim();\r\n this._svgElement = container.querySelector('svg');\r\n if (!this._svgElement) {\r\n throw new Error('VectorFlow: Provided SVG string does not contain an <svg> element.');\r\n }\r\n } else if (svgElement instanceof SVGElement) {\r\n this._svgElement = svgElement;\r\n } else {\r\n throw new Error('VectorFlow: svgElement must be an SVG DOM element or an SVG string.');\r\n }\r\n\r\n // Discover states and parts\r\n this._stateMap = discoverStates(this._svgElement);\r\n this._stateParts = discoverParts(this._stateMap);\r\n this._validStates = new Set(this._stateMap.keys());\r\n\r\n // Validate initial_state exists\r\n if (!this._validStates.has(this._config.initial_state)) {\r\n const available = Array.from(this._validStates).join(', ');\r\n throw new Error(\r\n `VectorFlow: initial_state \"${this._config.initial_state}\" not found in SVG. Available states: ${available}`\r\n );\r\n }\r\n\r\n // Build snapshots from original state groups (before hiding)\r\n this._stateSnapshots = buildStateSnapshots(this._stateParts);\r\n\r\n // Set up live character\r\n const { liveGroup, liveParts } = setupLiveCharacter(\r\n this._svgElement, this._stateMap, this._config.initial_state\r\n );\r\n this._liveGroup = liveGroup;\r\n this._liveParts = liveParts;\r\n\r\n // Track current state\r\n this._currentState = this._config.initial_state;\r\n }\r\n\r\n // ---- Public API: Properties ----\r\n\r\n /** Get all discovered state names. */\r\n get states() {\r\n return Array.from(this._validStates);\r\n }\r\n\r\n /** Get the current state name. */\r\n get currentState() {\r\n return this._currentState;\r\n }\r\n\r\n /** Get the actions config object. */\r\n get actions() {\r\n return { ...this._config.actions };\r\n }\r\n\r\n /** Get the SVG element being animated. */\r\n get svgElement() {\r\n return this._svgElement;\r\n }\r\n\r\n /** Whether an action is currently playing. */\r\n get isPlaying() {\r\n return this._abortController !== null && !this._abortController.signal.aborted;\r\n }\r\n\r\n /** Name of the currently playing action (null if none). */\r\n get currentAction() {\r\n return this._currentActionName;\r\n }\r\n\r\n // ---- Public API: Methods ----\r\n\r\n /**\r\n * Play a named action. Cancels any currently playing action.\r\n * @param {string} actionName\r\n * @returns {Promise<void>}\r\n */\r\n async play(actionName) {\r\n const action = this._config.actions[actionName];\r\n if (!action) {\r\n const err = new Error(`VectorFlow: Unknown action \"${actionName}\"`);\r\n this._emit('error', err);\r\n throw err;\r\n }\r\n\r\n if (action.order.length === 0) {\r\n console.warn(`VectorFlow: Action \"${actionName}\" has empty order — no-op.`);\r\n return;\r\n }\r\n\r\n // Cancel any running action\r\n this.stop();\r\n\r\n // New abort controller\r\n this._abortController = new AbortController();\r\n this._currentActionName = actionName;\r\n this._emit('actionStart', actionName);\r\n\r\n try {\r\n const finalState = await runAction(\r\n action,\r\n this._currentState,\r\n this._config.routes,\r\n this._config.ms,\r\n this._validStates,\r\n this._liveParts,\r\n this._stateSnapshots,\r\n this._abortController.signal,\r\n (state) => {\r\n this._currentState = state;\r\n this._emit('stateChange', state);\r\n },\r\n { expandSequence, expandDirect }\r\n );\r\n\r\n if (finalState) {\r\n this._currentState = finalState;\r\n }\r\n\r\n this._currentActionName = null;\r\n this._emit('actionEnd', actionName);\r\n } catch (err) {\r\n if (err.name === 'AbortError') {\r\n // Cancelled — not an error\r\n return;\r\n }\r\n this._currentActionName = null;\r\n this._emit('error', err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Stop/cancel any currently playing action.\r\n */\r\n stop() {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n if (this._currentActionName) {\r\n const name = this._currentActionName;\r\n this._currentActionName = null;\r\n this._emit('actionEnd', name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Register an event listener.\r\n * @param {'stateChange'|'actionStart'|'actionEnd'|'error'} event\r\n * @param {function} callback\r\n */\r\n on(event, callback) {\r\n if (!this._listeners[event]) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(callback);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an event listener.\r\n * @param {string} event\r\n * @param {function} callback\r\n */\r\n off(event, callback) {\r\n if (this._listeners[event]) {\r\n this._listeners[event] = this._listeners[event].filter(cb => cb !== callback);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Clean up: stop playback, restore SVG state groups, remove live character.\r\n */\r\n destroy() {\r\n this.stop();\r\n\r\n // Show original state groups again\r\n if (this._stateMap) {\r\n for (const [, groupEl] of this._stateMap) {\r\n groupEl.style.display = '';\r\n }\r\n }\r\n\r\n // Remove live group\r\n if (this._liveGroup && this._liveGroup.parentNode) {\r\n this._liveGroup.remove();\r\n }\r\n\r\n this._listeners = { stateChange: [], actionStart: [], actionEnd: [], error: [] };\r\n }\r\n\r\n // ---- Private ----\r\n\r\n _emit(event, data) {\r\n if (this._listeners[event]) {\r\n for (const cb of this._listeners[event]) {\r\n try {\r\n cb(data);\r\n } catch (e) {\r\n console.error(`VectorFlow: Error in \"${event}\" listener:`, e);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default VectorFlow;\r\nexport { VectorFlow };\r\n","/**\r\n * VectorFlow — Parser\r\n * JSON validation/normalization + SVG state/part discovery.\r\n */\r\n\r\nimport { readSnapshot } from './utils.js';\r\n\r\n/**\r\n * Parse and validate a VectorFlow JSON config.\r\n * Returns a normalized config object.\r\n * Throws on invalid input.\r\n */\r\nexport function parseAndValidateJSON(input) {\r\n let json;\r\n if (typeof input === 'string') {\r\n try {\r\n json = JSON.parse(input);\r\n } catch (e) {\r\n throw new Error(`VectorFlow: Invalid JSON — ${e.message}`);\r\n }\r\n } else if (typeof input === 'object' && input !== null) {\r\n json = input;\r\n } else {\r\n throw new Error('VectorFlow: JSON input must be a string or object');\r\n }\r\n\r\n // Validate required fields\r\n if (!json.initial_state || typeof json.initial_state !== 'string') {\r\n throw new Error('VectorFlow: JSON must have a string \"initial_state\" field');\r\n }\r\n if (!json.routes || typeof json.routes !== 'object') {\r\n throw new Error('VectorFlow: JSON must have a \"routes\" object');\r\n }\r\n if (!json.actions || typeof json.actions !== 'object') {\r\n throw new Error('VectorFlow: JSON must have an \"actions\" object');\r\n }\r\n\r\n // Normalize top-level ms\r\n const globalMs = (typeof json.ms === 'number' && json.ms > 0) ? json.ms : 120;\r\n\r\n // Validate routes\r\n const routes = {};\r\n for (const [target, block] of Object.entries(json.routes)) {\r\n if (typeof block !== 'object' || block === null) {\r\n throw new Error(`VectorFlow: routes[\"${target}\"] must be an object`);\r\n }\r\n routes[target] = {};\r\n for (const [key, value] of Object.entries(block)) {\r\n if (key === 'ms') {\r\n if (typeof value !== 'number') {\r\n throw new Error(`VectorFlow: routes[\"${target}\"].ms must be a number`);\r\n }\r\n routes[target].ms = value;\r\n } else {\r\n if (!Array.isArray(value) || !value.every(s => typeof s === 'string')) {\r\n throw new Error(`VectorFlow: routes[\"${target}\"][\"${key}\"] must be an array of strings`);\r\n }\r\n routes[target][key] = value;\r\n }\r\n }\r\n }\r\n\r\n // Normalize actions\r\n const actions = {};\r\n for (const [name, action] of Object.entries(json.actions)) {\r\n const type = (action.type === 'loop') ? 'loop' : 'sequence';\r\n\r\n if (!Array.isArray(action.order) || action.order.length === 0) {\r\n console.warn(`VectorFlow: action \"${name}\" has no valid order — will be a no-op`);\r\n actions[name] = { type, order: [], ms: undefined, count: undefined, mode: undefined };\r\n continue;\r\n }\r\n\r\n const ms = (typeof action.ms === 'number' && action.ms > 0) ? action.ms : undefined;\r\n let count;\r\n let mode;\r\n\r\n if (type === 'loop') {\r\n count = (typeof action.count === 'number' && action.count > 0) ? action.count : 99999;\r\n mode = (typeof action.mode === 'string') ? action.mode : undefined;\r\n }\r\n\r\n actions[name] = { type, order: action.order, ms, count, mode };\r\n }\r\n\r\n return {\r\n name: json.name || 'untitled',\r\n initial_state: json.initial_state,\r\n ms: globalMs,\r\n routes,\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Discover state groups from an SVG element.\r\n * Returns a Map: stateName → SVG <g> element.\r\n * Throws if no state groups found.\r\n */\r\nexport function discoverStates(svgElement) {\r\n const stateGroups = svgElement.querySelectorAll('g[id^=\"state_\"]');\r\n if (stateGroups.length === 0) {\r\n throw new Error('VectorFlow: No state groups found in SVG. Expected groups with id=\"state_{name}\".');\r\n }\r\n\r\n const stateMap = new Map();\r\n for (const g of stateGroups) {\r\n const stateName = g.id.replace(/^state_/, '');\r\n if (stateName) {\r\n stateMap.set(stateName, g);\r\n }\r\n }\r\n\r\n if (stateMap.size === 0) {\r\n throw new Error('VectorFlow: No valid state groups found in SVG.');\r\n }\r\n\r\n return stateMap;\r\n}\r\n\r\n/**\r\n * Discover parts from all state groups.\r\n * Returns a Map: stateName → Map(partName → element).\r\n * Validates that all states have identical part sets.\r\n */\r\nexport function discoverParts(stateMap) {\r\n const stateParts = new Map();\r\n let referencePartNames = null;\r\n let referenceStateName = null;\r\n\r\n for (const [stateName, groupEl] of stateMap) {\r\n const parts = new Map();\r\n const partEls = groupEl.querySelectorAll('[data-part]');\r\n\r\n for (const el of partEls) {\r\n const partName = el.getAttribute('data-part');\r\n if (partName) {\r\n parts.set(partName, el);\r\n }\r\n }\r\n\r\n if (parts.size === 0) {\r\n throw new Error(`VectorFlow: State \"${stateName}\" has no parts (elements with data-part attribute).`);\r\n }\r\n\r\n // Validate matching part sets\r\n const currentPartNames = Array.from(parts.keys()).sort().join(',');\r\n if (referencePartNames === null) {\r\n referencePartNames = currentPartNames;\r\n referenceStateName = stateName;\r\n } else if (currentPartNames !== referencePartNames) {\r\n throw new Error(\r\n `VectorFlow: Part mismatch between states. ` +\r\n `State \"${referenceStateName}\" has parts [${referencePartNames}] ` +\r\n `but state \"${stateName}\" has parts [${currentPartNames}].`\r\n );\r\n }\r\n\r\n stateParts.set(stateName, parts);\r\n }\r\n\r\n return stateParts;\r\n}\r\n\r\n/**\r\n * Set up the live character group.\r\n * Clones the initial state, inserts into SVG, hides original state groups.\r\n * Returns { liveGroup: element, liveParts: Map(partName → element) }.\r\n */\r\nexport function setupLiveCharacter(svgElement, stateMap, initialState) {\r\n const initialGroup = stateMap.get(initialState);\r\n if (!initialGroup) {\r\n const available = Array.from(stateMap.keys()).join(', ');\r\n throw new Error(\r\n `VectorFlow: initial_state \"${initialState}\" not found in SVG. Available states: ${available}`\r\n );\r\n }\r\n\r\n // Remove any existing live group\r\n const existingLive = svgElement.querySelector('#live_character');\r\n if (existingLive) {\r\n existingLive.remove();\r\n }\r\n\r\n // Clone initial state\r\n const liveGroup = initialGroup.cloneNode(true);\r\n liveGroup.id = 'live_character';\r\n liveGroup.removeAttribute('style');\r\n liveGroup.style.display = '';\r\n\r\n // Insert live group into SVG\r\n svgElement.appendChild(liveGroup);\r\n\r\n // Hide all original state groups\r\n for (const [, groupEl] of stateMap) {\r\n groupEl.style.display = 'none';\r\n }\r\n\r\n // Build live parts map\r\n const liveParts = new Map();\r\n const partEls = liveGroup.querySelectorAll('[data-part]');\r\n for (const el of partEls) {\r\n const partName = el.getAttribute('data-part');\r\n if (partName) {\r\n liveParts.set(partName, el);\r\n }\r\n }\r\n\r\n return { liveGroup, liveParts };\r\n}\r\n\r\n/**\r\n * Build snapshots for all states and parts.\r\n * Returns Map: stateName → Map(partName → snapshot).\r\n */\r\nexport function buildStateSnapshots(stateParts) {\r\n const snapshots = new Map();\r\n for (const [stateName, parts] of stateParts) {\r\n const partSnapshots = new Map();\r\n for (const [partName, el] of parts) {\r\n partSnapshots.set(partName, readSnapshot(el));\r\n }\r\n snapshots.set(stateName, partSnapshots);\r\n }\r\n return snapshots;\r\n}\r\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","hexToRgb","hex","trim","replace","length","num","parseInt","isNaN","r","g","b","rgbToHex","toHex","n","Math","round","max","min","toString","padStart","lerp","a","t","lerpColor","colorA","colorB","NUMERIC_ATTRS","COLOR_PROPS","readColorProp","el","styleVal","style","getPropertyValue","normalizeColor","attrVal","getAttribute","computed","window","getComputedStyle","val","startsWith","match","document","ctx","createElement","getContext","fillStyle","resolved","readSnapshot","snapshot","numericAttrs","colors","transform","attr","raw","parseFloat","color","parseTransform","transformStr","result","translateX","translateY","scaleX","scaleY","rotate","translateMatch","scaleMatch","undefined","rotateMatch","buildTransform","parts","push","join","resolvePath","targetState","currentState","routes","routeBlock","Array","isArray","normalizePath","path","slice","resolveMs","actionMs","routeMs","jsonMs","expandSequence","order","validStates","steps","current","has","Error","nextState","ms","state","finalState","expandDirect","defaultInstanceSettings","update","begin","loopBegin","changeBegin","change","changeComplete","loopComplete","complete","loop","direction","autoplay","timelineOffset","defaultTweenSettings","duration","delay","endDelay","easing","validTransforms","cache","CSS","springs","minMax","stringContains","str","text","indexOf","applyArguments","func","args","apply","is","arr","pth","svg","SVGElement","inp","HTMLInputElement","dom","nodeType","fnc","und","nil","test","rgb","hsl","col","parseEasingParameters","string","exec","split","map","p","spring","params","mass","stiffness","damping","velocity","w0","sqrt","zeta","wd","solver","progress","exp","cos","sin","cached","frame","elapsed","rest","ceil","eases","functionEasings","bezier","kSampleStepSize","A","aA1","aA2","B","C","calcBezier","aT","getSlope","mX1","mY1","mX2","mY2","sampleValues","Float32Array","i","x","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","abs","binarySubdivide","getTForX","penner","linear","Sine","PI","Expo","pow","Circ","Back","Bounce","pow2","Elastic","amplitude","period","asin","forEach","name","keys","easeIn","parseEasings","ease","selectString","querySelectorAll","e","filterArray","callback","len","thisArg","arguments","flattenArray","reduce","concat","toArray","NodeList","HTMLCollection","arrayContains","some","cloneObject","clone","replaceObjectProps","o1","o2","mergeObjects","getUnit","getFunctionValue","animatable","target","id","total","convertPxToUnit","value","unit","tempEl","tagName","parentEl","parentNode","body","appendChild","position","width","factor","offsetWidth","removeChild","convertedUnit","getCSSValue","uppercasePropName","toLowerCase","getAnimationType","getElementTransforms","m","reg","transforms","Map","set","getOriginalTargetValue","propName","defaultVal","getTransformUnit","list","getTransformValue","getRelativeValue","to","from","operator","u","y","validateValue","rgbValue","hexValue","hexToRgba","hslValue","h","s","l","hue2rgb","q","hslToRgba","colorToRgb","originalUnit","unitLess","substr","getDistance","p1","p2","getPolylineLength","previousPos","points","totalLength","numberOfItems","currentPos","getItem","getTotalLength","getCircleLength","getRectLength","getLineLength","getPolygonLength","getParentSvg","pathEl","svgData","parentSvgEl","getParentSvgEl","rect","getBoundingClientRect","viewBoxAttr","height","viewBox","w","vW","vH","getPathProgress","isPathTargetInsideSVG","point","offset","getPointAtLength","p0","property","atan2","decomposeValue","rgx","original","numbers","Number","strings","parseTargets","targets","item","pos","self","getAnimatables","parsed","normalizePropertyTweens","tweenSettings","settings","propArray","v","k","setProgressValue","css","attribute","setAttribute","object","manual","last","setTargetsValue","properties","valueUnit","originalValue","animType","getAnimations","animatables","tweens","previousTween","tween","normalizeTweenValues","tweenValue","toUnit","previousValue","fromUnit","start","end","isPath","isColor","normalizeTweens","lastTween","type","createAnimation","getInstanceTimings","animations","animLength","getTlOffset","anim","timings","instanceID","activeInstances","engine","raf","step","activeInstancesLength","activeInstance","paused","splice","tick","requestAnimationFrame","addEventListener","anime","suspendWhenDocumentHidden","isDocumentHidden","cancelAnimationFrame","instance","_onDocumentVisibility","hidden","children","startTime","lastTime","now","childrenLength","resolve","makePromise","promise","Promise","_resolve","finished","instanceSettings","keyframes","propertyNames","newKey","flattenKeyframes","getProperties","createNewInstance","toggleInstanceDirection","reversed","child","adjustTime","time","resetTime","currentTime","speed","seekChild","seek","setAnimationsProgress","insTime","animationsLength","tweenLength","eased","toNumbersLength","toNumber","fromNumber","stringsLength","n$1","currentValue","setCallback","cb","passThrough","setInstanceProgress","engineTime","insDuration","insDelay","insEndDelay","reversePlayback","i$1","syncInstanceChildren","began","loopBegan","changeBegan","changeCompleted","remaining","completed","reset","pause","play","reverse","restart","remove","removeTargetsFromInstance","removeTargetsFromAnimations","targetsArray","c","childAnimations","version","running","convertPx","percent","setDashoffset","pathLength","stagger","grid","axis","fromIndex","fromFirst","fromCenter","fromLast","isRange","val1","val2","values","maxValue","index","fromX","fromY","floor","distanceX","distanceY","timeline","tl","add","instanceParams","tlIndex","ins","insParams","tlDuration","random","playStep","liveParts","targetSnapshots","signal","reject","aborted","DOMException","completedCount","totalParts","size","partName","liveEl","targetSnap","currentSnap","animeConfig","targetVal","entries","colorAnimations","targetColor","currentColor","setProperty","transformAnim","fromT","toT","JSON","stringify","progressObj","colorTransformAnim","interpolated","removeAttribute","includes","once","async","playSteps","stateSnapshots","onStateChange","lastState","constructor","svgElement","json","_listeners","stateChange","actionStart","actionEnd","error","_abortController","_currentActionName","_config","input","parse","message","initial_state","actions","globalMs","block","every","action","console","warn","count","mode","parseAndValidateJSON","container","innerHTML","_svgElement","querySelector","_stateMap","stateGroups","stateMap","stateName","discoverStates","_stateParts","stateParts","referencePartNames","referenceStateName","groupEl","partEls","currentPartNames","sort","discoverParts","_validStates","Set","available","_stateSnapshots","snapshots","partSnapshots","buildStateSnapshots","liveGroup","initialState","initialGroup","existingLive","cloneNode","display","setupLiveCharacter","_liveGroup","_liveParts","_currentState","states","isPlaying","currentAction","actionName","err","_emit","stop","AbortController","expandFns","runAction","abort","on","event","off","filter","destroy","data"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"vectorflow.umd.js","mappings":"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","sources":["webpack://VectorFlow/webpack/universalModuleDefinition","webpack://VectorFlow/webpack/bootstrap","webpack://VectorFlow/webpack/runtime/define property getters","webpack://VectorFlow/webpack/runtime/hasOwnProperty shorthand","webpack://VectorFlow/./src/utils.js","webpack://VectorFlow/./src/engine.js","webpack://VectorFlow/./node_modules/animejs/lib/anime.es.js","webpack://VectorFlow/./src/player.js","webpack://VectorFlow/./src/index.js","webpack://VectorFlow/./src/parser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VectorFlow\"] = factory();\n\telse\n\t\troot[\"VectorFlow\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\r\n * VectorFlow — Utility helpers\r\n * Color parsing, attribute reading, interpolation helpers.\r\n */\r\n\r\n/**\r\n * Parse a hex color string to { r, g, b } (0-255).\r\n * Supports #RGB, #RRGGBB.\r\n */\r\nexport function hexToRgb(hex) {\r\n if (!hex || hex === 'none') return null;\r\n hex = hex.trim().replace('#', '');\r\n if (hex.length === 3) {\r\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\r\n }\r\n const num = parseInt(hex, 16);\r\n if (isNaN(num)) return null;\r\n return {\r\n r: (num >> 16) & 255,\r\n g: (num >> 8) & 255,\r\n b: num & 255,\r\n };\r\n}\r\n\r\n/**\r\n * Convert { r, g, b } back to a hex string.\r\n */\r\nexport function rgbToHex({ r, g, b }) {\r\n const toHex = (n) => Math.round(Math.max(0, Math.min(255, n)))\r\n .toString(16)\r\n .padStart(2, '0');\r\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two numbers.\r\n */\r\nexport function lerp(a, b, t) {\r\n return a + (b - a) * t;\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two colors (hex strings).\r\n * Returns a hex string.\r\n */\r\nexport function lerpColor(colorA, colorB, t) {\r\n const a = hexToRgb(colorA);\r\n const b = hexToRgb(colorB);\r\n if (!a || !b) return colorB || colorA || '#000000';\r\n return rgbToHex({\r\n r: lerp(a.r, b.r, t),\r\n g: lerp(a.g, b.g, t),\r\n b: lerp(a.b, b.b, t),\r\n });\r\n}\r\n\r\n/**\r\n * Numeric SVG attributes we want to interpolate.\r\n */\r\nexport const NUMERIC_ATTRS = ['x', 'y', 'width', 'height', 'rx', 'ry', 'cx', 'cy', 'r', 'opacity'];\r\n\r\n/**\r\n * Style properties that may contain colors.\r\n */\r\nexport const COLOR_PROPS = ['fill', 'stroke'];\r\n\r\n/**\r\n * Read a numeric attribute from an SVG element.\r\n * Falls back to computed style, then to defaultVal.\r\n */\r\nexport function readNumericAttr(el, attr, defaultVal = 0) {\r\n // Try direct attribute first\r\n const raw = el.getAttribute(attr);\r\n if (raw !== null && raw !== '') {\r\n const val = parseFloat(raw);\r\n if (!isNaN(val)) return val;\r\n }\r\n return defaultVal;\r\n}\r\n\r\n/**\r\n * Read a color property from an SVG element.\r\n * Checks inline style first, then attribute, then computed style.\r\n * Returns a hex color string or null.\r\n */\r\nexport function readColorProp(el, prop) {\r\n // 1. Inline style\r\n const styleVal = el.style.getPropertyValue(prop);\r\n if (styleVal && styleVal !== 'none') {\r\n return normalizeColor(styleVal);\r\n }\r\n // 2. Direct attribute\r\n const attrVal = el.getAttribute(prop);\r\n if (attrVal && attrVal !== 'none') {\r\n return normalizeColor(attrVal);\r\n }\r\n // 3. Computed style\r\n const computed = window.getComputedStyle(el).getPropertyValue(prop);\r\n if (computed && computed !== 'none') {\r\n return normalizeColor(computed);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Normalize a color value to hex. Handles:\r\n * - hex: #fff, #ff0000\r\n * - rgb(...): rgb(255, 0, 0)\r\n */\r\nexport function normalizeColor(val) {\r\n if (!val || val === 'none') return null;\r\n val = val.trim();\r\n\r\n // Already hex\r\n if (val.startsWith('#')) return val;\r\n\r\n // rgb(r, g, b) or rgb(r,g,b)\r\n const match = val.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i);\r\n if (match) {\r\n return rgbToHex({\r\n r: parseInt(match[1], 10),\r\n g: parseInt(match[2], 10),\r\n b: parseInt(match[3], 10),\r\n });\r\n }\r\n\r\n // Named colors — use a canvas trick\r\n if (typeof document !== 'undefined') {\r\n const ctx = document.createElement('canvas').getContext('2d');\r\n ctx.fillStyle = val;\r\n const resolved = ctx.fillStyle; // returns hex\r\n if (resolved.startsWith('#')) return resolved;\r\n }\r\n\r\n return val;\r\n}\r\n\r\n/**\r\n * Read all animatable snapshot from an SVG element.\r\n * Returns { numericAttrs: {attr: value}, colors: {prop: hexString}, transform: string|null }\r\n */\r\nexport function readSnapshot(el) {\r\n const snapshot = {\r\n numericAttrs: {},\r\n colors: {},\r\n transform: null,\r\n };\r\n\r\n // Numeric attributes\r\n for (const attr of NUMERIC_ATTRS) {\r\n const raw = el.getAttribute(attr);\r\n if (raw !== null && raw !== '') {\r\n const val = parseFloat(raw);\r\n if (!isNaN(val)) {\r\n snapshot.numericAttrs[attr] = val;\r\n }\r\n }\r\n }\r\n\r\n // Colors\r\n for (const prop of COLOR_PROPS) {\r\n const color = readColorProp(el, prop);\r\n if (color) {\r\n snapshot.colors[prop] = color;\r\n }\r\n }\r\n\r\n // Transform\r\n const transform = el.getAttribute('transform');\r\n if (transform) {\r\n snapshot.transform = transform;\r\n }\r\n\r\n return snapshot;\r\n}\r\n\r\n/**\r\n * Parse a simple SVG transform string into components.\r\n * Only handles translate, scale, rotate as simple cases.\r\n * Returns an object like { translateX, translateY, scaleX, scaleY, rotate }.\r\n */\r\nexport function parseTransform(transformStr) {\r\n const result = { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, rotate: 0 };\r\n if (!transformStr) return result;\r\n\r\n const translateMatch = transformStr.match(/translate\\(\\s*([-\\d.]+)\\s*[,\\s]\\s*([-\\d.]+)\\s*\\)/);\r\n if (translateMatch) {\r\n result.translateX = parseFloat(translateMatch[1]);\r\n result.translateY = parseFloat(translateMatch[2]);\r\n }\r\n\r\n const scaleMatch = transformStr.match(/scale\\(\\s*([-\\d.]+)(?:\\s*[,\\s]\\s*([-\\d.]+))?\\s*\\)/);\r\n if (scaleMatch) {\r\n result.scaleX = parseFloat(scaleMatch[1]);\r\n result.scaleY = scaleMatch[2] !== undefined ? parseFloat(scaleMatch[2]) : result.scaleX;\r\n }\r\n\r\n const rotateMatch = transformStr.match(/rotate\\(\\s*([-\\d.]+)/);\r\n if (rotateMatch) {\r\n result.rotate = parseFloat(rotateMatch[1]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build a transform string from parsed components.\r\n */\r\nexport function buildTransform({ translateX, translateY, scaleX, scaleY, rotate }) {\r\n const parts = [];\r\n if (translateX !== 0 || translateY !== 0) {\r\n parts.push(`translate(${translateX},${translateY})`);\r\n }\r\n if (rotate !== 0) {\r\n parts.push(`rotate(${rotate})`);\r\n }\r\n if (scaleX !== 1 || scaleY !== 1) {\r\n parts.push(`scale(${scaleX},${scaleY})`);\r\n }\r\n return parts.length > 0 ? parts.join(' ') : null;\r\n}\r\n","/**\r\n * VectorFlow — Engine\r\n * Route resolution, ms precedence, step expansion.\r\n */\r\n\r\n/**\r\n * Resolve the path from currentState to targetState using routes.\r\n * Returns an array of state names to visit.\r\n *\r\n * @param {string} targetState\r\n * @param {string} currentState\r\n * @param {object} routes — normalized routes object\r\n * @returns {string[]}\r\n */\r\nexport function resolvePath(targetState, currentState, routes) {\r\n const routeBlock = routes[targetState];\r\n if (!routeBlock) {\r\n return [targetState]; // fallback: direct\r\n }\r\n\r\n // Try specific path for current state\r\n if (Array.isArray(routeBlock[currentState])) {\r\n return routeBlock[currentState];\r\n }\r\n\r\n // Try wildcard\r\n if (Array.isArray(routeBlock['*'])) {\r\n return routeBlock['*'];\r\n }\r\n\r\n // Fallback: direct\r\n return [targetState];\r\n}\r\n\r\n/**\r\n * Normalize a path by removing a leading state that matches currentState\r\n * to avoid a no-op step.\r\n *\r\n * @param {string[]} path\r\n * @param {string} currentState\r\n * @returns {string[]}\r\n */\r\nexport function normalizePath(path, currentState) {\r\n if (path.length > 0 && path[0] === currentState) {\r\n return path.slice(1);\r\n }\r\n return path;\r\n}\r\n\r\n/**\r\n * Resolve the ms for a step using the precedence chain:\r\n * action.ms > routes[target].ms > json.ms > 120\r\n *\r\n * @param {number|undefined} actionMs\r\n * @param {number|undefined} routeMs — routes[targetState].ms\r\n * @param {number} jsonMs\r\n * @returns {number}\r\n */\r\nexport function resolveMs(actionMs, routeMs, jsonMs) {\r\n if (typeof actionMs === 'number' && actionMs > 0) return actionMs;\r\n if (typeof routeMs === 'number' && routeMs > 0) return routeMs;\r\n if (typeof jsonMs === 'number' && jsonMs > 0) return jsonMs;\r\n return 120;\r\n}\r\n\r\n/**\r\n * Expand a sequence action into a list of normalized steps.\r\n *\r\n * @param {string[]} order — target states to visit\r\n * @param {string} currentState\r\n * @param {object} routes\r\n * @param {number|undefined} actionMs\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates — set of known state names\r\n * @returns {{ steps: Array<{state: string, ms: number}>, finalState: string }}\r\n */\r\nexport function expandSequence(order, currentState, routes, actionMs, jsonMs, validStates) {\r\n const steps = [];\r\n let current = currentState;\r\n\r\n for (const routeKey of order) {\r\n // Resolve the route — routeKey can be a route key OR a state name\r\n const path = normalizePath(resolvePath(routeKey, current, routes), current);\r\n\r\n if (path.length === 0) continue;\r\n\r\n // Validate that resolved path entries are real states\r\n for (const nextState of path) {\r\n if (validStates && !validStates.has(nextState)) {\r\n throw new Error(`VectorFlow: Route \"${routeKey}\" resolves to unknown state \"${nextState}\"`);\r\n }\r\n\r\n const routeMs = routes[routeKey]?.ms ?? routes[nextState]?.ms;\r\n const ms = resolveMs(actionMs, routeMs, jsonMs);\r\n steps.push({ state: nextState, ms });\r\n current = nextState;\r\n }\r\n }\r\n\r\n return { steps, finalState: current };\r\n}\r\n\r\n/**\r\n * Expand a direct-mode action into steps (skip route resolution).\r\n *\r\n * @param {string[]} order\r\n * @param {string} currentState\r\n * @param {object} routes — still needed for ms lookup\r\n * @param {number|undefined} actionMs\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates\r\n * @returns {{ steps: Array<{state: string, ms: number}>, finalState: string }}\r\n */\r\nexport function expandDirect(order, currentState, routes, actionMs, jsonMs, validStates) {\r\n const steps = [];\r\n let current = currentState;\r\n\r\n for (const routeKey of order) {\r\n // In direct mode, resolve the route to find the final destination state\r\n const path = resolvePath(routeKey, current, routes);\r\n // Use the last state in the resolved path as the target\r\n const targetState = path[path.length - 1];\r\n\r\n if (validStates && !validStates.has(targetState)) {\r\n throw new Error(`VectorFlow: Route \"${routeKey}\" resolves to unknown state \"${targetState}\"`);\r\n }\r\n\r\n // Skip if already at target\r\n if (targetState === current) continue;\r\n\r\n const routeMs = routes[routeKey]?.ms ?? routes[targetState]?.ms;\r\n const ms = resolveMs(actionMs, routeMs, jsonMs);\r\n steps.push({ state: targetState, ms });\r\n current = targetState;\r\n }\r\n\r\n return { steps, finalState: current };\r\n}\r\n","/*\n * anime.js v3.2.2\n * (c) 2023 Julian Garnier\n * Released under the MIT license\n * animejs.com\n */\n\n// Defaults\n\nvar defaultInstanceSettings = {\n update: null,\n begin: null,\n loopBegin: null,\n changeBegin: null,\n change: null,\n changeComplete: null,\n loopComplete: null,\n complete: null,\n loop: 1,\n direction: 'normal',\n autoplay: true,\n timelineOffset: 0\n};\n\nvar defaultTweenSettings = {\n duration: 1000,\n delay: 0,\n endDelay: 0,\n easing: 'easeOutElastic(1, .5)',\n round: 0\n};\n\nvar validTransforms = ['translateX', 'translateY', 'translateZ', 'rotate', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'perspective', 'matrix', 'matrix3d'];\n\n// Caching\n\nvar cache = {\n CSS: {},\n springs: {}\n};\n\n// Utils\n\nfunction minMax(val, min, max) {\n return Math.min(Math.max(val, min), max);\n}\n\nfunction stringContains(str, text) {\n return str.indexOf(text) > -1;\n}\n\nfunction applyArguments(func, args) {\n return func.apply(null, args);\n}\n\nvar is = {\n arr: function (a) { return Array.isArray(a); },\n obj: function (a) { return stringContains(Object.prototype.toString.call(a), 'Object'); },\n pth: function (a) { return is.obj(a) && a.hasOwnProperty('totalLength'); },\n svg: function (a) { return a instanceof SVGElement; },\n inp: function (a) { return a instanceof HTMLInputElement; },\n dom: function (a) { return a.nodeType || is.svg(a); },\n str: function (a) { return typeof a === 'string'; },\n fnc: function (a) { return typeof a === 'function'; },\n und: function (a) { return typeof a === 'undefined'; },\n nil: function (a) { return is.und(a) || a === null; },\n hex: function (a) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a); },\n rgb: function (a) { return /^rgb/.test(a); },\n hsl: function (a) { return /^hsl/.test(a); },\n col: function (a) { return (is.hex(a) || is.rgb(a) || is.hsl(a)); },\n key: function (a) { return !defaultInstanceSettings.hasOwnProperty(a) && !defaultTweenSettings.hasOwnProperty(a) && a !== 'targets' && a !== 'keyframes'; },\n};\n\n// Easings\n\nfunction parseEasingParameters(string) {\n var match = /\\(([^)]+)\\)/.exec(string);\n return match ? match[1].split(',').map(function (p) { return parseFloat(p); }) : [];\n}\n\n// Spring solver inspired by Webkit Copyright © 2016 Apple Inc. All rights reserved. https://webkit.org/demos/spring/spring.js\n\nfunction spring(string, duration) {\n\n var params = parseEasingParameters(string);\n var mass = minMax(is.und(params[0]) ? 1 : params[0], .1, 100);\n var stiffness = minMax(is.und(params[1]) ? 100 : params[1], .1, 100);\n var damping = minMax(is.und(params[2]) ? 10 : params[2], .1, 100);\n var velocity = minMax(is.und(params[3]) ? 0 : params[3], .1, 100);\n var w0 = Math.sqrt(stiffness / mass);\n var zeta = damping / (2 * Math.sqrt(stiffness * mass));\n var wd = zeta < 1 ? w0 * Math.sqrt(1 - zeta * zeta) : 0;\n var a = 1;\n var b = zeta < 1 ? (zeta * w0 + -velocity) / wd : -velocity + w0;\n\n function solver(t) {\n var progress = duration ? (duration * t) / 1000 : t;\n if (zeta < 1) {\n progress = Math.exp(-progress * zeta * w0) * (a * Math.cos(wd * progress) + b * Math.sin(wd * progress));\n } else {\n progress = (a + b * progress) * Math.exp(-progress * w0);\n }\n if (t === 0 || t === 1) { return t; }\n return 1 - progress;\n }\n\n function getDuration() {\n var cached = cache.springs[string];\n if (cached) { return cached; }\n var frame = 1/6;\n var elapsed = 0;\n var rest = 0;\n while(true) {\n elapsed += frame;\n if (solver(elapsed) === 1) {\n rest++;\n if (rest >= 16) { break; }\n } else {\n rest = 0;\n }\n }\n var duration = elapsed * frame * 1000;\n cache.springs[string] = duration;\n return duration;\n }\n\n return duration ? solver : getDuration;\n\n}\n\n// Basic steps easing implementation https://developer.mozilla.org/fr/docs/Web/CSS/transition-timing-function\n\nfunction steps(steps) {\n if ( steps === void 0 ) steps = 10;\n\n return function (t) { return Math.ceil((minMax(t, 0.000001, 1)) * steps) * (1 / steps); };\n}\n\n// BezierEasing https://github.com/gre/bezier-easing\n\nvar bezier = (function () {\n\n var kSplineTableSize = 11;\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\n function A(aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1 }\n function B(aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1 }\n function C(aA1) { return 3.0 * aA1 }\n\n function calcBezier(aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT }\n function getSlope(aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1) }\n\n function binarySubdivide(aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) { aB = currentT; } else { aA = currentT; }\n } while (Math.abs(currentX) > 0.0000001 && ++i < 10);\n return currentT;\n }\n\n function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < 4; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) { return aGuessT; }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n }\n\n function bezier(mX1, mY1, mX2, mY2) {\n\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) { return; }\n var sampleValues = new Float32Array(kSplineTableSize);\n\n if (mX1 !== mY1 || mX2 !== mY2) {\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n }\n\n function getTForX(aX) {\n\n var intervalStart = 0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n\n --currentSample;\n\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n var initialSlope = getSlope(guessForT, mX1, mX2);\n\n if (initialSlope >= 0.001) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n\n }\n\n return function (x) {\n if (mX1 === mY1 && mX2 === mY2) { return x; }\n if (x === 0 || x === 1) { return x; }\n return calcBezier(getTForX(x), mY1, mY2);\n }\n\n }\n\n return bezier;\n\n})();\n\nvar penner = (function () {\n\n // Based on jQuery UI's implemenation of easing equations from Robert Penner (http://www.robertpenner.com/easing)\n\n var eases = { linear: function () { return function (t) { return t; }; } };\n\n var functionEasings = {\n Sine: function () { return function (t) { return 1 - Math.cos(t * Math.PI / 2); }; },\n Expo: function () { return function (t) { return t ? Math.pow(2, 10 * t - 10) : 0; }; },\n Circ: function () { return function (t) { return 1 - Math.sqrt(1 - t * t); }; },\n Back: function () { return function (t) { return t * t * (3 * t - 2); }; },\n Bounce: function () { return function (t) {\n var pow2, b = 4;\n while (t < (( pow2 = Math.pow(2, --b)) - 1) / 11) {}\n return 1 / Math.pow(4, 3 - b) - 7.5625 * Math.pow(( pow2 * 3 - 2 ) / 22 - t, 2)\n }; },\n Elastic: function (amplitude, period) {\n if ( amplitude === void 0 ) amplitude = 1;\n if ( period === void 0 ) period = .5;\n\n var a = minMax(amplitude, 1, 10);\n var p = minMax(period, .1, 2);\n return function (t) {\n return (t === 0 || t === 1) ? t : \n -a * Math.pow(2, 10 * (t - 1)) * Math.sin((((t - 1) - (p / (Math.PI * 2) * Math.asin(1 / a))) * (Math.PI * 2)) / p);\n }\n }\n };\n\n var baseEasings = ['Quad', 'Cubic', 'Quart', 'Quint'];\n\n baseEasings.forEach(function (name, i) {\n functionEasings[name] = function () { return function (t) { return Math.pow(t, i + 2); }; };\n });\n\n Object.keys(functionEasings).forEach(function (name) {\n var easeIn = functionEasings[name];\n eases['easeIn' + name] = easeIn;\n eases['easeOut' + name] = function (a, b) { return function (t) { return 1 - easeIn(a, b)(1 - t); }; };\n eases['easeInOut' + name] = function (a, b) { return function (t) { return t < 0.5 ? easeIn(a, b)(t * 2) / 2 : \n 1 - easeIn(a, b)(t * -2 + 2) / 2; }; };\n eases['easeOutIn' + name] = function (a, b) { return function (t) { return t < 0.5 ? (1 - easeIn(a, b)(1 - t * 2)) / 2 : \n (easeIn(a, b)(t * 2 - 1) + 1) / 2; }; };\n });\n\n return eases;\n\n})();\n\nfunction parseEasings(easing, duration) {\n if (is.fnc(easing)) { return easing; }\n var name = easing.split('(')[0];\n var ease = penner[name];\n var args = parseEasingParameters(easing);\n switch (name) {\n case 'spring' : return spring(easing, duration);\n case 'cubicBezier' : return applyArguments(bezier, args);\n case 'steps' : return applyArguments(steps, args);\n default : return applyArguments(ease, args);\n }\n}\n\n// Strings\n\nfunction selectString(str) {\n try {\n var nodes = document.querySelectorAll(str);\n return nodes;\n } catch(e) {\n return;\n }\n}\n\n// Arrays\n\nfunction filterArray(arr, callback) {\n var len = arr.length;\n var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n var result = [];\n for (var i = 0; i < len; i++) {\n if (i in arr) {\n var val = arr[i];\n if (callback.call(thisArg, val, i, arr)) {\n result.push(val);\n }\n }\n }\n return result;\n}\n\nfunction flattenArray(arr) {\n return arr.reduce(function (a, b) { return a.concat(is.arr(b) ? flattenArray(b) : b); }, []);\n}\n\nfunction toArray(o) {\n if (is.arr(o)) { return o; }\n if (is.str(o)) { o = selectString(o) || o; }\n if (o instanceof NodeList || o instanceof HTMLCollection) { return [].slice.call(o); }\n return [o];\n}\n\nfunction arrayContains(arr, val) {\n return arr.some(function (a) { return a === val; });\n}\n\n// Objects\n\nfunction cloneObject(o) {\n var clone = {};\n for (var p in o) { clone[p] = o[p]; }\n return clone;\n}\n\nfunction replaceObjectProps(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o1) { o[p] = o2.hasOwnProperty(p) ? o2[p] : o1[p]; }\n return o;\n}\n\nfunction mergeObjects(o1, o2) {\n var o = cloneObject(o1);\n for (var p in o2) { o[p] = is.und(o1[p]) ? o2[p] : o1[p]; }\n return o;\n}\n\n// Colors\n\nfunction rgbToRgba(rgbValue) {\n var rgb = /rgb\\((\\d+,\\s*[\\d]+,\\s*[\\d]+)\\)/g.exec(rgbValue);\n return rgb ? (\"rgba(\" + (rgb[1]) + \",1)\") : rgbValue;\n}\n\nfunction hexToRgba(hexValue) {\n var rgx = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n var hex = hexValue.replace(rgx, function (m, r, g, b) { return r + r + g + g + b + b; } );\n var rgb = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n var r = parseInt(rgb[1], 16);\n var g = parseInt(rgb[2], 16);\n var b = parseInt(rgb[3], 16);\n return (\"rgba(\" + r + \",\" + g + \",\" + b + \",1)\");\n}\n\nfunction hslToRgba(hslValue) {\n var hsl = /hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(hslValue) || /hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(hslValue);\n var h = parseInt(hsl[1], 10) / 360;\n var s = parseInt(hsl[2], 10) / 100;\n var l = parseInt(hsl[3], 10) / 100;\n var a = hsl[4] || 1;\n function hue2rgb(p, q, t) {\n if (t < 0) { t += 1; }\n if (t > 1) { t -= 1; }\n if (t < 1/6) { return p + (q - p) * 6 * t; }\n if (t < 1/2) { return q; }\n if (t < 2/3) { return p + (q - p) * (2/3 - t) * 6; }\n return p;\n }\n var r, g, b;\n if (s == 0) {\n r = g = b = l;\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n return (\"rgba(\" + (r * 255) + \",\" + (g * 255) + \",\" + (b * 255) + \",\" + a + \")\");\n}\n\nfunction colorToRgb(val) {\n if (is.rgb(val)) { return rgbToRgba(val); }\n if (is.hex(val)) { return hexToRgba(val); }\n if (is.hsl(val)) { return hslToRgba(val); }\n}\n\n// Units\n\nfunction getUnit(val) {\n var split = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(val);\n if (split) { return split[1]; }\n}\n\nfunction getTransformUnit(propName) {\n if (stringContains(propName, 'translate') || propName === 'perspective') { return 'px'; }\n if (stringContains(propName, 'rotate') || stringContains(propName, 'skew')) { return 'deg'; }\n}\n\n// Values\n\nfunction getFunctionValue(val, animatable) {\n if (!is.fnc(val)) { return val; }\n return val(animatable.target, animatable.id, animatable.total);\n}\n\nfunction getAttribute(el, prop) {\n return el.getAttribute(prop);\n}\n\nfunction convertPxToUnit(el, value, unit) {\n var valueUnit = getUnit(value);\n if (arrayContains([unit, 'deg', 'rad', 'turn'], valueUnit)) { return value; }\n var cached = cache.CSS[value + unit];\n if (!is.und(cached)) { return cached; }\n var baseline = 100;\n var tempEl = document.createElement(el.tagName);\n var parentEl = (el.parentNode && (el.parentNode !== document)) ? el.parentNode : document.body;\n parentEl.appendChild(tempEl);\n tempEl.style.position = 'absolute';\n tempEl.style.width = baseline + unit;\n var factor = baseline / tempEl.offsetWidth;\n parentEl.removeChild(tempEl);\n var convertedUnit = factor * parseFloat(value);\n cache.CSS[value + unit] = convertedUnit;\n return convertedUnit;\n}\n\nfunction getCSSValue(el, prop, unit) {\n if (prop in el.style) {\n var uppercasePropName = prop.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n var value = el.style[prop] || getComputedStyle(el).getPropertyValue(uppercasePropName) || '0';\n return unit ? convertPxToUnit(el, value, unit) : value;\n }\n}\n\nfunction getAnimationType(el, prop) {\n if (is.dom(el) && !is.inp(el) && (!is.nil(getAttribute(el, prop)) || (is.svg(el) && el[prop]))) { return 'attribute'; }\n if (is.dom(el) && arrayContains(validTransforms, prop)) { return 'transform'; }\n if (is.dom(el) && (prop !== 'transform' && getCSSValue(el, prop))) { return 'css'; }\n if (el[prop] != null) { return 'object'; }\n}\n\nfunction getElementTransforms(el) {\n if (!is.dom(el)) { return; }\n var str = el.style.transform || '';\n var reg = /(\\w+)\\(([^)]*)\\)/g;\n var transforms = new Map();\n var m; while (m = reg.exec(str)) { transforms.set(m[1], m[2]); }\n return transforms;\n}\n\nfunction getTransformValue(el, propName, animatable, unit) {\n var defaultVal = stringContains(propName, 'scale') ? 1 : 0 + getTransformUnit(propName);\n var value = getElementTransforms(el).get(propName) || defaultVal;\n if (animatable) {\n animatable.transforms.list.set(propName, value);\n animatable.transforms['last'] = propName;\n }\n return unit ? convertPxToUnit(el, value, unit) : value;\n}\n\nfunction getOriginalTargetValue(target, propName, unit, animatable) {\n switch (getAnimationType(target, propName)) {\n case 'transform': return getTransformValue(target, propName, animatable, unit);\n case 'css': return getCSSValue(target, propName, unit);\n case 'attribute': return getAttribute(target, propName);\n default: return target[propName] || 0;\n }\n}\n\nfunction getRelativeValue(to, from) {\n var operator = /^(\\*=|\\+=|-=)/.exec(to);\n if (!operator) { return to; }\n var u = getUnit(to) || 0;\n var x = parseFloat(from);\n var y = parseFloat(to.replace(operator[0], ''));\n switch (operator[0][0]) {\n case '+': return x + y + u;\n case '-': return x - y + u;\n case '*': return x * y + u;\n }\n}\n\nfunction validateValue(val, unit) {\n if (is.col(val)) { return colorToRgb(val); }\n if (/\\s/g.test(val)) { return val; }\n var originalUnit = getUnit(val);\n var unitLess = originalUnit ? val.substr(0, val.length - originalUnit.length) : val;\n if (unit) { return unitLess + unit; }\n return unitLess;\n}\n\n// getTotalLength() equivalent for circle, rect, polyline, polygon and line shapes\n// adapted from https://gist.github.com/SebLambla/3e0550c496c236709744\n\nfunction getDistance(p1, p2) {\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n}\n\nfunction getCircleLength(el) {\n return Math.PI * 2 * getAttribute(el, 'r');\n}\n\nfunction getRectLength(el) {\n return (getAttribute(el, 'width') * 2) + (getAttribute(el, 'height') * 2);\n}\n\nfunction getLineLength(el) {\n return getDistance(\n {x: getAttribute(el, 'x1'), y: getAttribute(el, 'y1')}, \n {x: getAttribute(el, 'x2'), y: getAttribute(el, 'y2')}\n );\n}\n\nfunction getPolylineLength(el) {\n var points = el.points;\n var totalLength = 0;\n var previousPos;\n for (var i = 0 ; i < points.numberOfItems; i++) {\n var currentPos = points.getItem(i);\n if (i > 0) { totalLength += getDistance(previousPos, currentPos); }\n previousPos = currentPos;\n }\n return totalLength;\n}\n\nfunction getPolygonLength(el) {\n var points = el.points;\n return getPolylineLength(el) + getDistance(points.getItem(points.numberOfItems - 1), points.getItem(0));\n}\n\n// Path animation\n\nfunction getTotalLength(el) {\n if (el.getTotalLength) { return el.getTotalLength(); }\n switch(el.tagName.toLowerCase()) {\n case 'circle': return getCircleLength(el);\n case 'rect': return getRectLength(el);\n case 'line': return getLineLength(el);\n case 'polyline': return getPolylineLength(el);\n case 'polygon': return getPolygonLength(el);\n }\n}\n\nfunction setDashoffset(el) {\n var pathLength = getTotalLength(el);\n el.setAttribute('stroke-dasharray', pathLength);\n return pathLength;\n}\n\n// Motion path\n\nfunction getParentSvgEl(el) {\n var parentEl = el.parentNode;\n while (is.svg(parentEl)) {\n if (!is.svg(parentEl.parentNode)) { break; }\n parentEl = parentEl.parentNode;\n }\n return parentEl;\n}\n\nfunction getParentSvg(pathEl, svgData) {\n var svg = svgData || {};\n var parentSvgEl = svg.el || getParentSvgEl(pathEl);\n var rect = parentSvgEl.getBoundingClientRect();\n var viewBoxAttr = getAttribute(parentSvgEl, 'viewBox');\n var width = rect.width;\n var height = rect.height;\n var viewBox = svg.viewBox || (viewBoxAttr ? viewBoxAttr.split(' ') : [0, 0, width, height]);\n return {\n el: parentSvgEl,\n viewBox: viewBox,\n x: viewBox[0] / 1,\n y: viewBox[1] / 1,\n w: width,\n h: height,\n vW: viewBox[2],\n vH: viewBox[3]\n }\n}\n\nfunction getPath(path, percent) {\n var pathEl = is.str(path) ? selectString(path)[0] : path;\n var p = percent || 100;\n return function(property) {\n return {\n property: property,\n el: pathEl,\n svg: getParentSvg(pathEl),\n totalLength: getTotalLength(pathEl) * (p / 100)\n }\n }\n}\n\nfunction getPathProgress(path, progress, isPathTargetInsideSVG) {\n function point(offset) {\n if ( offset === void 0 ) offset = 0;\n\n var l = progress + offset >= 1 ? progress + offset : 0;\n return path.el.getPointAtLength(l);\n }\n var svg = getParentSvg(path.el, path.svg);\n var p = point();\n var p0 = point(-1);\n var p1 = point(+1);\n var scaleX = isPathTargetInsideSVG ? 1 : svg.w / svg.vW;\n var scaleY = isPathTargetInsideSVG ? 1 : svg.h / svg.vH;\n switch (path.property) {\n case 'x': return (p.x - svg.x) * scaleX;\n case 'y': return (p.y - svg.y) * scaleY;\n case 'angle': return Math.atan2(p1.y - p0.y, p1.x - p0.x) * 180 / Math.PI;\n }\n}\n\n// Decompose value\n\nfunction decomposeValue(val, unit) {\n // const rgx = /-?\\d*\\.?\\d+/g; // handles basic numbers\n // const rgx = /[+-]?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var rgx = /[+-]?\\d*\\.?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/g; // handles exponents notation\n var value = validateValue((is.pth(val) ? val.totalLength : val), unit) + '';\n return {\n original: value,\n numbers: value.match(rgx) ? value.match(rgx).map(Number) : [0],\n strings: (is.str(val) || unit) ? value.split(rgx) : []\n }\n}\n\n// Animatables\n\nfunction parseTargets(targets) {\n var targetsArray = targets ? (flattenArray(is.arr(targets) ? targets.map(toArray) : toArray(targets))) : [];\n return filterArray(targetsArray, function (item, pos, self) { return self.indexOf(item) === pos; });\n}\n\nfunction getAnimatables(targets) {\n var parsed = parseTargets(targets);\n return parsed.map(function (t, i) {\n return {target: t, id: i, total: parsed.length, transforms: { list: getElementTransforms(t) } };\n });\n}\n\n// Properties\n\nfunction normalizePropertyTweens(prop, tweenSettings) {\n var settings = cloneObject(tweenSettings);\n // Override duration if easing is a spring\n if (/^spring/.test(settings.easing)) { settings.duration = spring(settings.easing); }\n if (is.arr(prop)) {\n var l = prop.length;\n var isFromTo = (l === 2 && !is.obj(prop[0]));\n if (!isFromTo) {\n // Duration divided by the number of tweens\n if (!is.fnc(tweenSettings.duration)) { settings.duration = tweenSettings.duration / l; }\n } else {\n // Transform [from, to] values shorthand to a valid tween value\n prop = {value: prop};\n }\n }\n var propArray = is.arr(prop) ? prop : [prop];\n return propArray.map(function (v, i) {\n var obj = (is.obj(v) && !is.pth(v)) ? v : {value: v};\n // Default delay value should only be applied to the first tween\n if (is.und(obj.delay)) { obj.delay = !i ? tweenSettings.delay : 0; }\n // Default endDelay value should only be applied to the last tween\n if (is.und(obj.endDelay)) { obj.endDelay = i === propArray.length - 1 ? tweenSettings.endDelay : 0; }\n return obj;\n }).map(function (k) { return mergeObjects(k, settings); });\n}\n\n\nfunction flattenKeyframes(keyframes) {\n var propertyNames = filterArray(flattenArray(keyframes.map(function (key) { return Object.keys(key); })), function (p) { return is.key(p); })\n .reduce(function (a,b) { if (a.indexOf(b) < 0) { a.push(b); } return a; }, []);\n var properties = {};\n var loop = function ( i ) {\n var propName = propertyNames[i];\n properties[propName] = keyframes.map(function (key) {\n var newKey = {};\n for (var p in key) {\n if (is.key(p)) {\n if (p == propName) { newKey.value = key[p]; }\n } else {\n newKey[p] = key[p];\n }\n }\n return newKey;\n });\n };\n\n for (var i = 0; i < propertyNames.length; i++) loop( i );\n return properties;\n}\n\nfunction getProperties(tweenSettings, params) {\n var properties = [];\n var keyframes = params.keyframes;\n if (keyframes) { params = mergeObjects(flattenKeyframes(keyframes), params); }\n for (var p in params) {\n if (is.key(p)) {\n properties.push({\n name: p,\n tweens: normalizePropertyTweens(params[p], tweenSettings)\n });\n }\n }\n return properties;\n}\n\n// Tweens\n\nfunction normalizeTweenValues(tween, animatable) {\n var t = {};\n for (var p in tween) {\n var value = getFunctionValue(tween[p], animatable);\n if (is.arr(value)) {\n value = value.map(function (v) { return getFunctionValue(v, animatable); });\n if (value.length === 1) { value = value[0]; }\n }\n t[p] = value;\n }\n t.duration = parseFloat(t.duration);\n t.delay = parseFloat(t.delay);\n return t;\n}\n\nfunction normalizeTweens(prop, animatable) {\n var previousTween;\n return prop.tweens.map(function (t) {\n var tween = normalizeTweenValues(t, animatable);\n var tweenValue = tween.value;\n var to = is.arr(tweenValue) ? tweenValue[1] : tweenValue;\n var toUnit = getUnit(to);\n var originalValue = getOriginalTargetValue(animatable.target, prop.name, toUnit, animatable);\n var previousValue = previousTween ? previousTween.to.original : originalValue;\n var from = is.arr(tweenValue) ? tweenValue[0] : previousValue;\n var fromUnit = getUnit(from) || getUnit(originalValue);\n var unit = toUnit || fromUnit;\n if (is.und(to)) { to = previousValue; }\n tween.from = decomposeValue(from, unit);\n tween.to = decomposeValue(getRelativeValue(to, from), unit);\n tween.start = previousTween ? previousTween.end : 0;\n tween.end = tween.start + tween.delay + tween.duration + tween.endDelay;\n tween.easing = parseEasings(tween.easing, tween.duration);\n tween.isPath = is.pth(tweenValue);\n tween.isPathTargetInsideSVG = tween.isPath && is.svg(animatable.target);\n tween.isColor = is.col(tween.from.original);\n if (tween.isColor) { tween.round = 1; }\n previousTween = tween;\n return tween;\n });\n}\n\n// Tween progress\n\nvar setProgressValue = {\n css: function (t, p, v) { return t.style[p] = v; },\n attribute: function (t, p, v) { return t.setAttribute(p, v); },\n object: function (t, p, v) { return t[p] = v; },\n transform: function (t, p, v, transforms, manual) {\n transforms.list.set(p, v);\n if (p === transforms.last || manual) {\n var str = '';\n transforms.list.forEach(function (value, prop) { str += prop + \"(\" + value + \") \"; });\n t.style.transform = str;\n }\n }\n};\n\n// Set Value helper\n\nfunction setTargetsValue(targets, properties) {\n var animatables = getAnimatables(targets);\n animatables.forEach(function (animatable) {\n for (var property in properties) {\n var value = getFunctionValue(properties[property], animatable);\n var target = animatable.target;\n var valueUnit = getUnit(value);\n var originalValue = getOriginalTargetValue(target, property, valueUnit, animatable);\n var unit = valueUnit || getUnit(originalValue);\n var to = getRelativeValue(validateValue(value, unit), originalValue);\n var animType = getAnimationType(target, property);\n setProgressValue[animType](target, property, to, animatable.transforms, true);\n }\n });\n}\n\n// Animations\n\nfunction createAnimation(animatable, prop) {\n var animType = getAnimationType(animatable.target, prop.name);\n if (animType) {\n var tweens = normalizeTweens(prop, animatable);\n var lastTween = tweens[tweens.length - 1];\n return {\n type: animType,\n property: prop.name,\n animatable: animatable,\n tweens: tweens,\n duration: lastTween.end,\n delay: tweens[0].delay,\n endDelay: lastTween.endDelay\n }\n }\n}\n\nfunction getAnimations(animatables, properties) {\n return filterArray(flattenArray(animatables.map(function (animatable) {\n return properties.map(function (prop) {\n return createAnimation(animatable, prop);\n });\n })), function (a) { return !is.und(a); });\n}\n\n// Create Instance\n\nfunction getInstanceTimings(animations, tweenSettings) {\n var animLength = animations.length;\n var getTlOffset = function (anim) { return anim.timelineOffset ? anim.timelineOffset : 0; };\n var timings = {};\n timings.duration = animLength ? Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration; })) : tweenSettings.duration;\n timings.delay = animLength ? Math.min.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.delay; })) : tweenSettings.delay;\n timings.endDelay = animLength ? timings.duration - Math.max.apply(Math, animations.map(function (anim) { return getTlOffset(anim) + anim.duration - anim.endDelay; })) : tweenSettings.endDelay;\n return timings;\n}\n\nvar instanceID = 0;\n\nfunction createNewInstance(params) {\n var instanceSettings = replaceObjectProps(defaultInstanceSettings, params);\n var tweenSettings = replaceObjectProps(defaultTweenSettings, params);\n var properties = getProperties(tweenSettings, params);\n var animatables = getAnimatables(params.targets);\n var animations = getAnimations(animatables, properties);\n var timings = getInstanceTimings(animations, tweenSettings);\n var id = instanceID;\n instanceID++;\n return mergeObjects(instanceSettings, {\n id: id,\n children: [],\n animatables: animatables,\n animations: animations,\n duration: timings.duration,\n delay: timings.delay,\n endDelay: timings.endDelay\n });\n}\n\n// Core\n\nvar activeInstances = [];\n\nvar engine = (function () {\n var raf;\n\n function play() {\n if (!raf && (!isDocumentHidden() || !anime.suspendWhenDocumentHidden) && activeInstances.length > 0) {\n raf = requestAnimationFrame(step);\n }\n }\n function step(t) {\n // memo on algorithm issue:\n // dangerous iteration over mutable `activeInstances`\n // (that collection may be updated from within callbacks of `tick`-ed animation instances)\n var activeInstancesLength = activeInstances.length;\n var i = 0;\n while (i < activeInstancesLength) {\n var activeInstance = activeInstances[i];\n if (!activeInstance.paused) {\n activeInstance.tick(t);\n i++;\n } else {\n activeInstances.splice(i, 1);\n activeInstancesLength--;\n }\n }\n raf = i > 0 ? requestAnimationFrame(step) : undefined;\n }\n\n function handleVisibilityChange() {\n if (!anime.suspendWhenDocumentHidden) { return; }\n\n if (isDocumentHidden()) {\n // suspend ticks\n raf = cancelAnimationFrame(raf);\n } else { // is back to active tab\n // first adjust animations to consider the time that ticks were suspended\n activeInstances.forEach(\n function (instance) { return instance ._onDocumentVisibility(); }\n );\n engine();\n }\n }\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n }\n\n return play;\n})();\n\nfunction isDocumentHidden() {\n return !!document && document.hidden;\n}\n\n// Public Instance\n\nfunction anime(params) {\n if ( params === void 0 ) params = {};\n\n\n var startTime = 0, lastTime = 0, now = 0;\n var children, childrenLength = 0;\n var resolve = null;\n\n function makePromise(instance) {\n var promise = window.Promise && new Promise(function (_resolve) { return resolve = _resolve; });\n instance.finished = promise;\n return promise;\n }\n\n var instance = createNewInstance(params);\n var promise = makePromise(instance);\n\n function toggleInstanceDirection() {\n var direction = instance.direction;\n if (direction !== 'alternate') {\n instance.direction = direction !== 'normal' ? 'normal' : 'reverse';\n }\n instance.reversed = !instance.reversed;\n children.forEach(function (child) { return child.reversed = instance.reversed; });\n }\n\n function adjustTime(time) {\n return instance.reversed ? instance.duration - time : time;\n }\n\n function resetTime() {\n startTime = 0;\n lastTime = adjustTime(instance.currentTime) * (1 / anime.speed);\n }\n\n function seekChild(time, child) {\n if (child) { child.seek(time - child.timelineOffset); }\n }\n\n function syncInstanceChildren(time) {\n if (!instance.reversePlayback) {\n for (var i = 0; i < childrenLength; i++) { seekChild(time, children[i]); }\n } else {\n for (var i$1 = childrenLength; i$1--;) { seekChild(time, children[i$1]); }\n }\n }\n\n function setAnimationsProgress(insTime) {\n var i = 0;\n var animations = instance.animations;\n var animationsLength = animations.length;\n while (i < animationsLength) {\n var anim = animations[i];\n var animatable = anim.animatable;\n var tweens = anim.tweens;\n var tweenLength = tweens.length - 1;\n var tween = tweens[tweenLength];\n // Only check for keyframes if there is more than one tween\n if (tweenLength) { tween = filterArray(tweens, function (t) { return (insTime < t.end); })[0] || tween; }\n var elapsed = minMax(insTime - tween.start - tween.delay, 0, tween.duration) / tween.duration;\n var eased = isNaN(elapsed) ? 1 : tween.easing(elapsed);\n var strings = tween.to.strings;\n var round = tween.round;\n var numbers = [];\n var toNumbersLength = tween.to.numbers.length;\n var progress = (void 0);\n for (var n = 0; n < toNumbersLength; n++) {\n var value = (void 0);\n var toNumber = tween.to.numbers[n];\n var fromNumber = tween.from.numbers[n] || 0;\n if (!tween.isPath) {\n value = fromNumber + (eased * (toNumber - fromNumber));\n } else {\n value = getPathProgress(tween.value, eased * toNumber, tween.isPathTargetInsideSVG);\n }\n if (round) {\n if (!(tween.isColor && n > 2)) {\n value = Math.round(value * round) / round;\n }\n }\n numbers.push(value);\n }\n // Manual Array.reduce for better performances\n var stringsLength = strings.length;\n if (!stringsLength) {\n progress = numbers[0];\n } else {\n progress = strings[0];\n for (var s = 0; s < stringsLength; s++) {\n var a = strings[s];\n var b = strings[s + 1];\n var n$1 = numbers[s];\n if (!isNaN(n$1)) {\n if (!b) {\n progress += n$1 + ' ';\n } else {\n progress += n$1 + b;\n }\n }\n }\n }\n setProgressValue[anim.type](animatable.target, anim.property, progress, animatable.transforms);\n anim.currentValue = progress;\n i++;\n }\n }\n\n function setCallback(cb) {\n if (instance[cb] && !instance.passThrough) { instance[cb](instance); }\n }\n\n function countIteration() {\n if (instance.remaining && instance.remaining !== true) {\n instance.remaining--;\n }\n }\n\n function setInstanceProgress(engineTime) {\n var insDuration = instance.duration;\n var insDelay = instance.delay;\n var insEndDelay = insDuration - instance.endDelay;\n var insTime = adjustTime(engineTime);\n instance.progress = minMax((insTime / insDuration) * 100, 0, 100);\n instance.reversePlayback = insTime < instance.currentTime;\n if (children) { syncInstanceChildren(insTime); }\n if (!instance.began && instance.currentTime > 0) {\n instance.began = true;\n setCallback('begin');\n }\n if (!instance.loopBegan && instance.currentTime > 0) {\n instance.loopBegan = true;\n setCallback('loopBegin');\n }\n if (insTime <= insDelay && instance.currentTime !== 0) {\n setAnimationsProgress(0);\n }\n if ((insTime >= insEndDelay && instance.currentTime !== insDuration) || !insDuration) {\n setAnimationsProgress(insDuration);\n }\n if (insTime > insDelay && insTime < insEndDelay) {\n if (!instance.changeBegan) {\n instance.changeBegan = true;\n instance.changeCompleted = false;\n setCallback('changeBegin');\n }\n setCallback('change');\n setAnimationsProgress(insTime);\n } else {\n if (instance.changeBegan) {\n instance.changeCompleted = true;\n instance.changeBegan = false;\n setCallback('changeComplete');\n }\n }\n instance.currentTime = minMax(insTime, 0, insDuration);\n if (instance.began) { setCallback('update'); }\n if (engineTime >= insDuration) {\n lastTime = 0;\n countIteration();\n if (!instance.remaining) {\n instance.paused = true;\n if (!instance.completed) {\n instance.completed = true;\n setCallback('loopComplete');\n setCallback('complete');\n if (!instance.passThrough && 'Promise' in window) {\n resolve();\n promise = makePromise(instance);\n }\n }\n } else {\n startTime = now;\n setCallback('loopComplete');\n instance.loopBegan = false;\n if (instance.direction === 'alternate') {\n toggleInstanceDirection();\n }\n }\n }\n }\n\n instance.reset = function() {\n var direction = instance.direction;\n instance.passThrough = false;\n instance.currentTime = 0;\n instance.progress = 0;\n instance.paused = true;\n instance.began = false;\n instance.loopBegan = false;\n instance.changeBegan = false;\n instance.completed = false;\n instance.changeCompleted = false;\n instance.reversePlayback = false;\n instance.reversed = direction === 'reverse';\n instance.remaining = instance.loop;\n children = instance.children;\n childrenLength = children.length;\n for (var i = childrenLength; i--;) { instance.children[i].reset(); }\n if (instance.reversed && instance.loop !== true || (direction === 'alternate' && instance.loop === 1)) { instance.remaining++; }\n setAnimationsProgress(instance.reversed ? instance.duration : 0);\n };\n\n // internal method (for engine) to adjust animation timings before restoring engine ticks (rAF)\n instance._onDocumentVisibility = resetTime;\n\n // Set Value helper\n\n instance.set = function(targets, properties) {\n setTargetsValue(targets, properties);\n return instance;\n };\n\n instance.tick = function(t) {\n now = t;\n if (!startTime) { startTime = now; }\n setInstanceProgress((now + (lastTime - startTime)) * anime.speed);\n };\n\n instance.seek = function(time) {\n setInstanceProgress(adjustTime(time));\n };\n\n instance.pause = function() {\n instance.paused = true;\n resetTime();\n };\n\n instance.play = function() {\n if (!instance.paused) { return; }\n if (instance.completed) { instance.reset(); }\n instance.paused = false;\n activeInstances.push(instance);\n resetTime();\n engine();\n };\n\n instance.reverse = function() {\n toggleInstanceDirection();\n instance.completed = instance.reversed ? false : true;\n resetTime();\n };\n\n instance.restart = function() {\n instance.reset();\n instance.play();\n };\n\n instance.remove = function(targets) {\n var targetsArray = parseTargets(targets);\n removeTargetsFromInstance(targetsArray, instance);\n };\n\n instance.reset();\n\n if (instance.autoplay) { instance.play(); }\n\n return instance;\n\n}\n\n// Remove targets from animation\n\nfunction removeTargetsFromAnimations(targetsArray, animations) {\n for (var a = animations.length; a--;) {\n if (arrayContains(targetsArray, animations[a].animatable.target)) {\n animations.splice(a, 1);\n }\n }\n}\n\nfunction removeTargetsFromInstance(targetsArray, instance) {\n var animations = instance.animations;\n var children = instance.children;\n removeTargetsFromAnimations(targetsArray, animations);\n for (var c = children.length; c--;) {\n var child = children[c];\n var childAnimations = child.animations;\n removeTargetsFromAnimations(targetsArray, childAnimations);\n if (!childAnimations.length && !child.children.length) { children.splice(c, 1); }\n }\n if (!animations.length && !children.length) { instance.pause(); }\n}\n\nfunction removeTargetsFromActiveInstances(targets) {\n var targetsArray = parseTargets(targets);\n for (var i = activeInstances.length; i--;) {\n var instance = activeInstances[i];\n removeTargetsFromInstance(targetsArray, instance);\n }\n}\n\n// Stagger helpers\n\nfunction stagger(val, params) {\n if ( params === void 0 ) params = {};\n\n var direction = params.direction || 'normal';\n var easing = params.easing ? parseEasings(params.easing) : null;\n var grid = params.grid;\n var axis = params.axis;\n var fromIndex = params.from || 0;\n var fromFirst = fromIndex === 'first';\n var fromCenter = fromIndex === 'center';\n var fromLast = fromIndex === 'last';\n var isRange = is.arr(val);\n var val1 = isRange ? parseFloat(val[0]) : parseFloat(val);\n var val2 = isRange ? parseFloat(val[1]) : 0;\n var unit = getUnit(isRange ? val[1] : val) || 0;\n var start = params.start || 0 + (isRange ? val1 : 0);\n var values = [];\n var maxValue = 0;\n return function (el, i, t) {\n if (fromFirst) { fromIndex = 0; }\n if (fromCenter) { fromIndex = (t - 1) / 2; }\n if (fromLast) { fromIndex = t - 1; }\n if (!values.length) {\n for (var index = 0; index < t; index++) {\n if (!grid) {\n values.push(Math.abs(fromIndex - index));\n } else {\n var fromX = !fromCenter ? fromIndex%grid[0] : (grid[0]-1)/2;\n var fromY = !fromCenter ? Math.floor(fromIndex/grid[0]) : (grid[1]-1)/2;\n var toX = index%grid[0];\n var toY = Math.floor(index/grid[0]);\n var distanceX = fromX - toX;\n var distanceY = fromY - toY;\n var value = Math.sqrt(distanceX * distanceX + distanceY * distanceY);\n if (axis === 'x') { value = -distanceX; }\n if (axis === 'y') { value = -distanceY; }\n values.push(value);\n }\n maxValue = Math.max.apply(Math, values);\n }\n if (easing) { values = values.map(function (val) { return easing(val / maxValue) * maxValue; }); }\n if (direction === 'reverse') { values = values.map(function (val) { return axis ? (val < 0) ? val * -1 : -val : Math.abs(maxValue - val); }); }\n }\n var spacing = isRange ? (val2 - val1) / maxValue : val1;\n return start + (spacing * (Math.round(values[i] * 100) / 100)) + unit;\n }\n}\n\n// Timeline\n\nfunction timeline(params) {\n if ( params === void 0 ) params = {};\n\n var tl = anime(params);\n tl.duration = 0;\n tl.add = function(instanceParams, timelineOffset) {\n var tlIndex = activeInstances.indexOf(tl);\n var children = tl.children;\n if (tlIndex > -1) { activeInstances.splice(tlIndex, 1); }\n function passThrough(ins) { ins.passThrough = true; }\n for (var i = 0; i < children.length; i++) { passThrough(children[i]); }\n var insParams = mergeObjects(instanceParams, replaceObjectProps(defaultTweenSettings, params));\n insParams.targets = insParams.targets || params.targets;\n var tlDuration = tl.duration;\n insParams.autoplay = false;\n insParams.direction = tl.direction;\n insParams.timelineOffset = is.und(timelineOffset) ? tlDuration : getRelativeValue(timelineOffset, tlDuration);\n passThrough(tl);\n tl.seek(insParams.timelineOffset);\n var ins = anime(insParams);\n passThrough(ins);\n children.push(ins);\n var timings = getInstanceTimings(children, params);\n tl.delay = timings.delay;\n tl.endDelay = timings.endDelay;\n tl.duration = timings.duration;\n tl.seek(0);\n tl.reset();\n if (tl.autoplay) { tl.play(); }\n return tl;\n };\n return tl;\n}\n\nanime.version = '3.2.1';\nanime.speed = 1;\n// TODO:#review: naming, documentation\nanime.suspendWhenDocumentHidden = true;\nanime.running = activeInstances;\nanime.remove = removeTargetsFromActiveInstances;\nanime.get = getOriginalTargetValue;\nanime.set = setTargetsValue;\nanime.convertPx = convertPxToUnit;\nanime.path = getPath;\nanime.setDashoffset = setDashoffset;\nanime.stagger = stagger;\nanime.timeline = timeline;\nanime.easing = parseEasings;\nanime.penner = penner;\nanime.random = function (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; };\n\nexport default anime;\n","/**\r\n * VectorFlow — Player\r\n * Animation playback using anime.js, with cancel/interrupt support.\r\n */\r\n\r\nimport anime from 'animejs/lib/anime.es.js';\r\nimport { readSnapshot, lerpColor, parseTransform, buildTransform, lerp } from './utils.js';\r\n\r\n/**\r\n * Animate a single step: transition all live parts to target state.\r\n * Returns a Promise that resolves when the animation completes.\r\n *\r\n * @param {Map<string, Element>} liveParts — partName → live element\r\n * @param {Map<string, object>} targetSnapshots — partName → snapshot for target state\r\n * @param {number} ms — animation duration\r\n * @param {AbortSignal} signal — for cancellation\r\n * @returns {Promise<void>}\r\n */\r\nexport function playStep(liveParts, targetSnapshots, ms, signal) {\r\n return new Promise((resolve, reject) => {\r\n if (signal?.aborted) {\r\n reject(new DOMException('Aborted', 'AbortError'));\r\n return;\r\n }\r\n\r\n const animations = [];\r\n let completedCount = 0;\r\n const totalParts = liveParts.size;\r\n\r\n if (totalParts === 0) {\r\n resolve();\r\n return;\r\n }\r\n\r\n for (const [partName, liveEl] of liveParts) {\r\n const targetSnap = targetSnapshots.get(partName);\r\n if (!targetSnap) continue;\r\n\r\n // Read current snapshot from the live element\r\n const currentSnap = readSnapshot(liveEl);\r\n\r\n // Build anime.js animation targets\r\n const animeConfig = {\r\n targets: liveEl,\r\n duration: ms,\r\n easing: 'linear',\r\n complete: () => {\r\n completedCount++;\r\n if (completedCount >= totalParts) {\r\n resolve();\r\n }\r\n },\r\n };\r\n\r\n // Animate numeric attributes\r\n for (const [attr, targetVal] of Object.entries(targetSnap.numericAttrs)) {\r\n const currentVal = currentSnap.numericAttrs[attr] ?? targetVal;\r\n if (currentVal !== targetVal) {\r\n animeConfig[attr] = targetVal;\r\n }\r\n }\r\n\r\n // Animate colors using update callback\r\n const colorAnimations = [];\r\n for (const [prop, targetColor] of Object.entries(targetSnap.colors)) {\r\n const currentColor = currentSnap.colors[prop];\r\n if (currentColor && currentColor !== targetColor) {\r\n colorAnimations.push({ prop, from: currentColor, to: targetColor });\r\n } else if (!currentColor && targetColor) {\r\n // Set directly if no current\r\n liveEl.style.setProperty(prop, targetColor);\r\n }\r\n }\r\n\r\n // Animate transform\r\n let transformAnim = null;\r\n if (targetSnap.transform || currentSnap.transform) {\r\n const fromT = parseTransform(currentSnap.transform);\r\n const toT = parseTransform(targetSnap.transform);\r\n if (JSON.stringify(fromT) !== JSON.stringify(toT)) {\r\n transformAnim = { from: fromT, to: toT };\r\n }\r\n }\r\n\r\n // If we have color or transform animations, use the update callback\r\n if (colorAnimations.length > 0 || transformAnim) {\r\n const progressObj = { t: 0 };\r\n const colorTransformAnim = anime({\r\n targets: progressObj,\r\n t: 1,\r\n duration: ms,\r\n easing: 'linear',\r\n update: () => {\r\n const t = progressObj.t;\r\n // Colors\r\n for (const { prop, from, to } of colorAnimations) {\r\n const interpolated = lerpColor(from, to, t);\r\n liveEl.style.setProperty(prop, interpolated);\r\n }\r\n // Transform\r\n if (transformAnim) {\r\n const { from, to } = transformAnim;\r\n const interpolated = {\r\n translateX: lerp(from.translateX, to.translateX, t),\r\n translateY: lerp(from.translateY, to.translateY, t),\r\n scaleX: lerp(from.scaleX, to.scaleX, t),\r\n scaleY: lerp(from.scaleY, to.scaleY, t),\r\n rotate: lerp(from.rotate, to.rotate, t),\r\n };\r\n const transformStr = buildTransform(interpolated);\r\n if (transformStr) {\r\n liveEl.setAttribute('transform', transformStr);\r\n } else {\r\n liveEl.removeAttribute('transform');\r\n }\r\n }\r\n },\r\n });\r\n animations.push(colorTransformAnim);\r\n }\r\n\r\n // Create the main numeric attributes animation\r\n const hasNumericChanges = Object.keys(animeConfig).some(\r\n k => !['targets', 'duration', 'easing', 'complete'].includes(k)\r\n );\r\n\r\n if (hasNumericChanges) {\r\n const anim = anime(animeConfig);\r\n animations.push(anim);\r\n } else {\r\n // If no numeric changes, still count this part as complete\r\n animeConfig.complete();\r\n }\r\n }\r\n\r\n // Handle abort\r\n const onAbort = () => {\r\n for (const anim of animations) {\r\n anime.remove(anim.targets || anim);\r\n if (anim.pause) anim.pause();\r\n }\r\n reject(new DOMException('Aborted', 'AbortError'));\r\n };\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', onAbort, { once: true });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Play a sequence of steps.\r\n *\r\n * @param {Array<{state: string, ms: number}>} steps\r\n * @param {Map<string, Element>} liveParts\r\n * @param {Map<string, Map<string, object>>} stateSnapshots — stateName → partName → snapshot\r\n * @param {AbortSignal} signal\r\n * @param {function(string)} onStateChange — callback when a step completes\r\n * @returns {Promise<string>} — resolves with the final state\r\n */\r\nexport async function playSteps(steps, liveParts, stateSnapshots, signal, onStateChange) {\r\n let lastState = null;\r\n\r\n for (const step of steps) {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n const targetSnapshots = stateSnapshots.get(step.state);\r\n if (!targetSnapshots) {\r\n throw new Error(`VectorFlow: No snapshots for state \"${step.state}\"`);\r\n }\r\n\r\n await playStep(liveParts, targetSnapshots, step.ms, signal);\r\n lastState = step.state;\r\n\r\n if (onStateChange) {\r\n onStateChange(step.state);\r\n }\r\n }\r\n\r\n return lastState;\r\n}\r\n\r\n/**\r\n * Run a full action (sequence or loop).\r\n *\r\n * @param {object} action — normalized action object\r\n * @param {string} currentState\r\n * @param {object} routes\r\n * @param {number} jsonMs\r\n * @param {Set<string>} validStates\r\n * @param {Map<string, Element>} liveParts\r\n * @param {Map<string, Map<string, object>>} stateSnapshots\r\n * @param {AbortSignal} signal\r\n * @param {function(string)} onStateChange\r\n * @param {object} expandFns — { expandSequence, expandDirect } from engine\r\n * @returns {Promise<string>} — final state\r\n */\r\nexport async function runAction(\r\n action, currentState, routes, jsonMs, validStates,\r\n liveParts, stateSnapshots, signal, onStateChange, expandFns\r\n) {\r\n const { expandSequence, expandDirect } = expandFns;\r\n\r\n if (action.type === 'loop') {\r\n const count = action.count || 99999;\r\n let current = currentState;\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n let result;\r\n if (action.mode === 'direct') {\r\n result = expandDirect(action.order, current, routes, action.ms, jsonMs, validStates);\r\n } else {\r\n result = expandSequence(action.order, current, routes, action.ms, jsonMs, validStates);\r\n }\r\n\r\n if (result.steps.length > 0) {\r\n const finalState = await playSteps(\r\n result.steps, liveParts, stateSnapshots, signal, onStateChange\r\n );\r\n current = finalState || current;\r\n }\r\n }\r\n\r\n return current;\r\n } else {\r\n // sequence (default)\r\n const result = expandSequence(\r\n action.order, currentState, routes, action.ms, jsonMs, validStates\r\n );\r\n\r\n if (result.steps.length > 0) {\r\n const finalState = await playSteps(\r\n result.steps, liveParts, stateSnapshots, signal, onStateChange\r\n );\r\n return finalState || currentState;\r\n }\r\n\r\n return currentState;\r\n }\r\n}\r\n","/**\r\n * VectorFlow — Main entry point\r\n * Public API: VectorFlow class.\r\n */\r\n\r\nimport {\r\n parseAndValidateJSON,\r\n discoverStates,\r\n discoverParts,\r\n setupLiveCharacter,\r\n buildStateSnapshots,\r\n} from './parser.js';\r\n\r\nimport {\r\n expandSequence,\r\n expandDirect,\r\n} from './engine.js';\r\n\r\nimport { runAction } from './player.js';\r\n\r\n/**\r\n * VectorFlow — A JSON-driven SVG pose animation runner.\r\n *\r\n * Usage:\r\n * const vf = new VectorFlow({ svgElement, json });\r\n * vf.play('shuffle');\r\n * vf.stop();\r\n * vf.on('stateChange', (state) => console.log(state));\r\n */\r\nclass VectorFlow {\r\n /**\r\n * @param {object} options\r\n * @param {SVGElement|string} options.svgElement — An SVG DOM element or an SVG string\r\n * @param {object|string} options.json — A VectorFlow JSON config (object or string)\r\n */\r\n constructor({ svgElement, json }) {\r\n // Event listeners\r\n this._listeners = {\r\n stateChange: [],\r\n actionStart: [],\r\n actionEnd: [],\r\n error: [],\r\n };\r\n\r\n // Current abort controller for cancellation\r\n this._abortController = null;\r\n this._currentActionName = null;\r\n\r\n // Parse JSON\r\n this._config = parseAndValidateJSON(json);\r\n\r\n // Resolve SVG element\r\n if (typeof svgElement === 'string') {\r\n const container = document.createElement('div');\r\n container.innerHTML = svgElement.trim();\r\n this._svgElement = container.querySelector('svg');\r\n if (!this._svgElement) {\r\n throw new Error('VectorFlow: Provided SVG string does not contain an <svg> element.');\r\n }\r\n } else if (svgElement instanceof SVGElement) {\r\n this._svgElement = svgElement;\r\n } else {\r\n throw new Error('VectorFlow: svgElement must be an SVG DOM element or an SVG string.');\r\n }\r\n\r\n // Discover states and parts\r\n this._stateMap = discoverStates(this._svgElement);\r\n this._stateParts = discoverParts(this._stateMap);\r\n this._validStates = new Set(this._stateMap.keys());\r\n\r\n // Validate initial_state exists\r\n if (!this._validStates.has(this._config.initial_state)) {\r\n const available = Array.from(this._validStates).join(', ');\r\n throw new Error(\r\n `VectorFlow: initial_state \"${this._config.initial_state}\" not found in SVG. Available states: ${available}`\r\n );\r\n }\r\n\r\n // Build snapshots from original state groups (before hiding)\r\n this._stateSnapshots = buildStateSnapshots(this._stateParts);\r\n\r\n // Set up live character\r\n const { liveGroup, liveParts } = setupLiveCharacter(\r\n this._svgElement, this._stateMap, this._config.initial_state\r\n );\r\n this._liveGroup = liveGroup;\r\n this._liveParts = liveParts;\r\n\r\n // Track current state\r\n this._currentState = this._config.initial_state;\r\n }\r\n\r\n // ---- Public API: Properties ----\r\n\r\n /** Get all discovered state names. */\r\n get states() {\r\n return Array.from(this._validStates);\r\n }\r\n\r\n /** Get the current state name. */\r\n get currentState() {\r\n return this._currentState;\r\n }\r\n\r\n /** Get the actions config object. */\r\n get actions() {\r\n return { ...this._config.actions };\r\n }\r\n\r\n /** Get the SVG element being animated. */\r\n get svgElement() {\r\n return this._svgElement;\r\n }\r\n\r\n /** Whether an action is currently playing. */\r\n get isPlaying() {\r\n return this._abortController !== null && !this._abortController.signal.aborted;\r\n }\r\n\r\n /** Name of the currently playing action (null if none). */\r\n get currentAction() {\r\n return this._currentActionName;\r\n }\r\n\r\n // ---- Public API: Methods ----\r\n\r\n /**\r\n * Play a named action. Cancels any currently playing action.\r\n * @param {string} actionName\r\n * @returns {Promise<void>}\r\n */\r\n async play(actionName) {\r\n const action = this._config.actions[actionName];\r\n if (!action) {\r\n const err = new Error(`VectorFlow: Unknown action \"${actionName}\"`);\r\n this._emit('error', err);\r\n throw err;\r\n }\r\n\r\n if (action.order.length === 0) {\r\n console.warn(`VectorFlow: Action \"${actionName}\" has empty order — no-op.`);\r\n return;\r\n }\r\n\r\n // Cancel any running action\r\n this.stop();\r\n\r\n // New abort controller\r\n this._abortController = new AbortController();\r\n this._currentActionName = actionName;\r\n this._emit('actionStart', actionName);\r\n\r\n try {\r\n const finalState = await runAction(\r\n action,\r\n this._currentState,\r\n this._config.routes,\r\n this._config.ms,\r\n this._validStates,\r\n this._liveParts,\r\n this._stateSnapshots,\r\n this._abortController.signal,\r\n (state) => {\r\n this._currentState = state;\r\n this._emit('stateChange', state);\r\n },\r\n { expandSequence, expandDirect }\r\n );\r\n\r\n if (finalState) {\r\n this._currentState = finalState;\r\n }\r\n\r\n this._currentActionName = null;\r\n this._emit('actionEnd', actionName);\r\n } catch (err) {\r\n if (err.name === 'AbortError') {\r\n // Cancelled — not an error\r\n return;\r\n }\r\n this._currentActionName = null;\r\n this._emit('error', err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Stop/cancel any currently playing action.\r\n */\r\n stop() {\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n this._abortController = null;\r\n if (this._currentActionName) {\r\n const name = this._currentActionName;\r\n this._currentActionName = null;\r\n this._emit('actionEnd', name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Register an event listener.\r\n * @param {'stateChange'|'actionStart'|'actionEnd'|'error'} event\r\n * @param {function} callback\r\n */\r\n on(event, callback) {\r\n if (!this._listeners[event]) {\r\n this._listeners[event] = [];\r\n }\r\n this._listeners[event].push(callback);\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an event listener.\r\n * @param {string} event\r\n * @param {function} callback\r\n */\r\n off(event, callback) {\r\n if (this._listeners[event]) {\r\n this._listeners[event] = this._listeners[event].filter(cb => cb !== callback);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Clean up: stop playback, restore SVG state groups, remove live character.\r\n */\r\n destroy() {\r\n this.stop();\r\n\r\n // Show original state groups again\r\n if (this._stateMap) {\r\n for (const [, groupEl] of this._stateMap) {\r\n groupEl.style.display = '';\r\n }\r\n }\r\n\r\n // Remove live group\r\n if (this._liveGroup && this._liveGroup.parentNode) {\r\n this._liveGroup.remove();\r\n }\r\n\r\n this._listeners = { stateChange: [], actionStart: [], actionEnd: [], error: [] };\r\n }\r\n\r\n // ---- Private ----\r\n\r\n _emit(event, data) {\r\n if (this._listeners[event]) {\r\n for (const cb of this._listeners[event]) {\r\n try {\r\n cb(data);\r\n } catch (e) {\r\n console.error(`VectorFlow: Error in \"${event}\" listener:`, e);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default VectorFlow;\r\nexport { VectorFlow };\r\n","/**\r\n * VectorFlow — Parser\r\n * JSON validation/normalization + SVG state/part discovery.\r\n */\r\n\r\nimport { readSnapshot } from './utils.js';\r\n\r\n/**\r\n * Parse and validate a VectorFlow JSON config.\r\n * Returns a normalized config object.\r\n * Throws on invalid input.\r\n */\r\nexport function parseAndValidateJSON(input) {\r\n let json;\r\n if (typeof input === 'string') {\r\n try {\r\n json = JSON.parse(input);\r\n } catch (e) {\r\n throw new Error(`VectorFlow: Invalid JSON — ${e.message}`);\r\n }\r\n } else if (typeof input === 'object' && input !== null) {\r\n json = input;\r\n } else {\r\n throw new Error('VectorFlow: JSON input must be a string or object');\r\n }\r\n\r\n // Validate required fields\r\n if (!json.initial_state || typeof json.initial_state !== 'string') {\r\n throw new Error('VectorFlow: JSON must have a string \"initial_state\" field');\r\n }\r\n if (!json.routes || typeof json.routes !== 'object') {\r\n throw new Error('VectorFlow: JSON must have a \"routes\" object');\r\n }\r\n if (!json.actions || typeof json.actions !== 'object') {\r\n throw new Error('VectorFlow: JSON must have an \"actions\" object');\r\n }\r\n\r\n // Normalize top-level ms\r\n const globalMs = (typeof json.ms === 'number' && json.ms > 0) ? json.ms : 120;\r\n\r\n // Validate routes\r\n const routes = {};\r\n for (const [target, block] of Object.entries(json.routes)) {\r\n if (typeof block !== 'object' || block === null) {\r\n throw new Error(`VectorFlow: routes[\"${target}\"] must be an object`);\r\n }\r\n routes[target] = {};\r\n for (const [key, value] of Object.entries(block)) {\r\n if (key === 'ms') {\r\n if (typeof value !== 'number') {\r\n throw new Error(`VectorFlow: routes[\"${target}\"].ms must be a number`);\r\n }\r\n routes[target].ms = value;\r\n } else {\r\n if (!Array.isArray(value) || !value.every(s => typeof s === 'string')) {\r\n throw new Error(`VectorFlow: routes[\"${target}\"][\"${key}\"] must be an array of strings`);\r\n }\r\n routes[target][key] = value;\r\n }\r\n }\r\n }\r\n\r\n // Normalize actions\r\n const actions = {};\r\n for (const [name, action] of Object.entries(json.actions)) {\r\n const type = (action.type === 'loop') ? 'loop' : 'sequence';\r\n\r\n if (!Array.isArray(action.order) || action.order.length === 0) {\r\n console.warn(`VectorFlow: action \"${name}\" has no valid order — will be a no-op`);\r\n actions[name] = { type, order: [], ms: undefined, count: undefined, mode: undefined };\r\n continue;\r\n }\r\n\r\n const ms = (typeof action.ms === 'number' && action.ms > 0) ? action.ms : undefined;\r\n let count;\r\n let mode;\r\n\r\n if (type === 'loop') {\r\n count = (typeof action.count === 'number' && action.count > 0) ? action.count : 99999;\r\n mode = (typeof action.mode === 'string') ? action.mode : undefined;\r\n }\r\n\r\n actions[name] = { type, order: action.order, ms, count, mode };\r\n }\r\n\r\n return {\r\n name: json.name || 'untitled',\r\n initial_state: json.initial_state,\r\n ms: globalMs,\r\n routes,\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Discover state groups from an SVG element.\r\n * Returns a Map: stateName → SVG <g> element.\r\n * Throws if no state groups found.\r\n */\r\nexport function discoverStates(svgElement) {\r\n const stateGroups = svgElement.querySelectorAll('g[id^=\"state_\"]');\r\n if (stateGroups.length === 0) {\r\n throw new Error('VectorFlow: No state groups found in SVG. Expected groups with id=\"state_{name}\".');\r\n }\r\n\r\n const stateMap = new Map();\r\n for (const g of stateGroups) {\r\n const stateName = g.id.replace(/^state_/, '');\r\n if (stateName) {\r\n stateMap.set(stateName, g);\r\n }\r\n }\r\n\r\n if (stateMap.size === 0) {\r\n throw new Error('VectorFlow: No valid state groups found in SVG.');\r\n }\r\n\r\n return stateMap;\r\n}\r\n\r\n/**\r\n * Discover parts from all state groups.\r\n * Returns a Map: stateName → Map(partName → element).\r\n * Validates that all states have identical part sets.\r\n */\r\nexport function discoverParts(stateMap) {\r\n const stateParts = new Map();\r\n let referencePartNames = null;\r\n let referenceStateName = null;\r\n\r\n for (const [stateName, groupEl] of stateMap) {\r\n const parts = new Map();\r\n const partEls = groupEl.querySelectorAll('[data-part]');\r\n\r\n for (const el of partEls) {\r\n const partName = el.getAttribute('data-part');\r\n if (partName) {\r\n parts.set(partName, el);\r\n }\r\n }\r\n\r\n if (parts.size === 0) {\r\n throw new Error(`VectorFlow: State \"${stateName}\" has no parts (elements with data-part attribute).`);\r\n }\r\n\r\n // Validate matching part sets\r\n const currentPartNames = Array.from(parts.keys()).sort().join(',');\r\n if (referencePartNames === null) {\r\n referencePartNames = currentPartNames;\r\n referenceStateName = stateName;\r\n } else if (currentPartNames !== referencePartNames) {\r\n throw new Error(\r\n `VectorFlow: Part mismatch between states. ` +\r\n `State \"${referenceStateName}\" has parts [${referencePartNames}] ` +\r\n `but state \"${stateName}\" has parts [${currentPartNames}].`\r\n );\r\n }\r\n\r\n stateParts.set(stateName, parts);\r\n }\r\n\r\n return stateParts;\r\n}\r\n\r\n/**\r\n * Set up the live character group.\r\n * Clones the initial state, inserts into SVG, hides original state groups.\r\n * Returns { liveGroup: element, liveParts: Map(partName → element) }.\r\n */\r\nexport function setupLiveCharacter(svgElement, stateMap, initialState) {\r\n const initialGroup = stateMap.get(initialState);\r\n if (!initialGroup) {\r\n const available = Array.from(stateMap.keys()).join(', ');\r\n throw new Error(\r\n `VectorFlow: initial_state \"${initialState}\" not found in SVG. Available states: ${available}`\r\n );\r\n }\r\n\r\n // Remove any existing live group\r\n const existingLive = svgElement.querySelector('#live_character');\r\n if (existingLive) {\r\n existingLive.remove();\r\n }\r\n\r\n // Clone initial state\r\n const liveGroup = initialGroup.cloneNode(true);\r\n liveGroup.id = 'live_character';\r\n liveGroup.removeAttribute('style');\r\n liveGroup.style.display = '';\r\n\r\n // Insert live group into SVG\r\n svgElement.appendChild(liveGroup);\r\n\r\n // Hide all original state groups\r\n for (const [, groupEl] of stateMap) {\r\n groupEl.style.display = 'none';\r\n }\r\n\r\n // Build live parts map\r\n const liveParts = new Map();\r\n const partEls = liveGroup.querySelectorAll('[data-part]');\r\n for (const el of partEls) {\r\n const partName = el.getAttribute('data-part');\r\n if (partName) {\r\n liveParts.set(partName, el);\r\n }\r\n }\r\n\r\n return { liveGroup, liveParts };\r\n}\r\n\r\n/**\r\n * Build snapshots for all states and parts.\r\n * Returns Map: stateName → Map(partName → snapshot).\r\n */\r\nexport function buildStateSnapshots(stateParts) {\r\n const snapshots = new Map();\r\n for (const [stateName, parts] of stateParts) {\r\n const partSnapshots = new Map();\r\n for (const [partName, el] of parts) {\r\n partSnapshots.set(partName, readSnapshot(el));\r\n }\r\n snapshots.set(stateName, partSnapshots);\r\n }\r\n return snapshots;\r\n}\r\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","hexToRgb","hex","trim","replace","length","num","parseInt","isNaN","r","g","b","rgbToHex","toHex","n","Math","round","max","min","toString","padStart","lerp","a","t","lerpColor","colorA","colorB","NUMERIC_ATTRS","COLOR_PROPS","readColorProp","el","styleVal","style","getPropertyValue","normalizeColor","attrVal","getAttribute","computed","window","getComputedStyle","val","startsWith","match","document","ctx","createElement","getContext","fillStyle","resolved","readSnapshot","snapshot","numericAttrs","colors","transform","attr","raw","parseFloat","color","parseTransform","transformStr","result","translateX","translateY","scaleX","scaleY","rotate","translateMatch","scaleMatch","undefined","rotateMatch","buildTransform","parts","push","join","resolvePath","targetState","currentState","routes","routeBlock","Array","isArray","normalizePath","path","slice","resolveMs","actionMs","routeMs","jsonMs","expandSequence","order","validStates","steps","current","routeKey","nextState","has","Error","ms","state","finalState","expandDirect","defaultInstanceSettings","update","begin","loopBegin","changeBegin","change","changeComplete","loopComplete","complete","loop","direction","autoplay","timelineOffset","defaultTweenSettings","duration","delay","endDelay","easing","validTransforms","cache","CSS","springs","minMax","stringContains","str","text","indexOf","applyArguments","func","args","apply","is","arr","pth","svg","SVGElement","inp","HTMLInputElement","dom","nodeType","fnc","und","nil","test","rgb","hsl","col","parseEasingParameters","string","exec","split","map","p","spring","params","mass","stiffness","damping","velocity","w0","sqrt","zeta","wd","solver","progress","exp","cos","sin","cached","frame","elapsed","rest","ceil","eases","functionEasings","bezier","kSampleStepSize","A","aA1","aA2","B","C","calcBezier","aT","getSlope","mX1","mY1","mX2","mY2","sampleValues","Float32Array","i","x","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","abs","binarySubdivide","getTForX","penner","linear","Sine","PI","Expo","pow","Circ","Back","Bounce","pow2","Elastic","amplitude","period","asin","forEach","name","keys","easeIn","parseEasings","ease","selectString","querySelectorAll","e","filterArray","callback","len","thisArg","arguments","flattenArray","reduce","concat","toArray","NodeList","HTMLCollection","arrayContains","some","cloneObject","clone","replaceObjectProps","o1","o2","mergeObjects","getUnit","getFunctionValue","animatable","target","id","total","convertPxToUnit","value","unit","tempEl","tagName","parentEl","parentNode","body","appendChild","position","width","factor","offsetWidth","removeChild","convertedUnit","getCSSValue","uppercasePropName","toLowerCase","getAnimationType","getElementTransforms","m","reg","transforms","Map","set","getOriginalTargetValue","propName","defaultVal","getTransformUnit","list","getTransformValue","getRelativeValue","to","from","operator","u","y","validateValue","rgbValue","hexValue","hexToRgba","hslValue","h","s","l","hue2rgb","q","hslToRgba","colorToRgb","originalUnit","unitLess","substr","getDistance","p1","p2","getPolylineLength","previousPos","points","totalLength","numberOfItems","currentPos","getItem","getTotalLength","getCircleLength","getRectLength","getLineLength","getPolygonLength","getParentSvg","pathEl","svgData","parentSvgEl","getParentSvgEl","rect","getBoundingClientRect","viewBoxAttr","height","viewBox","w","vW","vH","getPathProgress","isPathTargetInsideSVG","point","offset","getPointAtLength","p0","property","atan2","decomposeValue","rgx","original","numbers","Number","strings","parseTargets","targets","item","pos","self","getAnimatables","parsed","normalizePropertyTweens","tweenSettings","settings","propArray","v","k","setProgressValue","css","attribute","setAttribute","object","manual","last","setTargetsValue","properties","valueUnit","originalValue","animType","getAnimations","animatables","tweens","previousTween","tween","normalizeTweenValues","tweenValue","toUnit","previousValue","fromUnit","start","end","isPath","isColor","normalizeTweens","lastTween","type","createAnimation","getInstanceTimings","animations","animLength","getTlOffset","anim","timings","instanceID","activeInstances","engine","raf","step","activeInstancesLength","activeInstance","paused","splice","tick","requestAnimationFrame","addEventListener","anime","suspendWhenDocumentHidden","isDocumentHidden","cancelAnimationFrame","instance","_onDocumentVisibility","hidden","children","startTime","lastTime","now","childrenLength","resolve","makePromise","promise","Promise","_resolve","finished","instanceSettings","keyframes","propertyNames","newKey","flattenKeyframes","getProperties","createNewInstance","toggleInstanceDirection","reversed","child","adjustTime","time","resetTime","currentTime","speed","seekChild","seek","setAnimationsProgress","insTime","animationsLength","tweenLength","eased","toNumbersLength","toNumber","fromNumber","stringsLength","n$1","currentValue","setCallback","cb","passThrough","setInstanceProgress","engineTime","insDuration","insDelay","insEndDelay","reversePlayback","i$1","syncInstanceChildren","began","loopBegan","changeBegan","changeCompleted","remaining","completed","reset","pause","play","reverse","restart","remove","removeTargetsFromInstance","removeTargetsFromAnimations","targetsArray","c","childAnimations","version","running","convertPx","percent","setDashoffset","pathLength","stagger","grid","axis","fromIndex","fromFirst","fromCenter","fromLast","isRange","val1","val2","values","maxValue","index","fromX","fromY","floor","distanceX","distanceY","timeline","tl","add","instanceParams","tlIndex","ins","insParams","tlDuration","random","playStep","liveParts","targetSnapshots","signal","reject","aborted","DOMException","completedCount","totalParts","size","partName","liveEl","targetSnap","currentSnap","animeConfig","targetVal","entries","colorAnimations","targetColor","currentColor","setProperty","transformAnim","fromT","toT","JSON","stringify","progressObj","colorTransformAnim","interpolated","removeAttribute","includes","once","async","playSteps","stateSnapshots","onStateChange","lastState","constructor","svgElement","json","_listeners","stateChange","actionStart","actionEnd","error","_abortController","_currentActionName","_config","input","parse","message","initial_state","actions","globalMs","block","every","action","console","warn","count","mode","parseAndValidateJSON","container","innerHTML","_svgElement","querySelector","_stateMap","stateGroups","stateMap","stateName","discoverStates","_stateParts","stateParts","referencePartNames","referenceStateName","groupEl","partEls","currentPartNames","sort","discoverParts","_validStates","Set","available","_stateSnapshots","snapshots","partSnapshots","buildStateSnapshots","liveGroup","initialState","initialGroup","existingLive","cloneNode","display","setupLiveCharacter","_liveGroup","_liveParts","_currentState","states","isPlaying","currentAction","actionName","err","_emit","stop","AbortController","expandFns","runAction","abort","on","event","off","filter","destroy","data"],"sourceRoot":""}
|
package/package.json
CHANGED
package/src/engine.js
CHANGED
|
@@ -78,20 +78,19 @@ export function expandSequence(order, currentState, routes, actionMs, jsonMs, va
|
|
|
78
78
|
const steps = [];
|
|
79
79
|
let current = currentState;
|
|
80
80
|
|
|
81
|
-
for (const
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
throw new Error(`VectorFlow: State not found in SVG: "${targetState}"`);
|
|
85
|
-
}
|
|
81
|
+
for (const routeKey of order) {
|
|
82
|
+
// Resolve the route — routeKey can be a route key OR a state name
|
|
83
|
+
const path = normalizePath(resolvePath(routeKey, current, routes), current);
|
|
86
84
|
|
|
87
|
-
|
|
85
|
+
if (path.length === 0) continue;
|
|
88
86
|
|
|
87
|
+
// Validate that resolved path entries are real states
|
|
89
88
|
for (const nextState of path) {
|
|
90
89
|
if (validStates && !validStates.has(nextState)) {
|
|
91
|
-
throw new Error(`VectorFlow:
|
|
90
|
+
throw new Error(`VectorFlow: Route "${routeKey}" resolves to unknown state "${nextState}"`);
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
const routeMs = routes[nextState]?.ms;
|
|
93
|
+
const routeMs = routes[routeKey]?.ms ?? routes[nextState]?.ms;
|
|
95
94
|
const ms = resolveMs(actionMs, routeMs, jsonMs);
|
|
96
95
|
steps.push({ state: nextState, ms });
|
|
97
96
|
current = nextState;
|
|
@@ -116,15 +115,20 @@ export function expandDirect(order, currentState, routes, actionMs, jsonMs, vali
|
|
|
116
115
|
const steps = [];
|
|
117
116
|
let current = currentState;
|
|
118
117
|
|
|
119
|
-
for (const
|
|
118
|
+
for (const routeKey of order) {
|
|
119
|
+
// In direct mode, resolve the route to find the final destination state
|
|
120
|
+
const path = resolvePath(routeKey, current, routes);
|
|
121
|
+
// Use the last state in the resolved path as the target
|
|
122
|
+
const targetState = path[path.length - 1];
|
|
123
|
+
|
|
120
124
|
if (validStates && !validStates.has(targetState)) {
|
|
121
|
-
throw new Error(`VectorFlow:
|
|
125
|
+
throw new Error(`VectorFlow: Route "${routeKey}" resolves to unknown state "${targetState}"`);
|
|
122
126
|
}
|
|
123
127
|
|
|
124
|
-
//
|
|
128
|
+
// Skip if already at target
|
|
125
129
|
if (targetState === current) continue;
|
|
126
130
|
|
|
127
|
-
const routeMs = routes[targetState]?.ms;
|
|
131
|
+
const routeMs = routes[routeKey]?.ms ?? routes[targetState]?.ms;
|
|
128
132
|
const ms = resolveMs(actionMs, routeMs, jsonMs);
|
|
129
133
|
steps.push({ state: targetState, ms });
|
|
130
134
|
current = targetState;
|