Import the public components from the published package entrypoint.

avatar.ts
import { KuiAvatar, KuiAvatarGroup } from '@kikita-labs/ui';

kui-avatar renders an image first, falls back to initials derived from name, then falls back to an icon when no initials are available.

Nikita Repin, online
<div class="basic-avatar-example">
  <kui-avatar src="https://i.pravatar.cc/64?img=12" name="Nikita Repin" status="online" />
  <kui-avatar name="Anya Murashova" />
  <kui-avatar />
</div>

size uses the shared Kikita size scale from xs to 2xl. shape defaults to circle for people; use square for bots, teams, channels, and other entities.

<div class="avatar-sizes-shapes-example">
  <div class="avatar-sizes-shapes-example__row">
    <kui-avatar name="Nikita Repin" size="xs" />
    <kui-avatar name="Nikita Repin" size="sm" />
    <kui-avatar name="Nikita Repin" size="md" />
    <kui-avatar name="Nikita Repin" size="lg" />
    <kui-avatar name="Nikita Repin" size="xl" />
    <kui-avatar name="Nikita Repin" size="2xl" />
  </div>
  <div class="avatar-sizes-shapes-example__row">
    <kui-avatar name="Design Bot" shape="square" />
    <kui-avatar name="Release Team" shape="square" size="lg" />
  </div>
</div>

status renders a decorative presence dot and appends the presence text to the avatar accessible label.

<div class="avatar-status-example">
  <kui-avatar name="Nikita Repin" status="online" />
  <kui-avatar name="Anya Murashova" status="away" />
  <kui-avatar name="Timur Ognev" status="busy" />
  <kui-avatar name="Vera Saltykova" status="offline" />
</div>

kui-avatar-group renders a stack of avatars and collapses items beyond max into a +N overflow avatar with an accessible label such as '2 more'.

Nikita Repin, online +1
<div class="avatar-group-example">
  <kui-avatar-group [avatars]="members" [max]="4" size="sm" label="Project participants" />
</div>

kui-avatar is not clickable itself. Wrap it in a native button when the avatar needs to open a profile or menu.

<div class="avatar-button-example">
  <button class="kui-avatar-action" type="button" aria-label="Open Nikita Repin profile">
    <kui-avatar src="https://i.pravatar.cc/64?img=12" name="Nikita Repin" />
  </button>
</div>

Set defaults.avatar once for the application or for a subtree. Each option resolves as local input > defaults.avatar.<option> > built-in default.

import { provideKikitaUi } from '@kikita-labs/ui';

export const appConfig: ApplicationConfig = {
  providers: [
    provideKikitaUi({
      defaults: {
        avatar: {
          /* options below */
        },
      },
    }),
  ],
};
NameTypeDefaultDescription
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' — Component size. Takes precedence over the global defaults.size.
shape'circle' | 'square' — Default shape.
NameTypeDefaultDescription
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' — Component size. Takes precedence over the global defaults.size.
shape'circle' | 'square' — Default shape.
maxnumber — Maximum avatars shown before the overflow counter.

Set any of these on the component or an ancestor to restyle one part. Each token is optional: when it is not set, the part uses the role or scale token in the default column.

NameTypeDefaultDescription
--kui-avatar-status-radiusCSS custom property--kui-radius-fullStatus corner radius

Every text the component owns (accessible names, visible words, announcements) is a typed message with an English default. Override it for the application with provideKikitaUi({ messages }), or for a subtree with provideKuiMessages.

The status words are appended to the accessible name of an avatar with a status, and the group label and overflow text come from the avatarGroup messages. The label input of the group is undefined when omitted.

app.config.ts
provideKikitaUi({
  messages: {
    avatar: { statusOnline: 'available' },
    avatarGroup: { overflow: ({ count }) => '+' + count },
  },
});
NameTypeDefaultDescription
fallbackstring — Name used when the avatar has no alt, name or initials. Default Avatar.
statusOnlinestring — Status word for online. Default online.
statusAwaystring — Status word for away. Default away.
statusBusystring — Status word for busy. Default busy.
statusOfflinestring — Status word for offline. Default offline.
withStatusKuiMessageFn<{ label: string; status: string; }> — Name with its status appended. Default {label}, {status}.
NameTypeDefaultDescription
labelstring — Accessible name of the group. Default Avatar group.
overflowKuiMessageFn<{ count: number; }> — Overflow chip text. Default {count} more.

Inputs, provider defaults, messages and tokens verified against @kikita-labs/ui v2.0.0 public typings.

NameTypeDefaultDescription
srcstring | undefinedundefinedImage URL. Falls back to initials, then the icon fallback, on load error.
namestring | undefinedundefinedUsed to derive initials, the palette hash, and the accessible label.
initialsstring | undefinedautoExplicit one or two character initials, overriding the value derived from name.
altstring | undefinednameImage alt text and accessible label override.
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''md'Fixed avatar size. Falls back to defaults.avatar.size, then the global defaults.size.
shape'circle' | 'square''circle'circle is intended for people; square is intended for entities such as bots, teams, or projects. Falls back to defaults.avatar.shape.
status'online' | 'away' | 'busy' | 'offline' | undefinedundefinedOptional presence indicator. Appended to the accessible label; the dot itself is decorative.
paletteIndexnumber | undefinedautoPalette slot from 1 to 7 used for the fallback background and text color. A static numeric attribute is coerced and finite values clamp to 1-7.
loadingbooleanfalseRenders the avatar using the internal [kuiSkeleton] loading treatment and hides avatar content.
kui-avatar-group avatarsreadonly KuiAvatarItem[][]Items rendered by the group. Each item accepts the same fields as kui-avatar.
kui-avatar-group maxnumber4Maximum visible avatars before the group collapses the rest into a +N overflow avatar. Falls back to defaults.avatarGroup.max; a static numeric attribute is coerced, and an invalid or less-than-one value resolves to 1.
kui-avatar-group sizeKuiAvatarSize'md'Size applied to every avatar in the group, including the overflow avatar. Falls back to defaults.avatarGroup.size, then the global defaults.size.
kui-avatar-group shapeKuiAvatarShape'circle'Shape applied to every avatar in the group, including the overflow avatar. Falls back to defaults.avatarGroup.shape.
kui-avatar-group labelstring | undefined'Avatar group'Accessible label for the group container. Undefined when omitted: the rendered text comes from the avatarGroup.label message.
.kui-avatar-actionCSS class-Applied to an external native button wrapping a kui-avatar to make it interactive. kui-avatar itself must not be made clickable.
KuiAvatarIteminterface-Item of kui-avatar-group avatars: the same fields as kui-avatar (src, name, initials, alt, status, paletteIndex).
KuiAvatarOptions / KuiAvatarGroupOptionsinterfaces-Shapes of defaults.avatar (size, shape) and defaults.avatarGroup (size, shape, max).
KuiAvatarMessages / KuiAvatarGroupMessagesinterfaces-Typed messages of the avatar (fallback name, status words, name with status) and of the group (label, overflow text).

Avatar exposes accessible names automatically and keeps interactive behavior on native elements.

  • Image avatars render a native <img> with alt derived from alt, then name.
  • Initials and icon fallback avatars expose role="img" and aria-label.
  • Status is appended to the accessible label, for example Nikita Repin, online. The status dot itself is decorative.
  • Interactive avatars must use a native <button class="kui-avatar-action"> wrapper with its own aria-label. Do not make kui-avatar itself clickable.
  • Avatar group overflow exposes a +N avatar with an accessible label such as 2 more.

Consumer-visible changes of @kikita-labs/ui 2.0 for avatars.

  • The classes are KuiAvatar and KuiAvatarGroup (they had a Component suffix). ng update @kikita-labs/ui renames the imports.
  • Size, shape and the group's maximum come from defaults.avatar and defaults.avatarGroup; the inputs are undefined when omitted.
  • Static numeric attributes (paletteIndex, max) are coerced, and an invalid group maximum falls back to a safe value instead of reaching the markup.
  • Avatar text moved to messages, so translations go through the messages option of provideKikitaUi instead of per-instance inputs.