@starci/skills 1.1.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/INDEX.md +74 -0
- package/INDEX.vi.md +75 -0
- package/README.md +44 -0
- package/README.vi.md +43 -0
- package/SKILL.md +135 -0
- package/SKILL.vi.md +128 -0
- package/alias/INDEX.md +104 -0
- package/alias/INDEX.vi.md +104 -0
- package/alias/alias.json +297 -0
- package/bin/starci-skills.mjs +219 -0
- package/knowledge/INDEX.md +22 -0
- package/knowledge/INDEX.vi.md +22 -0
- package/knowledge/grammars/starci/DNA.md +146 -0
- package/knowledge/grammars/starci/DNA.vi.md +146 -0
- package/knowledge/grammars/starci/INDEX.md +25 -0
- package/knowledge/grammars/starci/INDEX.vi.md +25 -0
- package/knowledge/grammars/starci/family.md +50 -0
- package/knowledge/grammars/starci/family.vi.md +50 -0
- package/knowledge/grammars/starci/idioms.md +120 -0
- package/knowledge/grammars/starci/idioms.vi.md +121 -0
- package/knowledge/grammars/starci/playbook.md +36 -0
- package/knowledge/grammars/starci/playbook.vi.md +35 -0
- package/knowledge/patterns/be/INDEX.md +29 -0
- package/knowledge/patterns/be/INDEX.vi.md +29 -0
- package/knowledge/patterns/be/comment.md +80 -0
- package/knowledge/patterns/be/comment.vi.md +80 -0
- package/knowledge/patterns/be/error.md +86 -0
- package/knowledge/patterns/be/error.vi.md +86 -0
- package/knowledge/patterns/be/folder.md +87 -0
- package/knowledge/patterns/be/folder.vi.md +86 -0
- package/knowledge/patterns/be/function.md +80 -0
- package/knowledge/patterns/be/function.vi.md +80 -0
- package/knowledge/patterns/be/imports.md +79 -0
- package/knowledge/patterns/be/imports.vi.md +79 -0
- package/knowledge/patterns/be/naming.md +87 -0
- package/knowledge/patterns/be/naming.vi.md +87 -0
- package/knowledge/patterns/be/test.md +79 -0
- package/knowledge/patterns/be/test.vi.md +79 -0
- package/knowledge/patterns/be/typing.md +73 -0
- package/knowledge/patterns/be/typing.vi.md +73 -0
- package/knowledge/patterns/fe/INDEX.md +29 -0
- package/knowledge/patterns/fe/INDEX.vi.md +29 -0
- package/knowledge/patterns/fe/comment.md +70 -0
- package/knowledge/patterns/fe/comment.vi.md +70 -0
- package/knowledge/patterns/fe/error.md +61 -0
- package/knowledge/patterns/fe/error.vi.md +61 -0
- package/knowledge/patterns/fe/folder.md +98 -0
- package/knowledge/patterns/fe/folder.vi.md +95 -0
- package/knowledge/patterns/fe/function.md +70 -0
- package/knowledge/patterns/fe/function.vi.md +70 -0
- package/knowledge/patterns/fe/imports.md +87 -0
- package/knowledge/patterns/fe/imports.vi.md +87 -0
- package/knowledge/patterns/fe/naming.md +77 -0
- package/knowledge/patterns/fe/naming.vi.md +77 -0
- package/knowledge/patterns/fe/test.md +73 -0
- package/knowledge/patterns/fe/test.vi.md +73 -0
- package/knowledge/patterns/fe/typing.md +67 -0
- package/knowledge/patterns/fe/typing.vi.md +67 -0
- package/knowledge/ui/INDEX.md +101 -0
- package/knowledge/ui/INDEX.vi.md +101 -0
- package/knowledge/ui/composition/INDEX.md +60 -0
- package/knowledge/ui/composition/INDEX.vi.md +63 -0
- package/knowledge/ui/composition/accent.md +73 -0
- package/knowledge/ui/composition/accent.vi.md +74 -0
- package/knowledge/ui/composition/action.md +55 -0
- package/knowledge/ui/composition/action.vi.md +56 -0
- package/knowledge/ui/composition/coverage.md +37 -0
- package/knowledge/ui/composition/coverage.vi.md +37 -0
- package/knowledge/ui/composition/cta.md +79 -0
- package/knowledge/ui/composition/cta.vi.md +79 -0
- package/knowledge/ui/composition/feedback.md +55 -0
- package/knowledge/ui/composition/feedback.vi.md +56 -0
- package/knowledge/ui/composition/hierarchy.md +83 -0
- package/knowledge/ui/composition/hierarchy.vi.md +82 -0
- package/knowledge/ui/composition/layout.md +91 -0
- package/knowledge/ui/composition/layout.vi.md +93 -0
- package/knowledge/ui/composition/responsive.md +67 -0
- package/knowledge/ui/composition/responsive.vi.md +67 -0
- package/knowledge/ui/composition/state.md +105 -0
- package/knowledge/ui/composition/state.vi.md +106 -0
- package/knowledge/ui/presentation/INDEX.md +94 -0
- package/knowledge/ui/presentation/INDEX.vi.md +69 -0
- package/knowledge/ui/presentation/boundary.md +170 -0
- package/knowledge/ui/presentation/boundary.vi.md +169 -0
- package/knowledge/ui/presentation/font.md +155 -0
- package/knowledge/ui/presentation/font.vi.md +156 -0
- package/knowledge/ui/presentation/gap.md +181 -0
- package/knowledge/ui/presentation/gap.vi.md +181 -0
- package/knowledge/ui/presentation/margin.md +168 -0
- package/knowledge/ui/presentation/margin.vi.md +171 -0
- package/knowledge/ui/presentation/measure.md +174 -0
- package/knowledge/ui/presentation/measure.vi.md +178 -0
- package/knowledge/ui/presentation/overflow.md +142 -0
- package/knowledge/ui/presentation/overflow.vi.md +142 -0
- package/knowledge/ui/presentation/padding.md +293 -0
- package/knowledge/ui/presentation/padding.vi.md +292 -0
- package/knowledge/ui/presentation/surface.md +166 -0
- package/knowledge/ui/presentation/surface.vi.md +166 -0
- package/knowledge/ui/presentation/text-flow.md +123 -0
- package/knowledge/ui/presentation/text-flow.vi.md +123 -0
- package/knowledge/ui/presentation/tone.md +114 -0
- package/knowledge/ui/presentation/tone.vi.md +113 -0
- package/knowledge/ui/proof/INDEX.md +55 -0
- package/knowledge/ui/proof/INDEX.vi.md +55 -0
- package/knowledge/ui/proof/accessibility.md +67 -0
- package/knowledge/ui/proof/accessibility.vi.md +68 -0
- package/knowledge/ui/proof/contrast.md +58 -0
- package/knowledge/ui/proof/contrast.vi.md +57 -0
- package/knowledge/ui/proof/focus.md +76 -0
- package/knowledge/ui/proof/focus.vi.md +76 -0
- package/knowledge/ui/proof/motion.md +63 -0
- package/knowledge/ui/proof/motion.vi.md +64 -0
- package/knowledge/ui/proof/render-truth.md +63 -0
- package/knowledge/ui/proof/render-truth.vi.md +63 -0
- package/operators/INDEX.md +199 -0
- package/operators/INDEX.vi.md +199 -0
- package/operators/architecture-decide/errors.json +115 -0
- package/operators/architecture-decide/operator.json +20 -0
- package/operators/architecture-decide/operator.md +133 -0
- package/operators/architecture-decide/operator.vi.md +130 -0
- package/operators/architecture-decide/self-test.mjs +221 -0
- package/operators/architecture-decide/validate.mjs +112 -0
- package/operators/backend-source-apply/errors.json +66 -0
- package/operators/backend-source-apply/operator.json +20 -0
- package/operators/backend-source-apply/operator.md +189 -0
- package/operators/backend-source-apply/operator.vi.md +185 -0
- package/operators/backend-source-apply/self-test.mjs +257 -0
- package/operators/backend-source-apply/validate.mjs +240 -0
- package/operators/business-decide/errors.json +78 -0
- package/operators/business-decide/operator.json +20 -0
- package/operators/business-decide/operator.md +176 -0
- package/operators/business-decide/operator.vi.md +174 -0
- package/operators/business-decide/self-test.mjs +225 -0
- package/operators/business-decide/validate.mjs +277 -0
- package/operators/content-generate/errors.json +106 -0
- package/operators/content-generate/operator.json +21 -0
- package/operators/content-generate/operator.md +155 -0
- package/operators/content-generate/operator.vi.md +155 -0
- package/operators/content-generate/self-test.mjs +288 -0
- package/operators/content-generate/validate.mjs +196 -0
- package/operators/errors.json +178 -0
- package/operators/frontend-direction-decide/errors.json +135 -0
- package/operators/frontend-direction-decide/operator.json +21 -0
- package/operators/frontend-direction-decide/operator.md +167 -0
- package/operators/frontend-direction-decide/operator.vi.md +167 -0
- package/operators/frontend-direction-decide/self-test.mjs +226 -0
- package/operators/frontend-direction-decide/validate.mjs +146 -0
- package/operators/frontend-presentation-resolve/errors.json +42 -0
- package/operators/frontend-presentation-resolve/operator.json +19 -0
- package/operators/frontend-presentation-resolve/operator.md +142 -0
- package/operators/frontend-presentation-resolve/operator.vi.md +140 -0
- package/operators/frontend-presentation-resolve/self-test.mjs +163 -0
- package/operators/frontend-presentation-resolve/validate.mjs +143 -0
- package/operators/frontend-source-apply/errors.json +30 -0
- package/operators/frontend-source-apply/operator.json +20 -0
- package/operators/frontend-source-apply/operator.md +127 -0
- package/operators/frontend-source-apply/operator.vi.md +126 -0
- package/operators/frontend-source-apply/self-test.mjs +214 -0
- package/operators/frontend-source-apply/validate.mjs +133 -0
- package/operators/frontend-surface-audit/errors.json +5 -0
- package/operators/frontend-surface-audit/operator.json +22 -0
- package/operators/frontend-surface-audit/operator.md +121 -0
- package/operators/frontend-surface-audit/operator.vi.md +121 -0
- package/operators/frontend-surface-audit/self-test.mjs +185 -0
- package/operators/frontend-surface-audit/validate.mjs +127 -0
- package/operators/git-publish/errors.json +54 -0
- package/operators/git-publish/operator.json +20 -0
- package/operators/git-publish/operator.md +180 -0
- package/operators/git-publish/operator.vi.md +178 -0
- package/operators/git-publish/self-test.mjs +177 -0
- package/operators/git-publish/validate.mjs +106 -0
- package/operators/platform-operate/errors.json +90 -0
- package/operators/platform-operate/operator.json +22 -0
- package/operators/platform-operate/operator.md +162 -0
- package/operators/platform-operate/operator.vi.md +160 -0
- package/operators/platform-operate/self-test.mjs +202 -0
- package/operators/platform-operate/validate.mjs +193 -0
- package/operators/quality-verify/errors.json +54 -0
- package/operators/quality-verify/operator.json +20 -0
- package/operators/quality-verify/operator.md +185 -0
- package/operators/quality-verify/operator.vi.md +177 -0
- package/operators/quality-verify/self-test.mjs +210 -0
- package/operators/quality-verify/validate.mjs +197 -0
- package/operators/release-deploy/errors.json +158 -0
- package/operators/release-deploy/operator.json +23 -0
- package/operators/release-deploy/operator.md +183 -0
- package/operators/release-deploy/operator.vi.md +181 -0
- package/operators/release-deploy/self-test.mjs +235 -0
- package/operators/release-deploy/validate.mjs +129 -0
- package/operators/uat-verify/errors.json +78 -0
- package/operators/uat-verify/operator.json +25 -0
- package/operators/uat-verify/operator.md +162 -0
- package/operators/uat-verify/operator.vi.md +161 -0
- package/operators/uat-verify/self-test.mjs +270 -0
- package/operators/uat-verify/validate.mjs +202 -0
- package/operators/workspace-bind/errors.json +90 -0
- package/operators/workspace-bind/operator.json +21 -0
- package/operators/workspace-bind/operator.md +148 -0
- package/operators/workspace-bind/operator.vi.md +148 -0
- package/operators/workspace-bind/self-test.mjs +205 -0
- package/operators/workspace-bind/validate.mjs +152 -0
- package/package.json +50 -0
- package/readiness/initialization/workspaces/commit-policy.json +91 -0
- package/readiness/initialization/workspaces/config.schema.json +35 -0
- package/readiness/initialization/workspaces/device-state.schema.json +54 -0
- package/readiness/initialization/workspaces/local-route.schema.json +206 -0
- package/readiness/initialization/workspaces/portable-route.schema.json +200 -0
- package/resources/INDEX.md +96 -0
- package/resources/INDEX.vi.md +99 -0
- package/resources/agents/profiles/claude.json +131 -0
- package/resources/agents/profiles/openai.json +131 -0
- package/resources/orchestrator.json +71 -0
- package/resources/tools.json +85 -0
- package/routing.json +272 -0
- package/scripts/alias-registry.mjs +31 -0
- package/scripts/device-state.mjs +497 -0
- package/scripts/device-state.spec.mjs +18 -0
- package/scripts/errors-registry.mjs +68 -0
- package/scripts/generate-alias-doc.mjs +66 -0
- package/scripts/generate-grammar-dna.mjs +387 -0
- package/scripts/generate-operators-index.mjs +95 -0
- package/scripts/generate-presentation-owned.mjs +681 -0
- package/scripts/install-cli.spec.mjs +74 -0
- package/scripts/json-schema.mjs +94 -0
- package/scripts/operator-md.mjs +96 -0
- package/scripts/run-operator-self-tests.mjs +36 -0
- package/scripts/validate-alias.mjs +165 -0
- package/scripts/validate-defaults.mjs +72 -0
- package/scripts/validate-knowledge-citations.mjs +90 -0
- package/scripts/validate-operator.mjs +125 -0
- package/scripts/validate-request.mjs +80 -0
- package/scripts/validate-resources.mjs +117 -0
- package/scripts/validate-response.mjs +141 -0
- package/scripts/validate-routing.mjs +91 -0
- package/scripts/validate-step.mjs +50 -0
- package/scripts/validate-templates.mjs +226 -0
- package/scripts/validate-templates.spec.mjs +144 -0
- package/scripts/validate-workflows.mjs +106 -0
- package/scripts/workspace-portable.mjs +389 -0
- package/scripts/workspace-portable.spec.mjs +246 -0
- package/templates/README.md +47 -0
- package/templates/README.vi.md +45 -0
- package/templates/changes.example.md +27 -0
- package/templates/grammars.template.md +34 -0
- package/templates/kinds/architecture-decision.contract.json +14 -0
- package/templates/kinds/architecture-decision.skeleton.md +52 -0
- package/templates/kinds/backend-source-application.contract.json +10 -0
- package/templates/kinds/backend-source-application.skeleton.md +34 -0
- package/templates/kinds/business-promise-authority.contract.json +13 -0
- package/templates/kinds/business-promise-authority.skeleton.md +67 -0
- package/templates/kinds/capture.schema.json +33 -0
- package/templates/kinds/changes.contract.json +10 -0
- package/templates/kinds/changes.skeleton.md +26 -0
- package/templates/kinds/checks.schema.json +44 -0
- package/templates/kinds/claims.schema.json +165 -0
- package/templates/kinds/conformance.schema.json +15 -0
- package/templates/kinds/content-brief.contract.json +12 -0
- package/templates/kinds/content-brief.skeleton.md +45 -0
- package/templates/kinds/content-generation-receipt.contract.json +11 -0
- package/templates/kinds/content-generation-receipt.skeleton.md +40 -0
- package/templates/kinds/content-review.contract.json +11 -0
- package/templates/kinds/content-review.skeleton.md +45 -0
- package/templates/kinds/contract.schema.json +28 -0
- package/templates/kinds/coverage-matrix.schema.json +86 -0
- package/templates/kinds/coverage.schema.json +62 -0
- package/templates/kinds/current-state.schema.json +40 -0
- package/templates/kinds/delta.schema.json +95 -0
- package/templates/kinds/e2e.schema.json +63 -0
- package/templates/kinds/frontend-direction-decision.contract.json +93 -0
- package/templates/kinds/frontend-direction-decision.skeleton.md +68 -0
- package/templates/kinds/frontend-presentation-resolution.contract.json +11 -0
- package/templates/kinds/frontend-presentation-resolution.skeleton.md +32 -0
- package/templates/kinds/frontend-source-application.contract.json +10 -0
- package/templates/kinds/frontend-source-application.skeleton.md +30 -0
- package/templates/kinds/frontend-surface-audit.contract.json +52 -0
- package/templates/kinds/frontend-surface-audit.skeleton.md +32 -0
- package/templates/kinds/gate-result.schema.json +64 -0
- package/templates/kinds/git-publication.contract.json +82 -0
- package/templates/kinds/git-publication.skeleton.md +61 -0
- package/templates/kinds/independent-critique.contract.json +9 -0
- package/templates/kinds/independent-critique.skeleton.md +28 -0
- package/templates/kinds/inventory.schema.json +35 -0
- package/templates/kinds/model.schema.json +99 -0
- package/templates/kinds/mutations.schema.json +65 -0
- package/templates/kinds/platform-operation-receipt.contract.json +76 -0
- package/templates/kinds/platform-operation-receipt.skeleton.md +54 -0
- package/templates/kinds/probes.schema.json +130 -0
- package/templates/kinds/proof.schema.json +17 -0
- package/templates/kinds/quality-verification.contract.json +87 -0
- package/templates/kinds/quality-verification.skeleton.md +58 -0
- package/templates/kinds/release-deployment.contract.json +85 -0
- package/templates/kinds/release-deployment.skeleton.md +67 -0
- package/templates/kinds/route.schema.json +293 -0
- package/templates/kinds/stack-model.schema.json +90 -0
- package/templates/kinds/uat-capture.schema.json +35 -0
- package/templates/kinds/uat-flow-verification.contract.json +11 -0
- package/templates/kinds/uat-flow-verification.skeleton.md +47 -0
- package/templates/kinds/uat-snapshot.schema.json +96 -0
- package/templates/kinds/uat-verdicts.schema.json +41 -0
- package/templates/kinds/ui-coverage.schema.json +77 -0
- package/templates/kinds/verdicts.schema.json +39 -0
- package/templates/kinds/workspace-route-binding.contract.json +12 -0
- package/templates/kinds/workspace-route-binding.skeleton.md +60 -0
- package/templates/kinds/writes.schema.json +37 -0
- package/templates/operator.template.md +73 -0
- package/templates/patterns.template.md +31 -0
- package/templates/step/request.schema.json +42 -0
- package/templates/step/response.schema.json +144 -0
- package/templates/ui-composition.template.md +36 -0
- package/templates/ui-presentation.template.md +57 -0
- package/templates/ui-proof.template.md +34 -0
- package/workflows/README.md +37 -0
- package/workflows/README.vi.md +37 -0
- package/workflows/backend-feature.json +59 -0
- package/workflows/content-unit.json +19 -0
- package/workflows/frontend-new-surface.json +81 -0
- package/workflows/frontend-reconstruct.json +67 -0
- package/workflows/frontend-refine.json +67 -0
- package/workflows/frontend-with-uat.json +78 -0
- package/workflows/full-feature.json +104 -0
- package/workflows/release.json +29 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Accessibility proof
|
|
2
|
+
|
|
3
|
+
File này trả lời đúng một câu hỏi: trong cây đã thật sự render, mọi người đọc có cảm nhận và thao
|
|
4
|
+
tác được thứ mà direction đã định không.
|
|
5
|
+
|
|
6
|
+
Không điều gì ở đây được chốt bằng cách đọc source. Một prop trong source là một ý định; cái tên khả
|
|
7
|
+
truy cập tính ra từ node đã render mới là bằng chứng. Mỗi rule dưới đây nêu quan sát nào sẽ bác bỏ
|
|
8
|
+
nó, để một kết luận đạt luôn gọi tên được thứ đã thật sự được nhìn.
|
|
9
|
+
|
|
10
|
+
## A11Y-1 — Tên và quan hệ của field
|
|
11
|
+
|
|
12
|
+
Chi phối việc danh tính của một field và phần hướng dẫn hiện hành của nó có tới được đầu ra trợ năng
|
|
13
|
+
hay không.
|
|
14
|
+
|
|
15
|
+
| Case | Dùng khi | Quan sát |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| Case 1 | Một field render kèm nhãn nhìn thấy được | Tên khả truy cập tính ra bằng đúng nhãn nhìn thấy. Một cái tên chỉ do placeholder cấp, hoặc một field không có tên nào, sẽ bác bỏ nó |
|
|
18
|
+
| Case 2 | Field có hint, có lỗi, hoặc có cả hai | Thông điệp được gắn về input đó theo cách máy đọc được, và phần chữ là bản hiện hành. Một thông điệp nhìn thấy được nhưng không gắn với control nào sẽ bác bỏ nó |
|
|
19
|
+
| Case 3 | Field đang ở trạng thái bắt buộc, không hợp lệ hoặc bị vô hiệu | Ngữ nghĩa đã render khớp với dữ kiện business hiện tại. Một viền đỏ mà không có ngữ nghĩa không hợp lệ sẽ bác bỏ nó |
|
|
20
|
+
| Case 4 | Người đọc gõ và validation chạy lại | Giá trị đã nhập sống sót qua lần đổi state, và phần mô tả là bản mới chứ không phải một thông điệp cũ |
|
|
21
|
+
|
|
22
|
+
Không phải rule này: lỗi đó ban đầu có được đặt đúng owner hay không là quyết định của composition,
|
|
23
|
+
ở FEEDBACK-1.
|
|
24
|
+
|
|
25
|
+
## A11Y-2 — Câu lệnh chỉ có glyph vẫn phải có tên
|
|
26
|
+
|
|
27
|
+
Chi phối những câu lệnh mà phần nhìn thấy chỉ là một glyph.
|
|
28
|
+
|
|
29
|
+
| Case | Dùng khi | Quan sát |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| Case 1 | `IconButton` render một câu lệnh chỉ có glyph | Vai trò button mang một tên khả truy cập bằng đúng `label` của nó. Một tooltip là lời giải thích duy nhất sẽ bác bỏ nó |
|
|
32
|
+
| Case 2 | Nút chứa một glyph dẫn đầu mang tính trang trí | Glyph bên trong bị ẩn khỏi đầu ra trợ năng. Cùng một cái tên tính ra hai lần, một trên nút và một trên icon, sẽ bác bỏ nó |
|
|
33
|
+
| Case 3 | Một glyph đứng riêng và tự nó mang nghĩa | `Icon.ariaLabel` cho ra vai trò image với tên đó. Một glyph mang nghĩa mà bị ẩn đi sẽ bác bỏ nó |
|
|
34
|
+
| Case 4 | Câu lệnh có thể bị vô hiệu | Kích hoạt bằng bàn phím chạm tới nó khi bật, và không sinh ra gì khi bị vô hiệu |
|
|
35
|
+
|
|
36
|
+
## A11Y-3 — Phép đo phải có danh tính khả truy cập
|
|
37
|
+
|
|
38
|
+
Chi phối những con số được render thành thanh.
|
|
39
|
+
|
|
40
|
+
| Case | Dùng khi | Quan sát |
|
|
41
|
+
| --- | --- | --- |
|
|
42
|
+
| Case 1 | Một phép đo đã giải quyết được render | Progressbar để lộ tên khả truy cập bằng đúng label, giá trị hiện tại, tối thiểu `0` và tối đa `100`, và giá trị đó bằng đúng dữ kiện sản phẩm |
|
|
43
|
+
| Case 2 | Giá trị chưa giải quyết | Skeleton render hình khối bị ẩn khỏi trợ năng, không có progressbar và không có label. Một progressbar có tên đọc lên số không sẽ bác bỏ nó |
|
|
44
|
+
| Case 3 | `value` bị bỏ trống trong lúc dữ liệu chưa biết | Nhánh không phải skeleton lấy giá trị mặc định, nên đầu ra render đọc lên `0`, và điều đó bác bỏ tuyên bố rằng giá trị chưa biết |
|
|
45
|
+
| Case 4 | Một thanh trang trí nằm cạnh phép đo | Nó không mang vai trò progressbar. Hai phép đo được đọc lên cho một dữ kiện sẽ bác bỏ cả vùng |
|
|
46
|
+
|
|
47
|
+
## A11Y-4 — Cảm nhận được và thao tác được ở mọi state bắt buộc
|
|
48
|
+
|
|
49
|
+
Chi phối bằng chứng khép lại một tuyên bố về trợ năng.
|
|
50
|
+
|
|
51
|
+
| Case | Dùng khi | Quan sát |
|
|
52
|
+
| --- | --- | --- |
|
|
53
|
+
| Case 1 | Một mục tiêu phải thao tác được bằng chạm | Trigger của accordion và các control bên trong rail đo được ít nhất `44px × 44px` trong bản render hiện tại. Mọi mục tiêu khác cần bằng chứng hợp đồng riêng trước khi khẳng định một mức tối thiểu |
|
|
54
|
+
| Case 2 | Nhiệm vụ được thực hiện chỉ bằng bàn phím | Mọi control bắt buộc đều chạm tới và thao tác được. Một control bắt buộc không chạm tới được sẽ bác bỏ cả trang |
|
|
55
|
+
| Case 3 | Trang được xem ở forced colors, ở mức tương phản giảm, hoặc đã bỏ màu | Mọi khác biệt về state, selection và focus vẫn sống sót. Một khác biệt chỉ dựa vào phần tô sẽ bác bỏ nó |
|
|
56
|
+
| Case 4 | Trang được zoom, chữ được phóng, hoặc viewport hẹp lại | Không nội dung bắt buộc nào và không chỉ dấu focus nào bị cắt |
|
|
57
|
+
| Case 5 | Một family hoặc ứng dụng sơn đè lên owner công khai | So sánh riêng đầu ra công khai cô lập, delta của family và delta của ứng dụng, để gọi tên được tầng đang hỏng |
|
|
58
|
+
|
|
59
|
+
Không phải rule này: đáng lẽ phải chọn semantic owner nào là quyết định của composition, ở
|
|
60
|
+
HIERARCHY-1 và STATE-1.
|
|
61
|
+
|
|
62
|
+
## File này không quyết định
|
|
63
|
+
|
|
64
|
+
Direction đã chọn cấp độ, action hay state nào thuộc [Hierarchy](../composition/hierarchy.vi.md),
|
|
65
|
+
[Action](../composition/action.vi.md) và [State](../composition/state.vi.md). Chỉ dấu focus nằm ở
|
|
66
|
+
đâu và focus được đi xa tới đâu thuộc [Focus](focus.vi.md). Chuyển động có làm mất ý nghĩa không
|
|
67
|
+
thuộc [Motion](motion.vi.md), còn tuyên bố đã render có khớp authority không thuộc
|
|
68
|
+
[Render truth](render-truth.vi.md).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Contrast proof
|
|
2
|
+
|
|
3
|
+
This file answers one question: on the page that actually rendered, do the distinctions and the text
|
|
4
|
+
the direction relies on survive measurement, in every theme and state, and with colour taken away?
|
|
5
|
+
|
|
6
|
+
Contrast is never established by reading a token. An authored value is a formula; the evidence is the
|
|
7
|
+
computed foreground measured against the background that was actually composed beneath it, after
|
|
8
|
+
transparency, overlays, and state opacity. Each rule below names the observation that would falsify
|
|
9
|
+
it.
|
|
10
|
+
|
|
11
|
+
`COLOR-3` and `COLOR-5` are the two surviving addresses of the retired `ui/color.md` topic. The
|
|
12
|
+
numbers `COLOR-1`, `COLOR-2`, and `COLOR-4` were retired with it and are not reused.
|
|
13
|
+
|
|
14
|
+
## COLOR-3 — Action, destination, selection, and focus stay distinguishable
|
|
15
|
+
|
|
16
|
+
Governs whether four different meanings sharing one region remain four different things once colour
|
|
17
|
+
is removed from the evidence.
|
|
18
|
+
|
|
19
|
+
| Case | When | Observe |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| Case 1 | One region renders commands and destinations side by side | The command is a `button` element (`data-element="button"`) and the destination an anchor (`data-element="a"`) carrying an `href`, and the destination differs from surrounding copy at rest. A destination whose only resting difference is a colour value, with the underline appearing only on hover, falsifies it |
|
|
22
|
+
| Case 2 | Persistent selection is rendered among peers | The selected peer carries `aria-selected="true"` (tabs) or `aria-current` (a current text action), and a non-colour change is measured on it: a selected-indicator rectangle of non-zero height, a computed `font-weight` change, or an underline. A selection whose only measurable change is a colour value falsifies it |
|
|
23
|
+
| Case 3 | Keyboard focus lands in the same region | `document.activeElement` is the focused control, and its computed outline rectangle is distinct from the selection cue. Focus and selection sharing one identical fill, with no outline and no state attribute, falsifies both owners at once |
|
|
24
|
+
| Case 4 | Colour is removed from the capture, or forced colours are active | Each of the four distinctions still holds through element role, state attribute, outline, or indicator geometry. A distinction carried by fill alone falsifies it |
|
|
25
|
+
| Case 5 | A non-text boundary carries the distinction: an indicator, an outline, a field edge | Its measured contrast against the adjacent composed background is at least `3:1`. A `2px` indicator measuring `1.8:1` against its rail falsifies it, however visible it looked in the design file |
|
|
26
|
+
|
|
27
|
+
Not this rule: the text ratio of the selected or focused label, and how every ratio moves across
|
|
28
|
+
themes, is COLOR-5. Where the focus indicator sits and whether an ancestor clips it is FOCUS-1.
|
|
29
|
+
Whether every distinction survives at zoom and reflow is A11Y-4. Whether a destination should have
|
|
30
|
+
been a command at all is decided in composition, under ACTION-1.
|
|
31
|
+
|
|
32
|
+
## COLOR-5 — Themes and measured contrast
|
|
33
|
+
|
|
34
|
+
Governs whether text and required boundaries clear their ratios in every theme and every state the
|
|
35
|
+
family renders, measured on the composed pixels rather than on the token.
|
|
36
|
+
|
|
37
|
+
| Case | When | Observe |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Case 1 | Normal text renders | The computed `color` measured against the composed background, after transparency, overlays, and any state opacity such as `[data-grammar-state="unavailable"]`, is at least `4.5:1`. A token that looks dark enough on its own, with no composed background captured, proves nothing and is recorded as missing proof |
|
|
40
|
+
| Case 2 | Large text renders, at least `24px`, or `18.66px` at bold weight | The same composed measurement is at least `3:1` |
|
|
41
|
+
| Case 3 | A required non-text boundary renders: a focus outline, a selected indicator, a field edge, a state edge | Its measured contrast against the colours on each side is at least `3:1`. A field edge that resolves to `transparent` against its canvas has no measurable boundary, and the field's identity must then be carried by something else that was measured |
|
|
42
|
+
| Case 4 | The theme changes: light, explicit dark (`data-grammar-theme="dark"` on the Grammar root), or system dark (`data-grammar-theme="system"` under `prefers-color-scheme: dark`) | Every pair is re-measured in each theme actually rendered. A ratio captured in one theme closes nothing in another |
|
|
43
|
+
| Case 5 | Forced colours are active | Every pair resolves to the system palette (`Canvas`, `CanvasText`, `Highlight`, `GrayText`) and every distinction still renders. An authored colour surviving into the forced-colours capture falsifies the family's binding |
|
|
44
|
+
| Case 6 | The state changes: hover, focus, selected, disabled (`disabled` or `aria-disabled`), pending (`aria-busy` or `data-action-pending="true"`), or an outcome state (`data-grammar-state`) | Each state is measured on its own, and the token source is recorded separately from the numeric ratio. A single default-state measurement closes nothing for the other states |
|
|
45
|
+
| Case 7 | A family or the application paints over the pair | The isolated published output, the family delta, and the application delta are measured separately, so the failing layer is named. The application may change its own canvas, but a failing pair inside a published owner remains a finding at the layer that painted it |
|
|
46
|
+
|
|
47
|
+
Not this rule: whether the distinction exists at all without colour is COLOR-3. Whether the right
|
|
48
|
+
tone token was chosen for the copy is decided in presentation, under TONE-1 to TONE-3. Whether the
|
|
49
|
+
text is announced at all is A11Y-1 to A11Y-3.
|
|
50
|
+
|
|
51
|
+
## What this file does not decide
|
|
52
|
+
|
|
53
|
+
Which tone a piece of copy takes and which surface sits behind it are
|
|
54
|
+
[Tone](../presentation/tone.md) and [Surface](../presentation/surface.md); which meanings a region
|
|
55
|
+
carries and which of them is a destination is [Action](../composition/action.md) and
|
|
56
|
+
[State](../composition/state.md). Names, relationships, and target sizes are
|
|
57
|
+
[Accessibility](accessibility.md); where the indicator sits is [Focus](focus.md); whether a state
|
|
58
|
+
was reached truthfully is [Render truth](render-truth.md).
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Contrast proof
|
|
2
|
+
|
|
3
|
+
File này trả lời đúng một câu hỏi: trên trang đã thật sự render, những khác biệt và phần chữ mà
|
|
4
|
+
direction đang dựa vào có sống sót qua phép đo không, ở mọi theme, mọi state, và khi màu bị lấy đi?
|
|
5
|
+
|
|
6
|
+
Tương phản không bao giờ được xác lập bằng cách đọc token. Một giá trị đã viết ra chỉ là công thức;
|
|
7
|
+
bằng chứng là màu chữ đã tính, đo trên nền thật sự được ghép bên dưới nó, sau khi đã cộng độ trong
|
|
8
|
+
suốt, lớp phủ và độ mờ của state. Mỗi rule dưới đây gọi tên quan sát nào sẽ bác bỏ nó.
|
|
9
|
+
|
|
10
|
+
`COLOR-3` và `COLOR-5` là hai địa chỉ còn sống của topic `ui/color.md` đã nghỉ. Các số `COLOR-1`,
|
|
11
|
+
`COLOR-2` và `COLOR-4` đã nghỉ cùng topic đó và không được dùng lại.
|
|
12
|
+
|
|
13
|
+
## COLOR-3 — Action, destination, selection và focus vẫn phân biệt được
|
|
14
|
+
|
|
15
|
+
Chi phối việc bốn ý nghĩa khác nhau chia chung một vùng có còn là bốn thứ khác nhau không, khi màu bị
|
|
16
|
+
loại khỏi bằng chứng.
|
|
17
|
+
|
|
18
|
+
| Case | Dùng khi | Quan sát |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| Case 1 | Một vùng render command và destination cạnh nhau | Command là phần tử `button` (`data-element="button"`) còn destination là thẻ neo (`data-element="a"`) mang `href`, và destination khác với chữ xung quanh ngay lúc nghỉ. Một destination mà khác biệt lúc nghỉ chỉ là một giá trị màu, gạch chân chỉ hiện khi hover, sẽ bác bỏ nó |
|
|
21
|
+
| Case 2 | Lựa chọn bền vững được render giữa các mục ngang hàng | Mục được chọn mang `aria-selected="true"` (tabs) hoặc `aria-current` (một text action đang current), và đo được một thay đổi không phải màu trên nó: một hình chữ nhật chỉ dấu chọn có chiều cao khác không, một `font-weight` đã tính thay đổi, hoặc một gạch chân. Một lựa chọn mà thay đổi đo được duy nhất là giá trị màu sẽ bác bỏ nó |
|
|
22
|
+
| Case 3 | Focus bàn phím rơi vào cùng vùng đó | `document.activeElement` là control đang được focus, và hình chữ nhật outline đã tính của nó tách biệt với chỉ dấu chọn. Focus và selection dùng chung một fill y hệt, không outline và không thuộc tính state, sẽ bác bỏ cả hai owner cùng lúc |
|
|
23
|
+
| Case 4 | Màu bị loại khỏi ảnh chụp, hoặc forced colors đang bật | Mỗi khác biệt trong bốn thứ vẫn giữ được qua role phần tử, thuộc tính state, outline hoặc hình học của chỉ dấu. Một khác biệt chỉ do fill mang sẽ bác bỏ nó |
|
|
24
|
+
| Case 5 | Một ranh giới không phải chữ đang mang khác biệt: chỉ dấu, outline, mép field | Tương phản đo được của nó với nền ghép liền kề tối thiểu `3:1`. Một chỉ dấu `2px` đo được `1.8:1` trên thanh của nó sẽ bác bỏ nó, dù trong file thiết kế trông rõ tới đâu |
|
|
25
|
+
|
|
26
|
+
Không phải rule này: tỉ lệ chữ của nhãn đang được chọn hay được focus, và mọi tỉ lệ dịch chuyển ra
|
|
27
|
+
sao giữa các theme, thuộc COLOR-5. Chỉ dấu focus nằm ở đâu và có bị tổ tiên cắt không thuộc
|
|
28
|
+
FOCUS-1. Mọi khác biệt có sống sót khi zoom và chảy lại không thuộc A11Y-4. Một destination có đáng
|
|
29
|
+
lẽ phải là command hay không được quyết ở composition, dưới ACTION-1.
|
|
30
|
+
|
|
31
|
+
## COLOR-5 — Theme và tương phản đo được
|
|
32
|
+
|
|
33
|
+
Chi phối việc chữ và các ranh giới bắt buộc có đạt tỉ lệ ở mọi theme và mọi state mà family render
|
|
34
|
+
không, đo trên pixel đã ghép chứ không đo trên token.
|
|
35
|
+
|
|
36
|
+
| Case | Dùng khi | Quan sát |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| Case 1 | Chữ cỡ thường được render | `color` đã tính, đo trên nền đã ghép sau độ trong suốt, lớp phủ và độ mờ của state như `[data-grammar-state="unavailable"]`, tối thiểu `4.5:1`. Một token tự nó trông đủ tối, mà không chụp được nền đã ghép, không chứng minh gì và được ghi là thiếu bằng chứng |
|
|
39
|
+
| Case 2 | Chữ cỡ lớn được render, tối thiểu `24px`, hoặc `18.66px` ở độ đậm bold | Cùng phép đo trên nền ghép, tối thiểu `3:1` |
|
|
40
|
+
| Case 3 | Một ranh giới không phải chữ nhưng bắt buộc được render: outline focus, chỉ dấu chọn, mép field, mép state | Tương phản đo được với màu ở hai bên tối thiểu `3:1`. Một mép field phân giải thành `transparent` trên canvas của nó thì không có ranh giới nào đo được, và khi ấy danh tính của field phải do thứ khác đã được đo mang thay |
|
|
41
|
+
| Case 4 | Theme đổi: light, dark tường minh (`data-grammar-theme="dark"` trên Grammar root), hoặc dark theo hệ thống (`data-grammar-theme="system"` dưới `prefers-color-scheme: dark`) | Mọi cặp được đo lại ở từng theme thật sự render. Một tỉ lệ chụp ở theme này không khép được gì ở theme kia |
|
|
42
|
+
| Case 5 | Forced colors đang bật | Mọi cặp phân giải về bảng màu hệ thống (`Canvas`, `CanvasText`, `Highlight`, `GrayText`) và mọi khác biệt vẫn render. Một màu do tác giả đặt mà sống sót vào ảnh chụp forced colors sẽ bác bỏ binding của family |
|
|
43
|
+
| Case 6 | State đổi: hover, focus, selected, disabled (`disabled` hoặc `aria-disabled`), pending (`aria-busy` hoặc `data-action-pending="true"`), hoặc một state kết quả (`data-grammar-state`) | Mỗi state được đo riêng, và nguồn token được ghi tách khỏi con số tỉ lệ. Một phép đo duy nhất ở state mặc định không khép được gì cho các state còn lại |
|
|
44
|
+
| Case 7 | Một family hoặc ứng dụng sơn đè lên cặp màu | Đầu ra công khai cô lập, delta của family và delta của ứng dụng được đo riêng, để gọi tên được tầng đang hỏng. Ứng dụng được đổi canvas của chính nó, nhưng một cặp hỏng bên trong owner công khai vẫn là finding ở đúng tầng đã sơn nó |
|
|
45
|
+
|
|
46
|
+
Không phải rule này: khác biệt có tồn tại khi không có màu hay không thuộc COLOR-3. Token tone có
|
|
47
|
+
được chọn đúng cho phần chữ không được quyết ở presentation, dưới TONE-1 tới TONE-3. Chữ có được
|
|
48
|
+
đọc lên hay không thuộc A11Y-1 tới A11Y-3.
|
|
49
|
+
|
|
50
|
+
## File này không quyết định
|
|
51
|
+
|
|
52
|
+
Một đoạn chữ lấy tone nào và surface nào nằm sau nó thuộc [Tone](../presentation/tone.vi.md) và
|
|
53
|
+
[Surface](../presentation/surface.vi.md); một vùng mang những ý nghĩa nào và cái nào là destination
|
|
54
|
+
thuộc [Action](../composition/action.vi.md) và [State](../composition/state.vi.md). Tên, quan hệ và
|
|
55
|
+
kích thước mục tiêu thuộc [Accessibility](accessibility.vi.md); chỉ dấu nằm ở đâu thuộc
|
|
56
|
+
[Focus](focus.vi.md); một state có được đi tới một cách trung thực không thuộc
|
|
57
|
+
[Render truth](render-truth.vi.md).
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Focus proof
|
|
2
|
+
|
|
3
|
+
This file answers one question: for a reader working without a pointer, where is focus, where can it
|
|
4
|
+
go, and where does it come back to?
|
|
5
|
+
|
|
6
|
+
Focus is only ever proved at runtime. A `:focus-visible` rule in a stylesheet does not establish a
|
|
7
|
+
visible indicator, and a correct DOM order does not establish that traversal reached every stop.
|
|
8
|
+
Each rule below names the observation that would falsify it.
|
|
9
|
+
|
|
10
|
+
## FOCUS-1 — The visible indicator sits on the actual target
|
|
11
|
+
|
|
12
|
+
Governs whether a focused thing looks focused.
|
|
13
|
+
|
|
14
|
+
| Case | When | Observe |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Keyboard focus lands on an interactive or scrollable published owner | An indicator appears on that exact target, identifying it unambiguously. A focused element with no perceivable change falsifies it |
|
|
17
|
+
| Case 2 | The indicator sits against adjacent paint or a coloured surface | It remains distinguishable there, in the current computed styles rather than in the intended ones |
|
|
18
|
+
| Case 3 | The viewport narrows, the page zooms, or the target sits at a scroll edge | The indicator is not clipped by any ancestor's overflow |
|
|
19
|
+
| Case 4 | The application or a family styled over the published owner | The indicator survives. An `outline: none` with no equivalent replacement falsifies it, and hover feedback is not a substitute |
|
|
20
|
+
| Case 5 | Focus arrives by pointer rather than by keyboard | The indicator appears only where the published treatment intends it, so its presence still means something |
|
|
21
|
+
|
|
22
|
+
## FOCUS-2 — Sequential order equals task order
|
|
23
|
+
|
|
24
|
+
Governs the path focus takes through a composite.
|
|
25
|
+
|
|
26
|
+
| Case | When | Observe |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Case 1 | Tabs, disclosures, navigation peers, or scroll regions create several stops | Visible order, DOM order, and sequential focus order agree with the task dependency. A visual reorder that leaves focus behind falsifies it |
|
|
29
|
+
| Case 2 | The composite publishes arrow-key behaviour | Traversal reaches every enabled peer and skips what is disabled or hidden. Arrow focus landing on a disabled peer falsifies it |
|
|
30
|
+
| Case 3 | Traversal is run backwards | Reverse order mirrors forward order, and no stop is reachable in only one direction |
|
|
31
|
+
| Case 4 | Peers overflow their container, or the layout reflows at a narrower width | Every peer is still reachable, and focusing one brings it into view |
|
|
32
|
+
| Case 5 | The application set an explicit tab order | A positive tab index that jumps a later action ahead of earlier required fields falsifies the order; the source order is what should have changed |
|
|
33
|
+
|
|
34
|
+
## FOCUS-3 — Containment follows modality
|
|
35
|
+
|
|
36
|
+
Governs how far focus may travel while a region is open.
|
|
37
|
+
|
|
38
|
+
| Case | When | Observe |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Case 1 | A modal region opens above the current task | Focus enters the dialog, stays inside it, reaches an explicit close path, and responds to Escape. Focus escaping to the page behind it falsifies containment |
|
|
41
|
+
| Case 2 | The modal closes | Focus returns to the exact control that opened it. A return to the document body falsifies restoration |
|
|
42
|
+
| Case 3 | The compact conversation rail is the modal in question | `ChatWorkspace` owns that lifecycle through `isRailOpen` and `onRailOpenChange`; the runtime focus sequence is observed rather than inferred from the vendor name behind it |
|
|
43
|
+
| Case 4 | A non-modal region appears beside the task | Focus moves in and out of it freely. A non-modal region that traps focus falsifies it |
|
|
44
|
+
| Case 5 | A different reusable modal is needed and no published owner fits | The gap is recorded. Application-local focus machinery is a tracked workaround, never presented as the contract |
|
|
45
|
+
|
|
46
|
+
## FOCUS-4 — Focus evidence and falsifiers
|
|
47
|
+
|
|
48
|
+
Governs what closes a focus claim.
|
|
49
|
+
|
|
50
|
+
| Case | When | Observe |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| Case 1 | Any focus claim is being closed | The active element, the visible indicator, the computed style, the DOM order, the target rectangle, and the accessibility tree are captured together. A screenshot without an active-element trace closes nothing |
|
|
53
|
+
| Case 2 | A branch is conditionally absent | It contributes no focus stop. A visually hidden control still in the sequence falsifies its absence |
|
|
54
|
+
| Case 3 | A control is disabled or unavailable | Focus behaves as the published owner intends, and activation produces no effect |
|
|
55
|
+
| Case 4 | The page is zoomed or reflowed | Every path above is rerun there, because a ring that fits at one width may be clipped at another |
|
|
56
|
+
| Case 5 | A family or the application adds a delta | The isolated published output, the family delta, and the application delta are separated, so the failing layer is named |
|
|
57
|
+
|
|
58
|
+
## FOCUS-5 — Pointer and keyboard reach the same outcome
|
|
59
|
+
|
|
60
|
+
Governs parity between input methods across every interactive owner.
|
|
61
|
+
|
|
62
|
+
| Case | When | Observe |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| Case 1 | A whole-surface action, a tab, or a disclosure is exercised | Pointer and keyboard produce the same product outcome. An action available only by pointer falsifies parity |
|
|
65
|
+
| Case 2 | One activation is delivered by either route | It produces at most one accepted effect. Two callbacks for one key press falsifies the owner |
|
|
66
|
+
| Case 3 | Targets sit near or over one another | Their rectangles do not collide, and no independent control hides behind a whole-surface overlay |
|
|
67
|
+
| Case 4 | A required action is revealed by hovering | That falsifies it. A required action is never hover-only |
|
|
68
|
+
| Case 5 | The paths are run across default, selected, expanded, disabled, pending, and absent states | Each state is exercised by both routes, and a desktop pointer pass alone closes nothing |
|
|
69
|
+
|
|
70
|
+
## What this file does not decide
|
|
71
|
+
|
|
72
|
+
Which reading order the task requires is [Hierarchy](../composition/hierarchy.md), which surfaces are
|
|
73
|
+
interactive and which values persist is [State](../composition/state.md), and which effect an
|
|
74
|
+
activation may reach is [Action](../composition/action.md). Names, relationships, and target sizes
|
|
75
|
+
are [Accessibility](accessibility.md); movement and reduced-motion equivalence are
|
|
76
|
+
[Motion](motion.md).
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Focus proof
|
|
2
|
+
|
|
3
|
+
File này trả lời đúng một câu hỏi: với người đọc làm việc không dùng con trỏ, focus đang ở đâu, nó
|
|
4
|
+
được đi tới đâu, và nó quay về đâu.
|
|
5
|
+
|
|
6
|
+
Focus chỉ chứng minh được lúc chạy. Một rule `:focus-visible` trong stylesheet không xác lập một chỉ
|
|
7
|
+
dấu nhìn thấy được, và một thứ tự DOM đúng không xác lập rằng việc duyệt đã chạm tới mọi điểm dừng.
|
|
8
|
+
Mỗi rule dưới đây gọi tên quan sát nào sẽ bác bỏ nó.
|
|
9
|
+
|
|
10
|
+
## FOCUS-1 — Chỉ dấu nhìn thấy nằm trên đúng mục tiêu
|
|
11
|
+
|
|
12
|
+
Chi phối việc một thứ đang được focus có trông như đang được focus không.
|
|
13
|
+
|
|
14
|
+
| Case | Dùng khi | Quan sát |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Focus bàn phím rơi vào một owner công khai tương tác được hoặc cuộn được | Một chỉ dấu xuất hiện trên đúng mục tiêu đó và nhận diện nó rõ ràng. Một phần tử được focus mà không có thay đổi cảm nhận được sẽ bác bỏ nó |
|
|
17
|
+
| Case 2 | Chỉ dấu nằm cạnh phần sơn hoặc trên một surface có màu | Nó vẫn phân biệt được ở đó, xét theo computed style hiện tại chứ không phải theo dự định |
|
|
18
|
+
| Case 3 | Viewport hẹp lại, trang zoom, hoặc mục tiêu nằm ở mép vùng cuộn | Chỉ dấu không bị overflow của tổ tiên nào cắt mất |
|
|
19
|
+
| Case 4 | Ứng dụng hoặc một family sơn đè lên owner công khai | Chỉ dấu vẫn sống sót. Một `outline: none` mà không có thứ thay thế tương đương sẽ bác bỏ nó, và phản hồi hover không thay thế được |
|
|
20
|
+
| Case 5 | Focus tới bằng con trỏ chứ không bằng bàn phím | Chỉ dấu chỉ xuất hiện ở nơi treatment công khai chủ đích, nhờ vậy sự hiện diện của nó vẫn còn ý nghĩa |
|
|
21
|
+
|
|
22
|
+
## FOCUS-2 — Thứ tự tuần tự bằng đúng thứ tự nhiệm vụ
|
|
23
|
+
|
|
24
|
+
Chi phối đường mà focus đi qua một composite.
|
|
25
|
+
|
|
26
|
+
| Case | Dùng khi | Quan sát |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Case 1 | Tabs, disclosure, các mục navigation ngang hàng hoặc vùng cuộn tạo ra nhiều điểm dừng | Thứ tự nhìn thấy, thứ tự DOM và thứ tự focus tuần tự khớp với phụ thuộc nhiệm vụ. Một lần đảo thị giác mà bỏ focus lại phía sau sẽ bác bỏ nó |
|
|
29
|
+
| Case 2 | Composite có công bố hành vi phím mũi tên | Việc duyệt chạm tới mọi mục ngang hàng đang bật và bỏ qua thứ bị vô hiệu hoặc bị ẩn. Focus mũi tên rơi vào một tab bị vô hiệu sẽ bác bỏ nó |
|
|
30
|
+
| Case 3 | Duyệt theo chiều ngược lại | Thứ tự ngược soi gương thứ tự xuôi, và không điểm dừng nào chỉ chạm tới được theo một chiều |
|
|
31
|
+
| Case 4 | Các mục ngang hàng tràn khỏi container, hoặc bố cục chảy lại ở bề rộng hẹp hơn | Mọi mục vẫn chạm tới được, và focus vào một mục sẽ kéo nó vào tầm nhìn |
|
|
32
|
+
| Case 5 | Ứng dụng đặt thứ tự tab tường minh | Một tab index dương đẩy một action về sau lên trước các field bắt buộc sẽ bác bỏ thứ tự; thứ đáng lẽ phải đổi là thứ tự nguồn |
|
|
33
|
+
|
|
34
|
+
## FOCUS-3 — Giam giữ đi theo tính modal
|
|
35
|
+
|
|
36
|
+
Chi phối việc focus được đi xa tới đâu khi một vùng đang mở.
|
|
37
|
+
|
|
38
|
+
| Case | Dùng khi | Quan sát |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Case 1 | Một vùng modal mở lên trên nhiệm vụ hiện tại | Focus đi vào dialog, ở lại bên trong, chạm tới một đường đóng tường minh và phản hồi Escape. Focus thoát ra trang phía sau sẽ bác bỏ việc giam giữ |
|
|
41
|
+
| Case 2 | Modal đóng lại | Focus quay về đúng control đã mở nó. Quay về document body sẽ bác bỏ việc khôi phục |
|
|
42
|
+
| Case 3 | Rail hội thoại dạng gọn chính là modal đang xét | `ChatWorkspace` sở hữu vòng đời đó qua `isRailOpen` và `onRailOpenChange`; chuỗi focus lúc chạy phải được quan sát chứ không suy ra từ tên vendor đứng sau |
|
|
43
|
+
| Case 4 | Một vùng không modal xuất hiện bên cạnh nhiệm vụ | Focus ra vào tự do. Một vùng không modal mà giam focus sẽ bác bỏ nó |
|
|
44
|
+
| Case 5 | Cần một modal dùng lại được khác mà chưa owner công khai nào hợp | Ghi nhận gap. Bộ máy focus cục bộ của ứng dụng là workaround có theo dõi, không bao giờ được trình bày như hợp đồng |
|
|
45
|
+
|
|
46
|
+
## FOCUS-4 — Bằng chứng focus và thứ bác bỏ nó
|
|
47
|
+
|
|
48
|
+
Chi phối những gì khép lại một tuyên bố về focus.
|
|
49
|
+
|
|
50
|
+
| Case | Dùng khi | Quan sát |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| Case 1 | Đang khép lại bất kỳ tuyên bố nào về focus | Chụp cùng lúc phần tử active, chỉ dấu nhìn thấy, computed style, thứ tự DOM, hình chữ nhật mục tiêu và cây accessibility. Một ảnh chụp màn hình không kèm vết phần tử active không khép được gì |
|
|
53
|
+
| Case 2 | Một nhánh vắng mặt có điều kiện | Nó không đóng góp điểm dừng focus nào. Một control bị ẩn thị giác mà vẫn nằm trong chuỗi sẽ bác bỏ sự vắng mặt đó |
|
|
54
|
+
| Case 3 | Một control bị vô hiệu hoặc không dùng được | Focus hành xử đúng như owner công khai chủ đích, và kích hoạt không sinh ra hiệu ứng nào |
|
|
55
|
+
| Case 4 | Trang được zoom hoặc chảy lại | Chạy lại mọi đường ở trên tại đó, vì một vòng focus vừa ở bề rộng này có thể bị cắt ở bề rộng khác |
|
|
56
|
+
| Case 5 | Một family hoặc ứng dụng thêm delta | Tách đầu ra công khai cô lập, delta của family và delta của ứng dụng, để gọi tên được tầng đang hỏng |
|
|
57
|
+
|
|
58
|
+
## FOCUS-5 — Con trỏ và bàn phím đi tới cùng một kết quả
|
|
59
|
+
|
|
60
|
+
Chi phối sự ngang bằng giữa hai phương thức nhập trên mọi owner tương tác.
|
|
61
|
+
|
|
62
|
+
| Case | Dùng khi | Quan sát |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| Case 1 | Một action toàn surface, một tab hoặc một disclosure được chạy thử | Con trỏ và bàn phím cho ra cùng một kết quả sản phẩm. Một action chỉ dùng được bằng con trỏ sẽ bác bỏ sự ngang bằng |
|
|
65
|
+
| Case 2 | Một lần kích hoạt được thực hiện bằng một trong hai đường | Nó sinh ra nhiều nhất một hiệu ứng được chấp nhận. Hai callback cho một lần nhấn phím sẽ bác bỏ owner đó |
|
|
66
|
+
| Case 3 | Các mục tiêu nằm sát hoặc chồng lên nhau | Hình chữ nhật của chúng không va nhau, và không control độc lập nào nấp sau overlay của một action toàn surface |
|
|
67
|
+
| Case 4 | Một action bắt buộc chỉ lộ ra khi hover | Điều đó bác bỏ nó. Một action bắt buộc không bao giờ chỉ có ở hover |
|
|
68
|
+
| Case 5 | Các đường được chạy qua trạng thái mặc định, selected, expanded, disabled, pending và vắng mặt | Mỗi trạng thái được chạy bằng cả hai đường, và một lượt bấm chuột trên desktop không khép được gì |
|
|
69
|
+
|
|
70
|
+
## File này không quyết định
|
|
71
|
+
|
|
72
|
+
Nhiệm vụ đòi thứ tự đọc nào thuộc [Hierarchy](../composition/hierarchy.vi.md), surface nào tương tác
|
|
73
|
+
và giá trị nào bền vững thuộc [State](../composition/state.vi.md), còn một lần kích hoạt chạm tới
|
|
74
|
+
hiệu ứng nào thuộc [Action](../composition/action.vi.md). Tên, quan hệ và kích thước mục tiêu thuộc
|
|
75
|
+
[Accessibility](accessibility.vi.md); chuyển động và sự tương đương ở chế độ reduced motion thuộc
|
|
76
|
+
[Motion](motion.vi.md).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Motion proof
|
|
2
|
+
|
|
3
|
+
This file answers one question: if the movement stopped, was interrupted, or was never allowed to
|
|
4
|
+
run, would the reader still know everything the page was telling them?
|
|
5
|
+
|
|
6
|
+
Motion is always supplementary. A rendered page is judged on the frame where nothing is moving, and
|
|
7
|
+
on the frame where the animation was cut off halfway. Each rule below names the observation that
|
|
8
|
+
would falsify it.
|
|
9
|
+
|
|
10
|
+
## MOTION-1 — Meaning exists without movement
|
|
11
|
+
|
|
12
|
+
Governs whether any essential meaning is carried by movement alone.
|
|
13
|
+
|
|
14
|
+
| Case | When | Observe |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Accepted work is in progress | The initiating command still shows its name, exposes busy state, and refuses a second activation in a static frame. A spinner as the only sign that work exists falsifies it |
|
|
17
|
+
| Case 2 | A state changed | A persistent carrier holds it: stable copy, native state, a controlled value, geometry, or a published relationship. A pulsing paint as the only selected cue falsifies it |
|
|
18
|
+
| Case 3 | Animation is disabled entirely | The same meaning is readable. Anything that disappears with the animation was never carried |
|
|
19
|
+
| Case 4 | Content is animating out | Once it is hidden it leaves no focus stop and no accessibility node. A hidden but still focusable exiting link falsifies it |
|
|
20
|
+
| Case 5 | Only an animated capture exists as evidence | Nothing is closed. The static frame and the interrupted outcome are still unknown |
|
|
21
|
+
|
|
22
|
+
## MOTION-2 — Preference changes choreography, not outcome
|
|
23
|
+
|
|
24
|
+
Governs what a reduced-motion preference is allowed to change.
|
|
25
|
+
|
|
26
|
+
| Case | When | Observe |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Case 1 | The system preference or the published motion mode changes | The trigger, the content, the landmark, the focus order, and the final geometry are identical before and after. Different collapsed content under the reduced path falsifies it |
|
|
29
|
+
| Case 2 | A rail publishes `motion` as `static`, `animated`, or `reduced` | The attribute is present, but the published CSS changes animated scroll behaviour and does not implement a rail-collapse transition. Claiming choreography from the prop name alone falsifies the finding |
|
|
30
|
+
| Case 3 | Reusable rail-collapse choreography is genuinely required | No published path provides it, so the missing capability is recorded rather than assumed |
|
|
31
|
+
| Case 4 | Application CSS animates that collapse in the meantime | It is a tracked workaround with an owner and a removal condition, not a new contract |
|
|
32
|
+
| Case 5 | A family supplies scoped choreography | It supplies an equivalent reduced path, ending in the same final state |
|
|
33
|
+
|
|
34
|
+
## MOTION-3 — Timing comes from the owner that published it
|
|
35
|
+
|
|
36
|
+
Governs where duration, delay, and easing are read from.
|
|
37
|
+
|
|
38
|
+
| Case | When | Observe |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Case 1 | A transition runs on a published element, such as a tooltip, a whole-card response, or a decorative highlight | The computed duration, delay, and easing match the rule that actually won in the current render, not a source string or a fallback variable |
|
|
41
|
+
| Case 2 | A family adds its own timing | It stays inside its `data-grammar-family` scope. Timing appearing in an unrelated tree falsifies the scoping |
|
|
42
|
+
| Case 3 | The application sets a duration on published anatomy | That reaches through an owner it does not have. The application decides when state changes, never how the renderer choreographs it |
|
|
43
|
+
| Case 4 | A published timing value was quoted from source | It is measured in the selected family before it is believed, because the selected family may have replaced it |
|
|
44
|
+
|
|
45
|
+
## MOTION-4 — Motion evidence and falsifiers
|
|
46
|
+
|
|
47
|
+
Governs what closes a motion claim.
|
|
48
|
+
|
|
49
|
+
| Case | When | Observe |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Case 1 | Any reachable motion is being closed | Normal, reduced, interrupted, reversed, backgrounded and resumed, zoomed, and responsive paths are all exercised |
|
|
52
|
+
| Case 2 | The capture is taken | Owner, trigger, prior and final state, the alternative cue, computed duration, delay and easing, animation events, focus, the accessibility tree, and the settled result are recorded together |
|
|
53
|
+
| Case 3 | Motion is interrupted partway | It settles to a valid state. A stale intermediate state, or lost focus, falsifies it |
|
|
54
|
+
| Case 4 | Anything flashes | It stays at or below three flashes per second. A four-flash urgency cue falsifies safety outright |
|
|
55
|
+
| Case 5 | A family or the application adds a delta | Each layer is attributed independently, and a smooth video with no preference or interruption evidence closes nothing |
|
|
56
|
+
|
|
57
|
+
## What this file does not decide
|
|
58
|
+
|
|
59
|
+
Which states exist and which carrier holds each is [State](../composition/state.md), and which
|
|
60
|
+
action owns pending is [Action](../composition/action.md). Whether the resting cue is distinguishable
|
|
61
|
+
without colour is [Accent](../composition/accent.md) and [Accessibility](accessibility.md). Whether
|
|
62
|
+
focus survives an exit is [Focus](focus.md), and whether the movement implies a result nobody
|
|
63
|
+
confirmed is [Render truth](render-truth.md).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Motion proof
|
|
2
|
+
|
|
3
|
+
File này trả lời đúng một câu hỏi: nếu chuyển động dừng lại, bị cắt ngang, hoặc chưa từng được phép
|
|
4
|
+
chạy, người đọc có còn biết mọi điều mà trang đang nói với họ không.
|
|
5
|
+
|
|
6
|
+
Chuyển động luôn chỉ là phần bổ trợ. Một trang đã render được xét ở khung hình mà không gì đang
|
|
7
|
+
chuyển động, và ở khung hình mà animation bị cắt ngang giữa chừng. Mỗi rule dưới đây gọi tên quan
|
|
8
|
+
sát nào sẽ bác bỏ nó.
|
|
9
|
+
|
|
10
|
+
## MOTION-1 — Ý nghĩa tồn tại mà không cần chuyển động
|
|
11
|
+
|
|
12
|
+
Chi phối việc có ý nghĩa thiết yếu nào chỉ do chuyển động mang hay không.
|
|
13
|
+
|
|
14
|
+
| Case | Dùng khi | Quan sát |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Việc đã nhận đang chạy | Câu lệnh khởi động vẫn hiện tên, vẫn để lộ trạng thái bận và vẫn từ chối lần kích hoạt thứ hai trong một khung hình tĩnh. Một spinner là dấu hiệu duy nhất cho thấy có việc đang chạy sẽ bác bỏ nó |
|
|
17
|
+
| Case 2 | Một state vừa đổi | Có một carrier bền giữ nó: chữ ổn định, native state, một giá trị điều khiển, geometry, hoặc một quan hệ công khai. Một hiệu ứng nhấp nháy là dấu hiệu selected duy nhất sẽ bác bỏ nó |
|
|
18
|
+
| Case 3 | Animation bị tắt hoàn toàn | Vẫn đọc ra đúng ý nghĩa đó. Thứ gì biến mất cùng animation thì vốn chưa từng được mang |
|
|
19
|
+
| Case 4 | Nội dung đang chạy ra ngoài | Khi đã bị ẩn, nó không để lại điểm dừng focus và không để lại node trợ năng. Một link đang thoát bị ẩn nhưng vẫn focus được sẽ bác bỏ nó |
|
|
20
|
+
| Case 5 | Bằng chứng duy nhất là một bản ghi có chuyển động | Không khép được gì. Khung hình tĩnh và kết cục khi bị cắt ngang vẫn chưa biết |
|
|
21
|
+
|
|
22
|
+
## MOTION-2 — Tuỳ chọn đổi cách dàn dựng, không đổi kết quả
|
|
23
|
+
|
|
24
|
+
Chi phối những gì mà tuỳ chọn reduced motion được phép thay đổi.
|
|
25
|
+
|
|
26
|
+
| Case | Dùng khi | Quan sát |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| Case 1 | Tuỳ chọn hệ thống hoặc chế độ motion công khai thay đổi | Trigger, nội dung, landmark, thứ tự focus và geometry cuối giống hệt trước và sau. Nội dung thu gọn khác đi ở nhánh reduced sẽ bác bỏ nó |
|
|
29
|
+
| Case 2 | Một rail công bố `motion` là `static`, `animated` hoặc `reduced` | Thuộc tính có mặt, nhưng CSS công khai chỉ đổi hành vi cuộn có animation và không hiện thực một transition thu gọn rail. Khẳng định có dàn dựng chỉ dựa vào tên prop sẽ bác bỏ kết luận |
|
|
30
|
+
| Case 3 | Thật sự cần dàn dựng thu gọn rail dùng lại được | Chưa đường công khai nào cung cấp, nên ghi nhận năng lực còn thiếu thay vì mặc định là có |
|
|
31
|
+
| Case 4 | CSS ứng dụng đang tự animate phần thu gọn đó trong lúc chờ | Đó là workaround có theo dõi, có owner và có điều kiện gỡ bỏ, không phải một hợp đồng mới |
|
|
32
|
+
| Case 5 | Một family cấp phần dàn dựng trong phạm vi của nó | Nó cấp kèm một nhánh reduced tương đương, kết thúc ở cùng một trạng thái cuối |
|
|
33
|
+
|
|
34
|
+
## MOTION-3 — Thời lượng đến từ owner đã công bố nó
|
|
35
|
+
|
|
36
|
+
Chi phối việc duration, delay và easing được đọc từ đâu.
|
|
37
|
+
|
|
38
|
+
| Case | Dùng khi | Quan sát |
|
|
39
|
+
| --- | --- | --- |
|
|
40
|
+
| Case 1 | Một transition chạy trên phần tử công khai, như tooltip, phản hồi toàn card hay animation highlight trang trí | Duration, delay và easing tính được khớp với rule thật sự thắng trong bản render hiện tại, không khớp với một chuỗi trong source hay một biến dự phòng |
|
|
41
|
+
| Case 2 | Một family thêm thời lượng của riêng nó | Nó ở trong phạm vi `data-grammar-family` của mình. Thời lượng xuất hiện ở một cây không liên quan sẽ bác bỏ phạm vi đó |
|
|
42
|
+
| Case 3 | Ứng dụng đặt duration lên phần anatomy công khai | Đó là với qua một owner mà nó không có. Ứng dụng quyết định khi nào state đổi, không bao giờ quyết định renderer dàn dựng ra sao |
|
|
43
|
+
| Case 4 | Một giá trị thời lượng công khai được trích từ source | Phải đo lại trong family đang chọn rồi mới tin, vì family đang chọn có thể đã thay nó |
|
|
44
|
+
|
|
45
|
+
## MOTION-4 — Bằng chứng chuyển động và thứ bác bỏ nó
|
|
46
|
+
|
|
47
|
+
Chi phối những gì khép lại một tuyên bố về chuyển động.
|
|
48
|
+
|
|
49
|
+
| Case | Dùng khi | Quan sát |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Case 1 | Đang khép lại bất kỳ chuyển động nào chạm tới được | Chạy đủ các đường bình thường, reduced, bị cắt ngang, đảo chiều, chuyển nền rồi quay lại, zoom và responsive |
|
|
52
|
+
| Case 2 | Đang chụp bằng chứng | Ghi cùng lúc owner, trigger, trạng thái trước và cuối, dấu hiệu thay thế, duration, delay và easing tính được, các sự kiện animation, focus, cây accessibility và kết quả đã kết thúc |
|
|
53
|
+
| Case 3 | Chuyển động bị cắt ngang giữa chừng | Nó lắng về một trạng thái hợp lệ. Một trạng thái trung gian kẹt lại, hoặc focus bị mất, sẽ bác bỏ nó |
|
|
54
|
+
| Case 4 | Có thứ gì nhấp nháy | Nó ở mức tối đa ba lần mỗi giây. Một dấu hiệu khẩn nhấp bốn lần bác bỏ tính an toàn ngay lập tức |
|
|
55
|
+
| Case 5 | Một family hoặc ứng dụng thêm delta | Quy trách nhiệm từng tầng độc lập, và một video mượt không kèm bằng chứng về tuỳ chọn và về lúc bị cắt ngang không khép được gì |
|
|
56
|
+
|
|
57
|
+
## File này không quyết định
|
|
58
|
+
|
|
59
|
+
Có những state nào và carrier nào giữ từng cái thuộc [State](../composition/state.vi.md), còn action
|
|
60
|
+
nào sở hữu pending thuộc [Action](../composition/action.vi.md). Dấu hiệu lúc nghỉ có phân biệt được
|
|
61
|
+
mà không cần màu không thuộc [Accent](../composition/accent.vi.md) và
|
|
62
|
+
[Accessibility](accessibility.vi.md). Focus có sống sót qua một lần thoát không thuộc
|
|
63
|
+
[Focus](focus.vi.md), còn chuyển động có ngụ ý một kết quả chưa ai xác nhận không thuộc
|
|
64
|
+
[Render truth](render-truth.vi.md).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Render truth proof
|
|
2
|
+
|
|
3
|
+
This file answers one question: does every visible and announced claim on the rendered page trace
|
|
4
|
+
back to something the product actually established?
|
|
5
|
+
|
|
6
|
+
A claim is anything the page asserts: a word, a glyph, a tone, a state, a live announcement, a
|
|
7
|
+
promise of recovery. The audit inventories the claims that were rendered and traces each to its
|
|
8
|
+
source. A claim with no source is invented, whichever layer invented it.
|
|
9
|
+
|
|
10
|
+
## TRUTH-1 — Neutral facts stay neutral
|
|
11
|
+
|
|
12
|
+
Governs content that authority supplied without any status attached.
|
|
13
|
+
|
|
14
|
+
| Case | When | Observe |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Authority supplied a plain fact | It renders as ordinary text with no status role, no success or error state, and no urgency. An alert role on default text falsifies it |
|
|
17
|
+
| Case 2 | A glyph, a tone, or a placement was added around the fact | None of them reads as an outcome or an endorsement. A tick mark and a success treatment on a capability statement falsifies it |
|
|
18
|
+
| Case 3 | A family paints the region | Neutral facts stay neutral under that paint. A whole set of plan facts painted as warnings falsifies it |
|
|
19
|
+
| Case 4 | The state or the viewport changes | The claim is re-inventoried there, because a fact that was neutral at one width may not be at another |
|
|
20
|
+
|
|
21
|
+
## TRUTH-2 — Availability follows authority
|
|
22
|
+
|
|
23
|
+
Governs claims about what the current reader may do.
|
|
24
|
+
|
|
25
|
+
| Case | When | Observe |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| Case 1 | Authority confirms a static capability is unavailable here | The row carries `state="unavailable"` with an exact label and a description naming the verified condition. Copy implying the feature is already enabled falsifies it |
|
|
28
|
+
| Case 2 | The unavailable thing is a command rather than a static capability | The action owner carries `isDisabled`, and the disabled semantics are in the rendered output |
|
|
29
|
+
| Case 3 | The state mark alone would be the evidence | It is decorative or absent here, so the accessible truth still depends on the supplied text. Inferring a spoken unavailable status from paint falsifies it |
|
|
30
|
+
| Case 4 | An action is visible and is taken as proof of permission | Visibility is not permission. Permission is resolved from authority and then drives the real owner |
|
|
31
|
+
| Case 5 | A family paints the unavailable row | It stays inactive. Affirmative paint over an unavailable fact falsifies it |
|
|
32
|
+
|
|
33
|
+
## TRUTH-3 — Progress is not an outcome
|
|
34
|
+
|
|
35
|
+
Governs the boundary between work in flight and a result.
|
|
36
|
+
|
|
37
|
+
| Case | When | Observe |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Case 1 | A command has accepted work | Progress stays on that command, its label survives, and duplicate activation is blocked while the work runs |
|
|
40
|
+
| Case 2 | A result is claimed | Authority confirmed it first. A success message rendered while the request is still pending falsifies it |
|
|
41
|
+
| Case 3 | Navigation is claimed | The navigation effect actually exists. A message saying the reader is being taken somewhere, when nothing started, falsifies it, and a navigation status rendered as an error falsifies it twice |
|
|
42
|
+
| Case 4 | Pending and outcome would occupy the same moment | They do not. A family painting affirmative over a pending control falsifies the current state |
|
|
43
|
+
| Case 5 | A recovery or a route is stated in the copy | It exists and can be reached. A promised retry with no wired recovery falsifies the promise |
|
|
44
|
+
|
|
45
|
+
## TRUTH-4 — Claim evidence and falsifiers
|
|
46
|
+
|
|
47
|
+
Governs what closes a render-truth claim.
|
|
48
|
+
|
|
49
|
+
| Case | When | Observe |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Case 1 | Any reachable state is being closed | Every claim carried by text, icon, shape, tone, placement, motion, native state, live region, and accessibility semantics is inventoried in that state |
|
|
52
|
+
| Case 2 | A claim has been inventoried | It is traced to business authority, the current runtime result, the current permission, and the effect or recovery that actually exists |
|
|
53
|
+
| Case 3 | The state, the theme, or the viewport changes | The inventory is rerun there. One theme or one stale-and-refreshed state left unchecked closes nothing |
|
|
54
|
+
| Case 4 | A family or the application adds a delta | The isolated published output, the family delta, the application delta, and the current pixels are compared separately |
|
|
55
|
+
| Case 5 | Copy review or source props are offered as the evidence | They are not sufficient. A rendered claim is proved by the rendered output and its traced authority |
|
|
56
|
+
|
|
57
|
+
## What this file does not decide
|
|
58
|
+
|
|
59
|
+
Which rank a fact receives is [Hierarchy](../composition/hierarchy.md), which conditions exist and
|
|
60
|
+
which carrier holds each is [State](../composition/state.md), and where a message belongs is
|
|
61
|
+
[Feedback](../composition/feedback.md). Whether the claim is announced correctly is
|
|
62
|
+
[Accessibility](accessibility.md), whether movement implies it is [Motion](motion.md), and whether
|
|
63
|
+
the reader can reach the control that acts on it is [Focus](focus.md).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Render truth proof
|
|
2
|
+
|
|
3
|
+
File này trả lời đúng một câu hỏi: mọi tuyên bố nhìn thấy được và đọc lên được trên trang đã render
|
|
4
|
+
có truy ngược về một thứ mà sản phẩm thật sự xác lập không.
|
|
5
|
+
|
|
6
|
+
Một tuyên bố là bất cứ điều gì trang khẳng định: một từ, một glyph, một sắc thái, một state, một
|
|
7
|
+
thông báo live, một lời hứa về lối phục hồi. Phần audit kiểm kê các tuyên bố đã render rồi truy từng
|
|
8
|
+
cái về nguồn của nó. Một tuyên bố không có nguồn là tuyên bố bịa, bất kể tầng nào bịa ra nó.
|
|
9
|
+
|
|
10
|
+
## TRUTH-1 — Dữ kiện trung tính ở nguyên trạng thái trung tính
|
|
11
|
+
|
|
12
|
+
Chi phối nội dung mà authority cấp mà không kèm bất kỳ status nào.
|
|
13
|
+
|
|
14
|
+
| Case | Dùng khi | Quan sát |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Case 1 | Authority cấp một dữ kiện thuần | Nó render thành chữ thường, không vai trò status, không state thành công hay lỗi, không tính khẩn. Một vai trò alert trên chữ mặc định sẽ bác bỏ nó |
|
|
17
|
+
| Case 2 | Có glyph, sắc thái hoặc vị trí được thêm quanh dữ kiện | Không cái nào đọc lên thành kết cục hay thành sự bảo chứng. Một dấu tích cùng treatment thành công trên một câu mô tả năng lực sẽ bác bỏ nó |
|
|
18
|
+
| Case 3 | Một family sơn cả vùng đó | Dữ kiện trung tính vẫn trung tính dưới lớp sơn ấy. Cả một tập dữ kiện gói dịch vụ bị sơn thành cảnh báo sẽ bác bỏ nó |
|
|
19
|
+
| Case 4 | State hoặc viewport thay đổi | Kiểm kê lại tuyên bố ở đó, vì một dữ kiện trung tính ở bề rộng này có thể không còn trung tính ở bề rộng khác |
|
|
20
|
+
|
|
21
|
+
## TRUTH-2 — Quyền dùng đi theo authority
|
|
22
|
+
|
|
23
|
+
Chi phối các tuyên bố về việc người đọc hiện tại được làm gì.
|
|
24
|
+
|
|
25
|
+
| Case | Dùng khi | Quan sát |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| Case 1 | Authority xác nhận một năng lực tĩnh không dùng được ở đây | Hàng đó mang `state="unavailable"` với label chính xác và một mô tả gọi tên điều kiện đã kiểm chứng. Copy ngụ ý tính năng đã bật sẽ bác bỏ nó |
|
|
28
|
+
| Case 2 | Thứ không dùng được là một câu lệnh chứ không phải một năng lực tĩnh | Owner của action mang `isDisabled`, và ngữ nghĩa disabled có mặt trong đầu ra đã render |
|
|
29
|
+
| Case 3 | Chỉ có dấu state đứng ra làm bằng chứng | Ở đây dấu đó chỉ trang trí hoặc vắng mặt, nên sự thật khả truy cập vẫn phụ thuộc vào phần chữ được cấp. Suy ra một status không dùng được từ phần sơn sẽ bác bỏ nó |
|
|
30
|
+
| Case 4 | Một action đang hiện và được lấy làm bằng chứng về quyền | Hiện diện không phải là quyền. Quyền được giải quyết từ authority rồi mới lái owner thật |
|
|
31
|
+
| Case 5 | Một family sơn hàng không dùng được | Nó ở lại dạng bất hoạt. Phần sơn affirmative đè lên một dữ kiện không dùng được sẽ bác bỏ nó |
|
|
32
|
+
|
|
33
|
+
## TRUTH-3 — Tiến trình không phải kết cục
|
|
34
|
+
|
|
35
|
+
Chi phối ranh giới giữa việc đang chạy và một kết quả.
|
|
36
|
+
|
|
37
|
+
| Case | Dùng khi | Quan sát |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| Case 1 | Một câu lệnh đã nhận việc | Tiến trình ở lại trên câu lệnh đó, nhãn của nó sống sót, và lần kích hoạt thứ hai bị chặn trong lúc việc chạy |
|
|
40
|
+
| Case 2 | Có một kết quả được tuyên bố | Authority đã xác nhận nó trước. Một thông điệp thành công render trong lúc request còn chạy sẽ bác bỏ nó |
|
|
41
|
+
| Case 3 | Có tuyên bố về việc điều hướng | Hiệu ứng điều hướng thật sự tồn tại. Một thông điệp nói rằng người đọc đang được đưa đi đâu đó, khi chưa có gì bắt đầu, sẽ bác bỏ nó, và một status điều hướng render thành lỗi thì bác bỏ nó hai lần |
|
|
42
|
+
| Case 4 | Pending và kết cục sẽ cùng chiếm một khoảnh khắc | Chúng không được cùng chiếm. Một family sơn affirmative đè lên một control đang pending sẽ bác bỏ trạng thái hiện tại |
|
|
43
|
+
| Case 5 | Copy nêu ra một lối phục hồi hoặc một tuyến đường | Nó tồn tại và chạm tới được. Một lời hứa thử lại mà không có lối phục hồi nào được nối sẽ bác bỏ lời hứa đó |
|
|
44
|
+
|
|
45
|
+
## TRUTH-4 — Bằng chứng tuyên bố và thứ bác bỏ nó
|
|
46
|
+
|
|
47
|
+
Chi phối những gì khép lại một tuyên bố về render truth.
|
|
48
|
+
|
|
49
|
+
| Case | Dùng khi | Quan sát |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Case 1 | Đang khép lại bất kỳ state nào chạm tới được | Kiểm kê ở state đó mọi tuyên bố do chữ, icon, hình khối, sắc thái, vị trí, chuyển động, native state, live region và ngữ nghĩa trợ năng mang |
|
|
52
|
+
| Case 2 | Một tuyên bố đã được kiểm kê | Truy nó về authority business, về kết quả runtime hiện tại, về quyền hiện tại, và về hiệu ứng hoặc lối phục hồi thật sự tồn tại |
|
|
53
|
+
| Case 3 | State, theme hoặc viewport thay đổi | Chạy lại kiểm kê ở đó. Một theme hoặc một trạng thái cũ rồi làm mới bị bỏ sót thì không khép được gì |
|
|
54
|
+
| Case 4 | Một family hoặc ứng dụng thêm delta | So sánh riêng đầu ra công khai cô lập, delta của family, delta của ứng dụng và pixel hiện tại |
|
|
55
|
+
| Case 5 | Có người đưa ra bản duyệt copy hoặc prop trong source làm bằng chứng | Chúng không đủ. Một tuyên bố đã render được chứng minh bằng đầu ra đã render và bằng authority đã truy ngược |
|
|
56
|
+
|
|
57
|
+
## File này không quyết định
|
|
58
|
+
|
|
59
|
+
Một dữ kiện nhận cấp độ nào thuộc [Hierarchy](../composition/hierarchy.vi.md), có những điều kiện
|
|
60
|
+
nào và carrier nào giữ từng cái thuộc [State](../composition/state.vi.md), còn một thông điệp thuộc
|
|
61
|
+
về đâu thuộc [Feedback](../composition/feedback.vi.md). Tuyên bố có được đọc lên đúng cách không
|
|
62
|
+
thuộc [Accessibility](accessibility.vi.md), chuyển động có ngụ ý nó không thuộc [Motion](motion.vi.md),
|
|
63
|
+
và người đọc có chạm tới được control hành động theo nó không thuộc [Focus](focus.vi.md).
|