{ "$schema": "https://blode.co/ui/schema/registry-item.json", "name": "badge", "title": "Badge", "author": "Matthew Blode", "description": "A small status indicator for labelling and categorising items.", "dependencies": ["@base-ui/react"], "files": [ { "path": "ui/badge.tsx", "content": "import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst badgeVariants = cva(\n \"inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-full border border-transparent px-2 py-0.5 font-medium text-xs transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3\",\n {\n defaultVariants: {\n variant: \"default\",\n },\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90\",\n ghost: \"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 [a&]:hover:underline\",\n outline:\n \"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n secondary: \"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n success:\n \"bg-green-50 text-green-700 dark:bg-green-950 dark:text-green-300 [a&]:hover:bg-green-50/80 dark:[a&]:hover:bg-green-950/80\",\n warning:\n \"bg-yellow-50 text-yellow-700 dark:bg-yellow-950 dark:text-yellow-300 [a&]:hover:bg-yellow-50/80 dark:[a&]:hover:bg-yellow-950/80\",\n },\n },\n },\n);\n\ntype BadgeProps = React.ComponentProps<\"span\"> &\n VariantProps & { asChild?: boolean };\n\nconst Badge = ({\n className,\n variant = \"default\",\n asChild = false,\n children,\n ...props\n}: BadgeProps) =>\n useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n asChild ? props : { ...props, children },\n ),\n render: asChild ? (children as React.ReactElement) : undefined,\n state: {\n slot: \"badge\",\n variant,\n },\n });\n\nexport { Badge, badgeVariants };\nexport type { BadgeProps };\n", "type": "registry:ui", "target": "" } ], "type": "registry:ui" }