{"version":3,"file":"focus-trap.umd.min.js","sources":["../index.js"],"sourcesContent":["import { tabbable, isFocusable } from 'tabbable';\n\nconst activeFocusTraps = (function () {\n const trapQueue = [];\n return {\n activateTrap(trap) {\n if (trapQueue.length > 0) {\n const activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n const trapIndex = trapQueue.indexOf(trap);\n if (trapIndex === -1) {\n trapQueue.push(trap);\n } else {\n // move this existing trap to the front of the queue\n trapQueue.splice(trapIndex, 1);\n trapQueue.push(trap);\n }\n },\n\n deactivateTrap(trap) {\n const trapIndex = trapQueue.indexOf(trap);\n if (trapIndex !== -1) {\n trapQueue.splice(trapIndex, 1);\n }\n\n if (trapQueue.length > 0) {\n trapQueue[trapQueue.length - 1].unpause();\n }\n },\n };\n})();\n\nconst isSelectableInput = function (node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n};\n\nconst isEscapeEvent = function (e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n};\n\nconst isTabEvent = function (e) {\n return e.key === 'Tab' || e.keyCode === 9;\n};\n\nconst delay = function (fn) {\n return setTimeout(fn, 0);\n};\n\n// Array.find/findIndex() are not supported on IE; this replicates enough\n// of Array.findIndex() for our needs\nconst findIndex = function (arr, fn) {\n let idx = -1;\n\n arr.every(function (value, i) {\n if (fn(value)) {\n idx = i;\n return false; // break\n }\n\n return true; // next\n });\n\n return idx;\n};\n\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n * the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\nconst valueOrHandler = function (value, ...params) {\n return typeof value === 'function' ? value(...params) : value;\n};\n\nconst createFocusTrap = function (elements, userOptions) {\n const doc = document;\n\n const config = {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true,\n ...userOptions,\n };\n\n const state = {\n // @type {Array}\n containers: [],\n\n // list of objects identifying the first and last tabbable nodes in all containers/groups in\n // the trap\n // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n // is active, but the trap should never get to a state where there isn't at least one group\n // with at least one tabbable node in it (that would lead to an error condition that would\n // result in an error being thrown)\n // @type {Array<{ container: HTMLElement, firstTabbableNode: HTMLElement|null, lastTabbableNode: HTMLElement|null }>}\n tabbableGroups: [],\n\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n\n // timer ID for when delayInitialFocus is true and initial focus in this trap\n // has been delayed during activation\n delayInitialFocusTimer: undefined,\n };\n\n let trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n const getOption = (configOverrideOptions, optionName, configOptionName) => {\n return configOverrideOptions &&\n configOverrideOptions[optionName] !== undefined\n ? configOverrideOptions[optionName]\n : config[configOptionName || optionName];\n };\n\n const containersContain = function (element) {\n return state.containers.some((container) => container.contains(element));\n };\n\n const getNodeForOption = function (optionName) {\n const optionValue = config[optionName];\n if (!optionValue) {\n return null;\n }\n\n let node = optionValue;\n\n if (typeof optionValue === 'string') {\n node = doc.querySelector(optionValue);\n if (!node) {\n throw new Error(`\\`${optionName}\\` refers to no known node`);\n }\n }\n\n if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error(`\\`${optionName}\\` did not return a node`);\n }\n }\n\n return node;\n };\n\n const getInitialFocusNode = function () {\n let node;\n\n // false indicates we want no initialFocus at all\n if (getOption({}, 'initialFocus') === false) {\n return false;\n }\n\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (containersContain(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n const firstTabbableGroup = state.tabbableGroups[0];\n const firstTabbableNode =\n firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n node = firstTabbableNode || getNodeForOption('fallbackFocus');\n }\n\n if (!node) {\n throw new Error(\n 'Your focus-trap needs to have at least one focusable element'\n );\n }\n\n return node;\n };\n\n const updateTabbableNodes = function () {\n state.tabbableGroups = state.containers\n .map((container) => {\n const tabbableNodes = tabbable(container);\n\n if (tabbableNodes.length > 0) {\n return {\n container,\n firstTabbableNode: tabbableNodes[0],\n lastTabbableNode: tabbableNodes[tabbableNodes.length - 1],\n };\n }\n\n return undefined;\n })\n .filter((group) => !!group); // remove groups with no tabbable nodes\n\n // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n if (\n state.tabbableGroups.length <= 0 &&\n !getNodeForOption('fallbackFocus')\n ) {\n throw new Error(\n 'Your focus-trap must have at least one container with at least one tabbable node in it at all times'\n );\n }\n };\n\n const tryFocus = function (node) {\n if (node === false) {\n return;\n }\n\n if (node === doc.activeElement) {\n return;\n }\n\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n\n node.focus({ preventScroll: !!config.preventScroll });\n state.mostRecentlyFocusedNode = node;\n\n if (isSelectableInput(node)) {\n node.select();\n }\n };\n\n const getReturnFocusNode = function (previousActiveElement) {\n const node = getNodeForOption('setReturnFocus');\n\n return node ? node : previousActiveElement;\n };\n\n // This needs to be done on mousedown and touchstart instead of click\n // so that it precedes the focus event.\n const checkPointerDown = function (e) {\n if (containersContain(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n // immediately deactivate the trap\n trap.deactivate({\n // if, on deactivation, we should return focus to the node originally-focused\n // when the trap was activated (or the configured `setReturnFocus` node),\n // then assume it's also OK to return focus to the outside node that was\n // just clicked, causing deactivation, as long as that node is focusable;\n // if it isn't focusable, then return focus to the original node focused\n // on activation (or the configured `setReturnFocus` node)\n // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n // which will result in the outside click setting focus to the node\n // that was clicked, whether it's focusable or not; by setting\n // `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n // on activation (or the configured `setReturnFocus` node)\n returnFocus: config.returnFocusOnDeactivate && !isFocusable(e.target),\n });\n return;\n }\n\n // This is needed for mobile devices.\n // (If we'll only let `click` events through,\n // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n if (valueOrHandler(config.allowOutsideClick, e)) {\n // allow the click outside the trap to take place\n return;\n }\n\n // otherwise, prevent the click\n e.preventDefault();\n };\n\n // In case focus escapes the trap for some strange reason, pull it back in.\n const checkFocusIn = function (e) {\n const targetContained = containersContain(e.target);\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (targetContained || e.target instanceof Document) {\n if (targetContained) {\n state.mostRecentlyFocusedNode = e.target;\n }\n } else {\n // escaped! pull it back in to where it just left\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n };\n\n // Hijack Tab events on the first and last focusable nodes of the trap,\n // in order to prevent focus from escaping. If it escapes for even a\n // moment it can end up scrolling the page and causing confusion so we\n // kind of need to capture the action at the keydown phase.\n const checkTab = function (e) {\n updateTabbableNodes();\n\n let destinationNode = null;\n\n if (state.tabbableGroups.length > 0) {\n // make sure the target is actually contained in a group\n // NOTE: the target may also be the container itself if it's tabbable\n // with tabIndex='-1' and was given initial focus\n const containerIndex = findIndex(state.tabbableGroups, ({ container }) =>\n container.contains(e.target)\n );\n\n if (containerIndex < 0) {\n // target not found in any group: quite possible focus has escaped the trap,\n // so bring it back in to...\n if (e.shiftKey) {\n // ...the last node in the last group\n destinationNode =\n state.tabbableGroups[state.tabbableGroups.length - 1]\n .lastTabbableNode;\n } else {\n // ...the first node in the first group\n destinationNode = state.tabbableGroups[0].firstTabbableNode;\n }\n } else if (e.shiftKey) {\n // REVERSE\n\n // is the target the first tabbable node in a group?\n let startOfGroupIndex = findIndex(\n state.tabbableGroups,\n ({ firstTabbableNode }) => e.target === firstTabbableNode\n );\n\n if (\n startOfGroupIndex < 0 &&\n state.tabbableGroups[containerIndex].container === e.target\n ) {\n // an exception case where the target is the container itself, in which\n // case, we should handle shift+tab as if focus were on the container's\n // first tabbable node, and go to the last tabbable node of the LAST group\n startOfGroupIndex = containerIndex;\n }\n\n if (startOfGroupIndex >= 0) {\n // YES: then shift+tab should go to the last tabbable node in the\n // previous group (and wrap around to the last tabbable node of\n // the LAST group if it's the first tabbable node of the FIRST group)\n const destinationGroupIndex =\n startOfGroupIndex === 0\n ? state.tabbableGroups.length - 1\n : startOfGroupIndex - 1;\n\n const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n destinationNode = destinationGroup.lastTabbableNode;\n }\n } else {\n // FORWARD\n\n // is the target the last tabbable node in a group?\n let lastOfGroupIndex = findIndex(\n state.tabbableGroups,\n ({ lastTabbableNode }) => e.target === lastTabbableNode\n );\n\n if (\n lastOfGroupIndex < 0 &&\n state.tabbableGroups[containerIndex].container === e.target\n ) {\n // an exception case where the target is the container itself, in which\n // case, we should handle tab as if focus were on the container's\n // last tabbable node, and go to the first tabbable node of the FIRST group\n lastOfGroupIndex = containerIndex;\n }\n\n if (lastOfGroupIndex >= 0) {\n // YES: then tab should go to the first tabbable node in the next\n // group (and wrap around to the first tabbable node of the FIRST\n // group if it's the last tabbable node of the LAST group)\n const destinationGroupIndex =\n lastOfGroupIndex === state.tabbableGroups.length - 1\n ? 0\n : lastOfGroupIndex + 1;\n\n const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n destinationNode = destinationGroup.firstTabbableNode;\n }\n }\n } else {\n destinationNode = getNodeForOption('fallbackFocus');\n }\n\n if (destinationNode) {\n e.preventDefault();\n tryFocus(destinationNode);\n }\n // else, let the browser take care of [shift+]tab and move the focus\n };\n\n const checkKey = function (e) {\n if (\n isEscapeEvent(e) &&\n valueOrHandler(config.escapeDeactivates) !== false\n ) {\n e.preventDefault();\n trap.deactivate();\n return;\n }\n\n if (isTabEvent(e)) {\n checkTab(e);\n return;\n }\n };\n\n const checkClick = function (e) {\n if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n return;\n }\n\n if (containersContain(e.target)) {\n return;\n }\n\n if (valueOrHandler(config.allowOutsideClick, e)) {\n return;\n }\n\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n\n //\n // EVENT LISTENERS\n //\n\n const addListeners = function () {\n if (!state.active) {\n return;\n }\n\n // There can be only one listening focus trap at a time\n activeFocusTraps.activateTrap(trap);\n\n // Delay ensures that the focused element doesn't capture the event\n // that caused the focus trap activation.\n state.delayInitialFocusTimer = config.delayInitialFocus\n ? delay(function () {\n tryFocus(getInitialFocusNode());\n })\n : tryFocus(getInitialFocusNode());\n\n doc.addEventListener('focusin', checkFocusIn, true);\n doc.addEventListener('mousedown', checkPointerDown, {\n capture: true,\n passive: false,\n });\n doc.addEventListener('touchstart', checkPointerDown, {\n capture: true,\n passive: false,\n });\n doc.addEventListener('click', checkClick, {\n capture: true,\n passive: false,\n });\n doc.addEventListener('keydown', checkKey, {\n capture: true,\n passive: false,\n });\n\n return trap;\n };\n\n const removeListeners = function () {\n if (!state.active) {\n return;\n }\n\n doc.removeEventListener('focusin', checkFocusIn, true);\n doc.removeEventListener('mousedown', checkPointerDown, true);\n doc.removeEventListener('touchstart', checkPointerDown, true);\n doc.removeEventListener('click', checkClick, true);\n doc.removeEventListener('keydown', checkKey, true);\n\n return trap;\n };\n\n //\n // TRAP DEFINITION\n //\n\n trap = {\n activate(activateOptions) {\n if (state.active) {\n return this;\n }\n\n const onActivate = getOption(activateOptions, 'onActivate');\n const onPostActivate = getOption(activateOptions, 'onPostActivate');\n const checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n if (!checkCanFocusTrap) {\n updateTabbableNodes();\n }\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n if (onActivate) {\n onActivate();\n }\n\n const finishActivation = () => {\n if (checkCanFocusTrap) {\n updateTabbableNodes();\n }\n addListeners();\n if (onPostActivate) {\n onPostActivate();\n }\n };\n\n if (checkCanFocusTrap) {\n checkCanFocusTrap(state.containers.concat()).then(\n finishActivation,\n finishActivation\n );\n return this;\n }\n\n finishActivation();\n return this;\n },\n\n deactivate(deactivateOptions) {\n if (!state.active) {\n return this;\n }\n\n clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n state.delayInitialFocusTimer = undefined;\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n const onDeactivate = getOption(deactivateOptions, 'onDeactivate');\n const onPostDeactivate = getOption(deactivateOptions, 'onPostDeactivate');\n const checkCanReturnFocus = getOption(\n deactivateOptions,\n 'checkCanReturnFocus'\n );\n\n if (onDeactivate) {\n onDeactivate();\n }\n\n const returnFocus = getOption(\n deactivateOptions,\n 'returnFocus',\n 'returnFocusOnDeactivate'\n );\n\n const finishDeactivation = () => {\n delay(() => {\n if (returnFocus) {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n }\n if (onPostDeactivate) {\n onPostDeactivate();\n }\n });\n };\n\n if (returnFocus && checkCanReturnFocus) {\n checkCanReturnFocus(\n getReturnFocusNode(state.nodeFocusedBeforeActivation)\n ).then(finishDeactivation, finishDeactivation);\n return this;\n }\n\n finishDeactivation();\n return this;\n },\n\n pause() {\n if (state.paused || !state.active) {\n return this;\n }\n\n state.paused = true;\n removeListeners();\n\n return this;\n },\n\n unpause() {\n if (!state.paused || !state.active) {\n return this;\n }\n\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n\n return this;\n },\n\n updateContainerElements(containerElements) {\n const elementsAsArray = [].concat(containerElements).filter(Boolean);\n\n state.containers = elementsAsArray.map((element) =>\n typeof element === 'string' ? doc.querySelector(element) : element\n );\n\n if (state.active) {\n updateTabbableNodes();\n }\n\n return this;\n },\n };\n\n // initialize container elements\n trap.updateContainerElements(elements);\n\n return trap;\n};\n\nexport { createFocusTrap };\n"],"names":["trapQueue","activeFocusTraps","activateTrap","trap","length","activeTrap","pause","trapIndex","indexOf","splice","push","deactivateTrap","unpause","delay","fn","setTimeout","findIndex","arr","idx","every","value","i","valueOrHandler","params","elements","userOptions","doc","document","config","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","containers","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","delayInitialFocusTimer","undefined","getOption","configOverrideOptions","optionName","configOptionName","containersContain","element","some","container","contains","getNodeForOption","optionValue","node","querySelector","Error","getInitialFocusNode","activeElement","firstTabbableGroup","firstTabbableNode","updateTabbableNodes","map","tabbableNodes","tabbable","lastTabbableNode","filter","group","tryFocus","focus","preventScroll","tagName","toLowerCase","select","isSelectableInput","getReturnFocusNode","previousActiveElement","checkPointerDown","e","target","clickOutsideDeactivates","deactivate","returnFocus","isFocusable","allowOutsideClick","preventDefault","checkFocusIn","targetContained","Document","stopImmediatePropagation","checkKey","key","keyCode","isEscapeEvent","isTabEvent","destinationNode","containerIndex","shiftKey","startOfGroupIndex","destinationGroupIndex","lastOfGroupIndex","checkTab","checkClick","addListeners","addEventListener","capture","passive","removeListeners","removeEventListener","activate","activateOptions","this","onActivate","onPostActivate","checkCanFocusTrap","finishActivation","concat","then","deactivateOptions","clearTimeout","onDeactivate","onPostDeactivate","checkCanReturnFocus","finishDeactivation","updateContainerElements","containerElements","elementsAsArray","Boolean"],"mappings":"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"}