avatar

An image element with a fallback for representing the user.

PreviousNext
RS Rick Sanchez LG @Luizgomess
RS Rick Sanchez SR @srizzon MR @ribeiromatheuss+3
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarGroupCountComponent } from '@/shared/components/avatar/avatar-group-count.component';
import { ZardAvatarGroupComponent } from '@/shared/components/avatar/avatar-group.component';
import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-preview',
  imports: [ZardAvatarComponent, ZardAvatarGroupComponent, ZardAvatarGroupCountComponent],
  template: `
    <div class="flex flex-row flex-wrap items-center gap-6 md:gap-12">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zAlt="Rick Sanchez" zFallback="RS" class="grayscale" />
      <z-avatar
        zSrc="https://github.com/Luizgomess.png"
        zAlt="@Luizgomess"
        zFallback="LG"
        [zShowBadge]="true"
        zBadgeClass="bg-green-600 dark:bg-green-800"
      />
      <z-avatar-group class="grayscale">
        <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zAlt="Rick Sanchez" zFallback="RS" />
        <z-avatar zSrc="https://github.com/srizzon.png" zAlt="@srizzon" zFallback="SR" />
        <z-avatar zSrc="https://github.com/ribeiromatheuss.png" zAlt="@ribeiromatheuss" zFallback="MR" />
        <z-avatar-group-count [zCount]="3" />
      </z-avatar-group>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarPreviewComponent {}

Installation

Copy
npx zard-cli@latest add avatar

Usage

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';
Copy
<z-avatar zSrc="https://github.com/shadcn.png" zAlt="@shadcn"></z-avatar>
Copy

Examples

basic

Set zSrc for the image and zFallback for the text shown while it loads or if it errors.
ZA ZA
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-basic',
  imports: [ZardAvatarComponent],
  template: `
    <div class="mb-4 flex gap-3">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="ZA" />
      <z-avatar zSrc="error-image.png" zFallback="ZA" />
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarBasicComponent {}

sizes

zSize accepts sm (24px), default (32px) and lg (40px).
SM sm — 24px
MD default — 32px
LG lg — 40px
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-sizes',
  imports: [ZardAvatarComponent],
  template: `
    <div class="flex items-end gap-6">
      <div class="flex flex-col items-center gap-2">
        <z-avatar zSize="sm" zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="SM" />
        <span class="text-muted-foreground text-xs">sm — 24px</span>
      </div>
      <div class="flex flex-col items-center gap-2">
        <z-avatar zSize="default" zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="MD" />
        <span class="text-muted-foreground text-xs">default — 32px</span>
      </div>
      <div class="flex flex-col items-center gap-2">
        <z-avatar zSize="lg" zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="LG" />
        <span class="text-muted-foreground text-xs">lg — 40px</span>
      </div>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarSizesComponent {}

badge

Set zShowBadge and zBadgeClass to render a status dot in the corner.
Online
Away
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-badge',
  imports: [ZardAvatarComponent],
  template: `
    <div class="flex gap-3">
      <z-avatar
        [zShowBadge]="true"
        zSrc="/images/avatar/imgs/avatar_image.jpg"
        zAlt="Online"
        zBadgeClass="bg-green-600 dark:bg-green-500"
      />
      <z-avatar
        [zShowBadge]="true"
        zSrc="/images/avatar/imgs/avatar_image.jpg"
        zAlt="Away"
        zBadgeClass="bg-yellow-500 dark:bg-yellow-600"
      />
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarBadgeComponent {}

badge with icon

Pass an icon name to zBadgeIcon to render it inside the badge instead of a plain dot.
Verified user
New member
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { provideIcons } from '@ng-icons/core';
import { lucideBadgeCheck, lucidePlus } from '@ng-icons/lucide';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-badge-with-icon',
  imports: [ZardAvatarComponent],
  template: `
    <div class="flex gap-3">
      <z-avatar
        [zShowBadge]="true"
        zSrc="/images/avatar/imgs/avatar_image.jpg"
        zAlt="Verified user"
        zBadgeIcon="lucideBadgeCheck"
        zBadgeClass="bg-blue-600 dark:bg-blue-700"
      />
      <z-avatar
        class="grayscale"
        [zShowBadge]="true"
        zSrc="/images/avatar/imgs/avatar_image.jpg"
        zAlt="New member"
        zBadgeIcon="lucidePlus"
      />
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideBadgeCheck, lucidePlus })],
})
export class ZardDemoAvatarBadgeWithIconComponent {}

group

Wrap avatars in z-avatar-group; zOrientation switches between a horizontal and vertical stack.
JD SA LU JD SA LU
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarGroupComponent } from '@/shared/components/avatar/avatar-group.component';
import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-group',
  imports: [ZardAvatarComponent, ZardAvatarGroupComponent],
  template: `
    <div class="flex flex-col gap-4">
      <z-avatar-group class="grayscale">
        <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="JD" />
        <z-avatar zSrc="https://github.com/srizzon.png" zFallback="SA" />
        <z-avatar zSrc="https://github.com/Luizgomess.png" zFallback="LU" />
      </z-avatar-group>

      <z-avatar-group zOrientation="vertical" class="grayscale">
        <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="JD" />
        <z-avatar zSrc="https://github.com/srizzon.png" zFallback="SA" />
        <z-avatar zSrc="https://github.com/Luizgomess.png" zFallback="LU" />
      </z-avatar-group>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarGroupComponent {}

group with icon

A group member can carry an icon badge via zBadgeIcon to call out a role, such as a verified owner.
JD SA LU
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { provideIcons } from '@ng-icons/core';
import { lucideBadgeCheck } from '@ng-icons/lucide';

import { ZardAvatarGroupComponent } from '@/shared/components/avatar/avatar-group.component';
import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-group-with-icon',
  imports: [ZardAvatarComponent, ZardAvatarGroupComponent],
  template: `
    <z-avatar-group class="grayscale">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="JD" />
      <z-avatar zSrc="https://github.com/srizzon.png" zFallback="SA" />
      <z-avatar
        zSrc="https://github.com/Luizgomess.png"
        zFallback="LU"
        [zShowBadge]="true"
        zBadgeIcon="lucideBadgeCheck"
        zBadgeClass="bg-blue-600 dark:bg-blue-700"
      />
    </z-avatar-group>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideBadgeCheck })],
})
export class ZardDemoAvatarGroupWithIconComponent {}

group count

Append z-avatar-group-count with zCount to show how many more members the stack does not display.
JD SA LU +3
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarGroupCountComponent } from '@/shared/components/avatar/avatar-group-count.component';
import { ZardAvatarGroupComponent } from '@/shared/components/avatar/avatar-group.component';
import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';

@Component({
  selector: 'z-demo-avatar-group-count',
  imports: [ZardAvatarComponent, ZardAvatarGroupComponent, ZardAvatarGroupCountComponent],
  template: `
    <z-avatar-group class="grayscale">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="JD" />
      <z-avatar zSrc="https://github.com/srizzon.png" zFallback="SA" />
      <z-avatar zSrc="https://github.com/Luizgomess.png" zFallback="LU" />
      <z-avatar-group-count [zCount]="3" />
    </z-avatar-group>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarGroupCountComponent {}

dropdown

Use an avatar as a [z-dropdown] trigger to open a z-dropdown-menu-content with account actions.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';
import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-avatar-dropdown',
  imports: [ZardDropdownImports, ZardButtonComponent, ZardAvatarComponent],
  template: `
    <button type="button" z-button zType="ghost" class="size-10 rounded-full p-0" z-dropdown [zDropdownMenu]="menu">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="ZA" zAlt="User avatar" />
    </button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>
        <div class="flex flex-col space-y-1">
          <p class="text-sm leading-none font-medium">Zard User</p>
          <p class="text-muted-foreground text-xs leading-none">user@zardui.com</p>
        </div>
      </z-dropdown-menu-label>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Profile')">Profile</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">Billing</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">Settings</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Log out')">Log out</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarDropdownComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

rtl

To enable RTL support in zard/ui, see the RTL configuration guide.
RS مستخدم LG
RS مستخدم SR MR +3
// You will notice this example is rendered inside a wrapper that sets the dir and data-lang attributes, and
// reads its text from a translations helper. This is because this site is not RTL by default.
// In your application you won't need either: set dir="rtl" on <html> (or use the CDK Dir directive on a subtree)
// and write the text of your own language. See the RTL guide: https://zardui.com/docs/rtl

import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarGroupCountComponent } from '@/shared/components/avatar/avatar-group-count.component';
import { ZardAvatarGroupComponent } from '@/shared/components/avatar/avatar-group.component';
import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';
import { injectRtlTranslation, type ZardRtlTranslations } from '@/shared/demo-utils/rtl-translation';

const translations: ZardRtlTranslations<{ online: string; user: string }> = {
  en: { dir: 'ltr', values: { online: 'Online', user: 'User' } },
  ar: { dir: 'rtl', values: { online: 'متصل', user: 'مستخدم' } },
  he: { dir: 'rtl', values: { online: 'מחובר', user: 'משתמש' } },
};

@Component({
  selector: 'z-demo-avatar-rtl',
  imports: [ZardAvatarComponent, ZardAvatarGroupComponent, ZardAvatarGroupCountComponent],
  template: `
    <div class="flex flex-row flex-wrap items-center gap-6 md:gap-12">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" [zAlt]="i18n.t().user" zFallback="RS" class="grayscale" />
      <z-avatar
        zFallback="LG"
        [zAlt]="i18n.t().online"
        [zShowBadge]="true"
        zBadgeClass="bg-green-600 dark:bg-green-800"
      />
      <z-avatar-group class="grayscale">
        <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" [zAlt]="i18n.t().user" zFallback="RS" />
        <z-avatar zFallback="SR" />
        <z-avatar zFallback="MR" />
        <z-avatar-group-count [zCount]="3" />
      </z-avatar-group>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoAvatarRtlComponent {
  protected readonly i18n = injectRtlTranslation(translations);
}

API Reference

z-avatarComponent

An image element with a fallback for representing the user.

PropertyDescriptionTypeDefault
[class] Additional CSS classes string ''
[zAlt] Image alt text for accessibility string ''
[zFallback] Fallback text displayed while loading or on error string ''
[zPriority] Should image load with high priority boolean false
[zSize] Avatar size variant 'sm' | 'default' | 'lg' 'default'
[zSrc] Image source URL string | SafeUrl ''
[zShowBadge] Show avatar badge boolean false
[zBadgeClass] Additional avatar badge classes ClassValue ''
[zBadgeIcon] Avatar badge icon string ''

z-avatar-groupComponent

A group container for displaying multiple avatars. The overlap stacks toward the inline end, so it mirrors in RTL.

PropertyDescriptionTypeDefault
[zOrientation] Layout direction of avatars 'horizontal' | 'vertical' 'horizontal'
[class] Additional CSS classes string ''

z-avatar-group-countComponent

A "+N" chip for the members a `z-avatar-group` stack does not show.

PropertyDescriptionTypeDefault
[zCount] Number of additional members represented by the chip number 0
[zSize] Chip size variant, matching the sibling avatars 'sm' | 'default' | 'lg' 'default'
[class] Additional CSS classes string ''
github iconwhatsapp icondiscord iconX icon

Made with ❤ in Brazil. Open source and available on GitHub .