FormNotice
Mẫu chuẩnCặp song sinh của FormError: cùng hình học bám ô nhập, nhưng vai trò aria là “status” chứ không “alert”, nên trình đọc màn hình đọc nó lịch sự — chờ tới lúc người dùng ngừng thao tác.
Playground
Đổi brand, theme và nội dung. Bên dưới là một FormError tĩnh để so — cùng hình học, khác vai trò aria, màu và icon.
role của FormNotice: status — đọc lịch sự, chờ tới lúc nghỉ. Băng FormError bên dưới chỉ để so sánh, không phải specimen sống của trang này.
import { FormNotice } from "@nexobox/ui";
{justSaved ? <FormNotice>"Đã gửi email xác minh."</FormNotice> : null}Bài toán
Khi một lần nộp thành công nhưng trang không điều hướng đi đâu — mật khẩu đã đổi, email xác minh đã gửi, thiết lập đã lưu — người dùng cần một xác nhận nằm đúng chỗ họ vừa nhìn, tức đầu biểu mẫu. Xác nhận ấy phải được trình đọc màn hình đọc, nhưng không được chen ngang, vì chen ngang cho một tin tốt sẽ cắt lời chính thao tác người dùng đang làm tiếp. Một primitive không giải được vì đây cũng là ba quyết định ghép — vai trò status, hình học bám field, icon dấu tích cố định — và không primitive nào sở hữu cả ba. Hình học ấy khác Alert, và bảng đo khác biệt nằm ở FormError; nó áp nguyên cho file này.
Khi nào sử dụng
Nên dùng
Xác nhận thành công ở mức biểu mẫu, đặt ở đầu biểu mẫu, khi trang không điều hướng sau khi nộp. Thông báo trung tính, không khẩn: "Đã gửi email xác minh", "Đã lưu thay đổi". Một dòng, một câu.
Khi nào không dùng
Tránh dùng
| Không dùng cho | Dùng thay |
|---|---|
| Lỗi | FormError — role="alert", màu và icon của danger |
| Xác nhận tạm thời sau một hành động ở nơi khác trên trang | Toaster — một băng thường trực cho một việc đã xong từ lâu sẽ đứng đó mãi |
| Xác nhận có tiêu đề, danh sách, hoặc một nút "xem chi tiết" | Alert với kind="success" |
| Trạng thái rỗng của một danh sách | Empty |
Dựng từ
| Primitive tầng 1 | Vai trong composite |
|---|---|
| — | Không primitive nào. |
| Icon (wrapper, không phải dòng catalogue) | Vẽ CheckmarkCircle02Icon, cỡ small, màu status.success.icon. |
Composite thứ hai trong tầng không dựng từ primitive tầng 1 nào — cùng ghi chú như FormError: nó thêm thứ không primitive nào có, không gọi tên khái niệm sản phẩm nào, nên vẫn thuộc tầng 2.
| FormNotice thêm gì |
|---|
role="status" cố định — không nhận từ caller |
| Icon dấu tích cố định, không chọn được |
| Hình học bám field — dùng chung bộ alias với FormError |
| Icon căn theo dòng chữ đầu, không căn theo hộp |
Anatomy
| # | Phần | Ghi chú |
|---|---|---|
| 1 | Icon (CheckmarkCircle02) | Cỡ small, màu status.success.icon. |
| 2 | span (children) | Câu chữ do host cấp. |
Giống FormError từng phần một, chỉ đổi ba token màu, một icon, một vai trò aria và một alias lề dưới — hai băng cạnh nhau trong cùng một biểu mẫu phải đọc như hai trạng thái của một thứ.
States
Được render. Trình đọc màn hình đọc lịch sự, chờ tới lúc nghỉ.
Không hiện: không có chế độ ẩn. Hover, focus, disabled: không có — không phải control, không phần nào nhận tiêu điểm. Không có nút đóng và không tự tắt. Hệ quả cần biết: nếu người dùng nộp lại biểu mẫu và lần này lỗi, host phải bỏ băng thành công đi — composite không biết nó đã cũ.
Bàn phím & trợ năng
Seam — host sở hữu gì
FormNotice không biết việc gì đã thành công, không hết hạn, không tự thay thế mình bằng một băng lỗi khi lần nộp sau thất bại. Theo ADR-UI-003 clause 2 nó không fetch, không đọc router, không giữ session, không import gì từ next.
| Host sở hữu | Cấp qua |
|---|---|
| Câu chữ, bằng ngôn ngữ người đọc | children |
| Khi nào băng tồn tại, và khi nào nó phải mất đi | Render có điều kiện. Không có prop visible, không có timer |
| Việc loại trừ: thành công và lỗi không được hiện cùng lúc | Host. Hai composite không biết nhau |
| Lề ngoài, về lâu dài | Hiện composite tự giữ — cùng khiếm khuyết đã ghi ở FormError, dòng ledger W10.20 |
API & triển khai
| Prop | Mặc định | Quy ước |
|---|---|---|
| children | — | Bắt buộc. Một dòng, một câu. Đóng ở đúng một dòng, cùng lý do FormError. |
Design tokens
FormNotice đọc --nf-component-field-radius, --nf-semantic-status-success-border-subtle, -background, -foreground, -icon, cộng các alias component.auth.banner* và component.auth.noticeMarginBottom. Cùng lỗ hổng đặt tên đã ghi ở FormError — nhóm đúng là component.formBanner.*, theo dõi bằng dòng ledger W10.19. Cỡ chữ 0.8125rem là số trần, không phải token — cùng lớp lỗ hổng.
Do / Don't
Nên dùng
Render sau khi việc thành công. Bỏ băng thành công khi lần nộp sau thất bại. Giữ role="status". Một câu.
Tránh dùng
Render sẵn rồi bật/tắt bằng CSS. Để cả FormNotice và FormError cùng hiện. Dùng cho xác nhận thường trực trên trang không điều hướng. Đổi sang role="alert" "cho chắc được đọc". Một tiêu đề cộng một danh sách.