@mui/x-date-pickers-pro 8.5.3 → 8.7.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 (94) hide show
  1. package/CHANGELOG.md +210 -0
  2. package/DateRangeCalendar/DateRangeCalendar.js +39 -38
  3. package/DateRangeCalendar/DateRangeCalendar.types.d.ts +1 -1
  4. package/DateRangeCalendar/useDragRange.d.ts +2 -2
  5. package/DateRangeCalendar/useDragRange.js +17 -17
  6. package/DateRangePicker/DateRangePicker.js +1 -1
  7. package/DateRangePicker/DateRangePickerToolbar.js +4 -4
  8. package/DateRangePickerDay/DateRangePickerDay.js +5 -4
  9. package/DateRangePickerDay2/DateRangePickerDay2.js +5 -4
  10. package/DateTimeRangePicker/DateTimeRangePicker.js +2 -2
  11. package/DateTimeRangePicker/DateTimeRangePickerTimeWrapper.js +11 -8
  12. package/DateTimeRangePicker/DateTimeRangePickerToolbar.js +3 -3
  13. package/DateTimeRangePicker/shared.js +3 -2
  14. package/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -5
  15. package/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.js +15 -9
  16. package/DesktopTimeRangePicker/DesktopTimeRangePicker.js +5 -4
  17. package/MobileDateRangePicker/MobileDateRangePicker.js +6 -6
  18. package/MobileDateTimeRangePicker/MobileDateTimeRangePicker.js +7 -6
  19. package/MobileTimeRangePicker/MobileTimeRangePicker.js +7 -6
  20. package/MultiInputDateRangeField/MultiInputDateRangeField.js +1 -1
  21. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +2 -2
  22. package/MultiInputTimeRangeField/MultiInputTimeRangeField.js +2 -2
  23. package/PickersRangeCalendarHeader/PickersRangeCalendarHeader.js +4 -4
  24. package/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -1
  25. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +2 -2
  26. package/SingleInputTimeRangeField/SingleInputTimeRangeField.js +2 -2
  27. package/StaticDateRangePicker/StaticDateRangePicker.js +1 -1
  28. package/TimeRangePicker/TimeRangePicker.js +2 -2
  29. package/TimeRangePicker/TimeRangePickerTimeWrapper.js +11 -8
  30. package/TimeRangePicker/TimeRangePickerToolbar.js +7 -7
  31. package/TimeRangePicker/shared.js +3 -2
  32. package/esm/DateRangeCalendar/DateRangeCalendar.js +41 -40
  33. package/esm/DateRangeCalendar/DateRangeCalendar.types.d.ts +1 -1
  34. package/esm/DateRangeCalendar/useDragRange.d.ts +2 -2
  35. package/esm/DateRangeCalendar/useDragRange.js +17 -17
  36. package/esm/DateRangePicker/DateRangePicker.js +1 -1
  37. package/esm/DateRangePicker/DateRangePickerToolbar.js +6 -6
  38. package/esm/DateRangePickerDay/DateRangePickerDay.js +6 -5
  39. package/esm/DateRangePickerDay2/DateRangePickerDay2.js +6 -5
  40. package/esm/DateTimeRangePicker/DateTimeRangePicker.js +2 -2
  41. package/esm/DateTimeRangePicker/DateTimeRangePickerTimeWrapper.js +10 -7
  42. package/esm/DateTimeRangePicker/DateTimeRangePickerToolbar.js +5 -5
  43. package/esm/DateTimeRangePicker/shared.js +4 -3
  44. package/esm/DesktopDateRangePicker/DesktopDateRangePicker.js +5 -5
  45. package/esm/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.js +13 -7
  46. package/esm/DesktopTimeRangePicker/DesktopTimeRangePicker.js +6 -5
  47. package/esm/MobileDateRangePicker/MobileDateRangePicker.js +6 -6
  48. package/esm/MobileDateTimeRangePicker/MobileDateTimeRangePicker.js +6 -5
  49. package/esm/MobileTimeRangePicker/MobileTimeRangePicker.js +7 -6
  50. package/esm/MultiInputDateRangeField/MultiInputDateRangeField.js +1 -1
  51. package/esm/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +2 -2
  52. package/esm/MultiInputTimeRangeField/MultiInputTimeRangeField.js +2 -2
  53. package/esm/PickersRangeCalendarHeader/PickersRangeCalendarHeader.js +6 -6
  54. package/esm/SingleInputDateRangeField/SingleInputDateRangeField.js +1 -1
  55. package/esm/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +2 -2
  56. package/esm/SingleInputTimeRangeField/SingleInputTimeRangeField.js +2 -2
  57. package/esm/StaticDateRangePicker/StaticDateRangePicker.js +1 -1
  58. package/esm/TimeRangePicker/TimeRangePicker.js +2 -2
  59. package/esm/TimeRangePicker/TimeRangePickerTimeWrapper.js +10 -7
  60. package/esm/TimeRangePicker/TimeRangePickerToolbar.js +9 -9
  61. package/esm/TimeRangePicker/shared.js +4 -3
  62. package/esm/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.js +2 -0
  63. package/esm/hooks/useMultiInputRangeField/useTextFieldProps.js +2 -0
  64. package/esm/index.js +2 -1
  65. package/esm/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +1 -1
  66. package/esm/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +1 -1
  67. package/esm/internals/utils/date-range-manager.d.ts +4 -3
  68. package/esm/internals/utils/date-range-manager.js +14 -8
  69. package/esm/internals/utils/date-utils.d.ts +5 -5
  70. package/esm/internals/utils/date-utils.js +11 -11
  71. package/esm/internals/utils/valueManagers.js +12 -10
  72. package/esm/managers/useDateRangeManager.js +8 -8
  73. package/esm/managers/useDateTimeRangeManager.js +9 -9
  74. package/esm/managers/useTimeRangeManager.js +10 -10
  75. package/esm/validation/validateDateRange.js +1 -1
  76. package/esm/validation/validateDateTimeRange.js +1 -1
  77. package/esm/validation/validateTimeRange.js +1 -1
  78. package/hooks/useMultiInputRangeField/useMultiInputRangeFieldSelectedSections.js +1 -0
  79. package/hooks/useMultiInputRangeField/useTextFieldProps.js +1 -0
  80. package/index.js +1 -1
  81. package/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.js +1 -1
  82. package/internals/hooks/useMobileRangePicker/useMobileRangePicker.js +1 -1
  83. package/internals/utils/date-range-manager.d.ts +4 -3
  84. package/internals/utils/date-range-manager.js +15 -8
  85. package/internals/utils/date-utils.d.ts +5 -5
  86. package/internals/utils/date-utils.js +11 -11
  87. package/internals/utils/valueManagers.js +12 -10
  88. package/managers/useDateRangeManager.js +6 -6
  89. package/managers/useDateTimeRangeManager.js +7 -7
  90. package/managers/useTimeRangeManager.js +8 -8
  91. package/package.json +4 -4
  92. package/validation/validateDateRange.js +1 -1
  93. package/validation/validateDateTimeRange.js +1 -1
  94. package/validation/validateTimeRange.js +1 -1
@@ -60,7 +60,7 @@ process.env.NODE_ENV !== "production" ? TimeRangePicker.propTypes = {
60
60
  // ----------------------------------------------------------------------
61
61
  /**
62
62
  * 12h/24h view for hour selection clock.
63
- * @default utils.is12HourCycleInCurrentLocale()
63
+ * @default adapter.is12HourCycleInCurrentLocale()
64
64
  */
65
65
  ampm: _propTypes.default.bool,
66
66
  /**
@@ -250,7 +250,7 @@ process.env.NODE_ENV !== "production" ? TimeRangePicker.propTypes = {
250
250
  * The date used to generate the new value when both `value` and `defaultValue` are empty.
251
251
  * @default The closest valid date-time using the validation props, except callbacks like `shouldDisable<...>`.
252
252
  */
253
- referenceDate: _propTypes.default.object,
253
+ referenceDate: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.object), _propTypes.default.object]),
254
254
  /**
255
255
  * The currently selected sections.
256
256
  * This prop accepts four formats:
@@ -7,33 +7,35 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.TimeRangePickerTimeWrapper = TimeRangePickerTimeWrapper;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
- var _internals = require("@mui/x-date-pickers/internals");
10
+ var _hooks = require("@mui/x-date-pickers/hooks");
11
11
  var _dateUtils = require("../internals/utils/date-utils");
12
12
  var _dateRangeManager = require("../internals/utils/date-range-manager");
13
- var _hooks = require("../hooks");
14
- const _excluded = ["viewRenderer", "value", "onChange", "defaultValue", "onViewChange", "views", "className"];
13
+ var _hooks2 = require("../hooks");
14
+ const _excluded = ["viewRenderer", "value", "onChange", "defaultValue", "onViewChange", "views", "className", "referenceDate"];
15
15
  /**
16
16
  * @ignore - internal component.
17
17
  */
18
18
  function TimeRangePickerTimeWrapper(props) {
19
- const utils = (0, _internals.useUtils)();
19
+ const adapter = (0, _hooks.usePickerAdapter)();
20
20
  const {
21
21
  viewRenderer,
22
22
  value,
23
23
  onChange,
24
24
  defaultValue,
25
25
  onViewChange,
26
- views
26
+ views,
27
+ referenceDate: referenceDateProp
27
28
  } = props,
28
29
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
29
30
  const {
30
31
  rangePosition
31
- } = (0, _hooks.usePickerRangePositionContext)();
32
+ } = (0, _hooks2.usePickerRangePositionContext)();
32
33
  if (!viewRenderer) {
33
34
  return null;
34
35
  }
35
36
  const currentValue = (rangePosition === 'start' ? value?.[0] : value?.[1]) ?? null;
36
37
  const currentDefaultValue = (rangePosition === 'start' ? defaultValue?.[0] : defaultValue?.[1]) ?? null;
38
+ const referenceDate = (0, _dateRangeManager.resolveReferenceDate)(referenceDateProp, rangePosition);
37
39
  const handleOnChange = (newDate, selectionState, selectedView) => {
38
40
  if (!onChange || !value) {
39
41
  return;
@@ -42,14 +44,15 @@ function TimeRangePickerTimeWrapper(props) {
42
44
  newRange
43
45
  } = (0, _dateRangeManager.calculateRangeChange)({
44
46
  newDate,
45
- utils,
47
+ adapter,
46
48
  range: value,
47
49
  rangePosition
48
50
  });
49
- const isFullRangeSelected = rangePosition === 'end' && (0, _dateUtils.isRangeValid)(utils, newRange);
51
+ const isFullRangeSelected = rangePosition === 'end' && (0, _dateUtils.isRangeValid)(adapter, newRange);
50
52
  onChange(newRange, isFullRangeSelected ? 'finish' : 'partial', selectedView);
51
53
  };
52
54
  return viewRenderer((0, _extends2.default)({}, other, {
55
+ referenceDate,
53
56
  views,
54
57
  onViewChange,
55
58
  value: currentValue,
@@ -99,13 +99,13 @@ function TimeRangePickerToolbarTimeElement(props) {
99
99
  separatorClasses,
100
100
  toolbarPlaceholder
101
101
  } = props;
102
- const utils = (0, _internals.useUtils)();
102
+ const adapter = (0, _hooks.usePickerAdapter)();
103
103
  const {
104
104
  variant,
105
105
  views
106
106
  } = (0, _hooks.usePickerContext)();
107
- const formatHours = time => ampm ? utils.format(time, 'hours12h') : utils.format(time, 'hours24h');
108
- const meridiemMode = (0, _internals.getMeridiem)(value, utils);
107
+ const formatHours = time => ampm ? adapter.format(time, 'hours12h') : adapter.format(time, 'hours24h');
108
+ const meridiemMode = (0, _internals.getMeridiem)(value, adapter);
109
109
  const sectionWidth = variant === 'desktop' ? _internals.MULTI_SECTION_CLOCK_SECTION_WIDTH : '100%';
110
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(TimeRangePickerToolbarTimeContainer, {
111
111
  children: [views.includes('hours') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
@@ -114,7 +114,7 @@ function TimeRangePickerToolbarTimeElement(props) {
114
114
  width: sectionWidth,
115
115
  onClick: () => onViewChange('hours'),
116
116
  selected: view === 'hours',
117
- value: utils.isValid(value) ? formatHours(value) : toolbarPlaceholder
117
+ value: adapter.isValid(value) ? formatHours(value) : toolbarPlaceholder
118
118
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(TimeRangePickerToolbarSeparator, {
119
119
  variant: "h5",
120
120
  value: ":",
@@ -124,7 +124,7 @@ function TimeRangePickerToolbarTimeElement(props) {
124
124
  width: sectionWidth,
125
125
  onClick: () => onViewChange('minutes'),
126
126
  selected: view === 'minutes' || !views.includes('minutes') && view === 'hours',
127
- value: utils.isValid(value) ? utils.format(value, 'minutes') : toolbarPlaceholder,
127
+ value: adapter.isValid(value) ? adapter.format(value, 'minutes') : toolbarPlaceholder,
128
128
  disabled: !views.includes('minutes')
129
129
  })]
130
130
  }), views.includes('seconds') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
@@ -137,13 +137,13 @@ function TimeRangePickerToolbarTimeElement(props) {
137
137
  width: sectionWidth,
138
138
  onClick: () => onViewChange('seconds'),
139
139
  selected: view === 'seconds',
140
- value: value ? utils.format(value, 'seconds') : toolbarPlaceholder
140
+ value: value ? adapter.format(value, 'seconds') : toolbarPlaceholder
141
141
  })]
142
142
  }), ampm && /*#__PURE__*/(0, _jsxRuntime.jsx)(_internals.PickersToolbarButton, {
143
143
  variant: "h5",
144
144
  onClick: () => onViewChange('meridiem'),
145
145
  selected: view === 'meridiem',
146
- value: value && meridiemMode ? (0, _internals.formatMeridiem)(utils, meridiemMode) : toolbarPlaceholder,
146
+ value: value && meridiemMode ? (0, _internals.formatMeridiem)(adapter, meridiemMode) : toolbarPlaceholder,
147
147
  width: sectionWidth
148
148
  })]
149
149
  });
@@ -10,16 +10,17 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _styles = require("@mui/material/styles");
12
12
  var _internals = require("@mui/x-date-pickers/internals");
13
+ var _hooks = require("@mui/x-date-pickers/hooks");
13
14
  var _TimeRangePickerToolbar = require("./TimeRangePickerToolbar");
14
15
  var _TimeRangePickerTabs = require("./TimeRangePickerTabs");
15
16
  function useTimeRangePickerDefaultizedProps(props, name) {
16
- const utils = (0, _internals.useUtils)();
17
+ const adapter = (0, _hooks.usePickerAdapter)();
17
18
  const themeProps = (0, _styles.useThemeProps)({
18
19
  props,
19
20
  name
20
21
  });
21
22
  const validationProps = (0, _internals.useApplyDefaultValuesToTimeValidationProps)(themeProps);
22
- const ampm = themeProps.ampm ?? utils.is12HourCycleInCurrentLocale();
23
+ const ampm = themeProps.ampm ?? adapter.is12HourCycleInCurrentLocale();
23
24
  const {
24
25
  openTo,
25
26
  views: defaultViews
@@ -15,11 +15,12 @@ import { styled, useThemeProps } from '@mui/material/styles';
15
15
  import composeClasses from '@mui/utils/composeClasses';
16
16
  import useId from '@mui/utils/useId';
17
17
  import { Watermark } from '@mui/x-license';
18
- import { DayCalendar, useReduceAnimations, useCalendarState, useUtils, DEFAULT_DESKTOP_MODE_MEDIA_QUERY, useControlledValue, useViews, usePickerPrivateContext, areDatesEqual, useApplyDefaultValuesToDateValidationProps } from '@mui/x-date-pickers/internals';
18
+ import { DayCalendar, useReduceAnimations, useCalendarState, DEFAULT_DESKTOP_MODE_MEDIA_QUERY, useControlledValue, useViews, usePickerPrivateContext, areDatesEqual, useApplyDefaultValuesToDateValidationProps } from '@mui/x-date-pickers/internals';
19
19
  import { warnOnce } from '@mui/x-internals/warning';
20
+ import { usePickerAdapter } from '@mui/x-date-pickers/hooks';
20
21
  import { dateRangeCalendarClasses, getDateRangeCalendarUtilityClass } from "./dateRangeCalendarClasses.js";
21
22
  import { isEndOfRange, isRangeValid, isStartOfRange, isWithinRange } from "../internals/utils/date-utils.js";
22
- import { calculateRangeChange, calculateRangePreview } from "../internals/utils/date-range-manager.js";
23
+ import { calculateRangeChange, calculateRangePreview, resolveReferenceDate } from "../internals/utils/date-range-manager.js";
23
24
  import { DateRangePickerDay, dateRangePickerDayClasses as dayClasses } from "../DateRangePickerDay/index.js";
24
25
  import { rangeValueManager } from "../internals/utils/valueManagers.js";
25
26
  import { useDragRange } from "./useDragRange.js";
@@ -29,7 +30,7 @@ import { PickersRangeCalendarHeader } from "../PickersRangeCalendarHeader/index.
29
30
  import { useNullablePickerRangePositionContext } from "../internals/hooks/useNullablePickerRangePositionContext.js";
30
31
  import { dateRangePickerDay2Classes } from "../DateRangePickerDay2/index.js";
31
32
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
32
- const releaseInfo = "MTc1MDI4NDAwMDAwMA==";
33
+ const releaseInfo = "MTc1MTU4MDAwMDAwMA==";
33
34
  const DateRangeCalendarRoot = styled('div', {
34
35
  name: 'MuiDateRangeCalendar',
35
36
  slot: 'Root'
@@ -187,7 +188,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
187
188
  focusedView: focusedViewProp,
188
189
  onFocusedViewChange
189
190
  });
190
- const utils = useUtils();
191
+ const adapter = usePickerAdapter();
191
192
  const id = useId();
192
193
  const {
193
194
  rangePosition,
@@ -208,7 +209,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
208
209
  newRange
209
210
  } = calculateRangeChange({
210
211
  newDate,
211
- utils,
212
+ adapter,
212
213
  range: value,
213
214
  rangePosition,
214
215
  allowRangeFlip,
@@ -219,7 +220,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
219
220
  if (isNextSectionAvailable) {
220
221
  setRangePosition(nextSelection);
221
222
  }
222
- const isFullRangeSelected = rangePosition === 'end' && isRangeValid(utils, newRange);
223
+ const isFullRangeSelected = rangePosition === 'end' && isRangeValid(adapter, newRange);
223
224
  setValueAndGoToNextView(newRange, isFullRangeSelected || !isNextSectionAvailable ? 'finish' : 'partial', view);
224
225
  });
225
226
  const handleDrop = useEventCallback(newDate => {
@@ -229,12 +230,12 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
229
230
 
230
231
  // Range going for the start of the start day to the end of the end day.
231
232
  // This makes sure that `isWithinRange` works with any time in the start and end day.
232
- const valueDayRange = React.useMemo(() => [!utils.isValid(value[0]) ? value[0] : utils.startOfDay(value[0]), !utils.isValid(value[1]) ? value[1] : utils.endOfDay(value[1])], [value, utils]);
233
+ const valueDayRange = React.useMemo(() => [!adapter.isValid(value[0]) ? value[0] : adapter.startOfDay(value[0]), !adapter.isValid(value[1]) ? value[1] : adapter.endOfDay(value[1])], [value, adapter]);
233
234
  const _useDragRange = useDragRange({
234
235
  disableDragEditing: shouldDisableDragEditing,
235
236
  onDrop: handleDrop,
236
237
  onDatePositionChange: handleDatePositionChange,
237
- utils,
238
+ adapter,
238
239
  dateRange: valueDayRange,
239
240
  timezone
240
241
  }),
@@ -256,14 +257,14 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
256
257
  return [null, null];
257
258
  }
258
259
  const newRange = calculateRangeChange({
259
- utils,
260
+ adapter,
260
261
  range: valueDayRange,
261
262
  newDate: rangeDragDay,
262
263
  rangePosition,
263
264
  allowRangeFlip: true
264
265
  }).newRange;
265
- return newRange[0] !== null && newRange[1] !== null ? [utils.startOfDay(newRange[0]), utils.endOfDay(newRange[1])] : newRange;
266
- }, [rangePosition, rangeDragDay, utils, valueDayRange]);
266
+ return newRange[0] !== null && newRange[1] !== null ? [adapter.startOfDay(newRange[0]), adapter.endOfDay(newRange[1])] : newRange;
267
+ }, [rangePosition, rangeDragDay, adapter, valueDayRange]);
267
268
  const wrappedShouldDisableDate = React.useMemo(() => {
268
269
  if (!shouldDisableDate) {
269
270
  return undefined;
@@ -276,7 +277,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
276
277
  onMonthSwitchingAnimationEnd
277
278
  } = useCalendarState({
278
279
  value: value[0] || value[1],
279
- referenceDate,
280
+ referenceDate: resolveReferenceDate(referenceDate, rangePosition),
280
281
  disableFuture,
281
282
  disablePast,
282
283
  maxDate,
@@ -286,24 +287,24 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
286
287
  shouldDisableDate: wrappedShouldDisableDate,
287
288
  timezone,
288
289
  getCurrentMonthFromVisibleDate: (visibleDate, prevMonth) => {
289
- const firstVisibleMonth = utils.addMonths(prevMonth, 1 - currentMonthCalendarPosition);
290
- const lastVisibleMonth = utils.endOfMonth(utils.addMonths(firstVisibleMonth, calendars - 1));
290
+ const firstVisibleMonth = adapter.addMonths(prevMonth, 1 - currentMonthCalendarPosition);
291
+ const lastVisibleMonth = adapter.endOfMonth(adapter.addMonths(firstVisibleMonth, calendars - 1));
291
292
 
292
293
  // The new focused day is inside the visible calendars,
293
294
  // Do not change the current month
294
- if (utils.isWithinRange(visibleDate, [firstVisibleMonth, lastVisibleMonth])) {
295
+ if (adapter.isWithinRange(visibleDate, [firstVisibleMonth, lastVisibleMonth])) {
295
296
  return prevMonth;
296
297
  }
297
298
 
298
299
  // The new focused day is after the last visible month,
299
300
  // Move the current month so that the new focused day is inside the first visible month
300
- if (utils.isAfter(visibleDate, lastVisibleMonth)) {
301
- return utils.startOfMonth(utils.addMonths(visibleDate, currentMonthCalendarPosition - 1));
301
+ if (adapter.isAfter(visibleDate, lastVisibleMonth)) {
302
+ return adapter.startOfMonth(adapter.addMonths(visibleDate, currentMonthCalendarPosition - 1));
302
303
  }
303
304
 
304
305
  // The new focused day is before the first visible month,
305
306
  // Move the current month so that the new focused day is inside the last visible month
306
- return utils.startOfMonth(utils.addMonths(visibleDate, currentMonthCalendarPosition - calendars));
307
+ return adapter.startOfMonth(adapter.addMonths(visibleDate, currentMonthCalendarPosition - calendars));
307
308
  }
308
309
  });
309
310
  const CalendarHeader = slots?.calendarHeader ?? PickersRangeCalendarHeader;
@@ -336,7 +337,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
336
337
  const prevValue = React.useRef(null);
337
338
  React.useEffect(() => {
338
339
  const date = rangePosition === 'start' ? value[0] : value[1];
339
- if (!utils.isValid(date)) {
340
+ if (!adapter.isValid(date)) {
340
341
  return;
341
342
  }
342
343
  const prevDate = rangePosition === 'start' ? prevValue.current?.[0] : prevValue.current?.[1];
@@ -344,16 +345,16 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
344
345
 
345
346
  // The current date did not change, this call comes either from a `rangePosition` change or a change in the other date.
346
347
  // In both cases, we don't want to change the visible month(s).
347
- if (disableAutoMonthSwitching && prevDate && utils.isEqual(prevDate, date)) {
348
+ if (disableAutoMonthSwitching && prevDate && adapter.isEqual(prevDate, date)) {
348
349
  return;
349
350
  }
350
351
  const displayingMonthRange = calendars - currentMonthCalendarPosition;
351
- const currentMonthNumber = utils.getMonth(calendarState.currentMonth);
352
- const requestedMonthNumber = utils.getMonth(date);
353
- if (!utils.isSameYear(calendarState.currentMonth, date) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) {
352
+ const currentMonthNumber = adapter.getMonth(calendarState.currentMonth);
353
+ const requestedMonthNumber = adapter.getMonth(date);
354
+ if (!adapter.isSameYear(calendarState.currentMonth, date) || requestedMonthNumber < currentMonthNumber || requestedMonthNumber > currentMonthNumber + displayingMonthRange) {
354
355
  const newMonth = rangePosition === 'start' ? date :
355
356
  // If need to focus end, scroll to the state when "end" is displaying in the last calendar
356
- utils.addMonths(date, -displayingMonthRange);
357
+ adapter.addMonths(date, -displayingMonthRange);
357
358
  setVisibleDate({
358
359
  target: newMonth,
359
360
  reason: 'controlled-value-change'
@@ -377,7 +378,7 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
377
378
  onMouseLeave: () => setRangePreviewDay(null)
378
379
  }), []);
379
380
  const previewingRange = calculateRangePreview({
380
- utils,
381
+ adapter,
381
382
  range: valueDayRange,
382
383
  newDate: rangePreviewDay,
383
384
  rangePosition
@@ -386,12 +387,12 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
386
387
  let cleanNewRangePreviewDay;
387
388
  if (valueDayRange[0] == null && valueDayRange[1] == null) {
388
389
  cleanNewRangePreviewDay = null;
389
- } else if (isWithinRange(utils, newRangePreviewDay, valueDayRange)) {
390
+ } else if (isWithinRange(adapter, newRangePreviewDay, valueDayRange)) {
390
391
  cleanNewRangePreviewDay = null;
391
392
  } else {
392
393
  cleanNewRangePreviewDay = newRangePreviewDay;
393
394
  }
394
- if (!areDatesEqual(utils, cleanNewRangePreviewDay, rangePreviewDay)) {
395
+ if (!areDatesEqual(adapter, cleanNewRangePreviewDay, rangePreviewDay)) {
395
396
  setRangePreviewDay(cleanNewRangePreviewDay);
396
397
  }
397
398
  });
@@ -404,8 +405,8 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
404
405
  day,
405
406
  isDaySelected
406
407
  } = dayOwnerState;
407
- const isSelectedStartDate = isStartOfRange(utils, day, valueDayRange);
408
- const isSelectedEndDate = isEndOfRange(utils, day, valueDayRange);
408
+ const isSelectedStartDate = isStartOfRange(adapter, day, valueDayRange);
409
+ const isSelectedEndDate = isEndOfRange(adapter, day, valueDayRange);
409
410
  const shouldInitDragging = !shouldDisableDragEditing && valueDayRange[0] && valueDayRange[1];
410
411
  const isElementDraggable = shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
411
412
  let datePosition;
@@ -414,15 +415,15 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
414
415
  } else if (isSelectedEndDate) {
415
416
  datePosition = 'end';
416
417
  }
417
- const isStartOfHighlighting = isDragging ? isStartOfRange(utils, day, draggingRange) : isSelectedStartDate;
418
- const isEndOfHighlighting = isDragging ? isEndOfRange(utils, day, draggingRange) : isSelectedEndDate;
418
+ const isStartOfHighlighting = isDragging ? isStartOfRange(adapter, day, draggingRange) : isSelectedStartDate;
419
+ const isEndOfHighlighting = isDragging ? isEndOfRange(adapter, day, draggingRange) : isSelectedEndDate;
419
420
  return _extends({
420
- isPreviewing: shouldHavePreview ? isWithinRange(utils, day, previewingRange) : false,
421
- isStartOfPreviewing: shouldHavePreview ? isStartOfRange(utils, day, previewingRange) : false,
422
- isEndOfPreviewing: shouldHavePreview ? isEndOfRange(utils, day, previewingRange) : false,
423
- isHighlighting: isWithinRange(utils, day, isDragging ? draggingRange : valueDayRange),
421
+ isPreviewing: shouldHavePreview ? isWithinRange(adapter, day, previewingRange) : false,
422
+ isStartOfPreviewing: shouldHavePreview ? isStartOfRange(adapter, day, previewingRange) : false,
423
+ isEndOfPreviewing: shouldHavePreview ? isEndOfRange(adapter, day, previewingRange) : false,
424
+ isHighlighting: isWithinRange(adapter, day, isDragging ? draggingRange : valueDayRange),
424
425
  isStartOfHighlighting,
425
- isEndOfHighlighting: isDragging ? isEndOfRange(utils, day, draggingRange) : isSelectedEndDate,
426
+ isEndOfHighlighting: isDragging ? isEndOfRange(adapter, day, draggingRange) : isSelectedEndDate,
426
427
  onMouseEnter: shouldHavePreview ? handleDayMouseEnter : undefined,
427
428
  // apply selected styling to the dragging start or end day
428
429
  isVisuallySelected: isDaySelected || isDragging && (isStartOfHighlighting || isEndOfHighlighting),
@@ -441,11 +442,11 @@ const DateRangeCalendar = /*#__PURE__*/React.forwardRef(function DateRangeCalend
441
442
  warnOnce(['MUI X: The `currentMonthCalendarPosition` prop must be an integer between `1` and the amount of calendars rendered.', 'For example if you have 2 calendars rendered, it should be equal to either 1 or 2.']);
442
443
  }
443
444
  }
444
- const firstMonth = utils.addMonths(calendarState.currentMonth, 1 - currentMonthCalendarPosition);
445
+ const firstMonth = adapter.addMonths(calendarState.currentMonth, 1 - currentMonthCalendarPosition);
445
446
  return Array.from({
446
447
  length: calendars
447
- }).map((_, index) => utils.addMonths(firstMonth, index));
448
- }, [utils, calendarState.currentMonth, calendars, currentMonthCalendarPosition]);
448
+ }).map((_, index) => adapter.addMonths(firstMonth, index));
449
+ }, [adapter, calendarState.currentMonth, calendars, currentMonthCalendarPosition]);
449
450
  const hasFocus = focusedView !== null;
450
451
  const prevOpenViewRef = React.useRef(view);
451
452
  React.useEffect(() => {
@@ -679,7 +680,7 @@ process.env.NODE_ENV !== "production" ? DateRangeCalendar.propTypes = {
679
680
  * The date used to generate the new value when both `value` and `defaultValue` are empty.
680
681
  * @default The closest valid date using the validation props, except callbacks such as `shouldDisableDate`.
681
682
  */
682
- referenceDate: PropTypes.object,
683
+ referenceDate: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object.isRequired), PropTypes.object]),
683
684
  /**
684
685
  * Component rendered on the "day" view when `props.loading` is true.
685
686
  * @returns {React.ReactNode} The node to render when loading.
@@ -73,7 +73,7 @@ export interface DateRangeCalendarProps extends ExportedDateRangeCalendarProps,
73
73
  * The date used to generate the new value when both `value` and `defaultValue` are empty.
74
74
  * @default The closest valid date using the validation props, except callbacks such as `shouldDisableDate`.
75
75
  */
76
- referenceDate?: PickerValidDate;
76
+ referenceDate?: PickerValidDate | [PickerValidDate, PickerValidDate];
77
77
  /**
78
78
  * The number of calendars to render.
79
79
  * @default 2
@@ -4,7 +4,7 @@ import { PickerRangeValue } from '@mui/x-date-pickers/internals';
4
4
  import { RangePosition } from "../models/index.js";
5
5
  interface UseDragRangeParams {
6
6
  disableDragEditing?: boolean;
7
- utils: MuiPickersAdapter;
7
+ adapter: MuiPickersAdapter;
8
8
  setRangeDragDay: (value: PickerValidDate | null) => void;
9
9
  setIsDragging: (value: boolean) => void;
10
10
  isDragging: boolean;
@@ -31,7 +31,7 @@ interface UseDragRangeResponse extends UseDragRangeEvents {
31
31
  }
32
32
  export declare const useDragRange: ({
33
33
  disableDragEditing,
34
- utils,
34
+ adapter,
35
35
  onDatePositionChange,
36
36
  onDrop,
37
37
  dateRange,
@@ -4,13 +4,13 @@ import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import * as React from 'react';
5
5
  import useEventCallback from '@mui/utils/useEventCallback';
6
6
  import { isEndOfRange, isStartOfRange } from "../internals/utils/date-utils.js";
7
- const resolveDateFromTarget = (target, utils, timezone) => {
7
+ const resolveDateFromTarget = (target, adapter, timezone) => {
8
8
  const timestampString = target.dataset.timestamp;
9
9
  if (!timestampString) {
10
10
  return null;
11
11
  }
12
12
  const timestamp = +timestampString;
13
- return utils.date(new Date(timestamp).toISOString(), timezone);
13
+ return adapter.date(new Date(timestamp).toISOString(), timezone);
14
14
  };
15
15
  const isSameAsDraggingDate = event => {
16
16
  const timestampString = event.target.dataset.timestamp;
@@ -43,7 +43,7 @@ const resolveElementFromTouch = (event, ignoreTouchTarget) => {
43
43
  return null;
44
44
  };
45
45
  const useDragRangeEvents = ({
46
- utils,
46
+ adapter,
47
47
  setRangeDragDay,
48
48
  setIsDragging,
49
49
  isDragging,
@@ -64,12 +64,12 @@ const useDragRangeEvents = ({
64
64
  return false;
65
65
  }
66
66
  const shouldInitDragging = !disableDragEditing && !!dateRange[0] && !!dateRange[1];
67
- const isSelectedStartDate = isStartOfRange(utils, day, dateRange);
68
- const isSelectedEndDate = isEndOfRange(utils, day, dateRange);
67
+ const isSelectedStartDate = isStartOfRange(adapter, day, dateRange);
68
+ const isSelectedEndDate = isEndOfRange(adapter, day, dateRange);
69
69
  return shouldInitDragging && (isSelectedStartDate || isSelectedEndDate);
70
70
  };
71
71
  const handleDragStart = useEventCallback(event => {
72
- const newDate = resolveDateFromTarget(event.target, utils, timezone);
72
+ const newDate = resolveDateFromTarget(event.target, adapter, timezone);
73
73
  if (!isElementDraggable(newDate)) {
74
74
  return;
75
75
  }
@@ -93,7 +93,7 @@ const useDragRangeEvents = ({
93
93
  if (!target) {
94
94
  return;
95
95
  }
96
- const newDate = resolveDateFromTarget(target, utils, timezone);
96
+ const newDate = resolveDateFromTarget(target, adapter, timezone);
97
97
  if (!isElementDraggable(newDate)) {
98
98
  return;
99
99
  }
@@ -106,14 +106,14 @@ const useDragRangeEvents = ({
106
106
  event.preventDefault();
107
107
  event.stopPropagation();
108
108
  event.dataTransfer.dropEffect = 'move';
109
- setRangeDragDay(resolveDateFromTarget(event.target, utils, timezone));
109
+ setRangeDragDay(resolveDateFromTarget(event.target, adapter, timezone));
110
110
  });
111
111
  const handleTouchMove = useEventCallback(event => {
112
112
  const target = resolveElementFromTouch(event);
113
113
  if (!target) {
114
114
  return;
115
115
  }
116
- const newDate = resolveDateFromTarget(target, utils, timezone);
116
+ const newDate = resolveDateFromTarget(target, adapter, timezone);
117
117
  if (newDate) {
118
118
  setRangeDragDay(newDate);
119
119
  }
@@ -160,7 +160,7 @@ const useDragRangeEvents = ({
160
160
 
161
161
  // make sure the focused element is the element where touch ended
162
162
  target.focus();
163
- const newDate = resolveDateFromTarget(target, utils, timezone);
163
+ const newDate = resolveDateFromTarget(target, adapter, timezone);
164
164
  if (newDate) {
165
165
  onDrop(newDate);
166
166
  }
@@ -187,7 +187,7 @@ const useDragRangeEvents = ({
187
187
  if (isSameAsDraggingDate(event)) {
188
188
  return;
189
189
  }
190
- const newDate = resolveDateFromTarget(event.target, utils, timezone);
190
+ const newDate = resolveDateFromTarget(event.target, adapter, timezone);
191
191
  if (newDate) {
192
192
  onDrop(newDate);
193
193
  }
@@ -206,7 +206,7 @@ const useDragRangeEvents = ({
206
206
  };
207
207
  export const useDragRange = ({
208
208
  disableDragEditing,
209
- utils,
209
+ adapter,
210
210
  onDatePositionChange,
211
211
  onDrop,
212
212
  dateRange,
@@ -215,24 +215,24 @@ export const useDragRange = ({
215
215
  const [isDragging, setIsDragging] = React.useState(false);
216
216
  const [rangeDragDay, setRangeDragDay] = React.useState(null);
217
217
  const handleRangeDragDayChange = useEventCallback(newValue => {
218
- if (!utils.isEqual(newValue, rangeDragDay)) {
218
+ if (!adapter.isEqual(newValue, rangeDragDay)) {
219
219
  setRangeDragDay(newValue);
220
220
  }
221
221
  });
222
222
  const draggingDatePosition = React.useMemo(() => {
223
223
  const [start, end] = dateRange;
224
224
  if (rangeDragDay) {
225
- if (start && utils.isBefore(rangeDragDay, start)) {
225
+ if (start && adapter.isBefore(rangeDragDay, start)) {
226
226
  return 'start';
227
227
  }
228
- if (end && utils.isAfter(rangeDragDay, end)) {
228
+ if (end && adapter.isAfter(rangeDragDay, end)) {
229
229
  return 'end';
230
230
  }
231
231
  }
232
232
  return null;
233
- }, [dateRange, rangeDragDay, utils]);
233
+ }, [dateRange, rangeDragDay, adapter]);
234
234
  const dragRangeEvents = useDragRangeEvents({
235
- utils,
235
+ adapter,
236
236
  onDatePositionChange,
237
237
  onDrop,
238
238
  setIsDragging,
@@ -268,7 +268,7 @@ process.env.NODE_ENV !== "production" ? DateRangePicker.propTypes = {
268
268
  * The date used to generate the new value when both `value` and `defaultValue` are empty.
269
269
  * @default The closest valid date-time using the validation props, except callbacks like `shouldDisable<...>`.
270
270
  */
271
- referenceDate: PropTypes.object,
271
+ referenceDate: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]),
272
272
  /**
273
273
  * Component rendered on the "day" view when `props.loading` is true.
274
274
  * @returns {React.ReactNode} The node to render when loading.
@@ -9,8 +9,8 @@ import clsx from 'clsx';
9
9
  import Typography from '@mui/material/Typography';
10
10
  import { styled, useThemeProps } from '@mui/material/styles';
11
11
  import composeClasses from '@mui/utils/composeClasses';
12
- import { PickersToolbar, PickersToolbarButton, useUtils, useToolbarOwnerState } from '@mui/x-date-pickers/internals';
13
- import { usePickerContext, usePickerTranslations } from '@mui/x-date-pickers/hooks';
12
+ import { PickersToolbar, PickersToolbarButton, useToolbarOwnerState } from '@mui/x-date-pickers/internals';
13
+ import { usePickerAdapter, usePickerContext, usePickerTranslations } from '@mui/x-date-pickers/hooks';
14
14
  import { getDateRangePickerToolbarUtilityClass } from "./dateRangePickerToolbarClasses.js";
15
15
  import { usePickerRangePositionContext } from "../hooks/index.js";
16
16
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -42,7 +42,7 @@ const DateRangePickerToolbarContainer = styled('div', {
42
42
  * - [DateRangePickerToolbar API](https://mui.com/x/api/date-pickers/date-range-picker-toolbar/)
43
43
  */
44
44
  const DateRangePickerToolbar = /*#__PURE__*/React.forwardRef(function DateRangePickerToolbar(inProps, ref) {
45
- const utils = useUtils();
45
+ const adapter = usePickerAdapter();
46
46
  const props = useThemeProps({
47
47
  props: inProps,
48
48
  name: 'MuiDateRangePickerToolbar'
@@ -65,12 +65,12 @@ const DateRangePickerToolbar = /*#__PURE__*/React.forwardRef(function DateRangeP
65
65
  const classes = useUtilityClasses(classesProp);
66
66
 
67
67
  // This can't be a default value when spreading because it breaks the API generation.
68
- const toolbarFormat = toolbarFormatProp ?? utils.formats.shortDate;
68
+ const toolbarFormat = toolbarFormatProp ?? adapter.formats.shortDate;
69
69
  const formatDate = (date, fallback) => {
70
- if (!utils.isValid(date)) {
70
+ if (!adapter.isValid(date)) {
71
71
  return fallback;
72
72
  }
73
- return utils.formatByString(date, toolbarFormat);
73
+ return adapter.formatByString(date, toolbarFormat);
74
74
  };
75
75
  return /*#__PURE__*/_jsx(DateRangePickerToolbarRoot, _extends({}, other, {
76
76
  toolbarTitle: translations.dateRangePickerToolbarTitle,
@@ -9,8 +9,9 @@ import clsx from 'clsx';
9
9
  import { useLicenseVerifier } from '@mui/x-license';
10
10
  import { alpha, styled, useThemeProps } from '@mui/material/styles';
11
11
  import composeClasses from '@mui/utils/composeClasses';
12
- import { useUtils, usePickerDayOwnerState } from '@mui/x-date-pickers/internals';
12
+ import { usePickerDayOwnerState } from '@mui/x-date-pickers/internals';
13
13
  import { PickersDay } from '@mui/x-date-pickers/PickersDay';
14
+ import { usePickerAdapter } from '@mui/x-date-pickers/hooks';
14
15
  import { getDateRangePickerDayUtilityClass, dateRangePickerDayClasses } from "./dateRangePickerDayClasses.js";
15
16
  import { jsx as _jsx } from "react/jsx-runtime";
16
17
  const useUtilityClasses = (classes, ownerState) => {
@@ -227,8 +228,8 @@ const DateRangePickerDayRaw = /*#__PURE__*/React.forwardRef(function DateRangePi
227
228
  showDaysOutsideCurrentMonth
228
229
  } = props,
229
230
  other = _objectWithoutPropertiesLoose(props, _excluded);
230
- useLicenseVerifier('x-date-pickers-pro', "MTc1MDI4NDAwMDAwMA==");
231
- const utils = useUtils();
231
+ useLicenseVerifier('x-date-pickers-pro', "MTc1MTU4MDAwMDAwMA==");
232
+ const adapter = usePickerAdapter();
232
233
  const shouldRenderHighlight = isHighlighting && !outsideCurrentMonth;
233
234
  const shouldRenderPreview = isPreviewing && !outsideCurrentMonth;
234
235
  const pickersDayOwnerState = usePickerDayOwnerState({
@@ -252,8 +253,8 @@ const DateRangePickerDayRaw = /*#__PURE__*/React.forwardRef(function DateRangePi
252
253
  isDayPreviewEnd: isEndOfPreviewing,
253
254
  isDayInsidePreview: isPreviewing && !isStartOfPreviewing && !isEndOfPreviewing,
254
255
  // Properties specific to the MUI implementation (some might be removed in the next major)
255
- isDayStartOfMonth: utils.isSameDay(day, utils.startOfMonth(day)),
256
- isDayEndOfMonth: utils.isSameDay(day, utils.endOfMonth(day)),
256
+ isDayStartOfMonth: adapter.isSameDay(day, adapter.startOfMonth(day)),
257
+ isDayEndOfMonth: adapter.isSameDay(day, adapter.endOfMonth(day)),
257
258
  isDayFirstVisibleCell: isFirstVisibleCell,
258
259
  isDayLastVisibleCell: isLastVisibleCell,
259
260
  isDayFillerCell: outsideCurrentMonth && !showDaysOutsideCurrentMonth