mirror of
https://github.com/vercel/commerce.git
synced 2025-05-11 20:27:51 +00:00
64 lines
1.7 KiB
TypeScript
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>
|
|
);
|
|
}
|