UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

57 lines (56 loc) 1.76 kB
'use strict'; 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, }), ); };