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
@@ -1,10 +1,8 @@
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 _get from "lodash/get";
5
4
  var _this = this;
6
- import React, { useRef, useState, useEffect, useCallback } from 'react';
7
- import PropTypes from 'prop-types';
5
+ import React, { useRef, useState, useEffect } from 'react';
8
6
  import isUndefined from 'lodash/isUndefined';
9
7
  import isString from 'lodash/isString';
10
8
  import isNumber from 'lodash/isNumber';
@@ -13,13 +11,15 @@ import pickBy from 'lodash/pickBy';
13
11
  import getPosition from 'dom-lib/getPosition';
14
12
  import scrollTop from 'dom-lib/scrollTop';
15
13
  import getHeight from 'dom-lib/getHeight';
14
+ import get from 'lodash/get';
16
15
  import classNames from 'classnames';
17
16
  import { List, AutoSizer, VariableSizeList } from '../Windowing';
18
17
  import shallowEqual from '../utils/shallowEqual';
19
- import { mergeRefs, useClassNames, useMount } from '../utils';
20
- import DropdownMenuGroup from './DropdownMenuGroup';
18
+ import { mergeRefs, useClassNames, useMount, useEventCallback } from '../utils';
19
+ import ListItemGroup from './ListItemGroup';
21
20
  import { KEY_GROUP, KEY_GROUP_TITLE } from '../utils/getDataGroupBy';
22
- var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
21
+ import useCombobox from './hooks/useCombobox';
22
+ var Listbox = /*#__PURE__*/React.forwardRef(function (props, ref) {
23
23
  var _props$data = props.data,
24
24
  data = _props$data === void 0 ? [] : _props$data,
25
25
  group = props.group,
@@ -42,9 +42,9 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
42
42
  className = props.className,
43
43
  style = props.style,
44
44
  focusItemValue = props.focusItemValue,
45
- dropdownMenuItemClassPrefix = props.dropdownMenuItemClassPrefix,
46
- DropdownMenuItem = props.dropdownMenuItemAs,
47
- dropdownMenuItemProps = props.dropdownMenuItemProps,
45
+ listItemClassPrefix = props.listItemClassPrefix,
46
+ ListItem = props.listItemAs,
47
+ listItemProps = props.listItemProps,
48
48
  _props$rowHeight = props.rowHeight,
49
49
  rowHeight = _props$rowHeight === void 0 ? 36 : _props$rowHeight,
50
50
  _props$rowGroupHeight = props.rowGroupHeight,
@@ -53,7 +53,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
53
53
  renderMenuItem = props.renderMenuItem,
54
54
  onGroupTitleClick = props.onGroupTitleClick,
55
55
  onSelect = props.onSelect,
56
- rest = _objectWithoutPropertiesLoose(props, ["data", "group", "groupBy", "maxHeight", "activeItemValues", "disabledItemValues", "classPrefix", "valueKey", "labelKey", "virtualized", "listProps", "listRef", "className", "style", "focusItemValue", "dropdownMenuItemClassPrefix", "dropdownMenuItemAs", "dropdownMenuItemProps", "rowHeight", "rowGroupHeight", "renderMenuGroup", "renderMenuItem", "onGroupTitleClick", "onSelect"]);
56
+ rest = _objectWithoutPropertiesLoose(props, ["data", "group", "groupBy", "maxHeight", "activeItemValues", "disabledItemValues", "classPrefix", "valueKey", "labelKey", "virtualized", "listProps", "listRef", "className", "style", "focusItemValue", "listItemClassPrefix", "listItemAs", "listItemProps", "rowHeight", "rowGroupHeight", "renderMenuGroup", "renderMenuItem", "onGroupTitleClick", "onSelect"]);
57
57
  var _useClassNames = useClassNames(classPrefix),
58
58
  withClassPrefix = _useClassNames.withClassPrefix,
59
59
  prefix = _useClassNames.prefix,
@@ -61,12 +61,17 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
61
61
  var classes = merge(className, withClassPrefix('items', {
62
62
  grouped: group
63
63
  }));
64
+ var _useCombobox = useCombobox(),
65
+ id = _useCombobox.id,
66
+ labelId = _useCombobox.labelId,
67
+ popupType = _useCombobox.popupType,
68
+ multiple = _useCombobox.multiple;
64
69
  var menuBodyContainerRef = useRef(null);
65
70
  var listRef = useRef(null);
66
71
  var _useState = useState([]),
67
72
  foldedGroupKeys = _useState[0],
68
73
  setFoldedGroupKeys = _useState[1];
69
- var handleGroupTitleClick = useCallback(function (key, event) {
74
+ var handleGroupTitleClick = useEventCallback(function (key, event) {
70
75
  var nextGroupKeys = foldedGroupKeys.filter(function (item) {
71
76
  return item !== key;
72
77
  });
@@ -75,10 +80,10 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
75
80
  }
76
81
  setFoldedGroupKeys(nextGroupKeys);
77
82
  onGroupTitleClick === null || onGroupTitleClick === void 0 ? void 0 : onGroupTitleClick(event);
78
- }, [onGroupTitleClick, foldedGroupKeys]);
79
- var handleSelect = useCallback(function (item, value, event, checked) {
83
+ });
84
+ var handleSelect = useEventCallback(function (item, value, event, checked) {
80
85
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(value, item, event, checked);
81
- }, [onSelect]);
86
+ });
82
87
  var getRowHeight = function getRowHeight(list, index) {
83
88
  var item = list[index];
84
89
  if (group && item[KEY_GROUP] && index !== 0) {
@@ -107,6 +112,24 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
107
112
  scrollTop(container, Math.max(0, position.top - sHeight + 32));
108
113
  }
109
114
  }, [focusItemValue, menuBodyContainerRef, prefix]);
115
+ var filteredItems = group ? data.filter(function (item) {
116
+ var _item$parent;
117
+ // Display group title items
118
+ if (item[KEY_GROUP]) return true;
119
+
120
+ // Display items under the unfolded group
121
+ // FIXME-Doma
122
+ // `groupBy` is bound to be string when `group` is true
123
+ // because `group` is actually redundant as a prop
124
+ // It could simply be derived from `groupBy` value
125
+ var groupValue = get(item, groupBy, '') || ( // FIXME-Doma
126
+ // Usage of `item.parent` is strongly discouraged
127
+ // It's only here for legacy support
128
+ // Remove once `item.parent` is completely removed across related components
129
+ (_item$parent = item.parent) === null || _item$parent === void 0 ? void 0 : _item$parent[KEY_GROUP_TITLE]);
130
+ return !foldedGroupKeys.includes(groupValue);
131
+ }) : data;
132
+ var rowCount = filteredItems.length;
110
133
  var renderItem = function renderItem(_ref) {
111
134
  var _ref$index = _ref.index,
112
135
  index = _ref$index === void 0 ? 0 : _ref$index,
@@ -124,13 +147,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
124
147
  var itemKey = isString(value) || isNumber(value) ? value : index;
125
148
 
126
149
  /**
127
- * Render <DropdownMenuGroup>
150
+ * Render <ListboxGroup>
128
151
  * when if `group` is enabled
129
152
  */
130
153
  if (group && item[KEY_GROUP]) {
131
154
  var groupValue = item[KEY_GROUP_TITLE];
132
155
  // TODO: grouped options should be owned by group
133
- return /*#__PURE__*/React.createElement(DropdownMenuGroup, {
156
+ return /*#__PURE__*/React.createElement(ListItemGroup, {
134
157
  style: style,
135
158
  classPrefix: 'picker-menu-group',
136
159
  className: classNames({
@@ -151,37 +174,21 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
151
174
  return shallowEqual(v, value);
152
175
  });
153
176
  var focus = !isUndefined(focusItemValue) && shallowEqual(focusItemValue, value);
154
- return /*#__PURE__*/React.createElement(DropdownMenuItem, _extends({
177
+ return /*#__PURE__*/React.createElement(ListItem, _extends({
178
+ "aria-posinset": index + 1,
179
+ "aria-setsize": rowCount,
155
180
  style: style,
156
181
  key: itemKey,
157
182
  disabled: disabled,
158
183
  active: active,
159
184
  focus: focus,
160
185
  value: value,
161
- classPrefix: dropdownMenuItemClassPrefix,
186
+ classPrefix: listItemClassPrefix,
162
187
  onSelect: handleSelect.bind(null, item)
163
- }, pickBy(dropdownMenuItemProps, function (v) {
188
+ }, pickBy(listItemProps, function (v) {
164
189
  return v !== undefined;
165
190
  })), renderMenuItem ? renderMenuItem(label, item) : label);
166
191
  };
167
- var filteredItems = group ? data.filter(function (item) {
168
- var _item$parent;
169
- // Display group title items
170
- if (item[KEY_GROUP]) return true;
171
-
172
- // Display items under the unfolded group
173
- // FIXME-Doma
174
- // `groupBy` is bound to be string when `group` is true
175
- // because `group` is actually redundant as a prop
176
- // It could simply be derived from `groupBy` value
177
- var groupValue = _get(item, groupBy, '') || ( // FIXME-Doma
178
- // Usage of `item.parent` is strongly discouraged
179
- // It's only here for legacy support
180
- // Remove once `item.parent` is completely removed across related components
181
- (_item$parent = item.parent) === null || _item$parent === void 0 ? void 0 : _item$parent[KEY_GROUP_TITLE]);
182
- return !foldedGroupKeys.includes(groupValue);
183
- }) : data;
184
- var rowCount = filteredItems.length;
185
192
  useMount(function () {
186
193
  var _listRef$current, _listRef$current$scro;
187
194
  var itemIndex = findIndex(filteredItems, function (item) {
@@ -190,7 +197,10 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
190
197
  (_listRef$current = listRef.current) === null || _listRef$current === void 0 ? void 0 : (_listRef$current$scro = _listRef$current.scrollToItem) === null || _listRef$current$scro === void 0 ? void 0 : _listRef$current$scro.call(_listRef$current, itemIndex);
191
198
  });
192
199
  return /*#__PURE__*/React.createElement("div", _extends({
193
- role: "listbox"
200
+ role: "listbox",
201
+ id: id + "-" + popupType,
202
+ "aria-labelledby": labelId,
203
+ "aria-multiselectable": multiple
194
204
  }, rest, {
195
205
  className: classes,
196
206
  ref: mergeRefs(menuBodyContainerRef, ref),
@@ -220,29 +230,5 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
220
230
  });
221
231
  }));
222
232
  });
223
- export var dropdownMenuPropTypes = {
224
- classPrefix: PropTypes.string.isRequired,
225
- className: PropTypes.string,
226
- dropdownMenuItemAs: PropTypes.elementType.isRequired,
227
- dropdownMenuItemClassPrefix: PropTypes.string,
228
- data: PropTypes.array,
229
- group: PropTypes.bool,
230
- disabledItemValues: PropTypes.array,
231
- activeItemValues: PropTypes.array,
232
- focusItemValue: PropTypes.any,
233
- maxHeight: PropTypes.number,
234
- valueKey: PropTypes.string,
235
- labelKey: PropTypes.string,
236
- style: PropTypes.object,
237
- renderMenuItem: PropTypes.func,
238
- renderMenuGroup: PropTypes.func,
239
- onSelect: PropTypes.func,
240
- onGroupTitleClick: PropTypes.func,
241
- virtualized: PropTypes.bool,
242
- listProps: PropTypes.any,
243
- rowHeight: PropTypes.number,
244
- rowGroupHeight: PropTypes.number
245
- };
246
- DropdownMenu.displayName = 'DropdownMenu';
247
- DropdownMenu.propTypes = dropdownMenuPropTypes;
248
- export default DropdownMenu;
233
+ Listbox.displayName = 'Listbox';
234
+ export default Listbox;
@@ -1,12 +1,12 @@
1
1
  import React from 'react';
2
2
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
3
  import { OverlayTriggerHandle } from '../Picker';
4
- export interface PickerOverlayProps extends WithAsProps {
4
+ export interface PickerPopupProps extends WithAsProps {
5
5
  placement?: string;
6
6
  autoWidth?: boolean;
7
7
  children?: React.ReactNode;
8
8
  target?: React.RefObject<OverlayTriggerHandle>;
9
9
  onKeyDown?: (event: React.KeyboardEvent) => void;
10
10
  }
11
- declare const PickerOverlay: RsRefForwardingComponent<'div', PickerOverlayProps>;
12
- export default PickerOverlay;
11
+ declare const PickerPopup: RsRefForwardingComponent<'div', PickerPopupProps>;
12
+ export default PickerPopup;
@@ -5,14 +5,14 @@ import React, { useRef, useCallback, useEffect } from 'react';
5
5
  import omit from 'lodash/omit';
6
6
  import addStyle from 'dom-lib/addStyle';
7
7
  import getWidth from 'dom-lib/getWidth';
8
- import { getDOMNode, mergeRefs, useElementResize, useClassNames } from '../utils';
8
+ import { getDOMNode, mergeRefs, useElementResize, useClassNames, useEventCallback } from '../utils';
9
9
  var omitProps = ['placement', 'arrowOffsetLeft', 'arrowOffsetTop', 'positionLeft', 'positionTop', 'getPositionInstance', 'getToggleInstance', 'autoWidth'];
10
10
  var resizePlacement = ['topStart', 'topEnd', 'leftEnd', 'rightEnd', 'auto', 'autoVerticalStart', 'autoVerticalEnd', 'autoHorizontalEnd'];
11
- var PickerOverlay = /*#__PURE__*/React.forwardRef(function (props, ref) {
11
+ var PickerPopup = /*#__PURE__*/React.forwardRef(function (props, ref) {
12
12
  var _props$as = props.as,
13
13
  Component = _props$as === void 0 ? 'div' : _props$as,
14
14
  _props$classPrefix = props.classPrefix,
15
- classPrefix = _props$classPrefix === void 0 ? 'picker-menu' : _props$classPrefix,
15
+ classPrefix = _props$classPrefix === void 0 ? 'picker-popup' : _props$classPrefix,
16
16
  autoWidth = props.autoWidth,
17
17
  className = props.className,
18
18
  _props$placement = props.placement,
@@ -20,12 +20,12 @@ var PickerOverlay = /*#__PURE__*/React.forwardRef(function (props, ref) {
20
20
  target = props.target,
21
21
  rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "autoWidth", "className", "placement", "target"]);
22
22
  var overlayRef = useRef(null);
23
- var handleResize = useCallback(function () {
23
+ var handleResize = useEventCallback(function () {
24
24
  var instance = target === null || target === void 0 ? void 0 : target.current;
25
25
  if (instance && resizePlacement.includes(placement)) {
26
26
  instance.updatePosition();
27
27
  }
28
- }, [target, placement]);
28
+ });
29
29
  useElementResize(useCallback(function () {
30
30
  return overlayRef.current;
31
31
  }, []), handleResize);
@@ -44,10 +44,12 @@ var PickerOverlay = /*#__PURE__*/React.forwardRef(function (props, ref) {
44
44
  withClassPrefix = _useClassNames.withClassPrefix,
45
45
  merge = _useClassNames.merge;
46
46
  var classes = merge(className, withClassPrefix());
47
- return /*#__PURE__*/React.createElement(Component, _extends({}, omit(rest, omitProps), {
47
+ return /*#__PURE__*/React.createElement(Component, _extends({
48
+ "data-testid": "picker-popup"
49
+ }, omit(rest, omitProps), {
48
50
  ref: mergeRefs(overlayRef, ref),
49
51
  className: classes
50
52
  }));
51
53
  });
52
- PickerOverlay.displayName = 'PickerOverlay';
53
- export default PickerOverlay;
54
+ PickerPopup.displayName = 'PickerPopup';
55
+ export default PickerPopup;
@@ -28,8 +28,8 @@ export interface PickerToggleProps extends ToggleButtonProps {
28
28
  loading?: boolean;
29
29
  label?: React.ReactNode;
30
30
  name?: string;
31
- id?: string;
32
31
  inputValue?: ValueType | ValueType[];
32
+ focusItemValue?: ValueType | null;
33
33
  onClean?: (event: React.MouseEvent) => void;
34
34
  }
35
35
  declare const PickerToggle: RsRefForwardingComponent<typeof ToggleButton, PickerToggleProps>;
@@ -11,6 +11,7 @@ import useToggleCaret from '../utils/useToggleCaret';
11
11
  import Stack from '../Stack';
12
12
  import PickerIndicator from './PickerIndicator';
13
13
  import PickerLabel from './PickerLabel';
14
+ import useCombobox from './hooks/useCombobox';
14
15
  var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
15
16
  var active = props.active,
16
17
  _props$as = props.as,
@@ -30,8 +31,8 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
31
  cleanable = props.cleanable,
31
32
  _props$tabIndex = props.tabIndex,
32
33
  tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
33
- id = props.id,
34
34
  inputValueProp = props.inputValue,
35
+ focusItemValue = props.focusItemValue,
35
36
  onClean = props.onClean,
36
37
  _props$placement = props.placement,
37
38
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
@@ -40,12 +41,16 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
40
41
  caretAs = _props$caretAs === void 0 ? caretComponent : _props$caretAs,
41
42
  label = props.label,
42
43
  name = props.name,
43
- rest = _objectWithoutPropertiesLoose(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "loading", "cleanable", "tabIndex", "id", "inputValue", "onClean", "placement", "caretComponent", "caretAs", "label", "name"]);
44
+ rest = _objectWithoutPropertiesLoose(props, ["active", "as", "classPrefix", "children", "caret", "className", "disabled", "readOnly", "plaintext", "hasValue", "loading", "cleanable", "tabIndex", "inputValue", "focusItemValue", "onClean", "placement", "caretComponent", "caretAs", "label", "name"]);
44
45
  var combobox = useRef(null);
45
46
  var _useClassNames = useClassNames(classPrefix),
46
47
  withClassPrefix = _useClassNames.withClassPrefix,
47
48
  merge = _useClassNames.merge,
48
49
  prefix = _useClassNames.prefix;
50
+ var _useCombobox = useCombobox(),
51
+ id = _useCombobox.id,
52
+ labelId = _useCombobox.labelId,
53
+ popupType = _useCombobox.popupType;
49
54
  var inputValue = useMemo(function () {
50
55
  if (typeof inputValueProp === 'number' || typeof inputValueProp === 'string') {
51
56
  return inputValueProp;
@@ -74,10 +79,14 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
74
79
  var showCleanButton = cleanable && hasValue && !readOnly;
75
80
  return /*#__PURE__*/React.createElement(Component, _extends({
76
81
  role: "combobox",
77
- "aria-haspopup": "listbox",
82
+ id: id,
83
+ "aria-haspopup": popupType,
78
84
  "aria-expanded": active,
79
85
  "aria-disabled": disabled,
80
- "aria-owns": id ? id + "-listbox" : undefined
86
+ "aria-controls": id + "-" + popupType,
87
+ "aria-labelledby": labelId,
88
+ "aria-describedby": id + "-describe",
89
+ "aria-activedescendant": active && focusItemValue ? id + "-opt-" + focusItemValue : undefined
81
90
  }, rest, {
82
91
  ref: mergeRefs(combobox, ref),
83
92
  disabled: disabled,
@@ -86,7 +95,7 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
86
95
  }), /*#__PURE__*/React.createElement(Stack, null, label && /*#__PURE__*/React.createElement(Stack.Item, null, /*#__PURE__*/React.createElement(PickerLabel, {
87
96
  as: "span",
88
97
  className: prefix('label'),
89
- id: id ? id + "-label" : undefined
98
+ id: labelId
90
99
  }, label)), /*#__PURE__*/React.createElement(Stack.Item, {
91
100
  grow: 1,
92
101
  style: {
@@ -95,20 +104,18 @@ var PickerToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
95
104
  }, /*#__PURE__*/React.createElement("input", {
96
105
  readOnly: true,
97
106
  "aria-hidden": true,
98
- "aria-controls": id ? id + "-listbox" : undefined,
99
- "aria-labelledby": label ? id + "-label" : undefined,
100
107
  tabIndex: -1,
101
108
  "data-testid": "picker-toggle-input",
102
109
  name: name,
103
110
  value: inputValue,
104
- id: id,
105
111
  className: prefix('textbox', 'read-only'),
106
112
  style: {
107
113
  pointerEvents: 'none'
108
114
  }
109
115
  }), children ? /*#__PURE__*/React.createElement("span", {
110
116
  className: prefix(hasValue ? 'value' : 'placeholder'),
111
- "aria-placeholder": typeof children === 'string' ? children : undefined
117
+ id: id + "-describe",
118
+ "data-testid": "picker-describe"
112
119
  }, children) : null), /*#__PURE__*/React.createElement(Stack.Item, {
113
120
  className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["indicator"])))
114
121
  }, /*#__PURE__*/React.createElement(PickerIndicator, {
@@ -4,6 +4,14 @@ import { PositionChildProps } from '../Overlay/Position';
4
4
  import { TypeAttributes, AnimationEventProps } from '../@types/common';
5
5
  export type { OverlayTriggerHandle, PositionChildProps };
6
6
  export interface PickerToggleTriggerProps extends Omit<AnimationEventProps, 'onEntering' | 'onExiting'>, Pick<OverlayTriggerProps, 'speaker' | 'onClose'> {
7
+ id?: string;
8
+ /**
9
+ * Identifies the combobox has having a popout, and indicates the type.
10
+ *
11
+ * @see MDN https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-haspopup
12
+ */
13
+ popupType?: 'listbox' | 'tree' | 'grid' | 'dialog' | 'menu';
14
+ multiple?: boolean;
7
15
  placement?: TypeAttributes.Placement;
8
16
  pickerProps: any;
9
17
  open?: boolean;
@@ -12,5 +20,12 @@ export interface PickerToggleTriggerProps extends Omit<AnimationEventProps, 'onE
12
20
  }
13
21
  export declare const omitTriggerPropKeys: string[];
14
22
  export declare const pickTriggerPropKeys: string[];
23
+ export interface ComboboxContextProps {
24
+ id?: string;
25
+ multiple?: boolean;
26
+ hasLabel?: boolean;
27
+ popupType?: 'listbox' | 'tree' | 'grid' | 'dialog' | 'menu';
28
+ }
29
+ export declare const ComboboxContextContext: React.Context<ComboboxContextProps>;
15
30
  declare const PickerToggleTrigger: React.ForwardRefExoticComponent<PickerToggleTriggerProps & React.RefAttributes<any>>;
16
31
  export default PickerToggleTrigger;
@@ -4,26 +4,41 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
4
4
  import React from 'react';
5
5
  import pick from 'lodash/pick';
6
6
  import OverlayTrigger from '../Overlay/OverlayTrigger';
7
- import { placementPolyfill, useCustom } from '../utils';
7
+ import { placementPolyfill, useCustom, useUniqueId } from '../utils';
8
8
  export var omitTriggerPropKeys = ['onEntered', 'onExited', 'onEnter', 'onEntering', 'onExit', 'onExiting', 'open', 'defaultOpen', 'container', 'containerPadding', 'preventOverflow'];
9
- export var pickTriggerPropKeys = [].concat(omitTriggerPropKeys, ['disabled', 'plaintext', 'readOnly', 'loading']);
9
+ export var pickTriggerPropKeys = [].concat(omitTriggerPropKeys, ['disabled', 'plaintext', 'readOnly', 'loading', 'label']);
10
+ export var ComboboxContextContext = /*#__PURE__*/React.createContext({
11
+ popupType: 'listbox'
12
+ });
10
13
  var PickerToggleTrigger = /*#__PURE__*/React.forwardRef(function (props, ref) {
11
14
  var pickerProps = props.pickerProps,
12
15
  speaker = props.speaker,
13
16
  placement = props.placement,
14
17
  _props$trigger = props.trigger,
15
18
  trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
16
- rest = _objectWithoutPropertiesLoose(props, ["pickerProps", "speaker", "placement", "trigger"]);
19
+ id = props.id,
20
+ multiple = props.multiple,
21
+ _props$popupType = props.popupType,
22
+ popupType = _props$popupType === void 0 ? 'listbox' : _props$popupType,
23
+ rest = _objectWithoutPropertiesLoose(props, ["pickerProps", "speaker", "placement", "trigger", "id", "multiple", "popupType"]);
17
24
  var pickerTriggerProps = pick(pickerProps, pickTriggerPropKeys);
25
+ var pickerId = useUniqueId('rs-', id);
18
26
  var _useCustom = useCustom(),
19
27
  rtl = _useCustom.rtl;
20
- return /*#__PURE__*/React.createElement(OverlayTrigger, _extends({}, pickerTriggerProps, rest, {
28
+ return /*#__PURE__*/React.createElement(ComboboxContextContext.Provider, {
29
+ value: {
30
+ id: pickerId,
31
+ hasLabel: typeof pickerTriggerProps.label !== 'undefined',
32
+ multiple: multiple,
33
+ popupType: popupType
34
+ }
35
+ }, /*#__PURE__*/React.createElement(OverlayTrigger, _extends({}, pickerTriggerProps, rest, {
21
36
  disabled: pickerTriggerProps.disabled || pickerTriggerProps.loading,
22
37
  ref: ref,
23
38
  trigger: trigger,
24
39
  placement: placementPolyfill(placement, rtl),
25
40
  speaker: speaker
26
- }));
41
+ })));
27
42
  });
28
43
  PickerToggleTrigger.displayName = 'PickerToggleTrigger';
29
44
  export default PickerToggleTrigger;
@@ -1,11 +1,10 @@
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 } from 'react';
5
- import get from 'lodash/get';
4
+ import React from 'react';
6
5
  import PropTypes from 'prop-types';
7
6
  import Search from '@rsuite/icons/legacy/Search';
8
- import { useClassNames } from '../utils';
7
+ import { useClassNames, useEventCallback } from '../utils';
9
8
  var SearchBar = /*#__PURE__*/React.forwardRef(function (props, ref) {
10
9
  var _props$as = props.as,
11
10
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -23,15 +22,15 @@ var SearchBar = /*#__PURE__*/React.forwardRef(function (props, ref) {
23
22
  merge = _useClassNames.merge,
24
23
  prefix = _useClassNames.prefix;
25
24
  var classes = merge(className, withClassPrefix());
26
- var handleChange = useCallback(function (event) {
27
- onChange === null || onChange === void 0 ? void 0 : onChange(get(event, 'target.value'), event);
28
- }, [onChange]);
29
- return /*#__PURE__*/React.createElement(Component, _extends({
30
- role: "searchbox"
31
- }, rest, {
25
+ var handleChange = useEventCallback(function (event) {
26
+ var _event$target;
27
+ onChange === null || onChange === void 0 ? void 0 : onChange((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.value, event);
28
+ });
29
+ return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
32
30
  ref: ref,
33
31
  className: classes
34
32
  }), /*#__PURE__*/React.createElement("input", {
33
+ role: "searchbox",
35
34
  className: prefix('input'),
36
35
  value: value,
37
36
  onChange: handleChange,
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface TreeViewProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ treeRootClassName: string;
4
+ multiselectable?: boolean;
5
+ }
6
+ declare const TreeView: React.ForwardRefExoticComponent<TreeViewProps & React.RefAttributes<HTMLDivElement>>;
7
+ export default TreeView;
@@ -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 './hooks/useCombobox';
6
+ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
7
+ var children = props.children,
8
+ treeRootClassName = props.treeRootClassName,
9
+ multiselectable = props.multiselectable,
10
+ rest = _objectWithoutPropertiesLoose(props, ["children", "treeRootClassName", "multiselectable"]);
11
+ var _useCombobox = useCombobox(),
12
+ id = _useCombobox.id,
13
+ labelId = _useCombobox.labelId,
14
+ popupType = _useCombobox.popupType;
15
+ return /*#__PURE__*/React.createElement("div", _extends({
16
+ role: "tree",
17
+ id: id + "-" + popupType,
18
+ "aria-multiselectable": multiselectable,
19
+ "aria-labelledby": labelId,
20
+ ref: ref
21
+ }, rest), /*#__PURE__*/React.createElement("div", {
22
+ className: treeRootClassName
23
+ }, children));
24
+ });
25
+ export default TreeView;
@@ -0,0 +1,6 @@
1
+ export { default as usePickerRef } from './usePickerRef';
2
+ export { default as useCombobox } from './useCombobox';
3
+ export { default as useFocusItemValue } from './useFocusItemValue';
4
+ export { default as useToggleKeyDownEvent } from './useToggleKeyDownEvent';
5
+ export { default as useSearch } from './useSearch';
6
+ export { default as usePickerClassName } from './usePickerClassName';
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ export { default as usePickerRef } from './usePickerRef';
3
+ export { default as useCombobox } from './useCombobox';
4
+ export { default as useFocusItemValue } from './useFocusItemValue';
5
+ export { default as useToggleKeyDownEvent } from './useToggleKeyDownEvent';
6
+ export { default as useSearch } from './useSearch';
7
+ export { default as usePickerClassName } from './usePickerClassName';
@@ -0,0 +1,7 @@
1
+ declare function useCombobox(): {
2
+ id: string | undefined;
3
+ popupType: "dialog" | "menu" | "grid" | "listbox" | "tree" | undefined;
4
+ multiple: boolean | undefined;
5
+ labelId: string | undefined;
6
+ };
7
+ export default useCombobox;
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { useContext } from 'react';
3
+ import { ComboboxContextContext } from '../PickerToggleTrigger';
4
+ function useCombobox() {
5
+ var _useContext = useContext(ComboboxContextContext),
6
+ id = _useContext.id,
7
+ hasLabel = _useContext.hasLabel,
8
+ popupType = _useContext.popupType,
9
+ multiple = _useContext.multiple;
10
+ return {
11
+ id: id,
12
+ popupType: popupType,
13
+ multiple: multiple,
14
+ labelId: hasLabel ? id + "-label" : undefined
15
+ };
16
+ }
17
+ export default useCombobox;
@@ -0,0 +1,30 @@
1
+ /// <reference types="react" />
2
+ interface FocusItemValueProps<T = unknown> {
3
+ target: HTMLElement | null | (() => HTMLElement | null);
4
+ data?: T[];
5
+ /**
6
+ * When the down arrow key is pressed, whether to automatically focus on the option
7
+ */
8
+ focusToOption?: boolean;
9
+ valueKey?: string;
10
+ focusableQueryKey?: string;
11
+ defaultLayer?: number;
12
+ rtl?: boolean;
13
+ callback?: (value: any, event: React.KeyboardEvent) => void;
14
+ getParent?: (node: T) => T | undefined;
15
+ }
16
+ /**
17
+ * A hook that manages the focus state of the option.
18
+ * @param defaultFocusItemValue
19
+ * @param props
20
+ */
21
+ declare const useFocusItemValue: <T, D>(defaultFocusItemValue: T | null | undefined, props: FocusItemValueProps<D>) => {
22
+ focusItemValue: T | null | undefined;
23
+ setFocusItemValue: import("react").Dispatch<import("react").SetStateAction<T | null | undefined>>;
24
+ layer: number;
25
+ setLayer: import("react").Dispatch<import("react").SetStateAction<number>>;
26
+ keys: any[];
27
+ setKeys: import("react").Dispatch<import("react").SetStateAction<any[]>>;
28
+ onKeyDown: (...args: any[]) => any;
29
+ };
30
+ export default useFocusItemValue;