Ballmac UI home

Streaming Text

Text that arrives progressively, with a blinking caret while streaming, preserved whitespace, aria-busy for screen readers and an optional typewriter reveal for demos.

Installation

$ pnpm dlx shadcn@latest add @ballmac/streaming-text

Usage

import { StreamingText, StreamingCaret } from "@/components/ballmac/streaming-text"

The full example is in the Code tab above.

API reference

PropTypeDefault
text*

The text received so far. Append to it as chunks arrive; whitespace and newlines are preserved.

string—
streaming

True while more text is expected. Shows the caret and sets aria-busy.

booleanfalse
animate

Reveal text that is already complete at `speed` characters per second (for demos and replays). Skipped under reduced motion.

booleanfalse
speed

Characters per second when `animate` is on.

number80
caret

Show the caret while streaming or revealing.

booleantrue
onAnimationComplete

Called once `animate` has revealed the whole text.

() => void—

Also accepts the standard attributes of its root element.

Accessibility

KeyAction
—aria-live=polite region; aria-busy is true while streaming so screen readers read the finished text instead of every chunk

Use with AI

Pass the accumulated text and streaming={true} while chunks arrive; it shows a caret and sets aria-busy until you set streaming={false}. Use animate + speed to type out text you already have. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Streaming Text (@ballmac/streaming-text) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • Assistant replies that arrive token by token from a model
  • Replaying a saved answer with a typewriter effect in a demo or onboarding
  • Any plain-text live output where a caret shows that more is coming

Not for

  • Rendered markdown (render your markdown in ai-message's MessageContent and show StreamingCaret at the end)
  • Headline text effects (use text-reveal)

Registry JSON: https://ui.ballmac.com/r/streaming-text.json

Credits

Free to use in personal and commercial projects.