Add files
This commit is contained in:
commit
bb80829159
18195 changed files with 2122994 additions and 0 deletions
243
509bba0_unpacked_with_node_modules/~/focus-trap/index.js
generated
Executable file
243
509bba0_unpacked_with_node_modules/~/focus-trap/index.js
generated
Executable file
|
@ -0,0 +1,243 @@
|
|||
var tabbable = require('tabbable');
|
||||
|
||||
var listeningFocusTrap = null;
|
||||
|
||||
function focusTrap(element, userOptions) {
|
||||
var tabbableNodes = [];
|
||||
var nodeFocusedBeforeActivation = null;
|
||||
var active = false;
|
||||
var paused = false;
|
||||
|
||||
var container = (typeof element === 'string')
|
||||
? document.querySelector(element)
|
||||
: element;
|
||||
|
||||
var config = userOptions || {};
|
||||
config.returnFocusOnDeactivate = (userOptions && userOptions.returnFocusOnDeactivate !== undefined)
|
||||
? userOptions.returnFocusOnDeactivate
|
||||
: true;
|
||||
config.escapeDeactivates = (userOptions && userOptions.escapeDeactivates !== undefined)
|
||||
? userOptions.escapeDeactivates
|
||||
: true;
|
||||
|
||||
var trap = {
|
||||
activate: activate,
|
||||
deactivate: deactivate,
|
||||
pause: pause,
|
||||
unpause: unpause,
|
||||
};
|
||||
|
||||
return trap;
|
||||
|
||||
function activate(activateOptions) {
|
||||
if (active) return;
|
||||
|
||||
var defaultedActivateOptions = {
|
||||
onActivate: (activateOptions && activateOptions.onActivate !== undefined)
|
||||
? activateOptions.onActivate
|
||||
: config.onActivate,
|
||||
};
|
||||
|
||||
active = true;
|
||||
paused = false;
|
||||
nodeFocusedBeforeActivation = document.activeElement;
|
||||
|
||||
if (defaultedActivateOptions.onActivate) {
|
||||
defaultedActivateOptions.onActivate();
|
||||
}
|
||||
|
||||
addListeners();
|
||||
return trap;
|
||||
}
|
||||
|
||||
function deactivate(deactivateOptions) {
|
||||
if (!active) return;
|
||||
|
||||
var defaultedDeactivateOptions = {
|
||||
returnFocus: (deactivateOptions && deactivateOptions.returnFocus !== undefined)
|
||||
? deactivateOptions.returnFocus
|
||||
: config.returnFocusOnDeactivate,
|
||||
onDeactivate: (deactivateOptions && deactivateOptions.onDeactivate !== undefined)
|
||||
? deactivateOptions.onDeactivate
|
||||
: config.onDeactivate,
|
||||
};
|
||||
|
||||
removeListeners();
|
||||
|
||||
if (defaultedDeactivateOptions.onDeactivate) {
|
||||
defaultedDeactivateOptions.onDeactivate();
|
||||
}
|
||||
|
||||
if (defaultedDeactivateOptions.returnFocus) {
|
||||
setTimeout(function () {
|
||||
tryFocus(nodeFocusedBeforeActivation);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
active = false;
|
||||
paused = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
function pause() {
|
||||
if (paused || !active) return;
|
||||
paused = true;
|
||||
removeListeners();
|
||||
}
|
||||
|
||||
function unpause() {
|
||||
if (!paused || !active) return;
|
||||
paused = false;
|
||||
addListeners();
|
||||
}
|
||||
|
||||
function addListeners() {
|
||||
if (!active) return;
|
||||
|
||||
// There can be only one listening focus trap at a time
|
||||
if (listeningFocusTrap) {
|
||||
listeningFocusTrap.pause();
|
||||
}
|
||||
listeningFocusTrap = trap;
|
||||
|
||||
updateTabbableNodes();
|
||||
tryFocus(firstFocusNode());
|
||||
document.addEventListener('focus', checkFocus, true);
|
||||
document.addEventListener('click', checkClick, true);
|
||||
document.addEventListener('mousedown', checkPointerDown, true);
|
||||
document.addEventListener('touchstart', checkPointerDown, true);
|
||||
document.addEventListener('keydown', checkKey, true);
|
||||
|
||||
return trap;
|
||||
}
|
||||
|
||||
function removeListeners() {
|
||||
if (!active || listeningFocusTrap !== trap) return;
|
||||
|
||||
document.removeEventListener('focus', checkFocus, true);
|
||||
document.removeEventListener('click', checkClick, true);
|
||||
document.removeEventListener('mousedown', checkPointerDown, true);
|
||||
document.removeEventListener('touchstart', checkPointerDown, true);
|
||||
document.removeEventListener('keydown', checkKey, true);
|
||||
|
||||
listeningFocusTrap = null;
|
||||
|
||||
return trap;
|
||||
}
|
||||
|
||||
function getNodeForOption(optionName) {
|
||||
var optionValue = config[optionName];
|
||||
var node = optionValue;
|
||||
if (!optionValue) {
|
||||
return null;
|
||||
}
|
||||
if (typeof optionValue === 'string') {
|
||||
node = document.querySelector(optionValue);
|
||||
if (!node) {
|
||||
throw new Error('`' + optionName + '` refers to no known node');
|
||||
}
|
||||
}
|
||||
if (typeof optionValue === 'function') {
|
||||
node = optionValue();
|
||||
if (!node) {
|
||||
throw new Error('`' + optionName + '` did not return a node');
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
function firstFocusNode() {
|
||||
var node;
|
||||
if (getNodeForOption('initialFocus') !== null) {
|
||||
node = getNodeForOption('initialFocus');
|
||||
} else if (container.contains(document.activeElement)) {
|
||||
node = document.activeElement;
|
||||
} else {
|
||||
node = tabbableNodes[0] || getNodeForOption('fallbackFocus');
|
||||
}
|
||||
|
||||
if (!node) {
|
||||
throw new Error('You can\'t have a focus-trap without at least one focusable element');
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
// This needs to be done on mousedown and touchstart instead of click
|
||||
// so that it precedes the focus event
|
||||
function checkPointerDown(e) {
|
||||
if (config.clickOutsideDeactivates && !container.contains(e.target)) {
|
||||
deactivate({ returnFocus: false });
|
||||
}
|
||||
}
|
||||
|
||||
function checkClick(e) {
|
||||
if (config.clickOutsideDeactivates) return;
|
||||
if (container.contains(e.target)) return;
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
function checkFocus(e) {
|
||||
if (container.contains(e.target)) return;
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
// Checking for a blur method here resolves a Firefox issue (#15)
|
||||
if (typeof e.target.blur === 'function') e.target.blur();
|
||||
}
|
||||
|
||||
function checkKey(e) {
|
||||
if (e.key === 'Tab' || e.keyCode === 9) {
|
||||
handleTab(e);
|
||||
}
|
||||
|
||||
if (config.escapeDeactivates !== false && isEscapeEvent(e)) {
|
||||
deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
function handleTab(e) {
|
||||
e.preventDefault();
|
||||
updateTabbableNodes();
|
||||
var currentFocusIndex = tabbableNodes.indexOf(e.target);
|
||||
var lastTabbableNode = tabbableNodes[tabbableNodes.length - 1];
|
||||
var firstTabbableNode = tabbableNodes[0];
|
||||
|
||||
if (e.shiftKey) {
|
||||
if (e.target === firstTabbableNode || tabbableNodes.indexOf(e.target) === -1) {
|
||||
return tryFocus(lastTabbableNode);
|
||||
}
|
||||
return tryFocus(tabbableNodes[currentFocusIndex - 1]);
|
||||
}
|
||||
|
||||
if (e.target === lastTabbableNode) return tryFocus(firstTabbableNode);
|
||||
|
||||
tryFocus(tabbableNodes[currentFocusIndex + 1]);
|
||||
}
|
||||
|
||||
function updateTabbableNodes() {
|
||||
tabbableNodes = tabbable(container);
|
||||
}
|
||||
}
|
||||
|
||||
function isEscapeEvent(e) {
|
||||
return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;
|
||||
}
|
||||
|
||||
function tryFocus(node) {
|
||||
if (!node || !node.focus) return;
|
||||
node.focus();
|
||||
if (node.tagName.toLowerCase() === 'input') {
|
||||
node.select();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = focusTrap;
|
||||
|
||||
|
||||
|
||||
//////////////////
|
||||
// WEBPACK FOOTER
|
||||
// ./~/focus-trap/index.js
|
||||
// module id = 2362
|
||||
// module chunks = 4
|
Loading…
Add table
Add a link
Reference in a new issue