@fancyapps/ui
Version:
Robust JavaScript UI Component Library
3 lines (2 loc) • 3.58 kB
JavaScript
/*! License details at fancyapps.com/license */
import{clamp as n}from"../utils/clamp.js";import{isEqual as t}from"../utils/isEqual.js";const e=function(n){for(const t of s)t.getState()===i.Running&&t.tick(a?n-a:0);a=n,u=window.requestAnimationFrame(e)};var i,o,r;!function(n){n[n.Initializing=0]="Initializing",n[n.Running=1]="Running",n[n.Paused=2]="Paused",n[n.Completed=3]="Completed",n[n.Destroyed=4]="Destroyed"}(i||(i={})),function(n){n[n.Spring=0]="Spring",n[n.Ease=1]="Ease"}(o||(o={})),function(n){n[n.Loop=0]="Loop",n[n.Reverse=1]="Reverse"}(r||(r={}));const s=new Set;let u=null,a=0;function c(){let a=i.Initializing,f=o.Ease,l=0,g=0,p=c.Easings.Linear,m=500,d=0,b=0,S=0,h=0,y=1/0,E=.01,R=.01,M=!1,j={},w=null,v={},O={},C={},L=0,I=0,D=r.Loop,z=c.Easings.Linear;const N=new Map;function V(n,...t){for(const e of N.get(n)||[])e(...t)}function q(n){return g=0,n?w=setTimeout((()=>{x()}),n):x(),F}function x(){a=i.Running,V("start",v,O)}function A(){if(a=i.Completed,C={},V("end",v),a===i.Completed)if(l<L){if(l++,D===r.Reverse){const n=Object.assign({},j);j=Object.assign({},O),O=n}q(I)}else l=0;return F}const F={getState:function(){return a},easing:function(n){return p=n,f=o.Ease,C={},F},duration:function(n){return m=n,F},spring:function(n={}){f=o.Spring;const t={velocity:0,mass:1,tension:170,friction:26,restDelta:.1,restSpeed:.1,maxSpeed:1/0,clamp:!0},{velocity:e,mass:i,tension:r,friction:s,restDelta:u,restSpeed:a,maxSpeed:c,clamp:l}=Object.assign(Object.assign({},t),n);return d=e,b=i,S=r,h=s,R=u,E=a,y=c,M=l,C={},F},isRunning:function(){return a===i.Running},isSpring:function(){return f===o.Spring},from:function(n){return v=Object.assign({},n),F},to:function(n){return O=n,F},repeat:function(n,t=0,e=r.Loop,i){return L=n,I=t,D=e,z=i||p,F},on:function(n,t){var e,i;return e=n,i=t,N.set(e,[...N.get(e)||[],i]),F},off:function(n,t){var e,i;return e=n,i=t,N.has(e)&&N.set(e,N.get(e).filter((n=>n!==i))),F},start:function(n){return a=i.Initializing,j=Object.assign({},v),t(j,O)||(s.add(this),u||(u=window.requestAnimationFrame(e)),q(n)),F},pause:function(){return w&&(clearTimeout(w),w=null),a===i.Running&&(a=i.Paused,V("pause",v)),F},end:A,tick:function(e){e>50&&(e=50),g+=e;let s=0,u=!1;if(a!==i.Running)return F;if(f===o.Ease){s=n(0,g/m,1),u=1===s;const t=D===r.Reverse?z:p;for(const n in v)v[n]=j[n]+(O[n]-j[n])*t(s)}if(f===o.Spring){const t=.001*e;let i=0;for(const e in v){const o=O[e];let r=v[e];if("number"!=typeof o||isNaN(o)||"number"!=typeof r||isNaN(r))continue;if(Math.abs(o-r)<=R){v[e]=o,C[e]=0;continue}C[e]||("object"==typeof d&&"number"==typeof d[e]?C[e]=d[e]:C[e]="number"==typeof d?d:0);let s=C[e];s=n(-1*Math.abs(y),s,Math.abs(y));const u=s*b*h;s+=((r>o?-1:1)*(Math.abs(o-r)*S)-u)/b*t,r+=s*t;const a=v[e]>o?r<o:r>o;let c=Math.abs(s)<E&&Math.abs(o-r)<=R;M&&a&&(c=!0),c?(r=o,s=0):i++,v[e]=r,C[e]=s}u=!i}const c=Object.assign({},O);return V("step",v,j,O,s),u&&a===i.Running&&t(O,c)&&(a=i.Completed,A()),F},getStartValues:function(){return j},getCurrentValues:function(){return v},getCurrentVelocities:function(){return C},getEndValues:function(){return O},destroy:function(){a=i.Destroyed,w&&(clearTimeout(w),w=null),j=v=O={},s.delete(this)}};return F}c.destroy=()=>{for(const n of s)n.destroy();u&&(cancelAnimationFrame(u),u=null)},c.Easings={Linear:function(n){return n},EaseIn:function(n){return 0===n?0:Math.pow(2,10*n-10)},EaseOut:function(n){return 1===n?1:1-Math.pow(2,-10*n)},EaseInOut:function(n){return 0===n?0:1===n?1:n<.5?Math.pow(2,20*n-10)/2:(2-Math.pow(2,-20*n+10))/2}};export{c as Tween,r as TweenRepeatType,i as TweenState};