48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
/**
|
|
* Badge Component
|
|
* Small status indicator or label
|
|
*/
|
|
|
|
import React, { HTMLAttributes, ReactNode } from 'react';
|
|
|
|
export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
|
|
variant?: 'default' | 'success' | 'warning' | 'error' | 'info';
|
|
size?: 'sm' | 'md' | 'lg';
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const Badge: React.FC<BadgeProps> = ({
|
|
variant = 'default',
|
|
size = 'md',
|
|
children,
|
|
className = '',
|
|
...props
|
|
}) => {
|
|
const variantStyles = {
|
|
default: 'bg-gray-800 text-gray-300 border-gray-700',
|
|
success: 'bg-green-500/10 text-green-400 border-green-500/30',
|
|
warning: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/30',
|
|
error: 'bg-red-500/10 text-red-400 border-red-500/30',
|
|
info: 'bg-blue-500/10 text-blue-400 border-blue-500/30',
|
|
};
|
|
|
|
const sizeStyles = {
|
|
sm: 'px-2 py-0.5 text-xs',
|
|
md: 'px-2.5 py-1 text-sm',
|
|
lg: 'px-3 py-1.5 text-base',
|
|
};
|
|
|
|
return (
|
|
<span
|
|
className={`
|
|
inline-flex items-center font-semibold rounded-md border
|
|
${variantStyles[variant]}
|
|
${sizeStyles[size]}
|
|
${className}
|
|
`}
|
|
{...props}
|
|
>
|
|
{children}
|
|
</span>
|
|
);
|
|
};
|