@navikt/ds-react 5.12.5 → 5.13.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 (518) hide show
  1. package/_docs.json +79 -3
  2. package/cjs/accordion/Accordion.js +2 -2
  3. package/cjs/accordion/AccordionHeader.js +1 -1
  4. package/cjs/accordion/AccordionItem.js +11 -14
  5. package/cjs/alert/Alert.js +2 -2
  6. package/cjs/chat/Bubble.js +1 -1
  7. package/cjs/chat/Chat.js +2 -2
  8. package/cjs/chips/Chips.js +1 -1
  9. package/cjs/chips/Removable.js +1 -1
  10. package/cjs/copybutton/CopyButton.js +2 -2
  11. package/cjs/date/datepicker/parts/Caption.js +2 -2
  12. package/cjs/date/datepicker/parts/DropdownCaption.js +1 -1
  13. package/cjs/date/datepicker/parts/HeadRow.js +1 -1
  14. package/cjs/date/datepicker/parts/Row.js +2 -2
  15. package/cjs/date/monthpicker/MonthCaption.js +1 -1
  16. package/cjs/date/parts/DateInput.js +1 -1
  17. package/cjs/date/utils/check-dates.js +1 -1
  18. package/cjs/date/utils/is-match.js +2 -2
  19. package/cjs/date/utils/parse-date.js +1 -1
  20. package/cjs/dropdown/Dropdown.js +10 -12
  21. package/cjs/dropdown/Menu/Divider.js +1 -1
  22. package/cjs/dropdown/Menu/GroupedList/GroupedHeading.js +1 -1
  23. package/cjs/expansion-card/ExpansionCardHeader.js +1 -1
  24. package/cjs/form/ReadOnlyIcon.js +1 -1
  25. package/cjs/form/Select.js +1 -1
  26. package/cjs/form/combobox/Combobox.js +6 -6
  27. package/cjs/form/combobox/ComboboxProvider.js +2 -2
  28. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  29. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  30. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +1 -1
  31. package/cjs/form/error-summary/ErrorSummary.js +2 -2
  32. package/cjs/form/error-summary/ErrorSummaryItem.js +1 -1
  33. package/cjs/form/search/Search.js +1 -1
  34. package/cjs/form/search/SearchButton.js +1 -1
  35. package/cjs/grid/Cell.js +1 -1
  36. package/cjs/grid/Grid.js +1 -1
  37. package/cjs/guide-panel/GuidePanel.js +1 -1
  38. package/cjs/internal-header/InternalHeaderButton.js +1 -1
  39. package/cjs/internal-header/InternalHeaderTitle.js +1 -1
  40. package/cjs/internal-header/InternalHeaderUser.js +1 -1
  41. package/cjs/internal-header/InternalHeaderUserButton.js +1 -1
  42. package/cjs/layout/bleed/Bleed.js +1 -1
  43. package/cjs/layout/content-container/ContentContainer.js +1 -1
  44. package/cjs/layout/grid/HGrid.js +1 -1
  45. package/cjs/layout/page/parts/PageBlock.js +1 -1
  46. package/cjs/layout/sidemal-test/AvatarPanel.js +1 -1
  47. package/cjs/layout/sidemal-test/Content.js +3 -3
  48. package/cjs/layout/sidemal-test/Filter.js +1 -1
  49. package/cjs/layout/sidemal-test/Intro.js +1 -1
  50. package/cjs/link-panel/LinkPanel.js +3 -3
  51. package/cjs/link-panel/LinkPanelDescription.js +1 -1
  52. package/cjs/link-panel/LinkPanelTitle.js +1 -1
  53. package/cjs/modal/ModalBody.js +1 -1
  54. package/cjs/modal/ModalFooter.js +1 -1
  55. package/cjs/modal/ModalHeader.js +1 -1
  56. package/cjs/pagination/PaginationItem.js +1 -1
  57. package/cjs/panel/Panel.js +1 -1
  58. package/cjs/popover/PopoverContent.js +1 -1
  59. package/cjs/read-more/ReadMore.js +12 -10
  60. package/cjs/skeleton/Skeleton.js +1 -1
  61. package/cjs/table/Body.js +1 -1
  62. package/cjs/table/ColumnHeader.js +1 -1
  63. package/cjs/table/DataCell.js +1 -1
  64. package/cjs/table/ExpandableRow.js +14 -13
  65. package/cjs/table/Header.js +1 -1
  66. package/cjs/table/Row.js +1 -1
  67. package/cjs/tabs/TabList.js +1 -1
  68. package/cjs/tabs/Tabs.js +1 -1
  69. package/cjs/tag/Tag.js +1 -1
  70. package/cjs/timeline/AxisLabels.js +1 -1
  71. package/cjs/timeline/TimelineRow.js +2 -2
  72. package/cjs/timeline/hooks/useTimelineRows.js +5 -3
  73. package/cjs/timeline/utils/timeline.js +1 -1
  74. package/cjs/timeline/zoom/ZoomButton.js +1 -1
  75. package/cjs/toggle-group/ToggleGroup.js +1 -1
  76. package/cjs/tooltip/Tooltip.js +12 -7
  77. package/cjs/typography/BodyLong.js +1 -1
  78. package/cjs/typography/ErrorMessage.js +1 -1
  79. package/cjs/typography/Ingress.js +1 -1
  80. package/cjs/util/RandomIcon.js +1 -1
  81. package/cjs/util/hooks/useCallbackRef.js +18 -0
  82. package/cjs/util/hooks/useControllableState.js +25 -0
  83. package/esm/accordion/Accordion.d.ts +1 -1
  84. package/esm/accordion/Accordion.js +2 -2
  85. package/esm/accordion/Accordion.js.map +1 -1
  86. package/esm/accordion/AccordionHeader.js +1 -1
  87. package/esm/accordion/AccordionHeader.js.map +1 -1
  88. package/esm/accordion/AccordionItem.d.ts +4 -0
  89. package/esm/accordion/AccordionItem.js +12 -15
  90. package/esm/accordion/AccordionItem.js.map +1 -1
  91. package/esm/alert/Alert.js +2 -2
  92. package/esm/alert/Alert.js.map +1 -1
  93. package/esm/chat/Bubble.js +1 -1
  94. package/esm/chat/Bubble.js.map +1 -1
  95. package/esm/chat/Chat.js +2 -2
  96. package/esm/chat/Chat.js.map +1 -1
  97. package/esm/chips/Chips.d.ts +2 -2
  98. package/esm/chips/Chips.js +1 -1
  99. package/esm/chips/Chips.js.map +1 -1
  100. package/esm/chips/Removable.js +1 -1
  101. package/esm/chips/Removable.js.map +1 -1
  102. package/esm/copybutton/CopyButton.js +2 -2
  103. package/esm/copybutton/CopyButton.js.map +1 -1
  104. package/esm/date/context/useSharedMonthContext.js.map +1 -1
  105. package/esm/date/datepicker/parts/Caption.js +2 -2
  106. package/esm/date/datepicker/parts/Caption.js.map +1 -1
  107. package/esm/date/datepicker/parts/DropdownCaption.js +1 -1
  108. package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -1
  109. package/esm/date/datepicker/parts/HeadRow.js +1 -1
  110. package/esm/date/datepicker/parts/HeadRow.js.map +1 -1
  111. package/esm/date/datepicker/parts/Row.js +3 -3
  112. package/esm/date/datepicker/parts/Row.js.map +1 -1
  113. package/esm/date/monthpicker/MonthCaption.js +1 -1
  114. package/esm/date/monthpicker/MonthCaption.js.map +1 -1
  115. package/esm/date/parts/DateInput.js +1 -1
  116. package/esm/date/parts/DateInput.js.map +1 -1
  117. package/esm/date/utils/check-dates.js +1 -1
  118. package/esm/date/utils/check-dates.js.map +1 -1
  119. package/esm/date/utils/get-month-weeks.js.map +1 -1
  120. package/esm/date/utils/is-match.js +2 -2
  121. package/esm/date/utils/is-match.js.map +1 -1
  122. package/esm/date/utils/navigation.js.map +1 -1
  123. package/esm/date/utils/parse-date.js +1 -1
  124. package/esm/date/utils/parse-date.js.map +1 -1
  125. package/esm/dropdown/Dropdown.d.ts +4 -0
  126. package/esm/dropdown/Dropdown.js +10 -12
  127. package/esm/dropdown/Dropdown.js.map +1 -1
  128. package/esm/dropdown/Menu/Divider.js +1 -1
  129. package/esm/dropdown/Menu/Divider.js.map +1 -1
  130. package/esm/dropdown/Menu/GroupedList/GroupedHeading.js +1 -1
  131. package/esm/dropdown/Menu/GroupedList/GroupedHeading.js.map +1 -1
  132. package/esm/expansion-card/ExpansionCardHeader.js +1 -1
  133. package/esm/expansion-card/ExpansionCardHeader.js.map +1 -1
  134. package/esm/form/Fieldset/useFieldset.d.ts +1 -1
  135. package/esm/form/ReadOnlyIcon.js +1 -1
  136. package/esm/form/ReadOnlyIcon.js.map +1 -1
  137. package/esm/form/Select.js +1 -1
  138. package/esm/form/Select.js.map +1 -1
  139. package/esm/form/Switch.js.map +1 -1
  140. package/esm/form/TextField.js.map +1 -1
  141. package/esm/form/checkbox/useCheckbox.d.ts +1 -1
  142. package/esm/form/combobox/Combobox.d.ts +1 -1
  143. package/esm/form/combobox/Combobox.js +6 -6
  144. package/esm/form/combobox/Combobox.js.map +1 -1
  145. package/esm/form/combobox/ComboboxProvider.js +2 -2
  146. package/esm/form/combobox/ComboboxProvider.js.map +1 -1
  147. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  148. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  149. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +1 -1
  150. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  151. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  152. package/esm/form/combobox/SelectedOptions/SelectedOptions.js +1 -1
  153. package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  154. package/esm/form/combobox/ToggleListButton.js +1 -1
  155. package/esm/form/combobox/ToggleListButton.js.map +1 -1
  156. package/esm/form/combobox/customOptionsContext.js +1 -1
  157. package/esm/form/combobox/customOptionsContext.js.map +1 -1
  158. package/esm/form/error-summary/ErrorSummary.js +3 -3
  159. package/esm/form/error-summary/ErrorSummary.js.map +1 -1
  160. package/esm/form/error-summary/ErrorSummaryItem.js +1 -1
  161. package/esm/form/error-summary/ErrorSummaryItem.js.map +1 -1
  162. package/esm/form/radio/useRadio.d.ts +1 -1
  163. package/esm/form/search/Search.js +1 -1
  164. package/esm/form/search/Search.js.map +1 -1
  165. package/esm/form/search/SearchButton.js +1 -1
  166. package/esm/form/search/SearchButton.js.map +1 -1
  167. package/esm/grid/Cell.js +1 -1
  168. package/esm/grid/Cell.js.map +1 -1
  169. package/esm/grid/Grid.js +1 -1
  170. package/esm/grid/Grid.js.map +1 -1
  171. package/esm/guide-panel/GuidePanel.js +1 -1
  172. package/esm/guide-panel/GuidePanel.js.map +1 -1
  173. package/esm/internal-header/InternalHeader.js.map +1 -1
  174. package/esm/internal-header/InternalHeaderButton.js +1 -1
  175. package/esm/internal-header/InternalHeaderButton.js.map +1 -1
  176. package/esm/internal-header/InternalHeaderTitle.js +1 -1
  177. package/esm/internal-header/InternalHeaderTitle.js.map +1 -1
  178. package/esm/internal-header/InternalHeaderUser.js +1 -1
  179. package/esm/internal-header/InternalHeaderUser.js.map +1 -1
  180. package/esm/internal-header/InternalHeaderUserButton.js +1 -1
  181. package/esm/internal-header/InternalHeaderUserButton.js.map +1 -1
  182. package/esm/layout/bleed/Bleed.js +1 -1
  183. package/esm/layout/bleed/Bleed.js.map +1 -1
  184. package/esm/layout/box/Box.d.ts +1 -1
  185. package/esm/layout/content-container/ContentContainer.js +1 -1
  186. package/esm/layout/content-container/ContentContainer.js.map +1 -1
  187. package/esm/layout/grid/HGrid.js +1 -1
  188. package/esm/layout/grid/HGrid.js.map +1 -1
  189. package/esm/layout/page/Page.d.ts +2 -2
  190. package/esm/layout/page/Page.js.map +1 -1
  191. package/esm/layout/page/parts/PageBlock.d.ts +6 -5
  192. package/esm/layout/page/parts/PageBlock.js +1 -1
  193. package/esm/layout/page/parts/PageBlock.js.map +1 -1
  194. package/esm/layout/responsive/Responsive.js.map +1 -1
  195. package/esm/layout/sidemal-test/AvatarPanel.js +1 -1
  196. package/esm/layout/sidemal-test/AvatarPanel.js.map +1 -1
  197. package/esm/layout/sidemal-test/Content.js +4 -4
  198. package/esm/layout/sidemal-test/Content.js.map +1 -1
  199. package/esm/layout/sidemal-test/Filter.js +1 -1
  200. package/esm/layout/sidemal-test/Filter.js.map +1 -1
  201. package/esm/layout/sidemal-test/Header.js +1 -1
  202. package/esm/layout/sidemal-test/Header.js.map +1 -1
  203. package/esm/layout/sidemal-test/Intro.js +2 -2
  204. package/esm/layout/sidemal-test/Intro.js.map +1 -1
  205. package/esm/layout/sidemal-test/content-box/ContentBox.js.map +1 -1
  206. package/esm/layout/stack/HStack.js.map +1 -1
  207. package/esm/layout/stack/Stack.js.map +1 -1
  208. package/esm/layout/stack/VStack.js.map +1 -1
  209. package/esm/layout/utilities/types.d.ts +2 -2
  210. package/esm/link-panel/LinkPanel.d.ts +2 -2
  211. package/esm/link-panel/LinkPanel.js +3 -3
  212. package/esm/link-panel/LinkPanel.js.map +1 -1
  213. package/esm/link-panel/LinkPanelDescription.js +1 -1
  214. package/esm/link-panel/LinkPanelDescription.js.map +1 -1
  215. package/esm/link-panel/LinkPanelTitle.js +1 -1
  216. package/esm/link-panel/LinkPanelTitle.js.map +1 -1
  217. package/esm/loader/Loader.js.map +1 -1
  218. package/esm/modal/ModalBody.js +1 -1
  219. package/esm/modal/ModalBody.js.map +1 -1
  220. package/esm/modal/ModalFooter.js +1 -1
  221. package/esm/modal/ModalFooter.js.map +1 -1
  222. package/esm/modal/ModalHeader.js +1 -1
  223. package/esm/modal/ModalHeader.js.map +1 -1
  224. package/esm/pagination/Pagination.js.map +1 -1
  225. package/esm/pagination/PaginationItem.js +1 -1
  226. package/esm/pagination/PaginationItem.js.map +1 -1
  227. package/esm/panel/Panel.js +1 -1
  228. package/esm/panel/Panel.js.map +1 -1
  229. package/esm/popover/Popover.js.map +1 -1
  230. package/esm/popover/PopoverContent.js +1 -1
  231. package/esm/popover/PopoverContent.js.map +1 -1
  232. package/esm/read-more/ReadMore.d.ts +4 -0
  233. package/esm/read-more/ReadMore.js +13 -11
  234. package/esm/read-more/ReadMore.js.map +1 -1
  235. package/esm/skeleton/Skeleton.js +1 -1
  236. package/esm/skeleton/Skeleton.js.map +1 -1
  237. package/esm/table/Body.js +1 -1
  238. package/esm/table/Body.js.map +1 -1
  239. package/esm/table/ColumnHeader.js +1 -1
  240. package/esm/table/ColumnHeader.js.map +1 -1
  241. package/esm/table/DataCell.js +1 -1
  242. package/esm/table/DataCell.js.map +1 -1
  243. package/esm/table/ExpandableRow.js +15 -14
  244. package/esm/table/ExpandableRow.js.map +1 -1
  245. package/esm/table/Header.js +1 -1
  246. package/esm/table/Header.js.map +1 -1
  247. package/esm/table/Row.js +1 -1
  248. package/esm/table/Row.js.map +1 -1
  249. package/esm/tabs/TabList.js +1 -1
  250. package/esm/tabs/TabList.js.map +1 -1
  251. package/esm/tabs/Tabs.js +1 -1
  252. package/esm/tabs/Tabs.js.map +1 -1
  253. package/esm/tag/Tag.js +1 -1
  254. package/esm/tag/Tag.js.map +1 -1
  255. package/esm/timeline/AxisLabels.js +1 -1
  256. package/esm/timeline/AxisLabels.js.map +1 -1
  257. package/esm/timeline/TimelineRow.js +2 -2
  258. package/esm/timeline/TimelineRow.js.map +1 -1
  259. package/esm/timeline/hooks/useTimelineRows.js +5 -3
  260. package/esm/timeline/hooks/useTimelineRows.js.map +1 -1
  261. package/esm/timeline/utils/timeline.js +1 -1
  262. package/esm/timeline/utils/timeline.js.map +1 -1
  263. package/esm/timeline/zoom/ZoomButton.js +1 -1
  264. package/esm/timeline/zoom/ZoomButton.js.map +1 -1
  265. package/esm/toggle-group/ToggleGroup.js +1 -1
  266. package/esm/toggle-group/ToggleGroup.js.map +1 -1
  267. package/esm/tooltip/Tooltip.d.ts +4 -0
  268. package/esm/tooltip/Tooltip.js +13 -8
  269. package/esm/tooltip/Tooltip.js.map +1 -1
  270. package/esm/typography/BodyLong.js +1 -1
  271. package/esm/typography/BodyLong.js.map +1 -1
  272. package/esm/typography/ErrorMessage.js +1 -1
  273. package/esm/typography/ErrorMessage.js.map +1 -1
  274. package/esm/typography/Ingress.js +1 -1
  275. package/esm/typography/Ingress.js.map +1 -1
  276. package/esm/util/RandomIcon.js +1 -1
  277. package/esm/util/RandomIcon.js.map +1 -1
  278. package/esm/util/hooks/useCallbackRef.d.ts +7 -0
  279. package/esm/util/hooks/useCallbackRef.js +15 -0
  280. package/esm/util/hooks/useCallbackRef.js.map +1 -0
  281. package/esm/util/hooks/useControllableState.d.ts +9 -0
  282. package/esm/util/hooks/useControllableState.js +22 -0
  283. package/esm/util/hooks/useControllableState.js.map +1 -0
  284. package/esm/util/mergeRefs.js.map +1 -1
  285. package/package.json +3 -3
  286. package/src/accordion/Accordion.tsx +5 -5
  287. package/src/accordion/AccordionContent.tsx +3 -3
  288. package/src/accordion/AccordionHeader.tsx +3 -3
  289. package/src/accordion/AccordionItem.tsx +21 -21
  290. package/src/accordion/accordion.stories.tsx +8 -5
  291. package/src/alert/Alert.tsx +8 -8
  292. package/src/alert/alert.stories.tsx +7 -7
  293. package/src/button/Button.tsx +4 -4
  294. package/src/button/button.stories.tsx +1 -1
  295. package/src/chat/Bubble.tsx +4 -4
  296. package/src/chat/Chat.tsx +5 -5
  297. package/src/chat/chat.stories.tsx +1 -1
  298. package/src/chips/Chips.tsx +4 -4
  299. package/src/chips/Removable.tsx +4 -4
  300. package/src/chips/Toggle.tsx +3 -3
  301. package/src/chips/chips.stories.tsx +5 -5
  302. package/src/copybutton/CopyButton.tsx +6 -6
  303. package/src/copybutton/copy-button.stories.tsx +3 -3
  304. package/src/date/context/useSharedMonthContext.tsx +1 -1
  305. package/src/date/datepicker/DatePicker.tsx +2 -2
  306. package/src/date/datepicker/DatePickerStandalone.tsx +2 -2
  307. package/src/date/datepicker/datepicker.stories.tsx +2 -2
  308. package/src/date/datepicker/parts/Caption.tsx +2 -3
  309. package/src/date/datepicker/parts/DropdownCaption.tsx +2 -2
  310. package/src/date/datepicker/parts/HeadRow.tsx +1 -1
  311. package/src/date/datepicker/parts/Row.tsx +3 -3
  312. package/src/date/hooks/useDatepicker.tsx +7 -7
  313. package/src/date/hooks/useMonthPicker.tsx +7 -7
  314. package/src/date/hooks/useRangeDatepicker.test.tsx +2 -2
  315. package/src/date/hooks/useRangeDatepicker.tsx +28 -28
  316. package/src/date/monthpicker/MonthButton.tsx +1 -1
  317. package/src/date/monthpicker/MonthCaption.tsx +1 -1
  318. package/src/date/monthpicker/MonthPicker.tsx +3 -3
  319. package/src/date/monthpicker/MonthPickerStandalone.tsx +3 -3
  320. package/src/date/monthpicker/MonthSelector.tsx +1 -1
  321. package/src/date/parts/DateInput.tsx +6 -6
  322. package/src/date/utils/__tests__/check-dates.test.ts +3 -3
  323. package/src/date/utils/__tests__/format-dates.test.ts +7 -7
  324. package/src/date/utils/__tests__/get-initial-year.test.ts +14 -14
  325. package/src/date/utils/__tests__/get-month-weeks.test.ts +0 -1
  326. package/src/date/utils/__tests__/is-match.test.ts +4 -4
  327. package/src/date/utils/__tests__/parse-dates.test.ts +2 -2
  328. package/src/date/utils/check-dates.ts +2 -2
  329. package/src/date/utils/dates-disabled.ts +1 -1
  330. package/src/date/utils/format-date.ts +1 -1
  331. package/src/date/utils/get-dates.ts +1 -1
  332. package/src/date/utils/get-month-weeks.ts +6 -6
  333. package/src/date/utils/is-match.ts +2 -3
  334. package/src/date/utils/labels.ts +1 -1
  335. package/src/date/utils/navigation.ts +18 -18
  336. package/src/date/utils/parse-date.ts +8 -8
  337. package/src/dropdown/Dropdown.tsx +14 -11
  338. package/src/dropdown/Menu/Divider.tsx +1 -1
  339. package/src/dropdown/Menu/GroupedList/GroupedHeading.tsx +2 -2
  340. package/src/dropdown/Menu/GroupedList/GroupedItem.tsx +1 -1
  341. package/src/dropdown/Menu/GroupedList/index.tsx +1 -1
  342. package/src/dropdown/Menu/List/Item.tsx +1 -1
  343. package/src/dropdown/Menu/index.tsx +1 -1
  344. package/src/dropdown/dropdown.stories.tsx +1 -1
  345. package/src/expansion-card/ExpansionCard.tsx +3 -3
  346. package/src/expansion-card/ExpansionCardContent.tsx +1 -1
  347. package/src/expansion-card/ExpansionCardDescription.tsx +1 -1
  348. package/src/expansion-card/ExpansionCardHeader.tsx +2 -2
  349. package/src/expansion-card/ExpansionCardTitle.tsx +2 -2
  350. package/src/expansion-card/expansion-card.stories.tsx +1 -1
  351. package/src/form/ConfirmationPanel.test.tsx +1 -1
  352. package/src/form/ConfirmationPanel.tsx +2 -2
  353. package/src/form/Fieldset/Fieldset.tsx +2 -2
  354. package/src/form/ReadOnlyIcon.tsx +1 -1
  355. package/src/form/Select.tsx +6 -6
  356. package/src/form/Switch.tsx +4 -4
  357. package/src/form/TextField.tsx +4 -4
  358. package/src/form/Textarea.tsx +4 -4
  359. package/src/form/checkbox/Checkbox.test.tsx +8 -8
  360. package/src/form/checkbox/Checkbox.tsx +3 -3
  361. package/src/form/checkbox/CheckboxGroup.tsx +4 -4
  362. package/src/form/checkbox/useCheckbox.ts +3 -3
  363. package/src/form/combobox/Combobox.tsx +8 -8
  364. package/src/form/combobox/ComboboxProvider.tsx +3 -3
  365. package/src/form/combobox/ComboboxWrapper.tsx +1 -1
  366. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +6 -6
  367. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +18 -18
  368. package/src/form/combobox/FilteredOptions/useVirtualFocus.ts +5 -5
  369. package/src/form/combobox/Input/Input.tsx +6 -6
  370. package/src/form/combobox/Input/inputContext.tsx +6 -6
  371. package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +1 -1
  372. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +9 -9
  373. package/src/form/combobox/ToggleListButton.tsx +1 -2
  374. package/src/form/combobox/combobox.stories.tsx +8 -8
  375. package/src/form/combobox/combobox.test.tsx +14 -12
  376. package/src/form/combobox/customOptionsContext.tsx +6 -6
  377. package/src/form/combobox/types.ts +2 -2
  378. package/src/form/error-summary/ErrorSummary.tsx +6 -6
  379. package/src/form/error-summary/ErrorSummaryItem.tsx +2 -2
  380. package/src/form/error-summary/error-summary.stories.tsx +2 -1
  381. package/src/form/radio/Radio.test.tsx +1 -1
  382. package/src/form/radio/Radio.tsx +1 -1
  383. package/src/form/radio/RadioGroup.tsx +3 -3
  384. package/src/form/radio/useRadio.ts +1 -1
  385. package/src/form/search/Search.tsx +6 -6
  386. package/src/form/search/SearchButton.tsx +2 -2
  387. package/src/form/search/search.stories.tsx +1 -1
  388. package/src/form/stories/fieldset.stories.tsx +3 -2
  389. package/src/form/stories/select.stories.tsx +2 -1
  390. package/src/form/stories/text-field.stories.tsx +2 -1
  391. package/src/form/useFormField.ts +3 -3
  392. package/src/grid/Cell.tsx +3 -3
  393. package/src/grid/Grid.tsx +2 -2
  394. package/src/grid/grid.stories.tsx +1 -1
  395. package/src/guide-panel/GuidePanel.tsx +2 -2
  396. package/src/guide-panel/guidepanel.stories.tsx +1 -1
  397. package/src/help-text/HelpText.tsx +2 -2
  398. package/src/internal-header/InternalHeader.tsx +1 -1
  399. package/src/internal-header/InternalHeaderButton.tsx +1 -1
  400. package/src/internal-header/InternalHeaderTitle.tsx +1 -1
  401. package/src/internal-header/InternalHeaderUser.tsx +1 -1
  402. package/src/internal-header/InternalHeaderUserButton.tsx +1 -1
  403. package/src/internal-header/header.stories.tsx +3 -3
  404. package/src/layout/bleed/Bleed.tsx +7 -7
  405. package/src/layout/box/Box.stories.tsx +4 -4
  406. package/src/layout/box/Box.tsx +7 -7
  407. package/src/layout/content-container/ContentContainer.tsx +1 -1
  408. package/src/layout/grid/HGrid.tsx +4 -4
  409. package/src/layout/page/Page.stories.tsx +1 -1
  410. package/src/layout/page/Page.tsx +4 -4
  411. package/src/layout/page/parts/PageBlock.tsx +8 -7
  412. package/src/layout/responsive/Responsive.tsx +6 -6
  413. package/src/layout/responsive/hide.stories.tsx +1 -1
  414. package/src/layout/responsive/show.stories.tsx +1 -1
  415. package/src/layout/sidemal-test/AvatarPanel.tsx +1 -1
  416. package/src/layout/sidemal-test/Content.tsx +4 -4
  417. package/src/layout/sidemal-test/Filter.tsx +1 -1
  418. package/src/layout/sidemal-test/Header.tsx +1 -1
  419. package/src/layout/sidemal-test/Intro.tsx +2 -2
  420. package/src/layout/sidemal-test/content-box/ContentBox.tsx +6 -6
  421. package/src/layout/sidemal-test/navno-sidemal.stories.tsx +1 -1
  422. package/src/layout/stack/HStack.tsx +1 -1
  423. package/src/layout/stack/Stack.tsx +3 -3
  424. package/src/layout/stack/VStack.tsx +1 -1
  425. package/src/layout/stack/stack.stories.tsx +2 -2
  426. package/src/layout/utilities/css.ts +6 -6
  427. package/src/layout/utilities/types.ts +2 -2
  428. package/src/link/Link.tsx +2 -2
  429. package/src/link/link.stories.tsx +1 -1
  430. package/src/link-panel/LinkPanel.tsx +6 -7
  431. package/src/link-panel/LinkPanelDescription.tsx +1 -1
  432. package/src/link-panel/LinkPanelTitle.tsx +2 -2
  433. package/src/list/List.tsx +2 -2
  434. package/src/list/ListItem.tsx +2 -2
  435. package/src/list/list.stories.tsx +2 -2
  436. package/src/loader/Loader.tsx +4 -4
  437. package/src/loader/loader.stories.tsx +1 -0
  438. package/src/modal/Modal.test.tsx +4 -4
  439. package/src/modal/Modal.tsx +2 -2
  440. package/src/modal/ModalBody.tsx +2 -2
  441. package/src/modal/ModalFooter.tsx +2 -2
  442. package/src/modal/ModalHeader.tsx +2 -2
  443. package/src/modal/ModalUtils.ts +2 -2
  444. package/src/modal/dialog-polyfill.ts +16 -16
  445. package/src/pagination/Pagination.tsx +5 -6
  446. package/src/pagination/PaginationItem.tsx +3 -3
  447. package/src/pagination/steps.test.ts +8 -8
  448. package/src/panel/Panel.tsx +3 -3
  449. package/src/panel/panel.stories.tsx +2 -1
  450. package/src/popover/Popover.test.tsx +7 -7
  451. package/src/popover/Popover.tsx +8 -8
  452. package/src/popover/PopoverContent.tsx +2 -2
  453. package/src/provider/Provider.tsx +1 -1
  454. package/src/read-more/ReadMore.tsx +19 -13
  455. package/src/read-more/readmore.stories.tsx +4 -0
  456. package/src/skeleton/Skeleton.tsx +4 -4
  457. package/src/stepper/Step.tsx +2 -2
  458. package/src/stepper/Stepper.tsx +3 -3
  459. package/src/table/Body.tsx +1 -1
  460. package/src/table/ColumnHeader.tsx +2 -2
  461. package/src/table/DataCell.tsx +2 -2
  462. package/src/table/ExpandableRow.tsx +19 -17
  463. package/src/table/Header.tsx +1 -1
  464. package/src/table/HeaderCell.tsx +1 -1
  465. package/src/table/Row.tsx +2 -2
  466. package/src/table/Table.tsx +2 -2
  467. package/src/table/stories/table-async.stories.tsx +4 -4
  468. package/src/table/stories/table.stories.tsx +1 -1
  469. package/src/tabs/Tab.tsx +3 -3
  470. package/src/tabs/TabList.tsx +4 -4
  471. package/src/tabs/TabPanel.tsx +1 -1
  472. package/src/tabs/Tabs.stories.tsx +1 -1
  473. package/src/tabs/Tabs.tsx +4 -4
  474. package/src/tag/Tag.tsx +3 -3
  475. package/src/tag/tag.stories.tsx +1 -1
  476. package/src/timeline/AxisLabels.tsx +9 -9
  477. package/src/timeline/Pin.tsx +2 -2
  478. package/src/timeline/Timeline.tsx +7 -7
  479. package/src/timeline/TimelineRow.tsx +5 -5
  480. package/src/timeline/hooks/useTimelineContext.tsx +1 -1
  481. package/src/timeline/hooks/useTimelineRows.ts +18 -19
  482. package/src/timeline/period/ClickablePeriod.tsx +4 -4
  483. package/src/timeline/period/NonClickablePeriod.tsx +1 -1
  484. package/src/timeline/period/index.tsx +1 -1
  485. package/src/timeline/timeline.stories.tsx +2 -2
  486. package/src/timeline/utils/calc.ts +2 -2
  487. package/src/timeline/utils/filter.ts +2 -2
  488. package/src/timeline/utils/period.ts +2 -2
  489. package/src/timeline/utils/timeline.ts +1 -1
  490. package/src/timeline/zoom/ZoomButton.tsx +3 -3
  491. package/src/timeline/zoom/index.tsx +1 -1
  492. package/src/toggle-group/ToggleGroup.stories.tsx +2 -2
  493. package/src/toggle-group/ToggleGroup.tsx +5 -5
  494. package/src/toggle-group/ToggleItem.tsx +1 -1
  495. package/src/toggle-group/context.ts +1 -1
  496. package/src/tooltip/Tooltip.test.tsx +10 -10
  497. package/src/tooltip/Tooltip.tsx +20 -11
  498. package/src/tooltip/tooltip.stories.tsx +1 -1
  499. package/src/typography/BodyLong.tsx +4 -4
  500. package/src/typography/BodyShort.tsx +3 -3
  501. package/src/typography/Detail.tsx +3 -3
  502. package/src/typography/ErrorMessage.tsx +3 -3
  503. package/src/typography/Heading.tsx +3 -3
  504. package/src/typography/Ingress.tsx +1 -1
  505. package/src/typography/Label.tsx +3 -3
  506. package/src/typography/stories/heading.stories.tsx +1 -2
  507. package/src/util/AnimateHeight.tsx +1 -1
  508. package/src/util/OverridableComponent.ts +1 -1
  509. package/src/util/RandomIcon.tsx +1 -1
  510. package/src/util/Slot.tsx +3 -3
  511. package/src/util/TextareaAutoSize.tsx +4 -4
  512. package/src/util/__tests__/Slot.test.tsx +11 -11
  513. package/src/util/hooks/useCallbackRef.ts +20 -0
  514. package/src/util/hooks/useControllableState.ts +40 -0
  515. package/src/util/mergeRefs.tsx +2 -1
  516. package/src/util/omit.ts +1 -1
  517. package/src/util/useEventListener.ts +1 -1
  518. package/src/util/useMedia.ts +1 -1
@@ -1,7 +1,7 @@
1
- import { useMemo } from "react";
2
-
3
1
  import { addDays, endOfDay, isAfter, startOfDay, subDays } from "date-fns";
4
-
2
+ import { useMemo } from "react";
3
+ import { horizontalPositionAndWidth } from "../utils/calc";
4
+ import { invisiblePeriods, withinADay } from "../utils/filter";
5
5
  import { lastPeriod } from "../utils/sort";
6
6
  import { Period } from "../utils/types.external";
7
7
  import {
@@ -9,9 +9,6 @@ import {
9
9
  PositionedPeriod,
10
10
  } from "../utils/types.internal";
11
11
 
12
- import { horizontalPositionAndWidth } from "../utils/calc";
13
- import { invisiblePeriods, withinADay } from "../utils/filter";
14
-
15
12
  const spatialPeriod = (
16
13
  period: Period,
17
14
  timelineStart: Date,
@@ -19,7 +16,7 @@ const spatialPeriod = (
19
16
  direction: "left" | "right" = "left",
20
17
  i: number,
21
18
  periods: PositionedPeriod[],
22
- rowIndex: number
19
+ rowIndex: number,
23
20
  ): PositionedPeriod => {
24
21
  const start = period.start;
25
22
  const endInclusive = period.end;
@@ -30,10 +27,12 @@ const spatialPeriod = (
30
27
  const { horizontalPosition, width } = horizontalPositionAndWidth(
31
28
  startOfDay(start),
32
29
  endOfDay(
33
- rightOverlap ? startOfDay(subDays(periods[i + 1].start, 1)) : endInclusive
30
+ rightOverlap
31
+ ? startOfDay(subDays(periods[i + 1].start, 1))
32
+ : endInclusive,
34
33
  ),
35
34
  timelineStart,
36
- timelineEndInclusive
35
+ timelineEndInclusive,
37
36
  );
38
37
 
39
38
  return {
@@ -56,7 +55,7 @@ const spatialPeriod = (
56
55
  const adjustedEdges = (
57
56
  period: PositionedPeriod,
58
57
  i: number,
59
- allPeriods: PositionedPeriod[]
58
+ allPeriods: PositionedPeriod[],
60
59
  ): PositionedPeriod => {
61
60
  const left =
62
61
  i > 0 && withinADay(period.start, allPeriods[i - 1].endInclusive);
@@ -67,10 +66,10 @@ const adjustedEdges = (
67
66
  return left && right
68
67
  ? { ...period, cropped: "both" }
69
68
  : left
70
- ? { ...period, cropped: "left" }
71
- : right
72
- ? { ...period, cropped: "right" }
73
- : period;
69
+ ? { ...period, cropped: "left" }
70
+ : right
71
+ ? { ...period, cropped: "right" }
72
+ : period;
74
73
  };
75
74
 
76
75
  const trimmedPeriods = (period: PositionedPeriod) => {
@@ -97,7 +96,7 @@ export const useTimelineRows = (
97
96
  rows: any,
98
97
  startDate: Date,
99
98
  endDate: Date,
100
- direction: "left" | "right"
99
+ direction: "left" | "right",
101
100
  ): InternalSimpleTimeline[] =>
102
101
  useMemo(
103
102
  () =>
@@ -112,7 +111,7 @@ export const useTimelineRows = (
112
111
  direction,
113
112
  i,
114
113
  periods.periods,
115
- rowIndex
114
+ rowIndex,
116
115
  ),
117
116
  restProps: period?.restProps,
118
117
  ref: period?.ref,
@@ -132,7 +131,7 @@ export const useTimelineRows = (
132
131
  ref: periods?.ref,
133
132
  };
134
133
  }),
135
- [rows, startDate, endDate, direction]
134
+ [rows, startDate, endDate, direction],
136
135
  );
137
136
 
138
137
  const earliestDate = (earliest: Date, period: Period) =>
@@ -144,7 +143,7 @@ const earliestFomDate = (rader: Period[][]) =>
144
143
  export const useEarliestDate = ({ startDate, rows }: any) =>
145
144
  useMemo(
146
145
  () => (startDate ? startDate : earliestFomDate(rows)),
147
- [startDate, rows]
146
+ [startDate, rows],
148
147
  );
149
148
 
150
149
  const latestDate = (latest: Date, period: Period) =>
@@ -156,5 +155,5 @@ const latestTomDate = (rows: Period[][]) =>
156
155
  export const useLatestDate = ({ endDate, rows }: any) =>
157
156
  useMemo(
158
157
  () => (endDate ? endDate : addDays(latestTomDate(rows), 1)),
159
- [endDate, rows]
158
+ [endDate, rows],
160
159
  );
@@ -24,7 +24,7 @@ import { PeriodProps } from "./types";
24
24
 
25
25
  interface TimelineClickablePeriodProps extends PeriodProps {
26
26
  onSelectPeriod?: (
27
- e: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>
27
+ e: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,
28
28
  ) => void;
29
29
  isActive?: boolean;
30
30
  periodRef: React.ForwardedRef<HTMLButtonElement>;
@@ -91,7 +91,7 @@ const ClickablePeriod = React.memo(
91
91
 
92
92
  const mergedRef = useMemo(
93
93
  () => mergeRefs([refs.setReference, periodRef]),
94
- [periodRef, refs.setReference]
94
+ [periodRef, refs.setReference],
95
95
  );
96
96
 
97
97
  const staticSide = {
@@ -117,7 +117,7 @@ const ClickablePeriod = React.memo(
117
117
  restProps?.className,
118
118
  {
119
119
  "navds-timeline__period--selected": isActive,
120
- }
120
+ },
121
121
  )}
122
122
  aria-expanded={children ? open : undefined}
123
123
  aria-current={isActive || undefined}
@@ -179,7 +179,7 @@ const ClickablePeriod = React.memo(
179
179
  )}
180
180
  </>
181
181
  );
182
- }
182
+ },
183
183
  );
184
184
 
185
185
  export default ClickablePeriod;
@@ -26,7 +26,7 @@ const NonClickablePeriod = ({
26
26
  {...restProps}
27
27
  className={cl(
28
28
  getConditionalClasses(cropped, direction, status),
29
- restProps?.className
29
+ restProps?.className,
30
30
  )}
31
31
  style={{
32
32
  width: `${width}%`,
@@ -109,7 +109,7 @@ export const Period = forwardRef<HTMLDivElement, TimelinePeriodProps>(
109
109
  restProps={restProps}
110
110
  />
111
111
  );
112
- }
112
+ },
113
113
  ) as PeriodType;
114
114
 
115
115
  Period.componentType = "period";
@@ -1,8 +1,8 @@
1
- import { CheckmarkCircleFillIcon } from "@navikt/aksel-icons";
2
1
  import { Meta } from "@storybook/react";
3
2
  import * as React from "react";
4
- import Timeline from "./Timeline";
5
3
  import { useState } from "react";
4
+ import { CheckmarkCircleFillIcon } from "@navikt/aksel-icons";
5
+ import Timeline from "./Timeline";
6
6
 
7
7
  export default {
8
8
  title: "ds-react/Timeline",
@@ -9,12 +9,12 @@ export const horizontalPositionAndWidth = (
9
9
  start: Date,
10
10
  endInclusive: Date,
11
11
  timelineStart: Date,
12
- timelineEndInclusive: Date
12
+ timelineEndInclusive: Date,
13
13
  ) => {
14
14
  const horizontalPosition = position(
15
15
  start,
16
16
  timelineStart,
17
- timelineEndInclusive
17
+ timelineEndInclusive,
18
18
  );
19
19
  const width =
20
20
  position(endInclusive, timelineStart, timelineEndInclusive) -
@@ -12,13 +12,13 @@ export const isVisible = ({ horizontalPosition }: Positioned): boolean =>
12
12
 
13
13
  export const getFirstDate = (periods: any) => {
14
14
  return periods.sort(
15
- (a: PeriodProps, b: PeriodProps) => a.start.getTime() - b.start.getTime()
15
+ (a: PeriodProps, b: PeriodProps) => a.start.getTime() - b.start.getTime(),
16
16
  )[0].start;
17
17
  };
18
18
 
19
19
  export const getLastDate = (periods: any) => {
20
20
  return periods.sort(
21
- (a: PeriodProps, b: PeriodProps) => a.end.getTime() - b.end.getTime()
21
+ (a: PeriodProps, b: PeriodProps) => a.end.getTime() - b.end.getTime(),
22
22
  )[periods.length - 1].end;
23
23
  };
24
24
 
@@ -4,7 +4,7 @@ import { format } from "date-fns";
4
4
  export const getConditionalClasses = (
5
5
  cropped: string,
6
6
  direction: string,
7
- status: string
7
+ status: string,
8
8
  ) => {
9
9
  return cl(`navds-timeline__period navds-timeline__period--${status}`, {
10
10
  "navds-timeline__period--connected-both": cropped === "both",
@@ -38,7 +38,7 @@ export const ariaLabel = (
38
38
  startDate: Date,
39
39
  endDate: Date,
40
40
  status: string,
41
- statusLabel?: string
41
+ statusLabel?: string,
42
42
  ): string => {
43
43
  const start = format(startDate, "dd.MM.yyyy");
44
44
  const end = format(endDate, "dd.MM.yyyy");
@@ -1,5 +1,5 @@
1
- import { omit } from "../../util";
2
1
  import React, { ReactNode } from "react";
2
+ import { omit } from "../../util";
3
3
  import { Period } from "./types.external";
4
4
 
5
5
  type ParsedChild = {
@@ -1,4 +1,3 @@
1
- import { Detail } from "../../typography/Detail";
2
1
  import {
3
2
  addMonths,
4
3
  addYears,
@@ -8,6 +7,7 @@ import {
8
7
  subYears,
9
8
  } from "date-fns";
10
9
  import React, { forwardRef } from "react";
10
+ import { Detail } from "../../typography/Detail";
11
11
  import { useTimelineContext } from "../hooks/useTimelineContext";
12
12
 
13
13
  export interface TimelineZoomButtonProps {
@@ -61,7 +61,7 @@ export const ZoomButton: ZoomButtonType = forwardRef(
61
61
  !currentZoom
62
62
  ? `Zoom tidslinjen ${format(
63
63
  startOfRange,
64
- "dd.MM.yyyy"
64
+ "dd.MM.yyyy",
65
65
  )} til ${format(endDate, "dd.MM.yyyy")}`
66
66
  : "Tilbakestill til initiell tidsperspektiv"
67
67
  }
@@ -77,7 +77,7 @@ export const ZoomButton: ZoomButtonType = forwardRef(
77
77
  </button>
78
78
  </Detail>
79
79
  );
80
- }
80
+ },
81
81
  );
82
82
 
83
83
  export default ZoomButton;
@@ -21,7 +21,7 @@ export const Zoom = forwardRef<HTMLUListElement, ZoomProps>(
21
21
  {children}
22
22
  </ul>
23
23
  );
24
- }
24
+ },
25
25
  ) as ZoomType;
26
26
 
27
27
  Zoom.Button = ZoomButton;
@@ -1,10 +1,10 @@
1
+ import { Meta } from "@storybook/react";
2
+ import React, { useState } from "react";
1
3
  import {
2
4
  EnvelopeClosedIcon,
3
5
  EnvelopeOpenIcon,
4
6
  InboxUpIcon,
5
7
  } from "@navikt/aksel-icons";
6
- import { Meta } from "@storybook/react";
7
- import React, { useState } from "react";
8
8
  import { ToggleGroup } from "../index";
9
9
 
10
10
  const meta: Meta<typeof ToggleGroup> = {
@@ -1,10 +1,10 @@
1
1
  import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
2
2
  import cl from "clsx";
3
- import React, { forwardRef, HTMLAttributes, useState } from "react";
3
+ import React, { HTMLAttributes, forwardRef, useState } from "react";
4
4
  import { Label } from "../typography";
5
5
  import { useId } from "../util";
6
- import { ToggleGroupContext } from "./context";
7
6
  import ToggleItem, { ToggleItemProps } from "./ToggleItem";
7
+ import { ToggleGroupContext } from "./context";
8
8
 
9
9
  export interface ToggleGroupProps
10
10
  extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "dir"> {
@@ -81,7 +81,7 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
81
81
  variant = "action",
82
82
  ...rest
83
83
  },
84
- ref
84
+ ref,
85
85
  ) => {
86
86
  const [groupValue, setGroupValue] = useState(defaultValue);
87
87
  const labelId = useId();
@@ -131,7 +131,7 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
131
131
  className={cl(
132
132
  "navds-toggle-group",
133
133
  `navds-toggle-group--${size}`,
134
- `navds-toggle-group--${variant}`
134
+ `navds-toggle-group--${variant}`,
135
135
  )}
136
136
  {...(describeBy && { "aria-describedby": describeBy })}
137
137
  role="radiogroup"
@@ -142,7 +142,7 @@ export const ToggleGroup = forwardRef<HTMLDivElement, ToggleGroupProps>(
142
142
  </div>
143
143
  </ToggleGroupContext.Provider>
144
144
  );
145
- }
145
+ },
146
146
  ) as ToggleGroupComponent;
147
147
 
148
148
  ToggleGroup.Item = ToggleItem;
@@ -35,7 +35,7 @@ const ToggleItem = forwardRef<HTMLButtonElement, ToggleItemProps>(
35
35
  </BodyShort>
36
36
  </RadixToggleGroup.Item>
37
37
  );
38
- }
38
+ },
39
39
  );
40
40
 
41
41
  export default ToggleItem;
@@ -5,5 +5,5 @@ interface ToggleContextProps {
5
5
  }
6
6
 
7
7
  export const ToggleGroupContext = createContext<ToggleContextProps | null>(
8
- null
8
+ null,
9
9
  );
@@ -1,11 +1,11 @@
1
1
  import { act, fireEvent, screen } from "@testing-library/react";
2
+ import userEvent from "@testing-library/user-event";
2
3
  import React from "react";
3
4
  import {
4
5
  focusVisible,
5
- simulatePointerDown,
6
6
  renderWithStyles as render,
7
+ simulatePointerDown,
7
8
  } from "../../tests/utils";
8
- import userEvent from "@testing-library/user-event";
9
9
  import Tooltip from "./Tooltip";
10
10
 
11
11
  describe("Tooltip", () => {
@@ -15,7 +15,7 @@ describe("Tooltip", () => {
15
15
  <button id="testChild" type="submit">
16
16
  Hello World
17
17
  </button>
18
- </Tooltip>
18
+ </Tooltip>,
19
19
  );
20
20
 
21
21
  expect(screen.getByRole("tooltip")).toBeVisible();
@@ -27,7 +27,7 @@ describe("Tooltip", () => {
27
27
  <button id="testChild" type="submit">
28
28
  Hello World
29
29
  </button>
30
- </Tooltip>
30
+ </Tooltip>,
31
31
  );
32
32
 
33
33
  expect(screen.getByRole("tooltip")).toBeVisible();
@@ -39,7 +39,7 @@ describe("Tooltip", () => {
39
39
  <button id="testChild" type="submit">
40
40
  Hello World
41
41
  </button>
42
- </Tooltip>
42
+ </Tooltip>,
43
43
  );
44
44
  simulatePointerDown();
45
45
 
@@ -53,7 +53,7 @@ describe("Tooltip", () => {
53
53
  <button id="testChild" type="submit">
54
54
  Hello World
55
55
  </button>
56
- </Tooltip>
56
+ </Tooltip>,
57
57
  );
58
58
  simulatePointerDown();
59
59
 
@@ -72,7 +72,7 @@ describe("Tooltip", () => {
72
72
  <button id="testChild" type="submit">
73
73
  Hello World
74
74
  </button>
75
- </Tooltip>
75
+ </Tooltip>,
76
76
  );
77
77
 
78
78
  await act(async () => {
@@ -94,7 +94,7 @@ describe("Tooltip", () => {
94
94
  </button>
95
95
  </Tooltip>
96
96
  <a href="/#">link</a>
97
- </div>
97
+ </div>,
98
98
  );
99
99
 
100
100
  simulatePointerDown(screen.getByRole("button"));
@@ -116,7 +116,7 @@ describe("Tooltip", () => {
116
116
  Hello World
117
117
  </button>
118
118
  </Tooltip>
119
- </div>
119
+ </div>,
120
120
  );
121
121
 
122
122
  simulatePointerDown(screen.getByRole("button"));
@@ -137,7 +137,7 @@ describe("Tooltip", () => {
137
137
  </button>
138
138
  </Tooltip>
139
139
  <a href="/#">link</a>
140
- </div>
140
+ </div>,
141
141
  );
142
142
 
143
143
  simulatePointerDown(screen.getByRole("button"));
@@ -20,12 +20,12 @@ import React, {
20
20
  useContext,
21
21
  useMemo,
22
22
  useRef,
23
- useState,
24
23
  } from "react";
25
24
  import { ModalContext } from "../modal/ModalContext";
26
25
  import { useProvider } from "../provider";
27
26
  import { Detail } from "../typography";
28
27
  import { mergeRefs, useId } from "../util";
28
+ import { useControllableState } from "../util/hooks/useControllableState";
29
29
 
30
30
  export interface TooltipProps extends HTMLAttributes<HTMLDivElement> {
31
31
  /**
@@ -43,6 +43,10 @@ export interface TooltipProps extends HTMLAttributes<HTMLDivElement> {
43
43
  * @note "open"-prop overwrites this
44
44
  */
45
45
  defaultOpen?: boolean;
46
+ /**
47
+ * Change handler for open
48
+ */
49
+ onOpenChange?: (open: boolean) => void;
46
50
  /**
47
51
  * Orientation for tooltip
48
52
  * @default "top"
@@ -98,8 +102,9 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
98
102
  className,
99
103
  arrow: _arrow = true,
100
104
  placement: _placement = "top",
101
- open: userOpen,
105
+ open,
102
106
  defaultOpen = false,
107
+ onOpenChange,
103
108
  offset: _offset,
104
109
  content,
105
110
  delay = 150,
@@ -110,7 +115,12 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
110
115
  },
111
116
  ref
112
117
  ) => {
113
- const [open, setOpen] = useState(defaultOpen);
118
+ const [_open, _setOpen] = useControllableState({
119
+ defaultValue: defaultOpen,
120
+ value: open,
121
+ onChange: onOpenChange,
122
+ });
123
+
114
124
  const arrowRef = useRef<HTMLDivElement | null>(null);
115
125
  const modalContext = useContext(ModalContext);
116
126
  const providerRootElement = useProvider()?.rootElement;
@@ -131,8 +141,8 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
131
141
  refs,
132
142
  } = useFloating({
133
143
  placement: _placement,
134
- open: userOpen ?? open,
135
- onOpenChange: (_open) => setOpen(_open),
144
+ open: _open,
145
+ onOpenChange: (newState) => _setOpen(newState),
136
146
  middleware: [
137
147
  offset(_offset ? _offset : _arrow ? 10 : 2),
138
148
  shift(),
@@ -177,7 +187,7 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
177
187
  }
178
188
 
179
189
  if (content?.length > maxChar) {
180
- (userOpen ?? open) &&
190
+ _open &&
181
191
  console.warn(
182
192
  `Because of strict accessibility concers we encourage all Tooltips to have less than 80 characters. Can be overwritten with the maxChar-prop\n\nLength:${content.length}\nTooltip-content: ${content}`
183
193
  );
@@ -190,14 +200,13 @@ export const Tooltip = forwardRef<HTMLDivElement, TooltipProps>(
190
200
  getReferenceProps({
191
201
  ...children.props,
192
202
  ref: childMergedRef,
193
- "aria-describedby":
194
- userOpen ?? open
195
- ? cl(ariaId, children?.props["aria-describedby"])
196
- : children?.props["aria-describedby"],
203
+ "aria-describedby": _open
204
+ ? cl(ariaId, children?.props["aria-describedby"])
205
+ : children?.props["aria-describedby"],
197
206
  })
198
207
  )}
199
208
  <FloatingPortal root={rootElement}>
200
- {(userOpen ?? open) && (
209
+ {_open && (
201
210
  <div
202
211
  {...getFloatingProps({
203
212
  ...rest,
@@ -1,6 +1,6 @@
1
1
  import { Meta } from "@storybook/react";
2
2
  import React from "react";
3
- import { Tooltip, Alert, Button, Search } from "..";
3
+ import { Alert, Button, Search, Tooltip } from "..";
4
4
 
5
5
  export default {
6
6
  title: "ds-react/Tooltip",
@@ -1,5 +1,5 @@
1
- import React, { forwardRef } from "react";
2
1
  import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
3
  import { OverridableComponent } from "../util/OverridableComponent";
4
4
  import { TypoProps } from "./types";
5
5
  import { typoClassNames } from "./util";
@@ -51,7 +51,7 @@ export const BodyLong: OverridableComponent<
51
51
  textColor,
52
52
  ...rest
53
53
  },
54
- ref
54
+ ref,
55
55
  ) => (
56
56
  <Component
57
57
  {...rest}
@@ -67,10 +67,10 @@ export const BodyLong: OverridableComponent<
67
67
  align,
68
68
  visuallyHidden,
69
69
  textColor,
70
- })
70
+ }),
71
71
  )}
72
72
  />
73
- )
73
+ ),
74
74
  );
75
75
 
76
76
  export default BodyLong;
@@ -49,7 +49,7 @@ export const BodyShort: OverridableComponent<
49
49
  textColor,
50
50
  ...rest
51
51
  },
52
- ref
52
+ ref,
53
53
  ) => (
54
54
  <Component
55
55
  {...rest}
@@ -65,10 +65,10 @@ export const BodyShort: OverridableComponent<
65
65
  align,
66
66
  visuallyHidden,
67
67
  textColor,
68
- })
68
+ }),
69
69
  )}
70
70
  />
71
- )
71
+ ),
72
72
  );
73
73
 
74
74
  export default BodyShort;
@@ -51,7 +51,7 @@ export const Detail: OverridableComponent<DetailProps, HTMLParagraphElement> =
51
51
  textColor,
52
52
  ...rest
53
53
  },
54
- ref
54
+ ref,
55
55
  ) => (
56
56
  <Component
57
57
  {...rest}
@@ -70,10 +70,10 @@ export const Detail: OverridableComponent<DetailProps, HTMLParagraphElement> =
70
70
  }),
71
71
  {
72
72
  "navds-detail--small": size === "small",
73
- }
73
+ },
74
74
  )}
75
75
  />
76
- )
76
+ ),
77
77
  );
78
78
 
79
79
  export default Detail;
@@ -1,5 +1,5 @@
1
- import React, { forwardRef } from "react";
2
1
  import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
3
  import { OverridableComponent } from "../util/OverridableComponent";
4
4
  import { TypoProps } from "./types";
5
5
  import { typoClassNames } from "./util";
@@ -49,10 +49,10 @@ export const ErrorMessage: OverridableComponent<
49
49
  }),
50
50
  {
51
51
  "navds-label--small": size === "small",
52
- }
52
+ },
53
53
  )}
54
54
  />
55
- )
55
+ ),
56
56
  );
57
57
 
58
58
  export default ErrorMessage;
@@ -50,7 +50,7 @@ export const Heading: OverridableComponent<HeadingProps, HTMLHeadingElement> =
50
50
  textColor,
51
51
  ...rest
52
52
  },
53
- ref
53
+ ref,
54
54
  ) => {
55
55
  const HeadingTag = as ?? (`h${level}` as React.ElementType);
56
56
 
@@ -67,11 +67,11 @@ export const Heading: OverridableComponent<HeadingProps, HTMLHeadingElement> =
67
67
  align,
68
68
  visuallyHidden,
69
69
  textColor,
70
- })
70
+ }),
71
71
  )}
72
72
  />
73
73
  );
74
- }
74
+ },
75
75
  );
76
76
 
77
77
  export default Heading;
@@ -1,5 +1,5 @@
1
- import React, { forwardRef } from "react";
2
1
  import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
3
  import { OverridableComponent } from "../util/OverridableComponent";
4
4
 
5
5
  export interface IngressProps
@@ -44,7 +44,7 @@ export const Label: OverridableComponent<LabelProps, HTMLLabelElement> =
44
44
  textColor,
45
45
  ...rest
46
46
  },
47
- ref
47
+ ref,
48
48
  ) => (
49
49
  <Component
50
50
  {...rest}
@@ -59,10 +59,10 @@ export const Label: OverridableComponent<LabelProps, HTMLLabelElement> =
59
59
  }),
60
60
  {
61
61
  "navds-label--small": size === "small",
62
- }
62
+ },
63
63
  )}
64
64
  />
65
- )
65
+ ),
66
66
  );
67
67
 
68
68
  export default Label;