Base

Avatar

Avatar displays a profile image when available and automatically falls back to initials derived from `name`, or to `children` when provided.

Installation

npx shadcn add https://rck.vibeboxph.com//r/avatar.json

Live preview & controls

DU
Controls
<Avatar name="Demo user" src="/avatar.png" />

Anatomy

  • AvatarThe circular container, image, and initials fallback.

Props

PropTypeDefaultDescription
name*stringPerson's name — drives auto initials and default image alt text.
srcstringProfile image URL. When missing or broken, initials or children are shown.
altstringImage alt text. Defaults to `name`.
classNamestringSize and shape overrides via Tailwind (default `size-10`).
childrenReactNodeOptional fallback override when the image is unavailable.

Accessibility

  • Image alt text defaults to `name` — override with `alt` when needed.
  • Fallback initials are visible text — ensure they uniquely identify the user in context.
  • Decorative avatar stacks should mark redundant images `alt=""` and rely on adjacent visible names.

Source

registry/rck/ui/avatar.tsx
"use client";

import * as React from "react";
import * as AvatarPrimitive from "@/registry/rck/primitives/avatar";
import { cn, getInitials } from "@/lib/utils";

export interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {
  /** Person's name — drives auto initials and default image alt text. */
  name: string;
  /** Profile image URL. When missing or broken, initials or children are shown. */
  src?: string;
  /** Image alt text. Defaults to `name`. */
  alt?: string;
}

export const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(
  ({ className, name, src, alt, children, ...props }, ref) => {
    const [loaded, setLoaded] = React.useState(false);
    const [failed, setFailed] = React.useState(false);

    React.useEffect(() => {
      setLoaded(false);
      setFailed(false);
    }, [src]);

    const showImage = Boolean(src) && loaded && !failed;
    const fallbackContent = children ?? getInitials(name);

    return (
      <AvatarPrimitive.Root
        ref={ref}
        data-slot="avatar"
        className={cn(
          "bg-surface-2 relative flex size-10 shrink-0 overflow-hidden rounded-full",
          className,
        )}
        {...props}
      >
        {src ? (
          <AvatarPrimitive.Image
            data-slot="avatar-image"
            src={src}
            alt={alt ?? name}
            className={cn("aspect-square size-full object-cover", !showImage && "hidden")}
            onLoad={() => setLoaded(true)}
            onError={() => setFailed(true)}
          />
        ) : null}
        <AvatarPrimitive.Fallback
          data-slot="avatar-fallback"
          className={cn(
            "bg-muted text-muted-foreground flex size-full items-center justify-center rounded-full text-sm font-medium",
            showImage && "hidden",
          )}
        >
          {fallbackContent}
        </AvatarPrimitive.Fallback>
      </AvatarPrimitive.Root>
    );
  },
);
Avatar.displayName = "Avatar";

Related examples

Browse the full examples gallery