import { GroupAnimationWithThen } from 'motion-dom'; import { removeItem } from 'motion-utils'; import { animateSequence } from './sequence.mjs'; import { animateSubject } from './subject.mjs'; function isSequence(value) { return Array.isArray(value) && value.some(Array.isArray); } /** * Creates an animation function that is optionally scoped * to a specific element. */ function createScopedAnimate(options = {}) { const { scope, reduceMotion } = options; /** * Implementation */ function scopedAnimate(subjectOrSequence, optionsOrKeyframes, options) { let animations = []; let animationOnComplete; if (isSequence(subjectOrSequence)) { animations = animateSequence(subjectOrSequence, reduceMotion !== undefined ? { reduceMotion, ...optionsOrKeyframes } : optionsOrKeyframes, scope); } else { // Extract top-level onComplete so it doesn't get applied per-value const { onComplete, ...rest } = options || {}; if (typeof onComplete === "function") { animationOnComplete = onComplete; } animations = animateSubject(subjectOrSequence, optionsOrKeyframes, (reduceMotion !== undefined ? { reduceMotion, ...rest } : rest), scope); } const animation = new GroupAnimationWithThen(animations); if (animationOnComplete) { animation.finished.then(animationOnComplete); } if (scope) { scope.animations.push(animation); animation.finished.then(() => { removeItem(scope.animations, animation); }); } return animation; } return scopedAnimate; } const animate = createScopedAnimate(); export { animate, createScopedAnimate }; //# sourceMappingURL=index.mjs.map