/* c8 ignore start */ /** * Use a generator so we can iterate and possibly break early. * @example * // to operate like a regular array. This kinda nullifies generator benefits, but worth knowing if you need the whole array. * const allActiveElements = [...activeElements()] * * // Early return * for (const activeElement of activeElements()) { * if () { * break; // Break the loop, dont need to iterate over the whole array or store an array in memory! * } * } */ export function* activeElements( activeElement: Element | null = document.activeElement, ): Generator { if (activeElement === null || activeElement === undefined) return; yield activeElement; if ( 'shadowRoot' in activeElement && activeElement.shadowRoot && activeElement.shadowRoot.mode !== 'closed' ) { yield* activeElements(activeElement.shadowRoot.activeElement); } } export function getDeepestActiveElement() { return [...activeElements()].pop(); } /* c8 ignore end */