@qijenchen/design-system 0.1.0-beta.95 → 0.1.0-beta.99

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 (355) hide show
  1. package/README.md +1 -0
  2. package/dist/components/AccountMenu/account-menu.d.ts +86 -0
  3. package/dist/components/AccountMenu/account-menu.d.ts.map +1 -0
  4. package/dist/components/AccountMenu/account-menu.js +64 -0
  5. package/dist/components/AccountMenu/account-menu.js.map +1 -0
  6. package/dist/components/AccountMenu/index.d.ts +2 -0
  7. package/dist/components/AccountMenu/index.d.ts.map +1 -0
  8. package/dist/components/AccountMenu/index.js +6 -0
  9. package/dist/components/AccountMenu/index.js.map +1 -0
  10. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  11. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  12. package/dist/components/AppShell/app-shell.js +2 -2
  13. package/dist/components/AppShell/app-shell.js.map +1 -1
  14. package/dist/components/Badge/badge.d.ts +1 -1
  15. package/dist/components/Button/button.d.ts +3 -3
  16. package/dist/components/Button/button.d.ts.map +1 -1
  17. package/dist/components/Button/button.js +3 -2
  18. package/dist/components/Button/button.js.map +1 -1
  19. package/dist/components/Calendar/calendar.d.ts +10 -21
  20. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  21. package/dist/components/Calendar/calendar.js +52 -59
  22. package/dist/components/Calendar/calendar.js.map +1 -1
  23. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  24. package/dist/components/Combobox/combobox.js +1 -0
  25. package/dist/components/Combobox/combobox.js.map +1 -1
  26. package/dist/components/Command/command.d.ts.map +1 -1
  27. package/dist/components/Command/command.js +3 -1
  28. package/dist/components/Command/command.js.map +1 -1
  29. package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
  30. package/dist/components/DataTable/cell-registry.js +1 -5
  31. package/dist/components/DataTable/cell-registry.js.map +1 -1
  32. package/dist/components/DataTable/data-table-filter-group.d.ts +6 -2
  33. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -1
  34. package/dist/components/DataTable/data-table-filter-group.js +32 -27
  35. package/dist/components/DataTable/data-table-filter-group.js.map +1 -1
  36. package/dist/components/DataTable/data-table-filter-labels.d.ts +44 -0
  37. package/dist/components/DataTable/data-table-filter-labels.d.ts.map +1 -0
  38. package/dist/components/DataTable/data-table-filter-labels.js +55 -0
  39. package/dist/components/DataTable/data-table-filter-labels.js.map +1 -0
  40. package/dist/components/DataTable/data-table-filter-panel.d.ts +11 -0
  41. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  42. package/dist/components/DataTable/data-table-filter-panel.js +33 -10
  43. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -1
  44. package/dist/components/DataTable/data-table-filter-value-picker.d.ts +4 -1
  45. package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -1
  46. package/dist/components/DataTable/data-table-filter-value-picker.js +22 -8
  47. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
  48. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  49. package/dist/components/DataTable/data-table.js +5 -4
  50. package/dist/components/DataTable/data-table.js.map +1 -1
  51. package/dist/components/DataTable/index.js +2 -0
  52. package/dist/components/DataTable/index.js.map +1 -1
  53. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  54. package/dist/components/DatePicker/date-picker.js +187 -156
  55. package/dist/components/DatePicker/date-picker.js.map +1 -1
  56. package/dist/components/Dialog/dialog.d.ts +1 -1
  57. package/dist/components/Dialog/dialog.d.ts.map +1 -1
  58. package/dist/components/Dialog/dialog.js +4 -2
  59. package/dist/components/Dialog/dialog.js.map +1 -1
  60. package/dist/components/DropdownMenu/dropdown-menu.d.ts +4 -1
  61. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  62. package/dist/components/DropdownMenu/dropdown-menu.js +46 -14
  63. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  64. package/dist/components/Field/field-context.d.ts +12 -0
  65. package/dist/components/Field/field-context.d.ts.map +1 -1
  66. package/dist/components/Field/field-context.js +10 -1
  67. package/dist/components/Field/field-context.js.map +1 -1
  68. package/dist/components/Field/field-wrapper.d.ts.map +1 -1
  69. package/dist/components/Field/field-wrapper.js +7 -1
  70. package/dist/components/Field/field-wrapper.js.map +1 -1
  71. package/dist/components/Field/field.d.ts.map +1 -1
  72. package/dist/components/Field/field.js +11 -2
  73. package/dist/components/Field/field.js.map +1 -1
  74. package/dist/components/FieldControlGroup/field-control-group.d.ts +2 -5
  75. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  76. package/dist/components/FieldControlGroup/field-control-group.js +2 -2
  77. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  78. package/dist/components/FileUpload/file-upload.js +1 -1
  79. package/dist/components/FileUpload/file-upload.js.map +1 -1
  80. package/dist/components/FileViewer/file-viewer.d.ts +1 -1
  81. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  82. package/dist/components/FileViewer/file-viewer.js +20 -3
  83. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  84. package/dist/components/InlineEdit/inline-edit.d.ts +5 -0
  85. package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
  86. package/dist/components/InlineEdit/inline-edit.js +65 -33
  87. package/dist/components/InlineEdit/inline-edit.js.map +1 -1
  88. package/dist/components/Input/input.d.ts.map +1 -1
  89. package/dist/components/Input/input.js +3 -2
  90. package/dist/components/Input/input.js.map +1 -1
  91. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  92. package/dist/components/LinkInput/link-input.js +2 -1
  93. package/dist/components/LinkInput/link-input.js.map +1 -1
  94. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  95. package/dist/components/Menu/menu-item.js +4 -2
  96. package/dist/components/Menu/menu-item.js.map +1 -1
  97. package/dist/components/PeoplePicker/people-picker.d.ts +2 -0
  98. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  99. package/dist/components/PeoplePicker/people-picker.js +4 -0
  100. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  101. package/dist/components/Popover/popover.d.ts.map +1 -1
  102. package/dist/components/Popover/popover.js +4 -2
  103. package/dist/components/Popover/popover.js.map +1 -1
  104. package/dist/components/ScrollArea/scroll-area.d.ts +4 -3
  105. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  106. package/dist/components/ScrollArea/scroll-area.js +1 -1
  107. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  108. package/dist/components/Select/select.d.ts.map +1 -1
  109. package/dist/components/Select/select.js +59 -37
  110. package/dist/components/Select/select.js.map +1 -1
  111. package/dist/components/SelectMenu/select-menu.d.ts +2 -0
  112. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  113. package/dist/components/SelectMenu/select-menu.js +3 -1
  114. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  115. package/dist/components/Sheet/sheet.d.ts +1 -1
  116. package/dist/components/Sidebar/sidebar.js +2 -2
  117. package/dist/components/Sidebar/sidebar.js.map +1 -1
  118. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  119. package/dist/components/Tabs/tabs.js +3 -0
  120. package/dist/components/Tabs/tabs.js.map +1 -1
  121. package/dist/components/Tag/tag.d.ts +1 -1
  122. package/dist/components/Tag/tag.d.ts.map +1 -1
  123. package/dist/components/Tag/tag.js +4 -3
  124. package/dist/components/Tag/tag.js.map +1 -1
  125. package/dist/components/Textarea/textarea.d.ts +11 -0
  126. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  127. package/dist/components/Textarea/textarea.js +22 -5
  128. package/dist/components/Textarea/textarea.js.map +1 -1
  129. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  130. package/dist/components/TimePicker/time-picker.js +4 -3
  131. package/dist/components/TimePicker/time-picker.js.map +1 -1
  132. package/dist/components/Tooltip/tooltip.d.ts +1 -1
  133. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  134. package/dist/components/Tooltip/tooltip.js +26 -1
  135. package/dist/components/Tooltip/tooltip.js.map +1 -1
  136. package/dist/components/TreeView/tree-view.d.ts +2 -0
  137. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  138. package/dist/components/TreeView/tree-view.js +3 -2
  139. package/dist/components/TreeView/tree-view.js.map +1 -1
  140. package/dist/index.d.ts +5 -3
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +4 -0
  143. package/dist/index.js.map +1 -1
  144. package/dist/patterns/element-anatomy/item-anatomy.d.ts +10 -1
  145. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  146. package/dist/patterns/element-anatomy/item-anatomy.js +77 -29
  147. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  148. package/dist/patterns/header-canonical/chrome-header.d.ts +11 -4
  149. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  150. package/dist/patterns/header-canonical/chrome-header.js +1 -1
  151. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  152. package/dist/patterns/overlay-surface/overlay-surface.d.ts +4 -3
  153. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  154. package/dist/patterns/overlay-surface/overlay-surface.js +1 -0
  155. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  156. package/dist/patterns/resize-handle/resize-handle.d.ts +9 -11
  157. package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
  158. package/dist/patterns/resize-handle/resize-handle.js +3 -6
  159. package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
  160. package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +1 -1
  161. package/ds-canonical/adapters/claude-root-instructions.md +1 -1
  162. package/ds-canonical/adapters/claude-settings-base.json +2 -5
  163. package/ds-canonical/fork/AGENTS.md +21 -10
  164. package/ds-canonical/fork/codex/hooks.json +1 -1
  165. package/ds-canonical/fork/common/instruction.md +21 -10
  166. package/ds-canonical/fork/consumer/governance-check.mjs +101 -13
  167. package/ds-canonical/fork/consumer/lock.json +14 -15
  168. package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +26 -3
  169. package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +61 -5
  170. package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +3 -10
  171. package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +3 -2
  172. package/ds-canonical/fork/governance.lock +17 -33
  173. package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +33 -0
  174. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +39 -0
  175. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
  176. package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +5 -11
  177. package/ds-canonical/fork/launchers/settings-hooks.json +2 -2
  178. package/ds-canonical/fork/manifest.json +11 -13
  179. package/ds-canonical/fork/providers/claude/hook-config.json +1 -7
  180. package/ds-canonical/fork/providers/codex/hook-config.json +1 -1
  181. package/ds-canonical/fork/references/story-baseline-registry.json +7 -1
  182. package/ds-canonical/hooks/check_consumer_code_quality.sh +33 -0
  183. package/ds-canonical/hooks/check_pattern_invariants.sh +39 -0
  184. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
  185. package/ds-canonical/hooks/session_start_governance_check.sh +5 -6
  186. package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +23 -1
  187. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +36 -2
  188. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
  189. package/ds-canonical/references/failure-class-registry.json +151 -144
  190. package/ds-canonical/references/preflight-gate-baseline.json +16 -12
  191. package/ds-canonical/references/story-baseline-registry.json +7 -1
  192. package/ds-canonical/rules/meta-patterns.md +3 -3
  193. package/ds-canonical/skills/design-system-audit/SKILL.md +1 -1
  194. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1 -1
  195. package/ds-canonical/templates/dashboard-app.tsx +31 -8
  196. package/llms-full.txt +6 -1
  197. package/llms.txt +2 -1
  198. package/package.json +1 -1
  199. package/src/components/Accordion/accordion.principles.stories.tsx +16 -26
  200. package/src/components/Accordion/accordion.stories.tsx +22 -40
  201. package/src/components/AccountMenu/account-menu.anatomy.stories.tsx +115 -0
  202. package/src/components/AccountMenu/account-menu.principles.stories.tsx +99 -0
  203. package/src/components/AccountMenu/account-menu.spec.md +101 -0
  204. package/src/components/AccountMenu/account-menu.stories.tsx +61 -0
  205. package/src/components/AccountMenu/account-menu.tsx +170 -0
  206. package/src/components/AccountMenu/index.ts +5 -0
  207. package/src/components/AppShell/_demo-helpers.tsx +53 -53
  208. package/src/components/AppShell/app-shell.spec.md +5 -1
  209. package/src/components/AppShell/app-shell.tsx +14 -12
  210. package/src/components/Avatar/avatar.principles.stories.tsx +4 -4
  211. package/src/components/Avatar/avatar.stories.tsx +20 -5
  212. package/src/components/Breadcrumb/breadcrumb.spec.md +1 -1
  213. package/src/components/Button/button.spec.md +1 -1
  214. package/src/components/Button/button.stories.tsx +21 -9
  215. package/src/components/Button/button.tsx +5 -4
  216. package/src/components/Calendar/calendar.anatomy.stories.tsx +19 -17
  217. package/src/components/Calendar/calendar.principles.stories.tsx +5 -6
  218. package/src/components/Calendar/calendar.spec.md +25 -29
  219. package/src/components/Calendar/calendar.stories.tsx +5 -7
  220. package/src/components/Calendar/calendar.tsx +75 -87
  221. package/src/components/Carousel/carousel.principles.stories.tsx +5 -1
  222. package/src/components/Chart/chart.spec.md +1 -1
  223. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +14 -5
  224. package/src/components/Chip/chip.spec.md +1 -1
  225. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +7 -6
  226. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +8 -6
  227. package/src/components/CircularProgress/circular-progress.stories.tsx +3 -3
  228. package/src/components/Combobox/combobox.tsx +1 -0
  229. package/src/components/Command/command.spec.md +1 -0
  230. package/src/components/Command/command.tsx +4 -1
  231. package/src/components/DataTable/cell-registry.tsx +3 -7
  232. package/src/components/DataTable/data-table-filter-group.tsx +44 -27
  233. package/src/components/DataTable/data-table-filter-labels.ts +100 -0
  234. package/src/components/DataTable/data-table-filter-panel.tsx +48 -8
  235. package/src/components/DataTable/data-table-filter-value-picker.tsx +25 -8
  236. package/src/components/DataTable/data-table.spec.md +18 -1
  237. package/src/components/DataTable/data-table.stories.tsx +346 -33
  238. package/src/components/DataTable/data-table.tsx +11 -4
  239. package/src/components/DataTable/filter-operators.spec.md +2 -2
  240. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +24 -20
  241. package/src/components/DateGrid/date-grid.principles.stories.tsx +27 -21
  242. package/src/components/DateGrid/date-grid.stories.tsx +22 -13
  243. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +3 -3
  244. package/src/components/DatePicker/date-picker.spec.md +4 -4
  245. package/src/components/DatePicker/date-picker.stories.tsx +33 -9
  246. package/src/components/DatePicker/date-picker.tsx +210 -147
  247. package/src/components/Dialog/dialog.spec.md +1 -1
  248. package/src/components/Dialog/dialog.tsx +8 -2
  249. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
  250. package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -0
  251. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +3 -17
  252. package/src/components/DropdownMenu/dropdown-menu.tsx +58 -16
  253. package/src/components/Field/field-context.ts +25 -1
  254. package/src/components/Field/field-wrapper.tsx +7 -1
  255. package/src/components/Field/field.spec.md +8 -1
  256. package/src/components/Field/field.tsx +14 -2
  257. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +3 -3
  258. package/src/components/FieldControlGroup/field-control-group.spec.md +2 -3
  259. package/src/components/FieldControlGroup/field-control-group.stories.tsx +2 -1
  260. package/src/components/FieldControlGroup/field-control-group.tsx +6 -9
  261. package/src/components/FileItem/file-item.spec.md +1 -1
  262. package/src/components/FileItem/file-item.stories.tsx +1 -1
  263. package/src/components/FileUpload/file-upload.stories.tsx +32 -0
  264. package/src/components/FileUpload/file-upload.tsx +1 -1
  265. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1 -1
  266. package/src/components/FileViewer/file-viewer.spec.md +1 -1
  267. package/src/components/FileViewer/file-viewer.stories.tsx +7 -0
  268. package/src/components/FileViewer/file-viewer.tsx +23 -5
  269. package/src/components/InlineEdit/inline-edit.spec.md +12 -0
  270. package/src/components/InlineEdit/inline-edit.stories.tsx +30 -19
  271. package/src/components/InlineEdit/inline-edit.tsx +94 -31
  272. package/src/components/Input/input.anatomy.stories.tsx +28 -12
  273. package/src/components/Input/input.principles.stories.tsx +23 -18
  274. package/src/components/Input/input.stories.tsx +9 -1
  275. package/src/components/Input/input.tsx +7 -2
  276. package/src/components/LinkInput/link-input.principles.stories.tsx +7 -7
  277. package/src/components/LinkInput/link-input.spec.md +1 -1
  278. package/src/components/LinkInput/link-input.tsx +5 -1
  279. package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
  280. package/src/components/Menu/menu-item.tsx +9 -2
  281. package/src/components/NumberInput/number-input.anatomy.stories.tsx +44 -10
  282. package/src/components/NumberInput/number-input.principles.stories.tsx +20 -14
  283. package/src/components/NumberInput/number-input.spec.md +1 -1
  284. package/src/components/NumberInput/number-input.stories.tsx +12 -5
  285. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +7 -0
  286. package/src/components/PeoplePicker/people-picker.spec.md +3 -1
  287. package/src/components/PeoplePicker/people-picker.tsx +5 -0
  288. package/src/components/Popover/popover.tsx +7 -2
  289. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +14 -12
  290. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +5 -1
  291. package/src/components/RadioGroup/radio-group.spec.md +1 -1
  292. package/src/components/Rating/rating.principles.stories.tsx +2 -2
  293. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
  294. package/src/components/ScrollArea/scroll-area.spec.md +3 -3
  295. package/src/components/ScrollArea/scroll-area.tsx +5 -4
  296. package/src/components/Select/select.principles.stories.tsx +4 -3
  297. package/src/components/Select/select.stories.tsx +7 -6
  298. package/src/components/Select/select.tsx +61 -29
  299. package/src/components/SelectMenu/select-menu.spec.md +1 -1
  300. package/src/components/SelectMenu/select-menu.tsx +4 -1
  301. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +19 -8
  302. package/src/components/SelectionControl/selection-item.stories.tsx +7 -7
  303. package/src/components/Sheet/sheet.spec.md +1 -1
  304. package/src/components/Sidebar/sidebar.spec.md +3 -2
  305. package/src/components/Sidebar/sidebar.stories.tsx +67 -37
  306. package/src/components/Sidebar/sidebar.tsx +3 -3
  307. package/src/components/Slider/slider.principles.stories.tsx +9 -9
  308. package/src/components/Steps/steps.spec.md +1 -0
  309. package/src/components/Steps/steps.stories.tsx +18 -1
  310. package/src/components/Switch/switch.anatomy.stories.tsx +11 -11
  311. package/src/components/Switch/switch.principles.stories.tsx +11 -8
  312. package/src/components/Tabs/tabs.principles.stories.tsx +24 -0
  313. package/src/components/Tabs/tabs.spec.md +6 -4
  314. package/src/components/Tabs/tabs.tsx +11 -0
  315. package/src/components/Tag/tag.anatomy.stories.tsx +5 -2
  316. package/src/components/Tag/tag.spec.md +4 -3
  317. package/src/components/Tag/tag.stories.tsx +19 -0
  318. package/src/components/Tag/tag.tsx +14 -5
  319. package/src/components/Textarea/textarea.anatomy.stories.tsx +15 -9
  320. package/src/components/Textarea/textarea.principles.stories.tsx +21 -5
  321. package/src/components/Textarea/textarea.spec.md +10 -1
  322. package/src/components/Textarea/textarea.tsx +38 -5
  323. package/src/components/TimePicker/time-picker.tsx +11 -5
  324. package/src/components/Tooltip/tooltip.spec.md +10 -0
  325. package/src/components/Tooltip/tooltip.tsx +34 -3
  326. package/src/components/TreeView/tree-view.spec.md +3 -3
  327. package/src/components/TreeView/tree-view.stories.tsx +68 -9
  328. package/src/components/TreeView/tree-view.tsx +7 -2
  329. package/src/index.ts +9 -1
  330. package/src/patterns/element-anatomy/inline-action.spec.md +12 -8
  331. package/src/patterns/element-anatomy/item-anatomy.spec.md +8 -1
  332. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +24 -5
  333. package/src/patterns/element-anatomy/item-anatomy.tsx +120 -35
  334. package/src/patterns/element-anatomy/truncated-text.spec.md +13 -2
  335. package/src/patterns/header-canonical/chrome-header.tsx +14 -5
  336. package/src/patterns/header-canonical/header-canonical.spec.md +10 -7
  337. package/src/patterns/header-canonical/header-canonical.stories.tsx +77 -0
  338. package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +2 -0
  339. package/src/patterns/overlay-surface/overlay-surface.spec.md +1 -0
  340. package/src/patterns/overlay-surface/overlay-surface.stories.tsx +17 -1
  341. package/src/patterns/overlay-surface/overlay-surface.tsx +8 -4
  342. package/src/patterns/resize-handle/resize-handle.spec.md +11 -13
  343. package/src/patterns/resize-handle/resize-handle.stories.tsx +1 -3
  344. package/src/patterns/resize-handle/resize-handle.tsx +13 -18
  345. package/src/tokens/color/semantic.css +3 -1
  346. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +1 -1
  347. package/src/tokens/opacity/opacity.stories.tsx +1 -1
  348. package/src/tokens/radius/radius.stories.tsx +3 -3
  349. package/src/tokens/uiSize/uiSize.css +11 -0
  350. package/src/tokens/uiSize/uiSize.spec.md +1 -0
  351. package/ds-canonical/commands/gov-status.md +0 -9
  352. package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +0 -424
  353. package/ds-canonical/fork/preamble.md +0 -500
  354. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +0 -8
  355. package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter-panel.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgBtD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAElB,YAAY,EACZ,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,CAAA;AACD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AAsFvG,MAAM,WAAW,yBAAyB,CAAC,KAAK;IAI9C,0BAA0B;IAC1B,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAA;IAChC,gCAAgC;IAChC,KAAK,EAAE,UAAU,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,CAAA;IACzB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA6PD,eAAO,MAAM,oBAAoB,EAAkD,CAAC,KAAK,EACvF,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;CAAE,KACnF,KAAK,CAAC,YAAY,CACtB"}
1
+ {"version":3,"file":"data-table-filter-panel.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgBtD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAElB,YAAY,EACZ,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,sCAAsC,EAEtC,KAAK,0BAA0B,EAChC,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,CAAA;AACD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AACvG,OAAO,EAAE,sCAAsC,EAAE,CAAA;AACjD,YAAY,EAAE,0BAA0B,EAAE,CAAA;AAiG1C,MAAM,WAAW,yBAAyB,CAAC,KAAK;IAI9C,0BAA0B;IAC1B,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAA;IAChC,gCAAgC;IAChC,KAAK,EAAE,UAAU,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,CAAA;IACzB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA2QD,eAAO,MAAM,oBAAoB,EAAkD,CAAC,KAAK,EACvF,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;CAAE,KACnF,KAAK,CAAC,YAAY,CACtB"}
@@ -10,6 +10,8 @@ import { getColumnId, getColumnMeta, getColumnLabel } from "./lib/column-meta.js
10
10
  import { datePrecisionOf, getDefaultOperator, FilterRow, GroupBlock } from "./data-table-filter-group.js";
11
11
  import { isFilterTreeEqual } from "./filter-tree.js";
12
12
  import { createEmptyFilterTree, dataTableFilterMatch, evaluateTree, isFilterTreeActive } from "./filter-tree.js";
13
+ import { resolveDataTableFilterPanelLabels } from "./data-table-filter-labels.js";
14
+ import { DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS } from "./data-table-filter-labels.js";
13
15
  let _idSeed = 0;
14
16
  const newId = () => `f${++_idSeed}-${Date.now().toString(36)}`;
15
17
  function extractColumns(columns) {
@@ -60,6 +62,12 @@ const newEmptyGroup = () => ({
60
62
  conjunction: "or",
61
63
  children: [newEmptyCondition()]
62
64
  });
65
+ const countFilterConditions = (tree) => tree.mode === "flat" ? tree.children.length : tree.children.reduce((total, group) => total + group.children.length, 0);
66
+ const normalizeMaxConditions = (maxConditions) => {
67
+ if (maxConditions === void 0 || maxConditions === Number.POSITIVE_INFINITY) return Number.POSITIVE_INFINITY;
68
+ if (!Number.isFinite(maxConditions)) return 0;
69
+ return Math.max(0, Math.floor(maxConditions));
70
+ };
63
71
  function DataTableFilterPanelInner({
64
72
  columns,
65
73
  value,
@@ -67,6 +75,8 @@ function DataTableFilterPanelInner({
67
75
  defaultValue,
68
76
  prefilledColumnId,
69
77
  onPrefillConsumed,
78
+ maxConditions,
79
+ labels: labelsOverride,
70
80
  onClose,
71
81
  className
72
82
  }, ref) {
@@ -75,12 +85,20 @@ function DataTableFilterPanelInner({
75
85
  () => filterableColumns.map((c) => ({ value: c.id, label: c.label })),
76
86
  [filterableColumns]
77
87
  );
88
+ const labels = React.useMemo(
89
+ () => resolveDataTableFilterPanelLabels(labelsOverride),
90
+ [labelsOverride]
91
+ );
92
+ const conditionCount = countFilterConditions(value);
93
+ const normalizedMaxConditions = normalizeMaxConditions(maxConditions);
94
+ const canAddCondition = conditionCount < normalizedMaxConditions;
78
95
  const initialMountDoneRef = React.useRef(false);
79
96
  React.useEffect(() => {
80
97
  if (initialMountDoneRef.current) return;
81
98
  initialMountDoneRef.current = true;
82
99
  if (filterableColumns.length === 0) return;
83
100
  if (value.children.length > 0) return;
101
+ if (!canAddCondition) return;
84
102
  if (value.mode === "flat") {
85
103
  onChange({ ...value, children: [newEmptyCondition()] });
86
104
  } else {
@@ -90,7 +108,7 @@ function DataTableFilterPanelInner({
90
108
  React.useEffect(() => {
91
109
  if (!prefilledColumnId) return;
92
110
  const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId);
93
- if (colInfo) {
111
+ if (colInfo && canAddCondition) {
94
112
  const cond = {
95
113
  kind: "cond",
96
114
  id: newId(),
@@ -129,7 +147,7 @@ function DataTableFilterPanelInner({
129
147
  onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) });
130
148
  };
131
149
  const addFlatCondition = () => {
132
- if (!flatTree) return;
150
+ if (!flatTree || !canAddCondition) return;
133
151
  onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] });
134
152
  };
135
153
  const setFlatConjunction = (conj) => {
@@ -163,7 +181,7 @@ function DataTableFilterPanelInner({
163
181
  });
164
182
  };
165
183
  const addConditionToGroup = (groupId) => {
166
- if (!nestedTree) return;
184
+ if (!nestedTree || !canAddCondition) return;
167
185
  onChange({
168
186
  ...nestedTree,
169
187
  children: nestedTree.children.map(
@@ -176,7 +194,7 @@ function DataTableFilterPanelInner({
176
194
  onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) });
177
195
  };
178
196
  const addGroup = () => {
179
- if (!nestedTree) return;
197
+ if (!nestedTree || !canAddCondition) return;
180
198
  onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] });
181
199
  };
182
200
  const setRootConjunction = (conj) => {
@@ -204,7 +222,7 @@ function DataTableFilterPanelInner({
204
222
  className
205
223
  ), children: [
206
224
  /* @__PURE__ */ jsxs(SurfaceHeader, { className: COMPACT_HEADER_SLOT, children: [
207
- /* @__PURE__ */ jsx(PopoverTitle, { className: "flex-1", children: "篩選" }),
225
+ /* @__PURE__ */ jsx(PopoverTitle, { className: "flex-1", children: labels.title }),
208
226
  defaultValue && !isFilterTreeEqual(value, defaultValue) && /* @__PURE__ */ jsxs(Fragment, { children: [
209
227
  /* @__PURE__ */ jsx(
210
228
  Button,
@@ -213,13 +231,13 @@ function DataTableFilterPanelInner({
213
231
  size: "sm",
214
232
  iconOnly: true,
215
233
  startIcon: RotateCcw,
216
- "aria-label": "恢復預設",
234
+ "aria-label": labels.resetToDefault,
217
235
  onClick: () => onChange(defaultValue)
218
236
  }
219
237
  ),
220
238
  onClose && /* @__PURE__ */ jsx(ButtonDivider, {})
221
239
  ] }),
222
- onClose && /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { "data-dismiss": true, iconOnly: true, dismiss: true, size: "sm", startIcon: X, "aria-label": "關閉", onClick: onClose }) })
240
+ onClose && /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { "data-dismiss": true, iconOnly: true, dismiss: true, size: "sm", startIcon: X, "aria-label": labels.close, onClick: onClose }) })
223
241
  ] }),
224
242
  /* @__PURE__ */ jsxs(SurfaceBody, { className: "flex flex-col gap-[var(--layout-space-tight)]", children: [
225
243
  flatTree && flatTree.children.map((cond, idx) => /* @__PURE__ */ jsx(
@@ -237,7 +255,8 @@ function DataTableFilterPanelInner({
237
255
  },
238
256
  onChangeOp: (v) => updateFlatCondition(cond.id, { op: v, value: "" }),
239
257
  onChangeValue: (v) => updateFlatCondition(cond.id, { value: v }),
240
- onRemove: () => removeFlatCondition(cond.id)
258
+ onRemove: () => removeFlatCondition(cond.id),
259
+ labels
241
260
  },
242
261
  cond.id
243
262
  )),
@@ -254,7 +273,9 @@ function DataTableFilterPanelInner({
254
273
  onChangeCondition: (condId, patch) => updateGroupCondition(group.id, condId, patch),
255
274
  onRemoveCondition: (condId) => removeGroupCondition(group.id, condId),
256
275
  onAddCondition: () => addConditionToGroup(group.id),
257
- onRemoveGroup: () => removeGroup(group.id)
276
+ onRemoveGroup: () => removeGroup(group.id),
277
+ canAddCondition,
278
+ labels
258
279
  },
259
280
  group.id
260
281
  )),
@@ -265,7 +286,8 @@ function DataTableFilterPanelInner({
265
286
  size: "sm",
266
287
  startIcon: Plus,
267
288
  onClick: value.mode === "flat" ? addFlatCondition : addGroup,
268
- children: value.mode === "nested" ? "加入篩選器" : "加篩選"
289
+ disabled: !canAddCondition,
290
+ children: value.mode === "nested" ? labels.addGroup : labels.addFilter
269
291
  }
270
292
  ) })
271
293
  ] })
@@ -275,6 +297,7 @@ function DataTableFilterPanelInner({
275
297
  const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner);
276
298
  DataTableFilterPanel.displayName = "DataTableFilterPanel";
277
299
  export {
300
+ DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS,
278
301
  DataTableFilterPanel,
279
302
  createEmptyFilterTree,
280
303
  dataTableFilterMatch,
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter-panel.js","sources":["../../../src/components/DataTable/data-table-filter-panel.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(close)跟 row inline actions(trash)不在同 row\nimport * as React from 'react'\nimport { Plus, X as XIcon, RotateCcw } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport type { ColumnType } from './column-types'\nimport { getColumnId, getColumnLabel, getColumnMeta } from './lib/column-meta'\nimport {\n FilterRow,\n GroupBlock,\n getDefaultOperator,\n datePrecisionOf,\n type FilterColumn,\n} from './data-table-filter-group'\nimport {\n createEmptyFilterTree,\n isFilterTreeActive,\n isFilterTreeEqual,\n evaluateTree,\n dataTableFilterMatch,\n type Conjunction,\n type FilterCondition,\n type FilterGroup,\n type FilterTree,\n type FilterTreeFlat,\n type FilterTreeNested,\n} from './filter-tree'\n\n// Re-export public API from filter-tree(consumer 既有 import path 不變)\nexport {\n createEmptyFilterTree,\n isFilterTreeActive,\n evaluateTree,\n dataTableFilterMatch,\n}\nexport type { Conjunction, FilterCondition, FilterGroup, FilterTree, FilterTreeFlat, FilterTreeNested }\n\n/**\n * DataTableFilterPanel — ClickUp-style 進階篩選 panel\n *\n * 對齊 ClickUp / Airtable / Notion / Coda / Linear advanced-filter 派 —\n * parenthesized boolean expression builder。\n *\n * 兩種 mode 由 consumer 拍板:\n * - `flat`:root 下只能裝 condition,無 group\n * - `nested`:root 下裝 1+ group(灰底框),每個 group 內裝 1+ condition,**剛好 1 層**\n *\n * Source-of-truth:\n * - Operator definitions:`./filter-operators.ts` `OPERATOR_REGISTRY`(SSOT,禁 hardcode op 字串)\n * - Filter state:**FilterTree**(本檔自管;搭配 TanStack `globalFilter` 求值)\n * - Row / nested-group renderer:`./data-table-filter-group.tsx`;value picker:\n * `./data-table-filter-value-picker.tsx`(皆 @internal — 2026-07-14 file-size 拆檔,\n * 本檔只留 orchestration:columns 抽取 / FilterTree mutators / panel chrome)\n *\n * 詳:`./filter-operators.spec.md`\n */\n\n// ── Internal — id seed ──────────────────────────────────────────────────\n\nlet _idSeed = 0\nconst newId = () => `f${++_idSeed}-${Date.now().toString(36)}`\n\n// ── Helpers — column extraction + condition factories ──────────────────\n// (FilterColumn type + operator helpers 住 ./data-table-filter-group.tsx)\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): FilterColumn[] {\n const out: FilterColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n const meta = getColumnMeta(col)\n const type: ColumnType | undefined = meta?.type\n if (!type) continue\n if (meta?.filterable === false) continue\n out.push({\n id,\n label: getColumnLabel(col, id),\n type,\n options: meta?.options,\n people: meta?.people,\n includeTime: meta?.includeTime,\n })\n }\n return out\n}\n\nconst newCondition = (firstCol: FilterColumn | undefined): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: firstCol?.id ?? '',\n op: firstCol ? getDefaultOperator(firstCol.type) : '',\n value: '',\n datePrecision: datePrecisionOf(firstCol),\n})\n\n// **G fix(2026-05-04)**:initial-mount 用 — field 不預選,user 自選後 op/value 才 enable\n// Disabled state(field='')→ op + value 在 FilterRow 內走 `disabled={!hasField}` 自動連動\nconst newEmptyCondition = (): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: '',\n op: '',\n value: '',\n})\n\nconst newGroup = (firstCol: FilterColumn | undefined): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or', // group 內 default OR(對齊 ref 圖)\n children: [newCondition(firstCol)],\n})\n\nconst newEmptyGroup = (): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or',\n children: [newEmptyCondition()],\n})\n\n// ── Component Props ─────────────────────────────────────────────────────\n\nexport interface DataTableFilterPanelProps<TData> {\n // 2026-07-18 決策17:移除獨立 `mode` prop(單一真相源 = `value.mode` discriminant)——\n // 舊設計 mode + value.mode 兩來源型別允許矛盾(mode='nested' 配 flat value → CTA 錯文案 + 死操作);\n // 無外部消費者傳 mode(grep 0),全由 value.mode 推導。對齊 MUI X GridFilterModel / AG Grid 單一 model。\n /** 可被 filter 的 columns */\n columns: ColumnDef<TData, any>[]\n /** 當前 FilterTree(controlled) */\n value: FilterTree\n /** state 變更 callback */\n onChange: (next: FilterTree) => void\n /**\n * 管理員 set-as-default 的 baseline(refresh icon 顯示判定用)。\n * 當 `value` ≠ `defaultValue`(deep equal)→ panel header 顯示 refresh icon,\n * click → reset 回 defaultValue。對齊 sort 邏輯(相同 modified-from-default UX)。\n */\n defaultValue?: FilterTree\n /** Cell ⌄ menu「Filter by this」帶入的 column id(自動 add 一條 condition) */\n prefilledColumnId?: string\n onPrefillConsumed?: () => void\n onClose?: () => void\n className?: string\n}\n\n// ── Main Component ──────────────────────────────────────────────────────\n\n// 內部 fn — generic + ref 轉發。export 走 cast(對齊 DataTable 同 pattern)\nfunction DataTableFilterPanelInner<TData>({\n columns,\n value,\n onChange,\n defaultValue,\n prefilledColumnId,\n onPrefillConsumed,\n onClose,\n className,\n}: DataTableFilterPanelProps<TData>, ref: React.ForwardedRef<HTMLDivElement>): React.ReactElement {\n const filterableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => filterableColumns.map((c) => ({ value: c.id, label: c.label })),\n [filterableColumns],\n )\n // K13 後 firstCol 不再被 add* 消費(改用 newEmpty*),這裡只留 prefill effect 用(已直接讀 prefilledColumnId)。\n\n // **G fix(2026-05-04 v2)**:initial-mount 預設 1 empty row(field 未選 → op+value 自動 disabled)\n // useRef gate → 只 mount 一次;user 後續手動刪光 → 不 re-add → 維持「全清 = empty CTA only」UX\n // Two states clearly separated:\n // (a) Initial mount with empty value → auto-add 1 empty row(讓 user 看到 row shape,不必先點 CTA)\n // (b) User explicitly deletes all → empty CTA only(無 row,respect user intent)\n const initialMountDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (initialMountDoneRef.current) return\n initialMountDoneRef.current = true\n if (filterableColumns.length === 0) return\n if (value.children.length > 0) return\n if (value.mode === 'flat') {\n onChange({ ...value, children: [newEmptyCondition()] } as FilterTreeFlat)\n } else {\n onChange({ ...value, children: [newEmptyGroup()] } as FilterTreeNested)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterableColumns.length])\n\n // Prefill from cell ⌄ menu「Filter by this」\n React.useEffect(() => {\n if (!prefilledColumnId) return\n const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId)\n if (colInfo) {\n const cond: FilterCondition = {\n kind: 'cond',\n id: newId(),\n field: prefilledColumnId,\n op: getDefaultOperator(colInfo.type),\n value: '',\n // 2026-07-14 deep-audit fix:補 datePrecision(原漏 → datetime(includeTime=true)欄\n // prefill 掉到 undefined=day 精度忽略 ms;對齊初始 add / changeField 路徑的 datePrecisionOf)\n datePrecision: datePrecisionOf(colInfo),\n }\n if (value.mode === 'flat') {\n onChange({ ...value, children: [...value.children, cond] })\n } else {\n // nested mode:add 到第 1 個 group(若無則新建)\n if (value.children.length === 0) {\n onChange({ ...value, children: [{ ...newGroup(colInfo), children: [cond] }] })\n } else {\n const updatedGroups = value.children.map((g, i) =>\n i === 0 ? { ...g, children: [...g.children, cond] } : g\n )\n onChange({ ...value, children: updatedGroups })\n }\n }\n }\n onPrefillConsumed?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prefilledColumnId])\n\n // ── flat-mode mutators ──\n const flatTree = value.mode === 'flat' ? value : null\n const updateFlatCondition = (id: string, patch: Partial<FilterCondition>) => {\n if (!flatTree) return\n onChange({\n ...flatTree,\n children: flatTree.children.map((c) => (c.id === id ? { ...c, ...patch } : c)),\n })\n }\n const removeFlatCondition = (id: string) => {\n if (!flatTree) return\n onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) })\n }\n const addFlatCondition = () => {\n if (!flatTree) return\n // K13 fix(2026-05-04):加篩選 → empty row(field 未選 → op+value disabled)\n // World-class:Notion / Coda / ClickUp 不 auto-select;對齊 initial mount canonical\n onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] })\n }\n const setFlatConjunction = (conj: Conjunction) => {\n if (!flatTree) return\n onChange({ ...flatTree, conjunction: conj })\n }\n\n // ── nested-mode mutators ──\n const nestedTree = value.mode === 'nested' ? value : null\n const updateGroup = (groupId: string, patch: Partial<FilterGroup>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) => (g.id === groupId ? { ...g, ...patch } : g)),\n })\n }\n const updateGroupCondition = (groupId: string, condId: string, patch: Partial<FilterCondition>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId\n ? { ...g, children: g.children.map((c) => (c.id === condId ? { ...c, ...patch } : c)) }\n : g\n ),\n })\n }\n const removeGroupCondition = (groupId: string, condId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: g.children.filter((c) => c.id !== condId) } : g\n ),\n })\n }\n // K13 fix(2026-05-04):同 addFlatCondition,巢狀內加條件也 empty row\n const addConditionToGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: [...g.children, newEmptyCondition()] } : g\n ),\n })\n }\n const removeGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) })\n }\n const addGroup = () => {\n if (!nestedTree) return\n // K13:加群組也用 empty group\n onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] })\n }\n const setRootConjunction = (conj: Conjunction) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, conjunction: conj })\n }\n\n return (\n // 寬度策略:desktop 680px;mobile 縮到 viewport 內留 32px 邊(避溢出 popover 切右半)。\n // 對齊 Notion / Airtable 的 advanced filter 在 mobile 走 full-width 邊處理。\n // **#8 fix(2026-05-04)**:popover width by mode(由 cell min-w 與 group nested chrome 反推)\n // flat:cell ConjunctionLabel(80) + gap-2(8) + FCG(field-min 160 + op-min 120 + value 200) +\n // gap-2(8) + trash(28) + 2×loose padding(32) = ~636 → 640px\n // nested:再加 group p-2 (16) + outer ConjunctionLabel (80) + outer gap (8) → ~740 → 760px\n // 對齊 Airtable / Notion / Linear filter row 視覺密度 @benchmark-unverified(non-OSS)\n // **K11 fix(2026-05-04)**:viewport-aware scroll chain invariant\n // parent PopoverContent 是 flex flex-col + max-h + overflow-hidden,\n // panel root 必 forward `flex flex-col h-full` 才能讓 SurfaceBody flex-1 min-h-0 overflow-y-auto 生效\n // 無此 forward → 中間 wrapper 斷鏈 → body 不 scroll(ProfileCard 因為自身設 max-h flex-col 才繞過)\n // 詳 overlay-surface.spec.md「viewport-aware scroll chain invariant」段\n // K11 v2 fix(2026-05-04):flex item 預設 min-h:auto 讓 content 撐 height,h-full 失效。\n // 必加 `min-h-0` 才能讓 panel 在 PopoverContent max-h cap 下正確 shrink + body scroll。\n <div ref={ref} className={cn(\n 'flex flex-col h-full min-h-0',\n value.mode === 'nested'\n ? 'w-[min(760px,calc(100vw-2rem))]'\n : 'w-[min(640px,calc(100vw-2rem))]',\n className,\n )}>\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 {/* Refresh icon — 只在 value ≠ defaultValue 時顯示(對齊 sort modified-from-default UX)\n 含 ButtonDivider 對齊「欄位顯示」+「排序」chrome corner action canonical(2026-05-04) */}\n {defaultValue && !isFilterTreeEqual(value, defaultValue) && (\n <>\n <Button\n variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw}\n aria-label=\"恢復預設\"\n onClick={() => onChange(defaultValue)}\n />\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 — flat / nested 條件;空條件 → 直接顯 + 加篩選 CTA(對齊 Notion / Airtable / Linear inline 派,\n 無條件時不需要 Empty 元件大區塊,單顆 CTA 引導即可。SurfaceFooter 整層拔除,\n + Add filter / + 加篩選器 inline 緊貼最後一條 row,讓 user 感受到「條件」與「加入」屬同一語境)*/}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {flatTree && flatTree.children.map((cond, idx) => (\n <FilterRow\n key={cond.id}\n index={idx}\n condition={cond}\n conjunction={flatTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeConjunction={setFlatConjunction}\n onChangeField={(v) => {\n const newCol = filterableColumns.find((c) => c.id === v)\n updateFlatCondition(cond.id, { field: v, op: getDefaultOperator(newCol?.type), value: '', datePrecision: datePrecisionOf(newCol) })\n }}\n onChangeOp={(v) => updateFlatCondition(cond.id, { op: v, value: '' })}\n onChangeValue={(v) => updateFlatCondition(cond.id, { value: v })}\n onRemove={() => removeFlatCondition(cond.id)}\n />\n ))}\n\n {nestedTree && nestedTree.children.map((group, gIdx) => (\n <GroupBlock\n key={group.id}\n index={gIdx}\n group={group}\n rootConjunction={nestedTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeRootConjunction={setRootConjunction}\n onChangeGroupConjunction={(c) => updateGroup(group.id, { conjunction: c })}\n onChangeCondition={(condId, patch) => updateGroupCondition(group.id, condId, patch)}\n onRemoveCondition={(condId) => removeGroupCondition(group.id, condId)}\n onAddCondition={() => addConditionToGroup(group.id)}\n onRemoveGroup={() => removeGroup(group.id)}\n />\n ))}\n\n {/* Inline CTA(2026-05-04 A1)— root-level「加篩選」用 tertiary(視覺輕量但有邊界,\n 符合 root-CTA 視覺重量);nested 內「加入巢狀篩選」走 text variant(更輕,在 group 內 inline)\n 不放 SurfaceFooter:條件與「加入」屬同一語義群,中間插 footer 切斷敘事 */}\n <div>\n <Button\n variant=\"tertiary\" size=\"sm\" startIcon={Plus}\n onClick={value.mode === 'flat' ? addFlatCondition : addGroup}\n >\n {value.mode === 'nested' ? '加入篩選器' : '加篩選'}\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\n// Generic + ref forward 套 cast 的 idiom — 對齊 DataTable(同檔家)。\n// React.forwardRef 對 generic component 會丟掉 type param,改 cast 成 generic-preserving signature。\nexport const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner) as <TData>(\n props: DataTableFilterPanelProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n;(DataTableFilterPanel as { displayName?: string }).displayName = 'DataTableFilterPanel'\n"],"names":["XIcon"],"mappings":"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"}
1
+ {"version":3,"file":"data-table-filter-panel.js","sources":["../../../src/components/DataTable/data-table-filter-panel.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(close)跟 row inline actions(trash)不在同 row\nimport * as React from 'react'\nimport { Plus, X as XIcon, RotateCcw } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport type { ColumnType } from './column-types'\nimport { getColumnId, getColumnLabel, getColumnMeta } from './lib/column-meta'\nimport {\n FilterRow,\n GroupBlock,\n getDefaultOperator,\n datePrecisionOf,\n type FilterColumn,\n} from './data-table-filter-group'\nimport {\n createEmptyFilterTree,\n isFilterTreeActive,\n isFilterTreeEqual,\n evaluateTree,\n dataTableFilterMatch,\n type Conjunction,\n type FilterCondition,\n type FilterGroup,\n type FilterTree,\n type FilterTreeFlat,\n type FilterTreeNested,\n} from './filter-tree'\nimport {\n DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS,\n resolveDataTableFilterPanelLabels,\n type DataTableFilterPanelLabels,\n} from './data-table-filter-labels'\n\n// Re-export public API from filter-tree(consumer 既有 import path 不變)\nexport {\n createEmptyFilterTree,\n isFilterTreeActive,\n evaluateTree,\n dataTableFilterMatch,\n}\nexport type { Conjunction, FilterCondition, FilterGroup, FilterTree, FilterTreeFlat, FilterTreeNested }\nexport { DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS }\nexport type { DataTableFilterPanelLabels }\n\n/**\n * DataTableFilterPanel — ClickUp-style 進階篩選 panel\n *\n * 對齊 ClickUp / Airtable / Notion / Coda / Linear advanced-filter 派 —\n * parenthesized boolean expression builder。\n *\n * 兩種 mode 由 consumer 拍板:\n * - `flat`:root 下只能裝 condition,無 group\n * - `nested`:root 下裝 1+ group(灰底框),每個 group 內裝 1+ condition,**剛好 1 層**\n *\n * Source-of-truth:\n * - Operator definitions:`./filter-operators.ts` `OPERATOR_REGISTRY`(SSOT,禁 hardcode op 字串)\n * - Filter state:**FilterTree**(本檔自管;搭配 TanStack `globalFilter` 求值)\n * - Row / nested-group renderer:`./data-table-filter-group.tsx`;value picker:\n * `./data-table-filter-value-picker.tsx`(皆 @internal — 2026-07-14 file-size 拆檔,\n * 本檔只留 orchestration:columns 抽取 / FilterTree mutators / panel chrome)\n *\n * 詳:`./filter-operators.spec.md`\n */\n\n// ── Internal — id seed ──────────────────────────────────────────────────\n\nlet _idSeed = 0\nconst newId = () => `f${++_idSeed}-${Date.now().toString(36)}`\n\n// ── Helpers — column extraction + condition factories ──────────────────\n// (FilterColumn type + operator helpers 住 ./data-table-filter-group.tsx)\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): FilterColumn[] {\n const out: FilterColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n const meta = getColumnMeta(col)\n const type: ColumnType | undefined = meta?.type\n if (!type) continue\n if (meta?.filterable === false) continue\n out.push({\n id,\n label: getColumnLabel(col, id),\n type,\n options: meta?.options,\n people: meta?.people,\n includeTime: meta?.includeTime,\n })\n }\n return out\n}\n\nconst newCondition = (firstCol: FilterColumn | undefined): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: firstCol?.id ?? '',\n op: firstCol ? getDefaultOperator(firstCol.type) : '',\n value: '',\n datePrecision: datePrecisionOf(firstCol),\n})\n\n// **G fix(2026-05-04)**:initial-mount 用 — field 不預選,user 自選後 op/value 才 enable\n// Disabled state(field='')→ op + value 在 FilterRow 內走 `disabled={!hasField}` 自動連動\nconst newEmptyCondition = (): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: '',\n op: '',\n value: '',\n})\n\nconst newGroup = (firstCol: FilterColumn | undefined): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or', // group 內 default OR(對齊 ref 圖)\n children: [newCondition(firstCol)],\n})\n\nconst newEmptyGroup = (): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or',\n children: [newEmptyCondition()],\n})\n\nconst countFilterConditions = (tree: FilterTree): number =>\n tree.mode === 'flat'\n ? tree.children.length\n : tree.children.reduce((total, group) => total + group.children.length, 0)\n\nconst normalizeMaxConditions = (maxConditions: number | undefined): number => {\n if (maxConditions === undefined || maxConditions === Number.POSITIVE_INFINITY) return Number.POSITIVE_INFINITY\n if (!Number.isFinite(maxConditions)) return 0\n return Math.max(0, Math.floor(maxConditions))\n}\n\n// ── Component Props ─────────────────────────────────────────────────────\n\nexport interface DataTableFilterPanelProps<TData> {\n // 2026-07-18 決策17:移除獨立 `mode` prop(單一真相源 = `value.mode` discriminant)——\n // 舊設計 mode + value.mode 兩來源型別允許矛盾(mode='nested' 配 flat value → CTA 錯文案 + 死操作);\n // 無外部消費者傳 mode(grep 0),全由 value.mode 推導。對齊 MUI X GridFilterModel / AG Grid 單一 model。\n /** 可被 filter 的 columns */\n columns: ColumnDef<TData, any>[]\n /** 當前 FilterTree(controlled) */\n value: FilterTree\n /** state 變更 callback */\n onChange: (next: FilterTree) => void\n /**\n * 管理員 set-as-default 的 baseline(refresh icon 顯示判定用)。\n * 當 `value` ≠ `defaultValue`(deep equal)→ panel header 顯示 refresh icon,\n * click → reset 回 defaultValue。對齊 sort 邏輯(相同 modified-from-default UX)。\n */\n defaultValue?: FilterTree\n /** Cell ⌄ menu「Filter by this」帶入的 column id(自動 add 一條 condition) */\n prefilledColumnId?: string\n onPrefillConsumed?: () => void\n /**\n * Condition leaf 上限(flat children 或 nested 所有 group.children 的總和)。\n * 預設不限。到上限後所有 add 路徑與 prefill 都 fail closed;controlled value\n * 已超過上限時保留原資料、不裁切,只停用後續新增。\n */\n maxConditions?: number\n /** Panel chrome/operator/value-picker labels. Nested maps are deep-merged with defaults. */\n labels?: Partial<DataTableFilterPanelLabels>\n onClose?: () => void\n className?: string\n}\n\n// ── Main Component ──────────────────────────────────────────────────────\n\n// 內部 fn — generic + ref 轉發。export 走 cast(對齊 DataTable 同 pattern)\nfunction DataTableFilterPanelInner<TData>({\n columns,\n value,\n onChange,\n defaultValue,\n prefilledColumnId,\n onPrefillConsumed,\n maxConditions,\n labels: labelsOverride,\n onClose,\n className,\n}: DataTableFilterPanelProps<TData>, ref: React.ForwardedRef<HTMLDivElement>): React.ReactElement {\n const filterableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => filterableColumns.map((c) => ({ value: c.id, label: c.label })),\n [filterableColumns],\n )\n const labels = React.useMemo(\n () => resolveDataTableFilterPanelLabels(labelsOverride),\n [labelsOverride],\n )\n const conditionCount = countFilterConditions(value)\n const normalizedMaxConditions = normalizeMaxConditions(maxConditions)\n const canAddCondition = conditionCount < normalizedMaxConditions\n // K13 後 firstCol 不再被 add* 消費(改用 newEmpty*),這裡只留 prefill effect 用(已直接讀 prefilledColumnId)。\n\n // **G fix(2026-05-04 v2)**:initial-mount 預設 1 empty row(field 未選 → op+value 自動 disabled)\n // useRef gate → 只 mount 一次;user 後續手動刪光 → 不 re-add → 維持「全清 = empty CTA only」UX\n // Two states clearly separated:\n // (a) Initial mount with empty value → auto-add 1 empty row(讓 user 看到 row shape,不必先點 CTA)\n // (b) User explicitly deletes all → empty CTA only(無 row,respect user intent)\n const initialMountDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (initialMountDoneRef.current) return\n initialMountDoneRef.current = true\n if (filterableColumns.length === 0) return\n if (value.children.length > 0) return\n if (!canAddCondition) return\n if (value.mode === 'flat') {\n onChange({ ...value, children: [newEmptyCondition()] } as FilterTreeFlat)\n } else {\n onChange({ ...value, children: [newEmptyGroup()] } as FilterTreeNested)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterableColumns.length])\n\n // Prefill from cell ⌄ menu「Filter by this」\n React.useEffect(() => {\n if (!prefilledColumnId) return\n const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId)\n if (colInfo && canAddCondition) {\n const cond: FilterCondition = {\n kind: 'cond',\n id: newId(),\n field: prefilledColumnId,\n op: getDefaultOperator(colInfo.type),\n value: '',\n // 2026-07-14 deep-audit fix:補 datePrecision(原漏 → datetime(includeTime=true)欄\n // prefill 掉到 undefined=day 精度忽略 ms;對齊初始 add / changeField 路徑的 datePrecisionOf)\n datePrecision: datePrecisionOf(colInfo),\n }\n if (value.mode === 'flat') {\n onChange({ ...value, children: [...value.children, cond] })\n } else {\n // nested mode:add 到第 1 個 group(若無則新建)\n if (value.children.length === 0) {\n onChange({ ...value, children: [{ ...newGroup(colInfo), children: [cond] }] })\n } else {\n const updatedGroups = value.children.map((g, i) =>\n i === 0 ? { ...g, children: [...g.children, cond] } : g\n )\n onChange({ ...value, children: updatedGroups })\n }\n }\n }\n onPrefillConsumed?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prefilledColumnId])\n\n // ── flat-mode mutators ──\n const flatTree = value.mode === 'flat' ? value : null\n const updateFlatCondition = (id: string, patch: Partial<FilterCondition>) => {\n if (!flatTree) return\n onChange({\n ...flatTree,\n children: flatTree.children.map((c) => (c.id === id ? { ...c, ...patch } : c)),\n })\n }\n const removeFlatCondition = (id: string) => {\n if (!flatTree) return\n onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) })\n }\n const addFlatCondition = () => {\n if (!flatTree || !canAddCondition) return\n // K13 fix(2026-05-04):加篩選 → empty row(field 未選 → op+value disabled)\n // World-class:Notion / Coda / ClickUp 不 auto-select;對齊 initial mount canonical\n onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] })\n }\n const setFlatConjunction = (conj: Conjunction) => {\n if (!flatTree) return\n onChange({ ...flatTree, conjunction: conj })\n }\n\n // ── nested-mode mutators ──\n const nestedTree = value.mode === 'nested' ? value : null\n const updateGroup = (groupId: string, patch: Partial<FilterGroup>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) => (g.id === groupId ? { ...g, ...patch } : g)),\n })\n }\n const updateGroupCondition = (groupId: string, condId: string, patch: Partial<FilterCondition>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId\n ? { ...g, children: g.children.map((c) => (c.id === condId ? { ...c, ...patch } : c)) }\n : g\n ),\n })\n }\n const removeGroupCondition = (groupId: string, condId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: g.children.filter((c) => c.id !== condId) } : g\n ),\n })\n }\n // K13 fix(2026-05-04):同 addFlatCondition,巢狀內加條件也 empty row\n const addConditionToGroup = (groupId: string) => {\n if (!nestedTree || !canAddCondition) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: [...g.children, newEmptyCondition()] } : g\n ),\n })\n }\n const removeGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) })\n }\n const addGroup = () => {\n if (!nestedTree || !canAddCondition) return\n // K13:加群組也用 empty group\n onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] })\n }\n const setRootConjunction = (conj: Conjunction) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, conjunction: conj })\n }\n\n return (\n // 寬度策略:desktop 680px;mobile 縮到 viewport 內留 32px 邊(避溢出 popover 切右半)。\n // 對齊 Notion / Airtable 的 advanced filter 在 mobile 走 full-width 邊處理。\n // **#8 fix(2026-05-04)**:popover width by mode(由 cell min-w 與 group nested chrome 反推)\n // flat:cell ConjunctionLabel(80) + gap-2(8) + FCG(field-min 160 + op-min 120 + value 200) +\n // gap-2(8) + trash(28) + 2×loose padding(32) = ~636 → 640px\n // nested:再加 group p-2 (16) + outer ConjunctionLabel (80) + outer gap (8) → ~740 → 760px\n // 對齊 Airtable / Notion / Linear filter row 視覺密度 @benchmark-unverified(non-OSS)\n // **K11 fix(2026-05-04)**:viewport-aware scroll chain invariant\n // parent PopoverContent 是 flex flex-col + max-h + overflow-hidden,\n // panel root 必 forward `flex flex-col h-full` 才能讓 SurfaceBody flex-1 min-h-0 overflow-y-auto 生效\n // 無此 forward → 中間 wrapper 斷鏈 → body 不 scroll(ProfileCard 因為自身設 max-h flex-col 才繞過)\n // 詳 overlay-surface.spec.md「viewport-aware scroll chain invariant」段\n // K11 v2 fix(2026-05-04):flex item 預設 min-h:auto 讓 content 撐 height,h-full 失效。\n // 必加 `min-h-0` 才能讓 panel 在 PopoverContent max-h cap 下正確 shrink + body scroll。\n <div ref={ref} className={cn(\n 'flex flex-col h-full min-h-0',\n value.mode === 'nested'\n ? 'w-[min(760px,calc(100vw-2rem))]'\n : 'w-[min(640px,calc(100vw-2rem))]',\n className,\n )}>\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\">{labels.title}</PopoverTitle>\n {/* Refresh icon — 只在 value ≠ defaultValue 時顯示(對齊 sort modified-from-default UX)\n 含 ButtonDivider 對齊「欄位顯示」+「排序」chrome corner action canonical(2026-05-04) */}\n {defaultValue && !isFilterTreeEqual(value, defaultValue) && (\n <>\n <Button\n variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw}\n aria-label={labels.resetToDefault}\n onClick={() => onChange(defaultValue)}\n />\n {onClose && <ButtonDivider />}\n </>\n )}\n {onClose && (\n <PopoverClose asChild>\n <Button data-dismiss iconOnly dismiss size=\"sm\" startIcon={XIcon} aria-label={labels.close} onClick={onClose} />\n </PopoverClose>\n )}\n </SurfaceHeader>\n\n {/* Body — flat / nested 條件;空條件 → 直接顯 + 加篩選 CTA(對齊 Notion / Airtable / Linear inline 派,\n 無條件時不需要 Empty 元件大區塊,單顆 CTA 引導即可。SurfaceFooter 整層拔除,\n + Add filter / + 加篩選器 inline 緊貼最後一條 row,讓 user 感受到「條件」與「加入」屬同一語境)*/}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {flatTree && flatTree.children.map((cond, idx) => (\n <FilterRow\n key={cond.id}\n index={idx}\n condition={cond}\n conjunction={flatTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeConjunction={setFlatConjunction}\n onChangeField={(v) => {\n const newCol = filterableColumns.find((c) => c.id === v)\n updateFlatCondition(cond.id, { field: v, op: getDefaultOperator(newCol?.type), value: '', datePrecision: datePrecisionOf(newCol) })\n }}\n onChangeOp={(v) => updateFlatCondition(cond.id, { op: v, value: '' })}\n onChangeValue={(v) => updateFlatCondition(cond.id, { value: v })}\n onRemove={() => removeFlatCondition(cond.id)}\n labels={labels}\n />\n ))}\n\n {nestedTree && nestedTree.children.map((group, gIdx) => (\n <GroupBlock\n key={group.id}\n index={gIdx}\n group={group}\n rootConjunction={nestedTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeRootConjunction={setRootConjunction}\n onChangeGroupConjunction={(c) => updateGroup(group.id, { conjunction: c })}\n onChangeCondition={(condId, patch) => updateGroupCondition(group.id, condId, patch)}\n onRemoveCondition={(condId) => removeGroupCondition(group.id, condId)}\n onAddCondition={() => addConditionToGroup(group.id)}\n onRemoveGroup={() => removeGroup(group.id)}\n canAddCondition={canAddCondition}\n labels={labels}\n />\n ))}\n\n {/* Inline CTA(2026-05-04 A1)— root-level「加篩選」用 tertiary(視覺輕量但有邊界,\n 符合 root-CTA 視覺重量);nested 內「加入巢狀篩選」走 text variant(更輕,在 group 內 inline)\n 不放 SurfaceFooter:條件與「加入」屬同一語義群,中間插 footer 切斷敘事 */}\n <div>\n <Button\n variant=\"tertiary\" size=\"sm\" startIcon={Plus}\n onClick={value.mode === 'flat' ? addFlatCondition : addGroup}\n disabled={!canAddCondition}\n >\n {value.mode === 'nested' ? labels.addGroup : labels.addFilter}\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\n// Generic + ref forward 套 cast 的 idiom — 對齊 DataTable(同檔家)。\n// React.forwardRef 對 generic component 會丟掉 type param,改 cast 成 generic-preserving signature。\nexport const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner) as <TData>(\n props: DataTableFilterPanelProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n;(DataTableFilterPanel as { displayName?: string }).displayName = 'DataTableFilterPanel'\n"],"names":["XIcon"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type ValueShape } from './filter-operators';
2
+ import type { DataTableFilterPanelLabels } from './data-table-filter-labels';
2
3
  export interface FilterValuePickerColInfo {
3
4
  id: string;
4
5
  label: string;
@@ -21,9 +22,11 @@ export interface FilterValuePickerProps {
21
22
  disabled?: boolean;
22
23
  /** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */
23
24
  ariaLabel?: string;
25
+ /** Resolved panel labels; placeholders and relative-date labels share one SSOT. */
26
+ labels: DataTableFilterPanelLabels;
24
27
  /** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)
25
28
  * 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */
26
29
  className?: string;
27
30
  }
28
- export declare function FilterValuePicker({ shape, value, onChange, colInfo, disabled, ariaLabel, className, }: FilterValuePickerProps): import("react/jsx-runtime").JSX.Element | null;
31
+ export declare function FilterValuePicker({ shape, value, onChange, colInfo, disabled, ariaLabel, labels, className, }: FilterValuePickerProps): import("react/jsx-runtime").JSX.Element | null;
29
32
  //# sourceMappingURL=data-table-filter-value-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter-value-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;AAS3B,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,wBAAwB,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;8FAC0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,SAAS,GACV,EAAE,sBAAsB,kDA8KxB"}
1
+ {"version":3,"file":"data-table-filter-value-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAS5E,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,wBAAwB,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,MAAM,EAAE,0BAA0B,CAAA;IAClC;8FAC0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,kDA2LxB"}
@@ -13,11 +13,12 @@ function FilterValuePicker({
13
13
  colInfo,
14
14
  disabled,
15
15
  ariaLabel,
16
+ labels,
16
17
  className
17
18
  }) {
18
19
  if (!shape || disabled) {
19
20
  return /* @__PURE__ */ jsx(Input, { size: "sm", value: "", onChange: () => {
20
- }, placeholder: "輸入值…", disabled: true, "aria-label": ariaLabel, className });
21
+ }, placeholder: labels.valuePlaceholder, disabled: true, "aria-label": ariaLabel, className });
21
22
  }
22
23
  switch (shape) {
23
24
  case "none":
@@ -29,7 +30,7 @@ function FilterValuePicker({
29
30
  size: "sm",
30
31
  value: String(value ?? ""),
31
32
  onChange: (e) => onChange(e.target.value),
32
- placeholder: "輸入值…",
33
+ placeholder: labels.valuePlaceholder,
33
34
  "aria-label": ariaLabel,
34
35
  className
35
36
  }
@@ -41,7 +42,7 @@ function FilterValuePicker({
41
42
  size: "sm",
42
43
  value: typeof value === "number" ? value : null,
43
44
  onChange: (v) => onChange(v ?? ""),
44
- placeholder: "輸入數字…",
45
+ placeholder: labels.numberPlaceholder,
45
46
  "aria-label": ariaLabel,
46
47
  className
47
48
  }
@@ -71,18 +72,22 @@ function FilterValuePicker({
71
72
  case "date_relative": {
72
73
  const opts = DATE_RELATIVE_OPTIONS.map((o) => ({
73
74
  value: o.value,
74
- label: o.label,
75
+ label: labels.relativeDateOptionLabels[o.value] ?? o.label,
75
76
  group: o.group
76
77
  }));
78
+ const groups = DATE_RELATIVE_GROUPS.map((group) => ({
79
+ key: group.key,
80
+ label: labels.relativeDateGroupLabels[group.key] ?? group.label
81
+ }));
77
82
  return /* @__PURE__ */ jsx(
78
83
  Select,
79
84
  {
80
85
  size: "sm",
81
86
  options: opts,
82
- groups: DATE_RELATIVE_GROUPS,
87
+ groups,
83
88
  value: String(value ?? ""),
84
89
  onChange: (v) => onChange(v),
85
- placeholder: "選擇相對日期",
90
+ placeholder: labels.relativeDatePlaceholder,
86
91
  "aria-label": ariaLabel,
87
92
  className
88
93
  }
@@ -100,7 +105,7 @@ function FilterValuePicker({
100
105
  options: opts,
101
106
  value: String(value ?? ""),
102
107
  onChange: (v) => onChange(v),
103
- placeholder: "選擇值",
108
+ placeholder: labels.singleSelectPlaceholder,
104
109
  "aria-label": ariaLabel,
105
110
  className
106
111
  }
@@ -119,7 +124,8 @@ function FilterValuePicker({
119
124
  options: opts,
120
125
  value: arr,
121
126
  onChange: (v) => onChange(v),
122
- placeholder: "選擇值…",
127
+ placeholder: labels.multiSelectPlaceholder,
128
+ emptyText: labels.multiSelectEmptyText,
123
129
  "aria-label": ariaLabel,
124
130
  className
125
131
  }
@@ -162,6 +168,10 @@ function FilterValuePicker({
162
168
  value: v ?? null,
163
169
  people: (colInfo == null ? void 0 : colInfo.people) ?? [],
164
170
  onChange: (next) => onChange(next[0] ?? null),
171
+ placeholder: labels.peoplePlaceholder,
172
+ searchPlaceholder: labels.peopleSearchPlaceholder,
173
+ searchAriaLabel: labels.peopleSearchAriaLabel,
174
+ emptyText: labels.peopleEmptyText,
165
175
  "aria-label": ariaLabel,
166
176
  className
167
177
  }
@@ -176,6 +186,10 @@ function FilterValuePicker({
176
186
  value: v,
177
187
  people: (colInfo == null ? void 0 : colInfo.people) ?? [],
178
188
  onChange: (next) => onChange(next),
189
+ placeholder: labels.peoplePlaceholder,
190
+ searchPlaceholder: labels.peopleSearchPlaceholder,
191
+ searchAriaLabel: labels.peopleSearchAriaLabel,
192
+ emptyText: labels.peopleEmptyText,
179
193
  "aria-label": ariaLabel,
180
194
  className
181
195
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-table-filter-value-picker.js","sources":["../../../src/components/DataTable/data-table-filter-value-picker.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(2026-07-14 自 data-table-filter-panel.tsx 拆檔搬移,原檔級 escape 隨段落帶入)。\n// @internal — DS-internal 單元(FilterValuePicker value-picker switcher,只被\n// data-table-filter-group.tsx FilterRow 消費);不隨 index.ts re-export 進 npm public surface。\n// ────────────────────────────── 消費的 SSOT ──────────────────────────────\n// - Field controls(Family 4,統一 size=\"sm\"):Input / NumberInput / Select / Combobox /\n// DatePicker + DatePickerRange(showTime)/ PeoplePicker — 按 ValueShape dispatch\n// (ValueShape ↔ picker 對照 canonical:./data-table.spec.md「三、Operator × ValueShape SSOT」)\n// - className 直接 forward 給 inner Field control(不另開 wrapper div)—\n// field-control-group.spec.md「forward className」canonical(2026-05-04 #2 fix)\n// - Operator / ValueShape SSOT:./filter-operators.ts(DATE_RELATIVE_OPTIONS / DATE_RELATIVE_GROUPS)\n// - Person pool:PeoplePicker PersonValue(對齊 cell-registry meta.people SSOT)\n// 設計規則:./filter-operators.spec.md「ValueShape canonical」+ ./data-table.spec.md「進階篩選」段\n\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { Input } from '@/design-system/components/Input/input'\nimport { NumberInput } from '@/design-system/components/NumberInput/number-input'\nimport { DatePicker, DatePickerRange } from '@/design-system/components/DatePicker/date-picker'\nimport { PeoplePicker } from '@/design-system/components/PeoplePicker/people-picker'\nimport type { PersonValue } from '@/design-system/components/PeoplePicker/person-display'\nimport {\n DATE_RELATIVE_OPTIONS,\n DATE_RELATIVE_GROUPS,\n type ValueShape,\n} from './filter-operators'\n\n// ── FilterValuePicker(value-picker switcher per ValueShape)────────────────\n//\n// 2026-05-03 M21 retract:本 helper 原獨立檔 filter-value-picker.tsx(187 行 / 1 consumer),\n// claim「未來 inline filter UI 共用」= premature abstraction → inline 回 panel。\n// 2026-07-14 拆檔 refactor:panel 822 行過 800 hard cap(file-size escalation)→ 重新抽出為\n// @internal 私有模組(非 public API 抽象,與 M21 不衝突;consumer 仍只見 DataTableFilterPanel)。\n\nexport interface FilterValuePickerColInfo {\n id: string\n label: string\n options?: Array<{ value: string; label: string }>\n /** Person pool — person/multiPerson filter picker 用(2026-05-07 升級,SSOT 對齊 cell-registry) */\n people?: Array<{ name: string; avatarUrl?: string; description?: string }>\n}\n\nexport interface FilterValuePickerProps {\n shape: ValueShape | null\n value: unknown\n onChange: (v: unknown) => void\n colInfo?: FilterValuePickerColInfo\n disabled?: boolean\n /** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */\n ariaLabel?: string\n /** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)\n * 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */\n className?: string\n}\n\nexport function FilterValuePicker({\n shape,\n value,\n onChange,\n colInfo,\n disabled,\n ariaLabel,\n className,\n}: FilterValuePickerProps) {\n if (!shape || disabled) {\n return <Input size=\"sm\" value=\"\" onChange={() => {}} placeholder=\"輸入值…\" disabled aria-label={ariaLabel} className={className} />\n }\n\n switch (shape) {\n case 'none':\n return null\n\n case 'text':\n return (\n <Input\n size=\"sm\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"輸入值…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'number':\n return (\n <NumberInput\n size=\"sm\"\n value={typeof value === 'number' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n placeholder=\"輸入數字…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_single':\n return (\n <DatePicker\n size=\"sm\"\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_range':\n return (\n <DatePickerRange\n size=\"sm\"\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_relative': {\n // 群組分類:Past / Current / Future(對齊 Linear / Notion idiom),走 Select.groups → SelectMenu\n const opts: SelectOption[] = DATE_RELATIVE_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n group: o.group,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n groups={DATE_RELATIVE_GROUPS as unknown as Array<{ key: string; label: string }>}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇相對日期\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_single': {\n const opts: SelectOption[] = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇值\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_multi': {\n const opts = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n const arr = Array.isArray(value) ? (value as string[]) : []\n return (\n <Combobox\n size=\"sm\"\n options={opts}\n value={arr}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇值…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'datetime_single':\n return (\n <DatePicker\n size=\"sm\"\n showTime\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'datetime_range':\n return (\n <DatePickerRange\n size=\"sm\"\n showTime\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n // person_single / person_multi — 走 PeoplePicker(2026-05-07 升級,對齊 cell-registry SSOT)。\n // colInfo.people 來自 column meta.people。Filter value:\n // - person_single:存 PersonValue | null(picker emit array,我們取 [0])\n // - person_multi:存 PersonValue[]\n case 'person_single': {\n const v = value as PersonValue | null | undefined\n return (\n <PeoplePicker\n size=\"sm\"\n value={v ?? null}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next[0] ?? null)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n case 'person_multi': {\n const v = Array.isArray(value) ? (value as PersonValue[]) : []\n return (\n <PeoplePicker\n size=\"sm\"\n value={v}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n default:\n return null\n }\n}\n"],"names":["DatePicker"],"mappings":"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"}
1
+ {"version":3,"file":"data-table-filter-value-picker.js","sources":["../../../src/components/DataTable/data-table-filter-value-picker.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(2026-07-14 自 data-table-filter-panel.tsx 拆檔搬移,原檔級 escape 隨段落帶入)。\n// @internal — DS-internal 單元(FilterValuePicker value-picker switcher,只被\n// data-table-filter-group.tsx FilterRow 消費);不隨 index.ts re-export 進 npm public surface。\n// ────────────────────────────── 消費的 SSOT ──────────────────────────────\n// - Field controls(Family 4,統一 size=\"sm\"):Input / NumberInput / Select / Combobox /\n// DatePicker + DatePickerRange(showTime)/ PeoplePicker — 按 ValueShape dispatch\n// (ValueShape ↔ picker 對照 canonical:./data-table.spec.md「三、Operator × ValueShape SSOT」)\n// - className 直接 forward 給 inner Field control(不另開 wrapper div)—\n// field-control-group.spec.md「forward className」canonical(2026-05-04 #2 fix)\n// - Operator / ValueShape SSOT:./filter-operators.ts(DATE_RELATIVE_OPTIONS / DATE_RELATIVE_GROUPS)\n// - Person pool:PeoplePicker PersonValue(對齊 cell-registry meta.people SSOT)\n// 設計規則:./filter-operators.spec.md「ValueShape canonical」+ ./data-table.spec.md「進階篩選」段\n\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { Input } from '@/design-system/components/Input/input'\nimport { NumberInput } from '@/design-system/components/NumberInput/number-input'\nimport { DatePicker, DatePickerRange } from '@/design-system/components/DatePicker/date-picker'\nimport { PeoplePicker } from '@/design-system/components/PeoplePicker/people-picker'\nimport type { PersonValue } from '@/design-system/components/PeoplePicker/person-display'\nimport {\n DATE_RELATIVE_OPTIONS,\n DATE_RELATIVE_GROUPS,\n type ValueShape,\n} from './filter-operators'\nimport type { DataTableFilterPanelLabels } from './data-table-filter-labels'\n\n// ── FilterValuePicker(value-picker switcher per ValueShape)────────────────\n//\n// 2026-05-03 M21 retract:本 helper 原獨立檔 filter-value-picker.tsx(187 行 / 1 consumer),\n// claim「未來 inline filter UI 共用」= premature abstraction → inline 回 panel。\n// 2026-07-14 拆檔 refactor:panel 822 行過 800 hard cap(file-size escalation)→ 重新抽出為\n// @internal 私有模組(非 public API 抽象,與 M21 不衝突;consumer 仍只見 DataTableFilterPanel)。\n\nexport interface FilterValuePickerColInfo {\n id: string\n label: string\n options?: Array<{ value: string; label: string }>\n /** Person pool — person/multiPerson filter picker 用(2026-05-07 升級,SSOT 對齊 cell-registry) */\n people?: Array<{ name: string; avatarUrl?: string; description?: string }>\n}\n\nexport interface FilterValuePickerProps {\n shape: ValueShape | null\n value: unknown\n onChange: (v: unknown) => void\n colInfo?: FilterValuePickerColInfo\n disabled?: boolean\n /** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */\n ariaLabel?: string\n /** Resolved panel labels; placeholders and relative-date labels share one SSOT. */\n labels: DataTableFilterPanelLabels\n /** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)\n * 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */\n className?: string\n}\n\nexport function FilterValuePicker({\n shape,\n value,\n onChange,\n colInfo,\n disabled,\n ariaLabel,\n labels,\n className,\n}: FilterValuePickerProps) {\n if (!shape || disabled) {\n return <Input size=\"sm\" value=\"\" onChange={() => {}} placeholder={labels.valuePlaceholder} disabled aria-label={ariaLabel} className={className} />\n }\n\n switch (shape) {\n case 'none':\n return null\n\n case 'text':\n return (\n <Input\n size=\"sm\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value)}\n placeholder={labels.valuePlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'number':\n return (\n <NumberInput\n size=\"sm\"\n value={typeof value === 'number' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n placeholder={labels.numberPlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_single':\n return (\n <DatePicker\n size=\"sm\"\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_range':\n return (\n <DatePickerRange\n size=\"sm\"\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_relative': {\n // 群組分類:Past / Current / Future(對齊 Linear / Notion idiom),走 Select.groups → SelectMenu\n const opts: SelectOption[] = DATE_RELATIVE_OPTIONS.map((o) => ({\n value: o.value,\n label: labels.relativeDateOptionLabels[o.value] ?? o.label,\n group: o.group,\n }))\n const groups = DATE_RELATIVE_GROUPS.map((group) => ({\n key: group.key,\n label: labels.relativeDateGroupLabels[group.key] ?? group.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n groups={groups}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder={labels.relativeDatePlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_single': {\n const opts: SelectOption[] = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder={labels.singleSelectPlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_multi': {\n const opts = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n const arr = Array.isArray(value) ? (value as string[]) : []\n return (\n <Combobox\n size=\"sm\"\n options={opts}\n value={arr}\n onChange={(v) => onChange(v)}\n placeholder={labels.multiSelectPlaceholder}\n emptyText={labels.multiSelectEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'datetime_single':\n return (\n <DatePicker\n size=\"sm\"\n showTime\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'datetime_range':\n return (\n <DatePickerRange\n size=\"sm\"\n showTime\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n // person_single / person_multi — 走 PeoplePicker(2026-05-07 升級,對齊 cell-registry SSOT)。\n // colInfo.people 來自 column meta.people。Filter value:\n // - person_single:存 PersonValue | null(picker emit array,我們取 [0])\n // - person_multi:存 PersonValue[]\n case 'person_single': {\n const v = value as PersonValue | null | undefined\n return (\n <PeoplePicker\n size=\"sm\"\n value={v ?? null}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next[0] ?? null)}\n placeholder={labels.peoplePlaceholder}\n searchPlaceholder={labels.peopleSearchPlaceholder}\n searchAriaLabel={labels.peopleSearchAriaLabel}\n emptyText={labels.peopleEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n case 'person_multi': {\n const v = Array.isArray(value) ? (value as PersonValue[]) : []\n return (\n <PeoplePicker\n size=\"sm\"\n value={v}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next)}\n placeholder={labels.peoplePlaceholder}\n searchPlaceholder={labels.peopleSearchPlaceholder}\n searchAriaLabel={labels.peopleSearchAriaLabel}\n emptyText={labels.peopleEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n default:\n return null\n }\n}\n"],"names":["DatePicker"],"mappings":"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"}
@@ -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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"}
@@ -984,7 +984,7 @@ function DataTableInner({
984
984
  type: "button",
985
985
  "aria-label": isExpanded ? "收合" : "展開",
986
986
  "aria-expanded": isExpanded,
987
- className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-foreground rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
987
+ className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-fg-secondary rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
988
988
  style: { transform: isExpanded ? "rotate(90deg)" : void 0 },
989
989
  onClick: (e) => {
990
990
  e.stopPropagation();
@@ -1017,7 +1017,7 @@ function DataTableInner({
1017
1017
  type: "button",
1018
1018
  "aria-label": isExpanded ? "收合" : "展開",
1019
1019
  "aria-expanded": isExpanded,
1020
- className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-foreground rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
1020
+ className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-fg-secondary rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
1021
1021
  style: { transform: isExpanded ? "rotate(90deg)" : void 0 },
1022
1022
  onClick: (e) => {
1023
1023
  e.stopPropagation();
@@ -1600,8 +1600,9 @@ function DataTableInner({
1600
1600
  ref: centerBodyRef,
1601
1601
  "data-datatable-hscroll": true,
1602
1602
  "data-datatable-panel": "center",
1603
- tabIndex: enabled || spreadsheetMode ? void 0 : 0,
1604
- "aria-label": enabled || spreadsheetMode ? void 0 : "表格內容,可捲動",
1603
+ role: isEmpty ? void 0 : "rowgroup",
1604
+ tabIndex: enabled || spreadsheetMode || isEmpty ? void 0 : 0,
1605
+ "aria-label": enabled || spreadsheetMode || isEmpty ? void 0 : "表格內容,可捲動",
1605
1606
  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",
1606
1607
  style: isFillHeight && bodyMaxHeight != null ? { maxHeight: bodyMaxHeight } : hasHeightConstraint ? { maxHeight: height } : void 0,
1607
1608
  onScroll: onCenterBodyScroll,