File size: 1,538 Bytes
56c7b6d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import React from 'react';
import { motion, type HTMLMotionProps } from 'framer-motion';
import { cn } from '@/utils/helpers';

interface BadgeProps extends Omit<HTMLMotionProps<'div'>, 'ref'> {
  variant?: 'primary' | 'secondary' | 'success' | 'warning' | 'error';
  size?: 'sm' | 'md';
  icon?: React.ReactNode;
  children?: React.ReactNode;
}

const Badge = React.forwardRef<HTMLDivElement, BadgeProps>(
  (
    {
      variant = 'primary',
      size = 'md',
      icon,
      children,
      className,
      ...props
    },
    ref
  ) => {
    const variants = {
      primary: 'bg-emerald-500/20 text-emerald-200 border border-emerald-500/30',
      secondary: 'bg-slate-700/50 text-slate-200 border border-slate-600/50',
      success: 'bg-green-500/20 text-green-200 border border-green-500/30',
      warning: 'bg-yellow-500/20 text-yellow-200 border border-yellow-500/30',
      error: 'bg-red-500/20 text-red-200 border border-red-500/30',
    };

    const sizes = {
      sm: 'px-2 py-1 text-xs gap-1',
      md: 'px-3 py-1.5 text-sm gap-1.5',
    };

    return (
      <motion.div
        ref={ref}
        whileHover={{ scale: 1.05 }}
        className={cn(
          'inline-flex items-center rounded-full font-medium transition-all duration-200',
          variants[variant],
          sizes[size],
          className
        )}
        {...props}
      >
        {icon && <span className="flex">{icon}</span>}
        {children}
      </motion.div>
    );
  }
);

Badge.displayName = 'Badge';

export default Badge;