{"version":3,"file":"stack.mjs","sources":["../../../../src/projection/shared/stack.ts"],"sourcesContent":["import { addUniqueItem, removeItem } from \"motion-utils\"\nimport { IProjectionNode } from \"../node/types\"\n\nexport class NodeStack {\n    lead?: IProjectionNode\n    prevLead?: IProjectionNode\n    members: IProjectionNode[] = []\n\n    add(node: IProjectionNode) {\n        addUniqueItem(this.members, node)\n        node.scheduleRender()\n    }\n\n    remove(node: IProjectionNode) {\n        removeItem(this.members, node)\n        if (node === this.prevLead) {\n            this.prevLead = undefined\n        }\n        if (node === this.lead) {\n            const prevLead = this.members[this.members.length - 1]\n            if (prevLead) {\n                this.promote(prevLead)\n            }\n        }\n    }\n\n    relegate(node: IProjectionNode): boolean {\n        const indexOfNode = this.members.findIndex((member) => node === member)\n        if (indexOfNode === 0) return false\n\n        /**\n         * Find the next projection node that is present\n         */\n        let prevLead: IProjectionNode | undefined\n        for (let i = indexOfNode; i >= 0; i--) {\n            const member = this.members[i]\n            if (member.isPresent !== false) {\n                prevLead = member\n                break\n            }\n        }\n\n        if (prevLead) {\n            this.promote(prevLead)\n            return true\n        } else {\n            return false\n        }\n    }\n\n    promote(node: IProjectionNode, preserveFollowOpacity?: boolean) {\n        const prevLead = this.lead\n\n        if (node === prevLead) return\n\n        this.prevLead = prevLead\n        this.lead = node\n\n        node.show()\n\n        if (prevLead) {\n            prevLead.instance && prevLead.scheduleRender()\n            node.scheduleRender()\n            node.resumeFrom = prevLead\n\n            if (preserveFollowOpacity) {\n                node.resumeFrom.preserveOpacity = true\n            }\n\n            if (prevLead.snapshot) {\n                node.snapshot = prevLead.snapshot\n                node.snapshot.latestValues =\n                    prevLead.animationValues || prevLead.latestValues\n            }\n\n            if (node.root && node.root.isUpdating) {\n                node.isLayoutDirty = true\n            }\n\n            const { crossfade } = node.options\n            if (crossfade === false) {\n                prevLead.hide()\n            } else {\n            }\n            /**\n             * TODO:\n             *   - Test border radius when previous node was deleted\n             *   - boxShadow mixing\n             *   - Shared between element A in scrolled container and element B (scroll stays the same or changes)\n             *   - Shared between element A in transformed container and element B (transform stays the same or changes)\n             *   - Shared between element A in scrolled page and element B (scroll stays the same or changes)\n             * ---\n             *   - Crossfade opacity of root nodes\n             *   - layoutId changes after animation\n             *   - layoutId changes mid animation\n             */\n        }\n    }\n\n    exitAnimationComplete() {\n        this.members.forEach((node) => {\n            const { options, resumingFrom } = node\n\n            options.onExitComplete && options.onExitComplete()\n\n            if (resumingFrom) {\n                resumingFrom.options.onExitComplete &&\n                    resumingFrom.options.onExitComplete()\n            }\n        })\n    }\n\n    scheduleRender() {\n        this.members.forEach((node) => {\n            node.instance && node.scheduleRender(false)\n        })\n    }\n\n    /**\n     * Clear any leads that have been removed this render to prevent them from being\n     * used in future animations and to prevent memory leaks\n     */\n    removeLeadSnapshot() {\n        if (this.lead && this.lead.snapshot) {\n            this.lead.snapshot = undefined\n        }\n    }\n}\n"],"names":[],"mappings":";;MAGa,SAAS,CAAA;AAAtB,IAAA,WAAA,GAAA;QAGI,IAAO,CAAA,OAAA,GAAsB,EAAE,CAAA;KAyHlC;AAvHG,IAAA,GAAG,CAAC,IAAqB,EAAA;AACrB,QAAA,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,cAAc,EAAE,CAAA;KACxB;AAED,IAAA,MAAM,CAAC,IAAqB,EAAA;AACxB,QAAA,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAC9B,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;AACxB,YAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;SAC5B;AACD,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AACpB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACtD,IAAI,QAAQ,EAAE;AACV,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;aACzB;SACJ;KACJ;AAED,IAAA,QAAQ,CAAC,IAAqB,EAAA;AAC1B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC,CAAA;QACvE,IAAI,WAAW,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAA;AAEnC;;AAEG;AACH,QAAA,IAAI,QAAqC,CAAA;AACzC,QAAA,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9B,YAAA,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE;gBAC5B,QAAQ,GAAG,MAAM,CAAA;gBACjB,MAAK;aACR;SACJ;QAED,IAAI,QAAQ,EAAE;AACV,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AACtB,YAAA,OAAO,IAAI,CAAA;SACd;aAAM;AACH,YAAA,OAAO,KAAK,CAAA;SACf;KACJ;IAED,OAAO,CAAC,IAAqB,EAAE,qBAA+B,EAAA;AAC1D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAA;QAE1B,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAM;AAE7B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAEhB,IAAI,CAAC,IAAI,EAAE,CAAA;QAEX,IAAI,QAAQ,EAAE;AACV,YAAA,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAA;YAC9C,IAAI,CAAC,cAAc,EAAE,CAAA;AACrB,YAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAA;YAE1B,IAAI,qBAAqB,EAAE;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAA;aACzC;AAED,YAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;gBACjC,IAAI,CAAC,QAAQ,CAAC,YAAY;AACtB,oBAAA,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,YAAY,CAAA;aACxD;YAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACnC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;aAC5B;AAED,YAAA,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;AAClC,YAAA,IAAI,SAAS,KAAK,KAAK,EAAE;gBACrB,QAAQ,CAAC,IAAI,EAAE,CAAA;aAElB;AACD;;;;;;;;;;;AAWG;SACN;KACJ;IAED,qBAAqB,GAAA;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC1B,YAAA,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;AAEtC,YAAA,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,EAAE,CAAA;YAElD,IAAI,YAAY,EAAE;gBACd,YAAY,CAAC,OAAO,CAAC,cAAc;AAC/B,oBAAA,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,CAAA;aAC5C;AACL,SAAC,CAAC,CAAA;KACL;IAED,cAAc,GAAA;QACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YAC1B,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAC/C,SAAC,CAAC,CAAA;KACL;AAED;;;AAGG;IACH,kBAAkB,GAAA;QACd,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;SACjC;KACJ;AACJ;;;;"}