@ringcentral/spring-ui 1.11.2 → 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 (241) hide show
  1. package/Accordion.js +90 -34
  2. package/AccordionHeader.js +72 -20
  3. package/Alert.js +120 -28
  4. package/Animation.js +2 -45
  5. package/Announcement.js +46 -35
  6. package/Autocomplete.js +1011 -580
  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 +55 -11
  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 -190
  23. package/DateUtilsContext.js +43 -25
  24. package/Dialer.js +576 -250
  25. package/Dialog.js +100 -45
  26. package/Divider.js +43 -7
  27. package/DragHandle.js +32 -6
  28. package/Drawer.js +117 -19
  29. package/Dropdown.js +154 -74
  30. package/EmptyState.js +63 -11
  31. package/FabButton.js +51 -17
  32. package/FocusTrap.js +109 -12
  33. package/FormField.js +106 -8
  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 -16
  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 -15
  50. package/MenuItem.js +402 -33
  51. package/MenuItemText.js +51 -8
  52. package/MenuList.js +87 -34
  53. package/Modal.js +345 -16
  54. package/NestedMenuContext.js +183 -11
  55. package/Option.js +32 -34
  56. package/Overlap.js +54 -7
  57. package/PageHeader.js +62 -24
  58. package/PickerTextField.js +156 -33
  59. package/Popover.js +262 -21
  60. package/Popper.js +130 -77
  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 -41
  67. package/SingleFilter.js +148 -77
  68. package/Skeleton.js +68 -17
  69. package/Slider.js +168 -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 +52 -28
  75. package/SplitButton.js +124 -86
  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 +68 -25
  82. package/StepIcon.js +90 -9
  83. package/StepLabel.js +90 -14
  84. package/Stepper.js +65 -23
  85. package/SubMenu.js +203 -99
  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 -77
  98. package/TableRow.js +60 -21
  99. package/Tabs.js +593 -268
  100. package/Tag.js +51 -16
  101. package/Text.js +68 -37
  102. package/TextField.js +209 -29
  103. package/Textarea.js +51 -40
  104. package/TimePicker.js +490 -230
  105. package/Tooltip.js +48 -23
  106. package/Tray.js +237 -13
  107. package/TrayMenu.js +62 -41
  108. package/VirtualizedList.js +208 -109
  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 +2624 -2416
  127. package/index.js +245 -193
  128. package/internal/utils/index.d.ts +1 -0
  129. package/internal/utils/setRef.d.ts +2 -0
  130. package/package.json +8 -8
  131. package/src/Alert/Alert.type.d.ts +2 -1
  132. package/src/Animation/components/Fade/Fade.d.ts +4 -2
  133. package/src/Animation/components/Grow/Grow.d.ts +4 -2
  134. package/src/Animation/components/ShowHideEye/ShowHideEye.d.ts +1 -1
  135. package/src/Animation/components/SlideIn/SlideIn.d.ts +4 -2
  136. package/src/Animation/components/SlideIn/getSlideIn.d.ts +1 -1
  137. package/src/Animation/hooks/useMotionSafeTransition/useMotionSafeTransition.d.ts +2 -0
  138. package/src/Autocomplete/SuggestionList/SuggestionList.d.ts +1 -1
  139. package/src/Autocomplete/useAutocomplete.d.ts +18 -18
  140. package/src/Autocomplete/useAutocompleteTag.d.ts +18 -18
  141. package/src/Badge/Badge.d.ts +2 -1
  142. package/src/Button/Button.classes.d.ts +1 -1
  143. package/src/ComponentsProps.d.ts +111 -110
  144. package/src/DatePicker/DatePickerDataAttributes.d.ts +11 -0
  145. package/src/DatePicker/utils/DatePickerAriaLabelUtils.d.ts +2 -1
  146. package/src/DatePicker/utils/DatePickerUtils.d.ts +1 -1
  147. package/src/Dialer/DialDelete/DialDelete.d.ts +2 -2
  148. package/src/Dialer/DialPad/DialPad.d.ts +2 -2
  149. package/src/Dialer/Dialer.d.ts +4 -2
  150. package/src/Dropdown/Dropdown.type.d.ts +2 -2
  151. package/src/InlineEditable/InlineEditable.type.d.ts +2 -1
  152. package/src/ListNavigation/useListNavigation.d.ts +3 -3
  153. package/src/MenuActions/MenuActions.d.ts +2 -2
  154. package/src/MenuItem/MenuItem.type.d.ts +1 -0
  155. package/src/MenuItem/useMenuItem.d.ts +1 -1
  156. package/src/MenuItem/useVirtualizedMenuItem.d.ts +1 -1
  157. package/src/MenuList/MenuList.type.d.ts +1 -1
  158. package/src/MenuList/MenuListContext.d.ts +2 -3
  159. package/src/Modal/Modal.type.d.ts +1 -0
  160. package/src/NestedMenuContext/MenuOverlayGroupContext.d.ts +2 -2
  161. package/src/Popover/Popover.classes.d.ts +1 -1
  162. package/src/Popover/Popover.internal.d.ts +8 -0
  163. package/src/Popover/Popover.type.d.ts +1 -0
  164. package/src/Popper/Popper.type.d.ts +10 -7
  165. package/src/Rating/utils.d.ts +3 -2
  166. package/src/Select/Select.type.d.ts +7 -5
  167. package/src/Slider/Slider.d.ts +2 -2
  168. package/src/Slider/SliderThumb.d.ts +2 -1
  169. package/src/Squircle/Squircle.d.ts +1 -1
  170. package/src/StatusIndicator/StatusIndicator.d.ts +2 -1
  171. package/src/SubMenu/PopperMenu.type.d.ts +4 -1
  172. package/src/Table/Table.type.d.ts +3 -0
  173. package/src/Table/TableContext.d.ts +3 -0
  174. package/src/Table/TableRowContext.d.ts +7 -0
  175. package/src/Table/index.d.ts +1 -0
  176. package/src/TableCell/TableCell.classes.d.ts +1 -1
  177. package/src/TableFooter/TableFooter.classes.d.ts +1 -1
  178. package/src/TableFooter/TableFooter.type.d.ts +1 -0
  179. package/src/TableHead/TableHead.classes.d.ts +1 -1
  180. package/src/TableHead/TableHead.type.d.ts +1 -0
  181. package/src/TableRow/TableRow.type.d.ts +2 -0
  182. package/chunks/AccordionContext.js +0 -6
  183. package/chunks/Alert.js +0 -48
  184. package/chunks/AvatarGroup.js +0 -22
  185. package/chunks/Backdrop.js +0 -18
  186. package/chunks/Badge.js +0 -32
  187. package/chunks/BottomNavigationItem.js +0 -36
  188. package/chunks/Button.js +0 -88
  189. package/chunks/Chip.js +0 -73
  190. package/chunks/CircularProgressIndicator.js +0 -36
  191. package/chunks/Divider.js +0 -19
  192. package/chunks/DragHandle.js +0 -11
  193. package/chunks/Drawer.js +0 -32
  194. package/chunks/ExpandCollapseCaret.js +0 -24
  195. package/chunks/FormLabel.js +0 -27
  196. package/chunks/Icon.js +0 -25
  197. package/chunks/IconButtonLabel.js +0 -68
  198. package/chunks/List.js +0 -22
  199. package/chunks/ListItem.js +0 -83
  200. package/chunks/Menu.js +0 -61
  201. package/chunks/MenuDivider.js +0 -14
  202. package/chunks/MenuItemText.js +0 -17
  203. package/chunks/MenuList.js +0 -46
  204. package/chunks/Modal.js +0 -212
  205. package/chunks/Overlap.js +0 -25
  206. package/chunks/PickerTextField.js +0 -85
  207. package/chunks/Popover.js +0 -53
  208. package/chunks/PopperPaper.js +0 -15
  209. package/chunks/Select.js +0 -220
  210. package/chunks/ShowHideEye.js +0 -56
  211. package/chunks/SlideIn.js +0 -19
  212. package/chunks/SortableArrow.js +0 -73
  213. package/chunks/Squircle.js +0 -31
  214. package/chunks/StatusIndicator.js +0 -20
  215. package/chunks/StepConnector.js +0 -21
  216. package/chunks/StepIcon.js +0 -43
  217. package/chunks/StepLabel.js +0 -29
  218. package/chunks/StepperContext.js +0 -9
  219. package/chunks/TableContext.js +0 -6
  220. package/chunks/Tablelvl2Context.js +0 -6
  221. package/chunks/TabsContext.js +0 -6
  222. package/chunks/TextField.js +0 -110
  223. package/chunks/Tooltip.js +0 -217
  224. package/chunks/VirtualizedMenu.js +0 -164
  225. package/chunks/VisuallyHidden.js +0 -12
  226. package/chunks/getFade.js +0 -27
  227. package/chunks/getGrow.js +0 -70
  228. package/chunks/getSlideIn.js +0 -30
  229. package/chunks/hasContent.js +0 -3
  230. package/chunks/useAnimationFrame.js +0 -15
  231. package/chunks/useFocusTrapStack.js +0 -36
  232. package/chunks/useHelperTextId.js +0 -22
  233. package/chunks/useListNavigation.js +0 -199
  234. package/chunks/useMenuItemSelect.js +0 -273
  235. package/chunks/useMotionSafeTransition.js +0 -9
  236. package/chunks/useNestedMenuItem.js +0 -27
  237. package/chunks/useNestedParentMenu.js +0 -113
  238. package/chunks/usePrefersReducedMotion.js +0 -36
  239. package/chunks/useTooltipForceHide.js +0 -27
  240. package/chunks/useTrayNavigate.js +0 -150
  241. 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,21 +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 { M as MenuDivider } from './chunks/MenuDivider.js';
6
- import './chunks/Divider.js';
7
- import '@ringcentral/spring-base';
8
-
9
- 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"};
10
-
11
- const MenuHeader = forwardRef((inProps, ref) => {
12
- 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
+ });
13
23
  const { classes, className, children, start, end, divider = true, ...rest } = props;
14
24
  const cls = useClassesWithMode('menu-header', classes, className);
15
25
  const hasStart = hasContent(start);
16
26
  const hasEnd = hasContent(end);
17
- 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
+ });
18
52
  });
19
- MenuHeader.displayName = 'SuiMenuHeader';
53
+ MenuHeader_MenuHeader.displayName = 'SuiMenuHeader';
54
+
55
+
56
+
57
+
58
+
20
59
 
21
- export { MenuHeader, MenuHeader$1 as menuHeaderStyle };
60
+ export { MenuHeader as menuHeaderStyle, MenuHeader_MenuHeader as MenuHeader };
package/MenuItem.js CHANGED
@@ -1,33 +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 './ListNavigation.js';
17
- import './chunks/Menu.js';
18
- import './chunks/Popover.js';
19
- import '@floating-ui/react-dom';
20
- import 'framer-motion';
21
- import './chunks/usePrefersReducedMotion.js';
22
- import './chunks/getGrow.js';
23
- import './chunks/Modal.js';
24
- import '@mui/base';
25
- import './chunks/getFade.js';
26
- import './chunks/useFocusTrapStack.js';
27
- import './chunks/Backdrop.js';
28
- import './Popper.js';
29
- import './chunks/PopperPaper.js';
30
-
31
- 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"};
32
-
33
- 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,10 +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';
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";
7
6
 
8
- 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"};
9
7
 
10
- 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 };