UNPKG

13.9 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.overridesResolver = exports.default = exports.ListItemRoot = void 0;
10var React = _interopRequireWildcard(require("react"));
11var _propTypes = _interopRequireDefault(require("prop-types"));
12var _clsx = _interopRequireDefault(require("clsx"));
13var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
14var _elementTypeAcceptingRef = _interopRequireDefault(require("@mui/utils/elementTypeAcceptingRef"));
15var _chainPropTypes = _interopRequireDefault(require("@mui/utils/chainPropTypes"));
16var _isHostComponent = _interopRequireDefault(require("../utils/isHostComponent"));
17var _zeroStyled = require("../zero-styled");
18var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
19var _DefaultPropsProvider = require("../DefaultPropsProvider");
20var _isMuiElement = _interopRequireDefault(require("../utils/isMuiElement"));
21var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
22var _ListContext = _interopRequireDefault(require("../List/ListContext"));
23var _listItemClasses = require("./listItemClasses");
24var _ListItemButton = require("../ListItemButton");
25var _ListItemSecondaryAction = _interopRequireDefault(require("../ListItemSecondaryAction"));
26var _jsxRuntime = require("react/jsx-runtime");
27const overridesResolver = (props, styles) => {
28 const {
29 ownerState
30 } = props;
31 return [styles.root, ownerState.dense && styles.dense, ownerState.alignItems === 'flex-start' && styles.alignItemsFlexStart, ownerState.divider && styles.divider, !ownerState.disableGutters && styles.gutters, !ownerState.disablePadding && styles.padding, ownerState.hasSecondaryAction && styles.secondaryAction];
32};
33exports.overridesResolver = overridesResolver;
34const useUtilityClasses = ownerState => {
35 const {
36 alignItems,
37 classes,
38 dense,
39 disableGutters,
40 disablePadding,
41 divider,
42 hasSecondaryAction
43 } = ownerState;
44 const slots = {
45 root: ['root', dense && 'dense', !disableGutters && 'gutters', !disablePadding && 'padding', divider && 'divider', alignItems === 'flex-start' && 'alignItemsFlexStart', hasSecondaryAction && 'secondaryAction'],
46 container: ['container']
47 };
48 return (0, _composeClasses.default)(slots, _listItemClasses.getListItemUtilityClass, classes);
49};
50const ListItemRoot = exports.ListItemRoot = (0, _zeroStyled.styled)('div', {
51 name: 'MuiListItem',
52 slot: 'Root',
53 overridesResolver
54})((0, _memoTheme.default)(({
55 theme
56}) => ({
57 display: 'flex',
58 justifyContent: 'flex-start',
59 alignItems: 'center',
60 position: 'relative',
61 textDecoration: 'none',
62 width: '100%',
63 boxSizing: 'border-box',
64 textAlign: 'left',
65 variants: [{
66 props: ({
67 ownerState
68 }) => !ownerState.disablePadding,
69 style: {
70 paddingTop: 8,
71 paddingBottom: 8
72 }
73 }, {
74 props: ({
75 ownerState
76 }) => !ownerState.disablePadding && ownerState.dense,
77 style: {
78 paddingTop: 4,
79 paddingBottom: 4
80 }
81 }, {
82 props: ({
83 ownerState
84 }) => !ownerState.disablePadding && !ownerState.disableGutters,
85 style: {
86 paddingLeft: 16,
87 paddingRight: 16
88 }
89 }, {
90 props: ({
91 ownerState
92 }) => !ownerState.disablePadding && !!ownerState.secondaryAction,
93 style: {
94 // Add some space to avoid collision as `ListItemSecondaryAction`
95 // is absolutely positioned.
96 paddingRight: 48
97 }
98 }, {
99 props: ({
100 ownerState
101 }) => !!ownerState.secondaryAction,
102 style: {
103 [`& > .${_ListItemButton.listItemButtonClasses.root}`]: {
104 paddingRight: 48
105 }
106 }
107 }, {
108 props: {
109 alignItems: 'flex-start'
110 },
111 style: {
112 alignItems: 'flex-start'
113 }
114 }, {
115 props: ({
116 ownerState
117 }) => ownerState.divider,
118 style: {
119 borderBottom: `1px solid ${(theme.vars || theme).palette.divider}`,
120 backgroundClip: 'padding-box'
121 }
122 }, {
123 props: ({
124 ownerState
125 }) => ownerState.button,
126 style: {
127 transition: theme.transitions.create('background-color', {
128 duration: theme.transitions.duration.shortest
129 }),
130 '&:hover': {
131 textDecoration: 'none',
132 backgroundColor: (theme.vars || theme).palette.action.hover,
133 // Reset on touch devices, it doesn't add specificity
134 '@media (hover: none)': {
135 backgroundColor: 'transparent'
136 }
137 }
138 }
139 }, {
140 props: ({
141 ownerState
142 }) => ownerState.hasSecondaryAction,
143 style: {
144 // Add some space to avoid collision as `ListItemSecondaryAction`
145 // is absolutely positioned.
146 paddingRight: 48
147 }
148 }]
149})));
150const ListItemContainer = (0, _zeroStyled.styled)('li', {
151 name: 'MuiListItem',
152 slot: 'Container',
153 overridesResolver: (props, styles) => styles.container
154})({
155 position: 'relative'
156});
157
158/**
159 * Uses an additional container component if `ListItemSecondaryAction` is the last child.
160 */
161const ListItem = /*#__PURE__*/React.forwardRef(function ListItem(inProps, ref) {
162 const props = (0, _DefaultPropsProvider.useDefaultProps)({
163 props: inProps,
164 name: 'MuiListItem'
165 });
166 const {
167 alignItems = 'center',
168 children: childrenProp,
169 className,
170 component: componentProp,
171 components = {},
172 componentsProps = {},
173 ContainerComponent = 'li',
174 ContainerProps: {
175 className: ContainerClassName,
176 ...ContainerProps
177 } = {},
178 dense = false,
179 disableGutters = false,
180 disablePadding = false,
181 divider = false,
182 secondaryAction,
183 slotProps = {},
184 slots = {},
185 ...other
186 } = props;
187 const context = React.useContext(_ListContext.default);
188 const childContext = React.useMemo(() => ({
189 dense: dense || context.dense || false,
190 alignItems,
191 disableGutters
192 }), [alignItems, context.dense, dense, disableGutters]);
193 const listItemRef = React.useRef(null);
194 const children = React.Children.toArray(childrenProp);
195
196 // v4 implementation, deprecated in v6, will be removed in v7
197 const hasSecondaryAction = children.length && (0, _isMuiElement.default)(children[children.length - 1], ['ListItemSecondaryAction']);
198 const ownerState = {
199 ...props,
200 alignItems,
201 dense: childContext.dense,
202 disableGutters,
203 disablePadding,
204 divider,
205 hasSecondaryAction
206 };
207 const classes = useUtilityClasses(ownerState);
208 const handleRef = (0, _useForkRef.default)(listItemRef, ref);
209 const Root = slots.root || components.Root || ListItemRoot;
210 const rootProps = slotProps.root || componentsProps.root || {};
211 const componentProps = {
212 className: (0, _clsx.default)(classes.root, rootProps.className, className),
213 ...other
214 };
215 let Component = componentProp || 'li';
216
217 // v4 implementation, deprecated in v6, will be removed in v7
218 if (hasSecondaryAction) {
219 // Use div by default.
220 Component = !componentProps.component && !componentProp ? 'div' : Component;
221
222 // Avoid nesting of li > li.
223 if (ContainerComponent === 'li') {
224 if (Component === 'li') {
225 Component = 'div';
226 } else if (componentProps.component === 'li') {
227 componentProps.component = 'div';
228 }
229 }
230 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListContext.default.Provider, {
231 value: childContext,
232 children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(ListItemContainer, {
233 as: ContainerComponent,
234 className: (0, _clsx.default)(classes.container, ContainerClassName),
235 ref: handleRef,
236 ownerState: ownerState,
237 ...ContainerProps,
238 children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Root, {
239 ...rootProps,
240 ...(!(0, _isHostComponent.default)(Root) && {
241 as: Component,
242 ownerState: {
243 ...ownerState,
244 ...rootProps.ownerState
245 }
246 }),
247 ...componentProps,
248 children: children
249 }), children.pop()]
250 })
251 });
252 }
253 return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListContext.default.Provider, {
254 value: childContext,
255 children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(Root, {
256 ...rootProps,
257 as: Component,
258 ref: handleRef,
259 ...(!(0, _isHostComponent.default)(Root) && {
260 ownerState: {
261 ...ownerState,
262 ...rootProps.ownerState
263 }
264 }),
265 ...componentProps,
266 children: [children, secondaryAction && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemSecondaryAction.default, {
267 children: secondaryAction
268 })]
269 })
270 });
271});
272process.env.NODE_ENV !== "production" ? ListItem.propTypes /* remove-proptypes */ = {
273 // ┌────────────────────────────── Warning ──────────────────────────────┐
274 // │ These PropTypes are generated from the TypeScript type definitions. │
275 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
276 // └─────────────────────────────────────────────────────────────────────┘
277 /**
278 * Defines the `align-items` style property.
279 * @default 'center'
280 */
281 alignItems: _propTypes.default.oneOf(['center', 'flex-start']),
282 /**
283 * The content of the component if a `ListItemSecondaryAction` is used it must
284 * be the last child.
285 */
286 children: (0, _chainPropTypes.default)(_propTypes.default.node, props => {
287 const children = React.Children.toArray(props.children);
288
289 // React.Children.toArray(props.children).findLastIndex(isListItemSecondaryAction)
290 let secondaryActionIndex = -1;
291 for (let i = children.length - 1; i >= 0; i -= 1) {
292 const child = children[i];
293 if ((0, _isMuiElement.default)(child, ['ListItemSecondaryAction'])) {
294 secondaryActionIndex = i;
295 break;
296 }
297 }
298
299 // is ListItemSecondaryAction the last child of ListItem
300 if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {
301 return new Error('MUI: You used an element after ListItemSecondaryAction. ' + 'For ListItem to detect that it has a secondary action ' + 'you must pass it as the last child to ListItem.');
302 }
303 return null;
304 }),
305 /**
306 * Override or extend the styles applied to the component.
307 */
308 classes: _propTypes.default.object,
309 /**
310 * @ignore
311 */
312 className: _propTypes.default.string,
313 /**
314 * The component used for the root node.
315 * Either a string to use a HTML element or a component.
316 */
317 component: _propTypes.default.elementType,
318 /**
319 * The components used for each slot inside.
320 *
321 * @deprecated Use the `slots` prop instead. This prop will be removed in v7. See [Migrating from deprecated APIs](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/) for more details.
322 * @default {}
323 */
324 components: _propTypes.default.shape({
325 Root: _propTypes.default.elementType
326 }),
327 /**
328 * The extra props for the slot components.
329 * You can override the existing props or add new ones.
330 *
331 * @deprecated Use the `slotProps` prop instead. This prop will be removed in v7. See [Migrating from deprecated APIs](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/) for more details.
332 * @default {}
333 */
334 componentsProps: _propTypes.default.shape({
335 root: _propTypes.default.object
336 }),
337 /**
338 * The container component used when a `ListItemSecondaryAction` is the last child.
339 * @default 'li'
340 * @deprecated Use the `component` or `slots.root` prop instead. This prop will be removed in v7. See [Migrating from deprecated APIs](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/) for more details.
341 */
342 ContainerComponent: _elementTypeAcceptingRef.default,
343 /**
344 * Props applied to the container component if used.
345 * @default {}
346 * @deprecated Use the `slotProps.root` prop instead. This prop will be removed in v7. See [Migrating from deprecated APIs](https://mui.com/material-ui/migration/migrating-from-deprecated-apis/) for more details.
347 */
348 ContainerProps: _propTypes.default.object,
349 /**
350 * If `true`, compact vertical padding designed for keyboard and mouse input is used.
351 * The prop defaults to the value inherited from the parent List component.
352 * @default false
353 */
354 dense: _propTypes.default.bool,
355 /**
356 * If `true`, the left and right padding is removed.
357 * @default false
358 */
359 disableGutters: _propTypes.default.bool,
360 /**
361 * If `true`, all padding is removed.
362 * @default false
363 */
364 disablePadding: _propTypes.default.bool,
365 /**
366 * If `true`, a 1px light border is added to the bottom of the list item.
367 * @default false
368 */
369 divider: _propTypes.default.bool,
370 /**
371 * The element to display at the end of ListItem.
372 */
373 secondaryAction: _propTypes.default.node,
374 /**
375 * The extra props for the slot components.
376 * You can override the existing props or add new ones.
377 *
378 * @default {}
379 */
380 slotProps: _propTypes.default.shape({
381 root: _propTypes.default.object
382 }),
383 /**
384 * The components used for each slot inside.
385 *
386 * @default {}
387 */
388 slots: _propTypes.default.shape({
389 root: _propTypes.default.elementType
390 }),
391 /**
392 * The system prop that allows defining system overrides as well as additional CSS styles.
393 */
394 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])
395} : void 0;
396var _default = exports.default = ListItem;
\No newline at end of file