{"version":3,"file":"avatar.mjs","names":[],"sources":["../../../../package/common/avatar/avatar.tsx"],"sourcesContent":["import { useState, type ReactElement } from 'react';\nimport cx from 'classnames';\nimport { faUser } from '@fortawesome/free-solid-svg-icons';\nimport Badge, { BadgePosition } from '../badge';\nimport { ThemeColor, type ColorValue } from '../themeProvider/color.types';\n\nimport type { AvatarProps, AvatarStatus } from './avatar.types';\nimport styles from './avatar.module.pcss';\nimport { renderIcon } from '../utils/renderIcon';\n\nconst STATUS_COLOR: Record<AvatarStatus, ColorValue> = {\n  online: ThemeColor.Success,\n  away: ThemeColor.Warn,\n  busy: ThemeColor.Error,\n  offline: 'var(--text-dark)',\n};\n\nfunction getInitials(name?: string): string {\n  if (!name) return '';\n  const parts = name.trim().split(/\\s+/).filter(Boolean);\n  if (parts.length === 0) return '';\n  if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n  return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nfunction Avatar({\n  src,\n  alt,\n  name,\n  icon = faUser,\n  content,\n  status,\n  className,\n  style,\n  classNames,\n  styles: slotStyles,\n  ...rest\n}: AvatarProps): ReactElement {\n  const [hasError, setHasError] = useState(false);\n  const [prevSrc, setPrevSrc] = useState(src);\n\n  if (src !== prevSrc) {\n    setPrevSrc(src);\n    setHasError(false);\n  }\n\n  const initials = getInitials(name);\n  const showImage = !!src && !hasError;\n\n  const rendered = showImage ? (\n    <img\n      className={cx(styles.avatarImage, classNames?.image)}\n      style={slotStyles?.image}\n      src={src}\n      alt={alt ?? name ?? ''}\n      onError={() => setHasError(true)}\n    />\n  ) : (\n    <span className={cx(styles.avatarFallback, classNames?.fallback)} style={slotStyles?.fallback}>\n      {content ?? (initials || renderIcon(icon))}\n    </span>\n  );\n\n  if (!status) {\n    return (\n      <span {...rest} className={cx(styles.avatar, className)} style={style}>\n        {rendered}\n      </span>\n    );\n  }\n\n  return (\n    <Badge\n      {...rest}\n      dot\n      position={BadgePosition.BottomRight}\n      color={STATUS_COLOR[status]}\n      className={className}\n      style={style}\n      classNames={{ badge: cx(styles.avatarStatusBadge, classNames?.status) }}\n      styles={{ badge: slotStyles?.status }}\n    >\n      <span className={styles.avatar}>{rendered}</span>\n    </Badge>\n  );\n}\n\nexport default Avatar;\n"],"mappings":"4ZAUA,IAAM,EAAiD,CACrD,OAAQ,EAAW,QACnB,KAAM,EAAW,KACjB,KAAM,EAAW,MACjB,QAAS,kBACX,EAEA,SAAS,EAAY,EAAuB,CAC1C,GAAI,CAAC,EAAM,MAAO,GAClB,IAAM,EAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EAGrD,OAFI,EAAM,SAAW,EAAU,GAC3B,EAAM,SAAW,EAAU,EAAM,EAAE,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,YAAY,GACxD,EAAM,EAAE,CAAC,GAAK,EAAM,EAAM,OAAS,EAAE,CAAC,GAAA,CAAI,YAAY,CAChE,CAEA,SAAS,EAAO,CACd,MACA,MACA,OACA,OAAO,EACP,UACA,SACA,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACyB,CAC5B,GAAM,CAAC,EAAU,GAAe,EAAS,EAAK,EACxC,CAAC,EAAS,GAAc,EAAS,CAAG,EAEtC,IAAQ,IACV,EAAW,CAAG,EACd,EAAY,EAAK,GAGnB,IAAM,EAAW,EAAY,CAAI,EAG3B,EAFc,GAAO,CAAC,EAG1B,EAAC,MAAD,CACE,UAAW,EAAG,EAAO,YAAa,GAAY,KAAK,EACnD,MAAO,GAAY,MACd,MACL,IAAK,GAAO,GAAQ,GACpB,YAAe,EAAY,EAAI,CAChC,CAAA,EAED,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,eAAgB,GAAY,QAAQ,EAAG,MAAO,GAAY,SAClF,SAAA,IAAY,GAAY,EAAW,CAAI,EACpC,CAAA,EAWR,OARK,EASH,EAAC,EAAD,CACE,GAAI,EACJ,IAAA,GACA,SAAU,EAAc,YACxB,MAAO,EAAa,GACT,YACJ,QACP,WAAY,CAAE,MAAO,EAAG,EAAO,kBAAmB,GAAY,MAAM,CAAE,EACtE,OAAQ,CAAE,MAAO,GAAY,MAAO,EAEpC,SAAA,EAAC,OAAD,CAAM,UAAW,EAAO,OAAS,SAAA,CAAe,CAAA,CAC3C,CAAA,EAlBL,EAAC,OAAD,CAAM,GAAI,EAAM,UAAW,EAAG,EAAO,OAAQ,CAAS,EAAU,QAC7D,SAAA,CACG,CAAA,CAkBZ"}