Components
Message
Displays a message in a conversation, with optional avatar, header, footer, and alignment.
Source code
Click to see the source code for this component on GitHub. Feel free to copy it and adjust it for your own use.
Installation
Usage
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.
Note: Message owns the row layout — avatar, alignment, header, and footer. Render the visible message surface inside it with Bubble.
Anatomy
Message Anatomy.vue
<template>
<UiMessageGroup>
<UiMessage>
<UiMessageAvatar />
<UiMessageContent>
<UiMessageHeader />
<UiBubble />
<UiMessageFooter />
</UiMessageContent>
</UiMessage>
</UiMessageGroup>
</template>
Use UiMessageGroup to stack consecutive messages from the same sender.
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
- Every part renders through
Primitive, soas/as-childand Vueclassoverrides work on any part
Examples
Avatar
Use UiMessageAvatar 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. |
Group
Use UiMessageGroup to stack consecutive messages from the same sender. Render an empty UiMessageAvatar on the earlier messages to keep them aligned with the avatar on the last one.
Header and Footer
Use UiMessageHeader for a sender name and UiMessageFooter for metadata such as a delivery or read status.
Actions
Place message-level actions in UiMessageFooter, such as copy, retry, or feedback buttons.
Accessibility
Message is a presentational layout wrapper. Accessibility comes from the content you place inside it.
Label icon-only actions
Action buttons in UiMessageFooter are usually icon-only, so give each one an aria-label.
<template>
<UiMessageFooter>
<UiButton variant="ghost" size="icon" aria-label="Copy">
<Icon name="lucide:copy" />
</UiButton>
</UiMessageFooter>
</template>
Status updates
For in-progress messages, use a Marker with role="status" so assistive tech announces the update as it appears.
<template>
<UiMessage>
<UiMarker role="status">
<UiMarkerIcon>
<Icon name="lucide:loader-circle" class="animate-spin" />
</UiMarkerIcon>
<UiMarkerContent>Checking the logs...</UiMarkerContent>
</UiMarker>
</UiMessage>
</template>
API Reference
All Message parts render through Primitive. Use as to choose another element, or as-child to merge the component's attributes and styles onto the single element or component in its default slot.
Message
The message row wrapper.
| Prop | Type | Default | Description |
|---|---|---|---|
align | "start" | "end" | "start" | The alignment of the message in the conversation. |
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | Additional classes to apply to the row. |
MessageGroup
Groups consecutive messages from the same sender.
| Prop | Type | Default | Description |
|---|---|---|---|
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | Additional classes to apply to the group root. |
MessageAvatar
The avatar slot, aligned to the bottom of the message. When the message has a UiMessageFooter, the avatar shifts up to stay aligned with the message surface instead of the footer.
| Prop | Type | Default | Description |
|---|---|---|---|
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | Additional classes to apply to the avatar wrapper. |
MessageContent
Wraps the header, message surface, and footer.
| Prop | Type | Default | Description |
|---|---|---|---|
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | Additional classes to apply to the content wrapper. |
MessageHeader
Displays content above the message, such as a sender name. Aligns to the message side.
| Prop | Type | Default | Description |
|---|---|---|---|
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | 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 |
|---|---|---|---|
as | PrimitiveProps["as"] | "div" | Element or component to render. |
as-child | boolean | false | Render the default slot as the root and merge props onto it. |
class | HTMLAttributes["class"] | - | Additional classes to apply to the footer. |


