@qijenchen/design-system 0.1.0-beta.10 → 0.1.0-beta.13

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.
Files changed (307) hide show
  1. package/CLAUDE.md +201 -0
  2. package/README.md +7 -15
  3. package/cli-init.mjs +90 -0
  4. package/ds-canonical/commands/README.md +26 -0
  5. package/ds-canonical/commands/gov-status.md +79 -0
  6. package/ds-canonical/hooks/README.md +145 -0
  7. package/ds-canonical/hooks/_log-fire.sh +44 -0
  8. package/ds-canonical/hooks/block_prototype_imports.py +111 -0
  9. package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +68 -0
  10. package/ds-canonical/hooks/check_audit_post_report_validator.sh +88 -0
  11. package/ds-canonical/hooks/check_audit_sample_escape.sh +73 -0
  12. package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
  13. package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
  14. package/ds-canonical/hooks/check_chrome_header_handcraft.sh +70 -0
  15. package/ds-canonical/hooks/check_codex_brief_invariants.sh +83 -0
  16. package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
  17. package/ds-canonical/hooks/check_datatable_invariants.sh +117 -0
  18. package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
  19. package/ds-canonical/hooks/check_field_controls_contracts.sh +110 -0
  20. package/ds-canonical/hooks/check_field_family_invariants.sh +205 -0
  21. package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
  22. package/ds-canonical/hooks/check_header_with_tabs_border.sh +87 -0
  23. package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
  24. package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
  25. package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
  26. package/ds-canonical/hooks/check_pattern_invariants.sh +194 -0
  27. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
  28. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
  29. package/ds-canonical/hooks/check_propose_plain_chinese.sh +74 -0
  30. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
  31. package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
  32. package/ds-canonical/hooks/check_solo_workflow.sh +258 -0
  33. package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
  34. package/ds-canonical/hooks/check_story_invariants.sh +612 -0
  35. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +105 -0
  36. package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +66 -0
  37. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
  38. package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
  39. package/ds-canonical/hooks/inject_pending_self_audit.sh +204 -0
  40. package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
  41. package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
  42. package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
  43. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
  44. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
  45. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
  46. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +141 -0
  47. package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
  48. package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
  49. package/ds-canonical/hooks/lib/_token_hygiene.sh +95 -0
  50. package/ds-canonical/hooks/log_governance_fires.sh +50 -0
  51. package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
  52. package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
  53. package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
  54. package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
  55. package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
  56. package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
  57. package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
  58. package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
  59. package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
  60. package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
  61. package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
  62. package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
  63. package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
  64. package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
  65. package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
  66. package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
  67. package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
  68. package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
  69. package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
  70. package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
  71. package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
  72. package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
  73. package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
  74. package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
  75. package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
  76. package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
  77. package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
  78. package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
  79. package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
  80. package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
  81. package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
  82. package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
  83. package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
  84. package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
  85. package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
  86. package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
  87. package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
  88. package/ds-canonical/hooks/session_start_governance_check.sh +263 -0
  89. package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
  90. package/ds-canonical/hooks/stop_self_audit.sh +450 -0
  91. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
  92. package/ds-canonical/hooks/tests/run-all.sh +76 -0
  93. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
  94. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +140 -0
  95. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +115 -0
  96. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
  97. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
  98. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
  99. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +123 -0
  100. package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
  101. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
  102. package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
  103. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
  104. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
  105. package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
  106. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +194 -0
  107. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
  108. package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
  109. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
  110. package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
  111. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
  112. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
  113. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
  114. package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
  115. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
  116. package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
  117. package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
  118. package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
  119. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +126 -0
  120. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
  121. package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
  122. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
  123. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
  124. package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
  125. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
  126. package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
  127. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +209 -0
  128. package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
  129. package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
  130. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
  131. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +138 -0
  132. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
  133. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
  134. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
  135. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
  136. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
  137. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
  138. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
  139. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +143 -0
  140. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
  141. package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
  142. package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
  143. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
  144. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +76 -0
  145. package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
  146. package/ds-canonical/references/README.md +43 -0
  147. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
  148. package/ds-canonical/references/build-ui-canonicals.md +69 -0
  149. package/ds-canonical/references/cva-patterns.md +41 -0
  150. package/ds-canonical/references/drag-canonical.md +331 -0
  151. package/ds-canonical/references/item-anatomy-recipe.md +225 -0
  152. package/ds-canonical/references/naming-conventions.md +56 -0
  153. package/ds-canonical/references/principle-dim-map.json +515 -0
  154. package/ds-canonical/references/props-naming.md +45 -0
  155. package/ds-canonical/references/spec-rules.md +58 -0
  156. package/ds-canonical/references/ssot-consultation.md +63 -0
  157. package/ds-canonical/references/ssot-index.md +40 -0
  158. package/ds-canonical/references/story-baseline-registry.json +79 -0
  159. package/ds-canonical/references/structural-token-retention.md +42 -0
  160. package/ds-canonical/references/tailwind-gotchas.md +87 -0
  161. package/ds-canonical/references/ui-dev-rules.md +60 -0
  162. package/ds-canonical/rules/README.md +34 -0
  163. package/ds-canonical/rules/meta-patterns.md +87 -0
  164. package/ds-canonical/rules/self-verify.md +53 -0
  165. package/ds-canonical/rules/spec-rules.md +25 -0
  166. package/ds-canonical/rules/story-rules.md +56 -0
  167. package/ds-canonical/rules/ui-development.md +87 -0
  168. package/ds-canonical/skills/README.md +88 -0
  169. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
  170. package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
  171. package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
  172. package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
  173. package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
  174. package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
  175. package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
  176. package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
  177. package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
  178. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +247 -0
  179. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
  180. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +165 -0
  181. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +91 -0
  182. package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
  183. package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
  184. package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
  185. package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  186. package/ds-canonical/skills/design-system-audit/SKILL.md +343 -0
  187. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1260 -0
  188. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
  189. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
  190. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +364 -0
  191. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
  192. package/ds-canonical/skills/design-system-audit/references/spec-template.md +66 -0
  193. package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
  194. package/ds-canonical/skills/governance-health/SKILL.md +146 -0
  195. package/ds-canonical/skills/knowledge-prune/SKILL.md +303 -0
  196. package/ds-canonical/skills/new-component/SKILL.md +170 -0
  197. package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
  198. package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
  199. package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
  200. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
  201. package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
  202. package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
  203. package/ds-canonical/skills/propose-options/SKILL.md +177 -0
  204. package/ds-canonical/skills/prototype/SKILL.md +244 -0
  205. package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
  206. package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
  207. package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
  208. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
  209. package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
  210. package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
  211. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
  212. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
  213. package/ds-canonical/skills/story-writing/SKILL.md +122 -0
  214. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
  215. package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
  216. package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
  217. package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
  218. package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
  219. package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
  220. package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
  221. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
  222. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
  223. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  224. package/package.json +9 -5
  225. package/src/components/Accordion/accordion.spec.md +114 -0
  226. package/src/components/Alert/alert.spec.md +197 -0
  227. package/src/components/AppShell/app-shell.spec.md +331 -0
  228. package/src/components/AspectRatio/aspect-ratio.spec.md +134 -0
  229. package/src/components/Avatar/avatar.spec.md +329 -0
  230. package/src/components/Badge/badge.spec.md +380 -0
  231. package/src/components/Breadcrumb/breadcrumb.spec.md +257 -0
  232. package/src/components/BulkActionBar/bulk-action-bar.spec.md +210 -0
  233. package/src/components/Button/button.spec.md +460 -0
  234. package/src/components/Calendar/calendar.spec.md +242 -0
  235. package/src/components/Carousel/carousel.spec.md +253 -0
  236. package/src/components/Chart/chart.spec.md +155 -0
  237. package/src/components/Checkbox/checkbox.spec.md +344 -0
  238. package/src/components/Chip/chip.spec.md +237 -0
  239. package/src/components/CircularProgress/circular-progress.spec.md +268 -0
  240. package/src/components/Coachmark/coachmark.spec.md +230 -0
  241. package/src/components/Combobox/combobox.spec.md +180 -0
  242. package/src/components/Command/command.spec.md +171 -0
  243. package/src/components/DataTable/data-table.spec.md +525 -0
  244. package/src/components/DateGrid/date-grid.spec.md +215 -0
  245. package/src/components/DatePicker/date-picker.spec.md +334 -0
  246. package/src/components/DescriptionList/description-list.spec.md +214 -0
  247. package/src/components/Dialog/dialog.spec.md +202 -0
  248. package/src/components/DropdownMenu/dropdown-menu.spec.md +250 -0
  249. package/src/components/Empty/empty.spec.md +214 -0
  250. package/src/components/Field/field-controls.spec.md +338 -0
  251. package/src/components/Field/field.spec.md +438 -0
  252. package/src/components/Field/form-validation.spec.md +152 -0
  253. package/src/components/FieldControlGroup/field-control-group.spec.md +176 -0
  254. package/src/components/FileItem/file-item.spec.md +467 -0
  255. package/src/components/FileUpload/file-upload.spec.md +123 -0
  256. package/src/components/FileViewer/file-viewer.spec.md +373 -0
  257. package/src/components/HoverCard/hover-card.spec.md +157 -0
  258. package/src/components/Input/input.spec.md +193 -0
  259. package/src/components/LinkInput/link-input.spec.md +130 -0
  260. package/src/components/Menu/menu-item.spec.md +290 -0
  261. package/src/components/NameCard/name-card.spec.md +171 -0
  262. package/src/components/Notice/notice.spec.md +149 -0
  263. package/src/components/NumberInput/number-input.spec.md +126 -0
  264. package/src/components/OverflowIndicator/overflow-indicator.spec.md +120 -0
  265. package/src/components/PeoplePicker/people-picker.spec.md +263 -0
  266. package/src/components/Popover/popover.spec.md +198 -0
  267. package/src/components/ProgressBar/progress-bar.spec.md +232 -0
  268. package/src/components/RadioGroup/radio-group.spec.md +141 -0
  269. package/src/components/Rating/rating.spec.md +208 -0
  270. package/src/components/ScrollArea/scroll-area.spec.md +145 -0
  271. package/src/components/SegmentedControl/segmented-control.spec.md +295 -0
  272. package/src/components/Select/select.spec.md +299 -0
  273. package/src/components/SelectMenu/select-menu.spec.md +220 -0
  274. package/src/components/SelectionControl/selection-item.spec.md +128 -0
  275. package/src/components/Separator/separator.spec.md +109 -0
  276. package/src/components/Sheet/sheet.spec.md +148 -0
  277. package/src/components/Sidebar/sidebar.spec.md +713 -0
  278. package/src/components/Skeleton/skeleton.spec.md +104 -0
  279. package/src/components/Slider/slider.spec.md +353 -0
  280. package/src/components/Steps/steps.spec.md +465 -0
  281. package/src/components/Switch/switch.spec.md +215 -0
  282. package/src/components/Tabs/tabs.spec.md +314 -0
  283. package/src/components/Tag/tag.spec.md +282 -0
  284. package/src/components/Textarea/textarea.spec.md +151 -0
  285. package/src/components/TimePicker/time-picker.spec.md +279 -0
  286. package/src/components/Toast/toast.spec.md +177 -0
  287. package/src/components/Tooltip/tooltip.spec.md +139 -0
  288. package/src/components/TreeView/tree-view.spec.md +374 -0
  289. package/src/patterns/action-bar/action-bar.spec.md +458 -0
  290. package/src/patterns/element-anatomy/element-anatomy.spec.md +215 -0
  291. package/src/patterns/element-anatomy/inline-action.spec.md +315 -0
  292. package/src/patterns/element-anatomy/item-anatomy.spec.md +1042 -0
  293. package/src/patterns/header-canonical/header-canonical.spec.md +285 -0
  294. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +191 -0
  295. package/src/patterns/overlay-surface/overlay-surface.spec.md +428 -0
  296. package/src/patterns/resize-handle/resize-handle.spec.md +109 -0
  297. package/src/tokens/color/color.spec.md +804 -0
  298. package/src/tokens/density/density.spec.md +127 -0
  299. package/src/tokens/elevation/elevation.spec.md +81 -0
  300. package/src/tokens/layoutSpace/layoutSpace.spec.md +314 -0
  301. package/src/tokens/motion/motion.spec.md +97 -0
  302. package/src/tokens/opacity/opacity.spec.md +78 -0
  303. package/src/tokens/orphan-tokens.spec.md +117 -0
  304. package/src/tokens/radius/radius.spec.md +123 -0
  305. package/src/tokens/typography/typography.spec.md +202 -0
  306. package/src/tokens/uiSize/uiSize.spec.md +438 -0
  307. package/src/styles/preset.css +0 -31
@@ -0,0 +1,130 @@
1
+ ---
2
+ name: ux-audit
3
+ description: UX behavior audit for design-system components and product UI. Checks keyboard navigation, focus management, ARIA correctness, animation timing, interaction canonical (hover/click/drag/zoom), error/loading states, empty states. Invoke when user says「鍵盤用不了」「focus 跑飛」「動畫怪怪的」「無障礙檢查」, auto-invoked by `/component-quality-gate` Phase 4.5 (advanced mode) and `/design-system-audit` Dimension D4.
4
+ ---
5
+
6
+ # UX Audit — UX 行為稽核
7
+
8
+ ## 存在意義
9
+
10
+ 現有 `/design-system-audit`(code/spec)+ `/visual-audit`(pixel)+ `/performance-audit`(render)**都不看行為**。interaction canonical、keyboard nav、focus trap、animation timing 這類 bug:
11
+ - 視覺正常 / code 正常 / 效能正常
12
+ - **Keyboard only user 完全卡關** / screen reader 讀不到 / focus 不回到 trigger / zoom wheel 跳大步
13
+
14
+ 本 skill 是稽核 6 維度的 **D4 UX 行為** canonical home。
15
+
16
+ ## 觸發時機(對齊 CLAUDE.md 稽核 canonical)
17
+
18
+ | 情境 | 模式 | 本 skill 跑什麼 |
19
+ |------|------|----------------|
20
+ | 新元件 merge 前 | 進階強制 | 全面(kb / focus / ARIA / animation / interaction) |
21
+ | 元件新功能 | 進階強制 | scoped to 新 interaction 路徑 |
22
+ | 產品 demo 前 | 進階強制 | 全流程 keyboard-only walkthrough |
23
+ | 日常 dev | 高效 | 主要 kb path 手動過一次 |
24
+ | Release cut | 進階 + 全 DS | 全 DS 的 a11y / interaction 全掃 |
25
+
26
+ ## Preconditions
27
+
28
+ - 元件 folder 存在於 `packages/design-system/src/components/{Name}/`
29
+ - Storybook 可啟動(用於互動驗證)
30
+ - 若稽核產品頁:URL 可訪問
31
+
32
+ ## Workflow
33
+
34
+ ### Phase 0 — Scope 判定
35
+
36
+ - 單元件 scope → Phase 1-4 對該元件
37
+ - 全 DS / URL scope → **先全掃列 interactive 元件清單**,按 interaction 複雜度(overlay > form > row > leaf)排序逐一 audit
38
+
39
+ ### Phase 1 — Keyboard navigation
40
+
41
+ 查 7 項:
42
+ 1. **Tab order**:DOM order = 視覺 reading order?`tabIndex` 不濫用(`tabIndex > 0` 禁用)
43
+ 2. **Focus visible ring**:所有 tabbable 元素 focus 有清楚 ring(用 `focus-visible` 非 `focus`)
44
+ 3. **Activation key**:Button/Link 回應 Enter + Space;menuitem / checkbox / radio 有特定 key 規則
45
+ 4. **Arrow key navigation**:list / menu / tabs / segmented control 在 group 內用方向鍵,不用 Tab
46
+ 5. **Escape 關閉 overlay**:Dialog / Popover / Sheet / DropdownMenu 按 Esc 關閉
47
+ 6. **Focus trap**:modal overlay 內 focus 不跑出 modal 外
48
+ 7. **Focus restore**:overlay 關閉後 focus 回 trigger
49
+
50
+ ### Phase 2 — Focus management(across state transitions)
51
+
52
+ 查 4 項:
53
+ 1. **Route change / async load**:新內容載入,focus 應指向新內容開頭(main landmark / first heading)
54
+ 2. **Error / validation**:form 送出驗證失敗,focus 應回第一個 invalid field + screen reader 讀 error
55
+ 3. **Dynamic content**:可折疊 section 展開後,focus 應維持在 trigger(非跳到內容)
56
+ 4. **List item removal**:刪除 item 後 focus 應移到**相鄰** item(不跳到文件頂)
57
+
58
+ ### Phase 3 — ARIA correctness
59
+
60
+ 查 6 項:
61
+ 1. **role** 正確:`role="button"` on <div> / 正確使用 `role="dialog"` / `role="menu"` / `role="grid"`
62
+ 2. **aria-label / aria-labelledby**:icon-only button 必有 aria-label;icon + text 不重複宣告
63
+ 3. **aria-expanded / aria-haspopup**:有 overlay 的 trigger 必宣告
64
+ 4. **aria-selected / aria-checked / aria-pressed**:狀態元件必正確 sync
65
+ 5. **aria-live**:動態訊息(validation / toast)用 `aria-live="polite"` 或 `"assertive"`
66
+ 6. **aria-hidden**:裝飾 icon 必 `aria-hidden`;隱藏內容不能 keyboard focus
67
+
68
+ ### Phase 4 — Animation / interaction canonical
69
+
70
+ 查 5 項:
71
+ 1. **Animation duration**:< 200ms(micro)或 200-400ms(macro);超過 400ms 主畫面 → 可能 block 輸入
72
+ 2. **Reduce-motion respect**:`@media (prefers-reduced-motion: reduce)` 下動畫減到 0 或極短
73
+ 3. **Wheel zoom step 細緻**:> 10% 離散 = 非世界級(對齊 Figma / Preview.app ~3-5%)
74
+ 4. **Hover delay**:tooltip / hover-card 的 open delay(700ms for tooltip, 500ms for hover-card per DS canonical)
75
+ 5. **Drag / pan**:pointer capture 正確;release on blur
76
+
77
+ ### Phase 5 — Data / state coverage 五態(2026-04-24 擴充,補 24-checklist #23 edge case gap)
78
+
79
+ 查 5 項 + null-safety + rapid-interaction:
80
+
81
+ 1. **Null-safety**:`null / undefined` label/value/children 不 crash(e.g. `{label}` 為 undefined render 空字串,不 `Cannot read properties of undefined`);空 array `.map()` 不 crash;emoji / 超長單字 / RTL 字元不爆版
82
+ 2. **Empty**:顯示 `<Empty>` 或對應 placeholder,非 blank;empty 有 CTA 讓使用者知道下步
83
+ 3. **Loading**:視語境用 CircularProgress / Skeleton / ProgressBar;aria-busy 宣告;**不阻斷可編輯狀態**(Input loading 仍可打字 per spec);**rapid-click / double-submit 有防護**(button loading 期間 disabled OR 靠上游 idempotent)
84
+ 4. **Error**:用 DS `<Notice>` 或 inline `<FieldError>`;配合 aria-live 通知 AT;error message 不吞(e.g. async rejection 有 fallback UI 非 silent swallow)
85
+ 5. **Success**(新加):成功 state 有視覺確認(toast / inline checkmark / state transition),讓使用者知道動作 landed,非 silent success
86
+
87
+ **Edge case corollary**(現實髒資料):
88
+ - Children 為 `null` / 為空 array / 元素數量極大(超 50 筆)
89
+ - Option 重複 id / selected option 被移除後仍保留 value(stale selection)
90
+ - disabled 時仍收到外部 value 更新(controlled forced update)
91
+ - 從 uncontrolled 中途變 controlled(React warning 必出,或元件明文不支援)
92
+ - Modal 關閉瞬間 async 回調仍 setState(unmount 後 setState warning)
93
+
94
+ ### Phase F — Report(必 STOP,對齊分權 canonical)
95
+
96
+ 產出:
97
+
98
+ ```markdown
99
+ # UX Audit — {Scope} — {YYYY-MM-DD}
100
+
101
+ ## Summary
102
+ - Keyboard: PASS / N fails
103
+ - Focus: PASS / M fails
104
+ - ARIA: PASS / K fails
105
+ - Animation: PASS / L fails
106
+ - Three states: PASS / P fails
107
+
108
+ ## Findings(按 severity 排序)
109
+ ### P0(完全 block a11y)
110
+ ### P1(嚴重影響 UX)
111
+ ### P2(建議改善)
112
+
113
+ ## 提議討論(待 user sign-off)
114
+ - {若發現 DS canonical 本身有問題,列於此,不自改}
115
+ ```
116
+
117
+ **STOP 點**:report 寫完**不自動修**。分權對齊 CLAUDE.md `# 稽核 canonical`(內含「Audit-vs-execute 分權」inline rule)。
118
+
119
+ ## Non-goals
120
+
121
+ - 不改 code / spec(純 read-only report)
122
+ - 不做視覺稽核(走 `/visual-audit`)
123
+ - 不做 code-level audit(走 `/design-system-audit`)
124
+
125
+ ## 相關
126
+
127
+ - `.claude/skills/design-system-audit/SKILL.md` — 全 dim 統籌(per design-system-audit SSOT);本 skill 是 D4 補位
128
+ - `.claude/skills/visual-audit/SKILL.md` — pixel 層(D5)
129
+ - `.claude/skills/performance-audit/SKILL.md` — 效能層(D3)
130
+ - `.claude/skills/component-quality-gate/SKILL.md` — Phase 4.5 進階模式 chain 本 skill
@@ -0,0 +1,245 @@
1
+ ---
2
+ name: visual-audit
3
+ description: Pixel-level visual audit for design-system components based on user-provided screenshots. Catches bug classes that code/spec audits cannot see — asymmetric padding / broken overlay positioning / gap-eaten-by-hover-bg / baseline misalignment / overflow indicator obscuring content / wrong zoom step / dark-mode token mismatch. Requires a screenshot to run; refuses to proceed on guesses. Invoke via /visual-audit when user says「視覺對齊不對」「排版有問題」「gap 好像錯了」「看起來歪了」or uploads a Storybook screenshot asking「這樣對嗎」,auto-invoked by `/design-system-audit` Phase 3 (post-fix visual verify) and `/component-quality-gate` Ship phase.
4
+ ---
5
+
6
+ # Visual Audit — screenshot-based pixel-level 稽核
7
+
8
+ ## 存在意義
9
+
10
+ 現有 `/design-system-audit`(全 dim per design-system-audit SSOT)+ `/product-ui-audit`(6 dim)**全部在 code / spec 層**。code 對、spec 對,**視覺仍可能錯**——這類 bug 在專案歷史反覆出現:
11
+
12
+ - **DatePicker** 四邊邊距不對稱(左右不等 12px)、箭頭按鈕到容器頂距離 ≠ 最後一排日期到容器底距離
13
+ - **Badge** 疊 Button 距離離譜(overlay offset 寫死 px 非 token)
14
+ - **Avatar hover namecard** 的 list item 結構視覺跑掉
15
+ - **Carousel** prev/next 箭頭覆蓋 content
16
+ - **Rating** 星星有多餘邊框
17
+ - **Image viewer** 滾輪縮放跳大步(對標 Figma 該每 notch ~1.1×)
18
+ - **Button 群 gap** 被 hover bg overflow 吃掉(CLAUDE.md 有「同 flex 列互動 slot 幾何鐵律」但缺視覺 audit gate 鎖住)
19
+ - **FileViewer 工具列** dark mode 切換後對比跑掉
20
+ - **FileUpload / FileItem** 沒 fill container
21
+
22
+ 這些 bug 的共通點:`cva` 對、token 對、spec 對,但是消費組合後**實際 render 的 pixel 關係錯**。code audit 無視,只能靠視覺稽核。
23
+
24
+ ## 兩層架構 + state coverage canonical
25
+
26
+ **Layer A mechanical**(`npm run visual-audit`):截圖 + WCAG + geometry。**Layer B AI**(本 skill):合理 / 一致 / 世界級對照。**Workflow**:`npm run visual-audit` → `/visual-audit` 讀 `snapshots/report.json`。詳 → [`references/audit-architecture.md`](references/audit-architecture.md)(兩層架構 + hover / focus-visible / play() coverage roadmap)。
27
+
28
+ ## Skill 生態位
29
+
30
+ ```
31
+ /design-system-audit 全 dim 深度 audit(per design-system-audit SSOT,code/spec 層,Phase 0 自建 baseline)
32
+ /product-ui-audit consumer UI 對 DS 消費的 6 dim audit(code 層)
33
+ /visual-audit pixel-level 視覺 audit(本 skill,需 screenshot)
34
+ /component-quality-gate 合入 DS 前的 45 項 checklist(Ship phase 可 chain 本 skill)
35
+ ```
36
+
37
+ **關鍵切分**:visual-audit 只看 pixel,**不讀 code / 不改 code**。code / spec / cva 的事全部歸前兩 skill;視覺幾何對齊 / overlay 定位 / baseline / typography vertical rhythm 等「眼睛看得到、mechanical 量得出」的事才是本 skill scope。
38
+
39
+ ## When to invoke
40
+
41
+ **明確觸發(直接 invoke)**:
42
+ - User 說「視覺對齊不對」「排版歪了」「gap 好像錯」「4 邊邊距不對稱」「dark mode 看起來怪」
43
+ - User 上傳 Storybook screenshot 配問題:「這樣對嗎」「能看出哪裡錯嗎」
44
+ - User 指名元件 + 上傳圖:「audit DatePicker 的視覺」
45
+
46
+ **自動觸發(chain from other skills)**:
47
+ - `/design-system-audit` Phase 3 code/spec 修完後,若 user 要求 visual verify
48
+ - `/component-quality-gate` Phase 4 Ship 階段,元件即將 merge 進 DS 前
49
+
50
+ **不觸發**:
51
+ - 要改 spec / cva / token → 走對應 code/spec skill,不是視覺 audit
52
+ - 沒有 screenshot → **本 skill 拒跑**(見 Preconditions)
53
+ - 只要看一眼順不順 → 不做 audit(這不 mechanical)
54
+
55
+ ## Preconditions(硬規則)
56
+
57
+ **本 skill 在下列任一缺失下拒跑,回報 user 補齊後再 invoke**:
58
+
59
+ 1. **screenshot 缺失** — user 未上傳 Storybook 或元件實際 render 的截圖
60
+ 2. **audit target 未明** — 沒指定要稽核哪個元件 / 哪個 story / 哪個頁面
61
+ 3. **容器尺寸 / viewport 未知** — screenshot 沒附上容器寬度 / viewport size / 元件 size prop,無法 mechanical 量
62
+ 4. **token 聲明未知** — 該元件 spec 沒宣告該看哪些 token(本 skill 不推測,只比對)
63
+
64
+ **拒跑回報範例**:
65
+
66
+ ```
67
+ 本 skill 需要以下資訊才能跑,目前缺:
68
+ - [x] screenshot(Storybook 或實際 render)
69
+ - [ ] 稽核 target(哪個元件 / 哪個 story 或 URL)
70
+ - [ ] 容器 / viewport 資訊(container width / density / theme)
71
+
72
+ 補齊後請 re-invoke /visual-audit,不要讓我用猜的跑 audit。
73
+ ```
74
+
75
+ **絕不**在資訊不足下憑感覺判斷——「看起來有點歪」不是 audit,是直覺。本 skill 產出必須全部是 mechanical 可驗證的結論。
76
+
77
+ ---
78
+
79
+ ## 涵蓋的視覺面向(13 項 checklist)
80
+
81
+ 完整 checklist(每項的「怎麼量」「合格標準」「refer 的 DS 規則 / token」)見 [references/visual-checklist.md](references/visual-checklist.md)。以下是摘要(每項 ≤ 2 行):
82
+
83
+ | # | 面向 | 核心檢查 |
84
+ |---|------|---------|
85
+ | 1 | **4 邊邊距對稱** | 容器 top / right / bottom / left padding 實測值相等(除明文 asymmetric spec 外) |
86
+ | 2 | **垂直對稱(to-top ↔ to-bottom)** | 最外層 element 到容器頂 = 最內層 element 到容器底(DatePicker 箭頭 vs 最後排日期) |
87
+ | 3 | **水平 gap 實際值 == gap token 宣告值** | hover bg / ring / focus outline 不可溢出 box 吃掉宣告 gap(CLAUDE.md「同 flex 列互動 slot 幾何鐵律」) |
88
+ | 4 | **Overlay 定位(badge / popover / hover-card)** | anchor-offset / side-offset 對稱;不覆蓋 anchor 內容 |
89
+ | 5 | **Typography baseline 對齊** | icon 與同行 text 的 baseline 對齊(非 geometric center 誤植) |
90
+ | 6 | **Icon ↔ text gap 一致** | 同類型 row 裡所有 icon-to-text 距離相等 |
91
+ | 7 | **容器寬度 fill** | FileUpload / FileItem / Empty 等 block-level 元件是否 100% fill container(非內縮) |
92
+ | 8 | **同 row field 高度對齊** | Input / Select / Button 並排時高度相同(`--field-height-md` = 36px) |
93
+ | 9 | **跨 OS 一致 scrollbar** | 橫向 scrollbar 是否是 ScrollArea(避免 macOS 隱藏 / Windows 吃寬度) |
94
+ | 10 | **Zoom / step 幅度** | 滾輪縮放 step ≈ 1.1×–1.25×(對標 Figma);不可跳大步(如 2×) |
95
+ | 11 | **Dark mode 對比 / token 聯動** | 亮暗切換後 fg / bg / border / shadow 全部 token 對應;FileViewer 工具列永遠 dark mode |
96
+ | 12 | **Overflow indicator 遮擋** | fade mask / 箭頭 button 不可遮到可讀資訊 |
97
+ | 13 | **箭頭按鈕定位(Carousel / Image viewer)** | prev / next 箭頭不覆蓋 content;與邊緣距離對稱 |
98
+
99
+ **世界級 benchmark 對照**(每項對齊的外部 DS)見 [references/world-class-benchmarks.md](references/world-class-benchmarks.md)。
100
+
101
+ ---
102
+
103
+ ## Workflow
104
+
105
+ ### Phase 0 — Setup + 拒跑 gate
106
+
107
+ 1. 讀 CLAUDE.md 完整(最新 token / 最新 layout primitive 規則)
108
+ 2. 檢查 user 是否提供 4 項必要資訊(見 Preconditions):
109
+ - screenshot
110
+ - audit target(元件 / story / URL)
111
+ - 容器 / viewport 資訊
112
+ - 該元件對應的 spec.md path
113
+ 3. **任一缺失 → 停下,按 Preconditions 範例回報,不 proceed**
114
+ 4. 讀該元件的 `{name}.spec.md`——記下 spec 宣告的 token 值(e.g.「field-height-md = 36px」「gap-2 = 8px」「layout-space-loose = 16px」),作為 mechanical 對照基準
115
+ 5. Create TaskList entries(13 個 checklist item 各一)
116
+
117
+ ### Phase 1 — 逐項 checklist(13 面向 mechanical 量測)
118
+
119
+ 對 screenshot 逐項走 [references/visual-checklist.md](references/visual-checklist.md)。每項執行:
120
+
121
+ 1. 開對應章節,照「怎麼量」的指引
122
+ 2. 用 image reading 讀 pixel 距離(screenshot 的座標或尺寸)
123
+ 3. 比對該項「合格標準」(通常是 token 值或 ratio)
124
+ 4. 記錄結果之一:
125
+ - `PASS` — 實測值 == spec 宣告值(或 ratio 在容差內)
126
+ - `FAIL` — 實測值偏離,記下**實測值 / 預期值 / 差異 / 對應 DS 規則**
127
+ - `無法判定` — screenshot 解析度 / 角度不夠量,記下**需要補什麼**
128
+
129
+ **大原則**:
130
+ - **不寫主觀描述**(「看起來鬆散」「感覺歪」不算 audit 結論)——只寫可 mechanical 驗證的數字 / ratio
131
+ - **不推測 code**(「應該是 cva size 錯」不是本 skill 結論;code 的事走 `/design-system-audit`)
132
+ - **不修 code**(本 skill 只報告,不 Edit 任何檔)
133
+ - **超出 checklist 的視覺問題** → 記為 `額外觀察`,附 screenshot 座標 + 描述,交 user 決定要不要升級為 checklist 項
134
+
135
+ ### Phase 2 — 輸出 report(固定格式)
136
+
137
+ 產出檔案路徑:
138
+
139
+ ```
140
+ .claude/skills/visual-audit/output/{YYYYMMDD}-{component}-visual-audit.md
141
+ ```
142
+
143
+ **檔名規則**:同一天同元件多次跑 → 加 `-v2` / `-v3`。`{component}` 用 kebab-case(對齊專案慣例),例:`20260421-date-picker-visual-audit.md`。
144
+
145
+ ### Report 格式(嚴格)
146
+
147
+ ```markdown
148
+ # Visual Audit — {Component} — {YYYY-MM-DD}
149
+
150
+ Target: {story path / URL / description}
151
+ Screenshot: {user-provided, 檔名或描述}
152
+ 容器資訊: {width / viewport / density / theme}
153
+ Spec 依據: {packages/design-system/src/components/{Name}/{name}.spec.md}
154
+
155
+ ## Summary
156
+
157
+ - PASS: N / 13
158
+ - FAIL: M / 13
159
+ - 無法判定: K / 13
160
+ - 額外觀察: P 項
161
+
162
+ ## Checklist 結果
163
+
164
+ ### 1. 4 邊邊距對稱
165
+ - 狀態: PASS / FAIL / 無法判定
166
+ - 實測: top=12px, right=12px, bottom=8px, left=12px
167
+ - 預期: 4 邊 = layout-space-loose(16px)或 spec 明文 asymmetric
168
+ - 差異: bottom 少 4px,且非 spec 明文例外
169
+ - 對應規則: `.claude/rules/ui-development.md`「建立 UI 前必讀」 → layout-space token + 該元件 spec.md 第 N 段
170
+ - 建議修法方向(不自己改): 調整 bottom padding 對齊 layout-space-loose,或在 spec 記 rationale 為何 asymmetric
171
+
172
+ ### 2. 垂直對稱
173
+ ...
174
+
175
+ (每項都展開,PASS 項可一行帶過「實測相等」)
176
+
177
+ ## 額外觀察(非 checklist 13 項)
178
+
179
+ - {描述 + screenshot 座標 + 建議討論是否升級為 checklist 項}
180
+
181
+ ## 下一步
182
+
183
+ - FAIL 項優先修順序: 1 → 3 → 4(geometry 類先於 typography 類)
184
+ - 無法判定項需要: {補什麼 screenshot / 量測}
185
+ - 本 report 不改 code;fix 請走 `/design-system-audit` 或直接 edit
186
+ ```
187
+
188
+ ### Phase 3 — Checkpoint(必停,STOP 點)
189
+
190
+ Report 寫完後**停下來**,不 auto-fix。回報 user:
191
+
192
+ ```
193
+ Visual audit 寫到 .claude/skills/visual-audit/output/{YYYYMMDD}-{component}-visual-audit.md
194
+
195
+ - PASS: N / 13
196
+ - FAIL: M / 13
197
+ - 無法判定: K / 13
198
+
199
+ FAIL 項摘要:
200
+ - #1 4 邊邊距: bottom 少 4px(見 report 詳細)
201
+ - #3 gap 吃掉: hover bg 溢出 ~4px(違反「同 flex 列幾何鐵律」)
202
+ - ...
203
+
204
+ 下一步選項:
205
+ 1. 依 FAIL 清單去改 code / spec(我可以 chain 進 /design-system-audit 或手動 edit)
206
+ 2. 對某項 FAIL 有爭議 → 討論是否為 spec 明文例外(可加 rationale)
207
+ 3. 本輪 audit 就結束,user 自行處理
208
+
209
+ (本 skill 不 auto-proceed;改 code 由其他 skill 或 user 決定。)
210
+ ```
211
+
212
+ ---
213
+
214
+ ## Non-goals(關鍵 — 混到這些就是職責混亂)
215
+
216
+ - **不 audit code / spec**(code 層走 `/design-system-audit` / `/product-ui-audit`)
217
+ - **不取代 pixel-diff 自動化**(Chromatic / Storybook screenshot-diff 是 tech debt,本 skill 過渡方案)
218
+ - **不在沒有 screenshot 下跑 audit**(拒跑,見 Preconditions)
219
+ - **不做主觀審美**(「看起來比較漂亮」不是 audit 結論)
220
+ - **不改 code / spec / story**(純 read-only report)
221
+ - **不推斷沒截到的部分**(screenshot 沒含某 state 不做推測)
222
+ - **不 auto-fix**(Phase 3 STOP 交 user 決策)
223
+
224
+ ## Common failure modes(watch for these)
225
+
226
+ - **憑感覺判 FAIL**:「看起來不順」不算;必須 mechanical 量測 + 對應 token 值
227
+ - **把 code 問題寫進 report**(「cva size 應改 md」越界;本 skill 只記「視覺上 field 高度差 4px」讓後續 audit 查 code)
228
+ - **主觀 + 機械混寫**:每項結論必須可驗證,主觀觀察一律進「額外觀察」區分
229
+ - **screenshot 解析度不足硬量**:記「無法判定」+ 說明需求,不瞎猜
230
+ - **跨元件比對忽略容器脈絡**:FileItem in Sidebar vs in Page 邊距可能本來就不同,先讀 spec 有無 context-aware 規則
231
+ - **忘記對照 dark mode 版本**:亮暗兩套都要看,尤其 fg / bg / border / shadow
232
+
233
+ ## References
234
+
235
+ - [references/visual-checklist.md](references/visual-checklist.md) — 13 面向完整 checklist(怎麼量 / 合格標準 / refer 的 DS 規則 / token)
236
+ - [references/world-class-benchmarks.md](references/world-class-benchmarks.md) — 世界級對照(Figma zoom step、Material date-picker 邊距、Notion menu sticky header 等)
237
+
238
+ ## 相關
239
+
240
+ - `.claude/skills/design-system-audit/SKILL.md` — 全 dim code/spec audit(per design-system-audit SSOT);本 skill 是其 pixel-level 補位
241
+ - `.claude/skills/product-ui-audit/SKILL.md` — consumer UI 對 DS 消費 audit(code 層),不處理視覺
242
+ - `.claude/skills/component-quality-gate/SKILL.md` — 元件合入 DS 前的 45 項 checklist;Ship phase 可 chain 本 skill
243
+ - CLAUDE.md `# 同 flex 列的互動 slot 幾何鐵律` — 本 skill checklist #3 的主要 canonical 來源
244
+ - `.claude/rules/ui-development.md`「建立 UI 前必讀」 → layout primitive / token spec 清單 — 本 skill「合格標準」的對照錨
245
+ - `memory/project_pending_tasks`「視覺 regression 基建」條目 — 長期 tech debt(Chromatic / screenshot-diff)
@@ -0,0 +1,100 @@
1
+ # Visual audit — Layer A + Layer B 架構 + Interactive state coverage canonical
2
+
3
+ (Extracted from SKILL.md 2026-05-04 — file budget consolidation,SKILL.md 留 1-line summary + pointer 本檔。)
4
+
5
+ ## 兩層稽核架構(2026-04-21 升級)
6
+
7
+ 本專案視覺稽核已分 **Layer A mechanical + Layer B AI judgement**,互補覆蓋:
8
+
9
+ | Layer | 做什麼 | 由誰做 | 自動化 |
10
+ |-------|-------|--------|--------|
11
+ | **A. Mechanical** | (1) 截圖每個 scenario(retina PNG → `snapshots/`)<br>(2) WCAG 對比度掃描(所有可見文字 / icon vs 底色,flag AA 不過的組合)<br>(3) DOM 幾何 assertion(等高 / 對稱 padding / 正確 gap — 讀 `scripts/visual-assertions.json` 定義) | `scripts/visual-audit.mjs`(Playwright-driven) | **npm run visual-audit** 一鍵跑,產出 `snapshots/report.json` + PNG。CI 可接(exit 1 on violation) |
12
+ | **B. AI judgement** | (1) 設計合理性(badge 位置語意對、carousel 箭頭不壓文字、zoom step 手感)<br>(2) 跨元件視覺一致(同 flex 列幾何鐵律、Family 視覺對齊)<br>(3) 世界級對照(「這跟 Figma/Notion/iOS 相比還差在哪」) | **本 skill**(`/visual-audit`),讀 `snapshots/*.png` + `report.json` 做 pattern recognition | invoke 時 AI 跑 |
13
+
14
+ ### Layer A 先跑,Layer B 後補(workflow)
15
+
16
+ ```
17
+ 1. npm run visual-audit # Layer A 產 snapshots + report
18
+ 2. /visual-audit # 本 skill 讀 snapshots/ 做 Layer B 判斷
19
+ (skill 自動讀 snapshots/report.json 作為 Layer A baseline,
20
+ 重點關注 A 沒 flag 但視覺仍不對的 case)
21
+ ```
22
+
23
+ ### 為什麼分兩層
24
+
25
+ - Mechanical 能抓的事(對比度、等高、padding 數字)讓 script 做,AI 不浪費 token
26
+ - 設計合理性 / 世界級對照需要 pattern matching,只有 AI / human 能做——這部分走 skill
27
+ - 兩層互相 cross-check:Layer A 漏掉但 Layer B 看出 → 回填新 assertion 到 `visual-assertions.json`,轉為 mechanical
28
+
29
+ ### Layer A 命令速查
30
+
31
+ ```bash
32
+ # 全跑(建議 release / 大改)
33
+ npm run visual-audit
34
+
35
+ # scoped 跑(快速驗證 — 1 個 component)
36
+ node scripts/visual-audit.mjs --scope=component:Button
37
+
38
+ # 只跑 changed(git diff)— 對齊 CLAUDE.md「日常 dev」高效模式
39
+ node scripts/visual-audit.mjs --scope=changed
40
+
41
+ # 不啟 storybook(如果 storybook 已起)
42
+ node scripts/visual-audit.mjs --no-auto-start
43
+ ```
44
+
45
+ Output:
46
+ - `snapshots/{scenarioId}.png` — retina PNG
47
+ - `snapshots/report.json` — `{ contrast: [], geometryViolations: [], a11yViolations: [], baselineDiff: {} }`
48
+
49
+ ## Layer A interactive state coverage canonical
50
+
51
+ **核心事實**:當前 `visual-audit.mjs` 只抓「頁面 render 完 + blur activeElement + 800ms wait」後的**靜態 snapshot**——**hover / focus-visible / active / pressed / tooltip-visible / menu-open / dropdown-open 等 post-interaction state 預設不被抓到**。
52
+
53
+ ### 當前覆蓋 vs Gap
54
+
55
+ | 狀態 | 當前 Layer A 覆蓋? | 抓法 |
56
+ |------|------------------|------|
57
+ | **Default render state** | ✓ 抓 | scenario 載入後直接 screenshot |
58
+ | **Overlay open**(Dialog / Popover / DropdownMenu chrome) | ✓ 抓 | 用 `defaultOpen` pattern(Radix Portal 自動生效) |
59
+ | **Hover state**(cursor-over 視覺) | ✗ 不抓 | 需 `play()` + `userEvent.hover()` |
60
+ | **Focus-visible**(ring / outline) | ✗ 不抓 | 需 `play()` + `element.focus()` |
61
+ | **Active / pressed**(按下瞬間) | ✗ 不抓 | 需 `play()` + `userEvent.pointer()` |
62
+ | **Tooltip visible**(iconOnly Button hover tooltip) | ✗ 不抓 | 需 `play()` + focus 觸發器 + 等 delay |
63
+ | **Menu item hover highlight** | ✗ 不抓 | 需 `play()` + hover first item after `defaultOpen` |
64
+ | **Combobox / Select 展開後 listbox** | 部分 | 靠 `defaultOpen` 可抓 listbox,但 hover highlight 需 play |
65
+
66
+ ### 解法:Storybook `play()` + `@storybook/test`
67
+
68
+ Storybook v8 的 `play()` 在 story 渲染後執行,可觸發互動狀態。`@storybook/test` 提供 `userEvent` / `within` / `expect` 等 API:
69
+
70
+ ```tsx
71
+ import type { StoryObj } from '@storybook/react'
72
+ import { userEvent, within } from '@storybook/test'
73
+
74
+ export const HoverState: StoryObj = {
75
+ render: () => <Button>Hover me</Button>,
76
+ play: async ({ canvasElement }) => {
77
+ const canvas = within(canvasElement)
78
+ const btn = canvas.getByRole('button')
79
+ await userEvent.hover(btn)
80
+ // visual-audit.mjs 在 play 完後 screenshot,可抓 hover bg
81
+ },
82
+ }
83
+ ```
84
+
85
+ ### 命名 convention(scenario IDs Layer A 認得)
86
+
87
+ `{Component}/{base}--hover-state` / `--focus-visible` / `--active-state` / `--with-tooltip` / `--menu-item-hover`(等)
88
+
89
+ `scripts/visual-audit.mjs` 預設 wait 800ms after render — play 觸發互動後 800ms 內不應該變化(再長要拉 explicit wait)。
90
+
91
+ ### Coverage 提升 roadmap(prioritized)
92
+
93
+ | Wave | Story 加 play | 抓的狀態 |
94
+ |------|--------------|----------|
95
+ | 1 | Button / IconButton / Tooltip | hover / focus-visible / active / tooltip-visible |
96
+ | 2 | DropdownMenu / Combobox / Select | menu-open + first-item hover |
97
+ | 3 | Tabs / SegmentedControl / Switch | hover transition / focus-visible |
98
+ | 4 | Form controls(Input / Checkbox / Radio) | invalid state(via aria-invalid)/ disabled hover |
99
+
100
+ 每 wave 完工後跑 `npm run visual-audit`,看 `report.json` 新增的 violation,回填 `visual-assertions.json`。