@qijenchen/design-system 0.1.0-beta.84 → 0.1.0-beta.86

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 (492) hide show
  1. package/AGENTS.md +210 -0
  2. package/CLAUDE.md +17 -191
  3. package/cli-init.mjs +30 -2
  4. package/dist/components/Accordion/accordion.d.ts +2 -2
  5. package/dist/components/Accordion/accordion.d.ts.map +1 -1
  6. package/dist/components/Accordion/accordion.js.map +1 -1
  7. package/dist/components/Avatar/avatar.js +1 -1
  8. package/dist/components/Avatar/avatar.js.map +1 -1
  9. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +1 -1
  10. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  11. package/dist/components/BulkActionBar/bulk-action-bar.js +3 -3
  12. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  13. package/dist/components/Button/button-group.d.ts +2 -2
  14. package/dist/components/Button/button-group.d.ts.map +1 -1
  15. package/dist/components/Button/button-group.js +2 -2
  16. package/dist/components/Button/button-group.js.map +1 -1
  17. package/dist/components/Button/button.d.ts +2 -1
  18. package/dist/components/Button/button.d.ts.map +1 -1
  19. package/dist/components/Button/button.js +1 -1
  20. package/dist/components/Button/button.js.map +1 -1
  21. package/dist/components/Carousel/carousel.d.ts +14 -8
  22. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  23. package/dist/components/Carousel/carousel.js +64 -37
  24. package/dist/components/Carousel/carousel.js.map +1 -1
  25. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -1
  26. package/dist/components/Checkbox/checkbox-group.js +21 -14
  27. package/dist/components/Checkbox/checkbox-group.js.map +1 -1
  28. package/dist/components/Checkbox/checkbox.d.ts +2 -2
  29. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  30. package/dist/components/Checkbox/checkbox.js +49 -10
  31. package/dist/components/Checkbox/checkbox.js.map +1 -1
  32. package/dist/components/Combobox/combobox.d.ts +15 -6
  33. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  34. package/dist/components/Combobox/combobox.js +13 -7
  35. package/dist/components/Combobox/combobox.js.map +1 -1
  36. package/dist/components/Command/command.d.ts.map +1 -1
  37. package/dist/components/Command/command.js +11 -2
  38. package/dist/components/Command/command.js.map +1 -1
  39. package/dist/components/DataTable/cell-registry.d.ts +5 -5
  40. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  41. package/dist/components/DataTable/cell-registry.js +41 -38
  42. package/dist/components/DataTable/cell-registry.js.map +1 -1
  43. package/dist/components/DataTable/column-types.d.ts +1 -17
  44. package/dist/components/DataTable/column-types.d.ts.map +1 -1
  45. package/dist/components/DataTable/column-types.js.map +1 -1
  46. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -1
  47. package/dist/components/DataTable/data-table-column-visibility-panel.js +71 -64
  48. package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -1
  49. package/dist/components/DataTable/data-table-filter-group.d.ts +47 -0
  50. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -0
  51. package/dist/components/DataTable/data-table-filter-group.js +154 -0
  52. package/dist/components/DataTable/data-table-filter-group.js.map +1 -0
  53. package/dist/components/DataTable/data-table-filter-panel.d.ts +0 -2
  54. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  55. package/dist/components/DataTable/data-table-filter-panel.js +5 -328
  56. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -1
  57. package/dist/components/DataTable/data-table-filter-value-picker.d.ts +29 -0
  58. package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -0
  59. package/dist/components/DataTable/data-table-filter-value-picker.js +187 -0
  60. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -0
  61. package/dist/components/DataTable/data-table-interaction-layer.d.ts +2 -2
  62. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  63. package/dist/components/DataTable/data-table-sort-manager.js +2 -2
  64. package/dist/components/DataTable/data-table-sort-manager.js.map +1 -1
  65. package/dist/components/DataTable/data-table.d.ts +1 -1
  66. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  67. package/dist/components/DataTable/data-table.js +44 -32
  68. package/dist/components/DataTable/data-table.js.map +1 -1
  69. package/dist/components/DatePicker/date-picker.d.ts +3 -3
  70. package/dist/components/DatePicker/date-picker.js +4 -4
  71. package/dist/components/DatePicker/date-picker.js.map +1 -1
  72. package/dist/components/DescriptionList/description-list.d.ts +3 -3
  73. package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
  74. package/dist/components/DescriptionList/description-list.js +6 -6
  75. package/dist/components/DescriptionList/description-list.js.map +1 -1
  76. package/dist/components/Dialog/dialog.d.ts +2 -2
  77. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  78. package/dist/components/Dialog/dialog.js.map +1 -1
  79. package/dist/components/DropdownMenu/dropdown-menu.d.ts +8 -3
  80. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  81. package/dist/components/DropdownMenu/dropdown-menu.js +7 -7
  82. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  83. package/dist/components/Field/field-context.d.ts +16 -10
  84. package/dist/components/Field/field-context.d.ts.map +1 -1
  85. package/dist/components/Field/field-context.js.map +1 -1
  86. package/dist/components/Field/field-types.d.ts +2 -2
  87. package/dist/components/Field/field-types.d.ts.map +1 -1
  88. package/dist/components/Field/field-types.js.map +1 -1
  89. package/dist/components/Field/field-wrapper.d.ts +20 -4
  90. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  91. package/dist/components/Field/field-wrapper.js +30 -31
  92. package/dist/components/Field/field-wrapper.js.map +1 -1
  93. package/dist/components/Field/field.d.ts +1 -1
  94. package/dist/components/Field/field.d.ts.map +1 -1
  95. package/dist/components/Field/field.js +25 -3
  96. package/dist/components/Field/field.js.map +1 -1
  97. package/dist/components/Field/index.d.ts +1 -0
  98. package/dist/components/Field/index.d.ts.map +1 -1
  99. package/dist/components/Field/index.js +2 -0
  100. package/dist/components/Field/index.js.map +1 -1
  101. package/dist/components/Field/use-form-validation.d.ts +1 -1
  102. package/dist/components/Field/use-form-validation.js.map +1 -1
  103. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  104. package/dist/components/FileItem/file-item.js +2 -5
  105. package/dist/components/FileItem/file-item.js.map +1 -1
  106. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  107. package/dist/components/FileUpload/file-upload.js +5 -1
  108. package/dist/components/FileUpload/file-upload.js.map +1 -1
  109. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  110. package/dist/components/FileViewer/file-viewer.js +2 -1
  111. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  112. package/dist/components/HoverCard/hover-card.d.ts +2 -2
  113. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  114. package/dist/components/HoverCard/hover-card.js +4 -2
  115. package/dist/components/HoverCard/hover-card.js.map +1 -1
  116. package/dist/components/InlineEdit/inline-edit.d.ts +23 -16
  117. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
  118. package/dist/components/InlineEdit/inline-edit.js +104 -62
  119. package/dist/components/InlineEdit/inline-edit.js.map +1 -1
  120. package/dist/components/Input/input.d.ts +1 -1
  121. package/dist/components/Input/input.d.ts.map +1 -1
  122. package/dist/components/Input/input.js +6 -6
  123. package/dist/components/Input/input.js.map +1 -1
  124. package/dist/components/LinkInput/link-input.d.ts +5 -5
  125. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  126. package/dist/components/LinkInput/link-input.js +3 -3
  127. package/dist/components/LinkInput/link-input.js.map +1 -1
  128. package/dist/components/Notice/notice.d.ts +17 -1
  129. package/dist/components/Notice/notice.d.ts.map +1 -1
  130. package/dist/components/Notice/notice.js +7 -1
  131. package/dist/components/Notice/notice.js.map +1 -1
  132. package/dist/components/NumberInput/number-input.d.ts +1 -1
  133. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  134. package/dist/components/NumberInput/number-input.js +12 -1
  135. package/dist/components/NumberInput/number-input.js.map +1 -1
  136. package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +1 -1
  137. package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -1
  138. package/dist/components/PeoplePicker/people-picker.d.ts +5 -5
  139. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  140. package/dist/components/PeoplePicker/people-picker.js +7 -5
  141. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  142. package/dist/components/PeoplePicker/person-display.d.ts +1 -1
  143. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  144. package/dist/components/ProfileCard/profile-card.d.ts +1 -1
  145. package/dist/components/ProfileCard/profile-card.js.map +1 -1
  146. package/dist/components/RadioGroup/radio-group.d.ts +3 -3
  147. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  148. package/dist/components/RadioGroup/radio-group.js +1 -1
  149. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  150. package/dist/components/Rating/rating.d.ts.map +1 -1
  151. package/dist/components/Rating/rating.js +4 -0
  152. package/dist/components/Rating/rating.js.map +1 -1
  153. package/dist/components/ScrollArea/scroll-area.d.ts +3 -2
  154. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  155. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  156. package/dist/components/SegmentedControl/segmented-control.d.ts +4 -3
  157. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  158. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  159. package/dist/components/Select/select.d.ts +16 -6
  160. package/dist/components/Select/select.d.ts.map +1 -1
  161. package/dist/components/Select/select.js +17 -5
  162. package/dist/components/Select/select.js.map +1 -1
  163. package/dist/components/SelectMenu/select-menu.d.ts +17 -1
  164. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  165. package/dist/components/SelectMenu/select-menu.js +17 -3
  166. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  167. package/dist/components/SelectionControl/boolean-value.d.ts +1 -1
  168. package/dist/components/SelectionControl/boolean-value.js.map +1 -1
  169. package/dist/components/Sheet/sheet.d.ts +2 -2
  170. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  171. package/dist/components/Sheet/sheet.js.map +1 -1
  172. package/dist/components/Sidebar/sidebar.d.ts +1 -1
  173. package/dist/components/Sidebar/sidebar.js +2 -2
  174. package/dist/components/Sidebar/sidebar.js.map +1 -1
  175. package/dist/components/Slider/slider.d.ts.map +1 -1
  176. package/dist/components/Slider/slider.js +6 -3
  177. package/dist/components/Slider/slider.js.map +1 -1
  178. package/dist/components/Steps/steps.d.ts +6 -4
  179. package/dist/components/Steps/steps.d.ts.map +1 -1
  180. package/dist/components/Steps/steps.js +19 -5
  181. package/dist/components/Steps/steps.js.map +1 -1
  182. package/dist/components/Switch/switch.d.ts +4 -4
  183. package/dist/components/Switch/switch.d.ts.map +1 -1
  184. package/dist/components/Switch/switch.js +3 -1
  185. package/dist/components/Switch/switch.js.map +1 -1
  186. package/dist/components/Tabs/tabs.d.ts +1 -1
  187. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  188. package/dist/components/Tabs/tabs.js +73 -23
  189. package/dist/components/Tabs/tabs.js.map +1 -1
  190. package/dist/components/Tag/tag.d.ts +3 -1
  191. package/dist/components/Tag/tag.d.ts.map +1 -1
  192. package/dist/components/Tag/tag.js +2 -2
  193. package/dist/components/Tag/tag.js.map +1 -1
  194. package/dist/components/Textarea/textarea.d.ts +4 -4
  195. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  196. package/dist/components/Textarea/textarea.js +15 -15
  197. package/dist/components/Textarea/textarea.js.map +1 -1
  198. package/dist/components/TimePicker/time-picker.d.ts +4 -4
  199. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  200. package/dist/components/TimePicker/time-picker.js +8 -5
  201. package/dist/components/TimePicker/time-picker.js.map +1 -1
  202. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  203. package/dist/components/Tooltip/tooltip.js +27 -23
  204. package/dist/components/Tooltip/tooltip.js.map +1 -1
  205. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  206. package/dist/components/TreeView/tree-view.js +16 -0
  207. package/dist/components/TreeView/tree-view.js.map +1 -1
  208. package/dist/index.d.ts +7 -7
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +6 -11
  211. package/dist/lib/drag-visual.d.ts +2 -2
  212. package/dist/lib/drag-visual.js.map +1 -1
  213. package/dist/lib/utils.d.ts +1 -0
  214. package/dist/lib/utils.d.ts.map +1 -1
  215. package/dist/lib/utils.js +21 -1
  216. package/dist/lib/utils.js.map +1 -1
  217. package/dist/patterns/element-anatomy/item-anatomy.d.ts +2 -0
  218. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  219. package/dist/patterns/element-anatomy/item-anatomy.js +2 -2
  220. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  221. package/dist/tokens/categorical-color.d.ts +3 -3
  222. package/dist/tokens/categorical-color.d.ts.map +1 -1
  223. package/dist/tokens/categorical-color.js +2 -2
  224. package/dist/tokens/categorical-color.js.map +1 -1
  225. package/ds-canonical/fork/AGENTS.md +213 -0
  226. package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +33 -0
  227. package/ds-canonical/fork/codex/hooks.json +16 -0
  228. package/ds-canonical/fork/governance.lock +22 -7
  229. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +22 -1
  230. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +14 -2
  231. package/ds-canonical/fork/manifest.json +10 -1
  232. package/ds-canonical/fork/preamble.md +3 -2
  233. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +7 -7
  234. package/ds-canonical/fork/skills/ux-audit/SKILL.md +1 -1
  235. package/ds-canonical/fork/skills/visual-audit/SKILL.md +0 -1
  236. package/ds-canonical/hooks/check_codex_brief_invariants.sh +9 -3
  237. package/ds-canonical/hooks/check_datatable_invariants.sh +6 -3
  238. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +22 -1
  239. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +11 -2
  240. package/ds-canonical/hooks/check_plugin_fork_health.sh +17 -1
  241. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +21 -4
  242. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +14 -2
  243. package/ds-canonical/hooks/session_start_governance_check.sh +10 -2
  244. package/ds-canonical/references/certified-surfaces.md +20 -0
  245. package/ds-canonical/references/preflight-gate-baseline.json +5 -0
  246. package/ds-canonical/references/principle-dim-map.json +20 -2
  247. package/ds-canonical/references/props-naming.md +2 -1
  248. package/ds-canonical/references/ssot-index.md +2 -2
  249. package/ds-canonical/references/story-baseline-registry.json +2 -2
  250. package/ds-canonical/rules/story-rules.md +1 -1
  251. package/ds-canonical/rules/ui-development.md +2 -1
  252. package/ds-canonical/skills/codex-collab/SKILL.md +7 -7
  253. package/ds-canonical/skills/codex-collab/references/brief-template.md +5 -1
  254. package/ds-canonical/skills/component-quality-gate/SKILL.md +1 -1
  255. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +5 -5
  256. package/ds-canonical/skills/design-system-audit/SKILL.md +5 -5
  257. package/ds-canonical/skills/product-ui-audit/SKILL.md +7 -7
  258. package/ds-canonical/skills/ux-audit/SKILL.md +1 -1
  259. package/ds-canonical/skills/visual-audit/SKILL.md +0 -1
  260. package/ds-story-manifest.json +21 -21
  261. package/llms-full.txt +3 -3
  262. package/llms.txt +1 -1
  263. package/package.json +2 -1
  264. package/src/components/Accordion/accordion.anatomy.stories.tsx +11 -11
  265. package/src/components/Accordion/accordion.principles.stories.tsx +21 -6
  266. package/src/components/Accordion/accordion.spec.md +10 -1
  267. package/src/components/Accordion/accordion.stories.tsx +10 -5
  268. package/src/components/Accordion/accordion.tsx +7 -2
  269. package/src/components/Alert/alert.principles.stories.tsx +2 -8
  270. package/src/components/AppShell/app-shell.anatomy.stories.tsx +19 -13
  271. package/src/components/AppShell/app-shell.principles.stories.tsx +21 -21
  272. package/src/components/AppShell/app-shell.spec.md +4 -0
  273. package/src/components/AppShell/app-shell.stories.tsx +4 -5
  274. package/src/components/Avatar/avatar.tsx +1 -1
  275. package/src/components/Badge/badge.spec.md +2 -2
  276. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +7 -3
  277. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +4 -1
  278. package/src/components/Breadcrumb/breadcrumb.stories.tsx +1 -1
  279. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +6 -6
  280. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +18 -6
  281. package/src/components/BulkActionBar/bulk-action-bar.spec.md +15 -5
  282. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +8 -24
  283. package/src/components/BulkActionBar/bulk-action-bar.tsx +4 -4
  284. package/src/components/Button/button-group.tsx +4 -4
  285. package/src/components/Button/button.anatomy.stories.tsx +26 -7
  286. package/src/components/Button/button.principles.stories.tsx +1 -1
  287. package/src/components/Button/button.spec.md +2 -2
  288. package/src/components/Button/button.stories.tsx +22 -28
  289. package/src/components/Button/button.tsx +2 -1
  290. package/src/components/Calendar/calendar.anatomy.stories.tsx +1 -1
  291. package/src/components/Calendar/calendar.spec.md +1 -1
  292. package/src/components/Carousel/carousel.spec.md +17 -1
  293. package/src/components/Carousel/carousel.tsx +93 -42
  294. package/src/components/Checkbox/checkbox-group.tsx +26 -15
  295. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +3 -3
  296. package/src/components/Checkbox/checkbox.spec.md +14 -3
  297. package/src/components/Checkbox/checkbox.stories.tsx +4 -4
  298. package/src/components/Checkbox/checkbox.tsx +79 -19
  299. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +5 -5
  300. package/src/components/Coachmark/coachmark.principles.stories.tsx +1 -1
  301. package/src/components/Combobox/combobox.anatomy.stories.tsx +11 -4
  302. package/src/components/Combobox/combobox.principles.stories.tsx +10 -11
  303. package/src/components/Combobox/combobox.spec.md +6 -2
  304. package/src/components/Combobox/combobox.stories.tsx +9 -36
  305. package/src/components/Combobox/combobox.tsx +42 -27
  306. package/src/components/Command/command.spec.md +3 -3
  307. package/src/components/Command/command.tsx +9 -2
  308. package/src/components/DataTable/cell-registry.tsx +75 -76
  309. package/src/components/DataTable/column-types.ts +4 -17
  310. package/src/components/DataTable/data-table-column-visibility-panel.tsx +20 -7
  311. package/src/components/DataTable/data-table-filter-group.tsx +231 -0
  312. package/src/components/DataTable/data-table-filter-panel.tsx +19 -436
  313. package/src/components/DataTable/data-table-filter-value-picker.tsx +237 -0
  314. package/src/components/DataTable/data-table-interaction-layer.tsx +3 -3
  315. package/src/components/DataTable/data-table-sort-manager.tsx +2 -2
  316. package/src/components/DataTable/data-table.anatomy.stories.tsx +25 -24
  317. package/src/components/DataTable/data-table.css +2 -3
  318. package/src/components/DataTable/data-table.principles.stories.tsx +17 -11
  319. package/src/components/DataTable/data-table.spec.md +8 -8
  320. package/src/components/DataTable/data-table.stories.tsx +39 -29
  321. package/src/components/DataTable/data-table.tsx +94 -68
  322. package/src/components/DataTable/filter-operators.spec.md +5 -3
  323. package/src/components/DateGrid/date-grid.spec.md +1 -1
  324. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +9 -9
  325. package/src/components/DatePicker/date-picker.principles.stories.tsx +4 -4
  326. package/src/components/DatePicker/date-picker.spec.md +9 -9
  327. package/src/components/DatePicker/date-picker.stories.tsx +9 -9
  328. package/src/components/DatePicker/date-picker.tsx +13 -13
  329. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +5 -5
  330. package/src/components/DescriptionList/description-list.principles.stories.tsx +2 -2
  331. package/src/components/DescriptionList/description-list.spec.md +12 -12
  332. package/src/components/DescriptionList/description-list.stories.tsx +3 -3
  333. package/src/components/DescriptionList/description-list.tsx +10 -10
  334. package/src/components/Dialog/dialog.tsx +4 -1
  335. package/src/components/DropdownMenu/dropdown-menu.tsx +27 -14
  336. package/src/components/Field/field-context.ts +17 -11
  337. package/src/components/Field/field-controls.spec.md +44 -37
  338. package/src/components/Field/field-types.ts +14 -12
  339. package/src/components/Field/field-wrapper.tsx +59 -43
  340. package/src/components/Field/field.anatomy.stories.tsx +6 -6
  341. package/src/components/Field/field.principles.stories.tsx +5 -28
  342. package/src/components/Field/field.spec.md +4 -4
  343. package/src/components/Field/field.stories.tsx +103 -72
  344. package/src/components/Field/field.tsx +36 -4
  345. package/src/components/Field/form-validation.spec.md +2 -0
  346. package/src/components/Field/index.ts +1 -0
  347. package/src/components/Field/use-form-validation.ts +1 -1
  348. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +3 -3
  349. package/src/components/FieldControlGroup/field-control-group.spec.md +3 -3
  350. package/src/components/FileItem/file-item.tsx +10 -8
  351. package/src/components/FileUpload/file-upload.principles.stories.tsx +7 -7
  352. package/src/components/FileUpload/file-upload.spec.md +3 -2
  353. package/src/components/FileUpload/file-upload.tsx +5 -1
  354. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1 -1
  355. package/src/components/FileViewer/file-viewer.principles.stories.tsx +1 -1
  356. package/src/components/FileViewer/file-viewer.spec.md +1 -1
  357. package/src/components/FileViewer/file-viewer.stories.tsx +1 -1
  358. package/src/components/FileViewer/file-viewer.tsx +3 -2
  359. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +6 -4
  360. package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -1
  361. package/src/components/HoverCard/hover-card.spec.md +2 -2
  362. package/src/components/HoverCard/hover-card.tsx +4 -2
  363. package/src/components/InlineEdit/inline-edit.anatomy.stories.tsx +184 -0
  364. package/src/components/InlineEdit/inline-edit.principles.stories.tsx +142 -0
  365. package/src/components/InlineEdit/inline-edit.spec.md +71 -46
  366. package/src/components/InlineEdit/inline-edit.stories.tsx +20 -19
  367. package/src/components/InlineEdit/inline-edit.tsx +211 -125
  368. package/src/components/Input/input.anatomy.stories.tsx +15 -15
  369. package/src/components/Input/input.principles.stories.tsx +3 -3
  370. package/src/components/Input/input.spec.md +4 -4
  371. package/src/components/Input/input.stories.tsx +3 -3
  372. package/src/components/Input/input.tsx +13 -13
  373. package/src/components/LinkInput/link-input.anatomy.stories.tsx +2 -2
  374. package/src/components/LinkInput/link-input.principles.stories.tsx +1 -1
  375. package/src/components/LinkInput/link-input.spec.md +6 -2
  376. package/src/components/LinkInput/link-input.stories.tsx +8 -8
  377. package/src/components/LinkInput/link-input.tsx +21 -19
  378. package/src/components/Notice/notice.principles.stories.tsx +1 -1
  379. package/src/components/Notice/notice.tsx +8 -2
  380. package/src/components/NumberInput/number-input.anatomy.stories.tsx +6 -6
  381. package/src/components/NumberInput/number-input.principles.stories.tsx +4 -4
  382. package/src/components/NumberInput/number-input.spec.md +6 -6
  383. package/src/components/NumberInput/number-input.stories.tsx +4 -4
  384. package/src/components/NumberInput/number-input.tsx +17 -5
  385. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +8 -4
  386. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +6 -7
  387. package/src/components/OverflowIndicator/overflow-indicator.spec.md +1 -1
  388. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +6 -30
  389. package/src/components/PeoplePicker/avatar-stack-overflow.ts +1 -1
  390. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +13 -10
  391. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +5 -1
  392. package/src/components/PeoplePicker/people-picker.stories.tsx +5 -5
  393. package/src/components/PeoplePicker/people-picker.tsx +39 -20
  394. package/src/components/PeoplePicker/person-display.tsx +3 -3
  395. package/src/components/Popover/popover.anatomy.stories.tsx +10 -7
  396. package/src/components/Popover/popover.principles.stories.tsx +49 -28
  397. package/src/components/Popover/popover.spec.md +4 -2
  398. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +1 -1
  399. package/src/components/ProfileCard/profile-card.tsx +1 -1
  400. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +14 -13
  401. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +8 -23
  402. package/src/components/ProgressBar/progress-bar.stories.tsx +8 -2
  403. package/src/components/README.md +1 -0
  404. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +8 -3
  405. package/src/components/RadioGroup/radio-group.stories.tsx +3 -3
  406. package/src/components/RadioGroup/radio-group.tsx +19 -14
  407. package/src/components/Rating/rating.anatomy.stories.tsx +1 -1
  408. package/src/components/Rating/rating.principles.stories.tsx +3 -3
  409. package/src/components/Rating/rating.spec.md +2 -2
  410. package/src/components/Rating/rating.stories.tsx +4 -18
  411. package/src/components/Rating/rating.tsx +5 -1
  412. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +1 -1
  413. package/src/components/ScrollArea/scroll-area.spec.md +1 -1
  414. package/src/components/ScrollArea/scroll-area.tsx +5 -2
  415. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +4 -1
  416. package/src/components/SegmentedControl/segmented-control.spec.md +5 -10
  417. package/src/components/SegmentedControl/segmented-control.tsx +6 -3
  418. package/src/components/Select/select.anatomy.stories.tsx +13 -7
  419. package/src/components/Select/select.principles.stories.tsx +3 -3
  420. package/src/components/Select/select.spec.md +11 -1
  421. package/src/components/Select/select.stories.tsx +41 -27
  422. package/src/components/Select/select.tsx +44 -26
  423. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +44 -26
  424. package/src/components/SelectMenu/select-menu.principles.stories.tsx +0 -1
  425. package/src/components/SelectMenu/select-menu.stories.tsx +7 -19
  426. package/src/components/SelectMenu/select-menu.tsx +38 -5
  427. package/src/components/SelectionControl/boolean-value.tsx +2 -2
  428. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +1 -1
  429. package/src/components/SelectionControl/selection-item.principles.stories.tsx +4 -4
  430. package/src/components/Separator/separator.principles.stories.tsx +1 -1
  431. package/src/components/Sheet/sheet.principles.stories.tsx +5 -3
  432. package/src/components/Sheet/sheet.tsx +4 -1
  433. package/src/components/Sidebar/sidebar.tsx +1 -1
  434. package/src/components/Slider/slider.anatomy.stories.tsx +5 -4
  435. package/src/components/Slider/slider.principles.stories.tsx +6 -6
  436. package/src/components/Slider/slider.spec.md +13 -1
  437. package/src/components/Slider/slider.stories.tsx +44 -32
  438. package/src/components/Slider/slider.tsx +13 -4
  439. package/src/components/Steps/steps.anatomy.stories.tsx +7 -7
  440. package/src/components/Steps/steps.principles.stories.tsx +1 -1
  441. package/src/components/Steps/steps.spec.md +4 -2
  442. package/src/components/Steps/steps.stories.tsx +4 -56
  443. package/src/components/Steps/steps.tsx +31 -7
  444. package/src/components/Switch/switch.anatomy.stories.tsx +3 -3
  445. package/src/components/Switch/switch.principles.stories.tsx +1 -1
  446. package/src/components/Switch/switch.spec.md +4 -4
  447. package/src/components/Switch/switch.stories.tsx +3 -3
  448. package/src/components/Switch/switch.tsx +16 -10
  449. package/src/components/Tabs/tabs.anatomy.stories.tsx +6 -0
  450. package/src/components/Tabs/tabs.principles.stories.tsx +10 -2
  451. package/src/components/Tabs/tabs.spec.md +5 -2
  452. package/src/components/Tabs/tabs.stories.tsx +36 -44
  453. package/src/components/Tabs/tabs.tsx +101 -36
  454. package/src/components/Tag/tag.anatomy.stories.tsx +2 -2
  455. package/src/components/Tag/tag.principles.stories.tsx +4 -4
  456. package/src/components/Tag/tag.spec.md +3 -1
  457. package/src/components/Tag/tag.tsx +5 -3
  458. package/src/components/Textarea/textarea.anatomy.stories.tsx +6 -6
  459. package/src/components/Textarea/textarea.spec.md +5 -5
  460. package/src/components/Textarea/textarea.tsx +24 -24
  461. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +12 -11
  462. package/src/components/TimePicker/time-picker.principles.stories.tsx +37 -44
  463. package/src/components/TimePicker/time-picker.spec.md +6 -5
  464. package/src/components/TimePicker/time-picker.stories.tsx +3 -3
  465. package/src/components/TimePicker/time-picker.tsx +24 -14
  466. package/src/components/Toast/toast.principles.stories.tsx +1 -1
  467. package/src/components/Toast/toast.stories.tsx +1 -1
  468. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +15 -6
  469. package/src/components/Tooltip/tooltip.principles.stories.tsx +4 -4
  470. package/src/components/Tooltip/tooltip.spec.md +9 -3
  471. package/src/components/Tooltip/tooltip.stories.tsx +1 -1
  472. package/src/components/Tooltip/tooltip.tsx +12 -2
  473. package/src/components/TreeView/tree-view.anatomy.stories.tsx +16 -14
  474. package/src/components/TreeView/tree-view.principles.stories.tsx +44 -11
  475. package/src/components/TreeView/tree-view.spec.md +8 -6
  476. package/src/components/TreeView/tree-view.stories.tsx +9 -43
  477. package/src/components/TreeView/tree-view.tsx +36 -0
  478. package/src/index.ts +16 -9
  479. package/src/lib/drag-visual.ts +2 -2
  480. package/src/lib/utils.ts +19 -0
  481. package/src/patterns/element-anatomy/inline-action.spec.md +1 -1
  482. package/src/patterns/element-anatomy/item-anatomy.tsx +4 -2
  483. package/src/patterns/header-canonical/header-canonical.spec.md +9 -0
  484. package/src/patterns/header-canonical/header-canonical.stories.tsx +31 -5
  485. package/src/tokens/categorical-color.ts +5 -5
  486. package/src/tokens/color/color.spec.md +5 -5
  487. package/src/tokens/color/primitives.css +9 -2
  488. package/src/tokens/opacity/opacity.spec.md +1 -1
  489. package/src/tokens/orphan-tokens.spec.md +1 -1
  490. package/src/tokens/typography/typography.spec.md +2 -0
  491. package/src/tokens/uiSize/uiSize.css +6 -1
  492. package/src/tokens/uiSize/uiSize.spec.md +1 -1
package/AGENTS.md ADDED
@@ -0,0 +1,210 @@
1
+ # 本專案 AI 治理核心(provider-neutral;AGENTS.md 開放標準)
2
+
3
+ **本檔為所有 AI agent 的治理 SSOT bootstrap**:Codex 等支援 AGENTS.md 標準的 agent 原生載入;Claude Code 經 `CLAUDE.md` 的 `@AGENTS.md` import 載入同一份(Anthropic 官方共用模式)。增刪改治理核心**只改本檔**,兩邊自動同步。
4
+ **最終 authority 不是本檔**:本檔引導行為;不可繞過的強制層 = `npm run release:preflight`(~30 deterministic gates)+ CI(release.yml / ci.yml)。**任何 provider 產出的不合規變更都無法通過 preflight/CI 發佈**。Claude 另有 write-time hooks 加速回饋(`.claude/hooks/`,provider 專屬加速器,非信任邊界)。
5
+
6
+ # 每次任務前的 6 條 mindset(世界級設計系統的工作底色)
7
+
8
+ 這 6 條是本專案所有規則背後的**態度**。接到任務先複習一遍,再看具體規則。
9
+
10
+ 1. **對標世界級 + 不取巧省工**——每個設計決策都要能回答「Polaris / Material / Atlassian / Ant / Carbon / Apple HIG 怎麼做?」沒對齊又說不出理由 = 設計 bug。視覺整齊度不輸原版 + 符合 DS 語言**同時成立**。**禁止以「選較簡單」「省 N edits」為由選 shortcut**——一律最世界級做法。說「快速修」「省工程」是 yellow flag,停下重想。
11
+ 2. **不憑直覺發明 / 優先消費既有**——新增任何值 / 名 / pattern / variant / layout primitive 前先 `grep` 既有。**強制 `# SSOT 消費 canonical` 清單**——寫視覺 code 前列消費的 components/patterns/tokens/spec。提建議也算定 pattern,給 option 必對照 DS canonical + ≥3 家世界級。**禁止憑印象列部分家**。
12
+ 3. **改一處必看三處**——code / spec / story 三方聯動。改 cva `defaultVariants` / variant / token 前先 grep 該元件所有檔案,一次改完。
13
+ 4. **範例必真實業務場景**——Jira / Stripe / Notion / Figma 可辨識情境;禁 `Option A/B/C`、「按鈕一」、極端不現實、ASCII art。
14
+ 5. **猶豫就問**——無前例的決策:grep 既有 → 讀近親 spec → 仍不確定停下問。**禁止憑直覺造新 pattern**。
15
+ 6. **大原則吸收瑣碎**——同類 bug 反覆糾正 = meta 層沒抓住。見 `.claude/rules/meta-patterns.md` 31 active M-rules(M1-M32,M27/M33/M34/M35 retired,折入 M20/M7/M23(c)(d))。**AI 不需 user 提醒才找 root invariant**——rule 震盪 → AI 自跑 M12 benchmark + invariant test。User 第 2 次問 → 必截圖 verify(M13)。對話結論 → AUTO 5-layer pipeline(M14)。Visual / behavior decision 前必先 WebFetch ≥ 3 source(M26)。Solo-work git ops 必先 grep canonical(M28)。**視覺/結構 propose 前必 grep DS spec.md 找 owner SSOT(M29)— 出 3-column 表;否則提案不被接受**。使用者 tell me once 不該要 tell me twice。
16
+
17
+ 完整 M-rules 詳 `.claude/rules/meta-patterns.md`(必讀)。
18
+
19
+ # Rule Index(progressive disclosure — 編對應檔案前必先讀)
20
+
21
+ | 檔案 | 何時必讀 |
22
+ |---|---|
23
+ | `.claude/rules/meta-patterns.md` | 每個任務(31 條 M-rules,fundamental)|
24
+ | `.claude/rules/spec-rules.md` | 編任何 `*.spec.md` 或 DS 內容 |
25
+ | `.claude/rules/ui-development.md` | 編任何 `.tsx`/`.ts`(Tailwind 5 條 / Token 4 條 / Props 命名 / shadcn / public-vs-internal)|
26
+ | `.claude/rules/story-rules.md` | 編任何 `*.stories.tsx`(三層定位 / Title / 範例準則)|
27
+ | `.claude/rules/self-verify.md` | 編任何檔案(Pre/Mid/Post/Pre-commit 4 階段自驗)|
28
+ | `.claude/references/ssot-consultation.md` | 寫視覺 code 前(9 項決策對應 SSOT + tsx 檔頭宣告)|
29
+ | `.claude/references/ssot-index.md` | 視覺/結構 propose 前(owner SSOT 對照)|
30
+ | `.claude/references/naming-conventions.md` | 命名新檔/變數/prop |
31
+ | `.claude/skills/design-system-audit/references/audit-prompts.md` | 稽核判準 SSOT(91 dim rubric,Claude 與 Codex 同判準)|
32
+
33
+ (Claude Code 對 `.claude/rules/` 有 path-scoped 自動載入;其他 agent 依本表在編對應檔案前主動讀取——**同一份檔案,零複製**。)
34
+
35
+ # 治理 canonical(home 分層 + anti-bloat)
36
+
37
+ ## 規則放哪 home(8-home 分層)
38
+
39
+ | Level | Home | 收什麼 |
40
+ |-------|------|--------|
41
+ | 1 | `AGENTS.md`(本檔;Claude 經 CLAUDE.md import) | 每 session signal 的 mindset + 6 條 + 任務導航 |
42
+ | 1.5 | `.claude/rules/*.md` | path-scoped rules(Claude 自動載入;其他 agent 按 Rule Index 讀) |
43
+ | 2 | `{name}.spec.md` | 單元件「何時用 / 為什麼」 |
44
+ | 3 | Pattern `spec.md` | runtime 跨元件 primitive |
45
+ | 4 | Code(`.tsx` / `.css`) | cva / 型別等機械強制 |
46
+ | 5 | Skill(`.claude/skills/`) | invoke 情境的多步驟 workflow + checkpoint |
47
+ | 6 | Memory(`~/.claude/.../memory/` SSOT + repo `.claude/memory/` mirror)| 跨 session 狀態。本機編完跑 `npm run sync-memory` 推回 repo |
48
+ | 7 | Hook(`.claude/hooks/`) | 機械化 pre/post tool 檢查(Claude write-time;最終兜底 = preflight/CI) |
49
+ | 8 | Slash Command(`.claude/commands/`) | 一次性單步 action |
50
+ | 9 | Plan doc(`.claude/planning/`)| 完整 plan / RFC / spec 草稿 SSOT;memory file 是短 index pointer |
51
+
52
+ **Q1 設計規則 → Level 1-4 / Q2 invoke 情境 → Skill or Command / Q3 隨時間變化 → Memory(short index)+ Plan doc / Q4 機械化 → Hook(+ preflight gate)**。完整 flowchart → `.claude/skills/design-system-audit/references/rule-placement.md`。
53
+
54
+ ## 行數預算(Anthropic 對齊)
55
+
56
+ Bootstrap(AGENTS.md + CLAUDE.md 合計)target ≤ 250 / transition ≤ 400 / hard cap 800。SKILL ≤ 250 / spec ≤ 300(foundational SSOT 例外 ≤ 800-1200)/ memory **per-file ≤ 100 lines** + **MEMORY.md index ≤ 20 entries**(soft 18 / hard 20)。Hooks **26 soft / 60 hard**(SSOT = `session_start_governance_check.sh` Check 7)。動態值以 `scripts/sync-governance-counters.mjs` 跑出為準。
57
+
58
+ ## Anti-bloat L1-L3
59
+
60
+ - **L1 Pre-write**:`check_file_size_budget.sh`(+ governance hooks — dynamic SSOT 在 `.claude/hooks/`)
61
+ - **L2 Per-edit**:`log_governance_fires.sh` → `.claude/logs/hook-fires.jsonl`
62
+ - **L3 Periodic**(季度 / `--deep`):`/knowledge-prune` skill,retire ≥ 5%
63
+
64
+ ## 加規則前必過 3 題
65
+
66
+ 1. 既有 Meta-Pattern / 近親 spec / canonical chapter 命中 → append pointer 不新寫
67
+ 2. **Rule-of-3**:同概念 ≥ 3 處 → 選 SSOT 其他 pointer
68
+ 3. 7 天後還會 fire 嗎?不確定 → 不寫
69
+
70
+ # 稽核 canonical
71
+
72
+ 3 層級 × 6 維度。**Stakeholder-visible artifact**(prototype / 元件 merge / 產品 demo)**必過 code + visual 雙層 audit**(搭配 M6+M10)。
73
+
74
+ | Tier | 時機 | Scope | Skill |
75
+ |------|------|-------|------|
76
+ | 1 Stakeholder-gate(強制)| 新元件 merge / prototype / demo | artifact-scoped | `/component-quality-gate` / `/prototype` P3.5 / `/product-ui-audit` P5 |
77
+ | 2 Daily dev | bug / refactor / 文字改 | git diff + direct consumer | `visual-audit --scope=changed`(default) |
78
+ | 3 Periodic deep | release / token 大改 / 季度 | full DS | `/design-system-audit --deep` |
79
+
80
+ | 維度 | 對應 skill |
81
+ |------|-----------|
82
+ | D1 設計語言 | `/design-system-audit` |
83
+ | D2 程式語言 | tsc + lint + `/design-system-audit` |
84
+ | D3 元件效能 | `/performance-audit` |
85
+ | D4 UX 行為 | `/ux-audit` |
86
+ | D5 視覺品質 | `/visual-audit`(Layer A mechanical + B AI) |
87
+ | D6 原則自檢 | `design-system-audit/references/principle-audit-protocol.md` |
88
+
89
+ **Consistency 類稽核必 Phase 0 全掃再判**。**Deep audit 全掃優先 + 決策 batch-at-end 鐵律**(2026-07-11 user directive):先全 DS 掃完(NO-SAMPLE)→ 跨元件去重 → **最後一次**列「真問題 + 只影響 SSOT-UI/UX」決策清單給 user 拍板;非-SSOT autonomous 做完美;**禁**途中逐元件問 user。
90
+
91
+ **Audit-vs-execute 分權**:動 canonical substantive meaning → STOP 提議;對齊 / 表達統一 / 清 duplicate / 補 pointer → AUTO。
92
+
93
+ **Scope classifier — Surgical visual bug**:user 列 N 個 visual defects + 無新 canonical / 無新 API contract / 無 cross-component semantic 改動 → **Surgical scope**:no collab / no new M-rule / no audit report,batch fix + final pixel-quantified verify only。Substantive 改動走 audit-vs-execute STOP 提議流程。
94
+
95
+ # Independent second opinion(跨 provider 對抗審查)
96
+
97
+ **Canonical 概念**:重大變更(governance / Critical DS change / deep audit)需 **author provider ≠ reviewer provider** 的獨立第二意見。判準 = 同一份 rubric(`audit-prompts.md`),reviewer 只提 findings(rule 對照 + severity + evidence),**不得**自建規範。記錄雙方 provider/model/version。
98
+ - Claude authored → Codex review(現行 driver = `/deep-audit-cross-codex` Phase B,transport = `scripts/codex-run-guarded.mjs`)
99
+ - Codex authored → Claude review(對稱)
100
+ - **Backend 不可用 → fail-closed**:標 review pending;禁同一 agent 假扮另一 provider;Critical change 不得取得 compliant 宣稱。
101
+
102
+ # SSOT 消費 canonical
103
+
104
+ 寫視覺 code 前必查對照 — 沒列 = 自創。**完整對照表 + 強制 checklist** → `.claude/references/ssot-consultation.md`(SSOT owner;含 9 項決策對應 SSOT + 新元件 tsx 開頭「── 消費的 SSOT ──」段強制要求)。
105
+
106
+ # 任務導航表
107
+
108
+ | 任務 | 必讀 |
109
+ |------|------|
110
+ | **新增元件** | `.claude/rules/ui-development.md` 「建立 UI 前必讀 / shadcn 元件規範」 + `.claude/rules/spec-rules.md` → `/component-quality-gate` |
111
+ | **修 variant / size / state** | 該元件 `spec.md` → `/story-writing` |
112
+ | **新增 token** | `tokens/README.md` → `.claude/rules/ui-development.md`「Token 命名 4 條硬規則」→ `tokens/xxx.spec.md` |
113
+ | **寫 story / 視覺 code** | `/story-writing` + `# SSOT 消費 canonical` |
114
+ | **命名新檔 / 變數 / prop** | `# 命名與語言一致性` + `.claude/rules/ui-development.md`「元件 Props 命名」 |
115
+ | **新元件 layout** | `# 4-Family Layout Model` |
116
+ | **建產品 / 開新 product app** | `npm run create-app <name>` → `apps/<name>/`;**2-scenario architecture SSOT** → `.claude/references/scenario-definition.md` |
117
+ | **新 skill / hook / command** | `.claude/{home}/README.md` charter |
118
+ | **無前例設計決策** | `# 遇不確定時的協議` |
119
+ | **Tailwind 出怪事** | `.claude/rules/ui-development.md`「Tailwind 5 條核心」+ `# 失敗記憶索引` |
120
+ | **Stakeholder 產出 / 稽核** | `# 稽核 canonical` |
121
+ | **User 糾正後** | `# 治理 canonical`(home 判斷) |
122
+ | **跟 codex 討論 / 多輪震盪 / 任何 codex 輸出** | `.claude/skills/codex-collab/SKILL.md`(M31 5-step canonical SSOT)+ M31 anchor in meta-patterns.md |
123
+ | **PR merge 後 / session start branch 健檢** | `# Git solo-work canonical` |
124
+
125
+ **找不到** → 進 `# 遇不確定時的協議`,不自決定。
126
+
127
+ # Git solo-work canonical(SSOT → `.claude/memory/feedback_solo_dev_workflow.md`)
128
+
129
+ **1 chat = 1 working branch**;**Netlify preview 是 user gate**;**「push」/「OK」trigger 才 merge main**。**Session-start 必先 grep canonical + 開 working branch,禁直接在 main 上 edit production code**(M28 sub-rule)。
130
+
131
+ | 步驟 | 動作 |
132
+ |------|------|
133
+ | 1 Edit | AI 改 code |
134
+ | 2 Commit + push working branch | 自動觸發 Netlify per-branch preview |
135
+ | 3 告訴 user 主要 change(or preview URL)| 讓 user 知道看什麼 |
136
+ | 4 等 user trigger | **「push / OK / 好 / 合 main」** → step 5;**「改 X / 不對 / 等等」** → 繼續 step 1 |
137
+ | 5 Squash merge to main | 不開 PR(可 GitHub API squash-merge OR fast-forward)|
138
+ | 5.5 **SSOT propagation gate** | 動到 skill/hook/spec/token/AGENTS/CLAUDE 等 SSOT-affecting paths + user 已給 merge trigger → AI 自動 bump → **`npm run release:preflight`**(唯一發版前 gate 指令)→ tag → publish → `npm view` 驗證,全程不停下問;user 隨時可喊停。bump npm `0.1.0-beta.<N+1>` |
139
+ | 6 砍 remote branch | `git push origin --delete <branch>` |
140
+ | 7 Local 對齊 | `git checkout main && git fetch && git reset --hard origin/main && git branch -d <branch>` |
141
+
142
+ **禁止**:開 PR / AI 自決 push main / 同 chat 開多 branch / 留 stale 不刪 / 「下個 session 處理」deferred 措辭。
143
+
144
+ # 命名與語言一致性
145
+
146
+ **3 重 test**(governance):
147
+ 1. **既有 DS 詞彙**:對齊 `compact/rich / sm/md/lg / action/indicator / scanning/reading`?
148
+ 2. **世界級 idiom**:≥ 2 家 world-class DS 用此詞?
149
+ 3. **跨元件認知衝突**:同字串在其他元件已有不同語義?
150
+
151
+ 3 test 全過才採納。詳細 → `.claude/references/naming-conventions.md`。
152
+ **語言一致性**:spec.md 繁中(技術術語保留英) / code identifier 英 / 單一檔案不中英夾雜。
153
+
154
+ # 4-Family Layout Model
155
+
156
+ **每元件 spec 第一段必聲明 Layout Family**(1/2/3/4 或「self-contained」)。
157
+
158
+ | Family | 用途 | SSOT |
159
+ |--------|------|------|
160
+ | 1 Menu item / 2 List item | scanning / reading | `patterns/element-anatomy/item-anatomy.spec.md` |
161
+ | 3 Pill | 單行互動 pill | `components/Button/button.spec.md`「Pill Layout」|
162
+ | 4 Field control | 可編輯資料輸入 | `components/Field/field-controls.spec.md` |
163
+
164
+ # 自主執行 canonical(Autonomy Default)
165
+
166
+ **Default = autonomous + complete + verify-to-perfection;省工 = anti-pattern(違 mindset #1)**。
167
+
168
+ | 動作類別 | 預設 |
169
+ |---------|-----|
170
+ | **SSOT-affecting UI/UX**(增刪改 component / token / spec 視覺結構 / 跨元件 design language) | **ASK** — 中文具體人話講選項 + tradeoff,user 拍板才動 |
171
+ | Bug fix / clean / refactor / 命名一致 / test / audit / verify | **AUTO** — 整批做完 + 完整驗證 + 撤回機制 |
172
+ | Governance / hook / skill / spec **內部**(typo / pointer / 結構 — 不動 canonical meaning)| **AUTO** |
173
+ | Perf / a11y / 漸進遷移(不動 SSOT)| **AUTO** — 整批 + verify |
174
+
175
+ **自主執行同時優化 7 軸**:言簡意賅 / 效率+效能 / SSOT 鐵律 / 易懂維護擴充 / 世界級+一致設計語言 / 完整 self-verify / 自動 self-improve。
176
+ **反 pattern**(禁):「省工」/「下次再做」/「下個 session」/「OK 嗎?」過度 ASK / shortcut 避 verify。
177
+ **Trigger phrase auto-pipeline**:「依原則自主」/「不需問」/「馬不停蹄」/「全部做完」/「自動」→ autonomous mode,僅 SSOT-affecting UI/UX 停下 ASK。
178
+ **Triple-verify before propose**:propose / 列 option / 發現「問題」前必 inline 跑 (1) grep DS-wide (2) Read spec.md / tsx (3) 對照 canonical exception。三題全過才 propose。
179
+ **SSOT auto-sync invariant**:跨 file 數字禁 hardcode 多處;以 `scripts/sync-governance-counters.mjs` 機械對齊。
180
+
181
+ # 遇不確定時的協議
182
+
183
+ **無前例且影響 SSOT UI/UX 設計判斷**時 3 步,禁跳:**grep 既有**(30 秒)→ **讀近親 spec.md** → **仍不確定停下問** user。
184
+ **非 SSOT-UI/UX**(refactor / test / perf / a11y / hook / skill / typo / 對齊既有 canonical)→ autonomous,無需問。
185
+ 禁:跳 grep 憑記憶 / 隨便挑 / 留 TODO。可跳:bug 修 / 機械勞動 / user 明確指示。
186
+
187
+ # 失敗記憶索引(技術沉默陷阱 only)
188
+
189
+ | 技術陷阱 | 一行 anchor |
190
+ |--------|-----------|
191
+ | Tailwind v4 `[--foo]` 必 `var()` | silent 失效 |
192
+ | tailwind-merge 自訂 utility 必註冊 group | 否則 strip |
193
+ | 元件自包 Provider | 劫持全站 |
194
+ | 清 unused imports 後 runtime | tsc 不充分,需 storybook |
195
+ | shadcn compat alias 回流 | dark mode 不聯動 |
196
+ | `asChild ? Slot : Native` 內部 JSX 仍渲染多 children | React.Children.only runtime fail;asChild 分支 render 只傳 consumer child |
197
+ | `tsc -b` 不 emit declaration | TS4023 漏抓;型別 surface 改動必 `npm run build:lib` |
198
+ | 工具 flag 沉默陷阱:`rsync -a` 等長同秒靜默跳過(必 `--checksum`)/ `rg` 黏寫 `-rn` 的 `-r`=replace 輸出假字串 | 寫後斷言 + flag 分開寫 |
199
+ | DS css 不在 tokens.css aggregator 也沒被 tsx import = orphan | consumer 靜默拿不到 |
200
+ | storybook-smoke 驗舊 build = 假綠 | smoke script 已加 stale-build guard |
201
+
202
+ 新 bug → 歸 Meta-Pattern OR 本表 1 行;> 10 條 = 漏寫,評估 meta-merge 既有 M-rule。
203
+
204
+ # 專案 Stack
205
+
206
+ Vite + React + TypeScript + Tailwind v4 + shadcn/ui + Storybook + 自訂 Design Token;完整路徑 + Token 系統 → `packages/design-system/src/tokens/README.md`(charter)— DS 內化在 npm workspace。
207
+
208
+ # 元件完成 + Exploration
209
+
210
+ merge 前 invoke `/component-quality-gate`(35 項 + visual + clean-code 三層)。正式 `packages/design-system/src/` vs 比稿 `src/explorations/`;比稿 `*.v1.stories.tsx` + `notes.md`,定案升級 patterns/ 或 components/。
package/CLAUDE.md CHANGED
@@ -1,200 +1,26 @@
1
- # 每次任務前的 6 條 mindset(世界級設計系統的工作底色)
1
+ @AGENTS.md
2
2
 
3
- 6 條是本專案所有規則背後的**態度**。接到任務先複習一遍,再看具體規則。
3
+ # Claude Code 專屬機制層(provider adapter)
4
4
 
5
- 1. **對標世界級 + 不取巧省工**——每個設計決策都要能回答「Polaris / Material / Atlassian / Ant / Carbon / Apple HIG 怎麼做?」沒對齊又說不出理由 = 設計 bug。視覺整齊度不輸原版 + 符合 DS 語言**同時成立**。**禁止以「選較簡單」「省 N edits」為由選 shortcut**——一律最世界級做法。說「快速修」「省工程」是 yellow flag,停下重想。
6
- 2. **不憑直覺發明 / 優先消費既有**——新增任何值 / 名 / pattern / variant / layout primitive 前先 `grep` 既有。**強制 `# SSOT 消費 canonical` 清單**——寫視覺 code 前列消費的 components/patterns/tokens/spec。提建議也算定 pattern,給 option 必對照 DS canonical + ≥3 家世界級。**禁止憑印象列部分家**。
7
- 3. **改一處必看三處**——code / spec / story 三方聯動。改 cva `defaultVariants` / variant / token 前先 grep 該元件所有檔案,一次改完。
8
- 4. **範例必真實業務場景**——Jira / Stripe / Notion / Figma 可辨識情境;禁 `Option A/B/C`、「按鈕一」、極端不現實、ASCII art。
9
- 5. **猶豫就問**——無前例的決策:grep 既有 → 讀近親 spec → 仍不確定停下問。**禁止憑直覺造新 pattern**。
10
- 6. **大原則吸收瑣碎**——同類 bug 反覆糾正 = meta 層沒抓住。見 `.claude/rules/meta-patterns.md` 31 active M-rules(M1-M32,M27/M33/M34/M35 retired,折入 M20/M7/M23(c)(d))。**AI 不需 user 提醒才找 root invariant**——rule 震盪 → AI 自跑 M12 benchmark + invariant test。User 第 2 次問 → 必截圖 verify(M13)。對話結論 → AUTO 5-layer pipeline(M14)。Visual / behavior decision 前必先 WebFetch ≥ 3 source(M26)。Solo-work git ops 必先 grep canonical(M28)。**視覺/結構 propose 前必 grep DS spec.md 找 owner SSOT(M29)— 出 3-column 表;否則提案不被接受**。使用者 tell me once 不該要 tell me twice。
5
+ **治理核心住在 `AGENTS.md`**(上方 import,launch 全載,內容零損失)——增刪改治理**只改 AGENTS.md**,Claude Codex 等所有 agent 自動同步(PNG 架構,SSOT `.claude/planning/2026-07-16-provider-neutral-governance.md`)。本檔只收 Claude Code provider 機制說明。
11
6
 
12
- 完整 M-rules 詳 `.claude/rules/meta-patterns.md`(always loads)
7
+ ## Path-scoped rules(Claude 自動載入;2026 Anthropic 推薦)
13
8
 
14
- # 治理 canonical(Claude Code 配置 home 分層 + anti-bloat)
9
+ 僅在編對應 path 檔案時載入,降低每 session context 成本(其他 agent AGENTS.md「Rule Index」在編對應檔案前主動讀**同一份檔案**):
15
10
 
16
- ## 規則放哪 home(8-home 分層)
11
+ - `.claude/rules/meta-patterns.md` — 31 active M-rules(always loads,fundamental)
12
+ - `.claude/rules/spec-rules.md` — paths: `**/*.spec.md` + `packages/design-system/**`
13
+ - `.claude/rules/ui-development.md` — paths: `**/*.tsx` + `**/*.ts`
14
+ - `.claude/rules/story-rules.md` — paths: `**/*.stories.tsx`
15
+ - `.claude/rules/self-verify.md` — paths: `src/**` + `.claude/**` + `*.spec.md` + `*.tsx` + `*.css`
17
16
 
18
- | Level | Home | 收什麼 |
19
- |-------|------|--------|
20
- | 1 | `CLAUDE.md`(本檔) | 每 session signal 的 mindset + 6 條 + 任務導航 |
21
- | 1.5 | `.claude/rules/*.md` | path-scoped rules(只在相關檔案載入,2026 Anthropic 推薦) |
22
- | 2 | `{name}.spec.md` | 單元件「何時用 / 為什麼」 |
23
- | 3 | Pattern `spec.md` | runtime 跨元件 primitive |
24
- | 4 | Code(`.tsx` / `.css`) | cva / 型別等機械強制 |
25
- | 5 | Skill(`.claude/skills/`) | invoke 情境的多步驟 workflow + checkpoint |
26
- | 6 | Memory(`~/.claude/.../memory/` SSOT + repo `.claude/memory/` mirror)| 跨 session 狀態。本機編完跑 `npm run sync-memory` 推回 repo(讓 cloud sandbox 看得到) |
27
- | 7 | Hook(`.claude/hooks/`) | 機械化 pre/post tool 檢查 |
28
- | 8 | Slash Command(`.claude/commands/`) | 一次性單步 action |
29
- | 9 | Plan doc(`.claude/planning/`)| 完整 plan / RFC / spec 草稿 SSOT;memory file 是短 index pointer 指向 plan doc(對齊 ds-devmode / story-auto-compile pattern) |
17
+ ## Hooks(write-time 加速器,非信任邊界)
30
18
 
31
- **Q1 設計規則 Level 1-4 / Q2 invoke 情境 Skill or Command / Q3 隨時間變化 Memory(short index)+ Plan doc(完整 spec)/ Q4 機械化 Hook**。完整 flowchart `.claude/skills/design-system-audit/references/rule-placement.md`。
19
+ `.claude/hooks/` Claude Code lifecycle(PreToolUse / PostToolUse / Stop / SessionStart / UserPromptSubmit)機械強制——提供**最早的回饋**(寫入當下攔截)。它是 Claude 專屬加速器;**最終不可繞過層 = `npm run release:preflight` + CI**(AGENTS.md 檔頭宣告),任何 provider 的產出都被同一套 deterministic gates 把關。Hook 計數/預算 SSOT = `session_start_governance_check.sh` Check 7。
32
20
 
33
- ## 行數預算(Anthropic 對齊)
21
+ ## Skills / Commands / Memory(Claude 專屬 discovery)
34
22
 
35
- CLAUDE.md target ≤ 200(Anthropic best-practice)/ transition ≤ 400 / hard cap 800。SKILL ≤ 250 / spec ≤ 300(foundational SSOT 例外 ≤ 800-1200)/ memory **per-file ≤ 100 lines** + **MEMORY.md index ≤ 20 entries**(soft 18 / hard 20,session-start hook 攔)。Hooks **26 soft / 60 hard**(SSOT = `session_start_governance_check.sh` Check 7 threshold logic,2026-05-27 升 50→55→60 per codex M31 P0 hooks + baseline + primitive-misuse 3 new hooks)。動態值見 `scripts/sync-governance-counters.mjs` 跑出為準(snapshot 2026-07-10:**31 M-rules / 91 audit dims / 56 hooks** — 數字僅供 sanity check,真值以 script 輸出為準避 drift)
36
-
37
- ## Anti-bloat L1-L3
38
-
39
- - **L1 Pre-write**:`check_file_size_budget.sh`(+ governance hooks listed in `.claude/hooks/` — dynamic SSOT,不在 CLAUDE.md hardcode 個別 hook)
40
- - **L2 Per-edit**(PostToolUse Write|Edit|MultiEdit governance-file 寫入):`log_governance_fires.sh` → `.claude/logs/hook-fires.jsonl`
41
- - **L3 Periodic**(季度 / `--deep`):`/knowledge-prune` skill,retire ≥ 5%
42
-
43
- ## 加規則前必過 3 題
44
-
45
- 1. 既有 Meta-Pattern / 近親 spec / canonical chapter 命中 → append pointer 不新寫
46
- 2. **Rule-of-3**:同概念 ≥ 3 處 → 選 SSOT 其他 pointer
47
- 3. 7 天後還會 fire 嗎?不確定 → 不寫
48
-
49
- # 稽核 canonical
50
-
51
- 3 層級 × 6 維度。**Stakeholder-visible artifact**(prototype / 元件 merge / 產品 demo)**必過 code + visual 雙層 audit**(搭配 M6+M10)。
52
-
53
- | Tier | 時機 | Scope | Skill |
54
- |------|------|-------|------|
55
- | 1 Stakeholder-gate(強制)| 新元件 merge / prototype / demo | artifact-scoped | `/component-quality-gate` / `/prototype` P3.5 / `/product-ui-audit` P5 |
56
- | 2 Daily dev | bug / refactor / 文字改 | git diff + direct consumer | `visual-audit --scope=changed`(default) |
57
- | 3 Periodic deep | release / token 大改 / 季度 | full DS | `/design-system-audit --deep` |
58
-
59
- | 維度 | 對應 skill |
60
- |------|-----------|
61
- | D1 設計語言 | `/design-system-audit` |
62
- | D2 程式語言 | tsc + lint + `/design-system-audit` |
63
- | D3 元件效能 | `/performance-audit` |
64
- | D4 UX 行為 | `/ux-audit` |
65
- | D5 視覺品質 | `/visual-audit`(Layer A mechanical + B AI) |
66
- | D6 原則自檢 | `design-system-audit/references/principle-audit-protocol.md` |
67
-
68
- **Consistency 類稽核必 Phase 0 全掃再判**(避免單元件看漏系統 drift)。**Deep audit 全掃優先 + 決策 batch-at-end 鐵律**(2026-07-11 user directive;Claude + codex 雙方永遠遵守):先全 DS 掃完(全元件全 dim NO-SAMPLE)→ 跨元件去重 findings → **最後一次**列「真問題 + 只影響 SSOT-UI/UX」決策清單給 user 拍板;非-SSOT = Claude+codex 共識 autonomous 做完美;**禁**稽核途中一個元件一個元件問 user。SSOT → deep-audit-cross-codex SKILL Phase A「全掃優先」段。
69
-
70
- **Audit-vs-execute 分權**:動 canonical substantive meaning → STOP 提議;對齊 / 表達統一 / 清 duplicate / 補 pointer → AUTO(對齊 knowledge-prune SKILL Phase 2 P0+P1 scope)。
71
-
72
- **Scope classifier — Surgical visual bug**(2026-05-12 codex 抓 anti-pattern「surgical bug 升 architecture audit」)。user 列 N 個 visual defects + 無新 canonical / 無新 API contract / 無 cross-component semantic 改動 → **Surgical scope**:**no codex collab / no new M-rule / no audit report,batch fix + final pixel-quantified verify only**。對齊 Anthropic Best Practice 小修 skip plan + M32(c) batch fix + 對立面是「unscoped investigation infinite exploration」反 pattern。Substantive 改動(API / SSOT / cross-component)走 audit-vs-execute STOP 提議流程。
73
-
74
- # SSOT 消費 canonical
75
-
76
- 寫視覺 code 前必查對照 — 沒列 = 自創。**完整對照表 + 強制 checklist** → `.claude/references/ssot-consultation.md`(SSOT owner;含 9 項決策對應 SSOT + 新元件 tsx 開頭「── 消費的 SSOT ──」段強制要求)。原 `check_ssot_consultation.sh` 已 retired;2026-07-07 以 `check_ssot_header_declaration.sh` 精簡復活(新建 production tsx 必帶「── 消費的 SSOT ──」段,P0)+ mindset #2 + audit dim 5 + dim 54 + check_canonical_propagation 接手。
77
-
78
- # 任務導航表
79
-
80
- | 任務 | 必讀 |
81
- |------|------|
82
- | **新增元件** | `.claude/rules/ui-development.md` 「建立 UI 前必讀 / shadcn 元件規範」 + `.claude/rules/spec-rules.md` → `/component-quality-gate` |
83
- | **修 variant / size / state** | 該元件 `spec.md` → `/story-writing` |
84
- | **新增 token** | `tokens/README.md` → `.claude/rules/ui-development.md`「Token 命名 4 條硬規則」→ `tokens/xxx.spec.md` |
85
- | **寫 story / 視覺 code** | `/story-writing` + `# SSOT 消費 canonical` |
86
- | **命名新檔 / 變數 / prop** | `# 命名與語言一致性` + `.claude/rules/ui-development.md`「元件 Props 命名」 |
87
- | **新元件 layout** | `# 4-Family Layout Model` |
88
- | **建產品 / 開新 product app** | `npm run create-app <name>` → `apps/<name>/`;**2-scenario architecture SSOT** → `.claude/references/scenario-definition.md`(Scenario A / Scenario B 定義 + 20 test case + mirror chain + verify checkpoints,**之後增刪改 reference 此 SSOT**)|
89
- | **新 skill / hook / command** | `.claude/{home}/README.md` charter |
90
- | **無前例設計決策** | `# 遇不確定時的協議` |
91
- | **Tailwind 出怪事** | `.claude/rules/ui-development.md`「Tailwind 5 條核心」+ `# 失敗記憶索引` |
92
- | **Stakeholder 產出 / 稽核** | `# 稽核 canonical` |
93
- | **User 糾正後** | `# 治理 canonical`(home 判斷) |
94
- | **跟 codex 討論 / 多輪震盪 / 任何 codex 輸出** | `.claude/skills/codex-collab/SKILL.md`(M31 5-step canonical SSOT;含 transport / Step 0.05 user-verbatim relay / queue + interval / hook 機械強制)+ M31 anchor in meta-patterns.md |
95
- | **PR merge 後 / session start branch 健檢** | `# Git solo-work canonical` |
96
-
97
- **找不到** → 進 `# 遇不確定時的協議`,不自決定。
98
-
99
- # Git solo-work canonical(SSOT → `.claude/memory/feedback_solo_dev_workflow.md`)
100
-
101
- **1 chat = 1 working branch**;**Netlify preview 是 user gate**;**「push」/「OK」trigger 才 merge main**。**Session-start 必先 grep canonical + 開 working branch,禁直接在 main 上 edit production code**(M28 sub-rule,hook `check_main_branch_workbench.sh` mechanical 攔截)。
102
-
103
- | 步驟 | 動作 |
104
- |------|------|
105
- | 1 Edit | AI 改 code |
106
- | 2 Commit + push working branch | 自動觸發 Netlify per-branch preview |
107
- | 3 告訴 user 主要 change(or preview URL)| 讓 user 知道看什麼 |
108
- | 4 等 user trigger | **「push / OK / 好 / 合 main」** → step 5;**「改 X / 不對 / 等等」** → 繼續 step 1 |
109
- | 5 Squash merge to main | 不開 PR(可 GitHub API squash-merge OR fast-forward)|
110
- | 5.5 **SSOT propagation gate**(2026-05-26 加 per user verbatim「push main 後所有 repo 都能獲得更新」)| Hook `check_post_main_ssot_propagate.sh` 偵測 `git push origin main` + diff HEAD~..HEAD 含 SSOT-affecting paths(`packages/design-system/src` + `packages/storybook-config/{addons,addons-preset.ts,preview.tsx,package.json}`(無 src/ dir)/ `.claude/{rules,hooks,skills,commands,references}` / `.claude-plugin/*.json` / `hooks/hooks.json` / `CLAUDE.md`)→ inject context。**AI 必「全自動執行」整條發版鏈、不需 user 再問也不需 user 再確認(2026-06-02 user directive Option A verbatim「我說 push main 時,應該就一切要自動弄得完整弄得好」)**:動到 skill/hook/spec/token/CLAUDE 等 SSOT-affecting paths + user 已給 merge trigger → AI 自動 bump → preflight → tag → publish → `npm view` 驗證,全程不停下問;preflight(發版前 gate)+ `npm view`(發版後驗)= 安全網,故全自動不增風險;user 隨時可喊停。bump npm `0.1.0-beta.<N+1>`。**bump 版本後、tag 前必跑單一指令 `npm run release:preflight`**(sync version 5-manifest + sync ds-canonical + 全 deterministic gate + build + dogfood + 5-manifest verify,fail-fast,全過寫 HEAD-bound pass-marker)—— 取代舊「手動逐道跑」checklist,根治 beta.43/45 連環 push 失敗(漏 sync 步驟)。全過才 tag + push tag → Release workflow auto-fire → npm publish → ds-product-template + fork repos Dependabot daily auto-PR(整鏈 1 trigger 涵蓋所有 SSOT-affecting 來源)|
111
- | 6 砍 remote branch | `git push origin --delete <branch>` ;sandbox HTTP 403 → 提醒 user GitHub UI 手動 |
112
- | 7 Local 對齊 | `git checkout main && git fetch && git reset --hard origin/main && git branch -d <branch>` |
113
-
114
- **禁止**:開 PR / AI 自決 push main / 同 chat 開多 branch / 留 stale 不刪 / 「下個 session 處理」deferred 措辭。完整禁忌 / Trigger phrase / 反 pattern 詳 SSOT memory file。
115
-
116
- # 命名與語言一致性
117
-
118
- **3 重 test**(governance):
119
- 1. **既有 DS 詞彙**:對齊 `compact/rich / sm/md/lg / action/indicator / scanning/reading`?
120
- 2. **世界級 idiom**:≥ 2 家 world-class DS 用此詞?
121
- 3. **跨元件認知衝突**:同字串在其他元件已有不同語義?
122
-
123
- 3 test 全過才採納。歷史:FileItem `text/picture` 撞 Button `variant="text"` → 改 `compact/rich`。
124
-
125
- 詳細 → `.claude/references/naming-conventions.md`。
126
-
127
- **語言一致性**:spec.md 繁中(技術術語保留英) / code identifier 英 / 單一檔案不中英夾雜。
128
-
129
- # 4-Family Layout Model
130
-
131
- **每元件 spec 第一段必聲明 Layout Family**(1/2/3/4 或「self-contained」)。
132
-
133
- | Family | 用途 | SSOT |
134
- |--------|------|------|
135
- | 1 Menu item / 2 List item | scanning / reading | `patterns/element-anatomy/item-anatomy.spec.md` |
136
- | 3 Pill | 單行互動 pill | `components/Button/button.spec.md`「Pill Layout」|
137
- | 4 Field control | 可編輯資料輸入 | `components/Field/field-controls.spec.md` |
138
-
139
- # 自主執行 canonical(Autonomy Default,2026-05-14 user SSOT directive)
140
-
141
- **Default = autonomous + complete + verify-to-perfection;省工 = anti-pattern(違 mindset #1)**。
142
-
143
- | 動作類別 | 預設 |
144
- |---------|-----|
145
- | **SSOT-affecting UI/UX**(增刪改 component / token / spec 視覺結構 / 跨元件 design language) | **ASK** — 中文具體人話講選項 + tradeoff,user 拍板才動。**Enforcement scope split**:production code(`src/**/*.{tsx,ts,css}`)由 `check_substantive_edit_approval_preflight.sh` PreToolUse 攔截;`*.spec.md` 視覺結構 / canonical / SSOT 段落 edit 由 `stop_self_audit.sh` 補位 post-action 攔截 — **僅覆蓋 codex-collab turn**(Mechanism 4 codex-reply branch;Claude-solo turn 靠本 canonical + M18 自律)(避免 spec typo false-positive BLOCKER)|
146
- | Bug fix / clean / refactor / 命名一致 / test / audit / verify | **AUTO** — 整批做完 + 完整驗證 + 撤回機制(M33 反 defer) |
147
- | Governance / hook / skill / spec **內部**(typo / pointer / 結構 — 不動 canonical meaning)| **AUTO** — audit-vs-execute 分權 |
148
- | Perf / a11y / 漸進遷移(不動 SSOT)| **AUTO** — 整批 + verify |
149
-
150
- **自主執行同時優化 7 軸**:言簡意賅 / 效率 + 效能(M20 ≥ 80)/ SSOT 鐵律(M17/M23/M29/M30)/ 易懂維護擴充(M9/M21/M23(c))/ 世界級 + 一致設計語言(mindset #1 + M8/M22/M26)/ 完整 self-verify(M20/M31/M32)/ 自動 self-improve(M14/M20)。
151
-
152
- **反 pattern**(禁):「省工」/「下次再做」/「下個 session」(M33)/「OK 嗎?」過度 ASK / shortcut 避 verify / 不對齊 mindset #1。
153
-
154
- **Trigger phrase auto-pipeline**(M19 升級):「依原則自主」/「不需問」/「馬不停蹄」/「全部做完」/「自動」→ 進 autonomous mode,僅 SSOT-affecting UI/UX 停下 ASK。
155
-
156
- **2026-05-23 永久 reinforcement(user verbatim,hook 機械強制)**:
157
- - **Triple-verify before propose**(M18 Q0 universal gate):propose / 列 option / 發現「問題」(含 codex / deep audit findings)前必 inline 跑 (1) grep DS-wide (2) Read spec.md / tsx (3) 對照 canonical exception。三題全過才 propose;任一 NO → 自動撤回不煩 user。Hook `check_propose_pre_grep_verify.sh` 僅對 planning/reports/handoff md 內 propose 文做 cite-presence P1 soft check;reply 通道靠 M18 mindset + `check_propose_without_benchmark.sh` UserPromptSubmit 提醒。Anchor:2026-05-18 Sheet/inline-action/SurfaceBody false positive、2026-05-23 Badge `text-[10px]` 誤判為 drift(badge.spec.md「字體例外」段 documented exception)
158
- - **SSOT auto-sync invariant**:M-rule count / hook count / dim count / npm scope / version / plugin name 等跨 file 數字禁 hardcode 多處;SSOT in `session_start_governance_check.sh` Check 7 / `meta-patterns.md` / `design-system-audit/SKILL.md` / `package.json` / `.claude-plugin/plugin.json`;其他 file reference 或 `scripts/sync-governance-counters.mjs` 機械對齊,drift 偵測 fail-closed(release:preflight `--check` + session-start Check 10 inject 修復 directive)
159
-
160
- # 遇不確定時的協議
161
-
162
- **無前例且影響 SSOT UI/UX 設計判斷**時 3 步,禁跳:**grep 既有**(30 秒)→ **讀近親 spec.md** → **仍不確定停下問** user。
163
- **非 SSOT-UI/UX**(refactor / test / perf / a11y / hook / skill / typo / 對齊既有 canonical)→ autonomous,無需問。
164
- 禁:跳 grep 憑記憶 / 隨便挑 / 留 TODO。
165
- 可跳:bug 修 / 機械勞動 / user 明確指示。
166
-
167
- # 失敗記憶索引(技術沉默陷阱 only)
168
-
169
- 設計判斷類已被 M-rules 吸收(見 `.claude/rules/meta-patterns.md`);具體歷史詳 `.claude/skills/design-system-audit/references/historical-bugs.md`。
170
-
171
- | 技術陷阱 | 一行 anchor |
172
- |--------|-----------|
173
- | Tailwind v4 `[--foo]` 必 `var()` | silent 失效 |
174
- | tailwind-merge 自訂 utility 必註冊 group | 否則 strip |
175
- | 元件自包 Provider | 劫持全站 |
176
- | 清 unused imports 後 runtime | tsc 不充分,需 storybook |
177
- | shadcn compat alias 回流 | dark mode 不聯動 |
178
- | `asChild ? Slot : Native` 內部 JSX 仍渲染多 children | React.Children.only runtime fail — Slot 規範 children 必為單 element,內部 `{icon}{label}{badge}` 多 expression 變 array → throw。asChild 分支 render 只傳 consumer child;tsc/build 過,story 打開才炸 |
179
- | `tsc -b` 不 emit declaration | TS4023 漏抓;型別 surface 改動必 `npm run build:lib`(詳 `.claude/rules/self-verify.md` Post-edit)|
180
- | 工具 flag 沉默陷阱:`rsync -a` 等長同秒靜默跳過(必 `--checksum`+fail-closed,詳 build-published-template-mirror.mjs 檔頭)/ `rg` 黏寫 `-rn` 的 `-r`=replace 輸出變假字串(`-n`/`-l` 永不黏 `r`,2026-06-12 兩次答錯 anchor)| 寫後斷言 + flag 分開寫 |
181
- | DS css 不在 tokens.css aggregator 也沒被 tsx import = orphan | consumer 靜默拿不到 → 跑版;hook `check_orphan_ds_css.sh` 機械攔(2026-05-27 anchor)|
182
- | storybook-smoke 驗 storybook-static/ 舊 build = 假綠 | smoke script 已加 stale-build guard(src mtime > build → fail-loud;2026-07-05 anchor:7/3 舊 build 撐過整 branch smoke 宣稱)|
183
-
184
- 新 bug → 歸 Meta-Pattern OR 本表 1 行;> 10 條 = 漏寫,**評估 meta-merge 既有 M-rule 而非無腦新增**(meta-patterns velocity ≤ 3/quarter,單 M-rule 必吸收 ≥ 3 prior bugs)。
185
-
186
- # 專案 Stack
187
-
188
- Vite + React + TypeScript + Tailwind v4 + shadcn/ui + Storybook + 自訂 Design Token(必要檔案:`index.html` / `src/main.tsx` / `src/globals.css` / `vite.config.ts` / `package.json` / `tsconfig.json`);完整路徑 + Token 系統 → `packages/design-system/src/tokens/README.md`(charter)— Phase 1 後 DS 內化在 npm workspace。
189
-
190
- # Path-scoped rules(2026 Anthropic 推薦)
191
-
192
- 僅在相關檔案打開時載入,降低本檔 token 成本:
193
-
194
- - `.claude/rules/meta-patterns.md` — 31 active M-rules(M1-M32,M27/M33/M34/M35 retired,always loads,fundamental)
195
- - `.claude/rules/spec-rules.md` — paths: `**/*.spec.md` + `src/design-system/**` + `packages/design-system/**`(post Phase 1 migration)
196
- - `.claude/rules/ui-development.md` — paths: `**/*.tsx` + `**/*.ts`(含 Tailwind / Token / Props 命名 / shadcn)
197
- - `.claude/rules/story-rules.md` — paths: `**/*.stories.tsx`(三層定位 + Title + 範例最高準則)
198
-
199
- # 元件完成 + Exploration
200
- merge 前 invoke `/component-quality-gate`(35 項 + visual + clean-code 三層)。正式 `packages/design-system/src/`(Phase 1 後 npm workspace 內化)vs 比稿 `src/explorations/`(hook `block_prototype_imports.py` 強制隔離);比稿 `*.v1.stories.tsx` + `notes.md`,定案升級 patterns/ 或 components/。Skills:`/prototype` / `/component-quality-gate` / `/delivery-handoff`。
23
+ - **Skills**:`.claude/skills/`(invoke 情境的多步驟 workflow + checkpoint;`/skill-name` 觸發)
24
+ - **Commands**:`.claude/commands/`(一次性單步 action)
25
+ - **Memory**:`~/.claude/projects/<project>/memory/` 為 SSOT + repo `.claude/memory/` mirror(本機編完跑 `npm run sync-memory` 推回 repo,讓 cloud sandbox / 其他 agent 看得到)
26
+ - **Plugin 邊界**:plugin 只能是 optional adapter / distribution convenience;任何 Critical 治理不得 plugin-only(cloud plugin 不可靠實證 → `.claude/memory/reference_cloud_governance_loading.md`)
package/cli-init.mjs CHANGED
@@ -14,13 +14,17 @@
14
14
  //
15
15
  // Idempotent: re-run safe(skip if symlink exists pointing same place).
16
16
 
17
- import { existsSync, mkdirSync, symlinkSync, readlinkSync, lstatSync, unlinkSync } from 'node:fs'
17
+ import { existsSync, mkdirSync, symlinkSync, readlinkSync, lstatSync, unlinkSync, writeFileSync } from 'node:fs'
18
18
  import { join, relative, dirname } from 'node:path'
19
19
  import { fileURLToPath } from 'node:url'
20
20
 
21
21
  const CWD = process.cwd()
22
22
  const __dirname = dirname(fileURLToPath(import.meta.url))
23
- const PACKAGE_ROOT = join(__dirname, '..') // = node_modules/@qijenchen/design-system/
23
+ // 本檔 ship 在 package root(package.json bin: "./cli-init.mjs") __dirname
24
+ // node_modules/@qijenchen/design-system/。2026-07-16 修(PNG §4 疑點證實為 bug):原
25
+ // `join(__dirname, '..')` 指到 node_modules/@qijenchen/ → 所有 source「not found」→
26
+ // init 全程靜默 skip(symlink 一個都沒建,假成功)。
27
+ const PACKAGE_ROOT = __dirname
24
28
 
25
29
  function ensureSymlink(from, to, label) {
26
30
  const fromAbs = join(CWD, from)
@@ -73,6 +77,30 @@ if (existsSync(dsCLAUDEsrc)) {
73
77
  }
74
78
  }
75
79
 
80
+ // 3. AGENTS.md 投影到 consumer root(PNG P2.4:Codex 等 AGENTS.md 標準 agent 原生 discovery)
81
+ // Consumer-owned:存在則 skip + 提示 merge,絕不覆蓋。內容 = pointer stub(指 npm 內
82
+ // DS AGENTS.md 本體 → npm update 自動最新,stub 零 drift;對齊 ADR-1 禁 symlink 作唯一機制)。
83
+ const consumerAgents = join(CWD, 'AGENTS.md')
84
+ if (existsSync(join(PACKAGE_ROOT, 'AGENTS.md'))) {
85
+ if (!existsSync(consumerAgents)) {
86
+ writeFileSync(consumerAgents, `# AI agent instructions(this repo consumes @qijenchen/design-system)
87
+
88
+ <!-- generated once by qijenchen-ds-init;consumer-owned — 建立後歸你維護,可自由增寫。 -->
89
+
90
+ 本 repo 消費 \`@qijenchen/design-system\`。**寫 UI / 設計決策前先讀 DS 治理核心**(隨 npm update 自動最新):
91
+
92
+ - \`node_modules/@qijenchen/design-system/AGENTS.md\` — DS 治理核心(mindset / SSOT 消費 / 命名 / 4-Family)
93
+ - \`node_modules/@qijenchen/design-system/ds-canonical/\` — rules / references / skills 全文
94
+ - \`node_modules/@qijenchen/design-system/src/components/<Name>/<name>.spec.md\` + \`.stories.tsx\` — 元件何時用 / 官方 composition
95
+
96
+ (在下方加入你產品自己的 instructions。)
97
+ `)
98
+ console.log('✓ created AGENTS.md(pointer stub → DS 治理核心;consumer-owned,可自由增寫)')
99
+ } else {
100
+ console.log('✓ AGENTS.md already exists(skip;如要吃 DS 治理,手動 merge 一行指路 node_modules/@qijenchen/design-system/AGENTS.md)')
101
+ }
102
+ }
103
+
76
104
  console.log('')
77
105
  console.log('═══ Next steps ═══')
78
106
  console.log('1. Add to your entry CSS(globals.css):')
@@ -19,8 +19,8 @@ import * as AccordionPrimitive from '@radix-ui/react-accordion';
19
19
  */
20
20
  declare const Accordion: React.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & React.RefAttributes<HTMLDivElement>>;
21
21
  declare const AccordionItem: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
22
- declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
23
- declare const AccordionContent: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
22
+ declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref">, "asChild"> & React.RefAttributes<HTMLButtonElement>>;
23
+ declare const AccordionContent: React.ForwardRefExoticComponent<Omit<Omit<AccordionPrimitive.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref">, "asChild"> & React.RefAttributes<HTMLDivElement>>;
24
24
  export declare const accordionMeta: {
25
25
  readonly component: "Accordion";
26
26
  readonly family: null;
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAI/D;;;;;;;;;;;;;;;;GAgBG;AAEH,QAAA,MAAM,SAAS,8JAA0B,CAAA;AAEzC,QAAA,MAAM,aAAa,iKASjB,CAAA;AAGF,QAAA,MAAM,gBAAgB,0KA8BpB,CAAA;AAGF,QAAA,MAAM,gBAAgB,oKAcpB,CAAA;AAKF,eAAO,MAAM,aAAa;;;;;;;;;;;CAehB,CAAA;AAEV,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAI/D;;;;;;;;;;;;;;;;GAgBG;AAEH,QAAA,MAAM,SAAS,8JAA0B,CAAA;AAEzC,QAAA,MAAM,aAAa,iKASjB,CAAA;AAGF,QAAA,MAAM,gBAAgB,2LAiCpB,CAAA;AAGF,QAAA,MAAM,gBAAgB,qLAgBpB,CAAA;AAKF,eAAO,MAAM,aAAa;;;;;;;;;;;CAehB,CAAA;AAEV,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.js","sources":["../../../src/components/Accordion/accordion.tsx"],"sourcesContent":["import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Accordion — Radix Accordion + 本 DS token\n *\n * 結構對齊 shadcn/ui accordion(Accordion / AccordionItem / AccordionTrigger /\n * AccordionContent),但視覺全改本 DS token。\n *\n * ── 視覺差異 vs shadcn 預設 ──\n * Shadcn 預設 hover 加底線(web 早期 link style),本 DS 改為文字色 tint\n * (`hover:text-fg-secondary`)——維持現代 SaaS 質感(Notion / Linear / Stripe 皆不用\n * 底線),但保留 hover 顏色變化作為可點擊提示(user 決策 2026-04-20)。\n * Chevron 用 Lucide + 本 DS icon size(16px),rotate 動畫 200ms。\n *\n * ── 使用情境 ──\n * FAQ / settings section 收合 / 多區塊表單分組 / 進階選項可隱藏。\n * 不用於「單純顯示 / 隱藏單一區塊」(那是 Collapsible,本 DS 尚未建立;用 details 或\n * 自組 toggle),Accordion 是「多個 item 可互斥或獨立收合」的 pattern。\n */\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-divider', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center justify-between gap-2',\n 'py-4 text-body font-medium text-foreground text-left',\n 'transition-colors hover:text-fg-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n // AccordionTrigger 單一 text-style 列 → semantic `text-fg-disabled`(非 opacity);Button canonical 對齊\n 'disabled:text-fg-disabled disabled:pointer-events-none',\n // 2026-05-31 M24:disabled 時 chevron(icon 載體)亦降 text-fg-disabled,不停留 text-fg-muted\n //(muted=neutral-7 比 disabled=neutral-6 深 → 層級顛倒)。覆寫 chevron 自身 text-fg-muted。\n 'disabled:[&>svg]:text-fg-disabled',\n \"[&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={16}\n className=\"shrink-0 text-fg-muted transition-transform duration-200\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = 'AccordionTrigger'\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n 'overflow-hidden text-body text-fg-secondary',\n 'data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down',\n )}\n {...props}\n >\n <div className={cn('pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = 'AccordionContent'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const accordionMeta = {\n component: 'Accordion',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-fg-secondary', 'text-foreground'],\n ring: ['ring-ring'],\n },\n} as const\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,YAAY,mBAAmB;AAErC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1B;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,IACjD,GAAG;AAAA,EAAA;AACN,CACD;AACD,cAAc,cAAc;AAE5B,MAAM,mBAAmB,MAAM,WAG7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,QACpC,oBAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEH,UAAA;AAAA,MAAA;AAAA,MACD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,eAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACb;AAAA,EAAA;AACF,GACF,CACD;AACD,iBAAiB,cAAc;AAE/B,MAAM,mBAAmB,MAAM,WAG7B,CAAC,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,8BAAC,OAAA,EAAI,WAAW,GAAG,QAAQ,SAAS,GAAI,SAAA,CAAS;AAAA,EAAA;AACnD,CACD;AACD,iBAAiB,cAAc;AAIxB,MAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,iBAAiB,UAAU;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,oBAAoB,iBAAiB,qBAAqB,iBAAiB;AAAA,IAChF,MAAM,CAAC,WAAW;AAAA,EAAA;AAEtB;"}
1
+ {"version":3,"file":"accordion.js","sources":["../../../src/components/Accordion/accordion.tsx"],"sourcesContent":["import * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { ChevronDown } from 'lucide-react'\nimport { cn } from '@/lib/utils'\n\n/**\n * Accordion — Radix Accordion + 本 DS token\n *\n * 結構對齊 shadcn/ui accordion(Accordion / AccordionItem / AccordionTrigger /\n * AccordionContent),但視覺全改本 DS token。\n *\n * ── 視覺差異 vs shadcn 預設 ──\n * Shadcn 預設 hover 加底線(web 早期 link style),本 DS 改為文字色 tint\n * (`hover:text-fg-secondary`)——維持現代 SaaS 質感(Notion / Linear / Stripe 皆不用\n * 底線),但保留 hover 顏色變化作為可點擊提示(user 決策 2026-04-20)。\n * Chevron 用 Lucide + 本 DS icon size(16px),rotate 動畫 200ms。\n *\n * ── 使用情境 ──\n * FAQ / settings section 收合 / 多區塊表單分組 / 進階選項可隱藏。\n * 不用於「單純顯示 / 隱藏單一區塊」(那是 Collapsible,本 DS 尚未建立;用 details 或\n * 自組 toggle),Accordion 是「多個 item 可互斥或獨立收合」的 pattern。\n */\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn('border-b border-divider', className)}\n {...props}\n />\n))\nAccordionItem.displayName = 'AccordionItem'\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n // asChild 不對外開放:Trigger 固定渲染 children + ChevronDown 兩個子節點,傳 asChild\n // 會讓 Radix Slot 觸發 React.Children.only runtime 錯(見 CLAUDE.md 失敗記憶索引\n // 「asChild 分支內部仍渲染多 children」)。固定 anatomy 見 accordion.spec.md「邊界狀態」。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex flex-1 items-center justify-between gap-2',\n 'py-4 text-body font-medium text-foreground text-left',\n 'transition-colors hover:text-fg-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n // AccordionTrigger 單一 text-style 列 → semantic `text-fg-disabled`(非 opacity);Button canonical 對齊\n 'disabled:text-fg-disabled disabled:pointer-events-none',\n // 2026-05-31 M24:disabled 時 chevron(icon 載體)亦降 text-fg-disabled,不停留 text-fg-muted\n //(muted=neutral-7 比 disabled=neutral-6 深 → 層級顛倒)。覆寫 chevron 自身 text-fg-muted。\n 'disabled:[&>svg]:text-fg-disabled',\n \"[&[data-state=open]>svg]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n size={16}\n className=\"shrink-0 text-fg-muted transition-transform duration-200\"\n aria-hidden\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = 'AccordionTrigger'\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n // asChild 不對外開放:Content 固定以內層 <div className=\"pb-4\"> 包住 children,傳 asChild\n // 只會讓 Slot clone 該內層 div,consumer 元素無法成為 Content host(等同無效 API)。\n Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>, 'asChild'>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className={cn(\n 'overflow-hidden text-body text-fg-secondary',\n 'data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down',\n )}\n {...props}\n >\n <div className={cn('pb-4', className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\nAccordionContent.displayName = 'AccordionContent'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const accordionMeta = {\n component: 'Accordion',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'focus-visible', 'disabled'],\n tokens: {\n bg: [],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-fg-secondary', 'text-foreground'],\n ring: ['ring-ring'],\n },\n} as const\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,YAAY,mBAAmB;AAErC,MAAM,gBAAgB,MAAM,WAG1B,CAAC,EAAE,WAAW,GAAG,MAAA,GAAS,QAC1B;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,IACjD,GAAG;AAAA,EAAA;AACN,CACD;AACD,cAAc,cAAc;AAE5B,MAAM,mBAAmB,MAAM,WAM7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAA,GAAS,QACpC,oBAAC,mBAAmB,QAAnB,EAA0B,WAAU,QACnC,UAAA;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEH,UAAA;AAAA,MAAA;AAAA,MACD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,eAAW;AAAA,QAAA;AAAA,MAAA;AAAA,IACb;AAAA,EAAA;AACF,GACF,CACD;AACD,iBAAiB,cAAc;AAE/B,MAAM,mBAAmB,MAAM,WAK7B,CAAC,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC;AAAA,EAAC,mBAAmB;AAAA,EAAnB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,IAED,GAAG;AAAA,IAEJ,8BAAC,OAAA,EAAI,WAAW,GAAG,QAAQ,SAAS,GAAI,SAAA,CAAS;AAAA,EAAA;AACnD,CACD;AACD,iBAAiB,cAAc;AAIxB,MAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,iBAAiB,UAAU;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,CAAA;AAAA,IACJ,IAAI,CAAC,oBAAoB,iBAAiB,qBAAqB,iBAAiB;AAAA,IAChF,MAAM,CAAC,WAAW;AAAA,EAAA;AAEtB;"}
@@ -173,7 +173,7 @@ const avatarMeta = {
173
173
  variants: {},
174
174
  sizes: {},
175
175
  states: ["default", "focus-visible", "disabled"],
176
- // 2026-06-11 R2:本身無自有 hover/active(spec L279;hoverCard 互動屬 HoverCard),
176
+ // 2026-06-11 R2:本身無自有 hover/active(spec「StateBehavior 範疇」段;hoverCard 互動屬 HoverCard),
177
177
  tokens: {
178
178
  bg: ["bg-surface-raised"],
179
179
  fg: ["--foreground", "--on-emphasis"],