/** Isolate body siblings and late portals, restoring only the attributes this function changed. */ export function isolateBackground(keep: HTMLElement): () => void { const owned = new Map(); const isolate = (element: Element) => { if (element === keep || element.contains(keep) || owned.has(element) || element.hasAttribute('inert')) return; owned.set(element, element.getAttribute('aria-hidden')); element.setAttribute('inert', ''); element.setAttribute('aria-hidden', 'true'); }; Array.from(document.body.children).forEach(isolate); const observer = new MutationObserver((records) => { for (const record of records) { record.addedNodes.forEach((node) => { if (node instanceof Element) isolate(node); }); } }); observer.observe(document.body, { childList: true }); const holdFocus = (event: FocusEvent) => { if (event.target instanceof Node && keep.contains(event.target)) return; keep.querySelector('button, [href], input, [tabindex]:not([tabindex="-1"])')?.focus(); }; document.addEventListener('focusin', holdFocus, true); return () => { observer.disconnect(); document.removeEventListener('focusin', holdFocus, true); owned.forEach((ariaHidden, element) => { element.removeAttribute('inert'); if (ariaHidden === null) element.removeAttribute('aria-hidden'); else element.setAttribute('aria-hidden', ariaHidden); }); }; }