Skip to main content

What it is

A small image, initials, or fallback icon that stands for a person or entity, most often at the front of a list row or beside a name. It renders with no Titan-specific decision — every visual property is whatever the underlying element defaults to. Titan has not added a wrapper, an override, or a token to it.

Live example

No Storybook story demonstrates this component. The live index at Titan’s own Chromatic deployment has no avatar entry of any kind, and there is no Avatar.stories.js in source — confirmed by listing components/core/src/components/ in the Titan checkout, where no Avatar directory exists at all. There is nothing to embed.

Exports

Titan has not written a single line of code for this component. Avatar is re-exported directly from the underlying package in src/index.js — no wrapper component, no .overrides.ts, no .stories.js, no .test.tsx, and no theme override entry for this component anywhere in the theme (confirmed by searching the entire theme directory). Every other component in this category — Badge, Card, List, Tag — has at least a theme override behind it. Avatar has none.
Since Titan adds nothing, the real prop surface is whatever the underlying package defines, hand-confirmed from the installed package (v7.3.6) type definitions rather than from anything Titan wrote:
A stacking helper for overlapping avatars — with an overlap and a “+N” overflow chip — is not exported by this package. Titan’s index.js exports only bare Avatar. A stacked group has to be hand-built.

Vocabulary

No aliasing dispute exists here the way it does for Table or Tag — “avatar” is the word code, the design library, and casual conversation all use for this concept.

Choose Avatar when

  • Representing a specific person or entity as a small circular image or initials, most often beside their name in a list row, a comment, or a page header.
  • A photo may or may not be available, and a graceful fallback — initials via children, or a default icon — is acceptable.

Choose something else when

Anatomy

The three fall back in that order: image, then children, then a default icon. Confirmed by reading the underlying element’s own source — the default icon is an internal Person SVG built into the package, not one of Titan’s own Icons.* set. Titan has not swapped it for anything of its own.

Variants, sizes, and states

Titan applies no theme entry, so everything below is an unthemed default with no Titan decision behind it — hand-confirmed against the installed package (v7.3.6), not emitted from any Titan source.

Edge and failure states

Tokens

No Titan token, override, or theme entry exists for Avatar — confirmed by searching the entire theme directory for a theme override entry for this component and finding nothing. Every value below is an unthemed default with no Titan decision behind it, hand-confirmed from the installed package, not from any Titan file.

Composition

Sits inline in a row — a list item’s leading slot, a table cell, a comment header, or beside a name in a page header. List’s own List.overrides.ts themes the list-item-icon slot but has no override entry for a list-item avatar slot either — so an Avatar placed in a list row’s leading slot renders at the underlying element’s own spacing, not a value Titan chose.

Content

Avatar carries no visible label copy of its own beyond alt and children:
  • alt should name the person or entity the image represents — “Photo of Jordan Diaz,” not “avatar” or “user image.”
  • children used as an initials fallback should be one or two characters, drawn from the same name as alt.

Accessibility

  • No role or accessible-name handling is added by Titan — whatever alt a caller supplies on the underlying <img> is what a screen reader gets. Nothing in source enforces that one exists.
  • Unconfirmed: whether the default Person fallback icon is marked aria-hidden. Since Titan has not touched Avatar at all, this is entirely upstream behavior from the underlying package that this page has not independently verified against the installed version’s rendered DOM.
  • This component does not decide whether identifying a person by photo or initials is appropriate for the surface it appears in — that is a per-page content and privacy decision.

Constraints

Known issues

Avatar: open issues

Divergences, open decisions, and undocumented gaps for Avatar.

Why it works this way

There is no Titan decision to explain here, and this page says so rather than inventing one. Badge, Card, and List — the other three components in this category with a real Titan source file behind them — each carry a .overrides.ts translating at least one slot of the underlying element into a theme.vars.tokens[…] value. Avatar has none. Whether that is a considered decision — avatars are always left at the underlying package’s defaults across Invoca products — or simply an oversight is not recorded anywhere this session could find. See Known issues.

Status

Package @invoca/titan-core, version 3.6.3. Export: Avatar, re-exported unmodified from the underlying package. There is no dedicated Titan source file, so no independent version history, deprecation marker, or since field exists for it beyond the package’s own release notes. No utilization data exists for Avatar specifically. utilization.md is generated per Titan component directory in the checkout, and Avatar has none to hold one. Real usage of Avatar certainly exists across Invoca products — it is a normal export available to every consumer of the package — but it is not tracked the way every other component in this category is.
  • Badge — for overlaying a status or count, including on top of an Avatar
  • List — the most common place an Avatar sits, in a row’s leading slot
  • Card — often carries an Avatar near a name in its header area
Last modified on September 7, 2026