Bỏ qua tới nội dung

Nền tảng

Density

Đã đặc tả

Hai mức: comfortable (mặc định) và compact. Đặt bằng data-nexo-density trên cùng theme root với data-nexo-product và data-nexo-mode. Con trỏ thô luôn thắng compact. Density là thuộc tính của vùng, không phải của component.

Nghĩa vụ

Obligation

IDObligationNguồn
A11Con trỏ thô thắngA1 trong accessibility.md
A12Density thuộc về vùng02_tokens/usage.md

A11

A11 Con trỏ thô thắng

Sửa 2026-09-25 bởi DS-017 clause 6. Sàn 44px không đổi; cơ chế đạt sàn thì đổi, từ chiều cao hộp sang vùng chạm. Khi con trỏ là thô — ngón tay, bút cảm ứng — mọi điều khiển có vùng chạm ít nhất --nf-foundation-size-touch-target (44px) trên cả hai chiều, dù data-nexo-density="compact" đang bật. Chiều cao thị giác của control không đổi theo loại con trỏ. Điều này áp dụng cho mọi size của Button, kể cả sm — clause đó luôn nói "at least", và bản cài đặt cũ đã biến một sàn thành một phép gán, khiến nút lg thu nhỏ từ 52 xuống 44 trên tablet.

Cách đạt sàn. Một lớp phủ vô hình trên chính primitive, phủ ít nhất 44 × 44. Lớp phủ chỉ hợp lệ khi control có khoảng trống thật ≥ (44 − chiều cao) / 2 mỗi phía — Button 36px với khe space-2 (8px) vừa đủ. Ba vai xếp chồng khoảng cách 0 — hàng menu, hàng bảng, accordion trigger — không có chỗ cho lớp phủ nên chúng cao thật 44px (menu) hoặc 48px (bảng, accordion) ở con trỏ thô.

Vì sao 44 chứ không phải 24. WCAG 2.2 AA 2.5.8 Target Size (Minimum) đặt sàn tuyệt đối 24 × 24 CSS px — sàn của tiêu chuẩn, không phải mục tiêu của kit. 24 là mức không được phép xuống dưới. 44 là mức dùng. SC 2.5.8 tính trên target, không trên pixel nhìn thấy, nên lớp phủ đạt đúng thứ tiêu chuẩn đo.

Never — không đổi. Đừng ghi đè khối @media (pointer: coarse) để lấy lại giao diện dày đặc trên tablet. Nếu một bảng dữ liệu không vừa ở comfortable trên tablet, vấn đề là bảng đó, không phải quy tắc này.

Kiểm. Mở devtools, bật giả lập thiết bị cảm ứng. Chiều cao tính toán của một nút sm vẫn là 36px — đó là kết quả đúng sau DS-017, không phải hồi quy. Thứ phải đo là hộp bao của vùng chạm: nó phải ít nhất 44 × 44. Với một hàng menu thì ngược lại, chiều cao tính toán phải là 44px.

A12

A12 Density thuộc về vùng

data-nexo-density đặt trên một phần tử tổ tiên — theme root, hoặc một vùng dày đặc như thân bảng. Component con không nhận prop density và không tự quyết định. Dưới đây là hai vùng cùng nội dung, cùng theme, khác density — mọi điều khiển bên trong đổi cùng lúc.

comfortable

compact

Quan hệ với size của Button. Hai trục khác nhau và không thay thế nhau. size là ý định của tác giả về tầm quan trọng của một hành động cụ thể. density là ý định về toàn vùng. Một nút lg trong vùng compact vẫn là nút lớn nhất của vùng đó — nhưng không vì cả ba size cùng trượt. Sau DS-017 clause 4, sm và lg là hai mỏ neo cố định và chỉ md trượt; phân cấp được giữ bằng cách neo hai đầu, không bằng cách dịch cả thang.

Token

Bảng remap

Vai tròcomfortablecompact
Button sm36px36px
Button md, ô nhập, tab40px36px
Button lg44px44px
Hàng menu36px32px
Hàng bảng48px40px
Accordion trigger48px44px
Kiểu chữ điều khiểntypography-ui-*typography-caption-*

Hai dòng in đậm là hai mỏ neo: sm và lg không trượt theo density, chỉ md trượt. Một vùng đã chật thì không làm sm chật thêm được nữa, và hạ lg phủ nhận chính lý do nó tồn tại. Ở compact, sm và md hội tụ về 36px và phân biệt nhau bằng kiểu chữ cùng đệm — không bằng chiều cao.

Khoảng cách bên trong co theo cùng một bậc: compact lùi một nấc trên thang --nf-foundation-space-*. Bán kính không đổi theo density — bo góc là tín hiệu nhận dạng, không phải tín hiệu mật độ. Avatar không đổi theo density: nó không phải control và có thang riêng, theo DS-017 clause 11.

Ranh giới

Density không phải là gì

Không phải theme. Không phải tenant. Không phải tuỳ chọn cá nhân được lưu. Trên apps/nexo-frame nó là một điều khiển của specimen, đặt qua ?density=.

Chưa quyết

Open questions

QuestionOwnerResolves when
Người dùng có được tự chọn density và lưu lại không?nexoboxvn@gmail.comMột bề mặt sản phẩm trong docs/ nêu nhu cầu đó
Có mức thứ ba (spacious) cho màn hình trình chiếu không?nexoboxvn@gmail.comMột ca dùng thực tế xuất hiện. Không mở vì đối xứng