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
package/dist/focus-trap.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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
5
|
'use strict';
|
|
@@ -95,9 +95,8 @@ var activeFocusTraps = function () {
|
|
|
95
95
|
};
|
|
96
96
|
}();
|
|
97
97
|
|
|
98
|
-
function createFocusTrap(
|
|
98
|
+
function createFocusTrap(elements, userOptions) {
|
|
99
99
|
var doc = document;
|
|
100
|
-
var container = typeof element === 'string' ? doc.querySelector(element) : element;
|
|
101
100
|
|
|
102
101
|
var config = _objectSpread2({
|
|
103
102
|
returnFocusOnDeactivate: true,
|
|
@@ -106,8 +105,10 @@ function createFocusTrap(element, userOptions) {
|
|
|
106
105
|
}, userOptions);
|
|
107
106
|
|
|
108
107
|
var state = {
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
// @type {Array<HTMLElement>}
|
|
109
|
+
containers: [],
|
|
110
|
+
// @type {{ firstTabbableNode: HTMLElement, lastTabbableNode: HTMLElement }}
|
|
111
|
+
tabbableGroups: [],
|
|
111
112
|
nodeFocusedBeforeActivation: null,
|
|
112
113
|
mostRecentlyFocusedNode: null,
|
|
113
114
|
active: false,
|
|
@@ -117,10 +118,25 @@ function createFocusTrap(element, userOptions) {
|
|
|
117
118
|
activate: activate,
|
|
118
119
|
deactivate: deactivate,
|
|
119
120
|
pause: pause,
|
|
120
|
-
unpause: unpause
|
|
121
|
+
unpause: unpause,
|
|
122
|
+
updateContainerElements: updateContainerElements
|
|
121
123
|
};
|
|
124
|
+
updateContainerElements(elements);
|
|
122
125
|
return trap;
|
|
123
126
|
|
|
127
|
+
function updateContainerElements(containerElements) {
|
|
128
|
+
var elementsAsArray = [].concat(containerElements).filter(Boolean);
|
|
129
|
+
state.containers = elementsAsArray.map(function (element) {
|
|
130
|
+
return typeof element === 'string' ? doc.querySelector(element) : element;
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
if (state.active) {
|
|
134
|
+
updateTabbableNodes();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return trap;
|
|
138
|
+
}
|
|
139
|
+
|
|
124
140
|
function activate(activateOptions) {
|
|
125
141
|
if (state.active) return;
|
|
126
142
|
updateTabbableNodes();
|
|
@@ -162,16 +178,18 @@ function createFocusTrap(element, userOptions) {
|
|
|
162
178
|
}
|
|
163
179
|
|
|
164
180
|
function pause() {
|
|
165
|
-
if (state.paused || !state.active) return;
|
|
181
|
+
if (state.paused || !state.active) return trap;
|
|
166
182
|
state.paused = true;
|
|
167
183
|
removeListeners();
|
|
184
|
+
return trap;
|
|
168
185
|
}
|
|
169
186
|
|
|
170
187
|
function unpause() {
|
|
171
|
-
if (!state.paused || !state.active) return;
|
|
188
|
+
if (!state.paused || !state.active) return trap;
|
|
172
189
|
state.paused = false;
|
|
173
190
|
updateTabbableNodes();
|
|
174
191
|
addListeners();
|
|
192
|
+
return trap;
|
|
175
193
|
}
|
|
176
194
|
|
|
177
195
|
function addListeners() {
|
|
@@ -245,10 +263,12 @@ function createFocusTrap(element, userOptions) {
|
|
|
245
263
|
|
|
246
264
|
if (getNodeForOption('initialFocus') !== null) {
|
|
247
265
|
node = getNodeForOption('initialFocus');
|
|
248
|
-
} else if (
|
|
266
|
+
} else if (containersContain(doc.activeElement)) {
|
|
249
267
|
node = doc.activeElement;
|
|
250
268
|
} else {
|
|
251
|
-
|
|
269
|
+
var firstTabbableGroup = state.tabbableGroups[0];
|
|
270
|
+
var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;
|
|
271
|
+
node = firstTabbableNode || getNodeForOption('fallbackFocus');
|
|
252
272
|
}
|
|
253
273
|
|
|
254
274
|
if (!node) {
|
|
@@ -266,7 +286,7 @@ function createFocusTrap(element, userOptions) {
|
|
|
266
286
|
|
|
267
287
|
|
|
268
288
|
function checkPointerDown(e) {
|
|
269
|
-
if (
|
|
289
|
+
if (containersContain(e.target)) {
|
|
270
290
|
// allow the click since it ocurred inside the trap
|
|
271
291
|
return;
|
|
272
292
|
}
|
|
@@ -305,7 +325,7 @@ function createFocusTrap(element, userOptions) {
|
|
|
305
325
|
|
|
306
326
|
function checkFocusIn(e) {
|
|
307
327
|
// In Firefox when you Tab out of an iframe the Document is briefly focused.
|
|
308
|
-
if (
|
|
328
|
+
if (containersContain(e.target) || e.target instanceof Document) {
|
|
309
329
|
return;
|
|
310
330
|
}
|
|
311
331
|
|
|
@@ -332,23 +352,42 @@ function createFocusTrap(element, userOptions) {
|
|
|
332
352
|
|
|
333
353
|
function checkTab(e) {
|
|
334
354
|
updateTabbableNodes();
|
|
355
|
+
var destinationNode = null;
|
|
335
356
|
|
|
336
|
-
if (e.shiftKey
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
357
|
+
if (e.shiftKey) {
|
|
358
|
+
var startOfGroupIndex = state.tabbableGroups.findIndex(function (_ref) {
|
|
359
|
+
var firstTabbableNode = _ref.firstTabbableNode;
|
|
360
|
+
return e.target === firstTabbableNode;
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
if (startOfGroupIndex >= 0) {
|
|
364
|
+
var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;
|
|
365
|
+
var destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
366
|
+
destinationNode = destinationGroup.lastTabbableNode;
|
|
367
|
+
}
|
|
368
|
+
} else {
|
|
369
|
+
var lastOfGroupIndex = state.tabbableGroups.findIndex(function (_ref2) {
|
|
370
|
+
var lastTabbableNode = _ref2.lastTabbableNode;
|
|
371
|
+
return e.target === lastTabbableNode;
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
if (lastOfGroupIndex >= 0) {
|
|
375
|
+
var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;
|
|
376
|
+
|
|
377
|
+
var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];
|
|
378
|
+
destinationNode = _destinationGroup.firstTabbableNode;
|
|
379
|
+
}
|
|
340
380
|
}
|
|
341
381
|
|
|
342
|
-
if (
|
|
382
|
+
if (destinationNode) {
|
|
343
383
|
e.preventDefault();
|
|
344
|
-
tryFocus(
|
|
345
|
-
return;
|
|
384
|
+
tryFocus(destinationNode);
|
|
346
385
|
}
|
|
347
386
|
}
|
|
348
387
|
|
|
349
388
|
function checkClick(e) {
|
|
350
389
|
if (config.clickOutsideDeactivates) return;
|
|
351
|
-
if (
|
|
390
|
+
if (containersContain(e.target)) return;
|
|
352
391
|
|
|
353
392
|
if (config.allowOutsideClick && (typeof config.allowOutsideClick === 'boolean' ? config.allowOutsideClick : config.allowOutsideClick(e))) {
|
|
354
393
|
return;
|
|
@@ -359,9 +398,13 @@ function createFocusTrap(element, userOptions) {
|
|
|
359
398
|
}
|
|
360
399
|
|
|
361
400
|
function updateTabbableNodes() {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
401
|
+
state.tabbableGroups = state.containers.map(function (container) {
|
|
402
|
+
var tabbableNodes = tabbable.tabbable(container);
|
|
403
|
+
return {
|
|
404
|
+
firstTabbableNode: tabbableNodes[0],
|
|
405
|
+
lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]
|
|
406
|
+
};
|
|
407
|
+
});
|
|
365
408
|
}
|
|
366
409
|
|
|
367
410
|
function tryFocus(node) {
|
|
@@ -381,6 +424,12 @@ function createFocusTrap(element, userOptions) {
|
|
|
381
424
|
node.select();
|
|
382
425
|
}
|
|
383
426
|
}
|
|
427
|
+
|
|
428
|
+
function containersContain(element) {
|
|
429
|
+
return state.containers.some(function (container) {
|
|
430
|
+
return container.contains(element);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
384
433
|
}
|
|
385
434
|
|
|
386
435
|
function isSelectableInput(node) {
|
package/dist/focus-trap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.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.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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"}
|
package/dist/focus-trap.min.js
CHANGED
|
@@ -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
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("tabbable");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
|
|
5
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("tabbable");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 r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}var a,o=(a=[],{activateTrap:function(e){if(a.length>0){var t=a[a.length-1];t!==e&&t.pause()}var n=a.indexOf(e);-1===n||a.splice(n,1),a.push(e)},deactivateTrap:function(e){var t=a.indexOf(e);-1!==t&&a.splice(t,1),a.length>0&&a[a.length-1].unpause()}});function i(e){return setTimeout(e,0)}exports.createFocusTrap=function(a,c){var u=document,s=function(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?r(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):r(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}({returnFocusOnDeactivate:!0,escapeDeactivates:!0,delayInitialFocus:!0},c),l={containers:[],tabbableGroups:[],nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1},f={activate:function(e){if(l.active)return;E(),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,E(),b(),f):f},updateContainerElements:v};return v(a),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&&E(),f}function d(t){if(l.active){clearTimeout(e),p(),l.active=!1,l.paused=!1,o.deactivateTrap(f);var n=t&&void 0!==t.onDeactivate?t.onDeactivate:s.onDeactivate;return n&&n(),(t&&void 0!==t.returnFocus?t.returnFocus:s.returnFocusOnDeactivate)&&i((function(){var e;F((e=l.nodeFocusedBeforeActivation,y("setReturnFocus")||e))})),f}}function b(){if(l.active)return o.activateTrap(f),e=s.delayInitialFocus?i((function(){F(O())})):F(O()),u.addEventListener("focusin",g,!0),u.addEventListener("mousedown",m,{capture:!0,passive:!1}),u.addEventListener("touchstart",m,{capture:!0,passive:!1}),u.addEventListener("click",k,{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",m,!0),u.removeEventListener("touchstart",m,!0),u.removeEventListener("click",k,!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 O(){var e;if(null!==y("initialFocus"))e=y("initialFocus");else if(h(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 m(e){h(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){h(e.target)||e.target instanceof Document||(e.stopImmediatePropagation(),F(l.mostRecentlyFocusedNode||O()))}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){E();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 r=0===n?l.tabbableGroups.length-1:n-1;t=l.tabbableGroups[r].lastTabbableNode}}else{var a=l.tabbableGroups.findIndex((function(t){var n=t.lastTabbableNode;return e.target===n}));if(a>=0){var o=a===l.tabbableGroups.length-1?0:a+1;t=l.tabbableGroups[o].firstTabbableNode}}t&&(e.preventDefault(),F(t))}(e)}function k(e){s.clickOutsideDeactivates||h(e.target)||s.allowOutsideClick&&("boolean"==typeof s.allowOutsideClick?s.allowOutsideClick:s.allowOutsideClick(e))||(e.preventDefault(),e.stopImmediatePropagation())}function E(){l.tabbableGroups=l.containers.map((function(e){var n=t.tabbable(e);return{firstTabbableNode:n[0],lastTabbableNode:n[n.length-1]}}))}function F(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()):F(O()))}function h(e){return l.containers.some((function(t){return t.contains(e)}))}};
|
|
6
6
|
//# sourceMappingURL=focus-trap.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.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.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/dist/focus-trap.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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
5
|
(function (global, factory) {
|
|
@@ -100,9 +100,8 @@
|
|
|
100
100
|
};
|
|
101
101
|
}();
|
|
102
102
|
|
|
103
|
-
function createFocusTrap(
|
|
103
|
+
function createFocusTrap(elements, userOptions) {
|
|
104
104
|
var doc = document;
|
|
105
|
-
var container = typeof element === 'string' ? doc.querySelector(element) : element;
|
|
106
105
|
|
|
107
106
|
var config = _objectSpread2({
|
|
108
107
|
returnFocusOnDeactivate: true,
|
|
@@ -111,8 +110,10 @@
|
|
|
111
110
|
}, userOptions);
|
|
112
111
|
|
|
113
112
|
var state = {
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
// @type {Array<HTMLElement>}
|
|
114
|
+
containers: [],
|
|
115
|
+
// @type {{ firstTabbableNode: HTMLElement, lastTabbableNode: HTMLElement }}
|
|
116
|
+
tabbableGroups: [],
|
|
116
117
|
nodeFocusedBeforeActivation: null,
|
|
117
118
|
mostRecentlyFocusedNode: null,
|
|
118
119
|
active: false,
|
|
@@ -122,10 +123,25 @@
|
|
|
122
123
|
activate: activate,
|
|
123
124
|
deactivate: deactivate,
|
|
124
125
|
pause: pause,
|
|
125
|
-
unpause: unpause
|
|
126
|
+
unpause: unpause,
|
|
127
|
+
updateContainerElements: updateContainerElements
|
|
126
128
|
};
|
|
129
|
+
updateContainerElements(elements);
|
|
127
130
|
return trap;
|
|
128
131
|
|
|
132
|
+
function updateContainerElements(containerElements) {
|
|
133
|
+
var elementsAsArray = [].concat(containerElements).filter(Boolean);
|
|
134
|
+
state.containers = elementsAsArray.map(function (element) {
|
|
135
|
+
return typeof element === 'string' ? doc.querySelector(element) : element;
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
if (state.active) {
|
|
139
|
+
updateTabbableNodes();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return trap;
|
|
143
|
+
}
|
|
144
|
+
|
|
129
145
|
function activate(activateOptions) {
|
|
130
146
|
if (state.active) return;
|
|
131
147
|
updateTabbableNodes();
|
|
@@ -167,16 +183,18 @@
|
|
|
167
183
|
}
|
|
168
184
|
|
|
169
185
|
function pause() {
|
|
170
|
-
if (state.paused || !state.active) return;
|
|
186
|
+
if (state.paused || !state.active) return trap;
|
|
171
187
|
state.paused = true;
|
|
172
188
|
removeListeners();
|
|
189
|
+
return trap;
|
|
173
190
|
}
|
|
174
191
|
|
|
175
192
|
function unpause() {
|
|
176
|
-
if (!state.paused || !state.active) return;
|
|
193
|
+
if (!state.paused || !state.active) return trap;
|
|
177
194
|
state.paused = false;
|
|
178
195
|
updateTabbableNodes();
|
|
179
196
|
addListeners();
|
|
197
|
+
return trap;
|
|
180
198
|
}
|
|
181
199
|
|
|
182
200
|
function addListeners() {
|
|
@@ -250,10 +268,12 @@
|
|
|
250
268
|
|
|
251
269
|
if (getNodeForOption('initialFocus') !== null) {
|
|
252
270
|
node = getNodeForOption('initialFocus');
|
|
253
|
-
} else if (
|
|
271
|
+
} else if (containersContain(doc.activeElement)) {
|
|
254
272
|
node = doc.activeElement;
|
|
255
273
|
} else {
|
|
256
|
-
|
|
274
|
+
var firstTabbableGroup = state.tabbableGroups[0];
|
|
275
|
+
var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;
|
|
276
|
+
node = firstTabbableNode || getNodeForOption('fallbackFocus');
|
|
257
277
|
}
|
|
258
278
|
|
|
259
279
|
if (!node) {
|
|
@@ -271,7 +291,7 @@
|
|
|
271
291
|
|
|
272
292
|
|
|
273
293
|
function checkPointerDown(e) {
|
|
274
|
-
if (
|
|
294
|
+
if (containersContain(e.target)) {
|
|
275
295
|
// allow the click since it ocurred inside the trap
|
|
276
296
|
return;
|
|
277
297
|
}
|
|
@@ -310,7 +330,7 @@
|
|
|
310
330
|
|
|
311
331
|
function checkFocusIn(e) {
|
|
312
332
|
// In Firefox when you Tab out of an iframe the Document is briefly focused.
|
|
313
|
-
if (
|
|
333
|
+
if (containersContain(e.target) || e.target instanceof Document) {
|
|
314
334
|
return;
|
|
315
335
|
}
|
|
316
336
|
|
|
@@ -337,23 +357,42 @@
|
|
|
337
357
|
|
|
338
358
|
function checkTab(e) {
|
|
339
359
|
updateTabbableNodes();
|
|
360
|
+
var destinationNode = null;
|
|
340
361
|
|
|
341
|
-
if (e.shiftKey
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
362
|
+
if (e.shiftKey) {
|
|
363
|
+
var startOfGroupIndex = state.tabbableGroups.findIndex(function (_ref) {
|
|
364
|
+
var firstTabbableNode = _ref.firstTabbableNode;
|
|
365
|
+
return e.target === firstTabbableNode;
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
if (startOfGroupIndex >= 0) {
|
|
369
|
+
var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;
|
|
370
|
+
var destinationGroup = state.tabbableGroups[destinationGroupIndex];
|
|
371
|
+
destinationNode = destinationGroup.lastTabbableNode;
|
|
372
|
+
}
|
|
373
|
+
} else {
|
|
374
|
+
var lastOfGroupIndex = state.tabbableGroups.findIndex(function (_ref2) {
|
|
375
|
+
var lastTabbableNode = _ref2.lastTabbableNode;
|
|
376
|
+
return e.target === lastTabbableNode;
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
if (lastOfGroupIndex >= 0) {
|
|
380
|
+
var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;
|
|
381
|
+
|
|
382
|
+
var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];
|
|
383
|
+
destinationNode = _destinationGroup.firstTabbableNode;
|
|
384
|
+
}
|
|
345
385
|
}
|
|
346
386
|
|
|
347
|
-
if (
|
|
387
|
+
if (destinationNode) {
|
|
348
388
|
e.preventDefault();
|
|
349
|
-
tryFocus(
|
|
350
|
-
return;
|
|
389
|
+
tryFocus(destinationNode);
|
|
351
390
|
}
|
|
352
391
|
}
|
|
353
392
|
|
|
354
393
|
function checkClick(e) {
|
|
355
394
|
if (config.clickOutsideDeactivates) return;
|
|
356
|
-
if (
|
|
395
|
+
if (containersContain(e.target)) return;
|
|
357
396
|
|
|
358
397
|
if (config.allowOutsideClick && (typeof config.allowOutsideClick === 'boolean' ? config.allowOutsideClick : config.allowOutsideClick(e))) {
|
|
359
398
|
return;
|
|
@@ -364,9 +403,13 @@
|
|
|
364
403
|
}
|
|
365
404
|
|
|
366
405
|
function updateTabbableNodes() {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
406
|
+
state.tabbableGroups = state.containers.map(function (container) {
|
|
407
|
+
var tabbableNodes = tabbable.tabbable(container);
|
|
408
|
+
return {
|
|
409
|
+
firstTabbableNode: tabbableNodes[0],
|
|
410
|
+
lastTabbableNode: tabbableNodes[tabbableNodes.length - 1]
|
|
411
|
+
};
|
|
412
|
+
});
|
|
370
413
|
}
|
|
371
414
|
|
|
372
415
|
function tryFocus(node) {
|
|
@@ -386,6 +429,12 @@
|
|
|
386
429
|
node.select();
|
|
387
430
|
}
|
|
388
431
|
}
|
|
432
|
+
|
|
433
|
+
function containersContain(element) {
|
|
434
|
+
return state.containers.some(function (container) {
|
|
435
|
+
return container.contains(element);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
389
438
|
}
|
|
390
439
|
|
|
391
440
|
function isSelectableInput(node) {
|