devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
81 lines (78 loc) • 2.85 kB
JavaScript
/**
* DevExtreme (cjs/__internal/common/core/animation/easing.js)
* Version: 25.2.3
* Build date: Fri Dec 12 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.convertTransitionTimingFuncToEasing = void 0;
exports.getEasing = getEasing;
exports.setEasing = setEasing;
var _type = require("../../../../core/utils/type");
const CSS_TRANSITION_EASING_REGEX = /cubic-bezier\((\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\)/;
const TransitionTimingFuncMap = {
linear: "cubic-bezier(0, 0, 1, 1)",
swing: "cubic-bezier(0.445, 0.05, 0.55, 0.95)",
ease: "cubic-bezier(0.25, 0.1, 0.25, 1)",
"ease-in": "cubic-bezier(0.42, 0, 1, 1)",
"ease-out": "cubic-bezier(0, 0, 0.58, 1)",
"ease-in-out": "cubic-bezier(0.42, 0, 0.58, 1)"
};
const polynomBezier = (x1, y1, x2, y2) => {
const Cx = 3 * x1;
const Bx = 3 * (x2 - x1) - Cx;
const Ax = 1 - Cx - Bx;
const Cy = 3 * y1;
const By = 3 * (y2 - y1) - Cy;
const Ay = 1 - Cy - By;
const bezierX = t => t * (Cx + t * (Bx + t * Ax));
const derivativeX = t => Cx + t * (2 * Bx + 3 * t * Ax);
return t => (t => t * (Cy + t * (By + t * Ay)))((t => {
let x = t;
let i = 0;
let z;
while (i < 14) {
z = bezierX(x) - t;
if (Math.abs(z) < .001) {
break
}
x -= z / derivativeX(x);
i += 1
}
return x
})(t))
};
let easing = {};
const convertTransitionTimingFuncToEasing = cssTransitionEasing => {
cssTransitionEasing = TransitionTimingFuncMap[cssTransitionEasing] || cssTransitionEasing;
let coeffs = CSS_TRANSITION_EASING_REGEX.exec(cssTransitionEasing);
const numCoeffs = [];
let forceName = null;
if (!coeffs) {
forceName = "linear";
coeffs = TransitionTimingFuncMap[forceName].match(CSS_TRANSITION_EASING_REGEX)
}
coeffs = coeffs.slice(1, 5);
for (let i = 0; i < coeffs.length; i += 1) {
numCoeffs[i] = parseFloat(coeffs[i])
}
const easingName = forceName || `cubicbezier_${numCoeffs.join("_").replace(/\./g,"p")}`;
if (!(0, _type.isFunction)(easing[easingName])) {
easing[easingName] = function(x, t, b, c, d) {
return c * polynomBezier(numCoeffs[0], numCoeffs[1], numCoeffs[2], numCoeffs[3])(t / d) + b
}
}
return easingName
};
exports.convertTransitionTimingFuncToEasing = convertTransitionTimingFuncToEasing;
function setEasing(value) {
easing = value
}
function getEasing(name) {
return easing[name]
}