Badge
A small status descriptor for UI elements, commonly used for external links and labels.
"use client";
import { Badge } from "@/components/ui/badge/badge";
import Link from "next/link";
import styles from "./badge-demo.module.css";
export default function BadgeDemo() {
return (
<div className={styles.container}>
<Link href="https://base-ui.com" target="_blank" rel="noopener noreferrer">
<Badge>
Documentation <span>↗</span>
</Badge>
</Link>
<Link href="https://github.com" target="_blank" rel="noopener noreferrer">
<Badge variant="secondary">
GitHub <span>↗</span>
</Badge>
</Link>
</div>
);
}
Installation
npx shadcn@latest add https://roiui.com/r/badge.json
Anatomy
anatomy
import { Badge } from '../ui/badge'
<Badge>Badge text</Badge>
Examples
Variants
DefaultSecondaryDestructiveOutline
"use client";
import { Badge } from "@/components/ui/badge/badge";
import styles from "./badge-variants.module.css";
export default function BadgeVariants() {
return (
<div className={styles.container}>
<Badge variant="default">Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="destructive">Destructive</Badge>
<Badge variant="outline">Outline</Badge>
</div>
);
}
Motion Error
Error
badge-error-motion.tsx
"use client";
import { Badge, BadgeIcon } from "@/components/ui/badge/badge";
import { motion } from "motion/react";
const shakeVariants = {
shake: {
x: [-4, 4, 0, -4, 0],
},
};
const shakeTransition = {
duration: 0.3,
};
const iconVariants = {
hidden: {
pathLength: 0,
opacity: 0,
},
visible: {
pathLength: 1,
opacity: 1,
},
};
const iconTransition = {
duration: 0.4,
ease: "easeIn" as const,
};
export default function BadgeErrorFramerMotion() {
return (
<motion.div variants={shakeVariants} animate="shake" transition={shakeTransition}>
<Badge variant="destructive" size="lg">
<BadgeIcon>
<motion.svg
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
initial="hidden"
animate="visible"
>
<motion.circle cx="12" cy="12" r="10" />
<motion.path d="m4.9 4.9 14.2 14.2" variants={iconVariants} transition={iconTransition} />
</motion.svg>
</BadgeIcon>
Error
</Badge>
</motion.div>
);
}
Motion Success
Success
badge-success-motion.tsx
"use client";
import { Badge, BadgeIcon } from "@/components/ui/badge/badge";
import { motion } from "motion/react";
const bounceVariants = {
bounce: {
scale: [0.8, 1.05, 1],
},
};
const bounceTransition = {
duration: 0.4,
};
const checkVariants = {
hidden: {
pathLength: 0,
opacity: 0,
},
visible: {
pathLength: 1,
opacity: 1,
},
};
const checkTransition = {
duration: 0.4,
ease: "easeInOut" as const,
};
export default function BadgeSuccessFramerMotion() {
return (
<motion.div variants={bounceVariants} animate="bounce" transition={bounceTransition}>
<Badge variant="success" size="lg">
<BadgeIcon>
<motion.svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
initial="hidden"
animate="visible"
>
<motion.path d="m3 8 3 3 7-7" variants={checkVariants} transition={checkTransition} />
</motion.svg>
</BadgeIcon>
Success
</Badge>
</motion.div>
);
}