UNPKG

kapellmeister

Version:

Orchestration For Animated Transitions

2 lines (1 loc) 4.88 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).Kapellmeister={})}(this,function(t){"use strict";var e,n,s=0,i=0,r=0,a=1e3,o=0,u=0,l=0,c="object"==typeof performance&&performance.now?performance:Date,h="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function f(){return u||(h(m),u=c.now()+l)}function m(){u=0}function p(){this._call=this._time=this._next=null}function y(t,e,n){var s=new p;return s.restart(t,e,n),s}function d(){u=(o=c.now())+l,s=i=0;try{!function(){f(),++s;for(var t,n=e;n;)(t=u-n._time)>=0&&n._call.call(null,t),n=n._next;--s}()}finally{s=0,function(){var t,s,i=e,r=1/0;for(;i;)i._call?(r>i._time&&(r=i._time),t=i,i=i._next):(s=i._next,i._next=null,i=t?t._next=s:e=s);n=t,g(r)}(),u=0}}function w(){var t=c.now(),e=t-o;e>a&&(l-=e,o=t)}function g(t){s||(i&&(i=clearTimeout(i)),t-u>24?(t<1/0&&(i=setTimeout(d,t-c.now()-l)),r&&(r=clearInterval(r))):(r||(o=c.now(),r=setInterval(w,a)),s=1,h(d)))}function v(t,e,n){var s=new p;return e=null==e?0:+e,s.restart(function(n){s.stop(),t(n+e)},e,n),s}p.prototype=y.prototype={constructor:p,restart:function(t,s,i){if("function"!=typeof t)throw new TypeError("callback is not a function");i=(null==i?f():+i)+(null==s?0:+s),this._next||n===this||(n?n._next=this:e=this,n=this),this._call=t,this._time=i,g()},stop:function(){this._call&&(this._call=null,this._time=1/0,g())}};let _=0;function D(t,e){for(const n in e)t[n]=e[n]}const T={delay:0,duration:250,ease:t=>+t};class b{constructor(t){this.start=null,this.interrupt=null,this.end=null,t.events&&Object.keys(t.events).forEach(e=>{if("function"!=typeof t.events[e])throw new Error("Event handlers must be a function");this[e]=function(t){let e=!1;return function(){e||(e=!0,t.call(this))}}(t.events[e])})}}t.BaseNode=class{constructor(t){this.state=t||{}}transition(t){if(Array.isArray(t))for(const e of t)this.parse(e);else this.parse(t)}isTransitioning(){return!!this.transitionData}stopTransitions(){const t=this.transitionData;t&&Object.keys(t).forEach(e=>{t[e].timer.stop()})}setState(t){D(this.state,"function"==typeof t?t(this.state):t)}parse(t){const e={...t},n=new b(e);e.events&&delete e.events;const s={...T,...e.timing||{},time:f()};e.timing&&delete e.timing,Object.keys(e).forEach(t=>{const i=[],r=e[t];if(function(t){return"object"==typeof t&&!1===Array.isArray(t)}(r))Object.keys(r).forEach(e=>{const n=r[e];if(Array.isArray(n))1===n.length?i.push(this.getTween(e,n[0],t)):(this.setState(s=>({[t]:{...s[t],[e]:n[0]}})),i.push(this.getTween(e,n[1],t)));else if("function"==typeof n){const s=()=>s=>{this.setState(i=>({[t]:{...i[t],[e]:n(s)}}))};i.push(s)}else this.setState(s=>({[t]:{...s[t],[e]:n}})),i.push(this.getTween(e,n,t))});else if(Array.isArray(r))1===r.length?i.push(this.getTween(t,r[0],null)):(this.setState({[t]:r[0]}),i.push(this.getTween(t,r[1],null)));else if("function"==typeof r){const e=()=>e=>{this.setState({[t]:r(e)})};i.push(e)}else this.setState({[t]:r}),i.push(this.getTween(t,r,null));this.update({stateKey:t,timing:s,tweens:i,events:n,status:0})})}getTween(t,e,n){return()=>{const s=n?this.state[n][t]:this.state[t];if(s===e)return null;const i=this.getInterpolator(s,e,t,n);let r;return r=null===n?e=>{this.setState({[t]:i(e)})}:e=>{this.setState(s=>({[n]:{...s[n],[t]:i(e)}}))}}}update(t){this.transitionData||(this.transitionData={}),this.init(++_,t)}init(t,e){const n=e.tweens.length,s=new Array(n);this.transitionData[t]=e,e.timer=y(t=>{e.status=1,e.timer.restart(i,e.timing.delay,e.timing.time),e.timing.delay<=t&&i(t-e.timing.delay)},0,e.timing.time);const i=o=>{if(1!==e.status)return a();for(const n in this.transitionData){const s=this.transitionData[n];if(s.stateKey===e.stateKey){if(3===s.status)return v(i);4===s.status?(s.status=6,s.timer.stop(),s.events.interrupt&&s.events.interrupt.call(this),delete this.transitionData[n]):+n<t&&(s.status=6,s.timer.stop(),delete this.transitionData[n])}}if(v(()=>{3===e.status&&(e.status=4,e.timer.restart(r,e.timing.delay,e.timing.time),r(o))}),e.status=2,e.events.start&&e.events.start.call(this),2!==e.status)return;e.status=3;let u=-1;for(let t=0;t<n;++t){const n=e.tweens[t]();n&&(s[++u]=n)}s.length=u+1},r=t=>{let n=1;t<e.timing.duration?n=e.timing.ease(t/e.timing.duration):(e.timer.restart(a),e.status=5);let i=-1;for(;++i<s.length;)s[i](n);5===e.status&&(e.events.end&&e.events.end.call(this),a())},a=()=>{e.status=6,e.timer.stop(),delete this.transitionData[t];for(const t in this.transitionData)return;delete this.transitionData}}},t.now=f,t.timer=y,t.interval=function(t,e,n){var s=new p,i=e;return null==e?(s.restart(t,e,n),s):(e=+e,n=null==n?f():+n,s.restart(function r(a){a+=i,s.restart(r,i+=e,n),t(a)},e,n),s)},t.timeout=v,Object.defineProperty(t,"__esModule",{value:!0})});