@lskjs/navbar
Version:
LSK ux subrepo: navbar
219 lines (183 loc) • 8.94 kB
JavaScript
"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