İçeriğe atla

Uyarı

Form hataları, uyarılar ve işlem başarı onayı için satır içi açıklama kutuları — durum rengine göre renklendirilmiş, neobrütalist kenarlıklar ve keskin gölgelere sahip paneller.

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

import {

Uyarı bileşeni, satır içi bir bilgi kutusudur: bir CSS ızgarası üzerinde dizilmiş bir simge, bir başlık, bir açıklama ve isteğe bağlı bir eylem. Bağımlılığı olmayan bir role="alert" div'idir — altında primitif yoktur, iki arka uçta da birebir aynıdır — ve neobrütalist reçeteye göre biçimlendirilmiştir: kalın kenarlıklar, sert gölgeler ve koyu tipografi; hata, başarı, uyarı ve bilgi renklendirmesi için de bir status ekseni sunar.

Şu durumlarda tercih edin:

  • Form ve istek hataları — doğrulama hatasını ya da başarısız bir API çağrısını sorunun yaşandığı yerin hemen yanında gösterin.
  • Başarı ve durum onayları — “ayarlar kaydedildi”, “deneme süresi doluyor”, “ödeme alındı”; renk status prop'undan gelir.
  • Takip eylemi içeren bilgilendirmeler — “Etkinleştir”, “Geri Al”, “Yükselt” gibi bir AlertAction düğmesi taşıyan uyarı veya yükseltme bildirimleri.

Kurulum

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

Aşağıdaki kodu kopyalayıp projenize yapıştırın.

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 yollarını projenizin yapısına uyacak şekilde güncelleyin.

Kullanım

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>

Kompozisyon

Bir Alert oluşturmak için şu kompozisyonu kullanın:

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

Örnekler

Temel

Simge, başlık ve açıklama içeren temel bir alert.

import { CheckCircle2Icon } from "lucide-react"

import {

Yıkıcı

Yıkıcı bir alert oluşturmak için variant="destructive" kullanın.

import { AlertCircleIcon } from "lucide-react"

import {

Eylem

Alert'e bir buton veya başka bir eylem öğesi eklemek için AlertAction kullanın.

import {
  Alert,
  AlertAction,

Özel Renkler

Alert bileşenine bg-amber-50 dark:bg-amber-950 gibi özel sınıflar ekleyerek alert renklerini özelleştirebilirsiniz.

import { AlertTriangleIcon } from "lucide-react"

import {

RTL

Neobrutalism'de RTL desteğini etkinleştirmek için RTL yapılandırma kılavuzuna bakın.

"use client"

import * as React from "react"

Erişilebilirlik

Uyarının kök öğesi role="alert" ile işlenir; bu, örtük olarak assertive bir canlı bölgedir: ekran okuyucular içeriği DOM'a eklendiği anda duyurur. Duyuru yalnızca dinamik eklemede tetiklenir — sayfa yüklenirken zaten mevcut olan bir uyarı sıradan metin gibi okunur; bu yüzden duyulması gereken uyarıları koşullu olarak işleyin. role="alert" odağı asla taşımaz; kullanıcının devam etmeden önce yanıt vermesi gerekiyorsa bunun yerine bir uyarı diyaloğu kullanın ve AlertAction'ı tek yol olarak değil, bir kısayol olarak düşünün.

API Referansı

Alert

Alert bileşeni, kullanıcının dikkatini çekmek için bir çağrı gösterir.

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

AlertTitle

AlertTitle bileşeni, alert'in başlığını gösterir.

PropTypeDefault
classNamestring-

AlertDescription

AlertDescription bileşeni, alert'in açıklamasını veya içeriğini gösterir.

PropTypeDefault
classNamestring-

AlertAction

AlertAction bileşeni, alert'in sağ üst köşesinde mutlak olarak konumlandırılmış bir eylem öğesi (buton gibi) gösterir.

PropTypeDefault
classNamestring-