rsuite 5.10.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 (170) hide show
  1. package/ButtonToolbar/styles/index.less +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/Nav/styles/index.less +7 -1
  4. package/Navbar/styles/index.less +6 -1
  5. package/README.md +4 -0
  6. package/Sidenav/styles/index.less +7 -5
  7. package/cjs/Cascader/DropdownMenu.js +8 -3
  8. package/cjs/DateRangePicker/DateRangePicker.d.ts +2 -0
  9. package/cjs/DateRangePicker/DateRangePicker.js +4 -2
  10. package/cjs/Disclosure/Disclosure.d.ts +1 -1
  11. package/cjs/Disclosure/DisclosureContext.d.ts +1 -1
  12. package/cjs/Dropdown/Dropdown.js +26 -110
  13. package/cjs/Dropdown/DropdownItem.js +14 -58
  14. package/cjs/Dropdown/DropdownMenu.js +32 -76
  15. package/cjs/Dropdown/DropdownToggle.js +4 -17
  16. package/cjs/Form/Form.js +21 -7
  17. package/cjs/Form/FormContext.d.ts +18 -13
  18. package/cjs/Form/useSchemaModel.d.ts +9 -0
  19. package/cjs/Form/useSchemaModel.js +46 -0
  20. package/cjs/FormControl/FormControl.d.ts +3 -0
  21. package/cjs/FormControl/FormControl.js +9 -2
  22. package/cjs/FormControl/useRegisterModel.d.ts +4 -0
  23. package/cjs/FormControl/useRegisterModel.js +20 -0
  24. package/cjs/Menu/Menu.d.ts +1 -0
  25. package/cjs/Menu/Menu.js +1 -0
  26. package/cjs/Menu/MenuItem.d.ts +1 -0
  27. package/cjs/Menu/MenuItem.js +1 -0
  28. package/cjs/Menu/Menubar.d.ts +3 -0
  29. package/cjs/Menu/Menubar.js +14 -3
  30. package/cjs/Nav/Nav.d.ts +7 -2
  31. package/cjs/Nav/Nav.js +105 -5
  32. package/cjs/Nav/NavContext.d.ts +2 -8
  33. package/cjs/Nav/NavContext.js +1 -7
  34. package/cjs/Nav/NavDropdown.d.ts +71 -0
  35. package/cjs/Nav/NavDropdown.js +193 -0
  36. package/cjs/Nav/NavDropdownItem.d.ts +39 -0
  37. package/cjs/Nav/NavDropdownItem.js +141 -0
  38. package/cjs/Nav/NavDropdownMenu.d.ts +26 -0
  39. package/cjs/Nav/NavDropdownMenu.js +156 -0
  40. package/cjs/Nav/NavDropdownToggle.d.ts +21 -0
  41. package/cjs/Nav/NavDropdownToggle.js +74 -0
  42. package/cjs/Nav/NavItem.d.ts +2 -0
  43. package/cjs/Nav/NavItem.js +13 -26
  44. package/cjs/Nav/NavMenu.d.ts +38 -0
  45. package/cjs/Nav/NavMenu.js +122 -0
  46. package/cjs/Navbar/NavbarDropdown.d.ts +57 -0
  47. package/cjs/Navbar/NavbarDropdown.js +147 -0
  48. package/cjs/Navbar/NavbarDropdownItem.d.ts +41 -0
  49. package/cjs/Navbar/NavbarDropdownItem.js +149 -0
  50. package/cjs/Navbar/NavbarDropdownMenu.d.ts +37 -0
  51. package/cjs/Navbar/NavbarDropdownMenu.js +155 -0
  52. package/cjs/Navbar/NavbarDropdownToggle.d.ts +19 -0
  53. package/cjs/Navbar/NavbarDropdownToggle.js +72 -0
  54. package/cjs/Navbar/NavbarItem.d.ts +5 -2
  55. package/cjs/Navbar/NavbarItem.js +10 -4
  56. package/cjs/Picker/utils.js +22 -15
  57. package/cjs/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  58. package/cjs/Sidenav/ExpandedSidenavDropdown.js +166 -0
  59. package/cjs/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  60. package/cjs/Sidenav/ExpandedSidenavDropdownItem.js +141 -0
  61. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  62. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.js +145 -0
  63. package/cjs/Sidenav/Sidenav.d.ts +8 -2
  64. package/cjs/Sidenav/Sidenav.js +1 -2
  65. package/cjs/Sidenav/SidenavDropdown.d.ts +30 -8
  66. package/cjs/Sidenav/SidenavDropdown.js +144 -73
  67. package/cjs/Sidenav/SidenavDropdownItem.d.ts +22 -5
  68. package/cjs/Sidenav/SidenavDropdownItem.js +88 -72
  69. package/cjs/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  70. package/cjs/Sidenav/SidenavDropdownMenu.js +122 -90
  71. package/cjs/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  72. package/cjs/Sidenav/SidenavDropdownToggle.js +72 -0
  73. package/cjs/Sidenav/SidenavItem.d.ts +3 -0
  74. package/cjs/Sidenav/SidenavItem.js +22 -14
  75. package/cjs/utils/deprecateComponent.js +4 -6
  76. package/cjs/utils/deprecatePropType.d.ts +1 -5
  77. package/cjs/utils/deprecatePropType.js +7 -14
  78. package/cjs/utils/dom.d.ts +1 -1
  79. package/cjs/utils/useInternalId.d.ts +1 -1
  80. package/cjs/utils/useInternalId.js +2 -2
  81. package/cjs/utils/warnOnce.d.ts +9 -0
  82. package/cjs/utils/warnOnce.js +22 -0
  83. package/dist/rsuite-rtl.css +19 -10
  84. package/dist/rsuite-rtl.min.css +1 -1
  85. package/dist/rsuite-rtl.min.css.map +1 -1
  86. package/dist/rsuite.css +19 -10
  87. package/dist/rsuite.js +300 -25
  88. package/dist/rsuite.js.map +1 -1
  89. package/dist/rsuite.min.css +1 -1
  90. package/dist/rsuite.min.css.map +1 -1
  91. package/dist/rsuite.min.js +1 -1
  92. package/dist/rsuite.min.js.map +1 -1
  93. package/esm/Cascader/DropdownMenu.js +8 -3
  94. package/esm/DateRangePicker/DateRangePicker.d.ts +2 -0
  95. package/esm/DateRangePicker/DateRangePicker.js +4 -2
  96. package/esm/Disclosure/Disclosure.d.ts +1 -1
  97. package/esm/Disclosure/DisclosureContext.d.ts +1 -1
  98. package/esm/Dropdown/Dropdown.js +25 -105
  99. package/esm/Dropdown/DropdownItem.js +13 -55
  100. package/esm/Dropdown/DropdownMenu.js +31 -76
  101. package/esm/Dropdown/DropdownToggle.js +4 -14
  102. package/esm/Form/Form.js +19 -7
  103. package/esm/Form/FormContext.d.ts +18 -13
  104. package/esm/Form/useSchemaModel.d.ts +9 -0
  105. package/esm/Form/useSchemaModel.js +39 -0
  106. package/esm/FormControl/FormControl.d.ts +3 -0
  107. package/esm/FormControl/FormControl.js +9 -6
  108. package/esm/FormControl/useRegisterModel.d.ts +4 -0
  109. package/esm/FormControl/useRegisterModel.js +14 -0
  110. package/esm/Menu/Menu.d.ts +1 -0
  111. package/esm/Menu/Menu.js +1 -0
  112. package/esm/Menu/MenuItem.d.ts +1 -0
  113. package/esm/Menu/MenuItem.js +1 -0
  114. package/esm/Menu/Menubar.d.ts +3 -0
  115. package/esm/Menu/Menubar.js +13 -3
  116. package/esm/Nav/Nav.d.ts +7 -2
  117. package/esm/Nav/Nav.js +96 -5
  118. package/esm/Nav/NavContext.d.ts +2 -8
  119. package/esm/Nav/NavContext.js +1 -6
  120. package/esm/Nav/NavDropdown.d.ts +71 -0
  121. package/esm/Nav/NavDropdown.js +170 -0
  122. package/esm/Nav/NavDropdownItem.d.ts +39 -0
  123. package/esm/Nav/NavDropdownItem.js +123 -0
  124. package/esm/Nav/NavDropdownMenu.d.ts +26 -0
  125. package/esm/Nav/NavDropdownMenu.js +138 -0
  126. package/esm/Nav/NavDropdownToggle.d.ts +21 -0
  127. package/esm/Nav/NavDropdownToggle.js +57 -0
  128. package/esm/Nav/NavItem.d.ts +2 -0
  129. package/esm/Nav/NavItem.js +13 -21
  130. package/esm/Nav/NavMenu.d.ts +38 -0
  131. package/esm/Nav/NavMenu.js +98 -0
  132. package/esm/Navbar/NavbarDropdown.d.ts +57 -0
  133. package/esm/Navbar/NavbarDropdown.js +124 -0
  134. package/esm/Navbar/NavbarDropdownItem.d.ts +41 -0
  135. package/esm/Navbar/NavbarDropdownItem.js +128 -0
  136. package/esm/Navbar/NavbarDropdownMenu.d.ts +37 -0
  137. package/esm/Navbar/NavbarDropdownMenu.js +135 -0
  138. package/esm/Navbar/NavbarDropdownToggle.d.ts +19 -0
  139. package/esm/Navbar/NavbarDropdownToggle.js +55 -0
  140. package/esm/Navbar/NavbarItem.d.ts +5 -2
  141. package/esm/Navbar/NavbarItem.js +11 -4
  142. package/esm/Picker/utils.js +22 -14
  143. package/esm/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  144. package/esm/Sidenav/ExpandedSidenavDropdown.js +140 -0
  145. package/esm/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  146. package/esm/Sidenav/ExpandedSidenavDropdownItem.js +120 -0
  147. package/esm/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  148. package/esm/Sidenav/ExpandedSidenavDropdownMenu.js +121 -0
  149. package/esm/Sidenav/Sidenav.d.ts +8 -2
  150. package/esm/Sidenav/Sidenav.js +1 -2
  151. package/esm/Sidenav/SidenavDropdown.d.ts +30 -8
  152. package/esm/Sidenav/SidenavDropdown.js +145 -75
  153. package/esm/Sidenav/SidenavDropdownItem.d.ts +22 -5
  154. package/esm/Sidenav/SidenavDropdownItem.js +87 -71
  155. package/esm/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  156. package/esm/Sidenav/SidenavDropdownMenu.js +122 -86
  157. package/esm/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  158. package/esm/Sidenav/SidenavDropdownToggle.js +55 -0
  159. package/esm/Sidenav/SidenavItem.d.ts +3 -0
  160. package/esm/Sidenav/SidenavItem.js +23 -15
  161. package/esm/utils/deprecateComponent.js +3 -4
  162. package/esm/utils/deprecatePropType.d.ts +1 -5
  163. package/esm/utils/deprecatePropType.js +3 -13
  164. package/esm/utils/dom.d.ts +1 -1
  165. package/esm/utils/useInternalId.d.ts +1 -1
  166. package/esm/utils/useInternalId.js +2 -2
  167. package/esm/utils/warnOnce.d.ts +9 -0
  168. package/esm/utils/warnOnce.js +18 -0
  169. package/package.json +1 -1
  170. package/styles/variables.less +1 -0
@@ -0,0 +1,170 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ import React, { useContext, useMemo, useReducer } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import omit from 'lodash/omit';
6
+ import pick from 'lodash/pick';
7
+ import { mergeRefs, PLACEMENT_8, placementPolyfill, useClassNames } from '../utils';
8
+ import deprecatePropType from '../utils/deprecatePropType';
9
+ import { initialState, reducer } from '../Dropdown/DropdownState';
10
+ import Menu from '../Menu/Menu';
11
+ import kebabCase from 'lodash/kebabCase';
12
+ import NavContext from './NavContext';
13
+ import NavDropdownItem from './NavDropdownItem';
14
+ import NavDropdownMenu from './NavDropdownMenu';
15
+ import NavDropdownToggle from './NavDropdownToggle';
16
+
17
+ /**
18
+ * @private this component is not supposed to be used directly
19
+ * Instead it's rendered by a <Nav.Menu> call
20
+ *
21
+ * <Nav>
22
+ * <Nav.Menu> -> This will render <NavDropdown> component
23
+ * </Nav.Menu>
24
+ * </Nav>
25
+ */
26
+ var NavDropdown = /*#__PURE__*/React.forwardRef(function (props, ref) {
27
+ var nav = useContext(NavContext);
28
+
29
+ if (!nav) {
30
+ throw new Error('<Nav.Dropdown> must be rendered within a <Nav> component.');
31
+ }
32
+
33
+ var _props$as = props.as,
34
+ Component = _props$as === void 0 ? 'div' : _props$as,
35
+ title = props.title,
36
+ onClose = props.onClose,
37
+ onOpen = props.onOpen,
38
+ onToggle = props.onToggle,
39
+ eventKey = props.eventKey,
40
+ _props$trigger = props.trigger,
41
+ trigger = _props$trigger === void 0 ? 'click' : _props$trigger,
42
+ _props$placement = props.placement,
43
+ placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
44
+ toggleAs = props.toggleAs,
45
+ toggleClassName = props.toggleClassName,
46
+ _props$classPrefix = props.classPrefix,
47
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown' : _props$classPrefix,
48
+ className = props.className,
49
+ disabled = props.disabled,
50
+ children = props.children,
51
+ menuStyle = props.menuStyle,
52
+ style = props.style,
53
+ toggleProps = _objectWithoutPropertiesLoose(props, ["as", "title", "onClose", "onOpen", "onToggle", "eventKey", "trigger", "placement", "toggleAs", "toggleClassName", "classPrefix", "className", "disabled", "children", "menuStyle", "style"]);
54
+
55
+ var _useClassNames = useClassNames(classPrefix),
56
+ merge = _useClassNames.merge,
57
+ withClassPrefix = _useClassNames.withClassPrefix;
58
+
59
+ var _useClassNames2 = useClassNames('dropdown-menu'),
60
+ withMenuClassPrefix = _useClassNames2.withClassPrefix,
61
+ mergeMenuClassName = _useClassNames2.merge;
62
+
63
+ var menuButtonTriggers = useMemo(function () {
64
+ if (!trigger) {
65
+ return undefined;
66
+ }
67
+
68
+ var triggerMap = {
69
+ hover: 'mouseover',
70
+ click: 'click',
71
+ contextMenu: 'contextmenu'
72
+ };
73
+
74
+ if (!Array.isArray(trigger)) {
75
+ return [triggerMap[trigger]];
76
+ }
77
+
78
+ return trigger.map(function (t) {
79
+ return triggerMap[t];
80
+ });
81
+ }, [trigger]);
82
+
83
+ var _useReducer = useReducer(reducer, initialState),
84
+ items = _useReducer[0].items;
85
+
86
+ var hasSelectedItem = useMemo(function () {
87
+ return items.some(function (item) {
88
+ return item.props.selected;
89
+ });
90
+ }, [items]);
91
+
92
+ var renderMenuButton = function renderMenuButton(menuButtonProps, menuButtonRef) {
93
+ return /*#__PURE__*/React.createElement(NavDropdownToggle, _extends({
94
+ ref: menuButtonRef,
95
+ as: toggleAs,
96
+ className: toggleClassName,
97
+ placement: placement,
98
+ disabled: disabled
99
+ }, omit(menuButtonProps, ['open']), omit(toggleProps, ['data-testid'])), title);
100
+ };
101
+
102
+ return /*#__PURE__*/React.createElement(Menu, {
103
+ renderMenuButton: renderMenuButton,
104
+ openMenuOn: menuButtonTriggers,
105
+ renderMenuPopup: function renderMenuPopup(_ref, popupRef) {
106
+ var open = _ref.open,
107
+ popupProps = _objectWithoutPropertiesLoose(_ref, ["open"]);
108
+
109
+ var menuClassName = mergeMenuClassName(className, withMenuClassPrefix());
110
+ return /*#__PURE__*/React.createElement("ul", _extends({
111
+ ref: popupRef,
112
+ className: menuClassName,
113
+ style: menuStyle,
114
+ hidden: !open
115
+ }, popupProps), children);
116
+ },
117
+ onToggleMenu: function onToggleMenu(open, event) {
118
+ onToggle === null || onToggle === void 0 ? void 0 : onToggle(open, eventKey, event);
119
+
120
+ if (open) {
121
+ onOpen === null || onOpen === void 0 ? void 0 : onOpen();
122
+ } else {
123
+ onClose === null || onClose === void 0 ? void 0 : onClose();
124
+ }
125
+ }
126
+ }, function (_ref2, menuContainerRef) {
127
+ var _withClassPrefix;
128
+
129
+ var open = _ref2.open,
130
+ menuContainer = _objectWithoutPropertiesLoose(_ref2, ["open"]);
131
+
132
+ var classes = merge(className, withClassPrefix((_withClassPrefix = {}, _withClassPrefix["placement-" + kebabCase(placementPolyfill(placement))] = !!placement, _withClassPrefix.disabled = disabled, _withClassPrefix.open = open, _withClassPrefix['selected-within'] = hasSelectedItem, _withClassPrefix)));
133
+ return /*#__PURE__*/React.createElement(Component, _extends({
134
+ ref: mergeRefs(ref, menuContainerRef),
135
+ className: classes
136
+ }, menuContainer, pick(toggleProps, ['data-testid']), {
137
+ style: style
138
+ }));
139
+ });
140
+ });
141
+ NavDropdown.Item = NavDropdownItem;
142
+ NavDropdown.Menu = NavDropdownMenu;
143
+ NavDropdown.displayName = 'Nav.Dropdown';
144
+ NavDropdown.propTypes = {
145
+ classPrefix: PropTypes.string,
146
+ trigger: PropTypes.oneOfType([PropTypes.array, PropTypes.oneOf(['click', 'hover', 'contextMenu'])]),
147
+ placement: PropTypes.oneOf(PLACEMENT_8),
148
+ title: PropTypes.node,
149
+ disabled: PropTypes.bool,
150
+ icon: PropTypes.node,
151
+ menuStyle: PropTypes.object,
152
+ className: PropTypes.string,
153
+ toggleClassName: PropTypes.string,
154
+ children: PropTypes.node,
155
+ open: deprecatePropType(PropTypes.bool),
156
+ eventKey: PropTypes.any,
157
+ as: PropTypes.elementType,
158
+ toggleAs: PropTypes.elementType,
159
+ noCaret: PropTypes.bool,
160
+ style: PropTypes.object,
161
+ onClose: PropTypes.func,
162
+ onOpen: PropTypes.func,
163
+ onToggle: PropTypes.func,
164
+ onMouseEnter: PropTypes.func,
165
+ onMouseLeave: PropTypes.func,
166
+ onContextMenu: PropTypes.func,
167
+ onClick: PropTypes.func,
168
+ renderToggle: PropTypes.func
169
+ };
170
+ export default NavDropdown;
@@ -0,0 +1,39 @@
1
+ import { RsRefForwardingComponent, WithAsProps } from '../@types/common';
2
+ import React from 'react';
3
+ import { IconProps } from '@rsuite/icons/lib/Icon';
4
+ export interface NavDropdownItemProps<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
+ /**
22
+ * The sub-level menu appears from the right side by default, and when `pullLeft` is set, it appears from the left.
23
+ * @deprecated Submenus are now pointing the same direction.
24
+ */
25
+ pullLeft?: boolean;
26
+ /**
27
+ * Whether the submenu is opened.
28
+ * @deprecated
29
+ * @internal
30
+ */
31
+ open?: boolean;
32
+ /** Select the callback function for the current option */
33
+ onSelect?: (eventKey: T, event: React.SyntheticEvent) => void;
34
+ }
35
+ /**
36
+ * @private
37
+ */
38
+ declare const NavDropdownItem: RsRefForwardingComponent<'li', NavDropdownItemProps>;
39
+ export default NavDropdownItem;
@@ -0,0 +1,123 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ import React, { useCallback, useContext } from 'react';
4
+ import PropTypes from 'prop-types';
5
+ import deprecatePropType from '../utils/deprecatePropType';
6
+ import MenuItem from '../Menu/MenuItem';
7
+ import isNil from 'lodash/isNil';
8
+ import { mergeRefs, shallowEqual, useClassNames } from '../utils';
9
+ import NavContext from './NavContext';
10
+ import { useRenderDropdownItem } from '../Dropdown/useRenderDropdownItem';
11
+
12
+ /**
13
+ * @private
14
+ */
15
+ var NavDropdownItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
+ var nav = useContext(NavContext);
17
+
18
+ if (!nav) {
19
+ throw new Error('<Nav.Dropdown.Item> should be used within a <Nav> component.');
20
+ }
21
+
22
+ var _props$classPrefix = props.classPrefix,
23
+ classPrefix = _props$classPrefix === void 0 ? 'dropdown-item' : _props$classPrefix,
24
+ className = props.className,
25
+ activeProp = props.active,
26
+ eventKey = props.eventKey,
27
+ onSelect = props.onSelect,
28
+ icon = props.icon,
29
+ _props$as = props.as,
30
+ Component = _props$as === void 0 ? 'li' : _props$as,
31
+ divider = props.divider,
32
+ panel = props.panel,
33
+ children = props.children,
34
+ disabled = props.disabled,
35
+ restProps = _objectWithoutPropertiesLoose(props, ["classPrefix", "className", "active", "eventKey", "onSelect", "icon", "as", "divider", "panel", "children", "disabled"]);
36
+
37
+ var activeKey = nav.activeKey,
38
+ onSelectFromNav = nav.onSelect;
39
+
40
+ var _useClassNames = useClassNames(classPrefix),
41
+ merge = _useClassNames.merge,
42
+ withClassPrefix = _useClassNames.withClassPrefix,
43
+ prefix = _useClassNames.prefix;
44
+
45
+ var selected = activeProp || !isNil(eventKey) && shallowEqual(activeKey, eventKey);
46
+ var handleSelectItem = useCallback(function (event) {
47
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(eventKey, event);
48
+ onSelectFromNav === null || onSelectFromNav === void 0 ? void 0 : onSelectFromNav(eventKey, event);
49
+ }, [onSelect, eventKey, onSelectFromNav]);
50
+ var renderDropdownItem = useRenderDropdownItem(Component);
51
+
52
+ if (divider) {
53
+ return renderDropdownItem(_extends({
54
+ ref: ref,
55
+ role: 'separator',
56
+ className: merge(prefix('divider'), className)
57
+ }, restProps));
58
+ }
59
+
60
+ if (panel) {
61
+ return renderDropdownItem(_extends({
62
+ ref: ref,
63
+ className: merge(prefix('panel'), className),
64
+ children: children
65
+ }, restProps));
66
+ }
67
+
68
+ return /*#__PURE__*/React.createElement(MenuItem, {
69
+ selected: selected,
70
+ disabled: disabled,
71
+ onActivate: handleSelectItem
72
+ }, function (_ref, menuitemRef) {
73
+ var selected = _ref.selected,
74
+ active = _ref.active,
75
+ menuitem = _objectWithoutPropertiesLoose(_ref, ["selected", "active"]);
76
+
77
+ var classes = merge(className, withClassPrefix({
78
+ 'with-icon': icon,
79
+ active: selected,
80
+ disabled: disabled,
81
+ focus: active,
82
+ divider: divider,
83
+ panel: panel
84
+ }));
85
+ var dataAttributes = {
86
+ 'data-event-key': eventKey
87
+ };
88
+
89
+ if (!isNil(eventKey) && typeof eventKey !== 'string') {
90
+ dataAttributes['data-event-key-type'] = typeof eventKey;
91
+ }
92
+
93
+ return renderDropdownItem(_extends({
94
+ ref: mergeRefs(ref, menuitemRef),
95
+ className: classes
96
+ }, menuitem, dataAttributes, restProps, {
97
+ children: /*#__PURE__*/React.createElement(React.Fragment, null, icon && /*#__PURE__*/React.cloneElement(icon, {
98
+ className: prefix('menu-icon')
99
+ }), children)
100
+ }));
101
+ });
102
+ });
103
+ NavDropdownItem.displayName = 'Nav.Dropdown.Item';
104
+ NavDropdownItem.propTypes = {
105
+ as: PropTypes.elementType,
106
+ divider: PropTypes.bool,
107
+ panel: PropTypes.bool,
108
+ trigger: PropTypes.oneOfType([PropTypes.array, PropTypes.oneOf(['click', 'hover'])]),
109
+ open: deprecatePropType(PropTypes.bool),
110
+ active: PropTypes.bool,
111
+ disabled: PropTypes.bool,
112
+ pullLeft: deprecatePropType(PropTypes.bool),
113
+ onSelect: PropTypes.func,
114
+ onClick: PropTypes.func,
115
+ icon: PropTypes.node,
116
+ eventKey: PropTypes.any,
117
+ className: PropTypes.string,
118
+ style: PropTypes.object,
119
+ children: PropTypes.node,
120
+ classPrefix: PropTypes.string,
121
+ tabIndex: PropTypes.number
122
+ };
123
+ export default NavDropdownItem;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { StandardProps } from '../@types/common';
3
+ import { IconProps } from '@rsuite/icons/lib/Icon';
4
+ export interface NavDropdownMenuProps<T = any> extends StandardProps {
5
+ /** Define the title as a submenu */
6
+ title?: React.ReactNode;
7
+ /** The submenu expands from the left and defaults to the right */
8
+ pullLeft?: boolean;
9
+ /**
10
+ * Only used for setting the default expand state when it's a submenu.
11
+ */
12
+ eventKey?: T;
13
+ /** Set the icon */
14
+ icon?: React.ReactElement<IconProps>;
15
+ open?: boolean;
16
+ collapsible?: boolean;
17
+ expanded?: boolean;
18
+ active?: boolean;
19
+ disabled?: boolean;
20
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
21
+ }
22
+ /**
23
+ * @private
24
+ */
25
+ declare const NavDropdownMenu: React.ForwardRefExoticComponent<NavDropdownMenuProps<any> & Omit<React.HTMLAttributes<HTMLUListElement>, "title" | "onSelect"> & React.RefAttributes<HTMLElement>>;
26
+ export default NavDropdownMenu;
@@ -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 = {