@navikt/ds-react 5.13.0 → 5.14.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 (349) hide show
  1. package/_docs.json +206 -135
  2. package/cjs/accordion/AccordionHeader.js +2 -4
  3. package/cjs/button/Button.js +11 -12
  4. package/cjs/chips/Removable.js +3 -6
  5. package/cjs/copybutton/CopyButton.js +4 -5
  6. package/cjs/date/datepicker/DatePicker.js +4 -2
  7. package/cjs/date/datepicker/parts/WeekRow.js +2 -2
  8. package/cjs/date/monthpicker/MonthPicker.js +4 -3
  9. package/cjs/date/parts/DateWrapper.js +2 -2
  10. package/cjs/dropdown/Menu/GroupedList/GroupedItem.js +3 -6
  11. package/cjs/dropdown/Menu/List/Item.js +3 -6
  12. package/cjs/dropdown/Toggle.js +6 -5
  13. package/cjs/form/ConfirmationPanel.js +2 -2
  14. package/cjs/form/Textarea.js +2 -1
  15. package/cjs/form/checkbox/Checkbox.js +3 -2
  16. package/cjs/form/combobox/Combobox.js +2 -2
  17. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +3 -4
  18. package/cjs/form/combobox/Input/inputContext.js +2 -2
  19. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +2 -5
  20. package/cjs/form/error-summary/ErrorSummary.js +2 -2
  21. package/cjs/form/radio/Radio.js +3 -2
  22. package/cjs/form/radio/RadioGroup.js +2 -2
  23. package/cjs/form/search/Search.js +2 -1
  24. package/cjs/form/search/SearchButton.js +2 -4
  25. package/cjs/form/useFormField.js +2 -2
  26. package/cjs/guide-panel/Illustration.js +2 -2
  27. package/cjs/help-text/HelpText.js +5 -7
  28. package/cjs/help-text/HelpTextIcon.js +2 -2
  29. package/cjs/list/List.js +2 -2
  30. package/cjs/loader/Loader.js +2 -1
  31. package/cjs/modal/Modal.js +21 -18
  32. package/cjs/popover/Popover.js +6 -5
  33. package/cjs/read-more/ReadMore.js +2 -4
  34. package/cjs/stepper/Step.js +6 -6
  35. package/cjs/table/DataCell.js +2 -2
  36. package/cjs/table/ExpandableRow.js +9 -9
  37. package/cjs/table/HeaderCell.js +2 -1
  38. package/cjs/tabs/TabList.js +2 -1
  39. package/cjs/tag/Tag.js +4 -2
  40. package/cjs/timeline/Pin.js +2 -2
  41. package/cjs/timeline/period/ClickablePeriod.js +2 -2
  42. package/cjs/toggle-group/ToggleGroup.js +2 -2
  43. package/cjs/tooltip/Tooltip.js +6 -5
  44. package/cjs/util/Slot.js +2 -5
  45. package/cjs/util/TextareaAutoSize.js +7 -5
  46. package/cjs/util/composeEventHandlers.js +17 -0
  47. package/cjs/util/hooks/index.js +19 -0
  48. package/cjs/util/hooks/package.json +6 -0
  49. package/cjs/util/hooks/useClientLayoutEffect.js +7 -0
  50. package/cjs/util/hooks/useMergeRefs.js +37 -0
  51. package/cjs/util/{usePrevious.js → hooks/usePrevious.js} +2 -1
  52. package/cjs/util/index.js +7 -7
  53. package/cjs/util/types/index.js +2 -0
  54. package/cjs/util/types/package.json +6 -0
  55. package/esm/accordion/AccordionHeader.js +2 -4
  56. package/esm/accordion/AccordionHeader.js.map +1 -1
  57. package/esm/button/Button.d.ts +1 -1
  58. package/esm/button/Button.js +12 -13
  59. package/esm/button/Button.js.map +1 -1
  60. package/esm/chips/Chips.d.ts +1 -1
  61. package/esm/chips/Removable.js +3 -6
  62. package/esm/chips/Removable.js.map +1 -1
  63. package/esm/chips/Toggle.d.ts +1 -1
  64. package/esm/copybutton/CopyButton.js +4 -5
  65. package/esm/copybutton/CopyButton.js.map +1 -1
  66. package/esm/date/datepicker/DatePicker.js +5 -3
  67. package/esm/date/datepicker/DatePicker.js.map +1 -1
  68. package/esm/date/datepicker/parts/WeekRow.js +1 -1
  69. package/esm/date/datepicker/parts/WeekRow.js.map +1 -1
  70. package/esm/date/monthpicker/MonthPicker.js +4 -3
  71. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  72. package/esm/date/parts/DateWrapper.js +1 -1
  73. package/esm/date/parts/DateWrapper.js.map +1 -1
  74. package/esm/dropdown/Menu/GroupedList/GroupedItem.d.ts +1 -1
  75. package/esm/dropdown/Menu/GroupedList/GroupedItem.js +3 -6
  76. package/esm/dropdown/Menu/GroupedList/GroupedItem.js.map +1 -1
  77. package/esm/dropdown/Menu/GroupedList/index.d.ts +1 -1
  78. package/esm/dropdown/Menu/List/Item.d.ts +1 -1
  79. package/esm/dropdown/Menu/List/Item.js +3 -6
  80. package/esm/dropdown/Menu/List/Item.js.map +1 -1
  81. package/esm/dropdown/Menu/List/index.d.ts +1 -1
  82. package/esm/dropdown/Toggle.js +6 -5
  83. package/esm/dropdown/Toggle.js.map +1 -1
  84. package/esm/expansion-card/ExpansionCard.d.ts +1 -1
  85. package/esm/expansion-card/ExpansionCardTitle.d.ts +1 -1
  86. package/esm/form/ConfirmationPanel.js +1 -1
  87. package/esm/form/ConfirmationPanel.js.map +1 -1
  88. package/esm/form/Textarea.js +2 -1
  89. package/esm/form/Textarea.js.map +1 -1
  90. package/esm/form/checkbox/Checkbox.js +2 -1
  91. package/esm/form/checkbox/Checkbox.js.map +1 -1
  92. package/esm/form/combobox/Combobox.js +3 -3
  93. package/esm/form/combobox/Combobox.js.map +1 -1
  94. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +1 -2
  95. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  96. package/esm/form/combobox/Input/inputContext.js +1 -1
  97. package/esm/form/combobox/Input/inputContext.js.map +1 -1
  98. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +1 -1
  99. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  100. package/esm/form/error-summary/ErrorSummary.js +1 -1
  101. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  102. package/esm/form/error-summary/ErrorSummaryItem.d.ts +1 -1
  103. package/esm/form/radio/Radio.js +2 -1
  104. package/esm/form/radio/Radio.js.map +1 -1
  105. package/esm/form/radio/RadioGroup.js +1 -1
  106. package/esm/form/radio/RadioGroup.js.map +1 -1
  107. package/esm/form/search/Search.js +4 -3
  108. package/esm/form/search/Search.js.map +1 -1
  109. package/esm/form/search/SearchButton.js +2 -4
  110. package/esm/form/search/SearchButton.js.map +1 -1
  111. package/esm/form/useFormField.js +1 -1
  112. package/esm/form/useFormField.js.map +1 -1
  113. package/esm/guide-panel/Illustration.js +1 -1
  114. package/esm/guide-panel/Illustration.js.map +1 -1
  115. package/esm/help-text/HelpText.d.ts +0 -5
  116. package/esm/help-text/HelpText.js +6 -8
  117. package/esm/help-text/HelpText.js.map +1 -1
  118. package/esm/help-text/HelpTextIcon.js +1 -1
  119. package/esm/internal-header/InternalHeader.d.ts +1 -1
  120. package/esm/internal-header/InternalHeaderButton.d.ts +1 -1
  121. package/esm/internal-header/InternalHeaderTitle.d.ts +1 -1
  122. package/esm/internal-header/InternalHeaderUserButton.d.ts +1 -1
  123. package/esm/layout/box/Box.d.ts +1 -1
  124. package/esm/layout/page/parts/PageBlock.d.ts +1 -1
  125. package/esm/layout/stack/HStack.d.ts +1 -1
  126. package/esm/layout/stack/Stack.d.ts +1 -1
  127. package/esm/layout/stack/VStack.d.ts +1 -1
  128. package/esm/link/Link.d.ts +1 -1
  129. package/esm/link-panel/LinkPanel.d.ts +1 -1
  130. package/esm/link-panel/LinkPanelTitle.d.ts +1 -1
  131. package/esm/list/List.js +1 -1
  132. package/esm/loader/Loader.js +2 -1
  133. package/esm/loader/Loader.js.map +1 -1
  134. package/esm/modal/Modal.js +21 -18
  135. package/esm/modal/Modal.js.map +1 -1
  136. package/esm/modal/types.d.ts +1 -1
  137. package/esm/pagination/PaginationItem.d.ts +1 -1
  138. package/esm/panel/Panel.d.ts +1 -1
  139. package/esm/popover/Popover.d.ts +1 -1
  140. package/esm/popover/Popover.js +4 -3
  141. package/esm/popover/Popover.js.map +1 -1
  142. package/esm/read-more/ReadMore.js +2 -4
  143. package/esm/read-more/ReadMore.js.map +1 -1
  144. package/esm/stepper/Step.d.ts +1 -1
  145. package/esm/stepper/Step.js +6 -6
  146. package/esm/stepper/Step.js.map +1 -1
  147. package/esm/table/AnimateHeight.js.map +1 -0
  148. package/esm/table/DataCell.d.ts +4 -0
  149. package/esm/table/DataCell.js +2 -2
  150. package/esm/table/DataCell.js.map +1 -1
  151. package/esm/table/ExpandableRow.js +8 -8
  152. package/esm/table/ExpandableRow.js.map +1 -1
  153. package/esm/table/HeaderCell.d.ts +4 -0
  154. package/esm/table/HeaderCell.js +2 -1
  155. package/esm/table/HeaderCell.js.map +1 -1
  156. package/esm/tabs/Tab.d.ts +1 -1
  157. package/esm/tabs/TabList.js +3 -2
  158. package/esm/tabs/TabList.js.map +1 -1
  159. package/esm/tabs/Tabs.d.ts +1 -1
  160. package/esm/tag/Tag.d.ts +4 -0
  161. package/esm/tag/Tag.js +4 -2
  162. package/esm/tag/Tag.js.map +1 -1
  163. package/esm/timeline/Pin.js +3 -3
  164. package/esm/timeline/Pin.js.map +1 -1
  165. package/esm/timeline/period/ClickablePeriod.js +3 -3
  166. package/esm/timeline/period/ClickablePeriod.js.map +1 -1
  167. package/esm/toggle-group/ToggleGroup.js +1 -1
  168. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  169. package/esm/tooltip/Tooltip.js +6 -5
  170. package/esm/tooltip/Tooltip.js.map +1 -1
  171. package/esm/typography/BodyLong.d.ts +1 -1
  172. package/esm/typography/BodyShort.d.ts +1 -1
  173. package/esm/typography/Detail.d.ts +1 -1
  174. package/esm/typography/ErrorMessage.d.ts +1 -1
  175. package/esm/typography/Heading.d.ts +1 -1
  176. package/esm/typography/Ingress.d.ts +1 -1
  177. package/esm/typography/Label.d.ts +1 -1
  178. package/esm/util/Slot.js +1 -1
  179. package/esm/util/Slot.js.map +1 -1
  180. package/esm/util/TextareaAutoSize.js +5 -3
  181. package/esm/util/TextareaAutoSize.js.map +1 -1
  182. package/esm/util/composeEventHandlers.d.ts +8 -0
  183. package/esm/util/composeEventHandlers.js +14 -0
  184. package/esm/util/composeEventHandlers.js.map +1 -0
  185. package/esm/util/hooks/index.d.ts +8 -0
  186. package/esm/util/hooks/index.js +9 -0
  187. package/esm/util/hooks/index.js.map +1 -0
  188. package/esm/util/hooks/useClientLayoutEffect.js +5 -0
  189. package/esm/util/hooks/useClientLayoutEffect.js.map +1 -0
  190. package/esm/util/{useEventListener.d.ts → hooks/useEventListener.d.ts} +1 -1
  191. package/esm/util/hooks/useEventListener.js.map +1 -0
  192. package/esm/util/hooks/useId.js.map +1 -0
  193. package/esm/util/hooks/useMedia.js.map +1 -0
  194. package/esm/util/hooks/useMergeRefs.d.ts +15 -0
  195. package/esm/util/hooks/useMergeRefs.js +30 -0
  196. package/esm/util/hooks/useMergeRefs.js.map +1 -0
  197. package/esm/util/hooks/usePrevious.d.ts +1 -0
  198. package/esm/util/{usePrevious.js → hooks/usePrevious.js} +1 -2
  199. package/esm/util/hooks/usePrevious.js.map +1 -0
  200. package/esm/util/index.d.ts +4 -5
  201. package/esm/util/index.js +3 -5
  202. package/esm/util/index.js.map +1 -1
  203. package/esm/util/types/OverridableComponent.js.map +1 -0
  204. package/esm/util/types/index.d.ts +1 -0
  205. package/esm/util/types/index.js +2 -0
  206. package/esm/util/types/index.js.map +1 -0
  207. package/package.json +3 -3
  208. package/src/accordion/AccordionHeader.tsx +2 -4
  209. package/src/accordion/AccordionItem.tsx +2 -2
  210. package/src/alert/alert.stories.tsx +1 -2
  211. package/src/button/Button.tsx +14 -19
  212. package/src/chips/Chips.tsx +1 -1
  213. package/src/chips/Removable.tsx +3 -4
  214. package/src/chips/Toggle.tsx +1 -1
  215. package/src/copybutton/CopyButton.tsx +4 -5
  216. package/src/copybutton/copy-button.stories.tsx +1 -1
  217. package/src/date/datepicker/DatePicker.tsx +5 -3
  218. package/src/date/datepicker/parts/WeekRow.tsx +1 -1
  219. package/src/date/monthpicker/MonthPicker.tsx +4 -3
  220. package/src/date/parts/DateWrapper.tsx +1 -1
  221. package/src/dropdown/Menu/GroupedList/GroupedItem.tsx +23 -23
  222. package/src/dropdown/Menu/GroupedList/index.tsx +1 -1
  223. package/src/dropdown/Menu/List/Item.tsx +23 -23
  224. package/src/dropdown/Menu/List/index.tsx +1 -1
  225. package/src/dropdown/Toggle.tsx +10 -6
  226. package/src/expansion-card/ExpansionCard.tsx +1 -1
  227. package/src/expansion-card/ExpansionCardTitle.tsx +1 -1
  228. package/src/form/ConfirmationPanel.tsx +1 -1
  229. package/src/form/Textarea.tsx +2 -1
  230. package/src/form/checkbox/Checkbox.tsx +2 -1
  231. package/src/form/combobox/Combobox.tsx +3 -6
  232. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +1 -2
  233. package/src/form/combobox/Input/inputContext.tsx +1 -1
  234. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +1 -1
  235. package/src/form/combobox/combobox.stories.tsx +10 -11
  236. package/src/form/error-summary/ErrorSummary.tsx +1 -1
  237. package/src/form/error-summary/ErrorSummaryItem.tsx +1 -1
  238. package/src/form/radio/Radio.tsx +2 -1
  239. package/src/form/radio/RadioGroup.tsx +1 -1
  240. package/src/form/search/Search.tsx +3 -3
  241. package/src/form/search/SearchButton.tsx +2 -4
  242. package/src/form/useFormField.ts +1 -1
  243. package/src/guide-panel/Illustration.tsx +1 -1
  244. package/src/help-text/HelpText.tsx +7 -25
  245. package/src/help-text/HelpTextIcon.tsx +1 -1
  246. package/src/help-text/help-text.stories.tsx +58 -68
  247. package/src/internal-header/InternalHeader.tsx +1 -1
  248. package/src/internal-header/InternalHeaderButton.tsx +1 -1
  249. package/src/internal-header/InternalHeaderTitle.tsx +1 -1
  250. package/src/internal-header/InternalHeaderUserButton.tsx +1 -1
  251. package/src/layout/box/Box.tsx +1 -1
  252. package/src/layout/page/parts/PageBlock.tsx +1 -1
  253. package/src/layout/stack/HStack.tsx +1 -1
  254. package/src/layout/stack/Stack.tsx +1 -1
  255. package/src/layout/stack/VStack.tsx +1 -1
  256. package/src/link/Link.tsx +1 -1
  257. package/src/link/{link.stories.tsx → stories/link.stories.tsx} +2 -2
  258. package/src/link-panel/LinkPanel.tsx +1 -1
  259. package/src/link-panel/LinkPanelTitle.tsx +1 -1
  260. package/src/list/List.tsx +1 -1
  261. package/src/loader/Loader.tsx +2 -1
  262. package/src/modal/Modal.tsx +30 -30
  263. package/src/modal/types.ts +1 -1
  264. package/src/pagination/PaginationItem.tsx +1 -1
  265. package/src/panel/Panel.tsx +1 -1
  266. package/src/popover/Popover.tsx +4 -7
  267. package/src/read-more/ReadMore.tsx +2 -4
  268. package/src/stepper/Step.tsx +8 -5
  269. package/src/table/DataCell.tsx +6 -1
  270. package/src/table/ExpandableRow.tsx +11 -6
  271. package/src/table/HeaderCell.tsx +6 -1
  272. package/src/table/stories/table.stories.tsx +43 -29
  273. package/src/table/stories/tests/table.stories.tsx +2 -3
  274. package/src/tabs/Tab.tsx +1 -1
  275. package/src/tabs/TabList.tsx +4 -2
  276. package/src/tabs/Tabs.tsx +1 -1
  277. package/src/tag/Tag.tsx +9 -2
  278. package/src/tag/tag.stories.tsx +27 -1
  279. package/src/timeline/Pin.tsx +3 -6
  280. package/src/timeline/period/ClickablePeriod.tsx +3 -6
  281. package/src/toggle-group/ToggleGroup.tsx +1 -1
  282. package/src/tooltip/Tooltip.tsx +11 -22
  283. package/src/typography/BodyLong.tsx +1 -1
  284. package/src/typography/BodyShort.tsx +1 -1
  285. package/src/typography/Detail.tsx +1 -1
  286. package/src/typography/ErrorMessage.tsx +1 -1
  287. package/src/typography/Heading.tsx +1 -1
  288. package/src/typography/Ingress.tsx +1 -1
  289. package/src/typography/Label.tsx +1 -1
  290. package/src/typography/stories/bodylong.stories.tsx +1 -2
  291. package/src/typography/stories/bodyshort.stories.tsx +1 -2
  292. package/src/typography/stories/detail.stories.tsx +1 -2
  293. package/src/typography/stories/error-message.stories.tsx +1 -2
  294. package/src/typography/stories/heading.stories.tsx +1 -2
  295. package/src/typography/stories/ingress.stories.tsx +1 -2
  296. package/src/typography/stories/label.stories.tsx +1 -2
  297. package/src/util/Slot.tsx +1 -1
  298. package/src/util/TextareaAutoSize.tsx +7 -3
  299. package/src/util/__tests__/useMedia.test.tsx +1 -1
  300. package/src/util/composeEventHandlers.ts +19 -0
  301. package/src/util/hooks/index.ts +8 -0
  302. package/src/util/hooks/useCallbackRef.ts +1 -1
  303. package/src/util/hooks/useClientLayoutEffect.ts +5 -0
  304. package/src/util/hooks/useControllableState.ts +1 -1
  305. package/src/util/hooks/useMergeRefs.ts +32 -0
  306. package/src/util/{usePrevious.ts → hooks/usePrevious.ts} +1 -4
  307. package/src/util/index.ts +4 -5
  308. package/src/util/types/index.ts +1 -0
  309. package/cjs/util/RandomIcon.js +0 -38
  310. package/cjs/util/mergeRefs.js +0 -16
  311. package/cjs/util/useClientLayoutEffect.js +0 -10
  312. package/esm/util/AnimateHeight.js.map +0 -1
  313. package/esm/util/OverridableComponent.js.map +0 -1
  314. package/esm/util/RandomIcon.d.ts +0 -2
  315. package/esm/util/RandomIcon.js +0 -9
  316. package/esm/util/RandomIcon.js.map +0 -1
  317. package/esm/util/mergeRefs.d.ts +0 -2
  318. package/esm/util/mergeRefs.js +0 -14
  319. package/esm/util/mergeRefs.js.map +0 -1
  320. package/esm/util/useClientLayoutEffect.js +0 -8
  321. package/esm/util/useClientLayoutEffect.js.map +0 -1
  322. package/esm/util/useEventListener.js.map +0 -1
  323. package/esm/util/useId.js.map +0 -1
  324. package/esm/util/useMedia.js.map +0 -1
  325. package/esm/util/usePrevious.d.ts +0 -2
  326. package/esm/util/usePrevious.js.map +0 -1
  327. package/src/util/mergeRefs.tsx +0 -16
  328. package/src/util/useClientLayoutEffect.ts +0 -11
  329. /package/cjs/{util → table}/AnimateHeight.js +0 -0
  330. /package/cjs/util/{useEventListener.js → hooks/useEventListener.js} +0 -0
  331. /package/cjs/util/{useId.js → hooks/useId.js} +0 -0
  332. /package/cjs/util/{useMedia.js → hooks/useMedia.js} +0 -0
  333. /package/cjs/util/{OverridableComponent.js → types/OverridableComponent.js} +0 -0
  334. /package/esm/{util → table}/AnimateHeight.d.ts +0 -0
  335. /package/esm/{util → table}/AnimateHeight.js +0 -0
  336. /package/esm/util/{useClientLayoutEffect.d.ts → hooks/useClientLayoutEffect.d.ts} +0 -0
  337. /package/esm/util/{useEventListener.js → hooks/useEventListener.js} +0 -0
  338. /package/esm/util/{useId.d.ts → hooks/useId.d.ts} +0 -0
  339. /package/esm/util/{useId.js → hooks/useId.js} +0 -0
  340. /package/esm/util/{useMedia.d.ts → hooks/useMedia.d.ts} +0 -0
  341. /package/esm/util/{useMedia.js → hooks/useMedia.js} +0 -0
  342. /package/esm/util/{OverridableComponent.d.ts → types/OverridableComponent.d.ts} +0 -0
  343. /package/esm/util/{OverridableComponent.js → types/OverridableComponent.js} +0 -0
  344. /package/src/{util → link/stories}/RandomIcon.tsx +0 -0
  345. /package/src/{util → table}/AnimateHeight.tsx +0 -0
  346. /package/src/util/{useEventListener.ts → hooks/useEventListener.ts} +0 -0
  347. /package/src/util/{useId.ts → hooks/useId.ts} +0 -0
  348. /package/src/util/{useMedia.ts → hooks/useMedia.ts} +0 -0
  349. /package/src/util/{OverridableComponent.ts → types/OverridableComponent.ts} +0 -0
@@ -1,17 +1,13 @@
1
1
  import { useFloatingPortalNode } from "@floating-ui/react";
2
2
  import cl from "clsx";
3
- import React, {
4
- forwardRef,
5
- useContext,
6
- useEffect,
7
- useMemo,
8
- useRef,
9
- } from "react";
3
+ import React, { forwardRef, useContext, useEffect, useRef } from "react";
10
4
  import { createPortal } from "react-dom";
11
5
  import { DateContext } from "../date/context";
12
6
  import { useProvider } from "../provider";
13
7
  import { Detail, Heading } from "../typography";
14
- import { mergeRefs, useId } from "../util";
8
+ import { composeEventHandlers } from "../util/composeEventHandlers";
9
+ import { useId } from "../util/hooks";
10
+ import { useMergeRefs } from "../util/hooks/useMergeRefs";
15
11
  import ModalBody from "./ModalBody";
16
12
  import { ModalContext } from "./ModalContext";
17
13
  import ModalFooter from "./ModalFooter";
@@ -95,7 +91,8 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
95
91
  ref,
96
92
  ) => {
97
93
  const modalRef = useRef<HTMLDialogElement>(null);
98
- const mergedRef = useMemo(() => mergeRefs([modalRef, ref]), [ref]);
94
+ const mergedRef = useMergeRefs(modalRef, ref);
95
+
99
96
  const ariaLabelId = useId();
100
97
  const rootElement = useProvider()?.rootElement;
101
98
  const portalNode = useFloatingPortalNode({ root: rootElement });
@@ -149,25 +146,28 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
149
146
  ...(!isWidthPreset ? { width } : {}),
150
147
  };
151
148
 
152
- const mergedOnCancel: React.DialogHTMLAttributes<HTMLDialogElement>["onCancel"] =
153
- (event) => {
154
- if (onBeforeClose && onBeforeClose() === false) {
155
- event.preventDefault();
156
- } else if (onCancel) onCancel(event);
157
- };
158
-
159
- const mergedOnClick =
160
- closeOnBackdropClick && !needPolyfill // closeOnBackdropClick has issues on polyfill when nesting modals (DatePicker)
161
- ? (event: React.MouseEvent<HTMLDialogElement>) => {
162
- onClick && onClick(event);
163
- if (
164
- event.target === modalRef.current &&
165
- (!onBeforeClose || onBeforeClose() !== false)
166
- ) {
167
- modalRef.current.close();
168
- }
169
- }
170
- : onClick;
149
+ /**
150
+ * @note `closeOnBackdropClick` has issues on polyfill when nesting modals (DatePicker)
151
+ */
152
+ const handleModalClick = (event: React.MouseEvent<HTMLDialogElement>) => {
153
+ if (
154
+ closeOnBackdropClick &&
155
+ !needPolyfill &&
156
+ event.target === modalRef.current &&
157
+ (!onBeforeClose || onBeforeClose() !== false)
158
+ ) {
159
+ modalRef.current.close();
160
+ }
161
+ };
162
+
163
+ /**
164
+ * @note onCancel fires when you press `Esc`
165
+ */
166
+ const handleModalCancel = (
167
+ event: React.SyntheticEvent<HTMLDialogElement, Event>,
168
+ ) => {
169
+ onBeforeClose && onBeforeClose() === false && event.preventDefault();
170
+ };
171
171
 
172
172
  const mergedAriaLabelledBy =
173
173
  !ariaLabelledby && !rest["aria-label"] && header
@@ -181,8 +181,8 @@ export const Modal = forwardRef<HTMLDialogElement, ModalProps>(
181
181
  ref={mergedRef}
182
182
  className={mergedClassName}
183
183
  style={mergedStyle}
184
- onCancel={mergedOnCancel} // FYI: onCancel fires when you press Esc
185
- onClick={mergedOnClick}
184
+ onCancel={composeEventHandlers(onCancel, handleModalCancel)}
185
+ onClick={composeEventHandlers(onClick, handleModalClick)}
186
186
  aria-labelledby={mergedAriaLabelledBy}
187
187
  >
188
188
  <ModalContext.Provider
@@ -41,7 +41,7 @@ export interface ModalProps
41
41
  */
42
42
  onBeforeClose?: () => boolean | void;
43
43
  /**
44
- * *Sometimes** called when the user presses the Esc key, unless you return `false` in `onBeforeClose()`.
44
+ * *Sometimes** called when the user presses the Esc key.
45
45
  * @warning *Some browsers does not always trigger this event. Chrome only triggers it if you have
46
46
  * interacted with the modal, and will not trigger it a second time if you press Esc twice in a row.
47
47
  */
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { Button, ButtonProps } from "../button";
4
- import { OverridableComponent } from "../util";
4
+ import { OverridableComponent } from "../util/types";
5
5
 
6
6
  export interface PaginationItemProps extends ButtonProps {
7
7
  children: React.ReactNode;
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { OverridableComponent } from "../util/OverridableComponent";
3
+ import { OverridableComponent } from "../util/types";
4
4
 
5
5
  export interface PanelProps extends React.HTMLAttributes<HTMLElement> {
6
6
  /**
@@ -15,12 +15,12 @@ import React, {
15
15
  forwardRef,
16
16
  useCallback,
17
17
  useContext,
18
- useMemo,
19
18
  useRef,
20
19
  } from "react";
21
20
  import { DateContext } from "../date/context";
22
21
  import { ModalContext } from "../modal/ModalContext";
23
- import { mergeRefs, useClientLayoutEffect, useEventListener } from "../util";
22
+ import { useClientLayoutEffect, useEventListener } from "../util/hooks";
23
+ import { useMergeRefs } from "../util/hooks/useMergeRefs";
24
24
  import PopoverContent, { PopoverContentType } from "./PopoverContent";
25
25
 
26
26
  export interface PopoverProps extends HTMLAttributes<HTMLDivElement> {
@@ -41,7 +41,7 @@ export interface PopoverProps extends HTMLAttributes<HTMLDivElement> {
41
41
  */
42
42
  onClose: () => void;
43
43
  /**
44
- * Orientation for popover
44
+ * Default orientation of popover
45
45
  * @note Try to keep general usage to "top", "bottom", "left", "right"
46
46
  * @default "top"
47
47
  */
@@ -163,10 +163,7 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
163
163
  refs.setReference(anchorEl);
164
164
  }, [anchorEl]);
165
165
 
166
- const floatingRef = useMemo(
167
- () => mergeRefs([refs.setFloating, ref]),
168
- [refs.setFloating, ref],
169
- );
166
+ const floatingRef = useMergeRefs(refs.setFloating, ref);
170
167
 
171
168
  useClientLayoutEffect(() => {
172
169
  if (!refs.reference.current || !refs.floating.current || !open) return;
@@ -2,6 +2,7 @@ import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { ChevronDownIcon } from "@navikt/aksel-icons";
4
4
  import { BodyLong } from "../typography";
5
+ import { composeEventHandlers } from "../util/composeEventHandlers";
5
6
  import { useControllableState } from "../util/hooks/useControllableState";
6
7
 
7
8
  export interface ReadMoreProps
@@ -89,10 +90,7 @@ export const ReadMore = forwardRef<HTMLButtonElement, ReadMoreProps>(
89
90
  className={cl("navds-read-more__button", "navds-body-short", {
90
91
  "navds-body-short--small": size === "small",
91
92
  })}
92
- onClick={(e) => {
93
- _setOpen((x) => !x);
94
- onClick?.(e);
95
- }}
93
+ onClick={composeEventHandlers(onClick, () => _setOpen((x) => !x))}
96
94
  aria-expanded={_open}
97
95
  >
98
96
  <ChevronDownIcon
@@ -1,7 +1,8 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useContext } from "react";
3
3
  import { Label } from "../typography";
4
- import { OverridableComponent } from "../util";
4
+ import { composeEventHandlers } from "../util/composeEventHandlers";
5
+ import { OverridableComponent } from "../util/types";
5
6
  import { StepperContext } from "./context";
6
7
 
7
8
  export interface StepperStepProps
@@ -56,6 +57,7 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
56
57
  unsafe_index = 0,
57
58
  completed = false,
58
59
  interactive,
60
+ onClick,
59
61
  ...rest
60
62
  },
61
63
  ref,
@@ -71,6 +73,10 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
71
73
 
72
74
  const Comp = isInteractive ? Component : "div";
73
75
 
76
+ const handleStepClick = () => {
77
+ isInteractive && context.onStepChange(unsafe_index + 1);
78
+ };
79
+
74
80
  return (
75
81
  <Comp
76
82
  {...rest}
@@ -82,10 +88,7 @@ export const Step: OverridableComponent<StepperStepProps, HTMLAnchorElement> =
82
88
  "navds-stepper__step--non-interactive": !isInteractive,
83
89
  "navds-stepper__step--completed": completed,
84
90
  })}
85
- onClick={(e) => {
86
- isInteractive && context.onStepChange(unsafe_index + 1);
87
- rest?.onClick?.(e);
88
- }}
91
+ onClick={composeEventHandlers(onClick, handleStepClick)}
89
92
  >
90
93
  {completed ? (
91
94
  <span className="navds-stepper__circle navds-stepper__circle--success">
@@ -9,6 +9,10 @@ export interface DataCellProps
9
9
  * @default "left"
10
10
  */
11
11
  align?: "left" | "center" | "right";
12
+ /**
13
+ * Adjusts font-size
14
+ */
15
+ textSize?: "medium" | "small";
12
16
  }
13
17
 
14
18
  export interface DataCellType
@@ -17,7 +21,7 @@ export interface DataCellType
17
21
  > {}
18
22
 
19
23
  export const DataCell: DataCellType = forwardRef(
20
- ({ className, children = "", align, ...rest }, ref) => {
24
+ ({ className, children = "", align, textSize, ...rest }, ref) => {
21
25
  return (
22
26
  <BodyShort
23
27
  as="td"
@@ -25,6 +29,7 @@ export const DataCell: DataCellType = forwardRef(
25
29
  className={cl("navds-table__data-cell", className, {
26
30
  [`navds-table__data-cell--align-${align}`]: align,
27
31
  })}
32
+ size={textSize}
28
33
  {...rest}
29
34
  >
30
35
  {children}
@@ -1,9 +1,10 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { ChevronDownIcon } from "@navikt/aksel-icons";
4
- import { useId } from "../util";
5
- import AnimateHeight from "../util/AnimateHeight";
4
+ import { composeEventHandlers } from "../util/composeEventHandlers";
5
+ import { useId } from "../util/hooks";
6
6
  import { useControllableState } from "../util/hooks/useControllableState";
7
+ import AnimateHeight from "./AnimateHeight";
7
8
  import DataCell from "./DataCell";
8
9
  import Row, { RowProps } from "./Row";
9
10
 
@@ -66,6 +67,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
66
67
  expansionDisabled = false,
67
68
  expandOnRowClick = false,
68
69
  colSpan = 999,
70
+ onClick,
69
71
  ...rest
70
72
  },
71
73
  ref,
@@ -86,6 +88,12 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
86
88
  const onRowClick = (e) =>
87
89
  !isInteractiveTarget(e.target) && expansionHandler(e);
88
90
 
91
+ const handleRowClick = (
92
+ e: React.MouseEvent<HTMLTableRowElement, MouseEvent>,
93
+ ) => {
94
+ !expansionDisabled && expandOnRowClick && onRowClick(e);
95
+ };
96
+
89
97
  return (
90
98
  <>
91
99
  <Row
@@ -97,10 +105,7 @@ export const ExpandableRow: ExpandableRowType = forwardRef(
97
105
  expansionDisabled,
98
106
  "navds-table__expandable-row--clickable": expandOnRowClick,
99
107
  })}
100
- onClick={(e) => {
101
- !expansionDisabled && expandOnRowClick && onRowClick(e);
102
- rest?.onClick?.(e);
103
- }}
108
+ onClick={composeEventHandlers(onClick, handleRowClick)}
104
109
  >
105
110
  {togglePlacement === "right" && children}
106
111
  <DataCell
@@ -9,6 +9,10 @@ export interface HeaderCellProps
9
9
  * @default "left"
10
10
  */
11
11
  align?: "left" | "center" | "right";
12
+ /**
13
+ * Adjusts font-size
14
+ */
15
+ textSize?: "medium" | "small";
12
16
  }
13
17
 
14
18
  export interface HeaderCellType
@@ -17,12 +21,13 @@ export interface HeaderCellType
17
21
  > {}
18
22
 
19
23
  export const HeaderCell: HeaderCellType = forwardRef(
20
- ({ className, children, align, ...rest }, ref) => {
24
+ ({ className, children, align, textSize, ...rest }, ref) => {
21
25
  return (
22
26
  <th
23
27
  ref={ref}
24
28
  className={cl("navds-table__header-cell", "navds-label", className, {
25
29
  [`navds-table__header-cell--align-${align}`]: align,
30
+ "navds-label--small": textSize === "small",
26
31
  })}
27
32
  {...rest}
28
33
  >
@@ -1,26 +1,30 @@
1
1
  import React, { useState } from "react";
2
- import { Table } from "../";
3
- import { Alert, Button, Checkbox, Link } from "../..";
2
+ import { Table, TableProps } from "../";
3
+ import { Alert, Button, Checkbox, CheckboxGroup, Link } from "../..";
4
4
 
5
5
  export default {
6
6
  title: "ds-react/Table",
7
7
  component: Table,
8
8
  };
9
9
 
10
- const TableComponent = (props) => (
11
- <Table {...props}>
10
+ interface Props extends TableProps {
11
+ button?: boolean;
12
+ shadeOnHover?: boolean;
13
+ }
14
+ const TableComponent = ({ button, shadeOnHover, ...rest }: Props) => (
15
+ <Table {...rest}>
12
16
  <Table.Header>
13
17
  <Table.Row>
14
- {props.button && <Table.HeaderCell>Action</Table.HeaderCell>}
18
+ {button && <Table.HeaderCell>Action</Table.HeaderCell>}
15
19
  <Table.HeaderCell>ID</Table.HeaderCell>
16
20
  <Table.HeaderCell>Fornavn</Table.HeaderCell>
17
- <Table.HeaderCell>Etternavn</Table.HeaderCell>
18
- <Table.HeaderCell>Rolle</Table.HeaderCell>
21
+ <Table.HeaderCell textSize="medium">Etternavn</Table.HeaderCell>
22
+ <Table.HeaderCell textSize="small">Rolle</Table.HeaderCell>
19
23
  </Table.Row>
20
24
  </Table.Header>
21
25
  <Table.Body>
22
- <Table.Row shadeOnHover={props.shadeOnHover}>
23
- {props.button && (
26
+ <Table.Row shadeOnHover={shadeOnHover}>
27
+ {button && (
24
28
  <Table.DataCell
25
29
  style={{
26
30
  paddingTop: 6,
@@ -35,8 +39,8 @@ const TableComponent = (props) => (
35
39
  <Table.DataCell>Picard</Table.DataCell>
36
40
  <Table.DataCell>Kaptein</Table.DataCell>
37
41
  </Table.Row>
38
- <Table.Row shadeOnHover={props.shadeOnHover}>
39
- {props.button && (
42
+ <Table.Row shadeOnHover={shadeOnHover}>
43
+ {button && (
40
44
  <Table.DataCell
41
45
  style={{
42
46
  paddingTop: 6,
@@ -51,8 +55,8 @@ const TableComponent = (props) => (
51
55
  <Table.DataCell>Riker</Table.DataCell>
52
56
  <Table.DataCell>Kommandør</Table.DataCell>
53
57
  </Table.Row>
54
- <Table.Row shadeOnHover={props.shadeOnHover}>
55
- {props.button && (
58
+ <Table.Row shadeOnHover={shadeOnHover}>
59
+ {button && (
56
60
  <Table.DataCell
57
61
  style={{
58
62
  paddingTop: 6,
@@ -64,8 +68,8 @@ const TableComponent = (props) => (
64
68
  )}
65
69
  <Table.HeaderCell>3</Table.HeaderCell>
66
70
  <Table.DataCell>Geordi</Table.DataCell>
67
- <Table.DataCell>La Forge</Table.DataCell>
68
- <Table.DataCell>Sjefsingeniør</Table.DataCell>
71
+ <Table.DataCell textSize="medium">La Forge</Table.DataCell>
72
+ <Table.DataCell textSize="small">Sjefsingeniør</Table.DataCell>
69
73
  </Table.Row>
70
74
  </Table.Body>
71
75
  </Table>
@@ -229,22 +233,32 @@ const SelectionTable = ({ size = "medium" }: { size?: "small" | "medium" }) => {
229
233
  </Table.Row>
230
234
  <Table.Row selected={selectedRows.includes("3")}>
231
235
  <Table.DataCell>
232
- <Checkbox
233
- size={size}
234
- hideLabel
235
- checked={selectedRows.includes("3")}
236
- onChange={() => toggleSelectedRow("3")}
237
- aria-labelledby={`x_r3-${size}`}
238
- >
239
- {" "}
240
- </Checkbox>
236
+ <CheckboxGroup legend="velg flere felt" hideLegend>
237
+ <Checkbox
238
+ size={size}
239
+ hideLabel
240
+ checked={selectedRows.includes("3")}
241
+ onChange={() => toggleSelectedRow("3")}
242
+ aria-labelledby={`x_r3-${size}`}
243
+ >
244
+ {" "}
245
+ </Checkbox>
246
+ <Checkbox
247
+ size={size}
248
+ hideLabel
249
+ checked={selectedRows.includes("3")}
250
+ onChange={() => toggleSelectedRow("3")}
251
+ aria-labelledby={`x_r3-${size}`}
252
+ >
253
+ {" "}
254
+ </Checkbox>
255
+ </CheckboxGroup>
241
256
  </Table.DataCell>
242
- <Table.HeaderCell scope="row">
243
- <span id={`x_r3-${size}`}>Rudolph Bachenmeier</span>
257
+ <Table.HeaderCell scope="row" colSpan={4}>
258
+ <span id={`x_r3-${size}`}>
259
+ Don&apos;t stack multiple checkboxes
260
+ </span>
244
261
  </Table.HeaderCell>
245
- <Table.DataCell>32</Table.DataCell>
246
- <Table.DataCell>Germany</Table.DataCell>
247
- <Table.DataCell>70</Table.DataCell>
248
262
  </Table.Row>
249
263
  </Table.Body>
250
264
  </Table>
@@ -1,5 +1,4 @@
1
- import { expect, jest } from "@storybook/jest";
2
- import { userEvent, within } from "@storybook/testing-library";
1
+ import { expect, fn, userEvent, within } from "@storybook/test";
3
2
  import React from "react";
4
3
  import { Table } from "../..";
5
4
 
@@ -66,7 +65,7 @@ export const ClickableRowTest = {
66
65
  );
67
66
  },
68
67
  args: {
69
- onOpenChange: jest.fn(),
68
+ onOpenChange: fn(),
70
69
  },
71
70
  play: async ({ canvasElement, args }) => {
72
71
  args.onOpenChange.mockClear();
package/src/tabs/Tab.tsx CHANGED
@@ -2,7 +2,7 @@ import * as RadixTabs from "@radix-ui/react-tabs";
2
2
  import cl from "clsx";
3
3
  import React, { forwardRef, useContext } from "react";
4
4
  import { BodyShort } from "../typography";
5
- import { OverridableComponent } from "../util";
5
+ import { OverridableComponent } from "../util/types";
6
6
  import { TabsContext } from "./context";
7
7
 
8
8
  export interface TabProps
@@ -9,7 +9,8 @@ import React, {
9
9
  useState,
10
10
  } from "react";
11
11
  import { ChevronLeftIcon, ChevronRightIcon } from "@navikt/aksel-icons";
12
- import { debounce, mergeRefs } from "../util";
12
+ import { debounce } from "../util";
13
+ import { useMergeRefs } from "../util/hooks/useMergeRefs";
13
14
  import { TabsContext } from "./context";
14
15
 
15
16
  export interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -23,7 +24,8 @@ export const TabList = forwardRef<HTMLDivElement, TabListProps>(
23
24
  ({ className, ...rest }, ref) => {
24
25
  const context = useContext(TabsContext);
25
26
  const listRef = useRef<HTMLDivElement | null>(null);
26
- const mergedRef = useMemo(() => mergeRefs([listRef, ref]), [ref]);
27
+ const mergedRef = useMergeRefs(listRef, ref);
28
+
27
29
  const [displayScroll, setDisplayScroll] = useState({
28
30
  start: false,
29
31
  end: false,
package/src/tabs/Tabs.tsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as RadixTabs from "@radix-ui/react-tabs";
2
2
  import cl from "clsx";
3
3
  import React, { HTMLAttributes, forwardRef } from "react";
4
- import { OverridableComponent } from "../util/OverridableComponent";
4
+ import { OverridableComponent } from "../util/types";
5
5
  import Tab, { TabProps } from "./Tab";
6
6
  import TabList, { TabListProps } from "./TabList";
7
7
  import TabPanel, { TabPanelProps } from "./TabPanel";
package/src/tag/Tag.tsx CHANGED
@@ -36,6 +36,10 @@ export interface TagProps extends HTMLAttributes<HTMLSpanElement> {
36
36
  * @default "medium"
37
37
  */
38
38
  size?: "medium" | "small" | "xsmall";
39
+ /**
40
+ * Tag Icon
41
+ */
42
+ icon?: React.ReactNode;
39
43
  }
40
44
 
41
45
  /**
@@ -50,7 +54,7 @@ export interface TagProps extends HTMLAttributes<HTMLSpanElement> {
50
54
  * ```
51
55
  */
52
56
  export const Tag = forwardRef<HTMLSpanElement, TagProps>(
53
- ({ className, variant, size = "medium", ...rest }, ref) => (
57
+ ({ children, className, variant, size = "medium", icon, ...rest }, ref) => (
54
58
  <BodyShort
55
59
  {...rest}
56
60
  ref={ref}
@@ -62,7 +66,10 @@ export const Tag = forwardRef<HTMLSpanElement, TagProps>(
62
66
  `navds-tag--${variant}`,
63
67
  `navds-tag--${size}`,
64
68
  )}
65
- />
69
+ >
70
+ {icon && <span className="navds-tag__icon--left">{icon}</span>}
71
+ {children}
72
+ </BodyShort>
66
73
  ),
67
74
  );
68
75
 
@@ -1,6 +1,10 @@
1
1
  import type { Meta } from "@storybook/react";
2
2
  import React from "react";
3
+ import { ComponentIcon } from "@navikt/aksel-icons";
3
4
  import { Tag, TagProps } from ".";
5
+ import { HStack } from "../layout/stack";
6
+
7
+ const sizes: TagProps["size"][] = ["xsmall", "small", "medium"];
4
8
 
5
9
  const variants: TagProps["variant"][] = [
6
10
  "warning",
@@ -52,7 +56,11 @@ export default {
52
56
 
53
57
  export const Default = {
54
58
  render: (props) => (
55
- <Tag variant={props.variant} size={props.size}>
59
+ <Tag
60
+ variant={props.variant}
61
+ size={props.size}
62
+ icon={props.icon && <ComponentIcon aria-hidden />}
63
+ >
56
64
  {props.children}
57
65
  </Tag>
58
66
  ),
@@ -60,6 +68,7 @@ export const Default = {
60
68
  args: {
61
69
  children: "Id elit esse",
62
70
  variant: "info",
71
+ icon: false,
63
72
  },
64
73
  };
65
74
 
@@ -98,3 +107,20 @@ export const Variants = () => {
98
107
  </div>
99
108
  );
100
109
  };
110
+
111
+ export const WithIcons = () => {
112
+ return (
113
+ <HStack gap="2" align="start">
114
+ {sizes.reverse().map((size) => (
115
+ <Tag
116
+ key={size}
117
+ variant="neutral-moderate"
118
+ size={size}
119
+ icon={<ComponentIcon aria-hidden />}
120
+ >
121
+ {size}
122
+ </Tag>
123
+ ))}
124
+ </HStack>
125
+ );
126
+ };
@@ -14,8 +14,8 @@ import {
14
14
  useRole,
15
15
  } from "@floating-ui/react";
16
16
  import { format } from "date-fns";
17
- import React, { forwardRef, useMemo, useRef, useState } from "react";
18
- import { mergeRefs } from "../util";
17
+ import React, { forwardRef, useRef, useState } from "react";
18
+ import { useMergeRefs } from "../util/hooks/useMergeRefs";
19
19
  import { useTimelineContext } from "./hooks/useTimelineContext";
20
20
  import { position } from "./utils/calc";
21
21
  import { TimelineComponentTypes } from "./utils/types.internal";
@@ -81,10 +81,7 @@ export const Pin = forwardRef<HTMLButtonElement, TimelinePinProps>(
81
81
  role,
82
82
  ]);
83
83
 
84
- const mergedRef = useMemo(
85
- () => mergeRefs([refs.setReference, ref]),
86
- [ref, refs.setReference],
87
- );
84
+ const mergedRef = useMergeRefs(refs.setReference, ref);
88
85
 
89
86
  const staticSide = {
90
87
  top: "bottom",
@@ -14,8 +14,8 @@ import {
14
14
  useRole,
15
15
  } from "@floating-ui/react";
16
16
  import cl from "clsx";
17
- import React, { useMemo, useRef, useState } from "react";
18
- import { mergeRefs } from "../../util";
17
+ import React, { useRef, useState } from "react";
18
+ import { useMergeRefs } from "../../util/hooks/useMergeRefs";
19
19
  import { usePeriodContext } from "../hooks/usePeriodContext";
20
20
  import { useRowContext } from "../hooks/useRowContext";
21
21
  import { useTimelineContext } from "../hooks/useTimelineContext";
@@ -89,10 +89,7 @@ const ClickablePeriod = React.memo(
89
89
  role,
90
90
  ]);
91
91
 
92
- const mergedRef = useMemo(
93
- () => mergeRefs([refs.setReference, periodRef]),
94
- [periodRef, refs.setReference],
95
- );
92
+ const mergedRef = useMergeRefs(refs.setReference, periodRef);
96
93
 
97
94
  const staticSide = {
98
95
  top: "bottom",
@@ -2,7 +2,7 @@ import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
2
2
  import cl from "clsx";
3
3
  import React, { HTMLAttributes, forwardRef, useState } from "react";
4
4
  import { Label } from "../typography";
5
- import { useId } from "../util";
5
+ import { useId } from "../util/hooks";
6
6
  import ToggleItem, { ToggleItemProps } from "./ToggleItem";
7
7
  import { ToggleGroupContext } from "./context";
8
8