@navikt/ds-react 7.13.0 → 7.14.0-alpha.1

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 (291) hide show
  1. package/cjs/date/Date.Dialog.d.ts +18 -0
  2. package/cjs/date/Date.Dialog.js +67 -0
  3. package/cjs/date/Date.Dialog.js.map +1 -0
  4. package/cjs/date/Date.Input.d.ts +50 -0
  5. package/cjs/date/Date.Input.js +96 -0
  6. package/cjs/date/Date.Input.js.map +1 -0
  7. package/cjs/date/Date.locale.d.ts +44 -0
  8. package/cjs/date/Date.locale.js +57 -0
  9. package/cjs/date/Date.locale.js.map +1 -0
  10. package/cjs/date/Date.typeutils.d.ts +14 -0
  11. package/cjs/date/Date.typeutils.js +15 -0
  12. package/cjs/date/Date.typeutils.js.map +1 -0
  13. package/cjs/date/date-utils/calendar-range.d.ts +11 -0
  14. package/cjs/date/date-utils/calendar-range.js +30 -0
  15. package/cjs/date/date-utils/calendar-range.js.map +1 -0
  16. package/cjs/date/date-utils/check-dates.d.ts +8 -0
  17. package/cjs/date/date-utils/check-dates.js +20 -0
  18. package/cjs/date/date-utils/check-dates.js.map +1 -0
  19. package/cjs/date/date-utils/clamp-dates.d.ts +19 -0
  20. package/cjs/date/date-utils/clamp-dates.js +41 -0
  21. package/cjs/date/date-utils/clamp-dates.js.map +1 -0
  22. package/cjs/date/date-utils/dates-disabled.d.ts +1 -0
  23. package/cjs/date/date-utils/dates-disabled.js +29 -0
  24. package/cjs/date/date-utils/dates-disabled.js.map +1 -0
  25. package/cjs/date/date-utils/dropdown-options.d.ts +13 -0
  26. package/cjs/date/date-utils/dropdown-options.js +45 -0
  27. package/cjs/date/date-utils/dropdown-options.js.map +1 -0
  28. package/cjs/date/date-utils/format-date.d.ts +2 -0
  29. package/cjs/date/date-utils/format-date.js +13 -0
  30. package/cjs/date/date-utils/format-date.js.map +1 -0
  31. package/cjs/date/date-utils/index.d.ts +8 -0
  32. package/cjs/date/date-utils/index.js +27 -0
  33. package/cjs/date/date-utils/index.js.map +1 -0
  34. package/cjs/date/date-utils/is-match.d.ts +3 -0
  35. package/cjs/date/date-utils/is-match.js +61 -0
  36. package/cjs/date/date-utils/is-match.js.map +1 -0
  37. package/cjs/date/date-utils/parse-date.d.ts +4 -0
  38. package/cjs/date/date-utils/parse-date.js +87 -0
  39. package/cjs/date/date-utils/parse-date.js.map +1 -0
  40. package/cjs/date/datepicker/DatePicker.d.ts +3 -3
  41. package/cjs/date/datepicker/DatePicker.js +47 -63
  42. package/cjs/date/datepicker/DatePicker.js.map +1 -1
  43. package/cjs/date/datepicker/DatePicker.types.d.ts +108 -0
  44. package/cjs/date/datepicker/DatePicker.types.js +3 -0
  45. package/cjs/date/datepicker/DatePicker.types.js.map +1 -0
  46. package/cjs/date/datepicker/hooks/useDatepicker.d.ts +90 -0
  47. package/cjs/date/datepicker/hooks/useDatepicker.js +164 -0
  48. package/cjs/date/datepicker/hooks/useDatepicker.js.map +1 -0
  49. package/cjs/date/datepicker/hooks/useRangeDatepicker.d.ts +76 -0
  50. package/cjs/date/datepicker/hooks/useRangeDatepicker.js +322 -0
  51. package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -0
  52. package/cjs/date/datepicker/index.d.ts +4 -3
  53. package/cjs/date/datepicker/index.js +8 -7
  54. package/cjs/date/datepicker/index.js.map +1 -1
  55. package/cjs/date/datepicker/parts/DatePicker.DayButton.d.ts +9 -0
  56. package/cjs/date/datepicker/parts/DatePicker.DayButton.js +70 -0
  57. package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -0
  58. package/cjs/date/datepicker/parts/DatePicker.Months.d.ts +11 -0
  59. package/cjs/date/datepicker/parts/DatePicker.Months.js +84 -0
  60. package/cjs/date/datepicker/parts/DatePicker.Months.js.map +1 -0
  61. package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +15 -0
  62. package/cjs/date/datepicker/parts/DatePicker.RDP.js +103 -0
  63. package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -0
  64. package/cjs/date/datepicker/parts/DatePicker.Standalone.d.ts +18 -0
  65. package/cjs/date/datepicker/parts/DatePicker.Standalone.js +60 -0
  66. package/cjs/date/datepicker/parts/DatePicker.Standalone.js.map +1 -0
  67. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.d.ts +9 -0
  68. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.js +64 -0
  69. package/cjs/date/datepicker/parts/DatePicker.WeekNumber.js.map +1 -0
  70. package/cjs/date/datepicker/parts/DatePicker.WeekRow.d.ts +8 -0
  71. package/cjs/date/datepicker/parts/DatePicker.WeekRow.js +28 -0
  72. package/cjs/date/datepicker/parts/DatePicker.WeekRow.js.map +1 -0
  73. package/cjs/date/monthpicker/MonthPicker.context.d.ts +21 -0
  74. package/cjs/date/monthpicker/MonthPicker.context.js +48 -0
  75. package/cjs/date/monthpicker/MonthPicker.context.js.map +1 -0
  76. package/cjs/date/monthpicker/MonthPicker.d.ts +3 -3
  77. package/cjs/date/monthpicker/MonthPicker.js +34 -43
  78. package/cjs/date/monthpicker/MonthPicker.js.map +1 -1
  79. package/cjs/date/monthpicker/MonthPicker.types.d.ts +86 -0
  80. package/cjs/date/monthpicker/MonthPicker.types.js +3 -0
  81. package/cjs/date/monthpicker/MonthPicker.types.js.map +1 -0
  82. package/cjs/date/monthpicker/MonthPicker.util.d.ts +2 -0
  83. package/cjs/date/monthpicker/MonthPicker.util.js +156 -0
  84. package/cjs/date/monthpicker/MonthPicker.util.js.map +1 -0
  85. package/cjs/date/monthpicker/hooks/useMonthPicker.d.ts +85 -0
  86. package/cjs/date/monthpicker/hooks/useMonthPicker.js +179 -0
  87. package/cjs/date/monthpicker/hooks/useMonthPicker.js.map +1 -0
  88. package/cjs/date/monthpicker/index.d.ts +4 -4
  89. package/cjs/date/monthpicker/index.js +6 -6
  90. package/cjs/date/monthpicker/index.js.map +1 -1
  91. package/cjs/date/monthpicker/parts/MonthPicker.Button.d.ts +11 -0
  92. package/cjs/date/monthpicker/parts/MonthPicker.Button.js +82 -0
  93. package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -0
  94. package/cjs/date/monthpicker/parts/MonthPicker.Caption.d.ts +3 -0
  95. package/cjs/date/monthpicker/parts/MonthPicker.Caption.js +52 -0
  96. package/cjs/date/monthpicker/parts/MonthPicker.Caption.js.map +1 -0
  97. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +10 -0
  98. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.js +51 -0
  99. package/cjs/date/monthpicker/parts/MonthPicker.Standalone.js.map +1 -0
  100. package/cjs/date/monthpicker/parts/MonthPicker.Table.d.ts +3 -0
  101. package/cjs/date/monthpicker/parts/MonthPicker.Table.js +79 -0
  102. package/cjs/date/monthpicker/parts/MonthPicker.Table.js.map +1 -0
  103. package/cjs/form/combobox/Combobox.d.ts +1 -1
  104. package/cjs/form/combobox/Input/InputController.d.ts +1 -1
  105. package/cjs/modal/Modal.js +2 -2
  106. package/cjs/modal/Modal.js.map +1 -1
  107. package/cjs/popover/Popover.js +3 -3
  108. package/cjs/popover/Popover.js.map +1 -1
  109. package/cjs/tooltip/Tooltip.js +2 -5
  110. package/cjs/tooltip/Tooltip.js.map +1 -1
  111. package/esm/date/Date.Dialog.d.ts +18 -0
  112. package/esm/date/Date.Dialog.js +38 -0
  113. package/esm/date/Date.Dialog.js.map +1 -0
  114. package/esm/date/Date.Input.d.ts +50 -0
  115. package/esm/date/Date.Input.js +66 -0
  116. package/esm/date/Date.Input.js.map +1 -0
  117. package/esm/date/Date.locale.d.ts +44 -0
  118. package/esm/date/Date.locale.js +47 -0
  119. package/esm/date/Date.locale.js.map +1 -0
  120. package/esm/date/Date.typeutils.d.ts +14 -0
  121. package/esm/date/Date.typeutils.js +10 -0
  122. package/esm/date/Date.typeutils.js.map +1 -0
  123. package/esm/date/date-utils/calendar-range.d.ts +11 -0
  124. package/esm/date/date-utils/calendar-range.js +27 -0
  125. package/esm/date/date-utils/calendar-range.js.map +1 -0
  126. package/esm/date/date-utils/check-dates.d.ts +8 -0
  127. package/esm/date/date-utils/check-dates.js +14 -0
  128. package/esm/date/date-utils/check-dates.js.map +1 -0
  129. package/esm/date/date-utils/clamp-dates.d.ts +19 -0
  130. package/esm/date/date-utils/clamp-dates.js +37 -0
  131. package/esm/date/date-utils/clamp-dates.js.map +1 -0
  132. package/esm/date/date-utils/dates-disabled.d.ts +1 -0
  133. package/esm/date/date-utils/dates-disabled.js +25 -0
  134. package/esm/date/date-utils/dates-disabled.js.map +1 -0
  135. package/esm/date/date-utils/dropdown-options.d.ts +13 -0
  136. package/esm/date/date-utils/dropdown-options.js +41 -0
  137. package/esm/date/date-utils/dropdown-options.js.map +1 -0
  138. package/esm/date/date-utils/format-date.d.ts +2 -0
  139. package/esm/date/date-utils/format-date.js +9 -0
  140. package/esm/date/date-utils/format-date.js.map +1 -0
  141. package/esm/date/date-utils/index.d.ts +8 -0
  142. package/esm/date/date-utils/index.js +9 -0
  143. package/esm/date/date-utils/index.js.map +1 -0
  144. package/esm/date/date-utils/is-match.d.ts +3 -0
  145. package/esm/date/date-utils/is-match.js +57 -0
  146. package/esm/date/date-utils/is-match.js.map +1 -0
  147. package/esm/date/date-utils/parse-date.d.ts +4 -0
  148. package/esm/date/date-utils/parse-date.js +83 -0
  149. package/esm/date/date-utils/parse-date.js.map +1 -0
  150. package/esm/date/datepicker/DatePicker.d.ts +3 -3
  151. package/esm/date/datepicker/DatePicker.js +46 -62
  152. package/esm/date/datepicker/DatePicker.js.map +1 -1
  153. package/esm/date/datepicker/DatePicker.types.d.ts +108 -0
  154. package/esm/date/datepicker/DatePicker.types.js +2 -0
  155. package/esm/date/datepicker/DatePicker.types.js.map +1 -0
  156. package/esm/date/datepicker/hooks/useDatepicker.d.ts +90 -0
  157. package/esm/date/datepicker/hooks/useDatepicker.js +160 -0
  158. package/esm/date/datepicker/hooks/useDatepicker.js.map +1 -0
  159. package/esm/date/datepicker/hooks/useRangeDatepicker.d.ts +76 -0
  160. package/esm/date/datepicker/hooks/useRangeDatepicker.js +318 -0
  161. package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -0
  162. package/esm/date/datepicker/index.d.ts +4 -3
  163. package/esm/date/datepicker/index.js +4 -3
  164. package/esm/date/datepicker/index.js.map +1 -1
  165. package/esm/date/datepicker/parts/DatePicker.DayButton.d.ts +9 -0
  166. package/esm/date/datepicker/parts/DatePicker.DayButton.js +41 -0
  167. package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -0
  168. package/esm/date/datepicker/parts/DatePicker.Months.d.ts +11 -0
  169. package/esm/date/datepicker/parts/DatePicker.Months.js +58 -0
  170. package/esm/date/datepicker/parts/DatePicker.Months.js.map +1 -0
  171. package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +15 -0
  172. package/esm/date/datepicker/parts/DatePicker.RDP.js +74 -0
  173. package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -0
  174. package/esm/date/datepicker/parts/DatePicker.Standalone.d.ts +18 -0
  175. package/esm/date/datepicker/parts/DatePicker.Standalone.js +31 -0
  176. package/esm/date/datepicker/parts/DatePicker.Standalone.js.map +1 -0
  177. package/esm/date/datepicker/parts/DatePicker.WeekNumber.d.ts +9 -0
  178. package/esm/date/datepicker/parts/DatePicker.WeekNumber.js +35 -0
  179. package/esm/date/datepicker/parts/DatePicker.WeekNumber.js.map +1 -0
  180. package/esm/date/datepicker/parts/DatePicker.WeekRow.d.ts +8 -0
  181. package/esm/date/datepicker/parts/DatePicker.WeekRow.js +22 -0
  182. package/esm/date/datepicker/parts/DatePicker.WeekRow.js.map +1 -0
  183. package/esm/date/monthpicker/MonthPicker.context.d.ts +21 -0
  184. package/esm/date/monthpicker/MonthPicker.context.js +41 -0
  185. package/esm/date/monthpicker/MonthPicker.context.js.map +1 -0
  186. package/esm/date/monthpicker/MonthPicker.d.ts +3 -3
  187. package/esm/date/monthpicker/MonthPicker.js +31 -40
  188. package/esm/date/monthpicker/MonthPicker.js.map +1 -1
  189. package/esm/date/monthpicker/MonthPicker.types.d.ts +86 -0
  190. package/esm/date/monthpicker/MonthPicker.types.js +2 -0
  191. package/esm/date/monthpicker/MonthPicker.types.js.map +1 -0
  192. package/esm/date/monthpicker/MonthPicker.util.d.ts +2 -0
  193. package/esm/date/monthpicker/MonthPicker.util.js +152 -0
  194. package/esm/date/monthpicker/MonthPicker.util.js.map +1 -0
  195. package/esm/date/monthpicker/hooks/useMonthPicker.d.ts +85 -0
  196. package/esm/date/monthpicker/hooks/useMonthPicker.js +175 -0
  197. package/esm/date/monthpicker/hooks/useMonthPicker.js.map +1 -0
  198. package/esm/date/monthpicker/index.d.ts +4 -4
  199. package/esm/date/monthpicker/index.js +3 -3
  200. package/esm/date/monthpicker/index.js.map +1 -1
  201. package/esm/date/monthpicker/parts/MonthPicker.Button.d.ts +11 -0
  202. package/esm/date/monthpicker/parts/MonthPicker.Button.js +52 -0
  203. package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -0
  204. package/esm/date/monthpicker/parts/MonthPicker.Caption.d.ts +3 -0
  205. package/esm/date/monthpicker/parts/MonthPicker.Caption.js +46 -0
  206. package/esm/date/monthpicker/parts/MonthPicker.Caption.js.map +1 -0
  207. package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +10 -0
  208. package/esm/date/monthpicker/parts/MonthPicker.Standalone.js +22 -0
  209. package/esm/date/monthpicker/parts/MonthPicker.Standalone.js.map +1 -0
  210. package/esm/date/monthpicker/parts/MonthPicker.Table.d.ts +3 -0
  211. package/esm/date/monthpicker/parts/MonthPicker.Table.js +50 -0
  212. package/esm/date/monthpicker/parts/MonthPicker.Table.js.map +1 -0
  213. package/esm/form/combobox/Combobox.d.ts +1 -1
  214. package/esm/form/combobox/Input/InputController.d.ts +1 -1
  215. package/esm/modal/Modal.js +3 -3
  216. package/esm/modal/Modal.js.map +1 -1
  217. package/esm/popover/Popover.js +4 -4
  218. package/esm/popover/Popover.js.map +1 -1
  219. package/esm/tooltip/Tooltip.js +2 -5
  220. package/esm/tooltip/Tooltip.js.map +1 -1
  221. package/package.json +6 -7
  222. package/src/date/{parts/DateWrapper.tsx → Date.Dialog.tsx} +12 -9
  223. package/src/date/{parts/DateInput.tsx → Date.Input.tsx} +30 -5
  224. package/src/date/{utils/locale.ts → Date.locale.ts} +11 -2
  225. package/src/date/Date.typeutils.ts +32 -0
  226. package/src/date/date-utils/calendar-range.test.ts +54 -0
  227. package/src/date/date-utils/calendar-range.ts +46 -0
  228. package/src/date/date-utils/check-dates.test.ts +49 -0
  229. package/src/date/date-utils/check-dates.ts +28 -0
  230. package/src/date/date-utils/clamp-dates.test.ts +156 -0
  231. package/src/date/date-utils/clamp-dates.ts +63 -0
  232. package/src/date/{utils/__tests__ → date-utils}/dates-disabled.test.ts +1 -1
  233. package/src/date/{utils → date-utils}/dates-disabled.ts +1 -2
  234. package/src/date/date-utils/dropdown-options.test.ts +143 -0
  235. package/src/date/date-utils/dropdown-options.ts +79 -0
  236. package/src/date/{utils/__tests__ → date-utils}/format-dates.test.ts +2 -2
  237. package/src/date/date-utils/index.ts +16 -0
  238. package/src/date/{utils/__tests__ → date-utils}/is-match.test.ts +1 -1
  239. package/src/date/{utils → date-utils}/is-match.ts +2 -11
  240. package/src/date/{utils/__tests__ → date-utils}/parse-dates.test.ts +2 -1
  241. package/src/date/datepicker/DatePicker.tsx +67 -92
  242. package/src/date/datepicker/{types.ts → DatePicker.types.ts} +10 -4
  243. package/src/date/{hooks → datepicker/hooks}/useDatepicker.tsx +12 -13
  244. package/src/date/{hooks → datepicker/hooks}/useRangeDatepicker.test.tsx +1 -1
  245. package/src/date/{hooks → datepicker/hooks}/useRangeDatepicker.tsx +19 -19
  246. package/src/date/datepicker/index.ts +4 -5
  247. package/src/date/datepicker/parts/DatePicker.DayButton.tsx +56 -0
  248. package/src/date/datepicker/parts/DatePicker.Months.tsx +149 -0
  249. package/src/date/datepicker/parts/DatePicker.RDP.tsx +170 -0
  250. package/src/date/datepicker/parts/DatePicker.Standalone.tsx +93 -0
  251. package/src/date/datepicker/parts/DatePicker.WeekNumber.tsx +86 -0
  252. package/src/date/datepicker/parts/{WeekRow.tsx → DatePicker.WeekRow.tsx} +20 -21
  253. package/src/date/monthpicker/MonthPicker.context.tsx +103 -0
  254. package/src/date/monthpicker/MonthPicker.tsx +63 -68
  255. package/src/date/monthpicker/{types.ts → MonthPicker.types.ts} +1 -1
  256. package/src/date/{utils/navigation.ts → monthpicker/MonthPicker.util.ts} +2 -1
  257. package/src/date/{hooks → monthpicker/hooks}/useMonthPicker.tsx +14 -13
  258. package/src/date/monthpicker/index.ts +4 -4
  259. package/src/date/monthpicker/{MonthButton.tsx → parts/MonthPicker.Button.tsx} +21 -10
  260. package/src/date/monthpicker/{MonthCaption.tsx → parts/MonthPicker.Caption.tsx} +20 -21
  261. package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +86 -0
  262. package/src/date/monthpicker/{MonthSelector.tsx → parts/MonthPicker.Table.tsx} +7 -7
  263. package/src/modal/Modal.tsx +3 -3
  264. package/src/popover/Popover.tsx +4 -4
  265. package/src/tooltip/Tooltip.tsx +2 -6
  266. package/src/date/context/index.ts +0 -9
  267. package/src/date/context/useDateInputContext.tsx +0 -34
  268. package/src/date/context/useDateTranslationContext.ts +0 -9
  269. package/src/date/context/useSharedMonthContext.tsx +0 -68
  270. package/src/date/datepicker/DatePickerStandalone.tsx +0 -136
  271. package/src/date/datepicker/datepicker.test.tsx +0 -28
  272. package/src/date/datepicker/parts/Caption.tsx +0 -54
  273. package/src/date/datepicker/parts/DayButton.tsx +0 -32
  274. package/src/date/datepicker/parts/DropdownCaption.tsx +0 -110
  275. package/src/date/datepicker/parts/HeadRow.tsx +0 -56
  276. package/src/date/datepicker/parts/Row.tsx +0 -48
  277. package/src/date/datepicker/parts/TableHead.tsx +0 -17
  278. package/src/date/datepicker/parts/WeekNumber.tsx +0 -75
  279. package/src/date/hooks/index.ts +0 -6
  280. package/src/date/monthpicker/MonthPickerStandalone.tsx +0 -102
  281. package/src/date/utils/__tests__/check-dates.test.ts +0 -22
  282. package/src/date/utils/__tests__/get-dates.test.ts +0 -121
  283. package/src/date/utils/__tests__/get-initial-year.test.ts +0 -83
  284. package/src/date/utils/__tests__/get-month-weeks.test.ts +0 -116
  285. package/src/date/utils/check-dates.ts +0 -13
  286. package/src/date/utils/get-dates.ts +0 -60
  287. package/src/date/utils/get-initial-year.ts +0 -25
  288. package/src/date/utils/get-month-weeks.ts +0 -93
  289. package/src/date/utils/index.ts +0 -18
  290. /package/src/date/{utils → date-utils}/format-date.ts +0 -0
  291. /package/src/date/{utils → date-utils}/parse-date.ts +0 -0
@@ -0,0 +1,170 @@
1
+ import cl from "clsx";
2
+ import { isWeekend } from "date-fns";
3
+ import React, { useCallback } from "react";
4
+ import { ClassNames, DayPicker, dateMatchModifiers } from "react-day-picker";
5
+ import { Show } from "../../../layout/responsive";
6
+ import { omit } from "../../../util";
7
+ import { useDateLocale } from "../../../util/i18n/i18n.hooks";
8
+ import { getLocaleFromString } from "../../Date.locale";
9
+ import { clampDisplayMonth, isDateOutsideRange } from "../../date-utils";
10
+ import {
11
+ ConditionalModeProps,
12
+ DatePickerDefaultProps,
13
+ } from "../DatePicker.types";
14
+ import { DatePickerDayButton } from "./DatePicker.DayButton";
15
+ import { DatePickerMonths } from "./DatePicker.Months";
16
+ import { DatePickerWeekNumber } from "./DatePicker.WeekNumber";
17
+
18
+ /**
19
+ * To support backwards compatibility with the old datepicker,
20
+ * we need to provide a partial implementation of the classnames
21
+ */
22
+ const LegacyClassNames: Partial<ClassNames> = {
23
+ root: "rdp",
24
+ button_next: "button",
25
+ day: "rdp-cell",
26
+ day_button: "rdp-day rdp-button",
27
+ /* We set this directly on DayButton */
28
+ disabled: "",
29
+ hidden: "rdp-day_hidden",
30
+ outside: "rdp-day_outside",
31
+ selected: "rdp-day_selected",
32
+ weekday: "rdp-head_cell",
33
+ weekdays: "rdp-head_row",
34
+ week: "rdp-row",
35
+ weeks: "rdp-tbody",
36
+ month_grid: "rdp-table",
37
+ week_number: "rdp-weeknumber",
38
+ };
39
+
40
+ type ReactDayPickerProps = DatePickerDefaultProps &
41
+ ConditionalModeProps & {
42
+ /**
43
+ * If datepicker should be fixed to 6 weeks, regardless of actual weeks in month
44
+ * @default false
45
+ */
46
+ fixedWeeks?: boolean;
47
+ /**
48
+ * Update selected date
49
+ */
50
+ handleSelect: (newSelected: any) => void;
51
+ };
52
+
53
+ const ReactDayPicker = ({
54
+ className,
55
+ dropdownCaption,
56
+ disabled = [],
57
+ disableWeekends = false,
58
+ showWeekNumber = false,
59
+ selected,
60
+ fixedWeeks = false,
61
+ onWeekNumberClick,
62
+ fromDate,
63
+ toDate,
64
+ month,
65
+ mode: _mode,
66
+ handleSelect,
67
+ locale: _locale,
68
+ ...rest
69
+ }: ReactDayPickerProps) => {
70
+ const langProviderLocale = useDateLocale();
71
+ const locale = _locale ? getLocaleFromString(_locale) : langProviderLocale;
72
+
73
+ const mode = _mode ?? ("single" as any);
74
+
75
+ return (
76
+ <DayPicker
77
+ captionLayout={dropdownCaption ? "dropdown" : "label"}
78
+ hideNavigation
79
+ locale={locale}
80
+ mode={mode as any}
81
+ onSelect={handleSelect}
82
+ selected={selected}
83
+ classNames={LegacyClassNames}
84
+ components={{
85
+ MonthCaption: () => <></>,
86
+ DayButton: useCallback(
87
+ (props) => <DatePickerDayButton {...props} locale={locale} />,
88
+ [locale],
89
+ ),
90
+ Month: useCallback(
91
+ (props) => (
92
+ <DatePickerMonths
93
+ {...props}
94
+ locale={locale}
95
+ onWeekNumberClick={
96
+ mode === "multiple" ? onWeekNumberClick : undefined
97
+ }
98
+ />
99
+ ),
100
+ [locale, mode, onWeekNumberClick],
101
+ ),
102
+ Day: useCallback(
103
+ (props) => (
104
+ <td
105
+ {...omit(props, ["day", "modifiers"])}
106
+ className="rdp-cell"
107
+ role={undefined}
108
+ />
109
+ ),
110
+ [],
111
+ ),
112
+ WeekNumber: useCallback(
113
+ (props) => (
114
+ <DatePickerWeekNumber
115
+ {...props}
116
+ showOnDesktop
117
+ onWeekNumberClick={
118
+ mode === "multiple" ? onWeekNumberClick : undefined
119
+ }
120
+ />
121
+ ),
122
+ [mode, onWeekNumberClick],
123
+ ),
124
+ /* On smaller screens we hide it to accomedate our custom week-selector */
125
+ WeekNumberHeader: useCallback(
126
+ (props) => (
127
+ <Show above="sm" asChild>
128
+ <th {...props} />
129
+ </Show>
130
+ ),
131
+ [],
132
+ ),
133
+ Weekdays: useCallback(
134
+ (props) => (
135
+ <thead {...props} className="rdp-head" aria-hidden>
136
+ <tr className="rdp-head_row">{props.children}</tr>
137
+ </thead>
138
+ ),
139
+ [],
140
+ ),
141
+ }}
142
+ className={cl("navds-date", className)}
143
+ disabled={(day) => {
144
+ return (
145
+ (disableWeekends && isWeekend(day)) ||
146
+ dateMatchModifiers(day, disabled) ||
147
+ isDateOutsideRange({ day, fromDate, toDate })
148
+ );
149
+ }}
150
+ weekStartsOn={1}
151
+ modifiers={{
152
+ weekend: (day) => disableWeekends && isWeekend(day),
153
+ }}
154
+ modifiersClassNames={{
155
+ weekend: "rdp-day__weekend",
156
+ }}
157
+ // eslint-disable-next-line jsx-a11y/no-autofocus
158
+ autoFocus={false}
159
+ showWeekNumber={showWeekNumber}
160
+ fixedWeeks={fixedWeeks}
161
+ showOutsideDays
162
+ startMonth={fromDate}
163
+ endMonth={toDate}
164
+ month={clampDisplayMonth({ month, start: fromDate, end: toDate })}
165
+ {...omit(rest, ["onSelect", "role", "id", "defaultSelected"])}
166
+ />
167
+ );
168
+ };
169
+
170
+ export { ReactDayPicker };
@@ -0,0 +1,93 @@
1
+ import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
+ import { DateRange } from "react-day-picker";
4
+ import { useControllableState } from "../../../util/hooks";
5
+ import { useI18n } from "../../../util/i18n/i18n.hooks";
6
+ import {
7
+ DateTranslationContextProvider,
8
+ getTranslations,
9
+ } from "../../Date.locale";
10
+ import {
11
+ DatePickerDefaultProps,
12
+ MultipleMode,
13
+ RangeMode,
14
+ SingleMode,
15
+ } from "../DatePicker.types";
16
+ import { ReactDayPicker } from "./DatePicker.RDP";
17
+
18
+ interface DatePickerStandaloneDefaultProps
19
+ extends Omit<
20
+ DatePickerDefaultProps,
21
+ "open" | "onClose" | "onOpenToggle" | "wrapperClassName" | "strategy"
22
+ > {
23
+ /**
24
+ * Datepicker classname
25
+ */
26
+ className?: string;
27
+ /**
28
+ * If datepicker should be fixed to 6 weeks, regardless of actual weeks in month
29
+ * @default true
30
+ */
31
+ fixedWeeks?: boolean;
32
+ }
33
+
34
+ type StandaloneConditionalModeProps = SingleMode | MultipleMode | RangeMode;
35
+
36
+ export type DatePickerStandaloneProps = DatePickerStandaloneDefaultProps &
37
+ StandaloneConditionalModeProps;
38
+
39
+ export type DatePickerStandaloneType = React.ForwardRefExoticComponent<
40
+ DatePickerStandaloneProps & React.RefAttributes<HTMLDivElement>
41
+ >;
42
+
43
+ export const DatePickerStandalone: DatePickerStandaloneType = forwardRef<
44
+ HTMLDivElement,
45
+ DatePickerStandaloneProps
46
+ >(
47
+ (
48
+ {
49
+ className,
50
+ locale,
51
+ translations,
52
+ selected,
53
+ defaultSelected,
54
+ onSelect,
55
+ mode,
56
+ ...rest
57
+ },
58
+ ref,
59
+ ) => {
60
+ const translate = useI18n(
61
+ "DatePicker",
62
+ translations,
63
+ getTranslations(locale),
64
+ );
65
+
66
+ const [value, setValue] = useControllableState<
67
+ Date | Date[] | DateRange | undefined
68
+ >({
69
+ defaultValue: defaultSelected,
70
+ value: selected,
71
+ onChange: (newValue) => onSelect?.(newValue as any),
72
+ });
73
+
74
+ return (
75
+ <DateTranslationContextProvider translate={translate}>
76
+ <div
77
+ ref={ref}
78
+ className={cl("navds-date__standalone-wrapper", className)}
79
+ >
80
+ <ReactDayPicker
81
+ {...rest}
82
+ locale={locale}
83
+ handleSelect={setValue}
84
+ selected={value as any}
85
+ mode={mode as any}
86
+ />
87
+ </div>
88
+ </DateTranslationContextProvider>
89
+ );
90
+ },
91
+ );
92
+
93
+ export default DatePickerStandalone;
@@ -0,0 +1,86 @@
1
+ import cl from "clsx";
2
+ import React, { useMemo } from "react";
3
+ import { CalendarWeek, useDayPicker } from "react-day-picker";
4
+ import { Button } from "../../../button";
5
+ import { Hide, Show } from "../../../layout/responsive";
6
+ import { Detail } from "../../../typography";
7
+ import { useDateTranslationContext } from "../../Date.locale";
8
+ import { MultipleMode } from "../DatePicker.types";
9
+
10
+ const DatePickerWeekNumber = ({
11
+ week: { weekNumber, days },
12
+ onWeekNumberClick,
13
+ className,
14
+ style,
15
+ showOnDesktop,
16
+ }: {
17
+ week: CalendarWeek;
18
+ onWeekNumberClick: MultipleMode["onWeekNumberClick"];
19
+ showOnDesktop: boolean;
20
+ } & React.ThHTMLAttributes<HTMLTableCellElement>) => {
21
+ const translate = useDateTranslationContext().translate;
22
+
23
+ const { getModifiers } = useDayPicker();
24
+
25
+ const hideWeek = useMemo(() => {
26
+ if (
27
+ days.filter((day) => {
28
+ const mods = getModifiers(day);
29
+ return !(mods.hidden || mods.outside || mods.disabled);
30
+ }).length === 0
31
+ ) {
32
+ return true;
33
+ }
34
+ return false;
35
+ }, [days, getModifiers]);
36
+
37
+ const DisplayMode = showOnDesktop ? Show : Hide;
38
+
39
+ if (!onWeekNumberClick || hideWeek) {
40
+ return (
41
+ <DisplayMode above="sm" asChild>
42
+ <td className="rdp-cell">
43
+ <Detail
44
+ as="span"
45
+ textColor="subtle"
46
+ className={className}
47
+ style={style}
48
+ aria-label={translate("weekNumber", { week: weekNumber })}
49
+ >
50
+ {weekNumber}
51
+ </Detail>
52
+ </td>
53
+ </DisplayMode>
54
+ );
55
+ }
56
+
57
+ return (
58
+ <DisplayMode above="sm" asChild>
59
+ <td
60
+ className={cl("rdp-cell", {
61
+ "navds-date__week-wrapper": !showOnDesktop,
62
+ })}
63
+ >
64
+ <Button
65
+ variant="secondary-neutral"
66
+ size="small"
67
+ name="week-number"
68
+ aria-label={translate("selectWeekNumber", { week: weekNumber })}
69
+ style={style}
70
+ className={cl("navds-date__weeknumber", "rdp-weeknumber")}
71
+ onClick={() => {
72
+ onWeekNumberClick(
73
+ weekNumber,
74
+ days.map((day) => day.date),
75
+ );
76
+ }}
77
+ icon={
78
+ <span className="navds-date__weeknumber-number">{weekNumber}</span>
79
+ }
80
+ />
81
+ </td>
82
+ </DisplayMode>
83
+ );
84
+ };
85
+
86
+ export { DatePickerWeekNumber };
@@ -1,14 +1,19 @@
1
1
  import React from "react";
2
- import { useDayPicker } from "react-day-picker";
2
+ import { CalendarWeek } 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 { useDateTranslationContext } from "../../context";
7
- import { getMonthWeeks } from "../../utils/get-month-weeks";
8
- import WeekNumber from "./WeekNumber";
6
+ import { useDateTranslationContext } from "../../Date.locale";
7
+ import { MultipleMode } from "../DatePicker.types";
8
+ import { DatePickerWeekNumber } from "./DatePicker.WeekNumber";
9
9
 
10
- const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
11
- const { locale, fixedWeeks, onWeekNumberClick } = useDayPicker();
10
+ const DatePickerWeekRow = ({
11
+ onWeekNumberClick,
12
+ weeks,
13
+ }: {
14
+ onWeekNumberClick: MultipleMode["onWeekNumberClick"];
15
+ weeks?: CalendarWeek[];
16
+ }) => {
12
17
  const translate = useDateTranslationContext().translate;
13
18
  const labelId = useId();
14
19
 
@@ -16,11 +21,6 @@ const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
16
21
  return null;
17
22
  }
18
23
 
19
- const weeks = getMonthWeeks(displayMonth, {
20
- useFixedWeeks: Boolean(fixedWeeks),
21
- locale,
22
- });
23
-
24
24
  return (
25
25
  <Show below="sm" asChild>
26
26
  <table className="rdp-table" role="grid">
@@ -32,19 +32,18 @@ const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
32
32
  className="rdp-cell navds-date__week-cell"
33
33
  >
34
34
  <span className="navds-date__week-wrapper" id={labelId}>
35
- {`${translate("week")}:`}
35
+ {translate("week")}
36
36
  </span>
37
37
  </Detail>
38
38
 
39
- {weeks.map((week) => (
40
- <td
39
+ {weeks?.map((week) => (
40
+ <DatePickerWeekNumber
41
41
  key={week.weekNumber}
42
- className="rdp-cell navds-date__week-cell"
43
- >
44
- <span className="navds-date__week-wrapper">
45
- <WeekNumber number={week.weekNumber} dates={week.dates} />
46
- </span>
47
- </td>
42
+ week={week}
43
+ onWeekNumberClick={onWeekNumberClick}
44
+ showOnDesktop={false}
45
+ className="navds-date__week-wrapper"
46
+ />
48
47
  ))}
49
48
  </tr>
50
49
  </tbody>
@@ -53,4 +52,4 @@ const WeekRow = ({ displayMonth }: { displayMonth: Date }) => {
53
52
  );
54
53
  };
55
54
 
56
- export default WeekRow;
55
+ export { DatePickerWeekRow };
@@ -0,0 +1,103 @@
1
+ import { Locale, isSameYear } from "date-fns";
2
+ import React from "react";
3
+ import { createContext } from "../../util/create-context";
4
+ import { useControllableState } from "../../util/hooks";
5
+ import { clampDisplayYear } from "../date-utils";
6
+ import { MonthPickerProps } from "./MonthPicker.types";
7
+
8
+ type MonthPickerProviderProps = Pick<
9
+ MonthPickerProps,
10
+ | "dropdownCaption"
11
+ | "disabled"
12
+ | "selected"
13
+ | "defaultSelected"
14
+ | "onMonthSelect"
15
+ | "year"
16
+ | "onYearChange"
17
+ | "fromDate"
18
+ | "toDate"
19
+ > & {
20
+ children: React.ReactNode;
21
+ locale: Locale;
22
+ };
23
+
24
+ type MonthPickerContextProps = {
25
+ caption: "label" | "dropdown";
26
+ year: Date;
27
+ onYearChange: (year: Date) => void;
28
+ selected: MonthPickerProps["selected"];
29
+ onMonthSelect: MonthPickerProps["onMonthSelect"];
30
+ disabled: NonNullable<MonthPickerProps["disabled"]>;
31
+ locale: Locale;
32
+ fromDate?: MonthPickerProps["fromDate"];
33
+ toDate?: MonthPickerProps["toDate"];
34
+ };
35
+
36
+ const [MonthPickerContextProvider, useMonthPickerContext] =
37
+ createContext<MonthPickerContextProps>({
38
+ name: "MonthPickerContext",
39
+ errorMessage:
40
+ "useMonthPickerContext must be used within an MonthPickerContextProvider",
41
+ });
42
+
43
+ const MonthPickerProvider = ({
44
+ children,
45
+ disabled = [],
46
+ year,
47
+ onYearChange,
48
+ fromDate,
49
+ toDate,
50
+ selected,
51
+ defaultSelected,
52
+ onMonthSelect,
53
+ dropdownCaption,
54
+ locale,
55
+ }: MonthPickerProviderProps) => {
56
+ /**
57
+ * Controlls current displayed year in MonthPicker
58
+ */
59
+ const [displayYear, setDisplayYear] = useControllableState({
60
+ defaultValue:
61
+ clampDisplayYear({
62
+ month: year ?? selected ?? defaultSelected,
63
+ start: fromDate,
64
+ end: toDate,
65
+ }) ?? new Date(),
66
+ value: year,
67
+ onChange: onYearChange,
68
+ });
69
+
70
+ /**
71
+ * Allows both controlled and uncontrolled use of MonthPicker
72
+ */
73
+ const [month, setMonth] = useControllableState({
74
+ defaultValue: defaultSelected,
75
+ value: selected,
76
+ onChange: onMonthSelect,
77
+ });
78
+
79
+ const handleDisplayYearUpdate = (newYear: Date) => {
80
+ if (isSameYear(newYear, displayYear)) {
81
+ return;
82
+ }
83
+ setDisplayYear(newYear);
84
+ };
85
+
86
+ return (
87
+ <MonthPickerContextProvider
88
+ caption={dropdownCaption && fromDate && toDate ? "dropdown" : "label"}
89
+ disabled={disabled}
90
+ selected={month}
91
+ onMonthSelect={setMonth}
92
+ year={displayYear}
93
+ onYearChange={handleDisplayYearUpdate}
94
+ locale={locale}
95
+ fromDate={fromDate}
96
+ toDate={toDate}
97
+ >
98
+ {children}
99
+ </MonthPickerContextProvider>
100
+ );
101
+ };
102
+
103
+ export { MonthPickerProvider, useMonthPickerContext };
@@ -1,21 +1,20 @@
1
1
  import cl from "clsx";
2
2
  import React, { forwardRef, useState } from "react";
3
- import { DayPickerProvider } from "react-day-picker";
4
- import { useId } from "../../util/hooks";
3
+ import { useControllableState, useId } from "../../util/hooks";
5
4
  import { useMergeRefs } from "../../util/hooks/useMergeRefs";
6
5
  import { useDateLocale, useI18n } from "../../util/i18n/i18n.hooks";
6
+ import { DateDialog } from "../Date.Dialog";
7
+ import { DateInputContextProvider, MonthPickerInput } from "../Date.Input";
7
8
  import {
8
- DateInputContext,
9
9
  DateTranslationContextProvider,
10
- SharedMonthProvider,
11
- } from "../context";
12
- import { MonthPickerInput } from "../parts/DateInput";
13
- import { DateWrapper } from "../parts/DateWrapper";
14
- import { getLocaleFromString, getTranslations } from "../utils";
15
- import MonthCaption from "./MonthCaption";
16
- import MonthPickerStandalone from "./MonthPickerStandalone";
17
- import MonthSelector from "./MonthSelector";
18
- import { MonthPickerProps } from "./types";
10
+ getLocaleFromString,
11
+ getTranslations,
12
+ } from "../Date.locale";
13
+ import { MonthPickerProvider } from "./MonthPicker.context";
14
+ import { MonthPickerProps } from "./MonthPicker.types";
15
+ import { MonthPickerCaption } from "./parts/MonthPicker.Caption";
16
+ import { MonthPickerStandalone } from "./parts/MonthPicker.Standalone";
17
+ import { MonthPickerTable } from "./parts/MonthPicker.Table";
19
18
 
20
19
  interface MonthPickerComponent
21
20
  extends React.ForwardRefExoticComponent<MonthPickerProps> {
@@ -91,20 +90,26 @@ export const MonthPicker = forwardRef<HTMLDivElement, MonthPickerProps>(
91
90
  );
92
91
  const langProviderLocale = useDateLocale();
93
92
  const ariaId = useId(id);
94
- const [open, setOpen] = useState(_open ?? false);
93
+
94
+ const [open, setOpen] = useControllableState({
95
+ defaultValue: false,
96
+ value: _open,
97
+ onChange: () => {
98
+ onOpenToggle?.();
99
+ },
100
+ });
95
101
 
96
102
  /* We use state here to insure that anchor is defined if open is true on initial render */
97
103
  const [wrapperRef, setWrapperRef] = useState<HTMLDivElement | null>(null);
98
104
  const mergedRef = useMergeRefs(setWrapperRef, ref);
99
105
 
100
- const [selectedMonth, setSelectedMonth] = useState<Date | undefined>(
101
- defaultSelected,
102
- );
103
-
104
106
  const handleSelect = (month?: Date) => {
105
- !onMonthSelect && setSelectedMonth(month);
106
107
  onMonthSelect?.(month);
107
- month && (onClose?.() ?? setOpen(false));
108
+
109
+ if (month) {
110
+ onClose?.();
111
+ setOpen(false);
112
+ }
108
113
  };
109
114
 
110
115
  if (dropdownCaption && (!fromDate || !toDate)) {
@@ -114,62 +119,52 @@ export const MonthPicker = forwardRef<HTMLDivElement, MonthPickerProps>(
114
119
 
115
120
  return (
116
121
  <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
- }}
122
+ <DateInputContextProvider
123
+ open={open}
124
+ onOpen={() => setOpen((x) => !x)}
125
+ ariaId={ariaId}
126
+ defined={true}
127
127
  >
128
- <div
129
- ref={mergedRef}
130
- className={cl("navds-date__wrapper", wrapperClassName)}
128
+ <MonthPickerProvider
129
+ dropdownCaption={dropdownCaption}
130
+ defaultSelected={defaultSelected}
131
+ selected={selected}
132
+ disabled={disabled}
133
+ fromDate={fromDate}
134
+ toDate={toDate}
135
+ year={year}
136
+ onYearChange={onYearChange}
137
+ onMonthSelect={handleSelect}
138
+ locale={locale ? getLocaleFromString(locale) : langProviderLocale}
131
139
  >
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,
143
- }}
140
+ <div
141
+ ref={mergedRef}
142
+ className={cl("navds-date__wrapper", wrapperClassName)}
144
143
  >
145
- <DayPickerProvider
146
- initialProps={{
147
- locale: locale
148
- ? getLocaleFromString(locale)
149
- : langProviderLocale,
150
- selected: selected ?? selectedMonth,
151
- toDate,
152
- fromDate,
153
- month: selected ?? selectedMonth,
144
+ {children}
145
+ <DateDialog
146
+ open={open}
147
+ anchor={wrapperRef}
148
+ onClose={() => {
149
+ onClose?.();
150
+ open && setOpen(false);
151
+ }}
152
+ locale={locale}
153
+ translate={translate}
154
+ variant="month"
155
+ popoverProps={{
156
+ id: ariaId,
157
+ strategy,
154
158
  }}
155
159
  >
156
160
  <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>
161
+ <MonthPickerCaption />
162
+ <MonthPickerTable />
168
163
  </div>
169
- </DayPickerProvider>
170
- </DateWrapper>
171
- </div>
172
- </DateInputContext.Provider>
164
+ </DateDialog>
165
+ </div>
166
+ </MonthPickerProvider>
167
+ </DateInputContextProvider>
173
168
  </DateTranslationContextProvider>
174
169
  );
175
170
  },