shadimage
afterglow
uibadgesource: ok · hit

Badge

A bordered rectangle of tracked-out mono for a status or a count. Eight variants.

npx shadcn add "https://afterglow.thebuilder.dk/r/badge.json"
free

Where it goes

stats

Visual style

terminal-mono

Interaction

animated-counter

Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.

Dependencies

Bundle weight · light
ui-primitives@base-ui/react

Registry dependencies

@afterglow/theme

Files1 · source cached 10/9/2026, 5:25:02 PM

registry/terminal/ui/badge.tsx
import { mergeProps } from "@base-ui/react/merge-props";
import { useRender } from "@base-ui/react/use-render";
import { cva } from "class-variance-authority";
import type { VariantProps } from "class-variance-authority";

import { cn } from "@/lib/utils";

const badgeVariants = cva(
  "inline-flex h-[1.125rem] w-fit shrink-0 items-center justify-center gap-1 overflow-hidden whitespace-nowrap rounded-none border px-1.5 pt-[1.5px] font-mono font-semibold text-2xs uppercase leading-none tracking-terminal-lg transition [&>svg]:pointer-events-none [&>svg]:size-3",
  {
    defaultVariants: { variant: "default" },
    variants: {
      variant: {
        amber: "border-amber/60 bg-amber/10 text-amber",
        azure: "border-azure/60 bg-azure/10 text-azure",
        default: "border-line-strong bg-phosphor/10 text-phosphor",
        destructive: "border-destructive bg-destructive/12 text-destructive",
        info: "border-info/60 bg-info/10 text-info",
        outline: "border-line text-muted-foreground",
        signal: "border-signal bg-signal/12 text-signal",
        solid: "border-phosphor bg-phosphor text-void",
        violet: "border-violet/60 bg-violet/10 text-violet",
        warning: "border-warning/60 bg-warning/10 text-warning",
      },
    },
  }
);

function Badge({
  className,
  variant = "default",
  render,
  ...props
}: useRender.ComponentProps<"span"> & VariantProps<typeof badgeVariants>) {
  return useRender({
    defaultTagName: "span",
    props: mergeProps<"span">(
      { className: cn(badgeVariants({ variant }), className) },
      props
    ),
    render,

    state: { slot: "badge", variant },
  });
}

export { Badge, badgeVariants };

More from afterglow

Browse all components in this library →