rsuite 5.4.1 → 5.4.2

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 (46) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/Modal/styles/index.less +23 -22
  3. package/Navbar/styles/index.less +12 -5
  4. package/cjs/Affix/Affix.js +3 -1
  5. package/cjs/Disclosure/Disclosure.d.ts +8 -5
  6. package/cjs/Disclosure/Disclosure.js +49 -9
  7. package/cjs/Disclosure/DisclosureButton.d.ts +2 -2
  8. package/cjs/Disclosure/DisclosureContext.d.ts +6 -1
  9. package/cjs/Dropdown/Dropdown.js +1 -1
  10. package/cjs/Dropdown/DropdownItem.js +9 -10
  11. package/cjs/Dropdown/DropdownMenu.js +72 -17
  12. package/cjs/Modal/Modal.js +34 -22
  13. package/cjs/Navbar/index.d.ts +1 -0
  14. package/cjs/Navbar/index.js +4 -3
  15. package/cjs/Overlay/Modal.js +10 -27
  16. package/cjs/utils/index.d.ts +1 -0
  17. package/cjs/utils/index.js +7 -2
  18. package/cjs/utils/useMount.d.ts +2 -0
  19. package/cjs/utils/useMount.js +19 -0
  20. package/dist/rsuite-rtl.css +32 -20
  21. package/dist/rsuite-rtl.min.css +1 -1
  22. package/dist/rsuite-rtl.min.css.map +1 -1
  23. package/dist/rsuite.css +32 -20
  24. package/dist/rsuite.js +31 -9
  25. package/dist/rsuite.js.map +1 -1
  26. package/dist/rsuite.min.css +1 -1
  27. package/dist/rsuite.min.css.map +1 -1
  28. package/dist/rsuite.min.js +1 -1
  29. package/dist/rsuite.min.js.map +1 -1
  30. package/esm/Affix/Affix.js +4 -2
  31. package/esm/Disclosure/Disclosure.d.ts +8 -5
  32. package/esm/Disclosure/Disclosure.js +50 -11
  33. package/esm/Disclosure/DisclosureButton.d.ts +2 -2
  34. package/esm/Disclosure/DisclosureContext.d.ts +6 -1
  35. package/esm/Dropdown/Dropdown.js +1 -1
  36. package/esm/Dropdown/DropdownItem.js +9 -9
  37. package/esm/Dropdown/DropdownMenu.js +72 -17
  38. package/esm/Modal/Modal.js +36 -24
  39. package/esm/Navbar/index.d.ts +1 -0
  40. package/esm/Navbar/index.js +1 -0
  41. package/esm/Overlay/Modal.js +10 -27
  42. package/esm/utils/index.d.ts +1 -0
  43. package/esm/utils/index.js +2 -1
  44. package/esm/utils/useMount.d.ts +2 -0
  45. package/esm/utils/useMount.js +13 -0
  46. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [5.4.2](https://github.com/rsuite/rsuite/compare/v5.4.1...v5.4.2) (2021-12-24)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **Affix:** fix unupdated position after window size change ([#2256](https://github.com/rsuite/rsuite/issues/2256)) ([61c7b27](https://github.com/rsuite/rsuite/commit/61c7b279f136ae44b9470046344cd6e163d02589))
6
+ - **Modal:** improve the mouse scrolling experience on Modal ([#2254](https://github.com/rsuite/rsuite/issues/2254)) ([137d57e](https://github.com/rsuite/rsuite/commit/137d57ef1e79ca0055b3af8d6cd5cff2a9c4ef55))
7
+ - **Navbar:** fix dropdown submenu throwing error ([#2250](https://github.com/rsuite/rsuite/issues/2250)) ([875130d](https://github.com/rsuite/rsuite/commit/875130d342f58e4078babe428913640e0b2faa04))
8
+
1
9
  ## [5.4.1](https://github.com/rsuite/rsuite/compare/v5.4.0...v5.4.1) (2021-12-23)
2
10
 
3
11
  ### Bug Fixes
@@ -5,6 +5,27 @@
5
5
  // Modals
6
6
  // --------------------------------------------------
7
7
 
8
+ // Modal background
9
+ .rs-modal-backdrop {
10
+ position: fixed;
11
+ top: 0;
12
+ left: 0;
13
+ width: 100vw;
14
+ height: 100vh;
15
+ z-index: @zindex-modal - 1;
16
+ background-color: var(--rs-bg-backdrop);
17
+
18
+ // Fade for backdrop
19
+ &.rs-anim-fade {
20
+ opacity: 0;
21
+ transition: opacity 0.3s ease-in;
22
+ }
23
+
24
+ &.rs-anim-in {
25
+ opacity: 1;
26
+ }
27
+ }
28
+
8
29
  // Kill the scroll on the body
9
30
  .rs-modal-open {
10
31
  overflow: hidden;
@@ -15,9 +36,9 @@
15
36
  overflow: auto;
16
37
  z-index: @zindex-modal;
17
38
  top: 0;
18
- bottom: 0;
19
- right: 0;
20
39
  left: 0;
40
+ width: 100%;
41
+ height: 100%;
21
42
  }
22
43
 
23
44
  // Container that the modal scrolls within
@@ -71,26 +92,6 @@
71
92
  padding: @modal-content-padding;
72
93
  }
73
94
 
74
- // Modal background
75
- .rs-modal-backdrop {
76
- position: fixed;
77
- top: 0;
78
- right: 0;
79
- bottom: 0;
80
- left: 0;
81
- background-color: var(--rs-bg-backdrop);
82
-
83
- // Fade for backdrop
84
- &.rs-anim-fade {
85
- opacity: 0;
86
- transition: opacity 0.3s ease-in;
87
- }
88
-
89
- &.rs-anim-in {
90
- opacity: 1;
91
- }
92
- }
93
-
94
95
  // Modal header
95
96
  // Top section of the modal w/ title and dismiss
96
97
  .rs-modal-header {
@@ -1,4 +1,5 @@
1
1
  @import '../../styles/common';
2
+ @import '../../Dropdown/styles/index';
2
3
 
3
4
  // NavBar
4
5
  // --------------------------------------------------
@@ -97,7 +98,13 @@
97
98
  margin: 0 !important;
98
99
  }
99
100
 
100
- // DropDown
101
+ .rs-navbar-item.rs-navbar-item-active {
102
+ .high-contrast-mode({
103
+ text-decoration: underline;
104
+ });
105
+ }
106
+
107
+ // Dropdown
101
108
  .rs-navbar-nav > .rs-dropdown .rs-dropdown-toggle {
102
109
  &:extend(.rs-navbar-item);
103
110
 
@@ -117,10 +124,10 @@
117
124
  }
118
125
  }
119
126
 
120
- .rs-navbar-item.rs-navbar-item-active {
121
- .high-contrast-mode({
122
- text-decoration: underline;
123
- });
127
+ .rs-navbar .rs-dropdown-item {
128
+ &:hover {
129
+ .menuitem-active();
130
+ }
124
131
  }
125
132
 
126
133
  // Default Navbar
@@ -35,7 +35,9 @@ function useOffset(mountRef) {
35
35
  return mountRef.current;
36
36
  }, updateOffset); // Initialize after the first render
37
37
 
38
- (0, _react.useEffect)(updateOffset, [updateOffset]);
38
+ (0, _utils.useMount)(updateOffset); // Update after window size changes
39
+
40
+ (0, _utils.useEventListener)(window, 'resize', updateOffset, false);
39
41
  return offset;
40
42
  }
41
43
  /**
@@ -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;
@@ -41,14 +41,17 @@ function disclosureReducer(state, action) {
41
41
  return state;
42
42
  }
43
43
 
44
- function Disclosure(props) {
44
+ var Disclosure = /*#__PURE__*/_react.default.memo(function (props) {
45
45
  var children = props.children,
46
46
  openProp = props.open,
47
47
  _props$defaultOpen = props.defaultOpen,
48
48
  defaultOpen = _props$defaultOpen === void 0 ? false : _props$defaultOpen,
49
49
  _props$hideOnClickOut = props.hideOnClickOutside,
50
50
  hideOnClickOutside = _props$hideOnClickOut === void 0 ? false : _props$hideOnClickOut,
51
- onToggle = props.onToggle;
51
+ onToggle = props.onToggle,
52
+ _props$trigger = props.trigger,
53
+ trigger = _props$trigger === void 0 ? ['click'] : _props$trigger;
54
+ var parentDisclosure = (0, _react.useContext)(_DisclosureContext.default);
52
55
 
53
56
  var _useReducer = (0, _react.useReducer)(disclosureReducer, (0, _extends2.default)({}, initialDisclosureState, {
54
57
  open: defaultOpen
@@ -71,19 +74,56 @@ function Disclosure(props) {
71
74
  });
72
75
  }
73
76
  });
77
+ var onMouseOver = (0, _react.useCallback)(function (event) {
78
+ if (!open) {
79
+ dispatch({
80
+ type: _DisclosureContext.DisclosureActionTypes.Show
81
+ });
82
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(true, event);
83
+ }
84
+ }, [open, dispatch, onToggle]);
85
+ var onMouseOut = (0, _react.useCallback)(function (event) {
86
+ if (open) {
87
+ dispatch({
88
+ type: _DisclosureContext.DisclosureActionTypes.Hide
89
+ });
90
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(false, event);
91
+ }
92
+ }, [open, dispatch, onToggle]);
74
93
  var contextValue = (0, _react.useMemo)(function () {
94
+ var cascadeDispatch = function cascadeDispatch(action) {
95
+ var result = dispatch(action);
96
+
97
+ if ('cascade' in action) {
98
+ parentDisclosure === null || parentDisclosure === void 0 ? void 0 : parentDisclosure[1](action);
99
+ }
100
+
101
+ return result;
102
+ };
103
+
75
104
  return [{
76
105
  open: open
77
- }, dispatch, {
78
- onToggle: onToggle
106
+ }, cascadeDispatch, {
107
+ onToggle: onToggle,
108
+ trigger: trigger
79
109
  }];
80
- }, [open, dispatch, onToggle]);
110
+ }, [parentDisclosure, open, dispatch, onToggle, trigger]);
111
+ var renderProps = (0, _react.useMemo)(function () {
112
+ var renderProps = {
113
+ open: open
114
+ };
115
+
116
+ if (trigger.includes('mouseover')) {
117
+ renderProps.onMouseOver = onMouseOver;
118
+ renderProps.onMouseOut = onMouseOut;
119
+ }
120
+
121
+ return renderProps;
122
+ }, [open, trigger, onMouseOver, onMouseOut]);
81
123
  return /*#__PURE__*/_react.default.createElement(_DisclosureContext.default.Provider, {
82
124
  value: contextValue
83
- }, children({
84
- open: open
85
- }, containerElementRef));
86
- }
125
+ }, children(renderProps, containerElementRef));
126
+ });
87
127
 
88
128
  Disclosure.Button = _DisclosureButton.default;
89
129
  Disclosure.Content = _DisclosureContent.default;
@@ -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
  ];
@@ -41,7 +41,7 @@ var _MenuItem = _interopRequireDefault(require("../Menu/MenuItem"));
41
41
 
42
42
  var _kebabCase = _interopRequireDefault(require("lodash/kebabCase"));
43
43
 
44
- var _Navbar = require("../Navbar/Navbar");
44
+ var _Navbar = require("../Navbar");
45
45
 
46
46
  var _Disclosure = _interopRequireDefault(require("../Disclosure/Disclosure"));
47
47
 
@@ -33,8 +33,6 @@ var _SidenavDropdownItem = _interopRequireDefault(require("../Sidenav/SidenavDro
33
33
 
34
34
  var _DisclosureContext = _interopRequireWildcard(require("../Disclosure/DisclosureContext"));
35
35
 
36
- var _SafeAnchor = _interopRequireDefault(require("../SafeAnchor"));
37
-
38
36
  var _NavContext = _interopRequireDefault(require("../Nav/NavContext"));
39
37
 
40
38
  var _useInternalId = _interopRequireDefault(require("../utils/useInternalId"));
@@ -87,7 +85,8 @@ var DropdownItem = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
87
85
 
88
86
  var handleClickNavbarDropdownItem = (0, _react.useCallback)(function (event) {
89
87
  dispatchDisclosure === null || dispatchDisclosure === void 0 ? void 0 : dispatchDisclosure({
90
- type: _DisclosureContext.DisclosureActionTypes.Hide
88
+ type: _DisclosureContext.DisclosureActionTypes.Hide,
89
+ cascade: true
91
90
  });
92
91
  handleSelectItem === null || handleSelectItem === void 0 ? void 0 : handleSelectItem(event);
93
92
  }, [dispatchDisclosure, handleSelectItem]);
@@ -154,16 +153,16 @@ var DropdownItem = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
154
153
  dataAttributes['data-event-key-type'] = typeof eventKey;
155
154
  }
156
155
 
157
- return /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement(_SafeAnchor.default, (0, _extends2.default)({
156
+ return renderDropdownItem((0, _extends2.default)({
158
157
  ref: ref,
159
158
  className: classes,
160
- "aria-current": selected || undefined
159
+ 'aria-current': selected || undefined
161
160
  }, dataAttributes, restProps, {
162
- as: Component,
163
- onClick: (0, _utils.createChainedFunction)(handleClickNavbarDropdownItem, restProps.onClick)
164
- }), icon && /*#__PURE__*/_react.default.cloneElement(icon, {
165
- className: prefix('menu-icon')
166
- }), children));
161
+ onClick: (0, _utils.createChainedFunction)(handleClickNavbarDropdownItem, restProps.onClick),
162
+ children: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, icon && /*#__PURE__*/_react.default.cloneElement(icon, {
163
+ className: prefix('menu-icon')
164
+ }), children)
165
+ }));
167
166
  }
168
167
 
169
168
  return /*#__PURE__*/_react.default.createElement(_MenuItem.default, {
@@ -35,11 +35,15 @@ var _useCustom2 = _interopRequireDefault(require("../utils/useCustom"));
35
35
 
36
36
  var _DropdownContext = _interopRequireDefault(require("./DropdownContext"));
37
37
 
38
+ var _Navbar = require("../Navbar");
39
+
38
40
  var _Menubar = _interopRequireDefault(require("../Menu/Menubar"));
39
41
 
40
42
  var _SidenavDropdownMenu = _interopRequireDefault(require("../Sidenav/SidenavDropdownMenu"));
41
43
 
42
- var _templateObject, _templateObject2;
44
+ var _Disclosure = _interopRequireDefault(require("../Disclosure"));
45
+
46
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4;
43
47
 
44
48
  /**
45
49
  * The <Dropdown.Menu> API
@@ -71,6 +75,7 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
71
75
  rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["onToggle", "eventKey", "title", "activeKey", "onSelect", "classPrefix", "children"]);
72
76
  var dropdown = (0, _react.useContext)(_DropdownContext.default);
73
77
  var sidenav = (0, _react.useContext)(_Sidenav.SidenavContext);
78
+ var withinNavbar = Boolean((0, _react.useContext)(_Navbar.NavbarContext));
74
79
 
75
80
  var _useCustom = (0, _useCustom2.default)('DropdownMenu'),
76
81
  rtl = _useCustom.rtl;
@@ -135,19 +140,69 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
135
140
  disabled = _omit.disabled,
136
141
  menuProps = (0, _objectWithoutPropertiesLoose2.default)(_omit, ["icon", "className", "disabled"]);
137
142
 
138
- var Icon = rtl ? _AngleLeft.default : _AngleRight.default;
143
+ var Icon = rtl ? _AngleLeft.default : _AngleRight.default; // Renders a disclosure when used within <Navbar>
144
+
145
+ if (withinNavbar) {
146
+ return /*#__PURE__*/_react.default.createElement(_Disclosure.default, {
147
+ hideOnClickOutside: true,
148
+ trigger: ['click', 'mouseover']
149
+ }, function (_ref, containerRef) {
150
+ var open = _ref.open,
151
+ props = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["open"]);
152
+ var classes = mergeItemClassNames(className, withItemClassPrefix({
153
+ disabled: disabled,
154
+ open: open,
155
+ submenu: true // focus: hasFocus
156
+
157
+ }));
158
+ return /*#__PURE__*/_react.default.createElement("li", (0, _extends2.default)({
159
+ ref: (0, _utils.mergeRefs)(ref, containerRef),
160
+ className: classes
161
+ }, props), /*#__PURE__*/_react.default.createElement(_Disclosure.default.Button, null, function (_ref2, buttonRef) {
162
+ var open = _ref2.open,
163
+ buttonProps = (0, _objectWithoutPropertiesLoose2.default)(_ref2, ["open"]);
164
+ var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["toggle"]))), // prefixItemClassName`submenu`,
165
+ withItemClassPrefix({
166
+ 'with-icon': icon,
167
+ open: open,
168
+ // active: selected,
169
+ disabled: disabled // focus: active
170
+
171
+ }));
172
+ return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
173
+ ref: (0, _utils.mergeRefs)(buttonRef, buttonRef),
174
+ className: classes,
175
+ "data-event-key": eventKey,
176
+ "data-event-key-type": typeof eventKey
177
+ }, buttonProps), icon && /*#__PURE__*/_react.default.cloneElement(icon, {
178
+ className: prefix('menu-icon')
179
+ }), title, /*#__PURE__*/_react.default.createElement(Icon, {
180
+ className: prefix(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["toggle-icon"])))
181
+ }));
182
+ }), /*#__PURE__*/_react.default.createElement(_Disclosure.default.Content, null, function (_ref3, elementRef) {
183
+ var open = _ref3.open;
184
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
185
+ return /*#__PURE__*/_react.default.createElement("ul", (0, _extends2.default)({
186
+ ref: elementRef,
187
+ className: menuClassName,
188
+ hidden: !open
189
+ }, menuProps), children);
190
+ }));
191
+ });
192
+ }
193
+
139
194
  return /*#__PURE__*/_react.default.createElement(_Menu.default, {
140
195
  openMenuOn: ['mouseover', 'click'],
141
- renderMenuButton: function renderMenuButton(_ref, buttonRef) {
142
- var open = _ref.open,
143
- menuButtonProps = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["open"]);
196
+ renderMenuButton: function renderMenuButton(_ref4, buttonRef) {
197
+ var open = _ref4.open,
198
+ menuButtonProps = (0, _objectWithoutPropertiesLoose2.default)(_ref4, ["open"]);
144
199
  return /*#__PURE__*/_react.default.createElement(_MenuItem.default, {
145
200
  disabled: disabled
146
- }, function (_ref2, menuitemRef) {
147
- var selected = _ref2.selected,
148
- active = _ref2.active,
149
- menuitem = (0, _objectWithoutPropertiesLoose2.default)(_ref2, ["selected", "active"]);
150
- var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["toggle"]))), // prefixItemClassName`submenu`,
201
+ }, function (_ref5, menuitemRef) {
202
+ var selected = _ref5.selected,
203
+ active = _ref5.active,
204
+ menuitem = (0, _objectWithoutPropertiesLoose2.default)(_ref5, ["selected", "active"]);
205
+ var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteralLoose2.default)(["toggle"]))), // prefixItemClassName`submenu`,
151
206
  withItemClassPrefix({
152
207
  'with-icon': icon,
153
208
  open: open,
@@ -163,13 +218,13 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
163
218
  }, menuitem, (0, _omit2.default)(menuButtonProps, ['role'])), icon && /*#__PURE__*/_react.default.cloneElement(icon, {
164
219
  className: prefix('menu-icon')
165
220
  }), title, /*#__PURE__*/_react.default.createElement(Icon, {
166
- className: prefix(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["toggle-icon"])))
221
+ className: prefix(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteralLoose2.default)(["toggle-icon"])))
167
222
  }));
168
223
  });
169
224
  },
170
- renderMenuPopup: function renderMenuPopup(_ref3, popupRef) {
171
- var open = _ref3.open,
172
- popupProps = (0, _objectWithoutPropertiesLoose2.default)(_ref3, ["open"]);
225
+ renderMenuPopup: function renderMenuPopup(_ref6, popupRef) {
226
+ var open = _ref6.open,
227
+ popupProps = (0, _objectWithoutPropertiesLoose2.default)(_ref6, ["open"]);
173
228
  var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
174
229
  return /*#__PURE__*/_react.default.createElement("ul", (0, _extends2.default)({
175
230
  ref: popupRef,
@@ -178,9 +233,9 @@ var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref)
178
233
  }, popupProps, menuProps), children);
179
234
  },
180
235
  onToggleMenu: handleToggleSubmenu
181
- }, function (_ref4, menuContainerRef) {
182
- var open = _ref4.open,
183
- menuContainer = (0, _objectWithoutPropertiesLoose2.default)(_ref4, ["open"]);
236
+ }, function (_ref7, menuContainerRef) {
237
+ var open = _ref7.open,
238
+ menuContainer = (0, _objectWithoutPropertiesLoose2.default)(_ref7, ["open"]);
184
239
  var classes = mergeItemClassNames(className, withItemClassPrefix({
185
240
  disabled: disabled,
186
241
  open: open,
@@ -90,6 +90,10 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
90
90
  merge = _useClassNames.merge,
91
91
  prefix = _useClassNames.prefix;
92
92
 
93
+ var _useState = (0, _react.useState)(false),
94
+ shake = _useState[0],
95
+ setShake = _useState[1];
96
+
93
97
  var classes = merge(className, prefix(size, {
94
98
  full: full
95
99
  }));
@@ -116,24 +120,6 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
116
120
  isDrawer: drawer
117
121
  };
118
122
  }, [dialogId, onClose, bodyStyles, drawer]);
119
-
120
- var _useState = (0, _react.useState)(false),
121
- shake = _useState[0],
122
- setShake = _useState[1];
123
-
124
- var handleBackdropClick = (0, _react.useCallback)(function () {
125
- // When the value of `backdrop` is `static`, a jitter animation will be added to the dialog when clicked.
126
- if (backdrop === 'static') {
127
- setShake(true);
128
-
129
- if (!transitionEndListener.current && dialogRef.current) {
130
- //fix: https://github.com/rsuite/rsuite/blob/a93d13c14fb20cc58204babe3331d3c3da3fe1fd/src/Modal/styles/index.less#L59
131
- transitionEndListener.current = (0, _on.default)(dialogRef.current, (0, _getAnimationEnd.default)(), function () {
132
- setShake(false);
133
- });
134
- }
135
- }
136
- }, [backdrop]);
137
123
  var handleExited = (0, _react.useCallback)(function (node) {
138
124
  var _transitionEndListene;
139
125
 
@@ -150,11 +136,37 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
150
136
  onEntering === null || onEntering === void 0 ? void 0 : onEntering(node);
151
137
  onChangeBodyStyles(true);
152
138
  }, [onChangeBodyStyles, onEntering]);
153
- (0, _react.useEffect)(function () {
139
+ var handleBackdropClick = (0, _react.useCallback)(function (e) {
140
+ if (e.target !== e.currentTarget) {
141
+ return;
142
+ } // When the value of `backdrop` is `static`, a jitter animation will be added to the dialog when clicked.
143
+
144
+
145
+ if (backdrop === 'static') {
146
+ setShake(true);
147
+
148
+ if (!transitionEndListener.current && dialogRef.current) {
149
+ //fix: https://github.com/rsuite/rsuite/blob/a93d13c14fb20cc58204babe3331d3c3da3fe1fd/src/Modal/styles/index.less#L59
150
+ transitionEndListener.current = (0, _on.default)(dialogRef.current, (0, _getAnimationEnd.default)(), function () {
151
+ setShake(false);
152
+ });
153
+ }
154
+
155
+ return;
156
+ }
157
+
158
+ onClose === null || onClose === void 0 ? void 0 : onClose(e);
159
+ }, [backdrop, onClose]);
160
+ var handleClick = (0, _react.useCallback)(function (e) {
161
+ if (dialogRef.current && e.target !== dialogRef.current) {
162
+ handleBackdropClick(e);
163
+ }
164
+ }, [handleBackdropClick]);
165
+ (0, _utils.useWillUnmount)(function () {
154
166
  var _transitionEndListene2;
155
167
 
156
168
  (_transitionEndListene2 = transitionEndListener.current) === null || _transitionEndListene2 === void 0 ? void 0 : _transitionEndListene2.off();
157
- }, []);
169
+ });
158
170
  return /*#__PURE__*/_react.default.createElement(_ModalContext.ModalContext.Provider, {
159
171
  value: modalContextValue
160
172
  }, /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, rest, {
@@ -162,7 +174,6 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
162
174
  backdrop: backdrop,
163
175
  open: open,
164
176
  onClose: onClose,
165
- onBackdropClick: handleBackdropClick,
166
177
  className: prefix(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["wrapper"]))),
167
178
  onEntered: handleEntered,
168
179
  onEntering: handleEntering,
@@ -175,7 +186,8 @@ var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
175
186
  transition: animation ? animation : undefined,
176
187
  animationProps: animationProps,
177
188
  dialogTransitionTimeout: animationTimeout,
178
- backdropTransitionTimeout: 150
189
+ backdropTransitionTimeout: 150,
190
+ onClick: backdrop ? handleClick : undefined
179
191
  }), function (transitionProps, transitionRef) {
180
192
  var transitionClassName = transitionProps.className,
181
193
  transitionRest = (0, _objectWithoutPropertiesLoose2.default)(transitionProps, ["className"]);
@@ -3,4 +3,5 @@ export type { NavbarProps } from './Navbar';
3
3
  export type { NavbarBodyProps } from './NavbarBody';
4
4
  export type { NavbarHeaderProps } from './NavbarHeader';
5
5
  export type { NavbarBrandProps } from './NavbarBrand';
6
+ export { NavbarContext } from './Navbar';
6
7
  export default Navbar;
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
4
 
5
5
  exports.__esModule = true;
6
- exports.default = void 0;
6
+ exports.default = exports.NavbarContext = void 0;
7
7
 
8
- var _Navbar = _interopRequireDefault(require("./Navbar"));
8
+ var _Navbar = _interopRequireWildcard(require("./Navbar"));
9
9
 
10
+ exports.NavbarContext = _Navbar.NavbarContext;
10
11
  var _default = _Navbar.default;
11
12
  exports.default = _default;