People & social
Users, accounts and conversations: avatars, profiles, comments and reactions.
Avatar #
Avatars, stacks and presence.
Avatar #
Picture or initials.
<Avatar name="Ada Lovelace" />Slots: root fallback image
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
alt | string | Image alt text (default: name). | ||
name | string | "Avatar" | Person's name: used for initials and as the accessible name. | |
size | "sm" | "md" | "lg" | "md" | Avatar size. | |
src | string | Image URL; falls back to initials from name when missing or broken. |
AvatarGroup #
Overlapping avatars with a "+N" overflow chip.
<AvatarGroup
max={3}
names={["Ada Lovelace", "Grace Hopper", "Alan Turing", "Linus Torvalds"]}
/>Slots: root avatar more
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
names | string[] | yes | People to show (initials come from each name). | |
max | number | 4 | Avatars shown before collapsing the rest into a +N counter. | |
size | "sm" | "md" | "lg" | "md" | Avatar size. |
PresenceAvatar #
Avatar with a presence dot.
<PresenceAvatar name="Ada Lovelace" status="success" />Slots: root avatar dot
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | yes | Person's name (initials and accessible name). | |
size | "sm" | "md" | "lg" | Avatar size. | ||
src | string | Avatar image URL. | ||
status | "accent" | "warning" | "success" | "danger" | "neutral" | "success" | Colour of the presence dot (e.g. success for online). |
Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
Account switchers #
The signed-in user and organisation.
UserButton #
Button showing a user's avatar, name and email.
<UserButton name="Ada Lovelace" email="[email protected]" onClick={() => {}} />Slots: root avatar chevron email name text
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | yes | User's name (also used for the avatar initials). | |
email | string | Secondary line under the name. | ||
end | content | Trailing content (default chevron); null hides it. | ||
onClick | (e: MouseEvent) => void | Called when the button is pressed, e.g. to open an account menu. | ||
src | string | Avatar image URL. |
OrgSwitcher #
Workspace switcher button.
<OrgSwitcher
org={{ id: "acme", name: "Acme Inc.", plan: "Pro" }}
onClick={() => {}}
/>Slots: root avatar chevron meta name plan
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
org | OrgOption | yes | The current organisation. | |
onClick | () => void | Called when pressed, e.g. to open an organisation menu. |
OrgOption
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Organisation id. |
name | string | yes | Organisation name. |
plan | string | Plan shown under the name. |
Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
Profiles & members #
Profile headers, member rows and invites.
ProfileHeader #
Profile header with cover, avatar, name, handle, bio and actions.
<ProfileHeader
name="Ada Lovelace"
handle="ada"
bio="Analyst of engines. Writes the first programs."
actions={
<Button variant="outline" onClick={() => {}}>
Follow
</Button>
}
/>Slots: root actions avatar bio cover handle main meta name
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | yes | Display name. | |
actions | content | Buttons at the end, e.g. Follow. | ||
bio | string | Short bio. | ||
cover | string | Cover image URL (a gradient when unset). | ||
handle | string | Username, shown with a leading @. | ||
src | string | Avatar image URL. |
MemberRow #
Team member row with avatar, email and remove action.
function Example() {
const members = signal([
{ name: "Grace Hopper", email: "[email protected]" },
{ name: "Alan Turing", email: "[email protected]" },
]);
return (
<Stack gap="0.25rem">
<For each={members()}>
{(member) => (
<MemberRow
name={member.name}
email={member.email}
onRemove={() => members.set(members().filter((m) => m !== member))}
/>
)}
</For>
<Show when={members().length === 0}>
<Text muted>No members left.</Text>
</Show>
</Stack>
);
}Slots: root avatar email meta name remove
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | yes | Member name. | |
email | string | Email under the name. | ||
onRemove | () => void | Shows a remove button; called when it is pressed. | ||
role | string | Team role shown as a {@link RoleBadge} (not the ARIA role). | ||
src | string | Avatar image URL. |
InviteCard #
Pending invitation with resend and revoke actions.
Invitation pending
function Example() {
const status = signal("Invitation pending");
return (
<Stack gap="0.5rem">
<InviteCard
email="[email protected]"
onResend={() => status.set("Invitation re-sent just now")}
onRevoke={() => status.set("Invitation revoked")}
/>
<Text muted>{status()}</Text>
</Stack>
);
}Slots: root actions email meta
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
email | string | yes | Invited address. | |
onResend | () => void | Shows a resend button; called when it is pressed. | ||
onRevoke | () => void | Shows a revoke button; called when it is pressed. | ||
resendLabel | string | "Resend" | Resend button text. | |
revokeLabel | string | "Revoke" | Revoke button text. | |
role | string | Team role shown as a {@link RoleBadge} (not the ARIA role). |
Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
Comments & chat #
Conversations, mentions and reactions.
Comment #
Discussion entry.
<Comment author="Ada Lovelace" meta="2h ago">
Looks great — can we add a reduced-motion variant?
</Comment>Slots: root actions author avatar body content head meta
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
author | string | yes | Author name. | |
actions | content | Buttons under the comment, e.g. Reply. | ||
avatar | string | Avatar image URL (initials from author when unset). | ||
children | content | Comment text or content. | ||
meta | string | Small line next to the author, e.g. the time. |
ChatBubble #
Chat message bubble, aligned by sender.
<Stack gap="0.5rem">
<ChatBubble from="them" author="Grace" meta="09:41">
Is the deploy done?
</ChatBubble>
<ChatBubble from="me" meta="09:42">
Yes — live on production.
</ChatBubble>
</Stack>Slots: root author body meta
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
from | "me" | "them" | yes | Who sent it: me (aligned right, accent) or them. | |
author | string | Sender name above the bubble. | ||
children | content | Message content. | ||
meta | string | Small line under the bubble, e.g. the time. |
Mention #
Inline
Thanks , merging now.
<Text>
Thanks <Mention name="ada" onClick={() => {}} />, merging now.
</Text>| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
name | string | yes | Username (shown with a leading @). | |
onClick | () => void | Makes the mention a button, e.g. to open the profile. |
ReactionBar #
Emoji reaction toggles.
function Example() {
const reactions = signal([
{ emoji: "👍", count: 12, active: true },
{ emoji: "🎉", count: 4, active: false },
{ emoji: "👀", count: 2, active: false },
]);
const toggle = (emoji: string) =>
reactions.set(
reactions().map((r) =>
r.emoji === emoji ? { ...r, active: !r.active, count: r.count + (r.active ? -1 : 1) } : r,
),
);
return <ReactionBar reactions={reactions()} onToggle={toggle} />;
}Slots: root reaction
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
reactions | Reaction[] | yes | Reactions, in order. | |
onToggle | (emoji: string) => void | Called with the emoji the user toggles; update counts yourself. |
Reaction
| Field | Type | Required | Description |
|---|---|---|---|
emoji | string | yes | The reaction emoji. |
count | number | yes | Number of people who reacted. |
active | boolean | Whether the current user reacted (pressed state). |
Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
Activity & inbox #
Feed and inbox items.
ActivityItem #
Activity feed entry with icon, title, meta and content.
<ActivityItem icon="git" title="Ada pushed 3 commits to main" meta="12 minutes ago" />Slots: root body content icon meta title
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
title | string | yes | What happened. | |
children | content | Extra detail below the title. | ||
icon | IconName | "bell" | Built-in icon name, or pass any node via iconNode. | |
iconNode | content | Custom leading content instead of icon. | ||
meta | content | Small line, e.g. the time. |
IconName — Material Design Icons path names used by <Icon />.
type IconName = | "check" | "x" | "plus" | "minus" | "search" | "user" | "users" | "settings" | "menu" | "home" | "heart" | "star" | "bell" | "mail" | "calendar" | "clock" | "edit" | "trash" | "copy" | "download" | "upload" | "link" | "external" | "info" | "warning" | "error" | "success" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-left" | "arrow-right" | "eye" | "eye-off" | "eye-outline" | "lock" | "unlock" | "filter" | "more" | "close" | "spinner" | "sun" | "moon" | "play" | "pause" | "refresh" | "share" | "image" | "file" | "folder" | "zap" | "phone" | "git" | "code";InboxItem #
Notification row.
<InboxItem
icon="git"
title="Grace requested your review"
body="#421 Toast: pause on hover"
time="5m"
unread
onClick={() => {}}
/>Slots: root body icon text time title
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
title | string | yes | What the notification is about. | |
body | content | Secondary text. | ||
icon | IconName | "bell" | Leading icon. | |
onClick | () => void | Makes the item a button, e.g. to open it. | ||
time | content | When it arrived. | ||
unread | boolean | Show the unread dot and bold title. |
IconName — Material Design Icons path names used by <Icon />.
type IconName = | "check" | "x" | "plus" | "minus" | "search" | "user" | "users" | "settings" | "menu" | "home" | "heart" | "star" | "bell" | "mail" | "calendar" | "clock" | "edit" | "trash" | "copy" | "download" | "upload" | "link" | "external" | "info" | "warning" | "error" | "success" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-left" | "arrow-right" | "eye" | "eye-off" | "eye-outline" | "lock" | "unlock" | "filter" | "more" | "close" | "spinner" | "sun" | "moon" | "play" | "pause" | "refresh" | "share" | "image" | "file" | "folder" | "zap" | "phone" | "git" | "code";Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
Testimonials & reviews #
Quotes and star reviews from customers.
Testimonial #
Customer quote.
We replaced three component libraries with one and our bundle got smaller.
<Testimonial
quote="We replaced three component libraries with one and our bundle got smaller."
author="Grace Hopper"
role="Staff engineer, Navy Labs"
/>Slots: root author avatar name quote role
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
author | string | yes | Who said it. | |
quote | content | yes | The testimonial text. | |
avatar | string | Author avatar URL. | ||
role | string | Author's job title (consumed here; not forwarded as an ARIA role). |
ReviewCard #
Star-rated review.
Solid mug
<ReviewCard order={3} rating={4} title="Solid mug" author="Linus T.">
Keeps coffee warm, survives the dishwasher.
</ReviewCard>Slots: root author body star stars title
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
rating | number | yes | Stars out of 5. | |
author | content | Reviewer name. | ||
children | content | Review text. | ||
order | HeadingLevel | 4 | Heading level of the title, to fit the page outline. Default 4. | |
title | string | Review headline. |
HeadingLevel
type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.
SocialLinks #
Row of icon links.
<SocialLinks
items={[
{ icon: "git", label: "GitHub", href: "https://github.com" },
{ icon: "mail", label: "Email", href: "mailto:[email protected]" },
]}
/>Slots: root link
| Prop | Type | Required | Default | Description |
|---|---|---|---|---|
items | SocialLink[] | yes | Links, in order. |
SocialLink
| Field | Type | Required | Description |
|---|---|---|---|
icon | IconName | yes | Network icon. |
label | string | yes | Network name (accessible name). |
href | string | Renders a real link (opens in a new tab) when set. | |
onClick | () => void | Click handler (renders a button when there is no href). |
IconName — Material Design Icons path names used by <Icon />.
type IconName = | "check" | "x" | "plus" | "minus" | "search" | "user" | "users" | "settings" | "menu" | "home" | "heart" | "star" | "bell" | "mail" | "calendar" | "clock" | "edit" | "trash" | "copy" | "download" | "upload" | "link" | "external" | "info" | "warning" | "error" | "success" | "chevron-down" | "chevron-up" | "chevron-left" | "chevron-right" | "arrow-left" | "arrow-right" | "eye" | "eye-off" | "eye-outline" | "lock" | "unlock" | "filter" | "more" | "close" | "spinner" | "sun" | "moon" | "play" | "pause" | "refresh" | "share" | "image" | "file" | "folder" | "zap" | "phone" | "git" | "code";Also accepts the shared props: pass-through attributes, class, style, classes, styles, unstyled.