UNPKG

@salesforce/design-system-react

Version:

Salesforce Lightning Design System for React

75 lines (61 loc) 2.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _tabbable = require("./tabbable"); var _tabbable2 = _interopRequireDefault(_tabbable); var _keyCode = require("./key-code"); var _keyCode2 = _interopRequireDefault(_keyCode); var _executionEnvironment = require("./execution-environment"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ancestor = null; var focusLaterElement = null; var handleScopedKeyDown = function handleScopedKeyDown(event) { if (!_executionEnvironment.canUseDOM || !ancestor || event.keyCode !== _keyCode2.default.TAB) { return; } var tabbableElements = (0, _tabbable2.default)(ancestor); var finalTabbable = tabbableElements[event.shiftKey ? 0 : tabbableElements.length - 1]; var leavingFinalTabbable = finalTabbable === document.activeElement || // handle immediate shift+tab after opening with mouse ancestor === document.activeElement; if (!leavingFinalTabbable) return; event.preventDefault(); var target = tabbableElements[event.shiftKey ? tabbableElements.length - 1 : 0]; target.focus(); }; // PUBLIC methods var ElementFocus = { focusAncestor: function focusAncestor() { if (_executionEnvironment.canUseDOM) { ancestor.focus(); } }, hasOrAncestorHasFocus: function hasOrAncestorHasFocus() { return _executionEnvironment.canUseDOM && (document.activeElement === ancestor || ancestor.contains(document.activeElement)); }, returnFocusToStoredElement: function returnFocusToStoredElement() { if (_executionEnvironment.canUseDOM) { try { focusLaterElement.focus(); } catch (e) { // eslint-disable-next-line no-console console.warn("You tried to return focus to ".concat(focusLaterElement, " but it is not in the DOM anymore")); } focusLaterElement = null; } }, setupScopedFocus: function setupScopedFocus(_ref) { var ancestorElement = _ref.ancestorElement; ancestor = ancestorElement; window.addEventListener('keydown', handleScopedKeyDown, false); }, storeActiveElement: function storeActiveElement() { focusLaterElement = _executionEnvironment.canUseDOM ? document.activeElement : null; }, teardownScopedFocus: function teardownScopedFocus() { ancestor = null; if (_executionEnvironment.canUseDOM) { window.removeEventListener('keydown', handleScopedKeyDown); } } }; exports.default = ElementFocus;