Skip to content

Instantly share code, notes, and snippets.

@defx
Last active December 12, 2020 16:54
Show Gist options
  • Save defx/d5dbe1ba11495474431633fff1e116e1 to your computer and use it in GitHub Desktop.
Save defx/d5dbe1ba11495474431633fff1e116e1 to your computer and use it in GitHub Desktop.
Manual slot resolution without Shadow DOM (not recommended, more of a hypothetical in the absence of declarative Shadow DOM)
const childNodes = (node) => {
let frag = document.createDocumentFragment();
while (node.firstChild) {
frag.appendChild(node.firstChild);
}
return frag;
};
export default function merge(targetNode, sourceNode) {
let namedSlots = sourceNode.querySelectorAll('slot[name]');
namedSlots.forEach((slot) => {
let name = slot.attributes.name.value;
let node = targetNode.querySelector(`[slot="${name}"]`);
if (!node) {
slot.parentNode.replaceChild(childNodes(slot), slot);
return;
}
node.removeAttribute('slot');
slot.parentNode.replaceChild(node, slot);
});
let defaultSlot = sourceNode.querySelector('slot:not([name])');
if (defaultSlot) {
defaultSlot.parentNode.replaceChild(
childNodes(targetNode.innerHTML.trim() ? targetNode : defaultSlot),
defaultSlot
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment