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

تنبيه

شرح مدمج لعرض أخطاء النماذج والتحذيرات وتأكيدات النجاح — لوحات بألوان تعبر عن الحالة، مع حدود على الطراز «النيوبروتاليستي» وظلال حادة.

import { CheckCircle2Icon, InfoIcon } from "lucide-react"

import {

التنبيه عبارة عن تعليق مدمج: أيقونة، وعنوان، ووصف، وإجراء اختياري، مرتبة على شبكة CSS. إنه عنصر div role="alert" خالٍ من التبعيات — لا يوجد عنصر أساسي تحته، وهو متطابق في كلا النظامين الخلفيين — مصمم وفقًا لوصفة النمط النيوبروتاليةي: حدود سميكة، وظلال حادة، وخط عريض، مع محور status لتلوين الأخطاء، والنجاح، والتحذيرات، والمعلومات.

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

  • أخطاء النماذج والطلبات — لإبراز فشل التحقق من الصحة أو فشل استدعاء واجهة برمجة التطبيقات (API) بجوار العنصر الذي حدث فيه الخطأ مباشرةً.
  • تأكيدات النجاح والحالة — «تم حفظ الإعدادات»، «انتهاء فترة التجربة»، «تم استلام الدفع»، ملونة بواسطة الخاصية status.
  • التعليقات التوضيحية التي تتطلب متابعة — تحذير أو إشعار بالترقية يحتوي على زر AlertAction («تمكين»، «تراجع»، «ترقية»).

التثبيت

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

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

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

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

// CSS-grid layout (shadcn-style): drop an icon as a direct child and the alert
// auto-arranges into an icon column + a content column — no manual flex wrapper.
// `has-[>svg]` adds the icon column only when an icon is present. NeoBrutalist
// chrome: hard 2px border, square corners, hard offset shadow.
const alertVariants = cva(
  cn(
    "group/alert relative grid w-full grid-cols-[0_1fr] items-start gap-y-1 rounded border-2 px-4 py-3 text-left text-sm shadow-md",
    "has-[>svg]:grid-cols-[1.25rem_1fr] has-[>svg]:gap-x-3",
    "has-data-[slot=alert-action]:pr-14",
    "[&>svg]:size-5 [&>svg]:translate-y-0.5 [&>svg]:shrink-0 [&>svg]:text-current"
  ),
  {
    variants: {
      // shadcn's variant axis (kept for API compatibility). `solid` is a Neobrutalism
      // addition.
      variant: {
        default:
          "border-border bg-background text-foreground *:data-[slot=alert-description]:text-muted-foreground",
        destructive:
          "border-red-900 bg-red-300 text-red-900 *:data-[slot=alert-description]:text-red-900/80",
        solid:
          "border-border bg-foreground text-background *:data-[slot=alert-description]:text-background/80",
      },
      // Neobrutalism status axis — additive; overrides the variant's colors when set.
      status: {
        error:
          "border-red-900 bg-red-300 text-red-900 *:data-[slot=alert-description]:text-red-900/80",
        success:
          "border-green-900 bg-green-300 text-green-900 *:data-[slot=alert-description]:text-green-900/80",
        warning:
          "border-yellow-900 bg-yellow-300 text-yellow-900 *:data-[slot=alert-description]:text-yellow-900/80",
        info: "border-blue-900 bg-blue-300 text-blue-900 *:data-[slot=alert-description]:text-blue-900/80",
      },
    },
    defaultVariants: {
      variant: "default",
    },
  }
)

function Alert({
  className,
  variant,
  status,
  ...props
}: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
  return (
    <div
      data-slot="alert"
      role="alert"
      className={cn(alertVariants({ variant, status }), className)}
      {...props}
    />
  )
}

function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
  return (
    <div
      data-slot="alert-title"
      className={cn(
        "col-start-2 min-h-5 font-head text-base leading-tight tracking-tight [&_a]:underline [&_a]:underline-offset-3",
        className
      )}
      {...props}
    />
  )
}

function AlertDescription({
  className,
  ...props
}: React.ComponentProps<"div">) {
  return (
    <div
      data-slot="alert-description"
      className={cn(
        "col-start-2 grid justify-items-start gap-1 text-sm [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p]:leading-relaxed [&_p:not(:last-child)]:mb-4",
        className
      )}
      {...props}
    />
  )
}

function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
  return (
    <div
      data-slot="alert-action"
      className={cn("absolute top-2 right-2", className)}
      {...props}
    />
  )
}

export { Alert, AlertTitle, AlertDescription, AlertAction, alertVariants }

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

الاستخدام

import {
  Alert,
  AlertAction,
  AlertDescription,
  AlertTitle,
} from "@/components/ui/alert"
<Alert>
  <InfoIcon />
  <AlertTitle>Heads up!</AlertTitle>
  <AlertDescription>
    You can add components and dependencies to your app using the cli.
  </AlertDescription>
  <AlertAction>
    <Button variant="outline">Enable</Button>
  </AlertAction>
</Alert>

التركيب

استخدم التركيب التالي لبناء Alert:

Alert
├── Icon
├── AlertTitle
├── AlertDescription
└── AlertAction

أمثلة

أساسي

تنبيه أساسي مع أيقونة وعنوان ووصف.

import { CheckCircle2Icon } from "lucide-react"

import {

مدمّر

استخدم variant="destructive" لإنشاء تنبيه مدمّر.

import { AlertCircleIcon } from "lucide-react"

import {

Action

استخدم AlertAction لإضافة زر أو عنصر إجراء آخر إلى التنبيه.

import {
  Alert,
  AlertAction,

ألوان مخصصة

يمكنك تخصيص ألوان التنبيه بإضافة فئات مخصصة مثل bg-amber-50 dark:bg-amber-950 إلى مكوّن Alert.

import { AlertTriangleIcon } from "lucide-react"

import {

RTL

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

"use client"

import * as React from "react"

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

جذر التنبيه يُعرَض بـ role="alert"، وهي منطقة حية حازمة ضمنيًا: تعلن قارئات الشاشة محتواه فور إدراجه في DOM. الإعلان يحدث فقط عند الإدراج الديناميكي — تنبيه موجود مسبقًا عند تحميل الصفحة يُقرأ كنص عادي، لذا اعرضه شرطيًا عندما يُفترض سماعه. role="alert" لا ينقل التركيز أبدًا؛ إن وجب على المستخدم الرد قبل المتابعة فاستخدم مربع حوار تنبيه، وعامل AlertAction كاختصار لا كالمسار الوحيد.

مرجع API

Alert

يعرض مكوّن Alert تنبيهًا للفت انتباه المستخدم.

PropTypeDefault
variant"default" | "destructive""default"

AlertTitle

يعرض مكوّن AlertTitle عنوان التنبيه.

PropTypeDefault
classNamestring-

AlertDescription

يعرض مكوّن AlertDescription وصف التنبيه أو محتواه.

PropTypeDefault
classNamestring-

AlertAction

يعرض مكوّن AlertAction عنصر إجراء (مثل زر) موضوعًا بشكل مطلق في الزاوية العلوية اليمنى من التنبيه.

PropTypeDefault
classNamestring-