Basic UI
  • Docs
  • Compressor
  • Parser
Getting Started
  • Introduction
  • Themenew
Components
  • Button
  • Button Group
  • Badge
  • Radio Group
  • Checkbox
  • Avatar
  • Label
  • File Dropzone
  1. Docs/
  2. Components/
  3. Avatar

Avatar

Previous pageNext page

Displays a user representation using an image, initials, or icon with optional online status and grouped presentation.

Loading...

Installation

pnpm dlx shadcn@latest add @basic-ui/avatar

Usage

Previous
Checkbox
Next
Label

On This Page

InstallationUsageExamplesAvatar SizesPropsAvatarAvatarList
avatar-default
"use client" import { Avatar, AvatarList } from '@/registry/basic-ui/avatar'; const STACKED_AVATARS = [ { src: 'https://images.unsplash.com/photo-1531891437562-4301cf35b7e4?auto=format&fit=facearea&w=160&h=160&q=80', alt: 'Ada Lovelace', online: true, }, { src: 'https://images.unsplash.com/photo-1544723795-3fb6469f5b39?auto=format&fit=facearea&w=160&h=160&q=80', alt: 'Linus Torvalds', }, { src: 'https://picsum.photos/160/160?random=1', alt: 'Random Image', }, { src: 'https://picsum.photos/160/160?random=2', alt: 'Random Image', }, { src: 'https://picsum.photos/160/160?random=3', alt: 'Random Image', }, { text: 'BU', }, { text: 'DS', online: true, }, { text: 'MJ', }, ]; export default function AvatarDefault() { return ( <div className="flex flex-col gap-(--gap-6)"> <div className="flex flex-wrap items-center gap-(--gap-4)"> <Avatar size="3xl" src="https://images.unsplash.com/photo-1521572267360-ee0c2909d518?auto=format&fit=facearea&w=160&h=160&q=80" alt="Taylor Jensen" online /> <Avatar size="3xl" text="BU" /> <Avatar size="3xl" /> </div> <div className="flex flex-wrap items-center gap-(--gap-4)"> <Avatar size="m" text="UX" online /> <Avatar size="m" /> </div> <div className="flex flex-col gap-(--gap-2)"> <p className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-2)"> Avatar List </p> <AvatarList size="xl" items={STACKED_AVATARS} max={5} aria-label="Team members" /> </div> </div> ); }

Examples

Avatar Sizes

Loading...

Props

Avatar

PropTypeDefaultRequiredDescription
srcstring–YesImage source for the avatar.
altstring–YesAccessible label for the avatar image.
textstring–NoText rendered when no image is provided.
iconReactNode–NoCustom icon rendered when no image or fallback text is provided.
size"xs" | "s" | "m" | "l" | "xl" | "2xl" | "3xl" | "4xl" | "5xl""xl"NoNo
onlinebooleanfalseNoDisplays the online status indicator.

AvatarList

PropTypeDefaultRequiredDescription
itemsAvatarListItem[]–YesCollection of avatars to render.
maxnumberitems.lengthNoMaximum avatars to display before collapsing into a counter.
size"xs" | "s" | "m" | "l" | "xl" | "2xl" | "3xl" | "4xl" | "5xl""xl"NoShared size for all avatars in the list.
aria-labelstring–NoAccessible label describing the avatar list contents.
Taylor Jensen
BU
UX

Avatar List

Ada Lovelace
Linus Torvalds
Random Image
Random Image
Random Image
+3
avatar-size

Text Avatar Sizes

BU
BU
BU
BU
BU
BU
BU
BU
BU

Text Avatar with Online Status

BU
5xl
BU
4xl
BU
3xl
BU
2xl
BU
xl
BU
l
BU
m
BU
s
BU
xs

Icon Avatar Sizes

Icon Avatar with Online Status

5xl
4xl
3xl
2xl
xl
l
m
s
xs

Image Avatar Sizes

Avatar
Avatar
Avatar
Avatar
Avatar
Avatar
Avatar
Avatar
Avatar

Image Avatar with Online Status

Avatar
5xl
Avatar
4xl
Avatar
3xl
Avatar
2xl
Avatar
xl
Avatar
l
Avatar
m
Avatar
s
Avatar
xs
'use client';

import { Avatar, AvatarList } from '@/registry/basic-ui/avatar';

const STACKED_AVATARS = [
  {
    src: 'https://images.unsplash.com/photo-1531891437562-4301cf35b7e4?auto=format&fit=facearea&w=160&h=160&q=80',
    alt: 'Ada Lovelace',
    online: true,
  },
  {
    src: 'https://images.unsplash.com/photo-1544723795-3fb6469f5b39?auto=format&fit=facearea&w=160&h=160&q=80',
    alt: 'Linus Torvalds',
  },
  {
    src: 'https://picsum.photos/160/160?random=1',
    alt: 'Random Image',
  },
  {
    src: 'https://picsum.photos/160/160?random=2',
    alt: 'Random Image',
  },
  {
    src: 'https://picsum.photos/160/160?random=3',
    alt: 'Random Image',
  },
  {
    text: 'BU',
  },
  {
    text: 'DS',
    online: true,
  },
  {
    text: 'MJ',
  },
];

export function AvatarDefault() {
  return (
    <div className="flex flex-col gap-(--gap-6)">
      <div className="flex flex-wrap items-center gap-(--gap-4)">
        <Avatar
          size="3xl"
          src="https://images.unsplash.com/photo-1521572267360-ee0c2909d518?auto=format&fit=facearea&w=160&h=160&q=80"
          alt="Taylor Jensen"
          online
        />
        <Avatar size="3xl" text="BU" />
        <Avatar size="3xl" />
      </div>

      <div className="flex flex-wrap items-center gap-(--gap-4)">
        <Avatar size="m" text="UX" online />
        <Avatar size="m" />
      </div>

      <div className="flex flex-col gap-(--gap-2)">
        <p className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-2)">
          Avatar List
        </p>
        <AvatarList
          size="xl"
          items={STACKED_AVATARS}
          max={5}
          aria-label="Team members"
        />
      </div>
    </div>
  );
}
'use client';

import { Avatar } from '@/registry/basic-ui/avatar';

export function AvatarSize() {
  const sizes: Array<
    'xs' | 's' | 'm' | 'l' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl'
  > = ['5xl', '4xl', '3xl', '2xl', 'xl', 'l', 'm', 's', 'xs'];

  return (
    <div className="flex flex-col gap-(--gap-8)">
      {/* Text Avatar Sizes */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Text Avatar Sizes
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar size={size} text="BU" />
            </div>
          ))}
        </div>
      </div>

      {/* Text Avatar with Online Indicator */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Text Avatar with Online Status
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar size={size} text="BU" online />
              <span className="text-[length:--font-size/body/12] text-(--grey-text-alpha-3-hover)">
                {size}
              </span>
            </div>
          ))}
        </div>
      </div>

      {/* Icon Avatar Sizes */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Icon Avatar Sizes
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar size={size} />
            </div>
          ))}
        </div>
      </div>

      {/* Icon Avatar with Online Indicator */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Icon Avatar with Online Status
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar size={size} online />
              <span className="text-[length:--font-size/body/12] text-(--grey-text-alpha-3-hover)">
                {size}
              </span>
            </div>
          ))}
        </div>
      </div>

      {/* Image Avatar Sizes */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Image Avatar Sizes
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar
                size={size}
                src="https://images.unsplash.com/photo-1521572267360-ee0c2909d518?auto=format&fit=facearea&w=160&h=160&q=80"
                alt="Avatar"
              />
            </div>
          ))}
        </div>
      </div>

      {/* Image Avatar with Online Indicator */}
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-[length:--font-size/body/16] font-medium text-(--grey-text-alpha-1-default)">
          Image Avatar with Online Status
        </h3>
        <div className="flex flex-wrap items-end gap-(--gap-4)">
          {sizes.map((size) => (
            <div
              key={size}
              className="flex flex-col items-center gap-(--gap-2)"
            >
              <Avatar
                size={size}
                src="https://images.unsplash.com/photo-1521572267360-ee0c2909d518?auto=format&fit=facearea&w=160&h=160&q=80"
                alt="Avatar"
                online
              />
              <span className="text-[length:--font-size/body/12] text-(--grey-text-alpha-3-hover)">
                {size}
              </span>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}