@navikt/ds-react 8.7.0 → 8.8.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 (330) hide show
  1. package/cjs/alert/base-alert/root/BaseAlertRoot.js +1 -2
  2. package/cjs/alert/base-alert/root/BaseAlertRoot.js.map +1 -1
  3. package/cjs/alert/info-card/index.d.ts +2 -2
  4. package/cjs/alert/info-card/index.js +2 -1
  5. package/cjs/alert/info-card/index.js.map +1 -1
  6. package/cjs/alert/info-card/message/InfoCardMessage.d.ts +23 -0
  7. package/cjs/alert/info-card/message/InfoCardMessage.js +73 -0
  8. package/cjs/alert/info-card/message/InfoCardMessage.js.map +1 -0
  9. package/cjs/alert/info-card/root/InfoCardRoot.d.ts +15 -2
  10. package/cjs/alert/info-card/root/InfoCardRoot.js +4 -1
  11. package/cjs/alert/info-card/root/InfoCardRoot.js.map +1 -1
  12. package/cjs/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.d.ts +21 -0
  13. package/cjs/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.js +24 -0
  14. package/cjs/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  15. package/cjs/data/drag-and-drop/item/DataDragAndDropItem.js +7 -57
  16. package/cjs/data/drag-and-drop/item/DataDragAndDropItem.js.map +1 -1
  17. package/cjs/data/drag-and-drop/root/DataDragAndDrop.context.d.ts +4 -1
  18. package/cjs/data/drag-and-drop/root/DataDragAndDrop.context.js +7 -3
  19. package/cjs/data/drag-and-drop/root/DataDragAndDrop.context.js.map +1 -1
  20. package/cjs/data/drag-and-drop/root/DataDragAndDropRoot.d.ts +12 -2
  21. package/cjs/data/drag-and-drop/root/DataDragAndDropRoot.js +14 -64
  22. package/cjs/data/drag-and-drop/root/DataDragAndDropRoot.js.map +1 -1
  23. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +22 -0
  24. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +35 -0
  25. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  26. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +27 -0
  27. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js +86 -0
  28. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +1 -0
  29. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +5 -0
  30. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js +6 -0
  31. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +1 -0
  32. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +24 -0
  33. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js +108 -0
  34. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +1 -0
  35. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +5 -0
  36. package/cjs/data/table/empty-state/DataTableEmptyState.js +57 -0
  37. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -0
  38. package/cjs/data/table/helpers/table-focus.js +7 -1
  39. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  40. package/cjs/data/table/helpers/table-keyboard.d.ts +0 -1
  41. package/cjs/data/table/helpers/table-keyboard.js +2 -4
  42. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  43. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +5 -0
  44. package/cjs/data/table/loading-state/DataTableLoadingState.js +57 -0
  45. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -0
  46. package/cjs/data/table/root/DataTable.types.d.ts +13 -0
  47. package/cjs/data/table/root/DataTable.types.js +3 -0
  48. package/cjs/data/table/root/DataTable.types.js.map +1 -0
  49. package/cjs/data/table/root/DataTableAuto.d.ts +60 -0
  50. package/cjs/data/table/root/DataTableAuto.js +99 -0
  51. package/cjs/data/table/root/DataTableAuto.js.map +1 -0
  52. package/cjs/data/table/root/DataTableRoot.context.d.ts +3 -2
  53. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  54. package/cjs/data/table/root/DataTableRoot.d.ts +30 -3
  55. package/cjs/data/table/root/DataTableRoot.js +8 -2
  56. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  57. package/cjs/data/table/root/useTableKeyboardNav.js +1 -0
  58. package/cjs/data/table/root/useTableKeyboardNav.js.map +1 -1
  59. package/cjs/data/table/root/useTableSelection.d.ts +55 -0
  60. package/cjs/data/table/root/useTableSelection.js +79 -0
  61. package/cjs/data/table/root/useTableSelection.js.map +1 -0
  62. package/cjs/data/table/td/DataTableTd.d.ts +10 -0
  63. package/cjs/data/table/td/DataTableTd.js +4 -2
  64. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  65. package/cjs/data/table/th/DataTableTh.d.ts +10 -4
  66. package/cjs/data/table/th/DataTableTh.js +24 -22
  67. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  68. package/cjs/data/table/th/useTableColumnResize.d.ts +64 -0
  69. package/cjs/data/table/th/useTableColumnResize.js +144 -0
  70. package/cjs/data/table/th/useTableColumnResize.js.map +1 -0
  71. package/cjs/data/table/thead/DataTableThead.context.d.ts +4 -0
  72. package/cjs/data/table/thead/DataTableThead.context.js +45 -0
  73. package/cjs/data/table/thead/DataTableThead.context.js.map +1 -0
  74. package/cjs/data/table/thead/DataTableThead.js +3 -1
  75. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  76. package/cjs/data/table/tr/DataTableTr.js +4 -3
  77. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  78. package/cjs/data/token-filter/AutoSuggest.js +4 -6
  79. package/cjs/data/token-filter/AutoSuggest.js.map +1 -1
  80. package/cjs/date/Date.Input.js +1 -1
  81. package/cjs/date/Date.Input.js.map +1 -1
  82. package/cjs/date/datepicker/hooks/useDatepicker.d.ts +12 -1
  83. package/cjs/date/datepicker/hooks/useDatepicker.js.map +1 -1
  84. package/cjs/date/monthpicker/hooks/useMonthPicker.d.ts +11 -1
  85. package/cjs/date/monthpicker/hooks/useMonthPicker.js.map +1 -1
  86. package/cjs/form/checkbox/CheckboxGroup.js +1 -1
  87. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  88. package/cjs/form/fieldset/Fieldset.d.ts +25 -5
  89. package/cjs/form/fieldset/Fieldset.js +19 -2
  90. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  91. package/cjs/form/radio/RadioGroup.js +1 -1
  92. package/cjs/form/radio/RadioGroup.js.map +1 -1
  93. package/cjs/index.d.ts +1 -1
  94. package/cjs/index.js.map +1 -1
  95. package/cjs/read-more/ReadMore.d.ts +10 -0
  96. package/cjs/read-more/ReadMore.js +4 -6
  97. package/cjs/read-more/ReadMore.js.map +1 -1
  98. package/cjs/types/index.d.ts +1 -1
  99. package/cjs/types/index.js +0 -15
  100. package/cjs/types/index.js.map +1 -1
  101. package/cjs/utils/components/Listbox/input-slot/ListboxInputSlot.js +1 -1
  102. package/cjs/utils/components/Listbox/input-slot/ListboxInputSlot.js.map +1 -1
  103. package/cjs/utils/components/Listbox/option/ListboxOption.d.ts +24 -0
  104. package/cjs/utils/components/Listbox/{item/ListboxItem.js → option/ListboxOption.js} +8 -8
  105. package/cjs/utils/components/Listbox/option/ListboxOption.js.map +1 -0
  106. package/cjs/utils/components/Listbox/options/ListboxOptions.d.ts +8 -0
  107. package/cjs/utils/components/Listbox/{list/ListboxList.js → options/ListboxOptions.js} +8 -8
  108. package/cjs/utils/components/Listbox/options/ListboxOptions.js.map +1 -0
  109. package/cjs/utils/components/Listbox/root/ListboxRoot.d.ts +6 -6
  110. package/cjs/utils/components/Listbox/root/ListboxRoot.js +28 -28
  111. package/cjs/utils/components/Listbox/root/ListboxRoot.js.map +1 -1
  112. package/cjs/utils/components/Listbox/root/domHelpers.d.ts +3 -3
  113. package/cjs/utils/components/Listbox/root/domHelpers.js +8 -8
  114. package/cjs/utils/components/Listbox/root/domHelpers.js.map +1 -1
  115. package/cjs/utils/components/floating/Floating.d.ts +1 -1
  116. package/cjs/utils/components/floating/Floating.js +1 -1
  117. package/cjs/utils/components/floating/Floating.js.map +1 -1
  118. package/cjs/utils/components/focus-boundary/FocusBoundary.d.ts +0 -1
  119. package/cjs/utils/components/focus-boundary/FocusBoundary.js +1 -1
  120. package/cjs/utils/components/focus-boundary/FocusBoundary.js.map +1 -1
  121. package/cjs/utils/components/link-anchor/LinkAnchor.js +10 -0
  122. package/cjs/utils/components/link-anchor/LinkAnchor.js.map +1 -1
  123. package/cjs/utils/helpers/className.js +1 -1
  124. package/cjs/utils/helpers/className.js.map +1 -1
  125. package/cjs/utils/helpers/focus.d.ts +3 -1
  126. package/cjs/utils/helpers/focus.js +2 -2
  127. package/cjs/utils/helpers/focus.js.map +1 -1
  128. package/cjs/utils/helpers/index.d.ts +9 -9
  129. package/cjs/utils/helpers/index.js +22 -23
  130. package/cjs/utils/helpers/index.js.map +1 -1
  131. package/cjs/utils/hooks/index.d.ts +13 -13
  132. package/cjs/utils/hooks/index.js +31 -28
  133. package/cjs/utils/hooks/index.js.map +1 -1
  134. package/cjs/utils/hooks/useScrollLock.js +41 -11
  135. package/cjs/utils/hooks/useScrollLock.js.map +1 -1
  136. package/esm/alert/base-alert/root/BaseAlertRoot.js +1 -2
  137. package/esm/alert/base-alert/root/BaseAlertRoot.js.map +1 -1
  138. package/esm/alert/info-card/index.d.ts +2 -2
  139. package/esm/alert/info-card/index.js +1 -1
  140. package/esm/alert/info-card/index.js.map +1 -1
  141. package/esm/alert/info-card/message/InfoCardMessage.d.ts +23 -0
  142. package/esm/alert/info-card/message/InfoCardMessage.js +37 -0
  143. package/esm/alert/info-card/message/InfoCardMessage.js.map +1 -0
  144. package/esm/alert/info-card/root/InfoCardRoot.d.ts +15 -2
  145. package/esm/alert/info-card/root/InfoCardRoot.js +3 -1
  146. package/esm/alert/info-card/root/InfoCardRoot.js.map +1 -1
  147. package/esm/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.d.ts +21 -0
  148. package/esm/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.js +18 -0
  149. package/esm/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  150. package/esm/data/drag-and-drop/item/DataDragAndDropItem.js +4 -24
  151. package/esm/data/drag-and-drop/item/DataDragAndDropItem.js.map +1 -1
  152. package/esm/data/drag-and-drop/root/DataDragAndDrop.context.d.ts +4 -1
  153. package/esm/data/drag-and-drop/root/DataDragAndDrop.context.js +5 -2
  154. package/esm/data/drag-and-drop/root/DataDragAndDrop.context.js.map +1 -1
  155. package/esm/data/drag-and-drop/root/DataDragAndDropRoot.d.ts +12 -2
  156. package/esm/data/drag-and-drop/root/DataDragAndDropRoot.js +15 -65
  157. package/esm/data/drag-and-drop/root/DataDragAndDropRoot.js.map +1 -1
  158. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +22 -0
  159. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +29 -0
  160. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  161. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.d.ts +27 -0
  162. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js +50 -0
  163. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +1 -0
  164. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.d.ts +5 -0
  165. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js +3 -0
  166. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +1 -0
  167. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.d.ts +24 -0
  168. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js +68 -0
  169. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +1 -0
  170. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +5 -0
  171. package/esm/data/table/empty-state/DataTableEmptyState.js +21 -0
  172. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -0
  173. package/esm/data/table/helpers/table-focus.js +7 -1
  174. package/esm/data/table/helpers/table-focus.js.map +1 -1
  175. package/esm/data/table/helpers/table-keyboard.d.ts +0 -1
  176. package/esm/data/table/helpers/table-keyboard.js +2 -4
  177. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  178. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +5 -0
  179. package/esm/data/table/loading-state/DataTableLoadingState.js +21 -0
  180. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -0
  181. package/esm/data/table/root/DataTable.types.d.ts +13 -0
  182. package/esm/data/table/root/DataTable.types.js +2 -0
  183. package/esm/data/table/root/DataTable.types.js.map +1 -0
  184. package/esm/data/table/root/DataTableAuto.d.ts +60 -0
  185. package/esm/data/table/root/DataTableAuto.js +63 -0
  186. package/esm/data/table/root/DataTableAuto.js.map +1 -0
  187. package/esm/data/table/root/DataTableRoot.context.d.ts +3 -2
  188. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  189. package/esm/data/table/root/DataTableRoot.d.ts +30 -3
  190. package/esm/data/table/root/DataTableRoot.js +6 -2
  191. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  192. package/esm/data/table/root/useTableKeyboardNav.js +1 -0
  193. package/esm/data/table/root/useTableKeyboardNav.js.map +1 -1
  194. package/esm/data/table/root/useTableSelection.d.ts +55 -0
  195. package/esm/data/table/root/useTableSelection.js +77 -0
  196. package/esm/data/table/root/useTableSelection.js.map +1 -0
  197. package/esm/data/table/td/DataTableTd.d.ts +10 -0
  198. package/esm/data/table/td/DataTableTd.js +4 -2
  199. package/esm/data/table/td/DataTableTd.js.map +1 -1
  200. package/esm/data/table/th/DataTableTh.d.ts +10 -4
  201. package/esm/data/table/th/DataTableTh.js +25 -23
  202. package/esm/data/table/th/DataTableTh.js.map +1 -1
  203. package/esm/data/table/th/useTableColumnResize.d.ts +64 -0
  204. package/esm/data/table/th/useTableColumnResize.js +142 -0
  205. package/esm/data/table/th/useTableColumnResize.js.map +1 -0
  206. package/esm/data/table/thead/DataTableThead.context.d.ts +4 -0
  207. package/esm/data/table/thead/DataTableThead.context.js +8 -0
  208. package/esm/data/table/thead/DataTableThead.context.js.map +1 -0
  209. package/esm/data/table/thead/DataTableThead.js +3 -1
  210. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  211. package/esm/data/table/tr/DataTableTr.js +4 -3
  212. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  213. package/esm/data/token-filter/AutoSuggest.js +4 -6
  214. package/esm/data/token-filter/AutoSuggest.js.map +1 -1
  215. package/esm/date/Date.Input.js +1 -1
  216. package/esm/date/Date.Input.js.map +1 -1
  217. package/esm/date/datepicker/hooks/useDatepicker.d.ts +12 -1
  218. package/esm/date/datepicker/hooks/useDatepicker.js.map +1 -1
  219. package/esm/date/monthpicker/hooks/useMonthPicker.d.ts +11 -1
  220. package/esm/date/monthpicker/hooks/useMonthPicker.js.map +1 -1
  221. package/esm/form/checkbox/CheckboxGroup.js +1 -1
  222. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  223. package/esm/form/fieldset/Fieldset.d.ts +25 -5
  224. package/esm/form/fieldset/Fieldset.js +19 -2
  225. package/esm/form/fieldset/Fieldset.js.map +1 -1
  226. package/esm/form/radio/RadioGroup.js +1 -1
  227. package/esm/form/radio/RadioGroup.js.map +1 -1
  228. package/esm/index.d.ts +1 -1
  229. package/esm/index.js.map +1 -1
  230. package/esm/read-more/ReadMore.d.ts +10 -0
  231. package/esm/read-more/ReadMore.js +4 -6
  232. package/esm/read-more/ReadMore.js.map +1 -1
  233. package/esm/types/index.d.ts +1 -1
  234. package/esm/types/index.js +1 -1
  235. package/esm/types/index.js.map +1 -1
  236. package/esm/utils/components/Listbox/input-slot/ListboxInputSlot.js +1 -1
  237. package/esm/utils/components/Listbox/input-slot/ListboxInputSlot.js.map +1 -1
  238. package/esm/utils/components/Listbox/option/ListboxOption.d.ts +24 -0
  239. package/esm/utils/components/Listbox/{item/ListboxItem.js → option/ListboxOption.js} +7 -7
  240. package/esm/utils/components/Listbox/option/ListboxOption.js.map +1 -0
  241. package/esm/utils/components/Listbox/options/ListboxOptions.d.ts +8 -0
  242. package/esm/utils/components/Listbox/{list/ListboxList.js → options/ListboxOptions.js} +8 -8
  243. package/esm/utils/components/Listbox/options/ListboxOptions.js.map +1 -0
  244. package/esm/utils/components/Listbox/root/ListboxRoot.d.ts +6 -6
  245. package/esm/utils/components/Listbox/root/ListboxRoot.js +29 -29
  246. package/esm/utils/components/Listbox/root/ListboxRoot.js.map +1 -1
  247. package/esm/utils/components/Listbox/root/domHelpers.d.ts +3 -3
  248. package/esm/utils/components/Listbox/root/domHelpers.js +7 -7
  249. package/esm/utils/components/Listbox/root/domHelpers.js.map +1 -1
  250. package/esm/utils/components/floating/Floating.d.ts +1 -1
  251. package/esm/utils/components/floating/Floating.js +1 -1
  252. package/esm/utils/components/floating/Floating.js.map +1 -1
  253. package/esm/utils/components/focus-boundary/FocusBoundary.d.ts +0 -1
  254. package/esm/utils/components/focus-boundary/FocusBoundary.js +1 -1
  255. package/esm/utils/components/focus-boundary/FocusBoundary.js.map +1 -1
  256. package/esm/utils/components/link-anchor/LinkAnchor.js +10 -0
  257. package/esm/utils/components/link-anchor/LinkAnchor.js.map +1 -1
  258. package/esm/utils/helpers/className.js +1 -1
  259. package/esm/utils/helpers/className.js.map +1 -1
  260. package/esm/utils/helpers/focus.d.ts +3 -1
  261. package/esm/utils/helpers/focus.js +2 -2
  262. package/esm/utils/helpers/focus.js.map +1 -1
  263. package/esm/utils/helpers/index.d.ts +9 -9
  264. package/esm/utils/helpers/index.js +9 -9
  265. package/esm/utils/helpers/index.js.map +1 -1
  266. package/esm/utils/hooks/index.d.ts +13 -13
  267. package/esm/utils/hooks/index.js +13 -13
  268. package/esm/utils/hooks/index.js.map +1 -1
  269. package/esm/utils/hooks/useScrollLock.js +41 -11
  270. package/esm/utils/hooks/useScrollLock.js.map +1 -1
  271. package/package.json +5 -5
  272. package/src/alert/base-alert/root/BaseAlertRoot.tsx +1 -1
  273. package/src/alert/info-card/index.ts +2 -0
  274. package/src/alert/info-card/message/InfoCardMessage.tsx +48 -0
  275. package/src/alert/info-card/root/InfoCardRoot.tsx +20 -1
  276. package/src/data/drag-and-drop/drag-handler/DataDragAndDropDragHandler.tsx +63 -0
  277. package/src/data/drag-and-drop/item/DataDragAndDropItem.tsx +6 -53
  278. package/src/data/drag-and-drop/root/DataDragAndDrop.context.tsx +9 -4
  279. package/src/data/drag-and-drop/root/DataDragAndDropRoot.tsx +19 -63
  280. package/src/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx +104 -0
  281. package/src/data/drag-and-drop-old/item/DataDragAndDropItem.tsx +74 -0
  282. package/src/data/drag-and-drop-old/root/DataDragAndDrop.context.tsx +11 -0
  283. package/src/data/drag-and-drop-old/root/DataDragAndDropRoot.tsx +96 -0
  284. package/src/data/table/empty-state/DataTableEmptyState.tsx +26 -0
  285. package/src/data/table/helpers/table-focus.ts +10 -1
  286. package/src/data/table/helpers/table-keyboard.ts +2 -6
  287. package/src/data/table/loading-state/DataTableLoadingState.tsx +26 -0
  288. package/src/data/table/root/DataTable.types.ts +16 -0
  289. package/src/data/table/root/DataTableAuto.tsx +182 -0
  290. package/src/data/table/root/DataTableRoot.context.ts +3 -2
  291. package/src/data/table/root/DataTableRoot.tsx +45 -2
  292. package/src/data/table/root/useTableKeyboardNav.ts +1 -0
  293. package/src/data/table/root/useTableSelection.ts +126 -0
  294. package/src/data/table/td/DataTableTd.tsx +14 -1
  295. package/src/data/table/th/DataTableTh.tsx +48 -36
  296. package/src/data/table/th/useTableColumnResize.ts +276 -0
  297. package/src/data/table/thead/DataTableThead.context.ts +10 -0
  298. package/src/data/table/thead/DataTableThead.tsx +8 -5
  299. package/src/data/table/tr/DataTableTr.tsx +8 -3
  300. package/src/data/token-filter/AutoSuggest.tsx +11 -12
  301. package/src/date/Date.Input.tsx +1 -1
  302. package/src/date/datepicker/hooks/useDatepicker.tsx +12 -1
  303. package/src/date/monthpicker/hooks/useMonthPicker.tsx +11 -1
  304. package/src/form/checkbox/CheckboxGroup.tsx +1 -1
  305. package/src/form/fieldset/Fieldset.tsx +31 -7
  306. package/src/form/radio/RadioGroup.tsx +1 -1
  307. package/src/index.ts +1 -0
  308. package/src/read-more/ReadMore.tsx +15 -16
  309. package/src/types/index.ts +1 -1
  310. package/src/utils/components/Listbox/input-slot/ListboxInputSlot.tsx +1 -1
  311. package/src/utils/components/Listbox/{item/ListboxItem.tsx → option/ListboxOption.tsx} +14 -14
  312. package/src/utils/components/Listbox/{list/ListboxList.tsx → options/ListboxOptions.tsx} +10 -10
  313. package/src/utils/components/Listbox/root/ListboxRoot.tsx +31 -31
  314. package/src/utils/components/Listbox/root/domHelpers.ts +8 -7
  315. package/src/utils/components/floating/Floating.tsx +2 -2
  316. package/src/utils/components/focus-boundary/FocusBoundary.tsx +1 -2
  317. package/src/utils/components/link-anchor/LinkAnchor.tsx +11 -0
  318. package/src/utils/helpers/className.ts +1 -1
  319. package/src/utils/helpers/focus.ts +5 -2
  320. package/src/utils/helpers/index.ts +9 -9
  321. package/src/utils/hooks/index.ts +20 -13
  322. package/src/utils/hooks/useScrollLock.ts +57 -13
  323. package/cjs/utils/components/Listbox/item/ListboxItem.d.ts +0 -24
  324. package/cjs/utils/components/Listbox/item/ListboxItem.js.map +0 -1
  325. package/cjs/utils/components/Listbox/list/ListboxList.d.ts +0 -8
  326. package/cjs/utils/components/Listbox/list/ListboxList.js.map +0 -1
  327. package/esm/utils/components/Listbox/item/ListboxItem.d.ts +0 -24
  328. package/esm/utils/components/Listbox/item/ListboxItem.js.map +0 -1
  329. package/esm/utils/components/Listbox/list/ListboxList.d.ts +0 -8
  330. package/esm/utils/components/Listbox/list/ListboxList.js.map +0 -1
@@ -0,0 +1,182 @@
1
+ import React, { forwardRef, useState } from "react";
2
+ import { Checkbox } from "../../../form/checkbox";
3
+ import { cl } from "../../../utils/helpers";
4
+ import { useMergeRefs } from "../../../utils/hooks";
5
+ import { DataTableTbody } from "../tbody/DataTableTbody";
6
+ import { DataTableTd } from "../td/DataTableTd";
7
+ import { DataTableTh } from "../th/DataTableTh";
8
+ import { DataTableThead } from "../thead/DataTableThead";
9
+ import { DataTableTr } from "../tr/DataTableTr";
10
+ import type { ColumnDefinitions } from "./DataTable.types";
11
+ import { DataTableContextProvider } from "./DataTableRoot.context";
12
+ import { useTableKeyboardNav } from "./useTableKeyboardNav";
13
+ import { type SelectionProps, useTableSelection } from "./useTableSelection";
14
+
15
+ interface DataTableProps<T>
16
+ extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
17
+ children?: never;
18
+ /**
19
+ * Controls vertical cell padding.
20
+ * @default "normal"
21
+ */
22
+ rowDensity?: "condensed" | "normal" | "spacious";
23
+ /**
24
+ * Zebra striped table
25
+ * @default false
26
+ */
27
+ zebraStripes?: boolean;
28
+ /**
29
+ * Truncate content in cells and show ellipsis for overflowed text.
30
+ *
31
+ * **NB:** When using `layout="auto"`, you have to manually set a `maxWidth` on columns that should be truncated.
32
+ * @default true
33
+ */
34
+ truncateContent?: boolean; // TODO: Consider making this default false when layout=auto, and maybe disallow it but add a wrap prop on the td-comp.
35
+ /**
36
+ * Enables keyboard navigation for table rows and cells.
37
+ * @default false
38
+ */
39
+ withKeyboardNav?: boolean;
40
+ /**
41
+ * Custom callback to determine if navigation should be blocked.
42
+ * Called before default blocking logic.
43
+ * Requires `withKeyboardNav` to be `true`.
44
+ */
45
+ shouldBlockNavigation?: (event: KeyboardEvent) => boolean;
46
+ /**
47
+ * Controls table layout.
48
+ *
49
+ * ### fixed
50
+ * Gives you full control of column widths. This is required for resizable columns.
51
+ *
52
+ * ### auto
53
+ * Makes the columns resize automatically based on the content.
54
+ * The table will take up at least 100% of available width.
55
+ *
56
+ * **NB:** When using this with `truncateContent`, you have to manually
57
+ * set a `contentMaxWidth` on cells that should be truncated.
58
+ * @default "fixed"
59
+ */
60
+ layout?: "fixed" | "auto";
61
+ /**
62
+ *
63
+ */
64
+ columnDefinitions: ColumnDefinitions<T>;
65
+ data: (T & { id: string | number })[];
66
+ }
67
+
68
+ function DataTableAutoInner<T>(
69
+ {
70
+ className,
71
+ rowDensity = "normal",
72
+ withKeyboardNav = false,
73
+ zebraStripes = false,
74
+ truncateContent = true,
75
+ shouldBlockNavigation,
76
+ layout = "fixed",
77
+ selectionMode: selectionModeProp = "none",
78
+ selectedKeys,
79
+ defaultSelectedKeys,
80
+ onSelectionChange,
81
+ disabledKeys = [],
82
+ data,
83
+ columnDefinitions,
84
+ ...rest
85
+ }: DataTableProps<T>,
86
+ forwardedRef: React.ForwardedRef<HTMLTableElement>,
87
+ ) {
88
+ const [tableRef, setTableRef] = useState<HTMLTableElement | null>(null);
89
+ const mergedRef = useMergeRefs(forwardedRef, setTableRef);
90
+
91
+ const { tabIndex } = useTableKeyboardNav(tableRef, {
92
+ enabled: withKeyboardNav,
93
+ shouldBlockNavigation,
94
+ });
95
+
96
+ const { getTheadCheckboxProps, selectionMode, getRowCheckboxProps } =
97
+ useTableSelection({
98
+ selectionMode: selectionModeProp,
99
+ selectedKeys,
100
+ defaultSelectedKeys,
101
+ onSelectionChange,
102
+ disabledKeys,
103
+ data,
104
+ });
105
+
106
+ return (
107
+ <DataTableContextProvider layout={layout} withKeyboardNav={withKeyboardNav}>
108
+ <div className="aksel-data-table__border-wrapper">
109
+ <div className="aksel-data-table__scroll-wrapper">
110
+ <table
111
+ {...rest}
112
+ ref={mergedRef}
113
+ className={cl("aksel-data-table", className)}
114
+ data-zebra-stripes={zebraStripes}
115
+ data-truncate-content={truncateContent}
116
+ data-density={rowDensity}
117
+ data-layout={layout}
118
+ tabIndex={tabIndex}
119
+ >
120
+ <DataTableThead>
121
+ <DataTableTr>
122
+ {getTheadCheckboxProps && (
123
+ <DataTableTd align="center" width="60px">
124
+ <Checkbox {...getTheadCheckboxProps()} />
125
+ </DataTableTd>
126
+ )}
127
+ {columnDefinitions.map((colDef, colDefIndex) => {
128
+ return (
129
+ <DataTableTh
130
+ maxWidth="400px"
131
+ minWidth="100px"
132
+ defaultWidth="100%"
133
+ textAlign="left"
134
+ key={colDef.id || colDefIndex}
135
+ >
136
+ {colDef.header}
137
+ </DataTableTh>
138
+ );
139
+ })}
140
+ </DataTableTr>
141
+ </DataTableThead>
142
+ <DataTableTbody>
143
+ {data.map((rowData, rowIndex) => {
144
+ return (
145
+ <DataTableTr
146
+ key={
147
+ rowIndex /* TODO: Should be more flexible to allow user to define the key? */
148
+ }
149
+ >
150
+ {selectionMode !== "none" && getRowCheckboxProps && (
151
+ <DataTableTd align="center" width="60px">
152
+ <Checkbox {...getRowCheckboxProps(rowData.id)} />
153
+ </DataTableTd>
154
+ )}
155
+ {columnDefinitions.map((colDef, colDefIndex) => {
156
+ return (
157
+ <DataTableTd
158
+ textAlign="left"
159
+ key={colDef.id || colDefIndex}
160
+ >
161
+ {colDef.cell(rowData)}
162
+ </DataTableTd>
163
+ );
164
+ })}
165
+ </DataTableTr>
166
+ );
167
+ })}
168
+ </DataTableTbody>
169
+ </table>
170
+ </div>
171
+ </div>
172
+ </DataTableContextProvider>
173
+ );
174
+ }
175
+
176
+ const DataTableAuto = forwardRef(DataTableAutoInner) as <T>(
177
+ props: DataTableProps<T> & React.RefAttributes<HTMLTableElement>,
178
+ ) => React.ReactElement | null;
179
+
180
+ export { DataTableAuto };
181
+ export type { DataTableProps };
182
+ export default DataTableAuto;
@@ -1,8 +1,9 @@
1
1
  import { createStrictContext } from "../../../utils/helpers";
2
2
 
3
- interface DataTableContextProps {
3
+ type DataTableContextProps = {
4
4
  layout: "fixed" | "auto";
5
- }
5
+ withKeyboardNav: boolean;
6
+ };
6
7
 
7
8
  const { Provider: DataTableContextProvider, useContext: useDataTableContext } =
8
9
  createStrictContext<DataTableContextProps>({
@@ -5,6 +5,14 @@ import {
5
5
  DataTableCaption,
6
6
  type DataTableCaptionProps,
7
7
  } from "../caption/DataTableCaption";
8
+ import {
9
+ DataTableEmptyState,
10
+ type DataTableEmptyStateProps,
11
+ } from "../empty-state/DataTableEmptyState";
12
+ import {
13
+ DataTableLoadingState,
14
+ type DataTableLoadingStateProps,
15
+ } from "../loading-state/DataTableLoadingState";
8
16
  import {
9
17
  DataTableTbody,
10
18
  type DataTableTbodyProps,
@@ -22,8 +30,10 @@ import {
22
30
  import { DataTableTr, type DataTableTrProps } from "../tr/DataTableTr";
23
31
  import { DataTableContextProvider } from "./DataTableRoot.context";
24
32
  import { useTableKeyboardNav } from "./useTableKeyboardNav";
33
+ import { type SelectionProps } from "./useTableSelection";
25
34
 
26
- interface DataTableProps extends React.HTMLAttributes<HTMLTableElement> {
35
+ interface DataTableProps
36
+ extends React.HTMLAttributes<HTMLTableElement>, SelectionProps {
27
37
  children: React.ReactNode;
28
38
  /**
29
39
  * Controls vertical cell padding.
@@ -163,6 +173,30 @@ interface DataTableRootComponent extends React.ForwardRefExoticComponent<
163
173
  * ```
164
174
  */
165
175
  Tfoot: typeof DataTableTfoot;
176
+ /**
177
+ * @see 🏷️ {@link DataTableEmptyStateProps}
178
+ * @example
179
+ * ```jsx
180
+ * <DataTable>
181
+ * <DataTable.TBody>
182
+ * <DataTable.EmptyState />
183
+ * </DataTable.TBody>
184
+ * </DataTable>
185
+ * ```
186
+ */
187
+ EmptyState: typeof DataTableEmptyState;
188
+ /**
189
+ * @see 🏷️ {@link DataTableEmptyStateProps}
190
+ * @example
191
+ * ```jsx
192
+ * <DataTable>
193
+ * <DataTable.TBody>
194
+ * <DataTable.LoadingState />
195
+ * </DataTable.TBody>
196
+ * </DataTable>
197
+ * ```
198
+ */
199
+ LoadingState: typeof DataTableLoadingState;
166
200
  }
167
201
 
168
202
  /**
@@ -194,7 +228,10 @@ const DataTable = forwardRef<HTMLTableElement, DataTableProps>(
194
228
  });
195
229
 
196
230
  return (
197
- <DataTableContextProvider layout={layout}>
231
+ <DataTableContextProvider
232
+ layout={layout}
233
+ withKeyboardNav={withKeyboardNav}
234
+ >
198
235
  <div className="aksel-data-table__border-wrapper">
199
236
  <div className="aksel-data-table__scroll-wrapper">
200
237
  <table
@@ -221,10 +258,14 @@ DataTable.Th = DataTableTh;
221
258
  DataTable.Tr = DataTableTr;
222
259
  DataTable.Td = DataTableTd;
223
260
  DataTable.Tfoot = DataTableTfoot;
261
+ DataTable.EmptyState = DataTableEmptyState;
262
+ DataTable.LoadingState = DataTableLoadingState;
224
263
 
225
264
  export {
226
265
  DataTable,
227
266
  DataTableCaption,
267
+ DataTableEmptyState,
268
+ DataTableLoadingState,
228
269
  DataTableTbody,
229
270
  DataTableTd,
230
271
  DataTableTfoot,
@@ -235,6 +276,8 @@ export {
235
276
  export default DataTable;
236
277
  export type {
237
278
  DataTableCaptionProps,
279
+ DataTableEmptyStateProps,
280
+ DataTableLoadingStateProps,
238
281
  DataTableProps,
239
282
  DataTableTbodyProps,
240
283
  DataTableTdProps,
@@ -130,6 +130,7 @@ function useTableKeyboardNav(
130
130
  /**
131
131
  * When focus is moved to elements inside a cell like inputs, checkbox etc
132
132
  * we want to update the active cell to the parent td/th, so that keyboard navigation continues to work as expected from there.
133
+ * Make sure td/th elements have tabIndex={-1} so they can receive focus on click
133
134
  */
134
135
  const handleTableFocusIn = useEventCallback((event: FocusEvent): void => {
135
136
  const target = event.target as Element | null;
@@ -0,0 +1,126 @@
1
+ import type { CheckboxProps } from "../../../form/checkbox/types";
2
+ import { useControllableState } from "../../../utils/hooks";
3
+
4
+ type SelectionT = (string | number)[] | "all";
5
+
6
+ type SelectionProps = {
7
+ /**
8
+ * Enables selection of rows.
9
+ *
10
+ *
11
+ * When set to "single", only one row can be selected at a time.
12
+ *
13
+ * When set to "multiple", multiple rows can be selected.
14
+ *
15
+ * TODO:
16
+ * - Implement callbacks for selection changes (e.g. onRowSelect, onSelectAll)
17
+ * - Implement controlled state
18
+ * - Implement auto-add checkbox to rows and header when selection is enabled
19
+ *
20
+ * @default "none"
21
+ */
22
+ selectionMode?: "none" | "single" | "multiple";
23
+ selectedKeys?: SelectionT;
24
+ defaultSelectedKeys?: SelectionT;
25
+ onSelectionChange?: (keys: SelectionT) => void;
26
+ disabledKeys?: (string | number)[];
27
+ };
28
+
29
+ type UseTableSelectionArgs = SelectionProps & {
30
+ /* disallowEmptySelection?: boolean; */
31
+ /* TODO: Support generics */
32
+ data: (any & { id: string | number })[];
33
+ };
34
+
35
+ function useTableSelection({
36
+ selectionMode,
37
+ defaultSelectedKeys,
38
+ selectedKeys: selectedKeysProp,
39
+ onSelectionChange,
40
+ disabledKeys = [],
41
+ data,
42
+ }: UseTableSelectionArgs) {
43
+ const [selectedKeys, setSelectedKeys] = useControllableState({
44
+ value: selectedKeysProp,
45
+ defaultValue: defaultSelectedKeys ?? [],
46
+ onChange: onSelectionChange,
47
+ });
48
+
49
+ const handleSelectionChange = (key: { value: string | number } | "all") => {
50
+ if (selectionMode === "none") {
51
+ return;
52
+ }
53
+
54
+ if (key === "all") {
55
+ if (
56
+ selectedKeys === "all" ||
57
+ (Array.isArray(selectedKeys) && selectedKeys.length === data.length)
58
+ ) {
59
+ setSelectedKeys([]);
60
+ } else {
61
+ const allKeys = data.map((item) => item.id);
62
+ setSelectedKeys(allKeys);
63
+ }
64
+ } else {
65
+ const value = key.value;
66
+ if (selectedKeys === "all") {
67
+ setSelectedKeys(
68
+ data.map((item) => item.id).filter((id) => id !== value),
69
+ );
70
+ } else if (Array.isArray(selectedKeys)) {
71
+ if (selectedKeys.includes(value)) {
72
+ setSelectedKeys(selectedKeys.filter((k) => k !== value));
73
+ } else {
74
+ setSelectedKeys([...selectedKeys, value]);
75
+ }
76
+ }
77
+ }
78
+ };
79
+
80
+ if (selectionMode === "none") {
81
+ return {
82
+ selectedKeys: [],
83
+ handleSelectionChange: () => {},
84
+ selectionMode,
85
+ disabledKeys,
86
+ };
87
+ }
88
+
89
+ return {
90
+ selectedKeys,
91
+ handleSelectionChange,
92
+ selectionMode,
93
+ disabledKeys,
94
+ getTheadCheckboxProps: () => {
95
+ const indeterminate =
96
+ Array.isArray(selectedKeys) &&
97
+ selectedKeys.length > 0 &&
98
+ selectedKeys.length < data.length;
99
+
100
+ return {
101
+ /* TODO: i18n */
102
+ children: selectionMode === "single" ? "Select row" : "Select all rows",
103
+ onChange: () => handleSelectionChange("all"),
104
+ checked:
105
+ (selectedKeys === "all" ||
106
+ (Array.isArray(selectedKeys) && selectedKeys.length > 0)) &&
107
+ !indeterminate,
108
+ indeterminate,
109
+ disabled: disabledKeys.length === data.length,
110
+ hideLabel: true,
111
+ };
112
+ },
113
+ getRowCheckboxProps: (key: string | number): CheckboxProps => ({
114
+ children: `Select row with id ${key}`,
115
+ onChange: () => handleSelectionChange({ value: key }),
116
+ checked:
117
+ selectedKeys === "all" ||
118
+ (Array.isArray(selectedKeys) && selectedKeys.includes(key)),
119
+ disabled: disabledKeys.includes(key),
120
+ hideLabel: true,
121
+ }),
122
+ };
123
+ }
124
+
125
+ export { useTableSelection };
126
+ export type { SelectionProps };
@@ -1,5 +1,6 @@
1
1
  import React, { forwardRef } from "react";
2
2
  import { cl } from "../../../utils/helpers";
3
+ import { useDataTableContext } from "../root/DataTableRoot.context";
3
4
 
4
5
  interface DataTableTdProps extends React.TdHTMLAttributes<HTMLTableCellElement> {
5
6
  /**
@@ -14,15 +15,27 @@ interface DataTableTdProps extends React.TdHTMLAttributes<HTMLTableCellElement>
14
15
  * Need to work on the name though. Or maybe have two separate props?
15
16
  */
16
17
  //textWrap?: boolean | number | `${number}${string}`;
18
+ /**
19
+ * Content alignment inside cell
20
+ * @default "left"
21
+ */
22
+ textAlign?: "left" | "center" | "right";
17
23
  }
18
24
 
19
25
  const DataTableTd = forwardRef<HTMLTableCellElement, DataTableTdProps>(
20
- ({ className, children, contentMaxWidth, ...rest }, forwardedRef) => {
26
+ (
27
+ { className, children, contentMaxWidth, textAlign = "left", ...rest },
28
+ forwardedRef,
29
+ ) => {
30
+ const { withKeyboardNav } = useDataTableContext();
31
+
21
32
  return (
22
33
  <td
23
34
  {...rest}
24
35
  ref={forwardedRef}
25
36
  className={cl("aksel-data-table__td", className)}
37
+ tabIndex={withKeyboardNav ? -1 : undefined}
38
+ data-align={textAlign}
26
39
  >
27
40
  <div style={{ maxWidth: contentMaxWidth }}>{children}</div>
28
41
  </td>
@@ -1,4 +1,4 @@
1
- import React, { forwardRef } from "react";
1
+ import React, { forwardRef, useState } from "react";
2
2
  import {
3
3
  ArrowsUpDownIcon,
4
4
  CaretLeftCircleFillIcon,
@@ -7,16 +7,24 @@ import {
7
7
  SortUpIcon,
8
8
  } from "@navikt/aksel-icons";
9
9
  import { cl } from "../../../utils/helpers";
10
+ import { useMergeRefs } from "../../../utils/hooks";
11
+ import { useDataTableContext } from "../root/DataTableRoot.context";
12
+ import { type ResizeProps, useTableColumnResize } from "./useTableColumnResize";
10
13
 
11
14
  type SortDirection = "asc" | "desc" | "none";
12
15
 
13
- interface DataTableThProps extends React.HTMLAttributes<HTMLTableCellElement> {
16
+ interface DataTableThProps
17
+ extends React.HTMLAttributes<HTMLTableCellElement>, ResizeProps {
14
18
  resizeHandler?: (
15
19
  event:
16
20
  | React.MouseEvent<HTMLButtonElement>
17
21
  | React.TouchEvent<HTMLButtonElement>,
18
22
  ) => void;
19
- size?: number; // TODO: size should be required when resizeHandler is set
23
+ /**
24
+ * Content alignment inside cell
25
+ * @default "left"
26
+ */
27
+ textAlign?: "left" | "center" | "right";
20
28
  /**
21
29
  * Makes the column header sortable. The entire header cell content becomes
22
30
  * a clickable button when true.
@@ -44,7 +52,6 @@ interface DataTableThProps extends React.HTMLAttributes<HTMLTableCellElement> {
44
52
  */
45
53
  colSpan?: number;
46
54
  rowSpan?: number;
47
- keyboardResizingHandler?: (size: number) => void;
48
55
  }
49
56
 
50
57
  const SORT_ICON: Record<SortDirection, React.ElementType | null> = {
@@ -56,51 +63,57 @@ const SORT_ICON: Record<SortDirection, React.ElementType | null> = {
56
63
  /**
57
64
  * TODO:
58
65
  * - Plan for pinning: Move it into "settings" dialog like here: https://cloudscape.design/examples/react/table.html
66
+ * - Keyboard-nav breaks in headers now because of the resize-handles.
67
+ * Toggling `data-block-keyboard-nav` does not work since the created "grid" does not update when toggling this attribute.
59
68
  */
60
69
  const DataTableTh = forwardRef<HTMLTableCellElement, DataTableThProps>(
61
70
  (
62
71
  {
63
72
  className,
64
73
  children,
65
- resizeHandler,
66
- size,
67
74
  sortable = false,
68
75
  sortDirection = "none",
69
76
  onSortClick,
70
77
  style,
71
- keyboardResizingHandler,
78
+ textAlign = "left",
79
+ width,
80
+ minWidth,
81
+ maxWidth,
82
+ onWidthChange,
83
+ defaultWidth,
84
+ colSpan,
72
85
  ...rest
73
86
  },
74
87
  forwardedRef,
75
88
  ) => {
76
- const [resizeHandlerActive, setResizeHandlerActive] = React.useState(false);
89
+ const { withKeyboardNav } = useDataTableContext();
77
90
  const [isOverflowing, setIsOverflowing] = React.useState(false);
78
91
  const contentRef = React.useRef<HTMLDivElement>(null);
92
+ const [thRefState, setThRefState] = useState<HTMLTableCellElement | null>(
93
+ null,
94
+ );
95
+ const mergedRef = useMergeRefs(forwardedRef, setThRefState);
79
96
 
80
- const keyDownHandler = (event: React.KeyboardEvent<HTMLButtonElement>) => {
81
- if (keyboardResizingHandler) {
82
- if (event.key === "Enter" || event.key === " ") {
83
- event.preventDefault();
84
- setResizeHandlerActive((active) => !active);
85
- } else if (
86
- resizeHandlerActive &&
87
- (event.key === "ArrowLeft" || event.key === "ArrowRight")
88
- ) {
89
- event.preventDefault();
90
- keyboardResizingHandler(event.key === "ArrowRight" ? 10 : -10);
91
- }
92
- }
93
- };
97
+ const resizeResult = useTableColumnResize({
98
+ ref: thRefState,
99
+ width,
100
+ defaultWidth,
101
+ minWidth,
102
+ maxWidth,
103
+ onWidthChange,
104
+ style,
105
+ colSpan,
106
+ });
94
107
 
95
108
  const SortIcon = sortable ? SORT_ICON[sortDirection] : null;
96
109
 
97
110
  return (
98
111
  <th
99
112
  {...rest}
100
- ref={forwardedRef}
113
+ ref={mergedRef}
101
114
  className={cl("aksel-data-table__th", className)}
102
115
  data-sortable={sortable}
103
- style={{ width: size, ...style }}
116
+ style={resizeResult.style}
104
117
  aria-sort={sortable ? getAriaSort(sortDirection) : undefined}
105
118
  onPointerEnter={() => {
106
119
  const el = contentRef.current;
@@ -108,22 +121,26 @@ const DataTableTh = forwardRef<HTMLTableCellElement, DataTableThProps>(
108
121
  console.info("is overflowing", isOverflowing);
109
122
  }}
110
123
  onPointerLeave={() => setIsOverflowing(false)}
124
+ tabIndex={withKeyboardNav ? -1 : undefined}
125
+ data-align={textAlign}
126
+ colSpan={colSpan}
111
127
  >
112
128
  {sortable ? (
113
129
  <button
114
130
  className="aksel-data-table__th-sort-button"
115
131
  onClick={sortable ? onSortClick : undefined}
116
132
  >
133
+ <div ref={contentRef} className="aksel-data-table__th-content">
134
+ {children}
135
+ </div>
117
136
  {SortIcon && (
118
137
  <SortIcon
119
138
  aria-hidden
120
139
  data-sort-direction={sortDirection}
121
140
  className="aksel-data-table__th-sort-icon"
141
+ fontSize="1.25rem"
122
142
  />
123
143
  )}
124
- <div ref={contentRef} className="aksel-data-table__th-content">
125
- {children}
126
- </div>
127
144
  </button>
128
145
  ) : (
129
146
  <div ref={contentRef} className="aksel-data-table__th-content">
@@ -131,19 +148,14 @@ const DataTableTh = forwardRef<HTMLTableCellElement, DataTableThProps>(
131
148
  </div>
132
149
  )}
133
150
 
134
- {resizeHandler && (
151
+ {resizeResult.enabled && (
135
152
  <button
136
- // TODO: Should probably not be a button since it doesn't have onClick
137
- onMouseDown={resizeHandler}
138
- onTouchStart={resizeHandler}
139
- onBlur={() => setResizeHandlerActive(false)}
153
+ {...resizeResult.resizeHandlerProps}
140
154
  className="aksel-data-table__th-resize-handle"
141
- data-active={resizeHandlerActive}
142
- // TODO Very open to a better name for this
155
+ data-active={resizeResult.isResizingWithKeyboard}
143
156
  data-block-keyboard-nav
144
- onKeyDown={keyDownHandler}
145
157
  >
146
- {resizeHandlerActive && (
158
+ {resizeResult.isResizingWithKeyboard && (
147
159
  <>
148
160
  <span className="aksel-data-table__th-resize-handle-indicator aksel-data-table__th-resize-handle-indicator--start">
149
161
  <CaretLeftCircleFillIcon aria-hidden fontSize="1.5rem" />