@navikt/ds-react 8.9.1 → 8.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/cjs/alert/base-alert/content/BaseAlertContent.js +4 -1
  2. package/cjs/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  3. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
  4. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
  5. package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  6. package/cjs/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
  7. package/cjs/data/drag-and-drop/item/DragAndDropItem.js +6 -4
  8. package/cjs/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  9. package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
  10. package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
  11. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +73 -46
  12. package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  13. package/cjs/data/drag-and-drop/types.d.ts +4 -0
  14. package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  15. package/cjs/data/table/base-cell/DataTableBaseCell.js +63 -0
  16. package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  17. package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
  18. package/cjs/data/table/column-header/DataTableColumnHeader.js +107 -0
  19. package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  20. package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -0
  21. package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  22. package/cjs/data/table/empty-state/DataTableEmptyState.js +2 -2
  23. package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  24. package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
  25. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  26. package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  27. package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
  28. package/cjs/data/table/helpers/selection/getSingleSelectProps.js +8 -12
  29. package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  30. package/cjs/data/table/helpers/selection/selection.types.d.ts +39 -16
  31. package/cjs/data/table/helpers/table-keyboard.js +3 -0
  32. package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
  33. package/cjs/data/table/hooks/useColumnOptions.d.ts +19 -0
  34. package/cjs/data/table/hooks/useColumnOptions.js +19 -0
  35. package/cjs/data/table/hooks/useColumnOptions.js.map +1 -0
  36. package/cjs/data/table/hooks/useTableExpansion.d.ts +26 -0
  37. package/cjs/data/table/hooks/useTableExpansion.js +68 -0
  38. package/cjs/data/table/hooks/useTableExpansion.js.map +1 -0
  39. package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  40. package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -1
  41. package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  42. package/cjs/data/table/hooks/useTableSelection.d.ts +14 -7
  43. package/cjs/data/table/hooks/useTableSelection.js +40 -27
  44. package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
  45. package/cjs/data/table/hooks/useTableSort.d.ts +37 -0
  46. package/cjs/data/table/hooks/useTableSort.js +49 -0
  47. package/cjs/data/table/hooks/useTableSort.js.map +1 -0
  48. package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  49. package/cjs/data/table/loading-state/DataTableLoadingState.js +2 -2
  50. package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  51. package/cjs/data/table/root/DataTable.types.d.ts +55 -4
  52. package/cjs/data/table/root/DataTableAuto.d.ts +97 -1
  53. package/cjs/data/table/root/DataTableAuto.js +92 -39
  54. package/cjs/data/table/root/DataTableAuto.js.map +1 -1
  55. package/cjs/data/table/root/DataTableRoot.context.d.ts +22 -1
  56. package/cjs/data/table/root/DataTableRoot.context.js +7 -1
  57. package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
  58. package/cjs/data/table/root/DataTableRoot.d.ts +0 -6
  59. package/cjs/data/table/root/DataTableRoot.js +5 -4
  60. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  61. package/cjs/data/table/tbody/DataTableTbody.js +7 -1
  62. package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
  63. package/cjs/data/table/td/DataTableTd.d.ts +3 -23
  64. package/cjs/data/table/td/DataTableTd.js +3 -7
  65. package/cjs/data/table/td/DataTableTd.js.map +1 -1
  66. package/cjs/data/table/tfoot/DataTableTfoot.js +3 -1
  67. package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -1
  68. package/cjs/data/table/th/DataTableTh.d.ts +3 -48
  69. package/cjs/data/table/th/DataTableTh.js +3 -57
  70. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  71. package/cjs/data/table/thead/DataTableThead.js +2 -2
  72. package/cjs/data/table/thead/DataTableThead.js.map +1 -1
  73. package/cjs/data/table/tr/DataTableTr.d.ts +8 -0
  74. package/cjs/data/table/tr/DataTableTr.js +131 -9
  75. package/cjs/data/table/tr/DataTableTr.js.map +1 -1
  76. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  77. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  78. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  79. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  80. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  81. package/cjs/date/datepicker/parts/DatePicker.RDP.js +26 -11
  82. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  83. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  84. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  85. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  86. package/cjs/dialog/popup/DialogPopupInternal.js +1 -1
  87. package/cjs/dialog/popup/DialogPopupInternal.js.map +1 -1
  88. package/cjs/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  89. package/cjs/form/checkbox/CheckboxGroup.context.js +6 -0
  90. package/cjs/form/checkbox/CheckboxGroup.context.js.map +1 -0
  91. package/cjs/form/checkbox/CheckboxGroup.d.ts +0 -6
  92. package/cjs/form/checkbox/CheckboxGroup.js +8 -8
  93. package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
  94. package/cjs/form/checkbox/useCheckbox.js +2 -2
  95. package/cjs/form/checkbox/useCheckbox.js.map +1 -1
  96. package/cjs/form/combobox/ComboboxWrapper.js +1 -3
  97. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  98. package/cjs/form/error-summary/ErrorSummary.js +1 -3
  99. package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
  100. package/cjs/form/fieldset/Fieldset.d.ts +0 -4
  101. package/cjs/form/fieldset/Fieldset.js +3 -3
  102. package/cjs/form/fieldset/Fieldset.js.map +1 -1
  103. package/cjs/form/fieldset/useFieldset.d.ts +5 -3
  104. package/cjs/form/fieldset/useFieldset.js +9 -4
  105. package/cjs/form/fieldset/useFieldset.js.map +1 -1
  106. package/cjs/form/radio/RadioGroup.context.d.ts +8 -0
  107. package/cjs/form/radio/RadioGroup.context.js +6 -0
  108. package/cjs/form/radio/RadioGroup.context.js.map +1 -0
  109. package/cjs/form/radio/RadioGroup.d.ts +0 -8
  110. package/cjs/form/radio/RadioGroup.js +10 -10
  111. package/cjs/form/radio/RadioGroup.js.map +1 -1
  112. package/cjs/form/radio/useRadio.js +2 -2
  113. package/cjs/form/radio/useRadio.js.map +1 -1
  114. package/cjs/form/search/Search.js +1 -3
  115. package/cjs/form/search/Search.js.map +1 -1
  116. package/cjs/inline-message/root/InlineMessage.js +2 -5
  117. package/cjs/inline-message/root/InlineMessage.js.map +1 -1
  118. package/cjs/modal/Modal.js +4 -6
  119. package/cjs/modal/Modal.js.map +1 -1
  120. package/cjs/modal/ModalUtils.js +1 -1
  121. package/cjs/modal/ModalUtils.js.map +1 -1
  122. package/cjs/modal/types.d.ts +1 -0
  123. package/cjs/primitives/box/Box.d.ts +1 -1
  124. package/cjs/process/Process.js +1 -5
  125. package/cjs/process/Process.js.map +1 -1
  126. package/cjs/tabs/useTabs.js +3 -7
  127. package/cjs/tabs/useTabs.js.map +1 -1
  128. package/cjs/timeline/Timeline.js +25 -62
  129. package/cjs/timeline/Timeline.js.map +1 -1
  130. package/cjs/timeline/TimelineRow.js +10 -14
  131. package/cjs/timeline/TimelineRow.js.map +1 -1
  132. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  133. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js +179 -0
  134. package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  135. package/cjs/timeline/hooks/usePeriodContext.d.ts +0 -1
  136. package/cjs/timeline/hooks/usePeriodContext.js +0 -1
  137. package/cjs/timeline/hooks/usePeriodContext.js.map +1 -1
  138. package/cjs/timeline/hooks/useRowContext.d.ts +0 -1
  139. package/cjs/timeline/hooks/useRowContext.js +0 -1
  140. package/cjs/timeline/hooks/useRowContext.js.map +1 -1
  141. package/cjs/timeline/hooks/useTimelineContext.d.ts +0 -4
  142. package/cjs/timeline/hooks/useTimelineContext.js +0 -4
  143. package/cjs/timeline/hooks/useTimelineContext.js.map +1 -1
  144. package/cjs/timeline/period/ClickablePeriod.js +6 -20
  145. package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
  146. package/cjs/timeline/period/NonClickablePeriod.js +1 -1
  147. package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
  148. package/cjs/timeline/pin/PinInternal.js +9 -10
  149. package/cjs/timeline/pin/PinInternal.js.map +1 -1
  150. package/cjs/toggle-group/useToggleGroup.js +1 -1
  151. package/cjs/toggle-group/useToggleGroup.js.map +1 -1
  152. package/cjs/utils/components/HighlightText/HighlightText.js +1 -4
  153. package/cjs/utils/components/HighlightText/HighlightText.js.map +1 -1
  154. package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  155. package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  156. package/cjs/utils/helpers/create-strict-context.js +1 -1
  157. package/cjs/utils/helpers/create-strict-context.js.map +1 -1
  158. package/cjs/utils/hooks/useEventCallback.js +1 -1
  159. package/cjs/utils/hooks/useEventCallback.js.map +1 -1
  160. package/cjs/utils/hooks/useMedia.js +1 -1
  161. package/cjs/utils/hooks/useMedia.js.map +1 -1
  162. package/esm/alert/base-alert/content/BaseAlertContent.js +4 -1
  163. package/esm/alert/base-alert/content/BaseAlertContent.js.map +1 -1
  164. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
  165. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
  166. package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
  167. package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
  168. package/esm/data/drag-and-drop/item/DragAndDropItem.js +6 -4
  169. package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
  170. package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
  171. package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
  172. package/esm/data/drag-and-drop/root/DragAndDropRoot.js +74 -47
  173. package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
  174. package/esm/data/drag-and-drop/types.d.ts +4 -0
  175. package/esm/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
  176. package/esm/data/table/base-cell/DataTableBaseCell.js +27 -0
  177. package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -0
  178. package/esm/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
  179. package/esm/data/table/column-header/DataTableColumnHeader.js +71 -0
  180. package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -0
  181. package/esm/data/table/column-header/useTableColumnResize.js.map +1 -0
  182. package/esm/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
  183. package/esm/data/table/empty-state/DataTableEmptyState.js +2 -2
  184. package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -1
  185. package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
  186. package/esm/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
  187. package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
  188. package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
  189. package/esm/data/table/helpers/selection/getSingleSelectProps.js +8 -12
  190. package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
  191. package/esm/data/table/helpers/selection/selection.types.d.ts +39 -16
  192. package/esm/data/table/helpers/table-keyboard.js +3 -0
  193. package/esm/data/table/helpers/table-keyboard.js.map +1 -1
  194. package/esm/data/table/hooks/useColumnOptions.d.ts +19 -0
  195. package/esm/data/table/hooks/useColumnOptions.js +17 -0
  196. package/esm/data/table/hooks/useColumnOptions.js.map +1 -0
  197. package/esm/data/table/hooks/useTableExpansion.d.ts +26 -0
  198. package/esm/data/table/hooks/useTableExpansion.js +31 -0
  199. package/esm/data/table/hooks/useTableExpansion.js.map +1 -0
  200. package/esm/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
  201. package/esm/data/table/hooks/useTableKeyboardNav.js +4 -2
  202. package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
  203. package/esm/data/table/hooks/useTableSelection.d.ts +14 -7
  204. package/esm/data/table/hooks/useTableSelection.js +40 -29
  205. package/esm/data/table/hooks/useTableSelection.js.map +1 -1
  206. package/esm/data/table/hooks/useTableSort.d.ts +37 -0
  207. package/esm/data/table/hooks/useTableSort.js +47 -0
  208. package/esm/data/table/hooks/useTableSort.js.map +1 -0
  209. package/esm/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
  210. package/esm/data/table/loading-state/DataTableLoadingState.js +2 -2
  211. package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -1
  212. package/esm/data/table/root/DataTable.types.d.ts +55 -4
  213. package/esm/data/table/root/DataTableAuto.d.ts +97 -1
  214. package/esm/data/table/root/DataTableAuto.js +94 -41
  215. package/esm/data/table/root/DataTableAuto.js.map +1 -1
  216. package/esm/data/table/root/DataTableRoot.context.d.ts +22 -1
  217. package/esm/data/table/root/DataTableRoot.context.js +5 -1
  218. package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
  219. package/esm/data/table/root/DataTableRoot.d.ts +0 -6
  220. package/esm/data/table/root/DataTableRoot.js +6 -5
  221. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  222. package/esm/data/table/tbody/DataTableTbody.js +8 -2
  223. package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
  224. package/esm/data/table/td/DataTableTd.d.ts +3 -23
  225. package/esm/data/table/td/DataTableTd.js +3 -7
  226. package/esm/data/table/td/DataTableTd.js.map +1 -1
  227. package/esm/data/table/tfoot/DataTableTfoot.js +3 -1
  228. package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -1
  229. package/esm/data/table/th/DataTableTh.d.ts +3 -48
  230. package/esm/data/table/th/DataTableTh.js +4 -58
  231. package/esm/data/table/th/DataTableTh.js.map +1 -1
  232. package/esm/data/table/thead/DataTableThead.js +2 -2
  233. package/esm/data/table/thead/DataTableThead.js.map +1 -1
  234. package/esm/data/table/tr/DataTableTr.d.ts +8 -0
  235. package/esm/data/table/tr/DataTableTr.js +134 -12
  236. package/esm/data/table/tr/DataTableTr.js.map +1 -1
  237. package/esm/date/datepicker/hooks/useRangeDatepicker.js +1 -1
  238. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
  239. package/esm/date/datepicker/parts/DatePicker.DayButton.js +3 -1
  240. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
  241. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
  242. package/esm/date/datepicker/parts/DatePicker.RDP.js +27 -12
  243. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
  244. package/esm/date/monthpicker/parts/MonthPicker.Button.js +7 -5
  245. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
  246. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
  247. package/esm/dialog/popup/DialogPopupInternal.js +1 -1
  248. package/esm/dialog/popup/DialogPopupInternal.js.map +1 -1
  249. package/esm/form/checkbox/CheckboxGroup.context.d.ts +6 -0
  250. package/esm/form/checkbox/CheckboxGroup.context.js +3 -0
  251. package/esm/form/checkbox/CheckboxGroup.context.js.map +1 -0
  252. package/esm/form/checkbox/CheckboxGroup.d.ts +0 -6
  253. package/esm/form/checkbox/CheckboxGroup.js +8 -8
  254. package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
  255. package/esm/form/checkbox/useCheckbox.js +1 -1
  256. package/esm/form/checkbox/useCheckbox.js.map +1 -1
  257. package/esm/form/combobox/ComboboxWrapper.js +1 -3
  258. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  259. package/esm/form/error-summary/ErrorSummary.js +1 -3
  260. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  261. package/esm/form/fieldset/Fieldset.d.ts +0 -4
  262. package/esm/form/fieldset/Fieldset.js +3 -3
  263. package/esm/form/fieldset/Fieldset.js.map +1 -1
  264. package/esm/form/fieldset/useFieldset.d.ts +5 -3
  265. package/esm/form/fieldset/useFieldset.js +10 -5
  266. package/esm/form/fieldset/useFieldset.js.map +1 -1
  267. package/esm/form/radio/RadioGroup.context.d.ts +8 -0
  268. package/esm/form/radio/RadioGroup.context.js +3 -0
  269. package/esm/form/radio/RadioGroup.context.js.map +1 -0
  270. package/esm/form/radio/RadioGroup.d.ts +0 -8
  271. package/esm/form/radio/RadioGroup.js +9 -9
  272. package/esm/form/radio/RadioGroup.js.map +1 -1
  273. package/esm/form/radio/useRadio.js +1 -1
  274. package/esm/form/radio/useRadio.js.map +1 -1
  275. package/esm/form/search/Search.js +1 -3
  276. package/esm/form/search/Search.js.map +1 -1
  277. package/esm/inline-message/root/InlineMessage.js +2 -5
  278. package/esm/inline-message/root/InlineMessage.js.map +1 -1
  279. package/esm/modal/Modal.js +4 -6
  280. package/esm/modal/Modal.js.map +1 -1
  281. package/esm/modal/ModalUtils.js +1 -1
  282. package/esm/modal/ModalUtils.js.map +1 -1
  283. package/esm/modal/types.d.ts +1 -0
  284. package/esm/primitives/box/Box.d.ts +1 -1
  285. package/esm/process/Process.js +1 -5
  286. package/esm/process/Process.js.map +1 -1
  287. package/esm/tabs/useTabs.js +3 -7
  288. package/esm/tabs/useTabs.js.map +1 -1
  289. package/esm/timeline/Timeline.js +26 -63
  290. package/esm/timeline/Timeline.js.map +1 -1
  291. package/esm/timeline/TimelineRow.js +10 -14
  292. package/esm/timeline/TimelineRow.js.map +1 -1
  293. package/esm/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
  294. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js +141 -0
  295. package/esm/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
  296. package/esm/timeline/hooks/usePeriodContext.d.ts +0 -1
  297. package/esm/timeline/hooks/usePeriodContext.js +0 -1
  298. package/esm/timeline/hooks/usePeriodContext.js.map +1 -1
  299. package/esm/timeline/hooks/useRowContext.d.ts +0 -1
  300. package/esm/timeline/hooks/useRowContext.js +0 -1
  301. package/esm/timeline/hooks/useRowContext.js.map +1 -1
  302. package/esm/timeline/hooks/useTimelineContext.d.ts +0 -4
  303. package/esm/timeline/hooks/useTimelineContext.js +0 -4
  304. package/esm/timeline/hooks/useTimelineContext.js.map +1 -1
  305. package/esm/timeline/period/ClickablePeriod.js +7 -21
  306. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  307. package/esm/timeline/period/NonClickablePeriod.js +1 -1
  308. package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
  309. package/esm/timeline/pin/PinInternal.js +10 -11
  310. package/esm/timeline/pin/PinInternal.js.map +1 -1
  311. package/esm/toggle-group/useToggleGroup.js +1 -1
  312. package/esm/toggle-group/useToggleGroup.js.map +1 -1
  313. package/esm/utils/components/HighlightText/HighlightText.js +1 -4
  314. package/esm/utils/components/HighlightText/HighlightText.js.map +1 -1
  315. package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
  316. package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
  317. package/esm/utils/helpers/create-strict-context.js +1 -1
  318. package/esm/utils/helpers/create-strict-context.js.map +1 -1
  319. package/esm/utils/hooks/useEventCallback.js +1 -1
  320. package/esm/utils/hooks/useEventCallback.js.map +1 -1
  321. package/esm/utils/hooks/useMedia.js +1 -1
  322. package/esm/utils/hooks/useMedia.js.map +1 -1
  323. package/package.json +9 -7
  324. package/src/alert/base-alert/content/BaseAlertContent.tsx +7 -2
  325. package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +69 -29
  326. package/src/data/drag-and-drop/item/DragAndDropItem.tsx +16 -10
  327. package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +2 -2
  328. package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +291 -246
  329. package/src/data/drag-and-drop/types.ts +5 -0
  330. package/src/data/table/base-cell/DataTableBaseCell.tsx +92 -0
  331. package/src/data/table/column-header/DataTableColumnHeader.tsx +180 -0
  332. package/src/data/table/empty-state/DataTableEmptyState.tsx +5 -3
  333. package/src/data/table/helpers/selection/getMultipleSelectProps.ts +47 -43
  334. package/src/data/table/helpers/selection/getSingleSelectProps.ts +13 -14
  335. package/src/data/table/helpers/selection/selection.types.ts +41 -16
  336. package/src/data/table/helpers/table-keyboard.ts +4 -0
  337. package/src/data/table/hooks/__tests__/useTableSelection.test.ts +93 -56
  338. package/src/data/table/hooks/useColumnOptions.ts +48 -0
  339. package/src/data/table/hooks/useTableExpansion.tsx +100 -0
  340. package/src/data/table/hooks/useTableKeyboardNav.ts +7 -5
  341. package/src/data/table/hooks/useTableSelection.ts +77 -46
  342. package/src/data/table/hooks/useTableSort.ts +103 -0
  343. package/src/data/table/loading-state/DataTableLoadingState.tsx +5 -3
  344. package/src/data/table/root/DataTable.types.ts +64 -5
  345. package/src/data/table/root/DataTableAuto.tsx +382 -104
  346. package/src/data/table/root/DataTableRoot.context.ts +30 -1
  347. package/src/data/table/root/DataTableRoot.tsx +14 -11
  348. package/src/data/table/tbody/DataTableTbody.tsx +17 -6
  349. package/src/data/table/td/DataTableTd.tsx +11 -47
  350. package/src/data/table/tfoot/DataTableTfoot.tsx +10 -7
  351. package/src/data/table/th/DataTableTh.tsx +11 -183
  352. package/src/data/table/thead/DataTableThead.tsx +3 -3
  353. package/src/data/table/tr/DataTableTr.tsx +300 -11
  354. package/src/date/datepicker/hooks/useRangeDatepicker.tsx +1 -1
  355. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +2 -1
  356. package/src/date/datepicker/parts/DatePicker.RDP.tsx +34 -15
  357. package/src/date/monthpicker/parts/MonthPicker.Button.tsx +11 -9
  358. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +1 -1
  359. package/src/dialog/popup/DialogPopupInternal.tsx +1 -1
  360. package/src/form/checkbox/CheckboxGroup.context.ts +10 -0
  361. package/src/form/checkbox/CheckboxGroup.tsx +18 -28
  362. package/src/form/checkbox/useCheckbox.ts +1 -1
  363. package/src/form/fieldset/Fieldset.tsx +4 -8
  364. package/src/form/fieldset/useFieldset.ts +13 -6
  365. package/src/form/radio/RadioGroup.context.ts +13 -0
  366. package/src/form/radio/RadioGroup.tsx +22 -31
  367. package/src/form/radio/useRadio.ts +1 -1
  368. package/src/inline-message/root/InlineMessage.tsx +3 -13
  369. package/src/modal/Modal.tsx +12 -6
  370. package/src/modal/ModalUtils.ts +1 -1
  371. package/src/modal/types.ts +1 -0
  372. package/src/primitives/box/Box.tsx +1 -1
  373. package/src/tabs/useTabs.ts +3 -7
  374. package/src/timeline/Timeline.tsx +62 -91
  375. package/src/timeline/TimelineRow.tsx +19 -17
  376. package/src/timeline/hooks/TimelineKeyboardNavProvider.tsx +237 -0
  377. package/src/timeline/hooks/usePeriodContext.tsx +0 -2
  378. package/src/timeline/hooks/useRowContext.tsx +0 -2
  379. package/src/timeline/hooks/useTimelineContext.tsx +0 -8
  380. package/src/timeline/period/ClickablePeriod.tsx +8 -19
  381. package/src/timeline/period/NonClickablePeriod.tsx +2 -0
  382. package/src/timeline/pin/PinInternal.tsx +10 -13
  383. package/src/toggle-group/useToggleGroup.ts +1 -1
  384. package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
  385. package/src/utils/helpers/create-strict-context.tsx +1 -1
  386. package/src/utils/hooks/useEventCallback.ts +1 -1
  387. package/src/utils/hooks/useMedia.ts +1 -1
  388. package/cjs/data/table/th/DataTableThActions.d.ts +0 -5
  389. package/cjs/data/table/th/DataTableThActions.js +0 -23
  390. package/cjs/data/table/th/DataTableThActions.js.map +0 -1
  391. package/cjs/data/table/th/useTableColumnResize.js.map +0 -1
  392. package/cjs/data/table/thead/DataTableThead.context.d.ts +0 -4
  393. package/cjs/data/table/thead/DataTableThead.context.js +0 -45
  394. package/cjs/data/table/thead/DataTableThead.context.js.map +0 -1
  395. package/esm/data/table/th/DataTableThActions.d.ts +0 -5
  396. package/esm/data/table/th/DataTableThActions.js +0 -18
  397. package/esm/data/table/th/DataTableThActions.js.map +0 -1
  398. package/esm/data/table/th/useTableColumnResize.js.map +0 -1
  399. package/esm/data/table/thead/DataTableThead.context.d.ts +0 -4
  400. package/esm/data/table/thead/DataTableThead.context.js +0 -8
  401. package/esm/data/table/thead/DataTableThead.context.js.map +0 -1
  402. package/src/data/table/th/DataTableThActions.tsx +0 -32
  403. package/src/data/table/thead/DataTableThead.context.ts +0 -10
  404. /package/cjs/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  405. /package/cjs/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  406. /package/esm/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
  407. /package/esm/data/table/{th → column-header}/useTableColumnResize.js +0 -0
  408. /package/src/data/table/{th → column-header}/useTableColumnResize.ts +0 -0
@@ -1,29 +1,24 @@
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: React.ReactElement<DragAndDropItemProps>[];
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
  /**
@@ -35,259 +30,309 @@ interface DataDragAndDropRootComponent extends React.ForwardRefExoticComponent<
35
30
  * [x] Keyboard navigation
36
31
  * [ ] UU - announce on drag start, item moved, drag end
37
32
  * [x] Make overlay same width as the OG item, currently jumps to content width
38
- * [ ] Look into adding a cancel listener event
39
- * [ ] Make onClick work on drag handler button, currently blocked by pointer down/up listeners
40
- * [ ] Talk to design about what should happen on ESC key press, currently just cancels dragging, should it also reset position?
41
- * [ ] Make arrow icons into buttons that react to keyboard events, currently just decorative
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
49
+ *
42
50
  */
43
51
 
44
- const DragAndDrop = forwardRef<HTMLDivElement, DragAndDropProps>(
45
- ({ setItems, children }, forwardedRef) => {
46
- const DRAG_THRESHOLD = 4; // Minimum movement in pixels to start dragging
47
-
48
- const [activeItem, setActiveItem] =
49
- React.useState<DragAndDropElement | null>(null);
50
- const [dropTarget, setDropTarget] =
51
- React.useState<DragAndDropElement | null>(null);
52
- const [dragHandlerActive, setDragHandlerActive] =
53
- React.useState<DragAndDropElement | null>(null);
54
- const [overlayWidth, setOverlayWidth] = React.useState<number | null>(null);
55
-
56
- const activeItemRef = React.useRef<DragAndDropElement | null>(null);
57
- const dropTargetRef = React.useRef<DragAndDropElement | null>(null);
58
- const activeChild = children.find(
59
- (child) => child.props.id === activeItem?.id,
60
- );
61
-
62
- const [virtualRef, setVirtualRef] = React.useState({
63
- getBoundingClientRect: () =>
64
- DOMRect.fromRect({ width: 0, height: 0, x: 0, y: 0 }),
65
- });
66
-
67
- const pendingDragStartRef = React.useRef<{
68
- item: DragAndDropElement;
69
- element: HTMLElement | null;
70
- pointerId: number;
71
- startX: number;
72
- startY: number;
73
- } | null>(null);
74
-
75
- const startPendingDragStart = (
76
- event: React.PointerEvent,
77
- item: DragAndDropElement,
78
- element?: HTMLElement | null,
79
- ) => {
80
- pendingDragStartRef.current = {
81
- item,
82
- element: element || null,
83
- pointerId: event.pointerId,
84
- startX: event.clientX,
85
- startY: event.clientY,
86
- };
87
- };
88
-
89
- const cancelDragStart = () => {
90
- pendingDragStartRef.current = null;
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,
91
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
+ );
92
123
 
93
- const setCombinedActiveItem = React.useCallback(
94
- (item: DragAndDropElement | null) => {
95
- activeItemRef.current = item;
96
- setActiveItem(item);
97
- },
98
- [],
99
- );
100
-
101
- const setCombinedDropTarget = React.useCallback(
102
- (item: DragAndDropElement | null) => {
103
- dropTargetRef.current = item;
104
- setDropTarget(item);
105
- },
106
- [],
107
- );
108
-
109
- useEffect(() => {
110
- /* This useEffect is used to toggle a class on the html element when dragging,
124
+ useEffect(() => {
125
+ /* This useEffect is used to toggle a class on the html element when dragging,
111
126
  to prevent cursor issues when dragging over interactive elements,
112
127
  and to prevent text selection during dragging. */
113
128
 
114
- if (activeItem) {
115
- document.documentElement.setAttribute("data-dragging-cursor", "true");
116
- document.body.style.userSelect = "none";
117
- } else {
118
- document.documentElement.removeAttribute("data-dragging-cursor");
119
- document.body.style.userSelect = "";
120
- }
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);
121
152
 
122
- return () => {
123
- document.documentElement.removeAttribute("data-dragging-cursor");
124
- document.body.style.userSelect = "";
125
- };
126
- }, [activeItem]);
127
-
128
- useEffect(() => {
129
- const handlePointerMove = (event: PointerEvent) => {
130
- const pendingStart = pendingDragStartRef.current;
131
- const activeRef = activeItemRef.current;
132
- const element = pendingStart?.element;
133
-
134
- if (!activeRef && pendingStart) {
135
- const deltaX = Math.abs(event.clientX - pendingStart.startX);
136
- const deltaY = Math.abs(event.clientY - pendingStart.startY);
137
-
138
- if (deltaX > DRAG_THRESHOLD || deltaY > DRAG_THRESHOLD) {
139
- if (element) {
140
- element.setPointerCapture(pendingStart.pointerId);
141
- }
142
-
143
- setOverlayWidth(element?.getBoundingClientRect().width ?? null);
144
- setCombinedActiveItem(pendingStart.item);
145
- setCombinedDropTarget(pendingStart.item);
146
- pendingDragStartRef.current = null;
153
+ if (deltaX > DRAG_THRESHOLD || deltaY > DRAG_THRESHOLD) {
154
+ if (element) {
155
+ element.setPointerCapture(pendingStart.pointerId);
147
156
  }
148
- return;
149
- }
150
157
 
151
- const active = activeItemRef.current;
152
- if (!active) return;
153
-
154
- setVirtualRef({
155
- getBoundingClientRect: () =>
156
- DOMRect.fromRect({
157
- width: 0,
158
- height: 0,
159
- x: event.clientX,
160
- y: event.clientY,
161
- }),
162
- });
163
-
164
- const elements = document.elementsFromPoint(
165
- event.clientX,
166
- event.clientY,
167
- );
168
-
169
- const matchingElements = elements.filter(
170
- (el) =>
171
- el instanceof HTMLElement && Boolean(el.closest("[data-dnd-id]")),
172
- ) as HTMLElement[];
173
-
174
- const itemElements = matchingElements
175
- .map((el) => el.closest("[data-dnd-id]") as HTMLElement)
176
- .filter((el) => el instanceof HTMLElement);
177
-
178
- const uniqueItemElements = Array.from(new Set(itemElements));
179
-
180
- const targetElement =
181
- uniqueItemElements.find((el) => el.dataset.dndId !== active.id) ??
182
- uniqueItemElements.find((el) => el.dataset.dndId === active.id) ??
183
- null;
184
-
185
- if (!targetElement) {
186
- setCombinedDropTarget(null);
187
- return;
158
+ setOverlayWidth(element?.getBoundingClientRect().width ?? null);
159
+ setCombinedActiveItem(pendingStart.item);
160
+ setCombinedDropTarget(pendingStart.item);
161
+ pendingDragStartRef.current = null;
188
162
  }
163
+ return;
164
+ }
189
165
 
190
- const hoveredId = targetElement.dataset.dndId;
191
- const hoveredIndex = Number(targetElement.dataset.dndIndex);
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
+ });
192
178
 
193
- if (!hoveredId || Number.isNaN(hoveredIndex)) {
194
- setCombinedDropTarget(null);
195
- return;
196
- }
179
+ const elements = document.elementsFromPoint(event.clientX, event.clientY);
197
180
 
198
- setCombinedDropTarget({ id: hoveredId, index: hoveredIndex });
199
- };
181
+ const matchingElements = elements.filter(
182
+ (el) =>
183
+ el instanceof HTMLElement && Boolean(el.closest("[data-dnd-id]")),
184
+ ) as HTMLElement[];
200
185
 
201
- const handlePointerUp = () => {
202
- if (!activeItemRef.current) {
203
- pendingDragStartRef.current = null;
204
- return;
205
- }
186
+ const itemElements = matchingElements
187
+ .map((el) => el.closest("[data-dnd-id]") as HTMLElement)
188
+ .filter((el) => el instanceof HTMLElement);
206
189
 
207
- const active = activeItemRef.current;
208
- const target = dropTargetRef.current;
190
+ const uniqueItemElements = Array.from(new Set(itemElements));
209
191
 
210
- if (active && target && active.id !== target.id) {
211
- setItems((items) => {
212
- const newItems = [...items];
213
- const [movedItem] = newItems.splice(active.index, 1);
214
- newItems.splice(target.index, 0, movedItem);
215
- return newItems;
216
- });
217
- }
218
- setOverlayWidth(null);
219
- setDragHandlerActive(null);
220
- 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) {
221
198
  setCombinedDropTarget(null);
222
- pendingDragStartRef.current = null;
223
- };
199
+ return;
200
+ }
224
201
 
225
- // TODO - Look into adding a cancel listener event
226
- window.addEventListener("pointermove", handlePointerMove);
227
- window.addEventListener("pointerup", handlePointerUp);
202
+ const hoveredId = targetElement.dataset.dndId;
203
+ const hoveredIndex = Number(targetElement.dataset.dndIndex);
228
204
 
229
- return () => {
230
- window.removeEventListener("pointermove", handlePointerMove);
231
- window.removeEventListener("pointerup", handlePointerUp);
232
- };
233
- }, [setCombinedDropTarget, setCombinedActiveItem, setItems]);
205
+ if (!hoveredId || Number.isNaN(hoveredIndex)) {
206
+ setCombinedDropTarget(null);
207
+ return;
208
+ }
234
209
 
235
- const onKeyboardDragEnd = (diff: number) => {
236
- if (!dragHandlerActive) return;
210
+ setCombinedDropTarget({ id: hoveredId, index: hoveredIndex });
211
+ };
237
212
 
238
- const targetIndex = dragHandlerActive.index + diff;
239
- if (targetIndex < 0 || targetIndex >= children.length) {
213
+ const handlePointerUp = () => {
214
+ if (!activeItemRef.current) {
215
+ pendingDragStartRef.current = null;
240
216
  return;
241
217
  }
242
218
 
243
- setItems((items) => {
244
- const newItems = [...items];
245
- const [movedItem] = newItems.splice(dragHandlerActive.index, 1);
246
- newItems.splice(targetIndex, 0, movedItem);
247
- return newItems;
248
- });
249
- 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;
234
+ };
235
+
236
+ const handlePointerCancel = () => {
237
+ setOverlayWidth(null);
238
+ setDragHandlerActive(null);
239
+ setCombinedActiveItem(null);
240
+ setCombinedDropTarget(null);
241
+ pendingDragStartRef.current = null;
250
242
  };
251
243
 
252
- return (
253
- <DragAndDropProvider
254
- activeItem={activeItem}
255
- setActiveItem={setCombinedActiveItem}
256
- dropTarget={dropTarget}
257
- setDropTarget={setCombinedDropTarget}
258
- dragHandlerActive={dragHandlerActive}
259
- setDragHandlerActive={setDragHandlerActive}
260
- onKeyboardDragEnd={onKeyboardDragEnd}
261
- startPendingDragStart={startPendingDragStart}
262
- cancelDragStart={cancelDragStart}
263
- >
264
- <div ref={forwardedRef}>{children}</div>
265
- {activeItem && activeChild && (
266
- <Floating>
267
- <Floating.Anchor virtualRef={virtualRef}>
268
- <span />
269
- </Floating.Anchor>
270
- <Floating.Content
271
- align="start"
272
- updatePositionStrategy="always"
273
- style={{
274
- pointerEvents: "none",
275
- boxSizing: "border-box",
276
- width: overlayWidth ? `${overlayWidth}px` : "fit-content",
277
- }}
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}
278
320
  >
279
- {React.cloneElement(activeChild, {
280
- isOverlay: true,
281
- })}
282
- </Floating.Content>
283
- </Floating>
284
- )}
285
- </DragAndDropProvider>
286
- );
287
- },
288
- ) as DataDragAndDropRootComponent;
289
-
290
- 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;
291
336
 
292
337
  export { DragAndDrop, DragAndDropItem };
293
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
+ }