@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,171 @@
1
+ ---
2
+ component: NameCard
3
+ family: composite
4
+ traits:
5
+ - isInternal
6
+ variants: {}
7
+ sizes: {}
8
+ benchmark:
9
+ - Polaris MediaCard: github.com/Shopify/polaris/tree/main/polaris-react/src/components/MediaCard
10
+ - MUI Card: github.com/mui/material-ui/tree/master/packages/mui-material/src/Card
11
+ ---
12
+
13
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
14
+
15
+ # NameCard 設計原則
16
+
17
+ 人員 HoverCard 的內容元件。提供統一的人員資訊展示格式,作為 HoverCard 的 content 消費者。
18
+
19
+ **實作基礎**:組合元件——Avatar + Text + Button 配 HoverCard 浮層。NameCard 本身不含觸發或定位邏輯(那是 HoverCard 的職責),只是 HoverCard content 的標準人員模板。
20
+
21
+ **Layout Family**:非上述 family — composite(Avatar prefix + text block + action suffix,組合自 HoverCard content 內部;跨 section 垂直堆疊由 `border-t border-divider` 分隔,不屬 Family 1-4 的任何單行結構)。
22
+
23
+ ---
24
+
25
+ ## 何時用
26
+
27
+ - **Avatar hover 顯示人員詳情**:留言者 / 指派者 / 成員列表 hover 彈出詳細資訊
28
+ - **@提及互動**:`@username` hover 顯示該使用者的 card
29
+ - **團隊 / 成員快速預覽**:Settings 頁的成員列表、PR reviewer 清單的 hover 預覽
30
+ - **需要快速動作的人員資訊**:NameCard 可放 CTA button(Message / Invite / Follow)
31
+
32
+ ## 何時不用
33
+
34
+ | 場景 | 改用 | 原因 |
35
+ |------|------|------|
36
+ | 點擊進入人員 profile 頁 | `<a>` 或 Link | Navigation 不需 hover card 的浮層 |
37
+ | 人員清單 row(不需要 hover 展開詳情)| `Avatar` + inline text | NameCard 是 hover content,list row 不需要 |
38
+ | 單純顯示一個名字 | `Avatar` + `Text` | NameCard 是完整資訊卡,單名字用更輕量元件 |
39
+ | 複雜人員表單(編輯角色 / 權限)| `Dialog` 或專用頁面 | NameCard 是快速預覽,不承載複雜互動 |
40
+
41
+ ## 結構
42
+
43
+ NameCard 是**三層 chrome 結構**(2026-04-23 canonical):
44
+
45
+ ```
46
+ ┌─────────────────────────────┐
47
+ │ HEADER(固定,shrink-0) │ ← Profile(Avatar + Name + Subtitle)+ Actions(選用)
48
+ ├─────────────────────────────┤
49
+ │ BODY(flex-1,可垂直捲動) │ ← Status section(v12 conditional)+ Info fields(always-render)
50
+ │ ↕ 空間不足時此區 ScrollArea │ Status undefined → 整 status block skip
51
+ ├─────────────────────────────┤
52
+ │ FOOTER(固定,shrink-0) │ ← View more(hover context 必含,詳「View more canonical」)
53
+ └─────────────────────────────┘
54
+ ```
55
+
56
+ - **Header 固定**:Profile + Actions 一體,**不捲動**(使用者的視覺 anchor:誰 + 可對他做什麼)
57
+ - **Body 可捲動**:Status section + Info fields。以 `<ScrollArea>` 包(cross-OS overlay 捲軸)
58
+ - **Footer 固定**:View more **永遠可見**(hover preview 的 escape hatch 到完整 profile)
59
+
60
+ **Status section v12 conditional rule(2026-05-14 user 拍板)**:`status` 在 production 一定會被設定(每個 user 都有 presence state)。如果 status undefined,**唯一可能性 = 資料還沒讀到(loading transient)**,**不**是「user 沒設定狀態」。所以 status undefined 期間 → **整 status block 隱藏**(等資料到才 render),**禁** render「Status not set」這種 placeholder 文字(語義錯,user presence 不會「沒設定」)。**此規則 NameCard-specific 不外推至 DS 其他元件**(FileItem / DescriptionList / DataTable cell 各自 placeholder 邏輯 unrelated)。
61
+
62
+ **取消「精簡版」變體**:NameCard 只有**一種結構**,consumer 未傳的 section 不另開 minimal variant。世界級對照:Slack / GitHub / LinkedIn hover-profile 皆單一結構,不分「簡版/full 版」。
63
+
64
+ **DS-wide PersonData 預設展示一致 canonical**:任何 PersonData 來源展示 NameCard 時,`description` / `fields` 預設都應提供;`status` / `statusMessage` opt-in(僅 loading transient 或 consumer mock data 才會缺,production data 必有)。
65
+
66
+ Section 之間用 `border-t border-divider` 分隔(見 `separator.spec.md`「元件固定結構 → CSS border-t/b」)。詳細 class / padding token 見 `name-card.tsx`。
67
+
68
+ <!-- 2026-05-18 D2 fix:width SSOT 統一 320(對齊 tsx `w-[320px]`)。本檔之前 L150 殘留「280px」自相矛盾已撤,只保留 L72 320 canonical。 -->
69
+
70
+ **View more 按鈕 padding**:固定 `py-3`(12px),比 Body `py-3` 同位 — 讓 footer 有明顯呼吸空間,不跟 body section 邊界混淆。
71
+
72
+ ## 寬度(元件級常數)
73
+
74
+ NameCard 固定 **320px 寬**(見 `.tsx` 的 `w-[320px]`)——HoverCard 浮層寬度由 NameCard 決定,不隨內容伸縮(避免 hover 時浮層寬度跳動)。
75
+
76
+ 對照世界級:Material Snackbar 固定 344px、Slack message modal 固定寬度——**單一元件的 canonical 寬度屬於該元件自己的 design spec,不抽為跨元件 token**。Token 系統只管共享值(如 `--field-height-*`、`--layout-space-*`);單一元件獨有的結構常數留在 component code + 本 spec。 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
77
+
78
+ ## Action 行(2026-04-20 canonical)
79
+
80
+ Action 區的 layout **永遠等寬均分容器寬度**——multiple actions 每個 Button 取相同 `1fr` 寬、single action 撐滿整個 NameCard width。實作 = `grid grid-flow-col auto-cols-fr gap-2` + `[&>*]:w-full` 強制每個 child fill grid cell。
81
+
82
+ ```
83
+ [ Chat ][ Audio call ▾ ] ← 2 個 action:各 50%
84
+ [ Message ] ← 1 個 action:100%
85
+ [ Follow ][ Message ][ ...] ← 3 個 action:各 33%
86
+ ```
87
+
88
+ **為什麼等寬均分**:
89
+ - NameCard 是**人員關係卡**,action 是 relationship actions(Chat / Audio / Message / Follow)——這類動作視覺權重對等,無主次之分,等寬最直覺
90
+ - Single action 撐滿讓「行動列」永遠占滿 card 底部,視覺節奏一致(不會「單一 button 孤零零縮在左邊」)
91
+ - 世界級對照:iOS Contact card / macOS Contact / LinkedIn profile card / Slack profile modal 的 action row——全部等寬 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
92
+
93
+ **Consumer 跨 story / 跨 consumer 必須用同一組 canonical actions**:
94
+
95
+ NameCard 的 default actions **是 `Chat + Audio call`**(chat app 標配,對齊 name-card.stories.tsx 的 `actionButtons` 常數)。story / principles / consumer code 不要每個範例改成不同 action——同一個元件在不同 demo 下出現 3 種不同 action 組合,讓 consumer 誤以為 action 會隨情境自動變。**例外**:要展示 single-action / 3-action 數量差異時才改,並明示「這是展示 action 數量變化」。
96
+
97
+ ## Profile Header
98
+
99
+ - **Avatar**:透過 Avatar `status` prop 顯示狀態圓點(見 `avatar.spec.md`)
100
+ - **Text column 對齊**:最小高度對齊 avatar 高度——短文字(單行名字)垂直置中於 avatar;長文字(多行名字 + subtitle)自然撐高
101
+ - **字級層級**:Name > Subtitle;name 為 strong weight,subtitle 為 secondary color
102
+
103
+ ## Status 區
104
+
105
+ 非互動狀態標籤以 `bg-muted` 承載(不用 `bg-secondary`——Muted 視覺重量更低,對齊 Badge / Skeleton family)。狀態點顏色走 `--status-*` presence token(2026-04-20):`online` / `away` / `busy` / `offline`——跟 Avatar status 同源、獨立於 success/warning/error(presence 不是 validation state)。訊息必須包在 `<DescriptionList>` 內以 `<DescriptionItem>` 呈現(不可孤立 dt/dd),clamp 兩行避免無限伸展。
106
+
107
+ ## Info Fields
108
+
109
+ 使用 `DescriptionList cols={2}`,適合展示 ID、員工編號等短屬性。
110
+
111
+ ## View More
112
+
113
+ `Button variant="link" size="sm" className="w-full"`——填滿容器寬度的文字按鈕。位於獨立的 bordered section(`border-t border-divider`),`py-2` 較緊湊。
114
+
115
+ 只在傳入 `onViewMore` callback 時顯示。
116
+
117
+ ## 設計決策
118
+
119
+ - **固定寬度而非 min/max**:HoverCard 內容量可預期,固定寬度避免不同人員 card 寬度跳動
120
+ - **Section 用 border-t 分隔**:清晰的資訊分區,每個 section 獨立存在或不存在
121
+ - **Status badge 用 muted 而非 interactive 色**:狀態是展示資訊,不可點擊,不應暗示互動性
122
+
123
+ ---
124
+
125
+ ## 禁止事項
126
+
127
+ - ❌ 不要在 HoverCard 外直接用 NameCard 當 standalone card——它不是獨立 Card primitive,是 HoverCard content 模板,缺少浮層外殼(radius / border / shadow)與定位邏輯。需要 card 佈局時用專屬元件或自組 Surface
128
+ - ❌ 不要硬寫內部 Avatar size——NameCard Profile Header 的 avatar 尺寸由元件內部規格決定,consumer 覆寫會破壞 text column 對齊公式
129
+ - ❌ 不要 override HoverCard `z-index` / `sideOffset` / `collisionPadding`——浮層行為由 `../HoverCard/hover-card.spec.md` + `../../patterns/overlay-surface/overlay-surface.spec.md` 管理,單獨 override 會破壞跨浮層的一致 stacking
130
+ - ❌ 不要把非人員資料塞進 NameCard(例如檔案預覽、物件資訊)——NameCard 是人員專屬模板,語意不可挪用;其他 hover 詳情請自組 HoverCard content
131
+ - ❌ Status section 的狀態點不要自訂色——走 `--status-online/away/busy/offline` presence token canonical,與 Avatar status 同源,改色會跨元件漂移
132
+ - ❌ Action button 不要放動詞性 icon-only(例 Trash2 刪除)——NameCard actions 是關係型快速動作(Message / Invite / Follow),破壞性操作應走 Dialog confirm flow
133
+
134
+ ---
135
+
136
+ ## A11y 預設
137
+
138
+ > 命名對齊 DS canonical(2026-05-18,per `# 命名與語言一致性`)。本節原標題「無障礙」,改「A11y 預設」與其他 spec 一致。
139
+
140
+ - **Trigger 整合**:Avatar 作為 HoverCard trigger 時,`onFocus` / `onBlur` 與 mouseenter/leave 同時觸發由 Radix HoverCard 管理——鍵盤使用者 Tab 到 avatar 可自動顯示 card,Escape 關閉
141
+ - **Focus 順序**:NameCard 內若有 Action button,Tab 順序為 trigger(Avatar)→ 第一個 action → 後續 action → view more;不抓取 focus 進入浮層(保留 Radix `HoverCard` 預設語意,與 Popover 的 focus trap 不同)
142
+ - **Live region 語意**:NameCard 是展示內容,非 announcement,不套 `aria-live`
143
+ - **DL 語意**:Info Fields 使用 DescriptionList(`<dl>/<dt>/<dd>`),screen reader 會讀成「term X, description Y」對話;詳見 `../DescriptionList/description-list.spec.md`「無障礙」段
144
+ - **CTA button aria-label**:icon-only action button 必須帶 `aria-label`(「傳訊息給 {name}」「加入 {name} 為好友」),不只是 icon 視覺
145
+ - **色彩對比**:Status badge `bg-muted` + `text-foreground` / Avatar status 圓點均通過 WCAG AA,不依賴單一色彩載體(搭配文字標籤)
146
+
147
+ ---
148
+
149
+ ## 為何無 Inspector / SizeMatrix
150
+
151
+ - **無 Inspector**:NameCard 的決策維度是「section 組合」(avatar + profile / status / info / viewMore 的開關)——互動 Inspector 切換 toggle 可以做,但 `SectionMatrix` 的 side-by-side 矩陣(最簡 → 中 → full)對 consumer 的判斷更直接(「什麼 section 組合適合什麼 context」)。多維組合用矩陣呈現比單組合互動玩耍有效。
152
+ - **無 SizeMatrix**:NameCard 固定 **320px 寬**(元件級常數,見本 spec「寬度」段),跨 consumer / variant 不變——人員資訊卡的 canonical width 屬於元件自身,不抽為 token。Section 高度由內容撐開,無 size tier。
153
+
154
+ 對應 anatomy story:保留 `Overview` + `SectionMatrix` + `ColorMatrix`(Status 色) + 元件特有 `HoverCardIntegration`(canonical usage pattern) + `StateBehavior`(空值 / 過長文字邊界)。
155
+
156
+ ---
157
+
158
+ ## 相關
159
+
160
+ - `../HoverCard/hover-card.spec.md` — NameCard 的浮層容器(觸發與定位由 HoverCard 負責)
161
+ - `../Avatar/avatar.spec.md` — Profile header 的身份視覺(Avatar 的 `hoverCard` prop 自動整合 NameCard)
162
+ - `../Tooltip/tooltip.spec.md` — 純文字 hover 提示(NameCard 是可互動 hover content)
163
+ - `../DescriptionList/description-list.spec.md` — Info fields 的 label / value 佈局
164
+ - `../Button/button.spec.md` — Action button(Message / Invite 等 CTA)
165
+
166
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
167
+
168
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
169
+
170
+ - `people-picker.spec.md`
171
+ - `tag.spec.md`
@@ -0,0 +1,149 @@
1
+ ---
2
+ component: Notice
3
+ family: 2
4
+ variants: {}
5
+ sizes: {}
6
+ traits:
7
+ - isInternal
8
+ benchmark:
9
+ - Ant Design Alert: github.com/ant-design/ant-design/tree/master/components/alert
10
+ - Polaris Banner: github.com/Shopify/polaris/tree/main/polaris-react/src/components/Banner
11
+ - Carbon Notification: github.com/carbon-design-system/carbon/tree/main/packages/react/src/components/Notification
12
+ ---
13
+
14
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
15
+
16
+ # Notice 設計原則
17
+
18
+ **Toast / Alert 共用的視覺佈局層**——跟 MenuItem 為 SelectMenu / DropdownMenu 共用是同一個架構概念。Notice 只負責 layout 和 icon 選擇,色彩由消費者透過 `data-theme` 控制。
19
+
20
+ ## 定位
21
+
22
+ Notice 是純視覺 primitive,不是獨立使用的元件。消費者:
23
+ - **Toast**:浮動 + 自動消失(Sonner)
24
+ - **Alert**:inline / fixed 持久通知
25
+
26
+ **Layout Family**:CLAUDE.md 4-Family Model **Family 2(List item layout)** 消費者。結構繼承 `patterns/element-anatomy/item-anatomy.spec.md`「List item layout」章節的 reading-mode 規格。Notice 語意為 notification(非 row collection),但視覺排版遵循 Family 2 確保跨元件視覺一致。
27
+
28
+ **尺寸偏離(documented exception)**:Notice / Alert / Toast **單一固定 size**,**不**實作 Family 2 baseline 的 sm/md/lg。世界級共識(Material Banner/Snackbar、Polaris Banner、Atlassian InlineMessage、GitHub Flash)都是**單一 prominent size**——通知的使命是「搶注意」而非「在密度選擇裡協調」,提供 size 選項反而會讓 consumer 糾結(該用哪個 size?)而稀釋元件的目的性。同理 padding 也不隨 density 變(`px-4 py-3` 固定)——通知是跨 density 一致的訊息載體。 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
29
+
30
+ ## Typography
31
+
32
+ md tier,固定不隨 density 變:
33
+ - title: `text-body`(14px)`leading-compact`(1.3)— 有 description 時加 `font-medium`
34
+ - description: `text-body`(14px)`leading-compact` + `text-fg-secondary`(neutral-8)
35
+
36
+ 相同 body 字級,層級靠 font-weight / color 區分。
37
+
38
+ ## Padding(固定)
39
+
40
+ | 屬性 | 值 | 理由 |
41
+ |---|---|---|
42
+ | px | `px-4`(16px) | 世界級系統共識(Atlassian/GitHub/Material/Linear 都是 16px) | <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
43
+ | py | `py-3`(12px) | 介於 row(7px)和 section(16px)之間,通知的 sweet spot |
44
+ | gap | `gap-2`(8px) | 跟 item-layout icon-text gap 一致 |
45
+
46
+ 不隨 density 變——Toast/Alert 是通知,不是工作區域元件。
47
+
48
+ ## Layout
49
+
50
+ item-layout 4-slot:
51
+ ```
52
+ [status icon?] [title + description?] [endContent?] [dismiss X?]
53
+ ```
54
+
55
+ - Icon: 16px,`h-[1lh]` inline 對齊 first line
56
+ - Dismiss X: `<Button iconOnly dismiss size="xs" />` — chrome corner action group region(Cat 3)。xs 是 **Notification banner family canonical**(Notice / Alert / Toast inherit):ephemeral banner `px-4 py-3` 固定不隨 density,dismiss 邊角小 affordance 輕量不搶眼。詳見 `patterns/overlay-surface/overlay-surface.spec.md`「Chrome dismiss size canonical — 三家族分類」+ `patterns/element-anatomy/item-anatomy.spec.md`「Dismiss canonical — X close only」
57
+ - endContent: 通常放 `<Button variant="tertiary" size="xs">`
58
+
59
+ ## Variant
60
+
61
+ | Variant | Icon | 語意 |
62
+ |---|---|---|
63
+ | neutral | 無 | 一般訊息 |
64
+ | info | Info(ℹ) | 資訊提示 |
65
+ | success | CircleCheck(✓) | 操作成功 |
66
+ | warning | TriangleAlert(⚠) | 警告 |
67
+ | error | XCircle(✕) | 錯誤 |
68
+
69
+ ## Theme 策略
70
+
71
+ Notice **不設** bg 和 text color。消費者在 container 設 `data-theme` + `text-foreground`,Notice 內所有 token 自然適配。
72
+
73
+ 消費者的 data-theme 策略:
74
+
75
+ | 場景 | data-theme | text 結果 |
76
+ |---|---|---|
77
+ | 有色相 solid(info/success/error) | `"dark"` | neutral-9 = 白 |
78
+ | warning solid | `"light"`(永遠) | neutral-9 = 黑 |
79
+ | neutral solid | `{inverse}`(跟頁反) | 跟隨翻轉 |
80
+ | subtle | 不設(跟隨頁面) | 跟隨頁面 |
81
+
82
+ ### 為什麼 data-theme 要搭配 text-foreground
83
+
84
+ CSS `color` 從 body 繼承的是**已解析的計算值**,不是 `var(--foreground)` 表達式。`data-theme` 改變 `--foreground` 的值,但不改 `color` 屬性。在 theme boundary 設 `text-foreground` class 強制 `color: var(--foreground)` 在正確 context 重新解析。
85
+
86
+ ## 何時用 / 何時不用
87
+
88
+ **Notice 是 internal primitive**——不直接使用,透過 `Alert` / `Toast` 等外層通知元件消費。
89
+
90
+ | 場景 | 正確做法 |
91
+ |------|---------|
92
+ | Inline / fixed 持久通知 | 用 `Alert`(內部消費 Notice)|
93
+ | 浮動自動消失的短暫通知 | 用 `Toast`(內部消費 Notice + sonner)|
94
+ | 直接在 JSX 中用 `<Notice>` | ❌ **禁止**——失去 Alert / Toast 外層的生命週期與定位管理 |
95
+
96
+ ### 消費者
97
+
98
+ - `../Alert/alert.spec.md` — inline / fixed 持久通知
99
+ - `../Toast/toast.spec.md` — 浮動非阻斷短暫通知
100
+
101
+ ---
102
+
103
+ ## 為何無 SizeMatrix / ColorMatrix
104
+
105
+ Notice 是 **Toast / Alert 共用的 layout primitive**,刻意不擁有尺寸與色彩變體:
106
+
107
+ - **無 SizeMatrix**:Notice / Alert / Toast **單一固定 size**(見本 spec「尺寸偏離」段),不實作 Family 2 baseline 的 sm/md/lg——通知的使命是「搶注意」而非「在密度選擇裡協調」。padding 固定 `px-4 py-3`,typography 固定 md tier(14px),不隨 density 變。
108
+ - **無 ColorMatrix**:Notice 本身**不設 bg / text color**(見本 spec「Theme 策略」段),色彩完全由 consumer(Alert / Toast)透過 `data-theme` + `text-foreground` 控制。Notice 層級的色彩矩陣沒有意義——視覺對照屬於 consumer 的職責,應查 `alert.anatomy.stories.tsx` 與 `toast.anatomy.stories.tsx` 的 ColorMatrix。
109
+
110
+ 對應 anatomy story:保留 `Overview` / `Inspector` / `StateBehavior`,額外追加元件特有的 `VariantIconMap`(展示 5 種 variant 對應的 status icon + 語意)。
111
+
112
+ ---
113
+
114
+ ## 邊界案例
115
+
116
+ - **Disabled(dismiss button)**:Notice 本身不擁有 disabled state(internal primitive,無互動);內嵌的 `<Button iconOnly dismiss size="xs" />` 自動繼承 Button disabled 視覺(`text-fg-disabled` + `cursor-not-allowed`)。Consumer(Alert / Toast)若需 disable dismiss,應透過 consumer-level prop pass-through。
117
+ - **Loading**:Notice 非 async surface,無 loading state。Body 內若 consumer 注入 CTA Button,該 Button 自行處理 loading。
118
+ - **Empty**:Notice 必有 title 或 description 其一(消費合約);無 title-only icon-less 形態,layout 至少 1 行內容。
119
+ - **Icon-only / variant=neutral**:`neutral` variant 不渲 status icon,layout 自動收斂為 `[title + description?] [endContent?] [dismiss X?]` 三 slot。
120
+
121
+ ---
122
+
123
+ ## 相關
124
+
125
+ - `../Alert/alert.spec.md` — 主要消費者(持久通知)
126
+ - `../Toast/toast.spec.md` — 主要消費者(短暫通知)
127
+ - `../../patterns/element-anatomy/item-anatomy.spec.md` — Notice 的 layout 共用規則
128
+ - `../../tokens/color/color.spec.md` — color tokens 和 variant × theme 策略
129
+ - `../../tokens/color/primitives.css` — primitives nested theme(`:root, [data-theme]` pattern)
130
+
131
+ ## A11y 預設
132
+
133
+ **ARIA / Pattern**:對齊 [W3C ARIA Authoring Practices Guide](https://www.w3.org/WAI/ARIA/apg/patterns/) 對應 pattern。
134
+
135
+ **Keyboard 行為**:
136
+
137
+ - Tab — focus dismiss button(若 dismissible)
138
+ - Esc — dismiss(若 dismissible)
139
+
140
+ **Focus**:focus-visible ring 對齊 DS canonical(`outline: 2px solid var(--ring)`);focus management 由元件 own。
141
+
142
+ **驗證**:Storybook a11y addon panel 應 0 critical violation;鍵盤完整可操作(無需滑鼠)。WCAG AA contrast ≥ 4.5:1(text)/ 3:1(UI)。
143
+
144
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
145
+
146
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
147
+
148
+ - `bulk-action-bar.spec.md`
149
+ - `coachmark.spec.md`
@@ -0,0 +1,126 @@
1
+ ---
2
+ component: NumberInput
3
+ family: 4
4
+ variants: {}
5
+ sizes: {}
6
+ traits:
7
+ - hasInteractiveStates
8
+ - isInputLike
9
+ benchmark:
10
+ - Ant Design InputNumber: github.com/ant-design/ant-design/tree/master/components/input-number
11
+ - MUI TextField (number): github.com/mui/material-ui/tree/master/packages/mui-material/src/TextField
12
+ ---
13
+
14
+ # NumberInput 設計原則
15
+
16
+ ## 定位
17
+
18
+ NumberInput 是**數值的**輸入與顯示元件。格式化邏輯:`toLocaleString()` + prefix/suffix + precision。
19
+
20
+ 共用規則見 `../Field/field-controls.spec.md`。本文件只記錄 NumberInput 特有的原則。
21
+
22
+ **Layout Family**:CLAUDE.md 4-Family Model **Family 4(Field control layout)** 消費者。結構繼承 `components/Field/field-controls.spec.md` 的 `fieldWrapperStyles + [startIcon?] [<editable>] [endAction?]` 規格,視覺對齊 Family 1(Menu item)讓 SelectMenu trigger + options 連續一致。
23
+
24
+ ---
25
+
26
+ ## 何時用
27
+
28
+ - **所有數值資料**:金額、數量、百分比、比率、測量值、年齡、計數
29
+ - **需要格式化的 value**:千分位(`1,234,567`)、貨幣前綴(`$2,490`)、百分比後綴(`85.5%`)、小數精度(`0.00`)
30
+ - **需要 locale-aware 顯示**(`toLocaleString()` 自動處理千分位分隔符、小數點形式)
31
+ - **DataTable 的數值欄位**(right-aligned + 自動格式化)
32
+
33
+ ## 何時不用
34
+
35
+ | 場景 | 改用 | 原因 |
36
+ |------|------|------|
37
+ | 純文字 / 看起來像數字的字串(電話、郵遞區號)| `Input` | 電話不是算術型數字,不需要千分位 / 不該用 step |
38
+ | 日期 / 時間戳 | `DatePicker` | 需要日期語意和 picker 互動 |
39
+ | 視覺調整數值(音量、亮度、滑動調整)| `Slider` | 使用者目標是「感受」而非「輸入精確值」 |
40
+ | 大量帶小數的科學計算 | `Input` + 自訂驗證 | 極端精度需求超出 NumberInput 格式化能力 |
41
+
42
+ ---
43
+
44
+ ## 格式化選項
45
+
46
+ | 選項 | 說明 | 範例 |
47
+ |------|------|------|
48
+ | `prefix` | 前綴字串(如貨幣符號) | `$2,490` |
49
+ | `suffix` | 後綴字串(如百分比) | `85.5%` |
50
+ | `precision` | 小數位數 | `85.50` |
51
+ | `locale` | 數字格式 locale | 預設 `en-US` |
52
+
53
+ ## 對齊
54
+
55
+ - **Edit 模式(input)**:靠左——input 內打字是左到右
56
+ - **Table cell(Display)**:靠右——縱向比較位數需要右對齊(由 DataTable 的 column type `number` / `currency` 控制)
57
+
58
+ ## Display
59
+
60
+ `<NumberInput mode="display">` 在 table cell 和 Form readonly 共用 `formatNumber()` 格式化函式。
61
+
62
+ - 有值:格式化輸出(prefix + localized number + suffix)
63
+ - null / undefined:`—`(em dash),`text-fg-muted`
64
+
65
+ ## DataTable 整合
66
+
67
+ ```tsx
68
+ // 自動格式化——不需要手寫 cell
69
+ col.accessor('price', {
70
+ header: 'Price',
71
+ meta: { type: 'currency', prefix: '$' },
72
+ })
73
+ ```
74
+
75
+ `currency` 類型預設 `prefix: '$'`,其餘等同 `number`。
76
+
77
+ ---
78
+
79
+ ## Mode / Validation / a11y
80
+
81
+ 詳見 `../Field/field-controls.spec.md`(Mode / Validation)+ `../Field/form-validation.spec.md`(驗證時機)。
82
+
83
+ ---
84
+
85
+ ## 禁止事項
86
+
87
+ - ❌ 不要拿 NumberInput 顯示電話 / 郵遞區號 / 身分證號(非算術型數字)— 用 `Input`(電話千分位無意義 / step 不適用)
88
+ - ❌ 不要把 `precision` 設超過 6(浮點精度雜訊)— 極端精度需求超出格式化能力,改用 `Input` + 自驗證
89
+ - ❌ 不要在 DataTable cell 用左對齊 NumberInput(縱向比較位數需右對齊)— 走 DataTable column type `number` / `currency` 預設右對齊
90
+ - ❌ 不要把 `prefix='$'` 跟 `suffix='元'` 同時用 — 貨幣語意衝突,擇一即可
91
+ - ❌ 不要拿 NumberInput 做百分比但 value 存 0–1(`0.85` × 100 = 85%)— DS canonical 是 value 直接存百分比數值(85),`suffix='%'` 純顯示
92
+ - ❌ 不要自加 step ↑↓ button — Native `<input type="number">` 已支援(若顯示則由 spec 統一決定外觀,目前 hide 避免視覺雜訊)
93
+
94
+ ---
95
+
96
+ ## 邊界案例
97
+
98
+ - **Disabled**:由 Field SSOT own(`Field/field-controls.spec.md` State machine 段)。視覺:wrapper bg → `bg-fg-disabled-subtle`、formatted text → `text-fg-disabled`(M24 state>emphasis)、step ↑↓ button(若有)自動 disabled 不可點。Display mode + disabled 維持格式化輸出但 token 切 disabled。
99
+ - **Loading**:走 Field SSOT 的 `loading?: boolean`(`field-controls.spec.md` L70-115);endAction slot 自動切 `<CircularProgress/>` + `aria-busy="true"`,input 仍可編輯。
100
+ - **Empty(null / undefined / 空字串)**:Display mode 渲 `—`(em dash + `text-fg-muted`);Edit mode placeholder 走 default placeholder color。
101
+ - **Invalid input**(non-numeric):由 native `<input type="number">` + Field validation 處理,渲 error variant(`aria-invalid="true"` + `text-fg-error` border + 下方 error message)。
102
+ - **Dark mode / density**:走 Field SSOT,不獨立 own。
103
+
104
+ ---
105
+
106
+ ## 相關
107
+
108
+ - `../Input/input.spec.md` — 純文字(含電話 / 郵遞區號等「看起來像數字」的資料)
109
+ - `../DatePicker/date-picker.spec.md` — 日期
110
+ - `../Slider/slider.spec.md` — 視覺調整數值(音量、亮度)
111
+ - `../Field/field-controls.spec.md` — Field Control 共用規則(mode / size / endAction / error)
112
+
113
+ ## A11y 預設
114
+
115
+ **ARIA / Pattern**:native `<input>` element 預設 a11y;Field wrapper 補 `aria-labelledby` / `aria-invalid` / `aria-describedby`。
116
+
117
+ **Keyboard 行為**:
118
+
119
+ - Tab — focus
120
+ - ↑/↓ — 加 / 減 step
121
+ - 字母鍵 — 輸入數字
122
+
123
+ **Focus**:native input focus ring;DS focus-visible ring(`focus-visible:!border-primary`)由 Field wrapper 提供。
124
+
125
+ **驗證**:Storybook a11y addon panel 應 0 critical violation;鍵盤完整可操作(無需滑鼠)。WCAG AA contrast ≥ 4.5:1(text)/ 3:1(UI)。
126
+
@@ -0,0 +1,120 @@
1
+ ---
2
+ component: OverflowIndicator
3
+ family: self-contained
4
+ variants: {}
5
+ sizes: {}
6
+ traits:
7
+ - isInternal
8
+ benchmark:
9
+ - Radix ScrollArea primitive: github.com/radix-ui/primitives/tree/main/packages/react/scroll-area
10
+ ---
11
+
12
+ # OverflowIndicator 設計原則
13
+
14
+ ## 定位
15
+
16
+ OverflowIndicator 是 **`+N` 溢出指示器 + HoverCard 顯示隱藏內容**——當 row / container 中的項目無法全部顯示時,剩餘項目以 `+N` 形式提示,hover 展開完整清單。
17
+
18
+ **實作基礎**:自建 internal primitive——消費 HoverCard + tagVariants,無直接 external primitive base。
19
+
20
+ **Layout Family**:非上述 family — self-contained Tag-like primitive(自帶 `+N` 計數、單一 trigger pill + hover 展開 popover,無 prefix / content / suffix 的 slot 結構;視覺尺寸對齊 Tag family 但不屬 Family 1-4 的任何 row 結構)。
21
+
22
+ ---
23
+
24
+ ## 何時用 / 何時不用
25
+
26
+ **OverflowIndicator 是 internal primitive**——由需要處理「溢出 +N」的元件消費,不直接使用。
27
+
28
+ | 場景 | 正確做法 |
29
+ |------|---------|
30
+ | Combobox 多選 tag 溢出 | `Combobox` 單行模式內部消費 OverflowIndicator |
31
+ | Tabs 水平溢出 | `Tabs` 內部消費(搭配 `horizontal-overflow` pattern)|
32
+ | Avatar stack 溢出(「+3 more」)| Avatar.Group(未來)內部消費 |
33
+ | 人員列表行尾 +N | 列表元件自行組合 OverflowIndicator + PersonDisplay |
34
+ | 直接在 JSX 用 `<OverflowIndicator>` | 僅當消費者是自訂 list / custom overflow pattern 時 |
35
+
36
+ ---
37
+
38
+ ## 為什麼用 HoverCard 而非 Tooltip
39
+
40
+ 溢出內容**可能需要互動**——而非純文字提示:
41
+
42
+ - **人員 +N**:hover 清單中每個人可能需要 tag dismiss 或 hover 該人再看 NameCard(nested HoverCard)
43
+ - **Tag +N**:hover 清單中每個 tag 可能需要個別 dismiss
44
+ - **一般 +N**:穩定顯示、使用者可把滑鼠移到浮層上閱讀
45
+
46
+ Tooltip 純文字、不可互動、滑鼠離開 trigger 即消失——不適合承載這些需求。
47
+
48
+ ### trigger 不用 Tag 元件
49
+
50
+ Tag 內建 truncation Tooltip 會跟 OverflowIndicator 的 HoverCard 衝突。改用 `tagVariants` 直接套樣式,保持視覺一致但不含 Tag 的額外行為。
51
+
52
+ ---
53
+
54
+ ## 尺寸
55
+
56
+ | Size | Trigger 高度 | 文字 |
57
+ |------|------------|------|
58
+ | sm | `h-5 min-w-5`(20px)| `text-[10px]` |
59
+ | md | `h-6 min-w-6`(24px)| `text-caption` |
60
+ | lg | `h-6 min-w-6`(24px)| `text-caption` |
61
+
62
+ sm / md 跟 Tag 同階(20/24px),lg 對齊 md(尺寸需求一致,不需要再大)。
63
+
64
+ **sm 用 `text-[10px]` 的理由**:sub-footnote 特殊例外,與 Badge 共享「micro-indicator typography」tier——trigger 數字是次要輔助 indicator(非主訊息),在 20px 小容器內 12px 會擠。完整理由與 pattern-family 說明詳見 `badge.spec.md`「字體例外:`text-[10px]`」。若未來 OverflowIndicator / Badge 以外的元件也需要 sub-footnote 尺寸,應在 typography system 加 `--font-micro` token,再改用 token 而非 arbitrary value。
65
+
66
+ ---
67
+
68
+ ## 禁止事項
69
+
70
+ - ❌ 用 Tooltip 取代 HoverCard——溢出內容可能需要互動
71
+ - ❌ trigger 用 Tag 元件——Tag 內建 Tooltip 會跟 HoverCard 衝突
72
+ - ❌ 省略 `+N` 指示器(直接截斷隱藏)——使用者無法知道「還有多少被隱藏」
73
+ - ❌ 在 HoverCard 內再嵌 Tooltip——tooltip 是資訊終點,不可巢狀
74
+
75
+ ---
76
+
77
+ ## 為何無 ColorMatrix / StateBehavior
78
+
79
+ OverflowIndicator 是**承載 count + HoverCard 的 trigger primitive**,無獨立色彩與互動狀態變體:
80
+
81
+ - **無 ColorMatrix**:trigger 只有 neutral 一種色彩(`circle` 用 `bg-muted` / `tag` 用 `tagVariants` 的 neutral),無 variant 色彩選項——OverflowIndicator 是結構 primitive,色彩屬於 consumer 決策(若需要色相,trigger 的外框 / 內容由 consumer 包)。
82
+ - **無 StateBehavior**:trigger 只有 passive display(`cursor-default`),hover 只觸發 HoverCard 開啟,本身無 hover / active / disabled / selected 變化——互動狀態屬於 HoverCard trigger 行為(見 `hover-card.spec.md`),不屬 OverflowIndicator 層級。
83
+
84
+ 對應 anatomy story:保留 `Overview` / `Inspector` / `SizeMatrix`,額外追加元件特有的 `ShapeMatrix`(取代 ColorMatrix 展示 circle vs tag 兩種形狀變體)。
85
+
86
+ ---
87
+
88
+ ## shadcn passthrough 例外說明
89
+
90
+ OverflowIndicator 是 **composite**(HoverCard trigger + tag-styled `+N` span + HoverCard content + rendered chips list),純 declarative API(`items` array + `visibleCount`)。**不套 `forwardRef` / `...props` spread**:
91
+
92
+ - **沒有單一 DOM root 可 ref**:consumer 期待 ref 指向「`+N` trigger」還是「HoverCard content」?兩者都不對——前者在 hover 前才出現(conditional),後者在 portal(DOM 離散)
93
+ - **`...props` 無明確 spread 目標**:composite 無 identity root wrapper
94
+ - **API 邊界明確優先於 DOM 控制**:OverflowIndicator 暴露「溢出計數 + hover 展開」語意,DOM 細節留給底層 HoverCard / Tag
95
+
96
+ 若 consumer 需要程式化控制(trigger refs / custom Portal),應改用 HoverCard + Tag 自組,不透過 OverflowIndicator。`displayName = 'OverflowIndicator'` 保留。
97
+
98
+ ---
99
+
100
+ ## 相關
101
+
102
+ - `../HoverCard/hover-card.spec.md` — 浮層容器(OverflowIndicator 消費)
103
+ - `../Tag/tag.spec.md` — trigger 的 `tagVariants` 樣式來源
104
+ - `../Combobox/combobox.spec.md` — 主要消費者(多選溢出)
105
+ - `../../patterns/horizontal-overflow/horizontal-overflow.spec.md` — 水平溢出 pattern(OverflowIndicator 是其中的「menu 模式」trigger)
106
+ - `../Avatar/avatar.spec.md` — Avatar stack 溢出場景(未來消費者)
107
+
108
+ ## A11y 預設
109
+
110
+ **ARIA / Pattern**:對齊 [W3C ARIA Authoring Practices Guide](https://www.w3.org/WAI/ARIA/apg/patterns/) 對應 pattern。
111
+
112
+ **Keyboard 行為**:
113
+
114
+ - Tab — focus indicator
115
+ - Enter — show overflow menu
116
+
117
+ **Focus**:focus-visible ring 對齊 DS canonical(`outline: 2px solid var(--ring)`);focus management 由元件 own。
118
+
119
+ **驗證**:Storybook a11y addon panel 應 0 critical violation;鍵盤完整可操作(無需滑鼠)。WCAG AA contrast ≥ 4.5:1(text)/ 3:1(UI)。
120
+