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
@@ -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,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
  ];
@@ -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,7 +2,7 @@ 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
7
  import React, { useCallback, useContext, useMemo } from 'react';
8
8
  import omit from 'lodash/omit';
@@ -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;
@@ -113,21 +116,73 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
113
116
  disabled = _omit.disabled,
114
117
  menuProps = _objectWithoutPropertiesLoose(_omit, ["icon", "className", "disabled"]);
115
118
 
116
- 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 // focus: hasFocus
133
+
134
+ }));
135
+ return /*#__PURE__*/React.createElement("li", _extends({
136
+ ref: mergeRefs(ref, containerRef),
137
+ className: classes
138
+ }, props), /*#__PURE__*/React.createElement(Disclosure.Button, null, function (_ref2, buttonRef) {
139
+ var open = _ref2.open,
140
+ buttonProps = _objectWithoutPropertiesLoose(_ref2, ["open"]);
141
+
142
+ var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))), // prefixItemClassName`submenu`,
143
+ withItemClassPrefix({
144
+ 'with-icon': icon,
145
+ open: open,
146
+ // active: selected,
147
+ disabled: disabled // focus: active
148
+
149
+ }));
150
+ return /*#__PURE__*/React.createElement("div", _extends({
151
+ ref: mergeRefs(buttonRef, buttonRef),
152
+ className: classes,
153
+ "data-event-key": eventKey,
154
+ "data-event-key-type": typeof eventKey
155
+ }, buttonProps), icon && /*#__PURE__*/React.cloneElement(icon, {
156
+ className: prefix('menu-icon')
157
+ }), title, /*#__PURE__*/React.createElement(Icon, {
158
+ className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
159
+ }));
160
+ }), /*#__PURE__*/React.createElement(Disclosure.Content, null, function (_ref3, elementRef) {
161
+ var open = _ref3.open;
162
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
163
+ return /*#__PURE__*/React.createElement("ul", _extends({
164
+ ref: elementRef,
165
+ className: menuClassName,
166
+ hidden: !open
167
+ }, menuProps), children);
168
+ }));
169
+ });
170
+ }
171
+
117
172
  return /*#__PURE__*/React.createElement(Menu, {
118
173
  openMenuOn: ['mouseover', 'click'],
119
- renderMenuButton: function renderMenuButton(_ref, buttonRef) {
120
- var open = _ref.open,
121
- menuButtonProps = _objectWithoutPropertiesLoose(_ref, ["open"]);
174
+ renderMenuButton: function renderMenuButton(_ref4, buttonRef) {
175
+ var open = _ref4.open,
176
+ menuButtonProps = _objectWithoutPropertiesLoose(_ref4, ["open"]);
122
177
 
123
178
  return /*#__PURE__*/React.createElement(MenuItem, {
124
179
  disabled: disabled
125
- }, function (_ref2, menuitemRef) {
126
- var selected = _ref2.selected,
127
- active = _ref2.active,
128
- menuitem = _objectWithoutPropertiesLoose(_ref2, ["selected", "active"]);
180
+ }, function (_ref5, menuitemRef) {
181
+ var selected = _ref5.selected,
182
+ active = _ref5.active,
183
+ menuitem = _objectWithoutPropertiesLoose(_ref5, ["selected", "active"]);
129
184
 
130
- var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))), // prefixItemClassName`submenu`,
185
+ var classes = mergeItemClassNames(className, prefixItemClassName("pull-" + (rtl ? 'left' : 'right')), prefixItemClassName(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose(["toggle"]))), // prefixItemClassName`submenu`,
131
186
  withItemClassPrefix({
132
187
  'with-icon': icon,
133
188
  open: open,
@@ -143,13 +198,13 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
143
198
  }, menuitem, omit(menuButtonProps, ['role'])), icon && /*#__PURE__*/React.cloneElement(icon, {
144
199
  className: prefix('menu-icon')
145
200
  }), title, /*#__PURE__*/React.createElement(Icon, {
146
- className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
201
+ className: prefix(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose(["toggle-icon"])))
147
202
  }));
148
203
  });
149
204
  },
150
- renderMenuPopup: function renderMenuPopup(_ref3, popupRef) {
151
- var open = _ref3.open,
152
- popupProps = _objectWithoutPropertiesLoose(_ref3, ["open"]);
205
+ renderMenuPopup: function renderMenuPopup(_ref6, popupRef) {
206
+ var open = _ref6.open,
207
+ popupProps = _objectWithoutPropertiesLoose(_ref6, ["open"]);
153
208
 
154
209
  var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
155
210
  return /*#__PURE__*/React.createElement("ul", _extends({
@@ -159,9 +214,9 @@ var DropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
159
214
  }, popupProps, menuProps), children);
160
215
  },
161
216
  onToggleMenu: handleToggleSubmenu
162
- }, function (_ref4, menuContainerRef) {
163
- var open = _ref4.open,
164
- menuContainer = _objectWithoutPropertiesLoose(_ref4, ["open"]);
217
+ }, function (_ref7, menuContainerRef) {
218
+ var open = _ref7.open,
219
+ menuContainer = _objectWithoutPropertiesLoose(_ref7, ["open"]);
165
220
 
166
221
  var classes = mergeItemClassNames(className, withItemClassPrefix({
167
222
  disabled: disabled,
@@ -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"]);
@@ -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,2 +1,3 @@
1
1
  import Navbar from './Navbar';
2
+ export { NavbarContext } from './Navbar';
2
3
  export default Navbar;
@@ -72,7 +72,6 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
72
72
  open = props.open,
73
73
  _props$autoFocus = props.autoFocus,
74
74
  autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus,
75
- onBackdropClick = props.onBackdropClick,
76
75
  onEsc = props.onEsc,
77
76
  onExit = props.onExit,
78
77
  onExiting = props.onExiting,
@@ -82,7 +81,7 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
82
81
  onEntered = props.onEntered,
83
82
  onClose = props.onClose,
84
83
  onOpen = props.onOpen,
85
- rest = _objectWithoutPropertiesLoose(props, ["as", "children", "transition", "dialogTransitionTimeout", "style", "className", "container", "animationProps", "containerClassName", "keyboard", "enforceFocus", "backdrop", "backdropTransitionTimeout", "backdropStyle", "backdropClassName", "open", "autoFocus", "onBackdropClick", "onEsc", "onExit", "onExiting", "onExited", "onEnter", "onEntering", "onEntered", "onClose", "onOpen"]);
84
+ rest = _objectWithoutPropertiesLoose(props, ["as", "children", "transition", "dialogTransitionTimeout", "style", "className", "container", "animationProps", "containerClassName", "keyboard", "enforceFocus", "backdrop", "backdropTransitionTimeout", "backdropStyle", "backdropClassName", "open", "autoFocus", "onEsc", "onExit", "onExiting", "onExited", "onEnter", "onEntering", "onEntered", "onClose", "onOpen"]);
86
85
 
87
86
  var _useState = useState(!open),
88
87
  exited = _useState[0],
@@ -139,17 +138,6 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
139
138
 
140
139
  handleFocusDialog();
141
140
  });
142
- var handleBackdropClick = useEventCallback(function (event) {
143
- if (event.target !== event.currentTarget) {
144
- return;
145
- }
146
-
147
- onBackdropClick === null || onBackdropClick === void 0 ? void 0 : onBackdropClick(event);
148
-
149
- if (backdrop === true) {
150
- onClose === null || onClose === void 0 ? void 0 : onClose(event);
151
- }
152
- });
153
141
  var documentKeyDownListener = useRef();
154
142
  var documentFocusListener = useRef();
155
143
  var handleOpen = useEventCallback(function () {
@@ -215,11 +203,6 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
215
203
  }
216
204
 
217
205
  var renderBackdrop = function renderBackdrop() {
218
- var backdropPorps = {
219
- style: backdropStyle,
220
- onClick: handleBackdropClick
221
- };
222
-
223
206
  if (Transition) {
224
207
  return /*#__PURE__*/React.createElement(Fade, {
225
208
  transitionAppear: true,
@@ -231,18 +214,19 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
231
214
 
232
215
  return /*#__PURE__*/React.createElement("div", _extends({
233
216
  "aria-hidden": true
234
- }, rest, backdropPorps, {
217
+ }, rest, {
218
+ style: backdropStyle,
235
219
  ref: mergeRefs(modal.setBackdropRef, ref),
236
220
  className: classNames(backdropClassName, className)
237
221
  }));
238
222
  });
239
223
  }
240
224
 
241
- return /*#__PURE__*/React.createElement("div", _extends({
242
- "aria-hidden": true
243
- }, backdropPorps, {
225
+ return /*#__PURE__*/React.createElement("div", {
226
+ "aria-hidden": true,
227
+ style: backdropStyle,
244
228
  className: backdropClassName
245
- }));
229
+ });
246
230
  };
247
231
 
248
232
  var dialogElement = Transition ? /*#__PURE__*/React.createElement(Transition, _extends({}, animationProps, {
@@ -259,12 +243,12 @@ var Modal = /*#__PURE__*/React.forwardRef(function (props, ref) {
259
243
  }), children) : children;
260
244
  return /*#__PURE__*/React.createElement(OverlayContext.Provider, {
261
245
  value: contextValue
262
- }, /*#__PURE__*/React.createElement(Portal, null, /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
246
+ }, /*#__PURE__*/React.createElement(Portal, null, backdrop && renderBackdrop(), /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
263
247
  ref: mergeRefs(modal.setDialogRef, ref),
264
248
  style: style,
265
249
  className: className,
266
250
  tabIndex: -1
267
- }), backdrop && renderBackdrop(), dialogElement)));
251
+ }), dialogElement)));
268
252
  });
269
253
  export var modalPropTypes = {
270
254
  as: PropTypes.elementType,
@@ -289,7 +273,6 @@ Modal.propTypes = _extends({}, animationPropTypes, modalPropTypes, {
289
273
  dialogTransitionTimeout: PropTypes.number,
290
274
  backdropTransitionTimeout: PropTypes.number,
291
275
  transition: PropTypes.any,
292
- onEsc: PropTypes.func,
293
- onBackdropClick: PropTypes.func
276
+ onEsc: PropTypes.func
294
277
  });
295
278
  export default Modal;
@@ -40,3 +40,4 @@ export { default as useUpdatedRef } from './useUpdatedRef';
40
40
  export { default as useWillUnmount } from './useWillUnmount';
41
41
  export { default as useUpdateEffect } from './useUpdateEffect';
42
42
  export { default as useIsMounted } from './useIsMounted';
43
+ export { default as useMount } from './useMount';
@@ -42,4 +42,5 @@ export { default as useEventCallback } from './useEventCallback';
42
42
  export { default as useUpdatedRef } from './useUpdatedRef';
43
43
  export { default as useWillUnmount } from './useWillUnmount';
44
44
  export { default as useUpdateEffect } from './useUpdateEffect';
45
- export { default as useIsMounted } from './useIsMounted';
45
+ export { default as useIsMounted } from './useIsMounted';
46
+ export { default as useMount } from './useMount';
@@ -0,0 +1,2 @@
1
+ declare const useMount: (callback: () => void) => void;
2
+ export default useMount;
@@ -0,0 +1,13 @@
1
+ import { useEffect, useRef } from 'react';
2
+
3
+ var useMount = function useMount(callback) {
4
+ var mountRef = useRef(callback);
5
+ mountRef.current = callback;
6
+ useEffect(function () {
7
+ var _mountRef$current;
8
+
9
+ (_mountRef$current = mountRef.current) === null || _mountRef$current === void 0 ? void 0 : _mountRef$current.call(mountRef);
10
+ }, []);
11
+ };
12
+
13
+ export default useMount;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.4.1",
3
+ "version": "5.4.2",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",