{"version":3,"file":"Avatar.cjs","names":[],"sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Avatar.module.css\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type AvatarStatus = \"online\" | \"offline\" | \"busy\";\n\nexport interface AvatarProps {\n    src?: string;\n    alt?: string;\n    name?: string;\n    size?: AvatarSize;\n    status?: AvatarStatus;\n    className?: string;\n    onClick?: () => void;\n}\n\nfunction getInitials(name: string): string {\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);\n    return `${parts[0]!.charAt(0)}${parts[parts.length - 1]!.charAt(0)}`;\n}\n\n/**\n * Round avatar. Falls back to colored initials when the image fails to load\n * or no `src` is provided. Optional status dot in the bottom-right corner.\n */\nexport function Avatar({\n    src,\n    alt,\n    name = \"\",\n    size = \"md\",\n    status,\n    className,\n    onClick,\n}: AvatarProps) {\n    const [errored, setErrored] = useState<boolean>(false);\n    const initials = useMemo(() => getInitials(name), [name]);\n\n    const showImage = src && !errored;\n    const role = onClick ? \"button\" : undefined;\n    const tabIndex = onClick ? 0 : undefined;\n\n    return (\n        <span\n            className={cn(styles.avatar, styles[size], status && styles.status, className)}\n            role={role}\n            tabIndex={tabIndex}\n            onClick={onClick}\n            onKeyDown={\n                onClick\n                    ? (event) => {\n                          if (event.key === \"Enter\" || event.key === \" \") {\n                              event.preventDefault();\n                              onClick();\n                          }\n                      }\n                    : undefined\n            }\n        >\n            {showImage ? (\n                <img\n                    src={src}\n                    alt={alt ?? name}\n                    className={styles.image}\n                    onError={() => setErrored(true)}\n                />\n            ) : (\n                <span aria-label={alt ?? name}>{initials}</span>\n            )}\n            {status && <span className={cn(styles.dot, styles[status])} aria-hidden />}\n        </span>\n    );\n}\n"],"mappings":"6HAiBA,SAAS,EAAY,EAAsB,CACvC,IAAM,EAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EAGrD,OAFI,EAAM,SAAW,EAAU,IAC3B,EAAM,SAAW,EAAU,EAAM,EAAE,CAAE,MAAM,EAAG,CAAC,EAC5C,GAAG,EAAM,EAAE,CAAE,OAAO,CAAC,IAAI,EAAM,EAAM,OAAS,EAAE,CAAE,OAAO,CAAC,GACrE,CAMA,SAAgB,EAAO,CACnB,MACA,MACA,OAAO,GACP,OAAO,KACP,SACA,YACA,WACY,CACZ,GAAM,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAkB,EAAK,EAC/C,GAAA,EAAW,EAAA,QAAA,KAAc,EAAY,CAAI,EAAG,CAAC,CAAI,CAAC,EAElD,EAAY,GAAO,CAAC,EACpB,EAAO,EAAU,SAAW,IAAA,GAC5B,EAAW,EAAU,EAAI,IAAA,GAE/B,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,EAAA,QAAO,GAAO,GAAU,EAAA,QAAO,OAAQ,CAAS,EACvE,OACI,WACD,UACT,UACI,EACO,GAAU,EACH,EAAM,MAAQ,SAAW,EAAM,MAAQ,OACvC,EAAM,eAAe,EACrB,EAAQ,EAEhB,EACA,IAAA,GAbd,SAAA,CAgBK,GACG,EAAA,EAAA,IAAA,CAAC,MAAD,CACS,MACL,IAAK,GAAO,EACZ,UAAW,EAAA,QAAO,MAClB,YAAe,EAAW,EAAI,CACjC,CAAA,GAED,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,aAAY,GAAO,EAAO,SAAA,CAAe,CAAA,EAElD,IAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,EAAO,EAAG,cAAA,EAAa,CAAA,CACvE,GAEd"}