@haposoft/cafekit 0.16.6 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -22
- package/bin/__tests__/codex-hooks-ownership.test.js +2 -2
- package/bin/__tests__/codex-hooks.test.js +0 -36
- package/bin/__tests__/codex-native.test.js +46 -88
- package/bin/__tests__/develop-contract.test.js +26 -57
- package/bin/__tests__/docs-sync-on-demand.test.js +93 -0
- package/bin/__tests__/grok-envelope.test.js +0 -56
- package/bin/__tests__/hook-payload.test.js +4 -6
- package/bin/__tests__/legacy-authority-decoupled.test.js +159 -0
- package/bin/__tests__/legacy-hooks-retired.test.js +221 -0
- package/bin/__tests__/omp-bridge.test.js +20 -17
- package/bin/__tests__/omp-hooks.test.js +0 -19
- package/bin/__tests__/optional-skill-inventory.test.js +112 -4
- package/bin/__tests__/orca-session.test.js +0 -2
- package/bin/__tests__/package-inventory.test.js +100 -541
- package/bin/__tests__/runtime-dir.test.js +0 -3
- package/bin/__tests__/runtime-schema.test.js +3 -2
- package/bin/__tests__/skill-routing-source.test.js +27 -15
- package/bin/__tests__/spec-narrowing.test.js +0 -27
- package/bin/__tests__/specs-v2-execution-closeout.test.js +4 -69
- package/bin/__tests__/ui-ux-skill.test.js +101 -0
- package/bin/__tests__/usage-hook-retired.test.js +114 -0
- package/bin/__tests__/validator-grounding.test.js +9 -28
- package/bin/phases/codex-runtime.js +24 -0
- package/bin/phases/omp-runtime.js +22 -0
- package/package.json +1 -1
- package/src/claude/CLAUDE.md +3 -10
- package/src/claude/agents/brainstormer.md +7 -3
- package/src/claude/agents/code-auditor.md +35 -50
- package/src/claude/agents/debugger.md +5 -79
- package/src/claude/agents/deployer.md +3 -5
- package/src/claude/agents/docs-keeper.md +2 -7
- package/src/claude/agents/implementer.md +6 -9
- package/src/claude/agents/inspector.md +2 -3
- package/src/claude/agents/project-manager.md +7 -15
- package/src/claude/agents/researcher.md +9 -3
- package/src/claude/agents/spec-maker.md +11 -11
- package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -1
- package/src/claude/hooks/__tests__/spec-gate.test.js +112 -3
- package/src/claude/hooks/__tests__/spec-state-touched.test.js +134 -0
- package/src/claude/hooks/__tests__/state.test.js +68 -0
- package/src/claude/hooks/__tests__/statusline.test.js +140 -11
- package/src/claude/hooks/agent.cjs +2 -1
- package/src/claude/hooks/lib/context.cjs +0 -89
- package/src/claude/hooks/lib/hook-payload.cjs +2 -2
- package/src/claude/hooks/rules.cjs +2 -1
- package/src/claude/hooks/session.cjs +0 -1
- package/src/claude/hooks/spec-gate.cjs +18 -28
- package/src/claude/hooks/spec-state.cjs +95 -1
- package/src/claude/hooks/state.cjs +21 -2
- package/src/claude/migration-manifest.json +30 -15
- package/src/claude/rules/ai-dev-rules.md +1 -1
- package/src/claude/rules/hook-protocols.md +8 -15
- package/src/claude/rules/manage-docs.md +9 -23
- package/src/claude/rules/orchestrator.md +3 -4
- package/src/claude/rules/review-audit-self-decision.md +3 -3
- package/src/claude/rules/skill-domain-routing.md +1 -3
- package/src/claude/rules/skill-workflow-routing.md +4 -5
- package/src/claude/rules/state-sync.md +3 -12
- package/src/claude/rules/workflow.md +10 -18
- package/src/claude/runtime.schema.json +5 -3
- package/src/claude/scripts/generate-skill-catalog.cjs +7 -6
- package/src/claude/scripts/provenance.cjs +23 -5
- package/src/claude/scripts/spec-receipt.cjs +52 -6
- package/src/claude/scripts/spec-resolver.cjs +1 -2
- package/src/claude/scripts/validate-spec-output.cjs +5 -32
- package/src/claude/scripts/workflow-policy.cjs +22 -10
- package/src/claude/settings/settings.json +1 -32
- package/src/claude/skills/{question → ask}/SKILL.md +9 -75
- package/src/claude/skills/brainstorm/SKILL.md +43 -131
- package/src/claude/skills/code-review/SKILL.md +48 -17
- package/src/claude/skills/code-review/references/spec-compliance-review.md +2 -3
- package/src/claude/skills/code-review/references/verification-gate.md +22 -27
- package/src/claude/skills/debug/SKILL.md +29 -149
- package/src/claude/skills/develop/SKILL.md +27 -36
- package/src/claude/skills/develop/references/parallel-waves.md +0 -8
- package/src/claude/skills/develop/references/quality-gate.md +15 -13
- package/src/claude/skills/docs/SKILL.md +2 -2
- package/src/claude/skills/docs/references/update-workflow.md +1 -1
- package/src/claude/skills/fix/SKILL.md +153 -0
- package/src/claude/skills/{hotfix → fix}/references/diagnosis-protocol.md +2 -2
- package/src/claude/skills/{hotfix → fix}/references/parallel-patterns.md +2 -2
- package/src/claude/skills/{hotfix → fix}/references/prevention-gate.md +3 -3
- package/src/claude/skills/{hotfix → fix}/references/review-cycle.md +1 -1
- package/src/claude/skills/git/SKILL.md +48 -9
- package/src/claude/skills/git/references/commit-protocols.md +35 -16
- package/src/claude/skills/git/references/worktree-blueprint.md +42 -6
- package/src/claude/skills/orca/SKILL.md +9 -8
- package/src/claude/skills/research/SKILL.md +2 -0
- package/src/claude/skills/scout/SKILL.md +61 -0
- package/src/claude/skills/{inspect → scout}/references/internal-inspection.md +26 -10
- package/src/claude/skills/specs/SKILL.md +22 -29
- package/src/claude/skills/specs/references/review.md +8 -6
- package/src/claude/skills/specs/references/templates.md +38 -44
- package/src/claude/skills/sync/SKILL.md +8 -15
- package/src/claude/skills/sync/references/rebind-and-audit.md +59 -0
- package/src/claude/skills/sync/references/sync-protocols.md +4 -13
- package/src/claude/skills/test/SKILL.md +22 -3
- package/src/claude/skills/test/references/execution-strategy.md +83 -0
- package/src/claude/skills/test/references/failure-triage.md +1 -1
- package/src/claude/skills/ui-ux/LICENSE +21 -0
- package/src/claude/skills/ui-ux/SKILL.md +497 -0
- package/src/claude/skills/ui-ux/references/brand-tokens.md +90 -0
- package/src/claude/skills/ui-ux/references/budgets.md +113 -0
- package/src/claude/skills/ui-ux/references/checklist.md +271 -0
- package/src/claude/skills/ui-ux/references/components/accordion.md +246 -0
- package/src/claude/skills/ui-ux/references/components/avatar.md +153 -0
- package/src/claude/skills/ui-ux/references/components/banner.md +43 -0
- package/src/claude/skills/ui-ux/references/components/breadcrumb.md +201 -0
- package/src/claude/skills/ui-ux/references/components/button.md +142 -0
- package/src/claude/skills/ui-ux/references/components/card.md +113 -0
- package/src/claude/skills/ui-ux/references/components/charts.md +376 -0
- package/src/claude/skills/ui-ux/references/components/chat.md +132 -0
- package/src/claude/skills/ui-ux/references/components/choice-controls.md +369 -0
- package/src/claude/skills/ui-ux/references/components/comment-thread.md +17 -0
- package/src/claude/skills/ui-ux/references/components/description-list.md +116 -0
- package/src/claude/skills/ui-ux/references/components/empty-state.md +98 -0
- package/src/claude/skills/ui-ux/references/components/file-upload.md +107 -0
- package/src/claude/skills/ui-ux/references/components/inline-edit.md +128 -0
- package/src/claude/skills/ui-ux/references/components/input.md +161 -0
- package/src/claude/skills/ui-ux/references/components/list-row.md +56 -0
- package/src/claude/skills/ui-ux/references/components/loading.md +198 -0
- package/src/claude/skills/ui-ux/references/components/logo.md +147 -0
- package/src/claude/skills/ui-ux/references/components/otp-input.md +43 -0
- package/src/claude/skills/ui-ux/references/components/quantity-input.md +100 -0
- package/src/claude/skills/ui-ux/references/components/range-slider.md +16 -0
- package/src/claude/skills/ui-ux/references/components/small-controls.md +340 -0
- package/src/claude/skills/ui-ux/references/components/sortable-header.md +86 -0
- package/src/claude/skills/ui-ux/references/components/tag-input.md +14 -0
- package/src/claude/skills/ui-ux/references/components/timeline.md +38 -0
- package/src/claude/skills/ui-ux/references/components/tree.md +30 -0
- package/src/claude/skills/ui-ux/references/design-process.md +650 -0
- package/src/claude/skills/ui-ux/references/layouts/app-kanban.html +303 -0
- package/src/claude/skills/ui-ux/references/layouts/app.md +1369 -0
- package/src/claude/skills/ui-ux/references/layouts/form.md +430 -0
- package/src/claude/skills/ui-ux/references/layouts/overlay.md +552 -0
- package/src/claude/skills/ui-ux/references/layouts/pricing.md +204 -0
- package/src/claude/skills/ui-ux/references/locked-rules.md +35 -0
- package/src/claude/skills/ui-ux/references/principles.md +408 -0
- package/src/claude/skills/ui-ux/references/refactor.md +245 -0
- package/src/claude/skills/ui-ux/references/responsive.md +195 -0
- package/src/claude/skills/ui-ux/references/review.md +528 -0
- package/src/claude/skills/ui-ux/references/rules-color.md +623 -0
- package/src/claude/skills/ui-ux/references/rules-form.md +235 -0
- package/src/claude/skills/ui-ux/references/rules-state.md +680 -0
- package/src/claude/skills/ui-ux/references/rules-type.md +369 -0
- package/src/claude/skills/ui-ux/references/styles.md +311 -0
- package/src/claude/skills/ui-ux/references/system.md +219 -0
- package/src/claude/skills/ui-ux/references/tailwind-v4-traps.md +237 -0
- package/src/claude/skills/ui-ux/references/tokens.css +362 -0
- package/src/claude/skills/ui-ux/scripts/lint-skill.mjs +216 -0
- package/src/claude/skills/ui-ux/scripts/package.json +9 -0
- package/src/claude/skills/ui-ux/scripts/probe.mjs +4447 -0
- package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
- package/src/claude/status.cjs +149 -144
- package/src/codex/AGENTS.md +8 -13
- package/src/codex/hooks/agent.cjs +2 -1
- package/src/codex/hooks/lib/spec-receipt.cjs +5 -0
- package/src/codex/hooks/lib/spec-utils.cjs +0 -7
- package/src/codex/hooks/rules.cjs +2 -1
- package/src/codex/hooks/session.cjs +0 -2
- package/src/codex/hooks/spec-gate.cjs +8 -18
- package/src/codex/hooks.json +0 -20
- package/src/codex/rules/state-sync.md +3 -12
- package/src/common/AGENTS.md +2 -2
- package/src/omp/extensions/cafekit-bridge.mjs +6 -6
- package/src/claude/hooks/__tests__/completion-authority.test.js +0 -990
- package/src/claude/hooks/__tests__/semantic-review-authority.test.js +0 -259
- package/src/claude/hooks/completion-authority-check.cjs +0 -56
- package/src/claude/hooks/completion-authority-state.cjs +0 -527
- package/src/claude/hooks/completion-authority.cjs +0 -163
- package/src/claude/hooks/semantic-review-authority.cjs +0 -154
- package/src/claude/hooks/task-scaffold-guard.cjs +0 -114
- package/src/claude/hooks/usage.cjs +0 -197
- package/src/claude/skills/delegate/SKILL.md +0 -124
- package/src/claude/skills/delegate/references/codex-delegation.md +0 -71
- package/src/claude/skills/delegate/references/grok-delegation.md +0 -84
- package/src/claude/skills/hotfix/SKILL.md +0 -289
- package/src/claude/skills/inspect/SKILL.md +0 -142
- package/src/claude/skills/loop/SKILL.md +0 -114
- package/src/claude/skills/loop/references/bounded-loop-protocol.md +0 -104
- package/src/claude/skills/loop/references/metric-and-guard-contract.md +0 -76
- package/src/claude/skills/route/SKILL.md +0 -94
- package/src/claude/skills/route/references/agent-timing.md +0 -46
- package/src/claude/skills/route/references/chaining-patterns.md +0 -53
- package/src/claude/skills/route/references/task-taxonomy.md +0 -48
- package/src/codex/hooks/completion-authority-check.cjs +0 -67
- package/src/codex/hooks/completion-authority-state.cjs +0 -527
- package/src/codex/hooks/completion-authority.cjs +0 -109
- package/src/codex/hooks/semantic-review-authority.cjs +0 -130
- package/src/codex/hooks/task-scaffold-guard.cjs +0 -63
- /package/src/claude/skills/{question → ask}/templates/question.md +0 -0
- /package/src/claude/skills/{hotfix → fix}/references/escalation-tactics.md +0 -0
- /package/src/claude/skills/{hotfix → fix}/references/workflow-specialized.md +0 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
# Soi UI đang có — luật V
|
|
2
|
+
|
|
3
|
+
Mở file này khi đề nói rõ một trong ba việc (bảng câu 1 của `SKILL.md`): muốn biết **UI
|
|
4
|
+
đang có trông ổn chưa** ("xem giúp", "review", "chỗ nào chưa ổn", "sao trông kỳ", "nhìn rối",
|
|
5
|
+
gửi ảnh hay link app của chính họ nhờ xem), muốn **làm lại mà giữ brand / giữ giao diện**,
|
|
6
|
+
hoặc muốn **dựng lại theo gu skill, bỏ style cũ**.
|
|
7
|
+
Đề chỉ nói "làm lại cho đẹp", "dựng lại theo skill" thì là nhánh `U` mặc định, không phải đây.
|
|
8
|
+
|
|
9
|
+
Khác nhánh `L` (`refactor.md`): `L` dọn code và **giữ nguyên hình**. `V` soi hình,
|
|
10
|
+
**đề xuất đổi hình**, người dùng chọn dòng rồi mới sửa. Đề vừa muốn dọn code vừa muốn
|
|
11
|
+
đẹp hơn thì đi `U` trước, dọn theo `L` sau; chỉ khi đề nói soi hay giữ brand thì `V` thay
|
|
12
|
+
chỗ `U` (`SKILL.md` câu 1).
|
|
13
|
+
|
|
14
|
+
Khác nhánh `U` (`design-process.md`): cả ba chế độ của `V` giữ **khung trang**, chỉ sửa và
|
|
15
|
+
làm gọn. Người dùng muốn nghĩ lại cái gì đứng đầu, lọc nằm đâu, có chế độ xem nào ("vẫn
|
|
16
|
+
chưa ổn về UX", "thiết kế lại từ đầu") thì đi `U`.
|
|
17
|
+
|
|
18
|
+
Ở nhánh này **skill chỉ là tham khảo**. Dự án có màu, bo góc, font riêng là hệ của
|
|
19
|
+
họ, không phải lỗi.
|
|
20
|
+
|
|
21
|
+
## Ba chế độ ⚑
|
|
22
|
+
|
|
23
|
+
Nhận chế độ từ đề, không hỏi, rồi nói một dòng ở phần mở đầu lúc giao.
|
|
24
|
+
|
|
25
|
+
| | **Soi** (mặc định) | **Dựng lại, giữ brand** | **Dựng lại theo gu skill** |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| Nhận ra khi | "xem giúp", "review", "chỗ nào chưa ổn", "nhìn rối", gửi ảnh hay link nhờ xem | "dựng lại **giữ brand**", "giữ màu", "giữ giao diện hiện tại", "chỉ làm gọn", "keep the brand" | "**hoàn toàn** theo gu skill", "bỏ style cũ", "đổi sang gu của skill", "không cần giữ style cũ" |
|
|
28
|
+
| Dòng Gu | chỉ nêu, mặc định không chọn | **chọn sẵn**, người dùng bỏ dòng nào thì bỏ | chọn sẵn |
|
|
29
|
+
| Dòng Cấu trúc (`V1b`) | không có | có: sắp lại thì chọn sẵn, bỏ bớt thông tin thì không | như cột giữa |
|
|
30
|
+
| Dòng Gọn (`V1c`) | không có | **có, chọn sẵn**: mỗi khối chính một dòng, làm gọn theo gu skill, giữ màu | như cột giữa |
|
|
31
|
+
| Dòng Có màu (`V1d`) | không có | có ở trang lướt để chọn hoặc dashboard (công thức B của `P12`), **không chọn sẵn**: một dòng cho cả route, màu từ màu nhấn của dự án | như cột giữa |
|
|
32
|
+
| Dáng: bóng, viền, nhịp, cỡ chữ, nhãn, lớp phủ trên ảnh | giữ | **theo gu skill** | theo gu skill |
|
|
33
|
+
| Màu theo vai, logo, font | giữ | **giữ** | chỉ giữ logo và màu nhấn chính |
|
|
34
|
+
| Component | không viết lại, sửa đúng chỗ lỗi | được thay control gốc và khối tự chế bằng mẫu của skill (bảng dưới) | như cột giữa |
|
|
35
|
+
| Brand | giữ | **giữ theo bảng vai màu** (dưới): dựng theo cách làm của skill, tô bằng token và vai màu của dự án | **bỏ bảng vai màu**, dùng token và gu của skill (`tokens.css`, `principles.md`): nền trang xám nhạt, card trắng viền mảnh, mục chọn nền nhạt, badge nhạt. Chỉ giữ **logo** và **màu nhấn chính** của dự án làm màu nhấn duy nhất (`brand-tokens.md`). Lúc giao nói một dòng *"giữ đỏ làm màu nhấn, muốn đổi thì nói"* |
|
|
36
|
+
| Logic, handler, dữ liệu, câu chữ | không đụng (`N10`) | không đụng: component mới nhận đúng props và state của cái cũ. **Không thêm field vào type hay dữ liệu mẫu, không viết câu chữ mới** (khẩu hiệu, số %, số tiền, nhãn nút mới). Bố cục mới cần chữ chưa có thì dựng bằng chữ đang có, hoặc đưa lên bảng thành một dòng để người dùng tự viết | như cột giữa |
|
|
37
|
+
| Hỏi trước khi sửa | có | có: bảng trước, người dùng trả lời rồi mới sửa | có |
|
|
38
|
+
| Sửa xong | chụp lại, chạy lại probe route đó | chạy lại probe **tới khi danh sách `P` trống**, tối đa ba vòng, như cổng 3 (`checklist.md`) | như cột giữa |
|
|
39
|
+
|
|
40
|
+
Chế độ dựng lại chỉ vào khi đề nói giữ brand hay giữ giao diện; đề chỉ nói "dựng lại theo
|
|
41
|
+
skill" thì đi nhánh `U` (chủ dự án chốt), và nhánh đó vẫn giữ brand theo bảng vai
|
|
42
|
+
màu dưới đây (`U4`). Chế độ theo gu skill thì đổi nhận diện, phải là người dùng tự nói ra.
|
|
43
|
+
|
|
44
|
+
**Bảng vai màu, ghi trước khi dựng lại** ⚑. Brand không chỉ là màu nút chính mà là
|
|
45
|
+
**cách dự án dùng màu cho từng vai**. Mở ảnh "trước" và code, ghi một bảng ngắn:
|
|
46
|
+
|
|
47
|
+
| Vai | Dự án đang làm |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| Nút chính | ví dụ: nền đỏ đặc, chữ trắng |
|
|
50
|
+
| Mục đang chọn (sidebar, tab, chip) | ví dụ: nền đỏ đặc, chữ trắng |
|
|
51
|
+
| Badge, nhãn nhỏ ("Mới", số đếm) | ví dụ: nền đỏ, chữ trắng |
|
|
52
|
+
| Link, hành động phụ | ví dụ: chữ xanh, không viền |
|
|
53
|
+
| Giá, số nổi bật | ví dụ: chữ đỏ đậm |
|
|
54
|
+
| Khối màu đậm, gradient | ví dụ: thẻ ví gradient navy |
|
|
55
|
+
|
|
56
|
+
Chế độ giữ brand được đổi **bố cục, nhịp, cấu trúc component, cỡ chữ, bóng, viền, cách đè
|
|
57
|
+
lên ảnh**: nói gọn là số 2 = gu của số 3 trừ màu. Giữ màu mà giữ luôn mọi cái rườm của
|
|
58
|
+
bản cũ thì bản dựng lại vẫn xấu y như cũ (card dựng lại đúng màu nhưng
|
|
59
|
+
còn nhãn tiền tố, chân card hai tầng, bốn lớp phủ trên ảnh).
|
|
60
|
+
Không được đổi **vai màu**: mục đang chọn đỏ đặc thì bản mới vẫn đỏ đặc, dù gu skill là nền
|
|
61
|
+
xám nhạt. Dựng xong, đặt ảnh trước và sau cạnh nhau, đi lại từng dòng của bảng. Dòng nào
|
|
62
|
+
đổi vai thì sửa lại cho khớp. Lúc giao ghi một dòng *"Vai màu giữ nguyên: …"*.
|
|
63
|
+
|
|
64
|
+
**Mỗi vai đúng một mã màu, cả trang ăn nhập** ⚑. Trước khi dựng, `grep` các mã viết cứng
|
|
65
|
+
(`-[#…]`, `red-500`, `slate-…`) trong những file sẽ đụng. Mã nào gần một màu trong bảng vai
|
|
66
|
+
màu (đỏ khác sắc, xanh khác sắc) là cùng vai viết lệch: gom về đúng token đó. Xám (chữ phụ,
|
|
67
|
+
viền, nền) về token xám của dự án, một họ xám, viền xếp theo `M14` trong `rules-color.md`.
|
|
68
|
+
Mã không khớp vai nào (tím, cam trang trí) thì theo dòng "Màu trang trí tranh với màu vai"
|
|
69
|
+
ở `V1b`. Đã dính: ba sắc đỏ (`#e61e25` token, `#ef4444`,
|
|
70
|
+
`#dc2626`), bốn sắc xanh (`#0068ff` token, `#2563eb`, `#3b82f6`, `#4f46e5`), viền card đậm
|
|
71
|
+
hơn đường kẻ sidebar; từng khối đúng brand mà ghép lại không ăn nhập.
|
|
72
|
+
|
|
73
|
+
Đã dính: mục đang chọn ở sidebar từ đỏ
|
|
74
|
+
đặc thành viền xám, badge "Mới" từ nền đỏ thành chữ xám, link đăng nhập xanh thành nút
|
|
75
|
+
viền. Bản mới gọn hơn, nhưng mất nhận diện.
|
|
76
|
+
|
|
77
|
+
Khối không có mẫu trong skill (card tin đăng, card sản phẩm, khối lạ của dự án) thì dựng
|
|
78
|
+
lại theo luồng "Dựng một thứ chưa có mẫu" ở cuối `principles.md`: mượn khuôn gần nhất,
|
|
79
|
+
dựng cả ca biên, probe tự sửa, rồi soi năm câu bằng mắt.
|
|
80
|
+
|
|
81
|
+
**Dáng lấy từ skill, không từ CSS cũ** ⚑. Áp cho hai chế độ dựng lại và cho `U4` ở dự án
|
|
82
|
+
đã có UI. "Tô bằng token của dự án" chỉ nói **màu theo vai**. Viền xám, scrollbar, chiều
|
|
83
|
+
cao control, checkbox, chuyển động của lớp nổi là dáng: CSS cũ của dự án có sẵn thì vẫn
|
|
84
|
+
thay. Dự án đã có component riêng cho thứ đó thì **sửa chính component đó** theo mẫu, không
|
|
85
|
+
dựng bản thứ hai (`S9`); chưa có thì dựng mới theo mẫu, không tự chế:
|
|
86
|
+
|
|
87
|
+
| Thứ đang có | Thay theo |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `<select>` gốc, select tự chế | `components/choice-controls.md` (Select; từ khoảng 8 mục thì có ô tìm) |
|
|
90
|
+
| `<input type="range">` gốc, thanh trượt giá | `components/range-slider.md` |
|
|
91
|
+
| Menu, dropdown, popover tự chế: khung, mục, **chuyển động mở đóng** | `layouts/overlay.md` (khung ở "Dropdown", nhịp ở "Chuyển động"). Bật tắt bằng `{isOpen && …}` hay `display` là không có chuyển động |
|
|
92
|
+
| Checkbox, radio, công tắc, ô chọn ngày | `components/choice-controls.md`. `accent-color` trên `<input>` gốc không tính là đã tô |
|
|
93
|
+
| Tab, chip lọc, phân trang | `components/small-controls.md` |
|
|
94
|
+
| Ô nhập, ô tìm | `components/input.md` |
|
|
95
|
+
| Nút, **hàng nút trên header** | `components/button.md`; hàng nút header theo "Nhóm nút bên phải thanh header" ở `layouts/app.md` |
|
|
96
|
+
| Viền card, khung lớp nổi, vạch chia | `M14`: bậc xám nhạt nhất của dự án; token viền cỡ `#e2e8f0` chỉ cho ô nhập, nút viền |
|
|
97
|
+
| Thanh cuộn (`::-webkit-scrollbar`) | khối scrollbar của `tokens.css`: 4px, ẩn tới khi rê hay cuộn |
|
|
98
|
+
| Link sidebar, nhãn nhóm | `layouts/app.md`, mục Sidebar: mục thường chữ thường (400) `text-foreground/70`, chỉ mục đang chọn `font-medium`; nhãn nhóm IN HOA `text-muted`. Màu nền mục đang chọn theo bảng vai màu |
|
|
99
|
+
| Vòng focus | `I13` |
|
|
100
|
+
|
|
101
|
+
Lúc giao có một dòng **"Dáng:"** đi qua đủ các dòng trên mà trang có, mỗi dòng ghi đã thay
|
|
102
|
+
theo file nào (*"Dáng: dropdown theo overlay.md, checkbox theo choice-controls.md, viền
|
|
103
|
+
card `--color-border-light`, scrollbar theo tokens.css"*). Như dòng `Audit:`, dòng này làm
|
|
104
|
+
cho việc bỏ qua **nhìn thấy được**. Đã dính ở nhánh `U`: đúng bố
|
|
105
|
+
cục wireframe, đúng màu đỏ, nhưng dropdown tự chế bật tắt không chuyển động, checkbox gốc
|
|
106
|
+
`accent-color`, viền card và khung menu `#e2e8f0`, scrollbar 6px xám đặc của CSS cũ, nút
|
|
107
|
+
header cao 30–34px lệch nhau. Người xem tưởng do "giữ brand" nên thấy *"không giống skill
|
|
108
|
+
một chút nào"*.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Bốn mặc định
|
|
113
|
+
|
|
114
|
+
1. **Soi thì không hỏi, sửa thì hỏi.** Chụp, đo, lập bảng luôn. Nhưng **không đụng
|
|
115
|
+
file nào của dự án** cho tới khi người dùng chọn dòng. Ngoài hai cổng của nhánh `U`
|
|
116
|
+
(duyệt brief, chọn wireframe), đây là chỗ duy nhất hỏi trước khi sửa: sửa sản phẩm
|
|
117
|
+
đang chạy theo bảng soi thì hỏi.
|
|
118
|
+
2. **Đọc hệ của dự án trước khi chấm.** Chạy audit câu 2 và tầng 3 trong `SKILL.md`,
|
|
119
|
+
đọc `tailwind.config`, `globals.css` / `index.css`, file token, component dùng
|
|
120
|
+
chung. Chấm theo hệ đó, **không theo `tokens.css` của skill**.
|
|
121
|
+
3. **Báo nhầm tệ hơn bỏ sót.** Chỉ một dòng gọi màu brand là lỗi là người dùng hết
|
|
122
|
+
tin cả bảng. Phân vân giữa hai hạng thì chọn hạng nhẹ hơn. Phân vân có phải lỗi
|
|
123
|
+
không thì bỏ dòng đó.
|
|
124
|
+
4. **Không làm thêm việc.** Không đề xuất dark mode khi dự án chưa có (`V4`). Chế độ soi
|
|
125
|
+
không đề xuất đổi phong cách; hai chế độ dựng lại thì có, qua dòng Gọn (`V1c`). Ở chế độ soi thì không viết lại component, mỗi dòng sửa đúng
|
|
126
|
+
chỗ lỗi. Hai chế độ dựng lại được thay component, theo bảng ở trên.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## V1. Mỗi dòng một hạng ⚑
|
|
131
|
+
|
|
132
|
+
| Hạng | Căn cứ | Ví dụ | Mặc định |
|
|
133
|
+
| --- | --- | --- | --- |
|
|
134
|
+
| **Hỏng** | Sai với mọi brand | Tương phản dưới 4.5:1 (chữ lớn 3:1), trang cuộn ngang, chữ bị cắt hay bị giấu mất nghĩa, vùng bấm dưới 24px, lớp nổi lòi khỏi màn, dialog cao quá màn mà không cuộn, rê chuột làm nhảy bố cục | Đề xuất sửa |
|
|
135
|
+
| **Lệch hệ** | Token và component **của chính dự án** | Ba kiểu bo góc nút, hai màu cho cùng một trạng thái, khoảng cách lẻ ngoài thang của họ, mã hex viết cứng gần giống token | Đề xuất sửa, theo hệ của họ |
|
|
136
|
+
| **Gu** | `principles.md` và luật skill | Sidebar có viền phải, badge nền đậm, nền rê đậm nhạt | Chỉ nêu, ghi "gu, tuỳ bạn", mặc định không chọn |
|
|
137
|
+
|
|
138
|
+
- **Lệch hệ phải chỉ ra được chỗ đúng trong dự án.** "Nút này bo 6px, bốn nút khác
|
|
139
|
+
cùng loại bo 12px (`button.tsx:14`)" là Lệch hệ. Chỉ nói "nên bo 12px" mà không có
|
|
140
|
+
chỗ nào của dự án làm thế thì đó là Gu.
|
|
141
|
+
- **Đếm giá trị ngoài thang không phải là Lệch hệ.** "Có 17 kiểu bo góc, gom về
|
|
142
|
+
`sm` / `md` / `lg`" là đang áp thang lên dự án. Chỉ lệch khi **cùng vai mà khác
|
|
143
|
+
nhau**: hai nút cùng loại đứng cạnh nhau, hai card trong cùng một lưới. Card khác loại
|
|
144
|
+
(panel, thẻ số liệu, thẻ quảng bá) không cùng vai chỉ vì cùng là card, nên bo góc
|
|
145
|
+
khác nhau giữa chúng không phải lỗi. Một giá trị ngoài token mà dùng đều cho một vai
|
|
146
|
+
(mọi dialog bo 20px, mọi thẻ nổi bật bo 28px) là hệ của họ, dù file token không khai. Tìm mã hex viết cứng thì mỗi dòng ghi đúng vai và `file:line`: "xanh
|
|
147
|
+
`#3b82f6` ở badge số đếm, trong khi xanh của hệ là token `primary` `#2563eb`".
|
|
148
|
+
- **Control gốc của trình duyệt chưa có kiểu là Lệch hệ ở mọi chế độ**, không cần trên
|
|
149
|
+
màn có một bản đã có kiểu để so: `<select>` còn góc vuông, viền xám của trình duyệt,
|
|
150
|
+
`<input type="range">` mặc định, ô nhập viền inset. Giữa một app đã có kiểu, chúng đọc
|
|
151
|
+
ra là chỗ bị bỏ quên. Cột Sửa: dự án có component riêng thì dùng cái đó; chưa có thì
|
|
152
|
+
dựng theo mẫu của skill (bảng "Ba chế độ"), tô bằng token của dự án. Select gốc đã
|
|
153
|
+
được tô (bo góc, viền token, `appearance-none` với chevron riêng) thì ở chế độ soi không
|
|
154
|
+
phải lỗi. Ở hai chế độ dựng lại, select gốc đã tô mà **hiện trên desktop** vẫn phải thay:
|
|
155
|
+
bấm vào vẫn bung menu của hệ điều hành (`choice-controls.md`, Select). Probe liệt kê
|
|
156
|
+
chúng ở dòng "Select gốc đã tô trên desktop".
|
|
157
|
+
- **Tìm Lệch hệ trong code bằng lệnh, đừng chỉ nhìn ảnh.** Hai màu đỏ gần giống nhau,
|
|
158
|
+
bóng tự chế, bo góc lẻ trong một hộp thoại thì ảnh không cho thấy. Đọc token trong
|
|
159
|
+
`@theme` hoặc `tailwind.config` trước, rồi grep:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# màu bảng mặc định của Tailwind dùng cho vai đã có token (đỏ, xanh, xám chữ…)
|
|
163
|
+
grep -rnoE "\b(bg|text|border|ring|from|to|fill|stroke)-(red|rose|blue|sky|green|emerald|amber|orange|slate|gray|zinc)-[0-9]{2,3}\b" \
|
|
164
|
+
src app components --include='*.tsx' --include='*.jsx' 2>/dev/null | head -40
|
|
165
|
+
# mã màu, bóng, bo góc viết cứng
|
|
166
|
+
grep -rnoE "\[(#[0-9a-fA-F]{3,8}|rgba?\([^]]*\))\]|shadow-\[[^]]*\]|rounded-\[[^]]*\]" \
|
|
167
|
+
src app components --include='*.tsx' --include='*.jsx' 2>/dev/null | head -60
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Dự án CSS thuần, CSS Modules, SCSS thì hai lệnh trên không ra gì. Chạy thêm, bỏ qua file
|
|
171
|
+
token:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# mã màu và bo góc viết cứng trong CSS, ngoài file token
|
|
175
|
+
grep -rnE "#[0-9a-fA-F]{3,8}\b|rgba?\([0-9]|border-radius:\s*[0-9]" src \
|
|
176
|
+
--include='*.css' --include='*.scss' --include='*.less' 2>/dev/null | grep -vE "tokens?\.|variables\.|theme\." | head -60
|
|
177
|
+
# bảng màu viết cứng trong file TS / JS (map trạng thái → mã hex)
|
|
178
|
+
grep -rnoE "['\"]#[0-9a-fA-F]{3,8}['\"]" src --include='*.ts' --include='*.tsx' --include='*.js' 2>/dev/null | head -30
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Kết quả trùng giá trị token (viết cứng `#2563eb` khi đã có token đó), hay lệch token
|
|
182
|
+
một chút cho cùng vai (`#3b82f6` cạnh token xanh `#2563eb`), là Lệch hệ. Ghi vai và
|
|
183
|
+
`file:line`, cùng gốc thì gộp. Giá trị lạ mà dùng đều cho một vai thì không (mục
|
|
184
|
+
trên). Đã sót ở dự án CSS Modules: nút chính một trang đè `#a3e635` thay
|
|
185
|
+
token `#c6f432`, một card đè `border-radius: 8px` giữa các card 20px. Chỉ
|
|
186
|
+
chạy lệnh Tailwind thì không ra; nhìn ảnh lại bắt được cả hai bằng mắt.
|
|
187
|
+
- **Thứ bậc nút là Gu ở chế độ soi, không phải Lệch hệ.** Hai nút chính cạnh nhau trên một
|
|
188
|
+
header, dù trang khác để một nút phụ: mỗi nút đúng token, đúng component, chọn nút nào là
|
|
189
|
+
chính là quyết định sản phẩm. Ghi một dòng Gu (*"hai nút cùng nổi, không biết đâu là việc
|
|
190
|
+
chính"*). Lệch hệ là **cùng vai mà khác giá trị** (màu, bo góc, cỡ, kiểu badge), không phải
|
|
191
|
+
khác lựa chọn biến thể. Hai chế độ dựng lại thì vào dòng Cấu trúc "Tín hiệu tranh nhau"
|
|
192
|
+
(`V1b`).
|
|
193
|
+
- **Không bao giờ là lỗi**, trừ khi phạm luật đọc được ở hạng Hỏng: màu nhấn và màu
|
|
194
|
+
brand, bo góc lớn hay nhỏ, font, bóng / gradient / glass dùng đều khắp dự án, mật
|
|
195
|
+
độ dày hay thoáng, dự án nhiều màu hơn gu skill (đầu `principles.md`), khối màu đậm
|
|
196
|
+
hay gradient của brand (thẻ ví, banner), icon và badge mỗi loại một màu. "Không phải lỗi"
|
|
197
|
+
nghĩa là **không xếp Hỏng hay Lệch hệ, không tự sửa, không chọn sẵn**. Không có nghĩa là
|
|
198
|
+
im lặng: trông xấu thì vẫn đề xuất, theo mục dưới.
|
|
199
|
+
- **Chỗ nào trông xấu thì đề xuất, dù là dáng hay nhận diện** ⚑ (chủ dự án chốt).
|
|
200
|
+
Soi từng khối bằng mắt, đặt cạnh mẫu gần nhất của skill: badge, font, nút, card, icon, ảnh,
|
|
201
|
+
khoảng thở, bóng, gradient, màu trang trí, sidebar, header… Khối nào trông xấu thì có một
|
|
202
|
+
dòng, chia theo loại:
|
|
203
|
+
- **Dáng** (cỡ, độ đậm, bo góc, padding, viền, bóng, vị trí, mật độ): nhánh `U` và hai chế
|
|
204
|
+
độ dựng lại **tự sửa** theo bảng "Dáng lấy từ skill" và dòng Gọn `V1c`; chế độ soi thì
|
|
205
|
+
một dòng Gu kèm ảnh trước / sau.
|
|
206
|
+
- **Nhận diện** (màu vai, font, logo, khối màu đậm của brand): không tự sửa, không chọn
|
|
207
|
+
sẵn. Đề xuất một dòng (soi: Gu; dựng lại: dòng không chọn sẵn; nhánh `U`: mục "Còn
|
|
208
|
+
thấy" của `U4`) kèm hướng cụ thể và ảnh trước / sau. Font thì nêu tên một hai font đã
|
|
209
|
+
kiểm có subset `vietnamese` (`T5`). Màu thì ưu tiên hạ mức nhấn mà giữ sắc (pill đặc
|
|
210
|
+
thành chữ màu không nền, chấm nhỏ) trước khi đề xuất đổi màu.
|
|
211
|
+
- **Số lượng và thứ bậc** (cùng một thứ lặp ở mọi mục, thứ phụ nặng hơn thứ chính): nêu
|
|
212
|
+
bằng số và vị trí, như "Thông tin không phân biệt được gì" và "Tín hiệu tranh nhau" ở
|
|
213
|
+
`V1b`: *"8/8 thẻ có badge, 4 thẻ là 'Mới', mắt dừng ở badge trước giá. Chỉ giữ badge ở
|
|
214
|
+
phòng khác đi."*
|
|
215
|
+
|
|
216
|
+
**Lý do phải là thứ người dùng cuối vấp hoặc thấy**: đọc khó, mắt dừng sai chỗ, trông
|
|
217
|
+
như bản nháp, lệch với phần còn lại của trang, gãy dấu tiếng Việt. "Không giống gu skill"
|
|
218
|
+
hay "trông cũ" chưa phải lý do. Chấm dự án mồi: dòng đề xuất có lý do, không chọn sẵn,
|
|
219
|
+
**không tính là báo nhầm**; xếp brand vào Hỏng / Lệch hệ hay tự sửa brand thì vẫn là báo nhầm.
|
|
220
|
+
|
|
221
|
+
⚠️ **Đảo luật, đừng hồi sinh bản cũ:** bản cũ ghi mấy thứ trên "cũng không
|
|
222
|
+
đưa vào hạng Gu", để chặn các dòng đòi đổi nhận diện. Nó chặn luôn thứ đáng nói:
|
|
223
|
+
8/8 thẻ có badge, năm màu đè lên ảnh; badge, font, sidebar chữ đậm đều xấu
|
|
224
|
+
mà không được nêu.
|
|
225
|
+
- **Gu tối đa năm dòng** ở chế độ soi, xếp cuối bảng. Hai chế độ dựng lại không giới hạn,
|
|
226
|
+
nhưng Gu của một khối chính thì gom vào dòng Gọn của khối đó (`V1c`).
|
|
227
|
+
|
|
228
|
+
Probe báo không có nghĩa là lỗi Hỏng. Nhiều mục của probe đo theo gu skill, nên đổi
|
|
229
|
+
sang hạng theo bảng này. Những mục xếp Hỏng thì probe đã tự gom thành danh sách `P1`,
|
|
230
|
+
`P2`… ở cuối báo cáo (xem `V5`).
|
|
231
|
+
|
|
232
|
+
| Mục probe | Hạng |
|
|
233
|
+
| --- | --- |
|
|
234
|
+
| Trang tự cuộn khi vừa tải, cuộn ngang, lớp nổi lòi khỏi màn, lớp nổi mở bằng nút bị vỡ, rê chuột làm nhảy bố cục, tương phản chữ dưới ngưỡng, khung giấu mất chữ, chữ cắt còn quá ngắn, chữ trong nút xuống dòng, nhãn số đè lên đường biểu đồ, badge đè mất icon, khối bị bóp chiều cao, chữ cắt nuốt mất số, rê ra đúng màu mục đang chọn, rê vào ô đã chọn làm mất màu nhấn, scale / translate / rotate không chạy chuyển động (`W10`), hàng cuộn ngang chuột không tới được (`responsive.md`, sau `R10`), đường ngăn thẳng hàng mà khác màu (một đường nửa nhạt nửa đậm, sai với mọi brand) | Hỏng |
|
|
235
|
+
| Chỗ bấm dưới 32px | Mục có ghi "(dưới 24px)" là Hỏng, còn lại (24 tới 31px) là Gu |
|
|
236
|
+
| Hàng trong header / nav rớt dòng | Hỏng khi đè hay đẩy lệch khối khác, không thì Lệch hệ (so với cách hàng đó ở khổ khác). Xem ảnh mới quyết |
|
|
237
|
+
| Hàng nút trên header không đồng cỡ | Lệch hệ. Chế độ dựng lại thì vào dòng Gọn của header (`V1c`), theo "Nhóm nút bên phải thanh header" trong `layouts/app.md` |
|
|
238
|
+
| Hàng control lệch trên dưới, placeholder dài hơn ô, khối trông như ô nhập mà chữ xuống dòng, phân trang chỉ có nút chữ, thanh header trong suốt trên nền xám, vạch chia trong menu đậm hơn viền khung, khung / vạch lớp nổi đậm hơn token `--border`, vạch trái bị bo góc khung cắt, khung hộp thoại mờ lồng trong lớp nền mờ, cao gần bằng mà không bằng, đường ngăn hai cột kề nhau lệch, chữ cùng cột lệch mép, dấu ngăn cách không đều, control còn kiểu mặc định của trình duyệt, khung khai viền mà viền không thấy, khối cùng component bo góc khác nhau, Tab tới không thấy gì trong khi dự án vẽ vòng focus ở chỗ khác (ngoại lệ của `I13`), khối con biến mất lúc rê, lớp nổi có dải trống, lớp nổi bật tắt không chuyển động, control gốc trong lớp nổi (checkbox, radio, thanh trượt, ô tệp; select, ô ngày gốc đã tô thì theo dòng "Select gốc đã tô trên desktop"), viền trang trí đậm, thanh cuộn khác mẫu, sidebar chữ đậm hay mục sát nhau, số viết sai kiểu tiếng Việt | Lệch hệ |
|
|
239
|
+
| Nền rê gần như không thấy, nền rê tan vào nền ngoài khung hay trùng nền phía sau (gộp một dòng, ghi các nút; hai chế độ dựng lại thì tự sửa theo `components/button.md`), nền rê trùng màu viền của chính nút, viền đổi màu lúc rê, rê khác hình mục đang chọn, bấm xong còn dấu thừa, Tab tới còn vẽ vòng focus (`I13`: chế độ soi ghi một dòng Gu, hai chế độ dựng lại thì gỡ), bảng cuộn ngang mất cột, nhóm lựa chọn xếp lưới, số tiền ngắt dòng, số không thẳng hàng, nhãn số lòi ra ngoài vùng vẽ, dấu câu rơi xuống đầu dòng, chữ dưới 12px (gộp một dòng, ghi cỡ nhỏ nhất và chỗ; sửa lên ít nhất 12px), cột dính mà cuộn riêng, nội dung trôi giữa màn rộng (`layouts/app.md`), mục lặp dày chữ | Gu |
|
|
240
|
+
| Select gốc đã tô trên desktop, ô ngày / giờ gốc đã tô, kể cả trong lớp nổi | Chế độ soi: không vào bảng. Hai chế độ dựng lại: Lệch hệ, thay bằng Select dựng (từ 8 mục có ô tìm) và ô chọn ngày có popover lịch |
|
|
241
|
+
| Lỗi console | Không vào bảng. Ghi một dòng dưới bảng |
|
|
242
|
+
|
|
243
|
+
Nền rê yếu là Gu ở chế độ soi (chủ dự án chốt): rê nhạt không làm hỏng việc gì, người
|
|
244
|
+
dùng vẫn bấm được, và đó là mặc định của shadcn. Chỉ rê làm **sai trạng thái** mới là Hỏng: rê ra
|
|
245
|
+
đúng màu mục đang chọn, rê vào ô đã chọn làm mất màu nhấn, rê làm nhảy bố cục. Probe vẫn đưa nền rê
|
|
246
|
+
yếu vào danh sách `P` (nhãn có "soi: Gu") vì lúc dựng, cổng 3 phải sửa hết. Ở bảng soi, mã đó lên
|
|
247
|
+
dòng Gu. ⚠️ Đừng xếp Hỏng: bảng ra ba dòng Hỏng chỉ vì nút ghost và dòng bảng
|
|
248
|
+
shadcn rê nhạt.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## V1b. Hạng Cấu trúc, chỉ ở hai chế độ dựng lại ⚑
|
|
253
|
+
|
|
254
|
+
Chế độ soi không có hạng này. Người dùng đã nói "dựng lại" thì ngoài control gốc, họ
|
|
255
|
+
muốn biết màn **sắp xếp** có ổn không: khối nào quá tải, chỗ nào tranh nhau, control nào
|
|
256
|
+
sai loại. Probe không đo được mấy thứ này, phải soi ảnh và đọc code.
|
|
257
|
+
|
|
258
|
+
| Loại | Dấu hiệu | Sửa theo hướng |
|
|
259
|
+
| --- | --- | --- |
|
|
260
|
+
| Tín hiệu tranh nhau (`N3`) | Trong một khối có từ ba thứ cùng dùng tín hiệu đắt (màu nhấn, tô đặc, chữ lớn đậm), hoặc hai nút cùng mức nhấn đứng cạnh nhau | Giữ một thứ nổi nhất. Hai nút thì một nút chính, một nút phụ (`I1`). **Hạ mức nhấn, không đổi màu** |
|
|
261
|
+
| Hai chỗ một việc | Hai nút dẫn tới cùng một việc, một thông tin hiện hai lần trong cùng khối. Ở mức cả màn: cùng một bộ điều hướng hiện hai lần (menu bên và lưới ô danh mục), tên trang lặp ở header, tiêu đề và mục đang chọn, cùng một lời mời ở hai chỗ | Giữ một |
|
|
262
|
+
| Thông tin không phân biệt được gì | Mọi mục trong danh sách mang cùng một nhãn, số 0 hiện ra như một thông tin, giá trị thiếu in thành chữ ("Chưa rõ ngày đăng", "Không có mô tả") | Chỉ hiện ở mục khác đi. Số 0 ẩn hoặc nói bằng chữ. Giá trị thiếu thì ẩn cả mẩu đó |
|
|
263
|
+
| Khối quá tải | Card trong lưới có hơn khoảng sáu mẩu thông tin, dòng phụ bị cắt "…" ngay ở khổ thường | Giữ thứ dùng để chọn giữa các mục. Phần còn lại để trang chi tiết |
|
|
264
|
+
| Control sai loại | Ô to cho lựa chọn nhanh, select cho hai lựa chọn, control tự chế có phần không làm gì | Theo bảng mẫu ở "Ba chế độ" (chip, segmented, `range-slider`…) |
|
|
265
|
+
| Đặt sai chỗ | Control nằm xa thứ nó điều khiển (sắp xếp, lọc tách khỏi danh sách), nhãn cùng hàng lệch cao, một khung trộn nhiều kiểu bố trí | Đặt sát thứ nó điều khiển. Cùng hàng thì cùng mép trên |
|
|
266
|
+
| Màu trang trí tranh với màu vai | Icon, hình minh hoạ, nền ô icon mỗi cái một màu, nhiều tới mức nút chính và giá không còn là thứ nổi nhất | Gom màu trang trí về một hoặc hai tông của brand. **Chỉ màu ngoài bảng vai màu**, màu trong bảng giữ nguyên |
|
|
267
|
+
| Khối quảng bá lấn nội dung | Banner chiếm quá nửa màn đầu, nói một ý hai lần (con số ở tiêu đề và trong hình), nhiều hơn một nút, chữ trong hình minh hoạ bị cắt | Thu chiều cao, một tiêu đề một nút, bỏ chỗ lặp. Hình minh hoạ là của họ: không vẽ lại, chỉ đổi khung và chữ quanh nó |
|
|
268
|
+
|
|
269
|
+
- Mỗi dòng chỉ đúng chỗ (route, khối, `file:line`) và nói bằng cái người dùng cuối vấp.
|
|
270
|
+
"Card nhìn rối" chưa phải một dòng.
|
|
271
|
+
- **Không phải lối vòng để đổi màu.** Dòng Cấu trúc nói bằng thứ bậc: cái gì đang tranh
|
|
272
|
+
nhau, hạ cái nào xuống, màu giữ nguyên theo bảng vai màu. Muốn đổi hẳn màu ("badge nhiều
|
|
273
|
+
màu quá", "đổi đỏ sang xám") thì đó là dòng **nhận diện** theo `V1`: không chọn sẵn, có lý
|
|
274
|
+
do và ảnh trước / sau, không nhét vào dòng Cấu trúc.
|
|
275
|
+
- **Chọn sẵn hay không.** Dòng chỉ sắp lại (hạ mức nhấn, đổi loại control, dời chỗ) thì
|
|
276
|
+
chọn sẵn ✓. Dòng bỏ, ẩn hay gộp thông tin, và dòng gom màu trang trí, thì **không chọn
|
|
277
|
+
sẵn**: đó là quyết định sản phẩm và nhận diện, người dùng tự thêm. Luật này chỉ cho
|
|
278
|
+
dòng Cấu trúc: dòng Gu ở chế độ dựng lại vẫn **chọn sẵn** như bảng "Ba chế độ".
|
|
279
|
+
- **Một dòng một quyết định.** "Bỏ tên trang trên header, và đổi màu chip đang chọn" là hai
|
|
280
|
+
dòng: người dùng có thể muốn cái này mà không muốn cái kia.
|
|
281
|
+
- **Đi đủ các loại trong bảng trên từng route đã soi**, không chỉ route nhiều control. Khối quảng bá
|
|
282
|
+
và điều hướng lặp hay nằm ở trang chủ, nơi probe ít đo ra gì.
|
|
283
|
+
- Tối đa mười dòng, xếp sau Lệch hệ, trước Gu.
|
|
284
|
+
- Định dạng dữ liệu (số lẻ dài, đơn vị lẫn lộn) nằm ở hàm của họ (`N10`): không lên bảng,
|
|
285
|
+
nhắc một dòng dưới bảng.
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## V1c. Dòng Gọn, chỉ ở hai chế độ dựng lại ⚑
|
|
290
|
+
|
|
291
|
+
Người dùng nói "dựng lại giữ brand" là muốn **bản sau trông khác hẳn bản trước**, không phải
|
|
292
|
+
bản cũ vá vài lỗi. Nên mỗi khối chính (card lặp trong lưới, khối lọc, header, panel bên,
|
|
293
|
+
khối quảng bá) có **một dòng Gọn**: đặt khối đó cạnh mẫu gần nhất của skill (`card.md`,
|
|
294
|
+
`list-row.md`, `input.md`, `small-controls.md`, `layouts/app.md`…) rồi ghi mọi chỗ khác,
|
|
295
|
+
**trừ màu trong bảng vai màu, logo, font**. Chế độ 3 thì đổi cả màu.
|
|
296
|
+
|
|
297
|
+
Hay gặp:
|
|
298
|
+
|
|
299
|
+
| Rườm | Gọn theo hướng |
|
|
300
|
+
| --- | --- |
|
|
301
|
+
| Nhãn tiền tố trước giá trị tự hiểu ("Ngày: 12/09", "Tổng: 1.200.000đ") | Bỏ nhãn, thứ bậc bằng cỡ chữ và vị trí |
|
|
302
|
+
| Chừa chỗ cho hai dòng tiêu đề, tiêu đề một dòng để lại khoảng trống | Chiều cao theo nội dung, chân card đẩy xuống đáy bằng flex |
|
|
303
|
+
| Từ ba lớp phủ trên ảnh trở lên (badge, nhãn, số đếm, nút) | Tối đa hai: một badge và một nút. Còn lại xuống phần chữ |
|
|
304
|
+
| Chân card hai tầng (dòng thời gian riêng, hàng nút riêng), nền khác màu thân card | Một hàng. Thời gian lên dòng meta |
|
|
305
|
+
| Icon trước mỗi dòng meta | Chỉ giữ icon mang nghĩa (vị trí). Meta gom một dòng, ngăn bằng `·` |
|
|
306
|
+
| Viền cộng bóng cộng nền khác, hai ba lần tách một ranh giới | Một cách tách: viền mảnh hoặc nền, bóng chỉ cho lớp nổi (`budgets.md`) |
|
|
307
|
+
| Ô nhập mang viền màu nhấn khi chưa focus | Viền token thường, màu nhấn chỉ lúc focus |
|
|
308
|
+
| Ba bốn sắc độ chữ phụ trong một khối | Hai: chữ chính và `text-muted` |
|
|
309
|
+
| Khoảng cách lẻ, mỗi khối một nhịp | Thang của skill (`budgets.md`, Nhịp) |
|
|
310
|
+
|
|
311
|
+
- Một dòng Gọn gom nhiều thay đổi của **cùng một khối**, cột Sửa liệt kê ngắn, và **bắt buộc
|
|
312
|
+
có ảnh trước / sau** (chèn CSS tạm, `V5`). Không có ảnh thì người dùng không hình dung
|
|
313
|
+
được "gọn" là gì.
|
|
314
|
+
- Chọn sẵn ✓. Dòng Gọn không bỏ thông tin: bỏ nhãn tiền tố thì giá trị vẫn còn. Thứ phải
|
|
315
|
+
bỏ hẳn (một mẩu thông tin, một nút) thì tách ra thành dòng Cấu trúc, không chọn sẵn
|
|
316
|
+
(`V1b`).
|
|
317
|
+
- Đường giữ brand: màu của nút, mục đang chọn, badge, giá không đổi. Bo góc giữ họ bo góc
|
|
318
|
+
của dự án (tròn vẫn tròn, vuông vẫn vuông), chỉ gom về một cỡ cho cùng vai.
|
|
319
|
+
- Xếp sau Cấu trúc, trước Gu.
|
|
320
|
+
|
|
321
|
+
## V1d. Dòng Có màu, chỉ ở hai chế độ dựng lại ⚑
|
|
322
|
+
|
|
323
|
+
Dựng lại cho gọn xong mà trang vẫn "buồn màu" là chuyện hay gặp ở trang người dùng cuối.
|
|
324
|
+
Nên hai chế độ dựng lại đưa thêm **một dòng Có màu** cho cả
|
|
325
|
+
route, theo `P12` trong `styles.md`.
|
|
326
|
+
|
|
327
|
+
- **Chỉ khi cả ba đúng**: trang người dùng cuối lướt để chọn (tìm việc, tìm phòng, sản phẩm,
|
|
328
|
+
khoá học, bài viết) theo công thức A của `P12`, **hoặc dashboard** theo công thức B (ô icon
|
|
329
|
+
màu nhạt ở card số liệu, biểu đồ nhiều sắc); dự án đang phẳng (`P4` ra flat); route chưa có
|
|
330
|
+
dòng nào ở trên đã đổi màu. Form, cài đặt, bảng quản lý thuần thì không có dòng này.
|
|
331
|
+
- **Không chọn sẵn.** Đổi độ đậm màu cả trang là việc của người dùng quyết, khác dòng Gọn.
|
|
332
|
+
- Cột Sửa liệt kê đúng các chỗ của công thức `P12` áp vào trang này (A: dải đầu trang, chân
|
|
333
|
+
trang, mục nổi bật, chữ, điểm nhỏ; B: ô icon, ô đầu dòng, biểu đồ, trạng thái, sidebar). Chỗ nào không áp được thì ghi vì sao, ví dụ *"mục nổi bật: dữ liệu chưa
|
|
334
|
+
có trường gấp / hot, bỏ"*. Không thêm field, không bịa nhãn (bảng ba chế độ, "Logic, handler,
|
|
335
|
+
dữ liệu, câu chữ").
|
|
336
|
+
- **Bắt buộc ảnh trước / sau** như dòng Gọn (`V5`), chụp cả màn ở 1440 để thấy dải.
|
|
337
|
+
- Chế độ giữ brand: màu dải là màu nhấn trong bảng vai màu, không đổi vai nào khác. Đã có
|
|
338
|
+
chip lọc đặc màu nhấn thì cột Sửa ghi luôn đổi chip sang kiểu nhạt (bẫy của `P12`).
|
|
339
|
+
- Xếp sau Gọn, trước Gu.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## V2. Nguồn ảnh và độ tin ⚑
|
|
344
|
+
|
|
345
|
+
- **Có app chạy** (link localhost hay URL, hoặc chạy được dev server): tự chụp bằng
|
|
346
|
+
probe (`V3`). Danh sách route lấy từ file router. Vướng đăng nhập, cần dữ liệu
|
|
347
|
+
thật, hay server không chạy thì nói thẳng một dòng rồi xin ảnh, không đoán.
|
|
348
|
+
- **Người dùng gửi ảnh**: ảnh của họ thắng ảnh tự chụp khi hai bên khác nhau, vì đó
|
|
349
|
+
là thứ họ thật sự thấy (đã đăng nhập, dữ liệu thật). Khác nhau thì nói ra một dòng.
|
|
350
|
+
- **Chỉ có ảnh, không có code**: vẫn làm. Hạng Lệch hệ chỉ dựa trên cái thấy trong ảnh
|
|
351
|
+
(hai nút cùng loại hai kiểu bo góc), không nói tới token.
|
|
352
|
+
- **Ảnh cũng đo được vùng bấm.** Ảnh rộng đúng bằng khổ màn (ảnh 1280px của khổ 1280) là tỉ
|
|
353
|
+
lệ 1x; ảnh gấp đôi thì chia 2. Đo từng control nhỏ bằng pixel: công tắc, checkbox, radio,
|
|
354
|
+
nút chỉ icon, nút trong hàng bảng, nút đóng. Chiều nào dưới 24px là Hỏng, nguồn
|
|
355
|
+
*đo trên ảnh 1x*. Đã sót: nhìn công tắc 32×18 (còn chê rãnh
|
|
356
|
+
chìm vào nền) mà không đo cỡ.
|
|
357
|
+
**Trừ checkbox và radio vẽ 16–20px**: đó là cỡ vẽ quen dùng, vùng bấm thật thường nới ra
|
|
358
|
+
bằng padding, giả phần tử hay nhãn bấm được, ảnh không cho thấy. Không lên bảng, không
|
|
359
|
+
hạng nào; chỉ vào bảng khi ô vẽ dưới 16px. Công tắc, nút chỉ icon, nút đóng thì phần vẽ
|
|
360
|
+
thường chính là vùng bấm, nên vẫn đo như trên. Đã báo nhầm: checkbox
|
|
361
|
+
shadcn ô vẽ 18px, vùng bấm 24px, bị xếp Hỏng.
|
|
362
|
+
- **Video**: model không xem video được. Tách khung ra rồi chọn các khung quanh lúc
|
|
363
|
+
chuyển động: `ffmpeg -i quay.mp4 -vf fps=4 "$TMPDIR/evon-review/khung/%03d.png"`.
|
|
364
|
+
- **Mỗi dòng ghi nguồn**: *đo*, *thấy trong ảnh*, *đọc code*, hay *đoán*. Ảnh tĩnh
|
|
365
|
+
không cho thấy hover, focus, chuyển động, cấu trúc a11y hay bề rộng khác, nên
|
|
366
|
+
**không khẳng định những thứ đó chỉ từ ảnh**. Hoặc ghi "cần kiểm khi chạy", hoặc bỏ
|
|
367
|
+
dòng đó. Tương phản đọc từ ảnh là màu hút từ pixel, ảnh nén lệch vài mức, nên chỉ
|
|
368
|
+
báo khi thấp rõ (dưới khoảng 4:1).
|
|
369
|
+
- **Lỗi tương tác phải đã thử.** Rê chuột, Tab, tải trang, mở lớp nổi: ghi *đo* khi
|
|
370
|
+
probe hay chính mình đã làm thao tác đó và thấy lỗi. Chỉ đọc code mà suy ra ("có
|
|
371
|
+
`group-hover:flex` nên chắc card giật") thì ghi *đọc code, chưa thử*.
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## V3. Soi đủ khổ, quét bề rộng, mở lớp nổi ⚑
|
|
376
|
+
|
|
377
|
+
Mỗi route một lượt:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
node <thư mục skill>/scripts/probe.mjs http://localhost:5173/<route> \
|
|
381
|
+
--sweep --out "$TMPDIR/evon-review/<route>"
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
| Khổ | Bề rộng | Hay vỡ ở đâu |
|
|
385
|
+
| --- | --- | --- |
|
|
386
|
+
| Mobile | 375 | Tràn ngang, lề rộng ăn mất bề ngang, hàng chip hay tab rớt dòng |
|
|
387
|
+
| Tablet dọc | 768 | Lưới hai cột bị bóp, sidebar chưa thu mà nội dung đã chật |
|
|
388
|
+
| Tablet ngang | 1024 | Ngưỡng thu sidebar, drawer đè gần hết nội dung |
|
|
389
|
+
| Laptop nhỏ | 1280 | Bảng nhiều cột cạnh sidebar, toolbar xuống dòng |
|
|
390
|
+
| Desktop | 1440 | Nội dung kéo quá dài, dòng chữ quá rộng |
|
|
391
|
+
| Màn rộng | 1920 | Nội dung căn giữa trôi khỏi sidebar, card kéo dài nửa trống |
|
|
392
|
+
|
|
393
|
+
- **Chụp ở khổ cố định chưa đủ.** `--sweep` kéo bề rộng từ 1440 xuống 375, mỗi bước
|
|
394
|
+
20px, rồi báo **khoảng bề rộng** có lỗi. Mở các ảnh ở mục "Khung đáng xem", và thêm
|
|
395
|
+
vài ảnh quanh ngưỡng sidebar thu và ngưỡng lưới đổi cột: chồng lấn hay lệch hàng
|
|
396
|
+
thì máy không đo được. Chỉ khung có lỗi mới lên bảng.
|
|
397
|
+
- **Tràn ngang thì đo, không chỉ nhìn.** Probe ghi phần tử lòi ra. Chép selector đó
|
|
398
|
+
vào bảng, hạng Hỏng, nguồn *đo*.
|
|
399
|
+
- **Mở cả lớp nổi ở 375.** Probe tự mở nút có `aria-haspopup`, và ở màn hẹp còn bấm
|
|
400
|
+
thử thứ **trông như nút mở**: có `aria-expanded`, nhãn "menu", "lọc", "thông báo",
|
|
401
|
+
"chọn"…, icon chuông, ba chấm, chevron, kể cả nút chỉ có icon và dòng `div` bấm được,
|
|
402
|
+
và nút tạo mới ("Tạo…", "Thêm…", icon dấu cộng) vì nút này gần như luôn mở form.
|
|
403
|
+
Nó chụp từng lớp vừa mở (`<khổ>-mo-<n>.png`) và đo tràn mép, cao quá màn. Thứ có
|
|
404
|
+
nhãn hay icon hành động (xoá, lưu, tim, gửi, thanh toán) thì không bấm. Mở từng
|
|
405
|
+
ảnh ra xem. Lớp nổi nào probe không mở tới thì **tự bấm** bằng Playwright ở 375 rồi
|
|
406
|
+
chụp. "Chưa soi được X" chỉ ghi khi đã bấm thử mà không mở được (cần đăng nhập,
|
|
407
|
+
cần chọn dòng trước, nút gọi API thật), không dùng để bỏ qua. Ảnh trang đang đóng
|
|
408
|
+
không cho thấy menu tràn mép hay dialog cao quá màn.
|
|
409
|
+
- **Mỗi dòng ghi khổ màn hay khoảng bề rộng bị lỗi**, ví dụ "375px" hoặc "860–1000px".
|
|
410
|
+
Khoảng chép từ số probe đo, không suy từ breakpoint trong code: mốc `@media` chỉ nói
|
|
411
|
+
cột bật từ đâu, không nói bảng tràn tới đâu. Muốn biết mép chính xác thì đo thêm
|
|
412
|
+
từng bước nhỏ quanh mép đó.
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## V4. Dark mode: có thì soi cả hai, chưa có thì không bịa ⚑
|
|
417
|
+
|
|
418
|
+
Cùng tinh thần `M20` (mặc định chỉ light), nhưng dự án đã có sẵn thì theo dự án.
|
|
419
|
+
|
|
420
|
+
- **"Có dark mode" nghĩa là bật được, không phải chỉ có khai báo.** Dự án dựng từ
|
|
421
|
+
shadcn thường có khối `.dark` trong `globals.css` mà chưa bao giờ dùng. Chỉ coi là
|
|
422
|
+
có khi thấy **cách bật**:
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
grep -rlE "next-themes|ThemeProvider|setTheme|classList\.(add|toggle)\(['\"]dark|prefers-color-scheme|data-theme" \
|
|
426
|
+
--include='*.tsx' --include='*.ts' --include='*.jsx' --include='*.js' --include='*.css' . | grep -v node_modules
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Rồi chụp lại bằng `--dark` và so với ảnh light. Màn không đổi màu thì dark chỉ có
|
|
430
|
+
khai báo (probe ghi dòng "trang không tối khi bật --dark"). Probe gắn class `dark` lên `<html>` và giả lập `prefers-color-scheme`;
|
|
431
|
+
dự án bật bằng `data-theme` thì gắn thuộc tính đó rồi tự chụp.
|
|
432
|
+
- **Chưa có (hoặc chỉ khai báo) thì không làm**: không chụp dark, không đề xuất dark,
|
|
433
|
+
không thêm class `dark:` vào code sửa. Ghi tối đa một dòng "dự án chưa bật dark
|
|
434
|
+
mode" ở phần mở đầu, không vào bảng.
|
|
435
|
+
- **Có thì soi đủ hai chế độ.** Chạy probe thêm một lượt `--dark` ở đủ các khổ mặc định (không cần
|
|
436
|
+
`--sweep`), ảnh "sau" cũng đủ hai bản. **Lượt tối có danh sách `P` riêng** và phải đối
|
|
437
|
+
chiếu như lượt sáng (`V5`): màu nhấn giữ nguyên trên nền tối hay tụt dưới 4.5:1, và chỉ
|
|
438
|
+
lượt tối đo ra điều đó. Dòng đếm tách hai phần: "sáng 78 mã, tối 41 mã". Màu dark lấy đúng token dark của dự án (khối `.dark`,
|
|
439
|
+
`[data-theme="dark"]`), không lấy navy của skill (`M23`).
|
|
440
|
+
- **Dark mode làm dở là Hỏng**: có nút bật mà còn mảng nền trắng cứng, chữ đen trên
|
|
441
|
+
nền tối, viền biến mất, logo tối trên nền tối, bóng không thấy. Mục "DARK MODE" của probe
|
|
442
|
+
bắt mảng sáng (Hỏng), ô nhập mất viền, nền rê chìm xuống, thiếu `color-scheme` (`M21`,
|
|
443
|
+
`M31`, `M32`); ba mục sau xếp Lệch hệ.
|
|
444
|
+
- **Sửa một chế độ thì chụp lại cả hai.** Sửa cho light đẹp mà làm vỡ dark là lỗi hay
|
|
445
|
+
gặp nhất ở dự án có hai chế độ.
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## V5. Bảng giao, ảnh "sau", và sửa dòng đã chọn ⚑
|
|
450
|
+
|
|
451
|
+
**Ảnh "sau" phải là render thật, không phải lời mô tả.**
|
|
452
|
+
|
|
453
|
+
- Có app chạy: chèn CSS tạm vào trang (`page.addStyleTag`) rồi chụp đúng khổ đó.
|
|
454
|
+
Chưa đụng file nào của dự án.
|
|
455
|
+
- Chỉ có ảnh: dựng lại vùng bị lỗi thành HTML tĩnh, dùng màu hút từ ảnh của họ,
|
|
456
|
+
không dùng màu skill. Ghi rõ "mô phỏng".
|
|
457
|
+
- Dòng Gu không cần ảnh "sau", trừ dòng có phương án để chọn (kiểu A / B / C): chụp đủ.
|
|
458
|
+
|
|
459
|
+
**Ảnh là link bấm được, không phải đường dẫn tệp** ⚑. `$TMPDIR/evon-review/…/hien-tai.png`
|
|
460
|
+
trong chat thì người dùng không mở được, gợi ý hay mấy cũng như không.
|
|
461
|
+
|
|
462
|
+
- Chạy server tĩnh nền trên thư mục ảnh: `python3 -m http.server <cổng> -d "$TMPDIR/evon-review"`.
|
|
463
|
+
Mọi ô Ảnh là link đầy đủ `http://localhost:<cổng>/<route>/fix/1-truoc.png`.
|
|
464
|
+
- **Có dòng nào mang ảnh thì dựng thêm `so-sanh.html`** cùng thư mục: mỗi dòng bảng một khối,
|
|
465
|
+
số dòng và tên lỗi làm tiêu đề, ảnh trước / sau hay các phương án đặt cạnh nhau cùng chiều
|
|
466
|
+
cao, chú thích ngắn dưới mỗi ảnh, phương án khuyên dùng ghi rõ. Đầu tin giao một dòng
|
|
467
|
+
*"Xem ảnh so sánh: http://localhost:<cổng>/<route>/so-sanh.html"*.
|
|
468
|
+
- `curl -s -o /dev/null -w "%{http_code}"` từng link trước khi gửi. Không chạy được server thì
|
|
469
|
+
ghi `file://` kèm đường dẫn tuyệt đối đã mở rộng, không để `$TMPDIR`.
|
|
470
|
+
|
|
471
|
+
```html
|
|
472
|
+
<!doctype html><meta charset="utf-8"><title>So sánh</title>
|
|
473
|
+
<style>body{font:14px/1.5 system-ui;margin:24px;background:#f4f4f6;color:#2c2c2c}
|
|
474
|
+
section{margin-bottom:32px}h2{font-size:16px;margin:0 0 12px}
|
|
475
|
+
.row{display:flex;gap:16px;flex-wrap:wrap}figure{margin:0;background:#fff;border:1px solid #eaeaea;border-radius:12px;padding:8px}
|
|
476
|
+
figure img{display:block;height:320px;width:auto;border-radius:8px}figcaption{padding:8px 4px 0;color:#707070}</style>
|
|
477
|
+
<section><h2>6 · Badge đè lên ảnh (Gu)</h2><div class="row">
|
|
478
|
+
<figure><img src="badge/hien-tai.png" alt=""><figcaption>Hiện tại</figcaption></figure>
|
|
479
|
+
<figure><img src="badge/canh-gia.png" alt=""><figcaption><b>A · Cạnh giá (khuyên dùng)</b></figcaption></figure>
|
|
480
|
+
</div></section>
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
**Bảng giao là bảng markdown trong chat**; ảnh thì qua link và trang so sánh ở trên. Thứ tự:
|
|
484
|
+
|
|
485
|
+
1. **Mở đầu**, mỗi thứ một dòng: dòng `Audit:` (stack, hệ token ở đâu, phong cách,
|
|
486
|
+
dark mode: có / chỉ khai báo / không), đã soi route nào ở khổ nào, chỗ nào chưa soi
|
|
487
|
+
được và vì sao.
|
|
488
|
+
2. **Bảng**: xếp Hỏng trước, rồi Lệch hệ, Cấu trúc, Gọn và Có màu (chỉ ở chế độ dựng lại,
|
|
489
|
+
`V1b`, `V1c`, `V1d`), Gu cuối.
|
|
490
|
+
|
|
491
|
+
| # | Hạng | Chỗ | Lỗi | Sửa | Nguồn | Ảnh |
|
|
492
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
493
|
+
| 1 | Hỏng | `/orders`, 860–1000px, `nav` trong header | Menu trên đầu xuống hai dòng, đẩy tiêu đề trang lệch xuống | Chuyển sang nút menu từ 1000px thay vì 860px | đo | [trước](…) · [sau](…) |
|
|
494
|
+
| 7 | Gu | Sidebar | Viền phải cộng nền khác màu, hai lần tách một ranh giới. Gu, tuỳ bạn | Bỏ viền | đọc code | |
|
|
495
|
+
|
|
496
|
+
- Cột **Lỗi** nói bằng cái người dùng cuối thấy ("menu xuống hai dòng, đẩy ô tìm
|
|
497
|
+
kiếm lệch"), không nói bằng tên luật.
|
|
498
|
+
- Cột **Sửa** nói theo hệ của dự án: token nào, component nào, file nào.
|
|
499
|
+
- Lỗi lặp ở nhiều màn mà cùng một gốc (component dùng chung) thì gộp làm một dòng,
|
|
500
|
+
ghi các màn bị ảnh hưởng.
|
|
501
|
+
3. **Đối chiếu danh sách `P` của probe trước khi giao.** Cuối báo cáo probe có mục
|
|
502
|
+
"Việc phải đối chiếu": mọi thứ máy đo ra mà `V1` xếp Hỏng, đánh mã `P1`, `P2`…, kèm
|
|
503
|
+
khoảng bề rộng. Mỗi mã phải **lên bảng** (cột Nguồn ghi `đo P3`, soi nhiều route thì
|
|
504
|
+
ghi kèm route: `đo /orders P3`; cùng gốc thì gộp nhiều mã một dòng) **hoặc có lý
|
|
505
|
+
do loại** ở dưới bảng. Dưới bảng luôn có một dòng đếm:
|
|
506
|
+
|
|
507
|
+
> Đối chiếu probe: 19 mã, 17 lên bảng, 2 loại: `/orders P7` (khung giấu chữ là
|
|
508
|
+
> carousel cố ý trượt, đã xem ảnh), `/orders P12` (thanh dưới đáy che chữ lúc chụp).
|
|
509
|
+
|
|
510
|
+
**Loại chỉ khi mã đó không phải lỗi** (đo nhầm, cố ý, đã xem ảnh không thấy). Lỗi thật
|
|
511
|
+
mà sửa phải đổi token dùng khắp app thì vẫn lên bảng, ghi rõ "đổi token, ảnh hưởng
|
|
512
|
+
toàn app": chọn hay không là việc của người dùng, không phải lý do để loại.
|
|
513
|
+
|
|
514
|
+
Máy đo ra mà bảng không có thì người dùng không có cách nào biết đã bị bỏ.
|
|
515
|
+
4. **Rà hạng Gu và Cấu trúc lần cuối**: dòng đề xuất đổi màu brand, font, logo là dòng
|
|
516
|
+
**nhận diện** (`V1`): phải có lý do người dùng cuối thấy, ảnh trước / sau, không chọn
|
|
517
|
+
sẵn; thiếu lý do thì xoá. Dòng Gọn cũng rà: đổi màu trong bảng vai màu là sai chế độ 2.
|
|
518
|
+
5. **Kết**: *"Trả lời số dòng muốn sửa, ví dụ `sửa 1, 3, 4`."* Chế độ soi: không tự đề
|
|
519
|
+
nghị sửa hết. Hai chế độ dựng lại: dòng nào đã chọn sẵn thì đánh ✓ ở đầu dòng, kết bằng
|
|
520
|
+
*"Mình sẽ sửa các dòng ✓. Trả lời `ok`, hoặc bỏ bớt, ví dụ `bỏ 7, 12`."*
|
|
521
|
+
|
|
522
|
+
**Người dùng chọn xong:**
|
|
523
|
+
|
|
524
|
+
- Chỉ sửa đúng các dòng đó, bằng token và component của họ. Lỗi nằm ở component dùng
|
|
525
|
+
chung thì sửa ở component đó, và nói trước là nó đổi luôn các màn khác.
|
|
526
|
+
- Sửa xong thì chụp lại cùng khổ (có dark thì chụp cả hai chế độ), đặt ảnh trước và
|
|
527
|
+
sau cạnh nhau, rồi chạy lại probe trên route đó để chắc lỗi đã hết mà không đẻ lỗi
|
|
528
|
+
mới.
|