/ lionsmane-fe / src / components / ui / badge.tsx
badge.tsx
 1  import { cva, type VariantProps } from 'class-variance-authority';
 2  import { Slot } from 'radix-ui';
 3  import * as React from 'react';
 4  
 5  import { cn } from '@/lib/utils';
 6  
 7  const badgeVariants = cva(
 8    'inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3',
 9    {
10      defaultVariants: {
11        variant: 'default',
12      },
13      variants: {
14        variant: {
15          default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90',
16          destructive:
17            'bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90',
18          ghost: '[a&]:hover:bg-accent [a&]:hover:text-accent-foreground',
19          link: 'text-primary underline-offset-4 [a&]:hover:underline',
20          outline:
21            'border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',
22          secondary:
23            'bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',
24        },
25      },
26    },
27  );
28  
29  function Badge({
30    className,
31    variant = 'default',
32    asChild = false,
33    ...props
34  }: React.ComponentProps<'span'> &
35    VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
36    const Comp = asChild ? Slot.Root : 'span';
37  
38    return (
39      <Comp
40        className={cn(badgeVariants({ variant }), className)}
41        data-slot="badge"
42        data-variant={variant}
43        {...props}
44      />
45    );
46  }
47  
48  export { Badge, badgeVariants };