{"version":3,"file":"effects.mjs","sources":["../../../../src/animation/animate/effects.ts"],"sourcesContent":["import { invariant, removeItem } from \"motion-utils\"\nimport { AnimateEffect } from \"../../effects/utils/create-effect\"\nimport { motionValue } from \"../../value\"\nimport { animateMotionValue } from \"../interfaces/motion-value\"\nimport {\n    AnimationPlaybackControlsWithThen,\n    UnresolvedValueKeyframe,\n    ValueAnimationTransition,\n} from \"../types\"\nimport { getValueTransition } from \"../utils/get-value-transition\"\n\n/**\n * Effects registered via `animate.addEffect()`, most recent first.\n */\nconst effects: AnimateEffect<any>[] = []\n\nexport function addEffect(effect: AnimateEffect<any>): void {\n    invariant(\n        typeof effect.test === \"function\" && typeof effect.read === \"function\",\n        \"Effects passed to animate.addEffect() need test() and read().\",\n        \"effect-missing-test\"\n    )\n\n    removeEffect(effect)\n    effects.unshift(effect)\n}\n\nexport function removeEffect(effect: AnimateEffect<any>): void {\n    removeItem(effects, effect)\n}\n\nexport function findEffect(subject: unknown): AnimateEffect | undefined {\n    return effects.find((effect) => effect.test(subject))\n}\n\nexport type EffectKeyframes = Record<\n    string,\n    UnresolvedValueKeyframe | UnresolvedValueKeyframe[]\n>\n\n/**\n * Effect subjects can expose any key, so per-key transition overrides\n * are keyed by arbitrary strings.\n */\nexport type EffectTransition = ValueAnimationTransition &\n    Record<string, unknown>\n\n/**\n * Animate the keys of `subject` via `effect`. Motion values are created on\n * first animation, seeded from `effect.read()` or the first keyframe, and\n * then bound to the subject via the effect for the rest of its life.\n */\nexport function animateEffectSubject<Subject extends object>(\n    effect: AnimateEffect<Subject>,\n    subject: Subject,\n    keyframes: EffectKeyframes,\n    transition: EffectTransition = {}\n): AnimationPlaybackControlsWithThen[] {\n    const animations: AnimationPlaybackControlsWithThen[] = []\n\n    for (const key in keyframes) {\n        const target = keyframes[key]\n        let value = effect.get(subject, key)\n\n        if (!value) {\n            const initial =\n                effect.read(subject, key, target) ?? firstKeyframe(target)\n\n            invariant(\n                initial !== undefined,\n                `\"${key}\" can't be read from the animated subject. Provide [from, to] keyframes.`,\n                \"effect-unreadable-value\"\n            )\n\n            value = motionValue(initial)\n            effect(subject, { [key]: value })\n        }\n\n        value.start(\n            animateMotionValue(\n                key,\n                value,\n                target as any,\n                getValueTransition(transition, key)\n            )\n        )\n\n        value.animation && animations.push(value.animation)\n    }\n\n    return animations\n}\n\nfunction firstKeyframe(\n    target: UnresolvedValueKeyframe | UnresolvedValueKeyframe[]\n) {\n    const first = Array.isArray(target) ? target[0] : undefined\n    return first === null ? undefined : first\n}\n"],"names":[],"mappings":";;;;;AAWA;;AAEG;AACH,MAAM,OAAO,GAAyB,EAAE;AAElC,SAAU,SAAS,CAAC,MAA0B,EAAA;AAChD,IAAA,SAAS,CACL,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EACtE,+DAA+D,EAC/D,qBAAqB,CACxB;IAED,YAAY,CAAC,MAAM,CAAC;AACpB,IAAA,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC3B;AAEM,SAAU,YAAY,CAAC,MAA0B,EAAA;AACnD,IAAA,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;AAC/B;AAEM,SAAU,UAAU,CAAC,OAAgB,EAAA;AACvC,IAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzD;AAcA;;;;AAIG;AACG,SAAU,oBAAoB,CAChC,MAA8B,EAC9B,OAAgB,EAChB,SAA0B,EAC1B,UAAA,GAA+B,EAAE,EAAA;IAEjC,MAAM,UAAU,GAAwC,EAAE;AAE1D,IAAA,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;QAC7B,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QAEpC,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,MAAM,OAAO,GACT,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;YAE9D,SAAS,CACL,OAAO,KAAK,SAAS,EACrB,CAAA,CAAA,EAAI,GAAG,CAAA,wEAAA,CAA0E,EACjF,yBAAyB,CAC5B;AAED,YAAA,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC;YAC5B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;QACrC;AAEA,QAAA,KAAK,CAAC,KAAK,CACP,kBAAkB,CACd,GAAG,EACH,KAAK,EACL,MAAa,EACb,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,CACtC,CACJ;QAED,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACvD;AAEA,IAAA,OAAO,UAAU;AACrB;AAEA,SAAS,aAAa,CAClB,MAA2D,EAAA;AAE3D,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;IAC3D,OAAO,KAAK,KAAK,IAAI,GAAG,SAAS,GAAG,KAAK;AAC7C;;;;"}