@mui/x-date-pickers-pro 6.0.2 → 6.0.4

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 (138) hide show
  1. package/CHANGELOG.md +119 -5
  2. package/DateRangePicker/DateRangePicker.js +12 -0
  3. package/DateRangePicker/DateRangePickerToolbar.d.ts +1 -1
  4. package/DateRangePicker/shared.d.ts +1 -1
  5. package/DateRangePickerDay/DateRangePickerDay.js +3 -6
  6. package/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  7. package/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  8. package/MultiInputDateRangeField/MultiInputDateRangeField.js +2 -0
  9. package/MultiInputDateRangeField/MultiInputDateRangeField.types.d.ts +8 -10
  10. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +14 -3
  11. package/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.d.ts +8 -8
  12. package/MultiInputTimeRangeField/MultiInputTimeRangeField.js +14 -3
  13. package/MultiInputTimeRangeField/MultiInputTimeRangeField.types.d.ts +8 -8
  14. package/SingleInputDateRangeField/SingleInputDateRangeField.d.ts +1 -0
  15. package/SingleInputDateRangeField/SingleInputDateRangeField.js +5 -0
  16. package/SingleInputDateRangeField/useSingleInputDateRangeField.js +5 -3
  17. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.d.ts +1 -0
  18. package/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +5 -0
  19. package/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.js +5 -3
  20. package/SingleInputTimeRangeField/SingleInputTimeRangeField.d.ts +1 -0
  21. package/SingleInputTimeRangeField/SingleInputTimeRangeField.js +5 -0
  22. package/SingleInputTimeRangeField/useSingleInputTimeRangeField.js +5 -3
  23. package/dateRangeViewRenderers/dateRangeViewRenderers.d.ts +1 -1
  24. package/index.d.ts +1 -1
  25. package/index.js +1 -1
  26. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.d.ts +1 -1
  27. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +32 -40
  28. package/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.types.d.ts +10 -30
  29. package/internal/hooks/useEnrichedRangePickerFieldProps.d.ts +53 -0
  30. package/internal/hooks/useEnrichedRangePickerFieldProps.js +202 -0
  31. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.d.ts +1 -1
  32. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +36 -39
  33. package/internal/hooks/useMobileRangePicker/useMobileRangePicker.types.d.ts +10 -29
  34. package/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.d.ts +1 -2
  35. package/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +23 -15
  36. package/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.d.ts +1 -2
  37. package/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +14 -12
  38. package/internal/hooks/useMultiInputRangeField/useMultiInputRangeField.types.d.ts +14 -2
  39. package/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.d.ts +1 -2
  40. package/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +14 -12
  41. package/internal/hooks/useRangePosition.d.ts +4 -0
  42. package/internal/hooks/useRangePosition.js +16 -1
  43. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.d.ts +1 -1
  44. package/internal/hooks/useStaticRangePicker/useStaticRangePicker.types.d.ts +5 -3
  45. package/internal/hooks/validation/useDateRangeValidation.d.ts +2 -1
  46. package/internal/hooks/validation/useDateTimeRangeValidation.d.ts +2 -1
  47. package/internal/hooks/validation/useTimeRangeValidation.d.ts +2 -1
  48. package/internal/models/dateRange.d.ts +2 -1
  49. package/internal/models/dateTimeRange.d.ts +2 -1
  50. package/internal/models/fields.d.ts +8 -3
  51. package/internal/models/index.d.ts +1 -0
  52. package/internal/models/index.js +2 -1
  53. package/internal/models/rangePickerProps.d.ts +17 -0
  54. package/internal/models/rangePickerProps.js +1 -0
  55. package/internal/models/timeRange.d.ts +2 -1
  56. package/internal/utils/releaseInfo.js +1 -1
  57. package/internal/utils/valueManagers.js +23 -27
  58. package/legacy/DateRangePicker/DateRangePicker.js +12 -0
  59. package/legacy/DateRangePickerDay/DateRangePickerDay.js +4 -7
  60. package/legacy/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  61. package/legacy/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  62. package/legacy/MultiInputDateRangeField/MultiInputDateRangeField.js +2 -0
  63. package/legacy/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +13 -2
  64. package/legacy/MultiInputTimeRangeField/MultiInputTimeRangeField.js +13 -2
  65. package/legacy/SingleInputDateRangeField/SingleInputDateRangeField.js +5 -0
  66. package/legacy/SingleInputDateRangeField/useSingleInputDateRangeField.js +4 -2
  67. package/legacy/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +5 -0
  68. package/legacy/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.js +4 -2
  69. package/legacy/SingleInputTimeRangeField/SingleInputTimeRangeField.js +5 -0
  70. package/legacy/SingleInputTimeRangeField/useSingleInputTimeRangeField.js +4 -2
  71. package/legacy/index.js +1 -1
  72. package/legacy/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +32 -40
  73. package/legacy/internal/hooks/useEnrichedRangePickerFieldProps.js +200 -0
  74. package/legacy/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +36 -39
  75. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +23 -15
  76. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +14 -12
  77. package/legacy/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +14 -12
  78. package/legacy/internal/hooks/useRangePosition.js +16 -1
  79. package/legacy/internal/models/index.js +2 -1
  80. package/legacy/internal/models/rangePickerProps.js +1 -0
  81. package/legacy/internal/utils/releaseInfo.js +1 -1
  82. package/legacy/internal/utils/valueManagers.js +22 -26
  83. package/modern/DateRangePicker/DateRangePicker.js +12 -0
  84. package/modern/DateRangePickerDay/DateRangePickerDay.js +3 -6
  85. package/modern/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  86. package/modern/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  87. package/modern/MultiInputDateRangeField/MultiInputDateRangeField.js +2 -0
  88. package/modern/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +14 -3
  89. package/modern/MultiInputTimeRangeField/MultiInputTimeRangeField.js +14 -3
  90. package/modern/SingleInputDateRangeField/SingleInputDateRangeField.js +5 -0
  91. package/modern/SingleInputDateRangeField/useSingleInputDateRangeField.js +5 -3
  92. package/modern/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +5 -0
  93. package/modern/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.js +5 -3
  94. package/modern/SingleInputTimeRangeField/SingleInputTimeRangeField.js +5 -0
  95. package/modern/SingleInputTimeRangeField/useSingleInputTimeRangeField.js +5 -3
  96. package/modern/index.js +1 -1
  97. package/modern/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +30 -38
  98. package/modern/internal/hooks/useEnrichedRangePickerFieldProps.js +195 -0
  99. package/modern/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +35 -38
  100. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +23 -15
  101. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +14 -12
  102. package/modern/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +14 -12
  103. package/modern/internal/hooks/useRangePosition.js +16 -1
  104. package/modern/internal/models/index.js +2 -1
  105. package/modern/internal/models/rangePickerProps.js +1 -0
  106. package/modern/internal/utils/releaseInfo.js +1 -1
  107. package/modern/internal/utils/valueManagers.js +23 -27
  108. package/node/DateRangePicker/DateRangePicker.js +12 -0
  109. package/node/DateRangePickerDay/DateRangePickerDay.js +3 -6
  110. package/node/DesktopDateRangePicker/DesktopDateRangePicker.js +12 -0
  111. package/node/MobileDateRangePicker/MobileDateRangePicker.js +12 -0
  112. package/node/MultiInputDateRangeField/MultiInputDateRangeField.js +2 -0
  113. package/node/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.js +14 -3
  114. package/node/MultiInputTimeRangeField/MultiInputTimeRangeField.js +14 -3
  115. package/node/SingleInputDateRangeField/SingleInputDateRangeField.js +5 -0
  116. package/node/SingleInputDateRangeField/useSingleInputDateRangeField.js +5 -3
  117. package/node/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.js +5 -0
  118. package/node/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.js +5 -3
  119. package/node/SingleInputTimeRangeField/SingleInputTimeRangeField.js +5 -0
  120. package/node/SingleInputTimeRangeField/useSingleInputTimeRangeField.js +5 -3
  121. package/node/index.js +1 -1
  122. package/node/internal/hooks/useDesktopRangePicker/useDesktopRangePicker.js +29 -37
  123. package/node/internal/hooks/useEnrichedRangePickerFieldProps.js +205 -0
  124. package/node/internal/hooks/useMobileRangePicker/useMobileRangePicker.js +34 -37
  125. package/node/internal/hooks/useMultiInputRangeField/useMultiInputDateRangeField.js +23 -15
  126. package/node/internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.js +14 -12
  127. package/node/internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.js +14 -12
  128. package/node/internal/hooks/useRangePosition.js +18 -1
  129. package/node/internal/models/index.js +11 -0
  130. package/node/internal/models/rangePickerProps.js +5 -0
  131. package/node/internal/utils/releaseInfo.js +1 -1
  132. package/node/internal/utils/valueManagers.js +22 -26
  133. package/package.json +4 -4
  134. package/internal/hooks/useRangePickerInputProps.d.ts +0 -19
  135. package/internal/hooks/useRangePickerInputProps.js +0 -89
  136. package/legacy/internal/hooks/useRangePickerInputProps.js +0 -88
  137. package/modern/internal/hooks/useRangePickerInputProps.js +0 -86
  138. package/node/internal/hooks/useRangePickerInputProps.js +0 -96
@@ -1,11 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { replaceInvalidDateByNull, splitFormatIntoSections, addPositionPropertiesToSections, createDateStrForInputFromSections, getSectionOrder } from '@mui/x-date-pickers/internals';
2
+ import { replaceInvalidDateByNull, addPositionPropertiesToSections, createDateStrForInputFromSections, areDatesEqual } from '@mui/x-date-pickers/internals';
3
3
  import { splitDateRangeSections, removeLastSeparator } from './date-fields-utils';
4
4
  export const rangeValueManager = {
5
5
  emptyValue: [null, null],
6
6
  getTodayValue: utils => [utils.date(), utils.date()],
7
7
  cleanValue: (utils, value) => value.map(date => replaceInvalidDateByNull(utils, date)),
8
- areValuesEqual: (utils, a, b) => utils.isEqual(a[0], b[0]) && utils.isEqual(a[1], b[1]),
8
+ areValuesEqual: (utils, a, b) => areDatesEqual(utils, a[0], b[0]) && areDatesEqual(utils, a[1], b[1]),
9
9
  isSameError: (a, b) => b !== null && a[1] === b[1] && a[0] === b[0],
10
10
  defaultErrorState: [null, null]
11
11
  };
@@ -24,17 +24,17 @@ export const rangeFieldValueManager = {
24
24
  }
25
25
  return [prevReferenceValue[1], value[1]];
26
26
  },
27
- getSectionsFromValue: (utils, localeText, prevSections, [start, end], format) => {
28
- const prevDateRangeSections = prevSections == null ? {
27
+ getSectionsFromValue: (utils, [start, end], fallbackSections, isRTL, getSectionsFromDate) => {
28
+ const separatedFallbackSections = fallbackSections == null ? {
29
29
  startDate: null,
30
30
  endDate: null
31
- } : splitDateRangeSections(prevSections);
32
- const getSections = (newDate, prevDateSections, position) => {
33
- const shouldReUsePrevDateSections = !utils.isValid(newDate) && !!prevDateSections;
31
+ } : splitDateRangeSections(fallbackSections);
32
+ const getSections = (newDate, fallbackDateSections, position) => {
33
+ const shouldReUsePrevDateSections = !utils.isValid(newDate) && !!fallbackDateSections;
34
34
  if (shouldReUsePrevDateSections) {
35
- return prevDateSections;
35
+ return fallbackDateSections;
36
36
  }
37
- const sections = splitFormatIntoSections(utils, localeText, format, newDate);
37
+ const sections = getSectionsFromDate(newDate);
38
38
  return sections.map((section, sectionIndex) => {
39
39
  if (sectionIndex === sections.length - 1 && position === 'start') {
40
40
  return _extends({}, section, {
@@ -47,16 +47,11 @@ export const rangeFieldValueManager = {
47
47
  });
48
48
  });
49
49
  };
50
- return addPositionPropertiesToSections([...getSections(start, prevDateRangeSections.startDate, 'start'), ...getSections(end, prevDateRangeSections.endDate, 'end')]);
50
+ return addPositionPropertiesToSections([...getSections(start, separatedFallbackSections.startDate, 'start'), ...getSections(end, separatedFallbackSections.endDate, 'end')], isRTL);
51
51
  },
52
- getValueStrFromSections: sections => {
52
+ getValueStrFromSections: (sections, isRTL) => {
53
53
  const dateRangeSections = splitDateRangeSections(sections);
54
- return createDateStrForInputFromSections([...dateRangeSections.startDate, ...dateRangeSections.endDate]);
55
- },
56
- getActiveDateSections: (sections, activeSection) => {
57
- const index = activeSection.dateName === 'start' ? 0 : 1;
58
- const dateRangeSections = splitDateRangeSections(sections);
59
- return index === 0 ? removeLastSeparator(dateRangeSections.startDate) : dateRangeSections.endDate;
54
+ return createDateStrForInputFromSections([...dateRangeSections.startDate, ...dateRangeSections.endDate], isRTL);
60
55
  },
61
56
  parseValueStr: (valueStr, referenceValue, parseDate) => {
62
57
  // TODO: Improve because it would not work if the date format has `–` as a separator.
@@ -72,19 +67,20 @@ export const rangeFieldValueManager = {
72
67
  const index = activeSection.dateName === 'start' ? 0 : 1;
73
68
  const updateDateInRange = (newDate, prevDateRange) => index === 0 ? [newDate, prevDateRange[1]] : [prevDateRange[0], newDate];
74
69
  return {
75
- activeDate: state.value[index],
76
- referenceActiveDate: state.referenceValue[index],
77
- getNewValueFromNewActiveDate: newActiveDate => ({
70
+ date: state.value[index],
71
+ referenceDate: state.referenceValue[index],
72
+ getSections: sections => {
73
+ const dateRangeSections = splitDateRangeSections(sections);
74
+ if (index === 0) {
75
+ return removeLastSeparator(dateRangeSections.startDate);
76
+ }
77
+ return dateRangeSections.endDate;
78
+ },
79
+ getNewValuesFromNewActiveDate: newActiveDate => ({
78
80
  value: updateDateInRange(newActiveDate, state.value),
79
81
  referenceValue: newActiveDate == null || !utils.isValid(newActiveDate) ? state.referenceValue : updateDateInRange(newActiveDate, state.referenceValue)
80
82
  })
81
83
  };
82
84
  },
83
- hasError: error => error[0] != null || error[1] != null,
84
- getSectionOrder: (utils, localeText, format, isRTL) => {
85
- const splitedFormat = splitFormatIntoSections(utils, localeText, format, null);
86
- return getSectionOrder([...splitedFormat.slice(0, splitedFormat.length - 1), _extends({}, splitedFormat[splitedFormat.length - 1], {
87
- endSeparator: ' – '
88
- }), ...splitedFormat], isRTL);
89
- }
85
+ hasError: error => error[0] != null || error[1] != null
90
86
  };
@@ -157,6 +157,18 @@ process.env.NODE_ENV !== "production" ? DateRangePicker.propTypes = {
157
157
  * Defaults to localized format based on the used `views`.
158
158
  */
159
159
  format: _propTypes.default.string,
160
+ /**
161
+ * Pass a ref to the `input` element.
162
+ * Ignored if the field has several inputs.
163
+ */
164
+ inputRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.shape({
165
+ current: _propTypes.default.object
166
+ })]),
167
+ /**
168
+ * The label content.
169
+ * Ignored if the field has several inputs.
170
+ */
171
+ label: _propTypes.default.node,
160
172
  /**
161
173
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
162
174
  * Can be used to preload information and show it in calendar.
@@ -89,7 +89,7 @@ const DateRangePickerDayRoot = (0, _styles.styled)('div', {
89
89
  }, ownerState.isHighlighting && {
90
90
  borderRadius: 0,
91
91
  color: (theme.vars || theme).palette.primary.contrastText,
92
- backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.lightChannel} / 0.6)` : (0, _styles.alpha)(theme.palette.primary.light, 0.6),
92
+ backgroundColor: theme.vars ? `rgba(${theme.vars.palette.primary.mainChannel} / ${theme.vars.palette.action.focusOpacity})` : (0, _styles.alpha)(theme.palette.primary.main, theme.palette.action.focusOpacity),
93
93
  '&:first-of-type': startBorderStyle,
94
94
  '&:last-of-type': endBorderStyle
95
95
  }, (ownerState.isStartOfHighlighting || ownerState.isFirstVisibleCell) && (0, _extends2.default)({}, startBorderStyle, {
@@ -148,7 +148,6 @@ const DateRangePickerDayDay = (0, _styles.styled)(_PickersDay.PickersDay, {
148
148
  [`&.${_dateRangePickerDayClasses.dateRangePickerDayClasses.notSelectedDate}`]: styles.notSelectedDate
149
149
  }, styles.day]
150
150
  })(({
151
- theme,
152
151
  ownerState
153
152
  }) => (0, _extends2.default)({
154
153
  // Required to overlap preview border
@@ -156,12 +155,10 @@ const DateRangePickerDayDay = (0, _styles.styled)(_PickersDay.PickersDay, {
156
155
  '& > *': {
157
156
  transform: 'scale(0.9)'
158
157
  }
159
- }, !ownerState.selected && {
160
- backgroundColor: 'transparent'
161
158
  }, !ownerState.selected && ownerState.isHighlighting && {
162
- color: theme.palette.getContrastText((0, _styles.alpha)(theme.palette.primary.light, 0.6)),
159
+ opacity: 0.7,
163
160
  [`&.${_PickersDay.pickersDayClasses.dayOutsideMonth}`]: {
164
- color: (0, _styles.alpha)(theme.palette.getContrastText(theme.palette.primary.light), 0.4)
161
+ opacity: 0.4
165
162
  }
166
163
  }, ownerState.draggable && {
167
164
  cursor: 'grab'
@@ -161,6 +161,18 @@ DesktopDateRangePicker.propTypes = {
161
161
  * Defaults to localized format based on the used `views`.
162
162
  */
163
163
  format: _propTypes.default.string,
164
+ /**
165
+ * Pass a ref to the `input` element.
166
+ * Ignored if the field has several inputs.
167
+ */
168
+ inputRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.shape({
169
+ current: _propTypes.default.object
170
+ })]),
171
+ /**
172
+ * The label content.
173
+ * Ignored if the field has several inputs.
174
+ */
175
+ label: _propTypes.default.node,
164
176
  /**
165
177
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
166
178
  * Can be used to preload information and show it in calendar.
@@ -164,6 +164,18 @@ MobileDateRangePicker.propTypes = {
164
164
  * Defaults to localized format based on the used `views`.
165
165
  */
166
166
  format: _propTypes.default.string,
167
+ /**
168
+ * Pass a ref to the `input` element.
169
+ * Ignored if the field has several inputs.
170
+ */
171
+ inputRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.shape({
172
+ current: _propTypes.default.object
173
+ })]),
174
+ /**
175
+ * The label content.
176
+ * Ignored if the field has several inputs.
177
+ */
178
+ label: _propTypes.default.node,
167
179
  /**
168
180
  * If `true`, calls `renderLoading` instead of rendering the day calendar.
169
181
  * Can be used to preload information and show it in calendar.
@@ -292,6 +292,8 @@ process.env.NODE_ENV !== "production" ? MultiInputDateRangeField.propTypes = {
292
292
  * The system prop, which allows defining system overrides as well as additional CSS styles.
293
293
  */
294
294
  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]),
295
+ unstableEndFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
296
+ unstableStartFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
295
297
  /**
296
298
  * The selected value.
297
299
  * Used when the component is controlled.
@@ -17,7 +17,7 @@ var _utils = require("@mui/base/utils");
17
17
  var _internals = require("@mui/x-date-pickers/internals");
18
18
  var _useMultiInputDateTimeRangeField = require("../internal/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField");
19
19
  var _jsxRuntime = require("react/jsx-runtime");
20
- const _excluded = ["slots", "slotProps", "components", "componentsProps", "value", "defaultValue", "format", "onChange", "readOnly", "disabled", "onError", "shouldDisableDate", "minDate", "maxDate", "minTime", "maxTime", "minDateTime", "maxDateTime", "minutesStep", "shouldDisableClock", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange"],
20
+ const _excluded = ["slots", "slotProps", "components", "componentsProps", "value", "defaultValue", "format", "onChange", "readOnly", "disabled", "onError", "shouldDisableDate", "minDate", "maxDate", "minTime", "maxTime", "minDateTime", "maxDateTime", "minutesStep", "shouldDisableClock", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange", "unstableStartFieldRef", "unstableEndFieldRef", "autoFocus"],
21
21
  _excluded2 = ["onKeyDown", "ref", "readOnly", "inputMode"],
22
22
  _excluded3 = ["onKeyDown", "ref", "readOnly", "inputMode"];
23
23
  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); }
@@ -69,7 +69,10 @@ const MultiInputDateTimeRangeField = /*#__PURE__*/React.forwardRef(function Mult
69
69
  disableFuture,
70
70
  disablePast,
71
71
  selectedSections,
72
- onSelectedSectionsChange
72
+ onSelectedSectionsChange,
73
+ unstableStartFieldRef,
74
+ unstableEndFieldRef,
75
+ autoFocus
73
76
  } = themeProps,
74
77
  other = (0, _objectWithoutPropertiesLoose2.default)(themeProps, _excluded);
75
78
  const slots = innerSlots ?? (0, _internals.uncapitalizeObjectKeys)(components);
@@ -89,6 +92,9 @@ const MultiInputDateTimeRangeField = /*#__PURE__*/React.forwardRef(function Mult
89
92
  const startTextFieldProps = (0, _utils.useSlotProps)({
90
93
  elementType: TextField,
91
94
  externalSlotProps: slotProps?.textField,
95
+ additionalProps: {
96
+ autoFocus
97
+ },
92
98
  ownerState: (0, _extends2.default)({}, ownerState, {
93
99
  position: 'start'
94
100
  })
@@ -133,7 +139,9 @@ const MultiInputDateTimeRangeField = /*#__PURE__*/React.forwardRef(function Mult
133
139
  startTextFieldProps,
134
140
  endTextFieldProps,
135
141
  startInputRef: startTextFieldProps.inputRef,
136
- endInputRef: endTextFieldProps.inputRef
142
+ unstableStartFieldRef,
143
+ endInputRef: endTextFieldProps.inputRef,
144
+ unstableEndFieldRef
137
145
  }),
138
146
  {
139
147
  startDate: {
@@ -184,6 +192,7 @@ process.env.NODE_ENV !== "production" ? MultiInputDateTimeRangeField.propTypes =
184
192
  * @default `utils.is12HourCycleInCurrentLocale()`
185
193
  */
186
194
  ampm: _propTypes.default.bool,
195
+ autoFocus: _propTypes.default.bool,
187
196
  className: _propTypes.default.string,
188
197
  /**
189
198
  * Overridable components.
@@ -349,6 +358,8 @@ process.env.NODE_ENV !== "production" ? MultiInputDateTimeRangeField.propTypes =
349
358
  * The system prop, which allows defining system overrides as well as additional CSS styles.
350
359
  */
351
360
  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]),
361
+ unstableEndFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
362
+ unstableStartFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
352
363
  /**
353
364
  * The selected value.
354
365
  * Used when the component is controlled.
@@ -17,7 +17,7 @@ var _utils = require("@mui/base/utils");
17
17
  var _internals = require("@mui/x-date-pickers/internals");
18
18
  var _useMultiInputTimeRangeField = require("../internal/hooks/useMultiInputRangeField/useMultiInputTimeRangeField");
19
19
  var _jsxRuntime = require("react/jsx-runtime");
20
- const _excluded = ["slots", "slotProps", "components", "componentsProps", "value", "defaultValue", "format", "onChange", "readOnly", "disabled", "onError", "minTime", "maxTime", "minutesStep", "shouldDisableClock", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange"],
20
+ const _excluded = ["slots", "slotProps", "components", "componentsProps", "value", "defaultValue", "format", "onChange", "readOnly", "disabled", "onError", "minTime", "maxTime", "minutesStep", "shouldDisableClock", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange", "unstableStartFieldRef", "unstableEndFieldRef", "autoFocus"],
21
21
  _excluded2 = ["onKeyDown", "ref", "readOnly", "inputMode"],
22
22
  _excluded3 = ["onKeyDown", "ref", "readOnly", "inputMode"];
23
23
  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); }
@@ -64,7 +64,10 @@ const MultiInputTimeRangeField = /*#__PURE__*/React.forwardRef(function MultiInp
64
64
  disableFuture,
65
65
  disablePast,
66
66
  selectedSections,
67
- onSelectedSectionsChange
67
+ onSelectedSectionsChange,
68
+ unstableStartFieldRef,
69
+ unstableEndFieldRef,
70
+ autoFocus
68
71
  } = themeProps,
69
72
  other = (0, _objectWithoutPropertiesLoose2.default)(themeProps, _excluded);
70
73
  const slots = innerSlots ?? (0, _internals.uncapitalizeObjectKeys)(components);
@@ -84,6 +87,9 @@ const MultiInputTimeRangeField = /*#__PURE__*/React.forwardRef(function MultiInp
84
87
  const startTextFieldProps = (0, _utils.useSlotProps)({
85
88
  elementType: TextField,
86
89
  externalSlotProps: slotProps?.textField,
90
+ additionalProps: {
91
+ autoFocus
92
+ },
87
93
  ownerState: (0, _extends2.default)({}, ownerState, {
88
94
  position: 'start'
89
95
  })
@@ -123,7 +129,9 @@ const MultiInputTimeRangeField = /*#__PURE__*/React.forwardRef(function MultiInp
123
129
  startTextFieldProps,
124
130
  endTextFieldProps,
125
131
  startInputRef: startTextFieldProps.inputRef,
126
- endInputRef: endTextFieldProps.inputRef
132
+ unstableStartFieldRef,
133
+ endInputRef: endTextFieldProps.inputRef,
134
+ unstableEndFieldRef
127
135
  }),
128
136
  {
129
137
  startDate: {
@@ -174,6 +182,7 @@ process.env.NODE_ENV !== "production" ? MultiInputTimeRangeField.propTypes = {
174
182
  * @default `utils.is12HourCycleInCurrentLocale()`
175
183
  */
176
184
  ampm: _propTypes.default.bool,
185
+ autoFocus: _propTypes.default.bool,
177
186
  className: _propTypes.default.string,
178
187
  /**
179
188
  * Overridable components.
@@ -315,6 +324,8 @@ process.env.NODE_ENV !== "production" ? MultiInputTimeRangeField.propTypes = {
315
324
  * The system prop, which allows defining system overrides as well as additional CSS styles.
316
325
  */
317
326
  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]),
327
+ unstableEndFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
328
+ unstableStartFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
318
329
  /**
319
330
  * The selected value.
320
331
  * Used when the component is controlled.
@@ -61,6 +61,7 @@ const SingleInputDateRangeField = /*#__PURE__*/React.forwardRef(function SingleI
61
61
  }));
62
62
  });
63
63
  exports.SingleInputDateRangeField = SingleInputDateRangeField;
64
+ SingleInputDateRangeField.fieldType = 'single-input';
64
65
  process.env.NODE_ENV !== "production" ? SingleInputDateRangeField.propTypes = {
65
66
  // ----------------------------- Warning --------------------------------
66
67
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -260,6 +261,10 @@ process.env.NODE_ENV !== "production" ? SingleInputDateRangeField.propTypes = {
260
261
  * The system prop that allows defining system overrides as well as additional CSS styles.
261
262
  */
262
263
  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]),
264
+ /**
265
+ * The ref object used to imperatively interact with the field.
266
+ */
267
+ unstableFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
263
268
  /**
264
269
  * The selected value.
265
270
  * Used when the component is controlled.
@@ -10,7 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _internals = require("@mui/x-date-pickers/internals");
11
11
  var _valueManagers = require("../internal/utils/valueManagers");
12
12
  var _useDateRangeValidation = require("../internal/hooks/validation/useDateRangeValidation");
13
- const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "shouldDisableDate", "minDate", "maxDate", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange"];
13
+ const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "shouldDisableDate", "minDate", "maxDate", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange", "unstableFieldRef"];
14
14
  const useDefaultizedDateRangeFieldProps = props => {
15
15
  const utils = (0, _internals.useUtils)();
16
16
  const defaultDates = (0, _internals.useDefaultDates)();
@@ -41,7 +41,8 @@ const useSingleInputDateRangeField = ({
41
41
  disableFuture,
42
42
  disablePast,
43
43
  selectedSections,
44
- onSelectedSectionsChange
44
+ onSelectedSectionsChange,
45
+ unstableFieldRef
45
46
  } = _useDefaultizedDateRa,
46
47
  other = (0, _objectWithoutPropertiesLoose2.default)(_useDefaultizedDateRa, _excluded);
47
48
  return (0, _internals.useField)({
@@ -60,7 +61,8 @@ const useSingleInputDateRangeField = ({
60
61
  disableFuture,
61
62
  disablePast,
62
63
  selectedSections,
63
- onSelectedSectionsChange
64
+ onSelectedSectionsChange,
65
+ unstableFieldRef
64
66
  },
65
67
  valueManager: _valueManagers.rangeValueManager,
66
68
  fieldValueManager: _valueManagers.rangeFieldValueManager,
@@ -61,6 +61,7 @@ const SingleInputDateTimeRangeField = /*#__PURE__*/React.forwardRef(function Sin
61
61
  }));
62
62
  });
63
63
  exports.SingleInputDateTimeRangeField = SingleInputDateTimeRangeField;
64
+ SingleInputDateTimeRangeField.fieldType = 'single-input';
64
65
  process.env.NODE_ENV !== "production" ? SingleInputDateTimeRangeField.propTypes = {
65
66
  // ----------------------------- Warning --------------------------------
66
67
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -308,6 +309,10 @@ process.env.NODE_ENV !== "production" ? SingleInputDateTimeRangeField.propTypes
308
309
  * The system prop that allows defining system overrides as well as additional CSS styles.
309
310
  */
310
311
  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]),
312
+ /**
313
+ * The ref object used to imperatively interact with the field.
314
+ */
315
+ unstableFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
311
316
  /**
312
317
  * The selected value.
313
318
  * Used when the component is controlled.
@@ -10,7 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _internals = require("@mui/x-date-pickers/internals");
11
11
  var _valueManagers = require("../internal/utils/valueManagers");
12
12
  var _useDateTimeRangeValidation = require("../internal/hooks/validation/useDateTimeRangeValidation");
13
- const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "shouldDisableDate", "minDate", "maxDate", "disableFuture", "disablePast", "minTime", "maxTime", "minDateTime", "maxDateTime", "minutesStep", "shouldDisableTime", "disableIgnoringDatePartForTimeValidation", "selectedSections", "onSelectedSectionsChange"];
13
+ const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "shouldDisableDate", "minDate", "maxDate", "disableFuture", "disablePast", "minTime", "maxTime", "minDateTime", "maxDateTime", "minutesStep", "shouldDisableTime", "disableIgnoringDatePartForTimeValidation", "selectedSections", "onSelectedSectionsChange", "unstableFieldRef"];
14
14
  const useDefaultizedTimeRangeFieldProps = props => {
15
15
  const utils = (0, _internals.useUtils)();
16
16
  const defaultDates = (0, _internals.useDefaultDates)();
@@ -51,7 +51,8 @@ const useSingleInputDateTimeRangeField = ({
51
51
  shouldDisableTime,
52
52
  disableIgnoringDatePartForTimeValidation,
53
53
  selectedSections,
54
- onSelectedSectionsChange
54
+ onSelectedSectionsChange,
55
+ unstableFieldRef
55
56
  } = _useDefaultizedTimeRa,
56
57
  other = (0, _objectWithoutPropertiesLoose2.default)(_useDefaultizedTimeRa, _excluded);
57
58
  return (0, _internals.useField)({
@@ -75,7 +76,8 @@ const useSingleInputDateTimeRangeField = ({
75
76
  shouldDisableTime,
76
77
  disableIgnoringDatePartForTimeValidation,
77
78
  selectedSections,
78
- onSelectedSectionsChange
79
+ onSelectedSectionsChange,
80
+ unstableFieldRef
79
81
  },
80
82
  valueManager: _valueManagers.rangeValueManager,
81
83
  fieldValueManager: _valueManagers.rangeFieldValueManager,
@@ -61,6 +61,7 @@ const SingleInputTimeRangeField = /*#__PURE__*/React.forwardRef(function SingleI
61
61
  }));
62
62
  });
63
63
  exports.SingleInputTimeRangeField = SingleInputTimeRangeField;
64
+ SingleInputTimeRangeField.fieldType = 'single-input';
64
65
  process.env.NODE_ENV !== "production" ? SingleInputTimeRangeField.propTypes = {
65
66
  // ----------------------------- Warning --------------------------------
66
67
  // | These PropTypes are generated from the TypeScript type definitions |
@@ -284,6 +285,10 @@ process.env.NODE_ENV !== "production" ? SingleInputTimeRangeField.propTypes = {
284
285
  * The system prop that allows defining system overrides as well as additional CSS styles.
285
286
  */
286
287
  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]),
288
+ /**
289
+ * The ref object used to imperatively interact with the field.
290
+ */
291
+ unstableFieldRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
287
292
  /**
288
293
  * The selected value.
289
294
  * Used when the component is controlled.
@@ -10,7 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _internals = require("@mui/x-date-pickers/internals");
11
11
  var _valueManagers = require("../internal/utils/valueManagers");
12
12
  var _useTimeRangeValidation = require("../internal/hooks/validation/useTimeRangeValidation");
13
- const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "minTime", "maxTime", "minutesStep", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange"];
13
+ const _excluded = ["value", "defaultValue", "format", "onChange", "readOnly", "onError", "minTime", "maxTime", "minutesStep", "shouldDisableTime", "disableFuture", "disablePast", "selectedSections", "onSelectedSectionsChange", "unstableFieldRef"];
14
14
  const useDefaultizedTimeRangeFieldProps = props => {
15
15
  const utils = (0, _internals.useUtils)();
16
16
  const ampm = props.ampm ?? utils.is12HourCycleInCurrentLocale();
@@ -41,7 +41,8 @@ const useSingleInputTimeRangeField = ({
41
41
  disableFuture,
42
42
  disablePast,
43
43
  selectedSections,
44
- onSelectedSectionsChange
44
+ onSelectedSectionsChange,
45
+ unstableFieldRef
45
46
  } = _useDefaultizedTimeRa,
46
47
  other = (0, _objectWithoutPropertiesLoose2.default)(_useDefaultizedTimeRa, _excluded);
47
48
  return (0, _internals.useField)({
@@ -61,7 +62,8 @@ const useSingleInputTimeRangeField = ({
61
62
  disableFuture,
62
63
  disablePast,
63
64
  selectedSections,
64
- onSelectedSectionsChange
65
+ onSelectedSectionsChange,
66
+ unstableFieldRef
65
67
  },
66
68
  valueManager: _valueManagers.rangeValueManager,
67
69
  fieldValueManager: _valueManagers.rangeFieldValueManager,
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-date-pickers-pro v6.0.2
2
+ * @mui/x-date-pickers-pro v6.0.4
3
3
  *
4
4
  * @license MUI X Commercial
5
5
  * This source code is licensed under the commercial license found in the
@@ -12,7 +12,7 @@ var _xLicensePro = require("@mui/x-license-pro");
12
12
  var _LocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider");
13
13
  var _PickersLayout = require("@mui/x-date-pickers/PickersLayout");
14
14
  var _internals = require("@mui/x-date-pickers/internals");
15
- var _useRangePickerInputProps = require("../useRangePickerInputProps");
15
+ var _useEnrichedRangePickerFieldProps = require("../useEnrichedRangePickerFieldProps");
16
16
  var _releaseInfo = require("../../utils/releaseInfo");
17
17
  var _useRangePosition = require("../useRangePosition");
18
18
  var _jsxRuntime = require("react/jsx-runtime");
@@ -31,17 +31,20 @@ const useDesktopRangePicker = ({
31
31
  className,
32
32
  sx,
33
33
  format,
34
+ label,
35
+ inputRef,
34
36
  readOnly,
35
37
  disabled,
36
38
  autoFocus,
37
39
  disableOpenPicker,
38
40
  localeText
39
41
  } = props;
40
- const fieldRef = React.useRef(null);
42
+ const fieldContainerRef = React.useRef(null);
41
43
  const popperRef = React.useRef(null);
42
44
  const {
43
45
  rangePosition,
44
- onRangePositionChange
46
+ onRangePositionChange,
47
+ singleInputFieldRef
45
48
  } = (0, _useRangePosition.useRangePosition)(props);
46
49
  const {
47
50
  open,
@@ -63,25 +66,14 @@ const useDesktopRangePicker = ({
63
66
  });
64
67
  const handleBlur = () => {
65
68
  (0, _internals.executeInTheNextEventLoopTick)(() => {
66
- if (fieldRef.current?.contains((0, _internals.getActiveElement)(document)) || popperRef.current?.contains((0, _internals.getActiveElement)(document))) {
69
+ if (fieldContainerRef.current?.contains((0, _internals.getActiveElement)(document)) || popperRef.current?.contains((0, _internals.getActiveElement)(document))) {
67
70
  return;
68
71
  }
69
72
  actions.onDismiss();
70
73
  });
71
74
  };
72
- const fieldSlotProps = (0, _useRangePickerInputProps.useRangePickerInputProps)({
73
- wrapperVariant: 'desktop',
74
- open,
75
- actions,
76
- readOnly,
77
- disabled,
78
- disableOpenPicker,
79
- localeText,
80
- onBlur: handleBlur,
81
- rangePosition,
82
- onRangePositionChange
83
- });
84
75
  const Field = slots.field;
76
+ const fieldType = Field.fieldType ?? 'multi-input';
85
77
  const fieldProps = (0, _utils.useSlotProps)({
86
78
  elementType: Field,
87
79
  externalSlotProps: slotProps?.field,
@@ -92,25 +84,28 @@ const useDesktopRangePicker = ({
92
84
  sx,
93
85
  format,
94
86
  autoFocus: autoFocus && !props.open,
95
- ref: fieldRef
87
+ ref: fieldContainerRef
88
+ }, fieldType === 'single-input' && {
89
+ inputRef
96
90
  }),
97
91
  ownerState: props
98
92
  });
99
- const slotsForField = (0, _extends2.default)({
100
- textField: slots.textField,
101
- root: slots.fieldRoot,
102
- separator: slots.fieldSeparator
103
- }, fieldProps.slots);
104
- const slotPropsForField = (0, _extends2.default)({}, fieldProps.slotProps, {
105
- textField: ownerState => {
106
- const externalInputProps = (0, _utils.resolveComponentProps)(slotProps?.textField, ownerState);
107
- return (0, _extends2.default)({}, ownerState.position === 'start' ? fieldSlotProps.startInput : fieldSlotProps.endInput, externalInputProps);
108
- },
109
- root: ownerState => {
110
- const externalRootProps = (0, _utils.resolveComponentProps)(slotProps?.fieldRoot, ownerState);
111
- return (0, _extends2.default)({}, externalRootProps, fieldSlotProps.root);
112
- },
113
- separator: slotProps?.fieldSeparator
93
+ const enrichedFieldProps = (0, _useEnrichedRangePickerFieldProps.useEnrichedRangePickerFieldProps)({
94
+ wrapperVariant: 'desktop',
95
+ fieldType,
96
+ open,
97
+ actions,
98
+ readOnly,
99
+ disableOpenPicker,
100
+ label,
101
+ localeText,
102
+ onBlur: handleBlur,
103
+ rangePosition,
104
+ onRangePositionChange,
105
+ singleInputFieldRef,
106
+ pickerSlotProps: slotProps,
107
+ pickerSlots: slots,
108
+ fieldProps
114
109
  });
115
110
  const slotPropsForLayout = (0, _extends2.default)({}, slotProps, {
116
111
  toolbar: (0, _extends2.default)({}, slotProps?.toolbar, {
@@ -121,13 +116,10 @@ const useDesktopRangePicker = ({
121
116
  const Layout = slots?.layout ?? _PickersLayout.PickersLayout;
122
117
  const renderPicker = () => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_LocalizationProvider.LocalizationProvider, {
123
118
  localeText: localeText,
124
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Field, (0, _extends2.default)({}, fieldProps, {
125
- slots: slotsForField,
126
- slotProps: slotPropsForField
127
- })), /*#__PURE__*/(0, _jsxRuntime.jsx)(_internals.PickersPopper, (0, _extends2.default)({
119
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Field, (0, _extends2.default)({}, enrichedFieldProps)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_internals.PickersPopper, (0, _extends2.default)({
128
120
  role: "tooltip",
129
121
  containerRef: popperRef,
130
- anchorEl: fieldRef.current,
122
+ anchorEl: fieldContainerRef.current,
131
123
  onBlur: handleBlur
132
124
  }, actions, {
133
125
  open: open,