UNPKG

@kcirtaptrick/framer-motion

Version:

A simple and powerful React animation library

113 lines (110 loc) 4.12 kB
import { addUniqueItem, removeItem } from '../../utils/array.mjs'; var NodeStack = /** @class */ (function () { function NodeStack() { this.members = []; } NodeStack.prototype.add = function (node) { addUniqueItem(this.members, node); node.scheduleRender(); }; NodeStack.prototype.remove = function (node) { removeItem(this.members, node); if (node === this.prevLead) { this.prevLead = undefined; } if (node === this.lead) { var prevLead = this.members[this.members.length - 1]; if (prevLead) { this.promote(prevLead); } } }; NodeStack.prototype.relegate = function (node) { var indexOfNode = this.members.findIndex(function (member) { return node === member; }); if (indexOfNode === 0) return false; /** * Find the next projection node that is present */ var prevLead; for (var i = indexOfNode; i >= 0; i--) { var member = this.members[i]; if (member.isPresent !== false) { prevLead = member; break; } } if (prevLead) { this.promote(prevLead); return true; } else { return false; } }; NodeStack.prototype.promote = function (node, preserveFollowOpacity) { var _a; var prevLead = this.lead; if (node === prevLead) return; this.prevLead = prevLead; this.lead = node; node.show(); if (prevLead) { prevLead.instance && prevLead.scheduleRender(); node.scheduleRender(); node.resumeFrom = prevLead; if (preserveFollowOpacity) { node.resumeFrom.preserveOpacity = true; } if (prevLead.snapshot) { node.snapshot = prevLead.snapshot; node.snapshot.latestValues = prevLead.animationValues || prevLead.latestValues; node.snapshot.isShared = true; } if ((_a = node.root) === null || _a === void 0 ? void 0 : _a.isUpdating) { node.isLayoutDirty = true; } var crossfade = node.options.crossfade; if (crossfade === false) { prevLead.hide(); } /** * TODO: * - Test border radius when previous node was deleted * - boxShadow mixing * - Shared between element A in scrolled container and element B (scroll stays the same or changes) * - Shared between element A in transformed container and element B (transform stays the same or changes) * - Shared between element A in scrolled page and element B (scroll stays the same or changes) * --- * - Crossfade opacity of root nodes * - layoutId changes after animation * - layoutId changes mid animation */ } }; NodeStack.prototype.exitAnimationComplete = function () { this.members.forEach(function (node) { var _a, _b, _c, _d, _e; (_b = (_a = node.options).onExitComplete) === null || _b === void 0 ? void 0 : _b.call(_a); (_e = (_c = node.resumingFrom) === null || _c === void 0 ? void 0 : (_d = _c.options).onExitComplete) === null || _e === void 0 ? void 0 : _e.call(_d); }); }; NodeStack.prototype.scheduleRender = function () { this.members.forEach(function (node) { node.instance && node.scheduleRender(false); }); }; /** * Clear any leads that have been removed this render to prevent them from being * used in future animations and to prevent memory leaks */ NodeStack.prototype.removeLeadSnapshot = function () { if (this.lead && this.lead.snapshot) { this.lead.snapshot = undefined; } }; return NodeStack; }()); export { NodeStack };