@navikt/ds-react 7.6.0 → 7.8.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 (390) hide show
  1. package/cjs/chips/Removable.d.ts +0 -5
  2. package/cjs/chips/Removable.js +2 -2
  3. package/cjs/chips/Removable.js.map +1 -1
  4. package/cjs/copybutton/CopyButton.d.ts +1 -6
  5. package/cjs/copybutton/CopyButton.js +8 -6
  6. package/cjs/copybutton/CopyButton.js.map +1 -1
  7. package/cjs/date/context/index.d.ts +2 -1
  8. package/cjs/date/context/index.js +5 -2
  9. package/cjs/date/context/index.js.map +1 -1
  10. package/cjs/date/context/useDateInputContext.d.ts +3 -3
  11. package/cjs/date/context/useDateInputContext.js +4 -4
  12. package/cjs/date/context/useDateInputContext.js.map +1 -1
  13. package/cjs/date/context/useDateTranslationContext.d.ts +8 -0
  14. package/cjs/date/context/useDateTranslationContext.js +7 -0
  15. package/cjs/date/context/useDateTranslationContext.js.map +1 -0
  16. package/cjs/date/datepicker/DatePicker.js +18 -16
  17. package/cjs/date/datepicker/DatePicker.js.map +1 -1
  18. package/cjs/date/datepicker/DatePickerStandalone.js +17 -14
  19. package/cjs/date/datepicker/DatePickerStandalone.js.map +1 -1
  20. package/cjs/date/datepicker/parts/Caption.js +2 -3
  21. package/cjs/date/datepicker/parts/Caption.js.map +1 -1
  22. package/cjs/date/datepicker/parts/DropdownCaption.js +2 -2
  23. package/cjs/date/datepicker/parts/DropdownCaption.js.map +1 -1
  24. package/cjs/date/datepicker/parts/WeekNumber.js +14 -6
  25. package/cjs/date/datepicker/parts/WeekNumber.js.map +1 -1
  26. package/cjs/date/datepicker/parts/WeekRow.js +2 -3
  27. package/cjs/date/datepicker/parts/WeekRow.js.map +1 -1
  28. package/cjs/date/datepicker/types.d.ts +8 -0
  29. package/cjs/date/monthpicker/MonthCaption.js +1 -3
  30. package/cjs/date/monthpicker/MonthCaption.js.map +1 -1
  31. package/cjs/date/monthpicker/MonthPicker.js +30 -28
  32. package/cjs/date/monthpicker/MonthPicker.js.map +1 -1
  33. package/cjs/date/monthpicker/MonthPickerStandalone.js +16 -12
  34. package/cjs/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  35. package/cjs/date/monthpicker/types.d.ts +8 -0
  36. package/cjs/date/parts/DateInput.js +1 -2
  37. package/cjs/date/parts/DateInput.js.map +1 -1
  38. package/cjs/date/parts/DateWrapper.d.ts +3 -1
  39. package/cjs/date/parts/DateWrapper.js +3 -3
  40. package/cjs/date/parts/DateWrapper.js.map +1 -1
  41. package/cjs/date/utils/index.d.ts +1 -1
  42. package/cjs/date/utils/index.js +2 -1
  43. package/cjs/date/utils/index.js.map +1 -1
  44. package/cjs/date/utils/locale.d.ts +12 -2
  45. package/cjs/date/utils/locale.js +18 -2
  46. package/cjs/date/utils/locale.js.map +1 -1
  47. package/cjs/form/combobox/Combobox.d.ts +1 -1
  48. package/cjs/form/combobox/ComboboxWrapper.js +6 -6
  49. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  50. package/cjs/form/combobox/FilteredOptions/AddNewOption.js +3 -1
  51. package/cjs/form/combobox/FilteredOptions/AddNewOption.js.map +1 -1
  52. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  53. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  54. package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
  55. package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
  56. package/cjs/form/combobox/FilteredOptions/LoadingMessage.js +3 -1
  57. package/cjs/form/combobox/FilteredOptions/LoadingMessage.js.map +1 -1
  58. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
  59. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js +6 -5
  60. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
  61. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  62. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  63. package/cjs/form/combobox/Input/Input.context.d.ts +1 -1
  64. package/cjs/form/combobox/Input/Input.context.js.map +1 -1
  65. package/cjs/form/combobox/Input/Input.js +1 -1
  66. package/cjs/form/combobox/Input/Input.js.map +1 -1
  67. package/cjs/form/combobox/Input/InputController.d.ts +1 -1
  68. package/cjs/form/combobox/Input/InputController.js +10 -10
  69. package/cjs/form/combobox/Input/InputController.js.map +1 -1
  70. package/cjs/form/combobox/Input/ToggleListButton.d.ts +1 -4
  71. package/cjs/form/combobox/Input/ToggleListButton.js +3 -5
  72. package/cjs/form/combobox/Input/ToggleListButton.js.map +1 -1
  73. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +8 -6
  74. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  75. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
  76. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
  77. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  78. package/cjs/form/combobox/types.d.ts +7 -22
  79. package/cjs/form/form-summary/FormSummaryEditLink.js +4 -2
  80. package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -1
  81. package/cjs/form/search/Search.d.ts +2 -1
  82. package/cjs/form/search/Search.js +8 -3
  83. package/cjs/form/search/Search.js.map +1 -1
  84. package/cjs/form/textarea/Textarea.d.ts +1 -0
  85. package/cjs/form/textarea/Textarea.js.map +1 -1
  86. package/cjs/guide-panel/GuidePanel.js +11 -3
  87. package/cjs/guide-panel/GuidePanel.js.map +1 -1
  88. package/cjs/guide-panel/Illustration.d.ts +2 -8
  89. package/cjs/guide-panel/Illustration.darkside.d.ts +2 -0
  90. package/cjs/guide-panel/Illustration.darkside.js +30 -0
  91. package/cjs/guide-panel/Illustration.darkside.js.map +1 -0
  92. package/cjs/guide-panel/Illustration.js +4 -18
  93. package/cjs/guide-panel/Illustration.js.map +1 -1
  94. package/cjs/guide-panel/index.d.ts +0 -1
  95. package/cjs/guide-panel/index.js +1 -3
  96. package/cjs/guide-panel/index.js.map +1 -1
  97. package/cjs/help-text/HelpText.d.ts +1 -1
  98. package/cjs/help-text/HelpText.js +6 -3
  99. package/cjs/help-text/HelpText.js.map +1 -1
  100. package/cjs/index.d.ts +1 -1
  101. package/cjs/index.js +2 -3
  102. package/cjs/index.js.map +1 -1
  103. package/cjs/internal-header/InternalHeaderButton.d.ts +1 -1
  104. package/cjs/internal-header/InternalHeaderUserButton.d.ts +1 -1
  105. package/cjs/internal-header/InternalHeaderUserButton.js +1 -1
  106. package/cjs/internal-header/InternalHeaderUserButton.js.map +1 -1
  107. package/cjs/layout/base/BasePrimitive.js +4 -1
  108. package/cjs/layout/base/BasePrimitive.js.map +1 -1
  109. package/cjs/layout/bleed/Bleed.js +5 -2
  110. package/cjs/layout/bleed/Bleed.js.map +1 -1
  111. package/cjs/layout/box/Box.d.ts +6 -1
  112. package/cjs/layout/box/Box.darkside.d.ts +70 -0
  113. package/cjs/layout/box/Box.darkside.js +98 -0
  114. package/cjs/layout/box/Box.darkside.js.map +1 -0
  115. package/cjs/layout/box/Box.js +19 -6
  116. package/cjs/layout/box/Box.js.map +1 -1
  117. package/cjs/layout/box/index.js +2 -0
  118. package/cjs/layout/box/index.js.map +1 -1
  119. package/cjs/layout/grid/HGrid.js +4 -1
  120. package/cjs/layout/grid/HGrid.js.map +1 -1
  121. package/cjs/layout/page/Page.d.ts +1 -0
  122. package/cjs/layout/page/Page.js +5 -0
  123. package/cjs/layout/page/Page.js.map +1 -1
  124. package/cjs/layout/stack/Stack.js +4 -1
  125. package/cjs/layout/stack/Stack.js.map +1 -1
  126. package/cjs/layout/utilities/css.d.ts +2 -2
  127. package/cjs/layout/utilities/css.js +8 -9
  128. package/cjs/layout/utilities/css.js.map +1 -1
  129. package/cjs/layout/utilities/types.d.ts +10 -0
  130. package/cjs/modal/Modal.js +1 -1
  131. package/cjs/modal/Modal.js.map +1 -1
  132. package/cjs/modal/ModalHeader.js +1 -1
  133. package/cjs/modal/ModalHeader.js.map +1 -1
  134. package/cjs/popover/Popover.js +1 -1
  135. package/cjs/popover/Popover.js.map +1 -1
  136. package/cjs/provider/Provider.d.ts +35 -10
  137. package/cjs/provider/Provider.js +13 -14
  138. package/cjs/provider/Provider.js.map +1 -1
  139. package/cjs/table/ExpandableRow.js +3 -3
  140. package/cjs/table/ExpandableRow.js.map +1 -1
  141. package/cjs/tabs/Tabs.context.d.ts +1 -1
  142. package/cjs/timeline/Timeline.d.ts +1 -0
  143. package/cjs/timeline/Timeline.js.map +1 -1
  144. package/cjs/util/i18n/i18n.context.d.ts +1 -1
  145. package/cjs/util/i18n/i18n.context.js +15 -14
  146. package/cjs/util/i18n/i18n.context.js.map +1 -1
  147. package/cjs/util/i18n/locales/en.d.ts +51 -36
  148. package/cjs/util/i18n/locales/en.js +52 -37
  149. package/cjs/util/i18n/locales/en.js.map +1 -1
  150. package/cjs/util/i18n/locales/index.d.ts +3 -0
  151. package/cjs/util/i18n/locales/index.js +14 -0
  152. package/cjs/util/i18n/locales/index.js.map +1 -0
  153. package/cjs/util/i18n/locales/nb.d.ts +54 -37
  154. package/cjs/util/i18n/locales/nb.js +56 -39
  155. package/cjs/util/i18n/locales/nb.js.map +1 -1
  156. package/cjs/util/i18n/locales/nn.d.ts +51 -36
  157. package/cjs/util/i18n/locales/nn.js +52 -37
  158. package/cjs/util/i18n/locales/nn.js.map +1 -1
  159. package/esm/chips/Removable.d.ts +0 -5
  160. package/esm/chips/Removable.js +2 -2
  161. package/esm/chips/Removable.js.map +1 -1
  162. package/esm/copybutton/CopyButton.d.ts +1 -6
  163. package/esm/copybutton/CopyButton.js +8 -6
  164. package/esm/copybutton/CopyButton.js.map +1 -1
  165. package/esm/date/context/index.d.ts +2 -1
  166. package/esm/date/context/index.js +2 -1
  167. package/esm/date/context/index.js.map +1 -1
  168. package/esm/date/context/useDateInputContext.d.ts +3 -3
  169. package/esm/date/context/useDateInputContext.js +3 -3
  170. package/esm/date/context/useDateInputContext.js.map +1 -1
  171. package/esm/date/context/useDateTranslationContext.d.ts +8 -0
  172. package/esm/date/context/useDateTranslationContext.js +3 -0
  173. package/esm/date/context/useDateTranslationContext.js.map +1 -0
  174. package/esm/date/datepicker/DatePicker.js +21 -19
  175. package/esm/date/datepicker/DatePicker.js.map +1 -1
  176. package/esm/date/datepicker/DatePickerStandalone.js +19 -16
  177. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  178. package/esm/date/datepicker/parts/Caption.js +2 -3
  179. package/esm/date/datepicker/parts/Caption.js.map +1 -1
  180. package/esm/date/datepicker/parts/DropdownCaption.js +3 -3
  181. package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -1
  182. package/esm/date/datepicker/parts/WeekNumber.js +15 -7
  183. package/esm/date/datepicker/parts/WeekNumber.js.map +1 -1
  184. package/esm/date/datepicker/parts/WeekRow.js +2 -3
  185. package/esm/date/datepicker/parts/WeekRow.js.map +1 -1
  186. package/esm/date/datepicker/types.d.ts +8 -0
  187. package/esm/date/monthpicker/MonthCaption.js +2 -4
  188. package/esm/date/monthpicker/MonthCaption.js.map +1 -1
  189. package/esm/date/monthpicker/MonthPicker.js +33 -31
  190. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  191. package/esm/date/monthpicker/MonthPickerStandalone.js +18 -14
  192. package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  193. package/esm/date/monthpicker/types.d.ts +8 -0
  194. package/esm/date/parts/DateInput.js +2 -3
  195. package/esm/date/parts/DateInput.js.map +1 -1
  196. package/esm/date/parts/DateWrapper.d.ts +3 -1
  197. package/esm/date/parts/DateWrapper.js +4 -4
  198. package/esm/date/parts/DateWrapper.js.map +1 -1
  199. package/esm/date/utils/index.d.ts +1 -1
  200. package/esm/date/utils/index.js +1 -1
  201. package/esm/date/utils/index.js.map +1 -1
  202. package/esm/date/utils/locale.d.ts +12 -2
  203. package/esm/date/utils/locale.js +16 -1
  204. package/esm/date/utils/locale.js.map +1 -1
  205. package/esm/form/combobox/Combobox.d.ts +1 -1
  206. package/esm/form/combobox/ComboboxWrapper.js +6 -6
  207. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  208. package/esm/form/combobox/FilteredOptions/AddNewOption.js +3 -1
  209. package/esm/form/combobox/FilteredOptions/AddNewOption.js.map +1 -1
  210. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  211. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  212. package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
  213. package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
  214. package/esm/form/combobox/FilteredOptions/LoadingMessage.js +3 -1
  215. package/esm/form/combobox/FilteredOptions/LoadingMessage.js.map +1 -1
  216. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
  217. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js +6 -5
  218. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
  219. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  220. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  221. package/esm/form/combobox/Input/Input.context.d.ts +1 -1
  222. package/esm/form/combobox/Input/Input.context.js.map +1 -1
  223. package/esm/form/combobox/Input/Input.js +1 -1
  224. package/esm/form/combobox/Input/Input.js.map +1 -1
  225. package/esm/form/combobox/Input/InputController.d.ts +1 -1
  226. package/esm/form/combobox/Input/InputController.js +10 -10
  227. package/esm/form/combobox/Input/InputController.js.map +1 -1
  228. package/esm/form/combobox/Input/ToggleListButton.d.ts +1 -4
  229. package/esm/form/combobox/Input/ToggleListButton.js +3 -5
  230. package/esm/form/combobox/Input/ToggleListButton.js.map +1 -1
  231. package/esm/form/combobox/SelectedOptions/SelectedOptions.js +8 -6
  232. package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  233. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
  234. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
  235. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  236. package/esm/form/combobox/types.d.ts +7 -22
  237. package/esm/form/form-summary/FormSummaryEditLink.js +4 -2
  238. package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -1
  239. package/esm/form/search/Search.d.ts +2 -1
  240. package/esm/form/search/Search.js +8 -3
  241. package/esm/form/search/Search.js.map +1 -1
  242. package/esm/form/textarea/Textarea.d.ts +1 -0
  243. package/esm/form/textarea/Textarea.js.map +1 -1
  244. package/esm/guide-panel/GuidePanel.js +11 -3
  245. package/esm/guide-panel/GuidePanel.js.map +1 -1
  246. package/esm/guide-panel/Illustration.d.ts +2 -8
  247. package/esm/guide-panel/Illustration.darkside.d.ts +2 -0
  248. package/esm/guide-panel/Illustration.darkside.js +23 -0
  249. package/esm/guide-panel/Illustration.darkside.js.map +1 -0
  250. package/esm/guide-panel/Illustration.js +4 -18
  251. package/esm/guide-panel/Illustration.js.map +1 -1
  252. package/esm/guide-panel/index.d.ts +0 -1
  253. package/esm/guide-panel/index.js +0 -1
  254. package/esm/guide-panel/index.js.map +1 -1
  255. package/esm/help-text/HelpText.d.ts +1 -1
  256. package/esm/help-text/HelpText.js +6 -3
  257. package/esm/help-text/HelpText.js.map +1 -1
  258. package/esm/index.d.ts +1 -1
  259. package/esm/index.js +1 -1
  260. package/esm/index.js.map +1 -1
  261. package/esm/internal-header/InternalHeaderButton.d.ts +1 -1
  262. package/esm/internal-header/InternalHeaderUserButton.d.ts +1 -1
  263. package/esm/internal-header/InternalHeaderUserButton.js +1 -1
  264. package/esm/internal-header/InternalHeaderUserButton.js.map +1 -1
  265. package/esm/layout/base/BasePrimitive.js +4 -1
  266. package/esm/layout/base/BasePrimitive.js.map +1 -1
  267. package/esm/layout/bleed/Bleed.js +5 -2
  268. package/esm/layout/bleed/Bleed.js.map +1 -1
  269. package/esm/layout/box/Box.d.ts +6 -1
  270. package/esm/layout/box/Box.darkside.d.ts +70 -0
  271. package/esm/layout/box/Box.darkside.js +69 -0
  272. package/esm/layout/box/Box.darkside.js.map +1 -0
  273. package/esm/layout/box/Box.js +18 -5
  274. package/esm/layout/box/Box.js.map +1 -1
  275. package/esm/layout/grid/HGrid.js +4 -1
  276. package/esm/layout/grid/HGrid.js.map +1 -1
  277. package/esm/layout/page/Page.d.ts +1 -0
  278. package/esm/layout/page/Page.js +5 -0
  279. package/esm/layout/page/Page.js.map +1 -1
  280. package/esm/layout/stack/Stack.js +4 -1
  281. package/esm/layout/stack/Stack.js.map +1 -1
  282. package/esm/layout/utilities/css.d.ts +2 -2
  283. package/esm/layout/utilities/css.js +8 -9
  284. package/esm/layout/utilities/css.js.map +1 -1
  285. package/esm/layout/utilities/types.d.ts +10 -0
  286. package/esm/modal/Modal.js +2 -2
  287. package/esm/modal/Modal.js.map +1 -1
  288. package/esm/modal/ModalHeader.js +1 -1
  289. package/esm/modal/ModalHeader.js.map +1 -1
  290. package/esm/popover/Popover.js +2 -2
  291. package/esm/popover/Popover.js.map +1 -1
  292. package/esm/provider/Provider.d.ts +35 -10
  293. package/esm/provider/Provider.js +11 -15
  294. package/esm/provider/Provider.js.map +1 -1
  295. package/esm/table/ExpandableRow.js +3 -3
  296. package/esm/table/ExpandableRow.js.map +1 -1
  297. package/esm/tabs/Tabs.context.d.ts +1 -1
  298. package/esm/timeline/Timeline.d.ts +1 -0
  299. package/esm/timeline/Timeline.js.map +1 -1
  300. package/esm/util/i18n/i18n.context.d.ts +1 -1
  301. package/esm/util/i18n/i18n.context.js +15 -14
  302. package/esm/util/i18n/i18n.context.js.map +1 -1
  303. package/esm/util/i18n/locales/en.d.ts +51 -36
  304. package/esm/util/i18n/locales/en.js +52 -37
  305. package/esm/util/i18n/locales/en.js.map +1 -1
  306. package/esm/util/i18n/locales/index.d.ts +3 -0
  307. package/esm/util/i18n/locales/index.js +5 -0
  308. package/esm/util/i18n/locales/index.js.map +1 -0
  309. package/esm/util/i18n/locales/nb.d.ts +54 -37
  310. package/esm/util/i18n/locales/nb.js +56 -39
  311. package/esm/util/i18n/locales/nb.js.map +1 -1
  312. package/esm/util/i18n/locales/nn.d.ts +51 -36
  313. package/esm/util/i18n/locales/nn.js +52 -37
  314. package/esm/util/i18n/locales/nn.js.map +1 -1
  315. package/package.json +13 -3
  316. package/src/chips/Removable.tsx +1 -9
  317. package/src/copybutton/CopyButton.tsx +14 -30
  318. package/src/date/context/index.ts +5 -1
  319. package/src/date/context/useDateInputContext.tsx +6 -4
  320. package/src/date/context/useDateTranslationContext.ts +9 -0
  321. package/src/date/datepicker/DatePicker.tsx +41 -32
  322. package/src/date/datepicker/DatePickerStandalone.tsx +46 -37
  323. package/src/date/datepicker/parts/Caption.tsx +2 -3
  324. package/src/date/datepicker/parts/DropdownCaption.tsx +3 -3
  325. package/src/date/datepicker/parts/WeekNumber.tsx +34 -15
  326. package/src/date/datepicker/parts/WeekRow.tsx +2 -3
  327. package/src/date/datepicker/types.ts +8 -0
  328. package/src/date/monthpicker/MonthCaption.tsx +2 -4
  329. package/src/date/monthpicker/MonthPicker.tsx +67 -54
  330. package/src/date/monthpicker/MonthPickerStandalone.tsx +39 -26
  331. package/src/date/monthpicker/types.ts +8 -0
  332. package/src/date/parts/DateInput.tsx +2 -3
  333. package/src/date/parts/DateWrapper.tsx +6 -4
  334. package/src/date/utils/index.ts +5 -1
  335. package/src/date/utils/locale.ts +17 -1
  336. package/src/form/combobox/ComboboxWrapper.tsx +6 -6
  337. package/src/form/combobox/FilteredOptions/AddNewOption.tsx +3 -1
  338. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +4 -4
  339. package/src/form/combobox/FilteredOptions/FilteredOptionsItem.tsx +1 -1
  340. package/src/form/combobox/FilteredOptions/LoadingMessage.tsx +3 -1
  341. package/src/form/combobox/FilteredOptions/MaxSelectedMessage.tsx +6 -6
  342. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +4 -4
  343. package/src/form/combobox/Input/Input.context.tsx +3 -3
  344. package/src/form/combobox/Input/Input.tsx +1 -1
  345. package/src/form/combobox/Input/InputController.tsx +5 -27
  346. package/src/form/combobox/Input/ToggleListButton.tsx +8 -24
  347. package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +17 -11
  348. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +10 -7
  349. package/src/form/combobox/__tests__/combobox.test.tsx +2 -1
  350. package/src/form/combobox/types.ts +11 -24
  351. package/src/form/form-summary/FormSummaryEditLink.tsx +7 -6
  352. package/src/form/search/Search.tsx +35 -13
  353. package/src/form/textarea/Textarea.tsx +1 -0
  354. package/src/guide-panel/GuidePanel.tsx +59 -15
  355. package/src/guide-panel/Illustration.darkside.tsx +96 -0
  356. package/src/guide-panel/Illustration.tsx +5 -22
  357. package/src/guide-panel/index.ts +0 -1
  358. package/src/help-text/HelpText.tsx +8 -6
  359. package/src/index.ts +1 -5
  360. package/src/internal-header/InternalHeaderButton.tsx +1 -1
  361. package/src/internal-header/InternalHeaderUserButton.tsx +2 -2
  362. package/src/layout/base/BasePrimitive.tsx +29 -25
  363. package/src/layout/bleed/Bleed.tsx +8 -0
  364. package/src/layout/box/Box.darkside.tsx +154 -0
  365. package/src/layout/box/Box.tsx +90 -61
  366. package/src/layout/box/index.ts +3 -0
  367. package/src/layout/grid/HGrid.tsx +7 -3
  368. package/src/layout/page/Page.tsx +10 -0
  369. package/src/layout/stack/Stack.tsx +8 -4
  370. package/src/layout/utilities/css.ts +18 -12
  371. package/src/layout/utilities/types.ts +24 -0
  372. package/src/modal/Modal.tsx +2 -2
  373. package/src/modal/ModalHeader.tsx +1 -1
  374. package/src/popover/Popover.tsx +2 -2
  375. package/src/provider/Provider.tsx +56 -13
  376. package/src/table/ExpandableRow.tsx +10 -3
  377. package/src/timeline/Timeline.tsx +1 -0
  378. package/src/util/i18n/i18n.context.test.tsx +29 -8
  379. package/src/util/i18n/i18n.context.ts +15 -14
  380. package/src/util/i18n/locales/en.ts +52 -37
  381. package/src/util/i18n/locales/index.ts +4 -0
  382. package/src/util/i18n/locales/nb.ts +56 -39
  383. package/src/util/i18n/locales/nn.ts +52 -37
  384. package/cjs/provider/i18n/LanguageProvider.d.ts +0 -26
  385. package/cjs/provider/i18n/LanguageProvider.js +0 -54
  386. package/cjs/provider/i18n/LanguageProvider.js.map +0 -1
  387. package/esm/provider/i18n/LanguageProvider.d.ts +0 -26
  388. package/esm/provider/i18n/LanguageProvider.js +0 -23
  389. package/esm/provider/i18n/LanguageProvider.js.map +0 -1
  390. package/src/provider/i18n/LanguageProvider.tsx +0 -49
@@ -16,7 +16,7 @@ export const getLocaleFromString = (locale: "nb" | "nn" | "en" = "nb") => {
16
16
 
17
17
  /**
18
18
  * @private
19
- * Temporary for backwards compatibility with locale prop
19
+ * Temporary for backwards compatibility with locale prop. Can be removed when locale prop has been removed.
20
20
  */
21
21
  export const getTranslations = (locale: string | undefined) => {
22
22
  switch (locale) {
@@ -29,3 +29,19 @@ export const getTranslations = (locale: string | undefined) => {
29
29
  return undefined;
30
30
  }
31
31
  };
32
+
33
+ /**
34
+ * @private
35
+ * Temporary for backwards compatibility with locale prop. Can be removed when locale prop has been removed.
36
+ */
37
+ export const getGlobalTranslations = (locale: string | undefined) => {
38
+ switch (locale) {
39
+ case "nn":
40
+ return nn_translations.global;
41
+ case "en":
42
+ case "en-GB":
43
+ return en_translations.global;
44
+ default:
45
+ return undefined;
46
+ }
47
+ };
@@ -27,21 +27,21 @@ const ComboboxWrapper = ({
27
27
  const wrapperRef = useRef<HTMLDivElement | null>(null);
28
28
  const [hasFocusWithin, setHasFocusWithin] = useState(false);
29
29
 
30
- function onFocusInsideWrapper(e) {
30
+ function onFocusInsideWrapper(event: React.FocusEvent<HTMLDivElement>) {
31
31
  if (
32
- !wrapperRef.current?.contains(e.relatedTarget) &&
33
- toggleOpenButtonRef?.current !== e.target
32
+ !wrapperRef.current?.contains(event.relatedTarget) &&
33
+ toggleOpenButtonRef?.current !== event.target
34
34
  ) {
35
35
  toggleIsListOpen(true);
36
36
  setHasFocusWithin(true);
37
37
  }
38
38
  }
39
39
 
40
- function onBlurWrapper(e) {
41
- if (!wrapperRef.current?.contains(e.relatedTarget)) {
40
+ function onBlurWrapper(event: React.FocusEvent<HTMLDivElement>) {
41
+ if (!wrapperRef.current?.contains(event.relatedTarget)) {
42
42
  toggleIsListOpen(false);
43
43
  setHasFocusWithin(false);
44
- clearInput(e);
44
+ clearInput(event);
45
45
  }
46
46
  }
47
47
 
@@ -2,6 +2,7 @@ import cl from "clsx";
2
2
  import React from "react";
3
3
  import { PlusIcon } from "@navikt/aksel-icons";
4
4
  import { BodyShort, Label } from "../../../typography";
5
+ import { useI18n } from "../../../util/i18n/i18n.context";
5
6
  import { useInputContext } from "../Input/Input.context";
6
7
  import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
7
8
  import { isInList, toComboboxOption } from "../combobox-utils";
@@ -22,6 +23,7 @@ const AddNewOption = () => {
22
23
  } = useFilteredOptionsContext();
23
24
  const { isMultiSelect, selectedOptions, toggleOption } =
24
25
  useSelectedOptionsContext();
26
+ const translate = useI18n("Combobox");
25
27
  return (
26
28
  <li
27
29
  tabIndex={-1}
@@ -51,7 +53,7 @@ const AddNewOption = () => {
51
53
  >
52
54
  <PlusIcon aria-hidden />
53
55
  <BodyShort size={size}>
54
- Legg til{" "}
56
+ {translate("addOption")}{" "}
55
57
  <Label as="span" size={size}>
56
58
  &#8220;{searchTerm}&#8221;
57
59
  </Label>
@@ -26,12 +26,12 @@ const FilteredOptions = () => {
26
26
  const { maxSelected } = useSelectedOptionsContext();
27
27
 
28
28
  const shouldRenderNonSelectables =
29
- maxSelected?.isLimitReached || // Render maxSelected message
29
+ maxSelected.isLimitReached || // Render maxSelected message
30
30
  isLoading || // Render loading message
31
31
  (!isLoading && filteredOptions.length === 0 && !allowNewValues); // Render no hits message
32
32
 
33
33
  const shouldRenderFilteredOptionsList =
34
- (allowNewValues && isValueNew && !maxSelected?.isLimitReached) || // Render add new option
34
+ (allowNewValues && isValueNew && !maxSelected.isLimitReached) || // Render add new option
35
35
  filteredOptions.length > 0; // Render filtered options
36
36
 
37
37
  return (
@@ -45,7 +45,7 @@ const FilteredOptions = () => {
45
45
  >
46
46
  {shouldRenderNonSelectables && (
47
47
  <div className="navds-combobox__list_non-selectables" role="status">
48
- {maxSelected?.isLimitReached && <MaxSelectedMessage />}
48
+ {maxSelected.isLimitReached && <MaxSelectedMessage />}
49
49
  {isLoading && <LoadingMessage />}
50
50
  {!isLoading && filteredOptions.length === 0 && !allowNewValues && (
51
51
  <NoSearchHitsMessage />
@@ -60,7 +60,7 @@ const FilteredOptions = () => {
60
60
  role="listbox"
61
61
  className="navds-combobox__list-options"
62
62
  >
63
- {isValueNew && !maxSelected?.isLimitReached && allowNewValues && (
63
+ {isValueNew && !maxSelected.isLimitReached && allowNewValues && (
64
64
  <AddNewOption />
65
65
  )}
66
66
  {filteredOptions.map((option) => (
@@ -39,7 +39,7 @@ const FilteredOptionsItem = ({ option }: { option: ComboboxOption }) => {
39
39
  const [start, highlight, end] = useTextHighlight(option.label, searchTerm);
40
40
 
41
41
  const isDisabled = (_option: ComboboxOption) =>
42
- maxSelected?.isLimitReached && !isInList(_option.value, selectedOptions);
42
+ maxSelected.isLimitReached && !isInList(_option.value, selectedOptions);
43
43
 
44
44
  return (
45
45
  <li
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { Loader } from "../../../loader";
3
+ import { useI18n } from "../../../util/i18n/i18n.context";
3
4
  import { useInputContext } from "../Input/Input.context";
4
5
  import filteredOptionsUtil from "./filtered-options-util";
5
6
 
@@ -7,12 +8,13 @@ const LoadingMessage = () => {
7
8
  const {
8
9
  inputProps: { id },
9
10
  } = useInputContext();
11
+ const translate = useI18n("Combobox");
10
12
  return (
11
13
  <div
12
14
  className="navds-combobox__list-item--loading"
13
15
  id={filteredOptionsUtil.getIsLoadingId(id)}
14
16
  >
15
- <Loader title="Søker..." />
17
+ <Loader title={translate("loading")} />
16
18
  </div>
17
19
  );
18
20
  };
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { useI18n } from "../../../util/i18n/i18n.context";
2
3
  import { useInputContext } from "../Input/Input.context";
3
4
  import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
4
5
  import filteredOptionsUtil from "./filtered-options-util";
@@ -8,18 +9,17 @@ const MaxSelectedMessage = () => {
8
9
  inputProps: { id },
9
10
  } = useInputContext();
10
11
  const { maxSelected, selectedOptions } = useSelectedOptionsContext();
11
-
12
- if (!maxSelected) {
13
- return null;
14
- }
12
+ const translate = useI18n("Combobox");
15
13
 
16
14
  return (
17
15
  <div
18
16
  className="navds-combobox__list-item--max-selected"
19
17
  id={filteredOptionsUtil.getMaxSelectedOptionsId(id)}
20
18
  >
21
- {maxSelected.message ??
22
- `${selectedOptions.length} av ${maxSelected.limit} er valgt.`}
19
+ {translate("maxSelected", {
20
+ selected: selectedOptions.length,
21
+ limit: maxSelected.limit || 0,
22
+ })}
23
23
  </div>
24
24
  );
25
25
  };
@@ -142,13 +142,13 @@ const FilteredOptionsProvider = ({
142
142
  }
143
143
  virtualFocus.resetFocus();
144
144
  if (newState ?? !isInternalListOpen) {
145
- setHideCaret(!!maxSelected?.isLimitReached);
145
+ setHideCaret(maxSelected.isLimitReached);
146
146
  }
147
147
  setInternalListOpen((oldState) => newState ?? !oldState);
148
148
  },
149
149
  [
150
150
  virtualFocus,
151
- maxSelected?.isLimitReached,
151
+ maxSelected.isLimitReached,
152
152
  isInternalListOpen,
153
153
  setHideCaret,
154
154
  disabled,
@@ -178,7 +178,7 @@ const FilteredOptionsProvider = ({
178
178
  }
179
179
  }
180
180
  const maybeMaxSelectedOptionsId =
181
- maxSelected?.isLimitReached &&
181
+ maxSelected.isLimitReached &&
182
182
  filteredOptionsUtils.getMaxSelectedOptionsId(id);
183
183
 
184
184
  return (
@@ -188,7 +188,7 @@ const FilteredOptionsProvider = ({
188
188
  }, [
189
189
  isListOpen,
190
190
  isLoading,
191
- maxSelected?.isLimitReached,
191
+ maxSelected.isLimitReached,
192
192
  value,
193
193
  partialAriaDescribedBy,
194
194
  shouldAutocomplete,
@@ -15,7 +15,7 @@ interface InputContextValue extends FormFieldType {
15
15
  searchTerm: string;
16
16
  setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
17
17
  shouldAutocomplete?: boolean;
18
- toggleOpenButtonRef: React.RefObject<HTMLButtonElement>;
18
+ toggleOpenButtonRef: React.RefObject<HTMLDivElement>;
19
19
  hideCaret: boolean;
20
20
  setHideCaret: React.Dispatch<React.SetStateAction<boolean>>;
21
21
  }
@@ -72,7 +72,7 @@ const InputProvider = ({ children, value: props }: Props) => {
72
72
  "comboboxfield",
73
73
  );
74
74
  const inputRef = useRef<HTMLInputElement | null>(null);
75
- const toggleOpenButtonRef = useRef<HTMLButtonElement>(null);
75
+ const toggleOpenButtonRef = useRef<HTMLDivElement>(null);
76
76
  const [internalValue, setInternalValue] = useState<string>(defaultValue);
77
77
  const [hideCaret, setHideCaret] = useState(false);
78
78
 
@@ -93,7 +93,7 @@ const InputProvider = ({ children, value: props }: Props) => {
93
93
  );
94
94
 
95
95
  const clearInput = useCallback(
96
- (event: React.PointerEvent | React.KeyboardEvent | React.MouseEvent) => {
96
+ (event: React.PointerEvent | React.KeyboardEvent | React.FocusEvent) => {
97
97
  onClear?.(event);
98
98
  externalOnChange?.("");
99
99
  setInternalValue("");
@@ -279,7 +279,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
279
279
  value={value}
280
280
  onBlur={composeEventHandlers(onBlur, virtualFocus.resetFocus)}
281
281
  onClick={() => {
282
- setHideCaret(!!maxSelected?.isLimitReached);
282
+ setHideCaret(maxSelected.isLimitReached);
283
283
  value !== searchTerm && onChange(value);
284
284
  }}
285
285
  onInput={onChangeHandler}
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable jsx-a11y/no-static-element-interactions */
2
2
  import cl from "clsx";
3
3
  import React, { forwardRef } from "react";
4
- import { XMarkIcon } from "@navikt/aksel-icons";
5
4
  import { useMergeRefs } from "../../../util/hooks";
6
5
  import { useFilteredOptionsContext } from "../FilteredOptions/filteredOptionsContext";
7
6
  import SelectedOptions from "../SelectedOptions/SelectedOptions";
@@ -11,7 +10,6 @@ import Input from "./Input";
11
10
  import { useInputContext } from "./Input.context";
12
11
  import ToggleListButton from "./ToggleListButton";
13
12
 
14
- /* eslint-disable jsx-a11y/click-events-have-key-events */
15
13
  export const InputController = forwardRef<
16
14
  HTMLInputElement,
17
15
  Omit<
@@ -28,20 +26,19 @@ export const InputController = forwardRef<
28
26
  >
29
27
  >((props, ref) => {
30
28
  const {
31
- clearButton = true,
29
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Remove when prop has been removed from ComboboxProps.
30
+ clearButton,
31
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Remove when prop has been removed from ComboboxProps.
32
32
  clearButtonLabel,
33
33
  toggleListButton = true,
34
- toggleListButtonLabel,
35
34
  inputClassName,
36
35
  shouldShowSelectedOptions = true,
37
36
  ...rest
38
37
  } = props;
39
38
 
40
39
  const {
41
- clearInput,
42
40
  focusInput,
43
41
  inputProps,
44
- value,
45
42
  size = "medium",
46
43
  inputRef,
47
44
  toggleOpenButtonRef,
@@ -54,6 +51,7 @@ export const InputController = forwardRef<
54
51
  const mergedInputRef = useMergeRefs(inputRef, ref);
55
52
 
56
53
  return (
54
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events
57
55
  <div
58
56
  className={cl("navds-combobox__wrapper-inner navds-text-field__input", {
59
57
  "navds-combobox__wrapper-inner--virtually-unfocused":
@@ -81,27 +79,7 @@ export const InputController = forwardRef<
81
79
  />
82
80
  </SelectedOptions>
83
81
  )}
84
- <div>
85
- {value && clearButton && (
86
- <button
87
- type="button"
88
- onClick={clearInput}
89
- className="navds-combobox__button-clear"
90
- tabIndex={-1}
91
- >
92
- <span className="navds-sr-only">
93
- {clearButtonLabel ? clearButtonLabel : "Tøm"}
94
- </span>
95
- <XMarkIcon aria-hidden />
96
- </button>
97
- )}
98
- {toggleListButton && (
99
- <ToggleListButton
100
- toggleListButtonLabel={toggleListButtonLabel}
101
- ref={toggleOpenButtonRef}
102
- />
103
- )}
104
- </div>
82
+ {toggleListButton && <ToggleListButton ref={toggleOpenButtonRef} />}
105
83
  </div>
106
84
  );
107
85
  });
@@ -3,38 +3,22 @@ import { ChevronDownIcon, ChevronUpIcon } from "@navikt/aksel-icons";
3
3
  import { useFilteredOptionsContext } from "../FilteredOptions/filteredOptionsContext";
4
4
  import { useInputContext } from "./Input.context";
5
5
 
6
- interface ToggleListButtonProps {
7
- toggleListButtonLabel?: string;
8
- }
9
-
10
- export const ToggleListButton = forwardRef<
11
- HTMLButtonElement,
12
- ToggleListButtonProps
13
- >(({ toggleListButtonLabel }, ref) => {
6
+ export const ToggleListButton = forwardRef<HTMLDivElement>((_, ref) => {
14
7
  const { isListOpen, toggleIsListOpen } = useFilteredOptionsContext();
15
8
  const { focusInput } = useInputContext();
9
+
16
10
  return (
17
- <button
18
- type="button"
19
- onPointerUp={() => {
11
+ <div
12
+ ref={ref}
13
+ onClick={() => {
20
14
  toggleIsListOpen();
21
15
  focusInput();
22
16
  }}
23
- onKeyDown={({ key }) => key === "Enter" && toggleIsListOpen()}
24
17
  className="navds-combobox__button-toggle-list"
25
- aria-expanded={isListOpen}
26
- tabIndex={-1}
27
- ref={ref}
18
+ aria-hidden
28
19
  >
29
- <span className="navds-sr-only">
30
- {toggleListButtonLabel ?? "Alternativer"}
31
- </span>
32
- {isListOpen ? (
33
- <ChevronUpIcon aria-hidden />
34
- ) : (
35
- <ChevronDownIcon aria-hidden />
36
- )}
37
- </button>
20
+ {isListOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}
21
+ </div>
38
22
  );
39
23
  });
40
24
 
@@ -14,12 +14,6 @@ const Option = ({ option }: { option: ComboboxOption }) => {
14
14
  const { isMultiSelect, removeSelectedOption } = useSelectedOptionsContext();
15
15
  const { focusInput, readOnly, inputProps } = useInputContext();
16
16
 
17
- const onClick = (e) => {
18
- e.stopPropagation();
19
- removeSelectedOption(option);
20
- focusInput();
21
- };
22
-
23
17
  if (!isMultiSelect) {
24
18
  return (
25
19
  <div className="navds-combobox__selected-options--no-bg">
@@ -28,12 +22,24 @@ const Option = ({ option }: { option: ComboboxOption }) => {
28
22
  );
29
23
  }
30
24
 
31
- return readOnly || inputProps.disabled ? (
32
- <Chips.Toggle variant="neutral" checkmark={false} as="div">
25
+ if (readOnly || inputProps.disabled) {
26
+ return (
27
+ <Chips.Toggle variant="neutral" checkmark={false} as="div">
28
+ {option.label}
29
+ </Chips.Toggle>
30
+ );
31
+ }
32
+
33
+ return (
34
+ <Chips.Removable
35
+ onClick={(event) => {
36
+ event.stopPropagation();
37
+ removeSelectedOption(option);
38
+ focusInput();
39
+ }}
40
+ >
33
41
  {option.label}
34
- </Chips.Toggle>
35
- ) : (
36
- <Chips.Removable onClick={onClick}>{option.label}</Chips.Removable>
42
+ </Chips.Removable>
37
43
  );
38
44
  };
39
45
 
@@ -12,7 +12,7 @@ type SelectedOptionsContextValue = {
12
12
  removeSelectedOption: (option: ComboboxOption) => void;
13
13
  prevSelectedOptions?: ComboboxOption[];
14
14
  selectedOptions: ComboboxOption[];
15
- maxSelected?: ComboboxProps["maxSelected"] & { isLimitReached: boolean };
15
+ maxSelected: { limit: number | undefined; isLimitReached: boolean };
16
16
  setSelectedOptions: (any) => void;
17
17
  toggleOption: (
18
18
  option: ComboboxOption,
@@ -101,14 +101,17 @@ const SelectedOptionsProvider = ({
101
101
  [customOptions, onToggleSelected, removeCustomOption],
102
102
  );
103
103
 
104
+ const maxSelectedLimit =
105
+ typeof maxSelected === "object" ? maxSelected.limit : maxSelected;
104
106
  const isLimitReached =
105
- (!!maxSelected?.limit && selectedOptions.length >= maxSelected.limit) ||
106
- (!isMultiSelect && selectedOptions.length > 0);
107
+ !!maxSelectedLimit && selectedOptions.length >= maxSelectedLimit;
108
+ const newHideCaret =
109
+ isLimitReached || (!isMultiSelect && selectedOptions.length > 0);
107
110
 
108
111
  // biome-ignore lint/correctness/useExhaustiveDependencies: We explicitly want to run this effect when selectedOptions changes to match the view with the selected options.
109
112
  useEffect(() => {
110
- setHideCaret(isLimitReached);
111
- }, [isLimitReached, selectedOptions, setHideCaret]);
113
+ setHideCaret(newHideCaret);
114
+ }, [newHideCaret, selectedOptions, setHideCaret]);
112
115
 
113
116
  const toggleOption = useCallback(
114
117
  (
@@ -142,8 +145,8 @@ const SelectedOptionsProvider = ({
142
145
  selectedOptions,
143
146
  setSelectedOptions,
144
147
  toggleOption,
145
- maxSelected: maxSelected && {
146
- ...maxSelected,
148
+ maxSelected: {
149
+ limit: maxSelectedLimit,
147
150
  isLimitReached,
148
151
  },
149
152
  };
@@ -3,6 +3,7 @@ import { act, render, screen } from "@testing-library/react";
3
3
  import userEvent from "@testing-library/user-event";
4
4
  import React, { useId } from "react";
5
5
  import { describe, expect, test, vi } from "vitest";
6
+ import nb from "../../../util/i18n/locales/nb";
6
7
  import { ComboboxProps, UNSAFE_Combobox } from "../index";
7
8
 
8
9
  const options = [
@@ -73,7 +74,7 @@ describe("Render combobox", () => {
73
74
  test("Should show loading icon when loading (used for async search)", async () => {
74
75
  render(<App options={[]} isListOpen isLoading />);
75
76
 
76
- expect(await screen.findByText("Søker...")).toBeInTheDocument();
77
+ expect(await screen.findByText(nb.Combobox.loading)).toBeInTheDocument();
77
78
  });
78
79
 
79
80
  test("Should not select previous focused element when closes", async () => {
@@ -45,15 +45,11 @@ export interface ComboboxProps
45
45
  */
46
46
  allowNewValues?: boolean;
47
47
  /**
48
- * Adds a button to clear the input value when not empty.
49
- * NB: Will not clear selected values.
50
- * @default true
48
+ * @deprecated The clear button has been removed. This prop has no effect.
51
49
  */
52
50
  clearButton?: boolean;
53
51
  /**
54
- * Custom name for the clear button. Requires `clearButton` to be `true`.
55
- *
56
- * @default "Tøm"
52
+ * @deprecated The clear button has been removed. This prop has no effect.
57
53
  */
58
54
  clearButtonLabel?: string;
59
55
  /**
@@ -102,7 +98,7 @@ export interface ComboboxProps
102
98
  * @param event
103
99
  */
104
100
  onClear?: (
105
- event: React.PointerEvent | React.KeyboardEvent | React.MouseEvent,
101
+ event: React.PointerEvent | React.KeyboardEvent | React.FocusEvent,
106
102
  ) => void;
107
103
  /**
108
104
  * Callback function triggered whenever an option is selected or de-selected.
@@ -124,18 +120,15 @@ export interface ComboboxProps
124
120
  */
125
121
  selectedOptions?: string[] | ComboboxOption[];
126
122
  /**
127
- * Options for the maximum number of selected options.
123
+ * Maximum number of selected options.
124
+ * @example maxSelected={3}
128
125
  */
129
- maxSelected?: {
130
- /**
131
- * The limit for maximum selected options
132
- */
133
- limit: number;
134
- /**
135
- * Override the message to display when the limit for maximum selected options has been reached
136
- */
137
- message?: string;
138
- };
126
+ maxSelected?:
127
+ | {
128
+ /** @deprecated Provide a number instead of an object */
129
+ limit: number;
130
+ }
131
+ | number;
139
132
  /**
140
133
  * Set to `true` to enable inline autocomplete.
141
134
  *
@@ -154,12 +147,6 @@ export interface ComboboxProps
154
147
  * @default true
155
148
  */
156
149
  toggleListButton?: boolean;
157
- /**
158
- * Custom name for the toggle list-button. Requires "toggleListButton" to be `true`.
159
- *
160
- * @default "Alternativer"
161
- */
162
- toggleListButtonLabel?: string;
163
150
  /**
164
151
  * Set this to override the value of the input field.
165
152
  *
@@ -1,9 +1,9 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef } from "react";
3
3
  import { Link } from "../../link";
4
+ import { useI18n } from "../../util/i18n/i18n.context";
4
5
  import { OverridableComponent } from "../../util/types";
5
6
 
6
- // export type FormSummaryEditProps = Partial<LinkProps>;
7
7
  export interface FormSummaryEditProps
8
8
  extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
9
9
  /**
@@ -22,17 +22,18 @@ export interface FormSummaryEditProps
22
22
  export const FormSummaryEditLink: OverridableComponent<
23
23
  FormSummaryEditProps,
24
24
  HTMLAnchorElement
25
- > = forwardRef(
26
- ({ children = "Endre svar", className, as = "a", ...rest }, ref) => (
25
+ > = forwardRef(({ children, className, as = "a", ...rest }, ref) => {
26
+ const translate = useI18n("FormSummary");
27
+ return (
27
28
  <Link
28
29
  ref={ref}
29
30
  as={as}
30
31
  {...rest}
31
32
  className={cl("navds-form-summary__edit", className)}
32
33
  >
33
- {children}
34
+ {children || translate("editAnswer")}
34
35
  </Link>
35
- ),
36
- );
36
+ );
37
+ });
37
38
 
38
39
  export default FormSummaryEditLink;
@@ -6,6 +6,8 @@ import React, {
6
6
  useState,
7
7
  } from "react";
8
8
  import { MagnifyingGlassIcon, XMarkIcon } from "@navikt/aksel-icons";
9
+ import { Button } from "../../button";
10
+ import { UNSAFE_useAkselTheme } from "../../provider";
9
11
  import { BodyShort, ErrorMessage, Label } from "../../typography";
10
12
  import { omit } from "../../util";
11
13
  import { useMergeRefs } from "../../util/hooks/useMergeRefs";
@@ -50,7 +52,8 @@ export interface SearchProps
50
52
  onSearchClick?: (value: string) => void;
51
53
  /**
52
54
  * Sets the `aria-label` for the clear button.
53
- * @default "Tøm"
55
+ * @default "Tøm feltet"
56
+ * @deprecated Use `<Provider />`-component
54
57
  */
55
58
  clearButtonLabel?: string;
56
59
  /**
@@ -122,6 +125,8 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
122
125
  ...rest
123
126
  } = props;
124
127
 
128
+ const themeContext = UNSAFE_useAkselTheme(false);
129
+
125
130
  const searchRef = useRef<HTMLInputElement | null>(null);
126
131
  const mergedRef = useMergeRefs(searchRef, ref);
127
132
  const translate = useI18n("Search");
@@ -142,6 +147,34 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
142
147
  onSearchClick?.(`${value ?? internalValue}`);
143
148
  };
144
149
 
150
+ const showClearButton =
151
+ clearButton && !inputProps.disabled && (value ?? internalValue);
152
+
153
+ const ClearButton = () =>
154
+ themeContext ? (
155
+ <Button
156
+ className="navds-search__button-clear"
157
+ variant="tertiary-neutral"
158
+ size={size === "medium" ? "small" : "xsmall"}
159
+ icon={<XMarkIcon aria-hidden />}
160
+ title={clearButtonLabel || translate("clear")}
161
+ hidden={!showClearButton}
162
+ onClick={(event) => handleClear({ trigger: "Click", event })}
163
+ />
164
+ ) : (
165
+ <button
166
+ type="button"
167
+ onClick={(event) => handleClear({ trigger: "Click", event })}
168
+ className="navds-search__button-clear"
169
+ hidden={!showClearButton}
170
+ >
171
+ <span className="navds-sr-only">
172
+ {clearButtonLabel || translate("clear")}
173
+ </span>
174
+ <XMarkIcon aria-hidden />
175
+ </button>
176
+ );
177
+
145
178
  return (
146
179
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
147
180
  <div
@@ -210,18 +243,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
210
243
  )}
211
244
  {...(htmlSize ? { size: Number(htmlSize) } : {})}
212
245
  />
213
- {(value ?? internalValue) && clearButton && (
214
- <button
215
- type="button"
216
- onClick={(event) => handleClear({ trigger: "Click", event })}
217
- className="navds-search__button-clear"
218
- >
219
- <span className="navds-sr-only">
220
- {clearButtonLabel || translate("clear")}
221
- </span>
222
- <XMarkIcon aria-hidden />
223
- </button>
224
- )}
246
+ <ClearButton />
225
247
  </div>
226
248
  <SearchContext.Provider
227
249
  value={{
@@ -54,6 +54,7 @@ export interface TextareaProps
54
54
  UNSAFE_autoScrollbar?: boolean;
55
55
  /**
56
56
  * i18n-translations for counter-text
57
+ * @deprecated Use `<Provider />`-component
57
58
  */
58
59
  i18n?: {
59
60
  /** @default tegn igjen */