Overview
Get Started
Badge
A badge or a component that looks like a badge.
Badge
import { Badge } from "@/components/ui/badge";
export function BadgeDemo() {
return <Badge>Badge</Badge>;
}Installation
import { cva, type VariantProps } from "class-variance-authority";
import { mergeProps } from "@base-ui/react/merge-props";
import { useRender } from "@base-ui/react/use-render";
import { cn } from "@/lib/cn";
const badgeVariants = cva(
"inline-flex shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-full border border-transparent font-medium outline-none transition-[color,box-shadow] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-3.5 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
defaultVariants: {
size: "default",
variant: "primary",
},
variants: {
size: {
default: "h-5 px-2 text-xs",
sm: "h-4 px-1.5 text-[0.625rem]",
lg: "h-6 px-3 text-sm",
},
variant: {
primary: "bg-primary text-primary-foreground [button,a&]:hover:bg-primary/90",
secondary: "bg-secondary text-secondary-foreground [button,a&]:hover:bg-secondary/90",
outline:
"border-border bg-transparent dark:bg-input/30 [button,a&]:hover:bg-accent [button,a&]:hover:text-accent-foreground",
info: "bg-info/15 text-info",
success: "bg-success/15 text-success",
warning: "bg-warning/15 text-warning",
danger: "bg-danger text-white [button,a&]:hover:bg-danger/90",
error: "bg-danger/15 text-danger",
},
},
}
);
interface BadgeProps extends useRender.ComponentProps<"span"> {
variant?: VariantProps<typeof badgeVariants>["variant"];
size?: VariantProps<typeof badgeVariants>["size"];
}
function Badge({ className, variant, size, render, ...props }: BadgeProps) {
const defaultProps = {
"data-slot": "badge",
className: cn(badgeVariants({ className, size, variant })),
};
return useRender({
defaultTagName: "span",
props: mergeProps<"span">(defaultProps, props),
render,
});
}
export { Badge, badgeVariants };Usage
import { Badge } from "@/components/ui/badge";<Badge>Badge</Badge>Examples
Variants
PrimarySecondaryOutlineInfoSuccessWarningDestructiveError
import { Badge } from "@/components/ui/badge";
export function BadgeDemo() {
return (
<div className="flex flex-col items-center gap-2 sm:flex-row sm:flex-wrap">
<Badge variant="primary">Primary</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="outline">Outline</Badge>
<Badge variant="info">Info</Badge>
<Badge variant="success">Success</Badge>
<Badge variant="warning">Warning</Badge>
<Badge variant="danger">Destructive</Badge>
<Badge variant="error">Error</Badge>
</div>
);
}Sizes
SmallDefaultLarge
import { Badge } from "@/components/ui/badge";
export function BadgeDemo() {
return (
<div className="flex items-center gap-2">
<Badge size="sm">Small</Badge>
<Badge size="default">Default</Badge>
<Badge size="lg">Large</Badge>
</div>
);
}With icon
VerifiedBookmark
import { IconBookmark, IconRosetteDiscountCheck } from "@tabler/icons-react";
import { Badge } from "@/components/ui/badge";
export function BadgeDemo() {
return (
<div className="flex items-center gap-2">
<Badge variant="success">
<IconRosetteDiscountCheck />
Verified
</Badge>
<Badge variant="outline">
Bookmark
<IconBookmark />
</Badge>
</div>
);
}API Reference
Component type props
Prop
Type
Default
Expand prop details
The variant of the badge.
Type
'primary' | 'secondary' | 'outline' | 'info' | 'success' | 'warning' | 'danger' | 'error'Default
'primary'The size of the badge.
Type
'sm' | 'default' | 'lg'Default
'default'