UNPKG

17.5 kBJavaScriptView Raw
1'use client';
2
3import _extends from "@babel/runtime/helpers/esm/extends";
4import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
5import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
6import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
7import * as React from 'react';
8import PropTypes from 'prop-types';
9import clsx from 'clsx';
10import usePreviousProps from '@mui/utils/usePreviousProps';
11import composeClasses from '@mui/utils/composeClasses';
12import { useBadge } from '@mui/base/useBadge';
13import { useSlotProps } from '@mui/base/utils';
14import { styled } from '../zero-styled';
15import { useDefaultProps } from '../DefaultPropsProvider';
16import capitalize from '../utils/capitalize';
17import badgeClasses, { getBadgeUtilityClass } from './badgeClasses';
18import { jsx as _jsx } from "react/jsx-runtime";
19import { jsxs as _jsxs } from "react/jsx-runtime";
20var RADIUS_STANDARD = 10;
21var RADIUS_DOT = 4;
22var useUtilityClasses = function useUtilityClasses(ownerState) {
23 var color = ownerState.color,
24 anchorOrigin = ownerState.anchorOrigin,
25 invisible = ownerState.invisible,
26 overlap = ownerState.overlap,
27 variant = ownerState.variant,
28 _ownerState$classes = ownerState.classes,
29 classes = _ownerState$classes === void 0 ? {} : _ownerState$classes;
30 var slots = {
31 root: ['root'],
32 badge: ['badge', variant, invisible && 'invisible', "anchorOrigin".concat(capitalize(anchorOrigin.vertical)).concat(capitalize(anchorOrigin.horizontal)), "anchorOrigin".concat(capitalize(anchorOrigin.vertical)).concat(capitalize(anchorOrigin.horizontal)).concat(capitalize(overlap)), "overlap".concat(capitalize(overlap)), color !== 'default' && "color".concat(capitalize(color))]
33 };
34 return composeClasses(slots, getBadgeUtilityClass, classes);
35};
36var BadgeRoot = styled('span', {
37 name: 'MuiBadge',
38 slot: 'Root',
39 overridesResolver: function overridesResolver(props, styles) {
40 return styles.root;
41 }
42})({
43 position: 'relative',
44 display: 'inline-flex',
45 // For correct alignment with the text.
46 verticalAlign: 'middle',
47 flexShrink: 0
48});
49var BadgeBadge = styled('span', {
50 name: 'MuiBadge',
51 slot: 'Badge',
52 overridesResolver: function overridesResolver(props, styles) {
53 var ownerState = props.ownerState;
54 return [styles.badge, styles[ownerState.variant], styles["anchorOrigin".concat(capitalize(ownerState.anchorOrigin.vertical)).concat(capitalize(ownerState.anchorOrigin.horizontal)).concat(capitalize(ownerState.overlap))], ownerState.color !== 'default' && styles["color".concat(capitalize(ownerState.color))], ownerState.invisible && styles.invisible];
55 }
56})(function (_ref) {
57 var _theme$vars;
58 var theme = _ref.theme;
59 return {
60 display: 'flex',
61 flexDirection: 'row',
62 flexWrap: 'wrap',
63 justifyContent: 'center',
64 alignContent: 'center',
65 alignItems: 'center',
66 position: 'absolute',
67 boxSizing: 'border-box',
68 fontFamily: theme.typography.fontFamily,
69 fontWeight: theme.typography.fontWeightMedium,
70 fontSize: theme.typography.pxToRem(12),
71 minWidth: RADIUS_STANDARD * 2,
72 lineHeight: 1,
73 padding: '0 6px',
74 height: RADIUS_STANDARD * 2,
75 borderRadius: RADIUS_STANDARD,
76 zIndex: 1,
77 // Render the badge on top of potential ripples.
78 transition: theme.transitions.create('transform', {
79 easing: theme.transitions.easing.easeInOut,
80 duration: theme.transitions.duration.enteringScreen
81 }),
82 variants: [].concat(_toConsumableArray(Object.keys(((_theme$vars = theme.vars) != null ? _theme$vars : theme).palette).filter(function (key) {
83 var _theme$vars2, _theme$vars3;
84 return ((_theme$vars2 = theme.vars) != null ? _theme$vars2 : theme).palette[key].main && ((_theme$vars3 = theme.vars) != null ? _theme$vars3 : theme).palette[key].contrastText;
85 }).map(function (color) {
86 return {
87 props: {
88 color: color
89 },
90 style: {
91 backgroundColor: (theme.vars || theme).palette[color].main,
92 color: (theme.vars || theme).palette[color].contrastText
93 }
94 };
95 })), [{
96 props: {
97 variant: 'dot'
98 },
99 style: {
100 borderRadius: RADIUS_DOT,
101 height: RADIUS_DOT * 2,
102 minWidth: RADIUS_DOT * 2,
103 padding: 0
104 }
105 }, {
106 props: function props(_ref2) {
107 var ownerState = _ref2.ownerState;
108 return ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular';
109 },
110 style: _defineProperty({
111 top: 0,
112 right: 0,
113 transform: 'scale(1) translate(50%, -50%)',
114 transformOrigin: '100% 0%'
115 }, "&.".concat(badgeClasses.invisible), {
116 transform: 'scale(0) translate(50%, -50%)'
117 })
118 }, {
119 props: function props(_ref3) {
120 var ownerState = _ref3.ownerState;
121 return ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular';
122 },
123 style: _defineProperty({
124 bottom: 0,
125 right: 0,
126 transform: 'scale(1) translate(50%, 50%)',
127 transformOrigin: '100% 100%'
128 }, "&.".concat(badgeClasses.invisible), {
129 transform: 'scale(0) translate(50%, 50%)'
130 })
131 }, {
132 props: function props(_ref4) {
133 var ownerState = _ref4.ownerState;
134 return ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular';
135 },
136 style: _defineProperty({
137 top: 0,
138 left: 0,
139 transform: 'scale(1) translate(-50%, -50%)',
140 transformOrigin: '0% 0%'
141 }, "&.".concat(badgeClasses.invisible), {
142 transform: 'scale(0) translate(-50%, -50%)'
143 })
144 }, {
145 props: function props(_ref5) {
146 var ownerState = _ref5.ownerState;
147 return ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular';
148 },
149 style: _defineProperty({
150 bottom: 0,
151 left: 0,
152 transform: 'scale(1) translate(-50%, 50%)',
153 transformOrigin: '0% 100%'
154 }, "&.".concat(badgeClasses.invisible), {
155 transform: 'scale(0) translate(-50%, 50%)'
156 })
157 }, {
158 props: function props(_ref6) {
159 var ownerState = _ref6.ownerState;
160 return ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular';
161 },
162 style: _defineProperty({
163 top: '14%',
164 right: '14%',
165 transform: 'scale(1) translate(50%, -50%)',
166 transformOrigin: '100% 0%'
167 }, "&.".concat(badgeClasses.invisible), {
168 transform: 'scale(0) translate(50%, -50%)'
169 })
170 }, {
171 props: function props(_ref7) {
172 var ownerState = _ref7.ownerState;
173 return ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular';
174 },
175 style: _defineProperty({
176 bottom: '14%',
177 right: '14%',
178 transform: 'scale(1) translate(50%, 50%)',
179 transformOrigin: '100% 100%'
180 }, "&.".concat(badgeClasses.invisible), {
181 transform: 'scale(0) translate(50%, 50%)'
182 })
183 }, {
184 props: function props(_ref8) {
185 var ownerState = _ref8.ownerState;
186 return ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular';
187 },
188 style: _defineProperty({
189 top: '14%',
190 left: '14%',
191 transform: 'scale(1) translate(-50%, -50%)',
192 transformOrigin: '0% 0%'
193 }, "&.".concat(badgeClasses.invisible), {
194 transform: 'scale(0) translate(-50%, -50%)'
195 })
196 }, {
197 props: function props(_ref9) {
198 var ownerState = _ref9.ownerState;
199 return ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular';
200 },
201 style: _defineProperty({
202 bottom: '14%',
203 left: '14%',
204 transform: 'scale(1) translate(-50%, 50%)',
205 transformOrigin: '0% 100%'
206 }, "&.".concat(badgeClasses.invisible), {
207 transform: 'scale(0) translate(-50%, 50%)'
208 })
209 }, {
210 props: {
211 invisible: true
212 },
213 style: {
214 transition: theme.transitions.create('transform', {
215 easing: theme.transitions.easing.easeInOut,
216 duration: theme.transitions.duration.leavingScreen
217 })
218 }
219 }])
220 };
221});
222var Badge = /*#__PURE__*/React.forwardRef(function Badge(inProps, ref) {
223 var _ref11, _slots$root, _ref12, _slots$badge, _slotProps$root, _slotProps$badge;
224 var props = useDefaultProps({
225 props: inProps,
226 name: 'MuiBadge'
227 });
228 var _props$anchorOrigin = props.anchorOrigin,
229 anchorOriginProp = _props$anchorOrigin === void 0 ? {
230 vertical: 'top',
231 horizontal: 'right'
232 } : _props$anchorOrigin,
233 className = props.className,
234 classesProp = props.classes,
235 component = props.component,
236 _props$components = props.components,
237 components = _props$components === void 0 ? {} : _props$components,
238 _props$componentsProp = props.componentsProps,
239 componentsProps = _props$componentsProp === void 0 ? {} : _props$componentsProp,
240 children = props.children,
241 _props$overlap = props.overlap,
242 overlapProp = _props$overlap === void 0 ? 'rectangular' : _props$overlap,
243 _props$color = props.color,
244 colorProp = _props$color === void 0 ? 'default' : _props$color,
245 _props$invisible = props.invisible,
246 invisibleProp = _props$invisible === void 0 ? false : _props$invisible,
247 _props$max = props.max,
248 maxProp = _props$max === void 0 ? 99 : _props$max,
249 badgeContentProp = props.badgeContent,
250 slots = props.slots,
251 slotProps = props.slotProps,
252 _props$showZero = props.showZero,
253 showZero = _props$showZero === void 0 ? false : _props$showZero,
254 _props$variant = props.variant,
255 variantProp = _props$variant === void 0 ? 'standard' : _props$variant,
256 other = _objectWithoutProperties(props, ["anchorOrigin", "className", "classes", "component", "components", "componentsProps", "children", "overlap", "color", "invisible", "max", "badgeContent", "slots", "slotProps", "showZero", "variant"]);
257 var _useBadge = useBadge({
258 max: maxProp,
259 invisible: invisibleProp,
260 badgeContent: badgeContentProp,
261 showZero: showZero
262 }),
263 badgeContent = _useBadge.badgeContent,
264 invisibleFromHook = _useBadge.invisible,
265 max = _useBadge.max,
266 displayValueFromHook = _useBadge.displayValue;
267 var prevProps = usePreviousProps({
268 anchorOrigin: anchorOriginProp,
269 color: colorProp,
270 overlap: overlapProp,
271 variant: variantProp,
272 badgeContent: badgeContentProp
273 });
274 var invisible = invisibleFromHook || badgeContent == null && variantProp !== 'dot';
275 var _ref10 = invisible ? prevProps : props,
276 _ref10$color = _ref10.color,
277 color = _ref10$color === void 0 ? colorProp : _ref10$color,
278 _ref10$overlap = _ref10.overlap,
279 overlap = _ref10$overlap === void 0 ? overlapProp : _ref10$overlap,
280 _ref10$anchorOrigin = _ref10.anchorOrigin,
281 anchorOrigin = _ref10$anchorOrigin === void 0 ? anchorOriginProp : _ref10$anchorOrigin,
282 _ref10$variant = _ref10.variant,
283 variant = _ref10$variant === void 0 ? variantProp : _ref10$variant;
284 var displayValue = variant !== 'dot' ? displayValueFromHook : undefined;
285 var ownerState = _extends({}, props, {
286 badgeContent: badgeContent,
287 invisible: invisible,
288 max: max,
289 displayValue: displayValue,
290 showZero: showZero,
291 anchorOrigin: anchorOrigin,
292 color: color,
293 overlap: overlap,
294 variant: variant
295 });
296 var classes = useUtilityClasses(ownerState);
297
298 // support both `slots` and `components` for backward compatibility
299 var RootSlot = (_ref11 = (_slots$root = slots == null ? void 0 : slots.root) != null ? _slots$root : components.Root) != null ? _ref11 : BadgeRoot;
300 var BadgeSlot = (_ref12 = (_slots$badge = slots == null ? void 0 : slots.badge) != null ? _slots$badge : components.Badge) != null ? _ref12 : BadgeBadge;
301 var rootSlotProps = (_slotProps$root = slotProps == null ? void 0 : slotProps.root) != null ? _slotProps$root : componentsProps.root;
302 var badgeSlotProps = (_slotProps$badge = slotProps == null ? void 0 : slotProps.badge) != null ? _slotProps$badge : componentsProps.badge;
303 var rootProps = useSlotProps({
304 elementType: RootSlot,
305 externalSlotProps: rootSlotProps,
306 externalForwardedProps: other,
307 additionalProps: {
308 ref: ref,
309 as: component
310 },
311 ownerState: ownerState,
312 className: clsx(rootSlotProps == null ? void 0 : rootSlotProps.className, classes.root, className)
313 });
314 var badgeProps = useSlotProps({
315 elementType: BadgeSlot,
316 externalSlotProps: badgeSlotProps,
317 ownerState: ownerState,
318 className: clsx(classes.badge, badgeSlotProps == null ? void 0 : badgeSlotProps.className)
319 });
320 return /*#__PURE__*/_jsxs(RootSlot, _extends({}, rootProps, {
321 children: [children, /*#__PURE__*/_jsx(BadgeSlot, _extends({}, badgeProps, {
322 children: displayValue
323 }))]
324 }));
325});
326process.env.NODE_ENV !== "production" ? Badge.propTypes /* remove-proptypes */ = {
327 // ┌────────────────────────────── Warning ──────────────────────────────┐
328 // │ These PropTypes are generated from the TypeScript type definitions. │
329 // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
330 // └─────────────────────────────────────────────────────────────────────┘
331 /**
332 * The anchor of the badge.
333 * @default {
334 * vertical: 'top',
335 * horizontal: 'right',
336 * }
337 */
338 anchorOrigin: PropTypes.shape({
339 horizontal: PropTypes.oneOf(['left', 'right']).isRequired,
340 vertical: PropTypes.oneOf(['bottom', 'top']).isRequired
341 }),
342 /**
343 * The content rendered within the badge.
344 */
345 badgeContent: PropTypes.node,
346 /**
347 * The badge will be added relative to this node.
348 */
349 children: PropTypes.node,
350 /**
351 * Override or extend the styles applied to the component.
352 */
353 classes: PropTypes.object,
354 /**
355 * @ignore
356 */
357 className: PropTypes.string,
358 /**
359 * The color of the component.
360 * It supports both default and custom theme colors, which can be added as shown in the
361 * [palette customization guide](https://mui.com/material-ui/customization/palette/#custom-colors).
362 * @default 'default'
363 */
364 color: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['default', 'primary', 'secondary', 'error', 'info', 'success', 'warning']), PropTypes.string]),
365 /**
366 * The component used for the root node.
367 * Either a string to use a HTML element or a component.
368 */
369 component: PropTypes.elementType,
370 /**
371 * The components used for each slot inside.
372 *
373 * This prop is an alias for the `slots` prop.
374 * It's recommended to use the `slots` prop instead.
375 *
376 * @default {}
377 */
378 components: PropTypes.shape({
379 Badge: PropTypes.elementType,
380 Root: PropTypes.elementType
381 }),
382 /**
383 * The extra props for the slot components.
384 * You can override the existing props or add new ones.
385 *
386 * This prop is an alias for the `slotProps` prop.
387 * It's recommended to use the `slotProps` prop instead, as `componentsProps` will be deprecated in the future.
388 *
389 * @default {}
390 */
391 componentsProps: PropTypes.shape({
392 badge: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
393 root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])
394 }),
395 /**
396 * If `true`, the badge is invisible.
397 * @default false
398 */
399 invisible: PropTypes.bool,
400 /**
401 * Max count to show.
402 * @default 99
403 */
404 max: PropTypes.number,
405 /**
406 * Wrapped shape the badge should overlap.
407 * @default 'rectangular'
408 */
409 overlap: PropTypes.oneOf(['circular', 'rectangular']),
410 /**
411 * Controls whether the badge is hidden when `badgeContent` is zero.
412 * @default false
413 */
414 showZero: PropTypes.bool,
415 /**
416 * The props used for each slot inside the Badge.
417 * @default {}
418 */
419 slotProps: PropTypes.shape({
420 badge: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
421 root: PropTypes.oneOfType([PropTypes.func, PropTypes.object])
422 }),
423 /**
424 * The components used for each slot inside the Badge.
425 * Either a string to use a HTML element or a component.
426 * @default {}
427 */
428 slots: PropTypes.shape({
429 badge: PropTypes.elementType,
430 root: PropTypes.elementType
431 }),
432 /**
433 * The system prop that allows defining system overrides as well as additional CSS styles.
434 */
435 sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]),
436 /**
437 * The variant to use.
438 * @default 'standard'
439 */
440 variant: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['dot', 'standard']), PropTypes.string])
441} : void 0;
442export default Badge;
\No newline at end of file