Badge

A small label for status, category, or metadata.

pnpm dlx shadcn@latest add @uiarc/badge
Live · keyboard ready
  • Short statuses next to titles or in table cells, such as Live, Draft, or Failed.
  • Counts or states that change in place and should morph instead of jump.
  • Tagging a row with one tone plus an optional icon.
  • Use alert or toast when the message needs a full sentence.
  • Use chip-group when people toggle the values.
  • Use stat-card for a headline number with a trend.

Installation

Add Badge with the shadcn CLI, or copy the source by hand.

pnpm dlx shadcn@latest add @uiarc/badge

Adds the component and its local dependencies, and installs motion. First time? Add the @uiarc registry to components.json, or use the full URL:

example.tsx
import { Check } from "lucide-react";import { Badge } from "@/components/arc/badge/badge"; export function DeployStatus({ live }: { live: boolean }) {  return (    <Badge tone={live ? "success" : "neutral"} icon={live ? <Check size={12} /> : undefined}>      {live ? "Live" : "Draft"}    </Badge>  );}

Badge

A small status label in five status tones and six categorical colours whose label and icon morph in place when they change.

PropTypeDefaultDescription
tone"neutral" | "success" | "info" | "warning" | "danger""neutral"Status role. Every tone is a soft tint of its semantic token (--success, --info, --warning, --danger) with the tone as text.
size"sm" | "md" | "lg""md"Height 20, 24 or 28 px with 11, 12 or 14 px text.
iconReactNode–Leading icon, sized to the badge (12, 14 or 16 px) and drawn in the tone colour. A different icon component crossfades in.
dotbooleanfalseLeading status dot in the tone colour. Ignored when icon is set.
color"teal" | "sky" | "orchid" | "violet" | "rose" | "amber"–Categorical colour from the shared --tone-* palette, for labels such as method tags. Overrides tone.
outlinebooleanfalseHairline border in the tone colour. Off by default.
pillbooleanfalseFully rounded ends instead of the default 5, 6 or 7 px corners.
childrenReactNode–Label. String or number children get the rolling text swap; other nodes render as is.
...propsHTMLAttributes<HTMLSpanElement>–Forwarded to the root span.
  • Renders a plain span, so it is read inline with surrounding text.
  • The icon is aria-hidden; the label must state the status on its own, not rely on tone color.
  • Outgoing labels are hidden from assistive tech while they fade, so only the current text is read.
  • It does not announce changes. Put it inside a live region if a status update must be spoken.
  • A new label rises in with a short blur while the old one lifts away, and the pill width springs to fit.
  • Passive reflows such as font swaps resize instantly; only a content change springs.
  • Reduced motion swaps the label with a quick fade and snaps the width.
  • The pill sizes to its label and never wraps, so keep labels to a word or two in narrow cells.
  • Hover styles apply only on hover-capable fine pointers.
  • Each badge has a ResizeObserver for the width spring; fine per row, but avoid thousands in one table.
  • Font swaps and passive reflows resize instantly; only content changes animate.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Use for short statuses and counts next to titles or in table cells. Use alert or toast for messages with sentences.
  • Use dot for live states (online, syncing, down) and an icon when the shape adds meaning; the label is optically centred either way.
  • Use tone for status and color for categories (GET teal, POST sky, PUT orchid, PATCH violet, DELETE rose); never use a categorical colour to mean success or failure.
  • Keep the badge mounted and change its children to get the morph; remounting with a new key loses it.
/components/badge/markdown

The full library index for assistants is at /llms.txt.