@kcirtaptrick/framer-motion
Version:
A simple and powerful React animation library
113 lines (110 loc) • 4.12 kB
JavaScript
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 };