2024-07-08 17:48:27 +03:00

64 lines
1.7 KiB
TypeScript

import { CheckCircleIcon, ExclamationCircleIcon, XCircleIcon } from '@heroicons/react/24/solid';
import clsx from 'clsx';
import { VariantProps, tv } from 'tailwind-variants';
const chip = tv({
slots: {
root: 'inline-flex items-center gap-x-2 rounded-md px-2.5 py-2 text-sm font-medium ring-1 ring-inset',
leadingIcon: 'h-5 w-5'
},
variants: {
level: {
success: {
root: 'bg-green-50 text-green-700 ring-green-600/20'
},
warn: {
root: 'bg-yellow-50 text-yellow-700 ring-yellow-600/20'
},
info: {
root: 'bg-content/5 text-content-emphasis ring-content/20'
},
error: {
root: 'bg-red-50 text-red-700 ring-red-600/20'
}
}
}
});
export interface LevelLeadingProps extends VariantProps<typeof chip> {
className?: string;
}
export interface ChipProps extends VariantProps<typeof chip> {
children: React.ReactNode;
className?: string;
}
function LevelLeadingIcon({ level, className }: LevelLeadingProps) {
if (level === 'success') {
return <CheckCircleIcon className={clsx(className, 'text-green-500')} aria-hidden="true" />;
}
if (level === 'warn') {
return (
<ExclamationCircleIcon className={clsx(className, 'text-yellow-500')} aria-hidden="true" />
);
}
if (level === 'error') {
return <XCircleIcon className={clsx(className, 'text-red-500')} aria-hidden="true" />;
}
return null;
}
export default function Chip({ children, level, className }: ChipProps) {
const { root, leadingIcon } = chip();
return (
<span className={root({ level, className })}>
<LevelLeadingIcon level={level} className={leadingIcon()} />
{children}
</span>
);
}