@ringcentral/spring-ui 1.12.0 → 1.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 (213) hide show
  1. package/Accordion.js +90 -34
  2. package/AccordionHeader.js +71 -21
  3. package/Alert.js +120 -28
  4. package/Animation.js +2 -46
  5. package/Announcement.js +46 -35
  6. package/Autocomplete.js +1011 -583
  7. package/Avatar.js +134 -73
  8. package/AvatarGroup.js +50 -7
  9. package/Backdrop.js +45 -7
  10. package/Badge.js +77 -15
  11. package/Block.js +34 -12
  12. package/BlockHeader.js +57 -15
  13. package/BottomNavigation.js +181 -65
  14. package/BottomNavigationItem.js +93 -30
  15. package/Button.js +160 -24
  16. package/CallButton.js +53 -31
  17. package/Checkbox.js +88 -26
  18. package/Chip.js +126 -26
  19. package/CircularProgressIndicator.js +80 -8
  20. package/ClickAwayListener.js +4 -1
  21. package/ComponentsProps.js +1 -0
  22. package/DatePicker.js +611 -192
  23. package/DateUtilsContext.js +43 -25
  24. package/Dialer.js +564 -253
  25. package/Dialog.js +99 -45
  26. package/Divider.js +43 -7
  27. package/DragHandle.js +32 -6
  28. package/Drawer.js +117 -19
  29. package/Dropdown.js +154 -77
  30. package/EmptyState.js +65 -15
  31. package/FabButton.js +51 -17
  32. package/FocusTrap.js +109 -12
  33. package/FormField.js +108 -12
  34. package/FormLabel.js +81 -7
  35. package/Icon.js +1 -8
  36. package/IconButton.js +142 -26
  37. package/IconButtonGroup.js +35 -12
  38. package/InlineEditable.js +98 -44
  39. package/LinearProgressIndicator.js +73 -24
  40. package/Link.js +40 -11
  41. package/List.js +54 -9
  42. package/ListItem.js +152 -23
  43. package/ListItemText.js +44 -17
  44. package/ListNavigation.js +272 -20
  45. package/Menu.js +139 -23
  46. package/MenuActions.js +37 -12
  47. package/MenuDivider.js +34 -8
  48. package/MenuFooter.js +36 -12
  49. package/MenuHeader.js +54 -16
  50. package/MenuItem.js +402 -35
  51. package/MenuItemText.js +51 -9
  52. package/MenuList.js +87 -36
  53. package/Modal.js +345 -16
  54. package/NestedMenuContext.js +183 -11
  55. package/Option.js +32 -36
  56. package/Overlap.js +54 -7
  57. package/PageHeader.js +62 -24
  58. package/PickerTextField.js +156 -35
  59. package/Popover.js +262 -21
  60. package/Popper.js +112 -62
  61. package/PopperPaper.js +54 -8
  62. package/Portal.js +6 -1
  63. package/Radio.js +65 -21
  64. package/RadioGroup.js +56 -17
  65. package/Rating.js +223 -87
  66. package/Select.js +387 -44
  67. package/SingleFilter.js +148 -79
  68. package/Skeleton.js +68 -17
  69. package/Slider.js +167 -69
  70. package/Snackbar.js +122 -59
  71. package/SortableList.js +32 -12
  72. package/SortableListDndContext.js +69 -22
  73. package/SortableListItem.js +92 -47
  74. package/SortableVirtualizedList.js +44 -20
  75. package/SplitButton.js +124 -89
  76. package/Squircle.js +4 -7
  77. package/StatusIndicator.js +51 -9
  78. package/Step.js +63 -38
  79. package/StepButton.js +51 -23
  80. package/StepConnector.js +48 -8
  81. package/StepContent.js +67 -24
  82. package/StepIcon.js +90 -9
  83. package/StepLabel.js +90 -14
  84. package/Stepper.js +65 -23
  85. package/SubMenu.js +203 -101
  86. package/SwipeableDrawer.js +439 -194
  87. package/Switch.js +70 -23
  88. package/Tab.js +120 -57
  89. package/TabContext.js +59 -15
  90. package/TabPanel.js +40 -13
  91. package/Table.js +60 -17
  92. package/TableBody.js +42 -12
  93. package/TableCell.js +84 -50
  94. package/TableContainer.js +32 -10
  95. package/TableFooter.js +38 -10
  96. package/TableHead.js +49 -15
  97. package/TablePagination.js +153 -79
  98. package/TableRow.js +60 -21
  99. package/Tabs.js +592 -271
  100. package/Tag.js +51 -16
  101. package/Text.js +68 -37
  102. package/TextField.js +209 -31
  103. package/Textarea.js +51 -42
  104. package/TimePicker.js +490 -232
  105. package/Tooltip.js +48 -23
  106. package/Tray.js +237 -13
  107. package/TrayMenu.js +62 -43
  108. package/VirtualizedList.js +205 -107
  109. package/VirtualizedMenu.js +359 -29
  110. package/VisuallyHidden.js +29 -6
  111. package/chunks/1250.js +98 -0
  112. package/chunks/1294.js +126 -0
  113. package/chunks/2956.js +18 -0
  114. package/chunks/4476.js +460 -0
  115. package/chunks/4491.js +10 -0
  116. package/chunks/4535.js +364 -0
  117. package/chunks/5047.js +3 -0
  118. package/chunks/6335.js +24 -0
  119. package/chunks/7279.js +10 -0
  120. package/chunks/8011.js +8 -0
  121. package/chunks/8307.js +56 -0
  122. package/chunks/8467.js +8 -0
  123. package/chunks/8809.js +8 -0
  124. package/chunks/{RadioGroup.context.js → 9551.js} +12 -6
  125. package/chunks/987.js +8 -0
  126. package/index.css +2436 -2261
  127. package/index.js +245 -195
  128. package/internal/utils/setRef.d.ts +2 -1
  129. package/package.json +4 -4
  130. package/src/Animation/hooks/useMotionSafeTransition/useMotionSafeTransition.d.ts +2 -0
  131. package/src/Autocomplete/SuggestionList/SuggestionList.d.ts +1 -1
  132. package/src/Button/Button.classes.d.ts +1 -1
  133. package/src/ComponentsProps.d.ts +111 -110
  134. package/src/DatePicker/DatePickerDataAttributes.d.ts +11 -0
  135. package/src/DatePicker/utils/DatePickerUtils.d.ts +1 -1
  136. package/src/MenuItem/MenuItem.type.d.ts +1 -0
  137. package/src/MenuList/MenuListContext.d.ts +2 -3
  138. package/src/Modal/Modal.type.d.ts +1 -0
  139. package/src/Popover/Popover.classes.d.ts +1 -1
  140. package/src/Popover/Popover.internal.d.ts +8 -0
  141. package/src/Popover/Popover.type.d.ts +1 -0
  142. package/src/Select/Select.type.d.ts +6 -4
  143. package/src/Table/Table.type.d.ts +3 -0
  144. package/src/Table/TableContext.d.ts +3 -0
  145. package/src/Table/TableRowContext.d.ts +7 -0
  146. package/src/Table/index.d.ts +1 -0
  147. package/src/TableCell/TableCell.classes.d.ts +1 -1
  148. package/src/TableFooter/TableFooter.classes.d.ts +1 -1
  149. package/src/TableFooter/TableFooter.type.d.ts +1 -0
  150. package/src/TableHead/TableHead.classes.d.ts +1 -1
  151. package/src/TableHead/TableHead.type.d.ts +1 -0
  152. package/src/TableRow/TableRow.type.d.ts +2 -0
  153. package/chunks/AccordionContext.js +0 -6
  154. package/chunks/Alert.js +0 -48
  155. package/chunks/AvatarGroup.js +0 -22
  156. package/chunks/Backdrop.js +0 -18
  157. package/chunks/Badge.js +0 -32
  158. package/chunks/BottomNavigationItem.js +0 -36
  159. package/chunks/Button.js +0 -88
  160. package/chunks/Chip.js +0 -73
  161. package/chunks/CircularProgressIndicator.js +0 -36
  162. package/chunks/Divider.js +0 -19
  163. package/chunks/DragHandle.js +0 -11
  164. package/chunks/Drawer.js +0 -33
  165. package/chunks/ExpandCollapseCaret.js +0 -24
  166. package/chunks/FormLabel.js +0 -27
  167. package/chunks/Icon.js +0 -25
  168. package/chunks/IconButtonLabel.js +0 -68
  169. package/chunks/List.js +0 -22
  170. package/chunks/ListItem.js +0 -83
  171. package/chunks/Menu.js +0 -61
  172. package/chunks/MenuDivider.js +0 -14
  173. package/chunks/MenuItemText.js +0 -18
  174. package/chunks/MenuList.js +0 -47
  175. package/chunks/Modal.js +0 -211
  176. package/chunks/Overlap.js +0 -25
  177. package/chunks/PickerTextField.js +0 -85
  178. package/chunks/Popover.js +0 -61
  179. package/chunks/PopperPaper.js +0 -15
  180. package/chunks/Select.js +0 -225
  181. package/chunks/ShowHideEye.js +0 -56
  182. package/chunks/SlideIn.js +0 -20
  183. package/chunks/SortableArrow.js +0 -73
  184. package/chunks/Squircle.js +0 -31
  185. package/chunks/StatusIndicator.js +0 -20
  186. package/chunks/StepConnector.js +0 -21
  187. package/chunks/StepIcon.js +0 -43
  188. package/chunks/StepLabel.js +0 -29
  189. package/chunks/StepperContext.js +0 -9
  190. package/chunks/TableContext.js +0 -6
  191. package/chunks/Tablelvl2Context.js +0 -6
  192. package/chunks/TabsContext.js +0 -6
  193. package/chunks/TextField.js +0 -110
  194. package/chunks/Tooltip.js +0 -217
  195. package/chunks/VirtualizedMenu.js +0 -162
  196. package/chunks/VisuallyHidden.js +0 -12
  197. package/chunks/composeEventHandlers.js +0 -10
  198. package/chunks/getFade.js +0 -27
  199. package/chunks/getGrow.js +0 -70
  200. package/chunks/getSlideIn.js +0 -30
  201. package/chunks/hasContent.js +0 -3
  202. package/chunks/useAnimationFrame.js +0 -15
  203. package/chunks/useFocusTrapStack.js +0 -38
  204. package/chunks/useHelperTextId.js +0 -24
  205. package/chunks/useListNavigation.js +0 -199
  206. package/chunks/useMenuItemSelect.js +0 -282
  207. package/chunks/useMotionSafeTransition.js +0 -9
  208. package/chunks/useNestedMenuItem.js +0 -27
  209. package/chunks/useNestedParentMenu.js +0 -113
  210. package/chunks/usePrefersReducedMotion.js +0 -36
  211. package/chunks/useTooltipForceHide.js +0 -27
  212. package/chunks/useTrayNavigate.js +0 -150
  213. package/chunks/withTooltip.js +0 -15
package/MenuFooter.js CHANGED
@@ -1,18 +1,42 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
4
- import { M as MenuDivider } from './chunks/MenuDivider.js';
5
- import './chunks/Divider.js';
6
- import '@ringcentral/spring-base';
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
4
+ import { MenuDivider as MenuDivider_MenuDivider } from "./MenuDivider.js";
7
5
 
8
- var MenuFooter$1 = {"sui-menu-footer-root":"sui-menu-footer-root","sui-compact":"sui-compact"};
9
6
 
10
- const MenuFooter = forwardRef((inProps, ref) => {
11
- const props = useThemeProps({ props: inProps, name: 'MenuFooter' });
7
+
8
+
9
+ // extracted by css-extract-rspack-plugin
10
+ /* export default */ var MenuFooter = ({"sui-menu-footer-root":"sui-menu-footer-root","sui-compact":"sui-compact"});
11
+
12
+
13
+
14
+
15
+
16
+ const MenuFooter_MenuFooter = /*#__PURE__*/ forwardRef((inProps, ref)=>{
17
+ const props = useThemeProps({
18
+ props: inProps,
19
+ name: 'MenuFooter'
20
+ });
12
21
  const { classes, className, children, divider = true, ...rest } = props;
13
22
  const cls = useClassesWithMode('menu-footer', classes, className);
14
- return (jsxs(Fragment, { children: [divider && jsx(MenuDivider, {}), jsx("div", { className: cls('root'), ...rest, ref: ref, children: children })] }));
23
+ return /*#__PURE__*/ jsxs(Fragment, {
24
+ children: [
25
+ divider && /*#__PURE__*/ jsx(MenuDivider_MenuDivider, {}),
26
+ /*#__PURE__*/ jsx("div", {
27
+ className: cls('root'),
28
+ ...rest,
29
+ ref: ref,
30
+ children: children
31
+ })
32
+ ]
33
+ });
15
34
  });
16
- MenuFooter.displayName = 'SuiMenuFooter';
35
+ MenuFooter_MenuFooter.displayName = 'SuiMenuFooter';
36
+
37
+
38
+
39
+
40
+
17
41
 
18
- export { MenuFooter, MenuFooter$1 as menuFooterStyle };
42
+ export { MenuFooter as menuFooterStyle, MenuFooter_MenuFooter as MenuFooter };
package/MenuHeader.js CHANGED
@@ -1,22 +1,60 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
4
- import { h as hasContent } from './chunks/hasContent.js';
5
- import '@mui/utils';
6
- import { M as MenuDivider } from './chunks/MenuDivider.js';
7
- import './chunks/Divider.js';
8
- import '@ringcentral/spring-base';
9
-
10
- var MenuHeader$1 = {"sui-menu-header-root":"sui-menu-header-root","sui-menu-header-title":"sui-menu-header-title","sui-menu-header-start":"sui-menu-header-start","sui-menu-header-end":"sui-menu-header-end","sui-compact":"sui-compact"};
11
-
12
- const MenuHeader = forwardRef((inProps, ref) => {
13
- const props = useThemeProps({ props: inProps, name: 'MenuHeader' });
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
4
+ import { MenuDivider as MenuDivider_MenuDivider } from "./MenuDivider.js";
5
+ import { hasContent } from "./chunks/5047.js";
6
+
7
+
8
+
9
+
10
+ // extracted by css-extract-rspack-plugin
11
+ /* export default */ var MenuHeader = ({"sui-menu-header-root":"sui-menu-header-root","sui-menu-header-title":"sui-menu-header-title","sui-menu-header-start":"sui-menu-header-start","sui-menu-header-end":"sui-menu-header-end","sui-compact":"sui-compact"});
12
+
13
+
14
+
15
+
16
+
17
+
18
+ const MenuHeader_MenuHeader = /*#__PURE__*/ forwardRef((inProps, ref)=>{
19
+ const props = useThemeProps({
20
+ props: inProps,
21
+ name: 'MenuHeader'
22
+ });
14
23
  const { classes, className, children, start, end, divider = true, ...rest } = props;
15
24
  const cls = useClassesWithMode('menu-header', classes, className);
16
25
  const hasStart = hasContent(start);
17
26
  const hasEnd = hasContent(end);
18
- return (jsxs(Fragment, { children: [jsxs("div", { className: cls('root'), ...rest, ref: ref, children: [hasStart && jsx("div", { className: cls('start'), children: start }), hasEnd && jsx("div", { className: cls('end'), children: end }), typeof children === 'string' ? (jsx("span", { className: cls('title'), title: children, children: children })) : (children)] }), divider && jsx(MenuDivider, {})] }));
27
+ return /*#__PURE__*/ jsxs(Fragment, {
28
+ children: [
29
+ /*#__PURE__*/ jsxs("div", {
30
+ className: cls('root'),
31
+ ...rest,
32
+ ref: ref,
33
+ children: [
34
+ hasStart && /*#__PURE__*/ jsx("div", {
35
+ className: cls('start'),
36
+ children: start
37
+ }),
38
+ hasEnd && /*#__PURE__*/ jsx("div", {
39
+ className: cls('end'),
40
+ children: end
41
+ }),
42
+ typeof children === 'string' ? /*#__PURE__*/ jsx("span", {
43
+ className: cls('title'),
44
+ title: children,
45
+ children: children
46
+ }) : children
47
+ ]
48
+ }),
49
+ divider && /*#__PURE__*/ jsx(MenuDivider_MenuDivider, {})
50
+ ]
51
+ });
19
52
  });
20
- MenuHeader.displayName = 'SuiMenuHeader';
53
+ MenuHeader_MenuHeader.displayName = 'SuiMenuHeader';
54
+
55
+
56
+
57
+
58
+
21
59
 
22
- export { MenuHeader, MenuHeader$1 as menuHeaderStyle };
60
+ export { MenuHeader as menuHeaderStyle, MenuHeader_MenuHeader as MenuHeader };
package/MenuItem.js CHANGED
@@ -1,35 +1,402 @@
1
- export { A as Action, M as MenuItem, a as MenuItemSelectContext, b as useMenuItem, c as useMenuItemSelect, u as useMenuItemSelectContext, d as useVirtualizedMenuItem } from './chunks/useMenuItemSelect.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import '@ringcentral/spring-base';
5
- import '@ringcentral/spring-icon';
6
- import '@ringcentral/spring-theme';
7
- import './chunks/Icon.js';
8
- import './chunks/useAnimationFrame.js';
9
- import './chunks/useNestedParentMenu.js';
10
- import './chunks/useNestedMenuItem.js';
11
- import './VirtualizedList.js';
12
- import 'react-virtuoso';
13
- import './chunks/List.js';
14
- import './chunks/useListNavigation.js';
15
- import 'tabbable';
16
- import './chunks/composeEventHandlers.js';
17
- import '@mui/utils';
18
- import './ListNavigation.js';
19
- import './chunks/Menu.js';
20
- import './chunks/Popover.js';
21
- import '@floating-ui/react-dom';
22
- import 'framer-motion';
23
- import './chunks/usePrefersReducedMotion.js';
24
- import './chunks/getGrow.js';
25
- import './chunks/Modal.js';
26
- import '@mui/base';
27
- import './chunks/getFade.js';
28
- import './chunks/useFocusTrapStack.js';
29
- import './chunks/Backdrop.js';
30
- import './Popper.js';
31
- import './chunks/PopperPaper.js';
32
-
33
- var MenuItem = {"sui-menu-item-container":"sui-menu-item-container","sui-menu-item-select-indicator":"sui-menu-item-select-indicator","sui-menu-item-select-dot":"sui-menu-item-select-dot","sui-menu-item-root":"sui-menu-item-root","sui-selected":"sui-selected","sui-disabled":"sui-disabled","sui-spruno":"sui-spruno","sui-list-item-text":"sui-list-item-text","sui-focus-visible":"sui-focus-visible","sui-focused":"sui-focused","sui-active":"sui-active","sui-menu-item-nowrap":"sui-menu-item-nowrap","sui-menu-item-text":"sui-menu-item-text","sui-menu-item-selectable":"sui-menu-item-selectable","sui-menu-item-highlighted":"sui-menu-item-highlighted","sui-compact":"sui-compact","sui-menu-item":"sui-menu-item"};
34
-
35
- export { MenuItem as menuItemStyle };
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { createContext, forwardRef, useCallback, useContext, useLayoutEffect, useMemo, useRef } from "react";
3
+ import { combineProps, useActive, useEventCallback, useFocusVisible, useForkRef, useHover, useId } from "@ringcentral/spring-base";
4
+ import { CheckBoldMd } from "@ringcentral/spring-icon";
5
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
6
+ import { useItemNavigation } from "./ListNavigation.js";
7
+ import { useMenuContext } from "./Menu.js";
8
+ import { composeEventHandlers } from "./chunks/4491.js";
9
+ import { useVirtualizedItemPropsContext } from "./VirtualizedList.js";
10
+ import { Icon as Icon_Icon } from "./chunks/8307.js";
11
+ import { useAnimationFrame } from "./chunks/6335.js";
12
+ import { useNestedMenuItem } from "./NestedMenuContext.js";
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+ /**
22
+ * Note: intentionally do NOT set a default value in this context.
23
+ * MenuItem wraps when this is omitted.
24
+ */ const MenuListContext = createContext({});
25
+ const useMenuListContext = ()=>useContext(MenuListContext);
26
+
27
+
28
+
29
+ /**
30
+ * When a `MenuItem` is used as a `SubMenu` trigger, `SubMenu` provides the same
31
+ * id here so `useNestedMenuItem` registers the same identity as the parent hook.
32
+ *
33
+ * Not re-exported from the package barrel — import only from this module inside spring-ui.
34
+ */ const SubMenuTriggerNestedIdContext = /*#__PURE__*/ createContext(null);
35
+
36
+
37
+
38
+ const MenuItemSelectContext = // oxlint-disable-next-line @typescript-eslint/no-explicit-any
39
+ createContext(null);
40
+ const useMenuItemSelectContext = ()=>useContext(MenuItemSelectContext);
41
+
42
+ // extracted by css-extract-rspack-plugin
43
+ /* export default */ var MenuItem = ({"sui-menu-item-container":"sui-menu-item-container","sui-menu-item-select-indicator":"sui-menu-item-select-indicator","sui-menu-item-select-dot":"sui-menu-item-select-dot","sui-menu-item-root":"sui-menu-item-root","sui-selected":"sui-selected","sui-disabled":"sui-disabled","sui-spruno":"sui-spruno","sui-list-item-text":"sui-list-item-text","sui-focus-visible":"sui-focus-visible","sui-focused":"sui-focused","sui-active":"sui-active","sui-menu-item-nowrap":"sui-menu-item-nowrap","sui-menu-item-text":"sui-menu-item-text","sui-menu-item-selectable":"sui-menu-item-selectable","sui-menu-item-highlighted":"sui-menu-item-highlighted","sui-compact":"sui-compact","sui-menu-item":"sui-menu-item"});
44
+
45
+ /**
46
+ * Passes `value` to `ref`.
47
+ *
48
+ * WARNING: Only call this inside a callback that is passed as a ref.
49
+ * Otherwise, clean up the previous `ref` if it changes.
50
+ *
51
+ * @param ref A ref callback or ref object. If falsy, this is a no-op.
52
+ */ function setRef(ref, value) {
53
+ if (typeof ref === 'function') {
54
+ ref(value);
55
+ } else if (ref) {
56
+ ref.current = value;
57
+ }
58
+ }
59
+
60
+
61
+
62
+
63
+
64
+ const useMenuItem = (props)=>{
65
+ const { onBlur, onFocus, onKeyDown, onKeyUp, onClick, ref, disabled, autoClose } = props;
66
+ const { keyboardNavHandlers, itemRef } = useItemNavigation() ?? {};
67
+ const { focusVisible, focusVisibleRef, focusVisibleHandlers } = useFocusVisible({
68
+ onFocus: (e)=>{
69
+ keyboardNavHandlers?.onFocus(e);
70
+ onFocus?.(e);
71
+ },
72
+ onBlur: (e)=>{
73
+ keyboardNavHandlers?.onBlur(e);
74
+ onBlur?.(e);
75
+ }
76
+ });
77
+ const { close: closeMenu } = useMenuContext() ?? {};
78
+ const handleClick = disabled ? undefined : composeEventHandlers(onClick, ()=>{
79
+ if (autoClose) closeMenu?.();
80
+ });
81
+ const { active, activeHandlers } = useActive({
82
+ disabled,
83
+ onKeyDown: (e)=>{
84
+ onKeyDown?.(e);
85
+ keyboardNavHandlers?.onKeyDown(e);
86
+ },
87
+ onKeyUp,
88
+ onClick: handleClick
89
+ });
90
+ const handleItemRef = useForkRef(ref, focusVisibleRef, itemRef);
91
+ // oxlint-disable-next-line @typescript-eslint/no-explicit-any
92
+ const getRootProps = (otherProps = {})=>{
93
+ const { ref: otherRef, ...restOtherProps } = otherProps;
94
+ return {
95
+ role: 'menuitem',
96
+ tabIndex: '-1',
97
+ ...disabled ? {
98
+ 'aria-disabled': true
99
+ } : null,
100
+ ...combineProps(restOtherProps, {
101
+ ...focusVisibleHandlers,
102
+ ...activeHandlers
103
+ }),
104
+ ref: (instance)=>{
105
+ setRef(otherRef, instance);
106
+ setRef(handleItemRef, instance);
107
+ }
108
+ };
109
+ };
110
+ return {
111
+ getRootProps,
112
+ focusVisible,
113
+ active
114
+ };
115
+ };
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+ const useVirtualizedMenuItem = (props)=>{
124
+ const { onBlur, onFocus, onKeyDown, onKeyUp, onClick, disabled, autoClose, ref } = props;
125
+ const { keyboardNavHandlers, itemRef } = useItemNavigation() ?? {};
126
+ const vlItemProps = useVirtualizedItemPropsContext();
127
+ const { focusVisible, focusVisibleRef, focusVisibleHandlers } = // oxlint-disable-next-line react-hooks/rules-of-hooks
128
+ useFocusVisible({
129
+ onFocus: (e)=>{
130
+ keyboardNavHandlers?.onFocus(e);
131
+ onFocus?.(e);
132
+ },
133
+ onBlur: (e)=>{
134
+ keyboardNavHandlers?.onBlur(e);
135
+ onBlur?.(e);
136
+ }
137
+ });
138
+ const { close: closeMenu } = useMenuContext() ?? {};
139
+ const handleClick = disabled ? undefined : composeEventHandlers(onClick, ()=>{
140
+ if (autoClose) closeMenu?.();
141
+ });
142
+ const { active, activeHandlers } = useActive({
143
+ disabled,
144
+ onKeyDown: (e)=>{
145
+ onKeyDown?.(e);
146
+ keyboardNavHandlers?.onKeyDown(e);
147
+ },
148
+ onKeyUp,
149
+ onClick: handleClick
150
+ });
151
+ const handleItemRef = useForkRef(ref, focusVisibleRef, itemRef);
152
+ // oxlint-disable-next-line @typescript-eslint/no-explicit-any
153
+ const getRootProps = (otherProps = {})=>{
154
+ const { ref: otherRef, ...restOtherProps } = otherProps;
155
+ return {
156
+ role: 'menuitem',
157
+ tabIndex: -1,
158
+ ...disabled ? {
159
+ 'aria-disabled': true
160
+ } : null,
161
+ ...combineProps(restOtherProps, {
162
+ ...focusVisibleHandlers,
163
+ ...activeHandlers,
164
+ ...vlItemProps
165
+ }),
166
+ ref: (instance)=>{
167
+ setRef(otherRef, instance);
168
+ setRef(handleItemRef, instance);
169
+ }
170
+ };
171
+ };
172
+ return {
173
+ getRootProps,
174
+ focusVisible,
175
+ active
176
+ };
177
+ };
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+ const MenuItem_MenuItem = /*#__PURE__*/ forwardRef((inProps, ref)=>{
195
+ const props = useThemeProps({
196
+ props: inProps,
197
+ name: 'MenuItem'
198
+ });
199
+ const { classes, className, children, selected, disabled, onMouseEnter, onMouseLeave, onPointerMove, onBlur, onFocus, onKeyDown, onKeyUp, onClick, highlighted = false, focused = false, autoClose = true, autoFocus, nowrap, ...rest } = props;
200
+ const cls = useClassesWithMode('menu-item', classes, className);
201
+ const vlItemProps = useVirtualizedItemPropsContext();
202
+ const isInVlRef = useRef(Boolean(vlItemProps));
203
+ const { requestAnimationFrame } = useAnimationFrame();
204
+ const useMenuItemHook = (()=>{
205
+ if (isInVlRef.current) {
206
+ return useVirtualizedMenuItem;
207
+ } else {
208
+ return useMenuItem;
209
+ }
210
+ })();
211
+ const itemRef = useRef(null);
212
+ const handleRef = useForkRef(itemRef, ref);
213
+ const { getRootProps, focusVisible, active } = useMenuItemHook({
214
+ autoClose,
215
+ disabled,
216
+ onBlur,
217
+ onClick,
218
+ onFocus,
219
+ onKeyDown,
220
+ onKeyUp,
221
+ ref: handleRef
222
+ });
223
+ const selectable = !(selected === undefined);
224
+ const selectContextValue = useMenuItemSelectContext();
225
+ const menuListContextValue = useMenuListContext();
226
+ const resolvedNowrap = nowrap ?? menuListContextValue.nowrap ?? false;
227
+ const selectMode = selectContextValue ? selectContextValue.selectMode : 'single';
228
+ const subMenuTriggerNestedId = useContext(SubMenuTriggerNestedIdContext);
229
+ const generatedId = useId();
230
+ const id = subMenuTriggerNestedId ?? generatedId;
231
+ const isSubMenuTrigger = Boolean(subMenuTriggerNestedId);
232
+ const { requestItemHover } = useNestedMenuItem({
233
+ id
234
+ });
235
+ const { hoverHandlers } = useHover({
236
+ onMouseEnter,
237
+ onMouseLeave
238
+ });
239
+ const handlePointerMove = (event)=>{
240
+ if (event.pointerType === 'mouse' && !requestItemHover(event, {
241
+ closeOpenedSubMenu: !isSubMenuTrigger
242
+ })) {
243
+ event.preventDefault();
244
+ }
245
+ onPointerMove?.(event);
246
+ };
247
+ useLayoutEffect(()=>{
248
+ if (autoFocus) {
249
+ itemRef.current?.focus();
250
+ requestAnimationFrame(()=>{
251
+ if (// jsdom doesn't support scrollIntoView, this avoids users needing to bring their own mock
252
+ process.env.NODE_ENV === 'test' && typeof itemRef.current?.scrollIntoView !== 'function') {
253
+ return;
254
+ }
255
+ itemRef.current?.scrollIntoView({
256
+ block: 'nearest',
257
+ inline: 'nearest'
258
+ });
259
+ });
260
+ }
261
+ }, [
262
+ autoFocus,
263
+ requestAnimationFrame
264
+ ]);
265
+ return /*#__PURE__*/ jsx("div", {
266
+ className: cls('root', {
267
+ selectable,
268
+ selected,
269
+ focusVisible,
270
+ disabled,
271
+ active,
272
+ highlighted,
273
+ focused,
274
+ nowrap: resolvedNowrap
275
+ }),
276
+ ...getRootProps(rest),
277
+ ...hoverHandlers,
278
+ onPointerMove: handlePointerMove,
279
+ children: /*#__PURE__*/ jsxs("div", {
280
+ className: cls('container'),
281
+ children: [
282
+ selectable && /*#__PURE__*/ jsx("div", {
283
+ className: cls('select-indicator'),
284
+ children: selectMode === 'single' ? /*#__PURE__*/ jsx("span", {
285
+ className: cls('select-dot')
286
+ }) : /*#__PURE__*/ jsx(Icon_Icon, {
287
+ symbol: CheckBoldMd,
288
+ size: "small"
289
+ })
290
+ }),
291
+ children
292
+ ]
293
+ })
294
+ });
295
+ });
296
+ MenuItem_MenuItem.displayName = 'SuiMenuItem';
297
+
298
+
299
+
300
+
301
+
302
+
303
+ var useMenuItemSelect_Action = /*#__PURE__*/ function(Action) {
304
+ Action["SELECT"] = "select";
305
+ Action["DESELECT"] = "deselect";
306
+ return Action;
307
+ }({});
308
+ const useMenuItemSelect = (props)=>{
309
+ const { widget = 'menu', selectMode = 'single', value: valueProp = selectMode === 'single' ? null : [], onChange, onClose, autoFocus: autoFocusProp = true } = props;
310
+ const isSingleMode = selectMode === 'single';
311
+ if (process.env.NODE_ENV !== 'production' && !isSingleMode && !Array.isArray(valueProp)) {
312
+ throw Error('SPRING [useMenuItemSelect]: value must be an array if selectMode is multiple');
313
+ }
314
+ const value = valueProp;
315
+ const getMenuItemProps = useCallback((itemValue)=>{
316
+ let selected;
317
+ let autoFocus;
318
+ if (isSingleMode) {
319
+ selected = value === itemValue;
320
+ autoFocus = selected;
321
+ } else {
322
+ selected = value.includes(itemValue);
323
+ autoFocus = value[0] === itemValue;
324
+ }
325
+ const menuItemRole = selectMode === 'single' ? 'menuitemradio' : 'menuitemcheckbox';
326
+ // Use appropriate ARIA attributes based on widget type and role:
327
+ // - For listbox/option pattern: use aria-selected
328
+ // - For menu with selectable items: use menuitemradio/menuitemcheckbox with aria-checked
329
+ const ariaProps = widget === 'menu' ? {
330
+ 'aria-checked': selected
331
+ } : {
332
+ 'aria-selected': selected
333
+ };
334
+ return {
335
+ role: widget === 'menu' ? menuItemRole : 'option',
336
+ ...ariaProps,
337
+ selected,
338
+ autoFocus: autoFocusProp && autoFocus
339
+ };
340
+ }, [
341
+ isSingleMode,
342
+ selectMode,
343
+ widget,
344
+ autoFocusProp,
345
+ value
346
+ ]);
347
+ const handleSelect = useEventCallback((itemValue)=>{
348
+ let action = "select";
349
+ if (isSingleMode) {
350
+ // User clicked on an already selected item
351
+ if (value === itemValue) {
352
+ onClose?.();
353
+ } else {
354
+ onChange?.(itemValue);
355
+ }
356
+ } else {
357
+ const index = value.indexOf(itemValue);
358
+ let newValue;
359
+ if (index >= 0) {
360
+ action = "deselect";
361
+ newValue = [
362
+ ...value.slice(0, index),
363
+ ...value.slice(index + 1)
364
+ ];
365
+ } else {
366
+ newValue = [
367
+ ...value,
368
+ itemValue
369
+ ];
370
+ }
371
+ onChange?.(newValue, {
372
+ value: itemValue,
373
+ action
374
+ });
375
+ }
376
+ });
377
+ const contextValue = useMemo(()=>({
378
+ selectMode,
379
+ value,
380
+ handleSelect,
381
+ getMenuItemProps
382
+ }), [
383
+ getMenuItemProps,
384
+ handleSelect,
385
+ selectMode,
386
+ value
387
+ ]);
388
+ return {
389
+ value,
390
+ contextValue
391
+ };
392
+ };
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+ export { MenuItem as menuItemStyle, MenuItemSelectContext, MenuItem_MenuItem as MenuItem, MenuListContext, SubMenuTriggerNestedIdContext, useMenuItem, useMenuItemSelect, useMenuItemSelectContext, useMenuItemSelect_Action as Action, useMenuListContext, useVirtualizedMenuItem };
package/MenuItemText.js CHANGED
@@ -1,11 +1,53 @@
1
- export { M as MenuItemText } from './chunks/MenuItemText.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import '@ringcentral/spring-base';
5
- import '@ringcentral/spring-theme';
6
- import './chunks/hasContent.js';
7
- import '@mui/utils';
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { getTitle } from "@ringcentral/spring-base";
4
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
5
+ import { hasContent } from "./chunks/5047.js";
8
6
 
9
- var MenuItemText = {"sui-menu-item-text-root":"sui-menu-item-text-root","sui-menu-item-text-primary-text":"sui-menu-item-text-primary-text","sui-menu-item-text-info-text":"sui-menu-item-text-info-text","sui-compact":"sui-compact"};
10
7
 
11
- export { MenuItemText as menuItemTextStyle };
8
+
9
+
10
+
11
+ // extracted by css-extract-rspack-plugin
12
+ /* export default */ var MenuItemText = ({"sui-menu-item-text-root":"sui-menu-item-text-root","sui-menu-item-text-primary-text":"sui-menu-item-text-primary-text","sui-menu-item-text-info-text":"sui-menu-item-text-info-text","sui-compact":"sui-compact"});
13
+
14
+
15
+
16
+
17
+
18
+
19
+ const MenuItemText_MenuItemText = /*#__PURE__*/ forwardRef((inProps, ref)=>{
20
+ const props = useThemeProps({
21
+ props: inProps,
22
+ name: 'MenuItemText'
23
+ });
24
+ const { classes, className, primary, primaryText, infoText, info, children, ...rest } = props;
25
+ const cls = useClassesWithMode('menu-item-text', classes, className);
26
+ const primaryContent = primary ?? primaryText ?? children;
27
+ const secondaryContent = info ?? infoText;
28
+ return /*#__PURE__*/ jsxs("div", {
29
+ className: cls('root'),
30
+ ...rest,
31
+ ref: ref,
32
+ children: [
33
+ /*#__PURE__*/ jsx("span", {
34
+ className: cls('primary-text'),
35
+ title: getTitle(primaryContent),
36
+ children: primaryContent
37
+ }),
38
+ hasContent(secondaryContent) && /*#__PURE__*/ jsx("span", {
39
+ className: cls('info-text'),
40
+ title: getTitle(secondaryContent),
41
+ children: secondaryContent
42
+ })
43
+ ]
44
+ });
45
+ });
46
+ MenuItemText_MenuItemText.displayName = 'SuiMenuItemText';
47
+
48
+
49
+
50
+
51
+
52
+
53
+ export { MenuItemText as menuItemTextStyle, MenuItemText_MenuItemText as MenuItemText };