@navikt/ds-react 8.10.3 → 8.10.5

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 (242) hide show
  1. package/cjs/action-menu/ActionMenu.js +1 -1
  2. package/cjs/action-menu/ActionMenu.js.map +1 -1
  3. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -12
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  5. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  6. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  7. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +5 -5
  8. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +49 -28
  9. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  10. package/cjs/data/drag-and-drop/types.d.ts +0 -4
  11. package/cjs/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.d.ts} +3 -3
  12. package/cjs/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js} +5 -5
  13. package/cjs/data/drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js.map +1 -0
  14. package/cjs/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.d.ts +27 -0
  15. package/cjs/data/{drag-and-drop-old/item/DataDragAndDropItem.js → drag-and-drop-legacy/item/DragAndDropItemLegacy.js} +12 -12
  16. package/cjs/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.js.map +1 -0
  17. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.d.ts +5 -0
  18. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js +6 -0
  19. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js.map +1 -0
  20. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.d.ts +24 -0
  21. package/cjs/data/{drag-and-drop-old/root/DataDragAndDropRoot.js → drag-and-drop-legacy/root/DragAndDropLegacyRoot.js} +10 -10
  22. package/cjs/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.js.map +1 -0
  23. package/cjs/data/stories/Data.test-data.d.ts +24 -0
  24. package/cjs/data/stories/Data.test-data.js +1615 -0
  25. package/cjs/data/stories/Data.test-data.js.map +1 -0
  26. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  27. package/cjs/data/table/column-header/DataTableColumnHeader.js +4 -4
  28. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  29. package/cjs/data/table/column-header/useTableColumnResize.d.ts +21 -18
  30. package/cjs/data/table/column-header/useTableColumnResize.js +7 -25
  31. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  32. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  33. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +32 -0
  34. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  35. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  36. package/cjs/data/table/helpers/collectTableRowEntries.js +21 -14
  37. package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
  38. package/cjs/data/table/helpers/table-focus.d.ts +0 -3
  39. package/cjs/data/table/helpers/table-focus.js +38 -8
  40. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  41. package/cjs/data/table/hooks/useColumnOptions.js +18 -5
  42. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
  43. package/cjs/data/table/hooks/useGridCache.js +2 -2
  44. package/cjs/data/table/hooks/useGridCache.js.map +1 -1
  45. package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  46. package/cjs/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +21 -20
  47. package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  48. package/cjs/data/table/hooks/useTableItems.d.ts +14 -17
  49. package/cjs/data/table/hooks/useTableItems.js +17 -16
  50. package/cjs/data/table/hooks/useTableItems.js.map +1 -1
  51. package/cjs/data/table/hooks/useTableKeyboardNav.js +5 -1
  52. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  53. package/cjs/data/table/hooks/useTableSelection.d.ts +4 -2
  54. package/cjs/data/table/hooks/useTableSelection.js +6 -1
  55. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  56. package/cjs/data/table/index.d.ts +1 -2
  57. package/cjs/data/table/index.js +22 -12
  58. package/cjs/data/table/index.js.map +1 -1
  59. package/cjs/data/table/root/DataTable.types.d.ts +7 -9
  60. package/cjs/data/table/root/DataTableRoot.context.d.ts +5 -1
  61. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  62. package/cjs/data/table/root/DataTableRoot.d.ts +79 -115
  63. package/cjs/data/table/root/DataTableRoot.js +163 -38
  64. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  65. package/cjs/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  66. package/cjs/data/table/root/DataTableRoot.legacy.js +104 -0
  67. package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -0
  68. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  69. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +21 -0
  70. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  71. package/cjs/data/table/tr/DataTableTr.js +11 -11
  72. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  73. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  74. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  75. package/cjs/utils/components/floating/Floating.d.ts +16 -1
  76. package/cjs/utils/components/floating/Floating.js +50 -13
  77. package/cjs/utils/components/floating/Floating.js.map +1 -1
  78. package/cjs/utils/components/floating-menu/Menu.js +1 -1
  79. package/cjs/utils/components/floating-menu/Menu.js.map +1 -1
  80. package/cjs/utils/helpers/create-strict-context.js +1 -1
  81. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  82. package/cjs/utils/hooks/useControllableState.d.ts +5 -5
  83. package/cjs/utils/hooks/useControllableState.js.map +1 -1
  84. package/cjs/utils/hooks/useValueAsRef.js +1 -1
  85. package/cjs/utils/hooks/useValueAsRef.js.map +1 -1
  86. package/cjs/utils-external/hooks/useId.js +1 -1
  87. package/cjs/utils-external/hooks/useId.js.map +1 -1
  88. package/esm/action-menu/ActionMenu.js +1 -1
  89. package/esm/action-menu/ActionMenu.js.map +1 -1
  90. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -12
  91. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  92. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  93. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  94. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +5 -5
  95. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +49 -28
  96. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  97. package/esm/data/drag-and-drop/types.d.ts +0 -4
  98. package/esm/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.d.ts} +3 -3
  99. package/esm/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js} +4 -4
  100. package/esm/data/drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.js.map +1 -0
  101. package/esm/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.d.ts +27 -0
  102. package/esm/data/{drag-and-drop-old/item/DataDragAndDropItem.js → drag-and-drop-legacy/item/DragAndDropItemLegacy.js} +11 -11
  103. package/esm/data/drag-and-drop-legacy/item/DragAndDropItemLegacy.js.map +1 -0
  104. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.d.ts +5 -0
  105. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js +3 -0
  106. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacy.context.js.map +1 -0
  107. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.d.ts +24 -0
  108. package/esm/data/{drag-and-drop-old/root/DataDragAndDropRoot.js → drag-and-drop-legacy/root/DragAndDropLegacyRoot.js} +8 -8
  109. package/esm/data/drag-and-drop-legacy/root/DragAndDropLegacyRoot.js.map +1 -0
  110. package/esm/data/stories/Data.test-data.d.ts +24 -0
  111. package/esm/data/stories/Data.test-data.js +1606 -0
  112. package/esm/data/stories/Data.test-data.js.map +1 -0
  113. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +4 -1
  114. package/esm/data/table/column-header/DataTableColumnHeader.js +4 -4
  115. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  116. package/esm/data/table/column-header/useTableColumnResize.d.ts +21 -18
  117. package/esm/data/table/column-header/useTableColumnResize.js +7 -25
  118. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  119. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +6 -0
  120. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +27 -0
  121. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -0
  122. package/esm/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  123. package/esm/data/table/helpers/collectTableRowEntries.js +21 -14
  124. package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
  125. package/esm/data/table/helpers/table-focus.d.ts +0 -3
  126. package/esm/data/table/helpers/table-focus.js +38 -8
  127. package/esm/data/table/helpers/table-focus.js.map +1 -1
  128. package/esm/data/table/hooks/useColumnOptions.js +18 -5
  129. package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
  130. package/esm/data/table/hooks/useGridCache.js +2 -2
  131. package/esm/data/table/hooks/useGridCache.js.map +1 -1
  132. package/esm/data/table/hooks/useTableDetailsPanel.d.ts +62 -0
  133. package/esm/data/table/hooks/{useTableExpansion.js → useTableDetailsPanel.js} +18 -17
  134. package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -0
  135. package/esm/data/table/hooks/useTableItems.d.ts +14 -17
  136. package/esm/data/table/hooks/useTableItems.js +17 -16
  137. package/esm/data/table/hooks/useTableItems.js.map +1 -1
  138. package/esm/data/table/hooks/useTableKeyboardNav.js +6 -2
  139. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  140. package/esm/data/table/hooks/useTableSelection.d.ts +4 -2
  141. package/esm/data/table/hooks/useTableSelection.js +6 -1
  142. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  143. package/esm/data/table/index.d.ts +1 -2
  144. package/esm/data/table/index.js +21 -1
  145. package/esm/data/table/index.js.map +1 -1
  146. package/esm/data/table/root/DataTable.types.d.ts +7 -9
  147. package/esm/data/table/root/DataTableRoot.context.d.ts +5 -1
  148. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  149. package/esm/data/table/root/DataTableRoot.d.ts +79 -115
  150. package/esm/data/table/root/DataTableRoot.js +170 -36
  151. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  152. package/esm/data/table/root/DataTableRoot.legacy.d.ts +177 -0
  153. package/esm/data/table/root/DataTableRoot.legacy.js +59 -0
  154. package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -0
  155. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.d.ts +6 -0
  156. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +16 -0
  157. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -0
  158. package/esm/data/table/tr/DataTableTr.js +11 -11
  159. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  160. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  161. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  162. package/esm/utils/components/floating/Floating.d.ts +16 -1
  163. package/esm/utils/components/floating/Floating.js +48 -13
  164. package/esm/utils/components/floating/Floating.js.map +1 -1
  165. package/esm/utils/components/floating-menu/Menu.js +2 -2
  166. package/esm/utils/components/floating-menu/Menu.js.map +1 -1
  167. package/esm/utils/helpers/create-strict-context.js +1 -1
  168. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  169. package/esm/utils/hooks/useControllableState.d.ts +5 -5
  170. package/esm/utils/hooks/useControllableState.js.map +1 -1
  171. package/esm/utils/hooks/useValueAsRef.js +1 -1
  172. package/esm/utils/hooks/useValueAsRef.js.map +1 -1
  173. package/esm/utils-external/hooks/useId.js +1 -1
  174. package/esm/utils-external/hooks/useId.js.map +1 -1
  175. package/package.json +8 -7
  176. package/src/action-menu/ActionMenu.tsx +1 -1
  177. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +11 -16
  178. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
  179. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +85 -40
  180. package/src/data/drag-and-drop/types.ts +0 -5
  181. package/src/data/{drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx → drag-and-drop-legacy/drag-handler/DragAndDropDragHandlerLegacy.tsx} +5 -5
  182. package/src/data/{drag-and-drop-old/item/DataDragAndDropItem.tsx → drag-and-drop-legacy/item/DragAndDropItemLegacy.tsx} +13 -13
  183. package/src/data/{drag-and-drop-old/root/DataDragAndDrop.context.tsx → drag-and-drop-legacy/root/DragAndDropLegacy.context.tsx} +3 -3
  184. package/src/data/{drag-and-drop-old/root/DataDragAndDropRoot.tsx → drag-and-drop-legacy/root/DragAndDropLegacyRoot.tsx} +19 -21
  185. package/src/data/stories/Data.test-data.tsx +1702 -0
  186. package/src/data/table/column-header/DataTableColumnHeader.tsx +8 -6
  187. package/src/data/table/column-header/useTableColumnResize.ts +29 -44
  188. package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +57 -0
  189. package/src/data/table/helpers/collectTableRowEntries.ts +36 -30
  190. package/src/data/table/helpers/table-focus.ts +63 -9
  191. package/src/data/table/hooks/__tests__/useTableItems.test.ts +58 -12
  192. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +57 -44
  193. package/src/data/table/hooks/useColumnOptions.ts +19 -5
  194. package/src/data/table/hooks/useGridCache.ts +3 -2
  195. package/src/data/table/hooks/useTableDetailsPanel.tsx +185 -0
  196. package/src/data/table/hooks/useTableItems.ts +44 -52
  197. package/src/data/table/hooks/useTableKeyboardNav.ts +6 -2
  198. package/src/data/table/hooks/useTableSelection.ts +17 -6
  199. package/src/data/table/index.tsx +5 -3
  200. package/src/data/table/root/DataTable.types.ts +20 -9
  201. package/src/data/table/root/DataTableRoot.context.ts +5 -1
  202. package/src/data/table/root/DataTableRoot.legacy.tsx +297 -0
  203. package/src/data/table/root/DataTableRoot.tsx +484 -219
  204. package/src/data/table/root/agent-feature-gap.md +96 -0
  205. package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +39 -0
  206. package/src/data/table/tr/DataTableTr.tsx +14 -13
  207. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  208. package/src/utils/components/floating/Floating.tsx +56 -13
  209. package/src/utils/components/floating-menu/Menu.tsx +4 -1
  210. package/src/utils/helpers/create-strict-context.tsx +1 -1
  211. package/src/utils/hooks/useControllableState.ts +11 -8
  212. package/src/utils/hooks/useValueAsRef.ts +1 -1
  213. package/src/utils-external/hooks/useId.ts +1 -1
  214. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  215. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  216. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  217. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  218. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -6
  219. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  220. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  221. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  222. package/cjs/data/table/hooks/useTableExpansion.d.ts +0 -27
  223. package/cjs/data/table/hooks/useTableExpansion.js.map +0 -1
  224. package/cjs/data/table/root/DataTableAuto.d.ts +0 -182
  225. package/cjs/data/table/root/DataTableAuto.js +0 -206
  226. package/cjs/data/table/root/DataTableAuto.js.map +0 -1
  227. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  228. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  229. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  230. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  231. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -3
  232. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  233. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  234. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  235. package/esm/data/table/hooks/useTableExpansion.d.ts +0 -27
  236. package/esm/data/table/hooks/useTableExpansion.js.map +0 -1
  237. package/esm/data/table/root/DataTableAuto.d.ts +0 -182
  238. package/esm/data/table/root/DataTableAuto.js +0 -170
  239. package/esm/data/table/root/DataTableAuto.js.map +0 -1
  240. package/src/data/table/hooks/useTableExpansion.tsx +0 -146
  241. package/src/data/table/root/DataTableAuto.test.tsx +0 -244
  242. package/src/data/table/root/DataTableAuto.tsx +0 -612
@@ -1,45 +1,52 @@
1
- import React, { forwardRef } from "react";
1
+ /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
2
+ import React, {
3
+ forwardRef,
4
+ useCallback,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ useState,
9
+ } from "react";
10
+ import { Skeleton } from "../../../skeleton";
2
11
  import { useId } from "../../../utils-external";
12
+ import { Slot } from "../../../utils/components/slot/Slot";
3
13
  import { cl } from "../../../utils/helpers";
4
14
  import { useMergeRefs } from "../../../utils/hooks";
15
+ import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
16
+ import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
17
+ import { DataTableDetailsPanelRow } from "../details-panel-row/DataTableDetailsPanelRow";
18
+ import { DataTableEmptyState } from "../empty-state/DataTableEmptyState";
19
+ import { useColumnOptions } from "../hooks/useColumnOptions";
5
20
  import {
6
- DataTableCaption,
7
- type DataTableCaptionProps,
8
- } from "../caption/DataTableCaption";
21
+ DataTableDetailsPanelProvider,
22
+ type DetailsPanelProps,
23
+ } from "../hooks/useTableDetailsPanel";
9
24
  import {
10
- DataTableEmptyState,
11
- type DataTableEmptyStateProps,
12
- } from "../empty-state/DataTableEmptyState";
13
- import { DataTableExpansionProvider } from "../hooks/useTableExpansion";
25
+ type SubRowsProps,
26
+ TableItemsProvider,
27
+ useTableItems,
28
+ useTableItemsContext,
29
+ } from "../hooks/useTableItems";
14
30
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
15
31
  import {
16
32
  type SelectionProps,
17
- noSelectionState,
33
+ useTableSelection,
18
34
  } from "../hooks/useTableSelection";
35
+ import { type TableSortOptions, useTableSort } from "../hooks/useTableSort";
36
+ import { DataTableLoadingState } from "../loading-state/DataTableLoadingState";
37
+ import { DataTableSubRowToggle } from "../sub-row-toggle/DataTableSubRowToggle";
38
+ import { DataTableTbody } from "../tbody/DataTableTbody";
39
+ import { DataTableThead } from "../thead/DataTableThead";
40
+ import { DataTableTr } from "../tr/DataTableTr";
41
+ import type { ColumnDefinitions } from "./DataTable.types";
19
42
  import {
20
- DataTableLoadingState,
21
- type DataTableLoadingStateProps,
22
- } from "../loading-state/DataTableLoadingState";
23
- import {
24
- DataTableTbody,
25
- type DataTableTbodyProps,
26
- } from "../tbody/DataTableTbody";
27
- import { DataTableTd, type DataTableTdProps } from "../td/DataTableTd";
28
- import {
29
- DataTableTfoot,
30
- type DataTableTfootProps,
31
- } from "../tfoot/DataTableTfoot";
32
- import { DataTableTh, type DataTableThProps } from "../th/DataTableTh";
33
- import {
34
- DataTableThead,
35
- type DataTableTheadProps,
36
- } from "../thead/DataTableThead";
37
- import { DataTableTr, type DataTableTrProps } from "../tr/DataTableTr";
38
- import { DataTableContextProvider } from "./DataTableRoot.context";
39
-
40
- interface DataTableProps
41
- extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
42
- children: React.ReactNode;
43
+ DataTableContextProvider,
44
+ useDataTableContext,
45
+ } from "./DataTableRoot.context";
46
+
47
+ interface DataTableProps<T>
48
+ extends React.HTMLAttributes<HTMLTableElement>, TableSortOptions {
49
+ children?: never;
43
50
  /**
44
51
  * Controls vertical cell padding.
45
52
  * @default "normal"
@@ -59,7 +66,7 @@ interface DataTableProps
59
66
  truncateContent?: boolean; // TODO: Consider making this default false when layout=auto, and maybe disallow it but add a wrap prop on the td-comp.
60
67
  /**
61
68
  * Enables keyboard navigation for table rows and cells.
62
- * @default false
69
+ * @default true
63
70
  */
64
71
  withKeyboardNav?: boolean;
65
72
  /**
@@ -83,215 +90,473 @@ interface DataTableProps
83
90
  * @default "fixed"
84
91
  */
85
92
  layout?: "fixed" | "auto";
86
- }
87
-
88
- interface DataTableRootComponent extends React.ForwardRefExoticComponent<
89
- DataTableProps & React.RefAttributes<HTMLTableElement>
90
- > {
91
93
  /**
92
- * @see 🏷️ {@link DataTableCaptionProps}
93
- * @example
94
- * ```jsx
95
- * <DataTable>
96
- * <DataTable.Caption>
97
- * Lorem ipsum
98
- * </DataTable.Caption
99
- * </DataTable>
100
- * ```
101
- */
102
- Caption: typeof DataTableCaption;
103
- /**
104
- * @see 🏷️ {@link DataTableTheadProps}
105
- * @example
106
- * ```jsx
107
- * <DataTable>
108
- * <DataTable.Thead>
109
- * ... TODO
110
- * </DataTable.Thead>
111
- * </DataTable>
112
- * ```
94
+ * Defines the columns of the table and how to render them.
95
+ *
96
+ *
97
+ * Each column definition should have a unique `id` (or use the column index as fallback) and a `cell`-renderer function that takes the row data as argument and returns a React node.
113
98
  */
114
- Thead: typeof DataTableThead;
99
+ columnDefinitions: ColumnDefinitions<T>;
115
100
  /**
116
- * @see 🏷️ {@link DataTableTbodyProps}
117
- * @example
118
- * ```jsx
119
- * <DataTable>
120
- * <DataTable.Tbody>
121
- * ... TODO
122
- * </DataTable.Tbody>
123
- * </DataTable>
124
- * ```
101
+ * The data to display in the table.
102
+ *
103
+ *
104
+ * Each object in the array represents a row, and the properties of the object are used to render the cells based on the `columnDefinitions`.
125
105
  */
126
- Tbody: typeof DataTableTbody;
106
+ data: T[];
127
107
  /**
128
- * @see 🏷️ {@link DataTableTrProps}
129
- * @example
130
- * ```jsx
131
- * <DataTable>
132
- * <DataTable.Tr>
133
- * ... TODO
134
- * </DataTable.Tr
135
- * </DataTable>
136
- * ```
108
+ * Function to get unique row id from row data.
109
+ *
110
+ *
111
+ * If not provided, the row index will be used as id. This can cause issues if your data changes dynamically, so it's recommended to provide a stable id if possible.
137
112
  */
138
- Tr: typeof DataTableTr;
113
+ getRowId?: (rowData: T) => string | number;
139
114
  /**
140
- * @see 🏷️ {@link DataTableThProps}
141
- * @example
142
- * ```jsx
143
- * ```
115
+ * Sticky columns that remain visible when horizontally scrolling the table.
116
+ *
117
+ * You can specify 1 sticky column on the left and 1 on the right.
144
118
  */
145
- Th: typeof DataTableTh;
119
+ stickyColumns?: {
120
+ first?: "1";
121
+ last?: "1";
122
+ };
146
123
  /**
147
- * @see 🏷️ {@link DataTableTdProps}
148
- * @example
149
- * ```jsx
150
- * <DataTable>
151
- * <DataTable.Tbody>
152
- * <DataTable.Td>
153
- * Lorem ipsum
154
- * </DataTable.Td>
155
- * <DataTable.Td>
156
- * Dolor sit amet
157
- * </DataTable.Td>
158
- * </DataTable.Tbody>
159
- * </DataTable>
160
- * ```
124
+ * @default true
161
125
  */
162
- Td: typeof DataTableTd;
126
+ stickyHeader?: boolean;
163
127
  /**
164
- * @see 🏷️ {@link DataTableTfootProps}
165
- * @example
166
- * ```jsx
167
- * <DataTable>
168
- * <DataTable.Tfoot>
169
- * ...
170
- * </DataTable.Tfoot>
171
- * </DataTable>
172
- * ```
128
+ * Callback invoked when a data row is clicked.
129
+ * Not called when clicking header, loading, or empty-state rows.
173
130
  */
174
- Tfoot: typeof DataTableTfoot;
131
+ onRowClick?: (
132
+ rowId: string | number,
133
+ event: React.MouseEvent<HTMLTableRowElement>,
134
+ ) => void;
175
135
  /**
176
- * @see 🏷️ {@link DataTableEmptyStateProps}
177
- * @example
178
- * ```jsx
179
- * <DataTable>
180
- * <DataTable.TBody>
181
- * <DataTable.EmptyState />
182
- * </DataTable.TBody>
183
- * </DataTable>
184
- * ```
136
+ * Content to render when `data` is empty.
137
+ * Rendered inside a `DataTable.EmptyState` row spanning all columns.
185
138
  */
186
- EmptyState: typeof DataTableEmptyState;
139
+ emptyState?: React.ReactNode;
140
+ loading?: {
141
+ /**
142
+ * Shows the table in a loading state.
143
+ *
144
+ * - When `loadingState` is provided, it is rendered inside a `DataTable.LoadingState` row.
145
+ * - When `loadingState` is **not** provided, skeleton placeholder rows are rendered instead.
146
+ * @default false
147
+ */
148
+ isLoading?: boolean;
149
+ /**
150
+ * Custom content to render when `isLoading` is `true`.
151
+ * Rendered inside a `DataTable.LoadingState` row spanning all columns.
152
+ * When omitted, skeleton rows are rendered based on `loadingRows`.
153
+ */
154
+ loadingState?: React.ReactNode;
155
+ /**
156
+ * Number of skeleton rows to render when `isLoading` is `true` and no `loadingState` is provided.
157
+ *
158
+ *
159
+ * If not provided, the rendered content will get a temporarily overlay while loading
160
+ */
161
+ loadingRows?: number;
162
+ /**
163
+ * Visually hidden label announced to screen readers when skeleton rows are shown.
164
+ * Only used when `isLoading` is `true` and no `loadingState` is provided.
165
+ * @default "Laster innhold"
166
+ */
167
+ loadingLabel?: string;
168
+ };
169
+
187
170
  /**
188
- * @see 🏷️ {@link DataTableEmptyStateProps}
189
- * @example
190
- * ```jsx
191
- * <DataTable>
192
- * <DataTable.TBody>
193
- * <DataTable.LoadingState />
194
- * </DataTable.TBody>
195
- * </DataTable>
196
- * ```
171
+ * Function to get sub-rows for a given row, used for nested rows.
172
+ * When provided, an expand toggle column is added automatically.
173
+ *
174
+ *
175
+ * TODO:
176
+ * - Table might need to be implemented with role="treegrid" for a11y when having nested rows.
197
177
  */
198
- LoadingState: typeof DataTableLoadingState;
178
+ selection?: SelectionProps;
179
+ subRows?: SubRowsProps<T>;
180
+ detailsPanel?: DetailsPanelProps<T>;
181
+ }
182
+
183
+ function DataTableInner<T>(
184
+ {
185
+ className,
186
+ id,
187
+ rowDensity = "normal",
188
+ withKeyboardNav = true,
189
+ zebraStripes = false,
190
+ truncateContent = true,
191
+ shouldBlockNavigation,
192
+ layout = "fixed",
193
+ selection,
194
+ data,
195
+ columnDefinitions,
196
+ getRowId,
197
+ stickyColumns,
198
+ stickyHeader = true,
199
+ sort: sortProp,
200
+ defaultSort = [],
201
+ onSortChange,
202
+ onRowClick,
203
+ emptyState,
204
+ loading,
205
+ detailsPanel,
206
+ subRows,
207
+ ...rest
208
+ }: DataTableProps<T>,
209
+ forwardedRef: React.ForwardedRef<HTMLTableElement>,
210
+ ) {
211
+ const { sortState, onSortClick } = useTableSort({
212
+ defaultSort,
213
+ onSortChange,
214
+ sort: sortProp,
215
+ });
216
+
217
+ const tableItems = useTableItems({
218
+ items: data,
219
+ getRowId,
220
+ subRows,
221
+ });
222
+
223
+ const tableSelectionState = useTableSelection({
224
+ selection,
225
+ visibleRowIds: tableItems.visibleRowIds,
226
+ childRowIdsById: tableItems.childRowIdsById,
227
+ });
228
+
229
+ const { columns, stickySelection } = useColumnOptions<T>(columnDefinitions, {
230
+ stickyColumns,
231
+ selectionMode: tableSelectionState.selection.selectionMode,
232
+ });
233
+
234
+ const {
235
+ isLoading = false,
236
+ loadingState,
237
+ loadingRows,
238
+ loadingLabel = "Laster innhold",
239
+ } = loading || {};
240
+
241
+ const fullWidthColSpan = useMemo(() => {
242
+ return (
243
+ columns.length +
244
+ (layout === "fixed" ? 1 : 0) +
245
+ (tableSelectionState.selection.selectionMode !== "none" ? 1 : 0) +
246
+ (detailsPanel?.getContent ? 1 : 0)
247
+ );
248
+ }, [
249
+ columns,
250
+ layout,
251
+ tableSelectionState.selection.selectionMode,
252
+ detailsPanel,
253
+ ]);
254
+
255
+ const tableId = useId(id);
256
+
257
+ return (
258
+ <DataTableContextProvider
259
+ layout={layout}
260
+ withKeyboardNav={withKeyboardNav}
261
+ selectionState={tableSelectionState}
262
+ stickySelection={stickySelection}
263
+ stickyHeader={stickyHeader}
264
+ tableId={tableId}
265
+ showLoadingSkeletons={isLoading && loadingState == null}
266
+ onRowClick={onRowClick}
267
+ isLoading={isLoading}
268
+ showLoadingOverlay={isLoading && !loadingState && !loadingRows}
269
+ columns={columns}
270
+ fullWidthColSpan={fullWidthColSpan}
271
+ >
272
+ <TableItemsProvider
273
+ itemDetails={tableItems.itemDetails}
274
+ items={tableItems.items}
275
+ visibleRowIds={tableItems.visibleRowIds}
276
+ onExpandedRowIdsChange={tableItems.onExpandedRowIdsChange}
277
+ isSubRowExpanded={tableItems.isSubRowExpanded}
278
+ >
279
+ <DataTableDetailsPanelProvider detailsPanel={detailsPanel}>
280
+ <TableElementWrapper
281
+ shouldBlockNavigation={shouldBlockNavigation}
282
+ enabled={withKeyboardNav}
283
+ >
284
+ <table
285
+ {...rest}
286
+ ref={forwardedRef}
287
+ className={cl("aksel-data-table", className)}
288
+ data-zebra-stripes={zebraStripes}
289
+ data-truncate-content={truncateContent}
290
+ data-density={rowDensity}
291
+ data-layout={layout}
292
+ data-loading={isLoading || undefined}
293
+ aria-busy={isLoading || undefined}
294
+ >
295
+ <DataTableThead>
296
+ <DataTableTr>
297
+ {columns.map(({ isSticky, colDef }) => {
298
+ const sortEntry = sortState.find(
299
+ (s) => s.columnId === colDef.id,
300
+ );
301
+ const sortDirection = sortEntry?.direction ?? "none";
302
+ return (
303
+ <DataTableColumnHeader
304
+ resizable={colDef.resizable}
305
+ width={colDef.width}
306
+ defaultWidth={colDef.defaultWidth}
307
+ autoWidth={colDef.autoWidth}
308
+ minWidth={colDef.minWidth}
309
+ maxWidth={colDef.maxWidth}
310
+ onWidthChange={colDef.onWidthChange}
311
+ textAlign={colDef.align ?? "left"}
312
+ key={colDef.id}
313
+ isSticky={isSticky}
314
+ sortable={colDef.sortable}
315
+ sortDirection={sortDirection}
316
+ onSortClick={(event) => onSortClick(colDef.id, event)}
317
+ label={colDef.label}
318
+ >
319
+ {colDef.header ?? colDef.label}
320
+ </DataTableColumnHeader>
321
+ );
322
+ })}
323
+ </DataTableTr>
324
+ </DataTableThead>
325
+
326
+ <DataTableTbody>
327
+ <DataTableTBodyContent
328
+ loadingState={loadingState}
329
+ loadingRows={loadingRows}
330
+ loadingLabel={loadingLabel}
331
+ emptyState={emptyState}
332
+ />
333
+ </DataTableTbody>
334
+ </table>
335
+ </TableElementWrapper>
336
+ </DataTableDetailsPanelProvider>
337
+ </TableItemsProvider>
338
+ </DataTableContextProvider>
339
+ );
199
340
  }
200
341
 
201
342
  /**
202
- * TODO Component description etc.
203
- *
204
- * **NB:** To get sticky headers, you have to set a height restriction on the table container. You can use VStack for this:
205
- * TODO example
343
+ * Temp optimization to avoid re-renders on every keyboard-move, selection change etc
206
344
  */
207
- const DataTable = forwardRef<HTMLTableElement, DataTableProps>(
208
- (
209
- {
210
- className,
211
- rowDensity = "normal",
212
- withKeyboardNav = false,
213
- zebraStripes = false,
214
- truncateContent = true,
215
- shouldBlockNavigation,
216
- layout = "fixed",
217
- ...rest
218
- },
219
- forwardedRef,
220
- ) => {
221
- const { tabIndex, setTableRef } = useTableKeyboardNav({
222
- enabled: withKeyboardNav,
223
- shouldBlockNavigation,
345
+ function TableElementWrapper({
346
+ children,
347
+ enabled,
348
+ shouldBlockNavigation,
349
+ }: {
350
+ children: React.ReactNode;
351
+ shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
352
+ enabled: boolean;
353
+ }) {
354
+ const [applyStickyStyles, setApplyStickyStyles] = useState<boolean>(false);
355
+
356
+ const tableWrapperRef = useRef<HTMLDivElement>(null);
357
+ const tableRef = useRef<HTMLTableElement>(null);
358
+ const rafRef = useRef<number | null>(null);
359
+ const { tabIndex, setTableRef } = useTableKeyboardNav({
360
+ enabled,
361
+ shouldBlockNavigation,
362
+ });
363
+
364
+ const mergedTableRefs = useMergeRefs(tableRef, setTableRef);
365
+
366
+ const updateStickyStyles = useCallback(() => {
367
+ if (!tableWrapperRef.current) {
368
+ return;
369
+ }
370
+
371
+ const doesWrapperHasScroll =
372
+ tableWrapperRef.current.scrollWidth > tableWrapperRef.current.clientWidth;
373
+
374
+ setApplyStickyStyles(doesWrapperHasScroll);
375
+ }, []);
376
+
377
+ const scheduleStickyStylesUpdate = useCallback(() => {
378
+ if (rafRef.current !== null) {
379
+ return;
380
+ }
381
+
382
+ rafRef.current = requestAnimationFrame(() => {
383
+ rafRef.current = null;
384
+ updateStickyStyles();
224
385
  });
386
+ }, [updateStickyStyles]);
387
+
388
+ useEffect(
389
+ function observeAndUpdateStickyStyles() {
390
+ const tableWrapperElement = tableWrapperRef.current;
391
+
392
+ if (!tableWrapperElement) {
393
+ return;
394
+ }
225
395
 
226
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
396
+ const handleResize = () => scheduleStickyStylesUpdate();
397
+
398
+ window.addEventListener("resize", handleResize);
399
+
400
+ let resizeObserver: ResizeObserver | undefined;
401
+ if (typeof ResizeObserver !== "undefined") {
402
+ resizeObserver = new ResizeObserver(handleResize);
403
+ resizeObserver.observe(tableWrapperElement);
404
+ if (tableRef.current) {
405
+ resizeObserver.observe(tableRef.current);
406
+ }
407
+ }
408
+
409
+ scheduleStickyStylesUpdate();
410
+
411
+ return () => {
412
+ window.removeEventListener("resize", handleResize);
413
+ resizeObserver?.disconnect();
414
+ if (rafRef.current !== null) {
415
+ cancelAnimationFrame(rafRef.current);
416
+ rafRef.current = null;
417
+ }
418
+ };
419
+ },
420
+ [scheduleStickyStylesUpdate],
421
+ );
422
+
423
+ return (
424
+ <div className="aksel-data-table__border-wrapper">
425
+ <div ref={tableWrapperRef} className="aksel-data-table__scroll-wrapper">
426
+ <Slot
427
+ tabIndex={tabIndex}
428
+ /* @ts-expect-error Ref is not typed correctly to handle this case */
429
+ ref={mergedTableRefs}
430
+ data-scroll={applyStickyStyles ? "true" : undefined}
431
+ >
432
+ {children}
433
+ </Slot>
434
+ </div>
435
+ </div>
436
+ );
437
+ }
438
+
439
+ interface DataTableTBodyContentProps {
440
+ loadingState: React.ReactNode;
441
+ loadingLabel: string;
442
+ loadingRows?: number;
443
+ emptyState: React.ReactNode;
444
+ }
227
445
 
446
+ function DataTableTBodyContent({
447
+ loadingState,
448
+ loadingRows,
449
+ loadingLabel,
450
+ emptyState,
451
+ }: DataTableTBodyContentProps) {
452
+ const { items, itemDetails, visibleRowIds } = useTableItemsContext();
453
+ const { columns, isLoading, fullWidthColSpan } = useDataTableContext();
454
+
455
+ if (isLoading && loadingState != null) {
228
456
  return (
229
- <DataTableContextProvider
230
- layout={layout}
231
- withKeyboardNav={withKeyboardNav}
232
- selectionState={noSelectionState}
233
- stickySelection={false}
234
- stickyHeader={true}
235
- tableId={useId()}
236
- showLoadingSkeletons={false}
237
- onRowClick={undefined}
238
- disableRowSelectionOnClick={false}
239
- showLoadingOverlay={false}
240
- columns={[]}
241
- >
242
- <DataTableExpansionProvider>
243
- <div className="aksel-data-table__border-wrapper">
244
- <div className="aksel-data-table__scroll-wrapper">
245
- <table
246
- {...rest}
247
- ref={mergedRef}
248
- className={cl("aksel-data-table", className)}
249
- data-zebra-stripes={zebraStripes}
250
- data-truncate-content={truncateContent}
251
- data-density={rowDensity}
252
- data-layout={layout}
253
- tabIndex={tabIndex}
254
- />
255
- </div>
256
- </div>
257
- </DataTableExpansionProvider>
258
- </DataTableContextProvider>
457
+ <DataTableLoadingState colSpan={fullWidthColSpan}>
458
+ {loadingState}
459
+ </DataTableLoadingState>
460
+ );
461
+ }
462
+
463
+ if (isLoading && loadingRows) {
464
+ return (
465
+ <>
466
+ <tr>
467
+ <td colSpan={fullWidthColSpan} className="aksel-sr-only">
468
+ {loadingLabel}
469
+ </td>
470
+ </tr>
471
+ {Array.from({ length: loadingRows }, (_, rowIndex) => (
472
+ <DataTableTr key={`skeleton-row-${rowIndex}`} aria-hidden>
473
+ {columns.map(({ isSticky, colDef }, colDefIndex) => (
474
+ <DataTableBaseCell
475
+ textAlign={colDef.align ?? "left"}
476
+ key={colDef.id || colDefIndex}
477
+ as={colDef.isRowHeader ? "th" : "td"}
478
+ isSticky={isSticky}
479
+ >
480
+ <Skeleton variant="text" />
481
+ </DataTableBaseCell>
482
+ ))}
483
+ </DataTableTr>
484
+ ))}
485
+ </>
259
486
  );
260
- },
261
- ) as DataTableRootComponent;
262
-
263
- DataTable.Caption = DataTableCaption;
264
- DataTable.Thead = DataTableThead;
265
- DataTable.Tbody = DataTableTbody;
266
- DataTable.Th = DataTableTh;
267
- DataTable.Tr = DataTableTr;
268
- DataTable.Td = DataTableTd;
269
- DataTable.Tfoot = DataTableTfoot;
270
- DataTable.EmptyState = DataTableEmptyState;
271
- DataTable.LoadingState = DataTableLoadingState;
272
-
273
- export {
274
- DataTable,
275
- DataTableCaption,
276
- DataTableEmptyState,
277
- DataTableLoadingState,
278
- DataTableTbody,
279
- DataTableTd,
280
- DataTableTfoot,
281
- DataTableTh,
282
- DataTableThead,
283
- DataTableTr,
284
- };
487
+ }
488
+
489
+ if (items.length === 0 && emptyState !== undefined) {
490
+ return (
491
+ <DataTableEmptyState colSpan={fullWidthColSpan}>
492
+ {emptyState}
493
+ </DataTableEmptyState>
494
+ );
495
+ }
496
+
497
+ const renderLoadingAnnouncement = isLoading && !loadingState && !loadingRows;
498
+
499
+ return (
500
+ <>
501
+ {renderLoadingAnnouncement && (
502
+ <tr>
503
+ <td colSpan={fullWidthColSpan} className="aksel-sr-only">
504
+ {loadingLabel}
505
+ </td>
506
+ </tr>
507
+ )}
508
+ {items.map((rowData, rowIndex) => {
509
+ const rowId = visibleRowIds[rowIndex];
510
+ const details = rowId != null ? itemDetails.get(rowId) : undefined;
511
+
512
+ /* Should in theory be impossible. Look about typing this? */
513
+ if (!details) {
514
+ return null;
515
+ }
516
+
517
+ const hasSubRows = details.children.length > 0;
518
+
519
+ return (
520
+ <React.Fragment key={details.id}>
521
+ <DataTableTr rowId={details.id}>
522
+ {columns.map(({ isSticky, colDef }, colDefIndex) => {
523
+ const renderNestedToggle = colDefIndex === 0 && hasSubRows;
524
+ const renderNestedIndent =
525
+ colDefIndex === 0 && (details.level > 0 || hasSubRows);
526
+
527
+ const style: React.CSSProperties = {
528
+ "--__axc-data-table-nested-depth": details.level,
529
+ };
530
+
531
+ return (
532
+ <DataTableBaseCell
533
+ textAlign={colDef.align ?? "left"}
534
+ key={colDef.id || colDefIndex}
535
+ as={colDef.isRowHeader ? "th" : "td"}
536
+ isSticky={isSticky}
537
+ data-nested={renderNestedIndent || undefined}
538
+ style={style}
539
+ >
540
+ {renderNestedToggle && (
541
+ <DataTableSubRowToggle details={details} />
542
+ )}
543
+ {colDef.cell(rowData)}
544
+ </DataTableBaseCell>
545
+ );
546
+ })}
547
+ </DataTableTr>
548
+ <DataTableDetailsPanelRow rowId={details.id} rowData={rowData} />
549
+ </React.Fragment>
550
+ );
551
+ })}
552
+ </>
553
+ );
554
+ }
555
+
556
+ const DataTable = forwardRef(DataTableInner) as <T>(
557
+ props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
558
+ ) => React.ReactElement | null;
559
+
560
+ export { DataTable };
561
+ export type { DataTableProps };
285
562
  export default DataTable;
286
- export type {
287
- DataTableCaptionProps,
288
- DataTableEmptyStateProps,
289
- DataTableLoadingStateProps,
290
- DataTableProps,
291
- DataTableTbodyProps,
292
- DataTableTdProps,
293
- DataTableTfootProps,
294
- DataTableTheadProps,
295
- DataTableThProps,
296
- DataTableTrProps,
297
- };