41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { clsx } from "clsx";
|
|
|
|
type Variant = "success" | "warning" | "danger" | "neutral" | "accent";
|
|
|
|
interface BadgeProps {
|
|
variant?: Variant;
|
|
children: React.ReactNode;
|
|
className?: string;
|
|
}
|
|
|
|
const variantClasses: Record<Variant, string> = {
|
|
success: "bg-success/15 text-success border-success/30",
|
|
warning: "bg-warning/15 text-warning border-warning/30",
|
|
danger: "bg-danger/15 text-danger border-danger/30",
|
|
neutral: "bg-surface-2 text-text-secondary border-border",
|
|
accent: "bg-accent/15 text-accent border-accent/30",
|
|
};
|
|
|
|
export function Badge({ variant = "neutral", children, className }: BadgeProps) {
|
|
return (
|
|
<span
|
|
className={clsx(
|
|
"inline-flex items-center gap-1 rounded-full border px-2.5 py-0.5 text-xs font-medium",
|
|
variantClasses[variant],
|
|
className
|
|
)}
|
|
>
|
|
{(variant === "success" || variant === "warning" || variant === "danger") && (
|
|
<span
|
|
className={clsx("h-1.5 w-1.5 rounded-full", {
|
|
"bg-success": variant === "success",
|
|
"bg-warning": variant === "warning",
|
|
"bg-danger": variant === "danger",
|
|
})}
|
|
/>
|
|
)}
|
|
{children}
|
|
</span>
|
|
);
|
|
}
|