Message Scroller
A reader-aware transcript that follows streamed output at the live edge, lets go when the reader scrolls away, and offers a metal pill with a thought orb to come back.
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 |
|---|---|---|---|
| busy | boolean | — | Marks the transcript as streaming. The pill then shows the orb and the streaming label. |
| navigation | "rail" | — | Adds a compact rail for jumping between message rows. |
| jumpLabel | string | "Jump to latest" | Label of the pill when nothing is streaming. |
| streamingLabel | string | "New reply" | Label of the pill while busy. |
| metal | boolean | true | Wraps the pill in the liquid-metal ring. |
| fadeEdges | boolean | true | Softens the top and bottom edges of the transcript. |
| followOutput | boolean | true | Keeps streamed output pinned while the reader is near the end. |
| followThreshold | number | 56 | Distance from the end that still counts as following. |
| smooth | boolean | true | Smoothly follows growing content and the jump back. |
| onFollowChange | (following: boolean) => void | — | Reports when the reader leaves or returns to the live edge. |
| label | string | "Conversation" | Accessible label for the scrollable transcript. |