UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

109 lines 3.87 kB
import React, { useCallback } from 'react'; import clsx from 'clsx'; import Button from "../button/Button.js"; import HeightAnimation from "../height-animation/HeightAnimation.js"; import { applyPageFocus } from "../../shared/helpers.js"; import withComponentMarkers from "../../shared/helpers/withComponentMarkers.js"; import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime"; const SkipContent = localProps => { const { selector, text, children, className, focusDelay = 400, ...props } = localProps; React.useEffect(() => () => { clearTimeout(timeout.current); }, []); const [visible, setVisible] = React.useState(false); const [keepReturnActive, setKeepReturnActive] = React.useState(false); const ref = React.useRef(undefined); const timeout = React.useRef(undefined); const classes = clsx('dnb-skip-content', className, visible && 'dnb-skip-content--visible', keepReturnActive && 'dnb-skip-content__return--active'); const returnSelector = selector.replace(/^(\.|#)/, ''); const returnId = `${returnSelector}--alias`; const handleBlur = useCallback(() => { setVisible(false); }, []); const handleClick = useCallback(() => { var _element$scrollIntoVi; setVisible(false); const element = document.querySelector(selector); element === null || element === void 0 || (_element$scrollIntoVi = element.scrollIntoView) === null || _element$scrollIntoVi === void 0 || _element$scrollIntoVi.call(element, { behavior: 'smooth' }); element === null || element === void 0 || element.classList.add('dnb-skip-content__focus'); timeout.current = setTimeout(() => { var _document$querySelect; applyPageFocus(selector); (_document$querySelect = document.querySelector(`#${returnSelector}--alias--alias`)) === null || _document$querySelect === void 0 || _document$querySelect.classList.add('dnb-skip-content__return--active'); }, focusDelay); }, [selector, focusDelay]); const setFocus = useCallback(() => { var _ref$current2; setVisible(true); window.requestAnimationFrame(() => { var _ref$current; const element = (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.querySelector('.dnb-button'); element === null || element === void 0 || element.focus(); }); if ((_ref$current2 = ref.current) !== null && _ref$current2 !== void 0 && _ref$current2.getAttribute('class').includes('__return--active')) { setKeepReturnActive(true); } }, []); const handleFocus = useCallback(e => { if (e.target.tagName === 'SPAN') { setFocus(); } }, [setFocus]); const handleKeyUp = useCallback(e => { if (e.key === 'Tab') { setFocus(); } }, [setFocus]); return _jsx("span", { className: classes, ref: ref, onFocus: handleFocus, id: returnId, children: _jsxs(_Fragment, { children: [!visible && _jsx("button", { className: "dnb-sr-only", onKeyUp: handleKeyUp, children: text || children }), _jsx(HeightAnimation, { open: visible, "aria-live": "polite", children: _jsx(Button, { wrap: true, variant: "secondary", onClick: handleClick, onBlur: handleBlur, ...props, children: text || children }) })] }) }); }; const SkipContentReturn = localProps => { const { selector, className, ...props } = localProps; const classes = clsx('dnb-skip-content__return', className); return _jsx(SkipContent, { selector: `${selector}--alias`, className: classes, ...props }); }; SkipContent.Return = SkipContentReturn; withComponentMarkers(SkipContent, { _supportsSpacingProps: true }); export default SkipContent; //# sourceMappingURL=SkipContent.js.map