Badge
Example
Solid Example
RedOrangeAmberYellowLimeGreenEmeraldTealCyanSkyBlueIndigoVioletPurpleFuchsiaPinkRoseZincLight
Outline Example
RedOrangeAmberYellowLimeGreenEmeraldTealCyanSkyBlueIndigoVioletPurpleFuchsiaPinkRoseZincLight
Outline Duotone Example
RedOrangeAmberYellowLimeGreenEmeraldTealCyanSkyBlueIndigoVioletPurpleFuchsiaPinkRoseZincLight
Duotone Example
RedOrangeAmberYellowLimeGreenEmeraldTealCyanSkyBlueIndigoVioletPurpleFuchsiaPinkRoseZincLight
Code
import cn from '@/utils/cn'
import { cva, type VariantProps } from 'class-variance-authority'
import React from 'react'
const badge = cva(['inline-flex items-center gap-x-1.5 px-1.5 py-0.5 font-medium sm:text-xs/5 forced-colors:outline transition-all duration-300 ease-in-out'], {
variants: {
color: {
red: '',
orange: '',
amber: '',
yellow: '',
lime: '',
green: '',
emerald: '',
teal: '',
cyan: '',
sky: '',
blue: '',
indigo: '',
violet: '',
purple: '',
fuchsia: '',
pink: '',
rose: '',
zinc: '',
light: ''
},
size: {
xs: 'text-xs',
sm: 'text-sm',
md: 'text-md',
lg: 'text-lg'
},
rounded: {
none: 'rounded-none',
sm: 'rounded-sm',
md: 'rounded-md',
lg: 'rounded-lg',
full: 'rounded-full'
},
duotone: {
true: ''
},
variant: {
solid: '',
duotone: '',
outline: 'border'
}
},
compoundVariants: [
{ variant: 'outline', color: 'red', className: 'border-red-500 dark:border-red-500/50' },
{ variant: 'outline', color: 'orange', className: 'border-orange-500 dark:border-orange-500/50' },
{ variant: 'outline', color: 'amber', className: 'border-amber-400 dark:border-amber-400/50' },
{ variant: 'outline', color: 'yellow', className: 'border-yellow-400 dark:border-yellow-400/50' },
{ variant: 'outline', color: 'lime', className: 'border-lime-400 dark:border-lime-400/50' },
{ variant: 'outline', color: 'green', className: 'border-green-500 dark:border-green-500/50' },
{ variant: 'outline', color: 'emerald', className: 'border-emerald-500 dark:border-emerald-500/50' },
{ variant: 'outline', color: 'teal', className: 'border-teal-500 dark:border-teal-500/50' },
{ variant: 'outline', color: 'cyan', className: 'border-cyan-400 dark:border-cyan-400/50' },
{ variant: 'outline', color: 'sky', className: 'border-sky-500 dark:border-sky-500/50' },
{ variant: 'outline', color: 'blue', className: 'border-blue-500 dark:border-blue-500/50' },
{ variant: 'outline', color: 'indigo', className: 'border-indigo-500 dark:border-indigo-500/50' },
{ variant: 'outline', color: 'violet', className: 'border-violet-500 dark:border-violet-500/50' },
{ variant: 'outline', color: 'purple', className: 'border-purple-500 dark:border-purple-500/50' },
{ variant: 'outline', color: 'fuchsia', className: 'border-fuchsia-400 dark:border-fuchsia-400/50' },
{ variant: 'outline', color: 'pink', className: 'border-pink-400 dark:border-pink-400/50' },
{ variant: 'outline', color: 'rose', className: 'border-rose-400 dark:border-rose-400/50' },
{ variant: 'outline', color: 'zinc', className: 'border-zinc-600 dark:border-white/50' },
{ variant: 'outline', color: 'light', className: 'border-zinc-800 dark:border-zinc-100/15' },
// Solid variants
{ variant: 'solid', color: 'red', className: 'text-white bg-red-500 dark:bg-red-500' },
{ variant: 'solid', color: 'orange', className: 'bg-orange-500 dark:bg-orange-500' },
{ variant: 'solid', color: 'amber', className: 'bg-amber-400 dark:bg-amber-400' },
{ variant: 'solid', color: 'yellow', className: 'text-black bg-yellow-400 dark:bg-yellow-400' },
{ variant: 'solid', color: 'lime', className: 'text-black bg-lime-400 dark:bg-lime-400' },
{ variant: 'solid', color: 'green', className: 'bg-green-500 dark:bg-green-500' },
{ variant: 'solid', color: 'emerald', className: 'bg-emerald-500 dark:bg-emerald-500' },
{ variant: 'solid', color: 'teal', className: 'bg-teal-500 dark:bg-teal-500' },
{ variant: 'solid', color: 'cyan', className: 'text-black bg-cyan-400 dark:bg-cyan-400' },
{ variant: 'solid', color: 'sky', className: 'bg-sky-500 dark:bg-sky-500' },
{ variant: 'solid', color: 'blue', className: 'bg-blue-500 dark:bg-blue-500' },
{ variant: 'solid', color: 'indigo', className: 'bg-indigo-500 dark:bg-indigo-500' },
{ variant: 'solid', color: 'violet', className: 'bg-violet-500 dark:bg-violet-500' },
{ variant: 'solid', color: 'purple', className: 'bg-purple-500 dark:bg-purple-500' },
{ variant: 'solid', color: 'fuchsia', className: 'bg-fuchsia-400 dark:bg-fuchsia-400' },
{ variant: 'solid', color: 'pink', className: 'bg-pink-400 dark:bg-pink-400' },
{ variant: 'solid', color: 'rose', className: 'bg-rose-400 dark:bg-rose-400' },
{ variant: 'solid', color: 'zinc', className: 'bg-zinc-600 dark:bg-white text-black' },
{ variant: 'solid', color: 'light', className: 'bg-zinc-100 dark:bg-zinc-700 dark:text-zinc-200' },
// Duotone variants
{ duotone: true, color: 'red', className: 'bg-red-500/15 dark:bg-red-500/10 text-red-700 dark:text-red-400' },
{ duotone: true, color: 'orange', className: 'bg-orange-500/15 dark:bg-orange-500/10 text-orange-700 dark:text-orange-400' },
{ duotone: true, color: 'amber', className: 'bg-amber-400/15 dark:bg-amber-400/10 text-amber-400 dark:text-amber-400' },
{ duotone: true, color: 'yellow', className: 'bg-yellow-400/15 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400' },
{ duotone: true, color: 'lime', className: 'bg-lime-400/15 dark:bg-lime-400/10 text-lime-700 dark:text-lime-400' },
{ duotone: true, color: 'green', className: 'bg-green-500/15 dark:bg-green-500/10 text-green-700 dark:text-green-400' },
{ duotone: true, color: 'emerald', className: 'bg-emerald-500/15 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-400' },
{ duotone: true, color: 'teal', className: 'bg-teal-500/15 dark:bg-teal-500/10 text-teal-700 dark:text-teal-400' },
{ duotone: true, color: 'cyan', className: 'bg-cyan-400/15 dark:bg-cyan-400/10 text-cyan-700 dark:text-cyan-400' },
{ duotone: true, color: 'sky', className: 'bg-sky-500/15 dark:bg-sky-500/10 text-sky-700 dark:text-sky-400' },
{ duotone: true, color: 'blue', className: 'bg-blue-500/15 dark:bg-blue-500/10 text-blue-700 dark:text-blue-400' },
{ duotone: true, color: 'indigo', className: 'bg-indigo-500/15 dark:bg-indigo-500/10 text-indigo-700 dark:text-indigo-400' },
{ duotone: true, color: 'violet', className: 'bg-violet-500/15 dark:bg-violet-500/10 text-violet-700 dark:text-violet-400' },
{ duotone: true, color: 'purple', className: 'bg-purple-500/15 dark:bg-purple-500/10 text-purple-700 dark:text-purple-400' },
{ duotone: true, color: 'fuchsia', className: 'bg-fuchsia-400/15 dark:bg-fuchsia-400/10 text-fuchsia-700 dark:text-fuchsia-400' },
{ duotone: true, color: 'pink', className: 'bg-pink-400/15 dark:bg-pink-400/10 text-pink-700 dark:text-pink-400' },
{ duotone: true, color: 'rose', className: 'bg-rose-400/15 dark:bg-rose-400/10 text-rose-700 dark:text-rose-400' },
{ duotone: true, color: 'zinc', className: 'bg-zinc-600/10 dark:bg-white/10 text-zinc-700 dark:text-zinc-400' },
{ duotone: true, color: 'light', className: 'bg-zinc-100/10 text-zinc-700 dark:text-zinc-400' }
],
defaultVariants: {
color: 'light',
size: 'md',
rounded: 'md',
variant: 'solid'
}
})
type BadgeProps = React.ComponentPropsWithoutRef<'span'> & {} & VariantProps<typeof badge>
export function Badge({ color = 'zinc', className, variant, size, rounded, duotone, ...props }: BadgeProps) {
return <span {...props} className={cn(badge({ color, variant, size, rounded, duotone }), className)} />
}
Usage
<Badge color="red">Red</Badge>