الانتقال إلى المحتوى

شارة

تسمية توضيحية صغيرة للحالات والأعداد والعلامات على البطاقات والجداول وعناصر التنقل — مع تطبيق أسلوب «النيوبروتاليست» في الحواف والظلال.

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

export function BadgeDemo() {

الشارة عبارة عن ملصق مدمج — وهي عبارة عن <span> عادي بدون عنصر أساسي تحته، مصممة وفقًا لأسلوب «النيوبروتاليةي»: حدود سميكة، وظلال حادة، وخط عريض. تسمح الخاصية render (عبر Base UI's useRender) لأي عنصر — رابط، زر — بتطبيق أنماط الشارة.

استخدمه عندما:

  • الحالات — «نشط»، «مسودة»، «فشل» في صفوف الجداول والبطاقات؛ destructive للأخطاء.
  • الأعداد — الرسائل غير المقروءة، عناصر سلة التسوق، إجمالي الإشعارات بجوار تسميات التنقل.
  • العلامات والبيانات الوصفية — الفئات على بطاقات المدونة، مستويات الخطط، تسميات الإصدارات في المستندات.

التثبيت

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

انسخ الشيفرة التالية والصقها في مشروعك.

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 }

حدّث مسارات الاستيراد لتطابق إعداد مشروعك.

الاستخدام

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

أمثلة

الأنماط

استخدم خاصية variant لتغيير نمط الشارة.

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

export function BadgeVariants() {

مع أيقونة

يمكنك عرض أيقونة داخل الشارة. استخدم data-icon="inline-start" لعرض الأيقونة على اليسار وdata-icon="inline-end" لعرضها على اليمين.

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

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

مع Spinner

يمكنك عرض Spinner داخل الشارة. تذكّر إضافة خاصية data-icon="inline-start" أو data-icon="inline-end" إلى الـ Spinner.

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

رابط

استخدم خاصية render لعرض رابط كشارة.

import { ArrowUpRightIcon } from "lucide-react"

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

ألوان مخصصة

يمكنك تخصيص ألوان الشارة بإضافة فئات مخصصة مثل bg-chart-2 text-primary-foreground إلى مكوّن Badge.

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

export function BadgeCustomColors() {

RTL

لتفعيل RTL في Neobrutalism، راجع دليل إعداد RTL.

"use client"

import * as React from "react"

إمكانية الوصول

تعرض الشارة رمزًا عاديًّا <span> — حيث تقتصر قارئات الشاشة على قراءة النص دون أي عناصر أخرى، لذا لا تجعل اللون وحده هو الذي يحمل المعنى: فالرمز variant="destructive" يُعلن عن نفس معنى default، ويجب أن يشير النص إلى «فشل». تحتاج الأرقام المجردة إلى سياق — أضف aria-label أو نصًا مخفيًا بصريًا بحيث يُقرأ الرقم «3» على أنه «3 إخطارات غير مقروءة». وعند عرضها كرابط عبر الخاصية render، فإنها تصبح رابطًا عاديًا وتطبق عليها قواعد دلالات الروابط المعتادة.

مرجع API

Badge

يعرض مكوّن Badge شارة أو مكوّنًا يبدو كشارة.

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