import { defaultDocument } from "../configurable-globals.js"; /** * Handles getting the active element in a document or shadow root. * If the active element is within a shadow root, it will traverse the shadow root * to find the active element. * If not, it will return the active element in the document. * * @param document A document or shadow root to get the active element from. * @returns The active element in the document or shadow root. */ export function getActiveElement(document) { let activeElement = document.activeElement; while (activeElement?.shadowRoot) { const node = activeElement.shadowRoot.activeElement; if (node === activeElement) break; else activeElement = node; } return activeElement; } /** * Returns the owner document of a given element. * * @param node The element to get the owner document from. * @returns */ export function getOwnerDocument(node, fallback = defaultDocument) { return node?.ownerDocument ?? fallback; } /** * Checks if an element is or is contained by another element. * * @param node The element to check if it or its descendants contain the target element. * @param target The element to check if it is contained by the node. * @returns */ export function isOrContainsTarget(node, target) { return node === target || node.contains(target); }