@navikt/ds-react 8.9.1 → 8.10.1

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 (408) hide show
  1. package/cjs/alert/base-alert/content/BaseAlertContent.js +4 -1
  2. package/cjs/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  3. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
  5. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  6. package/cjs/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
  7. package/cjs/data/drag-and-drop/item/DragAndDropItem.js +6 -4
  8. package/cjs/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  9. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
  10. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
  11. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +73 -46
  12. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  13. package/cjs/data/drag-and-drop/types.d.ts +4 -0
  14. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  15. package/cjs/data/table/base-cell/DataTableBaseCell.js +63 -0
  16. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  17. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
  18. package/cjs/data/table/column-header/DataTableColumnHeader.js +107 -0
  19. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  20. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -0
  21. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  22. package/cjs/data/table/empty-state/DataTableEmptyState.js +2 -2
  23. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  24. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
  25. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  26. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  27. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
  28. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +8 -12
  29. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  30. package/cjs/data/table/helpers/selection/selection.types.d.ts +39 -16
  31. package/cjs/data/table/helpers/table-keyboard.js +3 -0
  32. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  33. package/cjs/data/table/hooks/useColumnOptions.d.ts +19 -0
  34. package/cjs/data/table/hooks/useColumnOptions.js +19 -0
  35. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -0
  36. package/cjs/data/table/hooks/useTableExpansion.d.ts +26 -0
  37. package/cjs/data/table/hooks/useTableExpansion.js +68 -0
  38. package/cjs/data/table/hooks/useTableExpansion.js.map +1 -0
  39. package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  40. package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -1
  41. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  42. package/cjs/data/table/hooks/useTableSelection.d.ts +14 -7
  43. package/cjs/data/table/hooks/useTableSelection.js +40 -27
  44. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  45. package/cjs/data/table/hooks/useTableSort.d.ts +37 -0
  46. package/cjs/data/table/hooks/useTableSort.js +49 -0
  47. package/cjs/data/table/hooks/useTableSort.js.map +1 -0
  48. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  49. package/cjs/data/table/loading-state/DataTableLoadingState.js +2 -2
  50. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  51. package/cjs/data/table/root/DataTable.types.d.ts +55 -4
  52. package/cjs/data/table/root/DataTableAuto.d.ts +97 -1
  53. package/cjs/data/table/root/DataTableAuto.js +92 -39
  54. package/cjs/data/table/root/DataTableAuto.js.map +1 -1
  55. package/cjs/data/table/root/DataTableRoot.context.d.ts +22 -1
  56. package/cjs/data/table/root/DataTableRoot.context.js +7 -1
  57. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  58. package/cjs/data/table/root/DataTableRoot.d.ts +0 -6
  59. package/cjs/data/table/root/DataTableRoot.js +5 -4
  60. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  61. package/cjs/data/table/tbody/DataTableTbody.js +7 -1
  62. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  63. package/cjs/data/table/td/DataTableTd.d.ts +3 -23
  64. package/cjs/data/table/td/DataTableTd.js +3 -7
  65. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  66. package/cjs/data/table/tfoot/DataTableTfoot.js +3 -1
  67. package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -1
  68. package/cjs/data/table/th/DataTableTh.d.ts +3 -48
  69. package/cjs/data/table/th/DataTableTh.js +3 -57
  70. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  71. package/cjs/data/table/thead/DataTableThead.js +2 -2
  72. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  73. package/cjs/data/table/tr/DataTableTr.d.ts +8 -0
  74. package/cjs/data/table/tr/DataTableTr.js +131 -9
  75. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  76. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  77. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  78. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  79. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  80. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  81. package/cjs/date/datepicker/parts/DatePicker.RDP.js +26 -11
  82. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  83. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  84. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  85. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  86. package/cjs/dialog/popup/DialogPopupInternal.js +1 -1
  87. package/cjs/dialog/popup/DialogPopupInternal.js.map +1 -1
  88. package/cjs/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  89. package/cjs/form/checkbox/CheckboxGroup.context.js +6 -0
  90. package/cjs/form/checkbox/CheckboxGroup.context.js.map +1 -0
  91. package/cjs/form/checkbox/CheckboxGroup.d.ts +0 -6
  92. package/cjs/form/checkbox/CheckboxGroup.js +8 -8
  93. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  94. package/cjs/form/checkbox/useCheckbox.js +2 -2
  95. package/cjs/form/checkbox/useCheckbox.js.map +1 -1
  96. package/cjs/form/combobox/ComboboxWrapper.js +1 -3
  97. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  98. package/cjs/form/error-summary/ErrorSummary.js +1 -3
  99. package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
  100. package/cjs/form/fieldset/Fieldset.d.ts +0 -4
  101. package/cjs/form/fieldset/Fieldset.js +3 -3
  102. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  103. package/cjs/form/fieldset/useFieldset.d.ts +5 -3
  104. package/cjs/form/fieldset/useFieldset.js +9 -4
  105. package/cjs/form/fieldset/useFieldset.js.map +1 -1
  106. package/cjs/form/radio/RadioGroup.context.d.ts +8 -0
  107. package/cjs/form/radio/RadioGroup.context.js +6 -0
  108. package/cjs/form/radio/RadioGroup.context.js.map +1 -0
  109. package/cjs/form/radio/RadioGroup.d.ts +0 -8
  110. package/cjs/form/radio/RadioGroup.js +10 -10
  111. package/cjs/form/radio/RadioGroup.js.map +1 -1
  112. package/cjs/form/radio/useRadio.js +2 -2
  113. package/cjs/form/radio/useRadio.js.map +1 -1
  114. package/cjs/form/search/Search.js +1 -3
  115. package/cjs/form/search/Search.js.map +1 -1
  116. package/cjs/inline-message/root/InlineMessage.js +2 -5
  117. package/cjs/inline-message/root/InlineMessage.js.map +1 -1
  118. package/cjs/modal/Modal.js +4 -6
  119. package/cjs/modal/Modal.js.map +1 -1
  120. package/cjs/modal/ModalUtils.js +1 -1
  121. package/cjs/modal/ModalUtils.js.map +1 -1
  122. package/cjs/modal/types.d.ts +1 -0
  123. package/cjs/primitives/box/Box.d.ts +1 -1
  124. package/cjs/process/Process.js +1 -5
  125. package/cjs/process/Process.js.map +1 -1
  126. package/cjs/tabs/useTabs.js +3 -7
  127. package/cjs/tabs/useTabs.js.map +1 -1
  128. package/cjs/timeline/Timeline.js +25 -62
  129. package/cjs/timeline/Timeline.js.map +1 -1
  130. package/cjs/timeline/TimelineRow.js +10 -14
  131. package/cjs/timeline/TimelineRow.js.map +1 -1
  132. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  133. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js +179 -0
  134. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  135. package/cjs/timeline/hooks/usePeriodContext.d.ts +0 -1
  136. package/cjs/timeline/hooks/usePeriodContext.js +0 -1
  137. package/cjs/timeline/hooks/usePeriodContext.js.map +1 -1
  138. package/cjs/timeline/hooks/useRowContext.d.ts +0 -1
  139. package/cjs/timeline/hooks/useRowContext.js +0 -1
  140. package/cjs/timeline/hooks/useRowContext.js.map +1 -1
  141. package/cjs/timeline/hooks/useTimelineContext.d.ts +0 -4
  142. package/cjs/timeline/hooks/useTimelineContext.js +0 -4
  143. package/cjs/timeline/hooks/useTimelineContext.js.map +1 -1
  144. package/cjs/timeline/period/ClickablePeriod.js +6 -20
  145. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  146. package/cjs/timeline/period/NonClickablePeriod.js +1 -1
  147. package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
  148. package/cjs/timeline/pin/PinInternal.js +9 -10
  149. package/cjs/timeline/pin/PinInternal.js.map +1 -1
  150. package/cjs/toggle-group/useToggleGroup.js +1 -1
  151. package/cjs/toggle-group/useToggleGroup.js.map +1 -1
  152. package/cjs/utils/components/HighlightText/HighlightText.js +1 -4
  153. package/cjs/utils/components/HighlightText/HighlightText.js.map +1 -1
  154. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  155. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  156. package/cjs/utils/helpers/create-strict-context.js +1 -1
  157. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  158. package/cjs/utils/hooks/useEventCallback.js +1 -1
  159. package/cjs/utils/hooks/useEventCallback.js.map +1 -1
  160. package/cjs/utils/hooks/useMedia.js +1 -1
  161. package/cjs/utils/hooks/useMedia.js.map +1 -1
  162. package/esm/alert/base-alert/content/BaseAlertContent.js +4 -1
  163. package/esm/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  164. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
  165. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
  166. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  167. package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
  168. package/esm/data/drag-and-drop/item/DragAndDropItem.js +6 -4
  169. package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  170. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
  171. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
  172. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +74 -47
  173. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  174. package/esm/data/drag-and-drop/types.d.ts +4 -0
  175. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  176. package/esm/data/table/base-cell/DataTableBaseCell.js +27 -0
  177. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  178. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
  179. package/esm/data/table/column-header/DataTableColumnHeader.js +71 -0
  180. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  181. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -0
  182. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  183. package/esm/data/table/empty-state/DataTableEmptyState.js +2 -2
  184. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  185. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
  186. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  187. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  188. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
  189. package/esm/data/table/helpers/selection/getSingleSelectProps.js +8 -12
  190. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  191. package/esm/data/table/helpers/selection/selection.types.d.ts +39 -16
  192. package/esm/data/table/helpers/table-keyboard.js +3 -0
  193. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  194. package/esm/data/table/hooks/useColumnOptions.d.ts +19 -0
  195. package/esm/data/table/hooks/useColumnOptions.js +17 -0
  196. package/esm/data/table/hooks/useColumnOptions.js.map +1 -0
  197. package/esm/data/table/hooks/useTableExpansion.d.ts +26 -0
  198. package/esm/data/table/hooks/useTableExpansion.js +31 -0
  199. package/esm/data/table/hooks/useTableExpansion.js.map +1 -0
  200. package/esm/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  201. package/esm/data/table/hooks/useTableKeyboardNav.js +4 -2
  202. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  203. package/esm/data/table/hooks/useTableSelection.d.ts +14 -7
  204. package/esm/data/table/hooks/useTableSelection.js +40 -29
  205. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  206. package/esm/data/table/hooks/useTableSort.d.ts +37 -0
  207. package/esm/data/table/hooks/useTableSort.js +47 -0
  208. package/esm/data/table/hooks/useTableSort.js.map +1 -0
  209. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  210. package/esm/data/table/loading-state/DataTableLoadingState.js +2 -2
  211. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  212. package/esm/data/table/root/DataTable.types.d.ts +55 -4
  213. package/esm/data/table/root/DataTableAuto.d.ts +97 -1
  214. package/esm/data/table/root/DataTableAuto.js +94 -41
  215. package/esm/data/table/root/DataTableAuto.js.map +1 -1
  216. package/esm/data/table/root/DataTableRoot.context.d.ts +22 -1
  217. package/esm/data/table/root/DataTableRoot.context.js +5 -1
  218. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  219. package/esm/data/table/root/DataTableRoot.d.ts +0 -6
  220. package/esm/data/table/root/DataTableRoot.js +6 -5
  221. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  222. package/esm/data/table/tbody/DataTableTbody.js +8 -2
  223. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  224. package/esm/data/table/td/DataTableTd.d.ts +3 -23
  225. package/esm/data/table/td/DataTableTd.js +3 -7
  226. package/esm/data/table/td/DataTableTd.js.map +1 -1
  227. package/esm/data/table/tfoot/DataTableTfoot.js +3 -1
  228. package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -1
  229. package/esm/data/table/th/DataTableTh.d.ts +3 -48
  230. package/esm/data/table/th/DataTableTh.js +4 -58
  231. package/esm/data/table/th/DataTableTh.js.map +1 -1
  232. package/esm/data/table/thead/DataTableThead.js +2 -2
  233. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  234. package/esm/data/table/tr/DataTableTr.d.ts +8 -0
  235. package/esm/data/table/tr/DataTableTr.js +134 -12
  236. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  237. package/esm/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  238. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  239. package/esm/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  240. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  241. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  242. package/esm/date/datepicker/parts/DatePicker.RDP.js +27 -12
  243. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  244. package/esm/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  245. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  246. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  247. package/esm/dialog/popup/DialogPopupInternal.js +1 -1
  248. package/esm/dialog/popup/DialogPopupInternal.js.map +1 -1
  249. package/esm/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  250. package/esm/form/checkbox/CheckboxGroup.context.js +3 -0
  251. package/esm/form/checkbox/CheckboxGroup.context.js.map +1 -0
  252. package/esm/form/checkbox/CheckboxGroup.d.ts +0 -6
  253. package/esm/form/checkbox/CheckboxGroup.js +8 -8
  254. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  255. package/esm/form/checkbox/useCheckbox.js +1 -1
  256. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  257. package/esm/form/combobox/ComboboxWrapper.js +1 -3
  258. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  259. package/esm/form/error-summary/ErrorSummary.js +1 -3
  260. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  261. package/esm/form/fieldset/Fieldset.d.ts +0 -4
  262. package/esm/form/fieldset/Fieldset.js +3 -3
  263. package/esm/form/fieldset/Fieldset.js.map +1 -1
  264. package/esm/form/fieldset/useFieldset.d.ts +5 -3
  265. package/esm/form/fieldset/useFieldset.js +10 -5
  266. package/esm/form/fieldset/useFieldset.js.map +1 -1
  267. package/esm/form/radio/RadioGroup.context.d.ts +8 -0
  268. package/esm/form/radio/RadioGroup.context.js +3 -0
  269. package/esm/form/radio/RadioGroup.context.js.map +1 -0
  270. package/esm/form/radio/RadioGroup.d.ts +0 -8
  271. package/esm/form/radio/RadioGroup.js +9 -9
  272. package/esm/form/radio/RadioGroup.js.map +1 -1
  273. package/esm/form/radio/useRadio.js +1 -1
  274. package/esm/form/radio/useRadio.js.map +1 -1
  275. package/esm/form/search/Search.js +1 -3
  276. package/esm/form/search/Search.js.map +1 -1
  277. package/esm/inline-message/root/InlineMessage.js +2 -5
  278. package/esm/inline-message/root/InlineMessage.js.map +1 -1
  279. package/esm/modal/Modal.js +4 -6
  280. package/esm/modal/Modal.js.map +1 -1
  281. package/esm/modal/ModalUtils.js +1 -1
  282. package/esm/modal/ModalUtils.js.map +1 -1
  283. package/esm/modal/types.d.ts +1 -0
  284. package/esm/primitives/box/Box.d.ts +1 -1
  285. package/esm/process/Process.js +1 -5
  286. package/esm/process/Process.js.map +1 -1
  287. package/esm/tabs/useTabs.js +3 -7
  288. package/esm/tabs/useTabs.js.map +1 -1
  289. package/esm/timeline/Timeline.js +26 -63
  290. package/esm/timeline/Timeline.js.map +1 -1
  291. package/esm/timeline/TimelineRow.js +10 -14
  292. package/esm/timeline/TimelineRow.js.map +1 -1
  293. package/esm/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  294. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js +141 -0
  295. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  296. package/esm/timeline/hooks/usePeriodContext.d.ts +0 -1
  297. package/esm/timeline/hooks/usePeriodContext.js +0 -1
  298. package/esm/timeline/hooks/usePeriodContext.js.map +1 -1
  299. package/esm/timeline/hooks/useRowContext.d.ts +0 -1
  300. package/esm/timeline/hooks/useRowContext.js +0 -1
  301. package/esm/timeline/hooks/useRowContext.js.map +1 -1
  302. package/esm/timeline/hooks/useTimelineContext.d.ts +0 -4
  303. package/esm/timeline/hooks/useTimelineContext.js +0 -4
  304. package/esm/timeline/hooks/useTimelineContext.js.map +1 -1
  305. package/esm/timeline/period/ClickablePeriod.js +7 -21
  306. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  307. package/esm/timeline/period/NonClickablePeriod.js +1 -1
  308. package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
  309. package/esm/timeline/pin/PinInternal.js +10 -11
  310. package/esm/timeline/pin/PinInternal.js.map +1 -1
  311. package/esm/toggle-group/useToggleGroup.js +1 -1
  312. package/esm/toggle-group/useToggleGroup.js.map +1 -1
  313. package/esm/utils/components/HighlightText/HighlightText.js +1 -4
  314. package/esm/utils/components/HighlightText/HighlightText.js.map +1 -1
  315. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  316. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  317. package/esm/utils/helpers/create-strict-context.js +1 -1
  318. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  319. package/esm/utils/hooks/useEventCallback.js +1 -1
  320. package/esm/utils/hooks/useEventCallback.js.map +1 -1
  321. package/esm/utils/hooks/useMedia.js +1 -1
  322. package/esm/utils/hooks/useMedia.js.map +1 -1
  323. package/package.json +9 -7
  324. package/src/alert/base-alert/content/BaseAlertContent.tsx +7 -2
  325. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +69 -29
  326. package/src/data/drag-and-drop/item/DragAndDropItem.tsx +16 -10
  327. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +2 -2
  328. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +291 -246
  329. package/src/data/drag-and-drop/types.ts +5 -0
  330. package/src/data/table/base-cell/DataTableBaseCell.tsx +92 -0
  331. package/src/data/table/column-header/DataTableColumnHeader.tsx +180 -0
  332. package/src/data/table/empty-state/DataTableEmptyState.tsx +5 -3
  333. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +47 -43
  334. package/src/data/table/helpers/selection/getSingleSelectProps.ts +13 -14
  335. package/src/data/table/helpers/selection/selection.types.ts +41 -16
  336. package/src/data/table/helpers/table-keyboard.ts +4 -0
  337. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +93 -56
  338. package/src/data/table/hooks/useColumnOptions.ts +48 -0
  339. package/src/data/table/hooks/useTableExpansion.tsx +100 -0
  340. package/src/data/table/hooks/useTableKeyboardNav.ts +7 -5
  341. package/src/data/table/hooks/useTableSelection.ts +77 -46
  342. package/src/data/table/hooks/useTableSort.ts +103 -0
  343. package/src/data/table/loading-state/DataTableLoadingState.tsx +5 -3
  344. package/src/data/table/root/DataTable.types.ts +64 -5
  345. package/src/data/table/root/DataTableAuto.tsx +382 -104
  346. package/src/data/table/root/DataTableRoot.context.ts +30 -1
  347. package/src/data/table/root/DataTableRoot.tsx +14 -11
  348. package/src/data/table/tbody/DataTableTbody.tsx +17 -6
  349. package/src/data/table/td/DataTableTd.tsx +11 -47
  350. package/src/data/table/tfoot/DataTableTfoot.tsx +10 -7
  351. package/src/data/table/th/DataTableTh.tsx +11 -183
  352. package/src/data/table/thead/DataTableThead.tsx +3 -3
  353. package/src/data/table/tr/DataTableTr.tsx +300 -11
  354. package/src/date/datepicker/hooks/useRangeDatepicker.tsx +1 -1
  355. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +2 -1
  356. package/src/date/datepicker/parts/DatePicker.RDP.tsx +34 -15
  357. package/src/date/monthpicker/parts/MonthPicker.Button.tsx +11 -9
  358. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +1 -1
  359. package/src/dialog/popup/DialogPopupInternal.tsx +1 -1
  360. package/src/form/checkbox/CheckboxGroup.context.ts +10 -0
  361. package/src/form/checkbox/CheckboxGroup.tsx +18 -28
  362. package/src/form/checkbox/useCheckbox.ts +1 -1
  363. package/src/form/fieldset/Fieldset.tsx +4 -8
  364. package/src/form/fieldset/useFieldset.ts +13 -6
  365. package/src/form/radio/RadioGroup.context.ts +13 -0
  366. package/src/form/radio/RadioGroup.tsx +22 -31
  367. package/src/form/radio/useRadio.ts +1 -1
  368. package/src/inline-message/root/InlineMessage.tsx +3 -13
  369. package/src/modal/Modal.tsx +12 -6
  370. package/src/modal/ModalUtils.ts +1 -1
  371. package/src/modal/types.ts +1 -0
  372. package/src/primitives/box/Box.tsx +1 -1
  373. package/src/tabs/useTabs.ts +3 -7
  374. package/src/timeline/Timeline.tsx +62 -91
  375. package/src/timeline/TimelineRow.tsx +19 -17
  376. package/src/timeline/hooks/TimelineKeyboardNavProvider.tsx +237 -0
  377. package/src/timeline/hooks/usePeriodContext.tsx +0 -2
  378. package/src/timeline/hooks/useRowContext.tsx +0 -2
  379. package/src/timeline/hooks/useTimelineContext.tsx +0 -8
  380. package/src/timeline/period/ClickablePeriod.tsx +8 -19
  381. package/src/timeline/period/NonClickablePeriod.tsx +2 -0
  382. package/src/timeline/pin/PinInternal.tsx +10 -13
  383. package/src/toggle-group/useToggleGroup.ts +1 -1
  384. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  385. package/src/utils/helpers/create-strict-context.tsx +1 -1
  386. package/src/utils/hooks/useEventCallback.ts +1 -1
  387. package/src/utils/hooks/useMedia.ts +1 -1
  388. package/cjs/data/table/th/DataTableThActions.d.ts +0 -5
  389. package/cjs/data/table/th/DataTableThActions.js +0 -23
  390. package/cjs/data/table/th/DataTableThActions.js.map +0 -1
  391. package/cjs/data/table/th/useTableColumnResize.js.map +0 -1
  392. package/cjs/data/table/thead/DataTableThead.context.d.ts +0 -4
  393. package/cjs/data/table/thead/DataTableThead.context.js +0 -45
  394. package/cjs/data/table/thead/DataTableThead.context.js.map +0 -1
  395. package/esm/data/table/th/DataTableThActions.d.ts +0 -5
  396. package/esm/data/table/th/DataTableThActions.js +0 -18
  397. package/esm/data/table/th/DataTableThActions.js.map +0 -1
  398. package/esm/data/table/th/useTableColumnResize.js.map +0 -1
  399. package/esm/data/table/thead/DataTableThead.context.d.ts +0 -4
  400. package/esm/data/table/thead/DataTableThead.context.js +0 -8
  401. package/esm/data/table/thead/DataTableThead.context.js.map +0 -1
  402. package/src/data/table/th/DataTableThActions.tsx +0 -32
  403. package/src/data/table/thead/DataTableThead.context.ts +0 -10
  404. /package/cjs/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  405. /package/cjs/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  406. /package/esm/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  407. /package/esm/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  408. /package/src/data/table/{th → column-header}/useTableColumnResize.ts +0 -0
@@ -1,24 +1,39 @@
1
1
  /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
2
- import React, { forwardRef, useState } from "react";
3
- import { CheckboxInput } from "../../../form/checkbox/checkbox-input/CheckboxInput";
4
- import { RadioInput } from "../../../form/radio/radio-input/RadioInput";
2
+ import React, { forwardRef, useMemo } from "react";
3
+ import { Skeleton } from "../../../skeleton";
4
+ import { useId } from "../../../utils-external";
5
5
  import { cl } from "../../../utils/helpers";
6
6
  import { useMergeRefs } from "../../../utils/hooks";
7
+ import { DataTableBaseCell } from "../base-cell/DataTableBaseCell";
8
+ import { DataTableColumnHeader } from "../column-header/DataTableColumnHeader";
9
+ import { DataTableEmptyState } from "../empty-state/DataTableEmptyState";
10
+ import type { UseColumnOptionsResult } from "../hooks/useColumnOptions";
11
+ import { useColumnOptions } from "../hooks/useColumnOptions";
12
+ import {
13
+ DataTableExpansionProvider,
14
+ useDataTableExpansion,
15
+ } from "../hooks/useTableExpansion";
7
16
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
8
17
  import {
9
18
  type SelectionProps,
10
19
  useTableSelection,
11
20
  } from "../hooks/useTableSelection";
21
+ import { type TableSortOptions, useTableSort } from "../hooks/useTableSort";
22
+ import { DataTableLoadingState } from "../loading-state/DataTableLoadingState";
12
23
  import { DataTableTbody } from "../tbody/DataTableTbody";
13
- import { DataTableTd } from "../td/DataTableTd";
14
- import { DataTableTh } from "../th/DataTableTh";
15
24
  import { DataTableThead } from "../thead/DataTableThead";
16
25
  import { DataTableTr } from "../tr/DataTableTr";
17
26
  import type { ColumnDefinitions } from "./DataTable.types";
18
- import { DataTableContextProvider } from "./DataTableRoot.context";
27
+ import {
28
+ DataTableContextProvider,
29
+ useDataTableContext,
30
+ } from "./DataTableRoot.context";
19
31
 
20
32
  interface DataTableProps<T>
21
- extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
33
+ extends
34
+ React.HTMLAttributes<HTMLTableElement>,
35
+ SelectionProps,
36
+ TableSortOptions {
22
37
  children?: never;
23
38
  /**
24
39
  * Controls vertical cell padding.
@@ -64,16 +79,115 @@ interface DataTableProps<T>
64
79
  */
65
80
  layout?: "fixed" | "auto";
66
81
  /**
82
+ * Defines the columns of the table and how to render them.
83
+ *
67
84
  *
85
+ * 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.
68
86
  */
69
87
  columnDefinitions: ColumnDefinitions<T>;
88
+ /**
89
+ * The data to display in the table.
90
+ *
91
+ *
92
+ * Each object in the array represents a row, and the properties of the object are used to render the cells based on the `columnDefinitions`.
93
+ */
70
94
  data: T[];
95
+ /**
96
+ * Function to get unique row id from row data.
97
+ *
98
+ *
99
+ * 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.
100
+ */
71
101
  getRowId?: (rowData: T, index: number) => string | number;
102
+ /**
103
+ * Sticky columns that remain visible when horizontally scrolling the table.
104
+ *
105
+ * You can specify 1 sticky column on the left and 1 on the right.
106
+ */
107
+ stickyColumns?: {
108
+ first?: "1";
109
+ last?: "1";
110
+ };
111
+ /**
112
+ * @default false
113
+ */
114
+ stickyHeader?: boolean;
115
+ /**
116
+ * Callback invoked when a data row is clicked.
117
+ * Not called when clicking header, loading, or empty-state rows.
118
+ */
119
+ onRowClick?: (
120
+ rowId: string | number,
121
+ event: React.MouseEvent<HTMLTableRowElement>,
122
+ ) => void;
123
+ /**
124
+ * Content to render when `data` is empty.
125
+ * Rendered inside a `DataTable.EmptyState` row spanning all columns.
126
+ */
127
+ emptyState?: React.ReactNode;
128
+ /**
129
+ * Shows the table in a loading state.
130
+ *
131
+ * - When `loadingState` is provided, it is rendered inside a `DataTable.LoadingState` row.
132
+ * - When `loadingState` is **not** provided, skeleton placeholder rows are rendered instead.
133
+ * @default false
134
+ */
135
+ isLoading?: boolean;
136
+ /**
137
+ * Custom content to render when `isLoading` is `true`.
138
+ * Rendered inside a `DataTable.LoadingState` row spanning all columns.
139
+ * When omitted, skeleton rows are rendered based on `loadingRows`.
140
+ */
141
+ loadingState?: React.ReactNode;
142
+ /**
143
+ * Number of skeleton rows to render when `isLoading` is `true` and no `loadingState` is provided.
144
+ *
145
+ *
146
+ * If not provided, the rendered content will get a temporarily overlay while loading
147
+ */
148
+ loadingRows?: number;
149
+ /**
150
+ * Visually hidden label announced to screen readers when skeleton rows are shown.
151
+ * Only used when `isLoading` is `true` and no `loadingState` is provided.
152
+ * @default "Laster innhold"
153
+ */
154
+ loadingLabel?: string;
155
+ /**
156
+ * Renders a details panel below the row when expanded.
157
+ * When provided, an expand toggle column is added automatically.
158
+ */
159
+ getDetailsPanelContent?: (rowData: T) => React.ReactNode;
160
+ /**
161
+ * Controlled list of expanded row IDs.
162
+ * Use with `onDetailsPanelChange` for controlled usage, or `defaultDetailsPanelRowIds` for uncontrolled.
163
+ */
164
+ detailsPanelRowIds?: (string | number)[];
165
+ /**
166
+ * Initial list of expanded row IDs for uncontrolled usage.
167
+ * @default []
168
+ */
169
+ defaultDetailsPanelRowIds?: (string | number)[];
170
+ /**
171
+ * Called when the list of expanded row IDs changes.
172
+ */
173
+ onDetailsPanelChange?: (ids: (string | number)[]) => void;
174
+ /**
175
+ * Returns the height (in px) or `"auto"` for a row's details panel.
176
+ * When a number is returned, the panel scrolls within that fixed height.
177
+ * @default "auto"
178
+ */
179
+ getDetailsPanelHeight?: (rowData: T) => number | "auto";
180
+ /**
181
+ * Shows an expand-all toggle button in the expand column header.
182
+ * @default false
183
+ */
184
+ showExpandAll?: boolean;
72
185
  }
73
186
 
74
187
  function DataTableAutoInner<T>(
75
188
  {
76
189
  className,
190
+ id,
77
191
  rowDensity = "normal",
78
192
  withKeyboardNav = false,
79
193
  zebraStripes = false,
@@ -84,128 +198,292 @@ function DataTableAutoInner<T>(
84
198
  selectedKeys,
85
199
  defaultSelectedKeys,
86
200
  onSelectionChange,
87
- disabledKeys = [],
201
+ disabledSelectionKeys = [],
88
202
  data,
89
203
  columnDefinitions,
90
204
  getRowId,
205
+ stickyColumns,
206
+ stickyHeader = false,
207
+ sort: sortProp,
208
+ defaultSort = [],
209
+ onSortChange,
210
+ onRowClick,
211
+ emptyState,
212
+ isLoading = false,
213
+ loadingState,
214
+ loadingRows,
215
+ loadingLabel = "Laster innhold",
216
+ disableRowSelectionOnClick = false,
217
+ getDetailsPanelContent,
218
+ getDetailsPanelHeight,
219
+ showExpandAll = false,
220
+ detailsPanelRowIds,
221
+ defaultDetailsPanelRowIds,
222
+ onDetailsPanelChange,
91
223
  ...rest
92
224
  }: DataTableProps<T>,
93
225
  forwardedRef: React.ForwardedRef<HTMLTableElement>,
94
226
  ) {
95
- const [tableRef, setTableRef] = useState<HTMLTableElement | null>(null);
96
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
97
-
98
- const { tabIndex } = useTableKeyboardNav(tableRef, {
227
+ const { tabIndex, setTableRef } = useTableKeyboardNav({
99
228
  enabled: withKeyboardNav,
100
229
  shouldBlockNavigation,
101
230
  });
102
231
 
103
- const resolvedGetRowId =
104
- getRowId ??
105
- (((_row: T, index: number) => index) as (rowData: T) => string | number);
232
+ const { sortState, onSortClick } = useTableSort({
233
+ defaultSort,
234
+ onSortChange,
235
+ sort: sortProp,
236
+ });
237
+
238
+ const mergedRef = useMergeRefs(forwardedRef, setTableRef);
239
+
240
+ const allRowKeys = useMemo(() => {
241
+ const resolvedGetRowId = (item: T, index: number): string | number =>
242
+ getRowId?.(item, index) ?? index;
243
+
244
+ return data.map((item, index) => resolvedGetRowId(item, index));
245
+ }, [data, getRowId]);
106
246
 
107
- const selection = useTableSelection({
247
+ const tableSelectionState = useTableSelection({
108
248
  selectionMode: selectionModeProp,
109
249
  selectedKeys,
110
250
  defaultSelectedKeys,
111
251
  onSelectionChange,
112
- disabledKeys,
113
- data,
114
- getRowId: resolvedGetRowId,
252
+ disabledSelectionKeys,
253
+ allRowKeys,
254
+ });
255
+
256
+ const { columns, stickySelection } = useColumnOptions<T>(columnDefinitions, {
257
+ stickyColumns,
258
+ selectionMode: tableSelectionState.selection.selectionMode,
115
259
  });
116
260
 
261
+ const tableId = useId(id);
262
+
117
263
  return (
118
- <DataTableContextProvider layout={layout} withKeyboardNav={withKeyboardNav}>
119
- <div className="aksel-data-table__border-wrapper">
120
- <div className="aksel-data-table__scroll-wrapper">
121
- <table
122
- {...rest}
123
- ref={mergedRef}
124
- className={cl("aksel-data-table", className)}
125
- data-zebra-stripes={zebraStripes}
126
- data-truncate-content={truncateContent}
127
- data-density={rowDensity}
128
- data-layout={layout}
129
- tabIndex={tabIndex}
130
- >
131
- <DataTableThead>
132
- <DataTableTr>
133
- {selection.selectionMode === "multiple" && (
134
- <DataTableTh
135
- textAlign="center"
136
- width="60px"
137
- UNSAFE_isSelection
138
- >
139
- <CheckboxInput
140
- {...selection.getTheadCheckboxProps()}
141
- compact
142
- />
143
- </DataTableTh>
144
- )}
145
- {selection.selectionMode === "single" && (
146
- <DataTableTh width="64px" UNSAFE_isSelection />
147
- )}
148
- {columnDefinitions.map((colDef, colDefIndex) => {
149
- return (
150
- <DataTableTh
151
- /* TODO: Make these user-changable */
152
- maxWidth="400px"
153
- minWidth="100px"
154
- defaultWidth="100%"
155
- textAlign="left"
156
- key={colDef.id || colDefIndex}
157
- >
158
- {colDef.header}
159
- </DataTableTh>
160
- );
161
- })}
162
- </DataTableTr>
163
- </DataTableThead>
164
- <DataTableTbody>
165
- {data.map((rowData, rowIndex) => {
166
- const rowId = selection.allKeys[rowIndex];
167
- return (
168
- <DataTableTr key={rowId}>
169
- {selection.selectionMode === "multiple" && (
170
- <DataTableTd
171
- align="center"
172
- width="60px"
173
- UNSAFE_isSelection
264
+ <DataTableContextProvider
265
+ layout={layout}
266
+ withKeyboardNav={withKeyboardNav}
267
+ selectionState={tableSelectionState}
268
+ stickySelection={stickySelection}
269
+ stickyHeader={stickyHeader}
270
+ tableId={tableId}
271
+ showLoadingSkeletons={isLoading && loadingState == null}
272
+ onRowClick={onRowClick}
273
+ disableRowSelectionOnClick={disableRowSelectionOnClick}
274
+ isLoading={isLoading}
275
+ showLoadingOverlay={isLoading && !loadingState && !loadingRows}
276
+ >
277
+ <DataTableExpansionProvider
278
+ detailsPanelRowIds={detailsPanelRowIds}
279
+ defaultDetailsPanelRowIds={defaultDetailsPanelRowIds}
280
+ onDetailsPanelChange={onDetailsPanelChange}
281
+ allRowKeys={allRowKeys}
282
+ getDetailsPanelContent={getDetailsPanelContent}
283
+ getDetailsPanelHeight={getDetailsPanelHeight}
284
+ showExpandAll={showExpandAll}
285
+ >
286
+ <div className="aksel-data-table__border-wrapper">
287
+ <div className="aksel-data-table__scroll-wrapper">
288
+ <table
289
+ {...rest}
290
+ ref={mergedRef}
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
+ tabIndex={tabIndex}
298
+ aria-busy={isLoading || undefined}
299
+ >
300
+ <DataTableThead>
301
+ <DataTableTr>
302
+ {columns.map(({ isSticky, colDef }) => {
303
+ const sortEntry = sortState.find(
304
+ (s) => s.columnId === colDef.id,
305
+ );
306
+ const sortDirection = sortEntry?.direction ?? "none";
307
+ return (
308
+ <DataTableColumnHeader
309
+ maxWidth={colDef.maxWidth}
310
+ minWidth={colDef.minWidth}
311
+ width={colDef.width}
312
+ defaultWidth={colDef.defaultWidth ?? "100%"}
313
+ textAlign={colDef.type === "number" ? "right" : "left"}
314
+ key={colDef.id}
315
+ isSticky={isSticky}
316
+ sortable={colDef.sortable}
317
+ sortDirection={sortDirection}
318
+ onSortClick={(event) => onSortClick(colDef.id, event)}
174
319
  >
175
- <CheckboxInput
176
- {...selection.getRowCheckboxProps(rowId)}
177
- compact
178
- />
179
- </DataTableTd>
180
- )}
181
-
182
- {selection.selectionMode === "single" && (
183
- <DataTableTd width="64px" UNSAFE_isSelection>
184
- {/* used with keyboard nav is funky, no longer auto-selects on keyboard-nav. Probably preventDefault somewhere breaking it. */}
185
- <RadioInput {...selection.getRowRadioProps(rowId)} />
186
- </DataTableTd>
187
- )}
188
- {columnDefinitions.map((colDef, colDefIndex) => {
189
- return (
190
- <DataTableTd
191
- textAlign="left"
192
- key={colDef.id || colDefIndex}
193
- >
194
- {colDef.cell(rowData)}
195
- </DataTableTd>
196
- );
197
- })}
198
- </DataTableTr>
199
- );
200
- })}
201
- </DataTableTbody>
202
- </table>
320
+ {colDef.header}
321
+ </DataTableColumnHeader>
322
+ );
323
+ })}
324
+ </DataTableTr>
325
+ </DataTableThead>
326
+ <DataTableTbody>
327
+ <DataTableAutoTBodyContent
328
+ columns={columns}
329
+ data={data}
330
+ allRowKeys={allRowKeys}
331
+ loadingState={loadingState}
332
+ loadingRows={loadingRows}
333
+ loadingLabel={loadingLabel}
334
+ emptyState={emptyState}
335
+ />
336
+ </DataTableTbody>
337
+ </table>
338
+ </div>
203
339
  </div>
204
- </div>
340
+ </DataTableExpansionProvider>
205
341
  </DataTableContextProvider>
206
342
  );
207
343
  }
208
344
 
345
+ interface DataTableAutoTBodyContentProps<T> {
346
+ columns: UseColumnOptionsResult<T>["columns"];
347
+ data: T[];
348
+ allRowKeys: (string | number)[];
349
+ loadingState: React.ReactNode;
350
+ loadingLabel: string;
351
+ loadingRows?: number;
352
+ emptyState: React.ReactNode;
353
+ }
354
+
355
+ function DataTableAutoTBodyContent<T>({
356
+ columns,
357
+ data,
358
+ allRowKeys,
359
+ loadingState,
360
+ loadingRows,
361
+ loadingLabel,
362
+ emptyState,
363
+ }: DataTableAutoTBodyContentProps<T>) {
364
+ const { isLoading } = useDataTableContext();
365
+
366
+ if (isLoading && loadingState != null) {
367
+ return (
368
+ <DataTableLoadingState colSpan={columns.length}>
369
+ {loadingState}
370
+ </DataTableLoadingState>
371
+ );
372
+ }
373
+
374
+ if (isLoading && loadingRows) {
375
+ return (
376
+ <>
377
+ <tr>
378
+ <td colSpan={columns.length} className="aksel-sr-only">
379
+ {loadingLabel}
380
+ </td>
381
+ </tr>
382
+ {Array.from({ length: loadingRows }, (_, rowIndex) => (
383
+ <DataTableTr key={`skeleton-row-${rowIndex}`} aria-hidden>
384
+ {columns.map(({ isSticky, colDef }, colDefIndex) => (
385
+ <DataTableBaseCell
386
+ textAlign={colDef.type === "number" ? "right" : "left"}
387
+ key={colDef.id || colDefIndex}
388
+ as={colDef.isRowHeader ? "th" : "td"}
389
+ isSticky={isSticky}
390
+ >
391
+ <Skeleton variant="text" />
392
+ </DataTableBaseCell>
393
+ ))}
394
+ </DataTableTr>
395
+ ))}
396
+ </>
397
+ );
398
+ }
399
+
400
+ if (data.length === 0 && emptyState !== undefined) {
401
+ return (
402
+ <DataTableEmptyState colSpan={columns.length}>
403
+ {emptyState}
404
+ </DataTableEmptyState>
405
+ );
406
+ }
407
+
408
+ const renderLoadingAnnoucement = isLoading && !loadingState && !loadingRows;
409
+
410
+ return data.map((rowData, rowIndex) => {
411
+ const rowId = allRowKeys[rowIndex];
412
+ return (
413
+ <React.Fragment key={rowId}>
414
+ {renderLoadingAnnoucement && (
415
+ <tr>
416
+ <td colSpan={columns.length} className="aksel-sr-only">
417
+ {loadingLabel}
418
+ </td>
419
+ </tr>
420
+ )}
421
+ <DataTableTr rowId={rowId}>
422
+ {columns.map(({ isSticky, colDef }, colDefIndex) => {
423
+ return (
424
+ <DataTableBaseCell
425
+ /* TODO: Make this configurable */
426
+ textAlign={colDef.type === "number" ? "right" : "left"}
427
+ key={colDef.id || colDefIndex}
428
+ as={colDef.isRowHeader ? "th" : "td"}
429
+ isSticky={isSticky}
430
+ >
431
+ {colDef.cell(rowData)}
432
+ </DataTableBaseCell>
433
+ );
434
+ })}
435
+ </DataTableTr>
436
+ <DataTableExpandedRow
437
+ rowId={rowId}
438
+ rowData={rowData}
439
+ columnCount={columns.length}
440
+ />
441
+ </React.Fragment>
442
+ );
443
+ });
444
+ }
445
+
446
+ function DataTableExpandedRow<T>({
447
+ rowId,
448
+ rowData,
449
+ columnCount,
450
+ }: {
451
+ rowId: string | number;
452
+ rowData: T;
453
+ columnCount: number;
454
+ }) {
455
+ const { tableId } = useDataTableContext();
456
+ const expansionContext = useDataTableExpansion(false);
457
+
458
+ /* TODO: Is this the way we want to opt out? Might just be temp until auto and root is merged so they use same context */
459
+ if (!expansionContext) {
460
+ return null;
461
+ }
462
+
463
+ const { isExpanded, getDetailsPanelContent, getDetailsPanelHeight } =
464
+ expansionContext;
465
+
466
+ if (!isExpanded(rowId)) {
467
+ return null;
468
+ }
469
+
470
+ const content = getDetailsPanelContent?.(rowData);
471
+
472
+ if (!content) {
473
+ return null;
474
+ }
475
+
476
+ return (
477
+ <tr>
478
+ <td id={`${tableId}-expansion-${rowId}`} colSpan={columnCount}>
479
+ <div style={{ height: getDetailsPanelHeight?.(rowData) }}>
480
+ {content}
481
+ </div>
482
+ </td>
483
+ </tr>
484
+ );
485
+ }
486
+
209
487
  const DataTableAuto = forwardRef(DataTableAutoInner) as <T>(
210
488
  props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
211
489
  ) => React.ReactElement | null;
@@ -1,8 +1,21 @@
1
1
  import { createStrictContext } from "../../../utils/helpers";
2
+ import type { UseTableSelectionReturn } from "../hooks/useTableSelection";
2
3
 
3
4
  type DataTableContextProps = {
4
5
  layout: "fixed" | "auto";
5
6
  withKeyboardNav: boolean;
7
+ selectionState: UseTableSelectionReturn;
8
+ stickySelection: boolean;
9
+ stickyHeader: boolean;
10
+ tableId: string;
11
+ showLoadingSkeletons: boolean;
12
+ onRowClick?: (
13
+ rowId: string | number,
14
+ event: React.MouseEvent<HTMLTableRowElement>,
15
+ ) => void;
16
+ disableRowSelectionOnClick: boolean;
17
+ isLoading?: boolean;
18
+ showLoadingOverlay: boolean;
6
19
  };
7
20
 
8
21
  const { Provider: DataTableContextProvider, useContext: useDataTableContext } =
@@ -11,4 +24,20 @@ const { Provider: DataTableContextProvider, useContext: useDataTableContext } =
11
24
  errorMessage: "useDataTableContext must be used within DataTable",
12
25
  });
13
26
 
14
- export { DataTableContextProvider, useDataTableContext };
27
+ type DataTableLocation = "thead" | "tbody" | "tfoot";
28
+
29
+ const {
30
+ Provider: DataTableLocationProvider,
31
+ useContext: useDataTableLocation,
32
+ } = createStrictContext<{ location: DataTableLocation }>({
33
+ name: "DataTableLocation",
34
+ errorMessage:
35
+ "Some component is using table context outside of Thead, Tbody or Tfoot. Please make sure to wrap it in the appropriate component.",
36
+ });
37
+
38
+ export {
39
+ DataTableContextProvider,
40
+ DataTableLocationProvider,
41
+ useDataTableContext,
42
+ useDataTableLocation,
43
+ };
@@ -1,4 +1,5 @@
1
- import React, { forwardRef, useState } from "react";
1
+ import React, { forwardRef } from "react";
2
+ import { useId } from "../../../utils-external";
2
3
  import { cl } from "../../../utils/helpers";
3
4
  import { useMergeRefs } from "../../../utils/hooks";
4
5
  import {
@@ -11,6 +12,7 @@ import {
11
12
  } from "../empty-state/DataTableEmptyState";
12
13
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
13
14
  import { type SelectionProps } from "../hooks/useTableSelection";
15
+ import { noSelectionState } from "../hooks/useTableSelection";
14
16
  import {
15
17
  DataTableLoadingState,
16
18
  type DataTableLoadingStateProps,
@@ -135,12 +137,6 @@ interface DataTableRootComponent extends React.ForwardRefExoticComponent<
135
137
  * @see 🏷️ {@link DataTableThProps}
136
138
  * @example
137
139
  * ```jsx
138
- * <DataTable>
139
- * <DataTable.Thead>
140
- * <DataTable.Th>Header 1</DataTable.Th>
141
- * <DataTable.Th>Header 2</DataTable.Th>
142
- * </DataTable.Thead>
143
- * </DataTable>
144
140
  * ```
145
141
  */
146
142
  Th: typeof DataTableTh;
@@ -219,18 +215,25 @@ const DataTable = forwardRef<HTMLTableElement, DataTableProps>(
219
215
  },
220
216
  forwardedRef,
221
217
  ) => {
222
- const [tableRef, setTableRef] = useState<HTMLTableElement | null>(null);
223
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
224
-
225
- const { tabIndex } = useTableKeyboardNav(tableRef, {
218
+ const { tabIndex, setTableRef } = useTableKeyboardNav({
226
219
  enabled: withKeyboardNav,
227
220
  shouldBlockNavigation,
228
221
  });
229
222
 
223
+ const mergedRef = useMergeRefs(forwardedRef, setTableRef);
224
+
230
225
  return (
231
226
  <DataTableContextProvider
232
227
  layout={layout}
233
228
  withKeyboardNav={withKeyboardNav}
229
+ selectionState={noSelectionState}
230
+ stickySelection={false}
231
+ stickyHeader={false}
232
+ tableId={useId()}
233
+ showLoadingSkeletons={false}
234
+ onRowClick={undefined}
235
+ disableRowSelectionOnClick={false}
236
+ showLoadingOverlay={false}
234
237
  >
235
238
  <div className="aksel-data-table__border-wrapper">
236
239
  <div className="aksel-data-table__scroll-wrapper">