abnormal.UI overview

Display

Badge

A small chip for counts, domains and roles.

Preview

DefaultOutlineSuccessDestructiveNew

Install

pnpm dlx shadcn@latest add @abnormal/badge
Brings inutilsclass-variance-authorityradix-ui

Usage

import { Badge } from "@/components/ui/badge";

export default function BadgeDemo() {
return (
<div className="flex flex-wrap justify-center gap-2">
<Badge>Default</Badge>
<Badge variant="outline">Outline</Badge>
<Badge variant="success">Success</Badge>
<Badge variant="destructive">Destructive</Badge>
<Badge variant="brand">New</Badge>
</div>
);
}
Source
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
import { Slot } from "radix-ui";

/**
* Chip: a small label on a surface background with soft rounded corners, marking side notes such as counts, domains and roles.
* To express status use StatusLabel (dot + word), not a chip.
*/
const badgeVariants = cva(
"inline-flex h-6 w-fit shrink-0 items-center gap-1 rounded-chip border border-transparent px-2 text-xs leading-none font-medium whitespace-nowrap [&>svg]:size-3",
{
variants: {
variant: {
default: "bg-muted text-muted-foreground",
secondary: "bg-muted text-muted-foreground",
outline: "border-border text-muted-foreground",
destructive: "bg-destructive/10 text-destructive",
success: "bg-success/10 text-success",
brand: "bg-highlight text-highlight-foreground",
},
},
defaultVariants: {
variant: "default",
},
},
);

function Badge({
className,
variant = "default",
asChild = false,
...props
}: React.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
const Comp = asChild ? Slot.Root : "span";

return (
<Comp data-slot="badge" data-variant={variant} className={cn(badgeVariants({ variant }), className)} {...props} />
);
}

export { Badge, badgeVariants };