35bcb63300
Componentes React accesibles basados en Radix UI con soporte de temas via CSS variables. Incluye barrel export en index.ts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import * as React from "react"
|
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
import { cn } from "../core/cn"
|
|
|
|
const avatarVariants = cva(
|
|
"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted font-medium text-muted-foreground select-none",
|
|
{
|
|
variants: {
|
|
size: {
|
|
xs: "size-6 text-xs",
|
|
sm: "size-8 text-sm",
|
|
md: "size-10 text-base",
|
|
lg: "size-12 text-lg",
|
|
xl: "size-16 text-xl",
|
|
},
|
|
},
|
|
defaultVariants: { size: "md" },
|
|
}
|
|
)
|
|
|
|
interface AvatarProps
|
|
extends React.ComponentPropsWithoutRef<"span">,
|
|
VariantProps<typeof avatarVariants> {
|
|
src?: string
|
|
alt?: string
|
|
fallback?: string
|
|
initials?: string
|
|
}
|
|
|
|
function getInitials(name?: string): string {
|
|
if (!name) return "?"
|
|
const parts = name.trim().split(/\s+/)
|
|
if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()
|
|
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()
|
|
}
|
|
|
|
const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(
|
|
({ className, size, src, alt, fallback, initials, ...props }, ref) => {
|
|
const [imgError, setImgError] = React.useState(false)
|
|
const showImage = src && !imgError
|
|
const displayInitials = initials ?? getInitials(fallback ?? alt)
|
|
|
|
return (
|
|
<span
|
|
ref={ref}
|
|
data-slot="avatar"
|
|
className={cn(avatarVariants({ size }), className)}
|
|
{...props}
|
|
>
|
|
{showImage ? (
|
|
<img
|
|
src={src}
|
|
alt={alt ?? ""}
|
|
className="aspect-square size-full object-cover"
|
|
onError={() => setImgError(true)}
|
|
/>
|
|
) : (
|
|
<span data-slot="avatar-fallback" aria-hidden="true">
|
|
{displayInitials}
|
|
</span>
|
|
)}
|
|
</span>
|
|
)
|
|
}
|
|
)
|
|
Avatar.displayName = "Avatar"
|
|
|
|
export { Avatar, avatarVariants }
|
|
export type { AvatarProps }
|