UNPKG

animejs

Version:

JavaScript animation engine

114 lines (106 loc) 3.65 kB
/** * Anime.js - core - ESM * @version v4.3.6 * @license MIT * @copyright 2026 - Julian Garnier */ import { tweenTypes, shortTransforms, isDomSymbol, transformsSymbol, transformsFragmentStrings, emptyString } from './consts.js'; import { forEachChildren, isSvg, toLowerCase, isNil } from './helpers.js'; /** * @import { * JSAnimation, * } from '../animation/animation.js' */ /** * @import { * Target, * DOMTarget, * Renderable, * Tween, * } from '../types/index.js' */ const propertyNamesCache = {}; /** * @param {String} propertyName * @param {Target} target * @param {tweenTypes} tweenType * @return {String} */ const sanitizePropertyName = (propertyName, target, tweenType) => { if (tweenType === tweenTypes.TRANSFORM) { const t = shortTransforms.get(propertyName); return t ? t : propertyName; } else if ( tweenType === tweenTypes.CSS || // Handle special cases where properties like "strokeDashoffset" needs to be set as "stroke-dashoffset" // but properties like "baseFrequency" should stay in lowerCamelCase (tweenType === tweenTypes.ATTRIBUTE && (isSvg(target) && propertyName in /** @type {DOMTarget} */(target).style)) ) { const cachedPropertyName = propertyNamesCache[propertyName]; if (cachedPropertyName) { return cachedPropertyName; } else { const lowerCaseName = propertyName ? toLowerCase(propertyName) : propertyName; propertyNamesCache[propertyName] = lowerCaseName; return lowerCaseName; } } else { return propertyName; } }; /** * @template {Renderable} T * @param {T} renderable * @return {T} */ const cleanInlineStyles = renderable => { // Allow cleanInlineStyles() to be called on timelines if (renderable._hasChildren) { forEachChildren(renderable, cleanInlineStyles, true); } else { const animation = /** @type {JSAnimation} */(renderable); animation.pause(); forEachChildren(animation, (/** @type {Tween} */tween) => { const tweenProperty = tween.property; const tweenTarget = tween.target; if (tweenTarget[isDomSymbol]) { const targetStyle = /** @type {DOMTarget} */(tweenTarget).style; const originalInlinedValue = tween._inlineValue; const tweenHadNoInlineValue = isNil(originalInlinedValue) || originalInlinedValue === emptyString; if (tween._tweenType === tweenTypes.TRANSFORM) { const cachedTransforms = tweenTarget[transformsSymbol]; if (tweenHadNoInlineValue) { delete cachedTransforms[tweenProperty]; } else { cachedTransforms[tweenProperty] = originalInlinedValue; } if (tween._renderTransforms) { if (!Object.keys(cachedTransforms).length) { targetStyle.removeProperty('transform'); } else { let str = emptyString; for (let key in cachedTransforms) { str += transformsFragmentStrings[key] + cachedTransforms[key] + ') '; } targetStyle.transform = str; } } } else { if (tweenHadNoInlineValue) { targetStyle.removeProperty(toLowerCase(tweenProperty)); } else { targetStyle[tweenProperty] = originalInlinedValue; } } if (animation._tail === tween) { animation.targets.forEach(t => { if (t.getAttribute && t.getAttribute('style') === emptyString) { t.removeAttribute('style'); } }); } } }); } return renderable; }; export { cleanInlineStyles, sanitizePropertyName };