Avatar
A server-renderable Blobz avatar with semantic shadcn size, frame, and surface variants.
Rounded
Rounded is the default frame and does not require a frame prop.
View codeHide code
import { DEMO_PEOPLE, getFirstName } from "@/lib/demo-people";
import { BlobAvatar } from "@/components/blobz/avatar";
const BLUE_PALETTE = ["#dff4ff", "#38bdf8"] as const;
export function AvatarExample() {
return (
<div className="flex items-end gap-5">
<BlobAvatar
alt={`${DEMO_PEOPLE.janakiAmmal} avatar`}
name={getFirstName(DEMO_PEOPLE.janakiAmmal)}
palette={BLUE_PALETTE}
size="lg"
/>
<BlobAvatar
alt={`${DEMO_PEOPLE.vikramSarabhai} avatar`}
name={getFirstName(DEMO_PEOPLE.vikramSarabhai)}
palette={BLUE_PALETTE}
size="xl"
variant="outline"
/>
<BlobAvatar
alt={`${DEMO_PEOPLE.kalpanaChawla} avatar`}
name={getFirstName(DEMO_PEOPLE.kalpanaChawla)}
palette={BLUE_PALETTE}
size="lg"
variant="elevated"
/>
</div>
);
}Installation
Register the Blobz registry once in your project, then install:
npx shadcn@latest add @blobz/avatarThis installs @blobz/react, class-variance-authority, and cn when they are not already present.
Usage
import { BlobAvatar } from "@/components/blobz/avatar";
<BlobAvatar
alt="Janaki avatar"
name="Janaki"
size="lg"
variant="outline"
/>Use alt="" when a visible name beside the avatar already identifies the person.
Circle
Use frame="circle" for profile photos, presence lists, and familiar account surfaces.
View codeHide code
import { DEMO_PEOPLE, getFirstName } from "@/lib/demo-people";
import { BlobAvatar } from "@/components/blobz/avatar";
const BLUE_PALETTE = ["#dff4ff", "#38bdf8"] as const;
export function AvatarCircleExample() {
return (
<div className="flex items-center gap-5">
<BlobAvatar
alt={`${DEMO_PEOPLE.janakiAmmal} avatar`}
frame="circle"
name={getFirstName(DEMO_PEOPLE.janakiAmmal)}
palette={BLUE_PALETTE}
size="xl"
/>
<BlobAvatar
alt={`${DEMO_PEOPLE.vikramSarabhai} avatar`}
frame="circle"
name={getFirstName(DEMO_PEOPLE.vikramSarabhai)}
palette={BLUE_PALETTE}
size="xl"
variant="outline"
/>
</div>
);
}Square
Use frame="square" when the avatar needs to align tightly with square media or dense data grids.
View codeHide code
import { DEMO_PEOPLE, getFirstName } from "@/lib/demo-people";
import { BlobAvatar } from "@/components/blobz/avatar";
const BLUE_PALETTE = ["#dff4ff", "#38bdf8"] as const;
export function AvatarSquareExample() {
return (
<div className="flex items-center gap-5">
<BlobAvatar
alt={`${DEMO_PEOPLE.kalpanaChawla} avatar`}
frame="square"
name={getFirstName(DEMO_PEOPLE.kalpanaChawla)}
palette={BLUE_PALETTE}
size="xl"
/>
<BlobAvatar
alt={`${DEMO_PEOPLE.srinivasaRamanujan} avatar`}
frame="square"
name={getFirstName(DEMO_PEOPLE.srinivasaRamanujan)}
palette={BLUE_PALETTE}
size="xl"
variant="outline"
/>
</div>
);
}API
Prop
Type