@navikt/ds-react 8.10.4 → 8.10.6

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 (244) hide show
  1. package/cjs/data/data-grid/index.d.ts +2 -0
  2. package/cjs/data/data-grid/index.js +7 -0
  3. package/cjs/data/data-grid/index.js.map +1 -0
  4. package/cjs/data/data-grid/root/DataGridRoot.context.d.ts +11 -0
  5. package/cjs/data/data-grid/root/DataGridRoot.context.js +11 -0
  6. package/cjs/data/data-grid/root/DataGridRoot.context.js.map +1 -0
  7. package/cjs/data/data-grid/root/DataGridRoot.d.ts +38 -0
  8. package/cjs/data/data-grid/root/DataGridRoot.js +68 -0
  9. package/cjs/data/data-grid/root/DataGridRoot.js.map +1 -0
  10. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -13
  11. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  12. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  13. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  14. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +44 -46
  15. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  16. package/cjs/data/drag-and-drop/types.d.ts +0 -4
  17. package/cjs/data/stories/Data.test-data.d.ts +2 -5
  18. package/cjs/data/stories/Data.test-data.js +30 -39
  19. package/cjs/data/stories/Data.test-data.js.map +1 -1
  20. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +15 -15
  21. package/cjs/data/table/base-cell/DataTableBaseCell.js +4 -8
  22. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -1
  23. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +24 -6
  24. package/cjs/data/table/column-header/DataTableColumnHeader.js +22 -27
  25. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  26. package/cjs/data/table/column-header/useTableColumnResize.d.ts +19 -29
  27. package/cjs/data/table/column-header/useTableColumnResize.js +24 -22
  28. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -1
  29. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +1 -1
  30. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js +2 -2
  31. package/cjs/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -1
  32. package/cjs/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  33. package/cjs/data/table/helpers/collectTableRowEntries.js +18 -10
  34. package/cjs/data/table/helpers/collectTableRowEntries.js.map +1 -1
  35. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +13 -11
  36. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +43 -53
  37. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  38. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +9 -8
  39. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +23 -10
  40. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  41. package/cjs/data/table/helpers/selection/selection.types.d.ts +19 -19
  42. package/cjs/data/table/helpers/selection/selection.utils.d.ts +21 -0
  43. package/cjs/data/table/helpers/selection/selection.utils.js +46 -0
  44. package/cjs/data/table/helpers/selection/selection.utils.js.map +1 -0
  45. package/cjs/data/table/helpers/table-focus.d.ts +0 -3
  46. package/cjs/data/table/helpers/table-focus.js +38 -8
  47. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  48. package/cjs/data/table/hooks/useColumnOptions.d.ts +16 -5
  49. package/cjs/data/table/hooks/useColumnOptions.js +26 -8
  50. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -1
  51. package/cjs/data/table/hooks/useGridCache.js +2 -2
  52. package/cjs/data/table/hooks/useGridCache.js.map +1 -1
  53. package/cjs/data/table/hooks/useTableDetailsPanel.d.ts +10 -13
  54. package/cjs/data/table/hooks/useTableDetailsPanel.js +7 -6
  55. package/cjs/data/table/hooks/useTableDetailsPanel.js.map +1 -1
  56. package/cjs/data/table/hooks/useTableItems.d.ts +31 -17
  57. package/cjs/data/table/hooks/useTableItems.js +10 -20
  58. package/cjs/data/table/hooks/useTableItems.js.map +1 -1
  59. package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +1 -6
  60. package/cjs/data/table/hooks/useTableKeyboardNav.js +6 -5
  61. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  62. package/cjs/data/table/hooks/useTableSelection.d.ts +6 -6
  63. package/cjs/data/table/hooks/useTableSelection.js +13 -13
  64. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  65. package/cjs/data/table/hooks/useTableSort.d.ts +2 -2
  66. package/cjs/data/table/hooks/useTableSort.js +4 -5
  67. package/cjs/data/table/hooks/useTableSort.js.map +1 -1
  68. package/cjs/data/table/root/DataTable.types.d.ts +22 -13
  69. package/cjs/data/table/root/DataTableRoot.context.d.ts +13 -7
  70. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  71. package/cjs/data/table/root/DataTableRoot.d.ts +49 -72
  72. package/cjs/data/table/root/DataTableRoot.js +56 -72
  73. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  74. package/cjs/data/table/root/DataTableRoot.legacy.d.ts +2 -7
  75. package/cjs/data/table/root/DataTableRoot.legacy.js +17 -3
  76. package/cjs/data/table/root/DataTableRoot.legacy.js.map +1 -1
  77. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js +4 -4
  78. package/cjs/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -1
  79. package/cjs/data/table/tbody/DataTableTbody.js +4 -2
  80. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  81. package/cjs/data/table/tr/DataTableTr.d.ts +5 -3
  82. package/cjs/data/table/tr/DataTableTr.js +36 -23
  83. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  84. package/cjs/table/ColumnHeader.js +2 -1
  85. package/cjs/table/ColumnHeader.js.map +1 -1
  86. package/esm/data/data-grid/index.d.ts +2 -0
  87. package/esm/data/data-grid/index.js +3 -0
  88. package/esm/data/data-grid/index.js.map +1 -0
  89. package/esm/data/data-grid/root/DataGridRoot.context.d.ts +11 -0
  90. package/esm/data/data-grid/root/DataGridRoot.context.js +7 -0
  91. package/esm/data/data-grid/root/DataGridRoot.context.js.map +1 -0
  92. package/esm/data/data-grid/root/DataGridRoot.d.ts +38 -0
  93. package/esm/data/data-grid/root/DataGridRoot.js +32 -0
  94. package/esm/data/data-grid/root/DataGridRoot.js.map +1 -0
  95. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +11 -13
  96. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  97. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +4 -2
  98. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  99. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +44 -46
  100. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  101. package/esm/data/drag-and-drop/types.d.ts +0 -4
  102. package/esm/data/stories/Data.test-data.d.ts +2 -5
  103. package/esm/data/stories/Data.test-data.js +30 -39
  104. package/esm/data/stories/Data.test-data.js.map +1 -1
  105. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +15 -15
  106. package/esm/data/table/base-cell/DataTableBaseCell.js +4 -8
  107. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -1
  108. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +24 -6
  109. package/esm/data/table/column-header/DataTableColumnHeader.js +23 -28
  110. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -1
  111. package/esm/data/table/column-header/useTableColumnResize.d.ts +19 -29
  112. package/esm/data/table/column-header/useTableColumnResize.js +24 -22
  113. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -1
  114. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.d.ts +1 -1
  115. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js +2 -2
  116. package/esm/data/table/details-panel-row/DataTableDetailsPanelRow.js.map +1 -1
  117. package/esm/data/table/helpers/collectTableRowEntries.d.ts +9 -7
  118. package/esm/data/table/helpers/collectTableRowEntries.js +18 -10
  119. package/esm/data/table/helpers/collectTableRowEntries.js.map +1 -1
  120. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +13 -11
  121. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +43 -53
  122. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  123. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +9 -8
  124. package/esm/data/table/helpers/selection/getSingleSelectProps.js +23 -10
  125. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  126. package/esm/data/table/helpers/selection/selection.types.d.ts +19 -19
  127. package/esm/data/table/helpers/selection/selection.utils.d.ts +21 -0
  128. package/esm/data/table/helpers/selection/selection.utils.js +43 -0
  129. package/esm/data/table/helpers/selection/selection.utils.js.map +1 -0
  130. package/esm/data/table/helpers/table-focus.d.ts +0 -3
  131. package/esm/data/table/helpers/table-focus.js +38 -8
  132. package/esm/data/table/helpers/table-focus.js.map +1 -1
  133. package/esm/data/table/hooks/useColumnOptions.d.ts +16 -5
  134. package/esm/data/table/hooks/useColumnOptions.js +26 -8
  135. package/esm/data/table/hooks/useColumnOptions.js.map +1 -1
  136. package/esm/data/table/hooks/useGridCache.js +2 -2
  137. package/esm/data/table/hooks/useGridCache.js.map +1 -1
  138. package/esm/data/table/hooks/useTableDetailsPanel.d.ts +10 -13
  139. package/esm/data/table/hooks/useTableDetailsPanel.js +7 -6
  140. package/esm/data/table/hooks/useTableDetailsPanel.js.map +1 -1
  141. package/esm/data/table/hooks/useTableItems.d.ts +31 -17
  142. package/esm/data/table/hooks/useTableItems.js +11 -18
  143. package/esm/data/table/hooks/useTableItems.js.map +1 -1
  144. package/esm/data/table/hooks/useTableKeyboardNav.d.ts +1 -6
  145. package/esm/data/table/hooks/useTableKeyboardNav.js +7 -6
  146. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  147. package/esm/data/table/hooks/useTableSelection.d.ts +6 -6
  148. package/esm/data/table/hooks/useTableSelection.js +13 -13
  149. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  150. package/esm/data/table/hooks/useTableSort.d.ts +2 -2
  151. package/esm/data/table/hooks/useTableSort.js +4 -5
  152. package/esm/data/table/hooks/useTableSort.js.map +1 -1
  153. package/esm/data/table/root/DataTable.types.d.ts +22 -13
  154. package/esm/data/table/root/DataTableRoot.context.d.ts +13 -7
  155. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  156. package/esm/data/table/root/DataTableRoot.d.ts +49 -72
  157. package/esm/data/table/root/DataTableRoot.js +58 -74
  158. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  159. package/esm/data/table/root/DataTableRoot.legacy.d.ts +2 -7
  160. package/esm/data/table/root/DataTableRoot.legacy.js +17 -3
  161. package/esm/data/table/root/DataTableRoot.legacy.js.map +1 -1
  162. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js +4 -4
  163. package/esm/data/table/sub-row-toggle/DataTableSubRowToggle.js.map +1 -1
  164. package/esm/data/table/tbody/DataTableTbody.js +4 -2
  165. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  166. package/esm/data/table/tr/DataTableTr.d.ts +5 -3
  167. package/esm/data/table/tr/DataTableTr.js +35 -23
  168. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  169. package/esm/table/ColumnHeader.js +2 -1
  170. package/esm/table/ColumnHeader.js.map +1 -1
  171. package/package.json +8 -7
  172. package/src/data/data-grid/index.ts +3 -0
  173. package/src/data/data-grid/root/DataGridRoot.context.ts +16 -0
  174. package/src/data/data-grid/root/DataGridRoot.tsx +71 -0
  175. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +11 -17
  176. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
  177. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +63 -52
  178. package/src/data/drag-and-drop/types.ts +0 -5
  179. package/src/data/stories/Data.test-data.tsx +52 -44
  180. package/src/data/table/agent-component-review.md +175 -0
  181. package/src/data/table/base-cell/DataTableBaseCell.tsx +31 -21
  182. package/src/data/table/column-header/DataTableColumnHeader.tsx +63 -58
  183. package/src/data/table/column-header/useTableColumnResize.ts +55 -71
  184. package/src/data/table/details-panel-row/DataTableDetailsPanelRow.tsx +7 -3
  185. package/src/data/table/helpers/collectTableRowEntries.ts +32 -19
  186. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +65 -85
  187. package/src/data/table/helpers/selection/getSingleSelectProps.ts +35 -17
  188. package/src/data/table/helpers/selection/selection.types.ts +19 -19
  189. package/src/data/table/helpers/selection/selection.utils.test.ts +161 -0
  190. package/src/data/table/helpers/selection/selection.utils.ts +73 -0
  191. package/src/data/table/helpers/table-focus.ts +63 -9
  192. package/src/data/table/hooks/__tests__/useTableItems.test.ts +48 -8
  193. package/src/data/table/hooks/useColumnOptions.ts +48 -14
  194. package/src/data/table/hooks/useGridCache.ts +3 -2
  195. package/src/data/table/hooks/useTableDetailsPanel.tsx +25 -25
  196. package/src/data/table/hooks/useTableItems.ts +51 -42
  197. package/src/data/table/hooks/useTableKeyboardNav.ts +7 -15
  198. package/src/data/table/hooks/useTableSelection.ts +26 -31
  199. package/src/data/table/hooks/useTableSort.ts +10 -9
  200. package/src/data/table/root/DataTable.types.ts +30 -25
  201. package/src/data/table/root/DataTableRoot.context.ts +19 -7
  202. package/src/data/table/root/DataTableRoot.legacy.tsx +22 -14
  203. package/src/data/table/root/DataTableRoot.tsx +271 -320
  204. package/src/data/table/sub-row-toggle/DataTableSubRowToggle.tsx +5 -4
  205. package/src/data/table/tbody/DataTableTbody.tsx +6 -2
  206. package/src/data/table/tr/DataTableTr.tsx +98 -35
  207. package/src/table/ColumnHeader.tsx +2 -1
  208. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +0 -22
  209. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +0 -35
  210. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  211. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  212. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js +0 -86
  213. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  214. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  215. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -6
  216. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  217. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  218. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js +0 -108
  219. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  220. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +0 -46
  221. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js +0 -112
  222. package/cjs/data/table/helpers/selection/SelectionSubtreeHelper.js.map +0 -1
  223. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +0 -22
  224. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +0 -29
  225. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +0 -1
  226. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +0 -27
  227. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js +0 -50
  228. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +0 -1
  229. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +0 -5
  230. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js +0 -3
  231. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +0 -1
  232. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +0 -24
  233. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js +0 -68
  234. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +0 -1
  235. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.d.ts +0 -46
  236. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js +0 -109
  237. package/esm/data/table/helpers/selection/SelectionSubtreeHelper.js.map +0 -1
  238. package/src/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx +0 -104
  239. package/src/data/drag-and-drop-old/item/DataDragAndDropItem.tsx +0 -74
  240. package/src/data/drag-and-drop-old/root/DataDragAndDrop.context.tsx +0 -11
  241. package/src/data/drag-and-drop-old/root/DataDragAndDropRoot.tsx +0 -96
  242. package/src/data/table/helpers/selection/SelectionSubtreeHelper.test.ts +0 -66
  243. package/src/data/table/helpers/selection/SelectionSubtreeHelper.ts +0 -162
  244. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +0 -488
@@ -1,9 +1,7 @@
1
- /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
2
1
  import React, {
3
2
  forwardRef,
4
3
  useCallback,
5
4
  useEffect,
6
- useMemo,
7
5
  useRef,
8
6
  useState,
9
7
  } from "react";
@@ -12,6 +10,7 @@ import { useId } from "../../../utils-external";
12
10
  import { Slot } from "../../../utils/components/slot/Slot";
13
11
  import { cl } from "../../../utils/helpers";
14
12
  import { useMergeRefs } from "../../../utils/hooks";
13
+ import { useDataGridContext } from "../../data-grid/root/DataGridRoot.context";
15
14
  import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
16
15
  import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
17
16
  import { DataTableDetailsPanelRow } from "../details-panel-row/DataTableDetailsPanelRow";
@@ -21,12 +20,7 @@ import {
21
20
  DataTableDetailsPanelProvider,
22
21
  type DetailsPanelProps,
23
22
  } from "../hooks/useTableDetailsPanel";
24
- import {
25
- type SubRowsProps,
26
- TableItemsProvider,
27
- useTableItems,
28
- useTableItemsContext,
29
- } from "../hooks/useTableItems";
23
+ import { type SubRowsProps, useTableItems } from "../hooks/useTableItems";
30
24
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
31
25
  import {
32
26
  type SelectionProps,
@@ -38,14 +32,29 @@ import { DataTableSubRowToggle } from "../sub-row-toggle/DataTableSubRowToggle";
38
32
  import { DataTableTbody } from "../tbody/DataTableTbody";
39
33
  import { DataTableThead } from "../thead/DataTableThead";
40
34
  import { DataTableTr } from "../tr/DataTableTr";
41
- import type { ColumnDefinitions } from "./DataTable.types";
35
+ import type {
36
+ DataTableLoadingConfig,
37
+ TableRowEntryId,
38
+ } from "./DataTable.types";
42
39
  import {
43
40
  DataTableContextProvider,
44
41
  useDataTableContext,
45
42
  } from "./DataTableRoot.context";
46
43
 
47
- interface DataTableProps<T>
48
- extends React.HTMLAttributes<HTMLTableElement>, TableSortOptions {
44
+ /**
45
+ * TODO: For consideration:
46
+ * - Use namespacing for types. There will be a lot of standalone types connected to this component,
47
+ * it could make sense to access them under DataTable.X instead of separate imports.
48
+ * - Consider having a "Wrapper" component that only handles context and logic like,
49
+ * "DataTableRoot" or "DataGrid" or something, and then have the main "DataTable" component only handle rendering of table itself.
50
+ * This would make props more focused and discoverable since its not mixed with htmltable-props.
51
+ */
52
+
53
+ /**
54
+ * TODO:
55
+ * - Test `onColumnDefinitionChange` callback that is called when resize, sort, order etc changes
56
+ */
57
+ interface DataTableProps<T> extends React.HTMLAttributes<HTMLTableElement> {
49
58
  children?: never;
50
59
  /**
51
60
  * Controls vertical cell padding.
@@ -60,21 +69,16 @@ interface DataTableProps<T>
60
69
  /**
61
70
  * Truncate content in cells and show ellipsis for overflowed text.
62
71
  *
63
- * **NB:** When using `layout="auto"`, you have to manually set a `maxWidth` on columns that should be truncated.
64
- * @default true
72
+ * **NB:** When using this together with `layout="auto"`,
73
+ * you have to manually set a `maxWidth` on columns that should be truncated.
74
+ * @default false if layout="auto", else true
65
75
  */
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.
76
+ truncateContent?: boolean;
67
77
  /**
68
78
  * Enables keyboard navigation for table rows and cells.
69
79
  * @default true
70
80
  */
71
81
  withKeyboardNav?: boolean;
72
- /**
73
- * Custom callback to determine if navigation should be blocked.
74
- * Called before default blocking logic.
75
- * Requires `withKeyboardNav` to be `true`.
76
- */
77
- shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
78
82
  /**
79
83
  * Controls table layout.
80
84
  *
@@ -90,35 +94,14 @@ interface DataTableProps<T>
90
94
  * @default "fixed"
91
95
  */
92
96
  layout?: "fixed" | "auto";
93
- /**
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.
98
- */
99
- columnDefinitions: ColumnDefinitions<T>;
100
- /**
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`.
105
- */
106
- data: T[];
107
- /**
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.
112
- */
113
- getRowId?: (rowData: T, index: number) => string | number;
114
97
  /**
115
98
  * Sticky columns that remain visible when horizontally scrolling the table.
116
99
  *
117
100
  * You can specify 1 sticky column on the left and 1 on the right.
118
101
  */
119
102
  stickyColumns?: {
120
- first?: "1";
121
- last?: "1";
103
+ start?: "1";
104
+ end?: "1";
122
105
  };
123
106
  /**
124
107
  * @default true
@@ -129,219 +112,167 @@ interface DataTableProps<T>
129
112
  * Not called when clicking header, loading, or empty-state rows.
130
113
  */
131
114
  onRowClick?: (
132
- rowId: string | number,
115
+ rowId: TableRowEntryId,
133
116
  event: React.MouseEvent<HTMLTableRowElement>,
134
117
  ) => void;
135
118
  /**
136
119
  * Content to render when `data` is empty.
137
120
  * Rendered inside a `DataTable.EmptyState` row spanning all columns.
138
121
  */
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
-
122
+ emptyContent?: React.ReactNode;
170
123
  /**
171
- * Function to get sub-rows for a given row, used for nested rows.
172
- * When provided, an expand toggle column is added automatically.
124
+ * Configures how the table behaves during loading.
173
125
  *
174
- *
175
- * TODO:
176
- * - Table might need to be implemented with role="treegrid" for a11y when having nested rows.
126
+ * Use `variant` to select the loading strategy:
127
+ * - `"content"` — renders custom content inside a full-width row.
128
+ * - `"skeleton"` renders skeleton placeholder rows.
129
+ * - `"overlay"` — keeps existing data visible with a loading overlay.
130
+ */
131
+ loading?: DataTableLoadingConfig;
132
+ /**
133
+ * Adjusts font-size
134
+ * @default "medium"
135
+ */
136
+ textSize?: "small" | "medium";
137
+ /**
138
+ * Object with props related to row selection.
139
+ */
140
+ selection?: SelectionProps<T>;
141
+ /**
142
+ * Object with props related to nested rows (sub-rows).
143
+ */
144
+ subRows?: SubRowsProps<T>; // TODO: Table might need to be implemented with role="treegrid" for a11y when having nested rows.
145
+ /**
146
+ * Object with props related to details panel.
147
+ * This is a panel that can be expanded below each row to show arbitrary content.
177
148
  */
178
- selection?: SelectionProps;
179
- subRows?: SubRowsProps<T>;
180
149
  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
150
  /**
218
- * TODO:
219
- * - If user currently does not give a getRowsId function, and data is nested (getSubRows)
220
- * we end up in an infinite loop since the index based ids repeat for children and causes chaos.
151
+ * Object with props related to sorting.
221
152
  */
222
- const tableItems = useTableItems({
223
- items: data,
224
- getRowId: getRowId ?? ((_, index) => index),
225
- subRows,
226
- });
227
-
228
- const tableSelectionState = useTableSelection({
229
- selection,
230
- visibleRowIds: tableItems.visibleRowIds,
231
- childRowIdsById: tableItems.childRowIdsById,
232
- });
153
+ sorting?: TableSortOptions;
154
+ }
233
155
 
234
- const { columns, stickySelection } = useColumnOptions<T>(columnDefinitions, {
235
- stickyColumns,
236
- selectionMode: tableSelectionState.selection.selectionMode,
237
- });
156
+ const DataTableInternal = forwardRef<HTMLTableElement, DataTableProps<any>>(
157
+ (
158
+ {
159
+ className,
160
+ id,
161
+ rowDensity = "normal",
162
+ textSize = "medium",
163
+ withKeyboardNav = true,
164
+ zebraStripes = false,
165
+ truncateContent: truncateContentProp,
166
+ layout = "fixed",
167
+ stickyColumns,
168
+ stickyHeader = true,
169
+ onRowClick,
170
+ emptyContent,
171
+ selection,
172
+ loading,
173
+ detailsPanel,
174
+ subRows,
175
+ sorting,
176
+ ...rest
177
+ }: DataTableProps<any>, // Have to use <any> for docgen to work
178
+ forwardedRef,
179
+ ) => {
180
+ const { columnDefinitions, data, getRowId } = useDataGridContext();
181
+
182
+ const sortingState = useTableSort(sorting);
183
+
184
+ const tableItems = useTableItems({
185
+ items: data,
186
+ getRowId,
187
+ subRows,
188
+ });
238
189
 
239
- const {
240
- isLoading = false,
241
- loadingState,
242
- loadingRows,
243
- loadingLabel = "Laster innhold",
244
- } = loading || {};
190
+ const tableSelectionState = useTableSelection({
191
+ selection,
192
+ tableItems,
193
+ });
245
194
 
246
- const fullWidthColSpan = useMemo(() => {
247
- return (
248
- columns.length +
249
- (layout === "fixed" ? 1 : 0) +
250
- (tableSelectionState.selection.selectionMode !== "none" ? 1 : 0) +
251
- (detailsPanel?.getContent ? 1 : 0)
195
+ const { columns, stickyStart, totalColSpan } = useColumnOptions(
196
+ columnDefinitions,
197
+ {
198
+ stickyColumns,
199
+ hasSelection: tableSelectionState.selection.selectionMode !== "none",
200
+ hasDetailsPanel: !!detailsPanel?.getContent,
201
+ layout,
202
+ },
252
203
  );
253
- }, [
254
- columns,
255
- layout,
256
- tableSelectionState.selection.selectionMode,
257
- detailsPanel,
258
- ]);
259
204
 
260
- const tableId = useId(id);
205
+ const tableId = useId(id);
261
206
 
262
- return (
263
- <DataTableContextProvider
264
- layout={layout}
265
- withKeyboardNav={withKeyboardNav}
266
- selectionState={tableSelectionState}
267
- stickySelection={stickySelection}
268
- stickyHeader={stickyHeader}
269
- tableId={tableId}
270
- showLoadingSkeletons={isLoading && loadingState == null}
271
- onRowClick={onRowClick}
272
- isLoading={isLoading}
273
- showLoadingOverlay={isLoading && !loadingState && !loadingRows}
274
- columns={columns}
275
- fullWidthColSpan={fullWidthColSpan}
276
- >
277
- <TableItemsProvider
278
- itemDetails={tableItems.itemDetails}
279
- items={tableItems.items}
280
- onExpandedRowIdsChange={tableItems.onExpandedRowIdsChange}
281
- isSubRowExpanded={tableItems.isSubRowExpanded}
207
+ const truncateContent = truncateContentProp ?? layout !== "auto";
208
+
209
+ return (
210
+ <DataTableContextProvider
211
+ layout={layout}
212
+ withKeyboardNav={withKeyboardNav}
213
+ selectionState={tableSelectionState}
214
+ stickyStart={stickyStart}
215
+ stickyHeader={stickyHeader}
216
+ tableId={tableId}
217
+ loading={loading}
218
+ onRowClick={onRowClick}
219
+ columns={columns}
220
+ totalColSpan={totalColSpan}
221
+ tableItems={tableItems}
222
+ sortingState={sortingState}
282
223
  >
283
- <DataTableDetailsPanelProvider detailsPanel={detailsPanel}>
284
- <TableElementWrapper
285
- shouldBlockNavigation={shouldBlockNavigation}
286
- enabled={withKeyboardNav}
224
+ <TableElementWrapper enabled={withKeyboardNav}>
225
+ <table
226
+ {...rest}
227
+ ref={forwardedRef}
228
+ className={cl("aksel-data-table", className)}
229
+ data-zebra-stripes={zebraStripes}
230
+ data-truncate-content={truncateContent}
231
+ data-density={rowDensity}
232
+ data-text-size={textSize}
233
+ data-layout={layout}
234
+ data-loading={loading?.isLoading || undefined}
235
+ aria-busy={loading?.isLoading || undefined}
287
236
  >
288
- <table
289
- {...rest}
290
- ref={forwardedRef}
291
- className={cl("aksel-data-table", className)}
292
- data-zebra-stripes={zebraStripes}
293
- data-truncate-content={truncateContent}
294
- data-density={rowDensity}
295
- data-layout={layout}
296
- data-loading={isLoading || undefined}
297
- aria-busy={isLoading || undefined}
298
- >
237
+ <DataTableDetailsPanelProvider detailsPanel={detailsPanel}>
299
238
  <DataTableThead>
300
239
  <DataTableTr>
301
- {columns.map(({ isSticky, colDef }) => {
302
- const sortEntry = sortState.find(
303
- (s) => s.columnId === colDef.id,
304
- );
305
- const sortDirection = sortEntry?.direction ?? "none";
306
- return (
307
- <DataTableColumnHeader
308
- resizable={colDef.resizable}
309
- width={colDef.width}
310
- defaultWidth={colDef.defaultWidth}
311
- autoWidth={colDef.autoWidth}
312
- minWidth={colDef.minWidth}
313
- maxWidth={colDef.maxWidth}
314
- onWidthChange={colDef.onWidthChange}
315
- textAlign={colDef.align ?? "left"}
316
- key={colDef.id}
317
- isSticky={isSticky}
318
- sortable={colDef.sortable}
319
- sortDirection={sortDirection}
320
- onSortClick={(event) => onSortClick(colDef.id, event)}
321
- label={colDef.label}
322
- >
323
- {colDef.header ?? colDef.label}
324
- </DataTableColumnHeader>
325
- );
326
- })}
240
+ {columns.map(
241
+ ({ isSticky, isStickyLast, stickyLeftOffset, colDef }) => {
242
+ return (
243
+ <DataTableColumnHeader
244
+ id={colDef.id}
245
+ width={colDef.width}
246
+ textAlign={colDef.align ?? "left"}
247
+ key={colDef.id}
248
+ isSticky={isSticky}
249
+ sortable={colDef.sortable}
250
+ label={colDef.label}
251
+ style={
252
+ stickyLeftOffset
253
+ ? { left: stickyLeftOffset }
254
+ : undefined
255
+ }
256
+ data-sticky-last={isStickyLast || undefined}
257
+ >
258
+ {colDef.header ?? colDef.label}
259
+ </DataTableColumnHeader>
260
+ );
261
+ },
262
+ )}
327
263
  </DataTableTr>
328
264
  </DataTableThead>
329
265
 
330
266
  <DataTableTbody>
331
- <DataTableTBodyContent
332
- loadingState={loadingState}
333
- loadingRows={loadingRows}
334
- loadingLabel={loadingLabel}
335
- emptyState={emptyState}
336
- />
267
+ <DataTableTBodyContent emptyContent={emptyContent} />
337
268
  </DataTableTbody>
338
- </table>
339
- </TableElementWrapper>
340
- </DataTableDetailsPanelProvider>
341
- </TableItemsProvider>
342
- </DataTableContextProvider>
343
- );
344
- }
269
+ </DataTableDetailsPanelProvider>
270
+ </table>
271
+ </TableElementWrapper>
272
+ </DataTableContextProvider>
273
+ );
274
+ },
275
+ );
345
276
 
346
277
  /**
347
278
  * Temp optimization to avoid re-renders on every keyboard-move, selection change etc
@@ -349,10 +280,8 @@ function DataTableInner<T>(
349
280
  function TableElementWrapper({
350
281
  children,
351
282
  enabled,
352
- shouldBlockNavigation,
353
283
  }: {
354
284
  children: React.ReactNode;
355
- shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
356
285
  enabled: boolean;
357
286
  }) {
358
287
  const [applyStickyStyles, setApplyStickyStyles] = useState<boolean>(false);
@@ -362,7 +291,6 @@ function TableElementWrapper({
362
291
  const rafRef = useRef<number | null>(null);
363
292
  const { tabIndex, setTableRef } = useTableKeyboardNav({
364
293
  enabled,
365
- shouldBlockNavigation,
366
294
  });
367
295
 
368
296
  const mergedTableRefs = useMergeRefs(tableRef, setTableRef);
@@ -389,37 +317,40 @@ function TableElementWrapper({
389
317
  });
390
318
  }, [updateStickyStyles]);
391
319
 
392
- useEffect(() => {
393
- const tableWrapperElement = tableWrapperRef.current;
320
+ useEffect(
321
+ function observeAndUpdateStickyStyles() {
322
+ const tableWrapperElement = tableWrapperRef.current;
394
323
 
395
- if (!tableWrapperElement) {
396
- return;
397
- }
324
+ if (!tableWrapperElement) {
325
+ return;
326
+ }
398
327
 
399
- const handleResize = () => scheduleStickyStylesUpdate();
328
+ const handleResize = () => scheduleStickyStylesUpdate();
400
329
 
401
- window.addEventListener("resize", handleResize);
330
+ window.addEventListener("resize", handleResize);
402
331
 
403
- let resizeObserver: ResizeObserver | undefined;
404
- if (typeof ResizeObserver !== "undefined") {
405
- resizeObserver = new ResizeObserver(handleResize);
406
- resizeObserver.observe(tableWrapperElement);
407
- if (tableRef.current) {
408
- resizeObserver.observe(tableRef.current);
332
+ let resizeObserver: ResizeObserver | undefined;
333
+ if (typeof ResizeObserver !== "undefined") {
334
+ resizeObserver = new ResizeObserver(handleResize);
335
+ resizeObserver.observe(tableWrapperElement);
336
+ if (tableRef.current) {
337
+ resizeObserver.observe(tableRef.current);
338
+ }
409
339
  }
410
- }
411
340
 
412
- scheduleStickyStylesUpdate();
341
+ scheduleStickyStylesUpdate();
413
342
 
414
- return () => {
415
- window.removeEventListener("resize", handleResize);
416
- resizeObserver?.disconnect();
417
- if (rafRef.current !== null) {
418
- cancelAnimationFrame(rafRef.current);
419
- rafRef.current = null;
420
- }
421
- };
422
- }, [scheduleStickyStylesUpdate]);
343
+ return () => {
344
+ window.removeEventListener("resize", handleResize);
345
+ resizeObserver?.disconnect();
346
+ if (rafRef.current !== null) {
347
+ cancelAnimationFrame(rafRef.current);
348
+ rafRef.current = null;
349
+ }
350
+ };
351
+ },
352
+ [scheduleStickyStylesUpdate],
353
+ );
423
354
 
424
355
  return (
425
356
  <div className="aksel-data-table__border-wrapper">
@@ -438,76 +369,86 @@ function TableElementWrapper({
438
369
  }
439
370
 
440
371
  interface DataTableTBodyContentProps {
441
- loadingState: React.ReactNode;
442
- loadingLabel: string;
443
- loadingRows?: number;
444
- emptyState: React.ReactNode;
372
+ emptyContent: React.ReactNode;
445
373
  }
446
374
 
447
- function DataTableTBodyContent({
448
- loadingState,
449
- loadingRows,
450
- loadingLabel,
451
- emptyState,
452
- }: DataTableTBodyContentProps) {
453
- const { items, itemDetails } = useTableItemsContext();
454
- const { columns, isLoading, fullWidthColSpan } = useDataTableContext();
375
+ function DataTableTBodyContent({ emptyContent }: DataTableTBodyContentProps) {
376
+ const { columns, loading, totalColSpan, tableItems } = useDataTableContext();
455
377
 
456
- if (isLoading && loadingState != null) {
378
+ if (loading?.isLoading && loading?.variant === "content") {
457
379
  return (
458
- <DataTableLoadingState colSpan={fullWidthColSpan}>
459
- {loadingState}
380
+ <DataTableLoadingState colSpan={totalColSpan}>
381
+ {loading.content}
460
382
  </DataTableLoadingState>
461
383
  );
462
384
  }
463
385
 
464
- if (isLoading && loadingRows) {
386
+ if (loading?.isLoading && loading?.variant === "skeleton") {
387
+ const rows = loading.rows ?? 5;
388
+ const label = loading.label ?? "Laster innhold";
465
389
  return (
466
390
  <>
467
391
  <tr>
468
- <td colSpan={fullWidthColSpan} className="aksel-sr-only">
469
- {loadingLabel}
392
+ <td colSpan={totalColSpan} className="aksel-sr-only">
393
+ {label}
470
394
  </td>
471
395
  </tr>
472
- {Array.from({ length: loadingRows }, (_, rowIndex) => (
396
+ {Array.from({ length: rows }, (_, rowIndex) => (
473
397
  <DataTableTr key={`skeleton-row-${rowIndex}`} aria-hidden>
474
- {columns.map(({ isSticky, colDef }, colDefIndex) => (
475
- <DataTableBaseCell
476
- textAlign={colDef.align ?? "left"}
477
- key={colDef.id || colDefIndex}
478
- as={colDef.isRowHeader ? "th" : "td"}
479
- isSticky={isSticky}
480
- >
481
- <Skeleton variant="text" />
482
- </DataTableBaseCell>
483
- ))}
398
+ {columns.map(
399
+ (
400
+ { isSticky, isStickyLast, stickyLeftOffset, colDef },
401
+ colDefIndex,
402
+ ) => (
403
+ <DataTableBaseCell
404
+ textAlign={colDef.align ?? "left"}
405
+ key={colDef.id || colDefIndex}
406
+ as={colDef.isRowHeader ? "th" : "td"}
407
+ isSticky={isSticky}
408
+ style={
409
+ stickyLeftOffset ? { left: stickyLeftOffset } : undefined
410
+ }
411
+ data-sticky-last={isStickyLast || undefined}
412
+ >
413
+ <Skeleton variant="text" />
414
+ </DataTableBaseCell>
415
+ ),
416
+ )}
484
417
  </DataTableTr>
485
418
  ))}
486
419
  </>
487
420
  );
488
421
  }
489
422
 
490
- if (items.length === 0 && emptyState !== undefined) {
423
+ if (tableItems.items.length === 0 && emptyContent !== undefined) {
491
424
  return (
492
- <DataTableEmptyState colSpan={fullWidthColSpan}>
493
- {emptyState}
425
+ <DataTableEmptyState colSpan={totalColSpan}>
426
+ {emptyContent}
494
427
  </DataTableEmptyState>
495
428
  );
496
429
  }
497
430
 
498
- const renderLoadingAnnouncement = isLoading && !loadingState && !loadingRows;
431
+ const renderLoadingAnnouncement =
432
+ loading?.isLoading && loading?.variant === "overlay";
433
+
434
+ const overlayLabel =
435
+ loading?.variant === "overlay"
436
+ ? (loading.label ?? "Laster innhold")
437
+ : "Laster innhold";
499
438
 
500
439
  return (
501
440
  <>
502
441
  {renderLoadingAnnouncement && (
503
442
  <tr>
504
- <td colSpan={fullWidthColSpan} className="aksel-sr-only">
505
- {loadingLabel}
443
+ <td colSpan={totalColSpan} className="aksel-sr-only">
444
+ {overlayLabel}
506
445
  </td>
507
446
  </tr>
508
447
  )}
509
- {items.map((rowData) => {
510
- const details = itemDetails.get(rowData);
448
+ {tableItems.items.map((rowData, rowIndex) => {
449
+ const rowId = tableItems.visibleRowIds[rowIndex];
450
+ const details =
451
+ rowId != null ? tableItems.itemDetails.get(rowId) : undefined;
511
452
 
512
453
  /* Should in theory be impossible. Look about typing this? */
513
454
  if (!details) {
@@ -519,31 +460,40 @@ function DataTableTBodyContent({
519
460
  return (
520
461
  <React.Fragment key={details.id}>
521
462
  <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
- })}
463
+ {columns.map(
464
+ (
465
+ { isSticky, isStickyLast, stickyLeftOffset, colDef },
466
+ colDefIndex,
467
+ ) => {
468
+ const renderNestedToggle = colDefIndex === 0 && hasSubRows;
469
+ const renderNestedIndent =
470
+ colDefIndex === 0 && (details.level > 0 || hasSubRows);
471
+
472
+ const style: React.CSSProperties = {
473
+ "--__axc-data-table-nested-depth": details.level,
474
+ ...(stickyLeftOffset ? { left: stickyLeftOffset } : {}),
475
+ };
476
+
477
+ return (
478
+ <DataTableBaseCell
479
+ textAlign={colDef.align ?? "left"}
480
+ key={colDef.id || colDefIndex}
481
+ as={colDef.isRowHeader ? "th" : "td"}
482
+ isSticky={isSticky}
483
+ data-nested={renderNestedIndent || undefined}
484
+ data-sticky-last={isStickyLast || undefined}
485
+ style={style}
486
+ beforeContent={
487
+ renderNestedToggle ? (
488
+ <DataTableSubRowToggle details={details} />
489
+ ) : undefined
490
+ }
491
+ >
492
+ {colDef.cell(rowData)}
493
+ </DataTableBaseCell>
494
+ );
495
+ },
496
+ )}
547
497
  </DataTableTr>
548
498
  <DataTableDetailsPanelRow rowId={details.id} rowData={rowData} />
549
499
  </React.Fragment>
@@ -553,10 +503,11 @@ function DataTableTBodyContent({
553
503
  );
554
504
  }
555
505
 
556
- const DataTable = forwardRef(DataTableInner) as <T>(
506
+ const DataTable = DataTableInternal as <T>(
557
507
  props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
558
508
  ) => React.ReactElement | null;
559
509
 
560
- export { DataTable };
510
+ // docgen doesn't work well with type params, so we let it use DataTableInternal instead
511
+ export { DataTable, DataTableInternal };
561
512
  export type { DataTableProps };
562
513
  export default DataTable;