UIUI
Badge
A versatile badge component for displaying status, labels, or categories.
DefaultSecondaryOutlineGhostDestructive
1
99+5
New<div className="flex flex-col gap-6">
<div className="flex gap-4 flex-wrap">
<Badge>Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="outline">Outline</Badge>
<Badge variant="ghost">Ghost</Badge>
<Badge variant="destructive">Destructive</Badge>
</div>
<div className="flex gap-4 flex-wrap items-center">
<Badge variant="outline" size="sm">
1
</Badge>
<Badge variant="secondary">99+</Badge>
<Badge variant="destructive" size="icon" className="rounded-full">
5
</Badge>
<Badge variant="default">New</Badge>
</div>
</div>
Installation
Install following dependencies:
npm install class-variance-authority lucide-react
Copy and paste the following code into your project.
"use client";
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
import { type LucideIcon } from "lucide-react";
const badgeVariants = cva(
"flex items-center justify-center gap-1.5 rounded-[calc(var(--radius)-4px)] border text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {
default:
"border-transparent bg-primary text-primary-foreground hover:bg-primary/80 focus-visible:ring-ring ",
secondary:
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80 focus-visible:ring-ring",
destructive:
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80 focus-visible:ring-destructive ",
outline:
"border-border text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring ",
ghost:
"border-transparent text-foreground hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring",
},
size: {
sm: "h-5 px-2",
default: "h-6 px-2.5",
lg: "h-7 px-3 text-sm",
icon: "h-6 w-6 p-0",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
);
export interface BadgeProps
extends React.HTMLAttributes<HTMLSpanElement>,
VariantProps<typeof badgeVariants> {
icon?: LucideIcon;
iconPosition?: "left" | "right";
}
function Badge({
className,
variant,
size,
icon: Icon,
iconPosition = "left",
children,
...props
}: BadgeProps) {
const iconSize = size === "sm" ? 12 : size === "lg" ? 14 : 12;
return (
<span
className={cn(badgeVariants({ variant, size }), className)}
{...props}
>
{Icon && iconPosition === "left" && (
<Icon size={iconSize} className="shrink-0" />
)}
{children}
{Icon && iconPosition === "right" && (
<Icon size={iconSize} className="shrink-0" />
)}
</span>
);
}
export { Badge, badgeVariants };
npx hextaui@latest add badge
Usage
import { Badge } from "@/components/ui/Badge/Badge";
<Badge variant="default">Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="outline">Outline</Badge>
<Badge variant="ghost">Ghost</Badge>
<Badge variant="destructive">Destructive</Badge>
Props
Prop | Type | Default |
---|---|---|
variant? | "default" | "secondary" | "destructive" | "outline" | "ghost" | "default" |
size? | "sm" | "default" | "lg" | "default" |
icon? | LucideIcon | undefined |
iconPosition? | "left" | "right" | "left" |
className? | string | undefined |
children? | ReactNode | undefined |
Edit on GitHub
Last updated on