rsuite 5.4.1 → 5.5.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 (129) hide show
  1. package/Button/styles/index.less +1 -5
  2. package/CHANGELOG.md +42 -0
  3. package/CheckTreePicker/styles/index.less +48 -47
  4. package/Drawer/styles/index.less +3 -0
  5. package/Dropdown/styles/index.less +3 -19
  6. package/Dropdown/styles/mixin.less +0 -2
  7. package/Modal/styles/index.less +23 -22
  8. package/Navbar/styles/index.less +20 -8
  9. package/Picker/styles/mixin.less +3 -2
  10. package/README.md +1 -1
  11. package/Sidenav/styles/index.less +58 -57
  12. package/TreePicker/styles/index.less +3 -3
  13. package/cjs/Affix/Affix.js +3 -1
  14. package/cjs/Calendar/useCalendarDate.d.ts +1 -1
  15. package/cjs/Calendar/useCalendarDate.js +1 -1
  16. package/cjs/Carousel/Carousel.js +7 -1
  17. package/cjs/Cascader/Cascader.js +13 -2
  18. package/cjs/CheckPicker/CheckPicker.d.ts +5 -2
  19. package/cjs/CheckPicker/test/CheckPicker.test.js +8 -0
  20. package/cjs/CheckTreePicker/CheckTreePicker.js +1 -1
  21. package/cjs/CheckTreePicker/utils.js +1 -1
  22. package/cjs/CustomProvider/CustomProvider.d.ts +14 -14
  23. package/cjs/CustomProvider/CustomProvider.js +4 -3
  24. package/cjs/DatePicker/DatePicker.d.ts +1 -1
  25. package/cjs/DatePicker/DatePicker.js +2 -4
  26. package/cjs/Disclosure/Disclosure.d.ts +8 -5
  27. package/cjs/Disclosure/Disclosure.js +49 -9
  28. package/cjs/Disclosure/DisclosureButton.d.ts +2 -2
  29. package/cjs/Disclosure/DisclosureContext.d.ts +6 -1
  30. package/cjs/Dropdown/Dropdown.d.ts +5 -0
  31. package/cjs/Dropdown/Dropdown.js +1 -1
  32. package/cjs/Dropdown/DropdownItem.js +9 -10
  33. package/cjs/Dropdown/DropdownMenu.js +69 -20
  34. package/cjs/Dropdown/test/Dropdown.test.d.ts +1 -0
  35. package/cjs/Dropdown/test/Dropdown.test.js +30 -0
  36. package/cjs/InputNumber/InputNumber.d.ts +1 -1
  37. package/cjs/InputNumber/InputNumber.js +36 -6
  38. package/cjs/InputNumber/test/InputNumber.test.d.ts +1 -0
  39. package/cjs/InputNumber/test/InputNumber.test.js +14 -0
  40. package/cjs/Modal/Modal.js +34 -22
  41. package/cjs/Modal/utils.js +16 -8
  42. package/cjs/MultiCascader/MultiCascader.js +7 -3
  43. package/cjs/Nav/NavItem.js +3 -1
  44. package/cjs/Navbar/index.d.ts +1 -0
  45. package/cjs/Navbar/index.js +4 -3
  46. package/cjs/Overlay/Modal.js +10 -27
  47. package/cjs/Picker/DropdownMenu.js +5 -0
  48. package/cjs/Picker/PickerToggle.js +2 -4
  49. package/cjs/RangeSlider/RangeSlider.d.ts +12 -2
  50. package/cjs/RangeSlider/RangeSlider.js +35 -12
  51. package/cjs/SelectPicker/SelectPicker.d.ts +5 -2
  52. package/cjs/SelectPicker/test/SelectPicker.test.js +8 -0
  53. package/cjs/Uploader/UploadFileItem.d.ts +1 -1
  54. package/cjs/Uploader/UploadFileItem.js +1 -1
  55. package/cjs/Uploader/Uploader.js +3 -0
  56. package/cjs/utils/index.d.ts +1 -0
  57. package/cjs/utils/index.js +7 -2
  58. package/cjs/utils/propTypeChecker.d.ts +2 -6
  59. package/cjs/utils/propTypeChecker.js +7 -59
  60. package/cjs/utils/treeUtils.js +4 -3
  61. package/cjs/utils/useClickOutside.js +6 -2
  62. package/cjs/utils/useMount.d.ts +2 -0
  63. package/cjs/utils/useMount.js +19 -0
  64. package/dist/rsuite-rtl.css +416 -264
  65. package/dist/rsuite-rtl.min.css +1 -1
  66. package/dist/rsuite-rtl.min.css.map +1 -1
  67. package/dist/rsuite.css +416 -264
  68. package/dist/rsuite.js +55 -33
  69. package/dist/rsuite.js.map +1 -1
  70. package/dist/rsuite.min.css +1 -1
  71. package/dist/rsuite.min.css.map +1 -1
  72. package/dist/rsuite.min.js +1 -1
  73. package/dist/rsuite.min.js.map +1 -1
  74. package/esm/Affix/Affix.js +4 -2
  75. package/esm/Calendar/useCalendarDate.d.ts +1 -1
  76. package/esm/Calendar/useCalendarDate.js +1 -1
  77. package/esm/Carousel/Carousel.js +9 -3
  78. package/esm/Cascader/Cascader.js +13 -2
  79. package/esm/CheckPicker/CheckPicker.d.ts +5 -2
  80. package/esm/CheckPicker/test/CheckPicker.test.js +7 -0
  81. package/esm/CheckTreePicker/CheckTreePicker.js +1 -1
  82. package/esm/CheckTreePicker/utils.js +1 -1
  83. package/esm/CustomProvider/CustomProvider.d.ts +14 -14
  84. package/esm/CustomProvider/CustomProvider.js +2 -2
  85. package/esm/DatePicker/DatePicker.d.ts +1 -1
  86. package/esm/DatePicker/DatePicker.js +2 -3
  87. package/esm/Disclosure/Disclosure.d.ts +8 -5
  88. package/esm/Disclosure/Disclosure.js +50 -11
  89. package/esm/Disclosure/DisclosureButton.d.ts +2 -2
  90. package/esm/Disclosure/DisclosureContext.d.ts +6 -1
  91. package/esm/Dropdown/Dropdown.d.ts +5 -0
  92. package/esm/Dropdown/Dropdown.js +1 -1
  93. package/esm/Dropdown/DropdownItem.js +9 -9
  94. package/esm/Dropdown/DropdownMenu.js +69 -20
  95. package/esm/Dropdown/test/Dropdown.test.d.ts +1 -0
  96. package/esm/Dropdown/test/Dropdown.test.js +22 -0
  97. package/esm/InputNumber/InputNumber.d.ts +1 -1
  98. package/esm/InputNumber/InputNumber.js +38 -7
  99. package/esm/InputNumber/test/InputNumber.test.d.ts +1 -0
  100. package/esm/InputNumber/test/InputNumber.test.js +7 -0
  101. package/esm/Modal/Modal.js +36 -24
  102. package/esm/Modal/utils.js +16 -8
  103. package/esm/MultiCascader/MultiCascader.js +7 -3
  104. package/esm/Nav/NavItem.js +3 -1
  105. package/esm/Navbar/index.d.ts +1 -0
  106. package/esm/Navbar/index.js +1 -0
  107. package/esm/Overlay/Modal.js +10 -27
  108. package/esm/Picker/DropdownMenu.js +5 -0
  109. package/esm/Picker/PickerToggle.js +2 -4
  110. package/esm/RangeSlider/RangeSlider.d.ts +12 -2
  111. package/esm/RangeSlider/RangeSlider.js +35 -12
  112. package/esm/SelectPicker/SelectPicker.d.ts +5 -2
  113. package/esm/SelectPicker/test/SelectPicker.test.js +7 -0
  114. package/esm/Uploader/UploadFileItem.d.ts +1 -1
  115. package/esm/Uploader/UploadFileItem.js +1 -1
  116. package/esm/Uploader/Uploader.js +4 -1
  117. package/esm/utils/index.d.ts +1 -0
  118. package/esm/utils/index.js +2 -1
  119. package/esm/utils/propTypeChecker.d.ts +2 -6
  120. package/esm/utils/propTypeChecker.js +7 -59
  121. package/esm/utils/treeUtils.js +6 -3
  122. package/esm/utils/useClickOutside.js +6 -2
  123. package/esm/utils/useMount.d.ts +2 -0
  124. package/esm/utils/useMount.js +13 -0
  125. package/package.json +2 -2
  126. package/styles/color-modes/dark.less +1 -0
  127. package/styles/color-modes/high-contrast.less +1 -0
  128. package/styles/color-modes/light.less +1 -0
  129. package/styles/mixins/utilities.less +17 -5
@@ -3,7 +3,7 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
3
3
  import React, { useCallback, useEffect, useRef, useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import getOffset from 'dom-lib/getOffset';
6
- import { mergeRefs, useClassNames, useElementResize, useEventListener } from '../utils';
6
+ import { mergeRefs, useClassNames, useElementResize, useEventListener, useMount } from '../utils';
7
7
 
8
8
  /**
9
9
  * Get the layout size and offset of the mount element
@@ -21,7 +21,9 @@ function useOffset(mountRef) {
21
21
  return mountRef.current;
22
22
  }, updateOffset); // Initialize after the first render
23
23
 
24
- useEffect(updateOffset, [updateOffset]);
24
+ useMount(updateOffset); // Update after window size changes
25
+
26
+ useEventListener(window, 'resize', updateOffset, false);
25
27
  return offset;
26
28
  }
27
29
  /**
@@ -1,4 +1,4 @@
1
- declare const useCalendarDate: (value: Date | undefined, defaultDate: Date | undefined) => {
1
+ declare const useCalendarDate: (value: Date | null | undefined, defaultDate: Date | undefined) => {
2
2
  calendarDate: Date;
3
3
  setCalendarDate: (date: Date | undefined) => void;
4
4
  };
@@ -19,7 +19,7 @@ var useCalendarDate = function useCalendarDate(value, defaultDate) {
19
19
  var _valueRef$current;
20
20
 
21
21
  if ((value === null || value === void 0 ? void 0 : value.valueOf()) !== ((_valueRef$current = valueRef.current) === null || _valueRef$current === void 0 ? void 0 : _valueRef$current.valueOf())) {
22
- setCalendarDate(value);
22
+ setCalendarDate(value !== null && value !== void 0 ? value : new Date());
23
23
  valueRef.current = value;
24
24
  }
25
25
  }, [value]);
@@ -1,9 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useState, useMemo, useCallback } from 'react';
3
+ import React, { useState, useMemo, useCallback, useRef } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import classNames from 'classnames';
6
- import { useClassNames, useCustom, guid, ReactChildren, useTimeout } from '../utils';
6
+ import { useClassNames, useCustom, guid, ReactChildren, useTimeout, mergeRefs } from '../utils';
7
7
  var Carousel = /*#__PURE__*/React.forwardRef(function (props, ref) {
8
8
  var _sliderStyles, _ref;
9
9
 
@@ -46,7 +46,13 @@ var Carousel = /*#__PURE__*/React.forwardRef(function (props, ref) {
46
46
  lastIndex = _useState2[0],
47
47
  setLastIndex = _useState2[1];
48
48
 
49
+ var rootRef = useRef(null);
50
+
49
51
  var handleSlide = function handleSlide(nextActiveIndex, event) {
52
+ if (!rootRef.current) {
53
+ return;
54
+ }
55
+
50
56
  clear();
51
57
  var index = nextActiveIndex !== null && nextActiveIndex !== void 0 ? nextActiveIndex : activeIndex + 1; // When index is greater than count, start from 1 again.
52
58
 
@@ -111,7 +117,7 @@ var Carousel = /*#__PURE__*/React.forwardRef(function (props, ref) {
111
117
  var sliderStyles = (_sliderStyles = {}, _sliderStyles[lengthKey] = count * 100 + "%", _sliderStyles.transform = vertical ? "translate3d(0, " + activeRatio + " ,0)" : "translate3d(" + activeRatio + ", 0 ,0)", _sliderStyles);
112
118
  var showMask = count > 1 && activeIndex === 0 && activeIndex !== lastIndex;
113
119
  return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
114
- ref: ref,
120
+ ref: mergeRefs(ref, rootRef),
115
121
  className: classes
116
122
  }), /*#__PURE__*/React.createElement("div", {
117
123
  className: prefix('content')
@@ -188,10 +188,18 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
188
188
  }
189
189
  }, [getSearchResult, onSearch, setFocusItemValue, setKeys, setLayer, valueKey]);
190
190
  var handleEntered = useCallback(function () {
191
+ if (!targetRef.current) {
192
+ return;
193
+ }
194
+
191
195
  onOpen === null || onOpen === void 0 ? void 0 : onOpen();
192
196
  setActive(true);
193
197
  }, [onOpen]);
194
198
  var handleExited = useCallback(function () {
199
+ if (!targetRef.current) {
200
+ return;
201
+ }
202
+
195
203
  onClose === null || onClose === void 0 ? void 0 : onClose();
196
204
  setActive(false);
197
205
  setSearchKeyword('');
@@ -202,7 +210,7 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
202
210
  (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.close();
203
211
  }, [triggerRef]);
204
212
  var handleClean = useCallback(function (event) {
205
- if (disabled) {
213
+ if (disabled || !targetRef.current) {
206
214
  return;
207
215
  }
208
216
 
@@ -260,7 +268,10 @@ var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
260
268
  children.then(function (data) {
261
269
  node.loading = false;
262
270
  node[childrenKey] = data;
263
- addColumn(data, cascadePaths.length);
271
+
272
+ if (targetRef.current) {
273
+ addColumn(data, cascadePaths.length);
274
+ }
264
275
  });
265
276
  } else {
266
277
  node.loading = false;
@@ -1,5 +1,6 @@
1
- import React from 'react';
1
+ import React, { Ref } from 'react';
2
2
  import { PickerLocale } from '../locales';
3
+ import { PickerInstance } from '../Picker';
3
4
  import { ItemDataType, FormControlPickerProps } from '../@types/common';
4
5
  import type { MultipleSelectProps } from '../SelectPicker';
5
6
  export declare type ValueType = (number | string)[];
@@ -10,7 +11,9 @@ export interface CheckPickerProps<T> extends FormControlPickerProps<T[], PickerL
10
11
  countable?: boolean;
11
12
  }
12
13
  export interface CheckPickerComponent {
13
- <T>(props: CheckPickerProps<T>): JSX.Element | null;
14
+ <T>(props: CheckPickerProps<T> & {
15
+ ref?: Ref<PickerInstance>;
16
+ }): JSX.Element | null;
14
17
  displayName?: string;
15
18
  propTypes?: React.WeakValidationMap<CheckPickerProps<any>>;
16
19
  }
@@ -61,4 +61,11 @@ React.createElement(CheckPicker, {
61
61
  onChange: function onChange(newValue) {
62
62
  expectType(newValue);
63
63
  }
64
+ });
65
+ var pickerRef = /*#__PURE__*/React.createRef();
66
+
67
+ /*#__PURE__*/
68
+ React.createElement(CheckPicker, {
69
+ ref: pickerRef,
70
+ data: []
64
71
  });
@@ -621,7 +621,7 @@ var CheckTreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
621
621
  var renderCheckTree = function renderCheckTree() {
622
622
  var _withCheckTreeClassPr, _merge2;
623
623
 
624
- var classes = withCheckTreeClassPrefix((_withCheckTreeClassPr = {}, _withCheckTreeClassPr[className !== null && className !== void 0 ? className : ''] = inline, _withCheckTreeClassPr['without-children'] = !isSomeNodeHasChildren, _withCheckTreeClassPr.virtualized = virtualized, _withCheckTreeClassPr));
624
+ var classes = withCheckTreeClassPrefix((_withCheckTreeClassPr = {}, _withCheckTreeClassPr[className !== null && className !== void 0 ? className : ''] = inline, _withCheckTreeClassPr['without-children'] = !isSomeNodeHasChildren(data, childrenKey), _withCheckTreeClassPr.virtualized = virtualized, _withCheckTreeClassPr));
625
625
  var formattedNodes = getFormattedNodes(renderNode);
626
626
 
627
627
  if (!formattedNodes.some(function (v) {
@@ -38,7 +38,7 @@ export function isSomeChildChecked(nodes, parent, childrenKey) {
38
38
  }
39
39
  export function isSomeNodeHasChildren(data, childrenKey) {
40
40
  return data.some(function (node) {
41
- return node[childrenKey];
41
+ return Array.isArray(node[childrenKey]);
42
42
  });
43
43
  }
44
44
  /**
@@ -72,10 +72,10 @@ declare const CustomContext: React.Context<CustomProviderProps<{
72
72
  saturday: string;
73
73
  ok: string;
74
74
  today: string;
75
- yesterday: string; /** Language configuration */
75
+ yesterday: string;
76
76
  hours: string;
77
77
  minutes: string;
78
- seconds: string;
78
+ seconds: string; /** Support right-to-left */
79
79
  formattedMonthPattern: string;
80
80
  formattedDayPattern: string;
81
81
  dateLocale: any;
@@ -90,10 +90,10 @@ declare const CustomContext: React.Context<CustomProviderProps<{
90
90
  saturday: string;
91
91
  ok: string;
92
92
  today: string;
93
- yesterday: string; /** Language configuration */
93
+ yesterday: string;
94
94
  hours: string;
95
95
  minutes: string;
96
- seconds: string;
96
+ seconds: string; /** Support right-to-left */
97
97
  formattedMonthPattern: string;
98
98
  formattedDayPattern: string;
99
99
  dateLocale: any;
@@ -109,10 +109,10 @@ declare const CustomContext: React.Context<CustomProviderProps<{
109
109
  saturday: string;
110
110
  ok: string;
111
111
  today: string;
112
- yesterday: string; /** Language configuration */
112
+ yesterday: string;
113
113
  hours: string;
114
114
  minutes: string;
115
- seconds: string;
115
+ seconds: string; /** Support right-to-left */
116
116
  formattedMonthPattern: string;
117
117
  formattedDayPattern: string;
118
118
  dateLocale: any;
@@ -120,7 +120,7 @@ declare const CustomContext: React.Context<CustomProviderProps<{
120
120
  Picker?: {
121
121
  noResultsText: string;
122
122
  placeholder: string;
123
- searchPlaceholder: string; /** Supported themes */
123
+ searchPlaceholder: string;
124
124
  checkAll: string;
125
125
  } | undefined;
126
126
  InputPicker?: {
@@ -176,10 +176,10 @@ declare const Consumer: React.Consumer<CustomProviderProps<{
176
176
  saturday: string;
177
177
  ok: string;
178
178
  today: string;
179
- yesterday: string; /** Language configuration */
179
+ yesterday: string;
180
180
  hours: string;
181
181
  minutes: string;
182
- seconds: string;
182
+ seconds: string; /** Support right-to-left */
183
183
  formattedMonthPattern: string;
184
184
  formattedDayPattern: string;
185
185
  dateLocale: any;
@@ -194,10 +194,10 @@ declare const Consumer: React.Consumer<CustomProviderProps<{
194
194
  saturday: string;
195
195
  ok: string;
196
196
  today: string;
197
- yesterday: string; /** Language configuration */
197
+ yesterday: string;
198
198
  hours: string;
199
199
  minutes: string;
200
- seconds: string;
200
+ seconds: string; /** Support right-to-left */
201
201
  formattedMonthPattern: string;
202
202
  formattedDayPattern: string;
203
203
  dateLocale: any;
@@ -213,10 +213,10 @@ declare const Consumer: React.Consumer<CustomProviderProps<{
213
213
  saturday: string;
214
214
  ok: string;
215
215
  today: string;
216
- yesterday: string; /** Language configuration */
216
+ yesterday: string;
217
217
  hours: string;
218
218
  minutes: string;
219
- seconds: string;
219
+ seconds: string; /** Support right-to-left */
220
220
  formattedMonthPattern: string;
221
221
  formattedDayPattern: string;
222
222
  dateLocale: any;
@@ -224,7 +224,7 @@ declare const Consumer: React.Consumer<CustomProviderProps<{
224
224
  Picker?: {
225
225
  noResultsText: string;
226
226
  placeholder: string;
227
- searchPlaceholder: string; /** Supported themes */
227
+ searchPlaceholder: string;
228
228
  checkAll: string;
229
229
  } | undefined;
230
230
  InputPicker?: {
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React from 'react';
3
+ import React, { useEffect } from 'react';
4
4
  import { getClassNamePrefix, prefix } from '../utils/prefix';
5
5
  import { addClass, removeClass, canUseDOM } from '../DOMHelper';
6
6
  var CustomContext = /*#__PURE__*/React.createContext({});
@@ -21,7 +21,7 @@ var CustomProvider = function CustomProvider(props) {
21
21
  theme: theme
22
22
  }, rest);
23
23
  }, [classPrefix, theme, rest]);
24
- React.useEffect(function () {
24
+ useEffect(function () {
25
25
  if (canUseDOM && theme) {
26
26
  addClass(document.body, prefix(classPrefix, "theme-" + theme)); // Remove the className that will cause style conflicts
27
27
 
@@ -3,7 +3,7 @@ import { RangeType } from './Toolbar';
3
3
  import { DatePickerLocale } from '../locales';
4
4
  import { FormControlBaseProps, PickerBaseProps, RsRefForwardingComponent } from '../@types/common';
5
5
  export type { RangeType } from './Toolbar';
6
- export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, FormControlBaseProps<Date> {
6
+ export interface DatePickerProps extends PickerBaseProps<DatePickerLocale>, FormControlBaseProps<Date | null> {
7
7
  /** Configure shortcut options */
8
8
  ranges?: RangeType<Date>[];
9
9
  /** Calendar panel default presentation date and time */
@@ -2,7 +2,6 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
3
  import React, { useCallback, useMemo, useRef, useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import isNil from 'lodash/isNil';
6
5
  import mapValues from 'lodash/mapValues';
7
6
  import pick from 'lodash/pick';
8
7
  import omit from 'lodash/omit';
@@ -166,11 +165,11 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
166
165
  closeOverlay = true;
167
166
  }
168
167
 
169
- var nextValue = !isNil(nextPageDate) ? nextPageDate : calendarDate;
168
+ var nextValue = typeof nextPageDate !== 'undefined' ? nextPageDate : calendarDate;
170
169
  setCalendarDate(nextValue || new Date());
171
170
  setValue(nextValue);
172
171
 
173
- if (nextValue !== value || !DateUtils.isSameDay(nextValue, value)) {
172
+ if (nextValue !== value) {
174
173
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
175
174
  } // `closeOverlay` default value is `true`
176
175
 
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import DisclosureButton from './DisclosureButton';
3
3
  import DisclosureContent from './DisclosureContent';
4
- export interface DisclosureRenderProps {
4
+ export declare type DisclosureTrigger = 'click' | 'mouseover';
5
+ export interface DisclosureRenderProps extends Pick<React.HTMLAttributes<HTMLElement>, 'onMouseOver' | 'onMouseOut'> {
5
6
  open: boolean;
6
7
  }
7
8
  export interface DisclosureProps {
@@ -13,10 +14,12 @@ export interface DisclosureProps {
13
14
  hideOnClickOutside?: boolean;
14
15
  /** Callback when disclosure button is being activated to update the open state */
15
16
  onToggle?: (open: boolean, event: React.SyntheticEvent) => void;
17
+ /** What mouse events should disclosure reacts to */
18
+ trigger?: DisclosureTrigger[];
16
19
  }
17
- declare function Disclosure(props: DisclosureProps): JSX.Element;
18
- declare namespace Disclosure {
19
- var Button: typeof DisclosureButton;
20
- var Content: typeof DisclosureContent;
20
+ export interface DisclosureComponent extends React.FC<DisclosureProps> {
21
+ Button: typeof DisclosureButton;
22
+ Content: typeof DisclosureContent;
21
23
  }
24
+ declare const Disclosure: DisclosureComponent;
22
25
  export default Disclosure;
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  // Headless Disclosure
3
3
  // Ref: https://w3c.github.io/aria-practices/#disclosure
4
- import React, { useMemo, useReducer, useRef } from 'react';
4
+ import React, { useMemo, useReducer, useRef, useCallback, useContext } from 'react';
5
5
  import DisclosureContext, { DisclosureActionTypes } from './DisclosureContext';
6
6
  import DisclosureButton from './DisclosureButton';
7
7
  import DisclosureContent from './DisclosureContent';
@@ -26,14 +26,17 @@ function disclosureReducer(state, action) {
26
26
  return state;
27
27
  }
28
28
 
29
- function Disclosure(props) {
29
+ var Disclosure = /*#__PURE__*/React.memo(function (props) {
30
30
  var children = props.children,
31
31
  openProp = props.open,
32
32
  _props$defaultOpen = props.defaultOpen,
33
33
  defaultOpen = _props$defaultOpen === void 0 ? false : _props$defaultOpen,
34
34
  _props$hideOnClickOut = props.hideOnClickOutside,
35
35
  hideOnClickOutside = _props$hideOnClickOut === void 0 ? false : _props$hideOnClickOut,
36
- onToggle = props.onToggle;
36
+ onToggle = props.onToggle,
37
+ _props$trigger = props.trigger,
38
+ trigger = _props$trigger === void 0 ? ['click'] : _props$trigger;
39
+ var parentDisclosure = useContext(DisclosureContext);
37
40
 
38
41
  var _useReducer = useReducer(disclosureReducer, _extends({}, initialDisclosureState, {
39
42
  open: defaultOpen
@@ -56,20 +59,56 @@ function Disclosure(props) {
56
59
  });
57
60
  }
58
61
  });
62
+ var onMouseOver = useCallback(function (event) {
63
+ if (!open) {
64
+ dispatch({
65
+ type: DisclosureActionTypes.Show
66
+ });
67
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(true, event);
68
+ }
69
+ }, [open, dispatch, onToggle]);
70
+ var onMouseOut = useCallback(function (event) {
71
+ if (open) {
72
+ dispatch({
73
+ type: DisclosureActionTypes.Hide
74
+ });
75
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(false, event);
76
+ }
77
+ }, [open, dispatch, onToggle]);
59
78
  var contextValue = useMemo(function () {
79
+ var cascadeDispatch = function cascadeDispatch(action) {
80
+ var result = dispatch(action);
81
+
82
+ if ('cascade' in action) {
83
+ parentDisclosure === null || parentDisclosure === void 0 ? void 0 : parentDisclosure[1](action);
84
+ }
85
+
86
+ return result;
87
+ };
88
+
60
89
  return [{
61
90
  open: open
62
- }, dispatch, {
63
- onToggle: onToggle
91
+ }, cascadeDispatch, {
92
+ onToggle: onToggle,
93
+ trigger: trigger
64
94
  }];
65
- }, [open, dispatch, onToggle]);
95
+ }, [parentDisclosure, open, dispatch, onToggle, trigger]);
96
+ var renderProps = useMemo(function () {
97
+ var renderProps = {
98
+ open: open
99
+ };
100
+
101
+ if (trigger.includes('mouseover')) {
102
+ renderProps.onMouseOver = onMouseOver;
103
+ renderProps.onMouseOut = onMouseOut;
104
+ }
105
+
106
+ return renderProps;
107
+ }, [open, trigger, onMouseOver, onMouseOut]);
66
108
  return /*#__PURE__*/React.createElement(DisclosureContext.Provider, {
67
109
  value: contextValue
68
- }, children({
69
- open: open
70
- }, containerElementRef));
71
- }
72
-
110
+ }, children(renderProps, containerElementRef));
111
+ });
73
112
  Disclosure.Button = DisclosureButton;
74
113
  Disclosure.Content = DisclosureContent;
75
114
  export default Disclosure;
@@ -3,9 +3,9 @@ export interface DisclosureButtonRenderProps {
3
3
  open: boolean;
4
4
  }
5
5
  export interface DisclosureButtonProps {
6
- children: (props: React.ButtonHTMLAttributes<HTMLButtonElement> & DisclosureButtonRenderProps, ref: React.Ref<HTMLButtonElement>) => React.ReactElement<React.HTMLAttributes<HTMLButtonElement>>;
6
+ children: (props: React.HTMLAttributes<HTMLElement> & DisclosureButtonRenderProps, ref: React.Ref<HTMLElement>) => React.ReactElement<React.HTMLAttributes<HTMLElement>>;
7
7
  }
8
- declare function DisclosureButton(props: DisclosureButtonProps): React.ReactElement<React.HTMLAttributes<HTMLButtonElement>, string | React.JSXElementConstructor<any>>;
8
+ declare function DisclosureButton(props: DisclosureButtonProps): React.ReactElement<React.HTMLAttributes<HTMLElement>, string | React.JSXElementConstructor<any>>;
9
9
  declare namespace DisclosureButton {
10
10
  var displayName: string;
11
11
  }
@@ -1,4 +1,5 @@
1
1
  import React, { Dispatch } from 'react';
2
+ import type { DisclosureTrigger } from './Disclosure';
2
3
  export interface DisclosureState {
3
4
  open: boolean;
4
5
  }
@@ -7,12 +8,16 @@ export declare enum DisclosureActionTypes {
7
8
  Hide = 1
8
9
  }
9
10
  export declare type DisclosureAction = {
10
- type: DisclosureActionTypes;
11
+ type: DisclosureActionTypes.Show;
12
+ } | {
13
+ type: DisclosureActionTypes.Hide;
14
+ cascade?: boolean;
11
15
  };
12
16
  export declare type DisclosureContextProps = [
13
17
  DisclosureState,
14
18
  Dispatch<DisclosureAction>,
15
19
  {
20
+ trigger: DisclosureTrigger[];
16
21
  onToggle?: (open: boolean, event: React.SyntheticEvent) => void;
17
22
  }
18
23
  ];
@@ -3,6 +3,7 @@ import DropdownMenu from './DropdownMenu';
3
3
  import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
4
  import { IconProps } from '@rsuite/icons/lib/Icon';
5
5
  import DropdownItem from './DropdownItem';
6
+ import Button from '../Button';
6
7
  export declare type DropdownTrigger = 'click' | 'hover' | 'contextMenu';
7
8
  export interface DropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect' | 'title'> {
8
9
  /** Define the title as a submenu */
@@ -48,6 +49,10 @@ export interface DropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttr
48
49
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
49
50
  }
50
51
  export interface DropdownComponent extends RsRefForwardingComponent<'div', DropdownProps> {
52
+ <ToggleAs extends React.ElementType = typeof Button>(props: DropdownProps & {
53
+ ref?: React.Ref<any>;
54
+ toggleAs?: ToggleAs;
55
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
51
56
  Item: typeof DropdownItem;
52
57
  Menu: typeof DropdownMenu;
53
58
  }
@@ -15,7 +15,7 @@ import DropdownToggle from './DropdownToggle';
15
15
  import MenuContext from '../Menu/MenuContext';
16
16
  import MenuItem from '../Menu/MenuItem';
17
17
  import kebabCase from 'lodash/kebabCase';
18
- import { NavbarContext } from '../Navbar/Navbar';
18
+ import { NavbarContext } from '../Navbar';
19
19
  import Disclosure from '../Disclosure/Disclosure';
20
20
  import SidenavDropdown from '../Sidenav/SidenavDropdown';
21
21
  import NavContext from '../Nav/NavContext';
@@ -11,7 +11,6 @@ import { createChainedFunction, mergeRefs, shallowEqual, useClassNames } from '.
11
11
  import { NavbarContext } from '../Navbar/Navbar';
12
12
  import SidenavDropdownItem from '../Sidenav/SidenavDropdownItem';
13
13
  import DisclosureContext, { DisclosureActionTypes } from '../Disclosure/DisclosureContext';
14
- import SafeAnchor from '../SafeAnchor';
15
14
  import NavContext from '../Nav/NavContext';
16
15
  import useInternalId from '../utils/useInternalId';
17
16
  import { DropdownActionType } from './DropdownState';
@@ -62,7 +61,8 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
62
61
 
63
62
  var handleClickNavbarDropdownItem = useCallback(function (event) {
64
63
  dispatchDisclosure === null || dispatchDisclosure === void 0 ? void 0 : dispatchDisclosure({
65
- type: DisclosureActionTypes.Hide
64
+ type: DisclosureActionTypes.Hide,
65
+ cascade: true
66
66
  });
67
67
  handleSelectItem === null || handleSelectItem === void 0 ? void 0 : handleSelectItem(event);
68
68
  }, [dispatchDisclosure, handleSelectItem]);
@@ -129,16 +129,16 @@ var DropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
129
129
  dataAttributes['data-event-key-type'] = typeof eventKey;
130
130
  }
131
131
 
132
- return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(SafeAnchor, _extends({
132
+ return renderDropdownItem(_extends({
133
133
  ref: ref,
134
134
  className: classes,
135
- "aria-current": selected || undefined
135
+ 'aria-current': selected || undefined
136
136
  }, dataAttributes, restProps, {
137
- as: Component,
138
- onClick: createChainedFunction(handleClickNavbarDropdownItem, restProps.onClick)
139
- }), icon && /*#__PURE__*/React.cloneElement(icon, {
140
- className: prefix('menu-icon')
141
- }), children));
137
+ onClick: createChainedFunction(handleClickNavbarDropdownItem, restProps.onClick),
138
+ children: /*#__PURE__*/React.createElement(React.Fragment, null, icon && /*#__PURE__*/React.cloneElement(icon, {
139
+ className: prefix('menu-icon')
140
+ }), children)
141
+ }));
142
142
  }
143
143
 
144
144
  return /*#__PURE__*/React.createElement(MenuItem, {