@qijenchen/design-system 0.1.0-beta.81 → 0.1.0-beta.82

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 (301) hide show
  1. package/CLAUDE.md +0 -1
  2. package/dist/components/Avatar/avatar.d.ts.map +1 -1
  3. package/dist/components/Avatar/avatar.js +1 -2
  4. package/dist/components/Avatar/avatar.js.map +1 -1
  5. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +3 -0
  6. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  7. package/dist/components/BulkActionBar/bulk-action-bar.js +2 -2
  8. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  9. package/dist/components/Button/button.d.ts +1 -1
  10. package/dist/components/Button/button.d.ts.map +1 -1
  11. package/dist/components/Button/button.js +5 -2
  12. package/dist/components/Button/button.js.map +1 -1
  13. package/dist/components/Calendar/calendar.d.ts +3 -1
  14. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  15. package/dist/components/Calendar/calendar.js +40 -17
  16. package/dist/components/Calendar/calendar.js.map +1 -1
  17. package/dist/components/Carousel/carousel.d.ts +1 -1
  18. package/dist/components/Carousel/carousel.d.ts.map +1 -1
  19. package/dist/components/Carousel/carousel.js +3 -1
  20. package/dist/components/Carousel/carousel.js.map +1 -1
  21. package/dist/components/Checkbox/checkbox.d.ts +1 -1
  22. package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
  23. package/dist/components/Checkbox/checkbox.js +2 -1
  24. package/dist/components/Checkbox/checkbox.js.map +1 -1
  25. package/dist/components/Chip/chip.d.ts +2 -2
  26. package/dist/components/Chip/chip.d.ts.map +1 -1
  27. package/dist/components/Chip/chip.js +41 -12
  28. package/dist/components/Chip/chip.js.map +1 -1
  29. package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
  30. package/dist/components/Coachmark/coachmark.js +6 -6
  31. package/dist/components/Coachmark/coachmark.js.map +1 -1
  32. package/dist/components/Combobox/combobox.d.ts +1 -1
  33. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  34. package/dist/components/Combobox/combobox.js +5 -2
  35. package/dist/components/Combobox/combobox.js.map +1 -1
  36. package/dist/components/Command/command.d.ts +1 -1
  37. package/dist/components/Command/command.d.ts.map +1 -1
  38. package/dist/components/Command/command.js +2 -1
  39. package/dist/components/Command/command.js.map +1 -1
  40. package/dist/components/DataTable/data-table.d.ts +29 -1
  41. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  42. package/dist/components/DataTable/data-table.js +71 -13
  43. package/dist/components/DataTable/data-table.js.map +1 -1
  44. package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
  45. package/dist/components/DateGrid/date-grid.d.ts +2 -2
  46. package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
  47. package/dist/components/DateGrid/date-grid.js +54 -10
  48. package/dist/components/DateGrid/date-grid.js.map +1 -1
  49. package/dist/components/DatePicker/date-picker.d.ts +2 -8
  50. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  51. package/dist/components/DatePicker/date-picker.js +15 -3
  52. package/dist/components/DatePicker/date-picker.js.map +1 -1
  53. package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
  54. package/dist/components/DescriptionList/description-list.js +1 -1
  55. package/dist/components/DescriptionList/description-list.js.map +1 -1
  56. package/dist/components/DropdownMenu/dropdown-menu.d.ts +3 -3
  57. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  58. package/dist/components/DropdownMenu/dropdown-menu.js +14 -4
  59. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  60. package/dist/components/Empty/empty.d.ts.map +1 -1
  61. package/dist/components/Empty/empty.js +1 -1
  62. package/dist/components/Empty/empty.js.map +1 -1
  63. package/dist/components/Field/field.d.ts +1 -1
  64. package/dist/components/Field/field.d.ts.map +1 -1
  65. package/dist/components/Field/field.js +2 -1
  66. package/dist/components/Field/field.js.map +1 -1
  67. package/dist/components/Field/use-form-validation.d.ts.map +1 -1
  68. package/dist/components/Field/use-form-validation.js +5 -7
  69. package/dist/components/Field/use-form-validation.js.map +1 -1
  70. package/dist/components/FileUpload/file-upload.d.ts +1 -1
  71. package/dist/components/FileUpload/file-upload.d.ts.map +1 -1
  72. package/dist/components/FileUpload/file-upload.js +11 -5
  73. package/dist/components/FileUpload/file-upload.js.map +1 -1
  74. package/dist/components/FileViewer/can-render-image.d.ts +6 -0
  75. package/dist/components/FileViewer/can-render-image.d.ts.map +1 -0
  76. package/dist/components/FileViewer/can-render-image.js +11 -0
  77. package/dist/components/FileViewer/can-render-image.js.map +1 -0
  78. package/dist/components/FileViewer/file-viewer.d.ts +2 -2
  79. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  80. package/dist/components/FileViewer/file-viewer.js +20 -13
  81. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  82. package/dist/components/FileViewer/image-renderer.d.ts +0 -5
  83. package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
  84. package/dist/components/FileViewer/image-renderer.js +1 -9
  85. package/dist/components/FileViewer/image-renderer.js.map +1 -1
  86. package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
  87. package/dist/components/HoverCard/hover-card.js +3 -1
  88. package/dist/components/HoverCard/hover-card.js.map +1 -1
  89. package/dist/components/Input/input.d.ts +26 -3
  90. package/dist/components/Input/input.d.ts.map +1 -1
  91. package/dist/components/Input/input.js +11 -3
  92. package/dist/components/Input/input.js.map +1 -1
  93. package/dist/components/LinkInput/link-input.d.ts +1 -1
  94. package/dist/components/LinkInput/link-input.d.ts.map +1 -1
  95. package/dist/components/LinkInput/link-input.js.map +1 -1
  96. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  97. package/dist/components/Menu/menu-item.js +4 -3
  98. package/dist/components/Menu/menu-item.js.map +1 -1
  99. package/dist/components/NumberInput/number-input.d.ts +1 -1
  100. package/dist/components/NumberInput/number-input.d.ts.map +1 -1
  101. package/dist/components/NumberInput/number-input.js +2 -1
  102. package/dist/components/NumberInput/number-input.js.map +1 -1
  103. package/dist/components/Pagination/index.d.ts +2 -0
  104. package/dist/components/Pagination/index.d.ts.map +1 -0
  105. package/dist/components/Pagination/index.js +6 -0
  106. package/dist/components/Pagination/index.js.map +1 -0
  107. package/dist/components/Pagination/pagination.d.ts +49 -0
  108. package/dist/components/Pagination/pagination.d.ts.map +1 -0
  109. package/dist/components/Pagination/pagination.js +182 -0
  110. package/dist/components/Pagination/pagination.js.map +1 -0
  111. package/dist/components/PeoplePicker/people-picker.d.ts +1 -1
  112. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  113. package/dist/components/PeoplePicker/people-picker.js +2 -1
  114. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  115. package/dist/components/PeoplePicker/person-display.d.ts +4 -0
  116. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
  117. package/dist/components/PeoplePicker/person-display.js +1 -1
  118. package/dist/components/PeoplePicker/person-display.js.map +1 -1
  119. package/dist/components/Popover/popover.d.ts.map +1 -1
  120. package/dist/components/Popover/popover.js +58 -32
  121. package/dist/components/Popover/popover.js.map +1 -1
  122. package/dist/components/ProfileCard/profile-card.d.ts +6 -1
  123. package/dist/components/ProfileCard/profile-card.d.ts.map +1 -1
  124. package/dist/components/ProfileCard/profile-card.js +14 -4
  125. package/dist/components/ProfileCard/profile-card.js.map +1 -1
  126. package/dist/components/RadioGroup/radio-group.d.ts +1 -1
  127. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
  128. package/dist/components/RadioGroup/radio-group.js +2 -1
  129. package/dist/components/RadioGroup/radio-group.js.map +1 -1
  130. package/dist/components/SegmentedControl/segmented-control.d.ts +2 -2
  131. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
  132. package/dist/components/SegmentedControl/segmented-control.js +16 -8
  133. package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
  134. package/dist/components/Select/select.d.ts +1 -1
  135. package/dist/components/Select/select.d.ts.map +1 -1
  136. package/dist/components/Select/select.js +13 -2
  137. package/dist/components/Select/select.js.map +1 -1
  138. package/dist/components/SelectMenu/index.js +3 -2
  139. package/dist/components/SelectMenu/select-menu.d.ts +15 -3
  140. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  141. package/dist/components/SelectMenu/select-menu.js +150 -99
  142. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  143. package/dist/components/Sheet/sheet.d.ts.map +1 -1
  144. package/dist/components/Sheet/sheet.js +1 -1
  145. package/dist/components/Sheet/sheet.js.map +1 -1
  146. package/dist/components/Sidebar/sidebar.d.ts +2 -2
  147. package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
  148. package/dist/components/Sidebar/sidebar.js +5 -2
  149. package/dist/components/Sidebar/sidebar.js.map +1 -1
  150. package/dist/components/Slider/slider.d.ts +1 -1
  151. package/dist/components/Slider/slider.d.ts.map +1 -1
  152. package/dist/components/Slider/slider.js +7 -3
  153. package/dist/components/Slider/slider.js.map +1 -1
  154. package/dist/components/Switch/switch.d.ts +1 -1
  155. package/dist/components/Switch/switch.d.ts.map +1 -1
  156. package/dist/components/Switch/switch.js +10 -2
  157. package/dist/components/Switch/switch.js.map +1 -1
  158. package/dist/components/Tabs/tabs.d.ts +3 -3
  159. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  160. package/dist/components/Tabs/tabs.js +29 -9
  161. package/dist/components/Tabs/tabs.js.map +1 -1
  162. package/dist/components/Tag/tag.d.ts.map +1 -1
  163. package/dist/components/Tag/tag.js +13 -1
  164. package/dist/components/Tag/tag.js.map +1 -1
  165. package/dist/components/Textarea/textarea.d.ts.map +1 -1
  166. package/dist/components/Textarea/textarea.js +4 -1
  167. package/dist/components/Textarea/textarea.js.map +1 -1
  168. package/dist/components/TimePicker/time-picker.d.ts +1 -1
  169. package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
  170. package/dist/components/TimePicker/time-picker.js +20 -7
  171. package/dist/components/TimePicker/time-picker.js.map +1 -1
  172. package/dist/components/Toast/toast.d.ts.map +1 -1
  173. package/dist/components/Toast/toast.js +4 -1
  174. package/dist/components/Toast/toast.js.map +1 -1
  175. package/dist/components/TreeView/tree-view.d.ts +1 -1
  176. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  177. package/dist/components/TreeView/tree-view.js +8 -3
  178. package/dist/components/TreeView/tree-view.js.map +1 -1
  179. package/dist/hooks/use-controllable.d.ts.map +1 -1
  180. package/dist/hooks/use-controllable.js +4 -2
  181. package/dist/hooks/use-controllable.js.map +1 -1
  182. package/dist/hooks/use-is-touch-device.d.ts.map +1 -1
  183. package/dist/hooks/use-is-touch-device.js +3 -1
  184. package/dist/hooks/use-is-touch-device.js.map +1 -1
  185. package/dist/index.d.ts +1 -0
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +3 -0
  188. package/dist/index.js.map +1 -1
  189. package/dist/patterns/element-anatomy/item-anatomy.d.ts +1 -1
  190. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  191. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  192. package/ds-story-manifest.json +27 -4
  193. package/llms-full.txt +6 -1
  194. package/llms.txt +2 -1
  195. package/package.json +1 -1
  196. package/src/components/Avatar/avatar.spec.md +10 -30
  197. package/src/components/Avatar/avatar.tsx +13 -7
  198. package/src/components/Badge/badge.spec.md +1 -0
  199. package/src/components/Breadcrumb/breadcrumb.spec.md +1 -1
  200. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +1 -1
  201. package/src/components/BulkActionBar/bulk-action-bar.tsx +8 -2
  202. package/src/components/Button/button.spec.md +1 -0
  203. package/src/components/Button/button.tsx +4 -1
  204. package/src/components/Calendar/calendar.anatomy.stories.tsx +3 -1
  205. package/src/components/Calendar/calendar.principles.stories.tsx +3 -1
  206. package/src/components/Calendar/calendar.spec.md +2 -1
  207. package/src/components/Calendar/calendar.stories.tsx +3 -1
  208. package/src/components/Calendar/calendar.tsx +53 -19
  209. package/src/components/Carousel/carousel.tsx +3 -1
  210. package/src/components/Checkbox/checkbox.tsx +2 -1
  211. package/src/components/Chip/chip.anatomy.stories.tsx +8 -8
  212. package/src/components/Chip/chip.principles.stories.tsx +3 -3
  213. package/src/components/Chip/chip.spec.md +6 -3
  214. package/src/components/Chip/chip.tsx +56 -11
  215. package/src/components/Coachmark/coachmark.tsx +10 -8
  216. package/src/components/Combobox/combobox.tsx +8 -2
  217. package/src/components/Command/command.tsx +2 -1
  218. package/src/components/DataTable/data-table.spec.md +52 -95
  219. package/src/components/DataTable/data-table.stories.tsx +47 -0
  220. package/src/components/DataTable/data-table.tsx +145 -11
  221. package/src/components/DataTable/filter-tree.ts +178 -51
  222. package/src/components/DateGrid/date-grid.spec.md +5 -4
  223. package/src/components/DateGrid/date-grid.tsx +64 -11
  224. package/src/components/DatePicker/date-picker.tsx +19 -3
  225. package/src/components/DescriptionList/description-list.tsx +3 -1
  226. package/src/components/DropdownMenu/dropdown-menu.spec.md +4 -3
  227. package/src/components/DropdownMenu/dropdown-menu.tsx +22 -4
  228. package/src/components/Empty/empty.spec.md +0 -1
  229. package/src/components/Empty/empty.tsx +4 -1
  230. package/src/components/Field/field-controls.spec.md +1 -1
  231. package/src/components/Field/field.tsx +2 -1
  232. package/src/components/Field/form-validation.spec.md +1 -1
  233. package/src/components/Field/use-form-validation.ts +11 -7
  234. package/src/components/FileUpload/file-upload.spec.md +1 -1
  235. package/src/components/FileUpload/file-upload.tsx +18 -7
  236. package/src/components/FileViewer/can-render-image.ts +15 -0
  237. package/src/components/FileViewer/file-viewer.tsx +43 -18
  238. package/src/components/FileViewer/image-renderer.tsx +3 -8
  239. package/src/components/HoverCard/hover-card.spec.md +1 -1
  240. package/src/components/HoverCard/hover-card.tsx +3 -1
  241. package/src/components/Input/input.tsx +10 -4
  242. package/src/components/LinkInput/link-input.tsx +4 -1
  243. package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
  244. package/src/components/Menu/menu-item.spec.md +2 -2
  245. package/src/components/Menu/menu-item.tsx +12 -3
  246. package/src/components/NumberInput/number-input.tsx +2 -1
  247. package/src/components/Pagination/index.ts +5 -0
  248. package/src/components/Pagination/pagination.anatomy.stories.tsx +143 -0
  249. package/src/components/Pagination/pagination.principles.stories.tsx +81 -0
  250. package/src/components/Pagination/pagination.spec.md +150 -0
  251. package/src/components/Pagination/pagination.stories.tsx +98 -0
  252. package/src/components/Pagination/pagination.tsx +263 -0
  253. package/src/components/PeoplePicker/people-picker.tsx +2 -1
  254. package/src/components/PeoplePicker/person-display.tsx +5 -1
  255. package/src/components/Popover/popover.anatomy.stories.tsx +1 -1
  256. package/src/components/Popover/popover.spec.md +2 -1
  257. package/src/components/Popover/popover.tsx +86 -37
  258. package/src/components/ProfileCard/profile-card.tsx +24 -6
  259. package/src/components/RadioGroup/radio-group.tsx +2 -1
  260. package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +1 -1
  261. package/src/components/SegmentedControl/segmented-control.spec.md +6 -2
  262. package/src/components/SegmentedControl/segmented-control.tsx +15 -7
  263. package/src/components/Select/select.spec.md +1 -1
  264. package/src/components/Select/select.tsx +26 -4
  265. package/src/components/SelectMenu/select-menu.spec.md +2 -1
  266. package/src/components/SelectMenu/select-menu.tsx +86 -12
  267. package/src/components/Sheet/sheet.spec.md +1 -0
  268. package/src/components/Sheet/sheet.tsx +2 -1
  269. package/src/components/Sidebar/sidebar.tsx +5 -2
  270. package/src/components/Slider/slider.anatomy.stories.tsx +4 -4
  271. package/src/components/Slider/slider.spec.md +19 -85
  272. package/src/components/Slider/slider.tsx +13 -5
  273. package/src/components/Steps/steps.spec.md +1 -0
  274. package/src/components/Switch/switch.spec.md +1 -0
  275. package/src/components/Switch/switch.tsx +9 -1
  276. package/src/components/Tabs/tabs.anatomy.stories.tsx +4 -4
  277. package/src/components/Tabs/tabs.spec.md +13 -47
  278. package/src/components/Tabs/tabs.tsx +38 -9
  279. package/src/components/Tag/tag.principles.stories.tsx +1 -1
  280. package/src/components/Tag/tag.spec.md +11 -43
  281. package/src/components/Tag/tag.tsx +23 -1
  282. package/src/components/Textarea/textarea.principles.stories.tsx +2 -1
  283. package/src/components/Textarea/textarea.tsx +4 -1
  284. package/src/components/TimePicker/time-picker.tsx +31 -10
  285. package/src/components/Toast/toast.tsx +4 -1
  286. package/src/components/TreeView/tree-view.spec.md +1 -1
  287. package/src/components/TreeView/tree-view.tsx +10 -3
  288. package/src/hooks/use-controllable.ts +7 -2
  289. package/src/hooks/use-is-touch-device.ts +8 -1
  290. package/src/index.ts +1 -0
  291. package/src/patterns/element-anatomy/inline-action.spec.md +1 -1
  292. package/src/patterns/element-anatomy/item-anatomy.spec.md +1 -2
  293. package/src/patterns/element-anatomy/item-anatomy.tsx +4 -5
  294. package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +137 -0
  295. package/src/patterns/overlay-surface/overlay-surface.stories.tsx +116 -0
  296. package/src/tokens/color/color.spec.md +5 -7
  297. package/src/tokens/color/semantic.css +8 -2
  298. package/src/tokens/layoutSpace/layoutSpace.spec.md +1 -0
  299. package/src/tokens/motion/motion.stories.tsx +142 -0
  300. package/src/tokens/opacity/opacity.spec.md +1 -1
  301. package/src/tokens/uiSize/uiSize.stories.tsx +103 -0
@@ -2,7 +2,8 @@ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { Empty } from "../Empty/empty.js";
5
- import { useReactTable, getExpandedRowModel, getSortedRowModel, getCoreRowModel, flexRender } from "@tanstack/react-table";
5
+ import { Pagination } from "../Pagination/pagination.js";
6
+ import { useReactTable, getPaginationRowModel, getExpandedRowModel, getSortedRowModel, getCoreRowModel, flexRender } from "@tanstack/react-table";
6
7
  import { useVirtualizer } from "@tanstack/react-virtual";
7
8
  import { TableScrollProvider } from "../Field/field-context.js";
8
9
  import { cva } from "class-variance-authority";
@@ -359,7 +360,7 @@ function DataTableInner({
359
360
  data,
360
361
  size = "md",
361
362
  autoRowHeight = false,
362
- height = "400px",
363
+ height: heightProp,
363
364
  overscan = 5,
364
365
  emptyState,
365
366
  enableHover = true,
@@ -395,10 +396,12 @@ function DataTableInner({
395
396
  experimentalSpreadsheetOverlay = false,
396
397
  experimentalActiveEditorController = false,
397
398
  spreadsheetMode = false,
399
+ pagination,
398
400
  className,
399
401
  ...props
400
402
  }, ref) {
401
403
  var _a, _b, _c;
404
+ const height = heightProp ?? (pagination ? "auto" : "400px");
402
405
  const [editingCellId, setEditingCellId] = React.useState(null);
403
406
  const [editingDraft, setEditingDraft] = React.useState(void 0);
404
407
  const [selectedCellId, setSelectedCellId] = React.useState(null);
@@ -527,6 +530,14 @@ function DataTableInner({
527
530
  if (enabled && !out.includes(SELECT_COL_ID)) out.unshift(SELECT_COL_ID);
528
531
  return out;
529
532
  }, [userColumnOrder, enabled]);
533
+ const paginationEnabled = !!pagination;
534
+ const paginationOpts = typeof pagination === "object" ? pagination : void 0;
535
+ const [pageSizeState, setPageSizeState] = React.useState((paginationOpts == null ? void 0 : paginationOpts.pageSize) ?? 20);
536
+ const [currentPage, setCurrentPage] = useControllable({
537
+ value: paginationOpts == null ? void 0 : paginationOpts.page,
538
+ defaultValue: (paginationOpts == null ? void 0 : paginationOpts.defaultPage) ?? 1,
539
+ onChange: paginationOpts == null ? void 0 : paginationOpts.onPageChange
540
+ });
530
541
  const table = useReactTable({
531
542
  ...tableOptions,
532
543
  data,
@@ -537,7 +548,10 @@ function DataTableInner({
537
548
  ...tableOptions == null ? void 0 : tableOptions.state,
538
549
  // columnPinning + columnOrder 在 user state 後 override,確保 __select__ 永遠左
539
550
  columnPinning: { left: effectivePinnedLeft, right: pinnedRightColumns ?? [] },
540
- ...effectiveColumnOrder ? { columnOrder: effectiveColumnOrder } : {}
551
+ ...effectiveColumnOrder ? { columnOrder: effectiveColumnOrder } : {},
552
+ // L5 分頁:必在 ...tableOptions?.state 之後 spread(同 columnPinning override 理由——
553
+ // 防 user state 蓋掉內建接線);頁碼變更由 <Pagination onPageChange> 驅動,不走 TanStack 內部 setter
554
+ ...paginationEnabled ? { pagination: { pageIndex: currentPage - 1, pageSize: pageSizeState } } : {}
541
555
  },
542
556
  enableMultiSort,
543
557
  // **#1 fix(2026-05-04)**:chain user `tableOptions.onSortingChange`(spread 在前被 override = 之前 bug)
@@ -557,6 +571,8 @@ function DataTableInner({
557
571
  getSortedRowModel: getSortedRowModel(),
558
572
  // L4 nested rows:啟用 expanded row model(consumer 透過 tableOptions.getSubRows + state.expanded forward)
559
573
  getExpandedRowModel: getExpandedRowModel(),
574
+ // L5 分頁:條件掛載(TanStack 官方:pagination 與 virtualization 為互斥替代策略)
575
+ ...paginationEnabled ? { getPaginationRowModel: getPaginationRowModel() } : {},
560
576
  getRowId,
561
577
  // 2026-05-06 v14 column resize:`onChange` mode → drag 中 column 即時跟動 cursor(world-class
562
578
  // canonical:TanStack docs / AG Grid / Excel / Google Sheets 全部 live resize)。前 v13.2
@@ -570,9 +586,11 @@ function DataTableInner({
570
586
  columnResizeMode: "onChange"
571
587
  });
572
588
  const columnSizingState = table.getState().columnSizing;
589
+ const isResizingColumn = table.getState().columnSizingInfo.isResizingColumn;
573
590
  const prevColumnSizingRef = React.useRef(columnSizingState);
574
591
  React.useEffect(() => {
575
592
  if (!onColumnResize) return;
593
+ if (isResizingColumn) return;
576
594
  const prev = prevColumnSizingRef.current;
577
595
  Object.keys(columnSizingState).forEach((id) => {
578
596
  if (columnSizingState[id] !== prev[id]) {
@@ -580,13 +598,18 @@ function DataTableInner({
580
598
  }
581
599
  });
582
600
  prevColumnSizingRef.current = columnSizingState;
583
- }, [columnSizingState, onColumnResize]);
601
+ }, [columnSizingState, isResizingColumn, onColumnResize]);
584
602
  const { rows } = table.getRowModel();
585
603
  const isEmpty = rows.length === 0;
604
+ const pageCount = paginationEnabled ? table.getPageCount() : 0;
605
+ React.useEffect(() => {
606
+ if (!paginationEnabled) return;
607
+ if (pageCount > 0 && currentPage > pageCount) setCurrentPage(pageCount);
608
+ }, [paginationEnabled, pageCount, currentPage, setCurrentPage]);
586
609
  const hasHeightConstraint = height !== "auto";
587
610
  const isFillHeight = hasHeightConstraint && /^(100%|100vh|fill)$/.test(height);
588
611
  const VIRTUAL_THRESHOLD = 30;
589
- const useVirtual = hasHeightConstraint && !isEmpty && rows.length > VIRTUAL_THRESHOLD;
612
+ const useVirtual = !paginationEnabled && hasHeightConstraint && !isEmpty && rows.length > VIRTUAL_THRESHOLD;
590
613
  const hasRowActions = !!rowActions;
591
614
  const tableRef = React.useRef(null);
592
615
  const bodyRef = React.useRef(null);
@@ -614,6 +637,7 @@ function DataTableInner({
614
637
  isScrollingResetDelay: 250
615
638
  });
616
639
  const [bodyMaxHeight, setBodyMaxHeight] = React.useState(null);
640
+ const paginationBarRef = React.useRef(null);
617
641
  React.useLayoutEffect(() => {
618
642
  var _a2;
619
643
  if (!isFillHeight) {
@@ -630,7 +654,9 @@ function DataTableInner({
630
654
  const slotH = (parentEl == null ? void 0 : parentEl.getBoundingClientRect().height) ?? tableRef.current.getBoundingClientRect().height;
631
655
  const headerEl = tableRef.current.firstElementChild;
632
656
  const headerH = (headerEl == null ? void 0 : headerEl.getBoundingClientRect().height) ?? 0;
633
- const next = Math.max(0, slotH - headerH);
657
+ const barEl = paginationBarRef.current;
658
+ const barFootprint = barEl ? barEl.getBoundingClientRect().height + (parseFloat(getComputedStyle(barEl.parentElement).rowGap) || 0) : 0;
659
+ const next = Math.max(0, slotH - headerH - barFootprint);
634
660
  if (lastValue != null && Math.abs(next - lastValue) < 4) return;
635
661
  lastValue = next;
636
662
  pendingValue = next;
@@ -1188,6 +1214,9 @@ function DataTableInner({
1188
1214
  return;
1189
1215
  }
1190
1216
  },
1217
+ // D3 dep-hygiene fix(2026-07-06):handler 內(portal edit Enter 分支)呼叫的是 canEditCell,
1218
+ // 非 isCellEditable — 原 deps 列 isCellEditable 是靠 canEditCell identity-stable 才無實害的
1219
+ // stale-closure 地雷;改列真實依賴 canEditCell(其 useCallback deps 已含 isCellEditable + isCellDisabled)。
1191
1220
  [
1192
1221
  enabled,
1193
1222
  mode,
@@ -1198,7 +1227,7 @@ function DataTableInner({
1198
1227
  selectedCellId,
1199
1228
  editingCellId,
1200
1229
  table,
1201
- isCellEditable
1230
+ canEditCell
1202
1231
  ]
1203
1232
  );
1204
1233
  const headerCellEl = (header, showDivider) => {
@@ -1462,7 +1491,7 @@ function DataTableInner({
1462
1491
  "data-sortable-row-id": enableRowDrag ? row.id : void 0,
1463
1492
  "data-row-drag-source": enableRowDrag && isPrimaryRegion ? "true" : void 0,
1464
1493
  role: "row",
1465
- "aria-rowindex": idx + 2,
1494
+ "aria-rowindex": (paginationEnabled ? (currentPage - 1) * pageSizeState : 0) + idx + 2,
1466
1495
  className: cn(
1467
1496
  "group/row flex relative",
1468
1497
  // H1 fix(2026-05-10):effectiveAutoRow 覆 global autoRowHeight,per-row 若有 cell error
@@ -1535,7 +1564,7 @@ function DataTableInner({
1535
1564
  className: cn(dataTableVariants({ bordered }), isFillHeight && "flex flex-col", "outline-none focus:outline-none focus-visible:outline-none", className),
1536
1565
  style: isFillHeight ? { maxHeight: height } : void 0,
1537
1566
  role: "table",
1538
- "aria-rowcount": rows.length + 1,
1567
+ "aria-rowcount": (paginationEnabled ? table.getPrePaginationRowModel().rows.length : rows.length) + 1,
1539
1568
  tabIndex: enabled || spreadsheetMode ? 0 : void 0,
1540
1569
  onKeyDown: enabled || spreadsheetMode ? tableKeyboardHandler : void 0,
1541
1570
  onMouseOver: enterLeaveHandlers.onMouseOver,
@@ -1851,7 +1880,7 @@ function DataTableInner({
1851
1880
  const meta = (_a2 = table.getColumn(id)) == null ? void 0 : _a2.columnDef.meta;
1852
1881
  return !(meta == null ? void 0 : meta.locked);
1853
1882
  });
1854
- }, [table, columnsWithSelection, (_c = tableOptions == null ? void 0 : tableOptions.state) == null ? void 0 : _c.columnOrder]);
1883
+ }, [table, columnsWithSelection, (_c = tableOptions == null ? void 0 : tableOptions.state) == null ? void 0 : _c.columnOrder, columnVisibility]);
1855
1884
  React.useEffect(() => {
1856
1885
  reorderableColumnIdsRef.current = reorderableColumnIds;
1857
1886
  }, [reorderableColumnIds]);
@@ -1910,6 +1939,33 @@ function DataTableInner({
1910
1939
  }
1911
1940
  return sameParentCollisionDetection(args);
1912
1941
  }, [sameParentCollisionDetection]);
1942
+ const totalRowCount = paginationEnabled ? table.getPrePaginationRowModel().rows.length : 0;
1943
+ const paginationBar = paginationEnabled && !isEmpty ? (
1944
+ // 無條件 justify-end(2026-07-07 C16:原 paginationHasExtras 判斷式 = 平行重複 Pagination
1945
+ // 內部 hasExtras 拼寫,未來加 extra 必 drift)——完整形態 Pagination 自帶 w-full
1946
+ // justify-between,justify-end 對其為 no-op;純頁碼形態靠右 = 拍板 #6(shadcn justify-end /
1947
+ // Ant Table bottomEnd / MUI / Carbon 4 家)。ref 供 isFillHeight bodyMaxHeight 扣 bar 高(C12)。
1948
+ /* @__PURE__ */ jsx("div", { ref: paginationBarRef, className: "flex justify-end", children: /* @__PURE__ */ jsx(
1949
+ Pagination,
1950
+ {
1951
+ total: totalRowCount,
1952
+ page: currentPage,
1953
+ onPageChange: setCurrentPage,
1954
+ pageSize: pageSizeState,
1955
+ onPageSizeChange: (next) => {
1956
+ var _a2;
1957
+ setPageSizeState(next);
1958
+ (_a2 = paginationOpts == null ? void 0 : paginationOpts.onPageSizeChange) == null ? void 0 : _a2.call(paginationOpts, next);
1959
+ },
1960
+ showTotal: paginationOpts == null ? void 0 : paginationOpts.showTotal,
1961
+ pageSizeOptions: paginationOpts == null ? void 0 : paginationOpts.pageSizeOptions
1962
+ }
1963
+ ) })
1964
+ ) : null;
1965
+ const composedContent = paginationBar ? /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-[var(--layout-space-tight)]", isFillHeight && "h-full min-h-0"), children: [
1966
+ tableContent,
1967
+ paginationBar
1968
+ ] }) : tableContent;
1913
1969
  const wrapWithDnd = (node) => {
1914
1970
  if (!enableRowDrag && !enableColumnReorder) return node;
1915
1971
  return /* @__PURE__ */ jsxs(
@@ -1943,11 +1999,11 @@ function DataTableInner({
1943
1999
  {
1944
2000
  value: selection.mode === "include" ? selection.ids[0] ?? "" : "",
1945
2001
  onValueChange: (v) => v && setSelection({ mode: "include", ids: [v] }),
1946
- children: wrapWithDnd(tableContent)
2002
+ children: wrapWithDnd(composedContent)
1947
2003
  }
1948
2004
  );
1949
2005
  }
1950
- return wrapWithDnd(tableContent);
2006
+ return wrapWithDnd(composedContent);
1951
2007
  }
1952
2008
  const DataTable = React.forwardRef(DataTableInner);
1953
2009
  DataTable.displayName = "DataTable";
@@ -1957,7 +2013,9 @@ const dataTableMeta = {
1957
2013
  // non-family composite / overlay / layout
1958
2014
  variants: {},
1959
2015
  sizes: {},
1960
- states: ["default", "hover", "active", "focus-visible", "disabled"],
2016
+ // 'active' 移除 — 全檔無 Tailwind 按壓 utility(rg `active:` 僅命中 dnd-kit `e.active` 物件),
2017
+ // 無按壓專屬視覺態;row action / drag handle 的按壓屬內嵌 Button meta(2026-07-07 對抗稽核補修)。
2018
+ states: ["default", "hover", "focus-visible", "disabled"],
1961
2019
  tokens: {
1962
2020
  bg: ["bg-muted", "bg-neutral-hover", "bg-surface"],
1963
2021
  fg: ["text-fg-muted", "text-fg-secondary", "text-foreground"],