Avatar
Display user profile pictures, initials, or placeholder images in a circular format. Perfect for user interfaces, comment sections, and team member displays.
Installation
Add the Avatar component to your project:
npx @elixir-labs/ui add avatar
Usage
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
export default function MyComponent() {
return (
<Avatar>
<AvatarImage src="/profile.jpg" alt="User" />
<AvatarFallback>JD</AvatarFallback>
</Avatar>
);
}
Examples
Basic Avatar

CN
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="Avatar" />
<AvatarFallback>CN</AvatarFallback>
</Avatar>
Avatar Fallback
JD
<Avatar>
<AvatarImage src="/invalid-image.jpg" alt="Avatar" />
<AvatarFallback>JD</AvatarFallback>
</Avatar>
Avatar Sizes

SM
Small

MD
Default

LG
Large

XL
Extra Large
<Avatar className="h-8 w-8">
<AvatarImage src="/avatar.jpg" alt="Small" />
<AvatarFallback className="text-xs">SM</AvatarFallback>
</Avatar>
<Avatar className="h-10 w-10">
<AvatarImage src="/avatar.jpg" alt="Default" />
<AvatarFallback>MD</AvatarFallback>
</Avatar>
<Avatar className="h-12 w-12">
<AvatarImage src="/avatar.jpg" alt="Large" />
<AvatarFallback>LG</AvatarFallback>
</Avatar>
<Avatar className="h-16 w-16">
<AvatarImage src="/avatar.jpg" alt="Extra Large" />
<AvatarFallback className="text-lg">XL</AvatarFallback>
</Avatar>
Avatar Group

U1

U2

U3
+5
<div className="flex -space-x-2">
<Avatar className="border-2 border-background">
<AvatarImage src="/user1.jpg" alt="User 1" />
<AvatarFallback>U1</AvatarFallback>
</Avatar>
<Avatar className="border-2 border-background">
<AvatarImage src="/user2.jpg" alt="User 2" />
<AvatarFallback>U2</AvatarFallback>
</Avatar>
<Avatar className="border-2 border-background">
<AvatarImage src="/user3.jpg" alt="User 3" />
<AvatarFallback>U3</AvatarFallback>
</Avatar>
<Avatar className="border-2 border-background">
<AvatarFallback>+5</AvatarFallback>
</Avatar>
</div>
User Profile Card

JD
John Doe
Software Engineer
john.doe@example.com
<div className="flex items-center gap-4 p-4 rounded-lg border">
<Avatar className="h-12 w-12">
<AvatarImage src="/john-doe.jpg" alt="John Doe" />
<AvatarFallback>JD</AvatarFallback>
</Avatar>
<div className="flex-1">
<h3 className="font-medium">John Doe</h3>
<p className="text-sm text-muted-foreground">Software Engineer</p>
<p className="text-xs text-muted-foreground">john.doe@example.com</p>
</div>
</div>
Team Member List

AJ
Alice Johnson
Product Manager

BS
Bob Smith
Designer

CW
Carol White
Developer
const teamMembers = [
{ name: "Alice Johnson", role: "Product Manager", initials: "AJ" },
{ name: "Bob Smith", role: "Designer", initials: "BS" },
{ name: "Carol White", role: "Developer", initials: "CW" },
];
export default function TeamList() {
return (
<div className="space-y-3">
{teamMembers.map((member, index) => (
<div key={index} className="flex items-center gap-3 p-2 rounded hover:bg-accent">
<Avatar className="h-8 w-8">
<AvatarImage src={`/team/${member.name.toLowerCase().replace(' ', '-')}.jpg`} alt={member.name} />
<AvatarFallback className="text-xs">{member.initials}</AvatarFallback>
</Avatar>
<div>
<div className="font-medium text-sm">{member.name}</div>
<div className="text-xs text-muted-foreground">{member.role}</div>
</div>
</div>
))}
</div>
);
}
API Reference
Avatar
Prop | Type | Default | Description |
---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | AvatarImage and AvatarFallback components |
AvatarImage
Prop | Type | Default | Description |
---|---|---|---|
src | string | - | Image source URL |
alt | string | - | Alt text for accessibility |
className | string | - | Additional CSS classes |
AvatarFallback
Displayed when the image fails to load or is not provided. Typically shows user initials.
Source Code
import React from 'react';
import { clsx } from 'clsx';
const Avatar = React.forwardRef(({ className, ...props }, ref) => (
<div
ref={ref}
className={clsx(
'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',
className
)}
{...props}
/>
));
Avatar.displayName = 'Avatar';
const AvatarImage = React.forwardRef(({ className, ...props }, ref) => (
<img
ref={ref}
className={clsx('aspect-square h-full w-full', className)}
{...props}
/>
));
AvatarImage.displayName = 'AvatarImage';
const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => (
<div
ref={ref}
className={clsx(
'flex h-full w-full items-center justify-center rounded-full bg-muted',
className
)}
{...props}
/>
));
AvatarFallback.displayName = 'AvatarFallback';
export { Avatar, AvatarImage, AvatarFallback };
Accessibility
The Avatar component follows accessibility guidelines:
- Always provide meaningful alt text for avatar images
- Fallback content is accessible to screen readers
- Proper semantic structure with img elements
- Works well with keyboard navigation
- Maintains proper contrast ratios for fallback text
Best Practices
✅ Do
- Use meaningful fallback text (initials or icons)
- Provide descriptive alt text for images
- Optimize images for different screen densities
- Use consistent sizing across your application
- Consider loading states for slow network connections
❌ Don't
- Leave empty fallbacks without any content
- Use overly large images without optimization
- Forget to handle image loading errors
- Make avatars too small to be easily clickable on touch devices
💡 Pro Tip
For better performance, consider using optimized image formats like WebP and provide multiple sizes for different use cases. You can also implement lazy loading for avatar lists.