import {HTMLElement} from './element.js'; import {registerHTMLClass} from '../shared/register-html-class.js'; const tagName = 'slot'; /** * @implements globalThis.HTMLSlotElement */ class HTMLSlotElement extends HTMLElement { constructor(ownerDocument, localName = tagName) { super(ownerDocument, localName); } /* c8 ignore start */ get name() { return this.getAttribute('name'); } set name(value) { this.setAttribute('name', value); } assign() {} assignedNodes(options) { const isNamedSlot = !!this.name; const hostChildNodes = this.getRootNode().host?.childNodes ?? []; let slottables; if (isNamedSlot) { slottables = [...hostChildNodes].filter(node => node.slot === this.name); } else { slottables = [...hostChildNodes].filter(node => !node.slot); } if (options?.flatten) { const result = []; // Element and Text nodes are slottables. A slot can be a slottable. for (let slottable of slottables) { if (slottable.localName === 'slot') { result.push(...slottable.assignedNodes({ flatten: true })); } else { result.push(slottable); } } slottables = result; } // If no assigned nodes are found, it returns the slot's fallback content. return slottables.length ? slottables : [...this.childNodes]; } assignedElements(options) { const slottables = this.assignedNodes(options).filter(n => n.nodeType === 1); // If no assigned elements are found, it returns the slot's fallback content. return slottables.length ? slottables : [...this.children]; } /* c8 ignore stop */ } registerHTMLClass(tagName, HTMLSlotElement); export {HTMLSlotElement};