Ballmac UI home

Thinking Indicator

A waiting indicator for assistants with four animations (dots, bars, wave, shimmer), labels that take turns, an optional timer and one calm announcement for screen readers.

Assistant is thinking

Installation

$ pnpm dlx shadcn@latest add @ballmac/thinking-indicator

Usage

import { ThinkingIndicator, formatElapsed } from "@/components/ballmac/thinking-indicator"

The full example is in the Code tab above.

Examples

Four animations

Assistant is thinking (dots)
dots
Assistant is thinking (bars)
bars
Assistant is thinking (wave)
wave
Assistant is thinking (shimmer)
shimmer

API reference

PropTypeDefault
variant

Animation shown beside the text. "dots" bounces three dots, "bars" is an equalizer, "wave" is a soft sine ribbon and "shimmer" sweeps light across the text only.

"dots" | "bars" | "wave" | "shimmer""dots"
label

One label, or several that take turns, such as "Reading the files" then "Drafting a reply".

string | string[]—
interval

Milliseconds each label stays before the next one.

number2600
showTimer

Shows a running timer such as "12s" or "1:05".

booleanfalse
elapsed

Elapsed seconds. When set the timer follows this value instead of counting by itself.

number—
statusLabel

What screen readers hear when thinking starts. The cycling labels are visual only, so a long task does not chatter.

string—
size

Text size of the label.

"sm" | "default""default"

Also accepts the standard attributes of its root element.

Accessibility

KeyAction
Screen readersrole=status announces statusLabel once; cycling phrases and the timer are visual only
Reduced motionAnimations stop, phrases cross-fade in place

Use with AI

Show it while a reply has not started. variant picks the animation, label takes a string or an array of phrases, showTimer adds a clock. Screen readers hear statusLabel once instead of every phrase. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Thinking Indicator (@ballmac/thinking-indicator) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • The gap between sending a message and the first streamed token
  • A long agent task where the phrase changes with the current step

Not for

  • Showing the model's reasoning text; use reasoning-disclosure
  • Progress with a known end; use progress or agent-plan

Registry JSON: https://ui.ballmac.com/r/thinking-indicator.json

Credits

Free to use in personal and commercial projects.