Aller au contenu

Badge

Une petite étiquette destinée aux statuts, aux nombres et aux balises sur les cartes, les tableaux et les éléments de navigation — avec un style néobrutaliste caractérisé par des bordures et des ombres.

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

export function BadgeDemo() {

Le badge est une étiquette compacte en ligne — un simple <span> sans primitive en dessous, habillé du style néobrutaliste : bordures épaisses, ombres marquées et typographie affirmée. La prop render (via le useRender de Base UI) permet à n’importe quel élément — un lien, un bouton — d’endosser les styles du badge.

À privilégier pour :

  • Statuts — « Actif », « Brouillon », « Échec » sur les lignes de tableau et les cartes ; destructive pour les erreurs.
  • Compteurs — messages non lus, articles du panier, totaux de notifications à côté des libellés de navigation.
  • Tags et métadonnées — catégories sur les cartes de blog, niveaux de forfait, étiquettes de version dans la doc.

Installation

pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/badge.json
npx shadcn@latest add https://neobrutalism.com/r/base/badge.json
yarn dlx shadcn@latest add https://neobrutalism.com/r/base/badge.json
bunx --bun shadcn@latest add https://neobrutalism.com/r/base/badge.json

Copiez et collez le code suivant dans votre projet.

components/ui/badge.tsx
import * as React from "react"
import { cva, type VariantProps } from "class-variance-authority"
import { Slot } from "radix-ui"

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

const badgeVariants = cva(
  "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded border-2 px-2 py-0.5 text-xs font-head font-medium whitespace-nowrap shadow-sm transition-all focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive [&>svg]:pointer-events-none [&>svg]:size-3!",
  {
    variants: {
      variant: {
        default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
        secondary:
          "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
        destructive:
          "bg-destructive text-destructive-foreground [a]:hover:bg-destructive/90",
        outline:
          "bg-transparent text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
        ghost:
          "border-transparent bg-transparent shadow-none hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
        link: "border-transparent bg-transparent shadow-none text-primary underline-offset-4 hover:underline",
      },
    },
    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 }

Adaptez les chemins d’import à la structure de votre projet.

Utilisation

import { Badge } from "@/components/ui/badge"
<Badge variant="default | outline | secondary | destructive">Badge</Badge>

Exemples

Variantes

Utilisez la prop variant pour changer la variante du badge.

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

export function BadgeVariants() {

Avec icône

Vous pouvez afficher une icône à l’intérieur du badge. Utilisez data-icon="inline-start" pour placer l’icône à gauche et data-icon="inline-end" pour la placer à droite.

import { BadgeCheck, BookmarkIcon } from "lucide-react"

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

Avec spinner

Vous pouvez afficher un spinner à l’intérieur du badge. Pensez à ajouter la prop data-icon="inline-start" ou data-icon="inline-end" au spinner.

import { Badge } from "@/components/ui/badge"
import { Spinner } from "@/components/ui/spinner"

Lien

Utilisez la prop render pour afficher un lien sous forme de badge.

import { ArrowUpRightIcon } from "lucide-react"

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

Couleurs personnalisées

Vous pouvez personnaliser les couleurs d’un badge en ajoutant des classes personnalisées comme bg-chart-2 text-primary-foreground sur le composant Badge.

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

export function BadgeCustomColors() {

RTL

Pour activer le RTL dans Neobrutalism, consultez le guide de configuration RTL.

"use client"

import * as React from "react"

Accessibilité

Le badge rend un simple <span> — les lecteurs d’écran n’en reçoivent que le texte, rien de plus ; ne laissez donc pas la couleur porter le sens à elle seule : variant="destructive" s’annonce exactement comme default, c’est au texte de dire « Échec ». Les compteurs nus ont besoin de contexte — ajoutez un aria-label ou du texte masqué visuellement pour que « 3 » se lise « 3 notifications non lues ». Rendu comme lien via la prop render, c’est une ancre ordinaire et la sémantique habituelle des liens s’applique.

Référence API

Badge

Le composant Badge affiche un badge ou un composant qui ressemble à un badge.

PropTypeDefault
variant"default" | "secondary" | "destructive" | "outline" | "ghost" | "link""default"
classNamestring-