Skip to content

Instantly share code, notes, and snippets.

/**
* cloneNode(true), but also clones shadow roots.
* @param {Element}
* @param {ShadowRoot[]} [shadowRoots] Any closed shadow roots passed here will be included.
*/
function cloneWithShadowRoots(node, shadowRoots = []) {
function walk(node, clone) {
let shadow = node.shadowRoot || shadowRoots.find(r => r.host === node);
if (shadow) {
(clone.shadowRoot || clone.attachShadow({ mode: shadow.mode })).append(...[].map.call(shadow.childNodes, c => c.cloneNode(true)));