Spaces:
Paused
Paused
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;
|