@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 6.17 kB
Source Map (JSON)
{"version":3,"file":"Avatar.mjs","names":[],"sources":["../../../src/base-ui/Avatar/Avatar.tsx"],"sourcesContent":["'use client';\n\nimport { getEmoji } from '@lobehub/fluent-emoji';\nimport { cssVar, cx } from 'antd-style';\nimport { Loader2 } from 'lucide-react';\nimport { memo, useMemo, useState } from 'react';\n\nimport { Center } from '@/Flex';\nimport FluentEmoji from '@/FluentEmoji';\nimport Icon from '@/Icon';\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\nimport { styles, variants } from './style';\nimport { type AvatarProps } from './type';\nimport {\n calculateEmojiSize,\n formatAvatarText,\n hasValidBackground,\n isDefaultAntAvatar,\n} from './utils';\n\nconst Avatar = memo<AvatarProps>(\n ({\n alt,\n animation,\n avatar,\n background,\n bordered,\n borderedColor,\n className,\n classNames,\n crossOrigin,\n draggable = false,\n emojiScaleWithBackground = true,\n loading,\n ref,\n shadow,\n shape = 'square',\n size = 48,\n sliceText = true,\n style,\n styles: customStyles,\n title,\n tooltipProps,\n unoptimized,\n variant = 'borderless',\n ...rest\n }) => {\n const isStringAvatar = typeof avatar === 'string';\n\n const [isImgError, setIsImgError] = useState(false);\n\n const isUrlOrElement = useMemo(() => isDefaultAntAvatar(avatar), [avatar]);\n\n const emoji = useMemo(\n () => (avatar && isStringAvatar && !isUrlOrElement ? getEmoji(avatar) : undefined),\n [avatar, isStringAvatar, isUrlOrElement],\n );\n\n const text = String(isUrlOrElement ? title : avatar);\n\n const imgAlt = alt || title || 'avatar';\n\n const hasBackground = hasValidBackground(background);\n const showImage = isUrlOrElement && isStringAvatar && !isImgError;\n const showElement = isUrlOrElement && !isStringAvatar && !isImgError;\n\n const customAvatar = useMemo(\n () =>\n emoji ? (\n <FluentEmoji\n emoji={emoji}\n size={calculateEmojiSize(size, hasBackground, emojiScaleWithBackground)}\n type={animation ? 'anim' : '3d'}\n unoptimized={unoptimized}\n />\n ) : (\n formatAvatarText(text || title, sliceText)\n ),\n [\n animation,\n emoji,\n hasBackground,\n size,\n sliceText,\n text,\n title,\n unoptimized,\n emojiScaleWithBackground,\n ],\n );\n\n return (\n <div\n {...rest}\n className={cx(variants({ shadow, variant }), className, classNames?.root)}\n ref={ref}\n style={{\n backgroundColor:\n (isUrlOrElement && !isImgError) || emoji\n ? background\n : background || cssVar.colorBorder,\n borderRadius: shape === 'circle' ? '50%' : size < 24 ? '33%' : Math.max(size / 6, 2),\n boxShadow: bordered\n ? `${cssVar.colorBgLayout} 0 0 0 2px, ${borderedColor || cssVar.colorTextTertiary} 0 0 0 4px`\n : undefined,\n color: safeReadableColor(background || cssVar.colorBorder),\n cursor: rest?.onClick ? 'pointer' : undefined,\n fontSize: size * (emoji ? 0.7 : 0.5),\n height: size,\n width: size,\n ...style,\n ...customStyles?.root,\n }}\n >\n {loading && (\n <Center\n className={cx(styles.loading, classNames?.loading)}\n flex={'none'}\n height={'100%'}\n style={customStyles?.loading}\n width={'100%'}\n >\n <Icon spin icon={Loader2} />\n </Center>\n )}\n {typeof avatar === 'string' && showImage && (\n <img\n alt={imgAlt}\n className={cx(styles.img, classNames?.img)}\n crossOrigin={crossOrigin}\n draggable={draggable}\n height={size}\n loading={'lazy'}\n src={avatar}\n style={customStyles?.img}\n width={size}\n onError={() => setIsImgError(true)}\n />\n )}\n {!showImage && (\n <span className={cx(styles.content, classNames?.content)} style={customStyles?.content}>\n {showElement ? avatar : customAvatar}\n </span>\n )}\n </div>\n );\n },\n);\n\nAvatar.displayName = 'Avatar';\n\nexport default Avatar;\n"],"mappings":";;;;;;;;;;;;;AAqBA,MAAM,SAAS,MACZ,EACC,KACA,WACA,QACA,YACA,UACA,eACA,WACA,YACA,aACA,YAAY,OACZ,2BAA2B,MAC3B,SACA,KACA,QACA,QAAQ,UACR,OAAO,IACP,YAAY,MACZ,OACA,QAAQ,cACR,OACA,cACA,aACA,UAAU,cACV,GAAG,WACC;CACJ,MAAM,iBAAiB,OAAO,WAAW;CAEzC,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAElD,MAAM,iBAAiB,cAAc,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,QAAQ,cACL,UAAU,kBAAkB,CAAC,iBAAiB,SAAS,MAAM,IAAI,KAAA,GACxE;EAAC;EAAQ;EAAgB;CAAc,CACzC;CAEA,MAAM,OAAO,OAAO,iBAAiB,QAAQ,MAAM;CAEnD,MAAM,SAAS,OAAO,SAAS;CAE/B,MAAM,gBAAgB,mBAAmB,UAAU;CACnD,MAAM,YAAY,kBAAkB,kBAAkB,CAAC;CACvD,MAAM,cAAc,kBAAkB,CAAC,kBAAkB,CAAC;CAE1D,MAAM,eAAe,cAEjB,QACE,oBAAC,aAAD;EACS;EACP,MAAM,mBAAmB,MAAM,eAAe,wBAAwB;EACtE,MAAM,YAAY,SAAS;EACd;CACd,CAAA,IAED,iBAAiB,QAAQ,OAAO,SAAS,GAE7C;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,OACE,qBAAC,OAAD;EACE,GAAI;EACJ,WAAW,GAAG,SAAS;GAAE;GAAQ;EAAQ,CAAC,GAAG,WAAW,YAAY,IAAI;EACnE;EACL,OAAO;GACL,iBACG,kBAAkB,CAAC,cAAe,QAC/B,aACA,cAAc,OAAO;GAC3B,cAAc,UAAU,WAAW,QAAQ,OAAO,KAAK,QAAQ,KAAK,IAAI,OAAO,GAAG,CAAC;GACnF,WAAW,WACP,GAAG,OAAO,cAAc,cAAc,iBAAiB,OAAO,kBAAkB,cAChF,KAAA;GACJ,OAAO,kBAAkB,cAAc,OAAO,WAAW;GACzD,QAAQ,MAAM,UAAU,YAAY,KAAA;GACpC,UAAU,QAAQ,QAAQ,KAAM;GAChC,QAAQ;GACR,OAAO;GACP,GAAG;GACH,GAAG,cAAc;EACnB;EApBF,UAAA;GAsBG,WACC,oBAAC,QAAD;IACE,WAAW,GAAG,OAAO,SAAS,YAAY,OAAO;IACjD,MAAM;IACN,QAAQ;IACR,OAAO,cAAc;IACrB,OAAO;IAEP,UAAA,oBAAC,MAAD;KAAM,MAAA;KAAK,MAAM;IAAU,CAAA;GACrB,CAAA;GAET,OAAO,WAAW,YAAY,aAC7B,oBAAC,OAAD;IACE,KAAK;IACL,WAAW,GAAG,OAAO,KAAK,YAAY,GAAG;IAC5B;IACF;IACX,QAAQ;IACR,SAAS;IACT,KAAK;IACL,OAAO,cAAc;IACrB,OAAO;IACP,eAAe,cAAc,IAAI;GAClC,CAAA;GAEF,CAAC,aACA,oBAAC,QAAD;IAAM,WAAW,GAAG,OAAO,SAAS,YAAY,OAAO;IAAG,OAAO,cAAc;IAC5E,UAAA,cAAc,SAAS;GACpB,CAAA;EAEL;;AAET,CACF;AAEA,OAAO,cAAc"}