const hasSlottedElements = (el: HTMLElement, name?: string): boolean => {
const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
if (slot) {
return slot.assignedElements({ flatten: true }).length > 0
}
return false
}
const hasSlottedNodes = (el: HTMLElement, name?: string): boolean => {
const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
if (slot) {
return slot.assignedNodes().length > 0
}
return false
}
const hasSlotted = (el: HTMLElement, name?: string): boolean => {
const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
if (slot) {
return slot.assignedNodes().length > 0 || slot.assignedElements().length > 0
}
return false
}
const hasSlottedContent = (el: HTMLElement, name?: string): boolean => {
const query = name ? `slot[name="${name}"]` : 'slot:not([name])'
const slot: HTMLSlotElement = el.shadowRoot?.querySelector(query) as HTMLSlotElement
if (!slot) return false
const assignedNodes = slot.assignedNodes({ flatten: true })
return assignedNodes.some(node =>
node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== '',
)
}
export {
hasSlottedElements,
hasSlottedNodes,
hasSlottedContent,
hasSlotted,
}