Avatar

Компонент для отображения аватара: изображение по URL с fallback на инициалы из имени, несколько размеров и форм (круг / квадрат), палитра фонов.

Демо

Preview
J
Prop
Type
Value
appearance
neutral | red | orange | yellow | green | blue | violet | pink
badge
text
children
text
data-test-id
text
name
text
shape
rounded | squared
showTwoSymbols
boolean
size
xs | s | m | l | 3xl | 6xl | 9xl
src
text
status
blue | green | neutral | orange | pink | red | violet | yellow
Code
<Avatar appearance="neutral" shape="rounded" showTwoSymbols={false} size="s" name="Jane Doe" />

Когда использовать

  • Идентификатор пользователя в хедере, меню, списке участников.
  • Автор комментария, сообщения, коммита.
  • Плейсхолдер для отсутствующего фото — инициалы из имени.

Когда не нужен Avatar: если требуется декоративная иконка или логотип бренда — используйте обычный <img> или иконку.

Анатомия

Size

Размерный ряд аватара: xs/s — для плотных списков и тулбаров, m — дефолт в рядах, l — карточки пользователей, 3xl/6xl/9xl — крупные профили и пустые состояния.

Shape

Форма контейнера: rounded — круглый (по умолчанию для людей), squared — со скруглёнными углами (команды, организации, боты).

Appearance

Цвет фона под инициалами. Помимо нейтрального neutral есть декоративные red, orange, yellow, green, blue, violet, pink — используются для стабильной окраски по id пользователя, не несут семантики.

Badge

Слот для микро-индикатора в правом-нижнем углу аватара. Принимает любой ReactNode:

  • StatusIndicator — задаётся коротким пропом status (компонент сам подбирает размер).
  • Counter — счётчик уведомлений.
  • Иконка-«verified» / собственный микро-компонент — через badge={<...>}.

Для визуальной парности с дефолтным StatusIndicator бери размер из публичной карты AVATAR_TO_STATUS_INDICATOR_SIZE[size].

Установка

pnpm add @cloud-ru/ds-avatar
import { Avatar, APPEARANCE, SHAPE, SIZE } from '@cloud-ru/ds-avatar'

Примеры использования

Инициалы из имени

Инициалы из имениFallback на две первые буквы имени.
И
tsx
import { Avatar } from '@cloud-ru/ds-avatar';

export function Initials() {
  return <Avatar name='Иван Петров' />;
}

С изображением

С изображением`src` + `name` для alt-текста и fallback.
tsx
import { Avatar } from '@cloud-ru/ds-avatar';

export function WithImage() {
  return <Avatar src='https://i.pravatar.cc/80?img=12' name='Анна Смирнова' />;
}

Разные размеры

Разные размерыРазмерный ряд от `xs` до `9xl`.
А
А
А
tsx
import { Avatar } from '@cloud-ru/ds-avatar';

export function Sizes() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <Avatar size='s' name='АС' />
      <Avatar size='m' name='АС' />
      <Avatar size='l' name='АС' />
    </div>
  );
}

Кастомный badge-слот

Кастомный badge-слотCounter, иконка-«verified», `status` и ручной `StatusIndicator` в одном слоте.
5
tsx
import { Avatar, AVATAR_TO_STATUS_INDICATOR_SIZE, SIZE } from '@cloud-ru/ds-avatar';
import { Counter, SIZE as COUNTER_SIZE } from '@cloud-ru/ds-counter';
import { CheckSVG } from '@cloud-ru/ds-icons/interface/system';
import { APPEARANCE as STATUS_APPEARANCE, StatusIndicator } from '@cloud-ru/ds-status';

import styles from './CustomBadge.module.scss';

export function CustomBadge() {
  return (
    <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap', alignItems: 'center' }}>
      <Avatar
        name='John Doe'
        size={SIZE['6Xl']}
        src='https://i.pravatar.cc/120?img=12'
        badge={<Counter value={5} size={COUNTER_SIZE.S} />}
      />

      <Avatar
        name='Jane Roe'
        size={SIZE['6Xl']}
        src='https://i.pravatar.cc/120?img=47'
        badge={
          <span className={styles.verified}>
            <CheckSVG size={16} />
          </span>
        }
      />

      <Avatar
        name='Alex Roe'
        size={SIZE['6Xl']}
        src='https://i.pravatar.cc/120?img=8'
        status={STATUS_APPEARANCE.Green}
      />

      <Avatar
        name='Mia Roe'
        size={SIZE['6Xl']}
        src='https://i.pravatar.cc/120?img=20'
        badge={
          <StatusIndicator size={AVATAR_TO_STATUS_INDICATOR_SIZE[SIZE['6Xl']]} appearance={STATUS_APPEARANCE.Red} />
        }
      />
    </div>
  );
}

Props

Types

PropsAvatarProps
PropTypeDefaultRequiredDescription
appearance"blue" | "green" | "neutral" | "orange" | "pink" | "red" | "violet" | "yellow"neutralnoВнешний вид (цвет)
badgeReactNodenoПроизвольный нод в слот значка (правый-нижний угол). Перекрывает `status`.
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefinedno
classNamestringnoCSS-класс
data-test-idstringno
innerRefRef<HTMLDivElement>noRef на корневой DOM-элемент. Используем явный проп, чтобы не зависеть от `forwardRef` и не тащить type-assertions на экспорт.
namestringyesИмя пользователя для генерации аббревиатуры
shape"rounded" | "squared"roundednoФорма: круглая или квадратная
showTwoSymbolsbooleanfalsenoОтображение двух заглавных символов имени вместо одного
size"3xl" | "6xl" | "9xl" | "l" | "m" | "s" | "xs"mnoРазмер
srcstringnoURL изображения аватара
status"blue" | "green" | "neutral" | "orange" | "pink" | "red" | "violet" | "yellow"noAppearance дефолтного `StatusIndicator` в правом-нижнем углу. Размер индикатора подбирается из `size` аватара автоматически. Полностью настроить значок можно через слот `badge`, который перекрывает `status`.

Unions

Types

AvatarProps

Unions

Принимает вспомогательные атрибуты data-test-id и ARIA через тип WithSupportProps из @cloud-ru/ds-utils, а также стандартные атрибуты контейнера HTMLDivElement.

Storybook

Figma