UNPKG

animejs

Version:

JavaScript animation engine

63 lines (54 loc) 1.54 kB
/** * Anime.js - easings - ESM * @version v4.5.0 * @license MIT * @copyright 2026 - Julian Garnier */ import { abs } from '../../core/helpers.js'; import { none } from '../none.js'; /** * @import { * EasingFunction, * } from '../../types/index.js' */ /** * Cubic Bezier solver adapted from https://github.com/gre/bezier-easing * (c) 2014 Gaëtan Renaudeau */ /** * @param {Number} aT * @param {Number} aA1 * @param {Number} aA2 * @return {Number} */ const calcBezier = (aT, aA1, aA2) => (((1 - 3 * aA2 + 3 * aA1) * aT + (3 * aA2 - 6 * aA1)) * aT + (3 * aA1)) * aT; /** * @param {Number} aX * @param {Number} mX1 * @param {Number} mX2 * @return {Number} */ const binarySubdivide = (aX, mX1, mX2) => { let aA = 0, aB = 1, currentX, currentT, i = 0; do { currentT = aA + (aB - aA) / 2; currentX = calcBezier(currentT, mX1, mX2) - aX; if (currentX > 0) { aB = currentT; } else { aA = currentT; } } while (abs(currentX) > .0000001 && ++i < 100); return currentT; }; /** * @param {Number} [mX1] The x coordinate of the first point * @param {Number} [mY1] The y coordinate of the first point * @param {Number} [mX2] The x coordinate of the second point * @param {Number} [mY2] The y coordinate of the second point * @return {EasingFunction} */ const cubicBezier = (mX1 = 0.5, mY1 = 0.0, mX2 = 0.5, mY2 = 1.0) => (mX1 === mY1 && mX2 === mY2) ? none : t => t === 0 || t === 1 ? t : calcBezier(binarySubdivide(t, mX1, mX2), mY1, mY2); export { cubicBezier };