Bỏ qua tới nội dung
Component / 043 / NEXOFRAME

AlertDialog

Mẫu chuẩn

Hộ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.

Dựng trên @radix-ui/react-dialogKhông variantKhông đóng khi bấm ra ngoàiTiêu điểm đầu vào Huỷ

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.

LIVE PREVIEW

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 choDùng thay
Nội dung dài, biểu mẫu, bước tiếp theoDialog
Thông báo không cần quyết địnhToaster hoặc Alert
Duyệt một đề xuất có căn cứ và phạm viPattern 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 đượcThao 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áiBiểu hiện
ĐóngKhô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ệnNú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ạimotion.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

Tab / Shift+Tab -- vòng trong panel, không thoát ra ngoài (bẫy tiêu điểm của Radix Dialog).
Esc -- như bấm Huỷ, trừ khi đang ở trạng thái thực hiện.
Enter / Space -- kích hoạt nút đang có tiêu điểm.
Tên trợ năng lấy từ tiêu đề (aria-labelledby), mô tả lấy từ AlertDialogDescription (aria-describedby). Panel mang role="alertdialog".

API & triển khai

PropMặc địnhQuy ước
AlertDialog: open, onOpenChange, defaultOpen—Như Radix Dialog Root. Điều khiển hoặc tự điều khiển.
AlertDialogTrigger: asChildfalse—
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: asChildfalseĐóng hộp thoại. Nhận tiêu điểm đầu tiên.
AlertDialogAction: asChildfalseKhô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.