rsuite 5.4.0 → 5.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/Button/styles/index.less +1 -5
  2. package/CHANGELOG.md +38 -0
  3. package/CheckTreePicker/styles/index.less +1 -1
  4. package/Drawer/styles/index.less +3 -0
  5. package/Dropdown/styles/index.less +6 -22
  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/README.md +1 -1
  10. package/Sidenav/styles/index.less +8 -2
  11. package/cjs/Affix/Affix.js +3 -1
  12. package/cjs/AvatarGroup/AvatarGroup.js +9 -4
  13. package/cjs/ButtonGroup/ButtonGroup.js +9 -4
  14. package/cjs/Calendar/Calendar.js +21 -20
  15. package/cjs/Calendar/Header.js +1 -3
  16. package/cjs/Calendar/Table.js +1 -1
  17. package/cjs/Calendar/TableRow.js +12 -7
  18. package/cjs/Calendar/View.js +9 -5
  19. package/cjs/Calendar/useCalendarDate.d.ts +1 -1
  20. package/cjs/Calendar/useCalendarDate.js +1 -1
  21. package/cjs/Carousel/Carousel.js +7 -1
  22. package/cjs/Cascader/Cascader.js +13 -2
  23. package/cjs/CheckPicker/CheckPicker.d.ts +5 -2
  24. package/cjs/CheckPicker/test/CheckPicker.test.js +8 -0
  25. package/cjs/CheckTree/index.js +9 -4
  26. package/cjs/CheckTreePicker/CheckTreePicker.js +1 -1
  27. package/cjs/CheckTreePicker/utils.js +1 -1
  28. package/cjs/Container/Container.js +6 -3
  29. package/cjs/CustomProvider/CustomProvider.d.ts +14 -14
  30. package/cjs/CustomProvider/CustomProvider.js +4 -3
  31. package/cjs/DatePicker/DatePicker.d.ts +1 -1
  32. package/cjs/DatePicker/DatePicker.js +5 -5
  33. package/cjs/DateRangePicker/DateRangePicker.js +3 -3
  34. package/cjs/Disclosure/Disclosure.d.ts +8 -5
  35. package/cjs/Disclosure/Disclosure.js +51 -11
  36. package/cjs/Disclosure/DisclosureButton.d.ts +2 -2
  37. package/cjs/Disclosure/DisclosureContext.d.ts +6 -1
  38. package/cjs/Dropdown/Dropdown.js +1 -1
  39. package/cjs/Dropdown/DropdownItem.js +9 -10
  40. package/cjs/Dropdown/DropdownMenu.js +78 -26
  41. package/cjs/FormGroup/FormGroup.js +9 -4
  42. package/cjs/Menu/MenuItem.js +1 -1
  43. package/cjs/Modal/Modal.js +34 -22
  44. package/cjs/Modal/utils.js +16 -8
  45. package/cjs/MultiCascader/MultiCascader.js +6 -3
  46. package/cjs/Nav/Nav.js +10 -15
  47. package/cjs/Nav/NavItem.js +3 -1
  48. package/cjs/Navbar/index.d.ts +1 -0
  49. package/cjs/Navbar/index.js +4 -3
  50. package/cjs/Overlay/Modal.js +18 -32
  51. package/cjs/PanelGroup/PanelGroup.js +8 -5
  52. package/cjs/Picker/DropdownMenu.js +5 -0
  53. package/cjs/Picker/PickerToggle.js +2 -4
  54. package/cjs/SelectPicker/SelectPicker.d.ts +5 -2
  55. package/cjs/SelectPicker/test/SelectPicker.test.js +8 -0
  56. package/cjs/Toggle/Toggle.js +2 -1
  57. package/cjs/Tree/Tree.js +9 -4
  58. package/cjs/Uploader/UploadFileItem.d.ts +1 -1
  59. package/cjs/Uploader/UploadFileItem.js +1 -1
  60. package/cjs/Uploader/Uploader.js +3 -0
  61. package/cjs/utils/index.d.ts +1 -0
  62. package/cjs/utils/index.js +7 -2
  63. package/cjs/utils/propTypeChecker.d.ts +2 -6
  64. package/cjs/utils/propTypeChecker.js +7 -59
  65. package/cjs/utils/useClickOutside.js +6 -2
  66. package/cjs/utils/useMount.d.ts +2 -0
  67. package/cjs/utils/useMount.js +19 -0
  68. package/dist/rsuite-rtl.css +336 -180
  69. package/dist/rsuite-rtl.min.css +1 -1
  70. package/dist/rsuite-rtl.min.css.map +1 -1
  71. package/dist/rsuite.css +336 -180
  72. package/dist/rsuite.js +67 -45
  73. package/dist/rsuite.js.map +1 -1
  74. package/dist/rsuite.min.css +1 -1
  75. package/dist/rsuite.min.css.map +1 -1
  76. package/dist/rsuite.min.js +1 -1
  77. package/dist/rsuite.min.js.map +1 -1
  78. package/esm/Affix/Affix.js +4 -2
  79. package/esm/AvatarGroup/AvatarGroup.js +7 -4
  80. package/esm/ButtonGroup/ButtonGroup.js +7 -4
  81. package/esm/Calendar/Calendar.js +22 -21
  82. package/esm/Calendar/Header.js +1 -3
  83. package/esm/Calendar/Table.js +1 -1
  84. package/esm/Calendar/TableRow.js +13 -8
  85. package/esm/Calendar/View.js +10 -6
  86. package/esm/Calendar/useCalendarDate.d.ts +1 -1
  87. package/esm/Calendar/useCalendarDate.js +1 -1
  88. package/esm/Carousel/Carousel.js +9 -3
  89. package/esm/Cascader/Cascader.js +13 -2
  90. package/esm/CheckPicker/CheckPicker.d.ts +5 -2
  91. package/esm/CheckPicker/test/CheckPicker.test.js +7 -0
  92. package/esm/CheckTree/index.js +7 -4
  93. package/esm/CheckTreePicker/CheckTreePicker.js +1 -1
  94. package/esm/CheckTreePicker/utils.js +1 -1
  95. package/esm/Container/Container.js +7 -4
  96. package/esm/CustomProvider/CustomProvider.d.ts +14 -14
  97. package/esm/CustomProvider/CustomProvider.js +2 -2
  98. package/esm/DatePicker/DatePicker.d.ts +1 -1
  99. package/esm/DatePicker/DatePicker.js +5 -4
  100. package/esm/DateRangePicker/DateRangePicker.js +3 -3
  101. package/esm/Disclosure/Disclosure.d.ts +8 -5
  102. package/esm/Disclosure/Disclosure.js +52 -13
  103. package/esm/Disclosure/DisclosureButton.d.ts +2 -2
  104. package/esm/Disclosure/DisclosureContext.d.ts +6 -1
  105. package/esm/Dropdown/Dropdown.js +1 -1
  106. package/esm/Dropdown/DropdownItem.js +9 -9
  107. package/esm/Dropdown/DropdownMenu.js +79 -27
  108. package/esm/FormGroup/FormGroup.js +7 -4
  109. package/esm/Menu/MenuItem.js +1 -1
  110. package/esm/Modal/Modal.js +36 -24
  111. package/esm/Modal/utils.js +16 -8
  112. package/esm/MultiCascader/MultiCascader.js +6 -3
  113. package/esm/Nav/Nav.js +11 -16
  114. package/esm/Nav/NavItem.js +3 -1
  115. package/esm/Navbar/index.d.ts +1 -0
  116. package/esm/Navbar/index.js +1 -0
  117. package/esm/Overlay/Modal.js +19 -33
  118. package/esm/PanelGroup/PanelGroup.js +9 -6
  119. package/esm/Picker/DropdownMenu.js +5 -0
  120. package/esm/Picker/PickerToggle.js +2 -4
  121. package/esm/SelectPicker/SelectPicker.d.ts +5 -2
  122. package/esm/SelectPicker/test/SelectPicker.test.js +7 -0
  123. package/esm/Toggle/Toggle.js +2 -1
  124. package/esm/Tree/Tree.js +7 -4
  125. package/esm/Uploader/UploadFileItem.d.ts +1 -1
  126. package/esm/Uploader/UploadFileItem.js +1 -1
  127. package/esm/Uploader/Uploader.js +4 -1
  128. package/esm/utils/index.d.ts +1 -0
  129. package/esm/utils/index.js +2 -1
  130. package/esm/utils/propTypeChecker.d.ts +2 -6
  131. package/esm/utils/propTypeChecker.js +7 -59
  132. package/esm/utils/useClickOutside.js +6 -2
  133. package/esm/utils/useMount.d.ts +2 -0
  134. package/esm/utils/useMount.js +13 -0
  135. package/package.json +2 -2
  136. package/styles/color-modes/dark.less +1 -0
  137. package/styles/color-modes/high-contrast.less +1 -0
  138. package/styles/color-modes/light.less +1 -0
  139. package/styles/mixins/utilities.less +17 -5
@@ -185,7 +185,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
185
185
  }
186
186
 
187
187
  return isPlaintext ? '' : placeholder || rangeFormatStr;
188
- }, [character, formatDate, formatStr, placeholder, rangeFormatStr, renderValue, value]);
188
+ }, [character, formatDate, formatStr, placeholder, rangeFormatStr, renderValue]);
189
189
  /**
190
190
  * preset hover range
191
191
  */
@@ -237,7 +237,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
237
237
  if (closeOverlay !== false) {
238
238
  handleCloseDropdown();
239
239
  }
240
- }, [formatStr, handleCloseDropdown, onChange, selectedDates, setValue, value]);
240
+ }, [formatStr, handleCloseDropdown, onChange, setValue, value]);
241
241
  /**
242
242
  * Select the date range. If oneTap is not set, you need to click twice to select the start time and end time.
243
243
  * The MouseMove event is called between the first click and the second click to update the selection state.
@@ -267,7 +267,7 @@ var DateRangePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
267
267
  } else if (!isNil(nextHoverDateRange)) {
268
268
  setHoverDateRange(nextHoverDateRange);
269
269
  }
270
- }, [getHoverRangeValue, hoverRange]);
270
+ }, [getHoverRangeValue]);
271
271
  /**
272
272
  * Callback for selecting a date cell in the calendar grid
273
273
  */
@@ -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
  });
59
- var context = useMemo(function () {
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]);
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]);
66
- return /*#__PURE__*/React.createElement(DisclosureContext.Provider, {
67
- value: context
68
- }, children({
69
- open: open
70
- }, containerElementRef));
71
- }
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
+ }
72
105
 
106
+ return renderProps;
107
+ }, [open, trigger, onMouseOver, onMouseOut]);
108
+ return /*#__PURE__*/React.createElement(DisclosureContext.Provider, {
109
+ value: contextValue
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
  ];
@@ -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, {
@@ -2,9 +2,9 @@ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTempla
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
4
 
5
- var _templateObject, _templateObject2;
5
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
6
6
 
7
- import React, { useCallback, useContext } from 'react';
7
+ import React, { useCallback, useContext, useMemo } from 'react';
8
8
  import omit from 'lodash/omit';
9
9
  import Menu from '../Menu/Menu';
10
10
  import MenuItem from '../Menu/MenuItem';
@@ -15,8 +15,10 @@ import AngleLeft from '@rsuite/icons/legacy/AngleLeft';
15
15
  import AngleRight from '@rsuite/icons/legacy/AngleRight';
16
16
  import useCustom from '../utils/useCustom';
17
17
  import DropdownContext from './DropdownContext';
18
+ import { NavbarContext } from '../Navbar';
18
19
  import Menubar from '../Menu/Menubar';
19
20
  import SidenavDropdownMenu from '../Sidenav/SidenavDropdownMenu';
21
+ import Disclosure from '../Disclosure';
20
22
 
21
23
  /**
22
24
  * The <Dropdown.Menu> API
@@ -49,6 +51,7 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
49
51
 
50
52
  var dropdown = useContext(DropdownContext);
51
53
  var sidenav = useContext(SidenavContext);
54
+ var withinNavbar = Boolean(useContext(NavbarContext));
52
55
 
53
56
  var _useCustom = useCustom('DropdownMenu'),
54
57
  rtl = _useCustom.rtl;
@@ -69,17 +72,20 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
69
72
  var _useClassNames3 = useClassNames('dropdown-item'),
70
73
  mergeItemClassNames = _useClassNames3.merge,
71
74
  withItemClassPrefix = _useClassNames3.withClassPrefix,
72
- prefixItemClassName = _useClassNames3.prefix; // <Dropdown.Menu> is used outside of <Dropdown>
75
+ prefixItemClassName = _useClassNames3.prefix;
76
+
77
+ var contextValue = useMemo(function () {
78
+ return {
79
+ activeKey: activeKey,
80
+ onSelect: onSelect
81
+ };
82
+ }, [activeKey, onSelect]); // <Dropdown.Menu> is used outside of <Dropdown>
73
83
  // renders a vertical `menubar`
74
84
 
75
-
76
85
  if (!dropdown) {
77
86
  var classes = merge(props.className, withClassPrefix());
78
87
  return /*#__PURE__*/React.createElement(DropdownContext.Provider, {
79
- value: {
80
- activeKey: activeKey,
81
- onSelect: onSelect
82
- }
88
+ value: contextValue
83
89
  }, /*#__PURE__*/React.createElement(Menubar, {
84
90
  vertical: true,
85
91
  onActivateItem: function onActivateItem(event) {
@@ -110,22 +116,69 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
110
116
  disabled = _omit.disabled,
111
117
  menuProps = _objectWithoutPropertiesLoose(_omit, ["icon", "className", "disabled"]);
112
118
 
113
- var Icon = rtl ? AngleLeft : AngleRight;
119
+ var Icon = rtl ? AngleLeft : AngleRight; // Renders a disclosure when used within <Navbar>
120
+
121
+ if (withinNavbar) {
122
+ return /*#__PURE__*/React.createElement(Disclosure, {
123
+ hideOnClickOutside: true,
124
+ trigger: ['click', 'mouseover']
125
+ }, function (_ref, containerRef) {
126
+ var open = _ref.open,
127
+ props = _objectWithoutPropertiesLoose(_ref, ["open"]);
128
+
129
+ var classes = mergeItemClassNames(className, withItemClassPrefix({
130
+ disabled: disabled,
131
+ open: open,
132
+ submenu: true
133
+ }));
134
+ return /*#__PURE__*/React.createElement("li", _extends({
135
+ ref: mergeRefs(ref, containerRef),
136
+ className: classes
137
+ }, props), /*#__PURE__*/React.createElement(Disclosure.Button, null, function (_ref2, buttonRef) {
138
+ var open = _ref2.open,
139
+ buttonProps = _objectWithoutPropertiesLoose(_ref2, ["open"]);
140
+
141
+ var classes = mergeItemClassNames(className, prefixItemClassName(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))), withItemClassPrefix({
142
+ 'with-icon': icon,
143
+ open: open,
144
+ disabled: disabled
145
+ }));
146
+ return /*#__PURE__*/React.createElement("div", _extends({
147
+ ref: mergeRefs(buttonRef, buttonRef),
148
+ className: classes,
149
+ "data-event-key": eventKey,
150
+ "data-event-key-type": typeof eventKey
151
+ }, buttonProps), icon && /*#__PURE__*/React.cloneElement(icon, {
152
+ className: prefix('menu-icon')
153
+ }), title, /*#__PURE__*/React.createElement(Icon, {
154
+ className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
155
+ }));
156
+ }), /*#__PURE__*/React.createElement(Disclosure.Content, null, function (_ref3, elementRef) {
157
+ var open = _ref3.open;
158
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
159
+ return /*#__PURE__*/React.createElement("ul", _extends({
160
+ ref: elementRef,
161
+ className: menuClassName,
162
+ hidden: !open
163
+ }, menuProps), children);
164
+ }));
165
+ });
166
+ }
167
+
114
168
  return /*#__PURE__*/React.createElement(Menu, {
115
169
  openMenuOn: ['mouseover', 'click'],
116
- renderMenuButton: function renderMenuButton(_ref, buttonRef) {
117
- var open = _ref.open,
118
- menuButtonProps = _objectWithoutPropertiesLoose(_ref, ["open"]);
170
+ renderMenuButton: function renderMenuButton(_ref4, buttonRef) {
171
+ var open = _ref4.open,
172
+ menuButtonProps = _objectWithoutPropertiesLoose(_ref4, ["open"]);
119
173
 
120
174
  return /*#__PURE__*/React.createElement(MenuItem, {
121
175
  disabled: disabled
122
- }, function (_ref2, menuitemRef) {
123
- var selected = _ref2.selected,
124
- active = _ref2.active,
125
- menuitem = _objectWithoutPropertiesLoose(_ref2, ["selected", "active"]);
176
+ }, function (_ref5, menuitemRef) {
177
+ var selected = _ref5.selected,
178
+ active = _ref5.active,
179
+ menuitem = _objectWithoutPropertiesLoose(_ref5, ["selected", "active"]);
126
180
 
127
- var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))), // prefixItemClassName`submenu`,
128
- withItemClassPrefix({
181
+ var classes = mergeItemClassNames(className, prefixItemClassName(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose(["toggle"]))), withItemClassPrefix({
129
182
  'with-icon': icon,
130
183
  open: open,
131
184
  active: selected,
@@ -140,13 +193,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
140
193
  }, menuitem, omit(menuButtonProps, ['role'])), icon && /*#__PURE__*/React.cloneElement(icon, {
141
194
  className: prefix('menu-icon')
142
195
  }), title, /*#__PURE__*/React.createElement(Icon, {
143
- className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
196
+ className: prefix(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose(["toggle-icon"])))
144
197
  }));
145
198
  });
146
199
  },
147
- renderMenuPopup: function renderMenuPopup(_ref3, popupRef) {
148
- var open = _ref3.open,
149
- popupProps = _objectWithoutPropertiesLoose(_ref3, ["open"]);
200
+ renderMenuPopup: function renderMenuPopup(_ref6, popupRef) {
201
+ var open = _ref6.open,
202
+ popupProps = _objectWithoutPropertiesLoose(_ref6, ["open"]);
150
203
 
151
204
  var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
152
205
  return /*#__PURE__*/React.createElement("ul", _extends({
@@ -156,15 +209,14 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
156
209
  }, popupProps, menuProps), children);
157
210
  },
158
211
  onToggleMenu: handleToggleSubmenu
159
- }, function (_ref4, menuContainerRef) {
160
- var open = _ref4.open,
161
- menuContainer = _objectWithoutPropertiesLoose(_ref4, ["open"]);
212
+ }, function (_ref7, menuContainerRef) {
213
+ var open = _ref7.open,
214
+ menuContainer = _objectWithoutPropertiesLoose(_ref7, ["open"]);
162
215
 
163
216
  var classes = mergeItemClassNames(className, withItemClassPrefix({
164
217
  disabled: disabled,
165
218
  open: open,
166
- submenu: true // focus: hasFocus
167
-
219
+ submenu: true
168
220
  }));
169
221
  return /*#__PURE__*/React.createElement("li", _extends({
170
222
  ref: mergeRefs(ref, menuContainerRef),
@@ -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, { useMemo } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import { useClassNames } from '../utils';
6
6
  export var FormGroupContext = /*#__PURE__*/React.createContext({});
@@ -18,10 +18,13 @@ var FormGroup = /*#__PURE__*/React.forwardRef(function (props, ref) {
18
18
  merge = _useClassNames.merge;
19
19
 
20
20
  var classes = merge(className, withClassPrefix());
21
- return /*#__PURE__*/React.createElement(FormGroupContext.Provider, {
22
- value: {
21
+ var contextValue = useMemo(function () {
22
+ return {
23
23
  controlId: controlId
24
- }
24
+ };
25
+ }, [controlId]);
26
+ return /*#__PURE__*/React.createElement(FormGroupContext.Provider, {
27
+ value: contextValue
25
28
  }, /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
26
29
  ref: ref,
27
30
  className: classes,
@@ -42,7 +42,7 @@ function MenuItem(props) {
42
42
  id: menuitemRef.current.id
43
43
  });
44
44
  }
45
- }, [dispatch]); // Gain/release focus on mouseenter/mouseleave in `menu`
45
+ }, [dispatch, hasFocus]); // Gain/release focus on mouseenter/mouseleave in `menu`
46
46
 
47
47
  var handleMouseMove = useCallback(function () {
48
48
  if (!isNil(menuitemRef.current) && !hasFocus) {
@@ -4,14 +4,14 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
4
4
 
5
5
  var _templateObject, _templateObject2;
6
6
 
7
- import React, { useRef, useMemo, useState, useEffect, useCallback } from 'react';
7
+ import React, { useRef, useMemo, useState, useCallback } from 'react';
8
8
  import PropTypes from 'prop-types';
9
9
  import pick from 'lodash/pick';
10
10
  import on from 'dom-lib/on';
11
11
  import getAnimationEnd from 'dom-lib/getAnimationEnd';
12
12
  import BaseModal, { modalPropTypes } from '../Overlay/Modal';
13
13
  import Bounce from '../Animation/Bounce';
14
- import { useClassNames, mergeRefs, SIZE } from '../utils';
14
+ import { useClassNames, mergeRefs, SIZE, useWillUnmount } from '../utils';
15
15
  import ModalDialog, { modalDialogPropTypes } from './ModalDialog';
16
16
  import { ModalContext } from './ModalContext';
17
17
  import ModalBody from './ModalBody';
@@ -64,6 +64,10 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
64
64
  merge = _useClassNames.merge,
65
65
  prefix = _useClassNames.prefix;
66
66
 
67
+ var _useState = useState(false),
68
+ shake = _useState[0],
69
+ setShake = _useState[1];
70
+
67
71
  var classes = merge(className, prefix(size, {
68
72
  full: full
69
73
  }));
@@ -90,24 +94,6 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
90
94
  isDrawer: drawer
91
95
  };
92
96
  }, [dialogId, onClose, bodyStyles, drawer]);
93
-
94
- var _useState = useState(false),
95
- shake = _useState[0],
96
- setShake = _useState[1];
97
-
98
- var handleBackdropClick = useCallback(function () {
99
- // When the value of `backdrop` is `static`, a jitter animation will be added to the dialog when clicked.
100
- if (backdrop === 'static') {
101
- setShake(true);
102
-
103
- if (!transitionEndListener.current && dialogRef.current) {
104
- //fix: https://github.com/rsuite/rsuite/blob/a93d13c14fb20cc58204babe3331d3c3da3fe1fd/src/Modal/styles/index.less#L59
105
- transitionEndListener.current = on(dialogRef.current, getAnimationEnd(), function () {
106
- setShake(false);
107
- });
108
- }
109
- }
110
- }, [backdrop]);
111
97
  var handleExited = useCallback(function (node) {
112
98
  var _transitionEndListene;
113
99
 
@@ -124,11 +110,37 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
124
110
  onEntering === null || onEntering === void 0 ? void 0 : onEntering(node);
125
111
  onChangeBodyStyles(true);
126
112
  }, [onChangeBodyStyles, onEntering]);
127
- useEffect(function () {
113
+ var handleBackdropClick = useCallback(function (e) {
114
+ if (e.target !== e.currentTarget) {
115
+ return;
116
+ } // When the value of `backdrop` is `static`, a jitter animation will be added to the dialog when clicked.
117
+
118
+
119
+ if (backdrop === 'static') {
120
+ setShake(true);
121
+
122
+ if (!transitionEndListener.current && dialogRef.current) {
123
+ //fix: https://github.com/rsuite/rsuite/blob/a93d13c14fb20cc58204babe3331d3c3da3fe1fd/src/Modal/styles/index.less#L59
124
+ transitionEndListener.current = on(dialogRef.current, getAnimationEnd(), function () {
125
+ setShake(false);
126
+ });
127
+ }
128
+
129
+ return;
130
+ }
131
+
132
+ onClose === null || onClose === void 0 ? void 0 : onClose(e);
133
+ }, [backdrop, onClose]);
134
+ var handleClick = useCallback(function (e) {
135
+ if (dialogRef.current && e.target !== dialogRef.current) {
136
+ handleBackdropClick(e);
137
+ }
138
+ }, [handleBackdropClick]);
139
+ useWillUnmount(function () {
128
140
  var _transitionEndListene2;
129
141
 
130
142
  (_transitionEndListene2 = transitionEndListener.current) === null || _transitionEndListene2 === void 0 ? void 0 : _transitionEndListene2.off();
131
- }, []);
143
+ });
132
144
  return /*#__PURE__*/React.createElement(ModalContext.Provider, {
133
145
  value: modalContextValue
134
146
  }, /*#__PURE__*/React.createElement(BaseModal, _extends({}, rest, {
@@ -136,7 +148,6 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
136
148
  backdrop: backdrop,
137
149
  open: open,
138
150
  onClose: onClose,
139
- onBackdropClick: handleBackdropClick,
140
151
  className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["wrapper"]))),
141
152
  onEntered: handleEntered,
142
153
  onEntering: handleEntering,
@@ -149,7 +160,8 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
149
160
  transition: animation ? animation : undefined,
150
161
  animationProps: animationProps,
151
162
  dialogTransitionTimeout: animationTimeout,
152
- backdropTransitionTimeout: 150
163
+ backdropTransitionTimeout: 150,
164
+ onClick: backdrop ? handleClick : undefined
153
165
  }), function (transitionProps, transitionRef) {
154
166
  var transitionClassName = transitionProps.className,
155
167
  transitionRest = _objectWithoutPropertiesLoose(transitionProps, ["className"]);
@@ -45,20 +45,28 @@ export var useBodyStyles = function useBodyStyles(ref, options) {
45
45
 
46
46
  (_windowResizeListener = windowResizeListener.current) === null || _windowResizeListener === void 0 ? void 0 : (_windowResizeListener2 = _windowResizeListener.off) === null || _windowResizeListener2 === void 0 ? void 0 : _windowResizeListener2.call(_windowResizeListener);
47
47
  (_contentElementResize = contentElementResizeObserver.current) === null || _contentElementResize === void 0 ? void 0 : _contentElementResize.disconnect();
48
+ windowResizeListener.current = null;
49
+ contentElementResizeObserver.current = null;
48
50
  }, []);
49
51
  var onChangeBodyStyles = useCallback(function (entering) {
50
- if (overflow && !drawer) {
52
+ if (overflow && !drawer && ref.current) {
51
53
  updateBodyStyles(undefined, entering);
52
54
  contentElement.current = ref.current.querySelector("." + prefix('content'));
53
- windowResizeListener.current = on(window, 'resize', updateBodyStyles);
54
- contentElementResizeObserver.current = new ResizeObserver(function () {
55
- return updateBodyStyles();
56
- });
57
- contentElementResizeObserver.current.observe(contentElement.current);
55
+
56
+ if (!windowResizeListener.current) {
57
+ windowResizeListener.current = on(window, 'resize', updateBodyStyles);
58
+ }
59
+
60
+ if (contentElement.current && !contentElementResizeObserver.current) {
61
+ contentElementResizeObserver.current = new ResizeObserver(function () {
62
+ return updateBodyStyles();
63
+ });
64
+ contentElementResizeObserver.current.observe(contentElement.current);
65
+ }
58
66
  }
59
67
  }, [drawer, overflow, prefix, ref, updateBodyStyles]);
60
68
  useEffect(function () {
61
- onDestroyEvents();
62
- }, [onDestroyEvents]);
69
+ return onDestroyEvents; // eslint-disable-next-line react-hooks/exhaustive-deps
70
+ }, []);
63
71
  return [overflow ? bodyStyles : {}, onChangeBodyStyles, onDestroyEvents];
64
72
  };
@@ -196,8 +196,11 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
196
196
  children.then(function (data) {
197
197
  node.loading = false;
198
198
  node[childrenKey] = data;
199
- addFlattenData(data, node);
200
- addColumn(data, cascadePaths.length);
199
+
200
+ if (targetRef.current) {
201
+ addFlattenData(data, node);
202
+ addColumn(data, cascadePaths.length);
203
+ }
201
204
  });
202
205
  } else {
203
206
  node.loading = false;
@@ -234,7 +237,7 @@ var MultiCascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
234
237
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextValue, node, checked, event);
235
238
  }, [cascade, onChange, onCheck, setValue, splitValue, value, valueKey]);
236
239
  var handleClean = useCallback(function (event) {
237
- if (disabled) {
240
+ if (disabled || !targetRef.current) {
238
241
  return;
239
242
  }
240
243