animejs
Version:
JavaScript animation engine
71 lines (64 loc) • 2.33 kB
JavaScript
/**
* Anime.js - timeline - ESM
* @version v4.3.6
* @license MIT
* @copyright 2026 - Julian Garnier
*/
import { relativeValuesExecRgx, minValue } from '../core/consts.js';
import { isUnd, isNum, stringStartsWith, isNil } from '../core/helpers.js';
import { getRelativeValue } from '../core/values.js';
/**
* @import {
* Tickable,
* TimelinePosition,
* } from '../types/index.js'
*/
/**
* @import {
* Timeline,
* } from './timeline.js'
*/
/**
* Timeline's children offsets positions parser
* @param {Timeline} timeline
* @param {String} timePosition
* @return {Number}
*/
const getPrevChildOffset = (timeline, timePosition) => {
if (stringStartsWith(timePosition, '<')) {
const goToPrevAnimationOffset = timePosition[1] === '<';
const prevAnimation = /** @type {Tickable} */(timeline._tail);
const prevOffset = prevAnimation ? prevAnimation._offset + prevAnimation._delay : 0;
return goToPrevAnimationOffset ? prevOffset : prevOffset + prevAnimation.duration;
}
};
/**
* @param {Timeline} timeline
* @param {TimelinePosition} [timePosition]
* @return {Number}
*/
const parseTimelinePosition = (timeline, timePosition) => {
let tlDuration = timeline.iterationDuration;
if (tlDuration === minValue) tlDuration = 0;
if (isUnd(timePosition)) return tlDuration;
if (isNum(+timePosition)) return +timePosition;
const timePosStr = /** @type {String} */(timePosition);
const tlLabels = timeline ? timeline.labels : null;
const hasLabels = !isNil(tlLabels);
const prevOffset = getPrevChildOffset(timeline, timePosStr);
const hasSibling = !isUnd(prevOffset);
const matchedRelativeOperator = relativeValuesExecRgx.exec(timePosStr);
if (matchedRelativeOperator) {
const fullOperator = matchedRelativeOperator[0];
const split = timePosStr.split(fullOperator);
const labelOffset = hasLabels && split[0] ? tlLabels[split[0]] : tlDuration;
const parsedOffset = hasSibling ? prevOffset : hasLabels ? labelOffset : tlDuration;
const parsedNumericalOffset = +split[1];
return getRelativeValue(parsedOffset, parsedNumericalOffset, fullOperator[0]);
} else {
return hasSibling ? prevOffset :
hasLabels ? !isUnd(tlLabels[timePosStr]) ? tlLabels[timePosStr] :
tlDuration : tlDuration;
}
};
export { parseTimelinePosition };