Nền tảng
Trợ năng
Đã đặc tảSổ đăng ký nghĩa vụ. Mức ràng buộc là WCAG 2.2 AA. Ba mươi hai nghĩa vụ A1–A32; A29–A32 do iconography.md thêm ngày 2026-09-23. Trang này không phải catalogue WCAG; nó là danh sách ràng buộc ngoại hình mà design thi hành, mỗi cái kèm cách kiểm.
Luật
Luật của sổ đăng ký
Đặt mức WCAG 2.2 AA không khẳng định @nexobox/ui hay apps/nexoframe đang đạt mức đó — đạt hay không là câu hỏi bằng chứng, thuộc 09_delivery/current-state.md, hiện trục evidence vẫn là none.
- ID ổn định. A1–A6 giữ nguyên nghĩa và neo anchor. ID mới nối tiếp từ A7. Không bao giờ đánh số lại.
- Nghĩa vụ không có cách kiểm thì không phải nghĩa vụ, nó là một mong muốn.
- Một nghĩa vụ được định nghĩa ở đúng một nơi. A7 trở đi được định nghĩa đầy đủ trên trang foundation của chúng; bảng dưới đây là mục lục, không phải bản sao thứ hai.
Sổ đăng ký
Sổ đăng ký — ba mươi hai nghĩa vụ
| ID | Nghĩa vụ | Định nghĩa ở | WCAG 2.2 |
|---|---|---|---|
| A1 | Kích thước chạm | Dưới đây | 2.5.8 (AA) |
| A2 | Bàn phím | Dưới đây | 2.1.1 (A) |
| A3 | Màu không đứng một mình | Dưới đây | 1.4.1 (A), 1.4.3 (AA), 1.4.11 (AA) |
| A4 | Async | Dưới đây | 4.1.3 (AA) |
| A5 | Tên trợ năng | Dưới đây | 4.1.2 (A), 2.5.3 (A) |
| A6 | Giảm chuyển động | Dưới đây | 2.3.3 (AAA, kit vẫn theo) |
| A7 | Breakpoint | responsive | — |
| A8 | Reflow | responsive | 1.4.10 (AA) |
| A9 | Zoom | responsive | 1.4.4 (AA) |
| A10 | Hướng màn hình | responsive | 1.3.4 (AA) |
| A11 | Con trỏ thô thắng | density | 2.5.8 (AA) |
| A12 | Density thuộc về vùng | density | — |
| A13 | Reduced motion | motion | 2.3.3 (AAA) |
| A14 | Không chớp | motion | 2.3.1 (A) |
| A15 | Một hệ chuyển động | motion | — |
| A16 | Ring nhìn thấy được | focus-and-keyboard | 2.4.7 (AA) |
| A17 | Tiêu điểm không bị che | focus-and-keyboard | 2.4.11 (AA, mới) |
| A18 | Bỏ qua khối lặp | focus-and-keyboard | 2.4.1 (A) |
| A19 | Thứ tự và bẫy | focus-and-keyboard | 2.4.3 (A), 2.1.2 (A) |
| A20 | Trả tiêu điểm | focus-and-keyboard | 2.4.3 (A) |
| A21 | Ngôn ngữ được khai báo | content-and-language | 3.1.1 (A), 3.1.2 (AA) |
| A22 | Nhãn mô tả việc | content-and-language | 2.4.6 (AA), 2.5.3 (A) |
| A23 | Lỗi nói được cách sửa | content-and-language | 3.3.1 (A), 3.3.3 (AA) |
| A24 | Trợ giúp nhất quán | content-and-language | 3.2.6 (A, mới) |
| A25 | Không bắt buộc phải kéo | Dưới đây | 2.5.7 (AA, mới) |
| A26 | Không bắt nhập lại | Dưới đây | 3.3.7 (A, mới) |
| A27 | Xác thực không đố trí nhớ | Dưới đây | 3.3.8 (AA, mới) |
| A28 | Cấu trúc đọc được bằng máy | Dưới đây | 1.3.1 (A), 4.1.2 (A) |
| A29 | Một bộ icon | iconography | — |
| A30 | Icon mặc định là trang trí | iconography | 1.1.1 (A), 4.1.2 (A) |
| A31 | Cỡ và nét icon đến từ token | iconography | — |
| A32 | Vùng chạm không phải cỡ icon | iconography | 2.5.8 (AA) |
A1
A1 Kích thước chạm
Sàn ở con trỏ thô là --nf-foundation-size-touch-target (44px). Chiều cao Button là --nf-component-button-height cho md. Sàn tuyệt đối WCAG 2.2 AA 2.5.8 đặt 24 × 24 CSS px — không size nào, không density nào được xuống dưới mức đó. Button đặt chiều cao tối thiểu và không đặt bề rộng tối thiểu, nên nút chỉ có icon phải được kiểm cả hai trục.
Kiểm. Đo hộp điều khiển trên trang live, cả bề rộng và chiều cao, so với token đọc lúc chạy. Bật giả lập cảm ứng để kiểm nhánh con trỏ thô.
A2
A2 Bàn phím
Một điều khiển là <button>, <a> hoặc input thật. Tiêu điểm nhìn thấy được. Tab di chuyển. Escape trả tiêu điểm khi overlay đóng.
Kiểm. Tab qua probe trên trang live. Nó không giữ tiêu điểm và không thêm tabindex.
A3
A3 Màu không đứng một mình
Màu không bao giờ là tín hiệu trạng thái duy nhất. Focus-visible là một hình — ring --nf-semantic-focus-ring. Chữ thường đạt 4.5:1; chữ lớn đạt 3:1. Thành phần giao diện và đồ hoạ mang nghĩa — viền input, icon trạng thái, ring tiêu điểm — đạt 3:1 so với nền liền kề.
Kiểm. Bản xám hoá trên trang live giữ mọi trạng thái nhận ra được bằng chữ. Cặp màu tính bằng công thức luminance, không ước lượng bằng mắt.
A4
A4 Async
Ranh giới chạy qua cái gì đang bận, không qua component nào. Thuộc về primitive:trạng thái bận của một điều khiển người dùng vừa kích hoạt — Button nhận loading, giữ nhãn, đặt aria-busy="true" và disabled. Thuộc về pattern cha: rỗng, lỗi, và trạng thái đang tải của một vùng.
Cảnh báo
Đừng gắn rỗng, hoặc lỗi, hoặc trạng thái tải của cả vùng lên Button để một màn hình trông như đã hoàn thiện. Chỉ loading của chính điều khiển đó chuyển về primitive.
A5
A5 Tên trợ năng
Điều khiển chỉ có icon phải có tên trợ năng (aria-label). Nhãn nhìn thấy của Button là children của nó. Nếu nhãn nhìn thấy là Lưu thì tên trợ năng phải chứa Lưu(Label in Name).
Kiểm. Trang live có một nút có nhãn và một nút icon có tên. Nó không đặt điều khiển icon không tên vào thứ tự tab.
A6
A6 Giảm chuyển động
prefers-reduced-motion: reduce đưa thời lượng chuyển động về 0. Không thêm hệ chuyển động thứ hai. Ngoại lệ duy nhất: chỉ báo loading của Button dài ra thay vì dừng.
A25
A25 Không bắt buộc phải kéo
Mọi chức năng dùng thao tác kéo phải có đường thay thế bằng một cú bấm đơn. Kéo là bổ sung, không bao giờ là đường duy nhất — WCAG 2.2 AA 2.5.7. Drawer mobile đóng được bằng nút, không chỉ bằng vuốt. Slider có ô nhập số. Sắp xếp lại danh sách có nút lên / xuống.
Kiểm. Làm mọi việc trên trang chỉ bằng Tab và Enter. Cái gì không làm được là vi phạm A25.
A26
A26 Không bắt nhập lại
Thông tin người dùng đã nhập trong cùng một quy trình không được hỏi lại, trừ khi việc hỏi lại là bản chất của việc — WCAG 2.2 mức A 3.3.7. Biểu mẫu nhiều bước điền sẵn dữ liệu bước trước.
Kiểm. Đi hết một quy trình nhiều bước. Đếm số lần cùng một dữ kiện bị hỏi.
A27
A27 Xác thực không đố trí nhớ
Bước xác thực không được đòi một phép thử nhận thức — nhớ mật khẩu, giải đố, chép lại ký tự — mà không có đường thay thế. Không chặn dán vào ô mật khẩu, không tắt trình quản lý mật khẩu. Luồng xác thực là hành vi, thuộc docs/; ở đây chỉ ghi ràng buộc ngoại hình.
Kiểm. Dán vào mọi ô xác thực. Nếu bị chặn, đó là vi phạm.
A28
A28 Cấu trúc đọc được bằng máy
Quan hệ nhìn thấy bằng mắt phải tồn tại trong đánh dấu: tiêu đề là <h1>–<h6> không nhảy bậc, danh sách là <ul> / <ol>, bảng có <th> với scope, biểu mẫu có <label> nối bằng for. Landmark header, nav có nhãn, mainxuất hiện đúng một lần ở cấp cao nhất.
Thông tin
Vi phạm đã biết, đã đóng cùng ngày. Sáng 2026-09-23 apps/nexoframe không có <main> và không có skip link. Cả hai đã được sửa trong cùng đợt nâng cấp mở trang này.
Kiểm. Đọc cây accessibility trong devtools, không đọc CSS. Liệt kê landmark; liệt kê tiêu đề theo bậc và xác nhận không nhảy bậc.
Ranh giới
Trang này không khẳng định điều gì
Không khẳng định đạt WCAG 2.2 AA. Mức là mục tiêu ràng buộc. Chưa có kiểm toán nào; trục evidence là none. Bất kỳ tuyên bố nào rằng một bề mặt sản phẩm "đã dễ tiếp cận" vẫn phải qua docs/09_delivery/current-state.md.
Chưa quyết
Open questions
| Question | Owner | Resolves when |
|---|---|---|
| Mức WCAG nào ràng buộc? | — | Đóng 2026-09-23 theo DS-003. WCAG 2.2 AA |
| Có tiêu chuẩn pháp lý nào chồng lên (EN 301 549, ADA) không? | nexoboxvn@gmail.com | Một hợp đồng hoặc một thị trường đặt tên nó |
| Ai chạy kiểm toán, và trên bề mặt nào? | nexoboxvn@gmail.com | Một bề mặt sản phẩm thật tồn tại để kiểm toán |