Assignee Picker
betaA pill of overlapping faces that opens a multi-select list of people; new faces fly into the stack.
- Forms
- 2 files
- 1 npm package
- Accessibility notes
pnpm dlx @dowel-ui/cli add assignee-pickernpm packages installed: class-variance-authority.
import { AssigneePicker } from "@/components/ui/assignee-picker";Default
Unassigned
Grid Stack
Photos
Overflow
Controlled
Right To Left
Gallery
<AssigneePicker>
| Prop | Type | Default |
|---|---|---|
people (required) | AssigneePickerPerson[] | — |
contentClassName | string | — |
contentWidthWidth of the card. Numbers are pixels. | number | string | 264 |
cornerRadius of the pill and card in pixels. Rows take a concentric radius. | number | 22 |
defaultOpen | boolean | false |
defaultValue | string[] | — |
labelNames the listbox and prefixes the trigger's name ("Assignees: Adam Marsh"). | string | "Assignees" |
maxFacesMost slots in the stack; beyond it the last slot becomes "+N". | number | — |
onOpenChange | (open: boolean) => void | — |
onValueChange | (value: string[]) => void | — |
open | boolean | — |
overlapPixels each face overlaps the previous one in a | number | 10 |
placeholderShown in the pill, and in its name, when nobody is assigned. | string | "Unassigned" |
stack
| "row" | "grid" | "row" |
stroke | boolean | — |
tone | "default" | "inverted" | "default" |
triggerClassName | string | — |
valueControlled selection, as person ids in the order they were assigned. | string[] | — |
Plus every attribute of <div> except defaultValue, onChange, children.
10/10
checks passed
- Tested — passes
- axe assertion — passes
- Keyboard tested — passes
- Storybook examples — passes
- Accessibility documented — passes
- Semantic tokens only — passes
- Motion from tokens — passes
- className merged — passes
- Visible focus — passes
- No fixed widths — passes