@ringcentral/spring-ui 1.7.0 → 1.8.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.
- package/Alert.js +3 -3
- package/Announcement.js +1 -1
- package/Autocomplete.js +174 -236
- package/Avatar.js +27 -13
- package/BottomNavigation.js +0 -3
- package/Checkbox.js +0 -2
- package/DatePicker.js +5 -13
- package/DateUtilsContext.js +0 -1
- package/Dialer.js +2 -50
- package/Dialog.js +4 -4
- package/Dropdown.js +0 -7
- package/FocusTrap.js +0 -32
- package/InlineEditable.js +0 -4
- package/Link.js +1 -1
- package/ListItem.js +1 -1
- package/ListNavigation.js +0 -6
- package/Menu.js +1 -1
- package/MenuDivider.js +2 -2
- package/MenuFooter.js +4 -4
- package/MenuHeader.js +4 -4
- package/MenuItem.js +1 -1
- package/MenuItemText.js +1 -1
- package/PageHeader.js +6 -4
- package/Popper.js +0 -1
- package/Rating.js +0 -5
- package/SingleFilter.js +0 -1
- package/Slider.js +1 -4
- package/Snackbar.js +0 -14
- package/SortableListItem.js +0 -1
- package/SplitButton.js +1 -3
- package/StatusIndicator.js +1 -1
- package/SubMenu.js +0 -4
- package/SwipeableDrawer.js +8 -146
- package/Switch.js +1 -4
- package/Tab.js +7 -8
- package/TabContext.js +0 -5
- package/TableBody.js +1 -1
- package/TableCell.js +0 -6
- package/TableRow.js +0 -1
- package/Tabs.js +20 -118
- package/Text.js +2 -4
- package/TimePicker.js +7 -46
- package/VirtualizedList.js +2 -30
- package/chunks/Alert.js +8 -7
- package/chunks/BottomNavigationItem.js +0 -1
- package/chunks/Button.js +0 -1
- package/chunks/Chip.js +0 -5
- package/chunks/Drawer.js +1 -30
- package/chunks/ListItem.js +3 -6
- package/chunks/Menu.js +3 -3
- package/chunks/MenuDivider.js +2 -3
- package/chunks/MenuItemText.js +3 -3
- package/chunks/MenuList.js +0 -3
- package/chunks/PickerTextField.js +0 -1
- package/chunks/Popover.js +0 -5
- package/chunks/Select.js +2 -39
- package/chunks/Squircle.js +0 -7
- package/chunks/StatusIndicator.js +1 -0
- package/chunks/StepIcon.js +1 -3
- package/chunks/StepperContext.js +0 -7
- package/chunks/Tooltip.js +0 -36
- package/chunks/VirtualizedMenu.js +2 -78
- package/chunks/getFade.js +2 -0
- package/chunks/useFocusTrapStack.js +0 -8
- package/chunks/useHelperTextId.js +0 -24
- package/chunks/useListNavigation.js +2 -17
- package/chunks/useMenuItemSelect.js +6 -19
- package/chunks/useMotionSafeTransition.js +0 -4
- package/chunks/useNestedParentMenu.js +0 -2
- package/chunks/usePrefersReducedMotion.js +0 -10
- package/chunks/useTooltipForceHide.js +0 -4
- package/chunks/useTrayNavigate.js +0 -1
- package/index.css +392 -120
- package/index.js +1 -1
- package/package.json +4 -4
- package/src/Accordion/Accordion.type.d.ts +0 -21
- package/src/AccordionHeader/AccordionHeader.type.d.ts +0 -14
- package/src/Alert/Alert.type.d.ts +0 -32
- package/src/Animation/components/ExpandCollapseCaret/ExpandCollapseCaret.d.ts +0 -4
- package/src/Animation/components/ShowHideEye/ShowHideEye.d.ts +0 -4
- package/src/Animation/hooks/useMotionSafeTransition/useMotionSafeTransition.d.ts +0 -4
- package/src/Autocomplete/Autocomplete.d.ts +0 -5
- package/src/Autocomplete/Autocomplete.type.d.ts +0 -84
- package/src/Autocomplete/SuggestionList/SuggestionList.d.ts +5 -89
- package/src/Autocomplete/SuggestionList/SuggestionListItem.d.ts +0 -2
- package/src/Autocomplete/SuggestionList/utils/SuggestionListItem.d.ts +1 -13
- package/src/Autocomplete/SuggestionList/utils/useDynamicHeight.d.ts +0 -6
- package/src/Autocomplete/SuggestionList/utils/useHighlightScroll.d.ts +0 -20
- package/src/Autocomplete/SuggestionList/utils/useSuggestionList.d.ts +3 -41
- package/src/Autocomplete/SuggestionList/utils/useSuggestionListGroup.d.ts +0 -49
- package/src/Autocomplete/useAutocomplete.d.ts +1 -62
- package/src/Autocomplete/useAutocompleteTag.d.ts +0 -33
- package/src/Avatar/Avatar.type.d.ts +0 -58
- package/src/AvatarGroup/AvatarGroup.type.d.ts +0 -3
- package/src/Backdrop/Backdrop.type.d.ts +0 -4
- package/src/Badge/Badge.type.d.ts +0 -33
- package/src/Block/Block.type.d.ts +0 -24
- package/src/BlockHeader/BlockHeader.type.d.ts +0 -5
- package/src/BottomNavigation/BottomNavigation.type.d.ts +0 -34
- package/src/BottomNavigationItem/BottomNavigationItem.type.d.ts +0 -39
- package/src/Button/Button.type.d.ts +0 -30
- package/src/CallButton/CallButton.type.d.ts +0 -4
- package/src/Checkbox/Checkbox.type.d.ts +0 -17
- package/src/Chip/Chip.type.d.ts +0 -41
- package/src/CircularProgressIndicator/CircularProgressIndicator.type.d.ts +0 -19
- package/src/DatePicker/Calendar.d.ts +1 -20
- package/src/DatePicker/DatePicker.type.d.ts +0 -18
- package/src/DatePicker/DatePickerHeader.d.ts +1 -12
- package/src/DatePicker/Day.d.ts +0 -7
- package/src/DatePicker/Year.d.ts +0 -6
- package/src/DatePicker/Years.d.ts +0 -7
- package/src/Dialer/DialDelete/DialDelete.d.ts +0 -3
- package/src/Dialer/DialPad/DialPad.d.ts +0 -106
- package/src/Dialer/DialPad/utils/types.d.ts +0 -5
- package/src/Dialer/DialPad/utils/useDialKeyboard.d.ts +0 -5
- package/src/Dialer/DialPad/utils/useKeyAudio.d.ts +0 -9
- package/src/Dialer/DialPadButton/DialPadButton.d.ts +0 -14
- package/src/Dialer/DialTextField/DialTextField.d.ts +0 -23
- package/src/Dialer/DialTextField/utils/getDialPadValueOnlyRegex.d.ts +0 -3
- package/src/Dialer/DialTextField/utils/useFixedEndSelection.d.ts +0 -3
- package/src/Dialog/Dialog.type.d.ts +0 -11
- package/src/Divider/Divider.type.d.ts +0 -17
- package/src/DragHandle/DragHandle.type.d.ts +0 -4
- package/src/Drawer/Drawer.d.ts +0 -28
- package/src/Drawer/Drawer.type.d.ts +0 -84
- package/src/Dropdown/Dropdown.type.d.ts +0 -64
- package/src/EmptyState/EmptyState.type.d.ts +0 -12
- package/src/FabButton/FabButton.type.d.ts +0 -5
- package/src/FocusTrap/FocusTrap.d.ts +0 -38
- package/src/FocusTrap/useFocusTrapStack.d.ts +0 -9
- package/src/FormField/FormField.type.d.ts +0 -26
- package/src/FormField/useHelperTextId.d.ts +0 -25
- package/src/FormLabel/FormLabel.type.d.ts +0 -14
- package/src/Icon/Icon.type.d.ts +0 -15
- package/src/IconButton/IconButton.type.d.ts +0 -30
- package/src/IconButton/IconButtonLabel.type.d.ts +0 -3
- package/src/IconButtonGroup/IconButtonGroup.type.d.ts +0 -8
- package/src/InlineEditable/InlineEditable.type.d.ts +0 -75
- package/src/LinearProgressIndicator/LinearProgressIndicator.type.d.ts +0 -31
- package/src/Link/Link.classes.d.ts +1 -1
- package/src/Link/Link.type.d.ts +1 -10
- package/src/ListItem/ListItem.type.d.ts +0 -41
- package/src/ListItemText/ListItemText.type.d.ts +0 -21
- package/src/ListNavigation/useListNavigation.d.ts +0 -16
- package/src/Menu/Menu.type.d.ts +0 -10
- package/src/MenuFooter/MenuFooter.type.d.ts +0 -4
- package/src/MenuHeader/MenuHeader.type.d.ts +0 -10
- package/src/MenuItem/MenuItem.type.d.ts +0 -19
- package/src/MenuItem/MenuItemSelectContext.d.ts +0 -3
- package/src/MenuItem/useMenuItemSelect.d.ts +0 -21
- package/src/MenuItemText/MenuItemText.type.d.ts +0 -17
- package/src/MenuList/MenuList.type.d.ts +0 -4
- package/src/MenuList/MenuListContext.d.ts +0 -6
- package/src/Modal/InnerModal.type.d.ts +0 -5
- package/src/Modal/Modal.type.d.ts +0 -11
- package/src/Modal/ModalContext.d.ts +0 -4
- package/src/Option/Option.type.d.ts +0 -3
- package/src/Overlap/Overlap.type.d.ts +0 -11
- package/src/PageHeader/PageHeader.type.d.ts +0 -4
- package/src/PickerTextField/PickerTextField.type.d.ts +0 -10
- package/src/Popover/Popover.type.d.ts +0 -29
- package/src/Popper/Popper.type.d.ts +0 -61
- package/src/Radio/Radio.type.d.ts +0 -5
- package/src/RadioGroup/RadioGroup.type.d.ts +0 -4
- package/src/Rating/Rating.type.d.ts +0 -74
- package/src/Select/Select.type.d.ts +0 -84
- package/src/SingleFilter/FilterButton/FilterButton.type.d.ts +0 -16
- package/src/SingleFilter/SingleFilter.type.d.ts +0 -26
- package/src/Skeleton/Skeleton.type.d.ts +0 -1
- package/src/Skeleton/SkeletonContainer/SkeletonContainer.classes.d.ts +1 -1
- package/src/Slider/Slider.classes.d.ts +1 -5
- package/src/Slider/Slider.type.d.ts +0 -104
- package/src/Snackbar/Snackbar.type.d.ts +0 -18
- package/src/SplitButton/SplitButton.type.d.ts +0 -21
- package/src/Squircle/Squircle.type.d.ts +0 -3
- package/src/StatusIndicator/StatusIndicator.classes.d.ts +1 -1
- package/src/StatusIndicator/StatusIndicator.type.d.ts +1 -9
- package/src/Step/Step.type.d.ts +0 -29
- package/src/Step/StepContext.d.ts +0 -7
- package/src/StepButton/StepButton.type.d.ts +0 -15
- package/src/StepContent/StepContent.type.d.ts +0 -7
- package/src/StepIcon/StepIcon.type.d.ts +0 -26
- package/src/StepLabel/StepLabel.type.d.ts +0 -23
- package/src/Stepper/Stepper.type.d.ts +0 -27
- package/src/SwipeableDrawer/SwipeableDrawer.d.ts +0 -26
- package/src/SwipeableDrawer/SwipeableDrawer.types.d.ts +0 -67
- package/src/SwipeableDrawer/hooks/useDrawerGestures.d.ts +0 -110
- package/src/SwipeableDrawer/hooks/useElementSizeObserver.d.ts +0 -5
- package/src/SwipeableDrawer/hooks/useSnapPoints.d.ts +0 -60
- package/src/Switch/Switch.type.d.ts +0 -9
- package/src/Tab/Tab.classes.d.ts +3 -2
- package/src/Tab/Tab.type.d.ts +0 -29
- package/src/TabContext/TabContext.d.ts +0 -4
- package/src/TabContext/TabContext.type.d.ts +0 -7
- package/src/TabPanel/TabPanel.type.d.ts +0 -10
- package/src/Table/Table.type.d.ts +0 -19
- package/src/TableBody/TableBody.type.d.ts +0 -3
- package/src/TableCell/TableCell.d.ts +0 -4
- package/src/TableCell/TableCell.type.d.ts +0 -35
- package/src/TableContainer/TableContainer.type.d.ts +0 -7
- package/src/TableFooter/TableFooter.type.d.ts +0 -3
- package/src/TableHead/TableHead.type.d.ts +0 -6
- package/src/TablePagination/TablePagination.type.d.ts +0 -47
- package/src/TableRow/TableRow.type.d.ts +0 -17
- package/src/Tabs/TabMoreMenu.d.ts +0 -16
- package/src/Tabs/TabScrollButton.d.ts +0 -10
- package/src/Tabs/Tabs.classes.d.ts +1 -1
- package/src/Tabs/Tabs.d.ts +1 -1
- package/src/Tabs/Tabs.type.d.ts +2 -36
- package/src/Tabs/TabsContext.d.ts +2 -0
- package/src/Tabs/hooks/useTabsScroller.d.ts +0 -30
- package/src/Tag/Tag.type.d.ts +0 -12
- package/src/Text/Text.type.d.ts +0 -13
- package/src/TextField/TextField.type.d.ts +0 -64
- package/src/Textarea/Textarea.type.d.ts +0 -13
- package/src/TimePicker/NumberPicker.type.d.ts +0 -12
- package/src/TimePicker/SelectionView.d.ts +0 -6
- package/src/TimePicker/TimeButton.d.ts +0 -3
- package/src/TimePicker/TimePicker.type.d.ts +0 -11
- package/src/TimePicker/ToggleText.type.d.ts +0 -3
- package/src/TimePicker/utils/TimeBoundary.d.ts +0 -3
- package/src/TimePicker/utils/TimePickerHelper.d.ts +0 -19
- package/src/TimePicker/utils/getNumberPickerBoundary.d.ts +0 -3
- package/src/Tooltip/TooltipTrigger.a11y.d.ts +0 -9
- package/src/Tooltip/TooltipTrigger.type.d.ts +0 -44
- package/src/Tooltip/TooltipView.type.d.ts +0 -25
- package/src/Tooltip/useTooltipForceHide.d.ts +0 -4
- package/src/Tray/Tray.type.d.ts +0 -13
- package/src/Tray/TrayContext.d.ts +0 -4
- package/src/Tray/hooks/useTray.d.ts +0 -16
- package/src/Tray/hooks/useTrayPanel.d.ts +0 -3
- package/src/VirtualizedList/VirtualizedList.type.d.ts +0 -27
- package/src/VirtualizedMenu/VirtualizedMenu.type.d.ts +0 -17
package/TimePicker.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { createContext, useContext, forwardRef, useRef, useLayoutEffect, useState, useMemo } from 'react';
|
|
3
|
-
import { useFocusVisible, useForkRef, combineProps, runKeyHandler, useEventCallback
|
|
3
|
+
import { useFocusVisible, useForkRef, combineProps, runKeyHandler, useEventCallback } from '@ringcentral/spring-base';
|
|
4
4
|
import { CaretUpMd, CaretDownMd, RecentMd } from '@ringcentral/spring-icon';
|
|
5
5
|
import { I as Icon } from './chunks/Icon.js';
|
|
6
6
|
import { I as IconButton } from './chunks/IconButtonLabel.js';
|
|
7
7
|
import clsx from 'clsx';
|
|
8
|
-
import { useThemeProps } from '@ringcentral/spring-theme';
|
|
8
|
+
import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
|
|
9
9
|
import { P as PickerTextField } from './chunks/PickerTextField.js';
|
|
10
10
|
import '@mui/base';
|
|
11
11
|
import './chunks/Squircle.js';
|
|
@@ -66,7 +66,6 @@ const parseNumberToString = (value, isTwelveHourSystem) => {
|
|
|
66
66
|
const count = parseNumber(value, isTwelveHourSystem);
|
|
67
67
|
return pad(count);
|
|
68
68
|
};
|
|
69
|
-
/** add miss zero */
|
|
70
69
|
const pad = (num, size = 2) => {
|
|
71
70
|
let s = `${num}`;
|
|
72
71
|
while (s.length < size) {
|
|
@@ -74,12 +73,6 @@ const pad = (num, size = 2) => {
|
|
|
74
73
|
}
|
|
75
74
|
return s;
|
|
76
75
|
};
|
|
77
|
-
/**
|
|
78
|
-
* get formatted time hh:mm
|
|
79
|
-
* @param option `{hour, min, period}`
|
|
80
|
-
* @param isTwelveHourSystem boolean
|
|
81
|
-
* @returns `hh:mm AM` or `hh:mm PM` or `hh:mm`
|
|
82
|
-
*/
|
|
83
76
|
const getFormattedTime = ({ hour, minute, period }, isTwelveHourSystem) => {
|
|
84
77
|
const formattedHour = parseNumberToString(hour, isTwelveHourSystem);
|
|
85
78
|
const formattedMinute = parseNumberToString(minute);
|
|
@@ -106,15 +99,9 @@ const twelveHourSystemSource = buildConsecutiveNumberToArray(0, 11);
|
|
|
106
99
|
const twentyFourHourSystemSource = buildConsecutiveNumberToArray(0, 23);
|
|
107
100
|
const minuteSource = [0, 15, 30, 45];
|
|
108
101
|
const lastMinute = 45;
|
|
109
|
-
/**
|
|
110
|
-
* hour and minute timestamp
|
|
111
|
-
*/
|
|
112
102
|
const getTimestampFromDate = (date) => {
|
|
113
103
|
return date.getHours() * ONE_HOUR + date.getMinutes() * ONE_MINUTE;
|
|
114
104
|
};
|
|
115
|
-
/**
|
|
116
|
-
* hour and minute number
|
|
117
|
-
*/
|
|
118
105
|
const getHourAndMinute = (times) => {
|
|
119
106
|
if (times === null) {
|
|
120
107
|
return {
|
|
@@ -129,23 +116,12 @@ const getHourAndMinute = (times) => {
|
|
|
129
116
|
minute: Math.floor(minute / ONE_MINUTE),
|
|
130
117
|
};
|
|
131
118
|
};
|
|
132
|
-
/**
|
|
133
|
-
* get timestamp from date or timestamp
|
|
134
|
-
*
|
|
135
|
-
* if nowTime is number, it must be hour and minute timestamp
|
|
136
|
-
*/
|
|
137
119
|
function getTimestamp(nowTime) {
|
|
138
120
|
return nowTime instanceof Date ? getTimestampFromDate(nowTime) : nowTime;
|
|
139
121
|
}
|
|
140
|
-
/**
|
|
141
|
-
* hour and min object to timestamp
|
|
142
|
-
*/
|
|
143
122
|
const getTimestampFromHourAndMin = (option) => {
|
|
144
123
|
return option.hour * ONE_HOUR + option.minute * ONE_MINUTE;
|
|
145
124
|
};
|
|
146
|
-
/**
|
|
147
|
-
* get period, `PM` or `AM`
|
|
148
|
-
*/
|
|
149
125
|
function getPeriod(currHour) {
|
|
150
126
|
return currHour >= HALF_DAY_HOURS ? TIME_SYSTEM_TEXT.PM : TIME_SYSTEM_TEXT.AM;
|
|
151
127
|
}
|
|
@@ -157,8 +133,6 @@ const getRecoupHour = (currHour, period) => {
|
|
|
157
133
|
}
|
|
158
134
|
break;
|
|
159
135
|
case TIME_SYSTEM_TEXT.AM:
|
|
160
|
-
// FIXME
|
|
161
|
-
// eslint-disable-next-line sonarjs/no-collapsible-if
|
|
162
136
|
if (currHour < HALF_DAY_HOURS) {
|
|
163
137
|
if (currHour >= HALF_DAY_HOURS) {
|
|
164
138
|
return -HALF_DAY_HOURS;
|
|
@@ -174,9 +148,6 @@ const getDateBeginning = () => {
|
|
|
174
148
|
date.setHours(0, 0, 0, 0);
|
|
175
149
|
return date;
|
|
176
150
|
};
|
|
177
|
-
/**
|
|
178
|
-
* get target time boundary, what time is nearest time with that timeGap
|
|
179
|
-
*/
|
|
180
151
|
class TimeBoundary {
|
|
181
152
|
_hour = undefined;
|
|
182
153
|
value;
|
|
@@ -217,7 +188,6 @@ class TimeBoundary {
|
|
|
217
188
|
let hour = time.getHours();
|
|
218
189
|
let minute = time.getMinutes();
|
|
219
190
|
const partCount = Math.ceil(minute / this.timeGap);
|
|
220
|
-
// when time is the latest or more, add one hour
|
|
221
191
|
if (partCount >= HOUR_MINUTES / this.timeGap) {
|
|
222
192
|
hour++;
|
|
223
193
|
minute = 0;
|
|
@@ -254,9 +224,6 @@ const getRangeBoundary = ({ min, max, gap = TIME_GAP, }) => {
|
|
|
254
224
|
};
|
|
255
225
|
};
|
|
256
226
|
|
|
257
|
-
/**
|
|
258
|
-
* get range from current hour
|
|
259
|
-
*/
|
|
260
227
|
function getNumberPickerBoundary(currentHour, { range, isTwelveHourSystem }) {
|
|
261
228
|
const currentIsPM = currentHour >= HALF_DAY_HOURS;
|
|
262
229
|
let maxHour = range.max.hour ?? 23;
|
|
@@ -306,7 +273,6 @@ const NumberPicker = forwardRef((props, ref) => {
|
|
|
306
273
|
if (autoFocus) {
|
|
307
274
|
pickerRef.current?.focus();
|
|
308
275
|
}
|
|
309
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
310
276
|
}, []);
|
|
311
277
|
const index = Math.floor(value / step);
|
|
312
278
|
const isFirst = index === 0;
|
|
@@ -416,7 +382,6 @@ const PickerView = (props) => {
|
|
|
416
382
|
onChange(resultValue);
|
|
417
383
|
}
|
|
418
384
|
};
|
|
419
|
-
// get boundary must use current show value
|
|
420
385
|
const boundary = useMemo(() => {
|
|
421
386
|
const originHour = value.hour +
|
|
422
387
|
(isTwelveHourSystem && value.period === TIME_SYSTEM_TEXT.PM ? 12 : 0);
|
|
@@ -425,7 +390,6 @@ const PickerView = (props) => {
|
|
|
425
390
|
isTwelveHourSystem,
|
|
426
391
|
});
|
|
427
392
|
}, [range, value, isTwelveHourSystem]);
|
|
428
|
-
// reset pickerValue if pickerValue is out of range
|
|
429
393
|
useLayoutEffect(() => {
|
|
430
394
|
const { hour, minute, period } = value;
|
|
431
395
|
if (hour > boundary.hour.max || minute > boundary.minute.max) {
|
|
@@ -442,17 +406,13 @@ const PickerView = (props) => {
|
|
|
442
406
|
period,
|
|
443
407
|
}, true);
|
|
444
408
|
}
|
|
445
|
-
// ignore `handleChange`
|
|
446
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
447
409
|
}, [boundary, value]);
|
|
448
410
|
const isHourView = selectionShowType === 'hour';
|
|
449
411
|
const { getHourPickerAriaLabel, getMinutePickerAriaLabel, getPeriodToggleAriaLabel, } = screenReaderProps;
|
|
450
412
|
const toggleTextDisabled = useMemo(() => {
|
|
451
413
|
return Boolean(range.min.hour &&
|
|
452
|
-
// * min is pm time
|
|
453
414
|
(range.min.hour >= HALF_DAY_HOURS ||
|
|
454
415
|
(range.max.hour &&
|
|
455
|
-
// * min and max in same AM period
|
|
456
416
|
range.min.hour < HALF_DAY_HOURS &&
|
|
457
417
|
range.max.hour < HALF_DAY_HOURS)));
|
|
458
418
|
}, [range.max.hour, range.min.hour]);
|
|
@@ -484,7 +444,7 @@ const PickerView = (props) => {
|
|
|
484
444
|
}, "data-sui-picker-selection-view": selectionShowType }));
|
|
485
445
|
};
|
|
486
446
|
|
|
487
|
-
var TimePicker$1 = {"sui-time-picker-picker-root":"sui-time-picker-picker-root","sui-time-picker-time-button":"sui-time-picker-time-button","sui-focus-visible":"sui-focus-visible","sui-selected":"sui-selected","sui-disabled":"sui-disabled","sui-time-picker-number-picker":"sui-time-picker-number-picker","sui-time-picker-picker-view":"sui-time-picker-picker-view","sui-time-picker-main-view":"sui-time-picker-main-view","sui-time-picker-twelve-hour":"sui-time-picker-twelve-hour","sui-time-picker-minute-selection-view":"sui-time-picker-minute-selection-view","sui-time-picker-hour-selection-view":"sui-time-picker-hour-selection-view"};
|
|
447
|
+
var TimePicker$1 = {"sui-time-picker-picker-root":"sui-time-picker-picker-root","sui-time-picker-time-button":"sui-time-picker-time-button","sui-focus-visible":"sui-focus-visible","sui-selected":"sui-selected","sui-disabled":"sui-disabled","sui-time-picker-number-picker":"sui-time-picker-number-picker","sui-time-picker-picker-view":"sui-time-picker-picker-view","sui-time-picker-main-view":"sui-time-picker-main-view","sui-time-picker-twelve-hour":"sui-time-picker-twelve-hour","sui-time-picker-minute-selection-view":"sui-time-picker-minute-selection-view","sui-time-picker-hour-selection-view":"sui-time-picker-hour-selection-view","sui-compact":"sui-compact"};
|
|
488
448
|
|
|
489
449
|
const TimePicker = forwardRef((inProps, ref) => {
|
|
490
450
|
const props = useThemeProps({ props: inProps, name: 'TimePicker' });
|
|
@@ -493,7 +453,7 @@ const TimePicker = forwardRef((inProps, ref) => {
|
|
|
493
453
|
getMinutePickerAriaLabel: (minute) => `Minute: ${minute}, use up and down arrow keys to change minutes time by 15 minutes`,
|
|
494
454
|
getPeriodToggleAriaLabel: (period) => `${period}, use up or down arrow keys to switch between AM or PM`,
|
|
495
455
|
}, className, ...rest } = props;
|
|
496
|
-
const cls =
|
|
456
|
+
const cls = useClassesWithMode('time-picker', classes, className, ['main-view', 'hour-selection-view', 'minute-selection-view']);
|
|
497
457
|
const actionRef = useRef(null);
|
|
498
458
|
const [selectionShowType, setSelectionType] = useState('none');
|
|
499
459
|
const pickerValue = value ?? defaultPickerValue;
|
|
@@ -525,7 +485,6 @@ const TimePicker = forwardRef((inProps, ref) => {
|
|
|
525
485
|
update(toValue);
|
|
526
486
|
}
|
|
527
487
|
else {
|
|
528
|
-
// * when time is zero emit null
|
|
529
488
|
update(toValue ? getTimestamp(toValue) : null);
|
|
530
489
|
}
|
|
531
490
|
});
|
|
@@ -564,7 +523,6 @@ const TimePicker = forwardRef((inProps, ref) => {
|
|
|
564
523
|
}
|
|
565
524
|
handleChange(time);
|
|
566
525
|
};
|
|
567
|
-
// reset value if value is out of range
|
|
568
526
|
useLayoutEffect(() => {
|
|
569
527
|
if (textFieldTimestamp === null)
|
|
570
528
|
return;
|
|
@@ -587,6 +545,9 @@ const TimePicker = forwardRef((inProps, ref) => {
|
|
|
587
545
|
onExitComplete: () => {
|
|
588
546
|
setSelectionType('none');
|
|
589
547
|
},
|
|
548
|
+
PopperProps: {
|
|
549
|
+
offset: 4,
|
|
550
|
+
},
|
|
590
551
|
}, PopoverProps), endIconSymbol: RecentMd, clearBtn: clearBtn, ...rest, children: jsx(PickerView, { isTwelveHourSystem: isTwelveHourSystem, onChange: updateTime, afterDraftConfirm: () => {
|
|
591
552
|
actionRef.current?.close();
|
|
592
553
|
}, defaultValue: {
|
package/VirtualizedList.js
CHANGED
|
@@ -12,9 +12,7 @@ const useVirtualizedItemPropsContext = () => useContext(VirtualizedItemPropsCont
|
|
|
12
12
|
|
|
13
13
|
const VirtuosoList = forwardRef((props, ref) => {
|
|
14
14
|
const { children: childrenProp, context, style, ...rest } = props;
|
|
15
|
-
const { searchAndFocusItemHandler, isScrolling, ListProps, listActions, listRef, itemContentRenderer, data, keepInvisibleItems, computeItemKey,
|
|
16
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
17
|
-
} = context;
|
|
15
|
+
const { searchAndFocusItemHandler, isScrolling, ListProps, listActions, listRef, itemContentRenderer, data, keepInvisibleItems, computeItemKey, } = context;
|
|
18
16
|
const handleListRef = useForkRef(listRef, ref);
|
|
19
17
|
let rangeStart = null;
|
|
20
18
|
let rangeEnd = null;
|
|
@@ -33,7 +31,6 @@ const VirtuosoList = forwardRef((props, ref) => {
|
|
|
33
31
|
children = [
|
|
34
32
|
...(rangeStart !== null
|
|
35
33
|
? keepInvisibleItems
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
37
34
|
.filter((itemIndex) => itemIndex < rangeStart)
|
|
38
35
|
.map((itemIndex) => {
|
|
39
36
|
const itemData = data ? data[itemIndex] : itemIndex;
|
|
@@ -47,7 +44,6 @@ const VirtuosoList = forwardRef((props, ref) => {
|
|
|
47
44
|
...childrenProp,
|
|
48
45
|
...(rangeEnd !== null
|
|
49
46
|
? keepInvisibleItems
|
|
50
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
51
47
|
.filter((itemIndex) => itemIndex > rangeEnd)
|
|
52
48
|
.map((itemIndex) => {
|
|
53
49
|
const itemData = data ? data[itemIndex] : itemIndex;
|
|
@@ -63,9 +59,7 @@ const VirtuosoList = forwardRef((props, ref) => {
|
|
|
63
59
|
return (jsx(List, { ...ListProps, ...rest, actions: listActions, style: {
|
|
64
60
|
...ListProps?.style,
|
|
65
61
|
...style,
|
|
66
|
-
// optimize list scrolling
|
|
67
62
|
...(isScrolling ? { pointerEvents: 'none' } : undefined),
|
|
68
|
-
// for prop `keepInvisibleItems`
|
|
69
63
|
position: 'relative',
|
|
70
64
|
}, preventContainerScroll: false, ref: handleListRef, searchAndFocusItemHandler: searchAndFocusItemHandler, children: children }));
|
|
71
65
|
});
|
|
@@ -96,17 +90,10 @@ const VirtualizedList = forwardRef((inProps, ref) => {
|
|
|
96
90
|
return index <= endIndex && index >= startIndex;
|
|
97
91
|
};
|
|
98
92
|
const focusItemByIndex = (index) => {
|
|
99
|
-
/**
|
|
100
|
-
* If the component isn't ready, we need to defer the focus action until the component is ready.
|
|
101
|
-
* This is necessary if a parent component is waiting for some height calculation of the list to
|
|
102
|
-
* be performed before it actually renders the list. If we didn't do this the component would not
|
|
103
|
-
* know where to scroll to/would scroll to an incorrect position as it has not yet fully rendered.
|
|
104
|
-
*/
|
|
105
93
|
if (!isReady) {
|
|
106
94
|
new Promise((resolve) => {
|
|
107
95
|
initialFocusItemByIndexPromiseRef.current = resolve;
|
|
108
96
|
}).then(() => {
|
|
109
|
-
// Wrap in rAF to ensure height has truly settled before focusing
|
|
110
97
|
requestAnimationFrame(() => focusByIndexAction(index));
|
|
111
98
|
});
|
|
112
99
|
}
|
|
@@ -173,7 +160,6 @@ const VirtualizedList = forwardRef((inProps, ref) => {
|
|
|
173
160
|
if (direction === 'up') {
|
|
174
161
|
do {
|
|
175
162
|
if (pointer - 1 < firstItemIndex) {
|
|
176
|
-
// disabled focus loop when infinite is true
|
|
177
163
|
if (infinite) {
|
|
178
164
|
pointer = startIndex;
|
|
179
165
|
}
|
|
@@ -193,7 +179,6 @@ const VirtualizedList = forwardRef((inProps, ref) => {
|
|
|
193
179
|
else {
|
|
194
180
|
do {
|
|
195
181
|
if (pointer + 1 > lastItemIndex) {
|
|
196
|
-
// disabled focus loop when infinite is true
|
|
197
182
|
if (infinite) {
|
|
198
183
|
pointer = startIndex;
|
|
199
184
|
}
|
|
@@ -234,7 +219,6 @@ const VirtualizedList = forwardRef((inProps, ref) => {
|
|
|
234
219
|
focusByIndex: focusByIndexAction,
|
|
235
220
|
}), [focusByIndexAction]);
|
|
236
221
|
useEffect(() => {
|
|
237
|
-
// Execute the initial focus item by index promise when the list is ready
|
|
238
222
|
if (isReady) {
|
|
239
223
|
initialFocusItemByIndexPromiseRef.current?.();
|
|
240
224
|
}
|
|
@@ -252,25 +236,13 @@ const VirtualizedList = forwardRef((inProps, ref) => {
|
|
|
252
236
|
computeItemKey: computeItemKey,
|
|
253
237
|
};
|
|
254
238
|
const { externalWindow } = useWindowContext();
|
|
255
|
-
/**
|
|
256
|
-
* The 'externalWindow' prop exists only in the forked version of Virtuoso.
|
|
257
|
-
*
|
|
258
|
-
* Passing 'externalWindow' to the original Virtuoso component will result in a React error.
|
|
259
|
-
*
|
|
260
|
-
* If 'externalWindow' is present in the context, it indicates that the user is using the forked version.
|
|
261
|
-
*
|
|
262
|
-
* Therefore, we only pass 'externalWindow' to Virtuoso when it exists and is not the same as the global window, ensuring compatibility.
|
|
263
|
-
*/
|
|
264
239
|
const externalProps = externalWindow &&
|
|
265
|
-
// window is not the same as the global window, we need to pass the externalWindow to Virtuoso for fork virtuoso
|
|
266
240
|
externalWindow !== (window || globalThis.window)
|
|
267
241
|
? {
|
|
268
242
|
externalWindow,
|
|
269
243
|
}
|
|
270
244
|
: undefined;
|
|
271
|
-
return (jsx(Virtuoso, { className: "sui-virtualized-list", ...externalProps, ref: handleVirtuosoRef,
|
|
272
|
-
// pre-render, make scroll smooth when move focus
|
|
273
|
-
increaseViewportBy: 200, ...(computeItemKey ? { computeItemKey } : undefined), ...rest, context: { ...context, ...virtuosoContext }, components: { ...VirtuosoComponents, ...components }, totalCount: totalCount, data: data, rangeChanged: (range) => {
|
|
245
|
+
return (jsx(Virtuoso, { className: "sui-virtualized-list", ...externalProps, ref: handleVirtuosoRef, increaseViewportBy: 200, ...(computeItemKey ? { computeItemKey } : undefined), ...rest, context: { ...context, ...virtuosoContext }, components: { ...VirtuosoComponents, ...components }, totalCount: totalCount, data: data, rangeChanged: (range) => {
|
|
274
246
|
listRangeRef.current = range;
|
|
275
247
|
const itemRenderedPromise = itemRenderedPromiseRef.current;
|
|
276
248
|
if (itemRenderedPromise) {
|
package/chunks/Alert.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { forwardRef, isValidElement } from 'react';
|
|
3
|
-
import { useClasses } from '@ringcentral/spring-base';
|
|
2
|
+
import { forwardRef, useMemo, isValidElement } from 'react';
|
|
4
3
|
import { Xmd, InfoMd, AlertMd, SuccessMd } from '@ringcentral/spring-icon';
|
|
5
|
-
import { useThemeProps } from '@ringcentral/spring-theme';
|
|
4
|
+
import { useThemeProps, useClassesWithMode, useMode } from '@ringcentral/spring-theme';
|
|
6
5
|
import clsx from 'clsx';
|
|
7
6
|
import { I as Icon } from './Icon.js';
|
|
8
7
|
import { I as IconButton } from './IconButtonLabel.js';
|
|
@@ -17,9 +16,11 @@ const DEFAULT_ICON_MAP = {
|
|
|
17
16
|
const Alert = forwardRef((inProps, ref) => {
|
|
18
17
|
const props = useThemeProps({ props: inProps, name: 'Alert' });
|
|
19
18
|
const { action, classes, className, component: AlertRoot = 'div', closeText = 'close', children, icon: iconProp, startSlot, onClose, severity = 'info', CloseButtonProps, ...rest } = props;
|
|
20
|
-
const cls =
|
|
19
|
+
const cls = useClassesWithMode('alert', classes, className);
|
|
20
|
+
const { mode } = useMode();
|
|
21
|
+
const iconSize = useMemo(() => (mode === 'compact' ? 'small' : 'medium'), [mode]);
|
|
21
22
|
const renderIcon = (icon, severity) => {
|
|
22
|
-
return (jsx("div", { className: cls('icon', `${severity}-icon`), children: isValidElement(icon) ? (icon) : (jsx(Icon, { size:
|
|
23
|
+
return (jsx("div", { className: cls('icon', `${severity}-icon`), children: isValidElement(icon) ? (icon) : (jsx(Icon, { size: iconSize, symbol: icon })) }));
|
|
23
24
|
};
|
|
24
25
|
let startSlotContent = null;
|
|
25
26
|
if (startSlot) {
|
|
@@ -31,7 +32,7 @@ const Alert = forwardRef((inProps, ref) => {
|
|
|
31
32
|
}
|
|
32
33
|
let closeSlot = null;
|
|
33
34
|
if (onClose) {
|
|
34
|
-
closeSlot = (jsx(IconButton, { symbol: Xmd, variant: "icon", shape: 'squircle', color: 'secondary', size:
|
|
35
|
+
closeSlot = (jsx(IconButton, { symbol: Xmd, variant: "icon", shape: 'squircle', color: 'secondary', size: iconSize, background: false, title: closeText, "aria-label": closeText, onClick: onClose, ...CloseButtonProps, className: clsx(cls('close'), CloseButtonProps?.className) }));
|
|
35
36
|
}
|
|
36
37
|
let actionSlot = null;
|
|
37
38
|
if (action) {
|
|
@@ -40,7 +41,7 @@ const Alert = forwardRef((inProps, ref) => {
|
|
|
40
41
|
return (jsxs(AlertRoot, { ...rest, ref: ref, className: cls('root', severity), children: [startSlotContent, jsxs("div", { className: cls('body'), children: [jsx("div", { className: cls('content'), role: "alert", children: children }), actionSlot] }), closeSlot] }));
|
|
41
42
|
});
|
|
42
43
|
const AlertTitle = ({ className, classes, ...rest }) => {
|
|
43
|
-
const cls =
|
|
44
|
+
const cls = useClassesWithMode('alert-title', classes, className);
|
|
44
45
|
return jsx("div", { className: cls('root'), ...rest });
|
|
45
46
|
};
|
|
46
47
|
|
|
@@ -15,7 +15,6 @@ const BottomNavigationItem = forwardRef((inProps, ref) => {
|
|
|
15
15
|
const { classes, symbol, activatedSymbol, count, value: valueProp, activated: activatedProp, expanded: expandedProp, onClick, BadgeProps = {}, TooltipProps = {}, ButtonProps = {}, label, className, } = props;
|
|
16
16
|
const cls = useClasses('bottom-navigation-item', classes, className);
|
|
17
17
|
const { value: selectedValue, expanded: isExpanded, onSelected, animationComplete, } = useBottomNavigationContext() || {};
|
|
18
|
-
// close tooltip temporarily during animation
|
|
19
18
|
const tooltipOpenProps = useTooltipForceHide(animationComplete === false);
|
|
20
19
|
const selected = selectedValue === valueProp;
|
|
21
20
|
const activated = activatedProp !== undefined ? activatedProp : selected;
|
package/chunks/Button.js
CHANGED
|
@@ -47,7 +47,6 @@ const Button = withTooltip(forwardRef((inProps, ref) => {
|
|
|
47
47
|
const ButtonRoot = component;
|
|
48
48
|
const isTextContent = typeof children === 'string';
|
|
49
49
|
const title = (() => {
|
|
50
|
-
// * if title is not provided and children is string, use children as title
|
|
51
50
|
if (titleProp === undefined && isTextContent) {
|
|
52
51
|
return children;
|
|
53
52
|
}
|
package/chunks/Chip.js
CHANGED
|
@@ -11,18 +11,14 @@ const Chip = forwardRef((inProps, ref) => {
|
|
|
11
11
|
const { component: ChipRoot = 'div', classes, className, children, label, startSlot, size = 'large', clickable: clickableProp, truncate = true, color = 'default', DeleteIconProps = {}, disabled, onClick, onDelete, onKeyDown, onKeyUp, ...rest } = props;
|
|
12
12
|
const cls = useClasses('chip', classes, className);
|
|
13
13
|
const handleDeleteIconClick = (event) => {
|
|
14
|
-
// Stop the event from bubbling up to the `Chip`
|
|
15
14
|
event.stopPropagation();
|
|
16
15
|
if (onDelete) {
|
|
17
16
|
onDelete(event);
|
|
18
17
|
}
|
|
19
18
|
};
|
|
20
19
|
const handleKeyDown = (event) => {
|
|
21
|
-
// Ignore events from children of `Chip`.
|
|
22
20
|
if (event.currentTarget === event.target &&
|
|
23
21
|
isDeleteKeyboardEvent(event)) {
|
|
24
|
-
// Will be handled in keyUp, otherwise some browsers
|
|
25
|
-
// might init navigation
|
|
26
22
|
event.preventDefault();
|
|
27
23
|
}
|
|
28
24
|
if (onKeyDown) {
|
|
@@ -30,7 +26,6 @@ const Chip = forwardRef((inProps, ref) => {
|
|
|
30
26
|
}
|
|
31
27
|
};
|
|
32
28
|
const handleKeyUp = (event) => {
|
|
33
|
-
// Ignore events from children of `Chip`.
|
|
34
29
|
if (event.currentTarget === event.target &&
|
|
35
30
|
onDelete &&
|
|
36
31
|
isDeleteKeyboardEvent(event)) {
|
package/chunks/Drawer.js
CHANGED
|
@@ -9,38 +9,9 @@ import { u as usePrefersReducedMotion } from './usePrefersReducedMotion.js';
|
|
|
9
9
|
import { g as getSlideIn } from './getSlideIn.js';
|
|
10
10
|
import { M as Modal } from './Modal.js';
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
* Drawer Component - Base drawer without gesture support
|
|
14
|
-
*
|
|
15
|
-
* A clean, lightweight drawer component that provides basic modal/slide functionality.
|
|
16
|
-
* For gesture support, use SwipeableDrawer which builds on top of this component.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* // Simple navigation drawer
|
|
21
|
-
* <Drawer
|
|
22
|
-
* open={open}
|
|
23
|
-
* onClose={onClose}
|
|
24
|
-
* anchor="left"
|
|
25
|
-
* variant="temporary"
|
|
26
|
-
* >
|
|
27
|
-
* <Navigation />
|
|
28
|
-
* </Drawer>
|
|
29
|
-
*
|
|
30
|
-
* // Bottom sheet without gestures
|
|
31
|
-
* <Drawer
|
|
32
|
-
* open={open}
|
|
33
|
-
* onClose={onClose}
|
|
34
|
-
* anchor="bottom"
|
|
35
|
-
* >
|
|
36
|
-
* <Content />
|
|
37
|
-
* </Drawer>
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
12
|
const Drawer = forwardRef((inProps, ref) => {
|
|
41
13
|
const props = useThemeProps({ props: inProps, name: 'Drawer' });
|
|
42
|
-
const { anchor = 'left', bodyProps, classes, className, children, header, footer, open, onClose, variant = 'temporary',
|
|
43
|
-
blocking = true, measurementRefs, headerProps, ...rest } = props;
|
|
14
|
+
const { anchor = 'left', bodyProps, classes, className, children, header, footer, open, onClose, variant = 'temporary', blocking = true, measurementRefs, headerProps, ...rest } = props;
|
|
44
15
|
const headerRef = measurementRefs?.header;
|
|
45
16
|
const footerRef = measurementRefs?.footer;
|
|
46
17
|
const contentRef = measurementRefs?.content;
|
package/chunks/ListItem.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { forwardRef, useEffect } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import { motionTransition, useThemeProps } from '@ringcentral/spring-theme';
|
|
3
|
+
import { useFocusVisible, useActive, useHover, combineProps, useForkRef } from '@ringcentral/spring-base';
|
|
4
|
+
import { motionTransition, useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
|
|
5
5
|
import { D as Divider } from './Divider.js';
|
|
6
6
|
import { useItemNavigation } from '../ListNavigation.js';
|
|
7
7
|
import { useVirtualizedItemPropsContext } from '../VirtualizedList.js';
|
|
@@ -34,7 +34,7 @@ const HoverActions = (props) => {
|
|
|
34
34
|
const ListItem = forwardRef((inProps, ref) => {
|
|
35
35
|
const props = useThemeProps({ props: inProps, name: 'ListItem' });
|
|
36
36
|
const { classes, className, children, hoverActions, size = 'small', tabIndex = -1, role = 'listitem', divider = true, onClick, clickable = Boolean(onClick), hoverable = true, focused = false, highlighted = false, autoFocus, selected, dragged, alwaysShowHoverActions = false, instantHoverActions = false, style: styleProp, ...rest } = props;
|
|
37
|
-
const cls =
|
|
37
|
+
const cls = useClassesWithMode('list-item', classes, className);
|
|
38
38
|
const { itemRef, keyboardNavHandlers } = useItemNavigation() ?? {};
|
|
39
39
|
const virtualizedItemProps = useVirtualizedItemPropsContext();
|
|
40
40
|
const { focusVisible, focusVisibleWithin, focusVisibleRef, focusVisibleHandlers, } = useFocusVisible({ ...props, within: true });
|
|
@@ -44,8 +44,6 @@ const ListItem = forwardRef((inProps, ref) => {
|
|
|
44
44
|
});
|
|
45
45
|
const { hover, hoverHandlers } = useHover({
|
|
46
46
|
...props,
|
|
47
|
-
// useHover only used for hover actions,
|
|
48
|
-
// so disabled when no hover actions or always show
|
|
49
47
|
disabled: !hoverable || !hoverActions,
|
|
50
48
|
});
|
|
51
49
|
const enhancedEventHandlers = (() => {
|
|
@@ -64,7 +62,6 @@ const ListItem = forwardRef((inProps, ref) => {
|
|
|
64
62
|
if (autoFocus) {
|
|
65
63
|
itemRef?.current?.focus();
|
|
66
64
|
}
|
|
67
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
68
65
|
}, []);
|
|
69
66
|
const isShowHoverAction = hover || focusVisibleWithin || alwaysShowHoverActions;
|
|
70
67
|
return (jsxs("div", { className: cls('root', size, {
|
package/chunks/Menu.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { createContext, useContext, forwardRef, useMemo } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import { useThemeProps } from '@ringcentral/spring-theme';
|
|
3
|
+
import { useEventCallback } from '@ringcentral/spring-base';
|
|
4
|
+
import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
|
|
5
5
|
import { a as useNestedParentMenu, N as NestedMenuContext } from './useNestedParentMenu.js';
|
|
6
6
|
import { P as Popover } from './Popover.js';
|
|
7
7
|
|
|
@@ -13,7 +13,7 @@ const useMenuContext = () => {
|
|
|
13
13
|
const Menu = forwardRef((inProps, ref) => {
|
|
14
14
|
const props = useThemeProps({ props: inProps, name: 'Menu' });
|
|
15
15
|
const { classes, children, open = false, onClose, autoFocus = true, className, PopperProps, ...rest } = props;
|
|
16
|
-
const cls =
|
|
16
|
+
const cls = useClassesWithMode('menu', classes, className);
|
|
17
17
|
const padding = PopperProps?.padding;
|
|
18
18
|
const popperPadding = typeof padding === 'object'
|
|
19
19
|
? {
|
package/chunks/MenuDivider.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { forwardRef } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import { useThemeProps } from '@ringcentral/spring-theme';
|
|
3
|
+
import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
|
|
5
4
|
import { D as Divider } from './Divider.js';
|
|
6
5
|
|
|
7
6
|
const MenuDivider = forwardRef((inProps, ref) => {
|
|
8
7
|
const props = useThemeProps({ props: inProps, name: 'MenuDivider' });
|
|
9
8
|
const { classes, className, ...rest } = props;
|
|
10
|
-
const cls =
|
|
9
|
+
const cls = useClassesWithMode('menu-divider', classes, className);
|
|
11
10
|
return jsx(Divider, { className: cls('root'), ...rest, ref: ref });
|
|
12
11
|
});
|
|
13
12
|
MenuDivider.displayName = 'SuiMenuDivider';
|
package/chunks/MenuItemText.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { forwardRef } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
import { useThemeProps } from '@ringcentral/spring-theme';
|
|
3
|
+
import { getTitle } from '@ringcentral/spring-base';
|
|
4
|
+
import { useThemeProps, useClassesWithMode } from '@ringcentral/spring-theme';
|
|
5
5
|
|
|
6
6
|
const MenuItemText = forwardRef((inProps, ref) => {
|
|
7
7
|
const props = useThemeProps({ props: inProps, name: 'MenuItemText' });
|
|
8
8
|
const { classes, className, primary, primaryText, infoText, info, children, ...rest } = props;
|
|
9
|
-
const cls =
|
|
9
|
+
const cls = useClassesWithMode('menu-item-text', classes, className);
|
|
10
10
|
const primaryContent = primary ?? primaryText ?? children;
|
|
11
11
|
const secondaryContent = info ?? infoText;
|
|
12
12
|
return (jsxs("div", { className: cls('root'), ...rest, ref: ref, children: [jsx("span", { className: cls('primary-text'), title: getTitle(primaryContent), children: primaryContent }), secondaryContent && (jsx("span", { className: cls('info-text'), title: getTitle(secondaryContent), children: secondaryContent }))] }));
|
package/chunks/MenuList.js
CHANGED
|
@@ -31,13 +31,10 @@ const MenuList = forwardRef((inProps, ref) => {
|
|
|
31
31
|
const { document } = useWindowContext();
|
|
32
32
|
useEffect(() => {
|
|
33
33
|
if (autoFocus &&
|
|
34
|
-
// ensure item can auto focus correctly
|
|
35
34
|
!listRef.current?.contains(document?.activeElement ?? null)) {
|
|
36
35
|
actions.current?.focus();
|
|
37
36
|
}
|
|
38
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
37
|
}, []);
|
|
40
|
-
// Use appropriate role and ARIA attributes based on widget type
|
|
41
38
|
const listRole = widget === 'select' ? 'listbox' : 'menu';
|
|
42
39
|
const listboxProps = widget === 'select'
|
|
43
40
|
? { 'aria-multiselectable': selectMode === 'multiple' }
|
|
@@ -57,7 +57,6 @@ const PickerTextField = forwardRef((props, ref) => {
|
|
|
57
57
|
...inputProps,
|
|
58
58
|
}, ...rest, readOnly: true, onClear: (e) => {
|
|
59
59
|
onClear?.(e);
|
|
60
|
-
// prevent open popover
|
|
61
60
|
e.stopPropagation();
|
|
62
61
|
} }), jsx(Popover, { bordered: true, open: open, anchorEl: anchorRef.current, onClose: (...args) => {
|
|
63
62
|
handleOpen(false);
|
package/chunks/Popover.js
CHANGED
|
@@ -37,11 +37,6 @@ const Popover = forwardRef((inProps, ref) => {
|
|
|
37
37
|
const popperPaperProps = {
|
|
38
38
|
className: cls('paper', { bordered, shadow }),
|
|
39
39
|
};
|
|
40
|
-
/**
|
|
41
|
-
* If no transform origin is set, determine the transform origin using
|
|
42
|
-
* the computed placement. This ensures the transition used for the
|
|
43
|
-
* grow animation is always faithful to where the Popover is positioned.
|
|
44
|
-
*/
|
|
45
40
|
if (!transformOrigin) {
|
|
46
41
|
popperPaperProps.style = {
|
|
47
42
|
...popperPaperProps.style,
|
package/chunks/Select.js
CHANGED
|
@@ -26,7 +26,6 @@ const useSelect = (props) => {
|
|
|
26
26
|
},
|
|
27
27
|
onKeyDown: (e) => {
|
|
28
28
|
if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
|
|
29
|
-
// prevent scroll
|
|
30
29
|
e.preventDefault();
|
|
31
30
|
handleOpen(true);
|
|
32
31
|
}
|
|
@@ -86,7 +85,6 @@ const Select = forwardRef((inProps, ref) => {
|
|
|
86
85
|
}
|
|
87
86
|
});
|
|
88
87
|
useEffect(() => {
|
|
89
|
-
// close menu when disabled
|
|
90
88
|
if (disabled) {
|
|
91
89
|
handleOpen(false);
|
|
92
90
|
}
|
|
@@ -108,7 +106,6 @@ const Select = forwardRef((inProps, ref) => {
|
|
|
108
106
|
if (getSelectedIndex)
|
|
109
107
|
return getSelectedIndex(value);
|
|
110
108
|
if (Array.isArray(value)) {
|
|
111
|
-
// For multiple selection, focus on the last selected item
|
|
112
109
|
const lastSelectedItem = value.at(-1);
|
|
113
110
|
return lastSelectedItem ? data.indexOf(lastSelectedItem) : -1;
|
|
114
111
|
}
|
|
@@ -117,45 +114,17 @@ const Select = forwardRef((inProps, ref) => {
|
|
|
117
114
|
return true;
|
|
118
115
|
});
|
|
119
116
|
const handleMenuListChange = useEventCallback((newValue) => {
|
|
120
|
-
// for uncontrolled mode
|
|
121
117
|
setValue(newValue);
|
|
122
118
|
if (inputRef.current) {
|
|
123
|
-
/**
|
|
124
|
-
* Programatically trigger the onChange event of the native input element.
|
|
125
|
-
* Doing this means we can avoid cloning another event to mimic the ChangeEvent.
|
|
126
|
-
*/
|
|
127
|
-
/**
|
|
128
|
-
* Set the value property of the input element, avoiding React's overridden setter.
|
|
129
|
-
* This will cause the input element to update its value and fire the onChange event,
|
|
130
|
-
* `handleInputChange` will then call onChange
|
|
131
|
-
*/
|
|
132
119
|
Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set?.call(inputRef.current, newValue);
|
|
133
120
|
const event = new Event('input', { bubbles: true });
|
|
134
|
-
/**
|
|
135
|
-
* When `selectMode` is `multiple`, the default `event.target.value` type is `string`,
|
|
136
|
-
* but it should actually be `string[]`. Since browsers do not natively support this,
|
|
137
|
-
* we need to override the `value` property to ensure it correctly reflects an array.
|
|
138
|
-
*
|
|
139
|
-
* Why do we need `Object.defineProperty` to override `event.target.value`?
|
|
140
|
-
* - The `target` property of an event object is read-only, so we cannot modify it directly.
|
|
141
|
-
* - `Object.defineProperty` allows us to override `event.target`, but it requires returning
|
|
142
|
-
* an object from the getter.
|
|
143
|
-
* - To dynamically override only the `value` property while preserving all other properties
|
|
144
|
-
* and methods of the input element, we use a `Proxy`.
|
|
145
|
-
*
|
|
146
|
-
* How does this approach help?
|
|
147
|
-
* - Ensures `event.target.value` correctly returns a `string[]` instead of a `string`.
|
|
148
|
-
* - Keeps the event object behaving as expected when accessed by event handlers.
|
|
149
|
-
* - Preserves other native properties (`name`, `id`, `type`, etc.) and methods
|
|
150
|
-
* (`focus()`, `blur()`, etc.), preventing potential "Illegal Invocation" errors.
|
|
151
|
-
*/
|
|
152
121
|
Object.defineProperty(event, 'target', {
|
|
153
122
|
configurable: true,
|
|
154
123
|
get: () => {
|
|
155
124
|
return new Proxy(inputRef.current, {
|
|
156
125
|
get(obj, prop) {
|
|
157
126
|
if (prop === 'value') {
|
|
158
|
-
return newValue;
|
|
127
|
+
return newValue;
|
|
159
128
|
}
|
|
160
129
|
return obj[prop];
|
|
161
130
|
},
|
|
@@ -169,10 +138,6 @@ const Select = forwardRef((inProps, ref) => {
|
|
|
169
138
|
open,
|
|
170
139
|
handleOpen,
|
|
171
140
|
});
|
|
172
|
-
/**
|
|
173
|
-
* The non-virtualized Menu/MenuList components have the necessary contexts
|
|
174
|
-
* baked in. For the virtualized Menu, we need to provide the context values.
|
|
175
|
-
*/
|
|
176
141
|
const { contextValue: virtualizedContextValue } = useMenuItemSelect({
|
|
177
142
|
value,
|
|
178
143
|
onChange: handleMenuListChange,
|
|
@@ -224,9 +189,7 @@ const Select = forwardRef((inProps, ref) => {
|
|
|
224
189
|
prefersReducedMotion: prefersReducedMotion,
|
|
225
190
|
}), children: children }) }) }));
|
|
226
191
|
}
|
|
227
|
-
return (jsxs(Fragment, { children: [jsxs(FormField, { disabled: disabled, required: required, variant: variant, error: error,
|
|
228
|
-
// Make sure the focus style doesn't disappear when the Menu is in its close transition
|
|
229
|
-
focused: open || (!open && !didMenuExit), htmlFor: id, label: label, labelProps: {
|
|
192
|
+
return (jsxs(Fragment, { children: [jsxs(FormField, { disabled: disabled, required: required, variant: variant, error: error, focused: open || (!open && !didMenuExit), htmlFor: id, label: label, labelProps: {
|
|
230
193
|
id: labelId,
|
|
231
194
|
}, ref: ref, contentRef: formFieldContentRef, helperText: helperText, FormHelperTextProps: { id: helperTextId, ...FormHelperTextProps }, className: cls('root', { error }), classes: {
|
|
232
195
|
outlined: cls('outlined'),
|