@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,438 @@
1
+ <!-- @benchmark-cited: D5 retrofit 2026-05-18 — body claims marked per-claim @benchmark-unverified inline; canonical source URLs in frontmatter benchmark list. -->
2
+
3
+ # UiSize 設計原則
4
+
5
+ > **Foundational SSOT rationale**(cap 800,2026-04-25 approved):
6
+ > 尺寸 token SSOT。定義 field-height family `md` default / chrome-header 選型 decision tree(fixed-h vs padding-based + 8 家對照)/ icon-only `calc` 公式。Button / Input / Select / Checkbox / Slider / Tabs 等皆消費,scope 本質 > 單一 token 檔。
7
+
8
+ 元件高度的語義 token,rem 單位。透過 `data-density`(或 `data-ui-size`)切換。
9
+
10
+ ## Field Height
11
+
12
+ Button、Input、Checkbox/Radio SelectionItem 等互動元件。
13
+
14
+ | Token | md density | lg density |
15
+ |-------|-----------|-----------|
16
+ | `--field-height-xs` | 1.5rem (24px) | 1.5rem (24px) — 固定 |
17
+ | `--field-height-sm` | 1.75rem (28px) | 2rem (32px) |
18
+ | `--field-height-md` | 2rem (32px) | 2.25rem (36px) |
19
+ | `--field-height-lg` | 2.25rem (36px) | 2.5rem (40px) |
20
+
21
+ ### Field-height family 清單與共享 default(SSOT)
22
+
23
+ **消費 `--field-height-*` token 的元件組成「field-height family」。這個 family 必須共享同一個 default size = `md`——違反即設計 bug。**
24
+
25
+ #### Family 成員
26
+
27
+ | 元件 | size prop | Default | 預設 token |
28
+ |------|-----------|---------|-----------|
29
+ | `Button` | xs / sm / md / lg | **`md`** | `--field-height-md` |
30
+ | `Input` | sm / md / lg | **`md`** | `--field-height-md` |
31
+ | `NumberInput` | sm / md / lg | **`md`** | `--field-height-md` |
32
+ | `DatePicker` | sm / md / lg | **`md`** | `--field-height-md` |
33
+ | `Select` | sm / md / lg | **`md`** | `--field-height-md` |
34
+ | `Combobox` | sm / md / lg | **`md`** | `--field-height-md` |
35
+ | `LinkInput` | sm / md / lg | **`md`** | `--field-height-md` |
36
+ | `Textarea` | sm / md / lg | **`md`** | `--field-height-md` |
37
+ | `Switch` | sm / md / lg | **`md`** | `--field-height-md` |
38
+ | `Slider` | sm / md / lg | **`md`** | `--field-height-md`(只控容器外高,thumb/track 不變) |
39
+ | `SegmentedControl` | xs / sm / md / lg | **`md`** | `--field-height-md` |
40
+ | `Checkbox` | sm / md / lg | **`md`** | `--field-height-md`(控件 16/20px 對應) |
41
+ | `RadioGroup` | sm / md / lg | **`md`** | `--field-height-md`(控件 16/20px 對應) |
42
+ | `Rating` | sm / md / lg | **`md`** | `--field-height-md`(container 對齊,icon 走 icon tier 16/16/20) |
43
+ | `TimePicker` | sm / md / lg | **`md`** | `--field-height-md`(Ant-style 時間選擇,對齊 DatePicker 家族) |
44
+ | `Tag` | sm / md / lg | **`md`** | 自帶尺寸,透過 Field size 配對 |
45
+
46
+ #### 單一尺寸消費者(不在 default-md 規則內)
47
+
48
+ | 元件 | 固定 size | 理由 |
49
+ |------|----------|------|
50
+ | `Chip` | 固定 `h-field-sm`(28/32px) | Material 3 / Atlassian / Polaris 共識:filter chips 使用單一高度。不暴露 size prop |
51
+
52
+ #### 偏離 field-height family 的 rationale 格式(canonical)
53
+
54
+ 任何元件的 size prop **偏離 field-height 對齊**(例:Checkbox 控件 sm/md 都是 16px、Rating 控件非 field-height、Switch 的 thumb 不跟 field-height 成比例等)或 **偏離 default md**(例:Chip 固定 sm),**必須在自己 spec.md 的「尺寸」章節下寫一個子標題固定格式**:
55
+
56
+ ```markdown
57
+ ### 為什麼不完全對齊 `--field-height-*`(或:為什麼不 default md)
58
+
59
+ - **現況**:{sm/md/lg 實際數值或 token,e.g. sm=16px / md=16px / lg=20px(Checkbox)}
60
+ - **Rationale**:{一句話說明偏離理由,指向世界級或 token spec 或 UX 約束}
61
+ - **世界級對照**:{Polaris / Material / Ant / Atlassian 等中至少一個同樣這樣做的 DS}
62
+ ```
63
+
64
+ **必須同時滿足**:
65
+ 1. 子標題必含「為什麼」三字(而非被動「尺寸不同」這類寫法),這樣 audit 可以 mechanical grep 「`### 為什麼不完全對齊`」或「`### 為什麼不 default md`」
66
+ 2. 三個欄位(現況 / Rationale / 世界級對照)**都要填**,缺一不可——特別是「世界級對照」不能省,mindset #1 要求對標
67
+ 3. 位置:必須在 spec 的「尺寸」主章節之下(不是埋在「何時不用」或「禁止事項」等其他章節)
68
+
69
+ **現有已遵循此格式的元件**:Chip(本檔上表已寫,Material 3 / Atlassian / Polaris 共識)/ Checkbox / RadioGroup / Switch / Slider / Textarea / Rating(2026-04-21 批次補齊,五欄格式統一)
70
+ **需補齊 rationale 段的元件**:(無 — Phase 2 已全部補齊)。未來新增偏離 field-height 的元件 → 必須按本格式寫,`/design-system-audit` 會 enforce。
71
+
72
+ **audit hook 未來擴展**:若 cva `defaultVariants.size` 不是 `md`,或 `size` variants 的數值不命中 `--field-height-*`,hook 可要求 spec.md 必有符合格式的 rationale 段,否則 block merge(列為 post-Phase-2 可考慮加上的 mechanical gate)。
73
+
74
+ #### 為什麼必須共享 default
75
+
76
+ Consumer 寫 Form 或 Toolbar 時並排多個 field-height 元件:
77
+
78
+ ```tsx
79
+ <Button>送出</Button>
80
+ <Input />
81
+ <Select options={...} />
82
+ <SegmentedControl>...</SegmentedControl>
83
+ ```
84
+
85
+ **所有元件不傳 size 時就自動對齊**——這是 consumer 的核心體驗。若 SegmentedControl 預設 sm 而 Button 預設 md,consumer 放著不管就會高度不一致,每個 consumer 都要記得手動傳 size,破壞「默認對齊」的承諾。
86
+
87
+ #### 硬規則
88
+
89
+ - **新增 field-height 消費者** → 必須 default `md`
90
+ - **修改既有 `defaultVariants.size`** → 必須同步更新本表 + 元件 spec.md + tsx docblock + anatomy story 的 default 標記
91
+ - **`defaultVariants.size` 跟 spec 聲稱不一致 = 設計 bug**,優先修 code 或 spec 使其對齊本表
92
+
93
+ #### 歷史錯誤
94
+
95
+ 本專案曾發生 SegmentedControl 的 code defaults 是 `md`、spec + docblock 寫 `sm ★default` 的三方不一致(2026-04-18 修正)。避免方式:改 cva `defaultVariants` 前先讀本表,確認新值仍符合 family 約束。
96
+
97
+ ## Table Row
98
+
99
+ DataTable 行高。density 切換統一 +0.5rem (+8px)。
100
+
101
+ | Token | md density | lg density |
102
+ |-------|-----------|-----------|
103
+ | `--table-row-sm` | 2rem (32px) | 2.5rem (40px) |
104
+ | `--table-row-md` | 2.5rem (40px) | 3rem (48px) |
105
+ | `--table-row-lg` | 3rem (48px) | 3.5rem (56px) |
106
+
107
+ ---
108
+
109
+ ## 元件尺寸對應系統
110
+
111
+ **`field-height-lg` 是尺寸切換點。** xs/sm/md 用同一組內部尺寸,lg 切換到較大的一組。
112
+
113
+ | | xs / sm / md | **lg** |
114
+ |---|---|---|
115
+ | **Field 高度** | 24 / 28 / 32px | **36px** |
116
+ | **Icon 尺寸** | 16px | **20px** |
117
+ | **Checkbox / Radio** | sm/md (16px) | **lg (20px)** |
118
+ | **字體** | text-body (14px) | **text-body-lg (16px)** |
119
+
120
+ ### 子元件補齊原則
121
+
122
+ 當子元件被父元件透過 size prop 消費時,子元件必須補齊父元件的所有 size 選項,即使值重複。消費端直接透傳 size,不做 mapping。
123
+
124
+ 已套用此原則的元件:Checkbox(sm=md=16px)、Radio(sm=md=16px)、Tag(lg=md=24px)。
125
+
126
+ ### 元件高度地板
127
+
128
+ **field-height-xs(24px)是獨立互動元件的最小高度。** 任何可獨立存在的互動元件(Button、Input 等)不得使用比 field-height-xs 更小的高度。若空間不足以容納 24px,應重新檢視容器佈局,而非縮小元件。
129
+
130
+ 比 24px 更小的互動區域只存在於元件內部的 Inline Action(如 Tag dismiss、Field endAction),由宿主元件的 spec 定義規格。
131
+
132
+ ### Icon 尺寸 Tier
133
+
134
+ 系統有兩個 icon tier,由元件引用的 field-height token 決定:
135
+
136
+ | 元件引用 | Icon | 控件(Checkbox/Radio) | 字體 |
137
+ |---|---|---|---|
138
+ | `field-height-xs / sm / md` | 16px | 16px(內部 icon 12px) | text-body |
139
+ | `field-height-lg` | 20px | 20px(內部 icon 16px) | text-body-lg |
140
+
141
+ 這是離散的兩組配對,不存在中間值,不需要公式推導。判斷依據是元件自身的 size prop 對應到哪個 field-height token,與全域 density 設定無關(density 只負責等比放大 field-height 的 px 值)。
142
+
143
+ **Stroke icon 尺寸的下限是 12px**(出現在 Checkbox 等指示器容器內部)。Filled indicator(如 Radio 的實心圓點)不受此限制——實心形狀在任何尺寸都清晰可辨。
144
+
145
+ ### 跨 regime pointer index(2026-05-18 codify per user audit「確保 SSOT 不偏移」)
146
+
147
+ 本 Icon Size Tier 段是 DS-wide icon size SSOT 的**主索引**。下列 7 個 carve-out 是別律 owner:
148
+
149
+ | Carve-out owner | File | Rule | Rationale cite |
150
+ |---|---|---|---|
151
+ | Rating star | `components/Rating/rating.spec.md:84` | Identity scale `{sm:20, md:24, lg:24}` 不走 icon tier | Ant 20 / Material 24 / Airbnb 24 |
152
+ | Avatar 內 icon | `components/Avatar/avatar.spec.md:165` | `round_even(size × 0.6)` formula | Material / Apple HIG |
153
+ | Empty illustration | `components/Empty/empty.tsx:48` | Avatar 48 wrap → icon 28(Avatar formula derived)| Empty-state canonical |
154
+ | FileViewer thumb | `components/FileViewer/file-viewer.tsx:621` | thumb 64 → icon 20(file-type indicator hardcode 無公式)| Thumbnail UI 慣例 |
155
+ | CircularProgress | `components/CircularProgress/circular-progress.tsx:87` | `strokeWidth = max(2, size/10)` stroke ring 厚度非 icon | Geometric scaling |
156
+ | Steps indicator icon | `components/Steps/steps.tsx:24` | `INDICATOR_ICON_SIZE {sm:0, md:16, lg:20}`(sm 因圓圈 8px 太小)| Indicator-internal |
157
+ | Checkbox/Switch check | `components/Checkbox/checkbox.tsx:49` + `components/Switch/switch.tsx:73` | `{sm:12, md:12, lg:16}` form-control internal + stroke 下限 12 | iOS HIG / Material 3 / Polaris |
158
+
159
+ **程式化 SSOT**:`patterns/element-anatomy/item-anatomy.tsx:66` `ICON_SIZE = {sm:16, md:16, lg:20}` 是本 tier 的 type-safe const。**Form control 透過 `tokens/uiSize/icon-size.ts` re-export entry import**(避 components→patterns 反向 dependency)。
160
+
161
+ **新加 carve-out 流程**:必同時(1)在 owner spec 內部宣告 + cite(2)補本表 row。Audit dim 30 cross-doc consistency 抓 drift。
162
+
163
+ ### Tag ↔ Field 配對
164
+
165
+ Tag 有自己的尺寸定義(見 `tag.spec.md`),與 Field 的配對透過 size 直接對應:
166
+
167
+ | Field size | Tag size | Tag 高度 | Tag padding (四邊等距) |
168
+ |---|---|---|---|
169
+ | sm | sm | 20px | (field-height-sm - 1.25rem) / 2 |
170
+ | md | md | 24px | (field-height-md - 1.5rem) / 2 |
171
+ | lg | lg | 24px | (field-height-lg - 1.5rem) / 2 |
172
+
173
+ ---
174
+
175
+ ## Tab Height
176
+
177
+ Tabs 導覽容器的高度。獨立於 field-height 和 table-row——tabs 是 navigation container,需要比 form control 更大的呼吸感。數值目前與 table-row 對齊,但概念獨立,未來任何一方調整都不牽動另一方。
178
+
179
+ | Token | md | lg | 消費者 |
180
+ |-------|----|----|--------|
181
+ | `--tab-height-sm` | 32px | 40px | Dialog / Sidebar 內的 dense tabs |
182
+ | `--tab-height-md` | 40px | 48px | **預設**,頁面主要 tabs |
183
+ | `--tab-height-lg` | 48px | 56px | Page-level hero tabs |
184
+
185
+ Tailwind:`h-tab-sm` / `h-tab-md` / `h-tab-lg`。
186
+
187
+ ## Chrome Header Height
188
+
189
+ 應用程式 chrome 區域(Sidebar header、app top bar、主內容 page header)的高度。**定義在 DS package `packages/design-system/src/tokens/uiSize/uiSize.css`**(2026-05-23 per Phase A Decision 1 從 consumer-app `src/globals.css` 搬入,user verbatim「決策一照你建議」— 為了 npm-package install 後 consumer 不需自設 token,符 M17 SSOT 鐵律)。雖然它是**跨佈局層級**的 token(跨多元件而非單一 component scope),DS package 自包避免 consumer 漏設造成 header 高度崩潰。
190
+
191
+ **Cross-family canonical SSOT pointer**:chrome + overlay 兩 header 家族的完整視覺契約(border / padding / withTabs lockstep / size 對應 / Token equality enforcement)詳 `patterns/header-canonical/header-canonical.spec.md`。本節僅 codify token 本身定義 + consumer 清單。
192
+
193
+ | Token | md | lg | 消費者 |
194
+ |-------|----|----|--------|
195
+ | `--chrome-header-height` | 48px | 56px | Sidebar header/footer、主內容 page header、app top bar、`--sidebar-width-icon`、**Overlay family chrome**(Dialog / Sheet / Popover / Coachmark header + footer,透過 `patterns/overlay-surface` 的 SurfaceHeader / SurfaceFooter `min-h-[var(--chrome-header-height)]`)、**Chrome family ChromeHeader primitive**(`patterns/header-canonical/chrome-header.tsx`,Sidebar / FileViewer Toolbar+InfoPanel 消費)|
196
+
197
+ ### Canonical 意圖(AR47,2026-04-21)
198
+
199
+ **任何跨整個 app 的 chrome 區域(Sidebar header/footer、全域 top bar、主內容 page header)都用同一個 token,不自訂高度**。
200
+
201
+ | ❌ 反例 | ✓ canonical |
202
+ |---------|-------------|
203
+ | `<header className="h-16">`(64px 硬寫) | `<header className="h-[var(--chrome-header-height)]">` |
204
+ | Sidebar 48、top bar 56、page header 64(跨元件不一致) | 全部 `--chrome-header-height`(md=48 / lg=56),density 自動聯動 |
205
+
206
+ ### 為什麼 48 跟 56 是「同一個 token 不同密度」不是不一致
207
+
208
+ **讀者常見誤解**:「Sidebar header 48px 但 XXX 56px → 沒共用?」
209
+ **正解**:48 / 56 都是**同一個 `--chrome-header-height` token**,只是 **density mode 不同**:
210
+ - 在 `<html data-density="md">`(預設)下 token resolve 到 48px
211
+ - 在 `<html data-density="lg">` 下 token resolve 到 56px
212
+ - 切換 density 時**整個 app 所有 chrome 高度同步變化**,不會有「Sidebar 48 但 top bar 56」的狀況
213
+ - 若同時看到 48 與 56,**兩個消費者必須在不同 density context 下渲染**(例如 app 主區 md、某個工具區 lg) — 這是刻意的 density context 切換,不是 bug
214
+
215
+ **驗證法**:在 DevTools 看兩個「似乎不一致」的 header,它們祖先 `html[data-density]` 值是否相同?
216
+ - 相同 → 真有 bug,硬寫了數字繞過 token
217
+ - 不同 → 其中一個元件在 density-override 情境,行為正確
218
+
219
+ **為什麼 48 不 56 / 64**:
220
+ - Material App Bar 56dp(mobile)/ 64dp(desktop);Airbnb 主站 header 80px;Shopify 64px
221
+ - 本 DS 選 **48px @ md / 56px @ lg** 取「密集工具型產品」的下限(Linear / Figma / Notion 主 chrome 40-52px),給主內容區留更多 vertical space
222
+ - 跟 Button-lg + Field-lg 高度(40 / 36)拉出視覺 hierarchy — chrome 高於任何 row control,但不壓迫內容
223
+
224
+ ### Chrome header 選型 canonical(2026-04-22 v5 整合,**DS-wide SSOT entry point**)
225
+
226
+ **本節是 DS-wide chrome header 設計選型的入口**。任何新 chrome surface(modal / toolbar / sidebar / banner)的 header 實作都從這裡開始判斷。
227
+
228
+ ---
229
+
230
+ #### Decision tree(必走)
231
+
232
+ ```
233
+ ┌─────────────────────────────────────────────────────────────┐
234
+ │ Q: 這個 chrome header 的 title 有可能多行 / │
235
+ │ 有 subtitle / 有 description 嗎? │
236
+ └──────────────┬──────────────────────────────────────────────┘
237
+
238
+ ┌────────┴────────┐
239
+ │ │
240
+ ▼ ▼
241
+ 不會 會 / 可能有
242
+ │ │
243
+ ▼ ▼
244
+ 【Fixed-height】 【Padding-based】
245
+ 剛性宣告 chrome 彈性宣告 chrome
246
+ 不會 grow 會隨內容 grow
247
+ │ │
248
+ ▼ ▼
249
+ h-[var(--chrome- overlay family:
250
+ header-height)] 用 SurfaceHeader(見下)
251
+ + items-center 非 overlay:
252
+ py-[var(--layout-space-tight)]
253
+ + data-unbounded slot trick
254
+ ```
255
+
256
+ ---
257
+
258
+ #### 2 種 pattern 對照
259
+
260
+ | Pattern | CSS | 語義宣告 | 適用場景 |
261
+ |---------|-----|---------|---------|
262
+ | **Fixed-height**(剛性)| `h-[var(--chrome-header-height)]` + `items-center` | 「content 永遠單行固定結構,不會 grow」 | Sidebar / FileViewer toolbar / FileViewer InfoPanel / app top bar / page header |
263
+ | **Padding-based**(彈性)| `py-[var(--layout-space-tight)]` + unbounded slot trick | 「content 可以 grow — title 多行 / subtitle / description」 | Dialog / Sheet / Popover / Coachmark header + footer |
264
+
265
+ **兩個 pattern 在單行 content 下視覺等效都是 48/56,但語義不同 — 選錯違反元件設計意圖**。
266
+
267
+ ---
268
+
269
+ #### 世界級對照(8 家 DS 同一 split pattern)
270
+
271
+ | DS | Fixed-height 實例 | Padding-based 實例 |
272
+ |----|-------------------|-------------------|
273
+ | Material M3 | AppBar 56/64 dp | Dialog min-height + padding |
274
+ | Polaris | TopBar 56px | Modal padding-based |
275
+ | Atlassian | global nav / top bar | Modal padding |
276
+ | Carbon(IBM)| UIShell 48px | Modal |
277
+ | Ant Design | Layout.Header | Modal(支援 subtitle prop)|
278
+ | Apple HIG | NavigationBar(compact)| Alert padding + NavBar large title grow |
279
+ | GitHub Primer | PageHeader | Dialog padding |
280
+ | VS Code / Figma | Activity Bar / toolbar | — |
281
+
282
+ **結論**:我方 "fixed / padding split" 是 8/8 世界級共通 pattern。
283
+
284
+ ---
285
+
286
+ #### 本 DS 當前分類
287
+
288
+ - **Fixed-h**:Sidebar header/footer / FileViewer toolbar + InfoPanel header / app top bar(grep verify)
289
+ - **Padding-based**(via SurfaceHeader/Footer):Dialog / Sheet / Popover / Coachmark header + footer
290
+ - **獨立 banner family**(不屬 chrome canonical):Notice / Alert / Toast(`px-4 py-3` fixed)
291
+
292
+ **一致性原則**:同元件不切換 pattern(FileViewer toolbar 永遠 fixed / Dialog 永遠 padding-based)。
293
+
294
+ ---
295
+
296
+ #### Overlay family 的 padding-based 實作
297
+
298
+ Overlay family 套 v5 `data-unbounded` slot trick(Button unbounded → SurfaceHeader 套負 my calc → 視覺 / a11y / 幾何同時對齊 chrome-header-height)。**完整細節**:`patterns/overlay-surface/overlay-surface.spec.md`「Chrome dismiss size canonical」。
299
+
300
+ ---
301
+
302
+ #### 選錯的後果(驗證 decision tree 的重要性)
303
+
304
+ - **Fixed-height 套到能 grow 的 chrome**(e.g. 把 Dialog 改 fixed-h 48):DialogDescription 被剪切 → 違反 modal 作為完整決策 context 的職責
305
+ - **Padding-based 套到剛性 chrome**(e.g. 把 Sidebar header 改 padding-based):長 workspace 名稱時 chrome 跳動 → 違反 sidebar 剛性佈局職責
306
+ - **overlay 用 xs dismiss(size 而非 layout-slot trick)**:touch target 變 24 違反 a11y,且 dismiss 按鈕尺寸與 overlay chrome 比例不協調 — v5 trick 同時保視覺 + a11y + 幾何
307
+
308
+ ---
309
+
310
+ #### 新元件 chrome 建立 checklist
311
+
312
+ 建新 surface with chrome header 前必過:
313
+ 1. ☐ 跑 decision tree:title 會 grow 嗎?(有 multi-line / subtitle / description 可能性?)
314
+ 2. ☐ 選 pattern:fixed-h OR padding-based
315
+ 3. ☐ 若 fixed-h:用 `h-[var(--chrome-header-height)]` + items-center,不自訂高度
316
+ 4. ☐ 若 padding-based + overlay family:直接用 SurfaceHeader / SurfaceFooter primitive(繼承 v5 trick)
317
+ 5. ☐ 若 padding-based + 非 overlay(少見):自行 `py-tight` + `[&_[data-unbounded]]:my-[calc(...)]` CSS rule,並在 spec 記錄 rationale
318
+ 6. ☐ Dismiss button:overlay 用 `<Button dismiss size="sm" data-dismiss />`(native sm,trick 自動套);notification banner 用 `<Button dismiss size="xs" />`(family 特化)
319
+
320
+ **SSOT 入口**(本節即入口):`tokens/uiSize/uiSize.spec.md`「Chrome header 選型 canonical」
321
+ - Density lg 模式下 56px 對齊 Material 桌面 app bar 的舒適呼吸 <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
322
+
323
+ ---
324
+
325
+ ## Chrome 左右 inline padding
326
+
327
+ → SSOT `tokens/layoutSpace/layoutSpace.spec.md`「規則 1.1:Chrome inline padding canonical」(統一 `--layout-space-loose`,M8 8 家世界級對照 + 禁止事項)。
328
+
329
+ ---
330
+
331
+ ## Inline Action
332
+
333
+ 詳見 `patterns/element-anatomy/item-anatomy.spec.md`「Inline Action 設計規格」節。
334
+
335
+ ---
336
+
337
+ ## Icon-only 元件的 padding canonical(2026-04-25 重訂)
338
+
339
+ **Idiom**:`aspect-square + p-0 + flex justify-center items-center`(Polaris / Atlassian 派)。
340
+ **禁用**:padding-formula `(field-height - icon)/2` 派(magic numbers + 易漏扣 border)。
341
+
342
+ ### Canonical 配方
343
+
344
+ ```tsx
345
+ const ICON_ONLY_BASE = 'aspect-square p-0 min-w-0 gap-0'
346
+
347
+ // render
348
+ className={cn(
349
+ baseVariants({ size }), // 已含 h-field-X + flex items-center justify-center
350
+ iconOnly && ICON_ONLY_BASE,
351
+ )}
352
+ ```
353
+
354
+ `aspect-square` 鎖 width=height(從 `h-field-X` 來)。`p-0` override base 的 `px-3`。SVG flex-center 自動視覺置中。**0 magic number / 0 公式 / 0 border-deduction** — 任何 size / icon 都自然正方形。
355
+
356
+ ### 為什麼選 padding-free 派(2026-04-25 從 padding-formula 派切換)
357
+
358
+ **舊 padding-formula 派的問題**:
359
+ - `(field-height - icon)/2` 沒扣 `border 2px` → SVG 被 flex `min-w-0` 擠成 width<intrinsic 的不對稱(2026-04-25 user 在 Safari mobile 從 DS Devmode 抓到 14×16 bug)
360
+ - 4 個 size 各自 hard-code icon-size magic number(16/20)與 border 2px → M17 SSOT violation
361
+ - 公式須在每 host 重複(Button + SegmentedControl + 任何新 host)→ Rule-of-3 風險
362
+
363
+ **Padding-free 派的優勢**:
364
+ - `aspect-square` 從 `h-field-X` 計算 width,無 magic number
365
+ - `p-0` + flex-center → SVG 自動置中,無公式
366
+ - Border 厚度由 `border-box` 自然吸收(width 不被影響)
367
+ - 對齊 **Polaris / Atlassian** 的 iconOnly idiom(2/4 家世界級派,另 2 家 Material/Ant 用 padding-based 屬不同設計取捨) <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
368
+
369
+ ### 各 size 的 icon-size
370
+
371
+ | Size | Icon size | 備註 |
372
+ |------|-----------|------|
373
+ | xs | 16px | 統一規則(2026-05-18 retire 過去 SegmentedControl xs=14 例外);對齊 Icon Size Tier L132-143 |
374
+ | sm | 16px | |
375
+ | md | 16px | |
376
+ | lg | 20px | lg 切換到大 icon tier |
377
+
378
+ icon-size 仍由 host(JS 常數 `ICON_SIZE` 或元件自管)透過 Lucide `size={iconSize}` prop 控,不走 CSS。
379
+
380
+ ### 適用元件
381
+
382
+ 目前已套用 padding-free idiom:**Button**、**SegmentedControl**。任何新增 iconOnly 互動元件必須使用 `ICON_ONLY_BASE` 配方,**禁用** padding-formula。
383
+
384
+ ### 反例(常見 anti-pattern)
385
+
386
+ ```tsx
387
+ // ❌ 禁:magic-number padding 公式(舊 idiom,易漏扣 border)
388
+ const ICON_ONLY_PX = {
389
+ sm: 'px-[calc((var(--field-height-sm)-16px)/2)]', // 沒扣 border 2px → SVG 14×16
390
+ md: 'px-[calc((var(--field-height-md)-16px-2px)/2)]', // 即使扣了 still magic number
391
+ }
392
+
393
+ // ✅ 對:padding-free
394
+ const ICON_ONLY_BASE = 'aspect-square p-0 min-w-0 gap-0'
395
+ ```
396
+
397
+ ---
398
+
399
+ ## Tailwind Bridge
400
+
401
+ 透過 `@theme inline` 橋接到 Tailwind spacing:
402
+
403
+ ```tsx
404
+ <div className="h-field-md" /> /* = var(--field-height-md) */
405
+ <div className="h-table-row-md" /> /* = var(--table-row-md) */
406
+ ```
407
+
408
+ ## 模式切換
409
+
410
+ 初始狀態在 `index.html` 設定:
411
+
412
+ ```html
413
+ <html data-density="md">
414
+ ```
415
+
416
+ 動態切換:
417
+
418
+ ```ts
419
+ document.documentElement.setAttribute('data-density', 'lg')
420
+ ```
421
+
422
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
423
+
424
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
425
+
426
+ - `button.spec.md`
427
+ - `dialog.spec.md`
428
+ - `selection-item.spec.md`
429
+ - `slider.spec.md`
430
+ - `tree-view.spec.md`
431
+
432
+ ## 被引用(auto-maintained,Dim 3 reciprocal audit)
433
+
434
+ > 本節由 `scripts/add-reciprocal-pointers.mjs` 自動維護,列出在 SSOT 語境下指向本 spec 的其他 spec。若要手動補充,寫在本節之前。
435
+
436
+ - `app-shell.spec.md`
437
+ - `breadcrumb.spec.md`
438
+ - `popover.spec.md`
@@ -1,31 +0,0 @@
1
- /* ═══════════════════════════════════════════════════════════════════════
2
- @qijenchen/design-system — Tailwind v4 Preset
3
- ═══════════════════════════════════════════════════════════════════════
4
-
5
- Single-import,即取即用 setup。Consumer entry CSS 只需 1 行:
6
-
7
- @import '@qijenchen/design-system/styles/preset';
8
-
9
- 等價於展開:
10
- @import 'tailwindcss';
11
- @import '@qijenchen/design-system/styles/tokens';
12
- @source '../path-to-DS-source';
13
-
14
- Why this exists:
15
- Tailwind v4 預設只掃 `src/**`(consumer 自己的 source),不掃 node_modules。
16
- DS 元件原始碼用的 utility class(`h-field-md` / `bg-primary-hover` etc.)
17
- 不在 consumer Tailwind scan scope 內 → 不會被產出 → 元件純文字無樣式。
18
-
19
- Preset 透過 `@source` directive(Tailwind v4 native)告訴 Tailwind:
20
- 「也掃 DS package source(node_modules/@qijenchen/design-system/src/**)」
21
- → DS 內部使用的 utility class 全 generated → 元件正確 render。
22
-
23
- Path resolution:
24
- `@source` 路徑相對於 *此 CSS 檔位置*。本檔在
25
- node_modules/@qijenchen/design-system/src/styles/preset.css
26
- 相對路徑 `../**/*` = node_modules/@qijenchen/design-system/src/**
27
- ═══════════════════════════════════════════════════════════════════════ */
28
-
29
- @import 'tailwindcss';
30
- @import './tokens.css';
31
- @source '../**/*.{js,ts,jsx,tsx}';