Avatar
Display user profile images with customizable fallback content
Usage
import { Avatar } from '@lenso/ui';"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Avatar } from "@lenso/ui";import * as stylex from "@stylexjs/stylex";import { s } from "../card/display.stylex";
export function Basic() { return ( <div {...stylex.props(s.row4)}> <Avatar> <Avatar.Image alt="John Doe" src="https://img.heroui.chat/image/avatar?w=400&h=400&u=3" /> <Avatar.Fallback>JD</Avatar.Fallback> </Avatar> <Avatar> <Avatar.Image alt="Blue" src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/blue.jpg" /> <Avatar.Fallback>B</Avatar.Fallback> </Avatar> <Avatar> <Avatar.Fallback>JR</Avatar.Fallback> </Avatar> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Anatomy
import { Avatar } from '@lenso/ui';
export default () => ( <Avatar> <Avatar.Image/> <Avatar.Fallback/> </Avatar>)Examples
Sizes
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Avatar } from "@lenso/ui";import * as stylex from "@stylexjs/stylex";import { s } from "../card/display.stylex";
export function Sizes() { return ( <div {...stylex.props(s.row4)}> <Avatar size="sm"> <Avatar.Image alt="Small Avatar" src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/blue.jpg" /> <Avatar.Fallback>SM</Avatar.Fallback> </Avatar> <Avatar size="md"> <Avatar.Image alt="Medium Avatar" src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/purple.jpg" /> <Avatar.Fallback>MD</Avatar.Fallback> </Avatar> <Avatar size="lg"> <Avatar.Image alt="Large Avatar" src="https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/red.jpg" /> <Avatar.Fallback>LG</Avatar.Fallback> </Avatar> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Colors
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Avatar } from "@lenso/ui";import * as stylex from "@stylexjs/stylex";import { s } from "../card/display.stylex";
export function Colors() { return ( <div {...stylex.props(s.row4)}> <Avatar color="default"> <Avatar.Fallback>DF</Avatar.Fallback> </Avatar> <Avatar color="accent"> <Avatar.Fallback>AC</Avatar.Fallback> </Avatar> <Avatar color="success"> <Avatar.Fallback>SC</Avatar.Fallback> </Avatar> <Avatar color="warning"> <Avatar.Fallback>WR</Avatar.Fallback> </Avatar> <Avatar color="danger"> <Avatar.Fallback>DG</Avatar.Fallback> </Avatar> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Variants
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Person } from "@gravity-ui/icons";import { Avatar, Separator } from "@lenso/ui";import * as stylex from "@stylexjs/stylex";import { s } from "../card/display.stylex";
export function Variants() { const colors = ["accent", "default", "success", "warning", "danger"] as const; const variants = [ { content: "AG", label: "letter", type: "letter" }, { content: "AG", label: "letter soft", type: "letter-soft" }, { content: <Person />, label: "icon", type: "icon" }, { content: <Person />, label: "icon soft", type: "icon-soft" }, { content: [ "https://img.heroui.chat/image/avatar?w=400&h=400&u=3", "https://img.heroui.chat/image/avatar?w=400&h=400&u=4", "https://img.heroui.chat/image/avatar?w=400&h=400&u=5", "https://img.heroui.chat/image/avatar?w=400&h=400&u=8", "https://img.heroui.chat/image/avatar?w=400&h=400&u=16", ], label: "img", type: "img", }, ] as const; return ( <div {...stylex.props(s.column4)}> <div {...stylex.props(s.row3)}> <div {...stylex.props(s.labelCell)} /> {colors.map((color) => ( <div key={color} {...stylex.props(s.avatarCell)}> <span {...stylex.props(s.textXs, s.muted, s.capitalize)}>{color}</span> </div> ))} </div> <Separator /> {variants.map((variant) => ( <div key={variant.label} {...stylex.props(s.row3)}> <div {...stylex.props(s.labelCell, s.textSm, s.muted)}>{variant.label}</div> {colors.map((color, colorIndex) => ( <div key={color} {...stylex.props(s.avatarCell)}> <Avatar color={color} variant={variant.type.includes("soft") ? "soft" : "default"}> {variant.type === "img" ? ( <> <Avatar.Image alt={`Avatar ${color}`} src={variant.content[colorIndex] ?? ""} /> <Avatar.Fallback>{color.charAt(0).toUpperCase()}</Avatar.Fallback> </> ) : ( <Avatar.Fallback>{variant.content}</Avatar.Fallback> )} </Avatar> </div> ))} </div> ))} </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Fallback Content
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Person } from "@gravity-ui/icons";import { Avatar } from "@lenso/ui";import * as stylex from "@stylexjs/stylex";import { s } from "../card/display.stylex";
export function Fallback() { return ( <div {...stylex.props(s.row4)}> <Avatar> <Avatar.Fallback>JD</Avatar.Fallback> </Avatar> <Avatar> <Avatar.Fallback> <Person /> </Avatar.Fallback> </Avatar> <Avatar> <Avatar.Image alt="Delayed Avatar" src="https://invalid-url-to-show-fallback.com/image.jpg" /> <Avatar.Fallback delay={600}>NA</Avatar.Fallback> </Avatar> <Avatar> <Avatar.Fallback xstyle={s.gradientFallback}>GB</Avatar.Fallback> </Avatar> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Customization
Custom Image Component
Use asChild on Avatar.Image to compose with a custom image component. This example uses Next.js Image for optimized loading. Pass src on Avatar.Image so it can track the loading state and show the fallback until the image is ready.
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Avatar } from "@lenso/ui";import Image from "next/image";
const SRC = "https://heroui-assets.nyc3.cdn.digitaloceanspaces.com/avatars/blue.jpg";
export function CustomImageComponent() { return ( <Avatar> <Avatar.Image alt="John Doe" height={40} src={SRC} width={40} render={<Image alt="John Doe" src={SRC} height={40} width={40} unoptimized />} /> <Avatar.Fallback>JD</Avatar.Fallback> </Avatar> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Tailwind CSS
"use client";// Adapted from HeroUI v3.2.6 (e385ac202b2cdb94b1bf6fa76d32c31c8259cc5e), Apache-2.0.import { Avatar } from "@lenso/ui";import { s } from "../card/display.stylex";
export function CustomStyles() { return ( <Avatar xstyle={s.roundLg}> <Avatar.Image alt="John Doe" src="https://img.heroui.chat/image/avatar?w=400&h=400&u=3" /> <Avatar.Fallback xstyle={s.roundLg}>JD</Avatar.Fallback> </Avatar> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
Global CSS
To customize the Avatar component classes, you can use the @layer components directive.
Learn more.
@layer components { .avatar { @apply size-16 border-2 border-accent; }
.avatar__fallback { @apply bg-gradient-to-br from-purple-500 to-pink-500; }}Styling Reference
HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
CSS Classes
The Avatar component uses these CSS classes (View source styles):
Base Classes [!toc]
.avatar- Base container with default size (size-10).avatar__image- Image element with aspect-square sizing.avatar__fallback- Fallback container with centered content
Size Modifiers [!toc]
.avatar--sm- Small avatar (size-8).avatar--md- Medium avatar (default, no additional styles).avatar--lg- Large avatar (size-12)
Variant Modifiers [!toc]
.avatar--soft- Soft variant with lighter background
Color Modifiers [!toc]
.avatar__fallback--default- Default text color.avatar__fallback--accent- Accent text color.avatar__fallback--success- Success text color.avatar__fallback--warning- Warning text color.avatar__fallback--danger- Danger text color
API Reference
Avatar
| Prop | Type | Default | Description |
|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'md' | Avatar size |
color | 'default' | 'accent' | 'success' | 'warning' | 'danger' | 'default' | Fallback color theme |
variant | 'default' | 'soft' | 'default' | Visual style variant |
className | string | - | Additional CSS classes |
Avatar.Image
| Prop | Type | Default | Description |
|---|---|---|---|
src | string | - | Image source URL |
srcSet | string | - | The image srcset attribute for responsive images |
sizes | string | - | The image sizes attribute for responsive images |
alt | string | - | Alternative text for the image |
asChild | boolean | false | Merge props onto the child element (e.g. next/image) instead of rendering a native img |
onLoad | (event: SyntheticEvent<HTMLImageElement>) => void | - | Callback when the image loads successfully |
onError | (event: SyntheticEvent<HTMLImageElement>) => void | - | Callback when there's an error loading the image |
crossOrigin | 'anonymous' | 'use-credentials' | - | CORS setting for the image request |
loading | 'eager' | 'lazy' | - | Native lazy loading attribute |
className | string | - | Additional CSS classes |
Avatar.Fallback
| Prop | Type | Default | Description |
|---|---|---|---|
delayMs | number | - | Delay before showing fallback (prevents flash) |
color | 'default' | 'accent' | 'success' | 'warning' | 'danger' | - | Override color from parent |
className | string | - | Additional CSS classes |