Message
Conversation rows in the same language as the composer: assistant turns led by a dotted thought orb, user turns in the accent colour with an optional liquid-metal ring.
Install
Steps for Next.js.
Install the package
One package carries every component, the beUI base they build on, and the effect libraries.
bun add @poulo2/ai-componentsLoad the styles with Tailwind v4
Add both lines to your global stylesheet so Tailwind generates the classes the components use. If your app already defines the shadcn/ui tokens, skip the theme import to keep your own palette.
@import "@poulo2/ai-components/theme.css"; @source "../node_modules/@poulo2/ai-components/dist";Or load the prebuilt stylesheet
For apps without Tailwind. Import it once at the root; it includes Tailwind's base reset.
import "@poulo2/ai-components/styles.css";
Props
| Name | Type | Default | Description |
|---|---|---|---|
| from | "user" | "assistant" | — | Who sent it. Sets the side, surface and avatar. |
| children | ReactNode | — | The message body. Leave empty while streaming to show the typing dots. |
| status | "streaming" | "complete" | "complete" | Assistant only. Streaming animates the orb; complete rests it. |
| orbState | OrbState | "composing" | Assistant only. The orb animation while streaming. |
| metal | boolean | false | User only. Adds a liquid-metal ring that bends under the cursor. Each ring is a live canvas, so keep it to the newest message. |
| name | ReactNode | — | Shown above the bubble. |
| time | ReactNode | — | Shown below the bubble. |
| actions | ReactNode | — | Controls placed after the time, such as copy or retry. |
| avatar | ReactNode | — | Replaces the default avatar. Pass null to remove it. |
| animateIn | boolean | false | Plays the pop-up entrance once when the row mounts. |