The Message component lays out a single message in a conversation. It handles the avatar, alignment, header, and footer around the message surface.
For AI apps, you can render reasoning steps, tool calls and assistant messages using the Message component.
Installation
Section titled “Installation”pnpm dlx shadcn@latest add pxl-ui/registry/conversation/message
Copy and paste the following code into your project.
Update the import paths to match your project setup.
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/pxl/avatar"import { Bubble, BubbleContent } from "@/components/features/pxl/conversation/bubble"import { Message, MessageAvatar, MessageContent } from "@/components/features/pxl/conversation/message"<Message> <MessageAvatar> <Avatar> <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" /> <AvatarFallback>CN</AvatarFallback> </Avatar> </MessageAvatar> <MessageContent> <Bubble> <BubbleContent>How can I help you today?</BubbleContent> </Bubble> </MessageContent></Message>Note: Message owns the row layout—avatar, alignment, header, and footer.
Render the visible message surface inside it with
Bubble. For the scroll container around a
conversation, use MessageScroller.
Composition
Section titled “Composition”Use the following composition to build a message:
Message├── MessageAvatar└── MessageContent ├── MessageHeader ├── Bubble └── MessageFooterUse MessageGroup to stack consecutive messages from the same sender:
MessageGroup├── Message└── MessageFeatures
Section titled “Features”- Start and end alignment for sender and receiver rows via the
alignprop - Avatar slot that anchors to the bottom of the message and stays clear of the footer
- Header and footer slots for sender names, status, and message actions
- Footer follows the message side; actions stay aligned on
align="end"rows - Group wrapper for stacking consecutive messages from the same sender
- Customizable styling through the
classNameprop on every part
Avatar
Section titled “Avatar”Use MessageAvatar to render an avatar next to the message. Set align="end" on the message to align the avatar to the end of the message.
| align | Description |
|---|---|
start |
Align the message to the start of the conversation. |
end |
Align the message to the end of the conversation. |
Use MessageGroup to stack consecutive messages from the same sender. Render an empty MessageAvatar on the earlier messages to keep them aligned with the avatar on the last one.
Header and Footer
Section titled “Header and Footer”Use MessageHeader for a sender name and MessageFooter for metadata such as a delivery or read status.
Actions
Section titled “Actions”Place message-level actions in MessageFooter, such as copy, retry, or feedback buttons.
Accessibility
Section titled “Accessibility”Message is a presentational layout wrapper. Accessibility comes from the content you place inside it.
Label icon-only actions
Section titled “Label icon-only actions”Action buttons in MessageFooter are usually icon-only, so give each one an aria-label.
<MessageFooter> <Button variant="ghost" size="icon" aria-label="Copy"> <CopyIcon /> </Button></MessageFooter>Status updates
Section titled “Status updates”For in-progress messages, use a Marker with role="status" so assistive tech announces the update as it appears.
<Message> <Marker role="status"> <MarkerIcon> <Spinner /> </MarkerIcon> <MarkerContent>Checking the logs...</MarkerContent> </Marker></Message>API Reference
Section titled “API Reference”Message
Section titled “Message”The message row wrapper.
| Prop | Type | Default | Description |
|---|---|---|---|
align |
"start" | "end" |
"start" |
The alignment of the message in the conversation. |
className |
string |
- | Additional classes to apply to the row. |
MessageGroup
Section titled “MessageGroup”Groups consecutive messages from the same sender.
| Prop | Type | Default | Description |
|---|---|---|---|
className |
string |
- | Additional classes to apply to the group root. |
MessageAvatar
Section titled “MessageAvatar”The avatar slot, aligned to the bottom of the message. When the message has a MessageFooter, the avatar shifts up to stay aligned with the message surface instead of the footer.
| Prop | Type | Default | Description |
|---|---|---|---|
className |
string |
- | Additional classes to apply to the avatar slot. |
MessageContent
Section titled “MessageContent”Wraps the header, message surface, and footer.
| Prop | Type | Default | Description |
|---|---|---|---|
className |
string |
- | Additional classes to apply to the content slot. |
MessageHeader
Section titled “MessageHeader”Displays content above the message, such as a sender name. Stays aligned to the start regardless of align.
| Prop | Type | Default | Description |
|---|---|---|---|
className |
string |
- | Additional classes to apply to the header. |
MessageFooter
Section titled “MessageFooter”Displays content below the message, such as status or actions. Aligns to the message side.
| Prop | Type | Default | Description |
|---|---|---|---|
className |
string |
- | Additional classes to apply to the footer. |
.