@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,329 @@
1
+ ---
2
+ component: Avatar
3
+ family: self-contained
4
+ variants: {}
5
+ sizes: {}
6
+ traits:
7
+ - hasInteractiveStates
8
+ - isMatrixHeavy
9
+ benchmark:
10
+ - MUI Avatar: github.com/mui/material-ui/tree/master/packages/mui-material/src/Avatar
11
+ - Ant Design Avatar: github.com/ant-design/ant-design/tree/master/components/avatar
12
+ - Polaris Avatar: github.com/Shopify/polaris/tree/main/polaris-react/src/components/Avatar
13
+ ---
14
+
15
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
16
+
17
+ # Avatar 設計原則
18
+
19
+ ## 定位
20
+
21
+ Avatar 是視覺身份標識——代表一個人、一個實體(專案、組織、App)。不是裝飾。
22
+
23
+ **Layout Family**:非上述 family — self-contained primitive(獨立視覺,無 slot 結構)。
24
+
25
+ **實作基礎**:純視覺 atom——img + 文字 fallback 組合,無 external primitive base。Radix 有 Avatar primitive 但只提供 fallback 邏輯,本 DS 直接用 native `<img>` + CSS + 錯誤處理已足夠,避免多一層依賴。
26
+
27
+ ---
28
+
29
+ ## 何時用
30
+
31
+ - **人員識別**:留言者頭像、指派者、作者、團隊成員列表
32
+ - **組織 / 專案識別**:workspace logo、專案 icon、app 身份
33
+ - **列表項目的主視覺 prefix**:通訊錄、成員管理、chat room 列表
34
+ - **hover 顯示完整人員卡**:與 HoverCard 搭配呈現 NameCard content
35
+
36
+ ## 何時不用
37
+
38
+ | 場景 | 改用 | 原因 |
39
+ |------|------|------|
40
+ | 抽象概念 icon(設定、通知、搜尋)| Lucide Icon | Avatar 代表實體身份,icon 代表動作 / 概念 |
41
+ | 純文字的 name chip(「Ada Chen」單獨顯示)| `Tag` / 純文字 | Avatar 是視覺 + fallback 文字,純文字 label 用 Tag |
42
+ | 人員資訊卡(name + title + actions)| `NameCard`(內部含 Avatar)| NameCard 是組合元件,Avatar 是其中的身份 prefix |
43
+ | 通知計數指示 | `Badge`(可疊加在 Avatar 右上)| Avatar 承載身份,Badge 承載計數 |
44
+
45
+ ---
46
+
47
+ ## Avatar HoverCard 原則(DS-wide canonical,必遵守)
48
+
49
+ **任何 person avatar,hover 必出現 NameCard(HoverCard)。預設行為,不 opt-in**。
50
+
51
+ **消費者實作 canonical**:
52
+ ```tsx
53
+ <Avatar
54
+ size={40}
55
+ src={person.photoUrl}
56
+ alt={person.name}
57
+ hoverCard={
58
+ <NameCard
59
+ name={person.name}
60
+ avatar={{ src: person.photoUrl, alt: person.name }}
61
+ subtitle={`${person.role}|${person.employeeId}`}
62
+ actions={<NameCardDefaultActions />}
63
+ // ↓ hover context 必含 View more:hover 只顯示精簡資料,user 需要 escape hatch 到完整 profile 頁
64
+ onViewMore={() => navigate(`/people/${person.id}`)}
65
+ />
66
+ }
67
+ />
68
+ ```
69
+
70
+ **`onViewMore` 為 hover context 必含**(2026-04-23 canonical):
71
+ hover NameCard 是 preview,所有 preview 必提供「看完整資料」的路徑。
72
+ 缺 `onViewMore` 使用者點不到完整 profile → hover 成單向死路。對齊 Slack / Linear / Notion / Figma / Gmail hover-profile popover 必有 "View profile" link 的世界級 pattern。詳 `../NameCard/name-card.spec.md`「View more」canonical。 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
73
+
74
+ **適用範圍(ALL person avatars,無例外)**:
75
+ - PeoplePicker tag / table cell 頭像 / sidebar user / comment author / avatar 堆疊
76
+ - Dialog / Sheet body 的 member list
77
+ - FileItem rich 的 author avatar
78
+ - Menu / Dropdown 的 assignee / owner
79
+ - Chat / thread / notification 頭像
80
+
81
+ **世界級對照**(hover → profile 是 default,不是 opt-in):
82
+ - Slack:hover user avatar → profile popover(default)
83
+ - Figma:hover member avatar → profile card(default)
84
+ - Linear:hover assignee avatar → user card(default)
85
+ - Notion:hover person tag → user card(default)
86
+ - GitHub:hover username + avatar → user hover card(default)
87
+
88
+ **例外(不適用)**:
89
+ - Entity avatar(專案 / 組織 logo / app icon)— 不代表人員,hover 無 NameCard
90
+ - Bot / automated account avatar(Atlas / Octocat 等)— 本 DS 後續視需求決
91
+
92
+ **為什麼必 default**:
93
+ - Person avatar 單獨無 context(只有照片 + 首字),user 不知是誰
94
+ - 世界級 collaboration tool 都把 NameCard 當「身份展開」default affordance
95
+ - Opt-in 模式會讓一半的 consumer 忘記加,DS 品質不可控
96
+
97
+ **違規檢測(M10 proactive scan)**:
98
+ `grep '<Avatar.*alt=\{'` 全 src,檢查有無 person name(非 entity)alt 且沒 `hoverCard` prop。
99
+ 未來會加 hook `check_avatar_hovercard.sh` 自動攔截。
100
+
101
+ **Keyboard 可達 canonical(2026-04-22 D4 UX audit 補齊)**:
102
+ 當 Avatar 有 `hoverCard` prop,Avatar wrapper **必 keyboard focusable**,讓 keyboard-only user 也能 reach NameCard popover。Avatar 元件內部自動套:
103
+ - `tabIndex=0`(可 Tab 到)
104
+ - `role="button"` + `aria-haspopup="dialog"`(告訴 AT 這是可觸發 popover)
105
+ - `focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1`(keyboard focus 視覺 indicator)
106
+ - 若無 `hoverCard` → 純展示 `<div>` 不 focusable(避免 tabTrap 噪音)
107
+
108
+ Rationale:Radix `HoverCardTrigger asChild` 不自動加 tabIndex 給 non-focusable child。若 Avatar wrapper 是 `<div>` 沒 tabIndex,keyboard user 無法 reach NameCard content,違反 WCAG 2.1.1(Keyboard)+ 4.1.2(Name, Role, Value)。此 canonical 確保 DS-wide 「person avatar → NameCard」同時對 keyboard / screen reader 可達。
109
+
110
+ **Status dot a11y(2026-04-22 D4 UX audit 調整)**:Avatar status dot 內部 span 從原 `role="status"` + `aria-label="presence: online"` 改為 `aria-hidden`。Rationale:`role="status"` 是 live region,多 Avatars(member list / mention picker)會造成 SR 洪水噪音;presence 資訊應整合進 parent avatar 的 `aria-label`(world-class Slack / Teams / Discord 共通)— consumer 傳 `alt` 時自帶語意(e.g. `alt="Alan Chen (online)"`)。
111
+
112
+ **不論頭像出現在 PeoplePicker tag、table cell、sidebar、comment、avatar 堆疊——只要是人員頭像,hover 一律觸發 HoverCard 顯示 name card**(完整姓名、部門、聯絡方式等)。
113
+
114
+ ### 溢出人員列表(+N)
115
+
116
+ Avatar 堆疊的「+N」hover 也出 **HoverCard**(不是 Tooltip),因為:
117
+ - 列表內的 person tag 需要 dismiss 功能(互動)
118
+ - 每個 person tag hover 需要再出 name card(嵌套 HoverCard)
119
+ - Tooltip 是非互動的,不支援上述需求
120
+
121
+ 架構:`+N → HoverCard(人員列表)→ 每個人名 → HoverCard(name card)`
122
+
123
+ ### 純文字截斷 vs 人員頭像
124
+
125
+ | 被截斷的內容 | Hover 顯示 | 元件 |
126
+ |---|---|---|
127
+ | 人員頭像 | name card(完整資訊 + 操作) | HoverCard |
128
+ | 純文字(檔名、標題) | 完整文字 | Tooltip |
129
+
130
+ ---
131
+
132
+ ## 三種內容模式
133
+
134
+ 按優先順序:
135
+
136
+ | 模式 | 觸發條件 | 內容 | 用途 |
137
+ |---|---|---|---|
138
+ | **Image** | 有 `src` | 圖片填滿 | 照片、上傳頭像 |
139
+ | **Icon** | 有 `icon` 或 src 載入失敗且無 alt | LucideIcon 在底色背景 | 類別標識、預設頭像 |
140
+ | **Text** | 有 `alt` 且無 src/icon | 首字大寫 | 無照片時的 fallback |
141
+
142
+ 圖片載入失敗自動降級為 Icon 或 Text fallback。
143
+
144
+ ---
145
+
146
+ ## 尺寸
147
+
148
+ `size` 接受 **數字(px)** 或字串 **`'fill'`**。**不提供預設尺寸名稱**——尺寸由消費元件(item-layout 系統)決定。
149
+
150
+ ### 兩種模式
151
+
152
+ | `size` 值 | 行為 | 何時用 |
153
+ |----------|------|------|
154
+ | `number`(預設 32) | Avatar 寫死為固定 px 尺寸 | 獨立使用、需要明確尺寸時 |
155
+ | `'fill'` | Avatar 填滿父容器(`width:100% height:100%`),icon 用 60% 寬高、文字用 `50cqi`(container query inline-size) | 父容器(如 MenuItem 的 prefix slot)已決定尺寸時 |
156
+
157
+ **為什麼有 `'fill'` 模式**:當 Avatar 放在 item-layout 的 prefix slot,prefix 的尺寸由消費元件(MenuItem、ListItem 等)依照 size variant 決定。Avatar 不該知道也不該寫死自己的尺寸——應該被動填滿父容器。`'fill'` 模式透過 CSS container query 讓內部 icon/text 自動隨父容器縮放。
158
+
159
+ ### 內部元素比例
160
+
161
+ 不論哪個模式,內部 icon 和 text 都按相同比例:
162
+
163
+ | 元素 | 公式 | 範例(size=32) |
164
+ |---|---|---|
165
+ | Icon | `round_even(size × 0.6)`(fill 模式用 `width:60% height:60%`) | 20px |
166
+ | Text fallback 字體 | `round(size × 0.5)`(fill 模式用 `font-size:50cqi`) | 16px |
167
+
168
+ - Icon 60%:業界標準(Material Design、Apple HIG)
169
+ - Text 50%:業界標準(Material Design、GitHub),且自動對齊我們的字體 scale(10→12→16→20px) <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
170
+
171
+ ### 常用尺寸參考
172
+
173
+ 由 item-layout 消費元件決定:
174
+
175
+ | 場景 | Avatar 用法 |
176
+ |---|---|
177
+ | Menu item / List item inside prefix slot | `<Avatar size="fill" />`(讓父 prefix 控制尺寸) |
178
+ | 獨立使用(page header user avatar 等) | `<Avatar size={40} />`(顯式指定 px) |
179
+
180
+ ---
181
+
182
+ ## 圓 vs 方的語意判斷
183
+
184
+ | Shape | 用途 |
185
+ |---|---|
186
+ | `circle`(預設) | 人物(照片、姓名) |
187
+ | `square` | 實體(專案、組織、App、品牌) |
188
+
189
+ **判斷標準:「這個 avatar 代表一個人,還是一個東西?」** 圓角 token 見 `.tsx` cva。
190
+
191
+ ---
192
+
193
+ ## 背景色
194
+
195
+ Icon 和 Text 模式使用 primitive step-1 subtle 背景 + 對應 step-7 前景色。`solid` boolean prop 可切換為 step-6 全色背景 + 白色前景。
196
+
197
+ 與 Tag 元件完全對齊——所有有色 variant 直接使用 primitive token(`--color-blue-*`、`--color-deep-orange-*` 等),不使用 semantic token(`--primary`、`--error`)。Avatar 的「blue」代表藍色本身,不代表「主要操作」語義。neutral 用 `foreground`,有色用 primitive step-7(`--color-{hue}-7`)優先辨識度。
198
+
199
+ **注意**:`red` variant 使用 primitive `deep-orange`(`--color-deep-orange-*`)。
200
+
201
+ ### Subtle(預設,`solid=false`)
202
+
203
+ | Color | 背景 | 前景 |
204
+ |---|---|---|
205
+ | neutral(預設) | `--muted` | **`--foreground`** |
206
+ | blue | `--color-blue-1` | `--color-blue-7` |
207
+ | red | `--color-deep-orange-1` | `--color-deep-orange-7` |
208
+ | green | `--color-green-1` | `--color-green-7` |
209
+ | yellow | `--color-yellow-1` | `--color-yellow-7` |
210
+ | turquoise | `--color-turquoise-1` | `--color-turquoise-7` |
211
+ | purple | `--color-purple-1` | `--color-purple-7` |
212
+ | magenta | `--color-magenta-1` | `--color-magenta-7` |
213
+ | indigo | `--color-indigo-1` | `--color-indigo-7` |
214
+
215
+ ### Solid(`solid=true`)
216
+
217
+ step-6 全色背景 + 白色前景,適合需要更強視覺權重的場景。
218
+
219
+ | Color | 背景 | 前景 |
220
+ |---|---|---|
221
+ | neutral | `--color-neutral-9` | `--inverse-fg` |
222
+ | blue | `--color-blue-6` | white |
223
+ | red | `--color-deep-orange-6` | white |
224
+ | green | `--color-green-6` | white |
225
+ | yellow | `--color-yellow-6` | **`--warning-foreground`** |
226
+ | turquoise | `--color-turquoise-6` | white |
227
+ | purple | `--color-purple-6` | white |
228
+ | magenta | `--color-magenta-6` | white |
229
+ | indigo | `--color-indigo-6` | white |
230
+
231
+ **yellow 例外**:yellow solid 背景亮度高,白字對比不足,改用 `--warning-foreground`(深色文字)。
232
+
233
+ Image 模式不顯示背景色(圖片填滿),`solid` prop 無效果。
234
+
235
+ ---
236
+
237
+ ## Disabled
238
+
239
+ Avatar 在 disabled 元件內使用 `opacity-disabled`(由宿主元件控制,非 Avatar 自身 prop)。詳見 `color.spec.md` 的 Disabled 狀態。
240
+
241
+ ---
242
+
243
+ ## Overlay:Status dot OR Count badge(擇一,不並存)
244
+
245
+ Avatar 支援兩個 overlay API(`status` / `badgeCount`),**但同時只能用一個** — 對齊 **Badge canonical「一個 anchor 最多 1 個 indicator」原則**(2026-04-21 決策,user AR22)。
246
+
247
+ **為什麼不並存**:即使 status(presence dot)是 Avatar 內部 SVG 非 `<Badge>` 元件,視覺上 user 仍會把兩個右角落的小圓點視為「兩個訊號」。並存違反 **signal crowding** 原則(使用者無法判斷哪個訊號重要),對齊 Badge canonical 統一規則。
248
+
249
+ | Overlay | Prop | 元件本體 | 位置 | 語義 | 世界級對照 |
250
+ |---------|------|---------|------|------|-----------|
251
+ | Status dot(presence)| `status="online"/"away"/"busy"/"offline"` | **Avatar 內部 SVG**(非 Badge) | **右下角**(circle avatar 圓周 45°) | 此人現在線上狀態 | Slack / Teams / Discord |
252
+ | Count badge(通知)| `badgeCount={N}` | **`<Badge variant="critical">`**(此 anchor 唯一 Badge) | **右上角** | 此對話 / 此使用者有 N 條新事件 | iMessage / Slack thread / LINE / WhatsApp |
253
+
254
+ **為什麼不同角**:語義不衝突但不同面向——presence 是「這個人是誰 + 狀態」(右下跟著臉看);count 是「關於此對話的未讀量」(右上是視覺掃描 inbox 的自然落點)。世界級 chat app 把兩者分開,**不疊在同一角**。
255
+
256
+ **為什麼 status 做 Avatar 內部 SVG 而不是 `<Badge dot>`**:兩者語義完全不同——presence 是「這個人的狀態」,Badge 是「計數 / 通知緊急度」。若用 Badge 承載 presence,color token 會混用(Badge 有 low/medium/high/critical 對應緊急度,presence 有 online/busy/away/offline 對應狀態;強行映射會失真);brand 也無法獨立調 presence 色而不動 Badge 色。世界級 Slack / Teams / Discord 同樣把 presence dot 做成 avatar 自有 primitive,不走 badge 系統。
257
+
258
+ ### Status dot 尺寸與比例
259
+
260
+ - `dotSize = clamp(8, round(avatarSize × 0.28), 16)` — 28% 是 Slack / Teams 世界級平均
261
+ - Floor 8:小 avatar(24-28px)下可辨識但不喧賓奪主(若 floor 10 → 24px avatar 的 dot 占 42% 太大)
262
+ - Ceiling 16:64px+ 的大 avatar 不讓 dot 過度放大,保持「輔助指示器」視覺權重
263
+ - Border ring:2px(dotSize < 12)/ 3px(dotSize ≥ 12)— 在 surface 背景上把 dot 從 avatar 邊緣分離
264
+
265
+ ### Status 顏色 token(presence namespace)
266
+
267
+ 走 semantic token `--status-online / --status-busy / --status-away / --status-offline`,**不直接用 success / error / warning**。理由:presence 跟「操作成功 / 錯誤 / 警告」是不同語境,token 獨立讓 brand 可以只調整 presence 色(例:把 online 改霓虹綠)不動到 success。
268
+
269
+ ### Count badge 實作
270
+
271
+ Avatar `badgeCount` 內部消費 DS `<Badge variant="critical" max={99}>`,加上 `-top-1 -right-1` 偏移與 surface 色 2px border ring 分離邊界。`badgeCount <= 0` 不渲染(0 或 undefined 皆空)。
272
+
273
+ **為什麼預設 `critical`(紅)**:計數 on avatar 在世界級 chat app 的慣例就是「待處理未讀」,紅色是約定俗成的 attention 色;需要其他 variant 的少見情境,consumer 自己 compose `<Avatar>` + `<Badge>` top-right 手刻(不開 prop 避免多選擇認知負擔)。
274
+
275
+ ---
276
+
277
+ ## 禁止事項
278
+
279
+ - ❌ 不要用 Avatar 當裝飾——每個 Avatar 必須代表一個明確的身份
280
+ - ❌ 不要手動指定 icon 尺寸——60% 自動計算
281
+ - ❌ 不要用 square 給人物——人用 circle,東西用 square
282
+ - ❌ 不要省略 `alt`——即使有 `src`,`alt` 是圖片失敗時的 fallback 來源
283
+
284
+ ---
285
+
286
+ ## A11y 預設
287
+
288
+ - **`alt` 必傳**:即使有 `src`,`alt` 是 image fallback / SR 訊號雙重來源。Person avatar `alt` 應含 name + presence(例 `"Alan Chen (online)"`),entity avatar 用品牌 / 專案名,純裝飾(極罕見)用空字串 `alt=""`(`aria-hidden`)。
289
+ - **無 `alt` 時 fallback**:image 模式自動降級 initials / icon;一律不靜默渲染無 SR 標的元素。
290
+ - **Status dot SR 處理**:status dot 內部 span `aria-hidden`(presence 訊號整合進 parent `alt`),避免 `role="status"` live region 在 member list 造成 SR 洪水(詳「Status dot a11y」段)。
291
+ - **`badgeCount` 語意**:內部消費 `<Badge>`,Badge 自帶 `aria-label="N 則未讀"` 等語義(詳 `badge.spec.md`);`badgeCount={0}` 不渲染避免空 announce。
292
+ - **HoverCard 整合**:Avatar 帶 `hoverCard` prop 時自動 `tabIndex=0` + `role="button"` + `aria-haspopup="dialog"` + `focus-visible:ring-2`,確保 keyboard user 能 Tab 進入觸發 NameCard popover(詳「Keyboard 可達 canonical」段)。
293
+ - **Image alt 語意**:meaningful image(person photo / brand logo)用實質 `alt`;decorative-only(極少)走 `alt=""`,但 Avatar 本質是身份識別,decorative 用法應改用 Icon 元件。
294
+
295
+ ---
296
+
297
+ ## 為何無 StateBehavior
298
+
299
+ Avatar 是**身份視覺 primitive**(顯示人 / 組織 / 物件的代表視覺),本身**非互動元件**:
300
+
301
+ - 無 hover / focus / active / selected / disabled 這類 state。
302
+ - disabled 由宿主元件透過 `opacity-disabled` 控制(見本 spec「Disabled」段),不是 Avatar 自身的 state。
303
+ - hover 行為(彈 NameCard)由 `hoverCard` prop 委託給 HoverCard primitive 處理,屬 HoverCard 的 state 不屬 Avatar。
304
+
305
+ 對應 anatomy story:保留 `Overview` + `Inspector` + `ColorMatrix` + `SizeMatrix`。
306
+
307
+ ---
308
+
309
+ ## 空值 / 驗證
310
+
311
+ N/A(非互動 primitive,consumer 決定何時渲染;`src` 為 null / 載入失敗時 fallback 到 initials)。
312
+
313
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
314
+
315
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
316
+
317
+ - `file-item.spec.md`
318
+ - `hover-card.spec.md`
319
+ - `menu-item.spec.md`
320
+ - `overflow-indicator.spec.md`
321
+ - `people-picker.spec.md`
322
+
323
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
324
+
325
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
326
+
327
+ - `motion.spec.md`
328
+ - `opacity.spec.md`
329
+ - `uiSize.spec.md`