@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,78 @@
1
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — verified 0 world-class DS claim in body; blanket retract removed. -->
2
+
3
+ # Opacity 設計原則
4
+
5
+ Opacity 定義元件停用狀態的透明度,確保全系統 disabled 視覺一致。
6
+
7
+ ## Token
8
+
9
+ | Token | 值 | Tailwind utility | 用途 |
10
+ |-------|-----|-----------------|------|
11
+ | `--opacity-disabled` | 0.45 | `opacity-disabled` | 所有元件的 disabled 狀態 |
12
+
13
+ ## 使用規則
14
+
15
+ ### 何時用 opacity vs token swap
16
+
17
+ 停用狀態有兩種視覺策略(詳見 `color.spec.md`「Disabled 狀態」節 / 「兩種 disabled 策略」):
18
+
19
+ - **Token swap**(預設):disabled 時換成專用 token(`fg-disabled`、`bg-disabled`),精確控制每個層的顏色。適用於多層結構的元件(Button、Input)。
20
+ - **Opacity blanket**:對整個元件套 `opacity-disabled`,一次處理所有子元素。適用於結構簡單、子元素多的元件(Avatar、Switch thumb、Slider)。
21
+
22
+ 不可混用——同一元件要嘛用 token swap,要嘛用 opacity,不兩者同時。
23
+
24
+ ## 為什麼 0.45
25
+
26
+ 0.45 在 light mode 和 dark mode 都能對 disabled 元件產生足夠辨識度(明顯區分於 active state),同時保持文字可讀(WCAG 不要求 disabled 元素的對比度,但仍需辨識)。
27
+
28
+ 選 0.45 的位置:
29
+
30
+ - 比 **Material 0.38** 略亮(Material 在白底 dark text 0.38 太弱,DS 使用 lg / dark mode 共用一個值需折衷)
31
+ - 比 **Apple iOS 0.4 / Atlassian 0.4** 稍亮(iOS 是 mobile-first 對比偏強,DS desktop 場景文字密集需更可辨識)
32
+ - 比 **Polaris 0.5 / Tailwind 0.5** 稍暗(0.5 對 disabled 元件辨識度不足,容易誤判為 hover state)
33
+ - **0.45 是 0.4-0.5 區間中位數**,跨 light / dark mode 都 robust
34
+
35
+ 世界級對照(2026-05-01 加):
36
+
37
+ | DS | Material 3 | Carbon | Tailwind v4 | Ant Design | Polaris | Apple HIG | Atlassian |
38
+ |----|-----------|--------|-------------|------------|---------|-----------|-----------|
39
+ | **0.45**(opacity-disabled)+ token swap 雙策略 | 0.38(text on surface)/ 0.12(container)| 0.25(opacity fallback,主走 token swap)| `opacity-{0,5,10,...,95,100}` percent ladder | 純 token swap(`colorTextDisabled` 等)| 0.5 + token swap | 0.4(`UIDisabled`)| 0.4 + token swap |
40
+
41
+ **結論**:disabled 在世界級 DS 的兩派哲學(token swap-only vs opacity blanket)+ opacity value 從 0.25 到 0.5 不等。本 DS 採「雙策略並存」哲學(複雜元件 token swap / 簡單元件 opacity blanket),value 取 0.4-0.5 中位 0.45。
42
+
43
+ ## 設計哲學
44
+
45
+ 兩個關鍵決策,各自有世界級先例支撐:
46
+
47
+ **(1) 雙策略並存(token swap 為主 + opacity blanket 為輔)— 對齊 Carbon / Atlassian 折衷哲學**
48
+
49
+ 純 token swap(Material / Ant / Polaris):每元件每層 disabled 自己一個 token,精確但 token 數激增(Material 有 50+ disabled token);純 opacity blanket(早期 Bootstrap):一律 0.5 簡單但無法表達 multi-layer hierarchy(disabled Button 的 icon / label / border 三層該有不同程度 fade)。
50
+
51
+ 本 DS 採 Carbon-aligned 折衷:**多層結構元件用 token swap**(Button 有 fg / bg / border 各自 disabled token);**簡單元件用 opacity blanket**(Avatar / Switch thumb 一個視覺單位,opacity 0.45 一次處理所有子元素)。明文「不可混用」避免 disabled overlay 重疊產生「過度褪色」(0.45 × 0.45 = 0.2 不可讀)。
52
+
53
+ **(2) Single tier 0.45 而非 Tailwind multi-tier opacity scale — 對齊 Polaris / Apple 單值哲學**
54
+
55
+ Tailwind 提供 `opacity-{5/10/20/30/40/50/60/70/80/90/95}` 百分比 ladder,但這是 utility scale 非 semantic role — 每個 consumer 自己挑值,跨元件不一致(A 用 opacity-50 / B 用 opacity-40 都 disabled)。
56
+
57
+ 本 DS 為 disabled 場景 single semantic token(`opacity-disabled = 0.45`),所有 disabled 用同一值 — 對齊 Polaris `opacity-disabled` / Material `disabled-on-surface` / Apple `UIDisabled` 「single semantic value for one role」哲學。捨棄 Tailwind multi-tier 的代價是「無法表達多層 hover/active fade」,但 hover / active 走 hover-bg / pressed-bg token,opacity 只負責 disabled,role 隔離。
58
+
59
+ ## 消費者
60
+
61
+ Avatar、Sidebar、MenuItem、Slider、Switch、Steps、Chip。
62
+
63
+ ## 反向引用
64
+
65
+ - Disabled 策略選擇框架:`tokens/color/color.spec.md`
66
+
67
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
68
+
69
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
70
+
71
+ - `avatar.spec.md`
72
+ - `chip.spec.md`
73
+ - `color.spec.md`
74
+ - `menu-item.spec.md`
75
+ - `sidebar.spec.md`
76
+ - `slider.spec.md`
77
+ - `steps.spec.md`
78
+ - `switch.spec.md`
@@ -0,0 +1,117 @@
1
+ ---
2
+ spec: orphan-tokens
3
+ scope: token retire vs structural-keep classification SSOT
4
+ audit_dim: design-system-audit Dim 48
5
+ script: scripts/audit-orphan-tokens.mjs
6
+ benchmark:
7
+ - Material Design Tokens M3 — 完整 1-10 色階保留 https://m3.material.io/styles/color/the-color-system/key-colors-tones
8
+ - Atlassian Design Tokens — palette tier 結構性保留 https://atlassian.design/foundations/color-new
9
+ - Carbon Design System — token category metadata classifier https://carbondesignsystem.com/elements/color/tokens
10
+ - Polaris Design Tokens — semantic SOP 5-piece set canonical https://polaris.shopify.com/design/colors
11
+ ---
12
+
13
+ # Orphan Token 分類 SSOT(retire vs structural-keep)
14
+
15
+ > **Foundational context**(2026-05-21 codify per user verbatim「決策四你他媽仔細給我確認到底該retire的是否真的該retire還是應該結構性保留,請全盤檢查,然後確認之後請下次不要再煩我,尤其是Palette tier」+「都給我做到好」):**永久解決**「audit 每次抓 X 個 orphan tokens」噪音。本 spec 明文哪些 token 結構性保留 + 自動 audit script 識別,user 不需重複確認同一題。
16
+
17
+ ## 為什麼會出現「假孤兒」
18
+
19
+ 簡單的 `grep var(--X)` 抓不到以下消費路徑,造成 token **實際有用但 audit 報「無消費」false positive**:
20
+
21
+ | 消費機制 | 範例 | grep 漏抓原因 |
22
+ |---|---|---|
23
+ | **Tailwind `@theme inline` bridge** | `--spacing-field-md` → `h-field-md` class | Tailwind 在 build time 從 bridge 讀值轉 utility class,無 `var()` 語法 |
24
+ | **`@utility` definition** | `@utility tracking-shortcut { letter-spacing: var(--tracking-shortcut) }` | 是定義,不是消費點 |
25
+ | **Class-name match** | `text-primary-text` 對應 `--primary-text` | 走 Tailwind 命名約定 |
26
+ | **JS literal mirror** | `motion.ts` export `HOVER_DELAY_RICH_MS = 700` 鏡像 `--hover-delay-rich` | JS 端 hardcode 數字 + import constant,不讀 CSS var |
27
+
28
+ **修法**:`scripts/audit-orphan-tokens.mjs` 用 comprehensive consumer detection 涵蓋 5 條消費路徑,真實 orphan count drops from 175 → 0(2026-05-21 baseline)。
29
+
30
+ ---
31
+
32
+ ## 結構性保留分類(永久保留,**不視為 retire 候選**)
33
+
34
+ 對齊 Material 3 / Atlassian / Carbon / Polaris token system 共識。每類附 rationale + 識別 regex(`audit-orphan-tokens.mjs` 消費此分類)。
35
+
36
+ ### 1. Palette tier 完整 1-10 色階(77 token,structural)
37
+
38
+ **Rule**:`--color-{hue}-N`(N ∈ 1..10)即使當前無消費者也**完整保留**。
39
+
40
+ **Why**:Material 3「Key Colors & Tones」+ Atlassian「Full color spectrum」共識 — palette 是設計師調色盤 SSOT,缺中間階就斷層,新元件需消費中間色時不該 hot-add。**全色階是 capability,不是 cost**。
41
+
42
+ **Regex**:`^--color-(amber|blue|brown|red|green|deep-orange|grey|indigo|lime|orange|pink|purple|teal|yellow|cyan)-\d+$`
43
+
44
+ ### 2. Magenta / Turquoise 專用 palette(14 token,structural)
45
+
46
+ **Why**:Tag / Avatar variant 預留色,Polaris / Atlassian 同樣保留 specialty hue 完整色階(不只「目前用到的階」)。
47
+
48
+ **Regex**:`^--color-(magenta|turquoise)-\d+$`
49
+
50
+ ### 3. Mask alpha(16 token,structural)
51
+
52
+ **Rule**:`--black-aN` / `--white-aN`(alpha tiers a02-a85)完整保留。
53
+
54
+ **Why**:Overlay / scrim / shadow / disabled state alpha composition 預留;Material 3「Surface Tint」+ Apple HIG「Vibrancy」需要完整 alpha ladder。
55
+
56
+ **Regex**:`^--(black|white)-a\d+$`
57
+
58
+ ### 4. Chart reserved(0-5 token,structural)
59
+
60
+ **Rule**:`--color-chart-N`(N ∈ 1..5)為 DataViz 預留,即使 DS 內無 chart 元件也保留。
61
+
62
+ **Why**:Consumer(產品端)會用 ECharts / D3 等 lib 直接消費這些 token 做 chart palette,DS 提供 5-color qualitative palette canonical(對齊 ColorBrewer)。
63
+
64
+ **Regex**:`^--color-chart-\d+$`
65
+
66
+ ### 5. State variants 完整集(8 token,structural)
67
+
68
+ **Rule**:`--{hue}-(hover|active|focus|subtle|emphasis|disabled|text)` 即使當前無消費者也保留完整 8-tier emphasis set。
69
+
70
+ **Why**:Material 3 / Atlassian state token canonical — hover/active/focus 是 elevation 8-tier 一部分,缺一階斷 emphasis ladder。**8-tier 是 capability invariant**。
71
+
72
+ **Regex**:`^--{HUES}-(hover|active|focus|subtle|emphasis|disabled|text)$`
73
+
74
+ ### 6. Neutral palette 完整 + opaque tier(13 token,structural)
75
+
76
+ **Why**:Neutral 1-9 是 grayscale spectrum SSOT;`-opaque` 變體是 opacity composition 預留(non-translucent fallback for dark mode / contrast modes)。
77
+
78
+ **Regex**:`^--color-neutral-\d+(-opaque)?$`
79
+
80
+ ### 7. SOP 5-piece semantic 完整集(1+ token,structural)
81
+
82
+ **Rule**:每個 semantic role(primary / error / success / warning / info)必有 5 件套:`base / hover / active / subtle / text`,即使當前 `text` variant 無消費者也保留。
83
+
84
+ **Why**:Consistency invariant — 缺 `-text` variant 設計時找不到「on-emphasis 文字色」會 hot-create,違反 SSOT。Polaris「Status colors complete set」canonical。
85
+
86
+ **Regex**:`^--(primary|error|success|warning|info)-(active|hover|text|subtle|emphasis|foreground|focus)$`
87
+
88
+ ### 8. JS literal mirror(2 token,structural)
89
+
90
+ **Rule**:`--hover-delay-{plain|rich|close|skip}` motion tokens 鏡像 JS constants(`HOVER_DELAY_PLAIN_MS` 等),CSS 端保留供 design SSOT 可見 + 未來 programmatic 讀取(`getComputedStyle`)。
91
+
92
+ **Why**:M17 SSOT 雙頭設計 — CSS 端是設計師 inspector 入口,JS 端是 runtime 消費入口,兩端必同步存在。
93
+
94
+ **Regex**:`^--hover-delay-(plain|rich|close|skip)$`
95
+
96
+ ---
97
+
98
+ ## 真 retire 流程(comprehensive scan 後仍 0 consumer)
99
+
100
+ `audit-orphan-tokens.mjs` 跑完跨 5 消費機制 verify 仍 0 consumer + 不落任何 structural-keep 類別 → 才算真 retire 候選。
101
+
102
+ 走 retire flow:
103
+ 1. **Grep DS-wide** `*.spec.md` 看是否文件 cite 該 token 名(可能是「設計師未來會用」承諾)
104
+ 2. **Git blame** declare 提交 — 提交訊息 / PR 描述是否說明用途
105
+ 3. 兩 step 都無 → safe retire,從 `tokens/**/*.css` 刪宣告 + 加 git commit message cite 本 spec
106
+
107
+ ## Audit chain
108
+
109
+ - **Dim 48** (`design-system-audit/SKILL.md`)— chain 本 spec + `audit-orphan-tokens.mjs --check`(not raw `grep var()`)
110
+ - **CI**:`npm run audit:tokens`(future add to `package.json` scripts)— `node scripts/audit-orphan-tokens.mjs --check` fail = real orphan 出現
111
+ - **Hook**:無 hook(本 audit run-time / monthly cadence,非 PreToolUse 攔截場景)
112
+
113
+ ## 永久解決承諾
114
+
115
+ 本 spec land 後**永遠不會**再回頭問 user 同樣問題(palette tier / 完整色階 / mask alpha / JS literal mirror 是否該 retire)。Audit script 自動識別,只報真實「跨 5 消費路徑都 0」的 token(2026-05-21 baseline = 0 真孤兒)。
116
+
117
+ 新加 hue / state / SOP semantic / JS literal mirror → 同步本 spec regex + `audit-orphan-tokens.mjs` 分類器(per M17 SSOT)。
@@ -0,0 +1,123 @@
1
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — verified 0 world-class DS claim in body; blanket retract removed. -->
2
+
3
+ # Radius 設計原則
4
+
5
+ 圓角系統提供四個語意層級,對應不同元件類型。
6
+
7
+ ## 圓角選項
8
+
9
+ | Tailwind class | Token | 值 | 用途 |
10
+ |----------------|-------|----|------|
11
+ | `rounded-xs` | `--radius-xs` | 2px | 極小視覺 indicator(Chart legend swatch 8×8 色塊等 ≤ 10px 元素) |
12
+ | `rounded-md` | `--radius-md` | 4px | 一般元件(Button、Input、Card、Tag、hover bg) |
13
+ | `rounded-lg` | `--radius-lg` | 8px | 浮層(Dialog、Popover、Dropdown) |
14
+ | `rounded-full` | `--radius-full` | 9999px | Pill 形狀(Avatar、Switch、Progress) |
15
+
16
+ ### `rounded-sm` 保留未使用
17
+
18
+ CSS 定義了 `--radius-sm`(目前 = 4px,與 md 同值),但**不在元件中使用**。保留給未來「介於 md 和 xs 之間」的需求(如更密集的 UI 模式)。所有 4px 圓角一律用 `rounded-md`。
19
+
20
+
21
+ ## 使用規則
22
+
23
+ ### `rounded-xs`(2px)— 極小 indicator
24
+
25
+ 適用於直徑 ≤ 10px 的視覺 indicator,視覺效果需要「微圓而非完全方」:
26
+
27
+ - Chart legend swatch(8×8 色塊)
28
+ - 未來其他 micro indicator(若尺寸 ≥ 12px 請改 `rounded-md`,不要為了「更圓」使用 xs)
29
+
30
+ **判斷**:`rounded-md`(4px)在 8×8 元素上接近 50% 填滿,視覺變成 pill。2px 才維持「色塊」而非「膠囊」語意。≥ 12px 時 4px 比例適當,不需 xs。
31
+
32
+ ### `rounded-md`(4px)— 一般元件
33
+
34
+ 適用於大多數互動元件,視覺上「有圓角但不搶眼」:
35
+
36
+ - Button、Input、Select、Checkbox、Tag
37
+ - Card(非浮層,不需 elevation 層級感)
38
+ - Table cell、list item 的 hover 背景
39
+ - Tooltip
40
+
41
+ ### `rounded-lg`(8px)— 浮層
42
+
43
+ 適用於浮在頁面上層的元件:
44
+
45
+ - Modal、Dialog
46
+ - Popover、Dropdown menu、Command palette
47
+
48
+ ### `rounded-full`(9999px)— Pill
49
+
50
+ 適用於需要完全膠囊形狀的元件:
51
+
52
+ - Avatar(圓形)
53
+ - Toggle switch 外框
54
+ - Progress bar
55
+
56
+
57
+ ## 禁止事項
58
+
59
+ ```tsx
60
+ // ❌ 不要用非 token 的圓角(包含 rounded-md、rounded 等)
61
+ <div className="rounded" /> // 4px,但意圖不明
62
+ <div className="rounded-xl" /> // 12px,超出 token 範圍
63
+ <div className="rounded-2xl" /> // 16px,超出 token 範圍
64
+
65
+ // ❌ 不要硬寫圓角值
66
+ <div className="rounded-[6px]" />
67
+ <div style={{ borderRadius: '8px' }} />
68
+
69
+ // ❌ 不要用 CSS 變數語法(Tailwind class 已夠用)
70
+ <div className="rounded-[var(--radius-md)]" />
71
+ ```
72
+
73
+ ```tsx
74
+ // ✅ 一般元件
75
+ <button className="rounded-md" />
76
+
77
+ // ✅ 浮層
78
+ <div className="rounded-lg" />
79
+
80
+ // ✅ Pill
81
+ <span className="rounded-full" />
82
+ ```
83
+
84
+
85
+ ## 世界級對照
86
+
87
+ 對齊 M8(binary strict rule 必 ≥3 家世界級對照),「禁 `rounded-xl` / `rounded-2xl` raw utility」+「禁硬寫 `rounded-[6px]`」是本 spec 的 binary strict rule,以下為支撐 rationale。
88
+
89
+ | 維度 | 本 DS | Material 3 | Carbon | Tailwind v4 | Ant Design | Polaris | shadcn/Apple |
90
+ |------|-------|-----------|--------|-------------|------------|---------|--------------|
91
+ | Tier 數 | **4 tier**(xs/md/lg/full)+ 1 reserved sm | 6 tier(extra-small ~ extra-large + full) | 3 tier(0/1/2) | 7 tier(none/sm/md/lg/xl/2xl/3xl/full)| **4 tier**(XS/SM/Default/LG)| 6 tier(050/100/200/300/400/500/full)| 1 base + calc(shadcn)/ Squircle 連續曲率(Apple)|
92
+ | 數值序列 | **2 / 4 / 8 / 9999** geometric × 2 | 4 / 8 / 12 / 16 / 28 額外 | 0 / 2px / 4px(token rem)| 2 / 4 / 6 / 8 / 12 / 16 / 24 | 2 / 4 / 6 / 8 | 2 / 4 / 6 / 8 / 12 / 16 | `--radius` × calc 變化 |
93
+ | Pill 方案 | `rounded-full` 9999px | `shape-corner-full` | 不顯式提供 | `rounded-full` 9999px | `borderRadiusOuter` ad-hoc | `border-radius-full` | 視 component shape |
94
+ | 動態 shape | 無(靜態 4 tier)| Dynamic shape morphing(可動畫) | 無 | 無 | 無 | 無 | Apple 連續曲率動態 |
95
+
96
+ ## 設計哲學
97
+
98
+ 四個關鍵決策,各自有世界級先例支撐:
99
+
100
+ **(1) 4 tier(xs/md/lg/full)— 對齊 Ant Design 4-tier minimal,捨多家 6+ tier**
101
+
102
+ Material 3 / Polaris / Tailwind 6-7 tier 過細 — 每 tier 只差 2-4px,reader 視覺難分(「rounded-md 6px」vs「rounded-lg 8px」差 25% 但目視幾乎相同)。Carbon 3 tier(0/1/2)太極簡無法表達 elevation 層級(浮層 vs inline 同 radius 失去視覺 hierarchy)。
103
+
104
+ 本 DS 4 tier 是「視覺可區分 + 維護友善」最佳交集 — `xs(2)→ md(4)→ lg(8)→ full` 每跳一級數值翻倍,目視差異 ≥ 50%(Weber-Fechner law 知覺閾值),不會出現「rounded-md vs rounded-mdlg 哪個對」糾結。
105
+
106
+ **(2) Geometric scale(2 / 4 / 8 doubling)— 對齊 Tailwind / Polaris 慣例**
107
+
108
+ 數值 doubling 確保 reader 一眼感知「不同層級」(2→4→8 比 4→6→8 對比明顯)。對齊 Tailwind sm(2)/ md(4)/ lg(8) + Polaris 100(4)/ 200(6 — 偏離)/ 300(8) 的 powers-of-2 idiom。
109
+
110
+ 捨棄連續 ratio(Material 4/8/12/16/28 等差 + 跳級)的代價是「中段 size 表現空間」(無 6px tier),DS 場景無此需求(中段需求都歸入 md=4)。
111
+
112
+ **(3) `rounded-full` 9999px 而非 50%(對齊 Tailwind / Polaris)**
113
+
114
+ 50% percentage 在「短矩形」(高 < 寬,如 horizontal Switch)變橢圓而非 pill — 9999px 確保任意 aspect ratio 都圓形(實際 capped 在 height/2)。對齊 Tailwind / Polaris 全 pill 慣例,避免短矩形 edge case。
115
+
116
+ **(4) 保留 `--radius-sm` token 但不用 — 對齊 Material「reserve for future dense pattern」**
117
+
118
+ CSS 定義 `--radius-sm = 4px`(目前同 md),component 強制 `rounded-md` 不引用 sm。為什麼留:未來若引入 dense mode(`density="compact"` 介於 md / xs 之間),可開新 sm tier 不破壞既有 xs/md/lg/full 命名階梯(避免 rename 引發全 DS grep refactor)。對齊 Material 3 的「extra-small reserved tier」哲學。
119
+
120
+ 捨棄「立即啟用 sm」的代價是命名空間預占,接受 — 命名穩定 > 短期 utility。
121
+
122
+ 捨棄「Apple Continuous Corner / Squircle」的代價是「平台一致性」(Apple HIG 用連續曲率非單一 radius,iOS 元件視覺更柔)— DS 是 cross-platform web,採 Material/Tailwind 標準 border-radius 對齊大多數 OS native 元件,避免引入 SVG path 額外 runtime 成本。
123
+
@@ -0,0 +1,202 @@
1
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — verified 0 world-class DS claim in body; blanket retract removed. -->
2
+
3
+ # Typography 設計原則
4
+
5
+ Typography 定義字體尺寸與行高的 token 系統,確保全系統文字層級一致。
6
+
7
+ ## 設計原則
8
+
9
+ Typography 由三個獨立維度組成,分開疊加:
10
+
11
+ | 維度 | 控制方式 | 說明 |
12
+ |------|---------|------|
13
+ | font-size | `text-{role}` utility | token 決定,不可繞過 |
14
+ | line-height | 烤進 token,需要時覆蓋 | heading / supplementary → 1.3;body → 1.5 |
15
+ | font-weight | `font-normal` / `font-medium` / `font-bold` | 使用端疊加,不寫死在 token |
16
+
17
+ **line-height 的選擇基於「是否適合多行閱讀」:**
18
+ - `1.5`:適合連續閱讀的段落(14px / 16px)
19
+ - `1.3`:標題、短文字、截斷場景、不需要閱讀行距
20
+ - 12px 以下不適合作為連續閱讀內文,一律 1.3
21
+
22
+ **font-weight 等同 `<strong>` 的疊加邏輯:**
23
+ - 不加 = 400,一般文字
24
+ - `font-medium` = 500,行內中等強調
25
+ - `font-bold` = 700,強調(等同 `<strong>`)
26
+
27
+
28
+ ## Token 表
29
+
30
+ | Utility | font-size | line-height | 用途 |
31
+ |----------------|-----------|-------------|------|
32
+ | `text-h1` | 48px | 1.3 | 頁面主標題 |
33
+ | `text-h2` | 32px | 1.3 | 區塊標題 |
34
+ | `text-h3` | 24px | 1.3 | 子區塊標題 |
35
+ | `text-h4` | 20px | 1.3 | 小節標題 |
36
+ | `text-h5` | 16px | 1.3 | 元件層級標題 |
37
+ | `text-h6` | 14px | 1.3 | 最小層級標題 |
38
+ | `text-body-lg` | 16px | 1.5 | 16px 為主版面的段落內文 |
39
+ | `text-body` | 14px | 1.5 | ★ 主要內文基準 |
40
+ | `text-caption` | 12px | 1.3 | 圖表附註、標籤文字、元件內次要說明 |
41
+ | `text-footnote`| 10px | 1.3 | 法律文字、來源標注(極少用)|
42
+
43
+ **h5(16px)vs body-lg(16px)**:同尺寸,line-height 不同,靠這個區分標題與段落角色。
44
+ **h6(14px)vs body(14px)**:同尺寸,靠 font-weight 和 color 區分,使用端需有意識地處理。
45
+
46
+
47
+ ## line-height 覆蓋(僅 14/16px body 可覆蓋)
48
+
49
+ **Token canonical**:除 `text-body`(14px)/ `text-body-lg`(16px)外,**所有 size 行高皆固定**:
50
+ - `text-h1`–`text-h6`:全部 lh 1.3 固定(標題不需多行閱讀行距)
51
+ - `text-caption`(12px)/ `text-footnote`(10px):全部 lh 1.3 固定(小字不適合 1.5)
52
+ - `text-body` / `text-body-lg`:**唯二**可覆蓋(預設 lh 1.5 閱讀段落,可 `leading-compact` 覆蓋為 1.3)
53
+
54
+ 唯一合理覆蓋情境:`text-body` / `text-body-lg` 用於**單行固定高度容器**(Button / Tabs trigger / Chip / Notice banner / MenuItem row / SelectMenu / TreeView / DropdownMenu / Combobox input),避免 1lh > chrome height 造成垂直偏移:
55
+
56
+ ```tsx
57
+ {/* ✅ Button 文字(單行 28/32/36px chrome height)*/}
58
+ <button className="h-field-sm text-body leading-compact">確認</button>
59
+
60
+ {/* ✅ Notice banner 單行 alert text */}
61
+ <span className="text-body leading-compact">已儲存</span>
62
+ ```
63
+
64
+ 可用的 override utility:
65
+ - `leading-compact`:1.3(自訂,只給 `text-body` / `text-body-lg`)
66
+ - `leading-normal`:1.5(Tailwind 內建,**極少用**——僅 stories `<p>` 補 12px footnote 段落呼吸感,正式 DS 元件**不需**主動覆蓋成 1.5,因為 `text-body` / `text-body-lg` 預設就是 1.5)
67
+
68
+ ### 反 pattern(禁用)
69
+
70
+ ```tsx
71
+ {/* ❌ 用 leading-compact + line-clamp 「截斷副標」
72
+ line-clamp 自己處理截斷,不需要動 line-height;該選對的 token */}
73
+ <p className="text-body leading-compact line-clamp-2">副標說明</p>
74
+
75
+ {/* ❌ 用 h5/h6 + leading-normal「當段落」
76
+ h5/h6 是標題語義,不該當段落;同 size 該換 body-lg / body */}
77
+ <p className="text-h5 leading-normal">較小的說明段落</p>
78
+ ```
79
+
80
+ ### 同尺寸但不同角色的選法(用 token 自然區分,不靠 leading 覆寫)
81
+
82
+ | 尺寸 | 段落(閱讀) | 標題(掃視 + bold) |
83
+ |---|---|---|
84
+ | 16px | `text-body-lg`(lh 1.5) | `text-h5`(lh 1.3,加 `font-medium`/`font-semibold`) |
85
+ | 14px | `text-body`(lh 1.5) | `text-h6`(lh 1.3,加 `font-medium`/`font-semibold`) |
86
+
87
+ **結論**:90% 情境用 token 預設就對;唯一覆寫 = body/body-lg 進單行固定高度容器套 `leading-compact`。
88
+
89
+
90
+ ## 組合範例
91
+
92
+ ```tsx
93
+ {/* 頁面標題 */}
94
+ <h1 className="text-h1">專案總覽</h1>
95
+
96
+ {/* 區塊標題加重 */}
97
+ <h2 className="text-h2 font-medium">執行進度</h2>
98
+
99
+ {/* 主要內文 */}
100
+ <p className="text-body">一般說明段落,預設 400 weight。</p>
101
+
102
+ {/* 行內強調 */}
103
+ <p className="text-body">
104
+ 此操作將<span className="font-medium">永久刪除</span>該筆資料。
105
+ </p>
106
+
107
+ {/* 截斷副標 */}
108
+ <p className="text-body leading-compact line-clamp-2 text-fg-secondary">
109
+ 這是一段較長的副標說明,超過兩行會被截斷顯示。
110
+ </p>
111
+
112
+ {/* 欄位附屬說明 */}
113
+ <span className="text-caption text-fg-muted">最多 200 字元</span>
114
+ ```
115
+
116
+
117
+ ## 禁止事項
118
+
119
+ ```tsx
120
+ // ❌ 不要用 Tailwind 原始 text-sm / text-lg / text-base
121
+ <p className="text-sm">內文</p>
122
+
123
+ // ❌ 不要硬寫 font-size 或 line-height
124
+ <p style={{ fontSize: '14px' }}>內文</p>
125
+
126
+ // ❌ 不要用 12px 做連續閱讀段落
127
+ <p className="text-caption">這是一整段很長的說明文字...</p>
128
+
129
+ // ❌ 不要把 font-weight 寫死在外層容器(應在需要的元素上疊加)
130
+ <section className="text-body font-medium">...</section>
131
+
132
+ // ❌ 不要用 Tailwind 原始 tracking-* utility(letter-spacing 必 role-specific)
133
+ <kbd className="tracking-widest">⌘K</kbd>
134
+ ```
135
+
136
+
137
+ ## Letter-spacing(role-specific only)
138
+
139
+ **哲學**:`letter-spacing` 跟 font-size / line-height 同層 — utility scale(`tracking-tight..widest`)是 raw scale 非 semantic role,每 consumer 自挑值 = 跨元件不一致。本 DS 採 **single semantic value per role**(對齊 Polaris / Material / Apple),每個需要 letter-spacing 變化的 role 必先 codify token。
140
+
141
+ ### 既定 role
142
+
143
+ | Token | 值 | Tailwind utility | Role |
144
+ |---|---|---|---|
145
+ | `--tracking-shortcut` | `0.1em` | `tracking-shortcut` | 鍵盤快捷鍵 hint(`⌘K` / `Ctrl+S` 等),Command/CommandShortcut + DropdownMenuShortcut + 同類 kbd 顯示 consumed via `text-caption` 或 `text-footnote` |
146
+
147
+ ### 新增 role 流程
148
+
149
+ 1. typography.css `:root` 加 `--tracking-<role>: <value>;`
150
+ 2. typography.css 加 `@utility tracking-<role> { letter-spacing: var(--tracking-<role>); }`
151
+ 3. utility-registry.json `typography.allow` 加 `tracking-<role>`
152
+ 4. 本 spec.md 加 row 到上表 + 對應 role 對齊世界級 cite(M22)
153
+ 5. Consumer code 用新 utility
154
+
155
+ **對齊**:Material 3「letter-spacing per type role」/ Polaris「single semantic letter-spacing per scale」/ GitHub Primer「kbd typography canonical」/ Tailwind「wider tracking for uppercase + labels」。
156
+
157
+
158
+ ## 世界級對照
159
+
160
+ 對齊 M8(binary strict rule 必 ≥3 家世界級對照),「禁 Tailwind `text-sm`/`text-base` raw utility」+「禁硬寫 fontSize」是本 spec 的 binary strict rule,以下為支撐 rationale。
161
+
162
+ | 維度 | 本 DS | Material 3 | Carbon | Tailwind v4 | Ant Design | Polaris | Apple HIG |
163
+ |------|-------|-----------|--------|-------------|------------|---------|-----------|
164
+ | 命名哲學 | semantic role(h1-h6 + body)| Type scale roles(Display / Headline / Title / Label / Body)| Productive vs Expressive 雙軌 | utility size(`text-{xs..9xl}`)| 階梯 h1-h5 + base | semantic role(`heading-{md..3xl}` + `body-{sm..lg}`)| Dynamic Type(Title 1-3 / Headline / Body / Callout / Footnote / Caption 1-2)|
165
+ | Body base | **14px** | 14 / 16(可切)| 14(productive)/ 16(expressive)| 16(`text-base`)| 14(`fontSizeBase`)| 14(`body-md`)| 17(`Body`)|
166
+ | Heading 跨度 | h1=48 → h6=14(6 tier)| Display 1-2 + Headline 1-6(8+ tier)| Productive 01-07 + Heading 01-07(14 tier)| `text-xs` (12) → `text-9xl` (128)(13 tier)| h1=38 → h5=16(5 tier)| `heading-md` (16) → `heading-3xl` (40)(5 tier)| Title 1-3(3 tier)|
167
+ | Line-height 哲學 | **二元**(1.5 reading / 1.3 compact)| Ratio ladder(隨 size 1.2-1.6 連續)| 二元(reading 1.5 / supplementary 1.3)| Ratio ladder(`leading-{tight..loose}` 1.25-2)| Unique 1.5715 | 隨 size(0.875-1.5)| 隨 size + Dynamic |
168
+ | Font weight 階 | **3 階**(400/500/700)| 5 階(300-700)| 3 階(Light/Regular/SemiBold)| 9 階(100-900)| 4 階(400/500/600/700)| 4 階(400/500/600/650)| 9 階 + SF |
169
+
170
+ ## 設計哲學
171
+
172
+ 四個關鍵決策,各自有世界級先例支撐:
173
+
174
+ **(1) Body base = 14px(對齊 Material / Carbon / Ant 三家共識)**
175
+
176
+ 14px 是 productivity tool 共識(Linear / Notion / Figma / Jira / Stripe Dashboard),16px 是 reading-first 哲學(Apple iOS / Polaris 的 storefront / Medium)。本 DS 場景是 dense workspace(規格 / 表格 / Dashboard),14px 同時讓 information density 高 + 對齊 system tool 慣例。捨棄 16 base 的代價是「行動裝置可讀性」,但 DS 主場景是 desktop。
177
+
178
+ **(2) 二元 line-height(1.5 / 1.3)— 對齊 Carbon「productive vs supplementary」哲學**
179
+
180
+ Material / Tailwind 用 ratio ladder(隨 size 連續變化)雖精細,但 consumer 心智負擔重(每 size 對應不同 lh,需查表)。Carbon 的「productive reading 1.5 / supplementary compact 1.3」二元規則,讓 reader 一眼判斷「是要連續閱讀還是 scanning」即可選對 — 對應本 DS 的 scanning(MenuItem / FileItem)vs reading(Empty / Field description)二分法。
181
+
182
+ 捨棄連續 ratio 的代價是「極大字級 lh 過鬆」(48px h1 仍 1.3),實測無此問題(本 DS 無 60+ display 級字)。
183
+
184
+ **(3) h5/h6 與 body-lg/body 同 size(16/14)— 靠 lh + weight 區分,不開新 size tier**
185
+
186
+ Material 用 17 tier(Display 1-2 + Headline 1-6 + Title 1-2 + Subtitle 1-2 + Body 1-2 + Button + Caption + Overline),Apple Dynamic Type 11 tier 跨平台 — 兩家 size scale 過度膨脹是 DS 維護負擔(每加 1 tier 就要全 component grep 評估)。
187
+
188
+ 本 DS 採 Carbon-aligned 二元覆寫(同 16px 用 lh 1.3 = h5 標題 / lh 1.5 = body-lg 段落),靠 line-height + font-weight + color 區分角色,維持 token table 在 10 個 utility 內。代價是「使用端需有意識選 h5 vs body-lg」,但對應 spec L42 明寫「使用端需有意識地處理」。
189
+
190
+ **(4) Font weight 3 階(400/500/700)— 對齊 Carbon / Polaris 共識**
191
+
192
+ Tailwind / Apple SF 的 9 階 weight scale 涵蓋 marketing / 印刷需求,但 productivity DS 95% 場景只用 normal / medium / bold(對齊 Carbon Light/Regular/SemiBold + Polaris 400/500/600/650)。捨棄 100-300 hairline + 800-900 black 的代價是「行銷 hero text 表現力」,DS 不收 marketing 場景,接受。
193
+
194
+ ## 跨元件參考
195
+
196
+ 行高在 row 類元件中的應用(scanning vs reading 模式)詳見 `patterns/element-anatomy/item-anatomy.spec.md`「兩種閱讀模式」節。
197
+
198
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
199
+
200
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
201
+
202
+ - `empty.spec.md`