- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Collapsible
- Combobox
- Command
- Context Menu
- Data Table
- Date Picker
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Message Scroller
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Radio Group
- Resizable
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
- Typography
import {
Avatar,
AvatarFallback,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#
pnpm dlx shadcn@latest add message
Usage#
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
import { Bubble, BubbleContent } from "@/components/ui/bubble"
import { Message, MessageAvatar, MessageContent } from "@/components/ui/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#
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
- 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
Examples#
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.
import {
Avatar,
AvatarFallback,| 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 the earlier messages to keep them aligned with the avatar on the last one.
import {
Avatar,
AvatarFallback,Header and Footer#
Use MessageHeader for a sender name and MessageFooter for metadata such as a delivery or read status.
import { Bubble, BubbleContent } from "@/components/ui/bubble"
import {
Message,Actions#
Place message-level actions in MessageFooter, such as copy, retry, or feedback buttons.
import {
CopyIcon,
RefreshCcwIcon,Attachment#
"use client"
import { DownloadIcon, FileTextIcon } from "lucide-react"Accessibility#
Message is a presentational layout wrapper. Accessibility comes from the content you place inside it.
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#
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#
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. 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#
Wraps the header, message surface, and footer.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional classes to apply to the content slot. |
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#
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. |