Message

pro

Message lays out one row of a conversation with an optional avatar and a role-aware content column; compound parts add reactions, a hover-reveal action row, a typing indicator, tight grouping, and open marker rows for status notes or separators.

Assistant
Here is a quick summary of the latest deployment. Three services updated cleanly and no errors were reported.
10:14 AM
You
Thanks, can you also check the staging environment?
10:15 AM

Installation

Add this component with the NateUI CLI.

npx nateui@latest add Message

Examples

Solid gets a strong primary fill.
Subtle gets a soft secondary fill.
Default gets a bordered neutral surface.
Ghost sits directly on the page with no surface.

Alignment

Start-aligned row.
End-aligned row.

Reactions

Deploying to prod real quick.
It's always a one-line change.
Alright, let me take a look.

Type Indicator

You
Thanks, can you also check the staging environment?
10:15 AM
Assistant
Assistant is typing
Found the issue — the retry loop was swallowing the timeout error.
Assistant
Pushed a fix, re-running the job now.
10:16 AM
Jun 12, 2026
Assistant
Found the issue — the retry loop was swallowing the timeout error.
4:32 PM
Assistant
Pushed a fix, re-running the job now.
4:35 PM
Today
Assistant
Here is a quick summary of the latest deployment. Three services updated cleanly and no errors were reported.
10:14 AM
You
Thanks, can you also check the staging environment?
10:15 AM

API

Message

PropDescriptionTypeDefault
alignWhich side of the conversation the row belongs to.MessageAlign'start'
avatarOptional avatar node rendered at the row's outer edge and anchored to the lower edge of the direct Message.Content surface. Message.Meta and Message.Actions flow below without changing that anchor.ReactNode—
childrenRow content, typically Message.Content and Message.Meta.ReactNode—
...divPropsStandard <div> attributes forwarded to the row.ComponentProps<'div'>—

Message.Content

PropDescriptionTypeDefault
variant'solid' for a strong primary fill, 'subtle' for a soft secondary fill, 'default' for a bordered neutral surface, 'ghost' for bare text with no surface. Matches Button's variant vocabulary.MessageContentVariant'default'
...divPropsStandard <div> attributes forwarded to the content block.ComponentProps<'div'>—

Message.Meta

PropDescriptionTypeDefault
...divPropsStandard <div> attributes forwarded to the meta line. With an avatar, the meta line flows below the message surface without changing the avatar anchor.ComponentProps<'div'>—

Message.Reactions

Overlaps the bottom (or top) corner of Message.Content — render it as a child of Message.Content, which is position: relative for exactly this. Defaults role="img" so a screen reader announces the whole row once from a single aria-label, rather than reading each emoji individually — pass a descriptive aria-label summarizing the reactions.

PropDescriptionTypeDefault
alignWhich corner of the content block the reactions hang off. Match the row's own align.MessageReactionsAlign'start'
sideWhich edge of the content block the reactions anchor to.MessageReactionsSide'bottom'
...divPropsStandard <div> attributes forwarded to the reactions row.ComponentProps<'div'>—

Message.TypeIndicator

PropDescriptionTypeDefault
labelText announced to screen readers via a visually-hidden span.string'Assistant is typing'
...divPropsStandard <div> attributes forwarded to the root.ComponentProps<'div'>—

Message.Group

Stacks consecutive Message rows from the same sender. Avatar-collapse (keeping text columns flush across the group) is a caller convention — pass an empty same-sized placeholder as avatar on every message but the last, not a prop on Message.Group itself. The final avatar anchors to the visible message surface; metadata remains below it.

PropDescriptionTypeDefault
childrenConsecutive Message rows from the same sender.ReactNode—
...divPropsStandard <div> attributes forwarded to the group root.ComponentProps<'div'>—

Message.Marker

PropDescriptionTypeDefault
separatorAdds a hairline on either side of the marker's children.booleanfalse
...divPropsStandard <div> attributes forwarded to the marker row.ComponentProps<'div'>—

Message.Actions

PropDescriptionTypeDefault
revealOnHoverHides the action row until the message is hovered or focused within.booleanfalse
childrenAction controls, typically icon buttons.ReactNode—
...divPropsStandard <div> attributes forwarded to the action row.ComponentProps<'div'>—

Types

type MessageAlign = 'start' | 'end'
type MessageContentVariant = 'default' | 'subtle' | 'solid' | 'ghost'
type MessageReactionsAlign = 'start' | 'end'
type MessageReactionsSide = 'top' | 'bottom'
type MessageMarkerProps = ComponentProps<'div'> & { separator?: boolean }