vuikit
Version:
A responsive Vue UI library for web site interfaces based on UIkit
135 lines (130 loc) • 4.56 kB
JavaScript
/**
* Vuikit 0.8.10
* (c) 2018 Miljan Aleksic
* @license MIT
**/
/* Substantial part of the code is adapted from UIkit,
Copyright (c) 2013-2018 YOOtheme GmbH, getuikit.com */
import { attr } from './attr';
import { Promise } from './promise';
import { once, trigger } from './event';
import { css, propName } from './style';
import { assign, startsWith, toNodes } from './lang';
import { addClass, hasClass, removeClass, removeClasses } from './class';
function transition (element, props, duration, timing) {
if ( duration === void 0 ) duration = 400;
if ( timing === void 0 ) timing = 'linear';
return Promise.all(toNodes(element).map(function (element) { return new Promise(function (resolve, reject) {
for (var name in props) {
var value = css(element, name);
if (value === '') {
css(element, name, value);
}
}
var timer = setTimeout(function () { return trigger(element, 'transitionend'); }, duration);
once(element, 'transitionend transitioncanceled', function (ref) {
var type = ref.type;
clearTimeout(timer);
removeClass(element, 'uk-transition');
css(element, {
'transition-property': '',
'transition-duration': '',
'transition-timing-function': ''
});
type === 'transitioncanceled' ? reject() : resolve();
}, false, function (ref) {
var target = ref.target;
return element === target;
});
addClass(element, 'uk-transition');
css(element, assign({
'transition-property': Object.keys(props).map(propName).join(','),
'transition-duration': (duration + "ms"),
'transition-timing-function': timing
}, props));
}); }
))
}
var Transition = {
start: transition,
stop: function stop (element) {
trigger(element, 'transitionend');
return Promise.resolve()
},
cancel: function cancel (element) {
trigger(element, 'transitioncanceled');
},
inProgress: function inProgress (element) {
return hasClass(element, 'uk-transition')
}
};
var animationPrefix = 'uk-animation-';
var clsCancelAnimation = 'uk-cancel-animation';
function animate (element, animation, duration, origin, out) {
var arguments$1 = arguments;
if ( duration === void 0 ) duration = 200;
return Promise.all(toNodes(element).map(function (element) { return new Promise(function (resolve, reject) {
if (hasClass(element, clsCancelAnimation)) {
requestAnimationFrame(function () { return Promise.resolve().then(function () { return animate.apply(void 0, arguments$1).then(resolve, reject); }
); }
);
return
}
var cls = animation + " " + animationPrefix + (out ? 'leave' : 'enter');
if (startsWith(animation, animationPrefix)) {
if (origin) {
cls += " uk-transform-origin-" + origin;
}
if (out) {
cls += " " + animationPrefix + "reverse";
}
}
reset();
once(element, 'animationend animationcancel', function (ref) {
var type = ref.type;
var hasReset = false;
if (type === 'animationcancel') {
reject();
reset();
} else {
resolve();
Promise.resolve().then(function () {
hasReset = true;
reset();
});
}
requestAnimationFrame(function () {
if (!hasReset) {
addClass(element, clsCancelAnimation);
requestAnimationFrame(function () { return removeClass(element, clsCancelAnimation); });
}
});
}, false, function (ref) {
var target = ref.target;
return element === target;
});
css(element, 'animationDuration', (duration + "ms"));
addClass(element, cls);
function reset () {
css(element, 'animationDuration', '');
removeClasses(element, (animationPrefix + "\\S*"));
}
}); }
))
}
var inProgress = new RegExp((animationPrefix + "(enter|leave)"));
var Animation = {
in: function in$1 (element, animation, duration, origin) {
return animate(element, animation, duration, origin, false)
},
out: function out (element, animation, duration, origin) {
return animate(element, animation, duration, origin, true)
},
inProgress: function inProgress$1 (element) {
return inProgress.test(attr(element, 'class'))
},
cancel: function cancel (element) {
trigger(element, 'animationcancel');
}
};
export { transition, Transition, animate, Animation };