@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,282 @@
1
+ ---
2
+ component: Tag
3
+ family: 3
4
+ variants:
5
+ neutral:
6
+ when: "通用分類、草稿、無特定語義(GitHub label default / Notion page tag untagged)"
7
+ world-class: ["Polaris Tag default", "Atlassian Tag standard", "Ant Tag default"]
8
+ blue:
9
+ when: "進行中、資訊提示、active 狀態(對應 --info)"
10
+ world-class: ["Atlassian Lozenge inProgress", "Jira status=in progress", "Linear status=in progress"]
11
+ red:
12
+ when: "錯誤、已封鎖、危險(對應 --error)"
13
+ world-class: ["Atlassian Lozenge removed", "Jira status=blocked", "Ant Tag color=red"]
14
+ green:
15
+ when: "成功、已完成、已核准(對應 --success)"
16
+ world-class: ["Atlassian Lozenge success", "Jira status=done", "GitHub label merged"]
17
+ yellow:
18
+ when: "警告、待審核、注意(對應 --warning)"
19
+ world-class: ["Atlassian Lozenge moved", "Jira status=review", "Ant Tag color=warning"]
20
+ turquoise:
21
+ when: "分類色(無固定語義)— 產品線 / 團隊區別標記"
22
+ world-class: ["GitHub label custom hex", "Notion tag color=teal", "Linear label color=turquoise"]
23
+ purple:
24
+ when: "分類色(無固定語義)— 產品線 / 團隊區別標記"
25
+ world-class: ["GitHub label custom hex", "Notion tag color=purple", "Linear label color=purple"]
26
+ magenta:
27
+ when: "分類色(無固定語義)— 產品線 / 團隊區別標記"
28
+ world-class: ["GitHub label custom hex", "Notion tag color=pink", "Linear label color=pink"]
29
+ indigo:
30
+ when: "分類色(無固定語義)— 產品線 / 團隊區別標記"
31
+ world-class: ["GitHub label custom hex", "Notion tag color=blue", "Linear label color=indigo"]
32
+ sizes:
33
+ sm:
34
+ when: "form field-height 28 / compact chrome / dialog / panel context"
35
+ md:
36
+ when: "default general UI"
37
+ lg:
38
+ when: "touch / prominent CTA / stakeholder-facing surface"
39
+ traits:
40
+ - hasVariants
41
+ - hasSizes
42
+ - hasInteractiveStates
43
+ benchmark:
44
+ - Ant Design Tag: github.com/ant-design/ant-design/tree/master/components/tag
45
+ - MUI Chip: github.com/mui/material-ui/tree/master/packages/mui-material/src/Chip
46
+ - Carbon Tag: github.com/carbon-design-system/carbon/tree/main/packages/react/src/components/Tag
47
+ ---
48
+
49
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
50
+
51
+ # Tag 設計原則
52
+
53
+ ## 定位
54
+
55
+ Tag 是 inline label,用於分類標籤、狀態標記、多選已選值。不是 overlay 通知圓點(那是 Badge / Notification indicator)。
56
+
57
+ **實作基礎**:純視覺 atom——styled span + 可選 dismiss button,無 external primitive base。
58
+
59
+ **Layout Family**:CLAUDE.md 4-Family Model **Family 3(Pill Layout)** 的 **data indicator sub-profile**。SSOT 在 `components/Button/button.spec.md`「Pill Layout」章節;Tag 是 indicator variant(見下「與 Button 的差異」)。
60
+
61
+ ## 與 Button 的差異(Family 3 indicator variant)
62
+
63
+ 同 Family 結構 `[startIcon?] [<span px-1>label</span>] [suffix dismiss]`,但以下值不同——因為 role 是 **data indicator 非 action trigger**:
64
+
65
+ | 項目 | Button(action trigger) | Tag(data indicator) | 為什麼 |
66
+ |------|-------------------------|--------------------|-------|
67
+ | 外距 | `xs=px-2`, `sm+=px-3` | 全部 `px-1` | indicator 緊湊 passive,不搶焦點 |
68
+ | 字重 | `font-medium` | `font-normal` | indicator 不強調 |
69
+ | Cursor | `pointer` | `text` | indicator 非 action(dismiss button 內部仍 pointer)|
70
+ | 字體 pairing | Button xs 是 standalone utility(text-caption 12px) | Tag md pair Field md(text-body 14px) | size 對應 Field, Tag 出現在 Field 內需視覺連續 |
71
+
72
+ **不該把 Tag 改成 Button 樣式來「統一」**——這是 world-class DS(Polaris / Material / Atlassian / Ant / Carbon)共識:action 跟 indicator padding + typography 分開。
73
+
74
+ ---
75
+
76
+ ## 何時用
77
+
78
+ - **分類標籤**:產品類別(Electronics / Food / Furniture)、文章 tag(React / Design / Tutorial)
79
+ - **狀態標記**:訂單狀態(In stock / Shipped / Delivered)——用 variant 色彩加速掃視
80
+ - **多選已選值**:Combobox / searchable 選擇後顯示的 tag 陣列
81
+ - **user-generated label**:使用者自己建立的標籤(如 Notion labels)
82
+
83
+ ## 何時不用
84
+
85
+ | 場景 | 改用 | 原因 |
86
+ |------|------|------|
87
+ | 通知計數 / 狀態紅點 | `Badge` | Badge 較小、適合 overlay、主要傳達數量或「有新東西」 |
88
+ | 互動式 filter(可點擊切換)| `Chip` | Tag 是純顯示,Chip 是可點擊控件 |
89
+ | Person 顯示(name + avatar)| `NameCard` / `Avatar + Text` | Tag 是單行 inline label,不承載人員資訊 |
90
+ | 可搜尋的多選入口 | `Combobox`(內部會渲染 Tag 陣列)| Combobox 才是選擇器,Tag 是選擇後的結果 |
91
+
92
+ ---
93
+
94
+ ## Color
95
+
96
+ 以色名命名,語義由消費端決定。建議用法與色彩系統的語義定義對齊。Prop 命名 `color`(對齊 MUI Chip / Ant Tag / Atlaskit Tag world-class 多數派 idiom)。 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
97
+
98
+ | Color | 建議用法 |
99
+ |---------|----------|
100
+ | `neutral`(預設) | 通用分類、草稿、無特定語義 |
101
+ | `blue` | 進行中、資訊提示、active 狀態(對應 `--info`) |
102
+ | `red` | 錯誤、已封鎖、危險(對應 `--error`) |
103
+ | `green` | 成功、已完成、已核准(對應 `--success`) |
104
+ | `yellow` | 警告、待審核、注意(對應 `--warning`) |
105
+ | `turquoise` | 分類色(無固定語義) |
106
+ | `purple` | 分類色(無固定語義) |
107
+ | `magenta` | 分類色(無固定語義) |
108
+ | `indigo` | 分類色(無固定語義) |
109
+
110
+ 所有有色 variant 直接使用 primitive token(`--color-blue-*`、`--color-deep-orange-*` 等),不使用 semantic token(`--primary`、`--error`)。Tag 的「blue」代表藍色本身,不代表「主要操作」語義。
111
+
112
+ **注意**:`red` variant 使用 primitive `deep-orange`(`--color-deep-orange-*`)。
113
+
114
+ ### 文字色
115
+
116
+ 所有有色 variant 的文字一律使用 primitive step-7(`--color-{hue}-7`),優先辨識度。Primitives 的相對色階公式在 dark mode 自動把 step-7 解析為高對比方向,確保文字在 subtle 底色上始終可讀。Tag 以呈現資訊為主,小面積色塊文字需要更高對比才能舒適閱讀。neutral variant 用 `text-foreground`(不適用此規則)。
117
+
118
+ 見 `color.spec.md` 的「文字色 Step 原則」。
119
+
120
+ ---
121
+
122
+ ## Solid 模式
123
+
124
+ `solid` boolean prop,預設 false。開啟後使用 step-6 全色背景 + 白色前景,適合需要更強視覺權重的場景(狀態標記、重點標籤)。
125
+
126
+ ### Subtle vs Solid 色彩對照
127
+
128
+ | Variant | Subtle 背景 | Subtle 文字 | Solid 背景 | Solid 文字 |
129
+ |---|---|---|---|---|
130
+ | neutral | `--muted` | `--foreground` | `--color-neutral-9` | `--inverse-fg` |
131
+ | blue | `--color-blue-1` | `--color-blue-7` | `--color-blue-6` | white |
132
+ | red | `--color-deep-orange-1` | `--color-deep-orange-7` | `--color-deep-orange-6` | white |
133
+ | green | `--color-green-1` | `--color-green-7` | `--color-green-6` | white |
134
+ | yellow | `--color-yellow-1` | `--color-yellow-7` | `--color-yellow-6` | **`--warning-foreground`** |
135
+ | turquoise | `--color-turquoise-1` | `--color-turquoise-7` | `--color-turquoise-6` | white |
136
+ | purple | `--color-purple-1` | `--color-purple-7` | `--color-purple-6` | white |
137
+ | magenta | `--color-magenta-1` | `--color-magenta-7` | `--color-magenta-6` | white |
138
+ | indigo | `--color-indigo-1` | `--color-indigo-7` | `--color-indigo-6` | white |
139
+
140
+ **yellow 例外**:yellow solid 背景亮度高,白字對比不足,改用 `--warning-foreground`(深色文字)。
141
+
142
+ ### Dismiss 行為(Inline Action 客製)
143
+
144
+ Dismiss 是 Inline Action,但 icon 色繼承 Tag 文字色(非 `fg-muted`),因為宿主有色彩:
145
+
146
+ | 模式 | Icon 色 | Hover 背景 | Active 背景 |
147
+ |---|---|---|---|
148
+ | subtle | 繼承 Tag 文字色 | `--neutral-hover` | `--neutral-active` |
149
+ | solid(有色) | 繼承 Tag 文字色 | `--{hue}-hover`(如 `--blue-hover`) | `--{hue}-active` |
150
+ | solid neutral | `--inverse-fg` | `--inverse-neutral-hover` | `--inverse-neutral-active` |
151
+
152
+ **Solid dismiss 採 solid color shade change**——跟 Button 等互動元件同視覺語言(hover 換較亮 step、active 換較暗 step),維持整個設計系統的互動一致性。這是我們選擇 Atlassian-style semantic state token 流派的具體體現(非 Material 3 的 state layer overlay)。
153
+
154
+ #### 為什麼 Tag 同時用 primitive(靜態色)和 semantic(互動色)
155
+
156
+ 這是 **有意的職責分離**,非 code smell:
157
+
158
+ | 概念 | 為什麼住這層 |
159
+ |------|------------|
160
+ | 靜態色(subtle bg、text、solid bg)→ **primitive** | 不需要 mode 翻轉知識——primitives 公式翻轉已自動處理 step-1 alpha、step-7 對比方向 |
161
+ | 互動色(hover、active)→ **semantic `--{hue}-hover/active`** | 需要保證「hover 永遠較亮、active 永遠較暗」,dark mode swap 必須住 semantic 層 |
162
+
163
+ 兩個概念本來就不該綁同一層。Tailwind 也是同樣分離:`bg-blue-500`(靜態 scale step)vs `hover:bg-blue-600 dark:hover:bg-blue-400`(互動需 consumer 處理 mode)。差別只在於我們把 mode swap 封裝進 token,consumer 不需自己寫 dark variant。
164
+
165
+ 詳細流派討論見 `color.spec.md` 的「架構流派定位」段落。
166
+
167
+ #### `--{hue}-hover/active` 的定位
168
+
169
+ Semantic 互動 token,從 brand color (`--primary-hover`) 延伸到所有作為 bg 的色相。**刻意只有 hover/active 兩個 token**——base/subtle/text 用 primitive。沒有 `--blue` base 或 `--blue-subtle`,避免重新引入完整 categorical 層。
170
+
171
+ #### Neutral 例外
172
+
173
+ neutral solid 的 bg 是 `--color-neutral-9`,在 dark mode 反轉(近黑 → 近白),bg 本身會跨 mode 變色。所以 overlay 不能用 `--{hue}-hover/active`(這些針對「bg 不變」的飽和色),改用 `--inverse-neutral-hover` / `--inverse-neutral-active`(內部處理 mode 鏡射 swap)。
174
+
175
+ Inline Action 的其他規則(尺寸、hover 背景 pattern)不變。
176
+
177
+ ---
178
+
179
+ ## 尺寸
180
+
181
+ 三種尺寸(子元件補齊原則),不隨 density 變化。尺寸在元件內定義,不引用 field-height token——Tag 和 Button 尺寸是獨立的設計決策。
182
+
183
+ | Size | 高度 | 字體 | 字重 | Tag px | Text px | 配對 field |
184
+ |------|------|------|------|----------|---------|-----------|
185
+ | sm | 20px | text-caption (12px) | font-medium | 4px | 4px | field sm |
186
+ | md(預設) | 24px | text-body (14px) | font-normal | 4px | 4px | field md |
187
+ | lg | 24px | text-body (14px) | font-normal | 4px | 4px | field lg(與 md 同值,子元件補齊原則) |
188
+
189
+ **Tag 內 icon 統一 16px**,不分 Tag 尺寸。
190
+
191
+ ## 內部結構
192
+
193
+ ```
194
+ [tag-px] [icon? | avatar?] [text-px TEXT text-px] [dismiss?] [tag-px]
195
+ ```
196
+
197
+ - tag-px:外層呼吸空間
198
+ - text-px:文字自身 padding(固定 4px),同時作為與 icon/avatar 和 dismiss 的間距
199
+ - 不用 gap——text padding 自然拉開
200
+ - icon / dismiss 顏色繼承文字色
201
+
202
+ ### Props
203
+
204
+ | Prop | 類型 | 說明 |
205
+ |------|------|------|
206
+ | `icon` | `LucideIcon` | 左側 icon,Tag 統一 16px。與 avatar 互斥 |
207
+ | `avatar` | `ReactNode` | 左側 avatar。與 icon 互斥 |
208
+ | `onDismiss` | `() => void` | 可移除——Tag 自動渲染 dismiss 按鈕並控制尺寸與互動樣式 |
209
+ | `solid` | `boolean` | 深底白字模式(step-6 背景 + 白色前景,yellow 例外),預設 false |
210
+
211
+ ## 圓角
212
+
213
+ 統一 `rounded-md`(4px)。
214
+
215
+ ## Tag 間距
216
+
217
+ tag 與 tag 之間:`gap-1`(4px)。
218
+
219
+ ## 包含 Tag 的 Field
220
+
221
+ Field 內包含 Tag 時,Field 的 padding 改為 `(field-height - tag-height) / 2`,確保 tag 四邊等距。
222
+
223
+ ---
224
+
225
+ ## Dismiss(Inline Action)
226
+
227
+ 傳入 `onDismiss` callback 時,Tag 自動渲染 dismiss 按鈕。消費端不需要自行建構 dismiss 按鈕或知道 inline action 的尺寸規格。
228
+
229
+ 尺寸 / 互動規則共用 SSOT 見 `../../patterns/element-anatomy/item-anatomy.spec.md`「Inline Action 設計規格」段落。
230
+
231
+ **Icon 色彩特例(colored host)**:Tag dismiss icon **繼承 Tag 文字色**(非 `fg-muted`)— Tag 屬「colored host」分類。完整兩支規則(neutral host vs colored host)見上述 item-anatomy.spec.md SSOT。詳細每 variant 的 icon 色 + hover 背景見上面「Dismiss 行為」表(92-100 行)。
232
+
233
+ | Tag size | Icon | Hover 背景 | 上下呼吸空間 |
234
+ |---|---|---|---|
235
+ | sm (20px) | 16px | 18px | 1px |
236
+ | md/lg (24px) | 16px | 18px | 3px |
237
+
238
+ ---
239
+
240
+ ## 禁止事項
241
+
242
+ - ❌ Tag 尺寸不引用 field-height token——兩者獨立
243
+ - ❌ 不用 gap 處理 icon/dismiss 間距——text padding 已拉開
244
+ - ❌ 不用 Tag 做 overlay 通知圓點——那是不同元件(Badge)
245
+ - ❌ 不用 color 名稱傳達語義(例:不靠 `red` = 錯誤)——color 是顏色,語義由消費端的內容和上下文決定
246
+ - ❌ 不用 prefix/suffix 傳入 dismiss 按鈕——用 `onDismiss` callback,Tag 內部控制渲染
247
+
248
+ ---
249
+
250
+ ## 為何無 StateBehavior
251
+
252
+ Tag 是**純顯示 indicator**(非互動 — 見「與 Button 的差異」段),本身**無互動狀態**:
253
+
254
+ - 無 hover / focus / active / selected / disabled——Tag 是 Family 3 indicator variant(非 Pill button)。若要 hover / selected 語意,改用 `Chip`(可互動版本)。
255
+ - 僅有的「行為」是 dismiss(`onDismiss` callback 觸發,Tag 本身不管 dismiss 動畫),close icon 的 hover 狀態屬 Inline Action pattern(item-anatomy.spec.md「Inline Action 設計規格」SSOT),非 Tag 自有。
256
+
257
+ 對應 anatomy story:保留 `Overview` + `Inspector` + `ColorMatrix`(variant solid/subtle) + `SizeMatrix`。互動狀態 → 改用 Chip(見「與 Button 的差異」段)。
258
+
259
+ ---
260
+
261
+ ## A11y 預設
262
+
263
+ Tag 是**純視覺 indicator**(非互動 control,互動版本是 Chip),預設 ARIA 行為:
264
+
265
+ - **靜態 Tag**(無 `onDismiss`):render 為 `<span>`,無 role(SR 讀文字內容,跟隨 inline flow)。若 Tag 表達狀態語意(「進行中」「已逾期」),consumer 應在父 region 用 `aria-label` 或視覺 prefix(icon)讓 SR 理解 context
266
+ - **Dismissible Tag**(`onDismiss` 存在):inline X close 為 `<Button iconOnly dismiss size="xs" aria-label="移除 {tagLabel}" />` — 對齊 inline-action canonical(`patterns/element-anatomy/inline-action.spec.md`)
267
+ - **Keyboard**:靜態 Tag 不取得 focus(無互動);dismissible 的 X 走 Button 鍵盤(Tab → focus → Enter/Space → dismiss)
268
+ - **Color-only 語意警告**:Tag 用色相區分狀態時必有文字 label 或 prefix icon(色盲 user 友好);對齊 WCAG 1.4.1「不僅靠顏色傳達」
269
+ - **驗證**:Storybook a11y addon panel 0 critical violation;WCAG AA contrast ≥ 4.5:1(text)/ 3:1(icon)
270
+
271
+ ## 相關
272
+
273
+ - `../Badge/badge.spec.md` — 通知計數 / 狀態紅點(overlay 場景)
274
+ - `../Chip/chip.spec.md` — 可互動 filter(Tag 的互動版本)
275
+ - `../Combobox/combobox.spec.md` — 多選場景會渲染 Tag 陣列
276
+ - `../NameCard/name-card.spec.md` — 人員資訊顯示
277
+
278
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
279
+
280
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
281
+
282
+ - `overflow-indicator.spec.md`
@@ -0,0 +1,151 @@
1
+ ---
2
+ component: Textarea
3
+ family: 4
4
+ variants: {}
5
+ sizes:
6
+ sm:
7
+ when: "form field-height 28 / compact chrome / dialog / panel context"
8
+ md:
9
+ when: "default general UI"
10
+ lg:
11
+ when: "text-body-lg(16px)"
12
+ traits:
13
+ - hasSizes
14
+ - hasInteractiveStates
15
+ - isInputLike
16
+ benchmark:
17
+ - Carbon TextArea: github.com/carbon-design-system/carbon/tree/main/packages/react/src/components/TextArea
18
+ - MUI TextField (multiline): github.com/mui/material-ui/tree/master/packages/mui-material/src/TextField
19
+ - Ant Design Input.TextArea: github.com/ant-design/ant-design/tree/master/components/input
20
+ ---
21
+
22
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
23
+
24
+ # Textarea 設計原則
25
+
26
+ ## 定位
27
+
28
+ Textarea 是**多行文字**的輸入與顯示元件——Input 的多行版本。格式化邏輯為 identity(value → value)。
29
+
30
+ **Layout Family**:Family 4(Field control)— multi-line variant。結構與單行 Family 4 相同(fieldWrapper + startIcon + content + endAction,視覺對齊 Family 1),僅高度可隨 rows / auto-resize 擴展、不受 `--field-height-*` 約束。
31
+
32
+ **實作基礎**:native `<textarea>` + 橋接 DS token,無 external primitive base。shadcn 同類做法。
33
+
34
+ 共用規則見 `../Field/field-controls.spec.md`。本文件只記錄 Textarea 特有的原則。
35
+
36
+ ---
37
+
38
+ ## 何時用
39
+
40
+ - **多行 / 長文字輸入**:評論、描述、備註、文章草稿、bio、issue content
41
+ - **使用者需要看到已輸入的全部內容**:邊寫邊 review(不像 Input 捲動)
42
+ - **內容可能包含換行**:段落、列表、程式碼片段
43
+ - **沒有字符數強限制的自由輸入**:content editor、markdown 編輯器 body
44
+
45
+ ## 何時不用
46
+
47
+ | 場景 | 改用 | 原因 |
48
+ |------|------|------|
49
+ | 單行文字(姓名、標題、URL、search)| `Input` | 單行用 Input,鍵盤 Enter 應該 submit 而非換行 |
50
+ | 數字 | `NumberInput` | 數字不該是自由多行文字 |
51
+ | 富文本 / WYSIWYG 編輯 | 專用 rich-text editor | Textarea 是純文字 |
52
+ | 搜尋輸入(即使可能長)| `Input` + `Combobox`(searchable)| 搜尋慣例是單行 + instant feedback |
53
+ | Code 編輯 | 專用 code editor(Monaco / CodeMirror)| Textarea 無語法 highlight / auto-complete |
54
+
55
+ ---
56
+
57
+ ## 與 Input 的差異
58
+
59
+ | | Input | Textarea |
60
+ |---|---|---|
61
+ | 行數 | 單行 | 多行(`rows` prop 控制預設)|
62
+ | 高度 | 固定 `h-field-*` | 由 rows / min-h 決定,支援 `resize-y` |
63
+ | Padding | `items-center`(單行垂直置中)| `py-2`(上下固定內距,多行需閱讀空間)|
64
+ | startIcon / endAction | 支援 | ❌ 不支援(textarea 慣例無 icon 框內)|
65
+ | Enter 鍵 | 觸發 form submit | 換行 |
66
+ | Readonly 呈現 | 同高度、灰底 | 保留邊框 + padding(讓多行文字有閱讀區)|
67
+
68
+ ---
69
+
70
+ ## Rows / 高度控制
71
+
72
+ - **`rows` prop**:預設 `3`,控制初始可見行數
73
+ - **`resize-y`**:使用者可手動拖拉下邊緣垂直 resize
74
+ - **`min-h-*` className**:消費者可透過 Tailwind utility 覆寫最小高度
75
+ - **禁止 `resize: horizontal` 或 `both`**:水平 resize 破壞 form 佈局
76
+
77
+ ---
78
+
79
+ ## Size
80
+
81
+ | Size | 字體 | 使用場景 |
82
+ |------|------|---------|
83
+ | sm / md | `text-body`(14px) | 一般 form / comment |
84
+ | lg | `text-body-lg`(16px) | 長篇閱讀(bio editor、article body)|
85
+
86
+ sm 與 md 視覺相同(純命名 mapping,對齊 Field family)。
87
+
88
+ ### 為什麼不完全對齊 `--field-height-*`
89
+
90
+ - **現況**:Textarea 高度由 `rows` + `resize-y` 決定,**不綁 `--field-height-*`**;`size` 只控字體(sm/md = text-body 14px / lg = text-body-lg 16px)與 padding 風格,**不控高度**
91
+ - **Rationale**:Textarea 是**多行輸入**,高度由內容 / rows 決定是本質特徵——若硬綁 field-height 只有單行高度,multi-line 場景無法表達。字體 tier 仍對齊 Field family(sm/md 共 text-body、lg 切 text-body-lg),確保並排單行 Input 的視覺 rhythm 一致
92
+ - **世界級對照**:Ant Design `<Input.TextArea>` rows 決定高度、autoSize object 配置 min/max / Material MUI `<TextField multiline>` 用 minRows/maxRows / Polaris `<TextField multiline>` 同流派——全部 textarea 的 container 高度獨立於 field-height,只繼承字體 / padding / border token <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
93
+
94
+ ---
95
+
96
+ ## Mode / Validation / a11y
97
+
98
+ 詳見 `../Field/field-controls.spec.md`(Mode / Validation)+ `../Field/form-validation.spec.md`(驗證時機)。三 mode 的色彩 / 互動 / aria 規則 Textarea 全部對齊。
99
+
100
+ ### Controlled / Uncontrolled(M26)
101
+
102
+ native `<textarea>` 自帶 `value` / `defaultValue` / `onChange` triplet — Textarea 是 thin wrapper 直接 forward。3 模式:uncontrolled(只 `defaultValue`)/ controlled(`value` + `onChange`)/ read-only(走 `readOnly` prop,Radix-style)。autoResize 與兩模式都相容(內部 layoutEffect 量 scrollHeight,不影響 value source)。
103
+
104
+ ### Readonly 特例
105
+
106
+ 不同於 Input 的 readonly(同高度、緊湊底色),Textarea readonly **保留邊框與 padding**——多行內容需要明確的閱讀區域邊界訊號,移除邊框後無法與周圍純文字內容區分。
107
+
108
+ ---
109
+
110
+ ## 禁止事項
111
+
112
+ - ❌ 把 Input 強制換行使用(撐高、ignore Enter 為 submit)——多行用 Textarea
113
+ - ❌ Textarea 裡放 startIcon / endAction——textarea 慣例無 icon 框內
114
+ - ❌ Textarea 啟用水平 resize(`resize-x` / `resize: both`)——破壞 form 佈局
115
+ - ❌ 把 Textarea 當 code editor 用(無 syntax highlight / auto-complete)
116
+ - ❌ Readonly 時移除邊框 + padding——多行內容需要閱讀區域邊界訊號
117
+
118
+ ---
119
+
120
+ ## 為何無 Inspector / StateBehavior
121
+
122
+ Textarea 是 **Field Controls family 的多行變體**,共用規則由 `../Field/field-controls.spec.md` own:
123
+
124
+ - **無 Inspector**:多行輸入的關鍵決策是「行數(rows)」與「resize 行為」,互動 Inspector 無法呈現「使用者輸入長文」的真實感——已由 `SizeMatrix`(各 size × rows 組合) + `RowsResizeMatrix`(auto-resize vs fixed rows vs resize-y)完整覆蓋。其他 prop(disabled / readonly / invalid)由 Field family 共用 pattern 管理。
125
+ - **無 StateBehavior**:Textarea 的互動狀態(focus ring / invalid / disabled / readonly)完全繼承 Field Controls SSOT(`field-controls.spec.md`「Mode 狀態」),無 Textarea 特有的 state 行為。重寫 StateBehavior = 與 Field family 漂移風險。
126
+
127
+ 對應 anatomy story:保留 `Overview` + `SizeMatrix` + `ModeMatrix`(edit/readonly/disabled continuation of Field) + `ColorMatrix` + 元件特有 `RowsResizeMatrix`。
128
+
129
+ ---
130
+
131
+ ## 相關
132
+
133
+ - `../Input/input.spec.md` — 單行文字的對應元件
134
+ - `../Field/field-controls.spec.md` — Field Control 共用規則(mode / size / error / focus)
135
+ - `../Field/form-validation.spec.md` — blur 驗證標準(多行輸入的驗證時機)
136
+ - `../LinkInput/link-input.spec.md` — URL 特殊處理
137
+
138
+ ## A11y 預設
139
+
140
+ **ARIA / Pattern**:native `<textarea>` element 預設 a11y;Field wrapper 補 `aria-labelledby` / `aria-invalid` / `aria-describedby`。
141
+
142
+ **Keyboard 行為**:
143
+
144
+ - Tab — focus
145
+ - 字母鍵 — 輸入
146
+ - Esc — 清空(若 clearable + 有值)
147
+
148
+ **Focus**:native input focus ring;DS focus-visible ring(`focus-visible:!border-primary`)由 Field wrapper 提供。
149
+
150
+ **驗證**:Storybook a11y addon panel 應 0 critical violation;鍵盤完整可操作(無需滑鼠)。WCAG AA contrast ≥ 4.5:1(text)/ 3:1(UI)。
151
+