rsuite 5.50.0 → 5.51.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 (177) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/CheckTreePicker/styles/index.less +3 -3
  3. package/DatePicker/styles/index.less +1 -1
  4. package/Form/styles/mixin.less +1 -2
  5. package/InputGroup/styles/index.less +0 -14
  6. package/InputPicker/styles/index.less +1 -1
  7. package/Picker/styles/index.less +2 -2
  8. package/Picker/styles/mixin.less +3 -3
  9. package/TagInput/styles/index.less +1 -1
  10. package/TagPicker/styles/index.less +5 -1
  11. package/TreePicker/styles/index.less +2 -2
  12. package/cjs/@types/common.d.ts +8 -0
  13. package/cjs/AutoComplete/AutoComplete.js +14 -11
  14. package/cjs/AutoComplete/Combobox.d.ts +8 -0
  15. package/cjs/AutoComplete/Combobox.js +31 -0
  16. package/cjs/Calendar/CalendarContainer.js +35 -37
  17. package/cjs/Cascader/Cascader.js +12 -11
  18. package/cjs/Cascader/DropdownMenu.d.ts +3 -20
  19. package/cjs/Cascader/DropdownMenu.js +48 -48
  20. package/cjs/Cascader/TreeView.d.ts +24 -0
  21. package/cjs/Cascader/TreeView.js +174 -0
  22. package/cjs/CheckPicker/CheckPicker.js +9 -8
  23. package/cjs/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  24. package/cjs/CheckTreePicker/CheckTreeNode.js +31 -59
  25. package/cjs/CheckTreePicker/CheckTreePicker.js +20 -20
  26. package/cjs/DatePicker/DatePicker.js +5 -6
  27. package/cjs/DateRangePicker/DateRangePicker.js +3 -4
  28. package/cjs/Form/Form.d.ts +14 -0
  29. package/cjs/Form/Form.js +39 -30
  30. package/cjs/Form/FormContext.d.ts +1 -0
  31. package/cjs/FormControl/FormControl.js +40 -18
  32. package/cjs/FormGroup/FormGroup.js +2 -1
  33. package/cjs/InputPicker/InputPicker.js +46 -29
  34. package/cjs/InputPicker/InputSearch.js +3 -15
  35. package/cjs/InputPicker/TagList.d.ts +3 -0
  36. package/cjs/InputPicker/TagList.js +29 -0
  37. package/cjs/InputPicker/TextBox.d.ts +18 -0
  38. package/cjs/InputPicker/TextBox.js +48 -0
  39. package/cjs/MultiCascader/MultiCascader.js +13 -10
  40. package/cjs/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  41. package/cjs/MultiCascader/{DropdownMenu.js → TreeView.js} +77 -74
  42. package/{esm/Picker/DropdownMenuCheckItem.d.ts → cjs/Picker/ListCheckItem.d.ts} +3 -3
  43. package/cjs/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +14 -30
  44. package/{esm/Picker/DropdownMenuItem.d.ts → cjs/Picker/ListItem.d.ts} +4 -4
  45. package/cjs/Picker/{DropdownMenuItem.js → ListItem.js} +15 -24
  46. package/cjs/Picker/ListItemGroup.d.ts +6 -0
  47. package/cjs/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  48. package/cjs/Picker/Listbox.d.ts +35 -0
  49. package/cjs/Picker/{DropdownMenu.js → Listbox.js} +49 -64
  50. package/cjs/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  51. package/cjs/Picker/{PickerOverlay.js → PickerPopup.js} +9 -7
  52. package/cjs/Picker/PickerToggle.d.ts +1 -1
  53. package/cjs/Picker/PickerToggle.js +16 -9
  54. package/cjs/Picker/PickerToggleTrigger.d.ts +15 -0
  55. package/cjs/Picker/PickerToggleTrigger.js +21 -5
  56. package/cjs/Picker/SearchBar.js +7 -9
  57. package/cjs/Picker/TreeView.d.ts +7 -0
  58. package/cjs/Picker/TreeView.js +31 -0
  59. package/cjs/Picker/hooks/index.d.ts +6 -0
  60. package/cjs/Picker/hooks/index.js +18 -0
  61. package/cjs/Picker/hooks/useCombobox.d.ts +7 -0
  62. package/cjs/Picker/hooks/useCombobox.js +22 -0
  63. package/cjs/Picker/hooks/useFocusItemValue.d.ts +30 -0
  64. package/cjs/Picker/hooks/useFocusItemValue.js +246 -0
  65. package/cjs/Picker/hooks/usePickerClassName.d.ts +21 -0
  66. package/cjs/Picker/hooks/usePickerClassName.js +39 -0
  67. package/cjs/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  68. package/cjs/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  69. package/cjs/Picker/hooks/useSearch.d.ts +18 -0
  70. package/cjs/Picker/hooks/useSearch.js +57 -0
  71. package/cjs/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  72. package/cjs/Picker/hooks/useToggleKeyDownEvent.js +101 -0
  73. package/cjs/Picker/index.d.ts +7 -6
  74. package/cjs/Picker/index.js +26 -19
  75. package/cjs/Picker/propTypes.d.ts +0 -6
  76. package/cjs/Picker/propTypes.js +0 -5
  77. package/cjs/Picker/utils.d.ts +2 -96
  78. package/cjs/Picker/utils.js +1 -406
  79. package/cjs/SelectPicker/SelectPicker.js +8 -8
  80. package/cjs/TagInput/index.js +4 -0
  81. package/cjs/TreePicker/TreeNode.d.ts +2 -2
  82. package/cjs/TreePicker/TreeNode.js +22 -56
  83. package/cjs/TreePicker/TreePicker.js +19 -20
  84. package/dist/rsuite-no-reset-rtl.css +109 -117
  85. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  86. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  87. package/dist/rsuite-no-reset.css +109 -117
  88. package/dist/rsuite-no-reset.min.css +1 -1
  89. package/dist/rsuite-no-reset.min.css.map +1 -1
  90. package/dist/rsuite-rtl.css +109 -117
  91. package/dist/rsuite-rtl.min.css +1 -1
  92. package/dist/rsuite-rtl.min.css.map +1 -1
  93. package/dist/rsuite.css +109 -117
  94. package/dist/rsuite.js +184 -74
  95. package/dist/rsuite.js.map +1 -1
  96. package/dist/rsuite.min.css +1 -1
  97. package/dist/rsuite.min.css.map +1 -1
  98. package/dist/rsuite.min.js +1 -1
  99. package/dist/rsuite.min.js.map +1 -1
  100. package/esm/@types/common.d.ts +8 -0
  101. package/esm/AutoComplete/AutoComplete.js +15 -12
  102. package/esm/AutoComplete/Combobox.d.ts +8 -0
  103. package/esm/AutoComplete/Combobox.js +25 -0
  104. package/esm/Calendar/CalendarContainer.js +37 -39
  105. package/esm/Cascader/Cascader.js +13 -12
  106. package/esm/Cascader/DropdownMenu.d.ts +3 -20
  107. package/esm/Cascader/DropdownMenu.js +50 -49
  108. package/esm/Cascader/TreeView.d.ts +24 -0
  109. package/esm/Cascader/TreeView.js +167 -0
  110. package/esm/CheckPicker/CheckPicker.js +10 -9
  111. package/esm/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  112. package/esm/CheckTreePicker/CheckTreeNode.js +33 -61
  113. package/esm/CheckTreePicker/CheckTreePicker.js +21 -21
  114. package/esm/DatePicker/DatePicker.js +5 -6
  115. package/esm/DateRangePicker/DateRangePicker.js +3 -4
  116. package/esm/Form/Form.d.ts +14 -0
  117. package/esm/Form/Form.js +41 -32
  118. package/esm/Form/FormContext.d.ts +1 -0
  119. package/esm/FormControl/FormControl.js +39 -17
  120. package/esm/FormGroup/FormGroup.js +3 -2
  121. package/esm/InputPicker/InputPicker.js +47 -30
  122. package/esm/InputPicker/InputSearch.js +4 -15
  123. package/esm/InputPicker/TagList.d.ts +3 -0
  124. package/esm/InputPicker/TagList.js +23 -0
  125. package/esm/InputPicker/TextBox.d.ts +18 -0
  126. package/esm/InputPicker/TextBox.js +42 -0
  127. package/esm/MultiCascader/MultiCascader.js +14 -11
  128. package/esm/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  129. package/esm/MultiCascader/{DropdownMenu.js → TreeView.js} +79 -75
  130. package/{cjs/Picker/DropdownMenuCheckItem.d.ts → esm/Picker/ListCheckItem.d.ts} +3 -3
  131. package/esm/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +15 -30
  132. package/{cjs/Picker/DropdownMenuItem.d.ts → esm/Picker/ListItem.d.ts} +4 -4
  133. package/esm/Picker/{DropdownMenuItem.js → ListItem.js} +16 -24
  134. package/esm/Picker/ListItemGroup.d.ts +6 -0
  135. package/esm/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  136. package/esm/Picker/Listbox.d.ts +35 -0
  137. package/esm/Picker/{DropdownMenu.js → Listbox.js} +50 -64
  138. package/esm/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  139. package/esm/Picker/{PickerOverlay.js → PickerPopup.js} +10 -8
  140. package/esm/Picker/PickerToggle.d.ts +1 -1
  141. package/esm/Picker/PickerToggle.js +16 -9
  142. package/esm/Picker/PickerToggleTrigger.d.ts +15 -0
  143. package/esm/Picker/PickerToggleTrigger.js +20 -5
  144. package/esm/Picker/SearchBar.js +8 -9
  145. package/esm/Picker/TreeView.d.ts +7 -0
  146. package/esm/Picker/TreeView.js +25 -0
  147. package/esm/Picker/hooks/index.d.ts +6 -0
  148. package/esm/Picker/hooks/index.js +7 -0
  149. package/esm/Picker/hooks/useCombobox.d.ts +7 -0
  150. package/esm/Picker/hooks/useCombobox.js +17 -0
  151. package/esm/Picker/hooks/useFocusItemValue.d.ts +30 -0
  152. package/esm/Picker/hooks/useFocusItemValue.js +240 -0
  153. package/esm/Picker/hooks/usePickerClassName.d.ts +21 -0
  154. package/esm/Picker/hooks/usePickerClassName.js +33 -0
  155. package/esm/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  156. package/esm/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  157. package/esm/Picker/hooks/useSearch.d.ts +18 -0
  158. package/esm/Picker/hooks/useSearch.js +51 -0
  159. package/esm/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  160. package/esm/Picker/hooks/useToggleKeyDownEvent.js +96 -0
  161. package/esm/Picker/index.d.ts +7 -6
  162. package/esm/Picker/index.js +7 -6
  163. package/esm/Picker/propTypes.d.ts +0 -6
  164. package/esm/Picker/propTypes.js +0 -5
  165. package/esm/Picker/utils.d.ts +2 -96
  166. package/esm/Picker/utils.js +2 -401
  167. package/esm/SelectPicker/SelectPicker.js +9 -9
  168. package/esm/TagInput/index.js +4 -0
  169. package/esm/TreePicker/TreeNode.d.ts +2 -2
  170. package/esm/TreePicker/TreeNode.js +24 -58
  171. package/esm/TreePicker/TreePicker.js +20 -21
  172. package/package.json +1 -1
  173. package/styles/variables.less +1 -3
  174. package/cjs/Picker/DropdownMenu.d.ts +0 -59
  175. package/cjs/Picker/DropdownMenuGroup.d.ts +0 -6
  176. package/esm/Picker/DropdownMenu.d.ts +0 -59
  177. package/esm/Picker/DropdownMenuGroup.d.ts +0 -6
@@ -77,6 +77,14 @@ export interface PickerBaseProps<LocaleType = any> extends WithAsProps, Animatio
77
77
  onOpen?: () => void;
78
78
  /** Called when Modal is closed */
79
79
  onClose?: () => void;
80
+ /**
81
+ * Called when the component is focused.
82
+ */
83
+ onFocus?: React.FocusEventHandler<any>;
84
+ /**
85
+ * Called when the component is blurred.
86
+ */
87
+ onBlur?: React.FocusEventHandler<any>;
80
88
  /** Custom render extra footer */
81
89
  renderExtraFooter?: () => React.ReactNode;
82
90
  }
@@ -5,12 +5,12 @@ import React, { useState } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import pick from 'lodash/pick';
7
7
  import omit from 'lodash/omit';
8
- import Input from '../Input';
9
8
  import { useClassNames, useControlled, useIsMounted, useEventCallback, PLACEMENT, mergeRefs, partitionHTMLProps } from '../utils';
10
9
  import { animationPropTypes } from '../Animation/utils';
11
- import { PickerToggleTrigger, onMenuKeyDown, DropdownMenu, DropdownMenuItem, PickerOverlay, useFocusItemValue, usePickerRef, pickTriggerPropKeys } from '../Picker';
10
+ import { PickerToggleTrigger, onMenuKeyDown, Listbox, ListItem, PickerPopup, useFocusItemValue, usePickerRef, pickTriggerPropKeys } from '../Picker';
12
11
  import { transformData, shouldDisplay } from './utils';
13
12
  import Plaintext from '../Plaintext';
13
+ import Combobox from './Combobox';
14
14
  /**
15
15
  * Autocomplete function of input field.
16
16
  * @see https://rsuitejs.com/components/auto-complete
@@ -72,6 +72,7 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (props, ref) {
72
72
  // Used to hover the focuse item when trigger `onKeydown`
73
73
  var _useFocusItemValue = useFocusItemValue(value, {
74
74
  data: datalist,
75
+ focusToOption: false,
75
76
  callback: onMenuFocus,
76
77
  target: function target() {
77
78
  return overlay.current;
@@ -154,7 +155,7 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (props, ref) {
154
155
  var _partitionHTMLProps = partitionHTMLProps(omit(rest, pickTriggerPropKeys)),
155
156
  htmlInputProps = _partitionHTMLProps[0],
156
157
  restProps = _partitionHTMLProps[1];
157
- var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
158
+ var renderPopup = function renderPopup(positionProps, speakerRef) {
158
159
  var left = positionProps.left,
159
160
  top = positionProps.top,
160
161
  className = positionProps.className;
@@ -162,18 +163,17 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (props, ref) {
162
163
  left: left,
163
164
  top: top
164
165
  };
165
- var menu = /*#__PURE__*/React.createElement(DropdownMenu, {
166
- id: id ? id + "-listbox" : undefined,
166
+ var menu = /*#__PURE__*/React.createElement(Listbox, {
167
167
  classPrefix: "auto-complete-menu",
168
- dropdownMenuItemClassPrefix: "auto-complete-item",
169
- dropdownMenuItemAs: DropdownMenuItem,
168
+ listItemClassPrefix: "auto-complete-item",
169
+ listItemAs: ListItem,
170
170
  focusItemValue: focusItemValue,
171
171
  onSelect: handleItemSelect,
172
172
  renderMenuItem: renderMenuItem,
173
173
  data: items,
174
174
  className: menuClassName
175
175
  });
176
- return /*#__PURE__*/React.createElement(PickerOverlay, {
176
+ return /*#__PURE__*/React.createElement(PickerPopup, {
177
177
  ref: mergeRefs(overlay, speakerRef),
178
178
  style: styles,
179
179
  className: className,
@@ -188,23 +188,26 @@ var AutoComplete = /*#__PURE__*/React.forwardRef(function (props, ref) {
188
188
  localeKey: "unfilled"
189
189
  }, typeof value === 'undefined' ? defaultValue : value);
190
190
  }
191
+ var expanded = open || focus && hasItems;
191
192
  return /*#__PURE__*/React.createElement(PickerToggleTrigger, {
193
+ id: id,
192
194
  ref: trigger,
193
195
  placement: placement,
194
196
  pickerProps: pick(props, pickTriggerPropKeys),
195
197
  trigger: ['click', 'focus'],
196
- open: open || focus && hasItems,
197
- speaker: renderDropdownMenu
198
+ open: expanded,
199
+ speaker: renderPopup
198
200
  }, /*#__PURE__*/React.createElement(Component, _extends({
199
201
  className: classes,
200
202
  style: style,
201
203
  ref: root
202
- }, restProps), /*#__PURE__*/React.createElement(Input, _extends({}, htmlInputProps, {
203
- id: id,
204
+ }, restProps), /*#__PURE__*/React.createElement(Combobox, _extends({}, htmlInputProps, {
204
205
  disabled: disabled,
205
206
  value: value,
206
207
  size: size,
207
208
  readOnly: readOnly,
209
+ expanded: expanded,
210
+ focusItemValue: focusItemValue,
208
211
  onBlur: handleInputBlur,
209
212
  onFocus: handleInputFocus,
210
213
  onChange: handleChange,
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { type InputProps } from '../Input';
3
+ interface ComboboxProps extends InputProps {
4
+ expanded?: boolean;
5
+ focusItemValue?: string | null;
6
+ }
7
+ declare const Combobox: React.ForwardRefExoticComponent<ComboboxProps & React.RefAttributes<HTMLInputElement>>;
8
+ export default Combobox;
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+ import React from 'react';
5
+ import { useCombobox } from '../Picker';
6
+ import Input from '../Input';
7
+ var Combobox = /*#__PURE__*/React.forwardRef(function (props, ref) {
8
+ var _useCombobox = useCombobox(),
9
+ id = _useCombobox.id,
10
+ popupType = _useCombobox.popupType;
11
+ var expanded = props.expanded,
12
+ focusItemValue = props.focusItemValue,
13
+ rest = _objectWithoutPropertiesLoose(props, ["expanded", "focusItemValue"]);
14
+ return /*#__PURE__*/React.createElement(Input, _extends({
15
+ role: "combobox",
16
+ "aria-autocomplete": "list",
17
+ "aria-haspopup": popupType,
18
+ "aria-expanded": expanded,
19
+ "aria-activedescendant": focusItemValue ? id + "-opt-" + focusItemValue : undefined,
20
+ autoComplete: "off",
21
+ id: id,
22
+ ref: ref
23
+ }, rest));
24
+ });
25
+ export default Combobox;
@@ -1,14 +1,14 @@
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, { useCallback, useMemo } from 'react';
4
+ import React, { useMemo } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import pick from 'lodash/pick';
7
7
  import MonthDropdown from './MonthDropdown';
8
8
  import TimeDropdown from './TimeDropdown';
9
9
  import CalendarBody from './CalendarBody';
10
10
  import CalendarHeader from './CalendarHeader';
11
- import { useClassNames } from '../utils';
11
+ import { useClassNames, useEventCallback } from '../utils';
12
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';
@@ -62,42 +62,42 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
62
62
  var calendarDate = useMemo(function () {
63
63
  return isValid(calendarDateProp) ? calendarDateProp : new Date();
64
64
  }, [calendarDateProp]);
65
- var isDisabledDate = useCallback(function (date) {
65
+ var isDisabledDate = useEventCallback(function (date) {
66
66
  var _disabledDate;
67
67
  return (_disabledDate = disabledDate === null || disabledDate === void 0 ? void 0 : disabledDate(date)) !== null && _disabledDate !== void 0 ? _disabledDate : false;
68
- }, [disabledDate]);
68
+ });
69
69
  var isTimeDisabled = function isTimeDisabled(date) {
70
70
  return disabledTime(props, date);
71
71
  };
72
- var handleMoveForward = useCallback(function () {
72
+ var handleMoveForward = useEventCallback(function () {
73
73
  onMoveForward === null || onMoveForward === void 0 ? void 0 : onMoveForward(addMonths(calendarDate, 1));
74
- }, [onMoveForward, calendarDate]);
75
- var handleMoveBackward = useCallback(function () {
74
+ });
75
+ var handleMoveBackward = useEventCallback(function () {
76
76
  onMoveBackward === null || onMoveBackward === void 0 ? void 0 : onMoveBackward(addMonths(calendarDate, -1));
77
- }, [onMoveBackward, calendarDate]);
77
+ });
78
78
 
79
79
  // It is displayed as the month to be selected.
80
- var toggleMonthView = useCallback(function () {
80
+ var toggleMonthView = useEventCallback(function () {
81
81
  if (calendarState === CalendarState.MONTH) {
82
82
  reset();
83
83
  } else {
84
84
  openMonth();
85
85
  }
86
86
  onToggleMonthDropdown === null || onToggleMonthDropdown === void 0 ? void 0 : onToggleMonthDropdown(calendarState !== CalendarState.MONTH);
87
- }, [calendarState, onToggleMonthDropdown, openMonth, reset]);
87
+ });
88
88
 
89
89
  // It is displayed as a time to be selected.
90
- var toggleTimeView = useCallback(function () {
90
+ var toggleTimeView = useEventCallback(function () {
91
91
  if (calendarState === CalendarState.TIME) {
92
92
  reset();
93
93
  } else {
94
94
  openTime();
95
95
  }
96
96
  onToggleTimeDropdown === null || onToggleTimeDropdown === void 0 ? void 0 : onToggleTimeDropdown(calendarState !== CalendarState.TIME);
97
- }, [calendarState, onToggleTimeDropdown, openTime, reset]);
98
- var handleCloseDropdown = useCallback(function () {
97
+ });
98
+ var handleCloseDropdown = useEventCallback(function () {
99
99
  return reset();
100
- }, [reset]);
100
+ });
101
101
  var renderDate = shouldRenderDate(format);
102
102
  var renderTime = shouldRenderTime(format);
103
103
  var renderMonth = shouldRenderMonth(format);
@@ -105,40 +105,38 @@ var CalendarContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
105
105
  var onlyShowMonth = renderMonth && !renderDate && !renderTime;
106
106
  var showTime = calendarState === CalendarState.TIME || onlyShowTime;
107
107
  var showMonth = calendarState === CalendarState.MONTH || onlyShowMonth;
108
- var inSameThisMonthDate = useCallback(function (date) {
108
+ var inSameThisMonthDate = useEventCallback(function (date) {
109
109
  return isSameMonth(calendarDate, date);
110
- }, [calendarDate]);
110
+ });
111
111
  var calendarClasses = merge(className, withClassPrefix({
112
112
  'time-view': showTime,
113
113
  'month-view': showMonth,
114
114
  'show-week-numbers': showWeekNumbers
115
115
  }));
116
116
  var timeDropdownProps = pick(rest, calendarOnlyProps);
117
- var handleChangeMonth = useCallback(function (date, event) {
117
+ var handleChangeMonth = useEventCallback(function (date, event) {
118
118
  reset();
119
119
  onChangeMonth === null || onChangeMonth === void 0 ? void 0 : onChangeMonth(date, event);
120
- }, [onChangeMonth, reset]);
121
- var contextValue = useMemo(function () {
122
- return {
123
- date: calendarDate,
124
- dateRange: dateRange,
125
- disabledDate: isDisabledDate,
126
- format: format,
127
- hoverRangeValue: hoverRangeValue,
128
- inSameMonth: inSameThisMonthDate,
129
- isoWeek: isoWeek,
130
- targetId: targetId,
131
- locale: locale,
132
- onChangeMonth: handleChangeMonth,
133
- onChangeTime: onChangeTime,
134
- onMouseMove: onMouseMove,
135
- onSelect: onSelect,
136
- cellClassName: cellClassName,
137
- renderCell: renderCell,
138
- showWeekNumbers: showWeekNumbers,
139
- inline: inline
140
- };
141
- }, [calendarDate, dateRange, format, handleChangeMonth, hoverRangeValue, inSameThisMonthDate, inline, isDisabledDate, isoWeek, targetId, locale, onChangeTime, onMouseMove, onSelect, cellClassName, renderCell, showWeekNumbers]);
120
+ });
121
+ var contextValue = {
122
+ date: calendarDate,
123
+ dateRange: dateRange,
124
+ disabledDate: isDisabledDate,
125
+ format: format,
126
+ hoverRangeValue: hoverRangeValue,
127
+ inSameMonth: inSameThisMonthDate,
128
+ isoWeek: isoWeek,
129
+ targetId: targetId,
130
+ locale: locale,
131
+ onChangeMonth: handleChangeMonth,
132
+ onChangeTime: onChangeTime,
133
+ onMouseMove: onMouseMove,
134
+ onSelect: onSelect,
135
+ cellClassName: cellClassName,
136
+ renderCell: renderCell,
137
+ showWeekNumbers: showWeekNumbers,
138
+ inline: inline
139
+ };
142
140
  return /*#__PURE__*/React.createElement(CalendarProvider, {
143
141
  value: contextValue
144
142
  }, /*#__PURE__*/React.createElement(Component, _extends({
@@ -9,11 +9,11 @@ import pick from 'lodash/pick';
9
9
  import isNil from 'lodash/isNil';
10
10
  import isFunction from 'lodash/isFunction';
11
11
  import shallowEqual from '../utils/shallowEqual';
12
- import DropdownMenu from './DropdownMenu';
12
+ import TreeView from './TreeView';
13
13
  import { getParentMap, getPathTowardsItem, findNodeOfTree, flattenTree } from '../utils/treeUtils';
14
14
  import { usePaths } from './utils';
15
15
  import { getSafeRegExpString, createChainedFunction, mergeRefs, useControlled, useCustom, useClassNames, useIsMounted, useEventCallback } from '../utils';
16
- import { PickerToggle, PickerOverlay, SearchBar, PickerToggleTrigger, usePickerClassName, usePickerRef, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
16
+ import { PickerToggle, PickerPopup, SearchBar, PickerToggleTrigger, usePickerClassName, usePickerRef, useToggleKeyDownEvent, useFocusItemValue, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
17
17
  import { useMap } from '../utils/useMap';
18
18
  var emptyArray = [];
19
19
 
@@ -349,12 +349,12 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
349
349
  }, node[labelKey]);
350
350
  });
351
351
  return /*#__PURE__*/React.createElement("div", {
352
+ role: "treeitem",
352
353
  key: key,
353
354
  "aria-disabled": disabled,
354
355
  "data-key": item[valueKey],
355
356
  className: itemClasses,
356
357
  tabIndex: -1,
357
- role: "option",
358
358
  onClick: function onClick(event) {
359
359
  if (!disabled) {
360
360
  handleSearchRowSelect(item, nodes, event);
@@ -370,12 +370,12 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
370
370
  return /*#__PURE__*/React.createElement("div", {
371
371
  className: prefix('cascader-search-panel'),
372
372
  "data-layer": 0,
373
- role: "listbox"
373
+ role: "tree"
374
374
  }, items.length ? items.map(renderSearchRow) : /*#__PURE__*/React.createElement("div", {
375
375
  className: prefix('none')
376
376
  }, locale.noResultsText));
377
377
  };
378
- var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
378
+ var renderTreeView = function renderTreeView(positionProps, speakerRef) {
379
379
  var _ref2 = positionProps || {},
380
380
  left = _ref2.left,
381
381
  top = _ref2.top,
@@ -387,7 +387,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
387
387
  var classes = merge(className, menuClassName, prefix('cascader-menu', {
388
388
  inline: inline
389
389
  }));
390
- return /*#__PURE__*/React.createElement(PickerOverlay, {
390
+ return /*#__PURE__*/React.createElement(PickerPopup, {
391
391
  ref: mergeRefs(overlay, speakerRef),
392
392
  className: classes,
393
393
  style: styles,
@@ -398,8 +398,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
398
398
  onChange: handleSearch,
399
399
  value: searchKeyword,
400
400
  inputRef: searchInput
401
- }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/React.createElement(DropdownMenu, {
402
- id: id ? id + "-listbox" : undefined,
401
+ }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/React.createElement(TreeView, {
403
402
  menuWidth: menuWidth,
404
403
  menuHeight: menuHeight,
405
404
  disabledItemValues: disabledItemValues,
@@ -452,21 +451,22 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
452
451
  usedClassNamePropKeys = _usePickerClassName[1]; // TODO: bad api design
453
452
  // consider an isolated Menu component
454
453
  if (inline) {
455
- return renderDropdownMenu();
454
+ return renderTreeView();
456
455
  }
457
456
  return /*#__PURE__*/React.createElement(PickerToggleTrigger, {
457
+ id: id,
458
+ popupType: "tree",
458
459
  pickerProps: pick(props, pickTriggerPropKeys),
459
460
  ref: trigger,
460
461
  placement: placement,
461
462
  onEntered: createChainedFunction(handleEntered, onEnter),
462
463
  onExited: createChainedFunction(handleExited, onExited),
463
- speaker: renderDropdownMenu
464
+ speaker: renderTreeView
464
465
  }, /*#__PURE__*/React.createElement(Component, {
465
466
  className: classes,
466
467
  style: style,
467
468
  ref: root
468
469
  }, /*#__PURE__*/React.createElement(PickerToggle, _extends({}, omit(rest, [].concat(omitTriggerPropKeys, usedClassNamePropKeys)), {
469
- id: id,
470
470
  ref: target,
471
471
  as: toggleAs,
472
472
  appearance: appearance,
@@ -477,7 +477,8 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
477
477
  hasValue: hasValue,
478
478
  active: active,
479
479
  placement: placement,
480
- inputValue: value !== null && value !== void 0 ? value : ''
480
+ inputValue: value !== null && value !== void 0 ? value : '',
481
+ focusItemValue: focusItemValue
481
482
  }), selectedElement || (locale === null || locale === void 0 ? void 0 : locale.placeholder))));
482
483
  });
483
484
  Cascader.displayName = 'Cascader';
@@ -1,11 +1,10 @@
1
1
  import React from 'react';
2
- import PropTypes from 'prop-types';
3
2
  import { ItemDataType, WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
3
  import { ValueType } from './Cascader';
5
4
  declare type SetLike<T = unknown> = {
6
5
  has(value: T): boolean;
7
6
  };
8
- export interface DropdownMenuProps extends Omit<WithAsProps, 'classPrefix'> {
7
+ export interface TreeViewProps extends Omit<WithAsProps, 'classPrefix'> {
9
8
  classPrefix: string;
10
9
  disabledItemValues: ValueType[];
11
10
  activeItemValue?: ValueType | null;
@@ -21,21 +20,5 @@ export interface DropdownMenuProps extends Omit<WithAsProps, 'classPrefix'> {
21
20
  renderMenu?: (items: readonly ItemDataType[], menu: React.ReactNode, parentNode?: ItemDataType, layer?: number) => React.ReactNode;
22
21
  onSelect?: (node: ItemDataType, cascadePaths: ItemDataType[], isLeafNode: boolean, event: React.MouseEvent) => void;
23
22
  }
24
- declare const DropdownMenu: RsRefForwardingComponent<'div', DropdownMenuProps>;
25
- export declare const dropdownMenuPropTypes: {
26
- classPrefix: PropTypes.Requireable<string>;
27
- disabledItemValues: PropTypes.Requireable<any[]>;
28
- activeItemValue: PropTypes.Requireable<any>;
29
- childrenKey: PropTypes.Requireable<string>;
30
- valueKey: PropTypes.Requireable<string>;
31
- labelKey: PropTypes.Requireable<string>;
32
- menuWidth: PropTypes.Requireable<number>;
33
- menuHeight: PropTypes.Requireable<string | number>;
34
- className: PropTypes.Requireable<string>;
35
- renderMenuItem: PropTypes.Requireable<(...args: any[]) => any>;
36
- renderMenu: PropTypes.Requireable<(...args: any[]) => any>;
37
- onSelect: PropTypes.Requireable<(...args: any[]) => any>;
38
- cascadeData: PropTypes.Requireable<any[]>;
39
- cascadePaths: PropTypes.Requireable<any[]>;
40
- };
41
- export default DropdownMenu;
23
+ declare const TreeView: RsRefForwardingComponent<'div', TreeViewProps>;
24
+ export default TreeView;
@@ -1,19 +1,18 @@
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, { useCallback, useEffect, useRef } from 'react';
5
- import PropTypes from 'prop-types';
4
+ import React, { useEffect, useRef } from 'react';
6
5
  import SpinnerIcon from '@rsuite/icons/legacy/Spinner';
7
6
  import isUndefined from 'lodash/isUndefined';
8
7
  import isNil from 'lodash/isNil';
9
- import { shallowEqual, useClassNames, mergeRefs, useCustom } from '../utils';
10
- import { DropdownMenuItem } from '../Picker';
8
+ import { shallowEqual, useClassNames, mergeRefs, useCustom, useEventCallback } from '../utils';
9
+ import { ListItem, useCombobox } from '../Picker';
11
10
  import AngleLeftIcon from '@rsuite/icons/legacy/AngleLeft';
12
11
  import AngleRightIcon from '@rsuite/icons/legacy/AngleRight';
13
12
  import getPosition from 'dom-lib/getPosition';
14
13
  import scrollTop from 'dom-lib/scrollTop';
15
14
  var emptyArray = [];
16
- var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
15
+ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
17
16
  var _props$as = props.as,
18
17
  Component = _props$as === void 0 ? 'div' : _props$as,
19
18
  activeItemValue = props.activeItemValue,
@@ -36,17 +35,22 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
36
35
  loadingItemsSet = props.loadingItemsSet,
37
36
  _props$labelKey = props.labelKey,
38
37
  labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
38
+ style = props.style,
39
39
  renderMenu = props.renderMenu,
40
40
  renderMenuItem = props.renderMenuItem,
41
41
  onSelect = props.onSelect,
42
- rest = _objectWithoutPropertiesLoose(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "loadingItemsSet", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]);
42
+ rest = _objectWithoutPropertiesLoose(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "loadingItemsSet", "labelKey", "style", "renderMenu", "renderMenuItem", "onSelect"]);
43
43
  var _useClassNames = useClassNames(classPrefix),
44
44
  merge = _useClassNames.merge,
45
45
  prefix = _useClassNames.prefix;
46
46
  var classes = merge(className, prefix('items'));
47
47
  var rootRef = useRef();
48
- var _useCustom = useCustom('DropdownMenu'),
48
+ var _useCustom = useCustom(),
49
49
  rtl = _useCustom.rtl;
50
+ var _useCombobox = useCombobox(),
51
+ id = _useCombobox.id,
52
+ labelId = _useCombobox.labelId,
53
+ popupType = _useCombobox.popupType;
50
54
  useEffect(function () {
51
55
  var _rootRef$current;
52
56
  var columns = ((_rootRef$current = rootRef.current) === null || _rootRef$current === void 0 ? void 0 : _rootRef$current.querySelectorAll('[data-type="column"]')) || [];
@@ -65,7 +69,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
65
69
  }
66
70
  });
67
71
  }, [prefix]);
68
- var getCascadePaths = useCallback(function (layer, node) {
72
+ var getCascadePaths = function getCascadePaths(layer, node) {
69
73
  var paths = [];
70
74
  for (var i = 0; i < cascadeData.length && i < layer; i += 1) {
71
75
  if (i < layer - 1 && cascadePaths) {
@@ -74,14 +78,19 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
74
78
  }
75
79
  paths.push(node);
76
80
  return paths;
77
- }, [cascadeData, cascadePaths]);
78
- var handleSelect = function handleSelect(layer, node, event) {
81
+ };
82
+ var handleSelect = useEventCallback(function (layer, node, event) {
79
83
  var isLeafNode = isNil(node[childrenKey]);
80
84
  var cascadePaths = getCascadePaths(layer + 1, node);
81
85
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, isLeafNode, event);
82
- };
83
- var renderCascadeNode = function renderCascadeNode(node, index, layer, focus) {
86
+ });
87
+ var renderCascadeNode = function renderCascadeNode(nodeProps) {
84
88
  var _loadingItemsSet$has;
89
+ var node = nodeProps.node,
90
+ index = nodeProps.index,
91
+ layer = nodeProps.layer,
92
+ focus = nodeProps.focus,
93
+ size = nodeProps.size;
85
94
  var children = node[childrenKey];
86
95
  var value = node[valueKey];
87
96
  var label = node[labelKey];
@@ -93,16 +102,19 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
93
102
  // Use `value` in keys when If `value` is string or number
94
103
  var onlyKey = typeof value === 'number' || typeof value === 'string' ? value : index;
95
104
  var Icon = loading ? SpinnerIcon : rtl ? AngleLeftIcon : AngleRightIcon;
96
- return /*#__PURE__*/React.createElement(DropdownMenuItem, {
97
- classPrefix: "picker-cascader-menu-item",
105
+ return /*#__PURE__*/React.createElement(ListItem, {
98
106
  as: 'li',
99
107
  role: "treeitem",
108
+ "aria-level": layer + 1,
109
+ "aria-setsize": size,
110
+ "aria-posinset": index + 1,
111
+ "aria-label": typeof label === 'string' ? label : undefined,
112
+ classPrefix: "picker-cascader-menu-item",
100
113
  key: layer + "-" + onlyKey,
101
114
  disabled: disabled,
102
115
  active: !isUndefined(activeItemValue) && shallowEqual(activeItemValue, value),
103
116
  focus: focus,
104
117
  value: value,
105
- "aria-owns": node.children ? 'treeitem-' + value + '-children' : undefined,
106
118
  className: children ? prefix('has-children') : undefined,
107
119
  onSelect: function onSelect(_value, event) {
108
120
  return handleSelect(layer, node, event);
@@ -112,54 +124,43 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
112
124
  spin: loading
113
125
  }) : null);
114
126
  };
115
- var styles = {
116
- width: cascadeData.length * menuWidth
117
- };
118
127
  var cascadeNodes = cascadeData.map(function (children, layer) {
119
128
  var onlyKey = layer + "_" + children.length;
120
129
  var parentNode = cascadePaths[layer - 1];
121
- var menu = /*#__PURE__*/React.createElement("ul", {
122
- role: layer === 0 ? 'none presentation' : 'group',
123
- id: parentNode ? 'treeitem-' + parentNode[valueKey] + '-children' : undefined
124
- }, children.map(function (item, index) {
125
- return renderCascadeNode(item, index, layer, cascadePaths[layer] && shallowEqual(cascadePaths[layer][valueKey], item[valueKey]));
130
+ var menu = /*#__PURE__*/React.createElement(React.Fragment, null, children.map(function (item, index) {
131
+ var focus = cascadePaths[layer] && shallowEqual(cascadePaths[layer][valueKey], item[valueKey]);
132
+ return renderCascadeNode({
133
+ node: item,
134
+ index: index,
135
+ layer: layer,
136
+ focus: focus,
137
+ size: children.length
138
+ });
126
139
  }));
127
- return /*#__PURE__*/React.createElement("div", {
128
- key: onlyKey,
129
- className: prefix('column'),
140
+ return /*#__PURE__*/React.createElement("ul", {
141
+ role: "group",
130
142
  "data-layer": layer,
131
143
  "data-type": 'column',
144
+ key: onlyKey,
145
+ className: prefix('column'),
132
146
  style: {
133
147
  height: menuHeight,
134
148
  width: menuWidth
135
149
  }
136
150
  }, renderMenu ? renderMenu(children, menu, parentNode, layer) : menu);
137
151
  });
152
+ var styles = _extends({}, style, {
153
+ width: cascadeData.length * menuWidth
154
+ });
138
155
  return /*#__PURE__*/React.createElement(Component, _extends({
139
- role: "tree"
156
+ role: "tree",
157
+ id: id + "-" + popupType,
158
+ "aria-labelledby": labelId
140
159
  }, rest, {
141
160
  ref: mergeRefs(rootRef, ref),
142
- className: classes
143
- }), /*#__PURE__*/React.createElement("div", {
161
+ className: classes,
144
162
  style: styles
145
- }, cascadeNodes));
163
+ }), cascadeNodes);
146
164
  });
147
- export var dropdownMenuPropTypes = {
148
- classPrefix: PropTypes.string,
149
- disabledItemValues: PropTypes.array,
150
- activeItemValue: PropTypes.any,
151
- childrenKey: PropTypes.string,
152
- valueKey: PropTypes.string,
153
- labelKey: PropTypes.string,
154
- menuWidth: PropTypes.number,
155
- menuHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
156
- className: PropTypes.string,
157
- renderMenuItem: PropTypes.func,
158
- renderMenu: PropTypes.func,
159
- onSelect: PropTypes.func,
160
- cascadeData: PropTypes.array,
161
- cascadePaths: PropTypes.array
162
- };
163
- DropdownMenu.displayName = 'DropdownMenu';
164
- DropdownMenu.propTypes = dropdownMenuPropTypes;
165
- export default DropdownMenu;
165
+ TreeView.displayName = 'TreeView';
166
+ export default TreeView;
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { ItemDataType, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
+ import { ValueType } from './Cascader';
4
+ declare type SetLike<T = unknown> = {
5
+ has(value: T): boolean;
6
+ };
7
+ export interface TreeViewProps extends Omit<WithAsProps, 'classPrefix'> {
8
+ classPrefix: string;
9
+ disabledItemValues: ValueType[];
10
+ activeItemValue?: ValueType | null;
11
+ childrenKey: string;
12
+ cascadeData: (readonly ItemDataType[])[];
13
+ loadingItemsSet?: SetLike<ItemDataType>;
14
+ cascadePaths: ItemDataType[];
15
+ valueKey: string;
16
+ labelKey: string;
17
+ menuWidth?: number;
18
+ menuHeight?: number | string;
19
+ renderMenuItem?: (itemLabel: React.ReactNode, item: ItemDataType) => React.ReactNode;
20
+ renderMenu?: (items: readonly ItemDataType[], menu: React.ReactNode, parentNode?: ItemDataType, layer?: number) => React.ReactNode;
21
+ onSelect?: (node: ItemDataType, cascadePaths: ItemDataType[], isLeafNode: boolean, event: React.MouseEvent) => void;
22
+ }
23
+ declare const TreeView: RsRefForwardingComponent<'div', TreeViewProps>;
24
+ export default TreeView;