@mui/x-date-pickers 6.7.0 → 6.9.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 (276) hide show
  1. package/AdapterDayjs/AdapterDayjs.d.ts +5 -1
  2. package/AdapterDayjs/AdapterDayjs.js +42 -15
  3. package/AdapterLuxon/AdapterLuxon.d.ts +1 -0
  4. package/AdapterLuxon/AdapterLuxon.js +12 -5
  5. package/AdapterMoment/AdapterMoment.js +18 -9
  6. package/CHANGELOG.md +145 -5541
  7. package/DateCalendar/DateCalendar.js +49 -21
  8. package/DateCalendar/DateCalendar.types.d.ts +8 -3
  9. package/DateCalendar/DayCalendar.d.ts +3 -1
  10. package/DateCalendar/DayCalendar.js +24 -17
  11. package/DateCalendar/PickersCalendarHeader.js +6 -3
  12. package/DateCalendar/useCalendarState.d.ts +5 -3
  13. package/DateCalendar/useCalendarState.js +41 -17
  14. package/DateCalendar/useIsDateDisabled.d.ts +1 -1
  15. package/DateCalendar/useIsDateDisabled.js +5 -3
  16. package/DateField/DateField.js +9 -1
  17. package/DatePicker/DatePicker.js +9 -1
  18. package/DateTimeField/DateTimeField.js +9 -1
  19. package/DateTimePicker/DateTimePicker.js +9 -1
  20. package/DesktopDatePicker/DesktopDatePicker.js +9 -1
  21. package/DesktopDateTimePicker/DesktopDateTimePicker.js +9 -1
  22. package/DesktopTimePicker/DesktopTimePicker.js +8 -0
  23. package/DigitalClock/DigitalClock.js +28 -15
  24. package/MobileDatePicker/MobileDatePicker.js +9 -1
  25. package/MobileDateTimePicker/MobileDateTimePicker.js +9 -1
  26. package/MobileTimePicker/MobileTimePicker.js +8 -0
  27. package/MonthCalendar/MonthCalendar.js +57 -24
  28. package/MonthCalendar/MonthCalendar.types.d.ts +8 -2
  29. package/MultiSectionDigitalClock/MultiSectionDigitalClock.js +28 -15
  30. package/MultiSectionDigitalClock/MultiSectionDigitalClockSection.js +1 -1
  31. package/PickersLayout/PickersLayout.js +1 -0
  32. package/PickersLayout/usePickerLayout.js +4 -3
  33. package/PickersShortcuts/PickersShortcuts.d.ts +12 -2
  34. package/PickersShortcuts/PickersShortcuts.js +10 -2
  35. package/PickersShortcuts/index.d.ts +1 -1
  36. package/StaticDatePicker/StaticDatePicker.js +9 -1
  37. package/StaticDateTimePicker/StaticDateTimePicker.js +9 -1
  38. package/StaticTimePicker/StaticTimePicker.js +8 -0
  39. package/TimeClock/TimeClock.js +27 -15
  40. package/TimeField/TimeField.js +9 -1
  41. package/TimePicker/TimePicker.js +8 -0
  42. package/YearCalendar/YearCalendar.js +55 -22
  43. package/YearCalendar/YearCalendar.types.d.ts +8 -2
  44. package/dateTimeViewRenderers/dateTimeViewRenderers.d.ts +1 -1
  45. package/dateTimeViewRenderers/dateTimeViewRenderers.js +5 -2
  46. package/dateViewRenderers/dateViewRenderers.d.ts +1 -1
  47. package/dateViewRenderers/dateViewRenderers.js +4 -2
  48. package/index.js +1 -1
  49. package/internals/hooks/date-helpers-hooks.d.ts +4 -2
  50. package/internals/hooks/date-helpers-hooks.js +8 -6
  51. package/internals/hooks/useDesktopPicker/useDesktopPicker.js +2 -0
  52. package/internals/hooks/useField/useField.d.ts +3 -1
  53. package/internals/hooks/useField/useField.js +23 -7
  54. package/internals/hooks/useField/useField.types.d.ts +6 -4
  55. package/internals/hooks/useField/useField.utils.d.ts +13 -11
  56. package/internals/hooks/useField/useField.utils.js +55 -43
  57. package/internals/hooks/useField/useFieldCharacterEditing.d.ts +3 -2
  58. package/internals/hooks/useField/useFieldCharacterEditing.js +6 -5
  59. package/internals/hooks/useField/useFieldState.d.ts +1 -0
  60. package/internals/hooks/useField/useFieldState.js +33 -23
  61. package/internals/hooks/useMobilePicker/useMobilePicker.js +2 -0
  62. package/internals/hooks/usePicker/usePickerValue.js +45 -9
  63. package/internals/hooks/usePicker/usePickerValue.types.d.ts +22 -6
  64. package/internals/hooks/usePicker/usePickerViews.d.ts +2 -1
  65. package/internals/hooks/usePicker/usePickerViews.js +7 -2
  66. package/internals/hooks/useUtils.d.ts +3 -2
  67. package/internals/hooks/useUtils.js +5 -2
  68. package/internals/hooks/useValueWithTimezone.d.ts +33 -0
  69. package/internals/hooks/useValueWithTimezone.js +69 -0
  70. package/internals/index.d.ts +1 -0
  71. package/internals/index.js +1 -0
  72. package/internals/models/props/clock.d.ts +2 -2
  73. package/internals/utils/date-utils.d.ts +4 -4
  74. package/internals/utils/date-utils.js +4 -12
  75. package/internals/utils/fields.js +1 -1
  76. package/internals/utils/getDefaultReferenceDate.d.ts +12 -3
  77. package/internals/utils/getDefaultReferenceDate.js +4 -4
  78. package/internals/utils/validation/extractValidationProps.d.ts +1 -1
  79. package/internals/utils/validation/validateDate.d.ts +3 -2
  80. package/internals/utils/validation/validateDate.js +14 -6
  81. package/internals/utils/validation/validateTime.d.ts +3 -2
  82. package/internals/utils/validation/validateTime.js +8 -8
  83. package/internals/utils/valueManagers.js +2 -1
  84. package/legacy/AdapterDayjs/AdapterDayjs.js +45 -16
  85. package/legacy/AdapterLuxon/AdapterLuxon.js +13 -6
  86. package/legacy/AdapterMoment/AdapterMoment.js +18 -9
  87. package/legacy/DateCalendar/DateCalendar.js +47 -24
  88. package/legacy/DateCalendar/DayCalendar.js +24 -17
  89. package/legacy/DateCalendar/PickersCalendarHeader.js +6 -3
  90. package/legacy/DateCalendar/useCalendarState.js +40 -17
  91. package/legacy/DateCalendar/useIsDateDisabled.js +5 -3
  92. package/legacy/DateField/DateField.js +9 -1
  93. package/legacy/DatePicker/DatePicker.js +9 -1
  94. package/legacy/DateTimeField/DateTimeField.js +9 -1
  95. package/legacy/DateTimePicker/DateTimePicker.js +9 -1
  96. package/legacy/DesktopDatePicker/DesktopDatePicker.js +9 -1
  97. package/legacy/DesktopDateTimePicker/DesktopDateTimePicker.js +9 -1
  98. package/legacy/DesktopTimePicker/DesktopTimePicker.js +8 -0
  99. package/legacy/DigitalClock/DigitalClock.js +26 -16
  100. package/legacy/MobileDatePicker/MobileDatePicker.js +9 -1
  101. package/legacy/MobileDateTimePicker/MobileDateTimePicker.js +9 -1
  102. package/legacy/MobileTimePicker/MobileTimePicker.js +8 -0
  103. package/legacy/MonthCalendar/MonthCalendar.js +61 -32
  104. package/legacy/MultiSectionDigitalClock/MultiSectionDigitalClock.js +27 -16
  105. package/legacy/MultiSectionDigitalClock/MultiSectionDigitalClockSection.js +1 -1
  106. package/legacy/PickersLayout/PickersLayout.js +1 -0
  107. package/legacy/PickersLayout/usePickerLayout.js +3 -2
  108. package/legacy/PickersShortcuts/PickersShortcuts.js +10 -2
  109. package/legacy/StaticDatePicker/StaticDatePicker.js +9 -1
  110. package/legacy/StaticDateTimePicker/StaticDateTimePicker.js +9 -1
  111. package/legacy/StaticTimePicker/StaticTimePicker.js +8 -0
  112. package/legacy/TimeClock/TimeClock.js +25 -18
  113. package/legacy/TimeField/TimeField.js +9 -1
  114. package/legacy/TimePicker/TimePicker.js +8 -0
  115. package/legacy/YearCalendar/YearCalendar.js +59 -30
  116. package/legacy/dateTimeViewRenderers/dateTimeViewRenderers.js +5 -2
  117. package/legacy/dateViewRenderers/dateViewRenderers.js +4 -2
  118. package/legacy/index.js +1 -1
  119. package/legacy/internals/hooks/date-helpers-hooks.js +8 -6
  120. package/legacy/internals/hooks/useDesktopPicker/useDesktopPicker.js +2 -0
  121. package/legacy/internals/hooks/useField/useField.js +22 -6
  122. package/legacy/internals/hooks/useField/useField.utils.js +56 -44
  123. package/legacy/internals/hooks/useField/useFieldCharacterEditing.js +6 -5
  124. package/legacy/internals/hooks/useField/useFieldState.js +42 -33
  125. package/legacy/internals/hooks/useMobilePicker/useMobilePicker.js +2 -0
  126. package/legacy/internals/hooks/usePicker/usePickerValue.js +46 -9
  127. package/legacy/internals/hooks/usePicker/usePickerViews.js +7 -2
  128. package/legacy/internals/hooks/useUtils.js +5 -2
  129. package/legacy/internals/hooks/useValueWithTimezone.js +81 -0
  130. package/legacy/internals/index.js +1 -0
  131. package/legacy/internals/utils/date-utils.js +5 -13
  132. package/legacy/internals/utils/fields.js +1 -1
  133. package/legacy/internals/utils/getDefaultReferenceDate.js +4 -4
  134. package/legacy/internals/utils/validation/validateDate.js +12 -6
  135. package/legacy/internals/utils/validation/validateTime.js +8 -8
  136. package/legacy/internals/utils/valueManagers.js +3 -0
  137. package/legacy/locales/csCZ.js +2 -2
  138. package/legacy/locales/elGR.js +93 -0
  139. package/legacy/locales/index.js +1 -0
  140. package/legacy/tests/describeAdapters/describeAdapters.js +3 -1
  141. package/legacy/tests/describeGregorianAdapter/testCalculations.js +69 -27
  142. package/legacy/tests/describeJalaliAdapter/testCalculations.js +21 -0
  143. package/legacy/timeViewRenderers/timeViewRenderers.js +12 -6
  144. package/locales/csCZ.js +2 -2
  145. package/locales/elGR.d.ts +53 -0
  146. package/locales/elGR.js +57 -0
  147. package/locales/index.d.ts +1 -0
  148. package/locales/index.js +1 -0
  149. package/models/adapters.d.ts +2 -2
  150. package/models/timezone.d.ts +10 -0
  151. package/modern/AdapterDayjs/AdapterDayjs.js +41 -15
  152. package/modern/AdapterLuxon/AdapterLuxon.js +12 -4
  153. package/modern/AdapterMoment/AdapterMoment.js +18 -9
  154. package/modern/DateCalendar/DateCalendar.js +49 -21
  155. package/modern/DateCalendar/DayCalendar.js +24 -17
  156. package/modern/DateCalendar/PickersCalendarHeader.js +6 -3
  157. package/modern/DateCalendar/useCalendarState.js +41 -16
  158. package/modern/DateCalendar/useIsDateDisabled.js +5 -3
  159. package/modern/DateField/DateField.js +9 -1
  160. package/modern/DatePicker/DatePicker.js +9 -1
  161. package/modern/DateTimeField/DateTimeField.js +9 -1
  162. package/modern/DateTimePicker/DateTimePicker.js +9 -1
  163. package/modern/DesktopDatePicker/DesktopDatePicker.js +9 -1
  164. package/modern/DesktopDateTimePicker/DesktopDateTimePicker.js +9 -1
  165. package/modern/DesktopTimePicker/DesktopTimePicker.js +8 -0
  166. package/modern/DigitalClock/DigitalClock.js +28 -15
  167. package/modern/MobileDatePicker/MobileDatePicker.js +9 -1
  168. package/modern/MobileDateTimePicker/MobileDateTimePicker.js +9 -1
  169. package/modern/MobileTimePicker/MobileTimePicker.js +8 -0
  170. package/modern/MonthCalendar/MonthCalendar.js +57 -24
  171. package/modern/MultiSectionDigitalClock/MultiSectionDigitalClock.js +28 -15
  172. package/modern/MultiSectionDigitalClock/MultiSectionDigitalClockSection.js +1 -1
  173. package/modern/PickersLayout/PickersLayout.js +1 -0
  174. package/modern/PickersLayout/usePickerLayout.js +4 -3
  175. package/modern/PickersShortcuts/PickersShortcuts.js +10 -2
  176. package/modern/StaticDatePicker/StaticDatePicker.js +9 -1
  177. package/modern/StaticDateTimePicker/StaticDateTimePicker.js +9 -1
  178. package/modern/StaticTimePicker/StaticTimePicker.js +8 -0
  179. package/modern/TimeClock/TimeClock.js +27 -15
  180. package/modern/TimeField/TimeField.js +9 -1
  181. package/modern/TimePicker/TimePicker.js +8 -0
  182. package/modern/YearCalendar/YearCalendar.js +55 -22
  183. package/modern/dateTimeViewRenderers/dateTimeViewRenderers.js +5 -2
  184. package/modern/dateViewRenderers/dateViewRenderers.js +4 -2
  185. package/modern/index.js +1 -1
  186. package/modern/internals/hooks/date-helpers-hooks.js +8 -6
  187. package/modern/internals/hooks/useDesktopPicker/useDesktopPicker.js +2 -0
  188. package/modern/internals/hooks/useField/useField.js +23 -7
  189. package/modern/internals/hooks/useField/useField.utils.js +55 -43
  190. package/modern/internals/hooks/useField/useFieldCharacterEditing.js +6 -5
  191. package/modern/internals/hooks/useField/useFieldState.js +33 -22
  192. package/modern/internals/hooks/useMobilePicker/useMobilePicker.js +2 -0
  193. package/modern/internals/hooks/usePicker/usePickerValue.js +45 -9
  194. package/modern/internals/hooks/usePicker/usePickerViews.js +7 -2
  195. package/modern/internals/hooks/useUtils.js +5 -2
  196. package/modern/internals/hooks/useValueWithTimezone.js +68 -0
  197. package/modern/internals/index.js +1 -0
  198. package/modern/internals/utils/date-utils.js +4 -12
  199. package/modern/internals/utils/fields.js +1 -1
  200. package/modern/internals/utils/getDefaultReferenceDate.js +4 -4
  201. package/modern/internals/utils/validation/validateDate.js +14 -6
  202. package/modern/internals/utils/validation/validateTime.js +8 -8
  203. package/modern/internals/utils/valueManagers.js +2 -1
  204. package/modern/locales/csCZ.js +2 -2
  205. package/modern/locales/elGR.js +57 -0
  206. package/modern/locales/index.js +1 -0
  207. package/modern/tests/describeAdapters/describeAdapters.js +3 -1
  208. package/modern/tests/describeGregorianAdapter/testCalculations.js +69 -27
  209. package/modern/tests/describeJalaliAdapter/testCalculations.js +21 -0
  210. package/modern/timeViewRenderers/timeViewRenderers.js +12 -6
  211. package/node/AdapterDayjs/AdapterDayjs.js +41 -15
  212. package/node/AdapterLuxon/AdapterLuxon.js +12 -4
  213. package/node/AdapterMoment/AdapterMoment.js +18 -9
  214. package/node/DateCalendar/DateCalendar.js +48 -20
  215. package/node/DateCalendar/DayCalendar.js +24 -17
  216. package/node/DateCalendar/PickersCalendarHeader.js +6 -3
  217. package/node/DateCalendar/useCalendarState.js +41 -16
  218. package/node/DateCalendar/useIsDateDisabled.js +5 -3
  219. package/node/DateField/DateField.js +9 -1
  220. package/node/DatePicker/DatePicker.js +9 -1
  221. package/node/DateTimeField/DateTimeField.js +9 -1
  222. package/node/DateTimePicker/DateTimePicker.js +9 -1
  223. package/node/DesktopDatePicker/DesktopDatePicker.js +9 -1
  224. package/node/DesktopDateTimePicker/DesktopDateTimePicker.js +9 -1
  225. package/node/DesktopTimePicker/DesktopTimePicker.js +8 -0
  226. package/node/DigitalClock/DigitalClock.js +28 -15
  227. package/node/MobileDatePicker/MobileDatePicker.js +9 -1
  228. package/node/MobileDateTimePicker/MobileDateTimePicker.js +9 -1
  229. package/node/MobileTimePicker/MobileTimePicker.js +8 -0
  230. package/node/MonthCalendar/MonthCalendar.js +57 -24
  231. package/node/MultiSectionDigitalClock/MultiSectionDigitalClock.js +28 -15
  232. package/node/MultiSectionDigitalClock/MultiSectionDigitalClockSection.js +1 -1
  233. package/node/PickersLayout/PickersLayout.js +1 -0
  234. package/node/PickersLayout/usePickerLayout.js +4 -3
  235. package/node/PickersShortcuts/PickersShortcuts.js +10 -2
  236. package/node/StaticDatePicker/StaticDatePicker.js +9 -1
  237. package/node/StaticDateTimePicker/StaticDateTimePicker.js +9 -1
  238. package/node/StaticTimePicker/StaticTimePicker.js +8 -0
  239. package/node/TimeClock/TimeClock.js +26 -14
  240. package/node/TimeField/TimeField.js +9 -1
  241. package/node/TimePicker/TimePicker.js +8 -0
  242. package/node/YearCalendar/YearCalendar.js +55 -22
  243. package/node/dateTimeViewRenderers/dateTimeViewRenderers.js +5 -2
  244. package/node/dateViewRenderers/dateViewRenderers.js +4 -2
  245. package/node/index.js +1 -1
  246. package/node/internals/hooks/date-helpers-hooks.js +8 -6
  247. package/node/internals/hooks/useDesktopPicker/useDesktopPicker.js +2 -0
  248. package/node/internals/hooks/useField/useField.js +23 -7
  249. package/node/internals/hooks/useField/useField.utils.js +55 -43
  250. package/node/internals/hooks/useField/useFieldCharacterEditing.js +6 -5
  251. package/node/internals/hooks/useField/useFieldState.js +33 -22
  252. package/node/internals/hooks/useMobilePicker/useMobilePicker.js +2 -0
  253. package/node/internals/hooks/usePicker/usePickerValue.js +44 -9
  254. package/node/internals/hooks/usePicker/usePickerViews.js +7 -2
  255. package/node/internals/hooks/useUtils.js +5 -2
  256. package/node/internals/hooks/useValueWithTimezone.js +79 -0
  257. package/node/internals/index.js +7 -0
  258. package/node/internals/utils/date-utils.js +5 -14
  259. package/node/internals/utils/fields.js +1 -1
  260. package/node/internals/utils/getDefaultReferenceDate.js +5 -4
  261. package/node/internals/utils/validation/validateDate.js +14 -6
  262. package/node/internals/utils/validation/validateTime.js +8 -8
  263. package/node/internals/utils/valueManagers.js +2 -1
  264. package/node/locales/csCZ.js +2 -2
  265. package/node/locales/elGR.js +64 -0
  266. package/node/locales/index.js +11 -0
  267. package/node/tests/describeAdapters/describeAdapters.js +3 -1
  268. package/node/tests/describeGregorianAdapter/testCalculations.js +69 -27
  269. package/node/tests/describeJalaliAdapter/testCalculations.js +21 -0
  270. package/node/timeViewRenderers/timeViewRenderers.js +12 -6
  271. package/package.json +2 -2
  272. package/tests/describeAdapters/describeAdapters.js +3 -1
  273. package/tests/describeGregorianAdapter/testCalculations.js +69 -27
  274. package/tests/describeJalaliAdapter/testCalculations.js +21 -0
  275. package/timeViewRenderers/timeViewRenderers.d.ts +3 -3
  276. package/timeViewRenderers/timeViewRenderers.js +12 -6
@@ -191,9 +191,27 @@ class AdapterDayjs {
191
191
  const comparingInValueTimezone = this.setTimezone(comparing, this.getTimezone(value));
192
192
  return value.format(comparisonTemplate) === comparingInValueTimezone.format(comparisonTemplate);
193
193
  };
194
+ /**
195
+ * Replace "default" by undefined before passing it to `dayjs
196
+ */
197
+ this.cleanTimezone = timezone => timezone === 'default' ? undefined : timezone;
194
198
  this.createSystemDate = value => {
195
199
  // TODO v7: Stop using `this.rawDayJsInstance` (drop the `instance` param on the adapters)
196
- return this.rawDayJsInstance(value);
200
+ /* istanbul ignore next */
201
+ if (this.rawDayJsInstance) {
202
+ return this.rawDayJsInstance(value);
203
+ }
204
+ if (this.hasUTCPlugin() && this.hasTimezonePlugin()) {
205
+ const timezone = _dayjs.default.tz.guess();
206
+
207
+ // We can't change the system timezone in the tests
208
+ /* istanbul ignore next */
209
+ if (timezone !== 'UTC') {
210
+ return _dayjs.default.tz(value, timezone);
211
+ }
212
+ return (0, _dayjs.default)(value);
213
+ }
214
+ return (0, _dayjs.default)(value);
197
215
  };
198
216
  this.createUTCDate = value => {
199
217
  /* istanbul ignore next */
@@ -212,9 +230,8 @@ class AdapterDayjs {
212
230
  if (!this.hasTimezonePlugin()) {
213
231
  throw new Error(MISSING_TIMEZONE_PLUGIN);
214
232
  }
215
- const cleanTimezone = timezone === 'default' ? undefined : timezone;
216
233
  const keepLocalTime = value !== undefined && !value.endsWith('Z');
217
- return (0, _dayjs.default)(value).tz(cleanTimezone, keepLocalTime);
234
+ return (0, _dayjs.default)(value).tz(this.cleanTimezone(timezone), keepLocalTime);
218
235
  };
219
236
  this.getLocaleFormats = () => {
220
237
  const locales = _dayjs.default.Ls;
@@ -271,11 +288,12 @@ class AdapterDayjs {
271
288
  }
272
289
  return value.utc();
273
290
  }
291
+
292
+ // We know that we have the UTC plugin.
293
+ // Otherwise, the value timezone would always equal "system".
294
+ // And it would be caught by the first "if" of this method.
274
295
  if (timezone === 'system') {
275
- if (this.hasUTCPlugin()) {
276
- return value.local();
277
- }
278
- return value;
296
+ return value.local();
279
297
  }
280
298
  if (!this.hasTimezonePlugin()) {
281
299
  if (timezone === 'default') {
@@ -285,8 +303,7 @@ class AdapterDayjs {
285
303
  /* istanbul ignore next */
286
304
  throw new Error(MISSING_TIMEZONE_PLUGIN);
287
305
  }
288
- const cleanZone = timezone === 'default' ? undefined : timezone;
289
- return _dayjs.default.tz(value, cleanZone);
306
+ return _dayjs.default.tz(value, this.cleanTimezone(timezone));
290
307
  };
291
308
  this.toJsDate = value => {
292
309
  return value.toDate();
@@ -345,7 +362,7 @@ class AdapterDayjs {
345
362
  if (value === null && comparing === null) {
346
363
  return true;
347
364
  }
348
- return this.dayjs(value).isSame(comparing);
365
+ return this.dayjs(value).toDate().getTime() === this.dayjs(comparing).toDate().getTime();
349
366
  };
350
367
  this.isSameYear = (value, comparing) => {
351
368
  return this.isSame(value, comparing, 'YYYY');
@@ -505,9 +522,10 @@ class AdapterDayjs {
505
522
  return [0, 1, 2, 3, 4, 5, 6].map(diff => this.formatByString(start.add(diff, 'day'), 'dd'));
506
523
  };
507
524
  this.getWeekArray = value => {
508
- const cleanLocale = this.setLocaleToValue(value);
509
- const start = cleanLocale.startOf('month').startOf('week');
510
- const end = cleanLocale.endOf('month').endOf('week');
525
+ const timezone = this.getTimezone(value);
526
+ const cleanValue = this.setLocaleToValue(value);
527
+ const start = cleanValue.startOf('month').startOf('week');
528
+ const end = cleanValue.endOf('month').endOf('week');
511
529
  let count = 0;
512
530
  let current = start;
513
531
  const nestedWeeks = [];
@@ -516,6 +534,14 @@ class AdapterDayjs {
516
534
  nestedWeeks[weekNumber] = nestedWeeks[weekNumber] || [];
517
535
  nestedWeeks[weekNumber].push(current);
518
536
  current = current.add(1, 'day');
537
+
538
+ // If the new day does not have the same offset as the old one (when switching to summer day time for example),
539
+ // Then dayjs will not automatically adjust the offset (moment does)
540
+ // We have to parse again the value to make sure the `fixOffset` method is applied
541
+ // See https://github.com/iamkun/dayjs/blob/b3624de619d6e734cd0ffdbbd3502185041c1b60/src/plugin/timezone/index.js#L72
542
+ if (this.hasTimezonePlugin() && timezone !== 'UTC' && timezone !== 'system') {
543
+ current = current.tz(this.cleanTimezone(timezone), true);
544
+ }
519
545
  count += 1;
520
546
  }
521
547
  return nestedWeeks;
@@ -537,8 +563,8 @@ class AdapterDayjs {
537
563
  this.getMeridiemText = ampm => {
538
564
  return ampm === 'am' ? 'AM' : 'PM';
539
565
  };
540
- this.rawDayJsInstance = instance || _dayjs.default;
541
- this.dayjs = withLocale(this.rawDayJsInstance, _locale);
566
+ this.rawDayJsInstance = instance;
567
+ this.dayjs = withLocale(this.rawDayJsInstance ?? _dayjs.default, _locale);
542
568
  this.locale = _locale;
543
569
  this.formats = (0, _extends2.default)({}, defaultFormats, formats);
544
570
  _dayjs.default.extend(_weekOfYear.default);
@@ -186,6 +186,13 @@ class AdapterLuxon {
186
186
  end: "'"
187
187
  };
188
188
  this.formatTokenMap = formatTokenMap;
189
+ this.setLocaleToValue = value => {
190
+ const expectedLocale = this.getCurrentLocaleCode();
191
+ if (expectedLocale === value.locale) {
192
+ return value;
193
+ }
194
+ return value.setLocale(expectedLocale);
195
+ };
189
196
  this.date = value => {
190
197
  if (typeof value === 'undefined') {
191
198
  return _luxon.DateTime.local();
@@ -231,7 +238,7 @@ class AdapterLuxon {
231
238
  if (value.zone.type === 'system') {
232
239
  return 'system';
233
240
  }
234
- return value.zoneName ?? 'system';
241
+ return value.zoneName;
235
242
  };
236
243
  this.setTimezone = (value, timezone) => {
237
244
  if (!value.zone.equals(_luxon.Info.normalizeZone(timezone))) {
@@ -246,7 +253,7 @@ class AdapterLuxon {
246
253
  return _luxon.DateTime.fromISO(isoString);
247
254
  };
248
255
  this.toISO = value => {
249
- return value.toISO({
256
+ return value.toUTC().toISO({
250
257
  format: 'extended'
251
258
  });
252
259
  };
@@ -528,11 +535,12 @@ class AdapterLuxon {
528
535
  });
529
536
  };
530
537
  this.getWeekArray = value => {
538
+ const cleanValue = this.setLocaleToValue(value);
531
539
  const {
532
540
  days
533
- } = value.endOf('month').endOf('week').diff(value.startOf('month').startOf('week'), 'days').toObject();
541
+ } = cleanValue.endOf('month').endOf('week').diff(cleanValue.startOf('month').startOf('week'), 'days').toObject();
534
542
  const weeks = [];
535
- new Array(Math.round(days)).fill(0).map((_, i) => i).map(day => value.startOf('month').startOf('week').plus({
543
+ new Array(Math.round(days)).fill(0).map((_, i) => i).map(day => cleanValue.startOf('month').startOf('week').plus({
536
544
  days: day
537
545
  })).forEach((v, i) => {
538
546
  if (i === 0 || i % 7 === 0 && i > 6) {
@@ -14,7 +14,11 @@ const formatTokenMap = {
14
14
  // Year
15
15
  Y: 'year',
16
16
  YY: 'year',
17
- YYYY: 'year',
17
+ YYYY: {
18
+ sectionType: 'year',
19
+ contentType: 'digit',
20
+ maxLength: 4
21
+ },
18
22
  // Month
19
23
  M: {
20
24
  sectionType: 'month',
@@ -240,6 +244,9 @@ class AdapterMoment {
240
244
  return zone ?? this.moment.defaultZone?.name ?? 'system';
241
245
  };
242
246
  this.setTimezone = (value, timezone) => {
247
+ if (this.getTimezone(value) === timezone) {
248
+ return value;
249
+ }
243
250
  if (timezone === 'UTC') {
244
251
  return value.clone().utc();
245
252
  }
@@ -247,16 +254,18 @@ class AdapterMoment {
247
254
  return value.clone().local();
248
255
  }
249
256
  if (!this.hasTimezonePlugin()) {
250
- if (timezone === 'default') {
251
- return value;
252
- }
253
-
254
257
  /* istanbul ignore next */
255
- throw new Error(MISSING_TIMEZONE_PLUGIN);
258
+ if (timezone !== 'default') {
259
+ throw new Error(MISSING_TIMEZONE_PLUGIN);
260
+ }
261
+ return value;
256
262
  }
257
263
  const cleanZone = timezone === 'default' ?
258
264
  // @ts-ignore
259
265
  this.moment.defaultZone?.name ?? 'system' : timezone;
266
+ if (cleanZone === 'system') {
267
+ return value.clone().local();
268
+ }
260
269
  const newValue = value.clone();
261
270
  newValue.tz(cleanZone);
262
271
  return newValue;
@@ -470,9 +479,9 @@ class AdapterMoment {
470
479
  return _moment.default.weekdaysShort(true);
471
480
  };
472
481
  this.getWeekArray = value => {
473
- const cleanLocale = this.setLocaleToValue(value);
474
- const start = cleanLocale.clone().startOf('month').startOf('week');
475
- const end = cleanLocale.clone().endOf('month').endOf('week');
482
+ const cleanValue = this.setLocaleToValue(value);
483
+ const start = cleanValue.clone().startOf('month').startOf('week');
484
+ const end = cleanValue.clone().endOf('month').endOf('week');
476
485
  let count = 0;
477
486
  let current = start;
478
487
  const nestedWeeks = [];
@@ -24,8 +24,10 @@ var _dateUtils = require("../internals/utils/date-utils");
24
24
  var _PickerViewRoot = require("../internals/components/PickerViewRoot");
25
25
  var _defaultReduceAnimations = require("../internals/utils/defaultReduceAnimations");
26
26
  var _dateCalendarClasses = require("./dateCalendarClasses");
27
+ var _useValueWithTimezone = require("../internals/hooks/useValueWithTimezone");
28
+ var _valueManagers = require("../internals/utils/valueManagers");
27
29
  var _jsxRuntime = require("react/jsx-runtime");
28
- const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "disableFuture", "disablePast", "defaultCalendarMonth", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "components", "componentsProps", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsPerRow", "monthsPerRow"];
30
+ const _excluded = ["autoFocus", "onViewChange", "value", "defaultValue", "referenceDate", "disableFuture", "disablePast", "defaultCalendarMonth", "onChange", "onYearChange", "onMonthChange", "reduceAnimations", "shouldDisableDate", "shouldDisableMonth", "shouldDisableYear", "view", "views", "openTo", "className", "disabled", "readOnly", "minDate", "maxDate", "disableHighlightToday", "focusedView", "onFocusedViewChange", "showDaysOutsideCurrentMonth", "fixedWeekNumber", "dayOfWeekFormatter", "components", "componentsProps", "slots", "slotProps", "loading", "renderLoading", "displayWeekNumber", "yearsPerRow", "monthsPerRow", "timezone"];
29
31
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
30
32
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
33
  const useUtilityClasses = ownerState => {
@@ -92,6 +94,7 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
92
94
  onViewChange,
93
95
  value: valueProp,
94
96
  defaultValue,
97
+ referenceDate: referenceDateProp,
95
98
  disableFuture,
96
99
  disablePast,
97
100
  defaultCalendarMonth,
@@ -124,18 +127,21 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
124
127
  renderLoading,
125
128
  displayWeekNumber,
126
129
  yearsPerRow,
127
- monthsPerRow
130
+ monthsPerRow,
131
+ timezone: timezoneProp
128
132
  } = props,
129
133
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
130
- const [value, setValue] = (0, _utils.unstable_useControlled)({
134
+ const {
135
+ value,
136
+ handleValueChange,
137
+ timezone
138
+ } = (0, _useValueWithTimezone.useControlledValueWithTimezone)({
131
139
  name: 'DateCalendar',
132
- state: 'value',
133
- controlled: valueProp,
134
- default: defaultValue ?? null
135
- });
136
- const handleValueChange = (0, _utils.unstable_useEventCallback)((newValue, selectionState) => {
137
- setValue(newValue);
138
- onChange?.(newValue, selectionState);
140
+ timezone: timezoneProp,
141
+ value: valueProp,
142
+ defaultValue,
143
+ onChange,
144
+ valueManager: _valueManagers.singleItemValueManager
139
145
  });
140
146
  const {
141
147
  view,
@@ -155,6 +161,7 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
155
161
  onFocusedViewChange
156
162
  });
157
163
  const {
164
+ referenceDate,
158
165
  calendarState,
159
166
  changeFocusedDay,
160
167
  changeMonth,
@@ -164,13 +171,15 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
164
171
  } = (0, _useCalendarState.useCalendarState)({
165
172
  value,
166
173
  defaultCalendarMonth,
174
+ referenceDate: referenceDateProp,
167
175
  reduceAnimations,
168
176
  onMonthChange,
169
177
  minDate,
170
178
  maxDate,
171
179
  shouldDisableDate,
172
180
  disablePast,
173
- disableFuture
181
+ disableFuture,
182
+ timezone
174
183
  });
175
184
  const handleDateMonthChange = (0, _utils.unstable_useEventCallback)(newDate => {
176
185
  const startOfMonth = utils.startOfMonth(newDate);
@@ -182,7 +191,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
182
191
  maxDate: utils.isAfter(maxDate, endOfMonth) ? endOfMonth : maxDate,
183
192
  disablePast,
184
193
  disableFuture,
185
- isDateDisabled
194
+ isDateDisabled,
195
+ timezone
186
196
  }) : newDate;
187
197
  if (closestEnabledDate) {
188
198
  setValueAndGoToNextView(closestEnabledDate, 'finish');
@@ -203,7 +213,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
203
213
  maxDate: utils.isAfter(maxDate, endOfYear) ? endOfYear : maxDate,
204
214
  disablePast,
205
215
  disableFuture,
206
- isDateDisabled
216
+ isDateDisabled,
217
+ timezone
207
218
  }) : newDate;
208
219
  if (closestEnabledDate) {
209
220
  setValueAndGoToNextView(closestEnabledDate, 'finish');
@@ -215,9 +226,9 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
215
226
  changeFocusedDay(closestEnabledDate, true);
216
227
  });
217
228
  const handleSelectedDayChange = (0, _utils.unstable_useEventCallback)(day => {
218
- if (value && day) {
229
+ if (day) {
219
230
  // If there is a date already selected, then we want to keep its time
220
- return handleValueChange((0, _dateUtils.mergeDateAndTime)(utils, day, value), 'finish');
231
+ return handleValueChange((0, _dateUtils.mergeDateAndTime)(utils, day, value ?? referenceDate), 'finish');
221
232
  }
222
233
  return handleValueChange(day, 'finish');
223
234
  });
@@ -242,7 +253,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
242
253
  const commonViewProps = {
243
254
  disableHighlightToday,
244
255
  readOnly,
245
- disabled
256
+ disabled,
257
+ timezone
246
258
  };
247
259
  const gridLabelId = `${id}-grid-label`;
248
260
  const hasFocus = focusedView !== null;
@@ -281,7 +293,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
281
293
  reduceAnimations: reduceAnimations,
282
294
  labelId: gridLabelId,
283
295
  slots: slots,
284
- slotProps: slotProps
296
+ slotProps: slotProps,
297
+ timezone: timezone
285
298
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(DateCalendarViewTransitionContainer, {
286
299
  reduceAnimations: reduceAnimations,
287
300
  className: classes.viewTransitionContainer,
@@ -294,7 +307,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
294
307
  shouldDisableYear: shouldDisableYear,
295
308
  hasFocus: hasFocus,
296
309
  onFocusedViewChange: isViewFocused => setFocusedView('year', isViewFocused),
297
- yearsPerRow: yearsPerRow
310
+ yearsPerRow: yearsPerRow,
311
+ referenceDate: referenceDate
298
312
  })), view === 'month' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_MonthCalendar.MonthCalendar, (0, _extends2.default)({}, baseDateValidationProps, commonViewProps, {
299
313
  hasFocus: hasFocus,
300
314
  className: className,
@@ -302,7 +316,8 @@ const DateCalendar = /*#__PURE__*/React.forwardRef(function DateCalendar(inProps
302
316
  onChange: handleDateMonthChange,
303
317
  shouldDisableMonth: shouldDisableMonth,
304
318
  onFocusedViewChange: isViewFocused => setFocusedView('month', isViewFocused),
305
- monthsPerRow: monthsPerRow
319
+ monthsPerRow: monthsPerRow,
320
+ referenceDate: referenceDate
306
321
  })), view === 'day' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_DayCalendar.DayCalendar, (0, _extends2.default)({}, calendarState, baseDateValidationProps, commonViewProps, {
307
322
  onMonthSwitchingAnimationEnd: onMonthSwitchingAnimationEnd,
308
323
  onFocusedDayChange: changeFocusedDay,
@@ -365,7 +380,7 @@ process.env.NODE_ENV !== "production" ? DateCalendar.propTypes = {
365
380
  */
366
381
  dayOfWeekFormatter: _propTypes.default.func,
367
382
  /**
368
- * Default calendar month displayed when `value={null}`.
383
+ * Default calendar month displayed when `value` and `defaultValue` are empty.
369
384
  */
370
385
  defaultCalendarMonth: _propTypes.default.any,
371
386
  /**
@@ -474,6 +489,11 @@ process.env.NODE_ENV !== "production" ? DateCalendar.propTypes = {
474
489
  * @default typeof navigator !== 'undefined' && /(android)/i.test(navigator.userAgent)
475
490
  */
476
491
  reduceAnimations: _propTypes.default.bool,
492
+ /**
493
+ * The date used to generate the new value when both `value` and `defaultValue` are empty.
494
+ * @default The closest valid date using the validation props, except callbacks such as `shouldDisableDate`.
495
+ */
496
+ referenceDate: _propTypes.default.any,
477
497
  /**
478
498
  * Component displaying when passed `loading` true.
479
499
  * @returns {React.ReactNode} The node to render when loading.
@@ -526,6 +546,14 @@ process.env.NODE_ENV !== "production" ? DateCalendar.propTypes = {
526
546
  * The system prop that allows defining system overrides as well as additional CSS styles.
527
547
  */
528
548
  sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object]),
549
+ /**
550
+ * Choose which timezone to use for the value.
551
+ * Example: "default", "system", "UTC", "America/New_York".
552
+ * If you pass values from other timezones to some props, they will be converted to this timezone before being used.
553
+ * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details.
554
+ * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise.
555
+ */
556
+ timezone: _propTypes.default.string,
529
557
  /**
530
558
  * The selected value.
531
559
  * Used when the component is controlled.
@@ -146,8 +146,6 @@ function WrappedDay(_ref) {
146
146
  isViewFocused
147
147
  } = _ref,
148
148
  other = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
149
- const utils = (0, _useUtils.useUtils)();
150
- const now = (0, _useUtils.useNow)();
151
149
  const {
152
150
  disabled,
153
151
  disableHighlightToday,
@@ -156,8 +154,11 @@ function WrappedDay(_ref) {
156
154
  components,
157
155
  componentsProps,
158
156
  slots,
159
- slotProps
157
+ slotProps,
158
+ timezone
160
159
  } = parentProps;
160
+ const utils = (0, _useUtils.useUtils)();
161
+ const now = (0, _useUtils.useNow)(timezone);
161
162
  const isFocusableDay = focusableDay !== null && utils.isSameDay(day, focusableDay);
162
163
  const isSelected = selectedDays.some(selectedDay => utils.isSameDay(selectedDay, day));
163
164
  const isToday = utils.isSameDay(day, now);
@@ -215,15 +216,10 @@ function WrappedDay(_ref) {
215
216
  * @ignore - do not document.
216
217
  */
217
218
  function DayCalendar(inProps) {
218
- const now = (0, _useUtils.useNow)();
219
- const utils = (0, _useUtils.useUtils)();
220
219
  const props = (0, _styles.useThemeProps)({
221
220
  props: inProps,
222
221
  name: 'MuiDayCalendar'
223
222
  });
224
- const classes = useUtilityClasses(props);
225
- const theme = (0, _styles.useTheme)();
226
- const isRTL = theme.direction === 'rtl';
227
223
  const {
228
224
  onFocusedDayChange,
229
225
  className,
@@ -253,8 +249,14 @@ function DayCalendar(inProps) {
253
249
  gridLabelId,
254
250
  displayWeekNumber,
255
251
  fixedWeekNumber,
256
- autoFocus
252
+ autoFocus,
253
+ timezone
257
254
  } = props;
255
+ const now = (0, _useUtils.useNow)(timezone);
256
+ const utils = (0, _useUtils.useUtils)();
257
+ const classes = useUtilityClasses(props);
258
+ const theme = (0, _styles.useTheme)();
259
+ const isRTL = theme.direction === 'rtl';
258
260
  const isDateDisabled = (0, _useIsDateDisabled.useIsDateDisabled)({
259
261
  shouldDisableDate,
260
262
  shouldDisableMonth,
@@ -262,7 +264,8 @@ function DayCalendar(inProps) {
262
264
  minDate,
263
265
  maxDate,
264
266
  disablePast,
265
- disableFuture
267
+ disableFuture,
268
+ timezone
266
269
  });
267
270
  const localeText = (0, _useUtils.useLocaleText)();
268
271
  const [internalHasFocus, setInternalHasFocus] = (0, _utils2.unstable_useControlled)({
@@ -305,7 +308,8 @@ function DayCalendar(inProps) {
305
308
  date: newFocusedDayDefault,
306
309
  minDate: isRTL ? newFocusedDayDefault : utils.startOfMonth(nextAvailableMonth),
307
310
  maxDate: isRTL ? utils.endOfMonth(nextAvailableMonth) : newFocusedDayDefault,
308
- isDateDisabled
311
+ isDateDisabled,
312
+ timezone
309
313
  });
310
314
  focusDay(closestDayToFocus || newFocusedDayDefault);
311
315
  event.preventDefault();
@@ -320,7 +324,8 @@ function DayCalendar(inProps) {
320
324
  date: newFocusedDayDefault,
321
325
  minDate: isRTL ? utils.startOfMonth(nextAvailableMonth) : newFocusedDayDefault,
322
326
  maxDate: isRTL ? newFocusedDayDefault : utils.endOfMonth(nextAvailableMonth),
323
- isDateDisabled
327
+ isDateDisabled,
328
+ timezone
324
329
  });
325
330
  focusDay(closestDayToFocus || newFocusedDayDefault);
326
331
  event.preventDefault();
@@ -371,14 +376,16 @@ function DayCalendar(inProps) {
371
376
  maxDate: endOfMonth,
372
377
  disablePast,
373
378
  disableFuture,
374
- isDateDisabled
379
+ isDateDisabled,
380
+ timezone
375
381
  });
376
382
  }
377
383
  return internalFocusedDay;
378
- }, [currentMonth, disableFuture, disablePast, internalFocusedDay, isDateDisabled, utils]);
384
+ }, [currentMonth, disableFuture, disablePast, internalFocusedDay, isDateDisabled, utils, timezone]);
379
385
  const weeksToDisplay = React.useMemo(() => {
380
- const toDisplay = utils.getWeekArray(currentMonth);
381
- let nextMonth = utils.addMonths(currentMonth, 1);
386
+ const currentMonthWithTimezone = utils.setTimezone(currentMonth, timezone);
387
+ const toDisplay = utils.getWeekArray(currentMonthWithTimezone);
388
+ let nextMonth = utils.addMonths(currentMonthWithTimezone, 1);
382
389
  while (fixedWeekNumber && toDisplay.length < fixedWeekNumber) {
383
390
  const additionalWeeks = utils.getWeekArray(nextMonth);
384
391
  const hasCommonWeek = utils.isSameDay(toDisplay[toDisplay.length - 1][0], additionalWeeks[0][0]);
@@ -390,7 +397,7 @@ function DayCalendar(inProps) {
390
397
  nextMonth = utils.addMonths(nextMonth, 1);
391
398
  }
392
399
  return toDisplay;
393
- }, [currentMonth, fixedWeekNumber, utils]);
400
+ }, [currentMonth, fixedWeekNumber, utils, timezone]);
394
401
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
395
402
  role: "grid",
396
403
  "aria-labelledby": gridLabelId,
@@ -122,7 +122,8 @@ function PickersCalendarHeader(inProps) {
122
122
  view,
123
123
  reduceAnimations,
124
124
  views,
125
- labelId
125
+ labelId,
126
+ timezone
126
127
  } = props;
127
128
  const ownerState = props;
128
129
  const classes = useUtilityClasses(props);
@@ -150,11 +151,13 @@ function PickersCalendarHeader(inProps) {
150
151
  const selectPreviousMonth = () => onMonthChange(utils.addMonths(month, -1), 'right');
151
152
  const isNextMonthDisabled = (0, _dateHelpersHooks.useNextMonthDisabled)(month, {
152
153
  disableFuture,
153
- maxDate
154
+ maxDate,
155
+ timezone
154
156
  });
155
157
  const isPreviousMonthDisabled = (0, _dateHelpersHooks.usePreviousMonthDisabled)(month, {
156
158
  disablePast,
157
- minDate
159
+ minDate,
160
+ timezone
158
161
  });
159
162
  const handleToggleView = () => {
160
163
  if (views.length === 1 || !onViewChange || disabled) {
@@ -10,7 +10,8 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
11
11
  var _useIsDateDisabled = require("./useIsDateDisabled");
12
12
  var _useUtils = require("../internals/hooks/useUtils");
13
- var _dateUtils = require("../internals/utils/date-utils");
13
+ var _valueManagers = require("../internals/utils/valueManagers");
14
+ var _getDefaultReferenceDate = require("../internals/utils/getDefaultReferenceDate");
14
15
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
16
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
16
17
  const createCalendarStateReducer = (reduceAnimations, disableSwitchToMonthOnDayFocus, utils) => (state, action) => {
@@ -43,25 +44,47 @@ const createCalendarStateReducer = (reduceAnimations, disableSwitchToMonthOnDayF
43
44
  }
44
45
  };
45
46
  exports.createCalendarStateReducer = createCalendarStateReducer;
46
- const useCalendarState = ({
47
- value,
48
- defaultCalendarMonth,
49
- disableFuture,
50
- disablePast,
51
- disableSwitchToMonthOnDayFocus = false,
52
- maxDate,
53
- minDate,
54
- onMonthChange,
55
- reduceAnimations,
56
- shouldDisableDate
57
- }) => {
58
- const now = (0, _useUtils.useNow)();
47
+ const useCalendarState = params => {
48
+ const {
49
+ value,
50
+ referenceDate: referenceDateProp,
51
+ defaultCalendarMonth,
52
+ disableFuture,
53
+ disablePast,
54
+ disableSwitchToMonthOnDayFocus = false,
55
+ maxDate,
56
+ minDate,
57
+ onMonthChange,
58
+ reduceAnimations,
59
+ shouldDisableDate,
60
+ timezone
61
+ } = params;
62
+ const now = (0, _useUtils.useNow)(timezone);
59
63
  const utils = (0, _useUtils.useUtils)();
60
64
  const reducerFn = React.useRef(createCalendarStateReducer(Boolean(reduceAnimations), disableSwitchToMonthOnDayFocus, utils)).current;
65
+ const referenceDate = React.useMemo(() => {
66
+ let externalReferenceDate = null;
67
+ if (referenceDateProp) {
68
+ externalReferenceDate = referenceDateProp;
69
+ } else if (defaultCalendarMonth) {
70
+ // For `defaultCalendarMonth`, we just want to keep the month and the year to avoid a behavior change.
71
+ externalReferenceDate = utils.startOfMonth(defaultCalendarMonth);
72
+ }
73
+ return _valueManagers.singleItemValueManager.getInitialReferenceValue({
74
+ value,
75
+ utils,
76
+ timezone,
77
+ props: params,
78
+ referenceDate: externalReferenceDate,
79
+ granularity: _getDefaultReferenceDate.SECTION_TYPE_GRANULARITY.day
80
+ });
81
+ }, [] // eslint-disable-line react-hooks/exhaustive-deps
82
+ );
83
+
61
84
  const [calendarState, dispatch] = React.useReducer(reducerFn, {
62
85
  isMonthSwitchingAnimating: false,
63
86
  focusedDay: value || now,
64
- currentMonth: utils.startOfMonth(value ?? defaultCalendarMonth ?? (0, _dateUtils.clamp)(utils, now, minDate, maxDate)),
87
+ currentMonth: utils.startOfMonth(referenceDate),
65
88
  slideDirection: 'left'
66
89
  });
67
90
  const handleChangeMonth = React.useCallback(payload => {
@@ -87,7 +110,8 @@ const useCalendarState = ({
87
110
  minDate,
88
111
  maxDate,
89
112
  disableFuture,
90
- disablePast
113
+ disablePast,
114
+ timezone
91
115
  });
92
116
  const onMonthSwitchingAnimationEnd = React.useCallback(() => {
93
117
  dispatch({
@@ -104,6 +128,7 @@ const useCalendarState = ({
104
128
  }
105
129
  });
106
130
  return {
131
+ referenceDate,
107
132
  calendarState,
108
133
  changeMonth,
109
134
  changeFocusedDay,
@@ -16,7 +16,8 @@ const useIsDateDisabled = ({
16
16
  minDate,
17
17
  maxDate,
18
18
  disableFuture,
19
- disablePast
19
+ disablePast,
20
+ timezone
20
21
  }) => {
21
22
  const adapter = (0, _useUtils.useLocalizationContext)();
22
23
  return React.useCallback(day => (0, _validateDate.validateDate)({
@@ -29,8 +30,9 @@ const useIsDateDisabled = ({
29
30
  minDate,
30
31
  maxDate,
31
32
  disableFuture,
32
- disablePast
33
+ disablePast,
34
+ timezone
33
35
  }
34
- }) !== null, [adapter, shouldDisableDate, shouldDisableMonth, shouldDisableYear, minDate, maxDate, disableFuture, disablePast]);
36
+ }) !== null, [adapter, shouldDisableDate, shouldDisableMonth, shouldDisableYear, minDate, maxDate, disableFuture, disablePast, timezone]);
35
37
  };
36
38
  exports.useIsDateDisabled = useIsDateDisabled;