``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
117 lines
3.2 KiB
JavaScript
117 lines
3.2 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.resetState = resetState;
|
|
exports.log = log;
|
|
exports.handleBlur = handleBlur;
|
|
exports.handleFocus = handleFocus;
|
|
exports.markForFocusLater = markForFocusLater;
|
|
exports.returnFocus = returnFocus;
|
|
exports.popWithoutFocus = popWithoutFocus;
|
|
exports.setupScopedFocus = setupScopedFocus;
|
|
exports.teardownScopedFocus = teardownScopedFocus;
|
|
|
|
var _tabbable = require("../helpers/tabbable");
|
|
|
|
var _tabbable2 = _interopRequireDefault(_tabbable);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
var focusLaterElements = [];
|
|
var modalElement = null;
|
|
var needToFocus = false;
|
|
|
|
/* eslint-disable no-console */
|
|
/* istanbul ignore next */
|
|
function resetState() {
|
|
focusLaterElements = [];
|
|
}
|
|
|
|
/* istanbul ignore next */
|
|
function log() {
|
|
if (process.env.NODE_ENV !== "production") {
|
|
console.log("focusManager ----------");
|
|
focusLaterElements.forEach(function (f) {
|
|
var check = f || {};
|
|
console.log(check.nodeName, check.className, check.id);
|
|
});
|
|
console.log("end focusManager ----------");
|
|
}
|
|
}
|
|
/* eslint-enable no-console */
|
|
|
|
function handleBlur() {
|
|
needToFocus = true;
|
|
}
|
|
|
|
function handleFocus() {
|
|
if (needToFocus) {
|
|
needToFocus = false;
|
|
if (!modalElement) {
|
|
return;
|
|
}
|
|
// need to see how jQuery shims document.on('focusin') so we don't need the
|
|
// setTimeout, firefox doesn't support focusin, if it did, we could focus
|
|
// the element outside of a setTimeout. Side-effect of this implementation
|
|
// is that the document.body gets focus, and then we focus our element right
|
|
// after, seems fine.
|
|
setTimeout(function () {
|
|
if (modalElement.contains(document.activeElement)) {
|
|
return;
|
|
}
|
|
var el = (0, _tabbable2.default)(modalElement)[0] || modalElement;
|
|
el.focus();
|
|
}, 0);
|
|
}
|
|
}
|
|
|
|
function markForFocusLater() {
|
|
focusLaterElements.push(document.activeElement);
|
|
}
|
|
|
|
/* eslint-disable no-console */
|
|
function returnFocus() {
|
|
var preventScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
|
|
var toFocus = null;
|
|
try {
|
|
if (focusLaterElements.length !== 0) {
|
|
toFocus = focusLaterElements.pop();
|
|
toFocus.focus({ preventScroll: preventScroll });
|
|
}
|
|
return;
|
|
} catch (e) {
|
|
console.warn(["You tried to return focus to", toFocus, "but it is not in the DOM anymore"].join(" "));
|
|
}
|
|
}
|
|
/* eslint-enable no-console */
|
|
|
|
function popWithoutFocus() {
|
|
focusLaterElements.length > 0 && focusLaterElements.pop();
|
|
}
|
|
|
|
function setupScopedFocus(element) {
|
|
modalElement = element;
|
|
|
|
if (window.addEventListener) {
|
|
window.addEventListener("blur", handleBlur, false);
|
|
document.addEventListener("focus", handleFocus, true);
|
|
} else {
|
|
window.attachEvent("onBlur", handleBlur);
|
|
document.attachEvent("onFocus", handleFocus);
|
|
}
|
|
}
|
|
|
|
function teardownScopedFocus() {
|
|
modalElement = null;
|
|
|
|
if (window.addEventListener) {
|
|
window.removeEventListener("blur", handleBlur);
|
|
document.removeEventListener("focus", handleFocus);
|
|
} else {
|
|
window.detachEvent("onBlur", handleBlur);
|
|
document.detachEvent("onFocus", handleFocus);
|
|
}
|
|
} |