AlertDialog
Mẫu chuẩnHộp thoại xác nhận chặn luồng, dùng cho một hành động có hệ quả mà người dùng phải chủ động chọn: ngắt kết nối kênh, nâng quyền của một nhân sự, xoá. Khác Dialog ở ba điểm: vai trò alertdialog, không đóng khi bấm ra ngoài, và tiêu điểm đầu tiên rơi vào nút huỷ, không rơi vào nút hành động.
Playground
Đổi brand và theme rồi mở hộp thoại để xem tiêu điểm rơi vào nút Huỷ, không rơi vào nút hành động.
Bấm ra ngoài không đóng hộp thoại này — đó là điểm khác duy nhất về hành vi đóng so với Dialog.
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogTitle,
AlertDialogTrigger,
Button,
} from "@nexobox/ui";
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="danger">Ngắt kết nối</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogTitle>Ngắt kết nối Zalo OA?</AlertDialogTitle>
<AlertDialogDescription>
Nhân sự sẽ không làm việc trên kênh này cho tới khi kết nối lại.
</AlertDialogDescription>
<AlertDialogFooter>
<AlertDialogCancel asChild>
<Button variant="secondary">Huỷ</Button>
</AlertDialogCancel>
<AlertDialogAction asChild>
<Button variant="danger">Ngắt kết nối</Button>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>Khi nào sử dụng
Nên dùng
Một hành động không hoàn tác được, hoặc hoàn tác tốn công, mà người dùng phải xác nhận rõ ràng trước khi hệ thống làm: ngắt kết nối kênh, nâng mức quyền, xoá dữ liệu, đặt lại.
Khi nào không dùng
Tránh dùng
| Không dùng cho | Dùng thay |
|---|---|
| Nội dung dài, biểu mẫu, bước tiếp theo | Dialog |
| Thông báo không cần quyết định | Toaster hoặc Alert |
| Duyệt một đề xuất có căn cứ và phạm vi | Pattern Review & confirm — đó không phải một câu hỏi có/không mà là một quyết định có bằng chứng |
| Hạ quyền hoặc tạm dừng, những việc an toàn và đảo lại được | Thao tác trực tiếp, không hỏi |
Anatomy
Lớp phủ toàn màn hình; panel ở giữa màn hình, bề rộng tối đa bằng layout.dialog; tiêu đề (bắt buộc); mô tả (khuyến nghị, nói rõ hệ quả); chân panel gồm hai nút căn phải: Huỷ trước, hành động sau. Dưới breakpoint small, hai nút xếp dọc và nút hành động nằm trên. Lớp phủ, panel và kiểu chữ giống hệt Dialog; chỉ hành vi khác.
Variants
Không có variant. Tính chất nguy hiểm của hành động được thể hiện ở nút hành động (Button variant="danger"), do người gọi chọn, không phải ở hộp thoại.
States
| Trạng thái | Biểu hiện |
|---|---|
| Đóng | Không render gì ngoài trigger |
| Mở | Lớp phủ và panel hiện với motion.dialog-in; cuộn trang bị khoá; tiêu điểm vào nút Huỷ |
| Đang thực hiện | Nút hành động ở trạng thái loading của Button; Huỷ bị vô hiệu; Esc bị chặn cho tới khi xong |
| Đóng lại | motion.dialog-out; tiêu điểm trả về trigger |
Bấm ra ngoài không đóng. Đó là điểm khác duy nhất về hành vi đóng so với Dialog.
Bàn phím & trợ năng
API & triển khai
| Prop | Mặc định | Quy ước |
|---|---|---|
| AlertDialog: open, onOpenChange, defaultOpen | — | Như Radix Dialog Root. Điều khiển hoặc tự điều khiển. |
| AlertDialogTrigger: asChild | false | — |
| AlertDialogContent: children | — | Panel. Đặt role="alertdialog", chặn onPointerDownOutside và onInteractOutside, chuyển tiêu điểm đầu vào AlertDialogCancel. |
| AlertDialogTitle: children | — | Bắt buộc. |
| AlertDialogDescription: children | — | Hệ quả của hành động, bằng câu chữ thường. |
| AlertDialogFooter: children | — | Hàng nút, xếp dọc dưới small. |
| AlertDialogCancel: asChild | false | Đóng hộp thoại. Nhận tiêu điểm đầu tiên. |
| AlertDialogAction: asChild | false | Không tự đóng. Người gọi đóng sau khi hành động xong, để còn hiện được lỗi. |
className được nối, không thay thế. Không có inline style nào do component tự tạo (DS-005 clause 2).
Design tokens
Dùng chung với Dialog: --nf-foundation-layer-overlay, --nf-foundation-layer-dialog, --nf-semantic-text-primary (pha 32% cho lớp phủ), --nf-semantic-surface-raised, --nf-semantic-border-subtle, --nf-component-panel-radius, --nf-component-panel-padding, --nf-component-overlay-shadow, --nf-component-dialog-viewport-margin, --nf-foundation-layout-dialog, --nf-motion-dialog-in, --nf-motion-dialog-out, --nf-motion-overlay-in, --nf-motion-overlay-out, --nf-component-focus-width, --nf-component-focus-color, --nf-component-focus-offset. Kiểu chữ: --nf-foundation-typography-heading3-* cho tiêu đề, --nf-foundation-typography-body-* cho mô tả, --nf-semantic-text-secondary cho màu mô tả. Khoảng cách chân panel: --nf-foundation-space-3.
Do / Don't
Nên dùng
Tiêu đề là câu hỏi về đúng hành động: "Ngắt kết nối Zalo OA?". Mô tả nói hệ quả: nhân sự sẽ không làm việc trên kênh này cho tới khi kết nối lại. Nhãn nút hành động là động từ: "Ngắt kết nối". Hỏi khi nâng quyền. Đóng hộp thoại sau khi hành động thành công.
Tránh dùng
Tiêu đề chung chung: "Bạn có chắc không?". Mô tả lặp lại tiêu đề. Nhãn nút là "OK" / "Có". Hỏi khi hạ quyền hoặc tạm dừng. Để AlertDialogAction tự đóng rồi mất chỗ hiện lỗi.