ChatGPT uses this directly in the chat surface: one small dot that pulses at the end of the assistant turn until streamed text appears. PulseDot is the same pattern for your own products—copilots, support bots, and composer footers where a full spinner would feel heavy.
Installation
Usage
import { PulseDot } from "@/components/loading-ui/pulse-dot";<PulseDot />Customization
The dot is a rounded-full block with bg-current, so color follows inherited foreground and currentColor. Scale sets how large the “breathing” motion feels relative to surrounding copy.
Size
Chat UIs usually keep this tiny—size-2 or size-2.5 beside baseline text, larger in empty states or toolbars.
Color
Because the dot is filled with bg-current, its hue follows the element’s text color / currentColor. The preview below uses text-[#…] on purpose so the swatches stay obvious; in real layouts you usually inherit from a parent or use whatever color API matches your theme.
Duration
Breathing speed uses --duration, defaulting to 1.2s in the component.
Examples
Button
Drop-in for “assistant is working” actions without changing button height.
Badge
Thread and model-status chips stay compact because the dot carries the motion alone.
Input group
Mirrors the inline composer pattern: placeholder copy plus a dot at the trailing edge.
Tabs
Use a tab panel to separate streaming copy from secondary material (sources, citations).