UNPKG

8.3 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 _propTypes = _interopRequireDefault(require("prop-types"));
12var _reactIs = require("react-is");
13var _clsx = _interopRequireDefault(require("clsx"));
14var _chainPropTypes = _interopRequireDefault(require("@mui/utils/chainPropTypes"));
15var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
16var _zeroStyled = require("../zero-styled");
17var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
18var _DefaultPropsProvider = require("../DefaultPropsProvider");
19var _Avatar = _interopRequireWildcard(require("../Avatar"));
20var _avatarGroupClasses = _interopRequireWildcard(require("./avatarGroupClasses"));
21var _useSlot = _interopRequireDefault(require("../utils/useSlot"));
22var _jsxRuntime = require("react/jsx-runtime");
23const SPACINGS = {
24 small: -16,
25 medium: -8
26};
27const useUtilityClasses = ownerState => {
28 const {
29 classes
30 } = ownerState;
31 const slots = {
32 root: ['root'],
33 avatar: ['avatar']
34 };
35 return (0, _composeClasses.default)(slots, _avatarGroupClasses.getAvatarGroupUtilityClass, classes);
36};
37const AvatarGroupRoot = (0, _zeroStyled.styled)('div', {
38 name: 'MuiAvatarGroup',
39 slot: 'Root',
40 overridesResolver: (props, styles) => ({
41 [`& .${_avatarGroupClasses.default.avatar}`]: styles.avatar,
42 ...styles.root
43 })
44})((0, _memoTheme.default)(({
45 theme
46}) => ({
47 display: 'flex',
48 flexDirection: 'row-reverse',
49 [`& .${_Avatar.avatarClasses.root}`]: {
50 border: `2px solid ${(theme.vars || theme).palette.background.default}`,
51 boxSizing: 'content-box',
52 marginLeft: 'var(--AvatarGroup-spacing, -8px)',
53 '&:last-child': {
54 marginLeft: 0
55 }
56 }
57})));
58const AvatarGroup = /*#__PURE__*/React.forwardRef(function AvatarGroup(inProps, ref) {
59 const props = (0, _DefaultPropsProvider.useDefaultProps)({
60 props: inProps,
61 name: 'MuiAvatarGroup'
62 });
63 const {
64 children: childrenProp,
65 className,
66 component = 'div',
67 componentsProps,
68 max = 5,
69 renderSurplus,
70 slotProps = {},
71 slots = {},
72 spacing = 'medium',
73 total,
74 variant = 'circular',
75 ...other
76 } = props;
77 let clampedMax = max < 2 ? 2 : max;
78 const ownerState = {
79 ...props,
80 max,
81 spacing,
82 component,
83 variant
84 };
85 const classes = useUtilityClasses(ownerState);
86 const children = React.Children.toArray(childrenProp).filter(child => {
87 if (process.env.NODE_ENV !== 'production') {
88 if ((0, _reactIs.isFragment)(child)) {
89 console.error(["MUI: The AvatarGroup component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
90 }
91 }
92 return /*#__PURE__*/React.isValidElement(child);
93 });
94 const totalAvatars = total || children.length;
95 if (totalAvatars === clampedMax) {
96 clampedMax += 1;
97 }
98 clampedMax = Math.min(totalAvatars + 1, clampedMax);
99 const maxAvatars = Math.min(children.length, clampedMax - 1);
100 const extraAvatars = Math.max(totalAvatars - clampedMax, totalAvatars - maxAvatars, 0);
101 const extraAvatarsElement = renderSurplus ? renderSurplus(extraAvatars) : `+${extraAvatars}`;
102 const marginValue = ownerState.spacing && SPACINGS[ownerState.spacing] !== undefined ? SPACINGS[ownerState.spacing] : -ownerState.spacing || -8;
103 const externalForwardedProps = {
104 slots,
105 slotProps: {
106 surplus: slotProps.additionalAvatar ?? componentsProps?.additionalAvatar,
107 ...componentsProps,
108 ...slotProps
109 }
110 };
111 const [SurplusSlot, surplusProps] = (0, _useSlot.default)('surplus', {
112 elementType: _Avatar.default,
113 externalForwardedProps,
114 className: classes.avatar,
115 ownerState,
116 additionalProps: {
117 variant
118 }
119 });
120 return /*#__PURE__*/(0, _jsxRuntime.jsxs)(AvatarGroupRoot, {
121 as: component,
122 ownerState: ownerState,
123 className: (0, _clsx.default)(classes.root, className),
124 ref: ref,
125 ...other,
126 style: {
127 '--AvatarGroup-spacing': marginValue ? `${marginValue}px` : undefined,
128 ...other.style
129 },
130 children: [extraAvatars ? /*#__PURE__*/(0, _jsxRuntime.jsx)(SurplusSlot, {
131 ...surplusProps,
132 children: extraAvatarsElement
133 }) : null, children.slice(0, maxAvatars).reverse().map(child => {
134 return /*#__PURE__*/React.cloneElement(child, {
135 className: (0, _clsx.default)(child.props.className, classes.avatar),
136 variant: child.props.variant || variant
137 });
138 })]
139 });
140});
141process.env.NODE_ENV !== "production" ? AvatarGroup.propTypes /* remove-proptypes */ = {
142 // ┌────────────────────────────── Warning ──────────────────────────────┐
143 // │ These PropTypes are generated from the TypeScript type definitions. │
144 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
145 // └─────────────────────────────────────────────────────────────────────┘
146 /**
147 * The avatars to stack.
148 */
149 children: _propTypes.default.node,
150 /**
151 * Override or extend the styles applied to the component.
152 */
153 classes: _propTypes.default.object,
154 /**
155 * @ignore
156 */
157 className: _propTypes.default.string,
158 /**
159 * The component used for the root node.
160 * Either a string to use a HTML element or a component.
161 */
162 component: _propTypes.default.elementType,
163 /**
164 * The extra props for the slot components.
165 * You can override the existing props or add new ones.
166 *
167 * This prop is an alias for the `slotProps` prop.
168 *
169 * @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.
170 */
171 componentsProps: _propTypes.default.shape({
172 additionalAvatar: _propTypes.default.object
173 }),
174 /**
175 * Max avatars to show before +x.
176 * @default 5
177 */
178 max: (0, _chainPropTypes.default)(_propTypes.default.number, props => {
179 if (props.max < 2) {
180 return new Error(['MUI: The prop `max` should be equal to 2 or above.', 'A value below is clamped to 2.'].join('\n'));
181 }
182 return null;
183 }),
184 /**
185 * custom renderer of extraAvatars
186 * @param {number} surplus number of extra avatars
187 * @returns {React.ReactNode} custom element to display
188 */
189 renderSurplus: _propTypes.default.func,
190 /**
191 * The props used for each slot inside.
192 * @default {}
193 */
194 slotProps: _propTypes.default.shape({
195 additionalAvatar: _propTypes.default.object,
196 surplus: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])
197 }),
198 /**
199 * The components used for each slot inside.
200 * @default {}
201 */
202 slots: _propTypes.default.shape({
203 surplus: _propTypes.default.elementType
204 }),
205 /**
206 * Spacing between avatars.
207 * @default 'medium'
208 */
209 spacing: _propTypes.default.oneOfType([_propTypes.default.oneOf(['medium', 'small']), _propTypes.default.number]),
210 /**
211 * @ignore
212 */
213 style: _propTypes.default.object,
214 /**
215 * The system prop that allows defining system overrides as well as additional CSS styles.
216 */
217 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]),
218 /**
219 * The total number of avatars. Used for calculating the number of extra avatars.
220 * @default children.length
221 */
222 total: _propTypes.default.number,
223 /**
224 * The variant to use.
225 * @default 'circular'
226 */
227 variant: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.oneOf(['circular', 'rounded', 'square']), _propTypes.default.string])
228} : void 0;
229var _default = exports.default = AvatarGroup;
\No newline at end of file