{"version":3,"file":"setFocus.mjs","names":["lastInteraction","canUseDOM","getFocusableIn","unsafeSetFocus","node","previousActiveElement","actualActiveElement","focusOptions","activeElement","document","focusable","target","compareDocumentPosition","Node","DOCUMENT_POSITION_PRECEDING","DOCUMENT_POSITION_CONTAINS","length","focus","focusVisible","isKeyboard","preventScroll","isMouse","focusMoveRequests","focusMoveDisabledUntil","lastUserAction","safeSetFocus","args","Date","now","push","lastFocusMoveRequests","slice","timeBetweenFocusMoveRequests","map","time","index","Math","abs","every","console","error","addEventListener","capture","setFocus"],"sources":["../../../src/utils/focus-lock/setFocus.ts"],"sourcesContent":["import { lastInteraction } from '../../LastInteractionType';\nimport canUseDOM from '../canUseDOM';\nimport { getFocusableIn } from './getFocusableIn';\n\nconst unsafeSetFocus = (\n  node: HTMLElement,\n  previousActiveElement?: HTMLElement | null,\n  actualActiveElement?: HTMLElement,\n  focusOptions: FocusOptions = {},\n) => {\n  const activeElement = actualActiveElement || document.activeElement;\n\n  const focusable = getFocusableIn(node);\n\n  let target = focusable[0];\n\n  if (\n    activeElement &&\n    previousActiveElement &&\n    previousActiveElement.compareDocumentPosition(activeElement) &\n    Node.DOCUMENT_POSITION_PRECEDING &&\n    !(\n      previousActiveElement.compareDocumentPosition(activeElement) & Node.DOCUMENT_POSITION_CONTAINS\n    )\n  ) {\n    target = focusable[focusable.length - 1];\n  }\n\n  target?.focus({\n    // @ts-ignore. set focus-visible in FF and Safari\n    focusVisible: lastInteraction.isKeyboard(),\n    preventScroll: lastInteraction.isMouse(),\n    ...focusOptions,\n  });\n};\n\n/** \"safe\" focus movement means that function wrapper tries\n * to detect focus war (when two focus locks are trying to\n * control focus recursively) and disables it for 10 seconds\n */\nlet focusMoveRequests: number[] = [];\nlet focusMoveDisabledUntil = 0;\nlet lastUserAction = 0;\nconst safeSetFocus: typeof unsafeSetFocus = (...args) => {\n  if (focusMoveDisabledUntil > Date.now()) return;\n  focusMoveRequests.push(Date.now());\n  if (focusMoveRequests.length > 10 && Date.now() - lastUserAction > 600) {\n    const lastFocusMoveRequests = focusMoveRequests.slice(-10);\n    const timeBetweenFocusMoveRequests = lastFocusMoveRequests\n      .slice(1)\n      .map((time, index) => Math.abs(time - lastFocusMoveRequests[index]));\n    if (timeBetweenFocusMoveRequests.every((time) => time < 250)) {\n      focusMoveDisabledUntil = Date.now() + 10000;\n      focusMoveRequests = [];\n\n      // eslint-disable-next-line no-console\n      console.error(\n        '[useFocusLock] Probably the focus war was detected. It is a process when multiple browser focus control subjects are reacting to \"blur\" event on their element and are trying to get it back. Focus move function was disabled for 10 seconds. Probably your page has different focus lock systems. If you have multiple versions of Intergalactic components, updated them to the latest version (at least to 15.16.3).',\n      );\n      return;\n    }\n  }\n  if (focusMoveRequests.length > 500) focusMoveRequests = focusMoveRequests.slice(-10);\n\n  return unsafeSetFocus(...args);\n};\nif (canUseDOM()) {\n  document.addEventListener(\n    'keydown',\n    () => {\n      lastUserAction = Date.now();\n    },\n    { capture: true },\n  );\n  document.addEventListener(\n    'mousedown',\n    () => {\n      lastUserAction = Date.now();\n    },\n    { capture: true },\n  );\n}\n\nexport const setFocus = safeSetFocus;\n"],"mappings":"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","ignoreList":[]}