Avatar

Atom
A photo when the account has one, falling back to one or two initials on an identity disc: the name resolves to one of ten hues (or hue picks one), and the disc is that hue's soft wash under initials in the same hue, so one person keeps one colour on every platform and stays distinct in a stack or list. The initials sit at weight 600, 38% of the disc, and their ink is held to 4.5:1 on the wash in both schemes.

Playground

Every control sets a real prop of AvatarProps. The JSX below updates as you go.
Props
Size
pick one
Shape
pick one
uri
one of
initials
string
hue
number
285
glow
boolean
JSX · AvatarProps
<Avatar circle uri="/ada-lovelace.jpg" initials="AL" hue={285} />

Variants

13 examples from src/atoms/avatar/avatar.md, each rendered live from its own JSX.
A
Brand mark
logo retains the original 30px Argus mark, nine-pixel corners, action-to-ring gradient, 14px extra-bold initial, and selection-colored drop shadow.
<Avatar logo whiteInk initials="A" />
Photo
<Avatar src="/rachel-chen.jpg" name="RC" />
AI
RT
LK
KO
MS
NN
SB
TL
OM
PH
Identity colours
Each name resolves to one of ten hues through a stable hash, so the same person gets the same disc in every session and on every platform, and a list of people spreads across the set. The hue follows name when one is set, else the initials, so pass the full name: two people who share initials then usually get different discs.
<Row snug wrap>
<Avatar name="Ada Ito" />
<Avatar name="Rachel Tanaka" />
<Avatar name="Liang Kim" />
<Avatar name="Kira Okafor" />
<Avatar name="Marcus Singh" />
<Avatar name="Noor Novak" />
<Avatar name="Sofia Bao" />
<Avatar name="Theo Lovelace" />
<Avatar name="Omar Moreau" />
<Avatar name="Priya Haddad" />
</Row>
NP
AL
MA
RC
Sizes
Four steps: tiny (20px), small (28px), the default 40px row avatar, and large (56px). The initials take 38% of the disc (11, 15 and 21px), and 10px on tiny, the kit's smallest type. rounded squares the disc with corners at 28% of its size. small is the disc AvatarMenu builds its capsule around, so a standalone small avatar and the one inside a pill are the same circle. Precedence when several are passed: tiny beats small beats large.
<Row relaxed alignCenter>
<Avatar tiny name="NP" />
<Avatar small name="AL" />
<Avatar name="MA" />
<Avatar large name="RC" />
</Row>
LB
Rounded
<Avatar rounded name="LB" />
AO
Ring outline
<Avatar ring name="AO" />
RC
LB
MA
+1
Stacked
<AvatarGroup max={3}>
<Avatar name="Rachel Chen" />
<Avatar name="Liang Bao" />
<Avatar name="Marcus Allen" />
<Avatar name="Kira Tran" />
</AvatarGroup>
Topbar
A lone avatar as the account trigger: the Dropdown makes the disc its press target, so tapping it opens the account menu, no email or chevron needed.
<Dropdown items={[{ label: "Your profile" }, { label: "Sign out" }]}>
<Avatar small name="MA" />
</Dropdown>
Argus account menu
account preserves the original Argus 32px orchid disc, glow, name and role metrics, and compact menu. triggerLabel names the one press target; menuLabel independently names its menu. Bounds use menuWidth and maxHeight.
<AvatarMenu account name="Bobby" email="Principal Engineer" initials="B" triggerLabel="Viewing as Principal Engineer. Switch role" menuLabel="View as role" menuWidth={300} maxHeight={420} items={[{ label: "Principal Engineer", selected: true }, { label: "Architect" }]} />
Account menu
Built on Dropdown, so in glass mode the menu is Dropdown's dense-layer glass card under the capsule, which keeps its place, its press and its accessible name throughout.
The whole account control in one component. AvatarMenu renders a single capsule trigger (the avatar in the viewer's violet glow ring, the name over the muted email, a chevron) and the account menu itself, with name and email repeated as the menu's own identity header. One press target covers the capsule, so nothing beside it has to be wired up. The capsule is the hand-off's identity pill on every platform: a hairline edge round the popover fill at rest, the accent fill under the pointer and while its menu is open; the menu is each platform's own Dropdown.
<AvatarMenu
name="Rachel Chen"
email="rachel.chen@example.com"
src="/rachel-chen.jpg"
items={[
{ label: "Profile", icon: "user" },
{ label: "Settings", icon: "settings" },
{ label: "Sign out", icon: "logOut", destructive: true, separatorBefore: true }
]}
/>
Compact menu
compact drops the name block for a bar with no room for it, leaving the 28px avatar alone. The identity still travels with the menu, so the name and email head the rows the moment it opens. A topbar parks the pill at the trailing edge, so the menu hangs from that edge by default; alignStart moves it to the leading edge for a pill that sits at the start of a bar.
<AvatarMenu
compact
name="Marcus Allen"
email="admin@example.com"
src="/marcus-allen.jpg"
items={[
{ label: "Profile", icon: "user" },
{ label: "Settings", icon: "settings" },
{ label: "Sign out", icon: "logOut", destructive: true, separatorBefore: true }
]}
/>
Menu alignment
The menu hangs from the pill's trailing edge by default, the edge a topbar parks the account control against and the only one a right-parked trigger can open from without running off the surface. alignStart swings it to the leading edge for a pill that sits at the start of a bar, and alignEnd spells the default out. Both are logical, so a right-to-left locale mirrors them. Press each pill to see which edge its menu meets.
<Row between>
<AvatarMenu
compact
alignStart
name="Liang Bao"
email="liang.bao@example.com"
src="/liang-bao.jpg"
items={[
{ label: "Profile", icon: "user" },
{ label: "Settings", icon: "settings" },
{ label: "Sign out", icon: "logOut", destructive: true, separatorBefore: true }
]}
/>
<AvatarMenu
compact
alignEnd
name="Kira Tanaka"
email="kira.tanaka@example.com"
src="/kira-tanaka.jpg"
items={[
{ label: "Profile", icon: "user" },
{ label: "Settings", icon: "settings" },
{ label: "Sign out", icon: "logOut", destructive: true, separatorBefore: true }
]}
/>
</Row>
Disabled menu
disabled takes the whole pill out of service: it dims to the platform's disabled treatment, the press is a no-op, the menu never opens, and the button announces itself disabled before anyone reaches for it. Reach for it while the session is still resolving, not to park a menu whose rows simply have nothing to offer.
<AvatarMenu
disabled
name="Ada Lovelace"
email="ada.lovelace@example.com"
src="/ada-lovelace.jpg"
items={[
{ label: "Profile", icon: "user" },
{ label: "Settings", icon: "settings" },
{ label: "Sign out", icon: "logOut", destructive: true, separatorBefore: true }
]}
/>

Sizes

tiny
small
default
large

Anatomy

1
Frame
2
Image or initials
3
Ring
Dimmed parts appear only in some states or variants.

Props

36 props on AvatarProps, grouped as they are declared in source. Required props are marked *.
Prop
Type
Default
Description
Props
26 props
logo
boolean
false
Original 30px rounded brand mark with its action-to-selection gradient.
annotation
boolean
false
Reference identity geometry, smallest first in precedence.
compact
boolean
false
account
boolean
false
row
boolean
false
person
boolean
false
profile
boolean
false
detail
boolean
false
hero
boolean
false
featured
boolean
false
spotlight
boolean
false
hue
number
–
Stage identity hue, independent of the display name.
whiteInk
boolean
false
bold
boolean
false
inverse
boolean
false
orchid
boolean
false
glow
boolean
false
sheen
boolean
false
mediumSheen
boolean
false
strongSheen
boolean
false
src
string | number
–
The photo. A remote/URI string, or a bundled image module from require(...) / import. When set (and it loads), the image fills the circle and the initials fallback is hidden; if the image fails to load, it falls back to the initials.
uri
string | number
–
Alias for src, for callers that think in terms of a native image uri.
name
string
–
Full name. Drives the initials fallback AND the accessible label/alt text.
initials
string
–
Ready-made initials, used verbatim as the glyph (overrides name/children).
children
ReactNode
–
Same as name; the rendered initials when no photo is supplied.
accessibilityLabel
string
–
Accessible name for the avatar (the photo's alt text and, when pressable, the button's label). Falls back to name, then string children. Set it for a photo-only or pressable avatar that has no name.
Size
pick one
3 props
tiny
boolean
false
small
boolean
false

Accessibility and keyboard

Keyboard
Not focusable. It has no interaction of its own and takes the semantics of what it wraps.
Semantics
Roles
button
ARIA on web
aria-hidden
aria-label

Platform skins

The playground's props on each platform: same tree, native shapes, type and touch sizes.
RC
LB
MA
+1
Web
control 10 · field 10 · card 16 · Instrument Sans
RC
LB
MA
+1
iOS
capsule controls · field 8 · card 12 · SF Pro · 44 pt
RC
LB
MA
+1
Android
Material 3 stadium · field 4 · card 12 · Roboto · 48 dp

Usage

<Avatar name="AO" />
Like a photo, the disc is identity content: it keeps its colours under glass, where only the neutral tile of an avatar with no name or initials takes the control material. AvatarMenu builds the signed-in account control on the same circle: one capsule trigger carrying the avatar, the name, and the email, opening the account menu under that same identity.
Argus identity sizes are available as annotation (16), compact (30), account (32), row (36), person (38), profile (44), detail (52), hero (58), featured (60), and spotlight (74), in that precedence order. These retain their reference initials metrics, including the existing 9px annotation glyph.
hue selects a stage identity independently of its name. whiteInk preserves white reference initials; bold uses the 700 weight. sheen, mediumSheen, and strongSheen add the 2, 2.5 and 3px conic ring (strongest wins). inverse is the translucent white identity disc, orchid the account gradient, and glow its selected account ring. These reference discs keep the identity gradient. On the four stock sizes, glow is a 2px gap in the page colour inside the accent's soft glow, and ring stays the separator ring a stack draws between discs.

Tokens

Read from the playground render. Values follow the scheme and the ion hue.
--fd
--ft

Related components