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
@@ -7,4 +7,7 @@ export interface MenubarProps {
7
7
  /** Callback triggered when an item is being activated */
8
8
  onActivateItem?: (event: React.SyntheticEvent) => void;
9
9
  }
10
+ /**
11
+ * @private
12
+ */
10
13
  export default function Menubar({ vertical, children, onActivateItem }: MenubarProps): JSX.Element;
@@ -6,6 +6,10 @@ import { KEY_VALUES, useCustom } from '../utils';
6
6
  import { isFocusEntering, isFocusLeaving } from '../utils/events';
7
7
  import useMenu from './useMenu';
8
8
  import { isFocusableElement } from '../utils/dom';
9
+
10
+ /**
11
+ * @private
12
+ */
9
13
  export default function Menubar(_ref) {
10
14
  var _items$activeItemInde3;
11
15
 
package/esm/Nav/Nav.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import NavItem from './NavItem';
3
- import Dropdown from '../Dropdown';
4
3
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
+ import NavDropdown from './NavDropdown';
5
+ import NavMenu from './NavMenu';
5
6
  export interface NavProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect'> {
6
7
  /** sets appearance */
7
8
  appearance?: 'default' | 'subtle' | 'tabs';
@@ -19,8 +20,12 @@ export interface NavProps<T = any> extends WithAsProps, Omit<React.HTMLAttribute
19
20
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
20
21
  }
21
22
  interface NavComponent extends RsRefForwardingComponent<'div', NavProps> {
22
- Dropdown: typeof Dropdown;
23
+ /**
24
+ * @deprecated Use <Nav.Menu> instead.
25
+ */
26
+ Dropdown: typeof NavDropdown;
23
27
  Item: typeof NavItem;
28
+ Menu: typeof NavMenu;
24
29
  }
25
30
  declare const Nav: NavComponent;
26
31
  export default Nav;
package/esm/Nav/Nav.js CHANGED
@@ -1,15 +1,24 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useContext, useMemo } from 'react';
3
+ import React, { useContext, useEffect, useMemo } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import NavItem from './NavItem';
6
- import Dropdown from '../Dropdown';
7
6
  import { useClassNames } from '../utils';
8
7
  import { NavbarContext } from '../Navbar/Navbar';
9
8
  import { SidenavContext } from '../Sidenav/Sidenav';
10
9
  import NavContext from './NavContext';
11
10
  import useEnsuredRef from '../utils/useEnsuredRef';
12
11
  import Menubar from '../Menu/Menubar';
12
+ import NavDropdown from './NavDropdown';
13
+ import NavMenu, { NavMenuActionType, NavMenuContext } from './NavMenu';
14
+ import deprecateComponent from '../utils/deprecateComponent';
15
+ import NavDropdownItem from './NavDropdownItem';
16
+ import NavDropdownMenu from './NavDropdownMenu';
17
+ import NavbarDropdownItem from '../Navbar/NavbarDropdownItem';
18
+ import SidenavDropdownItem from '../Sidenav/SidenavDropdownItem';
19
+ import NavbarItem from '../Navbar/NavbarItem';
20
+ import SidenavItem from '../Sidenav/SidenavItem';
21
+ import useInternalId from '../utils/useInternalId';
13
22
  var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
14
23
  var _props$as = props.as,
15
24
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -57,7 +66,6 @@ var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
57
66
  var activeKey = activeKeyProp !== null && activeKeyProp !== void 0 ? activeKeyProp : activeKeyFromSidenav;
58
67
  var contextValue = useMemo(function () {
59
68
  return {
60
- withinNav: true,
61
69
  activeKey: activeKey,
62
70
  onSelect: onSelectProp !== null && onSelectProp !== void 0 ? onSelectProp : onSelectFromSidenav
63
71
  };
@@ -97,8 +105,91 @@ var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
97
105
  className: prefix('bar')
98
106
  })));
99
107
  });
100
- Nav.Dropdown = Dropdown;
101
- Nav.Item = NavItem;
108
+ var DeprecatedNavDropdown = deprecateComponent(NavDropdown, '<Nav.Dropdown> is deprecated, use <Nav.Menu> instead.');
109
+ DeprecatedNavDropdown.Menu = deprecateComponent(NavDropdownMenu, '<Nav.Dropdown.Menu> is deprecated, use <Nav.Menu> instead');
110
+ DeprecatedNavDropdown.Item = deprecateComponent(NavDropdownItem, '<Nav.Dropdown.Item> is deprecated, use <Nav.Item> instead');
111
+ Nav.Dropdown = DeprecatedNavDropdown;
112
+ /**
113
+ * The <Nav.Item> API
114
+ * When used as direct child of <Nav>, render the NavItem
115
+ * When used within a <Nav.Menu>, render the NavDropdownItem
116
+ */
117
+
118
+ Nav.Item = /*#__PURE__*/React.forwardRef(function (props, ref) {
119
+ var nav = useContext(NavContext);
120
+
121
+ if (!nav) {
122
+ throw new Error('<Nav.Item> must be rendered within a <Nav> component.');
123
+ }
124
+
125
+ var parentNavMenu = useContext(NavMenuContext);
126
+ var navbar = useContext(NavbarContext);
127
+ var sidenav = useContext(SidenavContext);
128
+
129
+ var _ref2 = parentNavMenu !== null && parentNavMenu !== void 0 ? parentNavMenu : [],
130
+ dispatch = _ref2[1];
131
+
132
+ var _id = useInternalId('Nav.Item');
133
+
134
+ useEffect(function () {
135
+ if (dispatch) {
136
+ var _props$active;
137
+
138
+ dispatch({
139
+ type: NavMenuActionType.RegisterItem,
140
+ payload: {
141
+ _id: _id,
142
+ eventKey: props.eventKey,
143
+ active: (_props$active = props.active) !== null && _props$active !== void 0 ? _props$active : false
144
+ }
145
+ });
146
+ return function () {
147
+ dispatch({
148
+ type: NavMenuActionType.UnregisterItem,
149
+ payload: {
150
+ _id: _id
151
+ }
152
+ });
153
+ };
154
+ }
155
+ }, [dispatch, _id, props.eventKey, props.active]);
156
+
157
+ if (parentNavMenu) {
158
+ if (navbar) {
159
+ return /*#__PURE__*/React.createElement(NavbarDropdownItem, _extends({
160
+ ref: ref
161
+ }, props));
162
+ }
163
+
164
+ if (sidenav) {
165
+ return /*#__PURE__*/React.createElement(SidenavDropdownItem, _extends({
166
+ ref: ref
167
+ }, props));
168
+ }
169
+
170
+ return /*#__PURE__*/React.createElement(NavDropdownItem, _extends({
171
+ ref: ref
172
+ }, props));
173
+ }
174
+
175
+ if (navbar) {
176
+ return /*#__PURE__*/React.createElement(NavbarItem, _extends({
177
+ ref: ref
178
+ }, props));
179
+ }
180
+
181
+ if (sidenav) {
182
+ return /*#__PURE__*/React.createElement(SidenavItem, _extends({
183
+ ref: ref
184
+ }, props));
185
+ }
186
+
187
+ return /*#__PURE__*/React.createElement(NavItem, _extends({
188
+ ref: ref
189
+ }, props));
190
+ });
191
+ Nav.Item.displayName = 'Nav.Item';
192
+ Nav.Menu = NavMenu;
102
193
  Nav.displayName = 'Nav';
103
194
  Nav.propTypes = {
104
195
  classPrefix: PropTypes.string,
@@ -1,13 +1,7 @@
1
1
  import React from 'react';
2
2
  export interface NavContextProps {
3
- /**
4
- * Whether component is rendered within a <Nav>
5
- *
6
- * FIXME: Bad design. Should use NavContextProps | null to determin whether within a <Nav>
7
- */
8
- withinNav: boolean;
9
- activeKey: string | null;
3
+ activeKey: string | undefined;
10
4
  onSelect?: (eventKey: string | undefined, event: React.SyntheticEvent) => void;
11
5
  }
12
- declare const NavContext: React.Context<NavContextProps>;
6
+ declare const NavContext: React.Context<NavContextProps | null>;
13
7
  export default NavContext;
@@ -1,8 +1,3 @@
1
1
  import React from 'react';
2
- import noop from 'lodash/noop';
3
- var NavContext = /*#__PURE__*/React.createContext({
4
- withinNav: false,
5
- activeKey: null,
6
- onSelect: noop
7
- });
2
+ var NavContext = /*#__PURE__*/React.createContext(null);
8
3
  export default NavContext;
@@ -0,0 +1,71 @@
1
+ import React from 'react';
2
+ import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
+ import Button from '../Button';
4
+ import NavDropdownItem from './NavDropdownItem';
5
+ import NavDropdownMenu from './NavDropdownMenu';
6
+ import { NavDropdownToggleProps } from './NavDropdownToggle';
7
+ export declare type NavDropdownTrigger = 'click' | 'hover' | 'contextMenu';
8
+ export interface NavDropdownProps<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?: NavDropdownToggleProps['icon'];
13
+ /** Triggering events */
14
+ trigger?: NavDropdownTrigger | readonly NavDropdownTrigger[];
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
+ /** The value of the current option */
24
+ eventKey?: T;
25
+ /** You can use a custom element type for this toggle component */
26
+ toggleAs?: React.ElementType;
27
+ /** No caret variation */
28
+ noCaret?: NavDropdownToggleProps['noCaret'];
29
+ /**
30
+ * Open the menu and control it
31
+ * @deprecated
32
+ */
33
+ open?: boolean;
34
+ /**
35
+ * @deprecated
36
+ */
37
+ renderTitle?: (children: React.ReactNode) => React.ReactNode;
38
+ /** Custom Toggle */
39
+ renderToggle?: (props: WithAsProps, ref: React.Ref<any>) => any;
40
+ /** The callback function that the menu closes */
41
+ onClose?: () => void;
42
+ /** Menu Pop-up callback function */
43
+ onOpen?: () => void;
44
+ /** Callback function for menu state switching */
45
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
46
+ }
47
+ export interface NavDropdownComponent extends RsRefForwardingComponent<'div', NavDropdownProps> {
48
+ <ToggleAs extends React.ElementType = typeof Button>(props: NavDropdownProps & {
49
+ ref?: React.Ref<any>;
50
+ toggleAs?: ToggleAs;
51
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
52
+ /**
53
+ * @deprecated Use <Nav.Item> instead.
54
+ */
55
+ Item: typeof NavDropdownItem;
56
+ /**
57
+ * @deprecated Use <Nav.Menu> instead.
58
+ */
59
+ Menu: typeof NavDropdownMenu;
60
+ }
61
+ /**
62
+ * @private this component is not supposed to be used directly
63
+ * Instead it's rendered by a <Nav.Menu> call
64
+ *
65
+ * <Nav>
66
+ * <Nav.Menu> -> This will render <NavDropdown> component
67
+ * </Nav.Menu>
68
+ * </Nav>
69
+ */
70
+ declare const NavDropdown: NavDropdownComponent;
71
+ export default NavDropdown;
@@ -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;