Design System

V2 audit — People

Identity across the product: one avatar, one stacking rule, one picker for assigning people.

Avatar

V2

Represents a person or entity as image, initials or a neutral glyph.

AvataravatarToneFromNameAVATAR_TONES

Live component

AORBSMDCPRUser
NPASWEI

Legacy mapping

Legacy screens rendered five avatar diameters and random initials colours. V2 fixes five size tokens and a deterministic tone per name.

Avatar — standardized specification
AttributeSpecification
Defaultsize="medium" (32px), tone="neutral"
Variantsimage · initials · glyph fallback · tone=auto
Sizesxs (20px) · small (24px) · medium (32px) · large (40px) · xl (48px)
Statesloaded · fallback · in a group (ringed)
Icon behaviourFallback User glyph at half the avatar size.
SpacingNo internal padding; groups overlap by 8px.
TypographyInitials `text-caption` → `text-label-lg` by size, weight 500.
Border radius`rounded-full`.
Colour usage`*-subtle` pairs only; `tone="auto"` hashes the name so a person keeps one colour everywhere.
ResponsiveSteps down one size token in dense mobile rows; never below 20px.

When to use

  • Identifying the author, owner or assignee

When not to use

  • Decorating a list that has no person in it

Accessibility

  • Image avatars carry the person's name as alt text; glyph fallback keeps an sr-only name.
  • Colour is decorative — it never encodes role or status.

AvatarGroup

V2

Stacks several people and collapses the remainder into a +N indicator.

AvatarGroup

Live component

Legacy mapping

Legacy participant rows listed every avatar and overflowed the container.

AvatarGroup — standardized specification
AttributeSpecification
Defaultmax=4, size="medium"
Variantsstacked · stacked with overflow
Sizesxs · small · medium · large · xl
Stateswithin max · overflowing
Icon behaviourNone; the overflow chip shows +N text.
Spacing-8px overlap, 2px `ring-surface` separation.
TypographyOverflow chip matches the avatar size token.
Border radius`rounded-full`.
Colour usageOverflow chip `bg-background-muted` + `text-text-secondary`.
ResponsiveLower `max` on narrow widths rather than shrinking the avatars.

When to use

  • Attendees, watchers, shared-with lists

When not to use

  • When names must be readable — use a list

Accessibility

  • One `role="group"` with a summary label; individual avatars are hidden from the reading order to avoid a name wall.

UserSelect

V2

Searchable people picker for single or multiple assignment.

UserSelect

Live component

  • AOAmara Okafor
  • SMSofia Marchetti

Everyone selected receives the shift summary.

Legacy mapping

Each legacy module shipped its own assignee dropdown, some without search and some without avatars. V2 provides one picker.

UserSelect — standardized specification
AttributeSpecification
Defaultmultiple=false, size="medium"
Variantssingle · multiple
Sizessmall · medium · large
Statesempty · searching · no results · selected · disabled · error
Icon behaviourSearch icon in the filter row, Check on selected rows, labelled X on removable pills.
SpacingTrigger padding 8px, pill gap 6px, option row padding 6px/8px.
TypographyName `text-body-sm`, detail line `text-caption`.
Border radius`rounded-md` trigger, `rounded-full` pills.
Colour usageNeutral chrome; avatars supply the only colour via `tone="auto"`.
ResponsivePopover matches the trigger width; pills wrap and grow the trigger.

When to use

  • Assigning owners, inviting participants, sharing

When not to use

  • Non-person entities — use Combobox or MultiSelect

Accessibility

  • Listbox with `aria-multiselectable`; search field is labelled; the secondary detail line disambiguates duplicate names.