Components · Person
The atom of every roster, byline and assignee list: a circular identity chip that shows an image when src is set and otherwise falls back to initials derived from the name. Five token-driven sizes, an accent tint for the highlighted person, an app-added presence dot, and the AvatarGroup stack that collapses a crowd into a +N chip.
One square that renders as a circle. Size scales the chip and its type together — never the colour or shape. md (32px) is the default; use the smallest size that stays legible in context (xs for stacks & dense rows, xl for profile headers).
No src ⇒ up to two letters (first + last word). Tint is derived deterministically from the name.
src renders an image (object-fit:cover). accent marks the signed-in user; square is for org / logo marks.
The presence dot is an app add-on over the DS avatar (a .status-dot anchored bottom-right with a 2px surface ring so it reads against the chip). It shrinks on xs/sm. Meaning is never colour-alone — pair it with a label or title.
Children overlap by -8px with a 2px surface ring between them, then everything past max folds into one +N chip (surface-2, tabular-nums). Use total to render a few but count many. The chip is decorative — name the set with a nearby label (e.g. "Brooklyn transport team").
xs 20 · sm 24 · md 32 (default) · lg 40 · xl 52. Token-driven off the space scale; type steps with the chip.<img class=avatar__img>, object-fit:cover. Omit (or on error) → initials chip.accent tints the initials chip (one highlighted person); ring adds an inset hairline for busy backgrounds; square swaps to --radius-md for org marks.max caps rendered avatars; the rest fold into +N. total overrides the count (render 4, show +96). Keep children one small size.Source · DS Avatar + AvatarGroup (catalog/people.css — .avatar, --xs…--xl, --accent, .avatar-group__more) · forum/Avatar.tsx + forum-tokens.ts (forumInitials(), avatarTone() name→colour). Presence dot reuses the DS .status-dot.