DividerWithLabel
Mẫu chuẩnMột đường kẻ ngang bị một nhãn cắt đôi ở giữa, để chia một biểu mẫu khỏi các hành động thứ cấp của nó. Nó tự vẽ hai vạch aria-hidden thay vì dùng Separator — điều đó được phơi ra ở mục Dựng từ, không giấu đi.
Playground
Đổi brand, theme và nhãn. Bên dưới là một biến thể với một liên kết đặt bên trong nhãn.
Hai vạch mang aria-hidden="true" — chỉ nhãn vào cây trợ năng.
import { DividerWithLabel } from "@nexobox/ui";
<DividerWithLabel>Hoặc tiếp tục với</DividerWithLabel>Bài toán
Một biểu mẫu đăng nhập có hai nhóm hành động khác bản chất: nhập thông tin rồi nộp, và đi bằng đường khác — nhà cung cấp SSO, hoặc chuyển sang trang đăng ký. Hai nhóm ấy cần một ranh giới thị giác có chú thích, vì một đường kẻ trơn chỉ nói "có gì đó đổi" mà không nói đổi thành gì. Một primitive Separator không giải được: nó là một phần tử, còn ở đây cần hai đoạn kẻ co giãn nằm hai bên một khối chữ, và khối chữ đó là thứ mang toàn bộ ý nghĩa nên hai đoạn kẻ phải bị ẩn khỏi cây trợ năng.
Khi nào sử dụng
Nên dùng
Ranh giới có chú thích giữa biểu mẫu chính và hành động thứ cấp: "Hoặc tiếp tục với". Chuyển tiếp giữa hai lối đi trên cùng một trang: "Chưa có tài khoản?" ngay trước liên kết đăng ký. Nhãn ngắn — một câu dài sẽ bóp hai đoạn kẻ về gần không.
Khi nào không dùng
Tránh dùng
| Không dùng cho | Dùng thay |
|---|---|
| Một đường kẻ không nhãn | Separator trực tiếp — không nhãn thì không có gì để một composite thêm |
| Tiêu đề của một nhóm field trong biểu mẫu dài | Một <h2>/<h3> thật cộng Separator nếu cần — nhãn ở đây là chữ trang trí trong một div, không vào cây tiêu đề của trang |
| Ranh giới dọc giữa hai cột | Separator với orientation="vertical" |
| Dải phân cách giữa các mục trong menu | DropdownMenu DropdownMenuSeparator |
Dựng từ
| Primitive tầng 1 | Vai trong composite |
|---|---|
| — | Không primitive nào. Hai vạch là <span aria-hidden="true"> cao 1px, tô semantic.border.subtle. |
Nó tự vẽ thứ Separator đã làm, và đây là phép đối chiếu hai chiều mà DS-016 clause 4 tồn tại để bắt. Separator là một wrapper mỏng của Radix, và nhận decorative; nó tô đúng cùng token semantic.border.subtle. Vướng mắc là hình học, không phải ngữ nghĩa: Separator ngang đặt w-full, trong khi chỗ này cần flex-1. Một primitive phải nhận một className ghi đè để đứng đúng chỗ là dấu hiệu hoặc composite sai hoặc Separator thiếu một vai. Cách đóng đề xuất: đổi sang Separator decorative và bổ sung cho Separator một cách co giãn trong flex — chạm một primitive đã có consumer nên đây là quyết định riêng, theo dõi bằng dòng ledger W10.21. Cho tới lúc đó, bảng trên nói đúng thứ mã đang làm.
| DividerWithLabel thêm gì |
|---|
Bố cục flex ba phần với hai vạch flex-1, nên nhãn luôn ở giữa dù nhãn dài bao nhiêu |
aria-hidden="true" trên cả hai vạch — nhãn mang toàn bộ ý nghĩa, hai vạch là trang trí |
| Lề trên và dưới do composite sở hữu |
Cỡ chữ caption và màu semantic.text.muted cho nhãn |
Anatomy
| # | Phần | Ghi chú |
|---|---|---|
| 1 | Vạch trái | span aria-hidden, flex-1, cao 1px. |
| 2 | Nhãn (children) | Chữ do host cấp, có thể chứa một liên kết. |
| 3 | Vạch phải | span aria-hidden, flex-1, cao 1px. |
Ba phần, hai trong đó vô hình với trình đọc màn hình. Không có biến thể lệch trái hay lệch phải — nhãn luôn ở giữa vì cả hai vạch cùng flex-1.
States
Hai vạch cộng nhãn.
Liên kết mang trạng thái focus của chính nó, không của composite.
Hover, focus, disabled: không có — không phải control; không phần nào nhận tiêu điểm.
Bàn phím & trợ năng
Seam — host sở hữu gì
DividerWithLabel không biết nó chia cái gì với cái gì, và không mang câu chữ nào. 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 |
|---|---|
| Toàn bộ nhãn, kể cả liên kết hay nút bên trong | children |
| Việc có render nó hay không | Render có điều kiện |
| Lề ngoài, về lâu dài | Hiện composite tự giữ — cùng lớp 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. Nhãn, hoặc nhãn cộng một liên kết. Đóng ở đúng một dòng — không className, nên caller không đổi được lề của khối. |
Design tokens
DividerWithLabel đọc --nf-component-auth-divider-gap, -divider-margin-block, --nf-foundation-typography-caption-font-size, --nf-semantic-text-muted, và --nf-semantic-border-subtle cho hai vạch — cùng token Separator dùng. Lỗ hổng đặt tên: hai alias component.auth.divider* gọi tên "auth" dù composite này không còn thuộc auth; nhóm đúng là component.divider.* và chưa tồn tại — theo dõi bằng dòng ledger W10.19. Chiều cao vạch là h-px, 1px trần từ thang Tailwind, không phải foundation.stroke.hairline mà Alert dùng cho viền của nó — hai chỗ vẽ cùng một nét tóc bằng hai nguồn khác nhau.
Do / Don't
Nên dùng
Giữ nhãn ngắn. Để nhãn mang ý nghĩa. Dùng nó khi ranh giới cần chú thích. Dùng một <h2> thật cho tiêu đề nhóm field.
Tránh dùng
Đặt một câu dài — hai vạch flex-1 sẽ co về gần không. Bỏ aria-hidden khỏi hai vạch "cho đầy đủ". Dùng nó cho một đường kẻ trơn. Dùng composite này làm tiêu đề. Trông đợi composite tạo kiểu cho liên kết đặt trong nhãn.