Spaces:
Running
Running
| "use client"; | |
| import * as React from "react"; | |
| import { cn } from "@/lib/utils"; | |
| interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> { | |
| className?: string; | |
| } | |
| const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>( | |
| ({ className, ...props }, ref) => ( | |
| <div | |
| ref={ref} | |
| className={cn( | |
| "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", | |
| className | |
| )} | |
| {...props} | |
| /> | |
| ) | |
| ); | |
| Avatar.displayName = "Avatar"; | |
| interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> { | |
| className?: string; | |
| } | |
| const AvatarImage = React.forwardRef<HTMLImageElement, AvatarImageProps>( | |
| ({ className, src, alt = "", ...props }, ref) => { | |
| const [error, setError] = React.useState(false); | |
| if (error || !src) return null; | |
| return ( | |
| // eslint-disable-next-line @next/next/no-img-element | |
| <img | |
| ref={ref} | |
| src={src} | |
| alt={alt} | |
| onError={() => setError(true)} | |
| className={cn("aspect-square h-full w-full object-cover", className)} | |
| {...props} | |
| /> | |
| ); | |
| } | |
| ); | |
| AvatarImage.displayName = "AvatarImage"; | |
| interface AvatarFallbackProps extends React.HTMLAttributes<HTMLDivElement> { | |
| className?: string; | |
| } | |
| const AvatarFallback = React.forwardRef<HTMLDivElement, AvatarFallbackProps>( | |
| ({ className, ...props }, ref) => ( | |
| <div | |
| ref={ref} | |
| className={cn( | |
| "flex h-full w-full items-center justify-center rounded-full bg-zinc-800 text-zinc-400", | |
| className | |
| )} | |
| {...props} | |
| /> | |
| ) | |
| ); | |
| AvatarFallback.displayName = "AvatarFallback"; | |
| export { Avatar, AvatarImage, AvatarFallback }; | |