UNPKG

9.18 kBJavaScriptView Raw
1"use strict";
2'use client';
3
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
6Object.defineProperty(exports, "__esModule", {
7 value: true
8});
9exports.default = void 0;
10var React = _interopRequireWildcard(require("react"));
11var _reactIs = require("react-is");
12var _propTypes = _interopRequireDefault(require("prop-types"));
13var _clsx = _interopRequireDefault(require("clsx"));
14var _integerPropType = _interopRequireDefault(require("@mui/utils/integerPropType"));
15var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
16var _useSlotProps = _interopRequireDefault(require("@mui/utils/useSlotProps"));
17var _zeroStyled = require("../zero-styled");
18var _DefaultPropsProvider = require("../DefaultPropsProvider");
19var _Typography = _interopRequireDefault(require("../Typography"));
20var _BreadcrumbCollapsed = _interopRequireDefault(require("./BreadcrumbCollapsed"));
21var _breadcrumbsClasses = _interopRequireWildcard(require("./breadcrumbsClasses"));
22var _jsxRuntime = require("react/jsx-runtime");
23const useUtilityClasses = ownerState => {
24 const {
25 classes
26 } = ownerState;
27 const slots = {
28 root: ['root'],
29 li: ['li'],
30 ol: ['ol'],
31 separator: ['separator']
32 };
33 return (0, _composeClasses.default)(slots, _breadcrumbsClasses.getBreadcrumbsUtilityClass, classes);
34};
35const BreadcrumbsRoot = (0, _zeroStyled.styled)(_Typography.default, {
36 name: 'MuiBreadcrumbs',
37 slot: 'Root',
38 overridesResolver: (props, styles) => {
39 return [{
40 [`& .${_breadcrumbsClasses.default.li}`]: styles.li
41 }, styles.root];
42 }
43})({});
44const BreadcrumbsOl = (0, _zeroStyled.styled)('ol', {
45 name: 'MuiBreadcrumbs',
46 slot: 'Ol',
47 overridesResolver: (props, styles) => styles.ol
48})({
49 display: 'flex',
50 flexWrap: 'wrap',
51 alignItems: 'center',
52 padding: 0,
53 margin: 0,
54 listStyle: 'none'
55});
56const BreadcrumbsSeparator = (0, _zeroStyled.styled)('li', {
57 name: 'MuiBreadcrumbs',
58 slot: 'Separator',
59 overridesResolver: (props, styles) => styles.separator
60})({
61 display: 'flex',
62 userSelect: 'none',
63 marginLeft: 8,
64 marginRight: 8
65});
66function insertSeparators(items, className, separator, ownerState) {
67 return items.reduce((acc, current, index) => {
68 if (index < items.length - 1) {
69 acc = acc.concat(current, /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsSeparator, {
70 "aria-hidden": true,
71 className: className,
72 ownerState: ownerState,
73 children: separator
74 }, `separator-${index}`));
75 } else {
76 acc.push(current);
77 }
78 return acc;
79 }, []);
80}
81const Breadcrumbs = /*#__PURE__*/React.forwardRef(function Breadcrumbs(inProps, ref) {
82 const props = (0, _DefaultPropsProvider.useDefaultProps)({
83 props: inProps,
84 name: 'MuiBreadcrumbs'
85 });
86 const {
87 children,
88 className,
89 component = 'nav',
90 slots = {},
91 slotProps = {},
92 expandText = 'Show path',
93 itemsAfterCollapse = 1,
94 itemsBeforeCollapse = 1,
95 maxItems = 8,
96 separator = '/',
97 ...other
98 } = props;
99 const [expanded, setExpanded] = React.useState(false);
100 const ownerState = {
101 ...props,
102 component,
103 expanded,
104 expandText,
105 itemsAfterCollapse,
106 itemsBeforeCollapse,
107 maxItems,
108 separator
109 };
110 const classes = useUtilityClasses(ownerState);
111 const collapsedIconSlotProps = (0, _useSlotProps.default)({
112 elementType: slots.CollapsedIcon,
113 externalSlotProps: slotProps.collapsedIcon,
114 ownerState
115 });
116 const listRef = React.useRef(null);
117 const renderItemsBeforeAndAfter = allItems => {
118 const handleClickExpand = () => {
119 setExpanded(true);
120
121 // The clicked element received the focus but gets removed from the DOM.
122 // Let's keep the focus in the component after expanding.
123 // Moving it to the <ol> or <nav> does not cause any announcement in NVDA.
124 // By moving it to some link/button at least we have some announcement.
125 const focusable = listRef.current.querySelector('a[href],button,[tabindex]');
126 if (focusable) {
127 focusable.focus();
128 }
129 };
130
131 // This defends against someone passing weird input, to ensure that if all
132 // items would be shown anyway, we just show all items without the EllipsisItem
133 if (itemsBeforeCollapse + itemsAfterCollapse >= allItems.length) {
134 if (process.env.NODE_ENV !== 'production') {
135 console.error(['MUI: You have provided an invalid combination of props to the Breadcrumbs.', `itemsAfterCollapse={${itemsAfterCollapse}} + itemsBeforeCollapse={${itemsBeforeCollapse}} >= maxItems={${maxItems}}`].join('\n'));
136 }
137 return allItems;
138 }
139 return [...allItems.slice(0, itemsBeforeCollapse), /*#__PURE__*/(0, _jsxRuntime.jsx)(_BreadcrumbCollapsed.default, {
140 "aria-label": expandText,
141 slots: {
142 CollapsedIcon: slots.CollapsedIcon
143 },
144 slotProps: {
145 collapsedIcon: collapsedIconSlotProps
146 },
147 onClick: handleClickExpand
148 }, "ellipsis"), ...allItems.slice(allItems.length - itemsAfterCollapse, allItems.length)];
149 };
150 const allItems = React.Children.toArray(children).filter(child => {
151 if (process.env.NODE_ENV !== 'production') {
152 if ((0, _reactIs.isFragment)(child)) {
153 console.error(["MUI: The Breadcrumbs component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
154 }
155 }
156 return /*#__PURE__*/React.isValidElement(child);
157 }).map((child, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
158 className: classes.li,
159 children: child
160 }, `child-${index}`));
161 return /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsRoot, {
162 ref: ref,
163 component: component,
164 color: "textSecondary",
165 className: (0, _clsx.default)(classes.root, className),
166 ownerState: ownerState,
167 ...other,
168 children: /*#__PURE__*/(0, _jsxRuntime.jsx)(BreadcrumbsOl, {
169 className: classes.ol,
170 ref: listRef,
171 ownerState: ownerState,
172 children: insertSeparators(expanded || maxItems && allItems.length <= maxItems ? allItems : renderItemsBeforeAndAfter(allItems), classes.separator, separator, ownerState)
173 })
174 });
175});
176process.env.NODE_ENV !== "production" ? Breadcrumbs.propTypes /* remove-proptypes */ = {
177 // ┌────────────────────────────── Warning ──────────────────────────────┐
178 // │ These PropTypes are generated from the TypeScript type definitions. │
179 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
180 // └─────────────────────────────────────────────────────────────────────┘
181 /**
182 * The content of the component.
183 */
184 children: _propTypes.default.node,
185 /**
186 * Override or extend the styles applied to the component.
187 */
188 classes: _propTypes.default.object,
189 /**
190 * @ignore
191 */
192 className: _propTypes.default.string,
193 /**
194 * The component used for the root node.
195 * Either a string to use a HTML element or a component.
196 */
197 component: _propTypes.default.elementType,
198 /**
199 * Override the default label for the expand button.
200 *
201 * For localization purposes, you can use the provided [translations](https://mui.com/material-ui/guides/localization/).
202 * @default 'Show path'
203 */
204 expandText: _propTypes.default.string,
205 /**
206 * If max items is exceeded, the number of items to show after the ellipsis.
207 * @default 1
208 */
209 itemsAfterCollapse: _integerPropType.default,
210 /**
211 * If max items is exceeded, the number of items to show before the ellipsis.
212 * @default 1
213 */
214 itemsBeforeCollapse: _integerPropType.default,
215 /**
216 * Specifies the maximum number of breadcrumbs to display. When there are more
217 * than the maximum number, only the first `itemsBeforeCollapse` and last `itemsAfterCollapse`
218 * will be shown, with an ellipsis in between.
219 * @default 8
220 */
221 maxItems: _integerPropType.default,
222 /**
223 * Custom separator node.
224 * @default '/'
225 */
226 separator: _propTypes.default.node,
227 /**
228 * The props used for each slot inside the Breadcumb.
229 * @default {}
230 */
231 slotProps: _propTypes.default.shape({
232 collapsedIcon: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])
233 }),
234 /**
235 * The components used for each slot inside the Breadcumb.
236 * Either a string to use a HTML element or a component.
237 * @default {}
238 */
239 slots: _propTypes.default.shape({
240 CollapsedIcon: _propTypes.default.elementType
241 }),
242 /**
243 * The system prop that allows defining system overrides as well as additional CSS styles.
244 */
245 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])
246} : void 0;
247var _default = exports.default = Breadcrumbs;
\No newline at end of file