Openstatus www.openstatus.dev
at main 43 lines 1.7 kB view raw
1import { Slot } from "@radix-ui/react-slot"; 2import { type VariantProps, cva } from "class-variance-authority"; 3import type * as React from "react"; 4 5import { cn } from "@/lib/utils"; 6 7const badgeVariants = cva( 8 "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", 9 { 10 variants: { 11 variant: { 12 default: 13 "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", 14 secondary: 15 "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", 16 destructive: 17 "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", 18 outline: 19 "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", 20 }, 21 }, 22 defaultVariants: { 23 variant: "default", 24 }, 25 }, 26); 27 28export type BadgeProps = React.ComponentProps<"span"> & 29 VariantProps<typeof badgeVariants> & { asChild?: boolean }; 30 31function Badge({ className, variant, asChild = false, ...props }: BadgeProps) { 32 const Comp = asChild ? Slot : "span"; 33 34 return ( 35 <Comp 36 data-slot="badge" 37 className={cn(badgeVariants({ variant }), className)} 38 {...props} 39 /> 40 ); 41} 42 43export { Badge, badgeVariants };