rsuite 5.48.0 → 5.49.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 (146) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/Cascader/styles/index.less +1 -0
  3. package/DatePicker/styles/index.less +18 -11
  4. package/DateRangeInput/package.json +7 -0
  5. package/DateRangePicker/styles/index.less +10 -0
  6. package/InputGroup/styles/index.less +1 -0
  7. package/Picker/styles/index.less +20 -0
  8. package/README.md +34 -24
  9. package/Sidenav/styles/index.less +2 -0
  10. package/cjs/Calendar/CalendarContainer.d.ts +2 -0
  11. package/cjs/Calendar/CalendarContainer.js +11 -4
  12. package/cjs/Calendar/CalendarHeader.js +2 -0
  13. package/cjs/Calendar/MonthDropdown.js +7 -2
  14. package/cjs/Calendar/MonthDropdownItem.js +2 -2
  15. package/cjs/Calendar/Table.js +6 -1
  16. package/cjs/Calendar/TimeDropdown.js +17 -10
  17. package/cjs/Calendar/types.d.ts +1 -0
  18. package/cjs/CustomProvider/CustomProvider.d.ts +13 -0
  19. package/cjs/CustomProvider/CustomProvider.js +2 -2
  20. package/cjs/DateInput/DateField.d.ts +9 -31
  21. package/cjs/DateInput/DateField.js +61 -12
  22. package/cjs/DateInput/DateInput.d.ts +7 -2
  23. package/cjs/DateInput/DateInput.js +74 -92
  24. package/cjs/DateInput/index.d.ts +4 -0
  25. package/cjs/DateInput/index.js +19 -1
  26. package/cjs/DateInput/useDateInputState.d.ts +7 -31
  27. package/cjs/DateInput/useDateInputState.js +39 -15
  28. package/cjs/DateInput/useIsFocused.d.ts +7 -0
  29. package/cjs/DateInput/useIsFocused.js +28 -0
  30. package/cjs/DateInput/useKeyboardInputEvent.d.ts +10 -0
  31. package/cjs/DateInput/useKeyboardInputEvent.js +44 -0
  32. package/cjs/DateInput/utils.d.ts +23 -1
  33. package/cjs/DateInput/utils.js +155 -51
  34. package/cjs/DatePicker/DatePicker.d.ts +20 -7
  35. package/cjs/DatePicker/DatePicker.js +215 -245
  36. package/cjs/DatePicker/PickerIndicator.d.ts +10 -0
  37. package/cjs/DatePicker/PickerIndicator.js +48 -0
  38. package/cjs/DatePicker/PickerLabel.d.ts +9 -0
  39. package/cjs/DatePicker/PickerLabel.js +23 -0
  40. package/cjs/DatePicker/Toolbar.js +3 -21
  41. package/cjs/DatePicker/utils.d.ts +5 -1
  42. package/cjs/DatePicker/utils.js +17 -1
  43. package/cjs/DateRangeInput/DateRangeInput.d.ts +29 -0
  44. package/cjs/DateRangeInput/DateRangeInput.js +244 -0
  45. package/cjs/DateRangeInput/index.d.ts +3 -0
  46. package/cjs/DateRangeInput/index.js +9 -0
  47. package/cjs/DateRangeInput/utils.d.ts +61 -0
  48. package/cjs/DateRangeInput/utils.js +146 -0
  49. package/cjs/DateRangePicker/DateRangePicker.js +12 -2
  50. package/cjs/FormControl/FormControl.js +2 -1
  51. package/cjs/Input/Input.d.ts +11 -0
  52. package/cjs/Input/Input.js +11 -8
  53. package/cjs/MultiCascader/MultiCascader.js +3 -1
  54. package/cjs/Overlay/OverlayTrigger.d.ts +3 -0
  55. package/cjs/Overlay/OverlayTrigger.js +5 -0
  56. package/cjs/Picker/PickerToggle.js +2 -1
  57. package/cjs/Picker/usePickerRef.d.ts +17 -0
  58. package/cjs/Picker/usePickerRef.js +82 -0
  59. package/cjs/index.d.ts +2 -0
  60. package/cjs/index.js +3 -1
  61. package/cjs/locales/index.d.ts +2 -2
  62. package/cjs/useMediaQuery/useMediaQuery.js +2 -2
  63. package/cjs/utils/index.d.ts +2 -0
  64. package/cjs/utils/index.js +8 -2
  65. package/cjs/utils/useCustom.js +1 -1
  66. package/cjs/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  67. package/cjs/utils/useIsomorphicLayoutEffect.js +9 -0
  68. package/dist/rsuite-no-reset-rtl.css +51 -141
  69. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  70. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  71. package/dist/rsuite-no-reset.css +51 -141
  72. package/dist/rsuite-no-reset.min.css +1 -1
  73. package/dist/rsuite-no-reset.min.css.map +1 -1
  74. package/dist/rsuite-rtl.css +51 -9
  75. package/dist/rsuite-rtl.min.css +1 -1
  76. package/dist/rsuite-rtl.min.css.map +1 -1
  77. package/dist/rsuite.css +51 -9
  78. package/dist/rsuite.js +4804 -250
  79. package/dist/rsuite.js.map +1 -1
  80. package/dist/rsuite.min.css +1 -1
  81. package/dist/rsuite.min.css.map +1 -1
  82. package/dist/rsuite.min.js +1 -1
  83. package/dist/rsuite.min.js.map +1 -1
  84. package/esm/Calendar/CalendarContainer.d.ts +2 -0
  85. package/esm/Calendar/CalendarContainer.js +12 -5
  86. package/esm/Calendar/CalendarHeader.js +2 -0
  87. package/esm/Calendar/MonthDropdown.js +7 -2
  88. package/esm/Calendar/MonthDropdownItem.js +2 -2
  89. package/esm/Calendar/Table.js +6 -1
  90. package/esm/Calendar/TimeDropdown.js +17 -10
  91. package/esm/Calendar/types.d.ts +1 -0
  92. package/esm/CustomProvider/CustomProvider.d.ts +13 -0
  93. package/esm/CustomProvider/CustomProvider.js +3 -3
  94. package/esm/DateInput/DateField.d.ts +9 -31
  95. package/esm/DateInput/DateField.js +61 -12
  96. package/esm/DateInput/DateInput.d.ts +7 -2
  97. package/esm/DateInput/DateInput.js +77 -95
  98. package/esm/DateInput/index.d.ts +4 -0
  99. package/esm/DateInput/index.js +4 -0
  100. package/esm/DateInput/useDateInputState.d.ts +7 -31
  101. package/esm/DateInput/useDateInputState.js +41 -18
  102. package/esm/DateInput/useIsFocused.d.ts +7 -0
  103. package/esm/DateInput/useIsFocused.js +22 -0
  104. package/esm/DateInput/useKeyboardInputEvent.d.ts +10 -0
  105. package/esm/DateInput/useKeyboardInputEvent.js +38 -0
  106. package/esm/DateInput/utils.d.ts +23 -1
  107. package/esm/DateInput/utils.js +150 -51
  108. package/esm/DatePicker/DatePicker.d.ts +20 -7
  109. package/esm/DatePicker/DatePicker.js +218 -248
  110. package/esm/DatePicker/PickerIndicator.d.ts +10 -0
  111. package/esm/DatePicker/PickerIndicator.js +42 -0
  112. package/esm/DatePicker/PickerLabel.d.ts +9 -0
  113. package/esm/DatePicker/PickerLabel.js +17 -0
  114. package/esm/DatePicker/Toolbar.js +3 -21
  115. package/esm/DatePicker/utils.d.ts +5 -1
  116. package/esm/DatePicker/utils.js +16 -1
  117. package/esm/DateRangeInput/DateRangeInput.d.ts +29 -0
  118. package/esm/DateRangeInput/DateRangeInput.js +237 -0
  119. package/esm/DateRangeInput/index.d.ts +3 -0
  120. package/esm/DateRangeInput/index.js +3 -0
  121. package/esm/DateRangeInput/utils.d.ts +61 -0
  122. package/esm/DateRangeInput/utils.js +137 -0
  123. package/esm/DateRangePicker/DateRangePicker.js +12 -2
  124. package/esm/FormControl/FormControl.js +2 -1
  125. package/esm/Input/Input.d.ts +11 -0
  126. package/esm/Input/Input.js +12 -9
  127. package/esm/MultiCascader/MultiCascader.js +4 -2
  128. package/esm/Overlay/OverlayTrigger.d.ts +3 -0
  129. package/esm/Overlay/OverlayTrigger.js +5 -0
  130. package/esm/Picker/PickerToggle.js +2 -1
  131. package/esm/Picker/usePickerRef.d.ts +17 -0
  132. package/esm/Picker/usePickerRef.js +77 -0
  133. package/esm/index.d.ts +2 -0
  134. package/esm/index.js +1 -0
  135. package/esm/locales/index.d.ts +2 -2
  136. package/esm/useMediaQuery/useMediaQuery.js +2 -2
  137. package/esm/utils/index.d.ts +2 -0
  138. package/esm/utils/index.js +3 -1
  139. package/esm/utils/useCustom.js +2 -2
  140. package/esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
  141. package/esm/utils/useIsomorphicLayoutEffect.js +4 -0
  142. package/package.json +1 -1
  143. package/styles/color-modes/dark.less +1 -0
  144. package/styles/color-modes/high-contrast.less +1 -0
  145. package/styles/color-modes/light.less +1 -0
  146. package/styles/normalize.less +230 -231
@@ -6,6 +6,8 @@ import { CalendarState } from './useCalendarState';
6
6
  export interface CalendarProps extends WithAsProps, Omit<HTMLAttributes<HTMLDivElement>, 'onSelect' | 'onChange' | 'onMouseMove'>, CalendarHeaderProps {
7
7
  /** The panel render based on date range */
8
8
  dateRange?: Date[];
9
+ /** The Id of the target element that triggers the opening of the calendar */
10
+ targetId?: string;
9
11
  /** Date displayed on the current page */
10
12
  calendarDate: Date;
11
13
  /** Whether to show week numbers */
@@ -9,7 +9,7 @@ import TimeDropdown from './TimeDropdown';
9
9
  import CalendarBody from './CalendarBody';
10
10
  import CalendarHeader from './CalendarHeader';
11
11
  import { useClassNames } from '../utils';
12
- import { disabledTime, addMonths, shouldRenderDate, shouldRenderTime, shouldRenderMonth, isSameMonth, calendarOnlyProps, omitHideDisabledProps } from '../utils/dateUtils';
12
+ import { disabledTime, addMonths, shouldRenderDate, shouldRenderTime, shouldRenderMonth, isSameMonth, calendarOnlyProps, omitHideDisabledProps, isValid } from '../utils/dateUtils';
13
13
  import { CalendarProvider } from './CalendarContext';
14
14
  import useCalendarState, { CalendarState } from './useCalendarState';
15
15
  import AngleUpIcon from '@rsuite/icons/legacy/AngleUp';
@@ -28,6 +28,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
28
28
  hoverRangeValue = props.hoverRangeValue,
29
29
  _props$isoWeek = props.isoWeek,
30
30
  isoWeek = _props$isoWeek === void 0 ? false : _props$isoWeek,
31
+ targetId = props.targetId,
31
32
  limitEndYear = props.limitEndYear,
32
33
  limitStartYear = props.limitStartYear,
33
34
  locale = props.locale,
@@ -40,7 +41,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
40
41
  onToggleMeridian = props.onToggleMeridian,
41
42
  onToggleMonthDropdown = props.onToggleMonthDropdown,
42
43
  onToggleTimeDropdown = props.onToggleTimeDropdown,
43
- calendarDate = props.calendarDate,
44
+ calendarDateProp = props.calendarDate,
44
45
  cellClassName = props.cellClassName,
45
46
  renderCell = props.renderCell,
46
47
  renderTitle = props.renderTitle,
@@ -48,7 +49,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
48
49
  showMeridian = props.showMeridian,
49
50
  showWeekNumbers = props.showWeekNumbers,
50
51
  inline = props.inline,
51
- rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "isoWeek", "limitEndYear", "limitStartYear", "locale", "onChangeMonth", "onChangeTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "cellClassName", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
52
+ rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "dateRange", "disabledBackward", "defaultState", "disabledDate", "disabledForward", "format", "hoverRangeValue", "isoWeek", "targetId", "limitEndYear", "limitStartYear", "locale", "onChangeMonth", "onChangeTime", "onMouseMove", "onMoveBackward", "onMoveForward", "onSelect", "onToggleMeridian", "onToggleMonthDropdown", "onToggleTimeDropdown", "calendarDate", "cellClassName", "renderCell", "renderTitle", "renderToolbar", "showMeridian", "showWeekNumbers", "inline"]);
52
53
  var _useClassNames = useClassNames(classPrefix),
53
54
  withClassPrefix = _useClassNames.withClassPrefix,
54
55
  merge = _useClassNames.merge,
@@ -58,6 +59,9 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
58
59
  reset = _useCalendarState.reset,
59
60
  openMonth = _useCalendarState.openMonth,
60
61
  openTime = _useCalendarState.openTime;
62
+ var calendarDate = useMemo(function () {
63
+ return isValid(calendarDateProp) ? calendarDateProp : new Date();
64
+ }, [calendarDateProp]);
61
65
  var isDisabledDate = useCallback(function (date) {
62
66
  var _disabledDate;
63
67
  return (_disabledDate = disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date)) !== null && _disabledDate !== void 0 ? _disabledDate : false;
@@ -123,6 +127,7 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
123
127
  hoverRangeValue: hoverRangeValue,
124
128
  inSameMonth: inSameThisMonthDate,
125
129
  isoWeek: isoWeek,
130
+ targetId: targetId,
126
131
  locale: locale,
127
132
  onChangeMonth: handleChangeMonth,
128
133
  onChangeTime: onChangeTime,
@@ -133,10 +138,12 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
133
138
  showWeekNumbers: showWeekNumbers,
134
139
  inline: inline
135
140
  };
136
- }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, locale, onChangeTime, onMouseMove, onSelect, cellClassName, renderCell, showWeekNumbers]);
141
+ }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, targetId, locale, onChangeTime, onMouseMove, onSelect, cellClassName, renderCell, showWeekNumbers]);
137
142
  return /*#__PURE__*/React.createElement(CalendarProvider, {
138
143
  value: contextValue
139
- }, /*#__PURE__*/React.createElement(Component, _extends({}, omitHideDisabledProps(rest), {
144
+ }, /*#__PURE__*/React.createElement(Component, _extends({
145
+ "data-testid": "calendar"
146
+ }, omitHideDisabledProps(rest), {
140
147
  className: calendarClasses,
141
148
  ref: ref
142
149
  }), /*#__PURE__*/React.createElement(CalendarHeader, {
@@ -122,6 +122,7 @@ var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
122
122
  }), hasMonth && monthToolbar, showTime && /*#__PURE__*/React.createElement("div", {
123
123
  className: prefix('time-toolbar')
124
124
  }, /*#__PURE__*/React.createElement(Button, _extends({}, btnProps, {
125
+ "aria-label": "Select time",
125
126
  className: timeTitleClasses,
126
127
  onClick: onToggleTimeDropdown,
127
128
  disabled: disableSelectTime
@@ -129,6 +130,7 @@ var CalendarHeader = /*#__PURE__*/React.forwardRef(function (props, ref) {
129
130
  date: date,
130
131
  formatStr: getTimeFormat()
131
132
  })), showMeridian && /*#__PURE__*/React.createElement(Button, _extends({}, btnProps, {
133
+ "aria-label": "Toggle meridian",
132
134
  className: prefix('meridian'),
133
135
  onClick: onToggleMeridian,
134
136
  disabled: disableSelectTime
@@ -35,7 +35,8 @@ var MonthDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
35
35
  rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "limitStartYear", "limitEndYear", "show", "height", "width", "disabledMonth"]);
36
36
  var _useCalendarContext = useCalendarContext(),
37
37
  _useCalendarContext$d = _useCalendarContext.date,
38
- date = _useCalendarContext$d === void 0 ? new Date() : _useCalendarContext$d;
38
+ date = _useCalendarContext$d === void 0 ? new Date() : _useCalendarContext$d,
39
+ targetId = _useCalendarContext.targetId;
39
40
  var _useClassNames = useClassNames(classPrefix),
40
41
  prefix = _useClassNames.prefix,
41
42
  merge = _useClassNames.merge,
@@ -69,6 +70,7 @@ var MonthDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
69
70
  return /*#__PURE__*/React.createElement("div", {
70
71
  className: rowClassName,
71
72
  role: "row",
73
+ "aria-label": "" + year,
72
74
  style: style
73
75
  }, /*#__PURE__*/React.createElement("div", {
74
76
  className: titleClassName,
@@ -92,7 +94,10 @@ var MonthDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
92
94
  var initialItemIndex = DateUtils.getYear(date) - startYear;
93
95
  var initialScrollOffset = itemSize * initialItemIndex;
94
96
  return /*#__PURE__*/React.createElement(Component, _extends({
95
- role: "menu"
97
+ role: "grid",
98
+ "aria-label": "Select month",
99
+ tabIndex: -1,
100
+ id: targetId ? targetId + "-" + classPrefix : undefined
96
101
  }, rest, {
97
102
  ref: ref,
98
103
  className: classes
@@ -55,8 +55,8 @@ var MonthDropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
55
55
  return /*#__PURE__*/React.createElement(Component, _extends({
56
56
  key: month,
57
57
  role: "gridcell",
58
- "aria-selected": active ? true : undefined,
59
- "aria-disabled": disabled ? true : undefined,
58
+ "aria-selected": active,
59
+ "aria-disabled": disabled,
60
60
  "aria-label": ariaLabel,
61
61
  tabIndex: active ? 0 : -1,
62
62
  ref: ref,
@@ -6,6 +6,7 @@ import PropTypes from 'prop-types';
6
6
  import TableRow from './TableRow';
7
7
  import TableHeaderRow from './TableHeaderRow';
8
8
  import { useClassNames } from '../utils';
9
+ import { useCalendarContext } from './CalendarContext';
9
10
  var Table = /*#__PURE__*/React.forwardRef(function (props, ref) {
10
11
  var _props$as = props.as,
11
12
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -19,8 +20,12 @@ var Table = /*#__PURE__*/React.forwardRef(function (props, ref) {
19
20
  merge = _useClassNames.merge,
20
21
  withClassPrefix = _useClassNames.withClassPrefix;
21
22
  var classes = merge(className, withClassPrefix());
23
+ var _useCalendarContext = useCalendarContext(),
24
+ targetId = _useCalendarContext.targetId;
22
25
  return /*#__PURE__*/React.createElement(Component, _extends({
23
- role: "grid"
26
+ role: "grid",
27
+ tabIndex: -1,
28
+ id: targetId ? targetId + "-" + classPrefix : undefined
24
29
  }, rest, {
25
30
  ref: ref,
26
31
  className: classes
@@ -90,7 +90,8 @@ var TimeDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
90
90
  locale = _useCalendarContext.locale,
91
91
  format = _useCalendarContext.format,
92
92
  date = _useCalendarContext.date,
93
- onSelect = _useCalendarContext.onChangeTime;
93
+ onSelect = _useCalendarContext.onChangeTime,
94
+ targetId = _useCalendarContext.targetId;
94
95
  var rowRef = useRef(null);
95
96
  useEffect(function () {
96
97
  var time = getTime({
@@ -141,24 +142,26 @@ var TimeDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
141
142
  });
142
143
  items.push( /*#__PURE__*/React.createElement("li", {
143
144
  key: i,
144
- role: "menuitem"
145
- }, /*#__PURE__*/React.createElement("a", {
146
- role: "button",
147
- className: itemClasses,
145
+ role: "option",
148
146
  tabIndex: -1,
147
+ "aria-label": i + " " + type,
148
+ "aria-selected": active === i,
149
+ "aria-disabled": disabled,
149
150
  "data-key": type + "-" + i,
150
151
  onClick: !disabled ? partial(handleClick, type, i) : undefined
152
+ }, /*#__PURE__*/React.createElement("span", {
153
+ className: itemClasses
151
154
  }, showMeridian && type === 'hours' && i === 0 ? '12' : i)));
152
155
  }
153
156
  }
154
157
  return /*#__PURE__*/React.createElement("div", {
155
- className: prefix('column'),
156
- role: "listitem"
158
+ className: prefix('column')
157
159
  }, /*#__PURE__*/React.createElement("div", {
158
160
  className: prefix('column-title')
159
161
  }, locale === null || locale === void 0 ? void 0 : locale[type]), /*#__PURE__*/React.createElement("ul", {
160
162
  "data-type": type,
161
- role: "menu"
163
+ role: "listbox",
164
+ "aria-label": "Select " + type
162
165
  }, items));
163
166
  };
164
167
  var time = getTime({
@@ -166,9 +169,13 @@ var TimeDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
166
169
  date: date,
167
170
  showMeridian: showMeridian
168
171
  });
169
- var classes = merge(className, rootPrefix(classPrefix));
172
+ var classes = merge(className, rootPrefix(classPrefix), {
173
+ show: show
174
+ });
170
175
  return /*#__PURE__*/React.createElement(Component, _extends({
171
- role: "list"
176
+ role: "group",
177
+ tabIndex: -1,
178
+ id: targetId ? targetId + "-" + classPrefix : undefined
172
179
  }, DateUtils.omitHideDisabledProps(rest), {
173
180
  ref: ref,
174
181
  className: classes
@@ -16,6 +16,7 @@ export interface CalendarInnerContextValue {
16
16
  cellClassName?: (date: Date) => string | undefined;
17
17
  showWeekNumbers?: boolean;
18
18
  inline?: boolean;
19
+ targetId?: string;
19
20
  }
20
21
  export interface CalendarContextValue extends CalendarInnerContextValue {
21
22
  locale: CalendarLocale;
@@ -67,6 +67,19 @@ declare const CustomContext: React.Context<CustomProviderProps<{
67
67
  more: string;
68
68
  prev: string;
69
69
  next: string;
70
+ /**
71
+ * Return the date parsed from string using the given format string.
72
+ *
73
+ * Example:
74
+ *
75
+ * import parse from 'date-fns/parse';
76
+ * import eo from 'date-fns/locale/eo'
77
+ *
78
+ * function parseDate(date, formatStr) {
79
+ * return parse(date, formatStr, new Date(), { locale: eo });
80
+ * }
81
+ *
82
+ * */
70
83
  first: string;
71
84
  last: string;
72
85
  limit: string;
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useEffect } from 'react';
4
+ import React from 'react';
5
5
  import { getClassNamePrefix, prefix } from '../utils/prefix';
6
6
  import { addClass, removeClass, canUseDOM } from '../DOMHelper';
7
7
  import ToastContainer, { toastPlacements } from '../toaster/ToastContainer';
8
- import { usePortal } from '../utils';
8
+ import { usePortal, useIsomorphicLayoutEffect } from '../utils';
9
9
  var CustomContext = /*#__PURE__*/React.createContext({});
10
10
  var themes = ['light', 'dark', 'high-contrast'];
11
11
 
@@ -36,7 +36,7 @@ var CustomProvider = function CustomProvider(props) {
36
36
  disableRipple: disableRipple
37
37
  }, rest);
38
38
  }, [classPrefix, theme, disableRipple, rest]);
39
- useEffect(function () {
39
+ useIsomorphicLayoutEffect(function () {
40
40
  if (canUseDOM && theme) {
41
41
  addClass(document.body, prefix(classPrefix, "theme-" + theme));
42
42
 
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { type Locale } from 'date-fns';
2
+ import type { Locale } from 'date-fns';
3
3
  export declare const patternMap: {
4
4
  y: string;
5
5
  M: string;
@@ -22,9 +22,12 @@ export declare class DateField extends Object {
22
22
  hour: number | null;
23
23
  minute: number | null;
24
24
  second: number | null;
25
- meridian: 'AM' | 'PM' | null;
26
25
  constructor(format: string, value?: Date | null);
27
26
  }
27
+ interface Action {
28
+ type: string;
29
+ value: any;
30
+ }
28
31
  export declare const useDateField: (format: string, localize: Locale['localize'], date?: Date | null) => {
29
32
  dateField: {
30
33
  year: any;
@@ -38,7 +41,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
38
41
  hour: number | null;
39
42
  minute: number | null;
40
43
  second: number | null;
41
- meridian: 'AM' | 'PM' | null;
42
44
  constructor: Function;
43
45
  toString(): string;
44
46
  toLocaleString(): string;
@@ -59,7 +61,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
59
61
  hour: number | null;
60
62
  minute: number | null;
61
63
  second: number | null;
62
- meridian: 'AM' | 'PM' | null;
63
64
  constructor: Function;
64
65
  toString(): string;
65
66
  toLocaleString(): string;
@@ -80,7 +81,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
80
81
  hour: number | null;
81
82
  minute: number | null;
82
83
  second: number | null;
83
- meridian: 'AM' | 'PM' | null;
84
84
  constructor: Function;
85
85
  toString(): string;
86
86
  toLocaleString(): string;
@@ -101,7 +101,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
101
101
  day: number | null;
102
102
  minute: number | null;
103
103
  second: number | null;
104
- meridian: 'AM' | 'PM' | null;
105
104
  constructor: Function;
106
105
  toString(): string;
107
106
  toLocaleString(): string;
@@ -122,7 +121,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
122
121
  day: number | null;
123
122
  hour: number | null;
124
123
  second: number | null;
125
- meridian: 'AM' | 'PM' | null;
126
124
  constructor: Function;
127
125
  toString(): string;
128
126
  toLocaleString(): string;
@@ -143,28 +141,6 @@ export declare const useDateField: (format: string, localize: Locale['localize']
143
141
  day: number | null;
144
142
  hour: number | null;
145
143
  minute: number | null;
146
- meridian: 'AM' | 'PM' | null;
147
- constructor: Function;
148
- toString(): string;
149
- toLocaleString(): string;
150
- valueOf(): Object;
151
- hasOwnProperty(v: PropertyKey): boolean;
152
- isPrototypeOf(v: Object): boolean;
153
- propertyIsEnumerable(v: PropertyKey): boolean;
154
- should: Chai.Assertion;
155
- } | {
156
- meridian: any;
157
- format: string;
158
- patternArray: {
159
- pattern: string;
160
- key: string;
161
- }[];
162
- year: number | null;
163
- month: number | null;
164
- day: number | null;
165
- hour: number | null;
166
- minute: number | null;
167
- second: number | null;
168
144
  constructor: Function;
169
145
  toString(): string;
170
146
  toLocaleString(): string;
@@ -174,7 +150,9 @@ export declare const useDateField: (format: string, localize: Locale['localize']
174
150
  propertyIsEnumerable(v: PropertyKey): boolean;
175
151
  should: Chai.Assertion;
176
152
  };
177
- dispatch: import("react").Dispatch<any>;
178
- toDate: (type: string, value: number | null) => Date;
153
+ dispatch: import("react").Dispatch<Action>;
154
+ toDate: (type?: string, value?: number | null) => Date | null;
179
155
  toDateString: () => string;
156
+ isEmptyValue: (type?: string, value?: number | null) => boolean | undefined;
180
157
  };
158
+ export {};
@@ -3,6 +3,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
4
4
  import _wrapNativeSuper from "@babel/runtime/helpers/esm/wrapNativeSuper";
5
5
  import { useReducer } from 'react';
6
+ import isValid from 'date-fns/isValid';
6
7
  import { modifyDate } from './utils';
7
8
  export var patternMap = {
8
9
  y: 'year',
@@ -27,7 +28,6 @@ export var DateField = /*#__PURE__*/function (_Object) {
27
28
  _this.hour = null;
28
29
  _this.minute = null;
29
30
  _this.second = null;
30
- _this.meridian = null;
31
31
  _this.format = format;
32
32
  var formatArray = format.match(new RegExp('([y|d|M|H|h|m|s|a])+', 'ig')) || [];
33
33
  _this.patternArray = formatArray.map(function (pattern) {
@@ -36,14 +36,13 @@ export var DateField = /*#__PURE__*/function (_Object) {
36
36
  key: patternMap[pattern[0]]
37
37
  };
38
38
  });
39
- if (value) {
39
+ if (value && isValid(value)) {
40
40
  _this.year = value.getFullYear();
41
41
  _this.month = value.getMonth() + 1;
42
42
  _this.day = value.getDate();
43
43
  _this.hour = value.getHours();
44
44
  _this.minute = value.getMinutes();
45
45
  _this.second = value.getSeconds();
46
- _this.meridian = value.getHours() > 12 ? 'PM' : 'AM';
47
46
  }
48
47
  return _this;
49
48
  }
@@ -91,10 +90,8 @@ export var useDateField = function useDateField(format, localize, date) {
91
90
  return _extends({}, state, {
92
91
  second: action.value
93
92
  });
94
- case 'setMeridian':
95
- return _extends({}, state, {
96
- meridian: action.value
97
- });
93
+ case 'setNewDate':
94
+ return new DateField(format, action.value);
98
95
  default:
99
96
  return state;
100
97
  }
@@ -106,6 +103,7 @@ export var useDateField = function useDateField(format, localize, date) {
106
103
  dateField.patternArray.forEach(function (item) {
107
104
  var key = item.key,
108
105
  pattern = item.pattern;
106
+ var hour = dateField.hour;
109
107
  var value = dateField[key];
110
108
  if (value !== null) {
111
109
  if (pattern === 'MMM' && typeof value === 'number') {
@@ -116,8 +114,12 @@ export var useDateField = function useDateField(format, localize, date) {
116
114
  value = localize === null || localize === void 0 ? void 0 : localize.month(value - 1, {
117
115
  width: 'wide'
118
116
  });
119
- } else if (pattern === 'aa' && typeof value === 'number') {
120
- value = value === 0 ? 'AM' : 'PM';
117
+ } else if (pattern === 'aa') {
118
+ if (typeof hour === 'number') {
119
+ value = hour > 12 ? 'PM' : 'AM';
120
+ } else {
121
+ value = 'aa';
122
+ }
121
123
  } else if (pattern === 'hh' && typeof value === 'number') {
122
124
  value = value === 0 ? 12 : value > 12 ? value - 12 : value;
123
125
  }
@@ -129,16 +131,63 @@ export var useDateField = function useDateField(format, localize, date) {
129
131
  });
130
132
  return str;
131
133
  };
134
+
135
+ // Check if the field value is valid.
136
+ var validFieldValue = function validFieldValue(type, value) {
137
+ var _format$match;
138
+ var isValid = true;
139
+ (_format$match = format.match(new RegExp('([y|d|M|H|h|m|s])+', 'ig'))) === null || _format$match === void 0 ? void 0 : _format$match.forEach(function (pattern) {
140
+ var key = patternMap[pattern[0]];
141
+ var fieldValue = type === key ? value : dateField[key];
142
+ if (fieldValue === null) {
143
+ isValid = false;
144
+ return;
145
+ }
146
+ });
147
+ return isValid;
148
+ };
149
+ var isEmptyValue = function isEmptyValue(type, value) {
150
+ var _format$match2;
151
+ var checkValueArray = (_format$match2 = format.match(new RegExp('([y|d|M|H|h|m|s])+', 'ig'))) === null || _format$match2 === void 0 ? void 0 : _format$match2.map(function (pattern) {
152
+ var key = patternMap[pattern[0]];
153
+ var fieldValue = type === key ? value : dateField[key];
154
+ return fieldValue !== null;
155
+ });
156
+ return checkValueArray === null || checkValueArray === void 0 ? void 0 : checkValueArray.every(function (item) {
157
+ return item === false;
158
+ });
159
+ };
132
160
  var toDate = function toDate(type, value) {
133
- if (value === null) {
161
+ var year = dateField.year,
162
+ month = dateField.month,
163
+ day = dateField.day,
164
+ hour = dateField.hour,
165
+ minute = dateField.minute,
166
+ second = dateField.second;
167
+ var date = new Date(year || 0, typeof month === 'number' ? month - 1 : 0,
168
+ // The default day is 1 when the value is null, otherwise it becomes the last day of the month.
169
+ day || 1, hour || 0, minute || 0, second || 0);
170
+ if (typeof type === 'undefined' || typeof value === 'undefined') {
171
+ return date;
172
+ }
173
+ if (value === null || !validFieldValue(type, value)) {
174
+ if (isEmptyValue(type, value)) {
175
+ return null;
176
+ }
134
177
  return new Date('');
135
178
  }
136
- return modifyDate(new Date(dateField.year, dateField.month ? dateField.month - 1 : 0, dateField.day, dateField.hour, dateField.minute, dateField.second), type, value);
179
+ if (type === 'meridian' && typeof hour === 'number') {
180
+ var newHour = hour > 12 ? hour - 12 : hour + 12;
181
+ type = 'hour';
182
+ value = newHour;
183
+ }
184
+ return modifyDate(date, type, value);
137
185
  };
138
186
  return {
139
187
  dateField: dateField,
140
188
  dispatch: dispatch,
141
189
  toDate: toDate,
142
- toDateString: toDateString
190
+ toDateString: toDateString,
191
+ isEmptyValue: isEmptyValue
143
192
  };
144
193
  };
@@ -3,11 +3,16 @@ import { InputProps } from '../Input';
3
3
  import { FormControlBaseProps } from '../@types/common';
4
4
  export interface DateInputProps extends Omit<InputProps, 'value' | 'onChange' | 'defaultValue'>, FormControlBaseProps<Date | null> {
5
5
  /**
6
- * Format of the date when rendered in the input.
7
- * Format of the string is based on Unicode Technical Standard: https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
6
+ * Format of the date when rendered in the input. Format of the string is based on Unicode Technical Standard.
7
+ *
8
+ * @see https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
8
9
  * @default 'yyyy-MM-dd'
9
10
  **/
10
11
  format?: string;
12
+ /**
13
+ * The `placeholder` prop defines the text displayed in a form control when the control has no value.
14
+ */
15
+ placeholder?: string;
11
16
  }
12
17
  /**
13
18
  * The DateInput component lets users select a date with the keyboard.