UNPKG

@mui/material

Version:

Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.

247 lines (244 loc) 9.18 kB
"use strict"; 'use client'; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _reactIs = require("react-is"); var _propTypes = _interopRequireDefault(require("prop-types")); var _clsx = _interopRequireDefault(require("clsx")); var _integerPropType = _interopRequireDefault(require("@mui/utils/integerPropType")); var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses")); var _useSlotProps = _interopRequireDefault(require("@mui/utils/useSlotProps")); var _zeroStyled = require("../zero-styled"); var _DefaultPropsProvider = require("../DefaultPropsProvider"); var _Typography = _interopRequireDefault(require("../Typography")); var _BreadcrumbCollapsed = _interopRequireDefault(require("./BreadcrumbCollapsed")); var _breadcrumbsClasses = _interopRequireWildcard(require("./breadcrumbsClasses")); var _jsxRuntime = require("react/jsx-runtime"); const useUtilityClasses = ownerState => { const { classes } = ownerState; const slots = { root: ['root'], li: ['li'], ol: ['ol'], separator: ['separator'] }; return (0, _composeClasses.default)(slots, _breadcrumbsClasses.getBreadcrumbsUtilityClass, classes); }; const BreadcrumbsRoot = (0, _zeroStyled.styled)(_Typography.default, { name: 'MuiBreadcrumbs', slot: 'Root', overridesResolver: (props, styles) => { return [{ [`& .${_breadcrumbsClasses.default.li}`]: styles.li }, styles.root]; } })({}); const BreadcrumbsOl = (0, _zeroStyled.styled)('ol', { name: 'MuiBreadcrumbs', slot: 'Ol', overridesResolver: (props, styles) => styles.ol })({ display: 'flex', flexWrap: 'wrap', alignItems: 'center', padding: 0, margin: 0, listStyle: 'none' }); const BreadcrumbsSeparator = (0, _zeroStyled.styled)('li', { name: 'MuiBreadcrumbs', slot: 'Separator', overridesResolver: (props, styles) => styles.separator })({ display: 'flex', userSelect: 'none', marginLeft: 8, marginRight: 8 }); function insertSeparators(items, className, separator, ownerState) { return items.reduce((acc, current, index) => { if (index < items.length - 1) { acc = acc.concat(current, /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsSeparator, { "aria-hidden": true, className: className, ownerState: ownerState, children: separator }, `separator-${index}`)); } else { acc.push(current); } return acc; }, []); } const Breadcrumbs = /*#__PURE__*/React.forwardRef(function Breadcrumbs(inProps, ref) { const props = (0, _DefaultPropsProvider.useDefaultProps)({ props: inProps, name: 'MuiBreadcrumbs' }); const { children, className, component = 'nav', slots = {}, slotProps = {}, expandText = 'Show path', itemsAfterCollapse = 1, itemsBeforeCollapse = 1, maxItems = 8, separator = '/', ...other } = props; const [expanded, setExpanded] = React.useState(false); const ownerState = { ...props, component, expanded, expandText, itemsAfterCollapse, itemsBeforeCollapse, maxItems, separator }; const classes = useUtilityClasses(ownerState); const collapsedIconSlotProps = (0, _useSlotProps.default)({ elementType: slots.CollapsedIcon, externalSlotProps: slotProps.collapsedIcon, ownerState }); const listRef = React.useRef(null); const renderItemsBeforeAndAfter = allItems => { const handleClickExpand = () => { setExpanded(true); // The clicked element received the focus but gets removed from the DOM. // Let's keep the focus in the component after expanding. // Moving it to the <ol> or <nav> does not cause any announcement in NVDA. // By moving it to some link/button at least we have some announcement. const focusable = listRef.current.querySelector('a[href],button,[tabindex]'); if (focusable) { focusable.focus(); } }; // This defends against someone passing weird input, to ensure that if all // items would be shown anyway, we just show all items without the EllipsisItem if (itemsBeforeCollapse + itemsAfterCollapse >= allItems.length) { if (process.env.NODE_ENV !== 'production') { console.error(['MUI: You have provided an invalid combination of props to the Breadcrumbs.', `itemsAfterCollapse={${itemsAfterCollapse}} + itemsBeforeCollapse={${itemsBeforeCollapse}} >= maxItems={${maxItems}}`].join('\n')); } return allItems; } return [...allItems.slice(0, itemsBeforeCollapse), /*#__PURE__*/(0, _jsxRuntime.jsx)(_BreadcrumbCollapsed.default, { "aria-label": expandText, slots: { CollapsedIcon: slots.CollapsedIcon }, slotProps: { collapsedIcon: collapsedIconSlotProps }, onClick: handleClickExpand }, "ellipsis"), ...allItems.slice(allItems.length - itemsAfterCollapse, allItems.length)]; }; const allItems = React.Children.toArray(children).filter(child => { if (process.env.NODE_ENV !== 'production') { if ((0, _reactIs.isFragment)(child)) { console.error(["MUI: The Breadcrumbs component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n')); } } return /*#__PURE__*/React.isValidElement(child); }).map((child, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", { className: classes.li, children: child }, `child-${index}`)); return /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsRoot, { ref: ref, component: component, color: "textSecondary", className: (0, _clsx.default)(classes.root, className), ownerState: ownerState, ...other, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsOl, { className: classes.ol, ref: listRef, ownerState: ownerState, children: insertSeparators(expanded || maxItems && allItems.length <= maxItems ? allItems : renderItemsBeforeAndAfter(allItems), classes.separator, separator, ownerState) }) }); }); process.env.NODE_ENV !== "production" ? Breadcrumbs.propTypes /* remove-proptypes */ = { // ┌────────────────────────────── Warning ──────────────────────────────┐ // │ These PropTypes are generated from the TypeScript type definitions. │ // │ To update them, edit the d.ts file and run `pnpm proptypes`. │ // └─────────────────────────────────────────────────────────────────────┘ /** * The content of the component. */ children: _propTypes.default.node, /** * Override or extend the styles applied to the component. */ classes: _propTypes.default.object, /** * @ignore */ className: _propTypes.default.string, /** * The component used for the root node. * Either a string to use a HTML element or a component. */ component: _propTypes.default.elementType, /** * Override the default label for the expand button. * * For localization purposes, you can use the provided [translations](https://mui.com/material-ui/guides/localization/). * @default 'Show path' */ expandText: _propTypes.default.string, /** * If max items is exceeded, the number of items to show after the ellipsis. * @default 1 */ itemsAfterCollapse: _integerPropType.default, /** * If max items is exceeded, the number of items to show before the ellipsis. * @default 1 */ itemsBeforeCollapse: _integerPropType.default, /** * Specifies the maximum number of breadcrumbs to display. When there are more * than the maximum number, only the first `itemsBeforeCollapse` and last `itemsAfterCollapse` * will be shown, with an ellipsis in between. * @default 8 */ maxItems: _integerPropType.default, /** * Custom separator node. * @default '/' */ separator: _propTypes.default.node, /** * The props used for each slot inside the Breadcumb. * @default {} */ slotProps: _propTypes.default.shape({ collapsedIcon: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]) }), /** * The components used for each slot inside the Breadcumb. * Either a string to use a HTML element or a component. * @default {} */ slots: _propTypes.default.shape({ CollapsedIcon: _propTypes.default.elementType }), /** * The system prop that allows defining system overrides as well as additional CSS styles. */ sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]) } : void 0; var _default = exports.default = Breadcrumbs;