@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,297 @@
1
+ # Visual Audit — 13 面向 checklist(怎麼量 / 合格標準 / refer 的 DS 規則)
2
+
3
+ 每個面向 = SKILL.md Phase 1 的一個 TaskList 項。本檔案規範:**怎麼量、合格標準、對應哪條 DS 規則**。全部 mechanical 可驗證,不允許「看起來不順」這類主觀描述。
4
+
5
+ **通用量測原則**:
6
+ - 用 image reading 取 screenshot 像素座標(左上為原點 0,0;單位 px)
7
+ - 同一面向的 4 個量測點必須用「同一張 screenshot 的同一縮放比例」;混不同 screenshot 比例會誤判
8
+ - 容器寬度 / viewport / density / theme 必先向 user 確認(SKILL.md Preconditions 項 3)
9
+ - 合格標準若為 token → 對照「該元件 spec 宣告的 token 值」或 `tokens/*/` primitive;不是「看起來接近就算對」
10
+ - **容差規範**:px 量測允許 ±1px(螢幕截圖 sub-pixel rounding);ratio 允許 ±5%;明文標「精確」的項目(如對稱)不給容差
11
+
12
+ **記錄格式**(每項在 report 都長這樣):
13
+ - `狀態: PASS / FAIL / 無法判定`
14
+ - `實測: {量到的值}`
15
+ - `預期: {token 值或 ratio}`
16
+ - `差異: {若 FAIL,寫出 diff 和推測破壞規則}`
17
+ - `對應規則: {CLAUDE.md 章節 or spec.md 段落 or token 名}`
18
+
19
+ ---
20
+
21
+ ## 1. 4 邊邊距對稱
22
+
23
+ **Canonical source**: 元件自身 `spec.md` 宣告的 padding token;`tokens/layoutSpace/layoutSpace.spec.md`;`tokens/uiSize/uiSize.spec.md`
24
+
25
+ **怎麼量**:
26
+ 1. 找元件最外層容器(含 border 的那層)的 4 個內邊到第一個 child 的距離
27
+ 2. 分別量 top / right / bottom / left padding
28
+ 3. 與 spec 宣告的 padding token 值比對(如 `layout-space-loose = 16px`)
29
+
30
+ **合格標準**:
31
+ - 4 邊全等 token 值 → PASS
32
+ - 元件 spec 明文宣告 asymmetric(例「top padding 較大為 sticky header」) → 照 spec 查
33
+ - 4 邊不等且 spec 無 rationale → FAIL
34
+
35
+ **FAIL 範例**:DatePicker 量到 top=12 / right=12 / bottom=8 / left=12,spec 未宣告 bottom asymmetric → FAIL,建議討論是對齊 12 還是補 spec rationale
36
+
37
+ **對應規則**:CLAUDE.md `# Consistency Audit 原則`(actual == canonical OR rationale-for-deviation)
38
+
39
+ ---
40
+
41
+ ## 2. 垂直對稱(to-top ↔ to-bottom)
42
+
43
+ **Canonical source**: 元件 `spec.md` 的結構描述;「外層 element 到容器頂」= 「內層末端到容器底」為共通視覺節奏,除非 spec 明文否認
44
+
45
+ **怎麼量**:
46
+ 1. 找元件最上方功能 element(如 DatePicker 的 prev/next 箭頭按鈕)量其 top 邊到容器頂的距離 A
47
+ 2. 找元件最下方 content element(如最後一排日期 cell)量其 bottom 邊到容器底的距離 B
48
+ 3. A vs B 相等判定
49
+
50
+ **合格標準**:
51
+ - A == B(±1px) → PASS
52
+ - 元件 spec 明文有 asymmetric rationale(如「footer action bar 較高」) → 照 spec 查
53
+ - A != B 且無 rationale → FAIL
54
+
55
+ **FAIL 範例**:DatePicker 箭頭按鈕 top=12px 但最後一排日期 bottom=4px → 差異 8px 違反上下對稱
56
+
57
+ **對應規則**:該元件 spec.md + `.claude/rules/ui-development.md`「建立 UI 前必讀」 layout-space token
58
+
59
+ ---
60
+
61
+ ## 3. 水平 gap 實際值 == gap token 宣告值(hover bg 不可吃掉)
62
+
63
+ **Canonical source**: CLAUDE.md `# 同 flex 列的互動 slot 幾何鐵律`(gap 鐵律)
64
+
65
+ **怎麼量**:
66
+ 1. 量同一 flex row 相鄰兩 interactive slot 的 **box 邊** 之間距離(不是「視覺中心距離」,是右邊 slot 左緣 - 左邊 slot 右緣)
67
+ 2. 比對 cva `gap-N` 或 `gap-[var(--layout-space-X)]` 的宣告值
68
+ 3. **關鍵**:量 hover state 時的 gap(滑鼠移上去 hover bg 放大後),不只 default state
69
+ 4. 檢查 hover bg / ring / focus outline 是否超出 slot box —— 若超出,實際 gap = 宣告 gap - overflow 量
70
+
71
+ **合格標準**:
72
+ - default + hover 兩態的 gap 都 == 宣告值(±1px) → PASS
73
+ - hover 狀態 gap 被 bg overflow 吃掉 → FAIL(違反 CLAUDE.md「同 flex 列幾何鐵律」)
74
+
75
+ **FAIL 範例**:FileItem 2026-04-19 bug,Button hover-bg 24px 超出 16px box,`gap-2`(8px)實際剩 ~4px
76
+
77
+ **對應規則**:`.claude/rules/ui-development.md` → `# 同 flex 列的互動 slot 幾何鐵律`(必讀)
78
+
79
+ ---
80
+
81
+ ## 4. Overlay 定位(Badge / Popover / HoverCard / Tooltip)
82
+
83
+ **Canonical source**: 對應元件 spec(`tooltip.spec.md` / `popover.spec.md` / `hover-card.spec.md`);`patterns/overlay-surface/overlay-surface.spec.md`
84
+
85
+ **怎麼量**:
86
+ 1. 定位 anchor 元件(底層觸發元件)的 box 四邊
87
+ 2. 量 overlay 的位置:side-offset(overlay 離 anchor 的距離)、alignment(start / center / end)
88
+ 3. 檢查:
89
+ - **side-offset 對稱**:若 overlay 說明「距 anchor 8px」,實際量應 == 8px
90
+ - **不覆蓋 anchor content**:overlay 不該遮住 anchor 上的可讀資訊
91
+ - **不超出 viewport**:overlay 貼邊時仍在 viewport 內(flip 行為正確)
92
+ - **Badge 特例**:badge 疊 anchor 時,offset 應用 token(`--ui-size-*`)非硬寫 px
93
+
94
+ **合格標準**:
95
+ - side-offset 等 spec 宣告值 → PASS
96
+ - 不覆蓋 anchor content → PASS
97
+ - 任一違反 → FAIL
98
+
99
+ **FAIL 範例**:Carousel prev/next 箭頭覆蓋 carousel item content;Badge 疊 Button 距離離譜用硬寫 px
100
+
101
+ **對應規則**:對應元件 spec;`.claude/rules/ui-development.md`「元件 Props 命名」「常用 icon canonical」(若箭頭用錯 icon);`.claude/rules/ui-development.md`「建立 UI 前必讀」 overlay-surface pattern
102
+
103
+ ---
104
+
105
+ ## 5. Typography baseline 對齊
106
+
107
+ **Canonical source**: `tokens/typography/typography.spec.md`;`patterns/element-anatomy/item-anatomy.spec.md`
108
+
109
+ **怎麼量**:
110
+ 1. 找 icon + text 同行的 row(如 MenuItem / Button / Tag)
111
+ 2. 量 icon 幾何中心的 y 座標 vs text baseline 的 y 座標
112
+ 3. **重要區分**:icon 應對齊 text **中線(cap-height 中心)** 而非 baseline(baseline 是字母底緣,icon 對那會視覺偏下);但實務用 `items-center` flex 已處理 geometric center,只需檢查實際 render 是否視覺對齊
113
+
114
+ **合格標準**:
115
+ - icon 幾何中心 y == text optical center y(±1px) → PASS
116
+ - icon 明顯偏上 / 偏下 → FAIL(常見原因:用了 `items-baseline` 而非 `items-center`,或 icon box 高度與 text line-height 不匹配)
117
+
118
+ **FAIL 範例**:MenuItem icon 16px 與 body text 14px(line-height 1.5=21px),幾何中心若對 y=7 vs y=10.5,差 3.5px → 視覺偏上
119
+
120
+ **對應規則**:`tokens/typography/typography.spec.md` line-height(scanning 1.3 vs reading 1.5);`item-anatomy.spec.md` Inline Action 規格
121
+
122
+ ---
123
+
124
+ ## 6. Icon ↔ text gap 一致
125
+
126
+ **Canonical source**: `patterns/element-anatomy/item-anatomy.spec.md` Inline Action / slot 規格(`gap-2` = 8px 標準)
127
+
128
+ **怎麼量**:
129
+ 1. 列出同一列表內所有 row(如 SidebarMenu 的 5 個 MenuItem)
130
+ 2. 逐 row 量 icon right edge → text left edge 的距離
131
+ 3. 5 個值應全等
132
+
133
+ **合格標準**:
134
+ - 全部相等(±1px) → PASS
135
+ - 任一 row 偏離 → FAIL(常見原因:某 row 用了不同 gap class,或某 row icon size 偏離 ICON_SIZE 常數)
136
+
137
+ **FAIL 範例**:5 個 MenuItem 有 4 個 gap=8px,1 個 gap=12px(consumer 手動加了 `gap-3`)
138
+
139
+ **對應規則**:`item-anatomy.spec.md`;`.claude/rules/ui-development.md`「新增數值前必須先查既有 pattern」
140
+
141
+ ---
142
+
143
+ ## 7. 容器寬度 fill
144
+
145
+ **Canonical source**: 元件 spec 宣告容器行為(block / inline / fill-container);`field-controls.spec.md` 對 field 類
146
+
147
+ **怎麼量**:
148
+ 1. 量元件 outer box 寬度 vs 其 parent 容器寬度
149
+ 2. 若元件是 block-level(如 FileUpload / FileItem / Empty / Field),應 100% fill parent width
150
+ 3. 若元件是 inline-level(如 Tag / Chip / Button default),應 fit-content
151
+
152
+ **合格標準**:
153
+ - block-level == parent width(±1px) → PASS
154
+ - inline-level == content width → PASS
155
+ - block-level 內縮(未 fill) → FAIL
156
+
157
+ **FAIL 範例**:FileUpload 在 800px 容器內只佔 600px,兩側 100px 空白 → 違反 block-level 預設行為
158
+
159
+ **對應規則**:對應元件 spec;`components/Field/field.spec.md`(Field 類)
160
+
161
+ ---
162
+
163
+ ## 8. 同 row field 高度對齊
164
+
165
+ **Canonical source**: `tokens/uiSize/uiSize.spec.md` field-height family(`--field-height-sm/md/lg` = 28/36/44px)
166
+
167
+ **怎麼量**:
168
+ 1. 找同一 row 並排的 field 類元件(Input / Select / DatePicker / Button 等)
169
+ 2. 量每個 element box height
170
+ 3. 全部相等且 == 對應 `--field-height-{size}` 值
171
+
172
+ **合格標準**:
173
+ - 全等 token 值(±1px) → PASS
174
+ - 任一偏離 → FAIL
175
+
176
+ **FAIL 範例**:Input(size=md, 36px)+ Button(size=md, 36px)+ Select(誤用 size=sm, 28px)→ Select 偏低 8px
177
+
178
+ **對應規則**:`uiSize.spec.md` field-height family;`.claude/rules/ui-development.md`「建立 UI 前必讀」 → uiSize token
179
+
180
+ ---
181
+
182
+ ## 9. 跨 OS 一致 scrollbar
183
+
184
+ **Canonical source**: `.claude/rules/ui-development.md`「建立 UI 前必讀」 「overflow 使用三規則」;`components/ScrollArea/`
185
+
186
+ **怎麼量**:
187
+ 1. 找 screenshot 內的 scrollable area
188
+ 2. 檢查 scrollbar 視覺:
189
+ - **ScrollArea 的**:有 overlay scrollbar,不吃 content 寬度,macOS/Windows/Linux 視覺一致
190
+ - **native overflow 的**:macOS 預設隱藏,Windows 吃 ~15px 寬度,跨 OS 不一致
191
+ 3. 若 screenshot 來自 Windows,量 scrollbar 是否佔 content 寬度(佔 = native;不佔 = ScrollArea)
192
+
193
+ **合格標準**:
194
+ - 需捲動的場景使用 ScrollArea(scrollbar 為 overlay style) → PASS
195
+ - 用 native `overflow-auto` 且 user 實際用 Windows 會吃寬度 → FAIL
196
+ - horizontal-overflow pattern 刻意隱藏 scrollbar + fade mask → PASS(不同場景)
197
+
198
+ **FAIL 範例**:DataTable 水平捲動用 native overflow-x-auto → Windows user 看到 15px scrollbar 吃 cell 寬度
199
+
200
+ **對應規則**:`.claude/rules/ui-development.md`「建立 UI 前必讀」 → overflow 使用三規則
201
+
202
+ ---
203
+
204
+ ## 10. Zoom / step 幅度
205
+
206
+ **Canonical source**: `world-class-benchmarks.md` Figma/Photoshop zoom step;元件 spec(如 FileViewer / ImageViewer)
207
+
208
+ **怎麼量**:
209
+ 1. 取 zoom-in/out 前後兩張 screenshot
210
+ 2. 量某固定 element(如圖片裡一個標示)的 box 尺寸 before / after
211
+ 3. 算 ratio = after / before
212
+
213
+ **合格標準**:
214
+ - 單次滾輪 / 單次 button tick 的 ratio 在 1.1×–1.25× 區間 → PASS(對標 Figma ≈ 1.1×,Photoshop ≈ 1.2×)
215
+ - 跳大步(如 1.5× / 2×)→ FAIL(user 會感覺「跳過想看的中間值」)
216
+ - 跳太小(如 1.02×)→ FAIL(user 要滑很久才有感)
217
+
218
+ **FAIL 範例**:ImageViewer 單次滾輪從 100% 跳到 200% → ratio 2.0,違反世界級習慣
219
+
220
+ **對應規則**:`world-class-benchmarks.md`「Figma zoom step」;元件 spec 若有宣告 step 以 spec 為準
221
+
222
+ ---
223
+
224
+ ## 11. Dark mode 對比 / token 聯動
225
+
226
+ **Canonical source**: `tokens/color/color.spec.md` semantic token dark mode 反轉;元件 spec 的 dark mode 行為段
227
+
228
+ **怎麼量**:
229
+ 1. 取 light + dark 兩張 screenshot(同元件、同 state)
230
+ 2. 逐元素檢查:
231
+ - **fg / bg 對比比**:dark mode 文字是否仍可讀(對比 ≥ WCAG AA 4.5:1)
232
+ - **border / divider 可見**:dark mode border 不該消失於 bg
233
+ - **shadow 聯動**:`--elevation-*` token 在 dark mode 應調整(通常變更透明,因 dark bg 陰影要提亮)
234
+ 3. 若元件**永遠 dark mode**(如 FileViewer 工具列)→ 檢查 light theme 下仍為 dark 外觀,不跟全域 theme 切
235
+
236
+ **合格標準**:
237
+ - fg/bg 對比符合 WCAG AA → PASS
238
+ - border/shadow 在 dark mode 仍可見 → PASS
239
+ - shadow 用 `--elevation-*` token 而非硬寫 `shadow-md` → PASS(看不出硬寫,但若 dark mode shadow 消失 = 強烈信號)
240
+ - 永遠 dark mode 元件在 light theme 下不跟切 → PASS
241
+
242
+ **FAIL 範例**:Popover 在 dark mode 下 shadow 消失(用了 `shadow-md` 硬寫);FileViewer 工具列在 light theme 變白(dark-mode override 失效)
243
+
244
+ **對應規則**:`color.spec.md`;`.claude/rules/ui-development.md`「Tailwind 5 條核心」「shadow 一律用 `--elevation-*` token」;元件 spec 的 dark mode 段
245
+
246
+ ---
247
+
248
+ ## 12. Overflow indicator 遮擋
249
+
250
+ **Canonical source**: `patterns/horizontal-overflow/horizontal-overflow.spec.md`;`components/OverflowIndicator/`(若存在)
251
+
252
+ **怎麼量**:
253
+ 1. 找有 horizontal-overflow 的 container(Tabs / ChipGroup 等)
254
+ 2. 檢查 fade mask 寬度 + 位置:
255
+ - fade mask 應只蓋「視覺提示溢出」的範圍(通常 16–32px),不蓋完整 item
256
+ - 箭頭按鈕(若有)不該蓋住 item 的可讀部分(text / icon)
257
+ 3. 捲到最左 / 最右極端時,對應邊的 fade mask / 箭頭應消失(無溢出就無提示)
258
+
259
+ **合格標準**:
260
+ - fade mask 不蓋完整 item 的 text / icon → PASS
261
+ - 箭頭按鈕不遮 item 可讀資訊 → PASS
262
+ - 極端位置時對應邊指示器消失 → PASS
263
+
264
+ **FAIL 範例**:Tabs 箭頭按鈕遮住第一個 Tab 一半 text;fade mask 寬度 80px 完全蓋掉邊緣 tab
265
+
266
+ **對應規則**:`horizontal-overflow.spec.md`
267
+
268
+ ---
269
+
270
+ ## 13. 箭頭按鈕定位(Carousel / ImageViewer)
271
+
272
+ **Canonical source**: 對應元件 spec(Carousel / ImageViewer);`patterns/overlay-surface/` 若箭頭浮在 content 上
273
+
274
+ **怎麼量**:
275
+ 1. 找箭頭按鈕(prev / next)的位置
276
+ 2. 量:
277
+ - **兩箭頭對稱**:prev 離左邊距離 == next 離右邊距離(除 spec 明文 asymmetric)
278
+ - **不覆蓋 content**:箭頭 y 方向置中,x 方向在 content 外側或 overlay 層不蓋核心 content
279
+ - **箭頭到容器邊**:該距離應用 token(如 `--layout-space-tight`),非硬寫 px
280
+
281
+ **合格標準**:
282
+ - 左右對稱(±1px) → PASS
283
+ - 不覆蓋 content 核心區 → PASS
284
+ - 使用 token 非硬寫 px → PASS(可從「距離對稱 + 是標準 token 值」反推)
285
+
286
+ **FAIL 範例**:Carousel prev 離左邊 8px、next 離右邊 16px(不對稱);箭頭 y 方向佔 content 垂直 1/3 高度並蓋住文字
287
+
288
+ **對應規則**:對應元件 spec;`tokens/layoutSpace/layoutSpace.spec.md`
289
+
290
+ ---
291
+
292
+ ## 補充:如何處理「checklist 沒涵蓋但視覺上怪」的情況
293
+
294
+ - 記為 `額外觀察`,附 screenshot 座標 + 描述(1-2 句)
295
+ - 交 user 決定是否升級為 checklist 項目
296
+ - **不直接寫成 FAIL**(checklist 是 SSOT,擴項需正式流程)
297
+ - 若同類觀察累積 3+ 次跨元件出現 → 建議升級為第 14 項 checklist 並更新本 reference
@@ -0,0 +1,198 @@
1
+ # Visual Audit — 世界級對照 benchmark
2
+
3
+ 本檔為 SKILL.md Phase 1 各 checklist 項「合格標準」的**外部參考錨**。DS 內既有 spec / token 是第一順位 canonical;**本檔是 spec 沒寫、或需要補世界級 rationale 時的次級參考**。
4
+
5
+ **使用原則**:
6
+ - 合格標準優先走 DS 內 spec / token(actual == canonical)
7
+ - DS spec 沒寫時,本檔提供世界級 idiom 作「可類推的合理區間」
8
+ - 本檔數值**不可取代** DS 規則,只提供「世界級通常怎麼做」的事實陳述
9
+ - 看到 FAIL 但 DS 無明文 canonical → 用本檔指出「世界級通常 X,本元件偏離 X」,交 user 決定是補 spec 還是改 code
10
+
11
+ ---
12
+
13
+ ## 1. 4 邊邊距對稱 / 2. 垂直對稱(DatePicker / Menu / Dialog)
14
+
15
+ | DS | 規範重點 | 數值 |
16
+ |----|---------|------|
17
+ | **Material 3 Date Picker** | 4 邊等距,top/bottom action bar 高度鏡射 | 12dp 四邊 |
18
+ | **Apple HIG Date Picker(iOS / macOS)** | 精準 grid,4 邊 padding 等值 | 16pt 四邊 |
19
+ | **Atlassian DatePicker** | `padding: 8px` 四邊 | 8px |
20
+ | **Notion Menu** | 上下 padding 同值,sticky header 單獨佔空間 | 6px 上下 |
21
+
22
+ **世界級 idiom**:**4 邊等 padding 是 default**;asymmetric 必有 rationale(sticky header / footer action bar / arrow space)。DS 若無明文 asymmetric → 4 邊應等。
23
+
24
+ ---
25
+
26
+ ## 3. 水平 gap(同 flex 列互動 slot)
27
+
28
+ | DS | 規範重點 |
29
+ |----|---------|
30
+ | **Polaris ActionList / Menu** | item 之間 `gap-0`,每 item 自含 padding;inline action gap 8px |
31
+ | **Material 3 Chip group** | 8dp gap between chips |
32
+ | **Atlassian Button group** | 8px gap;ring/focus outline 限制在 box 內,不 overflow |
33
+ | **Ant Design Space** | default `gap-8`,hover bg 限制 box 內 |
34
+
35
+ **世界級 idiom**:**hover bg / ring / focus outline 不超出 slot box**,保護 gap token 如實呈現。這對齊 CLAUDE.md`# 同 flex 列的互動 slot 幾何鐵律`。
36
+
37
+ ---
38
+
39
+ ## 4. Overlay 定位(Popover / Tooltip / Badge)
40
+
41
+ | DS | 規範重點 | 數值 |
42
+ |----|---------|------|
43
+ | **Material 3 Popover** | anchor 到 popover 最小 8dp spacing | 8dp |
44
+ | **Atlassian Tooltip** | 6px offset from anchor | 6px |
45
+ | **Polaris Popover** | 4px offset | 4px |
46
+ | **Ant Design Tooltip** | 4px offset 預設,可 side-offset prop 調 | 4px |
47
+ | **Material Badge(dot / number)** | 以 anchor 右上角為 center 定位,offset 用 anchor 尺寸比例 | (24dp 圖示)右上 8×8 dot 中心離 anchor 右上 (−4, +4) |
48
+
49
+ **世界級 idiom**:
50
+ - **side-offset 預設 4–8px**,tooltip 偏小(4–6)、popover 偏大(6–8)
51
+ - **Badge 定位用相對比例**(anchor size × ratio),不硬寫 px(不同 anchor size 壞掉)
52
+ - **不覆蓋 anchor content**——overlay 的存在是補充 anchor,不是替代
53
+
54
+ ---
55
+
56
+ ## 5. Typography baseline 對齊 / 6. Icon ↔ text gap
57
+
58
+ | DS | 規範重點 | 數值 |
59
+ |----|---------|------|
60
+ | **Material 3 List Item** | icon 16dp 對齊 text cap-height 中心;gap 16dp | 16/16 |
61
+ | **Polaris ResourceList** | icon 20px,gap 12px | 20/12 |
62
+ | **Apple HIG Menu Item** | SF Symbols 與 text 用 `items-center`,gap 8pt | sym/8 |
63
+ | **Atlassian Button with icon** | icon 16px,gap 8px | 16/8 |
64
+ | **Notion MenuItem** | icon 18px,gap 8px | 18/8 |
65
+
66
+ **世界級 idiom**:
67
+ - **gap 8px** 是跨 DS 最常見值(Material 的 16dp 是 outlier,其 menu 本身較寬鬆)
68
+ - **icon 與 text 用 `items-center`**(幾何中心),不是 `items-baseline`
69
+ - **icon size 跟 text size 比例 ≈ 1:1**(16px icon 配 14-16px text),1:1.2 也 ok
70
+
71
+ ---
72
+
73
+ ## 7. 容器寬度 fill(Block vs Inline)
74
+
75
+ | DS | 規範重點 |
76
+ |----|---------|
77
+ | **Material 3 TextField** | 預設 block,fill container;可 `style="width:auto"` 覆寫 |
78
+ | **Polaris TextField** | 預設 100% fill |
79
+ | **Ant Design Input** | 預設 100% fill(與 antd Form 整合) |
80
+ | **Chakra Input** | 預設 100% fill |
81
+ | **shadcn Input** | `w-full` class 預設 |
82
+
83
+ **世界級 idiom**:
84
+ - **field 類元件預設 block fill container**——consumer 常嵌 form layout,讓 field 填滿容器是合理 default
85
+ - **Tag / Chip / Badge 類是 inline fit-content**
86
+ - **File upload area 類(upload zone / drop zone)fill container**——這是拖放互動預期的
87
+
88
+ ---
89
+
90
+ ## 8. 同 row field 高度對齊
91
+
92
+ | DS | field-height |
93
+ |----|--------------|
94
+ | **Material 3 Text field** | 40dp(dense)/ 56dp(standard) |
95
+ | **Polaris TextField** | 32px(slim)/ 36px(medium) |
96
+ | **Atlassian TextField** | 32px(default) |
97
+ | **Apple HIG macOS** | 22pt(small)/ 28pt(regular)/ 36pt(large) |
98
+ | **本 DS** | 28 / 36 / 44px(sm / md / lg) |
99
+
100
+ **世界級 idiom**:**同 row field 用同一 size token**,混 size 是 bug(除非 spec 明文)。本 DS 的 36px md 對齊 Material dense(40dp)和 Polaris medium(36px),是 mainstream 值。
101
+
102
+ ---
103
+
104
+ ## 9. 跨 OS 一致 scrollbar
105
+
106
+ | 平台 | native scrollbar 行為 |
107
+ |------|--------------------|
108
+ | **macOS** | 預設 overlay(不吃寬度),滾動時淡入 |
109
+ | **Windows** | 預設 chunky(吃 ~15px 寬度),永遠可見 |
110
+ | **Linux GTK** | 類似 Windows(吃寬度) |
111
+ | **iOS / Android** | overlay |
112
+
113
+ **世界級 idiom**:
114
+ - **Web DS 用 overlay scrollbar 跨 OS 一致**(Radix ScrollArea / Ant Design Scrollbar 都這樣做)
115
+ - **原因**:Windows native scrollbar 吃寬度會讓同一 page 在 Mac 和 Windows 上 layout 不同,違反「設計在任何平台視覺一致」
116
+
117
+ 對應 DS:`components/ScrollArea/` + CLAUDE.md「overflow 使用三規則」。
118
+
119
+ ---
120
+
121
+ ## 10. Zoom / step 幅度
122
+
123
+ | App | 單次 zoom-in step |
124
+ |-----|-----------------|
125
+ | **Figma** | 約 1.1×(持續滾輪)/ `Cmd+=` 跳到 preset(50%/100%/200%) |
126
+ | **Photoshop** | 1.2×(`Alt + 滾輪`)/ preset jumps |
127
+ | **Adobe XD** | 1.1× 滾輪 |
128
+ | **Sketch** | 1.1× 滾輪 |
129
+ | **Google Maps** | 2× per step(但 maps 是 tile-based,不同場景) |
130
+ | **PDF viewers(Preview / Acrobat)** | 1.25× |
131
+
132
+ **世界級 idiom**:
133
+ - **圖片 / 設計工具的滾輪 zoom 介於 1.1×–1.25×**
134
+ - **跳大步(1.5× / 2×)只適合 tile-based 地圖**,不適合 image viewer
135
+ - **跳太小(1.02×)user 要滑很久**
136
+ - 本 DS 的 ImageViewer / FileViewer 應落在 1.1×–1.2×
137
+
138
+ ---
139
+
140
+ ## 11. Dark mode 對比
141
+
142
+ | DS | 規範重點 |
143
+ |----|---------|
144
+ | **Material 3** | dark surface `#121212`,elevation 用 overlay 白色提亮(不同 layer 不同透明度) |
145
+ | **Apple HIG dark** | system dark bg `#1c1c1e`,text `#ffffff` with 100% opacity;對比需 ≥ 4.5:1 |
146
+ | **Polaris dark** | semantic token 反轉,shadow 改用 inverse-foreground 微提亮 |
147
+ | **Atlassian ADG dark** | neutral palette 反轉;每 elevation level dark mode 都有對應 token |
148
+
149
+ **世界級 idiom**:
150
+ - **WCAG AA 對比 ≥ 4.5:1**(body text)/ 3:1(large text)
151
+ - **Dark mode shadow 不消失**——要麼改用 overlay(Material 方式)要麼降低 opacity 仍保留
152
+ - **永遠 dark 的工具列**(圖像編輯器、影片播放器)是世界級慣例(Photoshop、Premiere、YouTube Studio)——鎖住 `data-theme="dark"` 不跟全域切
153
+
154
+ ---
155
+
156
+ ## 12. Overflow indicator(Tabs / Chip)
157
+
158
+ | DS | 規範重點 |
159
+ |----|---------|
160
+ | **Material 3 Tabs** | scrollable 模式 + fade mask 16dp,箭頭 40dp 寬度可點擊但視覺只佔 16dp |
161
+ | **Polaris Tabs** | 溢出用「More」button 收納(不是 fade mask) |
162
+ | **Atlassian Tabs** | 箭頭 overflow 按鈕,不蓋 text |
163
+
164
+ **世界級 idiom**:
165
+ - **fade mask 寬度 16–32px** 足夠提示「有更多」,不蓋完整 item
166
+ - **箭頭按鈕用 overlay 層**(不佔 tab 寬度),不蓋 item 可讀部分
167
+ - **極端位置(最左 / 最右)對應邊指示器消失**——不再有溢出就不再提示
168
+
169
+ ---
170
+
171
+ ## 13. 箭頭按鈕定位(Carousel / ImageViewer)
172
+
173
+ | App / DS | 規範重點 |
174
+ |---------|---------|
175
+ | **Carousel.swiper.js default** | 箭頭離 container 邊 10px,y 方向 50%(置中),半透明 bg |
176
+ | **Apple HIG Photos** | 箭頭隱藏於 hover,位置 container 外側 12pt |
177
+ | **Figma thumbnail grid** | 無箭頭,用滑鼠拖曳(不同範式) |
178
+ | **Google Photos lightbox** | 箭頭 y-center,離 container 邊 16px,40×40 hit area |
179
+ | **Ant Design Carousel** | 箭頭 y-center,離 container 邊 12px |
180
+
181
+ **世界級 idiom**:
182
+ - **兩箭頭對稱(prev 離左 == next 離右)**
183
+ - **y 方向 content 垂直置中**(y=50%)
184
+ - **不蓋核心 content**——寧可半透明 bg + 箭頭偏外,也不讓箭頭 shadow content text
185
+ - **箭頭到邊用 token**,不硬寫 px(避免不同 size carousel 比例跑掉)
186
+
187
+ ---
188
+
189
+ ## 通用:如何引用本檔的 benchmark
190
+
191
+ 在 audit report FAIL 項寫:
192
+ ```
193
+ 對應規則: DS 無明文 canonical → 世界級對照見 world-class-benchmarks.md §N
194
+ Benchmark: Material/Polaris/Atlassian 通常 X(本元件為 Y)
195
+ 建議討論: 是補 spec rationale 還是調向世界級 X
196
+ ```
197
+
198
+ **不可**單以本檔為判決依據 FAIL(DS 內 spec 為第一順位);本檔是**補 rationale 的參考錨**,不是 canonical。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qijenchen/design-system",
3
- "version": "0.1.0-beta.10",
3
+ "version": "0.1.0-beta.13",
4
4
  "private": false,
5
5
  "description": "World-class design system — components, patterns, tokens, hooks (single source of truth for team distribution).",
6
6
  "type": "module",
@@ -8,14 +8,16 @@
8
8
  "files": [
9
9
  "dist",
10
10
  "src/**/*.{tsx,ts,css}",
11
+ "src/**/*.spec.md",
11
12
  "!src/**/*.stories.tsx",
12
13
  "!src/**/*.anatomy.stories.tsx",
13
14
  "!src/**/*.principles.stories.tsx",
14
- "!src/**/*.spec.md",
15
15
  "!src/**/*.spec.ts",
16
16
  "!src/**/*.test.ts",
17
17
  "README.md",
18
- "scripts"
18
+ "CLAUDE.md",
19
+ "ds-canonical",
20
+ "cli-init.mjs"
19
21
  ],
20
22
  "exports": {
21
23
  ".": {
@@ -29,10 +31,11 @@
29
31
  },
30
32
  "./styles/tokens.css": "./src/styles/tokens.css",
31
33
  "./styles/tokens": "./src/styles/tokens.css",
32
- "./styles/preset.css": "./src/styles/preset.css",
33
- "./styles/preset": "./src/styles/preset.css",
34
34
  "./package.json": "./package.json"
35
35
  },
36
+ "bin": {
37
+ "qijenchen-ds-init": "./cli-init.mjs"
38
+ },
36
39
  "main": "./dist/index.js",
37
40
  "module": "./dist/index.js",
38
41
  "types": "./dist/index.d.ts",
@@ -76,6 +79,7 @@
76
79
  "embla-carousel-react": "^8.6.0",
77
80
  "lucide-react": "^0.577.0",
78
81
  "react-day-picker": "^9.14.0",
82
+ "react-is": "^18.0.0 || ^19.0.0",
79
83
  "react-zoom-pan-pinch": "^4.0.3",
80
84
  "recharts": "^3.8.1",
81
85
  "sonner": "^2.0.7",
@@ -0,0 +1,114 @@
1
+ ---
2
+ component: Accordion
3
+ family: composite
4
+ variants: {}
5
+ sizes: {}
6
+ traits:
7
+ - hasInteractiveStates
8
+ - isStructural
9
+ benchmark:
10
+ - Radix Accordion primitive: github.com/radix-ui/primitives/tree/main/packages/react/accordion
11
+ - MUI Accordion: github.com/mui/material-ui/tree/master/packages/mui-material/src/Accordion
12
+ - Ant Design Collapse: github.com/ant-design/ant-design/tree/master/components/collapse
13
+ - Carbon Accordion: github.com/carbon-design-system/carbon/tree/main/packages/react/src/components/Accordion
14
+ ---
15
+
16
+ # Accordion 設計原則
17
+
18
+ ## 定位
19
+
20
+ Accordion 是**垂直堆疊、可收合的多區塊容器**——每個 item 由 header(含 chevron)點擊切換展開 / 收合狀態。適合「多段內容,多數時間只想看其中一段」的情境。
21
+
22
+ **實作基礎**:shadcn/ui 結構 + Radix Accordion primitive。本 DS 保留 shadcn 的 `Accordion / AccordionItem / AccordionTrigger / AccordionContent` API,視覺全改本 DS token,移除 shadcn 預設的 hover underline(web 早期 link style,與現代 SaaS 質感不符)。
23
+
24
+ **Layout Family**:非上述 family — composite / multi-section(多個 AccordionItem 垂直堆疊,自 own layout)。
25
+
26
+ ---
27
+
28
+ ## 何時用
29
+
30
+ - **FAQ / 說明**:常見問題、使用教學(預設全收合,使用者展開有興趣的)
31
+ - **設定分組**:一般 / 通知 / 安全 / 付款等多節 settings 頁(長 form 拆段)
32
+ - **進階選項可隱藏**:預設展示主要欄位,「進階選項」收合起來避免壓力
33
+ - **單邊 sidebar 多分類**:檔案樹、notion-style 工作區 sidebar
34
+
35
+ ## 何時不用
36
+
37
+ | 場景 | 改用 | 原因 |
38
+ |------|------|------|
39
+ | 只有一個區塊要收合 | `<details>` 或自組 toggle | Accordion 是「多 item」pattern,單 item 無必要 |
40
+ | 切換平行視圖(A / B / C 三選一)| `Tabs` | Tabs 是互斥切換,Accordion 是獨立收合(或單選) |
41
+ | 複雜 sidebar 導航(深度 tree)| `TreeView` / `Sidebar` | Accordion 無 nested 結構 |
42
+ | 收合整個浮層/側欄 | `Dialog` / `Sheet` / `Popover` | 那是浮層控制不是 inline 收合 |
43
+ | 長列表只顯示 N 個 | 自組 「顯示更多」按鈕 | Accordion 不是「more / less」pattern |
44
+
45
+ ---
46
+
47
+ ## type:single vs multiple
48
+
49
+ **`type="single"`**(預設推薦):一次只能展開一個 item。展開新 item 自動收合前一個。適合 FAQ / 指南類(讀者看完一段再下一段)。
50
+
51
+ **`type="multiple"`**:多個 item 可同時展開。適合 settings page / 工作 context(使用者同時比對多段)。
52
+
53
+ **判斷法**:「使用者會不會想同時看兩段?」會 → multiple;不會 / 同時看反而混亂 → single。
54
+
55
+ ---
56
+
57
+ ## collapsible (配合 single)
58
+
59
+ `single` 搭配 `collapsible={true}`:已展開的那個可以再點一次收合(回到「全部收合」狀態)。預設 `false`——已展開的無法再收合(必須保持有一個展開)。
60
+
61
+ - **FAQ / 使用教學** → `collapsible={true}`(允許全收起,乾淨視覺)
62
+ - **必須展開一個才合理** → `collapsible={false}`(罕見)
63
+
64
+ ---
65
+
66
+ ## 視覺規則
67
+
68
+ - **AccordionItem 底線**:相鄰 item 以底 divider 分隔(視覺界定每一段)
69
+ - **Trigger 文字**:正常閱讀色 + medium 字重(可掃視的 section heading 等級)
70
+ - **Trigger hover**:文字色 tint 弱化,**不用 underline**
71
+ - **Chevron**:朝下 → data-state=open 旋轉 180° → 朝上,transition 帶平滑
72
+ - **Content 文字**:次要閱讀色—— 主資訊在 trigger,展開內容是補充
73
+ - **焦點環**:鍵盤 focus 用 ring token(非自訂 outline)
74
+
75
+ **為什麼 hover 不用底線**:shadcn 預設 `hover:underline` 是 web 早期 link convention,現代 SaaS(Notion / Linear / Stripe / Vercel)皆不使用。改用文字色 tint 弱化維持統一質感,同時保留可點擊提示——不變色會讓使用者不確定是否能點擊,比起「被誤以為是 link」的風險,「失去可點擊提示」的風險更高。
76
+
77
+ 完整 class / token 對照見 anatomy story(`ColorMatrix` + `SizeMatrix`)。
78
+
79
+ ---
80
+
81
+ ## 禁止事項
82
+
83
+ - ❌ **不在 Accordion 內放另一個 Accordion**(巢狀會讓使用者迷失;用 TreeView 或拆頁)
84
+ - ❌ **不寫「全部展開 / 全部收合」按鈕**(違反 accordion 節省空間的設計意圖;若需要此功能,改用 TreeView 或 DescriptionList)
85
+ - ❌ **單一 item 不用 Accordion**(用 `<details>` 或自組 toggle;見「何時不用」)
86
+ - ❌ **不用 Accordion 做主要導航**(主導航用 Tabs / Sidebar,Accordion 是 content-level 收合)
87
+ - ❌ **AccordionContent 不放互動重焦點元素**(例:complex form / Dialog trigger;收合後焦點消失,但如果只是輸入欄位可以)
88
+
89
+ ---
90
+
91
+ ## A11y 預設
92
+
93
+ Radix Accordion 自動處理:
94
+ - **鍵盤**:Tab 到 trigger → Enter/Space 切換;ArrowUp/Down 在 trigger 間移動
95
+ - **ARIA**:trigger `aria-expanded` / `aria-controls` 自動設置,content `role="region"` + `aria-labelledby`
96
+ - **焦點**:收合時焦點停在 trigger,不會跳到隱藏 content 內
97
+
98
+ Consumer 無需額外處理,保留 Radix `data-state` 屬性即可。
99
+
100
+ ---
101
+
102
+ ## 邊界狀態
103
+
104
+ Empty state 由 consumer 處理(無 items 則不渲染);loading 狀態由 consumer 用 `<Skeleton />` 包;disabled state 詳 `../Field/field-controls.spec.md`;density 由 Radix 繼承。
105
+
106
+ ---
107
+
108
+ ## 相關
109
+
110
+ - `../Tabs/tabs.spec.md` — 互斥切換視圖(非收合)
111
+ - `../Dialog/dialog.spec.md` — 阻斷性浮層
112
+ - `../Sheet/sheet.spec.md` — 側邊抽屜
113
+ - `../TreeView/tree-view.spec.md` — 具層級結構的收合(Accordion 的巢狀延伸)
114
+ - Radix Accordion primitive — `@radix-ui/react-accordion`