2026-06-29 07:55:47 +02:00
|
|
|
import React from 'react';
|
|
|
|
|
import clsx from 'clsx';
|
|
|
|
|
|
2026-07-19 17:41:39 +02:00
|
|
|
export type BadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'secondary';
|
2026-06-29 07:55:47 +02:00
|
|
|
|
|
|
|
|
export interface BadgeProps {
|
|
|
|
|
variant?: BadgeVariant;
|
|
|
|
|
children: React.ReactNode;
|
|
|
|
|
className?: string;
|
|
|
|
|
dot?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const variantClasses: Record<BadgeVariant, string> = {
|
|
|
|
|
default: 'bg-secondary-100 text-secondary-700',
|
|
|
|
|
primary: 'bg-primary-100 text-primary-700',
|
|
|
|
|
success: 'bg-success-100 text-success-700',
|
|
|
|
|
warning: 'bg-warning-100 text-warning-700',
|
|
|
|
|
danger: 'bg-danger-100 text-danger-700',
|
|
|
|
|
info: 'bg-accent-100 text-accent-700',
|
2026-07-19 17:41:39 +02:00
|
|
|
secondary: 'bg-secondary-200 text-secondary-800',
|
2026-06-29 07:55:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const dotColors: Record<BadgeVariant, string> = {
|
|
|
|
|
default: 'bg-secondary-400',
|
|
|
|
|
primary: 'bg-primary-500',
|
|
|
|
|
success: 'bg-success-500',
|
|
|
|
|
warning: 'bg-warning-500',
|
|
|
|
|
danger: 'bg-danger-500',
|
|
|
|
|
info: 'bg-accent-500',
|
2026-07-19 17:41:39 +02:00
|
|
|
secondary: 'bg-secondary-500',
|
2026-06-29 07:55:47 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function Badge({ variant = 'default', children, className, dot = false }: BadgeProps) {
|
|
|
|
|
return (
|
|
|
|
|
<span
|
|
|
|
|
className={clsx(
|
|
|
|
|
'inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium',
|
|
|
|
|
variantClasses[variant],
|
|
|
|
|
className
|
|
|
|
|
)}
|
|
|
|
|
>
|
|
|
|
|
{dot && <span className={clsx('w-1.5 h-1.5 rounded-full', dotColors[variant])} aria-hidden="true" />}
|
|
|
|
|
{children}
|
|
|
|
|
</span>
|
|
|
|
|
);
|
|
|
|
|
}
|