{"version":3,"file":"animation-controls.mjs","sources":["../../../../src/animation/hooks/animation-controls.ts"],"sourcesContent":["import {\n    animateVisualElement,\n    setTarget,\n    type AnimationDefinition,\n    type LegacyAnimationControls,\n    type VisualElement,\n} from \"motion-dom\"\nimport { invariant } from \"motion-utils\"\n\nfunction stopAnimation(visualElement: VisualElement) {\n    visualElement.values.forEach((value) => value.stop())\n}\n\nfunction setVariants(visualElement: VisualElement, variantLabels: string[]) {\n    const reversedLabels = [...variantLabels].reverse()\n\n    reversedLabels.forEach((key) => {\n        const variant = visualElement.getVariant(key)\n        variant && setTarget(visualElement, variant)\n\n        if (visualElement.variantChildren) {\n            visualElement.variantChildren.forEach((child) => {\n                setVariants(child, variantLabels)\n            })\n        }\n    })\n}\n\nexport function setValues(\n    visualElement: VisualElement,\n    definition: AnimationDefinition\n) {\n    if (Array.isArray(definition)) {\n        return setVariants(visualElement, definition)\n    } else if (typeof definition === \"string\") {\n        return setVariants(visualElement, [definition])\n    } else {\n        setTarget(visualElement, definition as any)\n    }\n}\n\n/**\n * @public\n */\nexport function animationControls(): LegacyAnimationControls {\n    /**\n     * Track whether the host component has mounted.\n     */\n    let hasMounted = false\n\n    /**\n     * A collection of linked component animation controls.\n     */\n    const subscribers = new Set<VisualElement>()\n\n    const controls: LegacyAnimationControls = {\n        subscribe(visualElement) {\n            subscribers.add(visualElement)\n            return () => void subscribers.delete(visualElement)\n        },\n\n        start(definition, transitionOverride) {\n            invariant(\n                hasMounted,\n                \"controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.\"\n            )\n\n            const animations: Array<Promise<any>> = []\n            subscribers.forEach((visualElement) => {\n                animations.push(\n                    animateVisualElement(visualElement, definition, {\n                        transitionOverride,\n                    })\n                )\n            })\n\n            return Promise.all(animations)\n        },\n\n        set(definition) {\n            invariant(\n                hasMounted,\n                \"controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.\"\n            )\n\n            return subscribers.forEach((visualElement) => {\n                setValues(visualElement, definition)\n            })\n        },\n\n        stop() {\n            subscribers.forEach((visualElement) => {\n                stopAnimation(visualElement)\n            })\n        },\n\n        mount() {\n            hasMounted = true\n\n            return () => {\n                hasMounted = false\n                controls.stop()\n            }\n        },\n    }\n\n    return controls\n}\n"],"names":[],"mappings":";;;AASA,SAAS,aAAa,CAAC,aAA4B,EAAA;AAC/C,IAAA,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACzD;AAEA,SAAS,WAAW,CAAC,aAA4B,EAAE,aAAuB,EAAA;IACtE,MAAM,cAAc,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE;AAEnD,IAAA,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;QAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;AAC7C,QAAA,OAAO,IAAI,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC;AAE5C,QAAA,IAAI,aAAa,CAAC,eAAe,EAAE;YAC/B,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC5C,gBAAA,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC;AACrC,YAAA,CAAC,CAAC;QACN;AACJ,IAAA,CAAC,CAAC;AACN;AAEM,SAAU,SAAS,CACrB,aAA4B,EAC5B,UAA+B,EAAA;AAE/B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC3B,QAAA,OAAO,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC;IACjD;AAAO,SAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;QACvC,OAAO,WAAW,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC;IACnD;SAAO;AACH,QAAA,SAAS,CAAC,aAAa,EAAE,UAAiB,CAAC;IAC/C;AACJ;AAEA;;AAEG;SACa,iBAAiB,GAAA;AAC7B;;AAEG;IACH,IAAI,UAAU,GAAG,KAAK;AAEtB;;AAEG;AACH,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiB;AAE5C,IAAA,MAAM,QAAQ,GAA4B;AACtC,QAAA,SAAS,CAAC,aAAa,EAAA;AACnB,YAAA,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;YAC9B,OAAO,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC;QACvD,CAAC;QAED,KAAK,CAAC,UAAU,EAAE,kBAAkB,EAAA;AAChC,YAAA,SAAS,CACL,UAAU,EACV,iHAAiH,CACpH;YAED,MAAM,UAAU,GAAwB,EAAE;AAC1C,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;gBAClC,UAAU,CAAC,IAAI,CACX,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE;oBAC5C,kBAAkB;AACrB,iBAAA,CAAC,CACL;AACL,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAClC,CAAC;AAED,QAAA,GAAG,CAAC,UAAU,EAAA;AACV,YAAA,SAAS,CACL,UAAU,EACV,+GAA+G,CAClH;AAED,YAAA,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;AACzC,gBAAA,SAAS,CAAC,aAAa,EAAE,UAAU,CAAC;AACxC,YAAA,CAAC,CAAC;QACN,CAAC;QAED,IAAI,GAAA;AACA,YAAA,WAAW,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;gBAClC,aAAa,CAAC,aAAa,CAAC;AAChC,YAAA,CAAC,CAAC;QACN,CAAC;QAED,KAAK,GAAA;YACD,UAAU,GAAG,IAAI;AAEjB,YAAA,OAAO,MAAK;gBACR,UAAU,GAAG,KAAK;gBAClB,QAAQ,CAAC,IAAI,EAAE;AACnB,YAAA,CAAC;QACL,CAAC;KACJ;AAED,IAAA,OAAO,QAAQ;AACnB;;;;"}