Alert Dialog
دیالوگی که کاربر را وادار به یک تصمیم میکند: تایید یا انصراف. برخلاف دیالوگ معمولی، با کلیک روی پسزمینه بسته نمیشود و دکمهٔ ضربدر ندارد؛ برای عملیات برگشتناپذیر مثل حذف.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/alert-dialog.jsonnpx dig-ui@latest add https://design-system-tau-green.vercel.app/r/alert-dialog.jsonyarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/alert-dialog.jsonbunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/alert-dialog.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
استفاده
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog"
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="outline">باز کردن</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>عنوان</AlertDialogTitle>
<AlertDialogDescription>توضیح پیامد کار.</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>انصراف</AlertDialogCancel>
<AlertDialogAction onClick={confirm}>تایید</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
ترکیب اجزا
دسترسپذیری
- نقش alertdialog به محتوا داده میشود و فوکوس هنگام باز شدن روی دکمهٔ انصراف مینشیند، نه روی تایید؛ یعنی Enterِ ناخواسته عملیات حساس را اجرا نمیکند.
- کلیک روی پسزمینه دیالوگ را نمیبندد؛ فقط Escape و دکمههای انصراف/تایید. این رفتار عمدی است و آن را دور نزنید.
- AlertDialogTitle الزامی است و بهعنوان aria-labelledby به دیالوگ وصل میشود؛ AlertDialogDescription نقش aria-describedby را دارد و باید پیامد کار را صریح بگوید.
- متن دکمهها را با فعلِ همان کار بنویسید («حذف پروژه»)، نه «بله» و «خیر»؛ کاربر صفحهخوان معمولاً فقط دکمهها را میشنود.
مرجع API
AlertDialog
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| open / onOpenChange | boolean / (open: boolean) => void | — | مدیریت کنترلشده؛ برای وقتی که دیالوگ را از کد باز میکنید نه با تریگر. |
| defaultOpen | boolean | false | باز بودن در اولین رندر (کنترلنشده). |
AlertDialogTrigger
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| asChild | boolean | false | بهجای رندر دکمهٔ خودش، رفتار تریگر را روی فرزندش سوار میکند؛ معمولاً روی Button. |
AlertDialogContent
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| size | "sm" | "default" | "lg" | "default" | پهنای دیالوگ. default همان sm:max-w-lg قبلی است؛ sm برای دیالوگهای کوتاه، lg برای محتوای بیشتر (مثل فهرست پیامدها). |
| onEscapeKeyDown | (event: KeyboardEvent) => void | — | برای جلوگیری از بسته شدن با Escape، داخلش event.preventDefault() بزنید. |
| className | string | — | برای تغییر عرض دیالوگ به یک مقدار دلخواه، جای پراپ size. |
AlertDialogIcon
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| color | "default" | "primary" | "info" | "success" | "warning" | "destructive" | "default" | رنگ دایرهٔ پسزمینه و آیکون؛ همان شش رنگ سیستم که در Alert و Badge هم استفاده میشوند. |
| children | ReactElement | — | آیکون دلخواه بهجای آیکون پیشفرض هر رنگ؛ رنگ از currentColor گرفته میشود. |
AlertDialogAction
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| variant | "default" | "destructive" | "default" | حالت ظاهری دکمهٔ تایید؛ برای عملیات حذف destructive بدهید. |
| size | "sm" | "default" | "lg" | "sm" | اندازهٔ دکمه. پیشفرض sm است چون این دکمه کنار متن دیالوگ مینشیند، نه دکمهٔ اصلی صفحه. |
| onClick | (event: MouseEvent) => void | — | عملیات اصلی. بعد از کلیک، دیالوگ خودکار بسته میشود مگر preventDefault کنید. |
| asChild | boolean | false | برای جایگزینی کامل دکمه با عنصر دلخواه. |
AlertDialogCancel
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| size | "sm" | "default" | "lg" | "sm" | اندازهٔ دکمه؛ همراستا با AlertDialogAction. |
| className | string | — | استایل پایه از buttonVariants با حالت outline میآید؛ فوکوس اولیه روی همین دکمه است. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Reka UI در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Bits UI در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک روی Angular CDK در دست کار است.
نمونهها
Sign Out Confirmation
برای کارهای برگشتپذیرتر، دکمهٔ تایید حالت پیشفرض میگیرد نه قرمز.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Consequences List
هرچه عملیات خطرناکتر است، پیامد را دقیقتر بنویسید؛ محتوای دلخواه بین هدر و پاصفحه جا میگیرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Custom Action
با asChild میتوانید هر عنصری را جای دکمهٔ تایید بنشانید؛ اینجا یک Button با آیکون و اندازهٔ کوچک.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Statuses
AlertDialogIcon یک دایرهٔ رنگی قبل از عنوان میگذارد؛ رنگش را با color از همان شش رنگ سیستم (default/primary/info/success/warning/destructive) انتخاب کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
Sizes
size روی AlertDialogContent فقط پهنای دیالوگ را عوض میکند: sm، پیشفرض یا lg.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نوشتن پیام تایید
«آیا مطمئن هستید؟» با «بله» و «خیر»، هیچ اطلاعاتی نمیدهد و کاربر بهمرور بدون خواندن تایید میکند. عنوان باید بگوید چه چیزی و چقدر، توضیح باید پیامد را بگوید، و دکمه باید کارش را نام ببرد نه «بله».
نادرست: نه میگوید چه چیزی حذف میشود، نه دکمهها کاری را نام میبرند
درست: تعداد، پیامد، و دکمهای که کارش را نام میبرد
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال انجام (Loading)
دیالوگ را با زدن دکمه نبندید. تا معلومشدن نتیجه باز بماند، هر دو دکمه قفل شوند و متن وضعیت را بگوید. اگر زودتر بسته شود، کاربر نمیداند کار انجام شد یا شکست خورد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| Sign Out Confirmation | برای کارهای برگشتپذیرتر، دکمهٔ تایید حالت پیشفرض میگیرد نه قرمز. |
| Consequences List | هرچه عملیات خطرناکتر است، پیامد را دقیقتر بنویسید؛ محتوای دلخواه بین هدر و پاصفحه جا میگیرد. |
| Custom Action | با asChild میتوانید هر عنصری را جای دکمهٔ تایید بنشانید؛ اینجا یک Button با آیکون و اندازهٔ کوچک. |
| Statuses | AlertDialogIcon یک دایرهٔ رنگی قبل از عنوان میگذارد؛ رنگش را با color از همان شش رنگ سیستم (default/primary/info/success/warning/destructive) انتخاب کنید. |
| Sizes | size روی AlertDialogContent فقط پهنای دیالوگ را عوض میکند: sm، پیشفرض یا lg. |
| نوشتن پیام تایید | هر تاییدی که کاربر روزی دهها بار میبیند |
| در حال انجام (Loading) | حذف یا پرداختی که چند ثانیه طول میکشد |
دستورالعمل استفاده
فقط برای عملیات برگشتناپذیر
انجام بده
AlertDialog را برای کاری بگذارید که واقعاً غیرقابلبازگشت است؛ توقف اجباری کاربر برای همین موارد توجیه دارد.
انجام نده
برای یک عمل کمخطر و برگشتپذیر مثل خاموشکردن یک اعلان، وادار کردن کاربر به عبور از یک دیالوگ توقفدهنده فقط اصطکاک اضافه میکند.
متن دکمهها فعلدار باشد، نه بله/خیر
انجام بده
دکمهٔ تایید باید نام همان عمل را تکرار کند تا کاربری که فقط دکمهها را میشنود، بداند دقیقاً چه اتفاقی میافتد.
انجام نده
«بله» و «خیر» پیامد عمل را نمیگویند؛ اگر کاربر عنوان دیالوگ را نخوانده باشد، معنی این دو دکمه گنگ میماند.
رنگ دکمهٔ تایید با خطر عمل همخوان باشد
انجام بده
برای عملیات مخرب، variant دکمهٔ تایید را destructive بگذارید تا رنگ هم با متن هشدار بدهد.
انجام نده
دکمهٔ تایید با حالت پیشفرض برای یک عمل حذفی، هیچ نشانهٔ بصری خطری نمیدهد و با متن هشدار در تناقض است.