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

DividerWithLabel

Mẫu chuẩn

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

Composite tầng 2Không dựng từ primitive nàoHai vạch aria-hidden1 prop

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.

LIVE PREVIEW
Hoặc tiếp tục với
Chưa có tài khoản? Đăng ký

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 choDùng thay
Một đường kẻ không nhãnSeparator 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àiMộ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ộtSeparator với orientation="vertical"
Dải phân cách giữa các mục trong menuDropdownMenu DropdownMenuSeparator

Dựng từ

Primitive tầng 1Vai 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ầnGhi chú
1Vạch tráispan aria-hidden, flex-1, cao 1px.
2Nhãn (children)Chữ do host cấp, có thể chứa một liên kết.
3Vạch phảispan 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

HIỆN
Hoặc tiếp tục với

Hai vạch cộng nhãn.

NHÃN CHỨA LIÊN KẾT
Chưa có tài khoản? Đăng ký

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

Không phím nào của riêng composite -- nó không nằm trong tab order.
Tab tới một liên kết hoặc nút đặt trong children -- đến từ chính phần tử đó, do host cấp. Composite không can thiệp.
Nghĩa vụ trợ năng của file này gói trong một quyết định duy nhất: aria-hidden trên hai vạch.

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ữuCấp qua
Toàn bộ nhãn, kể cả liên kết hay nút bên trongchildren
Việc có render nó hay khôngRender có điều kiện
Lề ngoài, về lâu dàiHiện composite tự giữ — cùng lớp khiếm khuyết đã ghi ở FormError, dòng ledger W10.20

API & triển khai

PropMặc địnhQuy ướ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.