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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * focus-trap 6.1.4
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(element, userOptions) {
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
- firstTabbableNode: null,
110
- lastTabbableNode: null,
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 (container.contains(doc.activeElement)) {
266
+ } else if (containersContain(doc.activeElement)) {
249
267
  node = doc.activeElement;
250
268
  } else {
251
- node = state.firstTabbableNode || getNodeForOption('fallbackFocus');
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 (container.contains(e.target)) {
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 (container.contains(e.target) || e.target instanceof Document) {
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 && e.target === state.firstTabbableNode) {
337
- e.preventDefault();
338
- tryFocus(state.lastTabbableNode);
339
- return;
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 (!e.shiftKey && e.target === state.lastTabbableNode) {
382
+ if (destinationNode) {
343
383
  e.preventDefault();
344
- tryFocus(state.firstTabbableNode);
345
- return;
384
+ tryFocus(destinationNode);
346
385
  }
347
386
  }
348
387
 
349
388
  function checkClick(e) {
350
389
  if (config.clickOutsideDeactivates) return;
351
- if (container.contains(e.target)) return;
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
- var tabbableNodes = tabbable.tabbable(container);
363
- state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();
364
- state.lastTabbableNode = tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();
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) {
@@ -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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"}
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * focus-trap 6.1.4
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 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=(r=[],{activateTrap:function(e){if(r.length>0){var t=r[r.length-1];t!==e&&t.pause()}var n=r.indexOf(e);-1===n||r.splice(n,1),r.push(e)},deactivateTrap:function(e){var t=r.indexOf(e);-1!==t&&r.splice(t,1),r.length>0&&r[r.length-1].unpause()}});function i(e){return setTimeout(e,0)}exports.createFocusTrap=function(r,c){var u=document,s="string"==typeof r?u.querySelector(r):r,l=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},c),f={firstTabbableNode:null,lastTabbableNode:null,nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1},v={activate:function(e){if(f.active)return;E(),f.active=!0,f.paused=!1,f.nodeFocusedBeforeActivation=u.activeElement;var t=e&&e.onActivate?e.onActivate:l.onActivate;t&&t();return p(),v},deactivate:d,pause:function(){if(f.paused||!f.active)return;f.paused=!0,b()},unpause:function(){if(!f.paused||!f.active)return;f.paused=!1,E(),p()}};return v;function d(t){if(f.active){clearTimeout(e),b(),f.active=!1,f.paused=!1,o.deactivateTrap(v);var n=t&&void 0!==t.onDeactivate?t.onDeactivate:l.onDeactivate;return n&&n(),(t&&void 0!==t.returnFocus?t.returnFocus:l.returnFocusOnDeactivate)&&i((function(){var e;D((e=f.nodeFocusedBeforeActivation,y("setReturnFocus")||e))})),v}}function p(){if(f.active)return o.activateTrap(v),e=l.delayInitialFocus?i((function(){D(O())})):D(O()),u.addEventListener("focusin",w,!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",g,{capture:!0,passive:!1}),v}function b(){if(f.active)return u.removeEventListener("focusin",w,!0),u.removeEventListener("mousedown",m,!0),u.removeEventListener("touchstart",m,!0),u.removeEventListener("click",k,!0),u.removeEventListener("keydown",g,!0),v}function y(e){var t=l[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(!(e=null!==y("initialFocus")?y("initialFocus"):s.contains(u.activeElement)?u.activeElement:f.firstTabbableNode||y("fallbackFocus")))throw new Error("Your focus-trap needs to have at least one focusable element");return e}function m(e){s.contains(e.target)||(l.clickOutsideDeactivates?d({returnFocus:l.returnFocusOnDeactivate&&!t.isFocusable(e.target)}):l.allowOutsideClick&&("boolean"==typeof l.allowOutsideClick?l.allowOutsideClick:l.allowOutsideClick(e))||e.preventDefault())}function w(e){s.contains(e.target)||e.target instanceof Document||(e.stopImmediatePropagation(),D(f.mostRecentlyFocusedNode||O()))}function g(e){if(!1!==l.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){if(E(),e.shiftKey&&e.target===f.firstTabbableNode)return e.preventDefault(),void D(f.lastTabbableNode);if(!e.shiftKey&&e.target===f.lastTabbableNode)e.preventDefault(),D(f.firstTabbableNode)}(e)}function k(e){l.clickOutsideDeactivates||s.contains(e.target)||l.allowOutsideClick&&("boolean"==typeof l.allowOutsideClick?l.allowOutsideClick:l.allowOutsideClick(e))||(e.preventDefault(),e.stopImmediatePropagation())}function E(){var e=t.tabbable(s);f.firstTabbableNode=e[0]||O(),f.lastTabbableNode=e[e.length-1]||O()}function D(e){e!==u.activeElement&&(e&&e.focus?(e.focus({preventScroll:!!l.preventScroll}),f.mostRecentlyFocusedNode=e,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(e)&&e.select()):D(O()))}};
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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"}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * focus-trap 6.1.4
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(element, userOptions) {
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
- firstTabbableNode: null,
115
- lastTabbableNode: null,
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 (container.contains(doc.activeElement)) {
271
+ } else if (containersContain(doc.activeElement)) {
254
272
  node = doc.activeElement;
255
273
  } else {
256
- node = state.firstTabbableNode || getNodeForOption('fallbackFocus');
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 (container.contains(e.target)) {
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 (container.contains(e.target) || e.target instanceof Document) {
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 && e.target === state.firstTabbableNode) {
342
- e.preventDefault();
343
- tryFocus(state.lastTabbableNode);
344
- return;
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 (!e.shiftKey && e.target === state.lastTabbableNode) {
387
+ if (destinationNode) {
348
388
  e.preventDefault();
349
- tryFocus(state.firstTabbableNode);
350
- return;
389
+ tryFocus(destinationNode);
351
390
  }
352
391
  }
353
392
 
354
393
  function checkClick(e) {
355
394
  if (config.clickOutsideDeactivates) return;
356
- if (container.contains(e.target)) return;
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
- var tabbableNodes = tabbable.tabbable(container);
368
- state.firstTabbableNode = tabbableNodes[0] || getInitialFocusNode();
369
- state.lastTabbableNode = tabbableNodes[tabbableNodes.length - 1] || getInitialFocusNode();
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) {