@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,7 +1,7 @@
1
1
  import cl from "clsx";
2
- import React, { forwardRef, useMemo, useRef } from "react";
2
+ import React, { forwardRef, useRef } from "react";
3
3
  import { BodyShort, ErrorMessage, Label } from "../../typography";
4
- import { mergeRefs } from "../../util";
4
+ import { useMergeRefs } from "../../util/hooks/useMergeRefs";
5
5
  import ClearButton from "./ClearButton";
6
6
  import ComboboxWrapper from "./ComboboxWrapper";
7
7
  import FilteredOptions from "./FilteredOptions/FilteredOptions";
@@ -50,10 +50,7 @@ export const Combobox = forwardRef<
50
50
  size = "medium",
51
51
  } = useInputContext();
52
52
 
53
- const mergedInputRef = useMemo(
54
- () => mergeRefs([inputRef, ref]),
55
- [inputRef, ref],
56
- );
53
+ const mergedInputRef = useMergeRefs(inputRef, ref);
57
54
 
58
55
  return (
59
56
  <ComboboxWrapper
@@ -7,8 +7,7 @@ import React, {
7
7
  useMemo,
8
8
  useState,
9
9
  } from "react";
10
- import { useClientLayoutEffect } from "../../../util";
11
- import usePrevious from "../../../util/usePrevious";
10
+ import { useClientLayoutEffect, usePrevious } from "../../../util/hooks";
12
11
  import { useInputContext } from "../Input/inputContext";
13
12
  import { useCustomOptionsContext } from "../customOptionsContext";
14
13
  import { ComboboxProps } from "../types";
@@ -8,7 +8,7 @@ import React, {
8
8
  useRef,
9
9
  useState,
10
10
  } from "react";
11
- import { useClientLayoutEffect } from "../../../util";
11
+ import { useClientLayoutEffect } from "../../../util/hooks";
12
12
  import { FormFieldType, useFormField } from "../../useFormField";
13
13
 
14
14
  interface InputContextType extends FormFieldType {
@@ -5,7 +5,7 @@ import React, {
5
5
  useMemo,
6
6
  useState,
7
7
  } from "react";
8
- import usePrevious from "../../../util/usePrevious";
8
+ import { usePrevious } from "../../../util/hooks";
9
9
  import { useInputContext } from "../Input/inputContext";
10
10
  import { useCustomOptionsContext } from "../customOptionsContext";
11
11
  import { ComboboxProps } from "../types";
@@ -1,6 +1,5 @@
1
- import { expect, jest } from "@storybook/jest";
2
1
  import { Meta, StoryFn, StoryObj } from "@storybook/react";
3
- import { userEvent, within } from "@storybook/testing-library";
2
+ import { expect, fn, userEvent, within } from "@storybook/test";
4
3
  import React, { useId, useMemo, useState } from "react";
5
4
  import { Chips, ComboboxProps, TextField, UNSAFE_Combobox } from "../../index";
6
5
 
@@ -427,14 +426,14 @@ export const AddWhenAddNewDisabledTest: StoryObject = {
427
426
  };
428
427
 
429
428
  export const TestThatCallbacksOnlyFireWhenExpected: StoryObj<{
430
- onChange: ReturnType<typeof jest.fn>;
431
- onClear: ReturnType<typeof jest.fn>;
432
- onToggleSelected: ReturnType<typeof jest.fn>;
429
+ onChange: ReturnType<typeof fn>;
430
+ onClear: ReturnType<typeof fn>;
431
+ onToggleSelected: ReturnType<typeof fn>;
433
432
  }> = {
434
433
  args: {
435
- onChange: jest.fn(),
436
- onClear: jest.fn(),
437
- onToggleSelected: jest.fn(),
434
+ onChange: fn(),
435
+ onClear: fn(),
436
+ onToggleSelected: fn(),
438
437
  },
439
438
  render: (props) => {
440
439
  return (
@@ -469,9 +468,9 @@ export const TestThatCallbacksOnlyFireWhenExpected: StoryObj<{
469
468
 
470
469
  export const TestCasingWhenAutoCompleting = {
471
470
  args: {
472
- onChange: jest.fn(),
473
- onClear: jest.fn(),
474
- onToggleSelected: jest.fn(),
471
+ onChange: fn(),
472
+ onClear: fn(),
473
+ onToggleSelected: fn(),
475
474
  },
476
475
  render: (props) => {
477
476
  return (
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef, isValidElement } from "react";
3
3
  import { BodyShort, Heading } from "../../typography";
4
- import { useId } from "../../util";
4
+ import { useId } from "../../util/hooks";
5
5
  import ErrorSummaryItem, { ErrorSummaryItemType } from "./ErrorSummaryItem";
6
6
 
7
7
  export interface ErrorSummaryProps extends HTMLAttributes<HTMLDivElement> {
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
- import { OverridableComponent } from "../../util";
3
+ import { OverridableComponent } from "../../util/types";
4
4
 
5
5
  export interface ErrorSummaryItemProps
6
6
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -1,7 +1,8 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { BodyShort } from "../../typography";
4
- import { omit, useId } from "../../util";
4
+ import { omit } from "../../util";
5
+ import { useId } from "../../util/hooks";
5
6
  import { RadioProps } from "./types";
6
7
  import { useRadio } from "./useRadio";
7
8
 
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useContext } from "react";
3
- import { useId } from "../../util";
3
+ import { useId } from "../../util/hooks";
4
4
  import { Fieldset, FieldsetContext, FieldsetProps } from "../Fieldset";
5
5
 
6
6
  export interface RadioGroupContextProps {
@@ -3,13 +3,13 @@ import React, {
3
3
  InputHTMLAttributes,
4
4
  forwardRef,
5
5
  useCallback,
6
- useMemo,
7
6
  useRef,
8
7
  useState,
9
8
  } from "react";
10
9
  import { MagnifyingGlassIcon, XMarkIcon } from "@navikt/aksel-icons";
11
10
  import { BodyShort, ErrorMessage, Label } from "../../typography";
12
- import { mergeRefs, omit } from "../../util";
11
+ import { omit } from "../../util";
12
+ import { useMergeRefs } from "../../util/hooks/useMergeRefs";
13
13
  import { FormFieldProps, useFormField } from "../useFormField";
14
14
  import SearchButton, { SearchButtonType } from "./SearchButton";
15
15
  import { SearchContext } from "./context";
@@ -118,7 +118,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
118
118
  } = props;
119
119
 
120
120
  const searchRef = useRef<HTMLInputElement | null>(null);
121
- const mergedRef = useMemo(() => mergeRefs([searchRef, ref]), [ref]);
121
+ const mergedRef = useMergeRefs(searchRef, ref);
122
122
 
123
123
  const [internalValue, setInternalValue] = useState(defaultValue ?? "");
124
124
 
@@ -2,6 +2,7 @@ import cl from "clsx";
2
2
  import React, { forwardRef, useContext } from "react";
3
3
  import { MagnifyingGlassIcon } from "@navikt/aksel-icons";
4
4
  import { Button, ButtonProps } from "../../button";
5
+ import { composeEventHandlers } from "../../util/composeEventHandlers";
5
6
  import { SearchContext } from "./context";
6
7
 
7
8
  export interface SearchButtonProps
@@ -36,10 +37,7 @@ const SearchButton: SearchButtonType = forwardRef(
36
37
  variant={variant === "secondary" ? "secondary" : "primary"}
37
38
  className={cl("navds-search__button-search", className)}
38
39
  disabled={context?.disabled ?? disabled}
39
- onClick={(e) => {
40
- handleClick();
41
- onClick?.(e);
42
- }}
40
+ onClick={composeEventHandlers(onClick, handleClick)}
43
41
  icon={
44
42
  <MagnifyingGlassIcon
45
43
  {...(children ? { "aria-hidden": true } : { title: "Søk" })}
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { useContext } from "react";
3
- import { useId } from "../util";
3
+ import { useId } from "../util/hooks";
4
4
  import { FieldsetContext } from "./Fieldset/context";
5
5
 
6
6
  export interface FormFieldProps {
@@ -1,5 +1,5 @@
1
1
  import React, { SVGProps } from "react";
2
- import { useId } from "../util";
2
+ import { useId } from "../util/hooks";
3
3
 
4
4
  interface SVGRProps {
5
5
  title?: string;
@@ -1,7 +1,8 @@
1
1
  import cl from "clsx";
2
- import React, { forwardRef, useMemo, useRef, useState } from "react";
2
+ import React, { forwardRef, useRef, useState } from "react";
3
3
  import { Popover, PopoverProps } from "../popover";
4
- import { mergeRefs } from "../util";
4
+ import { composeEventHandlers } from "../util/composeEventHandlers";
5
+ import { useMergeRefs } from "../util/hooks/useMergeRefs";
5
6
  import { HelpTextIcon } from "./HelpTextIcon";
6
7
 
7
8
  export interface HelpTextProps
@@ -13,23 +14,6 @@ export interface HelpTextProps
13
14
  * @default "hjelp"
14
15
  */
15
16
  title?: string;
16
- /**
17
- * Default dialog-placement on open
18
- * @default "top"
19
- */
20
- placement?:
21
- | "top"
22
- | "bottom"
23
- | "right"
24
- | "left"
25
- | "top-start"
26
- | "top-end"
27
- | "bottom-start"
28
- | "bottom-end"
29
- | "right-start"
30
- | "right-end"
31
- | "left-start"
32
- | "left-end";
33
17
  /**
34
18
  * Classname for wrapper
35
19
  */
@@ -54,7 +38,7 @@ export const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
54
38
  {
55
39
  className,
56
40
  children,
57
- placement = "top",
41
+ placement,
58
42
  strategy = "absolute",
59
43
  title = "hjelp",
60
44
  onClick,
@@ -64,7 +48,8 @@ export const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
64
48
  ref,
65
49
  ) => {
66
50
  const buttonRef = useRef<HTMLButtonElement | null>(null);
67
- const mergedRef = useMemo(() => mergeRefs([buttonRef, ref]), [ref]);
51
+ const mergedRef = useMergeRefs(buttonRef, ref);
52
+
68
53
  const [open, setOpen] = useState(false);
69
54
 
70
55
  return (
@@ -72,10 +57,7 @@ export const HelpText = forwardRef<HTMLButtonElement, HelpTextProps>(
72
57
  <button
73
58
  {...rest}
74
59
  ref={mergedRef}
75
- onClick={(e) => {
76
- setOpen((x) => !x);
77
- onClick?.(e);
78
- }}
60
+ onClick={composeEventHandlers(onClick, () => setOpen((x) => x))}
79
61
  className={cl(className, "navds-help-text__button")}
80
62
  type="button"
81
63
  aria-expanded={open}
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React from "react";
3
- import { useId } from "../util/useId";
3
+ import { useId } from "../util/hooks";
4
4
 
5
5
  export const HelpTextIcon = ({
6
6
  title,
@@ -1,63 +1,57 @@
1
+ import { Meta, StoryFn, StoryObj } from "@storybook/react";
1
2
  import React, { useEffect, useRef } from "react";
2
3
  import { BodyLong, Heading, HelpText } from "..";
3
4
 
4
- export default {
5
+ const meta: Meta<typeof HelpText> = {
5
6
  title: "ds-react/HelpText",
6
7
  component: HelpText,
7
8
  parameters: {
8
9
  chromatic: { delay: 300 },
9
10
  },
11
+ };
12
+ export default meta;
13
+
14
+ export const Default: StoryObj<typeof HelpText> = {
15
+ render: (props) => (
16
+ <HelpText {...props}>Id ullamco excepteur elit fugiat labore.</HelpText>
17
+ ),
18
+
19
+ args: {
20
+ title: "Show tooltip",
21
+ },
10
22
  argTypes: {
11
23
  placement: {
12
- control: {
13
- type: "radio",
14
- options: [
15
- "top",
16
- "bottom",
17
- "right",
18
- "left",
19
- "top-start",
20
- "top-end",
21
- "bottom-start",
22
- "bottom-end",
23
- "right-start",
24
- "right-end",
25
- "left-start",
26
- "left-end",
27
- ],
28
- },
24
+ control: { type: "radio" },
25
+ options: [
26
+ "top",
27
+ "bottom",
28
+ "right",
29
+ "left",
30
+ "top-start",
31
+ "top-end",
32
+ "bottom-start",
33
+ "bottom-end",
34
+ "right-start",
35
+ "right-end",
36
+ "left-start",
37
+ "left-end",
38
+ ],
29
39
  },
30
40
  strategy: {
31
- control: {
32
- type: "radio",
33
- options: ["fixed", "absolute"],
34
- },
41
+ control: { type: "radio" },
42
+ options: ["fixed", "absolute"],
35
43
  },
36
44
  },
37
45
  };
38
46
 
39
- export const Default = {
40
- render: (props: any) => {
41
- return (
42
- <HelpText title="show tooltip" strategy="fixed" {...props}>
43
- Id ullamco excepteur elit fugiat labore.
44
- </HelpText>
45
- );
46
- },
47
-
48
- args: {
49
- title: "show tooltip",
50
- },
51
- };
52
-
53
- export const Open = () => {
47
+ export const Open: StoryFn = () => {
54
48
  const ref = useRef<HTMLButtonElement | null>(null);
55
49
  useEffect(() => {
56
50
  ref.current && ref.current.click();
57
51
  }, []);
58
52
 
59
53
  return (
60
- <HelpText ref={ref} title="show tooltip" strategy="fixed">
54
+ <HelpText ref={ref} title="Show tooltip" strategy="fixed">
61
55
  Incididunt laborum eiusmod ullamco id aliquip officia ex irure aliqua
62
56
  laboris id ea do nisi. Ex esse ad duis culpa non aliquip exercitation eu
63
57
  culpa cupidatat nisi. Deserunt voluptate consectetur cillum elit qui ad
@@ -66,35 +60,31 @@ export const Open = () => {
66
60
  );
67
61
  };
68
62
 
69
- export const WrapperClassName = {
70
- render: () => {
71
- return (
72
- <div>
73
- <BodyLong spacing>
74
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
75
- perspiciatis vero voluptatum, asperiores cumque, deserunt accusantium
76
- ullam ipsa accusamus officia cupiditate quae unde esse culpa, ratione
77
- ab quam ea quas?
78
- </BodyLong>
63
+ export const WrapperClassName: StoryFn = () => (
64
+ <div>
65
+ <BodyLong spacing>
66
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
67
+ perspiciatis vero voluptatum, asperiores cumque, deserunt accusantium
68
+ ullam ipsa accusamus officia cupiditate quae unde esse culpa, ratione ab
69
+ quam ea quas?
70
+ </BodyLong>
79
71
 
80
- <Heading level="2" size="medium">
81
- 67 år og 1 måneder øklasdjkl askdak døkasøk daøkdkølasøkld asølkdøka
82
- <HelpText wrapperClassName="testClass">
83
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
84
- perspiciatis vero voluptatum, asperiores cumque, deserunt
85
- accusantium ullam ipsa accusamus officia cupiditate quae unde esse
86
- culpa, ratione ab quam ea quas?
87
- </HelpText>
88
- <style>{`.testClass {display: inline-block; margin-left: 0.5rem; vertical-align: middle;}`}</style>
89
- </Heading>
72
+ <Heading level="2" size="medium">
73
+ 67 år og 1 måneder øklasdjkl askdak døkasøk daøkdkølasøkld asølkdøka
74
+ <HelpText wrapperClassName="testClass">
75
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
76
+ perspiciatis vero voluptatum, asperiores cumque, deserunt accusantium
77
+ ullam ipsa accusamus officia cupiditate quae unde esse culpa, ratione ab
78
+ quam ea quas?
79
+ </HelpText>
80
+ <style>{`.testClass {display: inline-block; margin-left: 0.5rem; vertical-align: middle;}`}</style>
81
+ </Heading>
90
82
 
91
- <BodyLong spacing>
92
- Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
93
- perspiciatis vero voluptatum, asperiores cumque, deserunt accusantium
94
- ullam ipsa accusamus officia cupiditate quae unde esse culpa, ratione
95
- ab quam ea quas?
96
- </BodyLong>
97
- </div>
98
- );
99
- },
100
- };
83
+ <BodyLong spacing>
84
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Soluta
85
+ perspiciatis vero voluptatum, asperiores cumque, deserunt accusantium
86
+ ullam ipsa accusamus officia cupiditate quae unde esse culpa, ratione ab
87
+ quam ea quas?
88
+ </BodyLong>
89
+ </div>
90
+ );
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef } from "react";
3
- import { OverridableComponent } from "../util/OverridableComponent";
3
+ import { OverridableComponent } from "../util/types";
4
4
  import InternalHeaderButton, {
5
5
  InternalHeaderButtonProps,
6
6
  } from "./InternalHeaderButton";
@@ -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 InternalHeaderButtonProps
6
6
  extends React.AnchorHTMLAttributes<HTMLButtonElement> {
@@ -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 InternalHeaderTitleProps
6
6
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -2,7 +2,7 @@ import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { ChevronDownIcon } from "@navikt/aksel-icons";
4
4
  import { BodyShort, Detail } from "../typography";
5
- import { OverridableComponent } from "../util/OverridableComponent";
5
+ import { OverridableComponent } from "../util/types";
6
6
  import InternalHeaderButton from "./InternalHeaderButton";
7
7
 
8
8
  export interface InternalHeaderUserButtonProps
@@ -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
  import { getResponsiveProps } from "../utilities/css";
5
5
  import {
6
6
  BackgroundToken,
@@ -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 const widths = ["text", "md", "lg", "xl", "2xl"] as const;
6
6
 
@@ -1,5 +1,5 @@
1
1
  import React, { forwardRef } from "react";
2
- import { OverridableComponent } from "../../util/OverridableComponent";
2
+ import { OverridableComponent } from "../../util/types";
3
3
  import { Stack, StackProps } from "./Stack";
4
4
 
5
5
  export type HStackProps = Omit<StackProps, "direction">;
@@ -1,6 +1,6 @@
1
1
  import cl from "clsx";
2
2
  import React, { HTMLAttributes, forwardRef } from "react";
3
- import { OverridableComponent } from "../../util/OverridableComponent";
3
+ import { OverridableComponent } from "../../util/types";
4
4
  import { getResponsiveProps, getResponsiveValue } from "../utilities/css";
5
5
  import { ResponsiveProp, SpacingScale } from "../utilities/types";
6
6
 
@@ -1,5 +1,5 @@
1
1
  import React, { forwardRef } from "react";
2
- import { OverridableComponent } from "../../util/OverridableComponent";
2
+ import { OverridableComponent } from "../../util/types";
3
3
  import { Stack, StackProps } from "./Stack";
4
4
 
5
5
  export type VStackProps = Omit<StackProps, "direction" | "wrap">;
package/src/link/Link.tsx CHANGED
@@ -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 LinkProps
6
6
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
@@ -5,8 +5,8 @@ import {
5
5
  Alert as DsAlert,
6
6
  ConfirmationPanel as DsConfirmationPanel,
7
7
  Link,
8
- } from "..";
9
- import { RandomIcon } from "../util/RandomIcon";
8
+ } from "../..";
9
+ import { RandomIcon } from "./RandomIcon";
10
10
 
11
11
  export default {
12
12
  title: "ds-react/Link",
@@ -2,7 +2,7 @@ import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { ChevronRightIcon } from "@navikt/aksel-icons";
4
4
  import { Panel } from "../panel";
5
- import { OverridableComponent } from "../util";
5
+ import { OverridableComponent } from "../util/types";
6
6
  import {
7
7
  LinkPanelDescription,
8
8
  LinkPanelDescriptionProps,
@@ -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 LinkPanelTitleProps
6
6
  extends React.HTMLAttributes<HTMLDivElement> {
package/src/list/List.tsx CHANGED
@@ -1,7 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useContext } from "react";
3
3
  import { BodyShort, Heading } from "../typography";
4
- import { useId } from "../util/useId";
4
+ import { useId } from "../util/hooks";
5
5
  import { ListItem } from "./ListItem";
6
6
  import { ListContext } from "./context";
7
7
  import { ListProps } from "./types";
@@ -1,6 +1,7 @@
1
1
  import cl from "clsx";
2
2
  import React, { SVGProps, forwardRef } from "react";
3
- import { omit, useId } from "../util";
3
+ import { omit } from "../util";
4
+ import { useId } from "../util/hooks";
4
5
 
5
6
  export interface LoaderProps extends Omit<SVGProps<SVGSVGElement>, "ref"> {
6
7
  /**