focus-trap 6.1.4 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +14 -2
- package/dist/focus-trap.esm.js +72 -23
- package/dist/focus-trap.esm.js.map +1 -1
- package/dist/focus-trap.esm.min.js +2 -2
- package/dist/focus-trap.esm.min.js.map +1 -1
- package/dist/focus-trap.js +72 -23
- package/dist/focus-trap.js.map +1 -1
- package/dist/focus-trap.min.js +2 -2
- package/dist/focus-trap.min.js.map +1 -1
- package/dist/focus-trap.umd.js +72 -23
- package/dist/focus-trap.umd.js.map +1 -1
- package/dist/focus-trap.umd.min.js +2 -2
- package/dist/focus-trap.umd.min.js.map +1 -1
- package/index.d.ts +6 -5
- package/index.js +83 -23
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.umd.js","sources":["../index.js"],"sourcesContent":["import { tabbable, isFocusable } from 'tabbable';\n\nvar activeFocusDelay;\n\nvar activeFocusTraps = (function () {\n var trapQueue = [];\n return {\n activateTrap: function (trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var 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: function (trap) {\n var 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\nfunction createFocusTrap(element, userOptions) {\n var doc = document;\n var container =\n typeof element === 'string' ? doc.querySelector(element) : element;\n\n var config = {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true,\n ...userOptions,\n };\n\n var state = {\n firstTabbableNode: null,\n lastTabbableNode: null,\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause,\n };\n\n return trap;\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function () {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return;\n state.paused = true;\n removeListeners();\n }\n\n function unpause() {\n if (!state.paused || !state.active) return;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n }\n\n function addListeners() {\n if (!state.active) return;\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 activeFocusDelay = 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 function removeListeners() {\n if (!state.active) return;\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 function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\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 if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (container.contains(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n node = state.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 function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\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 function checkPointerDown(e) {\n if (container.contains(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (config.clickOutsideDeactivates) {\n // immediately deactivate the trap\n 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 (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\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 function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (container.contains(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\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 function checkTab(e) {\n updateTabbableNodes();\n if (e.shiftKey && e.target === state.firstTabbableNode) {\n e.preventDefault();\n tryFocus(state.lastTabbableNode);\n return;\n }\n if (!e.shiftKey && e.target === state.lastTabbableNode) {\n e.preventDefault();\n tryFocus(state.firstTabbableNode);\n return;\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (container.contains(e.target)) return;\n if (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n var tabbableNodes = tabbable(container);\n state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();\n state.lastTabbableNode =\n tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus({ preventScroll: !!config.preventScroll });\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nexport { createFocusTrap };\n"],"names":["activeFocusDelay","activeFocusTraps","trapQueue","activateTrap","trap","length","activeTrap","pause","trapIndex","indexOf","push","splice","deactivateTrap","unpause","createFocusTrap","element","userOptions","doc","document","container","querySelector","config","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","firstTabbableNode","lastTabbableNode","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","activate","deactivate","activateOptions","updateTabbableNodes","activeElement","onActivate","addListeners","deactivateOptions","clearTimeout","removeListeners","onDeactivate","undefined","returnFocus","delay","tryFocus","getReturnFocusNode","getInitialFocusNode","addEventListener","checkFocusIn","checkPointerDown","capture","passive","checkClick","checkKey","removeEventListener","getNodeForOption","optionName","optionValue","node","Error","contains","previousActiveElement","e","target","clickOutsideDeactivates","isFocusable","allowOutsideClick","preventDefault","Document","stopImmediatePropagation","isEscapeEvent","isTabEvent","checkTab","shiftKey","tabbableNodes","tabbable","focus","preventScroll","isSelectableInput","select","tagName","toLowerCase","key","keyCode","fn","setTimeout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"focus-trap.umd.js","sources":["../index.js"],"sourcesContent":["import { tabbable, isFocusable } from 'tabbable';\n\nvar activeFocusDelay;\n\nvar activeFocusTraps = (function () {\n var trapQueue = [];\n return {\n activateTrap: function (trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var 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: function (trap) {\n var 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\nfunction createFocusTrap(elements, userOptions) {\n var doc = document;\n\n var config = {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true,\n ...userOptions,\n };\n\n var state = {\n // @type {Array<HTMLElement>}\n containers: [],\n // @type {{ firstTabbableNode: HTMLElement, lastTabbableNode: HTMLElement }}\n tabbableGroups: [],\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause,\n updateContainerElements: updateContainerElements,\n };\n\n updateContainerElements(elements);\n\n return trap;\n\n function updateContainerElements(containerElements) {\n var 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 trap;\n }\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function () {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return trap;\n state.paused = true;\n removeListeners();\n\n return trap;\n }\n\n function unpause() {\n if (!state.paused || !state.active) return trap;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n\n return trap;\n }\n\n function addListeners() {\n if (!state.active) return;\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 activeFocusDelay = 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 function removeListeners() {\n if (!state.active) return;\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 function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\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 if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (containersContain(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n var firstTabbableGroup = state.tabbableGroups[0];\n var 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 function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\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 function checkPointerDown(e) {\n if (containersContain(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (config.clickOutsideDeactivates) {\n // immediately deactivate the trap\n 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 (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\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 function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (containersContain(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\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 function checkTab(e) {\n updateTabbableNodes();\n\n let destinationNode = null;\n\n if (e.shiftKey) {\n const startOfGroupIndex = state.tabbableGroups.findIndex(\n ({ firstTabbableNode }) => e.target === firstTabbableNode\n );\n\n if (startOfGroupIndex >= 0) {\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 const lastOfGroupIndex = state.tabbableGroups.findIndex(\n ({ lastTabbableNode }) => e.target === lastTabbableNode\n );\n\n if (lastOfGroupIndex >= 0) {\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\n if (destinationNode) {\n e.preventDefault();\n\n tryFocus(destinationNode);\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (containersContain(e.target)) return;\n if (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n state.tabbableGroups = state.containers.map((container) => {\n var tabbableNodes = tabbable(container);\n\n return {\n firstTabbableNode: tabbableNodes[0],\n lastTabbableNode: tabbableNodes[tabbableNodes.length - 1],\n };\n });\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus({ preventScroll: !!config.preventScroll });\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n\n function containersContain(element) {\n return state.containers.some((container) => container.contains(element));\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nexport { createFocusTrap };\n"],"names":["activeFocusDelay","activeFocusTraps","trapQueue","activateTrap","trap","length","activeTrap","pause","trapIndex","indexOf","push","splice","deactivateTrap","unpause","createFocusTrap","elements","userOptions","doc","document","config","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","containers","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","activate","deactivate","updateContainerElements","containerElements","elementsAsArray","concat","filter","Boolean","map","element","querySelector","updateTabbableNodes","activateOptions","activeElement","onActivate","addListeners","deactivateOptions","clearTimeout","removeListeners","onDeactivate","undefined","returnFocus","delay","tryFocus","getReturnFocusNode","getInitialFocusNode","addEventListener","checkFocusIn","checkPointerDown","capture","passive","checkClick","checkKey","removeEventListener","getNodeForOption","optionName","optionValue","node","Error","containersContain","firstTabbableGroup","firstTabbableNode","previousActiveElement","e","target","clickOutsideDeactivates","isFocusable","allowOutsideClick","preventDefault","Document","stopImmediatePropagation","isEscapeEvent","isTabEvent","checkTab","destinationNode","shiftKey","startOfGroupIndex","findIndex","destinationGroupIndex","destinationGroup","lastTabbableNode","lastOfGroupIndex","container","tabbableNodes","tabbable","focus","preventScroll","isSelectableInput","select","some","contains","tagName","toLowerCase","key","keyCode","fn","setTimeout"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* focus-trap 6.
|
|
2
|
+
* focus-trap 6.2.0
|
|
3
3
|
* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
|
|
4
4
|
*/
|
|
5
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("tabbable")):"function"==typeof define&&define.amd?define(["exports","tabbable"],t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.focusTrap,
|
|
5
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("tabbable")):"function"==typeof define&&define.amd?define(["exports","tabbable"],t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.focusTrap,a=e.focusTrap={};t(a,e.tabbable),a.noConflict=function(){return e.focusTrap=n,a}}())}(this,(function(e,t){"use strict";function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}var r,o,i=(o=[],{activateTrap:function(e){if(o.length>0){var t=o[o.length-1];t!==e&&t.pause()}var n=o.indexOf(e);-1===n||o.splice(n,1),o.push(e)},deactivateTrap:function(e){var t=o.indexOf(e);-1!==t&&o.splice(t,1),o.length>0&&o[o.length-1].unpause()}});function c(e){return setTimeout(e,0)}e.createFocusTrap=function(e,o){var u=document,s=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?a(Object(r),!0).forEach((function(t){n(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):a(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({returnFocusOnDeactivate:!0,escapeDeactivates:!0,delayInitialFocus:!0},o),l={containers:[],tabbableGroups:[],nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1},f={activate:function(e){if(l.active)return;k(),l.active=!0,l.paused=!1,l.nodeFocusedBeforeActivation=u.activeElement;var t=e&&e.onActivate?e.onActivate:s.onActivate;t&&t();return b(),f},deactivate:d,pause:function(){return l.paused||!l.active||(l.paused=!0,p()),f},unpause:function(){return l.paused&&l.active?(l.paused=!1,k(),b(),f):f},updateContainerElements:v};return v(e),f;function v(e){var t=[].concat(e).filter(Boolean);return l.containers=t.map((function(e){return"string"==typeof e?u.querySelector(e):e})),l.active&&k(),f}function d(e){if(l.active){clearTimeout(r),p(),l.active=!1,l.paused=!1,i.deactivateTrap(f);var t=e&&void 0!==e.onDeactivate?e.onDeactivate:s.onDeactivate;return t&&t(),(e&&void 0!==e.returnFocus?e.returnFocus:s.returnFocusOnDeactivate)&&c((function(){var e;E((e=l.nodeFocusedBeforeActivation,y("setReturnFocus")||e))})),f}}function b(){if(l.active)return i.activateTrap(f),r=s.delayInitialFocus?c((function(){E(m())})):E(m()),u.addEventListener("focusin",g,!0),u.addEventListener("mousedown",O,{capture:!0,passive:!1}),u.addEventListener("touchstart",O,{capture:!0,passive:!1}),u.addEventListener("click",h,{capture:!0,passive:!1}),u.addEventListener("keydown",w,{capture:!0,passive:!1}),f}function p(){if(l.active)return u.removeEventListener("focusin",g,!0),u.removeEventListener("mousedown",O,!0),u.removeEventListener("touchstart",O,!0),u.removeEventListener("click",h,!0),u.removeEventListener("keydown",w,!0),f}function y(e){var t=s[e],n=t;if(!t)return null;if("string"==typeof t&&!(n=u.querySelector(t)))throw new Error("`"+e+"` refers to no known node");if("function"==typeof t&&!(n=t()))throw new Error("`"+e+"` did not return a node");return n}function m(){var e;if(null!==y("initialFocus"))e=y("initialFocus");else if(F(u.activeElement))e=u.activeElement;else{var t=l.tabbableGroups[0];e=t&&t.firstTabbableNode||y("fallbackFocus")}if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e}function O(e){F(e.target)||(s.clickOutsideDeactivates?d({returnFocus:s.returnFocusOnDeactivate&&!t.isFocusable(e.target)}):s.allowOutsideClick&&("boolean"==typeof s.allowOutsideClick?s.allowOutsideClick:s.allowOutsideClick(e))||e.preventDefault())}function g(e){F(e.target)||e.target instanceof Document||(e.stopImmediatePropagation(),E(l.mostRecentlyFocusedNode||m()))}function w(e){if(!1!==s.escapeDeactivates&&function(e){return"Escape"===e.key||"Esc"===e.key||27===e.keyCode}(e))return e.preventDefault(),void d();(function(e){return"Tab"===e.key||9===e.keyCode})(e)&&function(e){k();var t=null;if(e.shiftKey){var n=l.tabbableGroups.findIndex((function(t){var n=t.firstTabbableNode;return e.target===n}));if(n>=0){var a=0===n?l.tabbableGroups.length-1:n-1;t=l.tabbableGroups[a].lastTabbableNode}}else{var r=l.tabbableGroups.findIndex((function(t){var n=t.lastTabbableNode;return e.target===n}));if(r>=0){var o=r===l.tabbableGroups.length-1?0:r+1;t=l.tabbableGroups[o].firstTabbableNode}}t&&(e.preventDefault(),E(t))}(e)}function h(e){s.clickOutsideDeactivates||F(e.target)||s.allowOutsideClick&&("boolean"==typeof s.allowOutsideClick?s.allowOutsideClick:s.allowOutsideClick(e))||(e.preventDefault(),e.stopImmediatePropagation())}function k(){l.tabbableGroups=l.containers.map((function(e){var n=t.tabbable(e);return{firstTabbableNode:n[0],lastTabbableNode:n[n.length-1]}}))}function E(e){e!==u.activeElement&&(e&&e.focus?(e.focus({preventScroll:!!s.preventScroll}),l.mostRecentlyFocusedNode=e,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(e)&&e.select()):E(m()))}function F(e){return l.containers.some((function(t){return t.contains(e)}))}},Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
6
6
|
//# sourceMappingURL=focus-trap.umd.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.umd.min.js","sources":["../index.js"],"sourcesContent":["import { tabbable, isFocusable } from 'tabbable';\n\nvar activeFocusDelay;\n\nvar activeFocusTraps = (function () {\n var trapQueue = [];\n return {\n activateTrap: function (trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var 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: function (trap) {\n var 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\nfunction createFocusTrap(element, userOptions) {\n var doc = document;\n var container =\n typeof element === 'string' ? doc.querySelector(element) : element;\n\n var config = {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true,\n ...userOptions,\n };\n\n var state = {\n firstTabbableNode: null,\n lastTabbableNode: null,\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause,\n };\n\n return trap;\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function () {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return;\n state.paused = true;\n removeListeners();\n }\n\n function unpause() {\n if (!state.paused || !state.active) return;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n }\n\n function addListeners() {\n if (!state.active) return;\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 activeFocusDelay = 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 function removeListeners() {\n if (!state.active) return;\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 function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\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 if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (container.contains(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n node = state.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 function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\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 function checkPointerDown(e) {\n if (container.contains(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (config.clickOutsideDeactivates) {\n // immediately deactivate the trap\n 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 (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\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 function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (container.contains(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\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 function checkTab(e) {\n updateTabbableNodes();\n if (e.shiftKey && e.target === state.firstTabbableNode) {\n e.preventDefault();\n tryFocus(state.lastTabbableNode);\n return;\n }\n if (!e.shiftKey && e.target === state.lastTabbableNode) {\n e.preventDefault();\n tryFocus(state.firstTabbableNode);\n return;\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (container.contains(e.target)) return;\n if (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n var tabbableNodes = tabbable(container);\n state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();\n state.lastTabbableNode =\n tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus({ preventScroll: !!config.preventScroll });\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nexport { createFocusTrap };\n"],"names":["activeFocusDelay","trapQueue","activeFocusTraps","activateTrap","trap","length","activeTrap","pause","trapIndex","indexOf","splice","push","deactivateTrap","unpause","delay","fn","setTimeout","element","userOptions","doc","document","container","querySelector","config","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","firstTabbableNode","lastTabbableNode","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","activate","activateOptions","updateTabbableNodes","activeElement","onActivate","addListeners","deactivate","removeListeners","deactivateOptions","clearTimeout","onDeactivate","undefined","returnFocus","previousActiveElement","tryFocus","getNodeForOption","getInitialFocusNode","addEventListener","checkFocusIn","checkPointerDown","capture","passive","checkClick","checkKey","removeEventListener","optionName","optionValue","node","Error","contains","e","target","clickOutsideDeactivates","isFocusable","allowOutsideClick","preventDefault","Document","stopImmediatePropagation","key","keyCode","isEscapeEvent","isTabEvent","shiftKey","checkTab","tabbableNodes","tabbable","focus","preventScroll","tagName","toLowerCase","select","isSelectableInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"focus-trap.umd.min.js","sources":["../index.js"],"sourcesContent":["import { tabbable, isFocusable } from 'tabbable';\n\nvar activeFocusDelay;\n\nvar activeFocusTraps = (function () {\n var trapQueue = [];\n return {\n activateTrap: function (trap) {\n if (trapQueue.length > 0) {\n var activeTrap = trapQueue[trapQueue.length - 1];\n if (activeTrap !== trap) {\n activeTrap.pause();\n }\n }\n\n var 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: function (trap) {\n var 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\nfunction createFocusTrap(elements, userOptions) {\n var doc = document;\n\n var config = {\n returnFocusOnDeactivate: true,\n escapeDeactivates: true,\n delayInitialFocus: true,\n ...userOptions,\n };\n\n var state = {\n // @type {Array<HTMLElement>}\n containers: [],\n // @type {{ firstTabbableNode: HTMLElement, lastTabbableNode: HTMLElement }}\n tabbableGroups: [],\n nodeFocusedBeforeActivation: null,\n mostRecentlyFocusedNode: null,\n active: false,\n paused: false,\n };\n\n var trap = {\n activate: activate,\n deactivate: deactivate,\n pause: pause,\n unpause: unpause,\n updateContainerElements: updateContainerElements,\n };\n\n updateContainerElements(elements);\n\n return trap;\n\n function updateContainerElements(containerElements) {\n var 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 trap;\n }\n\n function activate(activateOptions) {\n if (state.active) return;\n\n updateTabbableNodes();\n\n state.active = true;\n state.paused = false;\n state.nodeFocusedBeforeActivation = doc.activeElement;\n\n var onActivate =\n activateOptions && activateOptions.onActivate\n ? activateOptions.onActivate\n : config.onActivate;\n if (onActivate) {\n onActivate();\n }\n\n addListeners();\n return trap;\n }\n\n function deactivate(deactivateOptions) {\n if (!state.active) return;\n\n clearTimeout(activeFocusDelay);\n\n removeListeners();\n state.active = false;\n state.paused = false;\n\n activeFocusTraps.deactivateTrap(trap);\n\n var onDeactivate =\n deactivateOptions && deactivateOptions.onDeactivate !== undefined\n ? deactivateOptions.onDeactivate\n : config.onDeactivate;\n if (onDeactivate) {\n onDeactivate();\n }\n\n var returnFocus =\n deactivateOptions && deactivateOptions.returnFocus !== undefined\n ? deactivateOptions.returnFocus\n : config.returnFocusOnDeactivate;\n if (returnFocus) {\n delay(function () {\n tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n });\n }\n\n return trap;\n }\n\n function pause() {\n if (state.paused || !state.active) return trap;\n state.paused = true;\n removeListeners();\n\n return trap;\n }\n\n function unpause() {\n if (!state.paused || !state.active) return trap;\n state.paused = false;\n updateTabbableNodes();\n addListeners();\n\n return trap;\n }\n\n function addListeners() {\n if (!state.active) return;\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 activeFocusDelay = 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 function removeListeners() {\n if (!state.active) return;\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 function getNodeForOption(optionName) {\n var optionValue = config[optionName];\n var node = optionValue;\n if (!optionValue) {\n return null;\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 if (typeof optionValue === 'function') {\n node = optionValue();\n if (!node) {\n throw new Error('`' + optionName + '` did not return a node');\n }\n }\n return node;\n }\n\n function getInitialFocusNode() {\n var node;\n if (getNodeForOption('initialFocus') !== null) {\n node = getNodeForOption('initialFocus');\n } else if (containersContain(doc.activeElement)) {\n node = doc.activeElement;\n } else {\n var firstTabbableGroup = state.tabbableGroups[0];\n var 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 function getReturnFocusNode(previousActiveElement) {\n var node = getNodeForOption('setReturnFocus');\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 function checkPointerDown(e) {\n if (containersContain(e.target)) {\n // allow the click since it ocurred inside the trap\n return;\n }\n\n if (config.clickOutsideDeactivates) {\n // immediately deactivate the trap\n 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 (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\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 function checkFocusIn(e) {\n // In Firefox when you Tab out of an iframe the Document is briefly focused.\n if (containersContain(e.target) || e.target instanceof Document) {\n return;\n }\n e.stopImmediatePropagation();\n tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n }\n\n function checkKey(e) {\n if (config.escapeDeactivates !== false && isEscapeEvent(e)) {\n e.preventDefault();\n deactivate();\n return;\n }\n if (isTabEvent(e)) {\n checkTab(e);\n return;\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 function checkTab(e) {\n updateTabbableNodes();\n\n let destinationNode = null;\n\n if (e.shiftKey) {\n const startOfGroupIndex = state.tabbableGroups.findIndex(\n ({ firstTabbableNode }) => e.target === firstTabbableNode\n );\n\n if (startOfGroupIndex >= 0) {\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 const lastOfGroupIndex = state.tabbableGroups.findIndex(\n ({ lastTabbableNode }) => e.target === lastTabbableNode\n );\n\n if (lastOfGroupIndex >= 0) {\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\n if (destinationNode) {\n e.preventDefault();\n\n tryFocus(destinationNode);\n }\n }\n\n function checkClick(e) {\n if (config.clickOutsideDeactivates) return;\n if (containersContain(e.target)) return;\n if (\n config.allowOutsideClick &&\n (typeof config.allowOutsideClick === 'boolean'\n ? config.allowOutsideClick\n : config.allowOutsideClick(e))\n ) {\n return;\n }\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n function updateTabbableNodes() {\n state.tabbableGroups = state.containers.map((container) => {\n var tabbableNodes = tabbable(container);\n\n return {\n firstTabbableNode: tabbableNodes[0],\n lastTabbableNode: tabbableNodes[tabbableNodes.length - 1],\n };\n });\n }\n\n function tryFocus(node) {\n if (node === doc.activeElement) return;\n if (!node || !node.focus) {\n tryFocus(getInitialFocusNode());\n return;\n }\n node.focus({ preventScroll: !!config.preventScroll });\n state.mostRecentlyFocusedNode = node;\n if (isSelectableInput(node)) {\n node.select();\n }\n }\n\n function containersContain(element) {\n return state.containers.some((container) => container.contains(element));\n }\n}\n\nfunction isSelectableInput(node) {\n return (\n node.tagName &&\n node.tagName.toLowerCase() === 'input' &&\n typeof node.select === 'function'\n );\n}\n\nfunction isEscapeEvent(e) {\n return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n}\n\nfunction isTabEvent(e) {\n return e.key === 'Tab' || e.keyCode === 9;\n}\n\nfunction delay(fn) {\n return setTimeout(fn, 0);\n}\n\nexport { createFocusTrap };\n"],"names":["activeFocusDelay","trapQueue","activeFocusTraps","activateTrap","trap","length","activeTrap","pause","trapIndex","indexOf","splice","push","deactivateTrap","unpause","delay","fn","setTimeout","elements","userOptions","doc","document","config","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","state","containers","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","active","paused","activate","activateOptions","updateTabbableNodes","activeElement","onActivate","addListeners","deactivate","removeListeners","updateContainerElements","containerElements","elementsAsArray","concat","filter","Boolean","map","element","querySelector","deactivateOptions","clearTimeout","onDeactivate","undefined","returnFocus","previousActiveElement","tryFocus","getNodeForOption","getInitialFocusNode","addEventListener","checkFocusIn","checkPointerDown","capture","passive","checkClick","checkKey","removeEventListener","optionName","optionValue","node","Error","containersContain","firstTabbableGroup","firstTabbableNode","e","target","clickOutsideDeactivates","isFocusable","allowOutsideClick","preventDefault","Document","stopImmediatePropagation","key","keyCode","isEscapeEvent","isTabEvent","destinationNode","shiftKey","startOfGroupIndex","findIndex","destinationGroupIndex","lastTabbableNode","lastOfGroupIndex","checkTab","container","tabbableNodes","tabbable","focus","preventScroll","tagName","toLowerCase","select","isSelectableInput","some","contains"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -87,10 +87,11 @@ declare module 'focus-trap' {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
export interface FocusTrap {
|
|
90
|
-
activate(activateOptions?: ActivateOptions):
|
|
91
|
-
deactivate(deactivateOptions?: DeactivateOptions):
|
|
92
|
-
pause():
|
|
93
|
-
unpause():
|
|
90
|
+
activate(activateOptions?: ActivateOptions): FocusTrap;
|
|
91
|
+
deactivate(deactivateOptions?: DeactivateOptions): FocusTrap;
|
|
92
|
+
pause(): FocusTrap;
|
|
93
|
+
unpause(): FocusTrap;
|
|
94
|
+
updateContainerElements(containerElements: HTMLElement | string | Array<HTMLElement | string>): FocusTrap;
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
/**
|
|
@@ -101,7 +102,7 @@ declare module 'focus-trap' {
|
|
|
101
102
|
* find the element.
|
|
102
103
|
*/
|
|
103
104
|
export function createFocusTrap(
|
|
104
|
-
element: HTMLElement | string
|
|
105
|
+
element: HTMLElement | string | Array<HTMLElement | string>,
|
|
105
106
|
userOptions?: Options
|
|
106
107
|
): FocusTrap;
|
|
107
108
|
}
|
package/index.js
CHANGED
|
@@ -36,10 +36,8 @@ var activeFocusTraps = (function () {
|
|
|
36
36
|
};
|
|
37
37
|
})();
|
|
38
38
|
|
|
39
|
-
function createFocusTrap(
|
|
39
|
+
function createFocusTrap(elements, userOptions) {
|
|
40
40
|
var doc = document;
|
|
41
|
-
var container =
|
|
42
|
-
typeof element === 'string' ? doc.querySelector(element) : element;
|
|
43
41
|
|
|
44
42
|
var config = {
|
|
45
43
|
returnFocusOnDeactivate: true,
|
|
@@ -49,8 +47,10 @@ function createFocusTrap(element, userOptions) {
|
|
|
49
47
|
};
|
|
50
48
|
|
|
51
49
|
var state = {
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
// @type {Array<HTMLElement>}
|
|
51
|
+
containers: [],
|
|
52
|
+
// @type {{ firstTabbableNode: HTMLElement, lastTabbableNode: HTMLElement }}
|
|
53
|
+
tabbableGroups: [],
|
|
54
54
|
nodeFocusedBeforeActivation: null,
|
|
55
55
|
mostRecentlyFocusedNode: null,
|
|
56
56
|
active: false,
|
|
@@ -62,10 +62,27 @@ function createFocusTrap(element, userOptions) {
|
|
|
62
62
|
deactivate: deactivate,
|
|
63
63
|
pause: pause,
|
|
64
64
|
unpause: unpause,
|
|
65
|
+
updateContainerElements: updateContainerElements,
|
|
65
66
|
};
|
|
66
67
|
|
|
68
|
+
updateContainerElements(elements);
|
|
69
|
+
|
|
67
70
|
return trap;
|
|
68
71
|
|
|
72
|
+
function updateContainerElements(containerElements) {
|
|
73
|
+
var elementsAsArray = [].concat(containerElements).filter(Boolean);
|
|
74
|
+
|
|
75
|
+
state.containers = elementsAsArray.map((element) =>
|
|
76
|
+
typeof element === 'string' ? doc.querySelector(element) : element
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
if (state.active) {
|
|
80
|
+
updateTabbableNodes();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return trap;
|
|
84
|
+
}
|
|
85
|
+
|
|
69
86
|
function activate(activateOptions) {
|
|
70
87
|
if (state.active) return;
|
|
71
88
|
|
|
@@ -120,16 +137,20 @@ function createFocusTrap(element, userOptions) {
|
|
|
120
137
|
}
|
|
121
138
|
|
|
122
139
|
function pause() {
|
|
123
|
-
if (state.paused || !state.active) return;
|
|
140
|
+
if (state.paused || !state.active) return trap;
|
|
124
141
|
state.paused = true;
|
|
125
142
|
removeListeners();
|
|
143
|
+
|
|
144
|
+
return trap;
|
|
126
145
|
}
|
|
127
146
|
|
|
128
147
|
function unpause() {
|
|
129
|
-
if (!state.paused || !state.active) return;
|
|
148
|
+
if (!state.paused || !state.active) return trap;
|
|
130
149
|
state.paused = false;
|
|
131
150
|
updateTabbableNodes();
|
|
132
151
|
addListeners();
|
|
152
|
+
|
|
153
|
+
return trap;
|
|
133
154
|
}
|
|
134
155
|
|
|
135
156
|
function addListeners() {
|
|
@@ -204,10 +225,13 @@ function createFocusTrap(element, userOptions) {
|
|
|
204
225
|
var node;
|
|
205
226
|
if (getNodeForOption('initialFocus') !== null) {
|
|
206
227
|
node = getNodeForOption('initialFocus');
|
|
207
|
-
} else if (
|
|
228
|
+
} else if (containersContain(doc.activeElement)) {
|
|
208
229
|
node = doc.activeElement;
|
|
209
230
|
} else {
|
|
210
|
-
|
|
231
|
+
var firstTabbableGroup = state.tabbableGroups[0];
|
|
232
|
+
var firstTabbableNode =
|
|
233
|
+
firstTabbableGroup && firstTabbableGroup.firstTabbableNode;
|
|
234
|
+
node = firstTabbableNode || getNodeForOption('fallbackFocus');
|
|
211
235
|
}
|
|
212
236
|
|
|
213
237
|
if (!node) {
|
|
@@ -227,7 +251,7 @@ function createFocusTrap(element, userOptions) {
|
|
|
227
251
|
// This needs to be done on mousedown and touchstart instead of click
|
|
228
252
|
// so that it precedes the focus event.
|
|
229
253
|
function checkPointerDown(e) {
|
|
230
|
-
if (
|
|
254
|
+
if (containersContain(e.target)) {
|
|
231
255
|
// allow the click since it ocurred inside the trap
|
|
232
256
|
return;
|
|
233
257
|
}
|
|
@@ -271,7 +295,7 @@ function createFocusTrap(element, userOptions) {
|
|
|
271
295
|
// In case focus escapes the trap for some strange reason, pull it back in.
|
|
272
296
|
function checkFocusIn(e) {
|
|
273
297
|
// In Firefox when you Tab out of an iframe the Document is briefly focused.
|
|
274
|
-
if (
|
|
298
|
+
if (containersContain(e.target) || e.target instanceof Document) {
|
|
275
299
|
return;
|
|
276
300
|
}
|
|
277
301
|
e.stopImmediatePropagation();
|
|
@@ -296,21 +320,49 @@ function createFocusTrap(element, userOptions) {
|
|
|
296
320
|
// kind of need to capture the action at the keydown phase.
|
|
297
321
|
function checkTab(e) {
|
|
298
322
|
updateTabbableNodes();
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
323
|
+
|
|
324
|
+
let destinationNode = null;
|
|
325
|
+
|
|
326
|
+
if (e.shiftKey) {
|
|
327
|
+
const startOfGroupIndex = state.tabbableGroups.findIndex(
|
|
328
|
+
({ firstTabbableNode }) => e.target === firstTabbableNode
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
if (startOfGroupIndex >= 0) {
|
|
332
|
+
const destinationGroupIndex =
|
|
333
|
+
startOfGroupIndex === 0
|
|
334
|
+
? state.tabbableGroups.length - 1
|
|
335
|
+
: startOfGroupIndex - 1;
|
|
336
|
+
|
|
337
|
+
const destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
338
|
+
destinationNode = destinationGroup.lastTabbableNode;
|
|
339
|
+
}
|
|
340
|
+
} else {
|
|
341
|
+
const lastOfGroupIndex = state.tabbableGroups.findIndex(
|
|
342
|
+
({ lastTabbableNode }) => e.target === lastTabbableNode
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
if (lastOfGroupIndex >= 0) {
|
|
346
|
+
const destinationGroupIndex =
|
|
347
|
+
lastOfGroupIndex === state.tabbableGroups.length - 1
|
|
348
|
+
? 0
|
|
349
|
+
: lastOfGroupIndex + 1;
|
|
350
|
+
|
|
351
|
+
const destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
352
|
+
destinationNode = destinationGroup.firstTabbableNode;
|
|
353
|
+
}
|
|
303
354
|
}
|
|
304
|
-
|
|
355
|
+
|
|
356
|
+
if (destinationNode) {
|
|
305
357
|
e.preventDefault();
|
|
306
|
-
|
|
307
|
-
|
|
358
|
+
|
|
359
|
+
tryFocus(destinationNode);
|
|
308
360
|
}
|
|
309
361
|
}
|
|
310
362
|
|
|
311
363
|
function checkClick(e) {
|
|
312
364
|
if (config.clickOutsideDeactivates) return;
|
|
313
|
-
if (
|
|
365
|
+
if (containersContain(e.target)) return;
|
|
314
366
|
if (
|
|
315
367
|
config.allowOutsideClick &&
|
|
316
368
|
(typeof config.allowOutsideClick === 'boolean'
|
|
@@ -324,10 +376,14 @@ function createFocusTrap(element, userOptions) {
|
|
|
324
376
|
}
|
|
325
377
|
|
|
326
378
|
function updateTabbableNodes() {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
379
|
+
state.tabbableGroups = state.containers.map((container) => {
|
|
380
|
+
var tabbableNodes = tabbable(container);
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
firstTabbableNode: tabbableNodes[0],
|
|
384
|
+
lastTabbableNode: tabbableNodes[tabbableNodes.length - 1],
|
|
385
|
+
};
|
|
386
|
+
});
|
|
331
387
|
}
|
|
332
388
|
|
|
333
389
|
function tryFocus(node) {
|
|
@@ -342,6 +398,10 @@ function createFocusTrap(element, userOptions) {
|
|
|
342
398
|
node.select();
|
|
343
399
|
}
|
|
344
400
|
}
|
|
401
|
+
|
|
402
|
+
function containersContain(element) {
|
|
403
|
+
return state.containers.some((container) => container.contains(element));
|
|
404
|
+
}
|
|
345
405
|
}
|
|
346
406
|
|
|
347
407
|
function isSelectableInput(node) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "focus-trap",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "Trap focus within a DOM node.",
|
|
5
5
|
"main": "dist/focus-trap.js",
|
|
6
6
|
"module": "dist/focus-trap.esm.js",
|
|
@@ -62,27 +62,27 @@
|
|
|
62
62
|
"@babel/cli": "^7.12.1",
|
|
63
63
|
"@babel/core": "^7.12.3",
|
|
64
64
|
"@babel/preset-env": "^7.12.1",
|
|
65
|
-
"@changesets/cli": "^2.11.
|
|
65
|
+
"@changesets/cli": "^2.11.2",
|
|
66
66
|
"@rollup/plugin-babel": "^5.2.1",
|
|
67
|
-
"@rollup/plugin-commonjs": "^
|
|
68
|
-
"@rollup/plugin-node-resolve": "^
|
|
67
|
+
"@rollup/plugin-commonjs": "^16.0.0",
|
|
68
|
+
"@rollup/plugin-node-resolve": "^10.0.0",
|
|
69
69
|
"@testing-library/cypress": "^7.0.1",
|
|
70
|
-
"@types/jquery": "^3.5.
|
|
70
|
+
"@types/jquery": "^3.5.4",
|
|
71
71
|
"all-contributors-cli": "^6.19.0",
|
|
72
72
|
"babel-eslint": "^10.1.0",
|
|
73
|
-
"babel-loader": "^8.1
|
|
73
|
+
"babel-loader": "^8.2.1",
|
|
74
74
|
"babelify": "^10.0.0",
|
|
75
75
|
"budo": "^11.6.4",
|
|
76
|
-
"cypress": "^5.
|
|
76
|
+
"cypress": "^5.6.0",
|
|
77
77
|
"cypress-plugin-tab": "^1.0.5",
|
|
78
|
-
"eslint": "^7.
|
|
79
|
-
"eslint-config-prettier": "^6.
|
|
78
|
+
"eslint": "^7.13.0",
|
|
79
|
+
"eslint-config-prettier": "^6.15.0",
|
|
80
80
|
"eslint-plugin-cypress": "^2.11.2",
|
|
81
81
|
"prettier": "^2.1.2",
|
|
82
|
-
"rollup": "^2.
|
|
82
|
+
"rollup": "^2.33.1",
|
|
83
83
|
"rollup-plugin-sourcemaps": "^0.6.3",
|
|
84
84
|
"rollup-plugin-terser": "^7.0.1",
|
|
85
85
|
"start-server-and-test": "^1.11.5",
|
|
86
|
-
"typescript": "^4.0.
|
|
86
|
+
"typescript": "^4.0.5"
|
|
87
87
|
}
|
|
88
88
|
}
|