Avatar

Atom

Circular indicator for a user or entity. Mirrors Figma node 125-2432 (light) + 5914-6626 (dark) 1:1. Three fill variants — Icon (person silhouette), Initials (1–2 letters), Image (clipped photo). Four sizes (xs 24 / sm 32 / md 40 / lg 48). The disc is a blue #3156DF surface with white content and a 1px black-10% hairline — identical in light and dark per Figma. Hover keeps the same background and signals interactivity with a 10% black scrim. Composes with Badge for a count pill (top-right) and a status dot (bottom-right) via the .avatar-stack + .avatar-pin-* anchors.

When to use

✅ Do
  • Use to represent a user, team member, or entity with a face/initials/image
  • Use Image variant when the user has a profile photo
  • Use Initials when no photo is available — 1 or 2 characters maximum
  • Use Stack (.avatar-stack) for showing multiple users at once (e.g. "3 collaborators")
  • Compose with Badge for notification counts or status indicators
❌ Don't
  • Use for decorative icons unrelated to a person or entity — use the SVG sprite directly
  • Use more than 5 avatars in a stack without a "+N" overflow indicator
  • Use initials longer than 2 characters
  • Use Avatar as a navigation element without a visible label nearby

DigiLawyer Patterns

No specific DigiLawyer patterns documented yet — to be added.

Anatomy

An Avatar is a circular disc with an inner content slot (icon, initials, or image) and optional composition anchors for Badge and status dot.

AD
  1. 1Disc.avatar. The circular container. Blue bg, white content, 1px hairline border.
  2. 2Content.avatar-icon / .avatar-initials / .avatar-image. Mutually exclusive fill variants.
  3. 3Status dot.avatar-status. Online (green) / offline (grey) indicator, bottom-right.
  4. 4Badge pin.avatar-pin-tr / .avatar-pin-br etc. Anchors a Badge at a corner of the disc.
  5. 5Stack wrapper.avatar-stack. Negative margin creates the overlapping group effect.

Default

A bare .avatar at the default md size, Initials variant. Add a fill variant (.avatar-icon / .avatar-initials / .avatar-image) and an optional size (.avatar-lg / -sm / -xs).

A

Variants

Three fill variants. Icon wraps the #ico-avatar-person silhouette (any inline SVG works — it inherits currentColor). Initials holds 1–2 letters in Semi Bold. Image clips an <img> to the circle (shown here with gradient placeholders standing in for photos). All three share the same disc chrome — blue bg, white content, black-10% hairline.

Icon
A Initials
Image

Sizes

Four sizes mapped 1:1 to Figma's symbol names. .avatar-lg 48 px (initials Heading 6b 20/24); default md 40 px (16 px); .avatar-sm 32 px (Caption 1 12/16); .avatar-xs 24 px (Caption 2 10/12). The icon scales to ~56% of the diameter at every size.

Icon
Initials
Image
Large · 48
A
Medium · 40
A
Small · 32
A
X-small · 24
A

States

Two states. Default renders the blue disc. Hover keeps the same background (Figma 1:1) and overlays a 10% black scrim to signal the avatar is interactive — use it when the avatar is a button / link (account menu trigger, profile link). .is-hover forces the scrim at rest for the docs; :hover handles the live state. A non-interactive avatar (pure presence indicator) needs no hover.

Default
A
Hover
A

Composition

Wrap an avatar in .avatar-stack to pin a Badge count to the top-right (.avatar-pin-tr) and a status dot to the bottom-right (.avatar-pin-br). The count is the canonical .badge.badge-label.badge-danger; the status dot is .avatar-status with a page-bg ring and one of -online / -busy / -away / -offline. Add .avatar-stack-lg / -sm / -xs to scale the status dot with the avatar.

9 Count + online
A 9 Count + busy
Status only
Dot badge

Full matrix

3 variants × 4 sizes. Toggle the theme switch in the global header to confirm dark-mode parity — Figma reports identical disc tokens in both modes (blue bg, white content, black-10% hairline), so the only cross-mode change is the page surface the avatars sit on.

lg · 48
md · 40
sm · 32
xs · 24
Icon
Initials
A A A A
Image

Accessibility

Attribute / BehaviourValueNotes
Image alt textalt="User's name"Always provide descriptive alt text on <img> avatars
Initials avatararia-label="AD (Adesh Singh)"Initials are not self-explanatory — add a full name via aria-label
Icon avatararia-label="Unknown user"Generic icon needs a label describing the entity
Interactive avatar<button> wrappingIf the avatar is clickable, wrap it in a <button> or <a>
Status dotaria-label="Online" on dotColour alone is not accessible — add a text label or aria-label

API

Class / attrOnDescription
.avatar<span>Base. 40 px (md) circular disc — blue --avatar-bg, white --avatar-text, 1px --avatar-border hairline, overflow: hidden to clip the Image variant. Semi Bold. Add a variant + size.
.avatar-icon.avatarIcon variant — wrap an inline SVG (e.g. #ico-avatar-person). The SVG sizes to ~56% of the diameter and inherits currentColor.
.avatar-initials.avatarInitials variant — 1–2 letters of text. Font scales per size: 20 / 16 / 12 / 10 px (lg / md / sm / xs).
.avatar-image.avatarImage variant — drop an <img> inside; it's clipped to the circle via object-fit: cover. Empty shows a grey placeholder.
.avatar-lg / -sm / -xs.avatarSizes — 48 / 32 / 24 px. Default (no class) is md 40 px.
.is-hover / :hover.avatarInteractive hover — overlays a 10% black scrim (--avatar-overlay-hover). Use only when the avatar is a button / link.
.avatar-stack<span>Composition wrapper. Shrink-wraps the avatar (position: relative) so pinned Badge + status dot anchor to its corners without being clipped by the avatar's overflow: hidden. Add .avatar-stack-lg / -sm / -xs to scale the status dot.
.avatar-pin-tr.badge inside .avatar-stackPins a Badge count to the top-right (sits half-outside the circle corner). Use with .badge.badge-label.badge-danger or .badge.badge-dot.
.avatar-pin-br.avatar-status inside .avatar-stackPins the status dot to the bottom-right, sitting on the circle edge.
.avatar-status<span>Status dot — a small disc with a 2px page-bg ring for separation. Pair a colour: -online (green) / -busy (red) / -away (yellow) / -offline (grey).
--avatar-bg / -text / -borderTokenDisc surface, content colour, hairline. Identical in light + dark per Figma.
--avatar-bg-hover / -overlay-hoverTokenHover background (equals --avatar-bg) + the 10% black interactive scrim.