Docs
Badge

Badge

Displays a badge or a component that looks like a badge.

Loading...

Installation

Copy and paste the following code into your project.

import * as React from "react";
import type { VariantProps } from "cva";
import { cva } from "cva";
 
import { cn } from "@/lib/utils";
 
export const badgeVariants = cva({
  base: cn(
    "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors",
    "focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
  ),
  variants: {
    variant: {
      default: "border-transparent",
      invert: "border-transparent",
      outline: "",
    },
    intent: {
      default: "",
      secondary: "",
      destructive: "",
      warning: "",
      success: "",
      info: "",
    },
    size: {
      xs: "px-[7px] py-[1px] text-[0.6rem]",
      sm: "px-[8px] py-[3px] text-[0.7rem]",
      default: "px-[9px] py-[5px] text-xs",
      lg: "px-[10px] py-[6px] text-xs",
    },
  },
  compoundVariants: [
    // default variant
    {
      variant: "default",
      intent: "default",
      className: "bg-primary text-primary-foreground",
    },
    {
      variant: "default",
      intent: "secondary",
      className: "bg-secondary text-secondary-foreground",
    },
    {
      variant: "default",
      intent: "info",
      className: "bg-sky-500 text-white",
    },
    {
      variant: "default",
      intent: "destructive",
      className: "bg-destructive text-destructive-foreground",
    },
    {
      variant: "default",
      intent: "warning",
      className: "bg-orange-500 text-white",
    },
    {
      variant: "default",
      intent: "success",
      className: "bg-green-600 text-white",
    },
    // invert variant
    {
      variant: "invert",
      intent: "success",
      className: "bg-green-500/20 text-green-600",
    },
    {
      variant: "invert",
      intent: "warning",
      className: "bg-orange-500/20 text-orange-500",
    },
    {
      variant: "invert",
      intent: "destructive",
      className: "bg-destructive/20 text-destructive",
    },
    {
      variant: "invert",
      intent: "info",
      className: "bg-sky-500/20 text-sky-500",
    },
    {
      variant: "invert",
      intent: "secondary",
      className: "bg-secondary-foreground/40 text-secondary",
    },
    {
      variant: "invert",
      intent: "default",
      className: "bg-primary/20 text-primary",
    },
  ],
  defaultVariants: {
    variant: "default",
    size: "default",
    intent: "default",
  },
});
 
export interface BadgeProps
  extends React.HTMLAttributes<HTMLDivElement>,
    VariantProps<typeof badgeVariants> {}
 
export function Badge({
  className,
  variant,
  intent,
  size,
  ...props
}: BadgeProps) {
  return (
    <div
      className={cn(badgeVariants({ variant, intent, size }), className)}
      {...props}
    />
  );
}

Update the import paths to match your project setup.

You can use the badgeVariants helper to create a link that looks like a badge.

import { badgeVariants } from "@/components/ui/badge";
<Link className={badgeVariants({ variant: "outline" })}>Badge</Link>