{"version":3,"file":"focusBorders.mjs","names":["getFocusableIn","focusBordersRefs","Map","BEFORE_BORDER_ID","AFTER_BORDER_ID","addFocusBorders","element","has","previousSibling","HTMLElement","dataset","id","before","document","createElement","after","set","setAttribute","style","position","addEventListener","event","activeElement","get","relatedTarget","focusable","length","focus","elementParent","parentElement","insertBefore","append","removeFocusBorders","focusRefs","remove","delete"],"sources":["../../../src/utils/focus-lock/focusBorders.ts"],"sourcesContent":["import { getFocusableIn } from './getFocusableIn';\n\nconst focusBordersRefs = new Map<HTMLElement, { before: HTMLElement; after: HTMLElement }>();\n\nexport const BEFORE_BORDER_ID = '__intergalactic-focus-border-before';\nexport const AFTER_BORDER_ID = '__intergalactic-focus-border-after';\n\nexport const addFocusBorders = (element: HTMLElement) => {\n  if (\n    !focusBordersRefs.has(element) &&\n    !(\n      element.previousSibling instanceof HTMLElement &&\n      element.previousSibling.dataset.id === BEFORE_BORDER_ID\n    )\n  ) {\n    const before = document.createElement('div');\n    const after = document.createElement('div');\n\n    focusBordersRefs.set(element, { before, after });\n\n    before.setAttribute('tabindex', '0');\n    before.style.position = 'fixed';\n    before.dataset.id = BEFORE_BORDER_ID;\n    before.addEventListener('focus', (event) => {\n      if (\n        document.activeElement === focusBordersRefs.get(element)?.before &&\n        event.relatedTarget !== focusBordersRefs.get(element)?.after && // prevent loop\n        event.relatedTarget // prevent initial focus\n      ) {\n        const focusable = getFocusableIn(element);\n\n        if (event.relatedTarget === focusable[0]) {\n          focusable[focusable.length - 1]?.focus();\n        } else {\n          focusable[0]?.focus();\n        }\n      }\n    });\n\n    after.setAttribute('tabindex', '0');\n    after.style.position = 'fixed';\n    after.dataset.id = AFTER_BORDER_ID;\n    after.addEventListener('focus', (event) => {\n      if (\n        document.activeElement === focusBordersRefs.get(element)?.after &&\n        event.relatedTarget !== focusBordersRefs.get(element)?.before && // prevent loop\n        event.relatedTarget // prevent initial focus\n      ) {\n        const focusable = getFocusableIn(element);\n\n        if (event.relatedTarget === focusable[focusable.length - 1]) {\n          focusable[0]?.focus();\n        } else {\n          focusable[focusable.length - 1]?.focus();\n        }\n      }\n    });\n\n    const elementParent = element.parentElement;\n\n    elementParent?.insertBefore(before, element);\n    elementParent?.append(after);\n  }\n};\nexport const removeFocusBorders = (element: HTMLElement) => {\n  const focusRefs = focusBordersRefs.get(element);\n  focusRefs?.before.remove();\n  focusRefs?.after.remove();\n  focusBordersRefs.delete(element);\n};\n"],"mappings":"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","ignoreList":[]}