figma guide

Designing avatars and user profile UI in Figma: sizes, states, and handoff

Design avatar components and user profile UI in Figma with size scales, status indicators, fallback initials, groups, and Dev Mode specs for nav and settings.

Published
Updated
Jun 12, 2026
Read time
8 min
Level
Beginner

Quick answer

Avatars in Figma represent people—photos, initials, or icons in a circular (or squircle) frame with optional status dot, badge count, and size scale from 24px to 96px+. Build an Avatar component with variants for type=image | initials | icon, size=xs | sm | md | lg | xl, and status=online | away | busy | offline | none. Profile UI adds header cards, editable fields, and account menus—pair with forms, dropdowns, and sidebars. Document image fallback rules, initials algorithm, and upload crop in Dev Mode. Start from the Figma guides hub for component basics.


Who this is for

  • Product designers placing avatars in nav, comments, tables, and profile settings.
  • Design system teams standardizing sizes that were arbitrary circles in every file.
  • Engineers implementing fallback initials, lazy-loaded images, and accessible labels.

Avatar types compared

TypeShowsBest forFallback
ImageUser photoKnown users with uploadsInitials or generic icon
Initials1–2 lettersDefault before photo loadsBackground color from name hash
IconGeneric person glyphAnonymous, system, deleted userN/A
LogoBrand mark (squircle)Teams, orgs in B2BFirst letter of org name

Verdict: ship one Avatar component with type variants—not separate “UserPhoto” and “UserCircle” components that drift apart.


Size scale

TokenDiameterTypical use
xs24pxDense tables, comment threads
sm32pxInline mentions, compact lists
md40pxDefault nav, cards
lg48–56pxProfile list rows, search results
xl64–96pxProfile header, account settings
2xl120px+Onboarding, edit-profile hero

Status dots scale with avatar—roughly 25% of diameter, min 8px, anchored bottom-right with 2px border matching surface background.

Avatar
├── Variant: type=image | initials | icon
├── Variant: size=xs | sm | md | lg | xl
├── Variant: status=none | online | away | busy | offline
├── Property: hasBadge=true | false
├── Layer: Container (circle or squircle, clip content)
│   ├── Image fill OR Initials text OR Icon
│   └── Status dot (optional, absolute bottom-right)
└── Layer: Badge count (optional, absolute top-right)

Bind background fills for initials to semantic color tokens or a fixed palette of 8–12 distinguishable hues.


Initials and color fallback

RuleSpecWhy
Letter count1 letter if single name; 2 if first + lastConsistency across app
CasingUppercaseLegibility at small sizes
FontMedium weight; size ~40% of diameterAvoid thin strokes at 24px
BackgroundHash of user id or name → palette indexSame user = same color
ContrastWCAG AA on initials vs backgroundPair with a11y plugins

Document the hash algorithm (“first char of uuid mod 12”) in handoff—designers pick sample names; engineering implements the rule.


Status indicators

StatusColor (example)Meaning
OnlineGreenActive now
AwayYellow / amberIdle
BusyRedDo not disturb
OfflineGrayNot available
DecisionRecommendation
Show on all avatars?Only md+ in social contexts; hide in tables at xs
Pulse animationOptional for online; note prefers-reduced-motion
Border on dot2px surface color so dot separates from photo

Do not rely on color alone—pair with tooltips or labels in profile UI.


Avatar groups (stacked)

PatternLayoutSpec tip
StackOverlap −8 to −12px per sizeMax 4–5 visible + “+N” overflow
GridNo overlap; 4px gapParticipant lists
RowHorizontal with overlapAssignee pickers
AvatarGroup
├── Variant: layout=stack | row | grid
├── Property: maxVisible=3 | 4 | 5
├── Layer: Avatars (horizontal, negative gap)
│   └── Avatar instances (z-index back to front)
└── Layer: Overflow badge (+3)

Overflow badge uses surface/elevated and caption text. Document z-order (first user on top or bottom—pick one).


Profile UI patterns

PatternContainsWhere it lives
Profile headerxl avatar, name, role, edit buttonSettings → Account
Profile cardAvatar + 2–3 metadata linesSidebar footer, team directory
Account menuAvatar trigger → dropdownApp header
Editable profileAvatar upload + form fieldsSettings page
User list rowsm/md avatar + name + secondary lineTables, mentions, chat

Profile header anatomy

PartPurpose
Avatar (xl)Photo or initials; optional edit overlay on hover
Display nametext/heading-md
SubtitleEmail, role, team—text/body-sm muted
Primary action”Edit profile” or “Change photo”
Secondary linksPassword, 2FA, delete account

Use cards or flush sections depending on settings layout density.


Avatar upload and crop

StateUIHandoff note
DefaultCurrent image or initialsAccept jpg, png, webp; max 5MB
HoverCamera icon overlay on xl avatarClick opens file picker
UploadingProgress ring or skeletonAsync upload
ErrorInline alert belowFile too large, wrong type
Crop modalModal with circular maskOutput 256×256 or 512×512

Document crop aspect ratio (1:1) and output sizes for retina (@2x).


States every avatar needs

StateImage typeInitials type
DefaultPhoto visibleLetters + background
LoadingSkeleton circleSkeleton
Error / missingFall back to initialsShow icon if no name
Hover (clickable)Subtle ring or overlaySame
FocusFocus ring on containerKeyboard accessible
DisabledReduced opacityUsed in pending invites

Clickable avatars (account menu) need 44px min touch target—pad hit area beyond visible circle on mobile.


Placement in common layouts

LocationSizeExtras
App headersm–mdOpens account dropdown
Sidebar footermdName truncated; chevron
Table cellxs–smName in adjacent column
Comment threadxsTimestamp beside name
Search suggestionsmSecondary line for email
Team pickermd + checkmarkSelected state variant

Accessibility checklist

RequirementImplementation
Alt textalt="" if name is adjacent; else alt="Jane Doe"
Decorative in groupsOnly first avatar named; others alt="" with group label
Account buttonaria-label="Account menu for Jane Doe"
StatusNot conveyed by color alone; tooltip or visible text in profile
InitialsContainer has accessible name from full name
UploadLabel tied to file input; error announced

Prototyping limits

Figma cannot upload real photos in prototypes. For demos:

  1. Use placeholder images and initials variants side by side.
  2. Prototype avatar click → dropdown or settings frame.
  3. Show upload modal as separate frame with crop UI static.

Use interactive components for hover ring on clickable avatars.


Handoff to engineering

DeliverableWhere it lives
Size tokens (px per scale)Component description
Initials rules1 vs 2 letters; uppercase
Color palette for initialsToken list or hex table
Image CDN sizes64, 128, 256 URLs
Status enumonline, away, busy, offline
Group overflowmaxVisible + “+N” logic
Crop outputDimensions, format, compression
Gravatar / provider fallbackDocument third-party behavior if used

Publish under Components / Avatar in your team library. Reference Dev Mode checklist for spacing and export notes.


Real-world examples

SaaS account menu

md avatar in top-right; click opens dropdown with name, email, Settings, Log out. Badge on bell icon separate from avatar.

Team directory table

xs avatar in first column; sortable name column; role and status text—no status dot at xs size.

Profile settings page

xl avatar with change-photo overlay; form for display name, bio, timezone; inline alerts for save success.

Comment thread

xs avatars left-aligned; thread indent without shrinking avatar below 24px.


Common mistakes

MistakeConsequenceFix
Random sizes (36px, 44px, 52px)Visual noiseStick to token scale
Stretched photosDistorted faces1:1 clip; object-fit cover
Status dot on every 24px avatarCluttered tablesHide status at xs
No initials fallbackBroken image iconAlways spec initials path
Avatar as only user identifierAmbiguous in groupsShow name on md+ layouts
Low-contrast initialsFails WCAGTest pairs; use contrast tools
Upload with no cropInconsistent circlesCrop modal with preview
10-color initials paletteCollisions look identical8–12 hues + hash

FAQ

Circle vs squircle avatars?

Circle is the default for people. Squircle for orgs/teams or when matching iOS app icon style—pick one shape per type, not per screen.

Show real photos in marketing mocks?

Use licensed stock or generated faces—never random web images. Initials variants are safer for generic demos.

Avatar + name layout: horizontal or vertical?

Horizontal (avatar left, text right) for lists, tables, and nav. Vertical (avatar centered above name) for profile headers and onboarding.

Anonymous users?

Use icon type with generic person glyph and label “Guest” or “Anonymous”—do not show empty circle.


Bottom line

Treat avatars as a sized, stateful component family—image, initials, icon, status, groups, and profile layouts—not one-off circles. Document size tokens, fallback rules, upload crop, and accessible naming in Dev Mode. Continue with sidebars, dropdown menus, forms, and the tutorials hub.

Share on X

§ Keep reading

Related guides.