@navikt/ds-react 7.7.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 (278) 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/date/context/index.d.ts +2 -1
  5. package/cjs/date/context/index.js +5 -2
  6. package/cjs/date/context/index.js.map +1 -1
  7. package/cjs/date/context/useDateInputContext.d.ts +3 -3
  8. package/cjs/date/context/useDateInputContext.js +4 -4
  9. package/cjs/date/context/useDateInputContext.js.map +1 -1
  10. package/cjs/date/context/useDateTranslationContext.d.ts +8 -0
  11. package/cjs/date/context/useDateTranslationContext.js +7 -0
  12. package/cjs/date/context/useDateTranslationContext.js.map +1 -0
  13. package/cjs/date/datepicker/DatePicker.js +18 -16
  14. package/cjs/date/datepicker/DatePicker.js.map +1 -1
  15. package/cjs/date/datepicker/DatePickerStandalone.js +17 -14
  16. package/cjs/date/datepicker/DatePickerStandalone.js.map +1 -1
  17. package/cjs/date/datepicker/parts/Caption.js +2 -3
  18. package/cjs/date/datepicker/parts/Caption.js.map +1 -1
  19. package/cjs/date/datepicker/parts/DropdownCaption.js +2 -2
  20. package/cjs/date/datepicker/parts/DropdownCaption.js.map +1 -1
  21. package/cjs/date/datepicker/parts/WeekNumber.js +3 -4
  22. package/cjs/date/datepicker/parts/WeekNumber.js.map +1 -1
  23. package/cjs/date/datepicker/parts/WeekRow.js +2 -3
  24. package/cjs/date/datepicker/parts/WeekRow.js.map +1 -1
  25. package/cjs/date/datepicker/types.d.ts +8 -0
  26. package/cjs/date/monthpicker/MonthCaption.js +1 -3
  27. package/cjs/date/monthpicker/MonthCaption.js.map +1 -1
  28. package/cjs/date/monthpicker/MonthPicker.js +30 -28
  29. package/cjs/date/monthpicker/MonthPicker.js.map +1 -1
  30. package/cjs/date/monthpicker/MonthPickerStandalone.js +16 -12
  31. package/cjs/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  32. package/cjs/date/monthpicker/types.d.ts +8 -0
  33. package/cjs/date/parts/DateInput.js +1 -2
  34. package/cjs/date/parts/DateInput.js.map +1 -1
  35. package/cjs/date/parts/DateWrapper.d.ts +3 -1
  36. package/cjs/date/parts/DateWrapper.js +3 -3
  37. package/cjs/date/parts/DateWrapper.js.map +1 -1
  38. package/cjs/date/utils/index.d.ts +1 -1
  39. package/cjs/date/utils/index.js +2 -1
  40. package/cjs/date/utils/index.js.map +1 -1
  41. package/cjs/date/utils/locale.d.ts +12 -2
  42. package/cjs/date/utils/locale.js +18 -2
  43. package/cjs/date/utils/locale.js.map +1 -1
  44. package/cjs/form/combobox/Combobox.d.ts +1 -1
  45. package/cjs/form/combobox/ComboboxWrapper.js +6 -6
  46. package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
  47. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  48. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  49. package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
  50. package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
  51. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
  52. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js +2 -5
  53. package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
  54. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  55. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  56. package/cjs/form/combobox/Input/Input.js +1 -1
  57. package/cjs/form/combobox/Input/Input.js.map +1 -1
  58. package/cjs/form/combobox/Input/InputController.d.ts +1 -1
  59. package/cjs/form/combobox/Input/InputController.js +7 -9
  60. package/cjs/form/combobox/Input/InputController.js.map +1 -1
  61. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
  62. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
  63. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  64. package/cjs/form/combobox/types.d.ts +7 -17
  65. package/cjs/form/search/Search.d.ts +2 -1
  66. package/cjs/form/search/Search.js.map +1 -1
  67. package/cjs/form/textarea/Textarea.d.ts +1 -0
  68. package/cjs/form/textarea/Textarea.js.map +1 -1
  69. package/cjs/guide-panel/GuidePanel.js +11 -3
  70. package/cjs/guide-panel/GuidePanel.js.map +1 -1
  71. package/cjs/guide-panel/Illustration.d.ts +2 -8
  72. package/cjs/guide-panel/Illustration.darkside.d.ts +2 -0
  73. package/cjs/guide-panel/Illustration.darkside.js +30 -0
  74. package/cjs/guide-panel/Illustration.darkside.js.map +1 -0
  75. package/cjs/guide-panel/Illustration.js +2 -18
  76. package/cjs/guide-panel/Illustration.js.map +1 -1
  77. package/cjs/guide-panel/index.d.ts +0 -1
  78. package/cjs/guide-panel/index.js +1 -3
  79. package/cjs/guide-panel/index.js.map +1 -1
  80. package/cjs/index.d.ts +1 -1
  81. package/cjs/index.js +2 -3
  82. package/cjs/index.js.map +1 -1
  83. package/cjs/modal/Modal.js +1 -1
  84. package/cjs/modal/Modal.js.map +1 -1
  85. package/cjs/modal/ModalHeader.js +1 -1
  86. package/cjs/modal/ModalHeader.js.map +1 -1
  87. package/cjs/popover/Popover.js +1 -1
  88. package/cjs/popover/Popover.js.map +1 -1
  89. package/cjs/provider/Provider.d.ts +35 -10
  90. package/cjs/provider/Provider.js +13 -14
  91. package/cjs/provider/Provider.js.map +1 -1
  92. package/cjs/table/ExpandableRow.js +3 -3
  93. package/cjs/table/ExpandableRow.js.map +1 -1
  94. package/cjs/tabs/Tabs.context.d.ts +1 -1
  95. package/cjs/timeline/Timeline.d.ts +1 -0
  96. package/cjs/timeline/Timeline.js.map +1 -1
  97. package/cjs/util/i18n/i18n.context.d.ts +1 -1
  98. package/cjs/util/i18n/i18n.context.js +15 -14
  99. package/cjs/util/i18n/i18n.context.js.map +1 -1
  100. package/cjs/util/i18n/locales/en.d.ts +50 -54
  101. package/cjs/util/i18n/locales/en.js +52 -56
  102. package/cjs/util/i18n/locales/en.js.map +1 -1
  103. package/cjs/util/i18n/locales/index.d.ts +3 -0
  104. package/cjs/util/i18n/locales/index.js +14 -0
  105. package/cjs/util/i18n/locales/index.js.map +1 -0
  106. package/cjs/util/i18n/locales/nb.d.ts +53 -57
  107. package/cjs/util/i18n/locales/nb.js +56 -60
  108. package/cjs/util/i18n/locales/nb.js.map +1 -1
  109. package/cjs/util/i18n/locales/nn.d.ts +50 -54
  110. package/cjs/util/i18n/locales/nn.js +52 -56
  111. package/cjs/util/i18n/locales/nn.js.map +1 -1
  112. package/esm/chips/Removable.d.ts +0 -5
  113. package/esm/chips/Removable.js +2 -2
  114. package/esm/chips/Removable.js.map +1 -1
  115. package/esm/date/context/index.d.ts +2 -1
  116. package/esm/date/context/index.js +2 -1
  117. package/esm/date/context/index.js.map +1 -1
  118. package/esm/date/context/useDateInputContext.d.ts +3 -3
  119. package/esm/date/context/useDateInputContext.js +3 -3
  120. package/esm/date/context/useDateInputContext.js.map +1 -1
  121. package/esm/date/context/useDateTranslationContext.d.ts +8 -0
  122. package/esm/date/context/useDateTranslationContext.js +3 -0
  123. package/esm/date/context/useDateTranslationContext.js.map +1 -0
  124. package/esm/date/datepicker/DatePicker.js +21 -19
  125. package/esm/date/datepicker/DatePicker.js.map +1 -1
  126. package/esm/date/datepicker/DatePickerStandalone.js +19 -16
  127. package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
  128. package/esm/date/datepicker/parts/Caption.js +2 -3
  129. package/esm/date/datepicker/parts/Caption.js.map +1 -1
  130. package/esm/date/datepicker/parts/DropdownCaption.js +3 -3
  131. package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -1
  132. package/esm/date/datepicker/parts/WeekNumber.js +3 -4
  133. package/esm/date/datepicker/parts/WeekNumber.js.map +1 -1
  134. package/esm/date/datepicker/parts/WeekRow.js +2 -3
  135. package/esm/date/datepicker/parts/WeekRow.js.map +1 -1
  136. package/esm/date/datepicker/types.d.ts +8 -0
  137. package/esm/date/monthpicker/MonthCaption.js +2 -4
  138. package/esm/date/monthpicker/MonthCaption.js.map +1 -1
  139. package/esm/date/monthpicker/MonthPicker.js +33 -31
  140. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  141. package/esm/date/monthpicker/MonthPickerStandalone.js +18 -14
  142. package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -1
  143. package/esm/date/monthpicker/types.d.ts +8 -0
  144. package/esm/date/parts/DateInput.js +2 -3
  145. package/esm/date/parts/DateInput.js.map +1 -1
  146. package/esm/date/parts/DateWrapper.d.ts +3 -1
  147. package/esm/date/parts/DateWrapper.js +4 -4
  148. package/esm/date/parts/DateWrapper.js.map +1 -1
  149. package/esm/date/utils/index.d.ts +1 -1
  150. package/esm/date/utils/index.js +1 -1
  151. package/esm/date/utils/index.js.map +1 -1
  152. package/esm/date/utils/locale.d.ts +12 -2
  153. package/esm/date/utils/locale.js +16 -1
  154. package/esm/date/utils/locale.js.map +1 -1
  155. package/esm/form/combobox/Combobox.d.ts +1 -1
  156. package/esm/form/combobox/ComboboxWrapper.js +6 -6
  157. package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
  158. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
  159. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  160. package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
  161. package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
  162. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
  163. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js +2 -5
  164. package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
  165. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
  166. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  167. package/esm/form/combobox/Input/Input.js +1 -1
  168. package/esm/form/combobox/Input/Input.js.map +1 -1
  169. package/esm/form/combobox/Input/InputController.d.ts +1 -1
  170. package/esm/form/combobox/Input/InputController.js +7 -9
  171. package/esm/form/combobox/Input/InputController.js.map +1 -1
  172. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
  173. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
  174. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  175. package/esm/form/combobox/types.d.ts +7 -17
  176. package/esm/form/search/Search.d.ts +2 -1
  177. package/esm/form/search/Search.js.map +1 -1
  178. package/esm/form/textarea/Textarea.d.ts +1 -0
  179. package/esm/form/textarea/Textarea.js.map +1 -1
  180. package/esm/guide-panel/GuidePanel.js +11 -3
  181. package/esm/guide-panel/GuidePanel.js.map +1 -1
  182. package/esm/guide-panel/Illustration.d.ts +2 -8
  183. package/esm/guide-panel/Illustration.darkside.d.ts +2 -0
  184. package/esm/guide-panel/Illustration.darkside.js +23 -0
  185. package/esm/guide-panel/Illustration.darkside.js.map +1 -0
  186. package/esm/guide-panel/Illustration.js +2 -18
  187. package/esm/guide-panel/Illustration.js.map +1 -1
  188. package/esm/guide-panel/index.d.ts +0 -1
  189. package/esm/guide-panel/index.js +0 -1
  190. package/esm/guide-panel/index.js.map +1 -1
  191. package/esm/index.d.ts +1 -1
  192. package/esm/index.js +1 -1
  193. package/esm/index.js.map +1 -1
  194. package/esm/modal/Modal.js +2 -2
  195. package/esm/modal/Modal.js.map +1 -1
  196. package/esm/modal/ModalHeader.js +1 -1
  197. package/esm/modal/ModalHeader.js.map +1 -1
  198. package/esm/popover/Popover.js +2 -2
  199. package/esm/popover/Popover.js.map +1 -1
  200. package/esm/provider/Provider.d.ts +35 -10
  201. package/esm/provider/Provider.js +11 -15
  202. package/esm/provider/Provider.js.map +1 -1
  203. package/esm/table/ExpandableRow.js +3 -3
  204. package/esm/table/ExpandableRow.js.map +1 -1
  205. package/esm/tabs/Tabs.context.d.ts +1 -1
  206. package/esm/timeline/Timeline.d.ts +1 -0
  207. package/esm/timeline/Timeline.js.map +1 -1
  208. package/esm/util/i18n/i18n.context.d.ts +1 -1
  209. package/esm/util/i18n/i18n.context.js +15 -14
  210. package/esm/util/i18n/i18n.context.js.map +1 -1
  211. package/esm/util/i18n/locales/en.d.ts +50 -54
  212. package/esm/util/i18n/locales/en.js +52 -56
  213. package/esm/util/i18n/locales/en.js.map +1 -1
  214. package/esm/util/i18n/locales/index.d.ts +3 -0
  215. package/esm/util/i18n/locales/index.js +5 -0
  216. package/esm/util/i18n/locales/index.js.map +1 -0
  217. package/esm/util/i18n/locales/nb.d.ts +53 -57
  218. package/esm/util/i18n/locales/nb.js +56 -60
  219. package/esm/util/i18n/locales/nb.js.map +1 -1
  220. package/esm/util/i18n/locales/nn.d.ts +50 -54
  221. package/esm/util/i18n/locales/nn.js +52 -56
  222. package/esm/util/i18n/locales/nn.js.map +1 -1
  223. package/package.json +13 -3
  224. package/src/chips/Removable.tsx +1 -9
  225. package/src/date/context/index.ts +5 -1
  226. package/src/date/context/useDateInputContext.tsx +6 -4
  227. package/src/date/context/useDateTranslationContext.ts +9 -0
  228. package/src/date/datepicker/DatePicker.tsx +41 -32
  229. package/src/date/datepicker/DatePickerStandalone.tsx +46 -37
  230. package/src/date/datepicker/parts/Caption.tsx +2 -3
  231. package/src/date/datepicker/parts/DropdownCaption.tsx +3 -3
  232. package/src/date/datepicker/parts/WeekNumber.tsx +3 -9
  233. package/src/date/datepicker/parts/WeekRow.tsx +2 -3
  234. package/src/date/datepicker/types.ts +8 -0
  235. package/src/date/monthpicker/MonthCaption.tsx +2 -4
  236. package/src/date/monthpicker/MonthPicker.tsx +67 -54
  237. package/src/date/monthpicker/MonthPickerStandalone.tsx +39 -26
  238. package/src/date/monthpicker/types.ts +8 -0
  239. package/src/date/parts/DateInput.tsx +2 -3
  240. package/src/date/parts/DateWrapper.tsx +6 -4
  241. package/src/date/utils/index.ts +5 -1
  242. package/src/date/utils/locale.ts +17 -1
  243. package/src/form/combobox/ComboboxWrapper.tsx +6 -6
  244. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +4 -4
  245. package/src/form/combobox/FilteredOptions/FilteredOptionsItem.tsx +1 -1
  246. package/src/form/combobox/FilteredOptions/MaxSelectedMessage.tsx +2 -9
  247. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +4 -4
  248. package/src/form/combobox/Input/Input.context.tsx +1 -1
  249. package/src/form/combobox/Input/Input.tsx +1 -1
  250. package/src/form/combobox/Input/InputController.tsx +4 -23
  251. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +10 -7
  252. package/src/form/combobox/types.ts +12 -20
  253. package/src/form/search/Search.tsx +2 -1
  254. package/src/form/textarea/Textarea.tsx +1 -0
  255. package/src/guide-panel/GuidePanel.tsx +59 -15
  256. package/src/guide-panel/Illustration.darkside.tsx +96 -0
  257. package/src/guide-panel/Illustration.tsx +2 -22
  258. package/src/guide-panel/index.ts +0 -1
  259. package/src/index.ts +1 -5
  260. package/src/modal/Modal.tsx +2 -2
  261. package/src/modal/ModalHeader.tsx +1 -1
  262. package/src/popover/Popover.tsx +2 -2
  263. package/src/provider/Provider.tsx +56 -13
  264. package/src/table/ExpandableRow.tsx +10 -3
  265. package/src/timeline/Timeline.tsx +1 -0
  266. package/src/util/i18n/i18n.context.test.tsx +29 -8
  267. package/src/util/i18n/i18n.context.ts +15 -14
  268. package/src/util/i18n/locales/en.ts +52 -56
  269. package/src/util/i18n/locales/index.ts +4 -0
  270. package/src/util/i18n/locales/nb.ts +56 -60
  271. package/src/util/i18n/locales/nn.ts +52 -56
  272. package/cjs/provider/i18n/LanguageProvider.d.ts +0 -26
  273. package/cjs/provider/i18n/LanguageProvider.js +0 -54
  274. package/cjs/provider/i18n/LanguageProvider.js.map +0 -1
  275. package/esm/provider/i18n/LanguageProvider.d.ts +0 -26
  276. package/esm/provider/i18n/LanguageProvider.js +0 -23
  277. package/esm/provider/i18n/LanguageProvider.js.map +0 -1
  278. package/src/provider/i18n/LanguageProvider.tsx +0 -49
@@ -4,8 +4,7 @@ import { Button as RDPButton, useDayPicker } from "react-day-picker";
4
4
  import { Button } from "../../../button";
5
5
  import { UNSAFE_useAkselTheme } from "../../../provider";
6
6
  import { Detail } from "../../../typography";
7
- import { useI18n } from "../../../util/i18n/i18n.context";
8
- import { getTranslations } from "../../utils";
7
+ import { useDateTranslationContext } from "../../context";
9
8
 
10
9
  export interface WeekNumberProps {
11
10
  /** The number of the week. */
@@ -21,14 +20,9 @@ function WeekNumber({
21
20
  number: weekNumber,
22
21
  dates,
23
22
  }: WeekNumberProps): JSX.Element {
24
- const {
25
- onWeekNumberClick,
26
- styles,
27
- classNames,
28
- locale: { code },
29
- } = useDayPicker();
23
+ const { onWeekNumberClick, styles, classNames } = useDayPicker();
30
24
  const themeContext = UNSAFE_useAkselTheme(false);
31
- const translate = useI18n("DatePicker", getTranslations(code));
25
+ const translate = useDateTranslationContext().translate;
32
26
 
33
27
  if (!onWeekNumberClick) {
34
28
  return (
@@ -3,14 +3,13 @@ import { useDayPicker } from "react-day-picker";
3
3
  import { Show } from "../../../layout/responsive";
4
4
  import { Detail } from "../../../typography";
5
5
  import { useId } from "../../../util/hooks";
6
- import { useI18n } from "../../../util/i18n/i18n.context";
7
- import { getTranslations } from "../../utils";
6
+ import { useDateTranslationContext } from "../../context";
8
7
  import { getMonthWeeks } from "../../utils/get-month-weeks";
9
8
  import WeekNumber from "./WeekNumber";
10
9
 
11
10
  const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
12
11
  const { locale, fixedWeeks, onWeekNumberClick } = useDayPicker();
13
- const translate = useI18n("DatePicker", getTranslations(locale.code));
12
+ const translate = useDateTranslationContext().translate;
14
13
  const labelId = useId();
15
14
 
16
15
  if (!onWeekNumberClick) {
@@ -1,4 +1,5 @@
1
1
  import { DateRange, DayPickerBase, Matcher } from "react-day-picker";
2
+ import { ComponentTranslation } from "../../util/i18n/i18n.types";
2
3
 
3
4
  export type SingleMode = {
4
5
  mode?: "single";
@@ -52,8 +53,15 @@ export interface DatePickerDefaultProps
52
53
  /**
53
54
  * Changes datepicker locale
54
55
  * @default "nb" (norsk bokmål)
56
+ * @deprecated Use `<Provider />`-component
55
57
  */
56
58
  locale?: "nb" | "nn" | "en";
59
+ /**
60
+ * i18n-API for customizing texts and labels.
61
+ *
62
+ * **NB: If you need to change the language, use [Provider](https://aksel.nav.no/komponenter/core/provider#84d7ea5ec517) instead.**
63
+ */
64
+ translations?: ComponentTranslation<"DatePicker">;
57
65
  /**
58
66
  * The earliest day to start navigation.
59
67
  */
@@ -10,9 +10,7 @@ import { useDayPicker } from "react-day-picker";
10
10
  import { ArrowLeftIcon, ArrowRightIcon } from "@navikt/aksel-icons";
11
11
  import { Button } from "../../button";
12
12
  import { Select } from "../../form/select";
13
- import { useI18n } from "../../util/i18n/i18n.context";
14
- import { useSharedMonthContext } from "../context";
15
- import { getTranslations } from "../utils";
13
+ import { useDateTranslationContext, useSharedMonthContext } from "../context";
16
14
 
17
15
  export const MonthCaption = () => {
18
16
  const {
@@ -22,7 +20,7 @@ export const MonthCaption = () => {
22
20
  locale,
23
21
  } = useDayPicker();
24
22
  const { hasDropdown, year, toYear } = useSharedMonthContext();
25
- const translate = useI18n("DatePicker", getTranslations(locale.code));
23
+ const translate = useDateTranslationContext().translate;
26
24
 
27
25
  const years: Date[] = [];
28
26
 
@@ -3,11 +3,15 @@ import React, { forwardRef, useState } from "react";
3
3
  import { DayPickerProvider } from "react-day-picker";
4
4
  import { useId } from "../../util/hooks";
5
5
  import { useMergeRefs } from "../../util/hooks/useMergeRefs";
6
- import { useDateLocale } from "../../util/i18n/i18n.context";
7
- import { DateContext, SharedMonthProvider } from "../context";
6
+ import { useDateLocale, useI18n } from "../../util/i18n/i18n.context";
7
+ import {
8
+ DateInputContext,
9
+ DateTranslationContextProvider,
10
+ SharedMonthProvider,
11
+ } from "../context";
8
12
  import { MonthPickerInput } from "../parts/DateInput";
9
13
  import { DateWrapper } from "../parts/DateWrapper";
10
- import { getLocaleFromString } from "../utils";
14
+ import { getLocaleFromString, getTranslations } from "../utils";
11
15
  import MonthCaption from "./MonthCaption";
12
16
  import MonthPickerStandalone from "./MonthPickerStandalone";
13
17
  import MonthSelector from "./MonthSelector";
@@ -69,6 +73,7 @@ export const MonthPicker = forwardRef<HTMLDivElement, MonthPickerProps>(
69
73
  onClose,
70
74
  onOpenToggle,
71
75
  locale,
76
+ translations,
72
77
  onMonthSelect,
73
78
  className,
74
79
  wrapperClassName,
@@ -79,6 +84,11 @@ export const MonthPicker = forwardRef<HTMLDivElement, MonthPickerProps>(
79
84
  },
80
85
  ref,
81
86
  ) => {
87
+ const translate = useI18n(
88
+ "DatePicker",
89
+ translations,
90
+ getTranslations(locale),
91
+ );
82
92
  const langProviderLocale = useDateLocale();
83
93
  const ariaId = useId(id);
84
94
  const [open, setOpen] = useState(_open ?? false);
@@ -103,61 +113,64 @@ export const MonthPicker = forwardRef<HTMLDivElement, MonthPickerProps>(
103
113
  }
104
114
 
105
115
  return (
106
- <DateContext.Provider
107
- value={{
108
- open: _open ?? open,
109
- onOpen: () => {
110
- setOpen((x) => !x);
111
- onOpenToggle?.();
112
- },
113
- ariaId,
114
- defined: true,
115
- }}
116
- >
117
- <div
118
- ref={mergedRef}
119
- className={cl("navds-date__wrapper", wrapperClassName)}
116
+ <DateTranslationContextProvider translate={translate}>
117
+ <DateInputContext.Provider
118
+ value={{
119
+ open: _open ?? open,
120
+ onOpen: () => {
121
+ setOpen((x) => !x);
122
+ onOpenToggle?.();
123
+ },
124
+ ariaId,
125
+ defined: true,
126
+ }}
120
127
  >
121
- {children}
122
- <DateWrapper
123
- open={_open ?? open}
124
- anchor={wrapperRef}
125
- onClose={() => onClose?.() ?? setOpen(false)}
126
- locale={locale}
127
- variant="month"
128
- popoverProps={{
129
- id: ariaId,
130
- strategy,
131
- }}
128
+ <div
129
+ ref={mergedRef}
130
+ className={cl("navds-date__wrapper", wrapperClassName)}
132
131
  >
133
- <DayPickerProvider
134
- initialProps={{
135
- locale: locale
136
- ? getLocaleFromString(locale)
137
- : langProviderLocale,
138
- selected: selected ?? selectedMonth,
139
- toDate,
140
- fromDate,
141
- month: selected ?? selectedMonth,
132
+ {children}
133
+ <DateWrapper
134
+ open={_open ?? open}
135
+ anchor={wrapperRef}
136
+ onClose={() => onClose?.() ?? setOpen(false)}
137
+ locale={locale}
138
+ translate={translate}
139
+ variant="month"
140
+ popoverProps={{
141
+ id: ariaId,
142
+ strategy,
142
143
  }}
143
144
  >
144
- <div className={cl("rdp-month", className)}>
145
- <SharedMonthProvider
146
- dropdownCaption={dropdownCaption}
147
- disabled={disabled}
148
- selected={selected ?? selectedMonth}
149
- onSelect={handleSelect}
150
- year={year}
151
- onYearChange={onYearChange}
152
- >
153
- <MonthCaption />
154
- <MonthSelector />
155
- </SharedMonthProvider>
156
- </div>
157
- </DayPickerProvider>
158
- </DateWrapper>
159
- </div>
160
- </DateContext.Provider>
145
+ <DayPickerProvider
146
+ initialProps={{
147
+ locale: locale
148
+ ? getLocaleFromString(locale)
149
+ : langProviderLocale,
150
+ selected: selected ?? selectedMonth,
151
+ toDate,
152
+ fromDate,
153
+ month: selected ?? selectedMonth,
154
+ }}
155
+ >
156
+ <div className={cl("rdp-month", className)}>
157
+ <SharedMonthProvider
158
+ dropdownCaption={dropdownCaption}
159
+ disabled={disabled}
160
+ selected={selected ?? selectedMonth}
161
+ onSelect={handleSelect}
162
+ year={year}
163
+ onYearChange={onYearChange}
164
+ >
165
+ <MonthCaption />
166
+ <MonthSelector />
167
+ </SharedMonthProvider>
168
+ </div>
169
+ </DayPickerProvider>
170
+ </DateWrapper>
171
+ </div>
172
+ </DateInputContext.Provider>
173
+ </DateTranslationContextProvider>
161
174
  );
162
175
  },
163
176
  ) as MonthPickerComponent;
@@ -1,8 +1,12 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useState } from "react";
3
3
  import { DayPickerProvider } from "react-day-picker";
4
- import { SharedMonthProvider } from "../context";
5
- import { getLocaleFromString } from "../utils";
4
+ import { useDateLocale, useI18n } from "../../util/i18n/i18n.context";
5
+ import {
6
+ DateTranslationContextProvider,
7
+ SharedMonthProvider,
8
+ } from "../context";
9
+ import { getLocaleFromString, getTranslations } from "../utils";
6
10
  import MonthCaption from "./MonthCaption";
7
11
  import MonthSelector from "./MonthSelector";
8
12
  import { MonthPickerProps } from "./types";
@@ -34,7 +38,8 @@ export const MonthPickerStandalone = forwardRef<
34
38
  disabled = [],
35
39
  selected,
36
40
  className,
37
- locale = "nb",
41
+ locale,
42
+ translations,
38
43
  onMonthSelect,
39
44
  defaultSelected,
40
45
  year,
@@ -42,6 +47,12 @@ export const MonthPickerStandalone = forwardRef<
42
47
  },
43
48
  ref,
44
49
  ) => {
50
+ const translate = useI18n(
51
+ "DatePicker",
52
+ translations,
53
+ getTranslations(locale),
54
+ );
55
+ const langProviderLocale = useDateLocale();
45
56
  const [selectedMonth, setSelectedMonth] = useState<Date | undefined>(
46
57
  defaultSelected,
47
58
  );
@@ -58,29 +69,31 @@ export const MonthPickerStandalone = forwardRef<
58
69
 
59
70
  return (
60
71
  <div ref={ref} className={cl("navds-date__wrapper", className)}>
61
- <DayPickerProvider
62
- initialProps={{
63
- locale: getLocaleFromString(locale),
64
- selected: selected ?? selectedMonth,
65
- toDate,
66
- fromDate,
67
- month: selected ?? selectedMonth,
68
- }}
69
- >
70
- <div className="navds-date rdp-month">
71
- <SharedMonthProvider
72
- dropdownCaption={dropdownCaption}
73
- disabled={disabled}
74
- selected={selected ?? selectedMonth}
75
- onSelect={handleSelect}
76
- year={year}
77
- onYearChange={onYearChange}
78
- >
79
- <MonthCaption />
80
- <MonthSelector />
81
- </SharedMonthProvider>
82
- </div>
83
- </DayPickerProvider>
72
+ <DateTranslationContextProvider translate={translate}>
73
+ <DayPickerProvider
74
+ initialProps={{
75
+ locale: locale ? getLocaleFromString(locale) : langProviderLocale,
76
+ selected: selected ?? selectedMonth,
77
+ toDate,
78
+ fromDate,
79
+ month: selected ?? selectedMonth,
80
+ }}
81
+ >
82
+ <div className="navds-date rdp-month">
83
+ <SharedMonthProvider
84
+ dropdownCaption={dropdownCaption}
85
+ disabled={disabled}
86
+ selected={selected ?? selectedMonth}
87
+ onSelect={handleSelect}
88
+ year={year}
89
+ onYearChange={onYearChange}
90
+ >
91
+ <MonthCaption />
92
+ <MonthSelector />
93
+ </SharedMonthProvider>
94
+ </div>
95
+ </DayPickerProvider>
96
+ </DateTranslationContextProvider>
84
97
  </div>
85
98
  );
86
99
  },
@@ -1,3 +1,4 @@
1
+ import { ComponentTranslation } from "../../util/i18n/i18n.types";
1
2
  import { Matcher } from "../utils";
2
3
 
3
4
  export interface MonthPickerProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -25,8 +26,15 @@ export interface MonthPickerProps extends React.HTMLAttributes<HTMLDivElement> {
25
26
  /**
26
27
  * Changes monthpicker locale
27
28
  * @default "nb" (norsk bokmål)
29
+ * @deprecated Use `<Provider />`-component
28
30
  */
29
31
  locale?: "nb" | "nn" | "en";
32
+ /**
33
+ * i18n-API for customizing texts and labels.
34
+ *
35
+ * **NB: If you need to change the language, use [Provider](https://aksel.nav.no/komponenter/core/provider#84d7ea5ec517) instead.**
36
+ */
37
+ translations?: ComponentTranslation<"DatePicker">;
30
38
  /**
31
39
  * Display dropdown for choosing year. Needs `fromDate` + `toDate` to work.
32
40
  * @default false
@@ -5,8 +5,7 @@ import { ReadOnlyIcon } from "../../form/ReadOnlyIcon";
5
5
  import { FormFieldProps, useFormField } from "../../form/useFormField";
6
6
  import { BodyShort, ErrorMessage, Label } from "../../typography";
7
7
  import { omit } from "../../util";
8
- import { useI18n } from "../../util/i18n/i18n.context";
9
- import { useDateInputContext } from "../context";
8
+ import { useDateInputContext, useDateTranslationContext } from "../context";
10
9
 
11
10
  export interface DateInputProps
12
11
  extends FormFieldProps,
@@ -47,7 +46,7 @@ const DateInput = forwardRef<HTMLInputElement, DateInputProps>((props, ref) => {
47
46
  } = props;
48
47
 
49
48
  const buttonRef = useRef<HTMLButtonElement>(null);
50
- const translate = useI18n("DatePicker");
49
+ const translate = useDateTranslationContext().translate;
51
50
 
52
51
  const isDatepickerVariant = variant === "datepicker";
53
52
 
@@ -5,8 +5,8 @@ import { Modal } from "../../modal";
5
5
  import { useModalContext } from "../../modal/Modal.context";
6
6
  import { Popover } from "../../popover";
7
7
  import { useMedia } from "../../util/hooks";
8
- import { useI18n } from "../../util/i18n/i18n.context";
9
- import { getTranslations } from "../utils";
8
+ import { TFunction, useI18n } from "../../util/i18n/i18n.context";
9
+ import { getGlobalTranslations } from "../utils";
10
10
 
11
11
  const variantToLabel = {
12
12
  single: "chooseDate",
@@ -22,6 +22,7 @@ type DateWrapperProps = {
22
22
  anchor: HTMLDivElement | null;
23
23
  /** @deprecated Temporary to support locale prop */
24
24
  locale: "nb" | "nn" | "en" | undefined;
25
+ translate: TFunction<"DatePicker">;
25
26
  variant: "single" | "multiple" | "range" | "month";
26
27
  popoverProps: {
27
28
  id?: string;
@@ -35,10 +36,11 @@ export const DateWrapper = ({
35
36
  onClose,
36
37
  anchor,
37
38
  locale,
39
+ translate,
38
40
  variant,
39
41
  popoverProps,
40
42
  }: DateWrapperProps) => {
41
- const translate = useI18n("DatePicker", getTranslations(locale));
43
+ const translateGlobal = useI18n("global", getGlobalTranslations(locale));
42
44
  const modalRef = useRef<HTMLDialogElement>(null);
43
45
  const isInModal = useModalContext(false) !== undefined;
44
46
  const hideModal =
@@ -86,7 +88,7 @@ export const DateWrapper = ({
86
88
  size="small"
87
89
  type="button"
88
90
  >
89
- {translate("close")}
91
+ {translateGlobal("close")}
90
92
  </Button>
91
93
  </div>
92
94
  </Modal>
@@ -5,7 +5,11 @@ export {
5
5
  INPUT_DATE_STRING_FORMAT_MONTH,
6
6
  parseDate,
7
7
  } from "./parse-date";
8
- export { getLocaleFromString, getTranslations } from "./locale";
8
+ export {
9
+ getLocaleFromString,
10
+ getTranslations,
11
+ getGlobalTranslations,
12
+ } from "./locale";
9
13
  export { disableDate } from "./dates-disabled";
10
14
 
11
15
  export { dateIsInCurrentMonth, isValidDate } from "./check-dates";
@@ -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
 
@@ -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
@@ -9,14 +9,7 @@ const MaxSelectedMessage = () => {
9
9
  inputProps: { id },
10
10
  } = useInputContext();
11
11
  const { maxSelected, selectedOptions } = useSelectedOptionsContext();
12
- const translate = useI18n(
13
- "Combobox",
14
- maxSelected?.message ? { maxSelected: maxSelected.message } : undefined,
15
- );
16
-
17
- if (!maxSelected) {
18
- return null;
19
- }
12
+ const translate = useI18n("Combobox");
20
13
 
21
14
  return (
22
15
  <div
@@ -25,7 +18,7 @@ const MaxSelectedMessage = () => {
25
18
  >
26
19
  {translate("maxSelected", {
27
20
  selected: selectedOptions.length,
28
- limit: maxSelected.limit,
21
+ limit: maxSelected.limit || 0,
29
22
  })}
30
23
  </div>
31
24
  );
@@ -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,
@@ -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}