Spaces:
Sleeping
Sleeping
| 'use client'; | |
| import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; | |
| import _extends from "@babel/runtime/helpers/esm/extends"; | |
| const _excluded = ["alt", "children", "className", "component", "slots", "slotProps", "imgProps", "sizes", "src", "srcSet", "variant"]; | |
| import * as React from 'react'; | |
| import PropTypes from 'prop-types'; | |
| import clsx from 'clsx'; | |
| import composeClasses from '@mui/utils/composeClasses'; | |
| import { styled } from '../zero-styled'; | |
| import { useDefaultProps } from '../DefaultPropsProvider'; | |
| import Person from '../internal/svg-icons/Person'; | |
| import { getAvatarUtilityClass } from './avatarClasses'; | |
| import useSlot from '../utils/useSlot'; | |
| import { jsx as _jsx } from "react/jsx-runtime"; | |
| const useUtilityClasses = ownerState => { | |
| const { | |
| classes, | |
| variant, | |
| colorDefault | |
| } = ownerState; | |
| const slots = { | |
| root: ['root', variant, colorDefault && 'colorDefault'], | |
| img: ['img'], | |
| fallback: ['fallback'] | |
| }; | |
| return composeClasses(slots, getAvatarUtilityClass, classes); | |
| }; | |
| const AvatarRoot = styled('div', { | |
| name: 'MuiAvatar', | |
| slot: 'Root', | |
| overridesResolver: (props, styles) => { | |
| const { | |
| ownerState | |
| } = props; | |
| return [styles.root, styles[ownerState.variant], ownerState.colorDefault && styles.colorDefault]; | |
| } | |
| })(({ | |
| theme | |
| }) => ({ | |
| position: 'relative', | |
| display: 'flex', | |
| alignItems: 'center', | |
| justifyContent: 'center', | |
| flexShrink: 0, | |
| width: 40, | |
| height: 40, | |
| fontFamily: theme.typography.fontFamily, | |
| fontSize: theme.typography.pxToRem(20), | |
| lineHeight: 1, | |
| borderRadius: '50%', | |
| overflow: 'hidden', | |
| userSelect: 'none', | |
| variants: [{ | |
| props: { | |
| variant: 'rounded' | |
| }, | |
| style: { | |
| borderRadius: (theme.vars || theme).shape.borderRadius | |
| } | |
| }, { | |
| props: { | |
| variant: 'square' | |
| }, | |
| style: { | |
| borderRadius: 0 | |
| } | |
| }, { | |
| props: { | |
| colorDefault: true | |
| }, | |
| style: _extends({ | |
| color: (theme.vars || theme).palette.background.default | |
| }, theme.vars ? { | |
| backgroundColor: theme.vars.palette.Avatar.defaultBg | |
| } : _extends({ | |
| backgroundColor: theme.palette.grey[400] | |
| }, theme.applyStyles('dark', { | |
| backgroundColor: theme.palette.grey[600] | |
| }))) | |
| }] | |
| })); | |
| const AvatarImg = styled('img', { | |
| name: 'MuiAvatar', | |
| slot: 'Img', | |
| overridesResolver: (props, styles) => styles.img | |
| })({ | |
| width: '100%', | |
| height: '100%', | |
| textAlign: 'center', | |
| // Handle non-square image. The property isn't supported by IE11. | |
| objectFit: 'cover', | |
| // Hide alt text. | |
| color: 'transparent', | |
| // Hide the image broken icon, only works on Chrome. | |
| textIndent: 10000 | |
| }); | |
| const AvatarFallback = styled(Person, { | |
| name: 'MuiAvatar', | |
| slot: 'Fallback', | |
| overridesResolver: (props, styles) => styles.fallback | |
| })({ | |
| width: '75%', | |
| height: '75%' | |
| }); | |
| function useLoaded({ | |
| crossOrigin, | |
| referrerPolicy, | |
| src, | |
| srcSet | |
| }) { | |
| const [loaded, setLoaded] = React.useState(false); | |
| React.useEffect(() => { | |
| if (!src && !srcSet) { | |
| return undefined; | |
| } | |
| setLoaded(false); | |
| let active = true; | |
| const image = new Image(); | |
| image.onload = () => { | |
| if (!active) { | |
| return; | |
| } | |
| setLoaded('loaded'); | |
| }; | |
| image.onerror = () => { | |
| if (!active) { | |
| return; | |
| } | |
| setLoaded('error'); | |
| }; | |
| image.crossOrigin = crossOrigin; | |
| image.referrerPolicy = referrerPolicy; | |
| image.src = src; | |
| if (srcSet) { | |
| image.srcset = srcSet; | |
| } | |
| return () => { | |
| active = false; | |
| }; | |
| }, [crossOrigin, referrerPolicy, src, srcSet]); | |
| return loaded; | |
| } | |
| const Avatar = /*#__PURE__*/React.forwardRef(function Avatar(inProps, ref) { | |
| const props = useDefaultProps({ | |
| props: inProps, | |
| name: 'MuiAvatar' | |
| }); | |
| const { | |
| alt, | |
| children: childrenProp, | |
| className, | |
| component = 'div', | |
| slots = {}, | |
| slotProps = {}, | |
| imgProps, | |
| sizes, | |
| src, | |
| srcSet, | |
| variant = 'circular' | |
| } = props, | |
| other = _objectWithoutPropertiesLoose(props, _excluded); | |
| let children = null; | |
| // Use a hook instead of onError on the img element to support server-side rendering. | |
| const loaded = useLoaded(_extends({}, imgProps, { | |
| src, | |
| srcSet | |
| })); | |
| const hasImg = src || srcSet; | |
| const hasImgNotFailing = hasImg && loaded !== 'error'; | |
| const ownerState = _extends({}, props, { | |
| colorDefault: !hasImgNotFailing, | |
| component, | |
| variant | |
| }); | |
| const classes = useUtilityClasses(ownerState); | |
| const [ImgSlot, imgSlotProps] = useSlot('img', { | |
| className: classes.img, | |
| elementType: AvatarImg, | |
| externalForwardedProps: { | |
| slots, | |
| slotProps: { | |
| img: _extends({}, imgProps, slotProps.img) | |
| } | |
| }, | |
| additionalProps: { | |
| alt, | |
| src, | |
| srcSet, | |
| sizes | |
| }, | |
| ownerState | |
| }); | |
| if (hasImgNotFailing) { | |
| children = /*#__PURE__*/_jsx(ImgSlot, _extends({}, imgSlotProps)); | |
| // We only render valid children, non valid children are rendered with a fallback | |
| // We consider that invalid children are all falsy values, except 0, which is valid. | |
| } else if (!!childrenProp || childrenProp === 0) { | |
| children = childrenProp; | |
| } else if (hasImg && alt) { | |
| children = alt[0]; | |
| } else { | |
| children = /*#__PURE__*/_jsx(AvatarFallback, { | |
| ownerState: ownerState, | |
| className: classes.fallback | |
| }); | |
| } | |
| return /*#__PURE__*/_jsx(AvatarRoot, _extends({ | |
| as: component, | |
| ownerState: ownerState, | |
| className: clsx(classes.root, className), | |
| ref: ref | |
| }, other, { | |
| children: children | |
| })); | |
| }); | |
| process.env.NODE_ENV !== "production" ? Avatar.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`. β | |
| // βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| /** | |
| * Used in combination with `src` or `srcSet` to | |
| * provide an alt attribute for the rendered `img` element. | |
| */ | |
| alt: PropTypes.string, | |
| /** | |
| * Used to render icon or text elements inside the Avatar if `src` is not set. | |
| * This can be an element, or just a string. | |
| */ | |
| children: PropTypes.node, | |
| /** | |
| * Override or extend the styles applied to the component. | |
| */ | |
| classes: PropTypes.object, | |
| /** | |
| * @ignore | |
| */ | |
| className: PropTypes.string, | |
| /** | |
| * The component used for the root node. | |
| * Either a string to use a HTML element or a component. | |
| */ | |
| component: PropTypes.elementType, | |
| /** | |
| * [Attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attributes) applied to the `img` element if the component is used to display an image. | |
| * It can be used to listen for the loading error event. | |
| * @deprecated Use `slotProps.img` instead. This prop will be removed in v7. [How to migrate](/material-ui/migration/migrating-from-deprecated-apis/). | |
| */ | |
| imgProps: PropTypes.object, | |
| /** | |
| * The `sizes` attribute for the `img` element. | |
| */ | |
| sizes: PropTypes.string, | |
| /** | |
| * The props used for each slot inside. | |
| * @default {} | |
| */ | |
| slotProps: PropTypes.shape({ | |
| img: PropTypes.oneOfType([PropTypes.func, PropTypes.object]) | |
| }), | |
| /** | |
| * The components used for each slot inside. | |
| * @default {} | |
| */ | |
| slots: PropTypes.shape({ | |
| img: PropTypes.elementType | |
| }), | |
| /** | |
| * The `src` attribute for the `img` element. | |
| */ | |
| src: PropTypes.string, | |
| /** | |
| * The `srcSet` attribute for the `img` element. | |
| * Use this attribute for responsive image display. | |
| */ | |
| srcSet: PropTypes.string, | |
| /** | |
| * The system prop that allows defining system overrides as well as additional CSS styles. | |
| */ | |
| sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]), | |
| /** | |
| * The shape of the avatar. | |
| * @default 'circular' | |
| */ | |
| variant: PropTypes /* @typescript-to-proptypes-ignore */.oneOfType([PropTypes.oneOf(['circular', 'rounded', 'square']), PropTypes.string]) | |
| } : void 0; | |
| export default Avatar; |