UNPKG

vcc-ui

Version:

A React library for building user interfaces at Volvo Cars

122 lines (120 loc) 4.02 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useKeyboardNavigation = exports.Nav = exports.KeyboardNavigationProvider = void 0; var _reactAria = require("@volvo-cars/react-aria"); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _useTheme = require("../../styling/use-theme"); var _block = require("../block"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } const { useKeyboardNavigation, KeyboardNavigationProvider } = (0, _reactAria.createKeyboardNavigation)(); exports.KeyboardNavigationProvider = KeyboardNavigationProvider; exports.useKeyboardNavigation = useKeyboardNavigation; const hideOnScrollOffsetTop = 80; const navStyle = _ref => { let { theme, sticky, hideOnScroll, isVisible } = _ref; return { position: 'relative', zIndex: 10, width: '100%', background: theme.color.background.primary, boxSizing: 'border-box', ':before': { content: "''", display: 'block', background: theme.color.ornament.divider, height: 1, outline: 'none', position: 'absolute', left: 0, right: 0, zIndex: -1, bottom: 0 }, extend: [{ condition: sticky, style: { position: 'fixed', top: 0, left: 0 } }, { condition: hideOnScroll, style: { transition: 'transform 200ms ease-out' } }, { condition: !isVisible, style: { transform: 'translateY(-100%)' } }] }; }; // using an external variable for performance reasons let previousScrollY = 0; /** * @deprecated Use `<nav>` element instead. */ const Nav = exports.Nav = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) => { let { hideOnScroll = false, sticky = false, children } = _ref2; const [isVisible, setVisible] = (0, _react.useState)(true); const theme = (0, _useTheme.useTheme)(); (0, _react.useEffect)(() => { const toggleVisibility = () => { if (window.scrollY > previousScrollY) { if (isVisible && window.scrollY > hideOnScrollOffsetTop) { setVisible(false); } } else { if (!isVisible) { setVisible(true); } } previousScrollY = window.scrollY; }; if (hideOnScroll) { window.addEventListener('scroll', toggleVisibility); } return () => { window.removeEventListener('scroll', toggleVisibility); }; }, [hideOnScroll, isVisible]); const styleProps = { sticky, hideOnScroll, isVisible, theme }; return /*#__PURE__*/_react.default.createElement(_block.Block, { as: "nav", ref: ref, extend: navStyle(styleProps) }, /*#__PURE__*/_react.default.createElement(KeyboardNavigationProvider, null, children)); }); Nav.displayName = 'Nav'; Nav.propTypes = { /** Automatically hide the sticky navigation if the user starts scrolling */ hideOnScroll: _propTypes.default.bool, /** Make the navigation stick to the top of the viewport */ sticky: _propTypes.default.bool, /** A JSX node */ // @ts-ignore children: _propTypes.default.node };