@itwin/itwinui-react
Version:
A react component library for iTwinUI
57 lines (56 loc) • 1.76 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true,
});
Object.defineProperty(exports, 'FocusTrap', {
enumerable: true,
get: function () {
return FocusTrap;
},
});
const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
const _react = /*#__PURE__*/ _interop_require_wildcard._(require('react'));
const _focusable = require('../functions/focusable.js');
const FocusTrap = (props) => {
let { children } = props;
let firstFocusTrapRef = _react.useRef(null);
let getFirstLastFocusables = _react.useCallback(() => {
let childrenElement = firstFocusTrapRef.current?.nextElementSibling;
let elements = (0, _focusable.getTabbableElements)(childrenElement);
let firstElement = elements[0];
let lastElement = elements[(elements.length || 1) - 1];
return [firstElement, lastElement];
}, []);
let onFirstFocus = _react.useCallback(
(event) => {
let [firstElement, lastElement] = getFirstLastFocusables();
if (event.relatedTarget === firstElement) lastElement?.focus();
else firstElement?.focus();
},
[getFirstLastFocusables],
);
let onLastFocus = _react.useCallback(
(event) => {
let [firstElement, lastElement] = getFirstLastFocusables();
if (event.relatedTarget === lastElement) firstElement?.focus();
else lastElement?.focus();
},
[getFirstLastFocusables],
);
return _react.createElement(
_react.Fragment,
null,
_react.createElement('div', {
ref: firstFocusTrapRef,
tabIndex: 0,
onFocus: onFirstFocus,
'aria-hidden': true,
}),
children,
_react.createElement('div', {
tabIndex: 0,
onFocus: onLastFocus,
'aria-hidden': true,
}),
);
};