@navikt/ds-react 8.9.0 → 8.10.0

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 (439) 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 -0
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +41 -20
  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 +7 -2
  7. package/cjs/data/drag-and-drop/item/DragAndDropItem.js +6 -8
  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 -1
  10. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  11. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -30
  12. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +124 -65
  13. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  14. package/cjs/data/drag-and-drop/types.d.ts +4 -0
  15. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  16. package/cjs/data/table/base-cell/DataTableBaseCell.js +63 -0
  17. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  18. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +32 -0
  19. package/cjs/data/table/column-header/DataTableColumnHeader.js +108 -0
  20. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  21. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -0
  22. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  23. package/cjs/data/table/empty-state/DataTableEmptyState.js +2 -2
  24. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  25. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +10 -10
  26. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  27. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  28. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +7 -5
  29. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +8 -9
  30. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  31. package/cjs/data/table/helpers/selection/selection.types.d.ts +44 -21
  32. package/cjs/data/table/hooks/useColumnOptions.d.ts +19 -0
  33. package/cjs/data/table/hooks/useColumnOptions.js +19 -0
  34. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -0
  35. package/cjs/data/table/hooks/useTableExpansion.d.ts +26 -0
  36. package/cjs/data/table/hooks/useTableExpansion.js +68 -0
  37. package/cjs/data/table/hooks/useTableExpansion.js.map +1 -0
  38. package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  39. package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -1
  40. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  41. package/cjs/data/table/hooks/useTableSelection.d.ts +14 -7
  42. package/cjs/data/table/hooks/useTableSelection.js +40 -27
  43. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  44. package/cjs/data/table/hooks/useTableSort.d.ts +37 -0
  45. package/cjs/data/table/hooks/useTableSort.js +49 -0
  46. package/cjs/data/table/hooks/useTableSort.js.map +1 -0
  47. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  48. package/cjs/data/table/loading-state/DataTableLoadingState.js +2 -2
  49. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  50. package/cjs/data/table/root/DataTable.types.d.ts +55 -4
  51. package/cjs/data/table/root/DataTableAuto.d.ts +97 -1
  52. package/cjs/data/table/root/DataTableAuto.js +92 -41
  53. package/cjs/data/table/root/DataTableAuto.js.map +1 -1
  54. package/cjs/data/table/root/DataTableRoot.context.d.ts +22 -1
  55. package/cjs/data/table/root/DataTableRoot.context.js +7 -1
  56. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  57. package/cjs/data/table/root/DataTableRoot.d.ts +0 -6
  58. package/cjs/data/table/root/DataTableRoot.js +5 -4
  59. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  60. package/cjs/data/table/tbody/DataTableTbody.js +7 -1
  61. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  62. package/cjs/data/table/td/DataTableTd.d.ts +3 -19
  63. package/cjs/data/table/td/DataTableTd.js +3 -5
  64. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  65. package/cjs/data/table/tfoot/DataTableTfoot.js +3 -1
  66. package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -1
  67. package/cjs/data/table/th/DataTableTh.d.ts +3 -44
  68. package/cjs/data/table/th/DataTableTh.js +3 -54
  69. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  70. package/cjs/data/table/thead/DataTableThead.js +2 -2
  71. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  72. package/cjs/data/table/tr/DataTableTr.d.ts +8 -0
  73. package/cjs/data/table/tr/DataTableTr.js +131 -9
  74. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  75. package/cjs/data/token-filter/FilterChip.d.ts +10 -0
  76. package/cjs/data/token-filter/FilterChip.js +65 -0
  77. package/cjs/data/token-filter/FilterChip.js.map +1 -0
  78. package/cjs/data/token-filter/TokenFilter.js +3 -10
  79. package/cjs/data/token-filter/TokenFilter.js.map +1 -1
  80. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  81. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  82. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  83. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  84. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  85. package/cjs/date/datepicker/parts/DatePicker.RDP.js +26 -11
  86. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  87. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  88. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  89. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  90. package/cjs/dialog/popup/DialogPopupInternal.js +1 -1
  91. package/cjs/dialog/popup/DialogPopupInternal.js.map +1 -1
  92. package/cjs/form/checkbox/Checkbox.js +19 -33
  93. package/cjs/form/checkbox/Checkbox.js.map +1 -1
  94. package/cjs/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  95. package/cjs/form/checkbox/CheckboxGroup.context.js +6 -0
  96. package/cjs/form/checkbox/CheckboxGroup.context.js.map +1 -0
  97. package/cjs/form/checkbox/CheckboxGroup.d.ts +0 -6
  98. package/cjs/form/checkbox/CheckboxGroup.js +8 -8
  99. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  100. package/cjs/form/checkbox/checkbox-input/CheckboxInput.d.ts +21 -0
  101. package/cjs/form/checkbox/checkbox-input/CheckboxInput.js +65 -0
  102. package/cjs/form/checkbox/checkbox-input/CheckboxInput.js.map +1 -0
  103. package/cjs/form/checkbox/types.d.ts +1 -1
  104. package/cjs/form/checkbox/useCheckbox.js +2 -2
  105. package/cjs/form/checkbox/useCheckbox.js.map +1 -1
  106. package/cjs/form/combobox/ComboboxWrapper.js +1 -3
  107. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  108. package/cjs/form/error-summary/ErrorSummary.js +1 -3
  109. package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
  110. package/cjs/form/fieldset/Fieldset.d.ts +0 -4
  111. package/cjs/form/fieldset/Fieldset.js +5 -9
  112. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  113. package/cjs/form/fieldset/useFieldset.d.ts +5 -3
  114. package/cjs/form/fieldset/useFieldset.js +9 -4
  115. package/cjs/form/fieldset/useFieldset.js.map +1 -1
  116. package/cjs/form/radio/Radio.js +9 -7
  117. package/cjs/form/radio/Radio.js.map +1 -1
  118. package/cjs/form/radio/RadioGroup.context.d.ts +8 -0
  119. package/cjs/form/radio/RadioGroup.context.js +6 -0
  120. package/cjs/form/radio/RadioGroup.context.js.map +1 -0
  121. package/cjs/form/radio/RadioGroup.d.ts +0 -8
  122. package/cjs/form/radio/RadioGroup.js +10 -10
  123. package/cjs/form/radio/RadioGroup.js.map +1 -1
  124. package/cjs/form/radio/radio-input/RadioInput.d.ts +19 -0
  125. package/cjs/{data/table/thead/DataTableThead.context.js → form/radio/radio-input/RadioInput.js} +19 -9
  126. package/cjs/form/radio/radio-input/RadioInput.js.map +1 -0
  127. package/cjs/form/radio/useRadio.js +2 -2
  128. package/cjs/form/radio/useRadio.js.map +1 -1
  129. package/cjs/form/search/Search.js +1 -3
  130. package/cjs/form/search/Search.js.map +1 -1
  131. package/cjs/inline-message/root/InlineMessage.js +2 -5
  132. package/cjs/inline-message/root/InlineMessage.js.map +1 -1
  133. package/cjs/modal/Modal.js +1 -3
  134. package/cjs/modal/Modal.js.map +1 -1
  135. package/cjs/modal/ModalUtils.js +1 -1
  136. package/cjs/modal/ModalUtils.js.map +1 -1
  137. package/cjs/primitives/box/Box.d.ts +1 -1
  138. package/cjs/process/Process.js +1 -5
  139. package/cjs/process/Process.js.map +1 -1
  140. package/cjs/tabs/useTabs.js +3 -7
  141. package/cjs/tabs/useTabs.js.map +1 -1
  142. package/cjs/timeline/Timeline.js +25 -62
  143. package/cjs/timeline/Timeline.js.map +1 -1
  144. package/cjs/timeline/TimelineRow.js +10 -14
  145. package/cjs/timeline/TimelineRow.js.map +1 -1
  146. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  147. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js +179 -0
  148. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  149. package/cjs/timeline/hooks/usePeriodContext.d.ts +0 -1
  150. package/cjs/timeline/hooks/usePeriodContext.js +0 -1
  151. package/cjs/timeline/hooks/usePeriodContext.js.map +1 -1
  152. package/cjs/timeline/hooks/useRowContext.d.ts +0 -1
  153. package/cjs/timeline/hooks/useRowContext.js +0 -1
  154. package/cjs/timeline/hooks/useRowContext.js.map +1 -1
  155. package/cjs/timeline/hooks/useTimelineContext.d.ts +0 -4
  156. package/cjs/timeline/hooks/useTimelineContext.js +0 -4
  157. package/cjs/timeline/hooks/useTimelineContext.js.map +1 -1
  158. package/cjs/timeline/period/ClickablePeriod.js +6 -20
  159. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  160. package/cjs/timeline/period/NonClickablePeriod.js +1 -1
  161. package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
  162. package/cjs/timeline/pin/PinInternal.js +9 -10
  163. package/cjs/timeline/pin/PinInternal.js.map +1 -1
  164. package/cjs/toggle-group/useToggleGroup.js +1 -1
  165. package/cjs/toggle-group/useToggleGroup.js.map +1 -1
  166. package/cjs/utils/components/HighlightText/HighlightText.js +1 -4
  167. package/cjs/utils/components/HighlightText/HighlightText.js.map +1 -1
  168. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  169. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  170. package/cjs/utils/helpers/create-strict-context.js +1 -1
  171. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  172. package/cjs/utils/hooks/useEventCallback.js +1 -1
  173. package/cjs/utils/hooks/useEventCallback.js.map +1 -1
  174. package/cjs/utils/hooks/useMedia.js +1 -1
  175. package/cjs/utils/hooks/useMedia.js.map +1 -1
  176. package/esm/alert/base-alert/content/BaseAlertContent.js +4 -1
  177. package/esm/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  178. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -0
  179. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +41 -20
  180. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  181. package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +7 -2
  182. package/esm/data/drag-and-drop/item/DragAndDropItem.js +6 -8
  183. package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  184. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -1
  185. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -1
  186. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -30
  187. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +125 -66
  188. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  189. package/esm/data/drag-and-drop/types.d.ts +4 -0
  190. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  191. package/esm/data/table/base-cell/DataTableBaseCell.js +27 -0
  192. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  193. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +32 -0
  194. package/esm/data/table/column-header/DataTableColumnHeader.js +72 -0
  195. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  196. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -0
  197. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  198. package/esm/data/table/empty-state/DataTableEmptyState.js +2 -2
  199. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  200. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +10 -10
  201. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  202. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  203. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +7 -5
  204. package/esm/data/table/helpers/selection/getSingleSelectProps.js +8 -9
  205. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  206. package/esm/data/table/helpers/selection/selection.types.d.ts +44 -21
  207. package/esm/data/table/hooks/useColumnOptions.d.ts +19 -0
  208. package/esm/data/table/hooks/useColumnOptions.js +17 -0
  209. package/esm/data/table/hooks/useColumnOptions.js.map +1 -0
  210. package/esm/data/table/hooks/useTableExpansion.d.ts +26 -0
  211. package/esm/data/table/hooks/useTableExpansion.js +31 -0
  212. package/esm/data/table/hooks/useTableExpansion.js.map +1 -0
  213. package/esm/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  214. package/esm/data/table/hooks/useTableKeyboardNav.js +4 -2
  215. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  216. package/esm/data/table/hooks/useTableSelection.d.ts +14 -7
  217. package/esm/data/table/hooks/useTableSelection.js +40 -29
  218. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  219. package/esm/data/table/hooks/useTableSort.d.ts +37 -0
  220. package/esm/data/table/hooks/useTableSort.js +47 -0
  221. package/esm/data/table/hooks/useTableSort.js.map +1 -0
  222. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  223. package/esm/data/table/loading-state/DataTableLoadingState.js +2 -2
  224. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  225. package/esm/data/table/root/DataTable.types.d.ts +55 -4
  226. package/esm/data/table/root/DataTableAuto.d.ts +97 -1
  227. package/esm/data/table/root/DataTableAuto.js +94 -43
  228. package/esm/data/table/root/DataTableAuto.js.map +1 -1
  229. package/esm/data/table/root/DataTableRoot.context.d.ts +22 -1
  230. package/esm/data/table/root/DataTableRoot.context.js +5 -1
  231. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  232. package/esm/data/table/root/DataTableRoot.d.ts +0 -6
  233. package/esm/data/table/root/DataTableRoot.js +6 -5
  234. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  235. package/esm/data/table/tbody/DataTableTbody.js +8 -2
  236. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  237. package/esm/data/table/td/DataTableTd.d.ts +3 -19
  238. package/esm/data/table/td/DataTableTd.js +3 -5
  239. package/esm/data/table/td/DataTableTd.js.map +1 -1
  240. package/esm/data/table/tfoot/DataTableTfoot.js +3 -1
  241. package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -1
  242. package/esm/data/table/th/DataTableTh.d.ts +3 -44
  243. package/esm/data/table/th/DataTableTh.js +4 -55
  244. package/esm/data/table/th/DataTableTh.js.map +1 -1
  245. package/esm/data/table/thead/DataTableThead.js +2 -2
  246. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  247. package/esm/data/table/tr/DataTableTr.d.ts +8 -0
  248. package/esm/data/table/tr/DataTableTr.js +134 -12
  249. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  250. package/esm/data/token-filter/FilterChip.d.ts +10 -0
  251. package/esm/data/token-filter/FilterChip.js +30 -0
  252. package/esm/data/token-filter/FilterChip.js.map +1 -0
  253. package/esm/data/token-filter/TokenFilter.js +3 -10
  254. package/esm/data/token-filter/TokenFilter.js.map +1 -1
  255. package/esm/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  256. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  257. package/esm/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  258. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  259. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  260. package/esm/date/datepicker/parts/DatePicker.RDP.js +27 -12
  261. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  262. package/esm/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  263. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  264. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  265. package/esm/dialog/popup/DialogPopupInternal.js +1 -1
  266. package/esm/dialog/popup/DialogPopupInternal.js.map +1 -1
  267. package/esm/form/checkbox/Checkbox.js +19 -33
  268. package/esm/form/checkbox/Checkbox.js.map +1 -1
  269. package/esm/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  270. package/esm/form/checkbox/CheckboxGroup.context.js +3 -0
  271. package/esm/form/checkbox/CheckboxGroup.context.js.map +1 -0
  272. package/esm/form/checkbox/CheckboxGroup.d.ts +0 -6
  273. package/esm/form/checkbox/CheckboxGroup.js +8 -8
  274. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  275. package/esm/form/checkbox/checkbox-input/CheckboxInput.d.ts +21 -0
  276. package/esm/form/checkbox/checkbox-input/CheckboxInput.js +29 -0
  277. package/esm/form/checkbox/checkbox-input/CheckboxInput.js.map +1 -0
  278. package/esm/form/checkbox/types.d.ts +1 -1
  279. package/esm/form/checkbox/useCheckbox.js +1 -1
  280. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  281. package/esm/form/combobox/ComboboxWrapper.js +1 -3
  282. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  283. package/esm/form/error-summary/ErrorSummary.js +1 -3
  284. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  285. package/esm/form/fieldset/Fieldset.d.ts +0 -4
  286. package/esm/form/fieldset/Fieldset.js +5 -9
  287. package/esm/form/fieldset/Fieldset.js.map +1 -1
  288. package/esm/form/fieldset/useFieldset.d.ts +5 -3
  289. package/esm/form/fieldset/useFieldset.js +10 -5
  290. package/esm/form/fieldset/useFieldset.js.map +1 -1
  291. package/esm/form/radio/Radio.js +9 -7
  292. package/esm/form/radio/Radio.js.map +1 -1
  293. package/esm/form/radio/RadioGroup.context.d.ts +8 -0
  294. package/esm/form/radio/RadioGroup.context.js +3 -0
  295. package/esm/form/radio/RadioGroup.context.js.map +1 -0
  296. package/esm/form/radio/RadioGroup.d.ts +0 -8
  297. package/esm/form/radio/RadioGroup.js +9 -9
  298. package/esm/form/radio/RadioGroup.js.map +1 -1
  299. package/esm/form/radio/radio-input/RadioInput.d.ts +19 -0
  300. package/esm/form/radio/radio-input/RadioInput.js +19 -0
  301. package/esm/form/radio/radio-input/RadioInput.js.map +1 -0
  302. package/esm/form/radio/useRadio.js +1 -1
  303. package/esm/form/radio/useRadio.js.map +1 -1
  304. package/esm/form/search/Search.js +1 -3
  305. package/esm/form/search/Search.js.map +1 -1
  306. package/esm/inline-message/root/InlineMessage.js +2 -5
  307. package/esm/inline-message/root/InlineMessage.js.map +1 -1
  308. package/esm/modal/Modal.js +1 -3
  309. package/esm/modal/Modal.js.map +1 -1
  310. package/esm/modal/ModalUtils.js +1 -1
  311. package/esm/modal/ModalUtils.js.map +1 -1
  312. package/esm/primitives/box/Box.d.ts +1 -1
  313. package/esm/process/Process.js +1 -5
  314. package/esm/process/Process.js.map +1 -1
  315. package/esm/tabs/useTabs.js +3 -7
  316. package/esm/tabs/useTabs.js.map +1 -1
  317. package/esm/timeline/Timeline.js +26 -63
  318. package/esm/timeline/Timeline.js.map +1 -1
  319. package/esm/timeline/TimelineRow.js +10 -14
  320. package/esm/timeline/TimelineRow.js.map +1 -1
  321. package/esm/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  322. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js +141 -0
  323. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  324. package/esm/timeline/hooks/usePeriodContext.d.ts +0 -1
  325. package/esm/timeline/hooks/usePeriodContext.js +0 -1
  326. package/esm/timeline/hooks/usePeriodContext.js.map +1 -1
  327. package/esm/timeline/hooks/useRowContext.d.ts +0 -1
  328. package/esm/timeline/hooks/useRowContext.js +0 -1
  329. package/esm/timeline/hooks/useRowContext.js.map +1 -1
  330. package/esm/timeline/hooks/useTimelineContext.d.ts +0 -4
  331. package/esm/timeline/hooks/useTimelineContext.js +0 -4
  332. package/esm/timeline/hooks/useTimelineContext.js.map +1 -1
  333. package/esm/timeline/period/ClickablePeriod.js +7 -21
  334. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  335. package/esm/timeline/period/NonClickablePeriod.js +1 -1
  336. package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
  337. package/esm/timeline/pin/PinInternal.js +10 -11
  338. package/esm/timeline/pin/PinInternal.js.map +1 -1
  339. package/esm/toggle-group/useToggleGroup.js +1 -1
  340. package/esm/toggle-group/useToggleGroup.js.map +1 -1
  341. package/esm/utils/components/HighlightText/HighlightText.js +1 -4
  342. package/esm/utils/components/HighlightText/HighlightText.js.map +1 -1
  343. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  344. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  345. package/esm/utils/helpers/create-strict-context.js +1 -1
  346. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  347. package/esm/utils/hooks/useEventCallback.js +1 -1
  348. package/esm/utils/hooks/useEventCallback.js.map +1 -1
  349. package/esm/utils/hooks/useMedia.js +1 -1
  350. package/esm/utils/hooks/useMedia.js.map +1 -1
  351. package/package.json +9 -7
  352. package/src/alert/base-alert/content/BaseAlertContent.tsx +7 -2
  353. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +73 -29
  354. package/src/data/drag-and-drop/item/DragAndDropItem.tsx +28 -18
  355. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +4 -2
  356. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +303 -209
  357. package/src/data/drag-and-drop/types.ts +5 -0
  358. package/src/data/table/base-cell/DataTableBaseCell.tsx +92 -0
  359. package/src/data/table/column-header/DataTableColumnHeader.tsx +180 -0
  360. package/src/data/table/empty-state/DataTableEmptyState.tsx +5 -3
  361. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +49 -45
  362. package/src/data/table/helpers/selection/getSingleSelectProps.ts +15 -13
  363. package/src/data/table/helpers/selection/selection.types.ts +46 -21
  364. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +93 -56
  365. package/src/data/table/hooks/useColumnOptions.ts +48 -0
  366. package/src/data/table/hooks/useTableExpansion.tsx +100 -0
  367. package/src/data/table/hooks/useTableKeyboardNav.ts +7 -5
  368. package/src/data/table/hooks/useTableSelection.ts +77 -46
  369. package/src/data/table/hooks/useTableSort.ts +103 -0
  370. package/src/data/table/loading-state/DataTableLoadingState.tsx +5 -3
  371. package/src/data/table/root/DataTable.types.ts +64 -5
  372. package/src/data/table/root/DataTableAuto.tsx +383 -95
  373. package/src/data/table/root/DataTableRoot.context.ts +30 -1
  374. package/src/data/table/root/DataTableRoot.tsx +14 -11
  375. package/src/data/table/tbody/DataTableTbody.tsx +17 -6
  376. package/src/data/table/td/DataTableTd.tsx +10 -33
  377. package/src/data/table/tfoot/DataTableTfoot.tsx +10 -7
  378. package/src/data/table/th/DataTableTh.tsx +11 -172
  379. package/src/data/table/thead/DataTableThead.tsx +3 -3
  380. package/src/data/table/tr/DataTableTr.tsx +300 -11
  381. package/src/data/token-filter/FilterChip.tsx +100 -0
  382. package/src/data/token-filter/TokenFilter.tsx +8 -24
  383. package/src/date/datepicker/hooks/useRangeDatepicker.tsx +1 -1
  384. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +2 -1
  385. package/src/date/datepicker/parts/DatePicker.RDP.tsx +34 -15
  386. package/src/date/monthpicker/parts/MonthPicker.Button.tsx +11 -9
  387. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +1 -1
  388. package/src/dialog/popup/DialogPopupInternal.tsx +1 -1
  389. package/src/form/checkbox/Checkbox.tsx +37 -64
  390. package/src/form/checkbox/CheckboxGroup.context.ts +10 -0
  391. package/src/form/checkbox/CheckboxGroup.tsx +18 -28
  392. package/src/form/checkbox/checkbox-input/CheckboxInput.tsx +69 -0
  393. package/src/form/checkbox/types.ts +1 -1
  394. package/src/form/checkbox/useCheckbox.ts +1 -1
  395. package/src/form/fieldset/Fieldset.tsx +8 -14
  396. package/src/form/fieldset/useFieldset.ts +13 -6
  397. package/src/form/radio/Radio.tsx +43 -38
  398. package/src/form/radio/RadioGroup.context.ts +13 -0
  399. package/src/form/radio/RadioGroup.tsx +22 -31
  400. package/src/form/radio/radio-input/RadioInput.tsx +32 -0
  401. package/src/form/radio/useRadio.ts +1 -1
  402. package/src/inline-message/root/InlineMessage.tsx +3 -13
  403. package/src/modal/ModalUtils.ts +1 -1
  404. package/src/primitives/box/Box.tsx +1 -1
  405. package/src/tabs/useTabs.ts +3 -7
  406. package/src/timeline/Timeline.tsx +62 -91
  407. package/src/timeline/TimelineRow.tsx +19 -17
  408. package/src/timeline/hooks/TimelineKeyboardNavProvider.tsx +237 -0
  409. package/src/timeline/hooks/usePeriodContext.tsx +0 -2
  410. package/src/timeline/hooks/useRowContext.tsx +0 -2
  411. package/src/timeline/hooks/useTimelineContext.tsx +0 -8
  412. package/src/timeline/period/ClickablePeriod.tsx +8 -19
  413. package/src/timeline/period/NonClickablePeriod.tsx +2 -0
  414. package/src/timeline/pin/PinInternal.tsx +10 -13
  415. package/src/toggle-group/useToggleGroup.ts +1 -1
  416. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  417. package/src/utils/helpers/create-strict-context.tsx +1 -1
  418. package/src/utils/hooks/useEventCallback.ts +1 -1
  419. package/src/utils/hooks/useMedia.ts +1 -1
  420. package/cjs/data/table/th/DataTableThActions.d.ts +0 -5
  421. package/cjs/data/table/th/DataTableThActions.js +0 -23
  422. package/cjs/data/table/th/DataTableThActions.js.map +0 -1
  423. package/cjs/data/table/th/useTableColumnResize.js.map +0 -1
  424. package/cjs/data/table/thead/DataTableThead.context.d.ts +0 -4
  425. package/cjs/data/table/thead/DataTableThead.context.js.map +0 -1
  426. package/esm/data/table/th/DataTableThActions.d.ts +0 -5
  427. package/esm/data/table/th/DataTableThActions.js +0 -18
  428. package/esm/data/table/th/DataTableThActions.js.map +0 -1
  429. package/esm/data/table/th/useTableColumnResize.js.map +0 -1
  430. package/esm/data/table/thead/DataTableThead.context.d.ts +0 -4
  431. package/esm/data/table/thead/DataTableThead.context.js +0 -8
  432. package/esm/data/table/thead/DataTableThead.context.js.map +0 -1
  433. package/src/data/table/th/DataTableThActions.tsx +0 -32
  434. package/src/data/table/thead/DataTableThead.context.ts +0 -10
  435. /package/cjs/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  436. /package/cjs/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  437. /package/esm/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  438. /package/esm/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  439. /package/src/data/table/{th → column-header}/useTableColumnResize.ts +0 -0
@@ -1,23 +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 { Checkbox } from "../../../form/checkbox";
2
+ import React, { forwardRef, useMemo } from "react";
3
+ import { Skeleton } from "../../../skeleton";
4
+ import { useId } from "../../../utils-external";
4
5
  import { cl } from "../../../utils/helpers";
5
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";
6
16
  import { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
7
17
  import {
8
18
  type SelectionProps,
9
19
  useTableSelection,
10
20
  } from "../hooks/useTableSelection";
21
+ import { type TableSortOptions, useTableSort } from "../hooks/useTableSort";
22
+ import { DataTableLoadingState } from "../loading-state/DataTableLoadingState";
11
23
  import { DataTableTbody } from "../tbody/DataTableTbody";
12
- import { DataTableTd } from "../td/DataTableTd";
13
- import { DataTableTh } from "../th/DataTableTh";
14
24
  import { DataTableThead } from "../thead/DataTableThead";
15
25
  import { DataTableTr } from "../tr/DataTableTr";
16
26
  import type { ColumnDefinitions } from "./DataTable.types";
17
- import { DataTableContextProvider } from "./DataTableRoot.context";
27
+ import {
28
+ DataTableContextProvider,
29
+ useDataTableContext,
30
+ } from "./DataTableRoot.context";
18
31
 
19
32
  interface DataTableProps<T>
20
- extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
33
+ extends
34
+ React.HTMLAttributes<HTMLTableElement>,
35
+ SelectionProps,
36
+ TableSortOptions {
21
37
  children?: never;
22
38
  /**
23
39
  * Controls vertical cell padding.
@@ -63,16 +79,115 @@ interface DataTableProps<T>
63
79
  */
64
80
  layout?: "fixed" | "auto";
65
81
  /**
82
+ * Defines the columns of the table and how to render them.
83
+ *
66
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.
67
86
  */
68
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
+ */
69
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
+ */
70
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;
71
185
  }
72
186
 
73
187
  function DataTableAutoInner<T>(
74
188
  {
75
189
  className,
190
+ id,
76
191
  rowDensity = "normal",
77
192
  withKeyboardNav = false,
78
193
  zebraStripes = false,
@@ -83,119 +198,292 @@ function DataTableAutoInner<T>(
83
198
  selectedKeys,
84
199
  defaultSelectedKeys,
85
200
  onSelectionChange,
86
- disabledKeys = [],
201
+ disabledSelectionKeys = [],
87
202
  data,
88
203
  columnDefinitions,
89
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,
90
223
  ...rest
91
224
  }: DataTableProps<T>,
92
225
  forwardedRef: React.ForwardedRef<HTMLTableElement>,
93
226
  ) {
94
- const [tableRef, setTableRef] = useState<HTMLTableElement | null>(null);
95
- const mergedRef = useMergeRefs(forwardedRef, setTableRef);
96
-
97
- const { tabIndex } = useTableKeyboardNav(tableRef, {
227
+ const { tabIndex, setTableRef } = useTableKeyboardNav({
98
228
  enabled: withKeyboardNav,
99
229
  shouldBlockNavigation,
100
230
  });
101
231
 
102
- const resolvedGetRowId =
103
- getRowId ??
104
- (((_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]);
105
246
 
106
- const selection = useTableSelection({
247
+ const tableSelectionState = useTableSelection({
107
248
  selectionMode: selectionModeProp,
108
249
  selectedKeys,
109
250
  defaultSelectedKeys,
110
251
  onSelectionChange,
111
- disabledKeys,
112
- data,
113
- getRowId: resolvedGetRowId,
252
+ disabledSelectionKeys,
253
+ allRowKeys,
254
+ });
255
+
256
+ const { columns, stickySelection } = useColumnOptions<T>(columnDefinitions, {
257
+ stickyColumns,
258
+ selectionMode: tableSelectionState.selection.selectionMode,
114
259
  });
115
260
 
261
+ const tableId = useId(id);
262
+
116
263
  return (
117
- <DataTableContextProvider layout={layout} withKeyboardNav={withKeyboardNav}>
118
- <div className="aksel-data-table__border-wrapper">
119
- <div className="aksel-data-table__scroll-wrapper">
120
- <table
121
- {...rest}
122
- ref={mergedRef}
123
- className={cl("aksel-data-table", className)}
124
- data-zebra-stripes={zebraStripes}
125
- data-truncate-content={truncateContent}
126
- data-density={rowDensity}
127
- data-layout={layout}
128
- tabIndex={tabIndex}
129
- >
130
- <DataTableThead>
131
- <DataTableTr>
132
- {selection.selectionMode === "multiple" && (
133
- /* TODO: Overflow/focus is clipped. Alignment is off */
134
- /* TODO: Should not be resizable */
135
- <DataTableTh textAlign="center" width="60px">
136
- <Checkbox {...selection.getTheadCheckboxProps()} />
137
- </DataTableTh>
138
- )}
139
- {selection.selectionMode === "single" && (
140
- <DataTableTd align="center" width="60px" />
141
- )}
142
- {columnDefinitions.map((colDef, colDefIndex) => {
143
- return (
144
- <DataTableTh
145
- /* TODO: Make these user-changable */
146
- maxWidth="400px"
147
- minWidth="100px"
148
- defaultWidth="100%"
149
- textAlign="left"
150
- key={colDef.id || colDefIndex}
151
- >
152
- {colDef.header}
153
- </DataTableTh>
154
- );
155
- })}
156
- </DataTableTr>
157
- </DataTableThead>
158
- <DataTableTbody>
159
- {data.map((rowData, rowIndex) => {
160
- const rowId = selection.allKeys[rowIndex];
161
- return (
162
- <DataTableTr key={rowId}>
163
- {selection.selectionMode === "multiple" && (
164
- <DataTableTd align="center" width="60px">
165
- <Checkbox {...selection.getRowCheckboxProps(rowId)} />
166
- </DataTableTd>
167
- )}
168
- {selection.selectionMode === "single" && (
169
- <DataTableTd align="center" width="60px">
170
- {/**
171
- * TODO: This should be a radio, but our current Radio implementation has some issues:
172
- * - Checked cant be controlled outside of radiogroup
173
- * - Cant hide label
174
- * */}
175
- <Checkbox {...selection.getRowRadioProps(rowId)} />
176
- </DataTableTd>
177
- )}
178
- {columnDefinitions.map((colDef, colDefIndex) => {
179
- return (
180
- <DataTableTd
181
- textAlign="left"
182
- key={colDef.id || colDefIndex}
183
- >
184
- {colDef.cell(rowData)}
185
- </DataTableTd>
186
- );
187
- })}
188
- </DataTableTr>
189
- );
190
- })}
191
- </DataTableTbody>
192
- </table>
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)}
319
+ >
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>
193
339
  </div>
194
- </div>
340
+ </DataTableExpansionProvider>
195
341
  </DataTableContextProvider>
196
342
  );
197
343
  }
198
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
+
199
487
  const DataTableAuto = forwardRef(DataTableAutoInner) as <T>(
200
488
  props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
201
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">
@@ -1,16 +1,27 @@
1
- import React, { forwardRef } from "react";
1
+ import React, { forwardRef, version } from "react";
2
2
  import { cl } from "../../../utils/helpers";
3
+ import {
4
+ DataTableLocationProvider,
5
+ useDataTableContext,
6
+ } from "../root/DataTableRoot.context";
3
7
 
4
8
  type DataTableTbodyProps = React.HTMLAttributes<HTMLTableSectionElement>;
5
9
 
10
+ const inertValue = parseInt(version.split(".")[0], 10) > 18 ? true : ""; // Support for inert was added in React 19
11
+
6
12
  const DataTableTbody = forwardRef<HTMLTableSectionElement, DataTableTbodyProps>(
7
13
  ({ className, ...rest }, forwardedRef) => {
14
+ const { showLoadingOverlay } = useDataTableContext();
8
15
  return (
9
- <tbody
10
- {...rest}
11
- ref={forwardedRef}
12
- className={cl("aksel-data-table__tbody", className)}
13
- />
16
+ <DataTableLocationProvider location="tbody">
17
+ <tbody
18
+ {...rest}
19
+ ref={forwardedRef}
20
+ className={cl("aksel-data-table__tbody", className)}
21
+ // @ts-expect-error - inert is not yet recognized by React's type definitions, but we want to use it for better accessibility when showing the loading overlay.
22
+ inert={showLoadingOverlay ? inertValue : false}
23
+ />
24
+ </DataTableLocationProvider>
14
25
  );
15
26
  },
16
27
  );