An avatar row for picking people, with a searchable dropdown to add more.
Tap an avatar to select or deselect it; selected people glide to the front and unselected ones fade to grayscale with a small plus badge. Tap Add and the circle morphs into a card with a search field; type to filter by name or email, use the arrow keys and Enter, or click anyone to toggle them. A hairline scrollbar shows only while you scroll. When the row is full, avatars pushed out shrink away as new ones pop in. Press Escape, the esc key in the field, or click outside to fold the card back. Honors prefers-reduced-motion.
npx shadcn@latest add ikislay/pixel-ui/member-selector"use client"import { useState } from "react"import { MemberSelector, type Member } from "@/components/ui/member-selector"const members: Member[] = [{id: "1",name: "Yuki Tanaka",email: "[email protected]",avatar: "https://images.unsplash.com/photo-1544005313-94ddf0286df2?w=160&h=160&fit=crop&crop=faces",},{id: "2",name: "Matt Cooper",
1// Loading…
Options you can pass to customize this component.
members*Member[]Everyone who can be picked. Each member has an id and name, plus an optional email and avatar url; without an avatar, initials show instead.
selected*string[]Ids of the selected members.
onChange*(selected: string[]) => voidCalled with the new list of ids when someone is toggled.
maxnumberMost members that can be selected. Extra picks are ignored. Unlimited by default.
maxVisiblenumberHow many avatars show in the row. Selected members fill it first.
labelstringSmall uppercase heading above the row.
Most components here are recreations of great work from around the web. I don't claim to be the original creator - this is my attempt to reverse-engineer, replicate, and often add a few extra features. I've tried to credit everyone; if I missed someone, let me know.
1