/ src / components / Badge / Badge.tsx
Badge.tsx
 1  import * as React from 'react'
 2  import { cva, type VariantProps } from 'class-variance-authority'
 3  import { cn } from '../../lib/utils'
 4  
 5  const badgeVariants = cva(
 6    'inline-flex items-center gap-1 rounded-[var(--radius-badge)] px-2 py-0.5 text-xs font-medium',
 7    {
 8      variants: {
 9        variant: {
10          default:  'bg-[var(--bg-secondary)] text-[var(--text-primary)] border border-[var(--border-default)]',
11          success:  'bg-[oklch(65.4%_0.17_162/0.22)] text-[oklch(65.4%_0.17_162)] border border-[oklch(65.4%_0.17_162/0.45)]',
12          error:    'bg-[oklch(60%_0.22_25/0.22)] text-[oklch(60%_0.22_25)] border border-[oklch(60%_0.22_25/0.45)]',
13          warning:  'bg-[oklch(72%_0.20_50/0.22)] text-[oklch(72%_0.20_50)] border border-[oklch(72%_0.20_50/0.45)]',
14          info:     'bg-[oklch(52.4%_0.22_264/0.22)] text-[oklch(65%_0.18_264)] border border-[oklch(52.4%_0.22_264/0.45)]',
15          pending:  'bg-[oklch(75%_0.15_264/0.22)] text-[oklch(65%_0_0)] border border-[oklch(75%_0.15_264/0.45)]',
16          alpha:    'bg-[oklch(52.4%_0.22_264/0.26)] text-[oklch(65%_0.18_264)] border border-[oklch(52.4%_0.22_264/0.5)]',
17          delta:    'bg-[oklch(80%_0.20_79/0.22)] text-[oklch(80%_0.20_79)] border border-[oklch(80%_0.20_79/0.45)]',
18        },
19      },
20      defaultVariants: {
21        variant: 'default',
22      },
23    }
24  )
25  
26  export interface BadgeProps
27    extends React.HTMLAttributes<HTMLSpanElement>,
28      VariantProps<typeof badgeVariants> {
29    dot?: boolean
30  }
31  
32  export function Badge({ className, variant, dot = false, children, ...props }: BadgeProps) {
33    return (
34      <span className={cn(badgeVariants({ variant, className }))} {...props}>
35        {dot && (
36          <span
37            className="h-1.5 w-1.5 rounded-full bg-current"
38            aria-hidden="true"
39          />
40        )}
41        {children}
42      </span>
43    )
44  }