@navikt/ds-react 8.7.0 → 8.9.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 (408) 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/DragAndDropDragHandler.d.ts +12 -0
  13. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +57 -0
  14. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -0
  15. package/cjs/data/drag-and-drop/item/DragAndDropItem.d.ts +27 -0
  16. package/cjs/data/drag-and-drop/item/DragAndDropItem.js +52 -0
  17. package/cjs/data/drag-and-drop/item/DragAndDropItem.js.map +1 -0
  18. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +16 -0
  19. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js +10 -0
  20. package/cjs/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -0
  21. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +36 -0
  22. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +187 -0
  23. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -0
  24. package/cjs/data/drag-and-drop/types.d.ts +4 -0
  25. package/cjs/data/drag-and-drop/types.js +3 -0
  26. package/cjs/data/drag-and-drop/types.js.map +1 -0
  27. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +22 -0
  28. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +35 -0
  29. package/cjs/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  30. package/cjs/data/{drag-and-drop → drag-and-drop-old}/item/DataDragAndDropItem.js +2 -7
  31. package/cjs/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +1 -0
  32. package/cjs/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +1 -0
  33. package/cjs/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDropRoot.d.ts +2 -2
  34. package/cjs/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDropRoot.js +5 -8
  35. package/cjs/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +1 -0
  36. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +5 -0
  37. package/cjs/data/table/empty-state/DataTableEmptyState.js +57 -0
  38. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -0
  39. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +14 -0
  40. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +48 -0
  41. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -0
  42. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +10 -0
  43. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +23 -0
  44. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -0
  45. package/cjs/data/table/helpers/selection/selection.types.d.ts +42 -0
  46. package/cjs/data/table/helpers/selection/selection.types.js +3 -0
  47. package/cjs/data/table/helpers/selection/selection.types.js.map +1 -0
  48. package/cjs/data/table/helpers/table-focus.js +7 -1
  49. package/cjs/data/table/helpers/table-focus.js.map +1 -1
  50. package/cjs/data/table/helpers/table-keyboard.d.ts +0 -1
  51. package/cjs/data/table/helpers/table-keyboard.js +2 -4
  52. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  53. package/cjs/data/table/{root → hooks}/useTableKeyboardNav.js +2 -1
  54. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -0
  55. package/cjs/data/table/hooks/useTableSelection.d.ts +8 -0
  56. package/cjs/data/table/hooks/useTableSelection.js +49 -0
  57. package/cjs/data/table/hooks/useTableSelection.js.map +1 -0
  58. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +5 -0
  59. package/cjs/data/table/loading-state/DataTableLoadingState.js +57 -0
  60. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -0
  61. package/cjs/data/table/root/DataTable.types.d.ts +13 -0
  62. package/cjs/data/table/root/DataTable.types.js +3 -0
  63. package/cjs/data/table/root/DataTable.types.js.map +1 -0
  64. package/cjs/data/table/root/DataTableAuto.d.ts +60 -0
  65. package/cjs/data/table/root/DataTableAuto.js +113 -0
  66. package/cjs/data/table/root/DataTableAuto.js.map +1 -0
  67. package/cjs/data/table/root/DataTableRoot.context.d.ts +3 -2
  68. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  69. package/cjs/data/table/root/DataTableRoot.d.ts +30 -3
  70. package/cjs/data/table/root/DataTableRoot.js +9 -3
  71. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  72. package/cjs/data/table/td/DataTableTd.d.ts +10 -0
  73. package/cjs/data/table/td/DataTableTd.js +4 -2
  74. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  75. package/cjs/data/table/th/DataTableTh.d.ts +10 -4
  76. package/cjs/data/table/th/DataTableTh.js +24 -22
  77. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  78. package/cjs/data/table/th/useTableColumnResize.d.ts +64 -0
  79. package/cjs/data/table/th/useTableColumnResize.js +144 -0
  80. package/cjs/data/table/th/useTableColumnResize.js.map +1 -0
  81. package/cjs/data/table/thead/DataTableThead.context.d.ts +4 -0
  82. package/cjs/data/table/thead/DataTableThead.context.js +45 -0
  83. package/cjs/data/table/thead/DataTableThead.context.js.map +1 -0
  84. package/cjs/data/table/thead/DataTableThead.js +3 -1
  85. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  86. package/cjs/data/table/tr/DataTableTr.js +4 -3
  87. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  88. package/cjs/data/token-filter/AutoSuggest.js +40 -9
  89. package/cjs/data/token-filter/AutoSuggest.js.map +1 -1
  90. package/cjs/data/token-filter/TokenFilter.d.ts +1 -0
  91. package/cjs/data/token-filter/TokenFilter.js +1 -0
  92. package/cjs/data/token-filter/TokenFilter.js.map +1 -1
  93. package/cjs/data/toolbar/root/DataToolbarRoot.d.ts +6 -23
  94. package/cjs/data/toolbar/root/DataToolbarRoot.js +42 -7
  95. package/cjs/data/toolbar/root/DataToolbarRoot.js.map +1 -1
  96. package/cjs/date/Date.Input.js +8 -9
  97. package/cjs/date/Date.Input.js.map +1 -1
  98. package/cjs/date/datepicker/hooks/useDatepicker.d.ts +12 -1
  99. package/cjs/date/datepicker/hooks/useDatepicker.js +4 -3
  100. package/cjs/date/datepicker/hooks/useDatepicker.js.map +1 -1
  101. package/cjs/date/monthpicker/hooks/useMonthPicker.d.ts +11 -1
  102. package/cjs/date/monthpicker/hooks/useMonthPicker.js +3 -2
  103. package/cjs/date/monthpicker/hooks/useMonthPicker.js.map +1 -1
  104. package/cjs/form/checkbox/CheckboxGroup.js +1 -1
  105. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  106. package/cjs/form/fieldset/Fieldset.d.ts +25 -5
  107. package/cjs/form/fieldset/Fieldset.js +19 -2
  108. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  109. package/cjs/form/radio/RadioGroup.js +1 -1
  110. package/cjs/form/radio/RadioGroup.js.map +1 -1
  111. package/cjs/index.d.ts +1 -1
  112. package/cjs/index.js.map +1 -1
  113. package/cjs/internal-header/InternalHeaderButton.d.ts +5 -0
  114. package/cjs/internal-header/InternalHeaderButton.js +2 -2
  115. package/cjs/internal-header/InternalHeaderButton.js.map +1 -1
  116. package/cjs/read-more/ReadMore.d.ts +10 -0
  117. package/cjs/read-more/ReadMore.js +4 -6
  118. package/cjs/read-more/ReadMore.js.map +1 -1
  119. package/cjs/types/index.d.ts +1 -1
  120. package/cjs/types/index.js +0 -15
  121. package/cjs/types/index.js.map +1 -1
  122. package/cjs/utils/components/Listbox/group/ListboxGroup.js +2 -1
  123. package/cjs/utils/components/Listbox/group/ListboxGroup.js.map +1 -1
  124. package/cjs/utils/components/Listbox/input-slot/ListboxInputSlot.js +1 -1
  125. package/cjs/utils/components/Listbox/input-slot/ListboxInputSlot.js.map +1 -1
  126. package/cjs/utils/components/Listbox/option/ListboxOption.d.ts +24 -0
  127. package/cjs/utils/components/Listbox/{item/ListboxItem.js → option/ListboxOption.js} +8 -8
  128. package/cjs/utils/components/Listbox/option/ListboxOption.js.map +1 -0
  129. package/cjs/utils/components/Listbox/options/ListboxOptions.d.ts +8 -0
  130. package/cjs/utils/components/Listbox/{list/ListboxList.js → options/ListboxOptions.js} +8 -8
  131. package/cjs/utils/components/Listbox/options/ListboxOptions.js.map +1 -0
  132. package/cjs/utils/components/Listbox/root/ListboxRoot.d.ts +6 -6
  133. package/cjs/utils/components/Listbox/root/ListboxRoot.js +28 -28
  134. package/cjs/utils/components/Listbox/root/ListboxRoot.js.map +1 -1
  135. package/cjs/utils/components/Listbox/root/domHelpers.d.ts +3 -3
  136. package/cjs/utils/components/Listbox/root/domHelpers.js +8 -8
  137. package/cjs/utils/components/Listbox/root/domHelpers.js.map +1 -1
  138. package/cjs/utils/components/floating/Floating.d.ts +1 -1
  139. package/cjs/utils/components/floating/Floating.js +1 -1
  140. package/cjs/utils/components/floating/Floating.js.map +1 -1
  141. package/cjs/utils/components/focus-boundary/FocusBoundary.d.ts +0 -1
  142. package/cjs/utils/components/focus-boundary/FocusBoundary.js +1 -1
  143. package/cjs/utils/components/focus-boundary/FocusBoundary.js.map +1 -1
  144. package/cjs/utils/components/link-anchor/LinkAnchor.js +10 -0
  145. package/cjs/utils/components/link-anchor/LinkAnchor.js.map +1 -1
  146. package/cjs/utils/helpers/className.js +1 -1
  147. package/cjs/utils/helpers/className.js.map +1 -1
  148. package/cjs/utils/helpers/focus.d.ts +3 -1
  149. package/cjs/utils/helpers/focus.js +2 -2
  150. package/cjs/utils/helpers/focus.js.map +1 -1
  151. package/cjs/utils/helpers/index.d.ts +9 -9
  152. package/cjs/utils/helpers/index.js +22 -23
  153. package/cjs/utils/helpers/index.js.map +1 -1
  154. package/cjs/utils/hooks/index.d.ts +13 -13
  155. package/cjs/utils/hooks/index.js +31 -28
  156. package/cjs/utils/hooks/index.js.map +1 -1
  157. package/cjs/utils/hooks/useScrollLock.js +41 -11
  158. package/cjs/utils/hooks/useScrollLock.js.map +1 -1
  159. package/esm/alert/base-alert/root/BaseAlertRoot.js +1 -2
  160. package/esm/alert/base-alert/root/BaseAlertRoot.js.map +1 -1
  161. package/esm/alert/info-card/index.d.ts +2 -2
  162. package/esm/alert/info-card/index.js +1 -1
  163. package/esm/alert/info-card/index.js.map +1 -1
  164. package/esm/alert/info-card/message/InfoCardMessage.d.ts +23 -0
  165. package/esm/alert/info-card/message/InfoCardMessage.js +37 -0
  166. package/esm/alert/info-card/message/InfoCardMessage.js.map +1 -0
  167. package/esm/alert/info-card/root/InfoCardRoot.d.ts +15 -2
  168. package/esm/alert/info-card/root/InfoCardRoot.js +3 -1
  169. package/esm/alert/info-card/root/InfoCardRoot.js.map +1 -1
  170. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +12 -0
  171. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +51 -0
  172. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -0
  173. package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +27 -0
  174. package/esm/data/drag-and-drop/item/DragAndDropItem.js +46 -0
  175. package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -0
  176. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +16 -0
  177. package/esm/data/drag-and-drop/root/DragAndDrop.context.js +6 -0
  178. package/esm/data/drag-and-drop/root/DragAndDrop.context.js.map +1 -0
  179. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +36 -0
  180. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +147 -0
  181. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -0
  182. package/esm/data/drag-and-drop/types.d.ts +4 -0
  183. package/esm/data/drag-and-drop/types.js +2 -0
  184. package/esm/data/drag-and-drop/types.js.map +1 -0
  185. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.d.ts +22 -0
  186. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js +29 -0
  187. package/esm/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.js.map +1 -0
  188. package/esm/data/{drag-and-drop → drag-and-drop-old}/item/DataDragAndDropItem.js +2 -7
  189. package/esm/data/drag-and-drop-old/item/DataDragAndDropItem.js.map +1 -0
  190. package/esm/data/drag-and-drop-old/root/DataDragAndDrop.context.js.map +1 -0
  191. package/esm/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDropRoot.d.ts +2 -2
  192. package/esm/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDropRoot.js +5 -8
  193. package/esm/data/drag-and-drop-old/root/DataDragAndDropRoot.js.map +1 -0
  194. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +5 -0
  195. package/esm/data/table/empty-state/DataTableEmptyState.js +21 -0
  196. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -0
  197. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +14 -0
  198. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +46 -0
  199. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -0
  200. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +10 -0
  201. package/esm/data/table/helpers/selection/getSingleSelectProps.js +21 -0
  202. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -0
  203. package/esm/data/table/helpers/selection/selection.types.d.ts +42 -0
  204. package/esm/data/table/helpers/selection/selection.types.js +2 -0
  205. package/esm/data/table/helpers/selection/selection.types.js.map +1 -0
  206. package/esm/data/table/helpers/table-focus.js +7 -1
  207. package/esm/data/table/helpers/table-focus.js.map +1 -1
  208. package/esm/data/table/helpers/table-keyboard.d.ts +0 -1
  209. package/esm/data/table/helpers/table-keyboard.js +2 -4
  210. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  211. package/esm/data/table/{root → hooks}/useTableKeyboardNav.js +2 -1
  212. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -0
  213. package/esm/data/table/hooks/useTableSelection.d.ts +8 -0
  214. package/esm/data/table/hooks/useTableSelection.js +47 -0
  215. package/esm/data/table/hooks/useTableSelection.js.map +1 -0
  216. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +5 -0
  217. package/esm/data/table/loading-state/DataTableLoadingState.js +21 -0
  218. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -0
  219. package/esm/data/table/root/DataTable.types.d.ts +13 -0
  220. package/esm/data/table/root/DataTable.types.js +2 -0
  221. package/esm/data/table/root/DataTable.types.js.map +1 -0
  222. package/esm/data/table/root/DataTableAuto.d.ts +60 -0
  223. package/esm/data/table/root/DataTableAuto.js +77 -0
  224. package/esm/data/table/root/DataTableAuto.js.map +1 -0
  225. package/esm/data/table/root/DataTableRoot.context.d.ts +3 -2
  226. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  227. package/esm/data/table/root/DataTableRoot.d.ts +30 -3
  228. package/esm/data/table/root/DataTableRoot.js +7 -3
  229. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  230. package/esm/data/table/td/DataTableTd.d.ts +10 -0
  231. package/esm/data/table/td/DataTableTd.js +4 -2
  232. package/esm/data/table/td/DataTableTd.js.map +1 -1
  233. package/esm/data/table/th/DataTableTh.d.ts +10 -4
  234. package/esm/data/table/th/DataTableTh.js +25 -23
  235. package/esm/data/table/th/DataTableTh.js.map +1 -1
  236. package/esm/data/table/th/useTableColumnResize.d.ts +64 -0
  237. package/esm/data/table/th/useTableColumnResize.js +142 -0
  238. package/esm/data/table/th/useTableColumnResize.js.map +1 -0
  239. package/esm/data/table/thead/DataTableThead.context.d.ts +4 -0
  240. package/esm/data/table/thead/DataTableThead.context.js +8 -0
  241. package/esm/data/table/thead/DataTableThead.context.js.map +1 -0
  242. package/esm/data/table/thead/DataTableThead.js +3 -1
  243. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  244. package/esm/data/table/tr/DataTableTr.js +4 -3
  245. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  246. package/esm/data/token-filter/AutoSuggest.js +41 -10
  247. package/esm/data/token-filter/AutoSuggest.js.map +1 -1
  248. package/esm/data/token-filter/TokenFilter.d.ts +1 -0
  249. package/esm/data/token-filter/TokenFilter.js +1 -0
  250. package/esm/data/token-filter/TokenFilter.js.map +1 -1
  251. package/esm/data/toolbar/root/DataToolbarRoot.d.ts +6 -23
  252. package/esm/data/toolbar/root/DataToolbarRoot.js +9 -7
  253. package/esm/data/toolbar/root/DataToolbarRoot.js.map +1 -1
  254. package/esm/date/Date.Input.js +9 -10
  255. package/esm/date/Date.Input.js.map +1 -1
  256. package/esm/date/datepicker/hooks/useDatepicker.d.ts +12 -1
  257. package/esm/date/datepicker/hooks/useDatepicker.js +4 -3
  258. package/esm/date/datepicker/hooks/useDatepicker.js.map +1 -1
  259. package/esm/date/monthpicker/hooks/useMonthPicker.d.ts +11 -1
  260. package/esm/date/monthpicker/hooks/useMonthPicker.js +3 -2
  261. package/esm/date/monthpicker/hooks/useMonthPicker.js.map +1 -1
  262. package/esm/form/checkbox/CheckboxGroup.js +1 -1
  263. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  264. package/esm/form/fieldset/Fieldset.d.ts +25 -5
  265. package/esm/form/fieldset/Fieldset.js +19 -2
  266. package/esm/form/fieldset/Fieldset.js.map +1 -1
  267. package/esm/form/radio/RadioGroup.js +1 -1
  268. package/esm/form/radio/RadioGroup.js.map +1 -1
  269. package/esm/index.d.ts +1 -1
  270. package/esm/index.js.map +1 -1
  271. package/esm/internal-header/InternalHeaderButton.d.ts +5 -0
  272. package/esm/internal-header/InternalHeaderButton.js +2 -2
  273. package/esm/internal-header/InternalHeaderButton.js.map +1 -1
  274. package/esm/read-more/ReadMore.d.ts +10 -0
  275. package/esm/read-more/ReadMore.js +4 -6
  276. package/esm/read-more/ReadMore.js.map +1 -1
  277. package/esm/types/index.d.ts +1 -1
  278. package/esm/types/index.js +1 -1
  279. package/esm/types/index.js.map +1 -1
  280. package/esm/utils/components/Listbox/group/ListboxGroup.js +2 -1
  281. package/esm/utils/components/Listbox/group/ListboxGroup.js.map +1 -1
  282. package/esm/utils/components/Listbox/input-slot/ListboxInputSlot.js +1 -1
  283. package/esm/utils/components/Listbox/input-slot/ListboxInputSlot.js.map +1 -1
  284. package/esm/utils/components/Listbox/option/ListboxOption.d.ts +24 -0
  285. package/esm/utils/components/Listbox/{item/ListboxItem.js → option/ListboxOption.js} +7 -7
  286. package/esm/utils/components/Listbox/option/ListboxOption.js.map +1 -0
  287. package/esm/utils/components/Listbox/options/ListboxOptions.d.ts +8 -0
  288. package/esm/utils/components/Listbox/{list/ListboxList.js → options/ListboxOptions.js} +8 -8
  289. package/esm/utils/components/Listbox/options/ListboxOptions.js.map +1 -0
  290. package/esm/utils/components/Listbox/root/ListboxRoot.d.ts +6 -6
  291. package/esm/utils/components/Listbox/root/ListboxRoot.js +29 -29
  292. package/esm/utils/components/Listbox/root/ListboxRoot.js.map +1 -1
  293. package/esm/utils/components/Listbox/root/domHelpers.d.ts +3 -3
  294. package/esm/utils/components/Listbox/root/domHelpers.js +7 -7
  295. package/esm/utils/components/Listbox/root/domHelpers.js.map +1 -1
  296. package/esm/utils/components/floating/Floating.d.ts +1 -1
  297. package/esm/utils/components/floating/Floating.js +1 -1
  298. package/esm/utils/components/floating/Floating.js.map +1 -1
  299. package/esm/utils/components/focus-boundary/FocusBoundary.d.ts +0 -1
  300. package/esm/utils/components/focus-boundary/FocusBoundary.js +1 -1
  301. package/esm/utils/components/focus-boundary/FocusBoundary.js.map +1 -1
  302. package/esm/utils/components/link-anchor/LinkAnchor.js +10 -0
  303. package/esm/utils/components/link-anchor/LinkAnchor.js.map +1 -1
  304. package/esm/utils/helpers/className.js +1 -1
  305. package/esm/utils/helpers/className.js.map +1 -1
  306. package/esm/utils/helpers/focus.d.ts +3 -1
  307. package/esm/utils/helpers/focus.js +2 -2
  308. package/esm/utils/helpers/focus.js.map +1 -1
  309. package/esm/utils/helpers/index.d.ts +9 -9
  310. package/esm/utils/helpers/index.js +9 -9
  311. package/esm/utils/helpers/index.js.map +1 -1
  312. package/esm/utils/hooks/index.d.ts +13 -13
  313. package/esm/utils/hooks/index.js +13 -13
  314. package/esm/utils/hooks/index.js.map +1 -1
  315. package/esm/utils/hooks/useScrollLock.js +41 -11
  316. package/esm/utils/hooks/useScrollLock.js.map +1 -1
  317. package/package.json +6 -6
  318. package/src/alert/base-alert/root/BaseAlertRoot.tsx +1 -1
  319. package/src/alert/info-card/index.ts +2 -0
  320. package/src/alert/info-card/message/InfoCardMessage.tsx +48 -0
  321. package/src/alert/info-card/root/InfoCardRoot.tsx +20 -1
  322. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +90 -0
  323. package/src/data/drag-and-drop/item/DragAndDropItem.tsx +71 -0
  324. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +25 -0
  325. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +245 -0
  326. package/src/data/drag-and-drop/types.ts +4 -0
  327. package/src/data/drag-and-drop-old/drag-handler/DataDragAndDropDragHandler.tsx +104 -0
  328. package/src/data/{drag-and-drop → drag-and-drop-old}/item/DataDragAndDropItem.tsx +6 -33
  329. package/src/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDrop.context.tsx +2 -0
  330. package/src/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDropRoot.tsx +6 -8
  331. package/src/data/table/empty-state/DataTableEmptyState.tsx +26 -0
  332. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +70 -0
  333. package/src/data/table/helpers/selection/getSingleSelectProps.ts +33 -0
  334. package/src/data/table/helpers/selection/selection.types.ts +56 -0
  335. package/src/data/table/helpers/table-focus.ts +10 -1
  336. package/src/data/table/helpers/table-keyboard.ts +2 -6
  337. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +327 -0
  338. package/src/data/table/{root → hooks}/useTableKeyboardNav.ts +2 -1
  339. package/src/data/table/hooks/useTableSelection.ts +78 -0
  340. package/src/data/table/loading-state/DataTableLoadingState.tsx +26 -0
  341. package/src/data/table/root/DataTable.types.ts +16 -0
  342. package/src/data/table/root/DataTableAuto.tsx +205 -0
  343. package/src/data/table/root/DataTableRoot.context.ts +3 -2
  344. package/src/data/table/root/DataTableRoot.tsx +46 -3
  345. package/src/data/table/td/DataTableTd.tsx +14 -1
  346. package/src/data/table/th/DataTableTh.tsx +48 -36
  347. package/src/data/table/th/useTableColumnResize.ts +276 -0
  348. package/src/data/table/thead/DataTableThead.context.ts +10 -0
  349. package/src/data/table/thead/DataTableThead.tsx +8 -5
  350. package/src/data/table/tr/DataTableTr.tsx +8 -3
  351. package/src/data/token-filter/AutoSuggest.tsx +76 -15
  352. package/src/data/token-filter/TokenFilter.tsx +1 -0
  353. package/src/data/toolbar/root/DataToolbarRoot.tsx +29 -32
  354. package/src/date/Date.Input.tsx +18 -17
  355. package/src/date/datepicker/hooks/useDatepicker.tsx +16 -6
  356. package/src/date/monthpicker/hooks/useMonthPicker.tsx +14 -5
  357. package/src/form/checkbox/CheckboxGroup.tsx +1 -1
  358. package/src/form/fieldset/Fieldset.tsx +31 -7
  359. package/src/form/radio/RadioGroup.tsx +1 -1
  360. package/src/index.ts +1 -0
  361. package/src/internal-header/InternalHeaderButton.tsx +18 -9
  362. package/src/read-more/ReadMore.tsx +15 -16
  363. package/src/types/index.ts +1 -1
  364. package/src/utils/components/Listbox/group/ListboxGroup.tsx +9 -2
  365. package/src/utils/components/Listbox/input-slot/ListboxInputSlot.tsx +1 -1
  366. package/src/utils/components/Listbox/{item/ListboxItem.tsx → option/ListboxOption.tsx} +14 -14
  367. package/src/utils/components/Listbox/{list/ListboxList.tsx → options/ListboxOptions.tsx} +10 -10
  368. package/src/utils/components/Listbox/root/ListboxRoot.tsx +31 -31
  369. package/src/utils/components/Listbox/root/domHelpers.ts +8 -7
  370. package/src/utils/components/floating/Floating.tsx +2 -2
  371. package/src/utils/components/focus-boundary/FocusBoundary.tsx +1 -2
  372. package/src/utils/components/link-anchor/LinkAnchor.tsx +11 -0
  373. package/src/utils/helpers/className.ts +1 -1
  374. package/src/utils/helpers/focus.ts +5 -2
  375. package/src/utils/helpers/index.ts +9 -9
  376. package/src/utils/hooks/index.ts +20 -13
  377. package/src/utils/hooks/useScrollLock.ts +57 -13
  378. package/cjs/data/action-bar/root/DataActionBarRoot.d.ts +0 -27
  379. package/cjs/data/action-bar/root/DataActionBarRoot.js +0 -49
  380. package/cjs/data/action-bar/root/DataActionBarRoot.js.map +0 -1
  381. package/cjs/data/drag-and-drop/item/DataDragAndDropItem.js.map +0 -1
  382. package/cjs/data/drag-and-drop/root/DataDragAndDrop.context.js.map +0 -1
  383. package/cjs/data/drag-and-drop/root/DataDragAndDropRoot.js.map +0 -1
  384. package/cjs/data/table/root/useTableKeyboardNav.js.map +0 -1
  385. package/cjs/utils/components/Listbox/item/ListboxItem.d.ts +0 -24
  386. package/cjs/utils/components/Listbox/item/ListboxItem.js.map +0 -1
  387. package/cjs/utils/components/Listbox/list/ListboxList.d.ts +0 -8
  388. package/cjs/utils/components/Listbox/list/ListboxList.js.map +0 -1
  389. package/esm/data/action-bar/root/DataActionBarRoot.d.ts +0 -27
  390. package/esm/data/action-bar/root/DataActionBarRoot.js +0 -43
  391. package/esm/data/action-bar/root/DataActionBarRoot.js.map +0 -1
  392. package/esm/data/drag-and-drop/item/DataDragAndDropItem.js.map +0 -1
  393. package/esm/data/drag-and-drop/root/DataDragAndDrop.context.js.map +0 -1
  394. package/esm/data/drag-and-drop/root/DataDragAndDropRoot.js.map +0 -1
  395. package/esm/data/table/root/useTableKeyboardNav.js.map +0 -1
  396. package/esm/utils/components/Listbox/item/ListboxItem.d.ts +0 -24
  397. package/esm/utils/components/Listbox/item/ListboxItem.js.map +0 -1
  398. package/esm/utils/components/Listbox/list/ListboxList.d.ts +0 -8
  399. package/esm/utils/components/Listbox/list/ListboxList.js.map +0 -1
  400. package/src/data/action-bar/root/DataActionBarRoot.tsx +0 -59
  401. /package/cjs/data/{drag-and-drop → drag-and-drop-old}/item/DataDragAndDropItem.d.ts +0 -0
  402. /package/cjs/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDrop.context.d.ts +0 -0
  403. /package/cjs/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDrop.context.js +0 -0
  404. /package/cjs/data/table/{root → hooks}/useTableKeyboardNav.d.ts +0 -0
  405. /package/esm/data/{drag-and-drop → drag-and-drop-old}/item/DataDragAndDropItem.d.ts +0 -0
  406. /package/esm/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDrop.context.d.ts +0 -0
  407. /package/esm/data/{drag-and-drop → drag-and-drop-old}/root/DataDragAndDrop.context.js +0 -0
  408. /package/esm/data/table/{root → hooks}/useTableKeyboardNav.d.ts +0 -0
@@ -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,16 @@ 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 { useTableKeyboardNav } from "../hooks/useTableKeyboardNav";
13
+ import { type SelectionProps } from "../hooks/useTableSelection";
14
+ import {
15
+ DataTableLoadingState,
16
+ type DataTableLoadingStateProps,
17
+ } from "../loading-state/DataTableLoadingState";
8
18
  import {
9
19
  DataTableTbody,
10
20
  type DataTableTbodyProps,
@@ -21,9 +31,9 @@ import {
21
31
  } from "../thead/DataTableThead";
22
32
  import { DataTableTr, type DataTableTrProps } from "../tr/DataTableTr";
23
33
  import { DataTableContextProvider } from "./DataTableRoot.context";
24
- import { useTableKeyboardNav } from "./useTableKeyboardNav";
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,
@@ -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" />
@@ -0,0 +1,276 @@
1
+ import { type DOMAttributes, useCallback, useState } from "react";
2
+ import { useControllableState } from "../../../utils/hooks";
3
+ import { useDataTableContext } from "../root/DataTableRoot.context";
4
+
5
+ type ColumnWidth = number | string;
6
+
7
+ type ResizeProps = {
8
+ ref: HTMLTableCellElement | null;
9
+ /**
10
+ * Controlled width of the column.
11
+ *
12
+ * Should only be used to fully control column width state. Otherwise, use `defaultWidth` and let the component handle resizing.
13
+ */
14
+ width?: ColumnWidth;
15
+ /**
16
+ * Initial width of the column. Only used when `width` is not set.
17
+ */
18
+ defaultWidth?: ColumnWidth;
19
+ /**
20
+ * Minimum width of the column.
21
+ *
22
+ * Should be used in conjunction with `width` or `defaultWidth` to set limits when resizing.
23
+ */
24
+ minWidth?: ColumnWidth;
25
+ /**
26
+ * Maximum width of the column.
27
+ *
28
+ * Should be used in conjunction with `width` or `defaultWidth` to set limits when resizing.
29
+ */
30
+ maxWidth?: ColumnWidth;
31
+ /**
32
+ * Called when the column width changes.
33
+ */
34
+ onWidthChange?: (width: ColumnWidth) => void;
35
+ /**
36
+ * Forwarded styles
37
+ */
38
+ style?: React.CSSProperties;
39
+ /**
40
+ * Forwarded colSpan
41
+ */
42
+ colSpan?: number;
43
+ };
44
+
45
+ type TableColumnResizeArgs = ResizeProps & {};
46
+
47
+ type TableColumnResizeResult =
48
+ | {
49
+ style?: React.CSSProperties;
50
+ resizeHandlerProps: {
51
+ onMouseDown: DOMAttributes<HTMLButtonElement>["onMouseDown"];
52
+ onTouchStart: DOMAttributes<HTMLButtonElement>["onTouchStart"];
53
+ onKeyDown: DOMAttributes<HTMLButtonElement>["onKeyDown"];
54
+ onBlur: DOMAttributes<HTMLButtonElement>["onBlur"];
55
+ onDoubleClick: DOMAttributes<HTMLButtonElement>["onDoubleClick"];
56
+ };
57
+ isResizingWithKeyboard: boolean;
58
+ enabled: true;
59
+ }
60
+ | {
61
+ style?: React.CSSProperties;
62
+ enabled: false;
63
+ };
64
+
65
+ /**
66
+ * TODO:
67
+ * - Do we allow % widths?
68
+ * - Auto-width mode is hard now since that might cause layout-shifts on mount. But would be preferable to
69
+ * be able to set "1fr" or similar and have it fill remaining space.
70
+ */
71
+ function useTableColumnResize(
72
+ args: TableColumnResizeArgs,
73
+ ): TableColumnResizeResult {
74
+ const {
75
+ ref,
76
+ width: userWidth,
77
+ defaultWidth,
78
+ onWidthChange,
79
+ maxWidth = Infinity,
80
+ minWidth = 40,
81
+ style,
82
+ colSpan,
83
+ } = args;
84
+
85
+ const tableContext = useDataTableContext();
86
+
87
+ const [width, _setWidth] = useControllableState({
88
+ value: userWidth,
89
+ defaultValue: defaultWidth ?? (colSpan ?? 1) * 140,
90
+ /**
91
+ * TODO:
92
+ * - Potential optimization: Only call when width as "stopped" changing, e.g. on mouse up or after a debounce when resizing with keyboard.
93
+ * Otherwise, this could cause excessive calls when resizing quickly.
94
+ */
95
+ onChange: onWidthChange,
96
+ });
97
+
98
+ const [isResizingWithKeyboard, setIsResizingWithKeyboard] = useState(false);
99
+ const [, setIsResizingWithMouse] = useState(false);
100
+
101
+ const setWidth = useCallback(
102
+ (newWidth: number) => {
103
+ const currentWidth = ref?.offsetWidth;
104
+ if (!currentWidth) {
105
+ return;
106
+ }
107
+
108
+ const min = parseWidth(minWidth) ?? 0;
109
+ const max = parseWidth(maxWidth) ?? Infinity;
110
+ const clamped = Math.min(Math.max(newWidth, min), max);
111
+
112
+ if (newWidth <= currentWidth && newWidth > max) {
113
+ _setWidth(newWidth);
114
+ return;
115
+ }
116
+
117
+ if (newWidth >= currentWidth && newWidth > max) {
118
+ _setWidth(currentWidth);
119
+ return;
120
+ }
121
+
122
+ _setWidth(clamped);
123
+ },
124
+ [minWidth, maxWidth, _setWidth, ref],
125
+ );
126
+
127
+ const handleKeyDown: DOMAttributes<HTMLButtonElement>["onKeyDown"] =
128
+ useCallback(
129
+ (event) => {
130
+ if (event.key === "Enter" || event.key === " ") {
131
+ setIsResizingWithKeyboard((prev) => !prev);
132
+ return;
133
+ }
134
+
135
+ if (!isResizingWithKeyboard) {
136
+ return;
137
+ }
138
+
139
+ if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
140
+ event.preventDefault();
141
+
142
+ const th = (event.target as HTMLElement).closest(
143
+ "th",
144
+ ) as HTMLTableCellElement;
145
+ const startWidth = th.offsetWidth;
146
+
147
+ const delta = event.key === "ArrowRight" ? 20 : -20;
148
+ setWidth(startWidth + delta);
149
+ }
150
+ },
151
+ [isResizingWithKeyboard, setWidth],
152
+ );
153
+
154
+ const startResize = useCallback(
155
+ (th: HTMLTableCellElement, startX: number) => {
156
+ setIsResizingWithMouse(true);
157
+ const startWidth = th.offsetWidth;
158
+
159
+ function onPointerMove(clientX: number) {
160
+ setWidth(startWidth + (clientX - startX));
161
+ }
162
+
163
+ function onMouseMove(e: MouseEvent) {
164
+ onPointerMove(e.clientX);
165
+ }
166
+
167
+ function onTouchMove(e: TouchEvent) {
168
+ e.preventDefault();
169
+ onPointerMove(e.touches[0].clientX);
170
+ }
171
+
172
+ function cleanup() {
173
+ document.removeEventListener("mousemove", onMouseMove);
174
+ document.removeEventListener("touchmove", onTouchMove);
175
+ document.removeEventListener("mouseup", cleanup);
176
+ document.removeEventListener("touchend", cleanup);
177
+ document.removeEventListener("touchcancel", cleanup);
178
+ setIsResizingWithMouse(false);
179
+ }
180
+
181
+ document.addEventListener("mousemove", onMouseMove);
182
+ document.addEventListener("touchmove", onTouchMove, { passive: false });
183
+ document.addEventListener("mouseup", cleanup);
184
+ document.addEventListener("touchend", cleanup);
185
+ document.addEventListener("touchcancel", cleanup);
186
+ },
187
+ [setWidth],
188
+ );
189
+
190
+ const handleMouseDown: DOMAttributes<HTMLButtonElement>["onMouseDown"] =
191
+ useCallback(
192
+ (event) => {
193
+ const th = (event.target as HTMLElement).closest(
194
+ "th",
195
+ ) as HTMLTableCellElement;
196
+ startResize(th, event.clientX);
197
+ },
198
+ [startResize],
199
+ );
200
+
201
+ const handleTouchStart: DOMAttributes<HTMLButtonElement>["onTouchStart"] =
202
+ useCallback(
203
+ (event) => {
204
+ const th = (event.target as HTMLElement).closest(
205
+ "th",
206
+ ) as HTMLTableCellElement;
207
+ startResize(th, event.touches[0].clientX);
208
+ },
209
+ [startResize],
210
+ );
211
+
212
+ /**
213
+ * TODO: Do we even want this?
214
+ * - + 32px padding is hardcoded now, fix this
215
+ * - Need to find widest element in column, not the header itself.
216
+ * - Should doubleclick just reset to defaultWidth? Or add a autoWidth prop.
217
+ */
218
+ const handleDoubleClick: DOMAttributes<HTMLButtonElement>["onDoubleClick"] =
219
+ useCallback(
220
+ (event) => {
221
+ const th = (event.target as HTMLElement).closest(
222
+ "th",
223
+ ) as HTMLTableCellElement;
224
+
225
+ const contentEl = th.getElementsByClassName(
226
+ "aksel-data-table__th-content",
227
+ )[0];
228
+ const range = document.createRange();
229
+ range.selectNodeContents(contentEl);
230
+ const contentWidth = range.getBoundingClientRect().width;
231
+
232
+ setWidth(contentWidth + 32);
233
+ },
234
+ [setWidth],
235
+ );
236
+
237
+ if (tableContext.layout !== "fixed") {
238
+ return {
239
+ style,
240
+ enabled: false,
241
+ };
242
+ }
243
+
244
+ return {
245
+ style: {
246
+ ...style,
247
+ width,
248
+ },
249
+ resizeHandlerProps: {
250
+ onMouseDown: handleMouseDown,
251
+ onTouchStart: handleTouchStart,
252
+ onKeyDown: handleKeyDown,
253
+ onBlur: () => setIsResizingWithKeyboard(false),
254
+ onDoubleClick: handleDoubleClick,
255
+ },
256
+ isResizingWithKeyboard,
257
+ enabled: true,
258
+ };
259
+ }
260
+
261
+ function parseWidth(width: ColumnWidth | undefined): number | undefined {
262
+ if (width == null) {
263
+ return undefined;
264
+ }
265
+ if (typeof width === "number") {
266
+ return width;
267
+ }
268
+ if (typeof width === "string") {
269
+ const parsed = parseInt(width, 10);
270
+ return Number.isNaN(parsed) ? undefined : parsed;
271
+ }
272
+ return undefined;
273
+ }
274
+
275
+ export { useTableColumnResize };
276
+ export type { ResizeProps };
@@ -0,0 +1,10 @@
1
+ import React, { createContext } from "react";
2
+
3
+ const DataTableTheadContext = createContext<boolean>(false);
4
+
5
+ function useDataTableThead(): boolean {
6
+ const context = React.useContext(DataTableTheadContext);
7
+ return context;
8
+ }
9
+
10
+ export { DataTableTheadContext, useDataTableThead };
@@ -1,16 +1,19 @@
1
1
  import React, { forwardRef } from "react";
2
2
  import { cl } from "../../../utils/helpers";
3
+ import { DataTableTheadContext } from "./DataTableThead.context";
3
4
 
4
5
  type DataTableTheadProps = React.HTMLAttributes<HTMLTableSectionElement>;
5
6
 
6
7
  const DataTableThead = forwardRef<HTMLTableSectionElement, DataTableTheadProps>(
7
8
  ({ className, ...rest }, forwardedRef) => {
8
9
  return (
9
- <thead
10
- {...rest}
11
- ref={forwardedRef}
12
- className={cl("aksel-data-table__thead", className)}
13
- />
10
+ <DataTableTheadContext.Provider value={true}>
11
+ <thead
12
+ {...rest}
13
+ ref={forwardedRef}
14
+ className={cl("aksel-data-table__thead", className)}
15
+ />
16
+ </DataTableTheadContext.Provider>
14
17
  );
15
18
  },
16
19
  );
@@ -8,9 +8,9 @@ type DataTableTrProps = React.HTMLAttributes<HTMLTableRowElement> & {
8
8
 
9
9
  const DataTableTr = forwardRef<HTMLTableRowElement, DataTableTrProps>(
10
10
  ({ className, children, selected = false, ...rest }, forwardedRef) => {
11
- const rootContext = useDataTableContext();
11
+ const { layout } = useDataTableContext();
12
12
 
13
- const renderFillerCell = rootContext.layout === "fixed" && children;
13
+ const renderFillerCell = layout === "fixed" && children;
14
14
 
15
15
  return (
16
16
  <tr
@@ -23,7 +23,12 @@ const DataTableTr = forwardRef<HTMLTableRowElement, DataTableTrProps>(
23
23
  {children}
24
24
  {renderFillerCell && (
25
25
  /* TODO: Consider chaning between th and td based on context */
26
- <div className="aksel-data-table__th aksel-data-table__filler-cell" />
26
+ /* using div causes illegal dom structure */
27
+ <td
28
+ aria-hidden
29
+ className="aksel-data-table__th aksel-data-table__filler-cell"
30
+ data-block-keyboard-nav
31
+ />
27
32
  )}
28
33
  </tr>
29
34
  );