Message
Displays a message in a conversation, with optional avatar, header, footer, and alignment.
The Message component lays out a single message in a conversation. It handles the avatar, alignment, header, and footer around the message surface. Render the visible surface with Bubble.
Installation
pnpm dlx cubix@latest add messageUsage
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/cubix/avatar"
import { Bubble, BubbleContent } from "@/components/cubix/bubble"
import {
Message,
MessageAvatar,
MessageContent,
} from "@/components/cubix/message"<Message>
<MessageAvatar>
<Avatar>
<AvatarImage src="https://github.com/vercel.png" alt="@cx" />
<AvatarFallback>CX</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.
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
- 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
- Group wrapper for stacking consecutive messages from the same sender
- Customizable styling through the
classNameprop on every part
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 row.
| align | Description |
|---|---|
| start | Align the message to the start of the conversation. |
| end | Align the message to the end of the conversation. |
Group
Use MessageGroup to stack consecutive messages from the same sender. Render an empty MessageAvatar on earlier messages to keep them aligned with the avatar on the last one.
Header and Footer
Use MessageHeader for a sender name and MessageFooter for metadata such as a delivery or read status.
Actions
Place message-level actions in MessageFooter, such as copy, retry, or feedback buttons. Give icon-only actions an aria-label. For a failed send, show Failed to send in text-destructive with a retry control.
Attachment
Status
For typing indicators and in-progress updates, use a Marker with role="status" so assistive tech announces the update as it appears.
Reactions
Place BubbleReactions inside a Bubble to show emoji reactions on the message surface. Use aria-label to describe the reactions.
API Reference
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
Groups consecutive messages from the same sender.
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional classes to apply to the group root. |
MessageAvatar
The avatar slot, aligned to the bottom of the message.
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional classes to apply to the avatar slot. Aligns to the bottom of the message surface. |
MessageContent
Wraps the header, message surface, and footer.
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional classes to apply to the content slot. |
MessageHeader
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional classes to apply to the header. Stays aligned to the start regardless of align. |
MessageFooter
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | Additional classes to apply to the footer. Aligns to the message side. |