{"version":3,"file":"visual-element-target.mjs","sources":["../../../../src/animation/interfaces/visual-element-target.ts"],"sourcesContent":["import { frame } from \"../../frameloop\"\nimport { getValueTransition } from \"../utils/get-value-transition\"\nimport { resolveTransition } from \"../utils/resolve-transition\"\nimport { positionalKeys } from \"../../render/utils/keys-position\"\nimport { setTarget } from \"../../render/utils/setters\"\nimport { addValueToWillChange } from \"../../value/will-change/add-will-change\"\nimport { getOptimisedAppearId } from \"../optimized-appear/get-appear-id\"\nimport { animateMotionValue } from \"./motion-value\"\nimport type { VisualElementAnimationOptions } from \"./types\"\nimport type { AnimationPlaybackControlsWithThen } from \"../types\"\nimport type { TargetAndTransition } from \"../../node/types\"\nimport type { AnimationTypeState } from \"../../render/utils/animation-state\"\nimport type { VisualElement } from \"../../render/VisualElement\"\n\n/**\n * Decide whether we should block this animation. Previously, we achieved this\n * just by checking whether the key was listed in protectedKeys, but this\n * posed problems if an animation was triggered by afterChildren and protectedKeys\n * had been set to true in the meantime.\n */\nfunction shouldBlockAnimation(\n    { protectedKeys, needsAnimating }: AnimationTypeState,\n    key: string\n) {\n    const shouldBlock =\n        protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true\n\n    needsAnimating[key] = false\n    return shouldBlock\n}\n\nexport function animateTarget(\n    visualElement: VisualElement,\n    targetAndTransition: TargetAndTransition,\n    { delay = 0, transitionOverride, type }: VisualElementAnimationOptions = {}\n): AnimationPlaybackControlsWithThen[] {\n    let {\n        transition,\n        transitionEnd,\n        ...target\n    } = targetAndTransition\n\n    const defaultTransition = visualElement.getDefaultTransition()\n    transition = transition\n        ? resolveTransition(transition, defaultTransition)\n        : defaultTransition\n\n    const reduceMotion = (transition as { reduceMotion?: boolean })?.reduceMotion\n\n    if (transitionOverride) transition = transitionOverride\n\n    const animations: AnimationPlaybackControlsWithThen[] = []\n\n    const animationTypeState =\n        type &&\n        visualElement.animationState &&\n        visualElement.animationState.getState()[type]\n\n    for (const key in target) {\n        const value = visualElement.getValue(\n            key,\n            visualElement.latestValues[key] ?? null\n        )\n        const valueTarget = target[key as keyof typeof target]\n\n        if (\n            valueTarget === undefined ||\n            (animationTypeState &&\n                shouldBlockAnimation(animationTypeState, key))\n        ) {\n            continue\n        }\n\n        const valueTransition = {\n            delay,\n            ...getValueTransition(transition || {}, key),\n        }\n\n        /**\n         * If the value is already at the defined target, skip the animation.\n         * We still re-assert the value via frame.update to take precedence\n         * over any stale transitionEnd callbacks from previous animations.\n         */\n        const currentValue = value.get()\n        if (\n            currentValue !== undefined &&\n            !value.isAnimating() &&\n            !Array.isArray(valueTarget) &&\n            valueTarget === currentValue &&\n            !valueTransition.velocity\n        ) {\n            frame.update(() => value.set(valueTarget as any))\n            continue\n        }\n\n        /**\n         * If this is the first time a value is being animated, check\n         * to see if we're handling off from an existing animation.\n         */\n        let isHandoff = false\n        if (window.MotionHandoffAnimation) {\n            const appearId = getOptimisedAppearId(visualElement)\n\n            if (appearId) {\n                const startTime = window.MotionHandoffAnimation(\n                    appearId,\n                    key,\n                    frame\n                )\n\n                if (startTime !== null) {\n                    valueTransition.startTime = startTime\n                    isHandoff = true\n                }\n            }\n        }\n\n        addValueToWillChange(visualElement, key)\n\n        const shouldReduceMotion =\n            reduceMotion ?? visualElement.shouldReduceMotion\n\n        value.start(\n            animateMotionValue(\n                key,\n                value,\n                valueTarget,\n                shouldReduceMotion && positionalKeys.has(key)\n                    ? { type: false }\n                    : valueTransition,\n                visualElement,\n                isHandoff\n            )\n        )\n\n        const animation = value.animation\n\n        if (animation) {\n            animations.push(animation)\n        }\n    }\n\n    if (transitionEnd) {\n        const applyTransitionEnd = () =>\n            frame.update(() => {\n                transitionEnd && setTarget(visualElement, transitionEnd)\n            })\n\n        if (animations.length) {\n            Promise.all(animations).then(applyTransitionEnd)\n        } else {\n            applyTransitionEnd()\n        }\n    }\n\n    return animations\n}\n"],"names":[],"mappings":"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"}