| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- import * as React from "react";
- import { cva, type VariantProps } from "class-variance-authority";
- import { cn } from "@/lib/utils";
- const badgeVariants = cva(
- "inline-flex items-center gap-1 rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors",
- {
- variants: {
- variant: {
- default:
- "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
- secondary:
- "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
- destructive:
- "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
- outline: "text-foreground hover:bg-accent/50",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
- );
- export interface BadgeProps
- extends React.HTMLAttributes<HTMLDivElement>,
- VariantProps<typeof badgeVariants> {
- loading?: boolean;
- }
- function Badge({
- className,
- variant,
- onClick,
- loading,
- children,
- ...props
- }: BadgeProps) {
- return (
- <div
- className={cn(
- badgeVariants({ variant }),
- onClick && "cursor-pointer",
- "relative select-none",
- className
- )}
- onClick={onClick}
- role={onClick ? "button" : undefined}
- tabIndex={onClick ? 0 : undefined}
- {...props}
- >
- {loading && (
- <svg
- className="mr-1 h-3 w-3 animate-spin text-current"
- xmlns="http://www.w3.org/2000/svg"
- fill="none"
- viewBox="0 0 24 24"
- >
- <circle
- className="opacity-25"
- cx="12"
- cy="12"
- r="10"
- stroke="currentColor"
- strokeWidth="4"
- ></circle>
- <path
- className="opacity-75"
- fill="currentColor"
- d="M4 12a8 8 0 018-8v8H4z"
- ></path>
- </svg>
- )}
- {children}
- </div>
- );
- }
- export { Badge, badgeVariants };
|