@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/ListItemText.js CHANGED
@@ -1,24 +1,51 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { useClasses } from '@ringcentral/spring-base';
4
- import { useThemeProps } from '@ringcentral/spring-theme';
5
- import { h as hasContent } from './chunks/hasContent.js';
6
- import '@mui/utils';
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useClasses } from "@ringcentral/spring-base";
4
+ import { useThemeProps } from "@ringcentral/spring-theme";
5
+ import { hasContent } from "./chunks/5047.js";
7
6
 
8
- var ListItemText$1 = {"sui-list-item-text-root":"sui-list-item-text-root","sui-list-item-text-primary-text":"sui-list-item-text-primary-text","sui-list-item-text-secondary-text":"sui-list-item-text-secondary-text","sui-list-item-text-primary":"sui-list-item-text-primary","sui-list-item-text-primary-primary-text":"sui-list-item-text-primary-primary-text","sui-list-item-text-secondary":"sui-list-item-text-secondary","sui-list-item-text-secondary-primary-text":"sui-list-item-text-secondary-primary-text"};
9
7
 
10
- const ListItemText = forwardRef((inProps, ref) => {
11
- const props = useThemeProps({ props: inProps, name: 'ListItemText' });
8
+
9
+
10
+
11
+ // extracted by css-extract-rspack-plugin
12
+ /* export default */ var ListItemText = ({"sui-list-item-text-root":"sui-list-item-text-root","sui-list-item-text-primary-text":"sui-list-item-text-primary-text","sui-list-item-text-secondary-text":"sui-list-item-text-secondary-text","sui-list-item-text-primary":"sui-list-item-text-primary","sui-list-item-text-primary-primary-text":"sui-list-item-text-primary-primary-text","sui-list-item-text-secondary":"sui-list-item-text-secondary","sui-list-item-text-secondary-primary-text":"sui-list-item-text-secondary-primary-text"});
13
+
14
+
15
+
16
+
17
+
18
+
19
+ const ListItemText_ListItemText = /*#__PURE__*/ forwardRef((inProps, ref)=>{
20
+ const props = useThemeProps({
21
+ props: inProps,
22
+ name: 'ListItemText'
23
+ });
12
24
  const { classes, className, primary, secondary, primaryText, secondaryText, variant = 'primary', children, ...rest } = props;
13
25
  const cls = useClasses('list-item-text', classes, className);
14
- const primaryContent = hasContent(primary)
15
- ? primary
16
- : hasContent(primaryText)
17
- ? primaryText
18
- : children;
26
+ const primaryContent = hasContent(primary) ? primary : hasContent(primaryText) ? primaryText : children;
19
27
  const secondaryContent = hasContent(secondary) ? secondary : secondaryText;
20
- return (jsxs("div", { className: cls('root', variant), ...rest, ref: ref, children: [jsx("span", { className: cls('primary-text', `${variant}-primary-text`), children: primaryContent }), hasContent(secondaryContent) && (jsx("span", { className: cls('secondary-text', `${variant}-secondary-text`), children: secondaryContent }))] }));
28
+ return /*#__PURE__*/ jsxs("div", {
29
+ className: cls('root', variant),
30
+ ...rest,
31
+ ref: ref,
32
+ children: [
33
+ /*#__PURE__*/ jsx("span", {
34
+ className: cls('primary-text', `${variant}-primary-text`),
35
+ children: primaryContent
36
+ }),
37
+ hasContent(secondaryContent) && /*#__PURE__*/ jsx("span", {
38
+ className: cls('secondary-text', `${variant}-secondary-text`),
39
+ children: secondaryContent
40
+ })
41
+ ]
42
+ });
21
43
  });
22
- ListItemText.displayName = 'SuiListItemText';
44
+ ListItemText_ListItemText.displayName = 'SuiListItemText';
45
+
46
+
47
+
48
+
49
+
23
50
 
24
- export { ListItemText, ListItemText$1 as listItemTextStyle };
51
+ export { ListItemText as listItemTextStyle, ListItemText_ListItemText as ListItemText };
package/ListNavigation.js CHANGED
@@ -1,51 +1,303 @@
1
- import { u as useListNavigationContext } from './chunks/useListNavigation.js';
2
- export { L as ListNavigationContext, a as useListNavigation } from './chunks/useListNavigation.js';
3
- import { useRef } from 'react';
4
- import { tabbable } from 'tabbable';
5
- import 'react/jsx-runtime';
6
- import '@ringcentral/spring-base';
7
-
8
- const useItemNavigation = () => {
1
+ import { createContext, useContext, useImperativeHandle, useMemo, useRef } from "react";
2
+ import { tabbable } from "tabbable";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useEventCallback } from "@ringcentral/spring-base";
5
+
6
+
7
+
8
+ const ListNavigationContext = createContext(null);
9
+ const useListNavigationContext = ()=>useContext(ListNavigationContext);
10
+
11
+
12
+
13
+
14
+
15
+
16
+ // oxlint-disable-next-line sonarjs/cognitive-complexity
17
+ const useItemNavigation = ()=>{
9
18
  const itemRef = useRef(null);
10
19
  const navContextValue = useListNavigationContext();
11
20
  if (navContextValue) {
12
21
  return {
13
22
  keyboardNavHandlers: {
14
- onKeyDown: (e) => {
23
+ onKeyDown: (e)=>{
24
+ // There some problems if `itemRef.current` is null.
25
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
15
26
  const itemEl = itemRef.current;
27
+ // All tabbable element in item. No include item self.
16
28
  const allTabbable = tabbable(itemEl);
17
29
  const { key, shiftKey, target, currentTarget } = e;
18
30
  if (key === 'Tab') {
19
31
  if (shiftKey) {
20
32
  if (currentTarget === target) {
21
33
  navContextValue.onShiftTab();
22
- }
23
- else if (allTabbable.at(0) === target) {
34
+ } else if (allTabbable.at(0) === target) {
35
+ // prevent default focus logic
24
36
  e.preventDefault();
37
+ // focus item manual, because tabindex of item is -1
25
38
  itemEl.focus();
26
39
  }
27
- }
28
- else {
40
+ } else {
29
41
  if (allTabbable.at(-1) === target || !allTabbable.length) {
30
42
  navContextValue.onTab();
31
43
  }
32
44
  }
33
45
  }
34
46
  },
35
- onFocus: (e) => {
47
+ onFocus: (e)=>{
36
48
  navContextValue.updateFocusedItem(e.currentTarget);
37
49
  },
38
- onBlur: (e) => {
39
- if (e.relatedTarget &&
40
- !e.currentTarget.contains(e.relatedTarget)) {
50
+ onBlur: (e)=>{
51
+ if (e.relatedTarget && !e.currentTarget.contains(e.relatedTarget)) {
41
52
  navContextValue.updateFocusedItem(null);
42
53
  }
43
- },
54
+ }
44
55
  },
45
- itemRef,
56
+ itemRef
46
57
  };
47
58
  }
48
59
  return null;
49
60
  };
50
61
 
51
- export { useItemNavigation, useListNavigationContext };
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+ const useListNavigation = (props)=>{
70
+ const { preventContainerScroll = true, searchAndFocusItemHandler: searchAndFocusItemHandlerProp = defaultSearchAndFocusItem, actions } = props;
71
+ const currentFocusedItemRef = useRef(null);
72
+ const listRef = useRef(null);
73
+ const sentinelArrowNavRef = useRef(null);
74
+ const sentinelTabBoundaryRef = useRef(null);
75
+ const skipEnforceFocusRef = useRef(false);
76
+ const focusList = ()=>{
77
+ skipEnforceFocusRef.current = true;
78
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
79
+ listRef.current.focus();
80
+ };
81
+ const focusTabBoundary = ()=>{
82
+ skipEnforceFocusRef.current = true;
83
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
84
+ sentinelTabBoundaryRef.current.focus();
85
+ };
86
+ const itemActions = useMemo(()=>({
87
+ // Prevent cache invalidation
88
+ // oxlint-disable-next-line sonarjs/no-identical-functions
89
+ onTab: ()=>{
90
+ skipEnforceFocusRef.current = true;
91
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
92
+ sentinelTabBoundaryRef.current.focus();
93
+ },
94
+ // oxlint-disable-next-line sonarjs/no-identical-functions
95
+ onShiftTab: ()=>{
96
+ skipEnforceFocusRef.current = true;
97
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
98
+ listRef.current.focus();
99
+ },
100
+ updateFocusedItem: (el)=>{
101
+ currentFocusedItemRef.current = el;
102
+ }
103
+ }), []);
104
+ const focusFirstItem = useEventCallback(()=>{
105
+ const { focused } = searchAndFocusItemHandler('first');
106
+ if (!focused) {
107
+ focusList();
108
+ }
109
+ });
110
+ useImperativeHandle(actions, ()=>({
111
+ focus: focusFirstItem
112
+ }), // oxlint-disable-next-line react-hooks/exhaustive-deps
113
+ []);
114
+ const sentinelFocusHandler = (e)=>{
115
+ if (e.target === e.currentTarget) {
116
+ const skipEnforceFocus = skipEnforceFocusRef.current;
117
+ if (skipEnforceFocus) {
118
+ skipEnforceFocusRef.current = false;
119
+ return;
120
+ }
121
+ focusFirstItem();
122
+ }
123
+ };
124
+ const searchAndFocusItemHandler = (searchElementOption)=>{
125
+ return searchAndFocusItemHandlerProp(searchElementOption, {
126
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
127
+ sentinelEnd: sentinelArrowNavRef.current,
128
+ // oxlint-disable-next-line @typescript-eslint/no-non-null-assertion
129
+ list: listRef.current
130
+ });
131
+ };
132
+ const listKeyDownHandler = (e)=>{
133
+ const focusedItem = currentFocusedItemRef.current;
134
+ const key = e.key;
135
+ if (focusedItem) {
136
+ const searchElementOption = {
137
+ ArrowDown: {
138
+ baseElement: focusedItem,
139
+ direction: 'down'
140
+ },
141
+ ArrowUp: {
142
+ baseElement: focusedItem,
143
+ direction: 'up'
144
+ },
145
+ Home: 'first',
146
+ End: 'last'
147
+ }[key];
148
+ if (searchElementOption) {
149
+ const { focused, isAfterBaseElement } = searchAndFocusItemHandler(searchElementOption);
150
+ if (!focused) {
151
+ focusList();
152
+ }
153
+ if (!isAfterBaseElement || preventContainerScroll) {
154
+ e.preventDefault();
155
+ }
156
+ }
157
+ } else {
158
+ // cover case about all item are disabled
159
+ if (e.target === e.currentTarget && key === 'Tab' && !e.shiftKey) {
160
+ focusTabBoundary();
161
+ }
162
+ }
163
+ };
164
+ const getListProps = (otherHandler)=>{
165
+ const { onKeyDown, onFocus } = otherHandler;
166
+ const handleKeyDown = (e)=>{
167
+ onKeyDown?.(e);
168
+ if (e.defaultPrevented) {
169
+ return;
170
+ }
171
+ listKeyDownHandler(e);
172
+ };
173
+ const handleFocus = (e)=>{
174
+ sentinelFocusHandler(e);
175
+ onFocus?.(e);
176
+ };
177
+ return {
178
+ tabIndex: 0,
179
+ onKeyDown: handleKeyDown,
180
+ onFocus: handleFocus
181
+ };
182
+ };
183
+ const renderItems = (items)=>{
184
+ return /*#__PURE__*/ jsxs(ListNavigationContext.Provider, {
185
+ value: itemActions,
186
+ children: [
187
+ items,
188
+ /*#__PURE__*/ jsx("div", {
189
+ "aria-hidden": "true",
190
+ ref: sentinelArrowNavRef
191
+ })
192
+ ]
193
+ });
194
+ };
195
+ const renderTabBoundary = ()=>{
196
+ return /*#__PURE__*/ jsx("div", {
197
+ // make sentinel end always render in scroller viewport center to
198
+ // prevent scroll when focus to sentinel end
199
+ style: {
200
+ position: 'fixed',
201
+ bottom: '50%'
202
+ },
203
+ ref: sentinelTabBoundaryRef,
204
+ tabIndex: 0,
205
+ onFocus: sentinelFocusHandler
206
+ });
207
+ };
208
+ return {
209
+ renderItems,
210
+ renderTabBoundary,
211
+ getListProps,
212
+ listRef
213
+ };
214
+ };
215
+ const isUnfocusable = (el)=>el.matches('.sui-disabled, :disabled, hr, [role="separator"], [disabled]');
216
+ const defaultSearchAndFocusItem = (searchElementOption, helperElements)=>{
217
+ const { list, sentinelEnd } = helperElements;
218
+ // Handle empty list - no items to focus, return focused: false so caller falls back to focusList()
219
+ if (list.firstElementChild === sentinelEnd) {
220
+ return {
221
+ focused: false
222
+ };
223
+ }
224
+ const getFirstItem = ()=>{
225
+ const firstItem = list.firstElementChild;
226
+ if (firstItem === sentinelEnd) {
227
+ throw Error('SPRING [useListNavigation]: must have child element');
228
+ }
229
+ return firstItem;
230
+ };
231
+ const getLastItem = ()=>{
232
+ const lastItem = sentinelEnd.previousElementSibling;
233
+ if (!lastItem) {
234
+ throw Error('SPRING [useListNavigation]: must have child element');
235
+ }
236
+ return lastItem;
237
+ };
238
+ let direction;
239
+ let startElement;
240
+ if (typeof searchElementOption === 'string') {
241
+ if (searchElementOption === 'first') {
242
+ startElement = getFirstItem();
243
+ direction = 'down';
244
+ } else {
245
+ startElement = getLastItem();
246
+ direction = 'up';
247
+ }
248
+ if (!isUnfocusable(startElement)) {
249
+ startElement.focus();
250
+ return {
251
+ focused: true
252
+ };
253
+ }
254
+ } else {
255
+ startElement = searchElementOption.baseElement;
256
+ direction = searchElementOption.direction;
257
+ }
258
+ let pointer = startElement;
259
+ let isAfterBaseElement = true;
260
+ if (direction === 'up') {
261
+ do {
262
+ if (!pointer.previousElementSibling) {
263
+ pointer = getLastItem();
264
+ isAfterBaseElement = false;
265
+ } else {
266
+ pointer = pointer.previousElementSibling;
267
+ }
268
+ if (!isUnfocusable(pointer)) {
269
+ break;
270
+ }
271
+ }while (pointer !== startElement);
272
+ } else {
273
+ do {
274
+ if (pointer.nextElementSibling === sentinelEnd) {
275
+ pointer = getFirstItem();
276
+ isAfterBaseElement = false;
277
+ } else {
278
+ pointer = pointer.nextElementSibling;
279
+ }
280
+ if (!isUnfocusable(pointer)) {
281
+ break;
282
+ }
283
+ }while (pointer !== startElement);
284
+ }
285
+ if (isUnfocusable(pointer)) {
286
+ return {
287
+ focused: false
288
+ };
289
+ }
290
+ pointer.focus();
291
+ return typeof searchElementOption === 'string' ? {
292
+ focused: true
293
+ } : {
294
+ focused: true,
295
+ isAfterBaseElement
296
+ };
297
+ };
298
+
299
+
300
+
301
+
302
+
303
+ export { ListNavigationContext, useItemNavigation, useListNavigation, useListNavigationContext };
package/Menu.js CHANGED
@@ -1,23 +1,139 @@
1
- export { M as Menu, a as MenuContext, u as useMenuContext } from './chunks/Menu.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import '@ringcentral/spring-base';
5
- import '@ringcentral/spring-theme';
6
- import './chunks/useNestedParentMenu.js';
7
- import './chunks/Popover.js';
8
- import '@floating-ui/react-dom';
9
- import 'framer-motion';
10
- import './chunks/Icon.js';
11
- import './chunks/usePrefersReducedMotion.js';
12
- import './chunks/getGrow.js';
13
- import './chunks/Modal.js';
14
- import '@mui/base';
15
- import './chunks/getFade.js';
16
- import './chunks/useFocusTrapStack.js';
17
- import './chunks/Backdrop.js';
18
- import './Popper.js';
19
- import './chunks/PopperPaper.js';
20
-
21
- var Menu = {"sui-menu-paper":"sui-menu-paper","sui-menu-root":"sui-menu-root","sui-compact":"sui-compact"};
22
-
23
- export { Menu as menuStyle };
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { createContext, forwardRef, useContext, useMemo, useState } from "react";
3
+ import { useEventCallback } from "@ringcentral/spring-base";
4
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
5
+ import { NestedMenuContext, useNestedParentMenu } from "./NestedMenuContext.js";
6
+ import { Popover as Popover_Popover } from "./Popover.js";
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+ const overlayContainerStyle = {
17
+ display: 'contents'
18
+ };
19
+ // Internal-only context for nested submenu portal containers. Keep this
20
+ // separate from NestedMenuContext, which only coordinates hover/open/close state.
21
+ const MenuOverlayGroupContext = /*#__PURE__*/ createContext(null);
22
+ const useMenuOverlayGroupContext = ()=>useContext(MenuOverlayGroupContext);
23
+ const useMenuOverlayGroupValue = ()=>{
24
+ const [container, setContainer] = useState(null);
25
+ const value = useMemo(()=>({
26
+ container
27
+ }), [
28
+ container
29
+ ]);
30
+ return {
31
+ setContainer,
32
+ value
33
+ };
34
+ };
35
+ const MenuOverlayGroupContainer = (props)=>{
36
+ const { setContainer } = props;
37
+ return /*#__PURE__*/ jsx("div", {
38
+ "data-sui-menu-overlay-container": "",
39
+ ref: setContainer,
40
+ style: overlayContainerStyle
41
+ });
42
+ };
43
+
44
+
45
+
46
+
47
+ const MenuContext = createContext(null);
48
+ const useMenuContext = ()=>{
49
+ return useContext(MenuContext);
50
+ };
51
+
52
+ // extracted by css-extract-rspack-plugin
53
+ /* export default */ var Menu = ({"sui-menu-paper":"sui-menu-paper","sui-menu-root":"sui-menu-root","sui-compact":"sui-compact"});
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+ const Menu_Menu = /*#__PURE__*/ forwardRef((inProps, ref)=>{
64
+ const props = useThemeProps({
65
+ props: inProps,
66
+ name: 'Menu'
67
+ });
68
+ const { classes, children, open = false, onClose, autoFocus = true, className, PopperProps, ...rest } = props;
69
+ const cls = useClassesWithMode('menu', classes, className);
70
+ const padding = PopperProps?.padding;
71
+ const popperPadding = typeof padding === 'object' ? {
72
+ top: padding.top ?? 16,
73
+ right: padding.right ?? 16,
74
+ bottom: padding.bottom ?? 16,
75
+ left: padding.left ?? 16
76
+ } : padding ?? 16;
77
+ const { contentClickHandlers, contentPointerHandlers, contextValue } = useNestedParentMenu({
78
+ open
79
+ });
80
+ const { setContainer: setOverlayContainer, value: overlayGroupValue } = useMenuOverlayGroupValue();
81
+ const closeHandler = useEventCallback(()=>{
82
+ onClose?.(undefined, 'Other');
83
+ });
84
+ const menuContextValue = useMemo(()=>{
85
+ // Reset autoFocus when menu closes to ensure focus logic re-runs on reopen.
86
+ const effectiveAutoFocus = open ? autoFocus : false;
87
+ return {
88
+ close: closeHandler,
89
+ autoFocus: effectiveAutoFocus
90
+ };
91
+ }, [
92
+ autoFocus,
93
+ closeHandler,
94
+ open
95
+ ]);
96
+ return /*#__PURE__*/ jsx(Popover_Popover, {
97
+ bordered: true,
98
+ className: cls('root'),
99
+ PopperProps: {
100
+ ...PopperProps,
101
+ padding: popperPadding
102
+ },
103
+ ...rest,
104
+ open: open,
105
+ onClose: (e, reason)=>{
106
+ onClose?.(e, reason);
107
+ },
108
+ ref: ref,
109
+ children: /*#__PURE__*/ jsxs(MenuOverlayGroupContext.Provider, {
110
+ value: overlayGroupValue,
111
+ children: [
112
+ /*#__PURE__*/ jsx("div", {
113
+ className: cls('paper'),
114
+ onClickCapture: contentClickHandlers.onClickCapture,
115
+ onPointerMove: contentPointerHandlers.onPointerMove,
116
+ children: /*#__PURE__*/ jsx(MenuContext.Provider, {
117
+ value: menuContextValue,
118
+ children: /*#__PURE__*/ jsx(NestedMenuContext.Provider, {
119
+ value: contextValue,
120
+ children: children
121
+ })
122
+ })
123
+ }),
124
+ /*#__PURE__*/ jsx(MenuOverlayGroupContainer, {
125
+ setContainer: setOverlayContainer
126
+ })
127
+ ]
128
+ })
129
+ });
130
+ });
131
+ Menu_Menu.displayName = 'SuiMenu';
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+ export { Menu as menuStyle, MenuContext, Menu_Menu as Menu, useMenuContext, useMenuOverlayGroupContext };
package/MenuActions.js CHANGED
@@ -1,21 +1,46 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { forwardRef } from 'react';
3
- import { useClasses } from '@ringcentral/spring-base';
4
- import { useThemeProps } from '@ringcentral/spring-theme';
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useClasses } from "@ringcentral/spring-base";
4
+ import { useThemeProps } from "@ringcentral/spring-theme";
5
5
 
6
- var MenuActions$1 = {"sui-menu-actions-root":"sui-menu-actions-root","sui-menu-actions-group-root":"sui-menu-actions-group-root"};
7
6
 
8
- const MenuActions = forwardRef((inProps, ref) => {
9
- const props = useThemeProps({ props: inProps, name: 'MenuActions' });
7
+
8
+
9
+
10
+ // extracted by css-extract-rspack-plugin
11
+ /* export default */ var MenuActions = ({"sui-menu-actions-root":"sui-menu-actions-root","sui-menu-actions-group-root":"sui-menu-actions-group-root"});
12
+
13
+
14
+
15
+
16
+
17
+ const MenuActions_MenuActions = /*#__PURE__*/ forwardRef((inProps, ref)=>{
18
+ const props = useThemeProps({
19
+ props: inProps,
20
+ name: 'MenuActions'
21
+ });
10
22
  const { classes, className, children, ...rest } = props;
11
23
  const cls = useClasses('menu-actions', classes, className);
12
- return (jsx("div", { className: cls('root'), ...rest, ref: ref, children: children }));
24
+ return /*#__PURE__*/ jsx("div", {
25
+ className: cls('root'),
26
+ ...rest,
27
+ ref: ref,
28
+ children: children
29
+ });
13
30
  });
14
- MenuActions.displayName = 'SuiMenuActions';
15
- const MenuActionsGroup = ({ className, ...rest }) => {
31
+ MenuActions_MenuActions.displayName = 'SuiMenuActions';
32
+ const MenuActionsGroup = ({ className, ...rest })=>{
16
33
  const cls = useClasses('menu-actions-group', undefined, className);
17
- return jsx("div", { className: cls('root'), ...rest });
34
+ return /*#__PURE__*/ jsx("div", {
35
+ className: cls('root'),
36
+ ...rest
37
+ });
18
38
  };
19
39
  MenuActionsGroup.displayName = 'SuiMenuActionsGroup';
20
40
 
21
- export { MenuActions, MenuActionsGroup, MenuActions$1 as menuActionsStyle };
41
+
42
+
43
+
44
+
45
+
46
+ export { MenuActions as menuActionsStyle, MenuActionsGroup, MenuActions_MenuActions as MenuActions };
package/MenuDivider.js CHANGED
@@ -1,10 +1,36 @@
1
- export { M as MenuDivider } from './chunks/MenuDivider.js';
2
- import 'react/jsx-runtime';
3
- import 'react';
4
- import '@ringcentral/spring-theme';
5
- import './chunks/Divider.js';
6
- import '@ringcentral/spring-base';
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { useClassesWithMode, useThemeProps } from "@ringcentral/spring-theme";
4
+ import { Divider as Divider_Divider } from "./Divider.js";
7
5
 
8
- var MenuDivider = {"sui-menu-divider-root":"sui-menu-divider-root","sui-compact":"sui-compact"};
9
6
 
10
- export { MenuDivider as menuDividerStyle };
7
+
8
+
9
+ // extracted by css-extract-rspack-plugin
10
+ /* export default */ var MenuDivider = ({"sui-menu-divider-root":"sui-menu-divider-root","sui-compact":"sui-compact"});
11
+
12
+
13
+
14
+
15
+
16
+ const MenuDivider_MenuDivider = /*#__PURE__*/ forwardRef((inProps, ref)=>{
17
+ const props = useThemeProps({
18
+ props: inProps,
19
+ name: 'MenuDivider'
20
+ });
21
+ const { classes, className, ...rest } = props;
22
+ const cls = useClassesWithMode('menu-divider', classes, className);
23
+ return /*#__PURE__*/ jsx(Divider_Divider, {
24
+ className: cls('root'),
25
+ ...rest,
26
+ ref: ref
27
+ });
28
+ });
29
+ MenuDivider_MenuDivider.displayName = 'SuiMenuDivider';
30
+
31
+
32
+
33
+
34
+
35
+
36
+ export { MenuDivider as menuDividerStyle, MenuDivider_MenuDivider as MenuDivider };