Basic UI
  • Docs
  • Compressor
  • Parser
Getting Started
  • Introduction
  • Themenew
Components
  • Button
  • Button Group
  • Badge
  • Radio Group
  • Checkbox
  • Avatar
  • Label
  • File Dropzone
  1. Docs/
  2. Components/
  3. Badge

Badge

Previous pageNext page

A compact status indicator with color variants, optional dot, and configurable styling.

Loading...

Installation

pnpm dlx shadcn@latest add @basic-ui/badge

Usage

import { Badge } from "@/components/ui/badge"
 
export default function App() {
  return <Badge variant="success"
Previous
Button Group
Next
Radio Group

On This Page

InstallationUsageExamplesVariantsSizesRadius ControlWithout DotDesign SystemColor Theming LogicDesign TokensProps
badge-demo
>Success</
Badge
>
}

Examples

Variants

The Badge component supports two types of theming:

Dot-only variants (color applies only to dot):

  • default - Green dot with grey text
  • grey - Grey dot with grey text

Full-themed variants (color applies to dot, text, background, and border):

  • error - Red theme
  • warning - Orange theme
  • success - Green theme
  • blue - Blue theme
Loading...

Sizes

Each size has a corresponding border-radius value:

  • s - 20px height, 5px radius
  • r - 22px height, 6px radius (default)
  • m - 24px height, 7px radius
Loading...

Radius Control

The radius prop controls both border-radius and background/border application:

radius="true" (default):

  • Applies size-specific border-radius (5px/6px/7px)
  • Dot-only variants get light grey background
  • Full-themed variants get subtle colored background with colored border

radius="false":

  • Minimal rounding (2px)
  • No backgrounds or borders applied
  • Only text color and dot color are styled
// Rounded with background
<Badge variant="success" radius={true}>Success</Badge>
 
// Minimal rounding without background
<Badge variant="success" radius={false}>Success</Badge>

Without Dot

Use showDot={false} to hide the dot indicator:

<Badge variant="error" showDot={false}>Error</Badge>

Design System

Color Theming Logic

The Badge component uses a sophisticated theming system that distinguishes between two types of variants:

  1. Dot-only theming: Only the dot and text are colored. Used for default and grey variants.
  2. Full theming: Dot, text, background, and border are all colored. Used for error, warning, success, and blue variants.

Design Tokens

Heights (from --badge-height-{size}):

  • s: 20px
  • r: 22px
  • m: 24px

Border Radius (from --badge-radius-{size}):

  • s: 5px
  • r: 6px
  • m: 7px

Spacing:

  • --gap-1: 2px (gap between dot and text)
  • --gap-2: 4px (horizontal padding)

Typography:

  • --font-size-12: 12px (for sizes s and r)
  • --font-size-14: 14px (for size m)
  • --font-family-geist-sans: Geist font family
  • --font-weight-regular-default: 400

Props

PropTypeDefaultRequiredDescription
variantdefault | grey | error | warning | success | bluedefaultNoThe visual style variant. Dot-only variants (default, grey) apply minimal styling. Full-themed variants (error, warning, success, blue) apply color to dot, text, background, and border.
sizes | r | mrNoThe size of the badge. s=20px height with 5px radius, r=22px height with 6px radius, m=24px height with 7px radius.
radiustrue | falsetrueNoControls border-radius and background application. true applies size-specific radius (5px/6px/7px) with backgrounds/borders based on variant. false applies minimal rounding (2px) without backgrounds/borders.
showDotbooleantrueNoWhether to show the dot indicator. Dot color is determined by the variant.

Size

s
r
m
s
r
m

All Variants (radius=true)

Default
Grey
Error
Warning
Success
Blue

All Variants (radius=false)

Default
Grey
Error
Warning
Success
Blue

Without Dot Indicator

No Dot
Error
Success
badge-demo

Size

s
r
m
s
r
m

All Variants (radius=true)

Default
Grey
Error
Warning
Success
Blue

All Variants (radius=false)

Default
Grey
Error
Warning
Success
Blue

Without Dot Indicator

No Dot
Error
Success
badge-sizes

Size: s (20px height, 5px radius)

Default
Error
Success
Blue

Size: r (22px height, 6px radius) - Default

Default
Error
Success
Blue

Size: m (24px height, 7px radius)

Default
Error
Success
Blue

All Sizes Comparison (success variant)

Small
Regular
Medium
import { Badge } from '@/registry/basic-ui/badge';

export function BadgeDemo() {
  return (
    <div className="flex flex-col gap-(--gap-8)">
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Size
        </h3>
        <div className="flex flex-wrap items-center gap-(--gap-4)">
          <Badge size="s" variant="default">
            s
          </Badge>
          <Badge size="r" variant="default">
            r
          </Badge>
          <Badge size="m" variant="default">
            m
          </Badge>
          <Badge size="s" variant="default" radius={false}>
            s
          </Badge>
          <Badge size="r" variant="default" radius={false}>
            r
          </Badge>
          <Badge size="m" variant="default" radius={false}>
            m
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          All Variants (radius={`true`})
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default">Default</Badge>
          <Badge variant="grey">Grey</Badge>
          <Badge variant="error">Error</Badge>
          <Badge variant="warning">Warning</Badge>
          <Badge variant="success">Success</Badge>
          <Badge variant="blue">Blue</Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          All Variants (radius={`false`})
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default" radius={false}>
            Default
          </Badge>
          <Badge variant="grey" radius={false}>
            Grey
          </Badge>
          <Badge variant="error" radius={false}>
            Error
          </Badge>
          <Badge variant="warning" radius={false}>
            Warning
          </Badge>
          <Badge variant="success" radius={false}>
            Success
          </Badge>
          <Badge variant="blue" radius={false}>
            Blue
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Without Dot Indicator
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default" showDot={false}>
            No Dot
          </Badge>
          <Badge variant="error" showDot={false}>
            Error
          </Badge>
          <Badge variant="success" showDot={false}>
            Success
          </Badge>
        </div>
      </div>
    </div>
  );
}
import { Badge } from '@/registry/basic-ui/badge';

export function BadgeDemo() {
  return (
    <div className="flex flex-col gap-(--gap-8)">
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Size
        </h3>
        <div className="flex flex-wrap items-center gap-(--gap-4)">
          <Badge size="s" variant="default">
            s
          </Badge>
          <Badge size="r" variant="default">
            r
          </Badge>
          <Badge size="m" variant="default">
            m
          </Badge>
          <Badge size="s" variant="default" radius={false}>
            s
          </Badge>
          <Badge size="r" variant="default" radius={false}>
            r
          </Badge>
          <Badge size="m" variant="default" radius={false}>
            m
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          All Variants (radius={`true`})
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default">Default</Badge>
          <Badge variant="grey">Grey</Badge>
          <Badge variant="error">Error</Badge>
          <Badge variant="warning">Warning</Badge>
          <Badge variant="success">Success</Badge>
          <Badge variant="blue">Blue</Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          All Variants (radius={`false`})
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default" radius={false}>
            Default
          </Badge>
          <Badge variant="grey" radius={false}>
            Grey
          </Badge>
          <Badge variant="error" radius={false}>
            Error
          </Badge>
          <Badge variant="warning" radius={false}>
            Warning
          </Badge>
          <Badge variant="success" radius={false}>
            Success
          </Badge>
          <Badge variant="blue" radius={false}>
            Blue
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Without Dot Indicator
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge variant="default" showDot={false}>
            No Dot
          </Badge>
          <Badge variant="error" showDot={false}>
            Error
          </Badge>
          <Badge variant="success" showDot={false}>
            Success
          </Badge>
        </div>
      </div>
    </div>
  );
}
import { Badge } from '@/registry/basic-ui/badge';

export function BadgeSizesDemo() {
  return (
    <div className="flex flex-col gap-(--gap-8)">
      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Size: s (20px height, 5px radius)
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge size="s" variant="default">
            Default
          </Badge>
          <Badge size="s" variant="error">
            Error
          </Badge>
          <Badge size="s" variant="success">
            Success
          </Badge>
          <Badge size="s" variant="blue">
            Blue
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Size: r (22px height, 6px radius) - Default
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge size="r" variant="default">
            Default
          </Badge>
          <Badge size="r" variant="error">
            Error
          </Badge>
          <Badge size="r" variant="success">
            Success
          </Badge>
          <Badge size="r" variant="blue">
            Blue
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          Size: m (24px height, 7px radius)
        </h3>
        <div className="flex flex-wrap gap-(--gap-4)">
          <Badge size="m" variant="default">
            Default
          </Badge>
          <Badge size="m" variant="error">
            Error
          </Badge>
          <Badge size="m" variant="success">
            Success
          </Badge>
          <Badge size="m" variant="blue">
            Blue
          </Badge>
        </div>
      </div>

      <div className="flex flex-col gap-(--gap-4)">
        <h3 className="text-sm font-medium text-grey-text-alpha-1-default">
          All Sizes Comparison (success variant)
        </h3>
        <div className="flex items-center flex-wrap gap-(--gap-4)">
          <Badge size="s" variant="success">
            Small
          </Badge>
          <Badge size="r" variant="success">
            Regular
          </Badge>
          <Badge size="m" variant="success">
            Medium
          </Badge>
        </div>
      </div>
    </div>
  );
}