Kết quả
- Flow mới
ui-do-phan-giai(15 màn × 9 hồ sơ, kiểm cứng): trước 0/9 đạt → sau 9/9 đạt. - Thanh trên phân hệ 64px trong khi Portal 56px (chế độ compact ≥1280px) → chuyển Portal ↔ phân hệ nhảy 8px: lỗi ở 5/5 hồ sơ desktop, 13 màn mỗi hồ sơ → hết.
- Điện thoại 390 / 360px: avatar Tài khoản tràn mép phải ở 10 màn phân hệ → hết (thu logo / khoảng cách, không ẩn nút nào).
- Đổi cỡ cửa sổ không tải lại (vd kéo Chrome sang màn khác): mật độ giữ theo lúc nạp trang (comfortable ở 1600 / 1920px) → tự đổi theo cỡ cửa sổ.
- Chữ < 12px: 11 tab Workplace (5–13 đoạn / màn), Tích hợp, Quản trị → 0.
- Tải trang: bundle chính 3 590 305 B gửi không nén → route Caddy ws thêm nén: zstd 1 084 966 B (−70%) — đo bằng Caddy 2.6.4 chạy thử; có hiệu lực sau khi deploy CP + đồng bộ route.
Đã sửa (không đổi nghiệp vụ / API)
- ws
4924b77f—packages/uiAppLayout dùng token--suns-topbar-h / --suns-sider-w / --suns-nav-item-h / --suns-dur-panel;watchDensity+app.tsx; nấc ≤480px thanh trên; chữ tối thiểu 12px (Workplace, Chat, Quản trị, Tích hợp, chuyển ứng dụng); chiều cao 100dvh − N theo token;prefers-reduced-motion; vùng nội dungscrollbar-gutter: stable. - cp
c8879fc— route Caddy ws: handlerencodezstd / gzip cho nhánh file tĩnh (không bọc /api vì SSE). - ws
51d8bda6— bộ test:--cdp,--dist, bướcviewport, cờsoft, stepkhung.*, flowui-do-phan-giai, hồ sơ có DPR +fhd150. - hub
c883a8e—profile/web(dpr, fhd150),docs/testcases/ui-do-phan-giai.md; kitfd649fe— luậtdoc/convention/ui-test.md.
Chạy lại
WS_AUTO_LOGIN=1 wsctl e2e flow ui-do-phan-giai --cdp MG1 --profile fhd,fhd125,fhd150,hd,laptop
WS_AUTO_LOGIN=1 wsctl e2e flow ui-do-phan-giai --cdp MG2 --profile tablet-ngang,tablet,mobile,mobile-hep
# ảnh "sau" trước khi deploy: thêm --dist <bản sao apps/web/dist>Chưa làm / cần quyết
- Deploy ws
6c994344..70c98ed8+ cpc8879fcchưa làm: quyền deploy bị chặn ở công cụ của agent, cần người chạymgctl deploy cp --yesrồimgctl deploy ws --allow-dirty --yes(+ 2 migration chat chỉ thêm cột). CP reload tự đẩy lại route ws có nén. - Backlog
work/request/backlog/2026-11-08-ui-toi-uu-con-lai.md. Bundle chính vẫn 3,6 MB trước nén:@minigate/uire-export toàn bộ antd + icon + recharts bằngrequirenên không tree-shake. Sửa = đổi sang ESM re-export có tên — ảnh hưởng mọi module, đề xuất request riêng. extensions/_ui-kit/AppShell(submodule repo khác) vẫn ghi cứng 64 / 248px — module extension có khung riêng sẽ còn lệch 8px ở compact.- Submodule
extensions: runtime đang ở commit nhánhfix/mg59…, platform ởmain 6a1d112— deploy ws sẽ đổi theo platform. - Rà 82 màn (laptop / tablet): chữ < 12px 110 → 2 / 60 → 0; còn 1 badge 9,5px ở Workplace tab Bảng tin và Nhóm (laptop) — chưa sửa.
- Cảnh báo thẩm mỹ (dải trống dọc ở sidebar / màn ít dữ liệu) chỉ để xem, không chặn; tuỳ dữ liệu.
- Ảnh
ra-soat-uitablet: trước chụp @1x, sau @2x (hồ sơ mới có DPR) — bố cục CSS như nhau, ảnh sau nét hơn.
Rà soát store / thương hiệu / license: không thấy rủi ro (chỉ CSS / JS nội bộ, không thêm thư viện, không đổi quyền / dữ liệu).
Độ phân giải (15 màn) · fhd 1920×1080 @1x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 27 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 4 | 0 |
Khung lỗi (trước): eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần []
Flow lỗi (trước): 18 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #22 khung: tràn / cắt mép
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · fhd125 1536×864 @1.25x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 27 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 4 | 0 |
Khung lỗi (trước): eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần []
Flow lỗi (trước): 18 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #22 khung: tràn / cắt mép
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · fhd150 1280×720 @1.5x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 27 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 2 | 0 |
Khung lỗi (trước): eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần []
Flow lỗi (trước): 17 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #22 khung: tràn / cắt mép
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · hd 1440×900 @2x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 27 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 4 | 0 |
Khung lỗi (trước): eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần []
Flow lỗi (trước): 18 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #22 khung: tràn / cắt mép
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · laptop 1366×768 @1x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 27 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 3 | 0 |
Khung lỗi (trước): eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] · eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần []
Flow lỗi (trước): 18 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["thanh trên cao 64px, token --suns-topbar-h 56px"], cần [] | #22 khung: tràn / cắt mép
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · tablet-ngang 1024×768 @2x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 24 | 0 |
| Kiểm khung lỗi | 3 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 1 | 0 |
Khung lỗi (trước): eval = ["mật độ comfortable, cỡ cửa sổ 1600px cần compact"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["mật độ comfortable, cỡ cửa sổ 1920px cần compact"], cần []
Flow lỗi (trước): 7 bước kiểm lỗi — #31 đo /workflow?nav=inbox: block:mainInner__ chỉ 11.9% nội dung | #36 đo /workplace?tab=home: 8 đoạn chữ < 12px | #41 đo /workplace?tab=chat: 8 đoạn chữ < 12px | …
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · tablet 768×1024 @2x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 15 | 0 |
| Kiểm khung lỗi | 3 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
| cảnh báo: khối ít nội dung | 2 | 0 |
Khung lỗi (trước): eval = ["mật độ comfortable, cỡ cửa sổ 1600px cần compact"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["mật độ comfortable, cỡ cửa sổ 1920px cần compact"], cần []
Flow lỗi (trước): 7 bước kiểm lỗi — #31 đo /workflow?nav=inbox: block:mainInner__ chỉ 10.6% nội dung · block:wrap__ chỉ 11.4% nội dung | #36 đo /workplace?tab=home: 5 đoạn chữ < 12px | #41 đo /workplace?tab=chat: 5 đoạn chữ < 12px | …
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · mobile 390×844 @3x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 15 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
Khung lỗi (trước): eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần []
Flow lỗi (trước): 17 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tài khoản"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tài khoản"], cần [] | #22 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tà
Ảnh trước / sau (19 màn)
Độ phân giải (15 màn) · mobile-hep 360×800 @2.625x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | FAIL | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 15 | 0 |
| Kiểm khung lỗi | 14 | 0 |
| cảnh báo: chữ < 12px | 3 | 0 |
Khung lỗi (trước): eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần [] · eval = ["bị cắt mép: Tài khoản"], cần []
Flow lỗi (trước): 17 bước kiểm lỗi — #12 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tài khoản"], cần [] | #17 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tài khoản"], cần [] | #22 khung: tràn / cắt mép / thanh trên / mật độ: eval = ["bị cắt mép: Tà
Ảnh trước / sau (19 màn)
Rà soát 82 màn · laptop 1366×768 @1x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | PASS | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 110 | 2 |
| cảnh báo: chữ < 12px | 12 | 2 |
| cảnh báo: dải trống dọc | 98 | 104 |
| cảnh báo: khối ít nội dung | 16 | 16 |
| cảnh báo: lề trống | 3 | 3 |
Ảnh trước / sau (83 màn)
Rà soát 82 màn · tablet 768×1024 @2x
| Chỉ số | Trước | Sau |
|---|---|---|
| Kết quả flow | PASS | PASS |
| Màn tràn ngang | 0 | 0 |
| Đoạn chữ < 12px (tổng) | 60 | 0 |
| cảnh báo: chữ < 12px | 12 | 0 |
| cảnh báo: dải trống dọc | 110 | 110 |
| cảnh báo: khối ít nội dung | 13 | 13 |
| cảnh báo: lề trống | 2 | 2 |

































































































































































































































































































































































































































































































































































































































































































