UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

116 lines (115 loc) 4.03 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _includes = _interopRequireDefault(require("core-js-pure/stable/instance/includes.js")); var _react = require("react"); var _clsx = require("clsx"); var _Button = _interopRequireDefault(require("../button/Button.js")); var _HeightAnimation = _interopRequireDefault(require("../height-animation/HeightAnimation.js")); var _helpers = require("../../shared/helpers.js"); var _withComponentMarkers = _interopRequireDefault(require("../../shared/helpers/withComponentMarkers.js")); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const SkipContent = localProps => { const { selector, text, children, className, focusDelay = 400, ...props } = localProps; (0, _react.useEffect)(() => () => { clearTimeout(timeout.current); }, []); const [visible, setVisible] = (0, _react.useState)(false); const [keepReturnActive, setKeepReturnActive] = (0, _react.useState)(false); const ref = (0, _react.useRef)(undefined); const timeout = (0, _react.useRef)(undefined); const classes = (0, _clsx.clsx)('dnb-skip-content', visible && 'dnb-skip-content--visible', keepReturnActive && 'dnb-skip-content__return--active', className); const returnSelector = selector.replace(/^(\.|#)/, ''); const returnId = `${returnSelector}--alias`; const handleBlur = (0, _react.useCallback)(() => { setVisible(false); }, []); const handleClick = (0, _react.useCallback)(() => { setVisible(false); const element = document.querySelector(selector); element?.scrollIntoView?.({ behavior: 'smooth' }); element?.classList.add('dnb-skip-content__focus'); timeout.current = setTimeout(() => { (0, _helpers.applyPageFocus)(selector); document.querySelector(`#${returnSelector}--alias--alias`)?.classList.add('dnb-skip-content__return--active'); }, focusDelay); }, [selector, focusDelay]); const setFocus = (0, _react.useCallback)(() => { var _context; setVisible(true); window.requestAnimationFrame(() => { const element = ref.current?.querySelector('.dnb-button'); element?.focus(); }); if (((_context = ref.current?.getAttribute('class')) == null ? void 0 : Function.call.bind((0, _includes.default)(_context), _context))?.('__return--active')) { setKeepReturnActive(true); } }, []); const handleFocus = (0, _react.useCallback)(e => { if (e.target.tagName === 'SPAN') { setFocus(); } }, [setFocus]); const handleKeyUp = (0, _react.useCallback)(e => { if (e.key === 'Tab') { setFocus(); } }, [setFocus]); return (0, _jsxRuntime.jsx)("span", { className: classes, ref: ref, onFocus: handleFocus, id: returnId, children: (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [!visible && (0, _jsxRuntime.jsx)("button", { className: "dnb-sr-only", type: "button", onKeyUp: handleKeyUp, children: text || children }), (0, _jsxRuntime.jsx)(_HeightAnimation.default, { open: visible, "aria-live": "polite", children: (0, _jsxRuntime.jsx)(_Button.default, { wrap: true, variant: "secondary", onClick: handleClick, onBlur: handleBlur, ...props, children: text || children }) })] }) }); }; const SkipContentReturn = localProps => { const { selector, className, ...props } = localProps; const classes = (0, _clsx.clsx)('dnb-skip-content__return', className); return (0, _jsxRuntime.jsx)(SkipContent, { selector: `${selector}--alias`, className: classes, ...props }); }; SkipContent.Return = SkipContentReturn; (0, _withComponentMarkers.default)(SkipContent, { _supportsSpacingProps: true }); var _default = exports.default = SkipContent; //# sourceMappingURL=SkipContent.js.map