UNPKG

@daniel.husar/focus-trap

Version:
101 lines (76 loc) 3.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _helpers = require("./helpers"); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var boolNoop = function boolNoop() { return false; }; var nullNoop = function nullNoop() { return null; }; var FocusTrap = /*#__PURE__*/ function () { function FocusTrap(_ref) { var _this = this; var node = _ref.node, _firstElement = _ref.firstElement, _lastElement = _ref.lastElement, _disableStartingTrap = _ref.disableStartingTrap, _disableEndingTrap = _ref.disableEndingTrap; _classCallCheck(this, FocusTrap); _defineProperty(this, "node", void 0); _defineProperty(this, "firstElement", void 0); _defineProperty(this, "lastElement", void 0); _defineProperty(this, "disableStartingTrap", void 0); _defineProperty(this, "disableEndingTrap", void 0); _defineProperty(this, "focusableElements", null); _defineProperty(this, "handleFocusTrap", function (event) { var focusableElements = _this.focusableElements, firstElement = _this.firstElement, lastElement = _this.lastElement, disableEndingTrap = _this.disableEndingTrap, disableStartingTrap = _this.disableStartingTrap; if (!focusableElements || !focusableElements.length || event.keyCode !== _helpers.KEYS.TAB) return; var first = focusableElements[0]; var last = focusableElements[focusableElements.length - 1]; var isBackwards = event.shiftKey; if (last === event.srcElement && !isBackwards && !disableEndingTrap()) { event.preventDefault(); return (firstElement() || first).focus(); } if (first === event.srcElement && isBackwards && !disableStartingTrap()) { event.preventDefault(); return (lastElement() || last).focus(); } }); this.node = node; this.firstElement = _firstElement || nullNoop; this.lastElement = _lastElement || nullNoop; this.disableStartingTrap = _disableStartingTrap || boolNoop; this.disableEndingTrap = _disableEndingTrap || boolNoop; this.focusableElements = (0, _helpers.getAllFocusableElements)(this.node); (0, _helpers.addEventListener)(this.node, 'keydown', this.handleFocusTrap); } _createClass(FocusTrap, [{ key: "recalculateFocusableElements", value: function recalculateFocusableElements() { this.focusableElements = (0, _helpers.getAllFocusableElements)(this.node); } }, { key: "restore", value: function restore() { if (this.node) { (0, _helpers.removeEventListener)(this.node, 'keydown', this.handleFocusTrap); } } }]); return FocusTrap; }(); exports.default = FocusTrap;