UNPKG

@lskjs/navbar

Version:
219 lines (183 loc) 8.94 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _uncontrollable = require("uncontrollable"); var _createWithBsPrefix = _interopRequireDefault(require("./createWithBsPrefix")); var _NavbarBrand = _interopRequireDefault(require("./NavbarBrand")); var _NavbarCollapse = _interopRequireDefault(require("./NavbarCollapse")); var _NavbarContext = _interopRequireDefault(require("./NavbarContext")); var _NavbarToggle = _interopRequireDefault(require("./NavbarToggle")); var _SelectableContext = _interopRequireDefault(require("./SelectableContext")); var _ThemeProvider = require("./ThemeProvider"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var propTypes = { /** @default 'navbar' */ bsPrefix: _propTypes["default"].string, /** * The general visual variant a the Navbar. * Use in combination with the `bg` prop, `background-color` utilities, * or your own background styles. * * @type {('light'|'dark')} */ variant: _propTypes["default"].string, /** * The breakpoint, below which, the Navbar will collapse. * When `true` the Navbar will always be expanded regardless of screen size. */ expand: _propTypes["default"].oneOf([true, 'sm', 'md', 'lg', 'xl']).isRequired, /** * A convenience prop for adding `bg-*` utility classes since they are so commonly used here. * `light` and `dark` are common choices but any `bg-*` class is supported, including any custom ones you might define. * * Pairs nicely with the `variant` prop. */ bg: _propTypes["default"].string, /** * Create a fixed navbar along the top or bottom of the screen, that scrolls with the * page. A convenience prop for the `fixed-*` positioning classes. */ fixed: _propTypes["default"].oneOf(['top', 'bottom']), /** * Position the navbar at the top or bottom of the viewport, * but only after scrolling past it. . A convenience prop for the `sticky-*` positioning classes. * * __Not supported in <= IE11 and other older browsers without a polyfill__ */ sticky: _propTypes["default"].oneOf(['top', 'bottom']), /** * Set a custom element for this component. */ as: _propTypes["default"].elementType, /** * A callback fired when the `<Navbar>` body collapses or expands. Fired when * a `<Navbar.Toggle>` is clicked and called with the new `expanded` * boolean value. * * @controllable expanded */ onToggle: _propTypes["default"].func, /** * A callback fired when a descendant of a child `<Nav>` is selected. Should * be used to execute complex closing or other miscellaneous actions desired * after selecting a descendant of `<Nav>`. Does nothing if no `<Nav>` or `<Nav>` * descendants exist. The callback is called with an eventKey, which is a * prop from the selected `<Nav>` descendant, and an event. * * ```js * function ( * eventKey: mixed, * event?: SyntheticEvent * ) * ``` * * For basic closing behavior after all `<Nav>` descendant onSelect events in * mobile viewports, try using collapseOnSelect. * * Note: If you are manually closing the navbar using this `OnSelect` prop, * ensure that you are setting `expanded` to false and not *toggling* between * true and false. */ onSelect: _propTypes["default"].func, /** * Toggles `expanded` to `false` after the onSelect event of a descendant of a * child `<Nav>` fires. Does nothing if no `<Nav>` or `<Nav>` descendants exist. * * Manually controlling `expanded` via the onSelect callback is recommended instead, * for more complex operations that need to be executed after * the `select` event of `<Nav>` descendants. */ collapseOnSelect: _propTypes["default"].bool, /** * Controls the visiblity of the navbar body * * @controllable onToggle */ expanded: _propTypes["default"].bool, /** * The ARIA role for the navbar, will default to 'navigation' for * Navbars whose `as` is something other than `<nav>`. * * @default 'navigation' */ role: _propTypes["default"].string }; var defaultProps = { expand: true, variant: 'light', collapseOnSelect: false }; var Navbar = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) { var _useUncontrolled = (0, _uncontrollable.useUncontrolled)(props, { expanded: 'onToggle' }), bsPrefix = _useUncontrolled.bsPrefix, expand = _useUncontrolled.expand, variant = _useUncontrolled.variant, bg = _useUncontrolled.bg, fixed = _useUncontrolled.fixed, sticky = _useUncontrolled.sticky, className = _useUncontrolled.className, children = _useUncontrolled.children, _useUncontrolled$as = _useUncontrolled.as, Component = _useUncontrolled$as === void 0 ? 'nav' : _useUncontrolled$as, expanded = _useUncontrolled.expanded, _onToggle = _useUncontrolled.onToggle, onSelect = _useUncontrolled.onSelect, collapseOnSelect = _useUncontrolled.collapseOnSelect, controlledProps = (0, _objectWithoutProperties2["default"])(_useUncontrolled, ["bsPrefix", "expand", "variant", "bg", "fixed", "sticky", "className", "children", "as", "expanded", "onToggle", "onSelect", "collapseOnSelect"]); bsPrefix = (0, _ThemeProvider.useBootstrapPrefix)(bsPrefix, 'navbar'); var handleCollapse = (0, _react.useCallback)(function () { if (onSelect) onSelect.apply(void 0, arguments); if (collapseOnSelect && expanded) { _onToggle(false); } }, [onSelect, collapseOnSelect, expanded, _onToggle]); // will result in some false positives but that seems better // than false negatives. strict `undefined` check allows explicit // "nulling" of the role if the user really doesn't want one if (controlledProps.role === undefined && Component !== 'nav') { controlledProps.role = 'navigation'; } var expandClass = "".concat(bsPrefix, "-expand"); if (typeof expand === 'string') expandClass = "".concat(expandClass, "-").concat(expand); var navbarContext = (0, _react.useMemo)(function () { return { onToggle: function onToggle() { return _onToggle(!expanded); }, bsPrefix: bsPrefix, expanded: expanded }; }, [bsPrefix, expanded, _onToggle]); return /*#__PURE__*/_react["default"].createElement(_NavbarContext["default"].Provider, { value: navbarContext }, /*#__PURE__*/_react["default"].createElement(_SelectableContext["default"].Provider, { value: handleCollapse }, /*#__PURE__*/_react["default"].createElement(Component, (0, _extends2["default"])({ ref: ref }, controlledProps, { className: (0, _classnames["default"])(className, bsPrefix, expand && expandClass, variant && "".concat(bsPrefix, "-").concat(variant), bg && "bg-".concat(bg), sticky && "sticky-".concat(sticky), fixed && "fixed-".concat(fixed)) }), children))); }); Navbar.propTypes = propTypes; Navbar.defaultProps = defaultProps; Navbar.displayName = 'Navbar'; Navbar.Brand = _NavbarBrand["default"]; Navbar.Toggle = _NavbarToggle["default"]; Navbar.Collapse = _NavbarCollapse["default"]; Navbar.Text = (0, _createWithBsPrefix["default"])('navbar-text', { Component: 'span' }); var _default = Navbar; exports["default"] = _default; //# sourceMappingURL=Navbar.js.map