rsuite 5.12.0 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/Nav/styles/index.less +7 -1
  3. package/Navbar/styles/index.less +6 -1
  4. package/Sidenav/styles/index.less +7 -5
  5. package/cjs/Cascader/DropdownMenu.js +8 -3
  6. package/cjs/Disclosure/Disclosure.d.ts +1 -1
  7. package/cjs/Disclosure/DisclosureContext.d.ts +1 -1
  8. package/cjs/Dropdown/Dropdown.js +26 -110
  9. package/cjs/Dropdown/DropdownItem.js +14 -58
  10. package/cjs/Dropdown/DropdownMenu.js +32 -76
  11. package/cjs/Dropdown/DropdownToggle.js +4 -17
  12. package/cjs/Menu/Menu.d.ts +1 -0
  13. package/cjs/Menu/Menu.js +1 -0
  14. package/cjs/Menu/MenuItem.d.ts +1 -0
  15. package/cjs/Menu/MenuItem.js +1 -0
  16. package/cjs/Menu/Menubar.d.ts +3 -0
  17. package/cjs/Menu/Menubar.js +4 -0
  18. package/cjs/Nav/Nav.d.ts +7 -2
  19. package/cjs/Nav/Nav.js +105 -5
  20. package/cjs/Nav/NavContext.d.ts +2 -8
  21. package/cjs/Nav/NavContext.js +1 -7
  22. package/cjs/Nav/NavDropdown.d.ts +71 -0
  23. package/cjs/Nav/NavDropdown.js +193 -0
  24. package/cjs/Nav/NavDropdownItem.d.ts +39 -0
  25. package/cjs/Nav/NavDropdownItem.js +141 -0
  26. package/cjs/Nav/NavDropdownMenu.d.ts +26 -0
  27. package/cjs/Nav/NavDropdownMenu.js +156 -0
  28. package/cjs/Nav/NavDropdownToggle.d.ts +21 -0
  29. package/cjs/Nav/NavDropdownToggle.js +74 -0
  30. package/cjs/Nav/NavItem.d.ts +2 -0
  31. package/cjs/Nav/NavItem.js +13 -26
  32. package/cjs/Nav/NavMenu.d.ts +38 -0
  33. package/cjs/Nav/NavMenu.js +122 -0
  34. package/cjs/Navbar/NavbarDropdown.d.ts +57 -0
  35. package/cjs/Navbar/NavbarDropdown.js +147 -0
  36. package/cjs/Navbar/NavbarDropdownItem.d.ts +41 -0
  37. package/cjs/Navbar/NavbarDropdownItem.js +149 -0
  38. package/cjs/Navbar/NavbarDropdownMenu.d.ts +37 -0
  39. package/cjs/Navbar/NavbarDropdownMenu.js +155 -0
  40. package/cjs/Navbar/NavbarDropdownToggle.d.ts +19 -0
  41. package/cjs/Navbar/NavbarDropdownToggle.js +72 -0
  42. package/cjs/Navbar/NavbarItem.d.ts +5 -2
  43. package/cjs/Navbar/NavbarItem.js +10 -4
  44. package/cjs/Picker/utils.js +22 -15
  45. package/cjs/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  46. package/cjs/Sidenav/ExpandedSidenavDropdown.js +166 -0
  47. package/cjs/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  48. package/cjs/Sidenav/ExpandedSidenavDropdownItem.js +141 -0
  49. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  50. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.js +145 -0
  51. package/cjs/Sidenav/Sidenav.d.ts +8 -2
  52. package/cjs/Sidenav/Sidenav.js +1 -2
  53. package/cjs/Sidenav/SidenavDropdown.d.ts +30 -8
  54. package/cjs/Sidenav/SidenavDropdown.js +144 -73
  55. package/cjs/Sidenav/SidenavDropdownItem.d.ts +22 -5
  56. package/cjs/Sidenav/SidenavDropdownItem.js +88 -72
  57. package/cjs/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  58. package/cjs/Sidenav/SidenavDropdownMenu.js +122 -90
  59. package/cjs/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  60. package/cjs/Sidenav/SidenavDropdownToggle.js +72 -0
  61. package/cjs/Sidenav/SidenavItem.d.ts +3 -0
  62. package/cjs/Sidenav/SidenavItem.js +22 -14
  63. package/cjs/utils/deprecateComponent.js +4 -6
  64. package/cjs/utils/deprecatePropType.d.ts +1 -5
  65. package/cjs/utils/deprecatePropType.js +7 -14
  66. package/cjs/utils/useInternalId.d.ts +1 -1
  67. package/cjs/utils/useInternalId.js +2 -2
  68. package/cjs/utils/warnOnce.d.ts +9 -0
  69. package/cjs/utils/warnOnce.js +22 -0
  70. package/dist/rsuite-rtl.css +18 -9
  71. package/dist/rsuite-rtl.min.css +1 -1
  72. package/dist/rsuite-rtl.min.css.map +1 -1
  73. package/dist/rsuite.css +18 -9
  74. package/dist/rsuite.js +275 -22
  75. package/dist/rsuite.js.map +1 -1
  76. package/dist/rsuite.min.css +1 -1
  77. package/dist/rsuite.min.css.map +1 -1
  78. package/dist/rsuite.min.js +1 -1
  79. package/dist/rsuite.min.js.map +1 -1
  80. package/esm/Cascader/DropdownMenu.js +8 -3
  81. package/esm/Disclosure/Disclosure.d.ts +1 -1
  82. package/esm/Disclosure/DisclosureContext.d.ts +1 -1
  83. package/esm/Dropdown/Dropdown.js +25 -105
  84. package/esm/Dropdown/DropdownItem.js +13 -55
  85. package/esm/Dropdown/DropdownMenu.js +31 -76
  86. package/esm/Dropdown/DropdownToggle.js +4 -14
  87. package/esm/Menu/Menu.d.ts +1 -0
  88. package/esm/Menu/Menu.js +1 -0
  89. package/esm/Menu/MenuItem.d.ts +1 -0
  90. package/esm/Menu/MenuItem.js +1 -0
  91. package/esm/Menu/Menubar.d.ts +3 -0
  92. package/esm/Menu/Menubar.js +4 -0
  93. package/esm/Nav/Nav.d.ts +7 -2
  94. package/esm/Nav/Nav.js +96 -5
  95. package/esm/Nav/NavContext.d.ts +2 -8
  96. package/esm/Nav/NavContext.js +1 -6
  97. package/esm/Nav/NavDropdown.d.ts +71 -0
  98. package/esm/Nav/NavDropdown.js +170 -0
  99. package/esm/Nav/NavDropdownItem.d.ts +39 -0
  100. package/esm/Nav/NavDropdownItem.js +123 -0
  101. package/esm/Nav/NavDropdownMenu.d.ts +26 -0
  102. package/esm/Nav/NavDropdownMenu.js +138 -0
  103. package/esm/Nav/NavDropdownToggle.d.ts +21 -0
  104. package/esm/Nav/NavDropdownToggle.js +57 -0
  105. package/esm/Nav/NavItem.d.ts +2 -0
  106. package/esm/Nav/NavItem.js +13 -21
  107. package/esm/Nav/NavMenu.d.ts +38 -0
  108. package/esm/Nav/NavMenu.js +98 -0
  109. package/esm/Navbar/NavbarDropdown.d.ts +57 -0
  110. package/esm/Navbar/NavbarDropdown.js +124 -0
  111. package/esm/Navbar/NavbarDropdownItem.d.ts +41 -0
  112. package/esm/Navbar/NavbarDropdownItem.js +128 -0
  113. package/esm/Navbar/NavbarDropdownMenu.d.ts +37 -0
  114. package/esm/Navbar/NavbarDropdownMenu.js +135 -0
  115. package/esm/Navbar/NavbarDropdownToggle.d.ts +19 -0
  116. package/esm/Navbar/NavbarDropdownToggle.js +55 -0
  117. package/esm/Navbar/NavbarItem.d.ts +5 -2
  118. package/esm/Navbar/NavbarItem.js +11 -4
  119. package/esm/Picker/utils.js +22 -14
  120. package/esm/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  121. package/esm/Sidenav/ExpandedSidenavDropdown.js +140 -0
  122. package/esm/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  123. package/esm/Sidenav/ExpandedSidenavDropdownItem.js +120 -0
  124. package/esm/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  125. package/esm/Sidenav/ExpandedSidenavDropdownMenu.js +121 -0
  126. package/esm/Sidenav/Sidenav.d.ts +8 -2
  127. package/esm/Sidenav/Sidenav.js +1 -2
  128. package/esm/Sidenav/SidenavDropdown.d.ts +30 -8
  129. package/esm/Sidenav/SidenavDropdown.js +145 -75
  130. package/esm/Sidenav/SidenavDropdownItem.d.ts +22 -5
  131. package/esm/Sidenav/SidenavDropdownItem.js +87 -71
  132. package/esm/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  133. package/esm/Sidenav/SidenavDropdownMenu.js +122 -86
  134. package/esm/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  135. package/esm/Sidenav/SidenavDropdownToggle.js +55 -0
  136. package/esm/Sidenav/SidenavItem.d.ts +3 -0
  137. package/esm/Sidenav/SidenavItem.js +23 -15
  138. package/esm/utils/deprecateComponent.js +3 -4
  139. package/esm/utils/deprecatePropType.d.ts +1 -5
  140. package/esm/utils/deprecatePropType.js +3 -13
  141. package/esm/utils/useInternalId.d.ts +1 -1
  142. package/esm/utils/useInternalId.js +2 -2
  143. package/esm/utils/warnOnce.d.ts +9 -0
  144. package/esm/utils/warnOnce.js +18 -0
  145. package/package.json +1 -1
  146. package/styles/variables.less +1 -0
@@ -0,0 +1,138 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _taggedTemplateLiteralLoose from "@babel/runtime/helpers/esm/taggedTemplateLiteralLoose";
3
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+
5
+ var _templateObject, _templateObject2;
6
+
7
+ import React, { useCallback, useContext } from 'react';
8
+ import omit from 'lodash/omit';
9
+ import Menu from '../Menu/Menu';
10
+ import MenuItem from '../Menu/MenuItem';
11
+ import { mergeRefs, useClassNames } from '../utils';
12
+ import PropTypes from 'prop-types';
13
+ import AngleLeft from '@rsuite/icons/legacy/AngleLeft';
14
+ import AngleRight from '@rsuite/icons/legacy/AngleRight';
15
+ import useCustom from '../utils/useCustom';
16
+ import NavContext from './NavContext';
17
+
18
+ /**
19
+ * @private
20
+ */
21
+ var NavDropdownMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
22
+ var nav = useContext(NavContext);
23
+
24
+ if (!nav) {
25
+ throw new Error('<Nav.Dropdown.Menu> should be used within a <Nav> component.');
26
+ }
27
+
28
+ var onToggle = props.onToggle,
29
+ eventKey = props.eventKey,
30
+ title = props.title,
31
+ _props$classPrefix = props.classPrefix,
32
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown-menu' : _props$classPrefix,
33
+ children = props.children,
34
+ rest = _objectWithoutPropertiesLoose(props, ["onToggle", "eventKey", "title", "classPrefix", "children"]);
35
+
36
+ var _useCustom = useCustom('DropdownMenu'),
37
+ rtl = _useCustom.rtl;
38
+
39
+ var handleToggleSubmenu = useCallback(function (open, event) {
40
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(open, eventKey, event);
41
+ }, [eventKey, onToggle]);
42
+
43
+ var _useClassNames = useClassNames(classPrefix),
44
+ prefix = _useClassNames.prefix;
45
+
46
+ var _useClassNames2 = useClassNames('dropdown-menu'),
47
+ withMenuClassPrefix = _useClassNames2.withClassPrefix,
48
+ mergeMenuClassName = _useClassNames2.merge;
49
+
50
+ var _useClassNames3 = useClassNames('dropdown-item'),
51
+ mergeItemClassNames = _useClassNames3.merge,
52
+ withItemClassPrefix = _useClassNames3.withClassPrefix,
53
+ prefixItemClassName = _useClassNames3.prefix; // Parent menu exists. This is a submenu.
54
+ // Should render a `menuitem` that controls this submenu.
55
+
56
+
57
+ var _omit = omit(rest, ['trigger']),
58
+ icon = _omit.icon,
59
+ className = _omit.className,
60
+ disabled = _omit.disabled,
61
+ menuProps = _objectWithoutPropertiesLoose(_omit, ["icon", "className", "disabled"]);
62
+
63
+ var Icon = rtl ? AngleLeft : AngleRight;
64
+ return /*#__PURE__*/React.createElement(Menu, {
65
+ openMenuOn: ['mouseover', 'click'],
66
+ renderMenuButton: function renderMenuButton(_ref, buttonRef) {
67
+ var open = _ref.open,
68
+ menuButtonProps = _objectWithoutPropertiesLoose(_ref, ["open"]);
69
+
70
+ return /*#__PURE__*/React.createElement(MenuItem, {
71
+ disabled: disabled
72
+ }, function (_ref2, menuitemRef) {
73
+ var selected = _ref2.selected,
74
+ active = _ref2.active,
75
+ menuitem = _objectWithoutPropertiesLoose(_ref2, ["selected", "active"]);
76
+
77
+ var classes = mergeItemClassNames(className, prefixItemClassName(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["toggle"]))), withItemClassPrefix({
78
+ 'with-icon': icon,
79
+ open: open,
80
+ active: selected,
81
+ disabled: disabled,
82
+ focus: active
83
+ }));
84
+ return /*#__PURE__*/React.createElement("div", _extends({
85
+ ref: mergeRefs(buttonRef, menuitemRef),
86
+ className: classes,
87
+ "data-event-key": eventKey,
88
+ "data-event-key-type": typeof eventKey
89
+ }, menuitem, omit(menuButtonProps, ['role'])), icon && /*#__PURE__*/React.cloneElement(icon, {
90
+ className: prefix('menu-icon')
91
+ }), title, /*#__PURE__*/React.createElement(Icon, {
92
+ className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["toggle-icon"])))
93
+ }));
94
+ });
95
+ },
96
+ renderMenuPopup: function renderMenuPopup(_ref3, popupRef) {
97
+ var open = _ref3.open,
98
+ popupProps = _objectWithoutPropertiesLoose(_ref3, ["open"]);
99
+
100
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
101
+ return /*#__PURE__*/React.createElement("ul", _extends({
102
+ ref: popupRef,
103
+ className: menuClassName,
104
+ hidden: !open
105
+ }, popupProps, menuProps), children);
106
+ },
107
+ onToggleMenu: handleToggleSubmenu
108
+ }, function (_ref4, menuContainerRef) {
109
+ var open = _ref4.open,
110
+ menuContainer = _objectWithoutPropertiesLoose(_ref4, ["open"]);
111
+
112
+ var classes = mergeItemClassNames(className, withItemClassPrefix({
113
+ disabled: disabled,
114
+ open: open,
115
+ submenu: true
116
+ }));
117
+ return /*#__PURE__*/React.createElement("li", _extends({
118
+ ref: mergeRefs(ref, menuContainerRef),
119
+ className: classes
120
+ }, menuContainer));
121
+ });
122
+ });
123
+ NavDropdownMenu.displayName = 'Nav.Dropdown.Menu';
124
+ NavDropdownMenu.propTypes = {
125
+ active: PropTypes.bool,
126
+ className: PropTypes.string,
127
+ children: PropTypes.node,
128
+ icon: PropTypes.any,
129
+ classPrefix: PropTypes.string,
130
+ pullLeft: PropTypes.bool,
131
+ title: PropTypes.node,
132
+ open: PropTypes.bool,
133
+ eventKey: PropTypes.any,
134
+ expanded: PropTypes.bool,
135
+ collapsible: PropTypes.bool,
136
+ onToggle: PropTypes.func
137
+ };
138
+ export default NavDropdownMenu;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import Button from '../Button';
3
+ import { WithAsProps, RsRefForwardingComponent, TypeAttributes } from '../@types/common';
4
+ import { NavItemProps } from './NavItem';
5
+ export interface NavDropdownToggleProps extends WithAsProps {
6
+ icon?: NavItemProps['icon'];
7
+ noCaret?: boolean;
8
+ renderToggle?: (props: WithAsProps, ref: React.Ref<any>) => any;
9
+ placement?: TypeAttributes.Placement8;
10
+ }
11
+ /**
12
+ * @private this component is not supposed to be used directly
13
+ * Instead it's rendered by a <Nav.Menu> call
14
+ *
15
+ * <Nav>
16
+ * <Nav.Menu> -> This will render <NavDropdown> component that renders a <NavDropdownToggle>
17
+ * </Nav.Menu>
18
+ * </Nav>
19
+ */
20
+ declare const NavDropdownToggle: RsRefForwardingComponent<typeof Button, NavDropdownToggleProps>;
21
+ export default NavDropdownToggle;
@@ -0,0 +1,57 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ import React from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import ArrowDownLineIcon from '@rsuite/icons/ArrowDownLine';
6
+ import { useClassNames } from '../utils';
7
+ import NavItem from './NavItem';
8
+
9
+ /**
10
+ * @private this component is not supposed to be used directly
11
+ * Instead it's rendered by a <Nav.Menu> call
12
+ *
13
+ * <Nav>
14
+ * <Nav.Menu> -> This will render <NavDropdown> component that renders a <NavDropdownToggle>
15
+ * </Nav.Menu>
16
+ * </Nav>
17
+ */
18
+ var NavDropdownToggle = /*#__PURE__*/React.forwardRef(function (props, ref) {
19
+ var _props$as = props.as,
20
+ Component = _props$as === void 0 ? NavItem : _props$as,
21
+ className = props.className,
22
+ _props$classPrefix = props.classPrefix,
23
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown-toggle' : _props$classPrefix,
24
+ renderToggle = props.renderToggle,
25
+ children = props.children,
26
+ noCaret = props.noCaret,
27
+ rest = _objectWithoutPropertiesLoose(props, ["as", "className", "classPrefix", "renderToggle", "children", "noCaret"]);
28
+
29
+ var _useClassNames = useClassNames(classPrefix),
30
+ withClassPrefix = _useClassNames.withClassPrefix,
31
+ merge = _useClassNames.merge;
32
+
33
+ var _useClassNames2 = useClassNames('nav-item'),
34
+ prefixNavItem = _useClassNames2.prefix;
35
+
36
+ var classes = merge(className, withClassPrefix({
37
+ 'no-caret': noCaret
38
+ }));
39
+ var toggle = /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
40
+ ref: ref,
41
+ className: classes
42
+ }), children, !noCaret && /*#__PURE__*/React.createElement(ArrowDownLineIcon, {
43
+ className: prefixNavItem('caret')
44
+ }));
45
+ return renderToggle ? renderToggle(rest, ref) : toggle;
46
+ });
47
+ NavDropdownToggle.displayName = 'Nav.Dropdown.Toggle';
48
+ NavDropdownToggle.propTypes = {
49
+ className: PropTypes.string,
50
+ children: PropTypes.node,
51
+ classPrefix: PropTypes.string,
52
+ noCaret: PropTypes.bool,
53
+ as: PropTypes.elementType,
54
+ renderToggle: PropTypes.func,
55
+ placement: PropTypes.oneOf(['bottomStart', 'bottomEnd', 'topStart', 'topEnd', 'leftStart', 'rightStart', 'leftEnd', 'rightEnd'])
56
+ };
57
+ export default NavDropdownToggle;
@@ -21,6 +21,8 @@ export interface NavItemProps<T = string> extends WithAsProps, Omit<React.HTMLAt
21
21
  }
22
22
  /**
23
23
  * The <Nav.Item> API
24
+ * When used as direct child of <Nav>, render the NavItem
25
+ * When used within a <Nav.Menu>, render the NavDropdownItem
24
26
  */
25
27
  declare const NavItem: RsRefForwardingComponent<'a', NavItemProps>;
26
28
  export default NavItem;
@@ -6,16 +6,20 @@ import isNil from 'lodash/isNil';
6
6
  import Ripple from '../Ripple';
7
7
  import SafeAnchor from '../SafeAnchor';
8
8
  import { shallowEqual, useClassNames } from '../utils';
9
- import { SidenavContext } from '../Sidenav/Sidenav';
10
9
  import NavContext from './NavContext';
11
- import { NavbarContext } from '../Navbar/Navbar';
12
- import SidenavItem from '../Sidenav/SidenavItem';
13
- import NavbarItem from '../Navbar/NavbarItem';
14
10
 
15
11
  /**
16
12
  * The <Nav.Item> API
13
+ * When used as direct child of <Nav>, render the NavItem
14
+ * When used within a <Nav.Menu>, render the NavDropdownItem
17
15
  */
18
16
  var NavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
17
+ var nav = useContext(NavContext);
18
+
19
+ if (!nav) {
20
+ throw new Error('<Nav.Item> must be rendered within a <Nav> component.');
21
+ }
22
+
19
23
  var _props$as = props.as,
20
24
  Component = _props$as === void 0 ? SafeAnchor : _props$as,
21
25
  activeProp = props.active,
@@ -33,17 +37,13 @@ var NavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
33
37
  onSelectProp = props.onSelect,
34
38
  rest = _objectWithoutPropertiesLoose(props, ["as", "active", "disabled", "eventKey", "className", "classPrefix", "style", "children", "icon", "divider", "panel", "onClick", "onSelect"]);
35
39
 
36
- var _useContext = useContext(NavContext),
37
- activeKey = _useContext.activeKey,
38
- onSelectFromNav = _useContext.onSelect;
39
-
40
+ var activeKey = nav.activeKey,
41
+ onSelectFromNav = nav.onSelect;
40
42
  var active = activeProp !== null && activeProp !== void 0 ? activeProp : !isNil(eventKey) && shallowEqual(eventKey, activeKey);
41
43
  var emitSelect = useCallback(function (event) {
42
44
  onSelectProp === null || onSelectProp === void 0 ? void 0 : onSelectProp(eventKey, event);
43
45
  onSelectFromNav === null || onSelectFromNav === void 0 ? void 0 : onSelectFromNav(eventKey, event);
44
46
  }, [eventKey, onSelectProp, onSelectFromNav]);
45
- var navbar = useContext(NavbarContext);
46
- var sidenav = useContext(SidenavContext);
47
47
 
48
48
  var _useClassNames = useClassNames(classPrefix),
49
49
  withClassPrefix = _useClassNames.withClassPrefix,
@@ -61,10 +61,6 @@ var NavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
61
61
  }
62
62
  }, [disabled, emitSelect, onClick]);
63
63
 
64
- if (sidenav) {
65
- return /*#__PURE__*/React.createElement(SidenavItem, props);
66
- }
67
-
68
64
  if (divider) {
69
65
  return /*#__PURE__*/React.createElement("div", _extends({
70
66
  ref: ref,
@@ -82,12 +78,6 @@ var NavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
82
78
  }, rest), children);
83
79
  }
84
80
 
85
- if (navbar) {
86
- return /*#__PURE__*/React.createElement(NavbarItem, _extends({
87
- ref: ref
88
- }, props));
89
- }
90
-
91
81
  return /*#__PURE__*/React.createElement(Component, _extends({
92
82
  ref: ref,
93
83
  tabIndex: disabled ? -1 : undefined
@@ -96,7 +86,9 @@ var NavItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
96
86
  onClick: handleClick,
97
87
  style: style,
98
88
  "aria-selected": active || undefined
99
- }), icon, children, /*#__PURE__*/React.createElement(Ripple, null));
89
+ }), icon && /*#__PURE__*/React.cloneElement(icon, {
90
+ className: prefix('icon')
91
+ }), children, /*#__PURE__*/React.createElement(Ripple, null));
100
92
  });
101
93
  NavItem.displayName = 'Nav.Item';
102
94
  NavItem.propTypes = {
@@ -0,0 +1,38 @@
1
+ import React, { Dispatch } from 'react';
2
+ import { NavDropdownProps } from './NavDropdown';
3
+ import { NavDropdownMenuProps } from './NavDropdownMenu';
4
+ export interface NavMenuProps extends NavDropdownProps, Omit<NavDropdownMenuProps, 'onToggle'> {
5
+ }
6
+ export declare type NavMenuState = {
7
+ items: {
8
+ _id: any;
9
+ eventKey?: any;
10
+ active: boolean;
11
+ }[];
12
+ };
13
+ export declare type NavMenuContextProps = [NavMenuState, Dispatch<NavMenuAction>];
14
+ export declare const NavMenuContext: React.Context<NavMenuContextProps | null>;
15
+ export declare enum NavMenuActionType {
16
+ RegisterItem = 0,
17
+ UnregisterItem = 1
18
+ }
19
+ export declare type NavMenuAction = {
20
+ type: NavMenuActionType.RegisterItem;
21
+ payload: {
22
+ _id: any;
23
+ eventKey?: any;
24
+ active: boolean;
25
+ };
26
+ } | {
27
+ type: NavMenuActionType.UnregisterItem;
28
+ payload: {
29
+ _id: any;
30
+ };
31
+ };
32
+ /**
33
+ * The <Nav.Menu> API
34
+ * When used as direct child of <Nav>, render the NavDropdown
35
+ * When used within another <Nav.Menu>, render the NavDropdownMenu
36
+ */
37
+ declare const NavMenu: React.ForwardRefExoticComponent<NavMenuProps & React.RefAttributes<any>>;
38
+ export default NavMenu;
@@ -0,0 +1,98 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import React, { useContext, useReducer } from 'react';
3
+ import NavDropdown from './NavDropdown';
4
+ import NavDropdownMenu from './NavDropdownMenu';
5
+ import { SidenavContext } from '../Sidenav/Sidenav';
6
+ import SidenavDropdown from '../Sidenav/SidenavDropdown';
7
+ import { NavbarContext } from '../Navbar';
8
+ import NavbarDropdown from '../Navbar/NavbarDropdown';
9
+ import NavbarDropdownMenu from '../Navbar/NavbarDropdownMenu';
10
+ import SidenavDropdownMenu from '../Sidenav/SidenavDropdownMenu';
11
+ export var NavMenuContext = /*#__PURE__*/React.createContext(null);
12
+ NavMenuContext.displayName = 'NavMenu.Context';
13
+ export var NavMenuActionType;
14
+
15
+ (function (NavMenuActionType) {
16
+ NavMenuActionType[NavMenuActionType["RegisterItem"] = 0] = "RegisterItem";
17
+ NavMenuActionType[NavMenuActionType["UnregisterItem"] = 1] = "UnregisterItem";
18
+ })(NavMenuActionType || (NavMenuActionType = {}));
19
+
20
+ var initilNavMenuState = {
21
+ items: []
22
+ };
23
+
24
+ var reducer = function reducer(state, action) {
25
+ switch (action.type) {
26
+ case NavMenuActionType.RegisterItem:
27
+ return _extends({}, state, {
28
+ items: [].concat(state.items.filter(function (item) {
29
+ return item._id !== action.payload._id;
30
+ }), [action.payload])
31
+ });
32
+
33
+ case NavMenuActionType.UnregisterItem:
34
+ return _extends({}, state, {
35
+ items: state.items.filter(function (item) {
36
+ return item._id !== action.payload._id;
37
+ })
38
+ });
39
+
40
+ default:
41
+ throw new Error('Unrecognizable action type: ' + action.type);
42
+ }
43
+ };
44
+ /**
45
+ * The <Nav.Menu> API
46
+ * When used as direct child of <Nav>, render the NavDropdown
47
+ * When used within another <Nav.Menu>, render the NavDropdownMenu
48
+ */
49
+
50
+
51
+ var NavMenu = /*#__PURE__*/React.forwardRef(function (props, ref) {
52
+ var parentNavMenu = useContext(NavMenuContext);
53
+ var navMenuContext = useReducer(reducer, initilNavMenuState);
54
+ var navbar = useContext(NavbarContext);
55
+ var sidenav = useContext(SidenavContext);
56
+
57
+ if (!parentNavMenu) {
58
+ if (navbar) {
59
+ return /*#__PURE__*/React.createElement(NavMenuContext.Provider, {
60
+ value: navMenuContext
61
+ }, /*#__PURE__*/React.createElement(NavbarDropdown, _extends({
62
+ ref: ref
63
+ }, props)));
64
+ }
65
+
66
+ if (sidenav) {
67
+ return /*#__PURE__*/React.createElement(NavMenuContext.Provider, {
68
+ value: navMenuContext
69
+ }, /*#__PURE__*/React.createElement(SidenavDropdown, _extends({
70
+ ref: ref
71
+ }, props)));
72
+ }
73
+
74
+ return /*#__PURE__*/React.createElement(NavMenuContext.Provider, {
75
+ value: navMenuContext
76
+ }, /*#__PURE__*/React.createElement(NavDropdown, _extends({
77
+ ref: ref
78
+ }, props)));
79
+ }
80
+
81
+ if (navbar) {
82
+ return /*#__PURE__*/React.createElement(NavbarDropdownMenu, _extends({
83
+ ref: ref
84
+ }, props));
85
+ }
86
+
87
+ if (sidenav) {
88
+ return /*#__PURE__*/React.createElement(SidenavDropdownMenu, _extends({
89
+ ref: ref
90
+ }, props));
91
+ }
92
+
93
+ return /*#__PURE__*/React.createElement(NavDropdownMenu, _extends({
94
+ ref: ref
95
+ }, props));
96
+ });
97
+ NavMenu.displayName = 'Nav.Menu';
98
+ export default NavMenu;
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
+ import { IconProps } from '@rsuite/icons/lib/Icon';
4
+ import Button from '../Button';
5
+ import NavDropdownItem from '../Nav/NavDropdownItem';
6
+ import NavDropdownMenu from '../Nav/NavDropdownMenu';
7
+ export declare type NavbarDropdownTrigger = 'click' | 'hover' | 'contextMenu';
8
+ export interface NavbarDropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect' | 'title'> {
9
+ /** Define the title as a submenu */
10
+ title?: React.ReactNode;
11
+ /** Set the icon */
12
+ icon?: React.ReactElement<IconProps>;
13
+ /** Triggering events */
14
+ trigger?: NavbarDropdownTrigger | readonly NavbarDropdownTrigger[];
15
+ /** The placement of Menu */
16
+ placement?: TypeAttributes.Placement8;
17
+ /** Whether or not component is disabled */
18
+ disabled?: boolean;
19
+ /** The style of the menu */
20
+ menuStyle?: React.CSSProperties;
21
+ /** A css class to apply to the Toggle DOM node */
22
+ toggleClassName?: string;
23
+ /** You can use a custom element type for this toggle component */
24
+ toggleAs?: React.ElementType;
25
+ /** No caret variation */
26
+ noCaret?: boolean;
27
+ /**
28
+ * Open the menu and control it
29
+ * @deprecated
30
+ */
31
+ open?: boolean;
32
+ /**
33
+ * @deprecated
34
+ */
35
+ renderTitle?: (children: React.ReactNode) => React.ReactNode;
36
+ /** Custom Toggle */
37
+ renderToggle?: (props: WithAsProps, ref: React.Ref<any>) => any;
38
+ /** The callback function that the menu closes */
39
+ onClose?: () => void;
40
+ /** Menu Pop-up callback function */
41
+ onOpen?: () => void;
42
+ /** Callback function for menu state switching */
43
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
44
+ }
45
+ export interface NavbarDropdownComponent extends RsRefForwardingComponent<'div', NavbarDropdownProps> {
46
+ <ToggleAs extends React.ElementType = typeof Button>(props: NavbarDropdownProps & {
47
+ ref?: React.Ref<any>;
48
+ toggleAs?: ToggleAs;
49
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
50
+ Item: typeof NavDropdownItem;
51
+ Menu: typeof NavDropdownMenu;
52
+ }
53
+ /**
54
+ * @private
55
+ */
56
+ declare const NavbarDropdown: NavbarDropdownComponent;
57
+ export default NavbarDropdown;
@@ -0,0 +1,124 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ import React, { useContext } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import omit from 'lodash/omit';
6
+ import { mergeRefs, PLACEMENT_8, placementPolyfill, useClassNames } from '../utils';
7
+ import deprecatePropType from '../utils/deprecatePropType';
8
+ import kebabCase from 'lodash/kebabCase';
9
+ import { NavbarContext } from '.';
10
+ import Disclosure from '../Disclosure/Disclosure';
11
+ import NavDropdownItem from '../Nav/NavDropdownItem';
12
+ import NavDropdownMenu from '../Nav/NavDropdownMenu';
13
+ import NavbarDropdownToggle from './NavbarDropdownToggle';
14
+
15
+ /**
16
+ * @private
17
+ */
18
+ var NavbarDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
19
+ var navbar = useContext(NavbarContext);
20
+
21
+ if (!navbar) {
22
+ throw new Error('<Navbar.Dropdown> should be used within a <Navbar> component.');
23
+ }
24
+
25
+ var _props$as = props.as,
26
+ Component = _props$as === void 0 ? 'div' : _props$as,
27
+ title = props.title,
28
+ onClose = props.onClose,
29
+ onOpen = props.onOpen,
30
+ _onToggle = props.onToggle,
31
+ _props$trigger = props.trigger,
32
+ trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
33
+ _props$placement = props.placement,
34
+ placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
35
+ toggleAs = props.toggleAs,
36
+ toggleClassName = props.toggleClassName,
37
+ _props$classPrefix = props.classPrefix,
38
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
39
+ className = props.className,
40
+ disabled = props.disabled,
41
+ children = props.children,
42
+ menuStyle = props.menuStyle,
43
+ style = props.style,
44
+ toggleProps = _objectWithoutPropertiesLoose(props, ["as", "title", "onClose", "onOpen", "onToggle", "trigger", "placement", "toggleAs", "toggleClassName", "classPrefix", "className", "disabled", "children", "menuStyle", "style"]);
45
+
46
+ var _useClassNames = useClassNames(classPrefix),
47
+ merge = _useClassNames.merge,
48
+ withClassPrefix = _useClassNames.withClassPrefix;
49
+
50
+ var _useClassNames2 = useClassNames('dropdown-menu'),
51
+ withMenuClassPrefix = _useClassNames2.withClassPrefix,
52
+ mergeMenuClassName = _useClassNames2.merge;
53
+
54
+ return /*#__PURE__*/React.createElement(Disclosure, {
55
+ trigger: trigger,
56
+ hideOnClickOutside: true,
57
+ onToggle: function onToggle(open) {
58
+ _onToggle === null || _onToggle === void 0 ? void 0 : _onToggle(open);
59
+
60
+ if (open) {
61
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen();
62
+ } else {
63
+ onClose === null || onClose === void 0 ? void 0 : onClose();
64
+ }
65
+ }
66
+ }, function (_ref, containerRef) {
67
+ var _withClassPrefix;
68
+
69
+ var open = _ref.open;
70
+ var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix.disabled = disabled, _withClassPrefix.open = open, _withClassPrefix)));
71
+ return /*#__PURE__*/React.createElement(Component, {
72
+ ref: mergeRefs(ref, containerRef),
73
+ className: classes,
74
+ style: style
75
+ }, /*#__PURE__*/React.createElement(Disclosure.Button, null, function (buttonProps, buttonRef) {
76
+ return /*#__PURE__*/React.createElement(NavbarDropdownToggle, _extends({
77
+ ref: buttonRef,
78
+ as: toggleAs,
79
+ className: toggleClassName,
80
+ placement: placement,
81
+ disabled: disabled
82
+ }, omit(buttonProps, ['open']), toggleProps), title);
83
+ }), /*#__PURE__*/React.createElement(Disclosure.Content, null, function (_ref2, elementRef) {
84
+ var open = _ref2.open;
85
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
86
+ return /*#__PURE__*/React.createElement("ul", {
87
+ ref: elementRef,
88
+ className: menuClassName,
89
+ style: menuStyle,
90
+ hidden: !open
91
+ }, children);
92
+ }));
93
+ });
94
+ });
95
+ NavbarDropdown.Item = NavDropdownItem;
96
+ NavbarDropdown.Menu = NavDropdownMenu;
97
+ NavbarDropdown.displayName = 'Navbar.Dropdown';
98
+ NavbarDropdown.propTypes = {
99
+ classPrefix: PropTypes.string,
100
+ trigger: PropTypes.oneOfType([PropTypes.array, PropTypes.oneOf(['click', 'hover', 'contextMenu'])]),
101
+ placement: PropTypes.oneOf(PLACEMENT_8),
102
+ title: PropTypes.node,
103
+ disabled: PropTypes.bool,
104
+ icon: PropTypes.node,
105
+ menuStyle: PropTypes.object,
106
+ className: PropTypes.string,
107
+ toggleClassName: PropTypes.string,
108
+ children: PropTypes.node,
109
+ open: deprecatePropType(PropTypes.bool),
110
+ eventKey: PropTypes.any,
111
+ as: PropTypes.elementType,
112
+ toggleAs: PropTypes.elementType,
113
+ noCaret: PropTypes.bool,
114
+ style: PropTypes.object,
115
+ onClose: PropTypes.func,
116
+ onOpen: PropTypes.func,
117
+ onToggle: PropTypes.func,
118
+ onMouseEnter: PropTypes.func,
119
+ onMouseLeave: PropTypes.func,
120
+ onContextMenu: PropTypes.func,
121
+ onClick: PropTypes.func,
122
+ renderToggle: PropTypes.func
123
+ };
124
+ export default NavbarDropdown;
@@ -0,0 +1,41 @@
1
+ import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
2
+ import React from 'react';
3
+ import { IconProps } from '@rsuite/icons/lib/Icon';
4
+ export interface NavbarDropdownItemProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect'> {
5
+ /** Active the current option */
6
+ active?: boolean;
7
+ /** Primary content */
8
+ children?: React.ReactNode;
9
+ /** You can use a custom element for this component */
10
+ as?: React.ElementType;
11
+ /** Whether to display the divider */
12
+ divider?: boolean;
13
+ /** Disable the current option */
14
+ disabled?: boolean;
15
+ /** The value of the current option */
16
+ eventKey?: T;
17
+ /** Displays a custom panel */
18
+ panel?: boolean;
19
+ /** Set the icon */
20
+ icon?: React.ReactElement<IconProps>;
21
+ /** The submenu that this menuitem controls (if exists) */
22
+ submenu?: React.ReactElement;
23
+ /**
24
+ * The sub-level menu appears from the right side by default, and when `pullLeft` is set, it appears from the left.
25
+ * @deprecated Submenus are now pointing the same direction.
26
+ */
27
+ pullLeft?: boolean;
28
+ /**
29
+ * Whether the submenu is opened.
30
+ * @deprecated
31
+ * @internal
32
+ */
33
+ open?: boolean;
34
+ /** Select the callback function for the current option */
35
+ onSelect?: (eventKey: T, event: React.SyntheticEvent) => void;
36
+ }
37
+ /**
38
+ * @private
39
+ */
40
+ declare const NavbarDropdownItem: RsRefForwardingComponent<'li', NavbarDropdownItemProps>;
41
+ export default NavbarDropdownItem;