/** * Remove an element from the dom * * @category Manipulation * @param elem The element to be removed */ export function removeElement(elem) { if (elem.prev) elem.prev.next = elem.next; if (elem.next) elem.next.prev = elem.prev; if (elem.parent) { const childs = elem.parent.children; const childsIndex = childs.lastIndexOf(elem); if (childsIndex >= 0) { childs.splice(childsIndex, 1); } } elem.next = null; elem.prev = null; elem.parent = null; } /** * Replace an element in the dom * * @category Manipulation * @param elem The element to be replaced * @param replacement The element to be added */ export function replaceElement(elem, replacement) { const prev = (replacement.prev = elem.prev); if (prev) { prev.next = replacement; } const next = (replacement.next = elem.next); if (next) { next.prev = replacement; } const parent = (replacement.parent = elem.parent); if (parent) { const childs = parent.children; childs[childs.lastIndexOf(elem)] = replacement; elem.parent = null; } } /** * Append a child to an element. * * @category Manipulation * @param parent The element to append to. * @param child The element to be added as a child. */ export function appendChild(parent, child) { removeElement(child); child.next = null; child.parent = parent; if (parent.children.push(child) > 1) { const sibling = parent.children[parent.children.length - 2]; sibling.next = child; child.prev = sibling; } else { child.prev = null; } } /** * Append an element after another. * * @category Manipulation * @param elem The element to append after. * @param next The element be added. */ export function append(elem, next) { removeElement(next); const { parent } = elem; const currNext = elem.next; next.next = currNext; next.prev = elem; elem.next = next; next.parent = parent; if (currNext) { currNext.prev = next; if (parent) { const childs = parent.children; childs.splice(childs.lastIndexOf(currNext), 0, next); } } else if (parent) { parent.children.push(next); } } /** * Prepend a child to an element. * * @category Manipulation * @param parent The element to prepend before. * @param child The element to be added as a child. */ export function prependChild(parent, child) { removeElement(child); child.parent = parent; child.prev = null; if (parent.children.unshift(child) !== 1) { const sibling = parent.children[1]; sibling.prev = child; child.next = sibling; } else { child.next = null; } } /** * Prepend an element before another. * * @category Manipulation * @param elem The element to prepend before. * @param prev The element be added. */ export function prepend(elem, prev) { removeElement(prev); const { parent } = elem; if (parent) { const childs = parent.children; childs.splice(childs.indexOf(elem), 0, prev); } if (elem.prev) { elem.prev.next = prev; } prev.parent = parent; prev.prev = elem.prev; prev.next = elem; elem.prev = prev; } //# sourceMappingURL=manipulation.js.map