123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074 |
- import { isDefined } from '../util/util';
- /**
- * @hidden
- */
- var Animation = (function () {
- function Animation(plt, ele, opts) {
- this._dur = null;
- this._es = null;
- this._rvEs = null;
- this.hasChildren = false;
- this.isPlaying = false;
- this.hasCompleted = false;
- this.plt = plt;
- this.element(ele);
- this.opts = opts;
- }
- Animation.prototype.element = function (ele) {
- if (ele) {
- if (typeof ele === 'string') {
- ele = this.plt.doc().querySelectorAll(ele);
- for (var i = 0; i < ele.length; i++) {
- this._addEle(ele[i]);
- }
- }
- else if (ele.length) {
- for (var i = 0; i < ele.length; i++) {
- this._addEle(ele[i]);
- }
- }
- else {
- this._addEle(ele);
- }
- }
- return this;
- };
- /**
- * NO DOM
- */
- Animation.prototype._addEle = function (ele) {
- if (ele.nativeElement) {
- ele = ele.nativeElement;
- }
- if (ele.nodeType === 1) {
- this._eL = (this._e = this._e || []).push(ele);
- }
- };
- /**
- * Add a child animation to this animation.
- */
- Animation.prototype.add = function (childAnimation) {
- childAnimation.parent = this;
- this.hasChildren = true;
- this._cL = (this._c = this._c || []).push(childAnimation);
- return this;
- };
- /**
- * Get the duration of this animation. If this animation does
- * not have a duration, then it'll get the duration from its parent.
- */
- Animation.prototype.getDuration = function (opts) {
- if (opts && isDefined(opts.duration)) {
- return opts.duration;
- }
- else if (this._dur !== null) {
- return this._dur;
- }
- else if (this.parent) {
- return this.parent.getDuration();
- }
- return 0;
- };
- /**
- * Returns if the animation is a root one.
- */
- Animation.prototype.isRoot = function () {
- return !this.parent;
- };
- /**
- * Set the duration for this animation.
- */
- Animation.prototype.duration = function (milliseconds) {
- this._dur = milliseconds;
- return this;
- };
- /**
- * Get the easing of this animation. If this animation does
- * not have an easing, then it'll get the easing from its parent.
- */
- Animation.prototype.getEasing = function () {
- if (this._rv && this._rvEs) {
- return this._rvEs;
- }
- return this._es !== null ? this._es : (this.parent && this.parent.getEasing()) || null;
- };
- /**
- * Set the easing for this animation.
- */
- Animation.prototype.easing = function (name) {
- this._es = name;
- return this;
- };
- /**
- * Set the easing for this reversed animation.
- */
- Animation.prototype.easingReverse = function (name) {
- this._rvEs = name;
- return this;
- };
- /**
- * Add the "from" value for a specific property.
- */
- Animation.prototype.from = function (prop, val) {
- this._addProp('from', prop, val);
- return this;
- };
- /**
- * Add the "to" value for a specific property.
- */
- Animation.prototype.to = function (prop, val, clearProperyAfterTransition) {
- var fx = this._addProp('to', prop, val);
- if (clearProperyAfterTransition) {
- // if this effect is a transform then clear the transform effect
- // otherwise just clear the actual property
- this.afterClearStyles([fx.trans ? this.plt.Css.transform : prop]);
- }
- return this;
- };
- /**
- * Shortcut to add both the "from" and "to" for the same property.
- */
- Animation.prototype.fromTo = function (prop, fromVal, toVal, clearProperyAfterTransition) {
- return this.from(prop, fromVal).to(prop, toVal, clearProperyAfterTransition);
- };
- /**
- * @hidden
- * NO DOM
- */
- Animation.prototype._getProp = function (name) {
- if (this._fx) {
- return this._fx.find(function (prop) { return prop.name === name; });
- }
- else {
- this._fx = [];
- }
- return null;
- };
- Animation.prototype._addProp = function (state, prop, val) {
- var fxProp = this._getProp(prop);
- if (!fxProp) {
- // first time we've see this EffectProperty
- var shouldTrans = (ANIMATION_TRANSFORMS[prop] === 1);
- fxProp = {
- name: prop,
- trans: shouldTrans,
- // add the will-change property for transforms or opacity
- wc: (shouldTrans ? this.plt.Css.transform : prop)
- };
- this._fx.push(fxProp);
- }
- // add from/to EffectState to the EffectProperty
- var fxState = {
- val: val,
- num: null,
- unit: '',
- };
- fxProp[state] = fxState;
- if (typeof val === 'string' && val.indexOf(' ') < 0) {
- var r = val.match(ANIMATION_CSS_VALUE_REGEX);
- var num = parseFloat(r[1]);
- if (!isNaN(num)) {
- fxState.num = num;
- }
- fxState.unit = (r[0] !== r[2] ? r[2] : '');
- }
- else if (typeof val === 'number') {
- fxState.num = val;
- }
- return fxProp;
- };
- /**
- * Add CSS class to this animation's elements
- * before the animation begins.
- */
- Animation.prototype.beforeAddClass = function (className) {
- (this._bfAdd = this._bfAdd || []).push(className);
- return this;
- };
- /**
- * Remove CSS class from this animation's elements
- * before the animation begins.
- */
- Animation.prototype.beforeRemoveClass = function (className) {
- (this._bfRm = this._bfRm || []).push(className);
- return this;
- };
- /**
- * Set CSS inline styles to this animation's elements
- * before the animation begins.
- */
- Animation.prototype.beforeStyles = function (styles) {
- this._bfSty = styles;
- return this;
- };
- /**
- * Clear CSS inline styles from this animation's elements
- * before the animation begins.
- */
- Animation.prototype.beforeClearStyles = function (propertyNames) {
- this._bfSty = this._bfSty || {};
- for (var i = 0; i < propertyNames.length; i++) {
- this._bfSty[propertyNames[i]] = '';
- }
- return this;
- };
- /**
- * Add a function which contains DOM reads, which will run
- * before the animation begins.
- */
- Animation.prototype.beforeAddRead = function (domReadFn) {
- (this._rdFn = this._rdFn || []).push(domReadFn);
- return this;
- };
- /**
- * Add a function which contains DOM writes, which will run
- * before the animation begins.
- */
- Animation.prototype.beforeAddWrite = function (domWriteFn) {
- (this._wrFn = this._wrFn || []).push(domWriteFn);
- return this;
- };
- /**
- * Add CSS class to this animation's elements
- * after the animation finishes.
- */
- Animation.prototype.afterAddClass = function (className) {
- (this._afAdd = this._afAdd || []).push(className);
- return this;
- };
- /**
- * Remove CSS class from this animation's elements
- * after the animation finishes.
- */
- Animation.prototype.afterRemoveClass = function (className) {
- (this._afRm = this._afRm || []).push(className);
- return this;
- };
- /**
- * Set CSS inline styles to this animation's elements
- * after the animation finishes.
- */
- Animation.prototype.afterStyles = function (styles) {
- this._afSty = styles;
- return this;
- };
- /**
- * Clear CSS inline styles from this animation's elements
- * after the animation finishes.
- */
- Animation.prototype.afterClearStyles = function (propertyNames) {
- this._afSty = this._afSty || {};
- for (var i = 0; i < propertyNames.length; i++) {
- this._afSty[propertyNames[i]] = '';
- }
- return this;
- };
- /**
- * Play the animation.
- */
- Animation.prototype.play = function (opts) {
- var _this = this;
- // If the animation was already invalidated (it did finish), do nothing
- if (!this.plt) {
- return;
- }
- // this is the top level animation and is in full control
- // of when the async play() should actually kick off
- // if there is no duration then it'll set the TO property immediately
- // if there is a duration, then it'll stage all animations at the
- // FROM property and transition duration, wait a few frames, then
- // kick off the animation by setting the TO property for each animation
- this._isAsync = this._hasDuration(opts);
- // ensure all past transition end events have been cleared
- this._clearAsync();
- // recursively kicks off the correct progress step for each child animation
- // ******** DOM WRITE ****************
- this._playInit(opts);
- // doubling up RAFs since this animation was probably triggered
- // from an input event, and just having one RAF would have this code
- // run within the same frame as the triggering input event, and the
- // input event probably already did way too much work for one frame
- this.plt.raf(function () {
- _this.plt.raf(_this._playDomInspect.bind(_this, opts));
- });
- };
- Animation.prototype.syncPlay = function () {
- // If the animation was already invalidated (it did finish), do nothing
- if (!this.plt) {
- return;
- }
- var opts = { duration: 0 };
- this._isAsync = false;
- this._clearAsync();
- this._playInit(opts);
- this._playDomInspect(opts);
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._playInit = function (opts) {
- // always default that an animation does not tween
- // a tween requires that an Animation class has an element
- // and that it has at least one FROM/TO effect
- // and that the FROM/TO effect can tween numeric values
- this._twn = false;
- this.isPlaying = true;
- this.hasCompleted = false;
- this._hasDur = (this.getDuration(opts) > ANIMATION_DURATION_MIN);
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._playInit(opts);
- }
- if (this._hasDur) {
- // if there is a duration then we want to start at step 0
- // ******** DOM WRITE ****************
- this._progress(0);
- // add the will-change properties
- // ******** DOM WRITE ****************
- this._willChg(true);
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * NO RECURSION
- * ROOT ANIMATION
- */
- Animation.prototype._playDomInspect = function (opts) {
- // fire off all the "before" function that have DOM READS in them
- // elements will be in the DOM, however visibily hidden
- // so we can read their dimensions if need be
- // ******** DOM READ ****************
- // ******** DOM WRITE ****************
- this._beforeAnimation();
- // for the root animation only
- // set the async TRANSITION END event
- // and run onFinishes when the transition ends
- var dur = this.getDuration(opts);
- if (this._isAsync) {
- this._asyncEnd(dur, true);
- }
- // ******** DOM WRITE ****************
- this._playProgress(opts);
- if (this._isAsync && this.plt) {
- // this animation has a duration so we need another RAF
- // for the CSS TRANSITION properties to kick in
- this.plt.raf(this._playToStep.bind(this, 1));
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._playProgress = function (opts) {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._playProgress(opts);
- }
- if (this._hasDur) {
- // set the CSS TRANSITION duration/easing
- // ******** DOM WRITE ****************
- this._setTrans(this.getDuration(opts), false);
- }
- else {
- // this animation does not have a duration, so it should not animate
- // just go straight to the TO properties and call it done
- // ******** DOM WRITE ****************
- this._progress(1);
- // since there was no animation, immediately run the after
- // ******** DOM WRITE ****************
- this._setAfterStyles();
- // this animation has no duration, so it has finished
- // other animations could still be running
- this._didFinish(true);
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._playToStep = function (stepValue) {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._playToStep(stepValue);
- }
- if (this._hasDur) {
- // browser had some time to render everything in place
- // and the transition duration/easing is set
- // now set the TO properties which will trigger the transition to begin
- // ******** DOM WRITE ****************
- this._progress(stepValue);
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * NO RECURSION
- * ROOT ANIMATION
- */
- Animation.prototype._asyncEnd = function (dur, shouldComplete) {
- (void 0) /* assert */;
- (void 0) /* assert */;
- (void 0) /* assert */;
- var self = this;
- function onTransitionEnd() {
- // congrats! a successful transition completed!
- // ensure transition end events and timeouts have been cleared
- self._clearAsync();
- // ******** DOM WRITE ****************
- self._playEnd();
- // transition finished
- self._didFinishAll(shouldComplete, true, false);
- }
- function onTransitionFallback() {
- (void 0) /* console.debug */;
- // oh noz! the transition end event didn't fire in time!
- // instead the fallback timer when first
- // if all goes well this fallback should never fire
- // clear the other async end events from firing
- self._tm = undefined;
- self._clearAsync();
- // set the after styles
- // ******** DOM WRITE ****************
- self._playEnd(shouldComplete ? 1 : 0);
- // transition finished
- self._didFinishAll(shouldComplete, true, false);
- }
- // set the TRANSITION END event on one of the transition elements
- self._unrgTrns = this.plt.transitionEnd(self._transEl(), onTransitionEnd, false);
- // set a fallback timeout if the transition end event never fires, or is too slow
- // transition end fallback: (animation duration + XXms)
- self._tm = self.plt.timeout(onTransitionFallback, (dur + ANIMATION_TRANSITION_END_FALLBACK_PADDING_MS));
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._playEnd = function (stepValue) {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._playEnd(stepValue);
- }
- if (this._hasDur) {
- if (isDefined(stepValue)) {
- // too late to have a smooth animation, just finish it
- // ******** DOM WRITE ****************
- this._setTrans(0, true);
- // ensure the ending progress step gets rendered
- // ******** DOM WRITE ****************
- this._progress(stepValue);
- }
- // set the after styles
- // ******** DOM WRITE ****************
- this._setAfterStyles();
- // remove the will-change properties
- // ******** DOM WRITE ****************
- this._willChg(false);
- }
- };
- /**
- * @hidden
- * NO DOM
- * RECURSION
- */
- Animation.prototype._hasDuration = function (opts) {
- if (this.getDuration(opts) > ANIMATION_DURATION_MIN) {
- return true;
- }
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- if (children[i]._hasDuration(opts)) {
- return true;
- }
- }
- return false;
- };
- /**
- * @hidden
- * NO DOM
- * RECURSION
- */
- Animation.prototype._hasDomReads = function () {
- if (this._rdFn && this._rdFn.length) {
- return true;
- }
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- if (children[i]._hasDomReads()) {
- return true;
- }
- }
- return false;
- };
- /**
- * Immediately stop at the end of the animation.
- */
- Animation.prototype.stop = function (stepValue) {
- if (stepValue === void 0) { stepValue = 1; }
- // ensure all past transition end events have been cleared
- this._clearAsync();
- this._hasDur = true;
- this._playEnd(stepValue);
- };
- /**
- * @hidden
- * NO DOM
- * NO RECURSION
- */
- Animation.prototype._clearAsync = function () {
- this._unrgTrns && this._unrgTrns();
- this._tm && clearTimeout(this._tm);
- this._tm = this._unrgTrns = undefined;
- };
- /**
- * @hidden
- * DOM WRITE
- * NO RECURSION
- */
- Animation.prototype._progress = function (stepValue) {
- // bread 'n butter
- var val;
- var effects = this._fx;
- var nuElements = this._eL;
- if (!effects || !nuElements) {
- return;
- }
- // flip the number if we're going in reverse
- if (this._rv) {
- stepValue = ((stepValue * -1) + 1);
- }
- var i, j;
- var finalTransform = '';
- var elements = this._e;
- for (i = 0; i < effects.length; i++) {
- var fx = effects[i];
- if (fx.from && fx.to) {
- var fromNum = fx.from.num;
- var toNum = fx.to.num;
- var tweenEffect = (fromNum !== toNum);
- (void 0) /* assert */;
- if (tweenEffect) {
- this._twn = true;
- }
- if (stepValue === 0) {
- // FROM
- val = fx.from.val;
- }
- else if (stepValue === 1) {
- // TO
- val = fx.to.val;
- }
- else if (tweenEffect) {
- // EVERYTHING IN BETWEEN
- var valNum = (((toNum - fromNum) * stepValue) + fromNum);
- var unit = fx.to.unit;
- if (unit === 'px') {
- valNum = Math.round(valNum);
- }
- val = valNum + unit;
- }
- if (val !== null) {
- var prop = fx.name;
- if (fx.trans) {
- finalTransform += prop + '(' + val + ') ';
- }
- else {
- for (j = 0; j < nuElements; j++) {
- // ******** DOM WRITE ****************
- elements[j].style[prop] = val;
- }
- }
- }
- }
- }
- // place all transforms on the same property
- if (finalTransform.length) {
- if (!this._rv && stepValue !== 1 || this._rv && stepValue !== 0) {
- finalTransform += 'translateZ(0px)';
- }
- var cssTransform = this.plt.Css.transform;
- for (i = 0; i < elements.length; i++) {
- // ******** DOM WRITE ****************
- elements[i].style[cssTransform] = finalTransform;
- }
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * NO RECURSION
- */
- Animation.prototype._setTrans = function (dur, forcedLinearEasing) {
- // Transition is not enabled if there are not effects
- if (!this._fx) {
- return;
- }
- // set the TRANSITION properties inline on the element
- var elements = this._e;
- var easing = (forcedLinearEasing ? 'linear' : this.getEasing());
- var durString = dur + 'ms';
- var Css = this.plt.Css;
- var cssTransform = Css.transition;
- var cssTransitionDuration = Css.transitionDuration;
- var cssTransitionTimingFn = Css.transitionTimingFn;
- var eleStyle;
- for (var i = 0; i < this._eL; i++) {
- eleStyle = elements[i].style;
- if (dur > 0) {
- // ******** DOM WRITE ****************
- eleStyle[cssTransform] = '';
- eleStyle[cssTransitionDuration] = durString;
- // each animation can have a different easing
- if (easing) {
- // ******** DOM WRITE ****************
- eleStyle[cssTransitionTimingFn] = easing;
- }
- }
- else {
- eleStyle[cssTransform] = 'none';
- }
- }
- };
- /**
- * @hidden
- * DOM READ
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._beforeAnimation = function () {
- // fire off all the "before" function that have DOM READS in them
- // elements will be in the DOM, however visibily hidden
- // so we can read their dimensions if need be
- // ******** DOM READ ****************
- this._fireBeforeReadFunc();
- // ******** DOM READS ABOVE / DOM WRITES BELOW ****************
- // fire off all the "before" function that have DOM WRITES in them
- // ******** DOM WRITE ****************
- this._fireBeforeWriteFunc();
- // stage all of the before css classes and inline styles
- // ******** DOM WRITE ****************
- this._setBeforeStyles();
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._setBeforeStyles = function () {
- var i, j;
- var children = this._c;
- for (i = 0; i < this._cL; i++) {
- children[i]._setBeforeStyles();
- }
- // before the animations have started
- // only set before styles if animation is not reversed
- if (this._rv) {
- return;
- }
- var addClasses = this._bfAdd;
- var removeClasses = this._bfRm;
- var ele;
- var eleClassList;
- var prop;
- for (i = 0; i < this._eL; i++) {
- ele = this._e[i];
- eleClassList = ele.classList;
- // css classes to add before the animation
- if (addClasses) {
- for (j = 0; j < addClasses.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.add(addClasses[j]);
- }
- }
- // css classes to remove before the animation
- if (removeClasses) {
- for (j = 0; j < removeClasses.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.remove(removeClasses[j]);
- }
- }
- // inline styles to add before the animation
- if (this._bfSty) {
- for (prop in this._bfSty) {
- // ******** DOM WRITE ****************
- ele.style[prop] = this._bfSty[prop];
- }
- }
- }
- };
- /**
- * @hidden
- * DOM READ
- * RECURSION
- */
- Animation.prototype._fireBeforeReadFunc = function () {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM READ ****************
- children[i]._fireBeforeReadFunc();
- }
- var readFunctions = this._rdFn;
- if (readFunctions) {
- for (var i = 0; i < readFunctions.length; i++) {
- // ******** DOM READ ****************
- readFunctions[i]();
- }
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._fireBeforeWriteFunc = function () {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._fireBeforeWriteFunc();
- }
- var writeFunctions = this._wrFn;
- if (this._wrFn) {
- for (var i = 0; i < writeFunctions.length; i++) {
- // ******** DOM WRITE ****************
- writeFunctions[i]();
- }
- }
- };
- /**
- * @hidden
- * DOM WRITE
- */
- Animation.prototype._setAfterStyles = function () {
- var i, j;
- var ele;
- var eleClassList;
- var elements = this._e;
- for (i = 0; i < this._eL; i++) {
- ele = elements[i];
- eleClassList = ele.classList;
- // remove the transition duration/easing
- // ******** DOM WRITE ****************
- ele.style[this.plt.Css.transitionDuration] = ele.style[this.plt.Css.transitionTimingFn] = '';
- if (this._rv) {
- // finished in reverse direction
- // css classes that were added before the animation should be removed
- if (this._bfAdd) {
- for (j = 0; j < this._bfAdd.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.remove(this._bfAdd[j]);
- }
- }
- // css classes that were removed before the animation should be added
- if (this._bfRm) {
- for (j = 0; j < this._bfRm.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.add(this._bfRm[j]);
- }
- }
- // inline styles that were added before the animation should be removed
- if (this._bfSty) {
- for (var prop in this._bfSty) {
- // ******** DOM WRITE ****************
- ele.style[prop] = '';
- }
- }
- }
- else {
- // finished in forward direction
- // css classes to add after the animation
- if (this._afAdd) {
- for (j = 0; j < this._afAdd.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.add(this._afAdd[j]);
- }
- }
- // css classes to remove after the animation
- if (this._afRm) {
- for (j = 0; j < this._afRm.length; j++) {
- // ******** DOM WRITE ****************
- eleClassList.remove(this._afRm[j]);
- }
- }
- // inline styles to add after the animation
- if (this._afSty) {
- for (var prop in this._afSty) {
- // ******** DOM WRITE ****************
- ele.style[prop] = this._afSty[prop];
- }
- }
- }
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * NO RECURSION
- */
- Animation.prototype._willChg = function (addWillChange) {
- var wc;
- var effects = this._fx;
- var willChange;
- if (addWillChange && effects) {
- wc = [];
- for (var i = 0; i < effects.length; i++) {
- var propWC = effects[i].wc;
- if (propWC === 'webkitTransform') {
- wc.push('transform', '-webkit-transform');
- }
- else {
- wc.push(propWC);
- }
- }
- willChange = wc.join(',');
- }
- else {
- willChange = '';
- }
- for (var i = 0; i < this._eL; i++) {
- // ******** DOM WRITE ****************
- this._e[i].style.willChange = willChange;
- }
- };
- /**
- * Start the animation with a user controlled progress.
- */
- Animation.prototype.progressStart = function () {
- // ensure all past transition end events have been cleared
- this._clearAsync();
- // ******** DOM READ/WRITE ****************
- this._beforeAnimation();
- // ******** DOM WRITE ****************
- this._progressStart();
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._progressStart = function () {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._progressStart();
- }
- // force no duration, linear easing
- // ******** DOM WRITE ****************
- this._setTrans(0, true);
- // ******** DOM WRITE ****************
- this._willChg(true);
- };
- /**
- * Set the progress step for this animation.
- * progressStep() is not debounced, so it should not be called faster than 60FPS.
- */
- Animation.prototype.progressStep = function (stepValue) {
- // only update if the last update was more than 16ms ago
- stepValue = Math.min(1, Math.max(0, stepValue));
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i].progressStep(stepValue);
- }
- if (this._rv) {
- // if the animation is going in reverse then
- // flip the step value: 0 becomes 1, 1 becomes 0
- stepValue = ((stepValue * -1) + 1);
- }
- // ******** DOM WRITE ****************
- this._progress(stepValue);
- };
- /**
- * End the progress animation.
- */
- Animation.prototype.progressEnd = function (shouldComplete, currentStepValue, dur) {
- if (dur === void 0) { dur = -1; }
- (void 0) /* console.debug */;
- if (this._rv) {
- // if the animation is going in reverse then
- // flip the step value: 0 becomes 1, 1 becomes 0
- currentStepValue = ((currentStepValue * -1) + 1);
- }
- var stepValue = shouldComplete ? 1 : 0;
- var diff = Math.abs(currentStepValue - stepValue);
- if (diff < 0.05) {
- dur = 0;
- }
- else if (dur < 0) {
- dur = this._dur;
- }
- this._isAsync = (dur > 30);
- this._progressEnd(shouldComplete, stepValue, dur, this._isAsync);
- if (this._isAsync) {
- // for the root animation only
- // set the async TRANSITION END event
- // and run onFinishes when the transition ends
- // ******** DOM WRITE ****************
- this._asyncEnd(dur, shouldComplete);
- // this animation has a duration so we need another RAF
- // for the CSS TRANSITION properties to kick in
- this.plt && this.plt.raf(this._playToStep.bind(this, stepValue));
- }
- };
- /**
- * @hidden
- * DOM WRITE
- * RECURSION
- */
- Animation.prototype._progressEnd = function (shouldComplete, stepValue, dur, isAsync) {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- // ******** DOM WRITE ****************
- children[i]._progressEnd(shouldComplete, stepValue, dur, isAsync);
- }
- if (!isAsync) {
- // stop immediately
- // set all the animations to their final position
- // ******** DOM WRITE ****************
- this._progress(stepValue);
- this._willChg(false);
- this._setAfterStyles();
- this._didFinish(shouldComplete);
- }
- else {
- // animate it back to it's ending position
- this.isPlaying = true;
- this.hasCompleted = false;
- this._hasDur = true;
- // ******** DOM WRITE ****************
- this._willChg(true);
- this._setTrans(dur, false);
- }
- };
- /**
- * Add a callback to fire when the animation has finished.
- */
- Animation.prototype.onFinish = function (callback, onceTimeCallback, clearOnFinishCallacks) {
- if (onceTimeCallback === void 0) { onceTimeCallback = false; }
- if (clearOnFinishCallacks === void 0) { clearOnFinishCallacks = false; }
- if (clearOnFinishCallacks) {
- this._fFn = this._fOneFn = undefined;
- }
- if (onceTimeCallback) {
- this._fOneFn = this._fOneFn || [];
- this._fOneFn.push(callback);
- }
- else {
- this._fFn = this._fFn || [];
- this._fFn.push(callback);
- }
- return this;
- };
- /**
- * @hidden
- * NO DOM
- * RECURSION
- */
- Animation.prototype._didFinishAll = function (hasCompleted, finishAsyncAnimations, finishNoDurationAnimations) {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- children[i]._didFinishAll(hasCompleted, finishAsyncAnimations, finishNoDurationAnimations);
- }
- if (finishAsyncAnimations && this._isAsync || finishNoDurationAnimations && !this._isAsync) {
- this._didFinish(hasCompleted);
- }
- };
- /**
- * @hidden
- * NO RECURSION
- */
- Animation.prototype._didFinish = function (hasCompleted) {
- this.isPlaying = false;
- this.hasCompleted = hasCompleted;
- if (this._fFn) {
- // run all finish callbacks
- for (var i = 0; i < this._fFn.length; i++) {
- this._fFn[i](this);
- }
- }
- if (this._fOneFn) {
- // run all "onetime" finish callbacks
- for (var i = 0; i < this._fOneFn.length; i++) {
- this._fOneFn[i](this);
- }
- this._fOneFn.length = 0;
- }
- };
- /**
- * Reverse the animation.
- */
- Animation.prototype.reverse = function (shouldReverse) {
- if (shouldReverse === void 0) { shouldReverse = true; }
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- children[i].reverse(shouldReverse);
- }
- this._rv = shouldReverse;
- return this;
- };
- /**
- * Recursively destroy this animation and all child animations.
- */
- Animation.prototype.destroy = function () {
- var children = this._c;
- for (var i = 0; i < this._cL; i++) {
- children[i].destroy();
- }
- this._clearAsync();
- this.parent = this.plt = this._e = this._rdFn = this._wrFn = null;
- if (this._c) {
- this._c.length = this._cL = 0;
- }
- if (this._fFn) {
- this._fFn.length = 0;
- }
- if (this._fOneFn) {
- this._fOneFn.length = 0;
- }
- };
- /**
- * @hidden
- * NO DOM
- */
- Animation.prototype._transEl = function () {
- // get the lowest level element that has an Animation
- var targetEl;
- for (var i = 0; i < this._cL; i++) {
- targetEl = this._c[i]._transEl();
- if (targetEl) {
- return targetEl;
- }
- }
- return (this._twn && this._hasDur && this._eL ? this._e[0] : null);
- };
- return Animation;
- }());
- export { Animation };
- var ANIMATION_TRANSFORMS = {
- 'translateX': 1,
- 'translateY': 1,
- 'translateZ': 1,
- 'scale': 1,
- 'scaleX': 1,
- 'scaleY': 1,
- 'scaleZ': 1,
- 'rotate': 1,
- 'rotateX': 1,
- 'rotateY': 1,
- 'rotateZ': 1,
- 'skewX': 1,
- 'skewY': 1,
- 'perspective': 1
- };
- var ANIMATION_CSS_VALUE_REGEX = /(^-?\d*\.?\d*)(.*)/;
- var ANIMATION_DURATION_MIN = 32;
- var ANIMATION_TRANSITION_END_FALLBACK_PADDING_MS = 400;
- //# sourceMappingURL=animation.js.map
|