@qijenchen/design-system 0.1.0-beta.85 → 0.1.0-beta.87

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 (481) 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-panel.d.ts +0 -2
  50. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  51. package/dist/components/DataTable/data-table-filter-panel.js +3 -4
  52. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -1
  53. package/dist/components/DataTable/data-table-interaction-layer.d.ts +2 -2
  54. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
  55. package/dist/components/DataTable/data-table-sort-manager.js +2 -2
  56. package/dist/components/DataTable/data-table-sort-manager.js.map +1 -1
  57. package/dist/components/DataTable/data-table.d.ts +1 -1
  58. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  59. package/dist/components/DataTable/data-table.js +44 -32
  60. package/dist/components/DataTable/data-table.js.map +1 -1
  61. package/dist/components/DatePicker/date-picker.d.ts +3 -3
  62. package/dist/components/DatePicker/date-picker.js +4 -4
  63. package/dist/components/DatePicker/date-picker.js.map +1 -1
  64. package/dist/components/DescriptionList/description-list.d.ts +3 -3
  65. package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
  66. package/dist/components/DescriptionList/description-list.js +6 -6
  67. package/dist/components/DescriptionList/description-list.js.map +1 -1
  68. package/dist/components/Dialog/dialog.d.ts +2 -2
  69. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  70. package/dist/components/Dialog/dialog.js.map +1 -1
  71. package/dist/components/DropdownMenu/dropdown-menu.d.ts +8 -3
  72. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  73. package/dist/components/DropdownMenu/dropdown-menu.js +7 -7
  74. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  75. package/dist/components/Field/field-context.d.ts +16 -10
  76. package/dist/components/Field/field-context.d.ts.map +1 -1
  77. package/dist/components/Field/field-context.js.map +1 -1
  78. package/dist/components/Field/field-types.d.ts +2 -2
  79. package/dist/components/Field/field-types.d.ts.map +1 -1
  80. package/dist/components/Field/field-types.js.map +1 -1
  81. package/dist/components/Field/field-wrapper.d.ts +20 -4
  82. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  83. package/dist/components/Field/field-wrapper.js +30 -31
  84. package/dist/components/Field/field-wrapper.js.map +1 -1
  85. package/dist/components/Field/field.d.ts +1 -1
  86. package/dist/components/Field/field.d.ts.map +1 -1
  87. package/dist/components/Field/field.js +25 -3
  88. package/dist/components/Field/field.js.map +1 -1
  89. package/dist/components/Field/use-form-validation.d.ts +1 -1
  90. package/dist/components/Field/use-form-validation.js.map +1 -1
  91. package/dist/components/FileItem/file-item.d.ts.map +1 -1
  92. package/dist/components/FileItem/file-item.js +2 -5
  93. package/dist/components/FileItem/file-item.js.map +1 -1
  94. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  95. package/dist/components/FileUpload/file-upload.js +5 -1
  96. package/dist/components/FileUpload/file-upload.js.map +1 -1
  97. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  98. package/dist/components/FileViewer/file-viewer.js +2 -1
  99. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  100. package/dist/components/HoverCard/hover-card.d.ts +2 -2
  101. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  102. package/dist/components/HoverCard/hover-card.js +4 -2
  103. package/dist/components/HoverCard/hover-card.js.map +1 -1
  104. package/dist/components/InlineEdit/inline-edit.d.ts +23 -16
  105. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
  106. package/dist/components/InlineEdit/inline-edit.js +104 -62
  107. package/dist/components/InlineEdit/inline-edit.js.map +1 -1
  108. package/dist/components/Input/input.d.ts +1 -1
  109. package/dist/components/Input/input.d.ts.map +1 -1
  110. package/dist/components/Input/input.js +6 -6
  111. package/dist/components/Input/input.js.map +1 -1
  112. package/dist/components/LinkInput/link-input.d.ts +5 -5
  113. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  114. package/dist/components/LinkInput/link-input.js +3 -3
  115. package/dist/components/LinkInput/link-input.js.map +1 -1
  116. package/dist/components/Notice/notice.d.ts +17 -1
  117. package/dist/components/Notice/notice.d.ts.map +1 -1
  118. package/dist/components/Notice/notice.js +7 -1
  119. package/dist/components/Notice/notice.js.map +1 -1
  120. package/dist/components/NumberInput/number-input.d.ts +1 -1
  121. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  122. package/dist/components/NumberInput/number-input.js +12 -1
  123. package/dist/components/NumberInput/number-input.js.map +1 -1
  124. package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +1 -1
  125. package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -1
  126. package/dist/components/PeoplePicker/people-picker.d.ts +5 -5
  127. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  128. package/dist/components/PeoplePicker/people-picker.js +7 -5
  129. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  130. package/dist/components/PeoplePicker/person-display.d.ts +1 -1
  131. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  132. package/dist/components/ProfileCard/profile-card.d.ts +1 -1
  133. package/dist/components/ProfileCard/profile-card.js.map +1 -1
  134. package/dist/components/RadioGroup/radio-group.d.ts +3 -3
  135. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  136. package/dist/components/RadioGroup/radio-group.js +1 -1
  137. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  138. package/dist/components/Rating/rating.d.ts.map +1 -1
  139. package/dist/components/Rating/rating.js +4 -0
  140. package/dist/components/Rating/rating.js.map +1 -1
  141. package/dist/components/ScrollArea/scroll-area.d.ts +3 -2
  142. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  143. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  144. package/dist/components/SegmentedControl/segmented-control.d.ts +4 -3
  145. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  146. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  147. package/dist/components/Select/select.d.ts +16 -6
  148. package/dist/components/Select/select.d.ts.map +1 -1
  149. package/dist/components/Select/select.js +17 -5
  150. package/dist/components/Select/select.js.map +1 -1
  151. package/dist/components/SelectMenu/select-menu.d.ts +17 -1
  152. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  153. package/dist/components/SelectMenu/select-menu.js +17 -3
  154. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  155. package/dist/components/SelectionControl/boolean-value.d.ts +1 -1
  156. package/dist/components/SelectionControl/boolean-value.js.map +1 -1
  157. package/dist/components/Sheet/sheet.d.ts +2 -2
  158. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  159. package/dist/components/Sheet/sheet.js.map +1 -1
  160. package/dist/components/Sidebar/sidebar.d.ts +1 -1
  161. package/dist/components/Sidebar/sidebar.js +2 -2
  162. package/dist/components/Sidebar/sidebar.js.map +1 -1
  163. package/dist/components/Slider/slider.d.ts.map +1 -1
  164. package/dist/components/Slider/slider.js +6 -3
  165. package/dist/components/Slider/slider.js.map +1 -1
  166. package/dist/components/Steps/steps.d.ts +6 -4
  167. package/dist/components/Steps/steps.d.ts.map +1 -1
  168. package/dist/components/Steps/steps.js +19 -5
  169. package/dist/components/Steps/steps.js.map +1 -1
  170. package/dist/components/Switch/switch.d.ts +4 -4
  171. package/dist/components/Switch/switch.d.ts.map +1 -1
  172. package/dist/components/Switch/switch.js +3 -1
  173. package/dist/components/Switch/switch.js.map +1 -1
  174. package/dist/components/Tabs/tabs.d.ts +1 -1
  175. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  176. package/dist/components/Tabs/tabs.js +73 -23
  177. package/dist/components/Tabs/tabs.js.map +1 -1
  178. package/dist/components/Tag/tag.d.ts +3 -1
  179. package/dist/components/Tag/tag.d.ts.map +1 -1
  180. package/dist/components/Tag/tag.js +2 -2
  181. package/dist/components/Tag/tag.js.map +1 -1
  182. package/dist/components/Textarea/textarea.d.ts +4 -4
  183. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  184. package/dist/components/Textarea/textarea.js +15 -15
  185. package/dist/components/Textarea/textarea.js.map +1 -1
  186. package/dist/components/TimePicker/time-picker.d.ts +4 -4
  187. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  188. package/dist/components/TimePicker/time-picker.js +8 -5
  189. package/dist/components/TimePicker/time-picker.js.map +1 -1
  190. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  191. package/dist/components/Tooltip/tooltip.js +27 -23
  192. package/dist/components/Tooltip/tooltip.js.map +1 -1
  193. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  194. package/dist/components/TreeView/tree-view.js +16 -0
  195. package/dist/components/TreeView/tree-view.js.map +1 -1
  196. package/dist/index.d.ts +7 -7
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +6 -13
  199. package/dist/index.js.map +1 -1
  200. package/dist/lib/drag-visual.d.ts +2 -2
  201. package/dist/lib/drag-visual.js.map +1 -1
  202. package/dist/lib/utils.d.ts +1 -0
  203. package/dist/lib/utils.d.ts.map +1 -1
  204. package/dist/lib/utils.js +21 -1
  205. package/dist/lib/utils.js.map +1 -1
  206. package/dist/patterns/element-anatomy/item-anatomy.d.ts +2 -0
  207. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  208. package/dist/patterns/element-anatomy/item-anatomy.js +2 -2
  209. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  210. package/dist/tokens/categorical-color.d.ts +3 -3
  211. package/dist/tokens/categorical-color.d.ts.map +1 -1
  212. package/dist/tokens/categorical-color.js +2 -2
  213. package/dist/tokens/categorical-color.js.map +1 -1
  214. package/ds-canonical/fork/AGENTS.md +213 -0
  215. package/ds-canonical/fork/codex/agents/skills/independent-review/SKILL.md +33 -0
  216. package/ds-canonical/fork/codex/hooks.json +16 -0
  217. package/ds-canonical/fork/governance.lock +22 -7
  218. package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +22 -1
  219. package/ds-canonical/fork/hooks/inject_deploy_url_after_push.sh +14 -2
  220. package/ds-canonical/fork/manifest.json +10 -1
  221. package/ds-canonical/fork/preamble.md +3 -2
  222. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +7 -7
  223. package/ds-canonical/fork/skills/ux-audit/SKILL.md +1 -1
  224. package/ds-canonical/fork/skills/visual-audit/SKILL.md +0 -1
  225. package/ds-canonical/hooks/check_codex_brief_invariants.sh +9 -3
  226. package/ds-canonical/hooks/check_ds_anchor_preflight.sh +22 -1
  227. package/ds-canonical/hooks/check_overlay_open_focus_escape_probe.sh +19 -2
  228. package/ds-canonical/hooks/check_plugin_fork_health.sh +17 -1
  229. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +21 -4
  230. package/ds-canonical/hooks/inject_deploy_url_after_push.sh +14 -2
  231. package/ds-canonical/hooks/session_start_governance_check.sh +10 -2
  232. package/ds-canonical/references/certified-surfaces.md +20 -0
  233. package/ds-canonical/references/preflight-gate-baseline.json +5 -0
  234. package/ds-canonical/references/principle-dim-map.json +20 -2
  235. package/ds-canonical/references/props-naming.md +2 -1
  236. package/ds-canonical/references/ssot-index.md +2 -2
  237. package/ds-canonical/references/story-baseline-registry.json +2 -2
  238. package/ds-canonical/rules/story-rules.md +1 -1
  239. package/ds-canonical/rules/ui-development.md +2 -1
  240. package/ds-canonical/skills/codex-collab/SKILL.md +7 -7
  241. package/ds-canonical/skills/codex-collab/references/brief-template.md +5 -1
  242. package/ds-canonical/skills/component-quality-gate/SKILL.md +1 -1
  243. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +5 -5
  244. package/ds-canonical/skills/design-system-audit/SKILL.md +5 -5
  245. package/ds-canonical/skills/product-ui-audit/SKILL.md +7 -7
  246. package/ds-canonical/skills/ux-audit/SKILL.md +1 -1
  247. package/ds-canonical/skills/visual-audit/SKILL.md +0 -1
  248. package/ds-story-manifest.json +21 -21
  249. package/llms-full.txt +3 -3
  250. package/llms.txt +1 -1
  251. package/package.json +2 -1
  252. package/src/components/Accordion/accordion.anatomy.stories.tsx +11 -11
  253. package/src/components/Accordion/accordion.principles.stories.tsx +21 -6
  254. package/src/components/Accordion/accordion.spec.md +10 -1
  255. package/src/components/Accordion/accordion.stories.tsx +10 -5
  256. package/src/components/Accordion/accordion.tsx +7 -2
  257. package/src/components/Alert/alert.principles.stories.tsx +2 -8
  258. package/src/components/AppShell/app-shell.anatomy.stories.tsx +19 -13
  259. package/src/components/AppShell/app-shell.principles.stories.tsx +21 -21
  260. package/src/components/AppShell/app-shell.spec.md +4 -0
  261. package/src/components/AppShell/app-shell.stories.tsx +4 -5
  262. package/src/components/Avatar/avatar.tsx +1 -1
  263. package/src/components/Badge/badge.spec.md +2 -2
  264. package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +7 -3
  265. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +4 -1
  266. package/src/components/Breadcrumb/breadcrumb.stories.tsx +1 -1
  267. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +6 -6
  268. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +18 -6
  269. package/src/components/BulkActionBar/bulk-action-bar.spec.md +15 -5
  270. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +8 -24
  271. package/src/components/BulkActionBar/bulk-action-bar.tsx +4 -4
  272. package/src/components/Button/button-group.tsx +4 -4
  273. package/src/components/Button/button.anatomy.stories.tsx +26 -7
  274. package/src/components/Button/button.principles.stories.tsx +1 -1
  275. package/src/components/Button/button.spec.md +2 -2
  276. package/src/components/Button/button.stories.tsx +22 -28
  277. package/src/components/Button/button.tsx +2 -1
  278. package/src/components/Calendar/calendar.anatomy.stories.tsx +1 -1
  279. package/src/components/Calendar/calendar.spec.md +1 -1
  280. package/src/components/Carousel/carousel.spec.md +17 -1
  281. package/src/components/Carousel/carousel.tsx +93 -42
  282. package/src/components/Checkbox/checkbox-group.tsx +26 -15
  283. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +3 -3
  284. package/src/components/Checkbox/checkbox.spec.md +12 -3
  285. package/src/components/Checkbox/checkbox.stories.tsx +4 -4
  286. package/src/components/Checkbox/checkbox.tsx +79 -19
  287. package/src/components/Coachmark/coachmark.anatomy.stories.tsx +5 -5
  288. package/src/components/Coachmark/coachmark.principles.stories.tsx +1 -1
  289. package/src/components/Combobox/combobox.anatomy.stories.tsx +11 -4
  290. package/src/components/Combobox/combobox.principles.stories.tsx +10 -11
  291. package/src/components/Combobox/combobox.spec.md +6 -2
  292. package/src/components/Combobox/combobox.stories.tsx +9 -36
  293. package/src/components/Combobox/combobox.tsx +42 -27
  294. package/src/components/Command/command.spec.md +3 -3
  295. package/src/components/Command/command.tsx +9 -2
  296. package/src/components/DataTable/cell-registry.tsx +75 -76
  297. package/src/components/DataTable/column-types.ts +4 -17
  298. package/src/components/DataTable/data-table-column-visibility-panel.tsx +20 -7
  299. package/src/components/DataTable/data-table-filter-panel.tsx +6 -6
  300. package/src/components/DataTable/data-table-interaction-layer.tsx +3 -3
  301. package/src/components/DataTable/data-table-sort-manager.tsx +2 -2
  302. package/src/components/DataTable/data-table.anatomy.stories.tsx +25 -24
  303. package/src/components/DataTable/data-table.css +2 -3
  304. package/src/components/DataTable/data-table.principles.stories.tsx +17 -11
  305. package/src/components/DataTable/data-table.spec.md +8 -7
  306. package/src/components/DataTable/data-table.stories.tsx +39 -29
  307. package/src/components/DataTable/data-table.tsx +90 -67
  308. package/src/components/DataTable/filter-operators.spec.md +2 -0
  309. package/src/components/DateGrid/date-grid.spec.md +1 -1
  310. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +9 -9
  311. package/src/components/DatePicker/date-picker.principles.stories.tsx +4 -4
  312. package/src/components/DatePicker/date-picker.spec.md +10 -9
  313. package/src/components/DatePicker/date-picker.stories.tsx +9 -9
  314. package/src/components/DatePicker/date-picker.tsx +13 -13
  315. package/src/components/DescriptionList/description-list.anatomy.stories.tsx +5 -5
  316. package/src/components/DescriptionList/description-list.principles.stories.tsx +2 -2
  317. package/src/components/DescriptionList/description-list.spec.md +12 -12
  318. package/src/components/DescriptionList/description-list.stories.tsx +3 -3
  319. package/src/components/DescriptionList/description-list.tsx +10 -10
  320. package/src/components/Dialog/dialog.tsx +4 -1
  321. package/src/components/DropdownMenu/dropdown-menu.tsx +27 -14
  322. package/src/components/Empty/empty.spec.md +0 -1
  323. package/src/components/Field/field-context.ts +17 -11
  324. package/src/components/Field/field-controls.spec.md +46 -37
  325. package/src/components/Field/field-types.ts +14 -12
  326. package/src/components/Field/field-wrapper.tsx +59 -43
  327. package/src/components/Field/field.anatomy.stories.tsx +6 -6
  328. package/src/components/Field/field.principles.stories.tsx +5 -28
  329. package/src/components/Field/field.spec.md +5 -4
  330. package/src/components/Field/field.stories.tsx +103 -72
  331. package/src/components/Field/field.tsx +36 -4
  332. package/src/components/Field/form-validation.spec.md +4 -0
  333. package/src/components/Field/use-form-validation.ts +1 -1
  334. package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +3 -3
  335. package/src/components/FieldControlGroup/field-control-group.spec.md +3 -3
  336. package/src/components/FileItem/file-item.tsx +10 -8
  337. package/src/components/FileUpload/file-upload.principles.stories.tsx +7 -7
  338. package/src/components/FileUpload/file-upload.spec.md +3 -2
  339. package/src/components/FileUpload/file-upload.tsx +5 -1
  340. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1 -1
  341. package/src/components/FileViewer/file-viewer.principles.stories.tsx +1 -1
  342. package/src/components/FileViewer/file-viewer.spec.md +1 -1
  343. package/src/components/FileViewer/file-viewer.stories.tsx +1 -1
  344. package/src/components/FileViewer/file-viewer.tsx +3 -2
  345. package/src/components/HoverCard/hover-card.anatomy.stories.tsx +6 -4
  346. package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -1
  347. package/src/components/HoverCard/hover-card.spec.md +2 -2
  348. package/src/components/HoverCard/hover-card.tsx +4 -2
  349. package/src/components/InlineEdit/inline-edit.anatomy.stories.tsx +184 -0
  350. package/src/components/InlineEdit/inline-edit.principles.stories.tsx +142 -0
  351. package/src/components/InlineEdit/inline-edit.spec.md +71 -46
  352. package/src/components/InlineEdit/inline-edit.stories.tsx +20 -19
  353. package/src/components/InlineEdit/inline-edit.tsx +211 -125
  354. package/src/components/Input/input.anatomy.stories.tsx +15 -15
  355. package/src/components/Input/input.principles.stories.tsx +3 -3
  356. package/src/components/Input/input.spec.md +4 -4
  357. package/src/components/Input/input.stories.tsx +3 -3
  358. package/src/components/Input/input.tsx +13 -13
  359. package/src/components/LinkInput/link-input.anatomy.stories.tsx +2 -2
  360. package/src/components/LinkInput/link-input.principles.stories.tsx +1 -1
  361. package/src/components/LinkInput/link-input.spec.md +6 -2
  362. package/src/components/LinkInput/link-input.stories.tsx +8 -8
  363. package/src/components/LinkInput/link-input.tsx +21 -19
  364. package/src/components/Notice/notice.principles.stories.tsx +1 -1
  365. package/src/components/Notice/notice.tsx +8 -2
  366. package/src/components/NumberInput/number-input.anatomy.stories.tsx +6 -6
  367. package/src/components/NumberInput/number-input.principles.stories.tsx +4 -4
  368. package/src/components/NumberInput/number-input.spec.md +6 -6
  369. package/src/components/NumberInput/number-input.stories.tsx +4 -4
  370. package/src/components/NumberInput/number-input.tsx +17 -5
  371. package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +8 -4
  372. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +6 -7
  373. package/src/components/OverflowIndicator/overflow-indicator.spec.md +1 -1
  374. package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +6 -30
  375. package/src/components/PeoplePicker/avatar-stack-overflow.ts +1 -1
  376. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +13 -10
  377. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +5 -1
  378. package/src/components/PeoplePicker/people-picker.stories.tsx +5 -5
  379. package/src/components/PeoplePicker/people-picker.tsx +39 -20
  380. package/src/components/PeoplePicker/person-display.tsx +3 -3
  381. package/src/components/Popover/popover.anatomy.stories.tsx +10 -7
  382. package/src/components/Popover/popover.principles.stories.tsx +49 -28
  383. package/src/components/Popover/popover.spec.md +4 -2
  384. package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +1 -1
  385. package/src/components/ProfileCard/profile-card.tsx +1 -1
  386. package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +14 -13
  387. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +8 -23
  388. package/src/components/ProgressBar/progress-bar.stories.tsx +8 -2
  389. package/src/components/README.md +1 -0
  390. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +8 -3
  391. package/src/components/RadioGroup/radio-group.stories.tsx +3 -3
  392. package/src/components/RadioGroup/radio-group.tsx +19 -14
  393. package/src/components/Rating/rating.anatomy.stories.tsx +1 -1
  394. package/src/components/Rating/rating.principles.stories.tsx +3 -3
  395. package/src/components/Rating/rating.spec.md +2 -2
  396. package/src/components/Rating/rating.stories.tsx +4 -18
  397. package/src/components/Rating/rating.tsx +5 -1
  398. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +1 -1
  399. package/src/components/ScrollArea/scroll-area.spec.md +1 -1
  400. package/src/components/ScrollArea/scroll-area.tsx +5 -2
  401. package/src/components/SegmentedControl/segmented-control.principles.stories.tsx +4 -1
  402. package/src/components/SegmentedControl/segmented-control.spec.md +5 -10
  403. package/src/components/SegmentedControl/segmented-control.tsx +6 -3
  404. package/src/components/Select/select.anatomy.stories.tsx +13 -7
  405. package/src/components/Select/select.principles.stories.tsx +3 -3
  406. package/src/components/Select/select.spec.md +10 -1
  407. package/src/components/Select/select.stories.tsx +41 -27
  408. package/src/components/Select/select.tsx +44 -26
  409. package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +44 -26
  410. package/src/components/SelectMenu/select-menu.principles.stories.tsx +0 -1
  411. package/src/components/SelectMenu/select-menu.stories.tsx +7 -19
  412. package/src/components/SelectMenu/select-menu.tsx +38 -5
  413. package/src/components/SelectionControl/boolean-value.tsx +2 -2
  414. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +1 -1
  415. package/src/components/SelectionControl/selection-item.principles.stories.tsx +4 -4
  416. package/src/components/Separator/separator.principles.stories.tsx +1 -1
  417. package/src/components/Sheet/sheet.principles.stories.tsx +5 -3
  418. package/src/components/Sheet/sheet.tsx +4 -1
  419. package/src/components/Sidebar/sidebar.tsx +1 -1
  420. package/src/components/Slider/slider.anatomy.stories.tsx +5 -4
  421. package/src/components/Slider/slider.principles.stories.tsx +6 -6
  422. package/src/components/Slider/slider.spec.md +13 -1
  423. package/src/components/Slider/slider.stories.tsx +44 -32
  424. package/src/components/Slider/slider.tsx +13 -4
  425. package/src/components/Steps/steps.anatomy.stories.tsx +7 -7
  426. package/src/components/Steps/steps.principles.stories.tsx +1 -1
  427. package/src/components/Steps/steps.spec.md +4 -2
  428. package/src/components/Steps/steps.stories.tsx +4 -56
  429. package/src/components/Steps/steps.tsx +31 -7
  430. package/src/components/Switch/switch.anatomy.stories.tsx +3 -3
  431. package/src/components/Switch/switch.principles.stories.tsx +1 -1
  432. package/src/components/Switch/switch.spec.md +4 -4
  433. package/src/components/Switch/switch.stories.tsx +3 -3
  434. package/src/components/Switch/switch.tsx +16 -10
  435. package/src/components/Tabs/tabs.anatomy.stories.tsx +6 -0
  436. package/src/components/Tabs/tabs.principles.stories.tsx +10 -2
  437. package/src/components/Tabs/tabs.spec.md +5 -2
  438. package/src/components/Tabs/tabs.stories.tsx +36 -44
  439. package/src/components/Tabs/tabs.tsx +101 -36
  440. package/src/components/Tag/tag.anatomy.stories.tsx +2 -2
  441. package/src/components/Tag/tag.principles.stories.tsx +4 -4
  442. package/src/components/Tag/tag.spec.md +4 -1
  443. package/src/components/Tag/tag.tsx +5 -3
  444. package/src/components/Textarea/textarea.anatomy.stories.tsx +6 -6
  445. package/src/components/Textarea/textarea.spec.md +5 -5
  446. package/src/components/Textarea/textarea.tsx +24 -24
  447. package/src/components/TimePicker/time-picker.anatomy.stories.tsx +12 -11
  448. package/src/components/TimePicker/time-picker.principles.stories.tsx +37 -44
  449. package/src/components/TimePicker/time-picker.spec.md +6 -5
  450. package/src/components/TimePicker/time-picker.stories.tsx +3 -3
  451. package/src/components/TimePicker/time-picker.tsx +24 -14
  452. package/src/components/Toast/toast.principles.stories.tsx +1 -1
  453. package/src/components/Toast/toast.stories.tsx +1 -1
  454. package/src/components/Tooltip/tooltip.anatomy.stories.tsx +15 -6
  455. package/src/components/Tooltip/tooltip.principles.stories.tsx +4 -4
  456. package/src/components/Tooltip/tooltip.spec.md +9 -3
  457. package/src/components/Tooltip/tooltip.stories.tsx +1 -1
  458. package/src/components/Tooltip/tooltip.tsx +12 -2
  459. package/src/components/TreeView/tree-view.anatomy.stories.tsx +16 -14
  460. package/src/components/TreeView/tree-view.principles.stories.tsx +44 -11
  461. package/src/components/TreeView/tree-view.spec.md +8 -6
  462. package/src/components/TreeView/tree-view.stories.tsx +9 -43
  463. package/src/components/TreeView/tree-view.tsx +36 -0
  464. package/src/index.ts +13 -10
  465. package/src/lib/drag-visual.ts +2 -2
  466. package/src/lib/utils.ts +19 -0
  467. package/src/patterns/action-bar/action-bar.spec.md +1 -0
  468. package/src/patterns/element-anatomy/inline-action.spec.md +1 -1
  469. package/src/patterns/element-anatomy/item-anatomy.spec.md +4 -0
  470. package/src/patterns/element-anatomy/item-anatomy.tsx +4 -2
  471. package/src/patterns/header-canonical/header-canonical.spec.md +9 -0
  472. package/src/patterns/header-canonical/header-canonical.stories.tsx +31 -5
  473. package/src/tokens/categorical-color.ts +5 -5
  474. package/src/tokens/color/color.spec.md +4 -4
  475. package/src/tokens/color/primitives.css +9 -2
  476. package/src/tokens/motion/motion.spec.md +6 -7
  477. package/src/tokens/opacity/opacity.spec.md +1 -1
  478. package/src/tokens/orphan-tokens.spec.md +1 -1
  479. package/src/tokens/typography/typography.spec.md +2 -0
  480. package/src/tokens/uiSize/uiSize.css +5 -0
  481. package/src/tokens/uiSize/uiSize.spec.md +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-sort-manager.js","sources":["../../../src/components/DataTable/data-table-sort-manager.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// same-row-mixed-allow: header chrome corner buttons(refresh/close)跟 row inline actions(drag/trash)不在同 row\nimport * as React from 'react'\nimport { Plus, Trash2, X as XIcon, RotateCcw, GripVertical } from 'lucide-react'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DndContext, closestCenter, type DragEndEvent } from '@dnd-kit/core'\nimport { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { cn } from '@/lib/utils'\nimport { dragSourceStyle, dragHandleCursorClass } from '@/design-system/lib/drag-visual'\nimport { Button } from '@/design-system/components/Button/button'\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ItemInlineActionButton } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { getColumnId, getColumnLabel } from './lib/column-meta'\n\n/**\n * DataTableSortManager — Notion-style 多欄排序管理 panel\n *\n * 對齊 ref/進階篩選/sort.png 設計:\n * Header(title + refresh + close)/ list(field + direction + delete + reorder)/\n * footer(+ 加排序)。\n *\n * Source-of-truth: TanStack `SortingState`(同 `useReactTable.state.sorting`)。\n * 跟 cell click sort 共享 state — single source-of-truth across cell + panel。\n *\n * Reorder:DnD(useSortable + GripVertical handle,見下方 SortRow)——原 MVP ↑/↓ button 已退役。\n */\n\ninterface SortColumn {\n id: string\n label: string\n enableSorting?: boolean\n}\n\nexport interface DataTableSortManagerProps<TData> {\n /** 可排序欄位來源(讀 columnDef.header / id);會自動排除 enableSorting=false */\n columns: ColumnDef<TData, any>[]\n /** 當前排序 state(TanStack SortingState) */\n sorting: SortingState\n /** 排序變更 callback */\n onSortingChange: (next: SortingState) => void\n /** Refresh 按鈕點擊(可選 — 重置或外部 refetch) */\n onReset?: () => void\n /** Close 按鈕點擊(若有 — 通常是包在 Popover 外層的 close 行為) */\n onClose?: () => void\n className?: string\n}\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): SortColumn[] {\n const out: SortColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n if (col.enableSorting === false) continue\n out.push({ id, label: getColumnLabel(col, id), enableSorting: true })\n }\n return out\n}\n\nconst DIRECTION_OPTIONS: SelectOption[] = [\n { value: 'asc', label: '升冪' },\n { value: 'desc', label: '降冪' },\n]\n\nexport function DataTableSortManager<TData>({\n columns,\n sorting,\n onSortingChange,\n onReset,\n onClose,\n className,\n}: DataTableSortManagerProps<TData>) {\n const sortableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => sortableColumns.map((c) => ({ value: c.id, label: c.label })),\n [sortableColumns]\n )\n\n const updateAt = (index: number, patch: Partial<{ id: string; desc: boolean }>) => {\n const next = sorting.map((s, i) => (i === index ? { ...s, ...patch } : s))\n onSortingChange(next)\n }\n const removeAt = (index: number) => {\n onSortingChange(sorting.filter((_, i) => i !== index))\n }\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = sorting.findIndex((s) => s.id === active.id)\n const newIndex = sorting.findIndex((s) => s.id === over.id)\n if (oldIndex < 0 || newIndex < 0) return\n const next = [...sorting]\n const [moved] = next.splice(oldIndex, 1)\n next.splice(newIndex, 0, moved)\n onSortingChange(next)\n }\n const addSort = () => {\n const used = new Set(sorting.map((s) => s.id))\n const firstUnused = sortableColumns.find((c) => !used.has(c.id))\n if (!firstUnused) return\n onSortingChange([...sorting, { id: firstUnused.id, desc: false }])\n }\n\n // K11 fix(2026-05-04): viewport-aware scroll chain invariant — 詳 overlay-surface.spec.md\n // 2026-05-23 Phase A.4 Decision 2: w-[480px] → token `--data-table-sort-panel-width`(SSOT in uiSize.css)\n return (\n <div className={cn('flex flex-col h-full min-h-0 w-[var(--data-table-sort-panel-width)]', className)}>\n {/* Popover 派輕量 chrome — slot 走 COMPACT_HEADER_SLOT(=21,衍生自 PopoverTitle text-body line-box),header 自然 ~45px */}\n <SurfaceHeader className={COMPACT_HEADER_SLOT}>\n <PopoverTitle className=\"flex-1\">排序</PopoverTitle>\n {onReset && sorting.length > 0 && (\n <>\n <Button variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw} aria-label=\"重置\" onClick={onReset} />\n {onClose && <ButtonDivider />}\n </>\n )}\n {onClose && (\n <PopoverClose asChild>\n <Button data-dismiss iconOnly dismiss size=\"sm\" startIcon={XIcon} aria-label=\"關閉\" onClick={onClose} />\n </PopoverClose>\n )}\n </SurfaceHeader>\n\n {/* Body — 條件 list + inline 加排序 CTA(對齊 filter panel canonical Q3+Q6,2026-05-04)\n 無條件時 CTA 直接顯示,不需要 Empty 大區塊 */}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {sorting.length > 0 && (\n <DndContext collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={sorting.map(s => s.id)} strategy={verticalListSortingStrategy}>\n {sorting.map((sort, index) => {\n const usedByOthers = new Set(sorting.filter((_, i) => i !== index).map((s) => s.id))\n const optionsForRow = fieldOptions.filter((o) => !usedByOthers.has(o.value))\n return (\n <SortRow\n key={sort.id}\n sort={sort}\n optionsForRow={optionsForRow}\n onChangeId={(v) => updateAt(index, { id: v })}\n onChangeDir={(v) => updateAt(index, { desc: v === 'desc' })}\n onRemove={() => removeAt(index)}\n />\n )\n })}\n </SortableContext>\n </DndContext>\n )}\n\n {/* B1 加排序 → tertiary,parallel filter「加篩選」(root-level CTA 對等視覺重量) */}\n <div>\n <Button\n variant=\"tertiary\"\n size=\"sm\"\n startIcon={Plus}\n onClick={addSort}\n disabled={sorting.length >= sortableColumns.length}\n >\n 加排序\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\nDataTableSortManager.displayName = 'DataTableSortManager'\n\n// SortRow:DnD-enabled row。GripVertical 為 drag listener handle(對齊 Notion / Airtable 拖曳 idiom)。\nfunction SortRow({\n sort, optionsForRow, onChangeId, onChangeDir, onRemove,\n}: {\n sort: { id: string; desc: boolean }\n optionsForRow: SelectOption[]\n onChangeId: (v: string) => void\n onChangeDir: (v: string) => void\n onRemove: () => void\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: sort.id })\n // 對齊 lib/drag-visual.ts SSOT:source dim 用 `--opacity-disabled` token(不 hardcode 0.5)\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n ...dragSourceStyle(isDragging),\n }\n // **#5 fix(2026-05-04)**:row 內水平 gap = gap-2 (8px),layoutSpace 規則 5 緊密相關\n // SurfaceBody row↔row vertical 仍 tight(12)— 不同 row 不緊密\n return (\n <div ref={setNodeRef} style={style} className=\"flex items-center gap-2\">\n <ItemInlineActionButton\n icon={GripVertical}\n size=\"sm\"\n aria-label=\"拖曳重排\"\n className={dragHandleCursorClass}\n {...attributes}\n {...listeners}\n />\n <div className=\"flex-1 min-w-0\">\n <Select size=\"sm\" options={optionsForRow} value={sort.id} onChange={onChangeId} />\n </div>\n <div className=\"w-32 shrink-0\">\n {/* minRows={2} — 升冪/降冪只 2 選項,顯式縮 menu 高度(Q5) */}\n <Select size=\"sm\" options={DIRECTION_OPTIONS} value={sort.desc ? 'desc' : 'asc'} onChange={onChangeDir} minRows={2} />\n </div>\n {/* Trash 用 text Button(Q4 對齊 filter panel)— form-control row 必 Field 同高 */}\n <Button variant=\"text\" size=\"sm\" iconOnly startIcon={Trash2} aria-label=\"刪除\" onClick={onRemove} />\n </div>\n )\n}\n"],"names":["XIcon"],"mappings":"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"}
1
+ {"version":3,"file":"data-table-sort-manager.js","sources":["../../../src/components/DataTable/data-table-sort-manager.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// same-row-mixed-allow: header chrome corner buttons(refresh/close)跟 row inline actions(drag/trash)不在同 row\nimport * as React from 'react'\nimport { Plus, Trash2, X as XIcon, RotateCcw, GripVertical } from 'lucide-react'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DndContext, closestCenter, type DragEndEvent } from '@dnd-kit/core'\nimport { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { cn } from '@/lib/utils'\nimport { dragSourceStyle, dragHandleCursorClass } from '@/design-system/lib/drag-visual'\nimport { Button } from '@/design-system/components/Button/button'\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ItemInlineActionButton } from '@/design-system/patterns/element-anatomy/item-anatomy'\nimport { getColumnId, getColumnLabel } from './lib/column-meta'\n\n/**\n * DataTableSortManager — Notion-style 多欄排序管理 panel\n *\n * 對齊 ref/進階篩選/sort.png 設計:\n * Header(title + refresh + close)/ list(field + direction + delete + reorder)/\n * footer(+ 加排序)。\n *\n * Source-of-truth: TanStack `SortingState`(同 `useReactTable.state.sorting`)。\n * 跟 cell click sort 共享 state — single source-of-truth across cell + panel。\n *\n * Reorder:DnD(useSortable + GripVertical handle,見下方 SortRow)——原 MVP ↑/↓ button 已退役。\n */\n\ninterface SortColumn {\n id: string\n label: string\n enableSorting?: boolean\n}\n\nexport interface DataTableSortManagerProps<TData> {\n /** 可排序欄位來源(讀 columnDef.header / id);會自動排除 enableSorting=false */\n columns: ColumnDef<TData, any>[]\n /** 當前排序 state(TanStack SortingState) */\n sorting: SortingState\n /** 排序變更 callback */\n onSortingChange: (next: SortingState) => void\n /** Refresh 按鈕點擊(可選 — 重置或外部 refetch) */\n onReset?: () => void\n /** Close 按鈕點擊(若有 — 通常是包在 Popover 外層的 close 行為) */\n onClose?: () => void\n className?: string\n}\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): SortColumn[] {\n const out: SortColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n if (col.enableSorting === false) continue\n out.push({ id, label: getColumnLabel(col, id), enableSorting: true })\n }\n return out\n}\n\nconst DIRECTION_OPTIONS: SelectOption[] = [\n { value: 'asc', label: '升冪' },\n { value: 'desc', label: '降冪' },\n]\n\nexport function DataTableSortManager<TData>({\n columns,\n sorting,\n onSortingChange,\n onReset,\n onClose,\n className,\n}: DataTableSortManagerProps<TData>) {\n const sortableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => sortableColumns.map((c) => ({ value: c.id, label: c.label })),\n [sortableColumns]\n )\n\n const updateAt = (index: number, patch: Partial<{ id: string; desc: boolean }>) => {\n const next = sorting.map((s, i) => (i === index ? { ...s, ...patch } : s))\n onSortingChange(next)\n }\n const removeAt = (index: number) => {\n onSortingChange(sorting.filter((_, i) => i !== index))\n }\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = sorting.findIndex((s) => s.id === active.id)\n const newIndex = sorting.findIndex((s) => s.id === over.id)\n if (oldIndex < 0 || newIndex < 0) return\n const next = [...sorting]\n const [moved] = next.splice(oldIndex, 1)\n next.splice(newIndex, 0, moved)\n onSortingChange(next)\n }\n const addSort = () => {\n const used = new Set(sorting.map((s) => s.id))\n const firstUnused = sortableColumns.find((c) => !used.has(c.id))\n if (!firstUnused) return\n onSortingChange([...sorting, { id: firstUnused.id, desc: false }])\n }\n\n // K11 fix(2026-05-04): viewport-aware scroll chain invariant — 詳 overlay-surface.spec.md\n // 2026-05-23 Phase A.4 Decision 2: w-[480px] → token `--data-table-sort-panel-width`(SSOT in uiSize.css)\n return (\n <div className={cn('flex flex-col h-full min-h-0 w-[var(--data-table-sort-panel-width)]', className)}>\n {/* Popover 派輕量 chrome — slot 走 COMPACT_HEADER_SLOT(=21,衍生自 PopoverTitle text-body line-box),header 自然 ~45px */}\n <SurfaceHeader className={COMPACT_HEADER_SLOT}>\n <PopoverTitle className=\"flex-1\">排序</PopoverTitle>\n {onReset && sorting.length > 0 && (\n <>\n <Button variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw} aria-label=\"重置\" onClick={onReset} />\n {onClose && <ButtonDivider />}\n </>\n )}\n {onClose && (\n <PopoverClose asChild>\n <Button data-dismiss iconOnly dismiss size=\"sm\" startIcon={XIcon} aria-label=\"關閉\" onClick={onClose} />\n </PopoverClose>\n )}\n </SurfaceHeader>\n\n {/* Body — 條件 list + inline 加排序 CTA(對齊 filter panel canonical Q3+Q6,2026-05-04)\n 無條件時 CTA 直接顯示,不需要 Empty 大區塊 */}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {sorting.length > 0 && (\n <DndContext collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={sorting.map(s => s.id)} strategy={verticalListSortingStrategy}>\n {sorting.map((sort, index) => {\n const usedByOthers = new Set(sorting.filter((_, i) => i !== index).map((s) => s.id))\n const optionsForRow = fieldOptions.filter((o) => !usedByOthers.has(o.value))\n return (\n <SortRow\n key={sort.id}\n sort={sort}\n optionsForRow={optionsForRow}\n onChangeId={(v) => updateAt(index, { id: v })}\n onChangeDir={(v) => updateAt(index, { desc: v === 'desc' })}\n onRemove={() => removeAt(index)}\n />\n )\n })}\n </SortableContext>\n </DndContext>\n )}\n\n {/* B1 加排序 → tertiary,parallel filter「加篩選」(root-level CTA 對等視覺重量) */}\n <div>\n <Button\n variant=\"tertiary\"\n size=\"sm\"\n startIcon={Plus}\n onClick={addSort}\n disabled={sorting.length >= sortableColumns.length}\n >\n 加排序\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\nDataTableSortManager.displayName = 'DataTableSortManager'\n\n// SortRow:DnD-enabled row。GripVertical 為 drag listener handle(對齊 Notion / Airtable 拖曳 idiom)。\nfunction SortRow({\n sort, optionsForRow, onChangeId, onChangeDir, onRemove,\n}: {\n sort: { id: string; desc: boolean }\n optionsForRow: SelectOption[]\n onChangeId: (v: string) => void\n onChangeDir: (v: string) => void\n onRemove: () => void\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: sort.id })\n // 對齊 lib/drag-visual.ts SSOT:source dim 用 `--opacity-disabled` token(不 hardcode 0.5)\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n ...dragSourceStyle(isDragging),\n }\n // **#5 fix(2026-05-04)**:row 內水平 gap = gap-2 (8px),layoutSpace 規則 5 緊密相關\n // SurfaceBody row↔row vertical 仍 tight(12)— 不同 row 不緊密\n return (\n <div ref={setNodeRef} style={style} className=\"flex items-center gap-2\">\n <ItemInlineActionButton\n icon={GripVertical}\n size=\"sm\"\n aria-label=\"拖曳重排\"\n className={dragHandleCursorClass}\n {...attributes}\n {...listeners}\n />\n <div className=\"flex-1 min-w-0\">\n <Select size=\"sm\" aria-label=\"排序欄位\" options={optionsForRow} value={sort.id} onChange={onChangeId} />\n </div>\n <div className=\"w-32 shrink-0\">\n {/* minRows={2} — 升冪/降冪只 2 選項,顯式縮 menu 高度(Q5) */}\n <Select size=\"sm\" aria-label=\"排序方向\" options={DIRECTION_OPTIONS} value={sort.desc ? 'desc' : 'asc'} onChange={onChangeDir} minRows={2} />\n </div>\n {/* Trash 用 text Button(Q4 對齊 filter panel)— form-control row 必 Field 同高 */}\n <Button variant=\"text\" size=\"sm\" iconOnly startIcon={Trash2} aria-label=\"刪除\" onClick={onRemove} />\n </div>\n )\n}\n"],"names":["XIcon"],"mappings":"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"}
@@ -26,7 +26,7 @@ export interface DataTableProps<TData> extends Omit<React.HTMLAttributes<HTMLDiv
26
26
  /**
27
27
  * Issue 9 cell error system(2026-05-10)。
28
28
  *
29
- * Map of `${rowId}:${colId}` → error message(string | string[])。Cell display mode 在 content
29
+ * Map of `${rowId}:${colId}` → error message(string | string[])。Cell view mode 在 content
30
30
  * 下方渲 `text-body text-error` 訊息,gap-1 spacing。Multi-error 用 array → ul / li 分行渲。
31
31
  *
32
32
  * **使用建議**:
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table.tsx"],"names":[],"mappings":"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"}
@@ -189,12 +189,24 @@ function DraggableHeaderCell({
189
189
  const childProps = children.props;
190
190
  const { role: _draggableRole, ...draggableAttrs } = draggable.attributes;
191
191
  const indicatorClass = dropIndicatorSide === "before" ? dropIndicatorColumn.pseudoBefore : dropIndicatorSide === "after" ? dropIndicatorColumn.pseudoAfter : "";
192
+ const rawListeners = draggable.listeners;
193
+ const guardedListeners = rawListeners ? {
194
+ ...rawListeners,
195
+ onKeyDown: (e) => {
196
+ var _a;
197
+ const target = e.target;
198
+ if (target !== e.currentTarget && target.closest('button, a, input, select, textarea, [role="menuitem"], [role="separator"]')) {
199
+ return;
200
+ }
201
+ (_a = rawListeners.onKeyDown) == null ? void 0 : _a.call(rawListeners, e);
202
+ }
203
+ } : rawListeners;
192
204
  return React.cloneElement(children, {
193
205
  ref: setRefs,
194
206
  style: { ...childProps.style ?? {}, ...dragStyle },
195
207
  "data-column-id": id,
196
208
  "data-column-locked": isLocked || void 0,
197
- ...disabled ? {} : { ...draggableAttrs, ...draggable.listeners },
209
+ ...disabled ? {} : { ...draggableAttrs, ...guardedListeners ?? {} },
198
210
  // 2026-05-06 v14.9 cursor canonical(對齊 Notion / Jira):
199
211
  // **idle hover NOT 顯 cursor-grab** — header click 觸發 sort,grab cursor 會誤導 user 以為「點 = 拖」;
200
212
  // **drag activation 後**(isDragging=true,過 8px activationConstraint)才顯 cursor-grabbing。
@@ -326,7 +338,6 @@ const MemoCellSlot = React.memo(function MemoCellSlot2({
326
338
  size,
327
339
  autoRowHeight,
328
340
  isEditable,
329
- isDisabled,
330
341
  onCommitCell,
331
342
  onCancelCell,
332
343
  onCellCommitLive,
@@ -335,9 +346,7 @@ const MemoCellSlot = React.memo(function MemoCellSlot2({
335
346
  const onCommit = React.useCallback((next) => onCommitCell(rowId, colId, next), [onCommitCell, rowId, colId]);
336
347
  const onCommitLive = React.useCallback((next) => onCellCommitLive == null ? void 0 : onCellCommitLive(rowId, colId, next), [onCellCommitLive, rowId, colId]);
337
348
  const onCancel = React.useCallback(() => onCancelCell(rowId, colId), [onCancelCell, rowId, colId]);
338
- const onRequestEdit = React.useCallback(() => {
339
- if (!isDisabled) onEnterEdit(rowId, colId);
340
- }, [onEnterEdit, isDisabled, rowId, colId]);
349
+ const onRequestEdit = React.useCallback(() => onEnterEdit(rowId, colId), [onEnterEdit, rowId, colId]);
341
350
  return /* @__PURE__ */ jsx(
342
351
  Cell,
343
352
  {
@@ -347,7 +356,6 @@ const MemoCellSlot = React.memo(function MemoCellSlot2({
347
356
  size,
348
357
  autoRowHeight,
349
358
  isEditable,
350
- isDisabled,
351
359
  onCommit,
352
360
  onCommitLive,
353
361
  onCancel,
@@ -460,18 +468,9 @@ function DataTableInner({
460
468
  },
461
469
  []
462
470
  );
463
- const isCellDisabled = React.useCallback(
464
- // any-allow: free-form consumer meta — same rationale as L143 renderTypedValue
465
- (meta, row) => {
466
- const d = meta == null ? void 0 : meta.disabled;
467
- if (typeof d === "function") return d(row) === true;
468
- return d === true;
469
- },
470
- []
471
- );
472
471
  const canEditCell = React.useCallback(
473
- (meta, row) => isCellEditable(meta, row) && !isCellDisabled(meta, row),
474
- [isCellEditable, isCellDisabled]
472
+ (meta, row) => isCellEditable(meta, row),
473
+ [isCellEditable]
475
474
  );
476
475
  const [sorting, setSorting] = React.useState(((_a = tableOptions == null ? void 0 : tableOptions.state) == null ? void 0 : _a.sorting) ?? []);
477
476
  const [columnVisibility, setColumnVisibility] = useControllable({
@@ -775,12 +774,11 @@ function DataTableInner({
775
774
  const rowId = cell.row.id;
776
775
  const colId = cell.column.id;
777
776
  const editable = isCellEditable(meta, cell.row.original);
778
- const disabled = isCellDisabled(meta, cell.row.original);
779
777
  const isEditingThisCell = editingCellId === cellEditId(rowId, colId);
780
778
  let content;
781
779
  if (colType) {
782
780
  const Cell = resolveCellComponent(colType);
783
- const cellMode = experimentalActiveEditorController && isEditingThisCell ? "display" : isEditingThisCell && !disabled ? "edit" : "display";
781
+ const cellMode = experimentalActiveEditorController && isEditingThisCell ? "view" : isEditingThisCell ? "edit" : "view";
784
782
  content = /* @__PURE__ */ jsx(
785
783
  MemoCellSlot,
786
784
  {
@@ -793,7 +791,6 @@ function DataTableInner({
793
791
  size,
794
792
  autoRowHeight,
795
793
  isEditable: editable,
796
- isDisabled: disabled,
797
794
  onCommitCell: commitCell,
798
795
  onCancelCell: cancelCellEdit,
799
796
  onCellCommitLive: onCellCommit,
@@ -891,11 +888,10 @@ function DataTableInner({
891
888
  const cellRowId = cell.row.id;
892
889
  const cellColId = cell.column.id;
893
890
  const cellEditable = isCellEditable(meta, cell.row.original);
894
- const cellDisabled = isCellDisabled(meta, cell.row.original);
895
891
  const isEditingThisCell = editingCellId === cellEditId(cellRowId, cellColId);
896
892
  const cellSpreadsheetId = `${cellRowId}:${cellColId}`;
897
893
  const isSelectedCell = spreadsheetMode && selectedCellId === cellSpreadsheetId;
898
- const onEditableCellClick = cellEditable && !cellDisabled && colType !== "boolean" && colType !== "url" && !isEditingThisCell ? (e) => {
894
+ const onEditableCellClick = cellEditable && colType !== "boolean" && colType !== "url" && !isEditingThisCell ? (e) => {
899
895
  if (spreadsheetMode) {
900
896
  if (e.shiftKey && rangeAnchor != null) {
901
897
  setRangeFocus(cellSpreadsheetId);
@@ -949,7 +945,6 @@ function DataTableInner({
949
945
  "data-column-id": cell.column.id,
950
946
  "data-cell-id": `${cell.row.id}:${cell.column.id}`,
951
947
  "data-range-cell": spreadsheetMode && rangeCellIdSet.has(`${cell.row.id}:${cell.column.id}`) ? "" : void 0,
952
- "data-cell-disabled": cellDisabled ? "true" : void 0,
953
948
  "aria-describedby": cellErrorId,
954
949
  "aria-invalid": hasCellError || void 0,
955
950
  className: cn(
@@ -988,19 +983,16 @@ function DataTableInner({
988
983
  // 跟 cell 4 邊 inset divider 視覺相疊(同 pixel)= 1 line visual,不雙線。
989
984
  inlineEdit && "dtCellGrid",
990
985
  onEditableCellClick && ["cursor-pointer", nakedCellEditableDisplayHover],
991
- // editable cell display hover affordance(對齊 Notion / Airtable hover-cell-shows-border canonical)
986
+ // editable cell view hover affordance(對齊 Notion / Airtable hover-cell-shows-border canonical)
992
987
  // a11y(2026-07-14 dim-10 修):非 spreadsheet inlineEdit cell 可 Tab 聚焦(見下方
993
988
  // tabIndex/onKeyDown)— focus-visible ring 對齊本檔 expand button / sortable header canonical。
994
989
  onEditableCellClick && !spreadsheetMode && "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
995
- // 2026-05-13 Q3 cell disabled SSOT(per codex Q3 verdict + user 拍板「全部馬不停蹄做完」):
996
- // bg `--bg-disabled` component-state token(color.spec.md:671 owner)+ cursor 抑制 click affordance。
997
- cellDisabled && "bg-disabled cursor-not-allowed",
998
990
  // z-10 raise inline-edit cell;portal mode 不需(layer z-3 already on top)。
999
991
  isEditingThisCell && !experimentalActiveEditorController && "z-10"
1000
992
  ),
1001
993
  style: {
1002
994
  ...columnSizeStyle(cell.column, { resize: enableColumnResize, isSystemCol: isSystemColumn(cell.column.id) }),
1003
- // Padding override 只在 inline-edit cell(naked Field 撐滿 cell);portal mode cell 走正常 display padding
995
+ // Padding override 只在 inline-edit cell(naked Field 撐滿 cell);portal mode cell 走正常 view padding
1004
996
  ...isEditingThisCell && !experimentalActiveEditorController ? {} : cellPadding,
1005
997
  // Slice D Step 2(2026-05-10):flag 開時 set CSS variable 抑制 Field naked hover outline,
1006
998
  // 讓 overlay layer 接管 hover ring paint(per RFC Contract 8 「one geometry owner, two paint owners」)。
@@ -1238,7 +1230,7 @@ function DataTableInner({
1238
1230
  },
1239
1231
  // D3 dep-hygiene fix(2026-07-06):handler 內(portal edit Enter 分支)呼叫的是 canEditCell,
1240
1232
  // 非 isCellEditable — 原 deps 列 isCellEditable 是靠 canEditCell identity-stable 才無實害的
1241
- // stale-closure 地雷;改列真實依賴 canEditCell(其 useCallback deps 已含 isCellEditable + isCellDisabled)。
1233
+ // stale-closure 地雷;改列真實依賴 canEditCell(其 useCallback deps 已含 isCellEditable)。
1242
1234
  [
1243
1235
  enabled,
1244
1236
  mode,
@@ -1386,16 +1378,34 @@ function DataTableInner({
1386
1378
  const colOptIn = (colMeta == null ? void 0 : colMeta.resizable) !== false;
1387
1379
  const isResizable = enableColumnResize && !isSystemColumn(colId) && colOptIn;
1388
1380
  const isResizing = (_b2 = (_a3 = header.column).getIsResizing) == null ? void 0 : _b2.call(_a3);
1381
+ const effectiveMinWidth = header.column.columnDef.minSize ?? MIN_COLUMN_WIDTH;
1382
+ const currentWidth = Math.round(header.column.getSize());
1383
+ const RESIZE_KEY_STEP = 16;
1389
1384
  if (!showDivider && !isResizable) return null;
1390
1385
  return /* @__PURE__ */ jsx(
1391
1386
  "span",
1392
1387
  {
1393
1388
  role: isResizable ? "separator" : void 0,
1394
1389
  "aria-orientation": isResizable ? "vertical" : void 0,
1395
- "aria-label": isResizable ? "拖曳調整欄寬" : void 0,
1390
+ "aria-label": isResizable ? "調整欄寬" : void 0,
1391
+ tabIndex: isResizable ? 0 : void 0,
1392
+ "aria-valuenow": isResizable ? currentWidth : void 0,
1393
+ "aria-valuemin": isResizable ? effectiveMinWidth : void 0,
1394
+ "aria-valuetext": isResizable ? `${currentWidth}px` : void 0,
1395
+ onKeyDown: isResizable ? (e) => {
1396
+ let next = null;
1397
+ if (e.key === "ArrowLeft") next = Math.max(effectiveMinWidth, currentWidth - RESIZE_KEY_STEP);
1398
+ else if (e.key === "ArrowRight") next = currentWidth + RESIZE_KEY_STEP;
1399
+ else if (e.key === "Home") next = effectiveMinWidth;
1400
+ if (next == null) return;
1401
+ e.preventDefault();
1402
+ e.stopPropagation();
1403
+ table.setColumnSizing((prev) => ({ ...prev, [colId]: next }));
1404
+ } : void 0,
1396
1405
  className: cn(
1397
1406
  "group/resize absolute top-0 bottom-0 right-0 -mr-[3px] w-[7px]",
1398
- isResizable && "cursor-col-resize select-none"
1407
+ isResizable && "cursor-col-resize select-none",
1408
+ isResizable && "focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring"
1399
1409
  ),
1400
1410
  onPointerDownCapture: isResizable ? (e) => {
1401
1411
  var _a4;
@@ -1627,7 +1637,9 @@ function DataTableInner({
1627
1637
  ref: centerBodyRef,
1628
1638
  "data-datatable-hscroll": true,
1629
1639
  "data-datatable-panel": "center",
1630
- className: "flex-1 min-w-0 overflow-x-auto overflow-y-auto",
1640
+ tabIndex: enabled || spreadsheetMode ? void 0 : 0,
1641
+ "aria-label": enabled || spreadsheetMode ? void 0 : "表格內容,可捲動",
1642
+ className: "flex-1 min-w-0 overflow-x-auto overflow-y-auto focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring",
1631
1643
  style: isFillHeight && bodyMaxHeight != null ? { maxHeight: bodyMaxHeight } : hasHeightConstraint ? { maxHeight: height } : void 0,
1632
1644
  onScroll: onCenterBodyScroll,
1633
1645
  children: /* @__PURE__ */ jsx("div", { style: { minWidth: centerColsWidth }, children: renderBodyRows(centerCols, true, false) })