@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,244 +1,338 @@
1
- import React, { forwardRef, useEffect } from "react";
1
+ /** biome-ignore-all lint/correctness/useHookAtTopLevel: False positive because of the way forwardRef() is added */
2
+ import React, {
3
+ forwardRef,
4
+ useCallback,
5
+ useEffect,
6
+ useRef,
7
+ useState,
8
+ } from "react";
2
9
  import { Floating } from "../../../utils/components/floating/Floating";
10
+ import {
11
+ ColumnDefinition,
12
+ ColumnDefinitions,
13
+ } from "../../table/root/DataTable.types";
3
14
  import DragAndDropItem, { DragAndDropItemProps } from "../item/DragAndDropItem";
4
15
  import { DragAndDropElement } from "../types";
5
16
  import { DragAndDropProvider } from "./DragAndDrop.context";
6
17
 
7
- interface DragAndDropProps extends React.HTMLAttributes<HTMLDivElement> {
8
- children: any[];
9
- setItems: React.Dispatch<React.SetStateAction<any[]>>;
10
- }
11
-
12
- interface DataDragAndDropRootComponent extends React.ForwardRefExoticComponent<
13
- DragAndDropProps & React.RefAttributes<HTMLDivElement>
14
- > {
15
- /**
16
- * @see 🏷️ {@link DragAndDropItemProps}
17
- * * @example
18
- * ```jsx
19
- * <DragAndDrop>
20
- * <DragAndDrop.Item id="1" index={0}>
21
- * ...
22
- * </DragAndDrop.Item>
23
- * </DragAndDrop>
24
- * ```
25
- */
26
- Item: typeof DragAndDropItem;
18
+ interface DragAndDropProps<T> extends React.HTMLAttributes<HTMLUListElement> {
19
+ items: ColumnDefinitions<T>;
20
+ setItems: React.Dispatch<React.SetStateAction<ColumnDefinitions<T>>>;
21
+ renderItem: (item: ColumnDefinition<T>, index: number) => React.ReactNode;
27
22
  }
28
23
 
29
24
  /**
30
25
  * TODO
31
- * setItems on root
32
- * state : active element
33
- * pointer over listener / state, onPointerEnter, onPointerLeave
34
- * Overlay - Use floating component
35
- * Keyboard navigation
36
- * Handle - button, arrows also button
37
- * UU - announce on drag start, item moved, drag end
26
+ * [x] setItems on root
27
+ * [x] state : active element
28
+ * [x] pointer over listener / state, onPointerEnter, onPointerLeave
29
+ * [x] Overlay - Use floating component
30
+ * [x] Keyboard navigation
31
+ * [ ] UU - announce on drag start, item moved, drag end
32
+ * [x] Make overlay same width as the OG item, currently jumps to content width
33
+ * [x] Look into adding a cancel listener event
34
+ * [x] Make onClick work on drag handler button, currently blocked by pointer down/up listeners
35
+ * [x] Talk to design about what should happen on ESC key press, currently just cancels dragging, should it also reset position?
36
+ * [x] Make arrow icons into buttons that react to keyboard events, currently just decorative
37
+ * [x] Keep handler focus after clicking arrows for dragging
38
+ * [x] Look into data-based API vs component-based API
39
+ * [ ] Should we have hidden instructions for screen readers on how to use the drag and drop, and should we announce the position of the item while dragging?
40
+ * [x] Discuss if this component should be generic for drag and drop, or if it should be specifically for tables - just for table for now
41
+ * [x] Discuss items type
42
+ * [ ] Discuss how to implement label best
43
+ * [ ] Quick nav (< > samtidig) - få piltastene til å fungere
44
+ * [x] Implement new type for items - ColumnDefinitions<T>
45
+ * [ ] Remove announcer div and use a live region component instead
46
+ * [ ] Make ESC reset position, not just cancel dragging
47
+ * [ ] Make instructions for keyboard users (visible?)
48
+ * [ ] Ask design about visible keyboard instructions
38
49
  *
39
- * []
40
50
  */
41
51
 
42
- const DragAndDrop = forwardRef<HTMLDivElement, DragAndDropProps>(
43
- ({ setItems, children }, forwardedRef) => {
44
- const [activeItem, setActiveItem] =
45
- React.useState<DragAndDropElement | null>(null);
46
- const [dropTarget, setDropTarget] =
47
- React.useState<DragAndDropElement | null>(null);
48
- const [dragHandlerActive, setDragHandlerActive] =
49
- React.useState<DragAndDropElement | null>(null);
50
-
51
- const activeItemRef = React.useRef<DragAndDropElement | null>(null);
52
- const dropTargetRef = React.useRef<DragAndDropElement | null>(null);
53
-
54
- const [virtualRef, setVirtualRef] = React.useState({
55
- getBoundingClientRect: () =>
56
- DOMRect.fromRect({ width: 0, height: 0, x: 0, y: 0 }),
57
- });
58
-
59
- const setCombinedActiveItem = React.useCallback(
60
- (item: DragAndDropElement | null) => {
61
- activeItemRef.current = item;
62
- setActiveItem(item);
63
- },
64
- [],
65
- );
66
-
67
- const setCombinedDropTarget = React.useCallback(
68
- (item: DragAndDropElement | null) => {
69
- dropTargetRef.current = item;
70
- setDropTarget(item);
71
- },
72
- [],
73
- );
74
-
75
- useEffect(() => {
76
- if (activeItem) {
77
- document.documentElement.setAttribute("data-dragging", "true");
78
- document.body.style.userSelect = "none";
79
- } else {
80
- document.documentElement.removeAttribute("data-dragging");
81
- document.body.style.userSelect = "";
52
+ const DRAG_THRESHOLD = 4; // Minimum movement in pixels to start dragging
53
+
54
+ function DragAndDropInner<T>(
55
+ { items, setItems, renderItem }: DragAndDropProps<T>,
56
+ forwardedRef: React.ForwardedRef<HTMLUListElement>,
57
+ ) {
58
+ const [activeItem, setActiveItem] = useState<DragAndDropElement | null>(null);
59
+ const [dropTarget, setDropTarget] = useState<DragAndDropElement | null>(null);
60
+ const [dragHandlerActive, setDragHandlerActive] =
61
+ useState<DragAndDropElement | null>(null);
62
+ const [overlayWidth, setOverlayWidth] = useState<number | null>(null);
63
+ const [announcement, setAnnouncement] = useState("");
64
+ const activeData = items.find((item) => item.id === activeItem?.id);
65
+
66
+ const activeItemRef = useRef<DragAndDropElement | null>(null);
67
+ const dropTargetRef = useRef<DragAndDropElement | null>(null);
68
+
69
+ const [virtualRef, setVirtualRef] = useState({
70
+ getBoundingClientRect: () =>
71
+ DOMRect.fromRect({ width: 0, height: 0, x: 0, y: 0 }),
72
+ });
73
+
74
+ const pendingDragStartRef = useRef<{
75
+ item: DragAndDropElement;
76
+ element: HTMLElement | null;
77
+ pointerId: number;
78
+ startX: number;
79
+ startY: number;
80
+ } | null>(null);
81
+
82
+ const startPendingDrag = (
83
+ event: React.PointerEvent,
84
+ item: DragAndDropElement,
85
+ element?: HTMLElement | null,
86
+ ) => {
87
+ pendingDragStartRef.current = {
88
+ item,
89
+ element: element || null,
90
+ pointerId: event.pointerId,
91
+ startX: event.clientX,
92
+ startY: event.clientY,
93
+ };
94
+ };
95
+
96
+ const setCombinedActiveItem = useCallback(
97
+ (item: DragAndDropElement | null) => {
98
+ activeItemRef.current = item;
99
+ setActiveItem(item);
100
+ },
101
+ [],
102
+ );
103
+
104
+ const setCombinedDropTarget = useCallback(
105
+ (item: DragAndDropElement | null) => {
106
+ dropTargetRef.current = item;
107
+ setDropTarget(item);
108
+ },
109
+ [],
110
+ );
111
+
112
+ const reorderItems = useCallback(
113
+ (fromIndex: number, toIndex: number) => {
114
+ setItems((currentItems) => {
115
+ const newItems = [...currentItems];
116
+ const [movedItem] = newItems.splice(fromIndex, 1);
117
+ newItems.splice(toIndex, 0, movedItem);
118
+ return newItems;
119
+ });
120
+ },
121
+ [setItems],
122
+ );
123
+
124
+ useEffect(() => {
125
+ /* This useEffect is used to toggle a class on the html element when dragging,
126
+ to prevent cursor issues when dragging over interactive elements,
127
+ and to prevent text selection during dragging. */
128
+
129
+ if (activeItem) {
130
+ document.documentElement.setAttribute("data-dragging-cursor", "true");
131
+ document.body.style.userSelect = "none";
132
+ } else {
133
+ document.documentElement.removeAttribute("data-dragging-cursor");
134
+ document.body.style.userSelect = "";
135
+ }
136
+
137
+ return () => {
138
+ document.documentElement.removeAttribute("data-dragging-cursor");
139
+ document.body.style.userSelect = "";
140
+ };
141
+ }, [activeItem]);
142
+
143
+ useEffect(() => {
144
+ const handlePointerMove = (event: PointerEvent) => {
145
+ const pendingStart = pendingDragStartRef.current;
146
+ const activeRef = activeItemRef.current;
147
+ const element = pendingStart?.element;
148
+
149
+ if (!activeRef && pendingStart) {
150
+ const deltaX = Math.abs(event.clientX - pendingStart.startX);
151
+ const deltaY = Math.abs(event.clientY - pendingStart.startY);
152
+
153
+ if (deltaX > DRAG_THRESHOLD || deltaY > DRAG_THRESHOLD) {
154
+ if (element) {
155
+ element.setPointerCapture(pendingStart.pointerId);
156
+ }
157
+
158
+ setOverlayWidth(element?.getBoundingClientRect().width ?? null);
159
+ setCombinedActiveItem(pendingStart.item);
160
+ setCombinedDropTarget(pendingStart.item);
161
+ pendingDragStartRef.current = null;
162
+ }
163
+ return;
82
164
  }
83
165
 
84
- return () => {
85
- document.documentElement.removeAttribute("data-dragging");
86
- document.body.style.userSelect = "";
87
- };
88
- }, [activeItem]);
89
-
90
- useEffect(() => {
91
- if (!activeItem) return;
92
-
93
- const handlePointerMove = (event: PointerEvent) => {
94
- setVirtualRef({
95
- getBoundingClientRect: () =>
96
- DOMRect.fromRect({
97
- width: 0,
98
- height: 0,
99
- x: event.clientX,
100
- y: event.clientY,
101
- }),
102
- });
103
-
104
- const active = activeItemRef.current;
105
- if (!active) return;
106
-
107
- const elements = document.elementsFromPoint(
108
- event.clientX,
109
- event.clientY,
110
- );
111
-
112
- const matchingElements = elements.filter(
113
- (el) =>
114
- el instanceof HTMLElement && Boolean(el.closest("[data-dnd-id]")),
115
- ) as HTMLElement[];
116
-
117
- const itemElements = matchingElements
118
- .map((el) => el.closest("[data-dnd-id]") as HTMLElement)
119
- .filter((el) => el instanceof HTMLElement);
120
-
121
- const uniqueItemElements = Array.from(new Set(itemElements));
122
-
123
- const targetElement =
124
- uniqueItemElements.find((el) => el.dataset.dndId !== active.id) ??
125
- uniqueItemElements.find((el) => el.dataset.dndId === active.id) ??
126
- null;
127
-
128
- if (!targetElement) {
129
- setCombinedDropTarget(null);
130
- return;
131
- }
166
+ const active = activeItemRef.current;
167
+ if (!active) return;
168
+
169
+ setVirtualRef({
170
+ getBoundingClientRect: () =>
171
+ DOMRect.fromRect({
172
+ width: 0,
173
+ height: 0,
174
+ x: event.clientX,
175
+ y: event.clientY,
176
+ }),
177
+ });
132
178
 
133
- const hoveredId = targetElement.dataset.dndId;
134
- const hoveredIndex = Number(targetElement.dataset.dndIndex);
179
+ const elements = document.elementsFromPoint(event.clientX, event.clientY);
135
180
 
136
- if (!hoveredId || Number.isNaN(hoveredIndex)) {
137
- setCombinedDropTarget(null);
138
- return;
139
- }
181
+ const matchingElements = elements.filter(
182
+ (el) =>
183
+ el instanceof HTMLElement && Boolean(el.closest("[data-dnd-id]")),
184
+ ) as HTMLElement[];
140
185
 
141
- setCombinedDropTarget({ id: hoveredId, index: hoveredIndex });
142
- };
186
+ const itemElements = matchingElements
187
+ .map((el) => el.closest("[data-dnd-id]") as HTMLElement)
188
+ .filter((el) => el instanceof HTMLElement);
143
189
 
144
- const handlePointerUp = () => {
145
- const active = activeItemRef.current;
146
- const target = dropTargetRef.current;
190
+ const uniqueItemElements = Array.from(new Set(itemElements));
147
191
 
148
- if (active && target && active.id !== target.id) {
149
- setItems((items) => {
150
- const newItems = [...items];
151
- const [movedItem] = newItems.splice(active.index, 1);
152
- newItems.splice(target.index, 0, movedItem);
153
- return newItems;
154
- });
155
- }
156
- setCombinedActiveItem(null);
192
+ const targetElement =
193
+ uniqueItemElements.find((el) => el.dataset.dndId !== active.id) ??
194
+ uniqueItemElements.find((el) => el.dataset.dndId === active.id) ??
195
+ null;
196
+
197
+ if (!targetElement) {
157
198
  setCombinedDropTarget(null);
158
- };
199
+ return;
200
+ }
159
201
 
160
- // TODO - Look into adding a cancel listener event
161
- window.addEventListener("pointermove", handlePointerMove);
162
- window.addEventListener("pointerup", handlePointerUp);
202
+ const hoveredId = targetElement.dataset.dndId;
203
+ const hoveredIndex = Number(targetElement.dataset.dndIndex);
163
204
 
164
- return () => {
165
- window.removeEventListener("pointermove", handlePointerMove);
166
- window.removeEventListener("pointerup", handlePointerUp);
167
- };
168
- }, [activeItem, setCombinedDropTarget, setCombinedActiveItem, setItems]);
205
+ if (!hoveredId || Number.isNaN(hoveredIndex)) {
206
+ setCombinedDropTarget(null);
207
+ return;
208
+ }
169
209
 
170
- const onKeyboardDragEnd = (diff: number) => {
171
- if (!dragHandlerActive) return;
210
+ setCombinedDropTarget({ id: hoveredId, index: hoveredIndex });
211
+ };
172
212
 
173
- const targetIndex = dragHandlerActive.index + diff;
174
- if (targetIndex < 0 || targetIndex >= children.length) {
213
+ const handlePointerUp = () => {
214
+ if (!activeItemRef.current) {
215
+ pendingDragStartRef.current = null;
175
216
  return;
176
217
  }
177
218
 
178
- setItems((items) => {
179
- const newItems = [...items];
180
- const [movedItem] = newItems.splice(dragHandlerActive.index, 1);
181
- newItems.splice(targetIndex, 0, movedItem);
182
- return newItems;
183
- });
184
- setDragHandlerActive({ ...dragHandlerActive, index: targetIndex });
219
+ const active = activeItemRef.current;
220
+ const target = dropTargetRef.current;
221
+
222
+ if (active && target && active.id !== target.id) {
223
+ reorderItems(active.index, target.index);
224
+ setAnnouncement(
225
+ `Element flyttet til posisjon ${target?.index + 1} av ${items.length}`,
226
+ ); // TODO - Bedre formulering?
227
+ }
228
+
229
+ setOverlayWidth(null);
230
+ setDragHandlerActive(null);
231
+ setCombinedActiveItem(null);
232
+ setCombinedDropTarget(null);
233
+ pendingDragStartRef.current = null;
185
234
  };
186
235
 
187
- const onDragStart = (
188
- event: React.PointerEvent | React.MouseEvent,
189
- item: DragAndDropElement,
190
- ) => {
191
- setVirtualRef({
192
- getBoundingClientRect: () =>
193
- DOMRect.fromRect({
194
- width: 0,
195
- height: 0,
196
- x: event.clientX,
197
- y: event.clientY,
198
- }),
199
- });
200
- setCombinedActiveItem(item);
201
- setCombinedDropTarget(item);
236
+ const handlePointerCancel = () => {
237
+ setOverlayWidth(null);
238
+ setDragHandlerActive(null);
239
+ setCombinedActiveItem(null);
240
+ setCombinedDropTarget(null);
241
+ pendingDragStartRef.current = null;
202
242
  };
203
243
 
204
- // TODO - Make overlay same width as the OG item, currently jumps to content width
205
-
206
- return (
207
- <DragAndDropProvider
208
- activeItem={activeItem}
209
- setActiveItem={setCombinedActiveItem}
210
- dropTarget={dropTarget}
211
- setDropTarget={setCombinedDropTarget}
212
- dragHandlerActive={dragHandlerActive}
213
- setDragHandlerActive={setDragHandlerActive}
214
- onKeyboardDragEnd={onKeyboardDragEnd}
215
- onDragStart={onDragStart}
216
- >
217
- <div ref={forwardedRef}>{children}</div>
218
- {activeItem && (
219
- <Floating>
220
- <Floating.Anchor virtualRef={virtualRef}>
221
- <span />
222
- </Floating.Anchor>
223
- <Floating.Content
224
- align="start"
225
- updatePositionStrategy="always"
226
- style={{ pointerEvents: "none" }}
244
+ window.addEventListener("pointermove", handlePointerMove);
245
+ window.addEventListener("pointerup", handlePointerUp);
246
+ window.addEventListener("pointercancel", handlePointerCancel);
247
+
248
+ return () => {
249
+ window.removeEventListener("pointermove", handlePointerMove);
250
+ window.removeEventListener("pointerup", handlePointerUp);
251
+ window.removeEventListener("pointercancel", handlePointerCancel);
252
+ };
253
+ }, [
254
+ setCombinedDropTarget,
255
+ setCombinedActiveItem,
256
+ reorderItems,
257
+ items.length,
258
+ ]);
259
+
260
+ const onKeyboardDragEnd = (diff: number) => {
261
+ if (!dragHandlerActive) return;
262
+
263
+ const targetIndex = dragHandlerActive.index + diff;
264
+ if (targetIndex < 0 || targetIndex >= items.length) {
265
+ return;
266
+ }
267
+
268
+ reorderItems(dragHandlerActive.index, targetIndex);
269
+ setDragHandlerActive({ ...dragHandlerActive, index: targetIndex });
270
+ setAnnouncement(
271
+ `Element flyttet til posisjon ${targetIndex + 1} av ${items.length}`,
272
+ ); // TODO - Bedre formulering?
273
+ };
274
+
275
+ return (
276
+ <DragAndDropProvider
277
+ activeItem={activeItem}
278
+ setActiveItem={setCombinedActiveItem}
279
+ dropTarget={dropTarget}
280
+ setDropTarget={setCombinedDropTarget}
281
+ dragHandlerActive={dragHandlerActive}
282
+ setDragHandlerActive={setDragHandlerActive}
283
+ onKeyboardDragEnd={onKeyboardDragEnd}
284
+ startPendingDrag={startPendingDrag}
285
+ itemAmount={items.length}
286
+ >
287
+ <ul ref={forwardedRef} aria-label="Dra og slipp elementer">
288
+ {items.map((item, index) => {
289
+ return (
290
+ <DragAndDropItem
291
+ key={item.id}
292
+ id={item.id}
293
+ index={index}
294
+ itemLabel={item.label}
295
+ >
296
+ {renderItem(item, index)}
297
+ </DragAndDropItem>
298
+ );
299
+ })}
300
+ </ul>
301
+ {activeItem && activeData && (
302
+ <Floating>
303
+ <Floating.Anchor virtualRef={virtualRef}>
304
+ <span />
305
+ </Floating.Anchor>
306
+ <Floating.Content
307
+ align="start"
308
+ updatePositionStrategy="always"
309
+ style={{
310
+ pointerEvents: "none",
311
+ boxSizing: "border-box",
312
+ width: overlayWidth ? `${overlayWidth}px` : "fit-content",
313
+ }}
314
+ >
315
+ <DragAndDropItem
316
+ id={activeItem.id}
317
+ index={activeItem.index}
318
+ isOverlay
319
+ itemLabel={activeData.label}
227
320
  >
228
- {React.cloneElement(children[activeItem.index], {
229
- "data-dnd-id": undefined,
230
- "data-dnd-index": undefined,
231
- "data-overlay": true,
232
- })}
233
- </Floating.Content>
234
- </Floating>
235
- )}
236
- </DragAndDropProvider>
237
- );
238
- },
239
- ) as DataDragAndDropRootComponent;
240
-
241
- DragAndDrop.Item = DragAndDropItem;
321
+ {renderItem(activeData, activeItem.index)}
322
+ </DragAndDropItem>
323
+ </Floating.Content>
324
+ </Floating>
325
+ )}
326
+ <div aria-live="assertive" className="sr-only" aria-atomic="true">
327
+ {announcement}
328
+ </div>
329
+ </DragAndDropProvider>
330
+ );
331
+ }
332
+
333
+ const DragAndDrop = forwardRef(DragAndDropInner) as <T>(
334
+ props: DragAndDropProps<T> & React.RefAttributes<HTMLUListElement>,
335
+ ) => React.ReactElement | null;
242
336
 
243
337
  export { DragAndDrop, DragAndDropItem };
244
338
  export default DragAndDrop;
@@ -2,3 +2,8 @@ export interface DragAndDropElement {
2
2
  id: string;
3
3
  index: number;
4
4
  }
5
+
6
+ export interface DragAndDropItemData {
7
+ id: string;
8
+ label: string;
9
+ }
@@ -0,0 +1,92 @@
1
+ import React, { forwardRef } from "react";
2
+ import { cl } from "../../../utils/helpers";
3
+ import { useDataTableContext } from "../root/DataTableRoot.context";
4
+
5
+ interface DataTableBaseCellProps extends React.HTMLAttributes<HTMLTableCellElement> {
6
+ /**
7
+ * Content alignment inside cell
8
+ * @default "left"
9
+ */
10
+ textAlign?: "left" | "center" | "right";
11
+ /**
12
+ * TODO: Shouldnt be needed to declare these here... But getting type-errors if not
13
+ */
14
+ colSpan?: number;
15
+ rowSpan?: number;
16
+ /**
17
+ * Temp hack to solve overflow and alignment
18
+ */
19
+ UNSAFE_isSelection?: boolean;
20
+ /**
21
+ * When true, clicking this cell will not trigger `onRowClick` on the row.
22
+ * Useful for cells that contain their own interactive content or actions
23
+ * that should be independent of row-level click handling.
24
+ */
25
+ preventRowClick?: boolean;
26
+ /**
27
+ * Sets a max-width on the content wrapper div inside the cell.
28
+ * This is only needed when using `layout="auto"` together with
29
+ * `truncateContent` on `<DataTable>` and you want the cell to be truncated.
30
+ */
31
+ contentMaxWidth?: number | `${number}${string}`;
32
+ /**
33
+ * Makes the cell sticky.
34
+ */
35
+ isSticky?: "start" | "end" | false;
36
+ }
37
+
38
+ /**
39
+ * TODO:
40
+ * - Need a "type" or something that centers content instead of relying on isSelection prop.
41
+ * - Need a separate prop do disabled resizing instead of relying on isSelection prop.
42
+ */
43
+ const DataTableBaseCell = forwardRef<
44
+ HTMLTableCellElement,
45
+ DataTableBaseCellProps & {
46
+ /**
47
+ * Cell type
48
+ */
49
+ as: "th" | "td";
50
+ }
51
+ >(
52
+ (
53
+ {
54
+ className,
55
+ children,
56
+ as: Component,
57
+ textAlign = "left",
58
+ colSpan,
59
+ UNSAFE_isSelection,
60
+ preventRowClick,
61
+ contentMaxWidth,
62
+ rowSpan,
63
+ isSticky,
64
+ ...rest
65
+ },
66
+ forwardedRef,
67
+ ) => {
68
+ const { withKeyboardNav } = useDataTableContext();
69
+
70
+ return (
71
+ <Component
72
+ {...rest}
73
+ ref={forwardedRef}
74
+ className={cl("aksel-data-table__cell", className)}
75
+ tabIndex={withKeyboardNav ? -1 : undefined}
76
+ data-align={textAlign}
77
+ data-selectable={UNSAFE_isSelection}
78
+ data-prevent-row-click={
79
+ preventRowClick || UNSAFE_isSelection || undefined
80
+ }
81
+ data-sticky={isSticky || undefined}
82
+ colSpan={colSpan}
83
+ rowSpan={rowSpan}
84
+ >
85
+ <div style={{ maxWidth: contentMaxWidth }}>{children}</div>
86
+ </Component>
87
+ );
88
+ },
89
+ );
90
+
91
+ export { DataTableBaseCell };
92
+ export type { DataTableBaseCellProps };