UNPKG

@styleless-ui/react

Version:

Completely unstyled, headless and accessible React UI components.

1 lines 2.59 kB
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var u=Object.getOwnPropertyDescriptor(t,r);u&&!("get"in u?!t.__esModule:u.writable||u.configurable)||(u={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,u)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&__createBinding(t,e,r);return __setModuleDefault(t,e),t};Object.defineProperty(exports,"__esModule",{value:!0});var jsx_runtime_1=require("react/jsx-runtime"),React=__importStar(require("react")),internals_1=require("../internals"),utils_1=require("../utils"),FocusTrap=function(e){var t,r=e.children,n=e.enabled,u=void 0!==n&&n,i=function(){try{if(!React.isValidElement(r))throw 0;return React.Children.only(r)}catch(e){throw new Error("[StylelessUI][FocusTrap]: The `children` prop has to be a single valid element.")}}(),c=React.useRef(!1),a=React.useRef(null),l=React.useRef(),o=(0,utils_1.useForkedRefs)(l,null!==(t=i.ref)&&void 0!==t?t:null),s=function(e){var t=null!=e?e:l.current;if(!t)return!1;if(!(0,utils_1.isFocusable)(t))return!1;c.current=!0;try{t.focus()}catch(e){}return c.current=!1,document.activeElement===t},d=function(e){var t=null!=e?e:l.current;return!!t&&Array.from(t.children).some((function(e){return s(e)||d(e)}))},f=function(e){var t=null!=e?e:l.current;return!!t&&Array.from(t.children).reverse().some((function(e){return s(e)||f(e)}))};React.useEffect((function(){u&&d()}),[u]);var _={ref:o};return"undefined"!=typeof document&&(0,utils_1.useEventListener)({target:document,eventType:"focus",handler:function(e){var t;c.current||l.current&&((0,utils_1.contains)(l.current,e.target)?a.current=e.target:(d(),document.activeElement===a.current&&f(),document.activeElement&&!(0,utils_1.contains)(l.current,document.activeElement)&&(null===(t=document.activeElement)||void 0===t||t.blur()),a.current=document.activeElement))},options:{capture:!0}},u),(0,jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment,{children:[(0,jsx_runtime_1.jsx)("div",{"aria-hidden":"true",tabIndex:u?0:-1,style:internals_1.visuallyHiddenCSSProperties}),React.cloneElement(i,_),(0,jsx_runtime_1.jsx)("div",{"aria-hidden":"true",tabIndex:u?0:-1,style:internals_1.visuallyHiddenCSSProperties})]})};exports.default=FocusTrap;