GitHub

Pulse

A soft scaling ring for calm, breathable loading and standby states.

Loading
import { Pulse } from "@/components/loading-ui/pulse";

export function PulseDemo() {

Installation

pnpm dlx shadcn@latest add @loading-ui/pulse

Usage

import { Pulse } from "@/components/loading-ui/pulse";
<Pulse />

Customization

Pulse animates a bordered ring with gentle scale and opacity breathing. It is deliberately low urgency—use it when you want presence without implying a hard error or precise percent complete.

Size

Match the ring to icons, badges, and list rows with size-* utilities on the outer span.

LoadingLoadingLoadingLoading
import { Pulse } from "@/components/loading-ui/pulse";

export function PulseSize() {

Color

The ring uses border-current, so the stroke follows inherited foreground and currentColor. The Color preview uses explicit hex swatches for clarity.

LoadingLoadingLoading
import { Pulse } from "@/components/loading-ui/pulse";

export function PulseColor() {

Ring weight

Target the animated ring with a child selector if you need a lighter or heavier stroke.

LoadingLoadingLoading
import { Pulse } from "@/components/loading-ui/pulse";

export function PulseRingWeight() {

Duration

Breathing speed follows --duration.

LoadingLoadingLoading
import { Pulse } from "@/components/loading-ui/pulse";

export function PulseDuration() {

Examples

These examples emphasize soft holds: warm cache, idle polish, and tooltips that explain a temporary state.

Button

Keeps pending actions feeling patient next to firmer spinners elsewhere in the app.

import { Button } from "@/components/ui/button";
import { Pulse } from "@/components/loading-ui/pulse";

Badge

Works well for “standby” or “degraded but OK” badges where a full spinner would feel loud.

LoadingBreathing roomLoadingIdle polishLoadingGentle hold
import { Badge } from "@/components/ui/badge";
import { Pulse } from "@/components/loading-ui/pulse";

Collapsible

A dashed shell and muted copy reinforce that the section is optional context, not a blocker.

When you open this section, the loader can disappear or hand off to skeleton lines depending on your data shape.

import { ChevronsUpDownIcon } from "lucide-react";

import {

Tooltip

Short explanations plus a subtle pulse signal backoff or partial health without opening a dialog.

import { Button } from "@/components/ui/button";
import {
  Tooltip,