@itwin/itwinui-react 3.0.0-dev.1 → 3.0.0-dev.3
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/CHANGELOG.md +25 -0
- package/cjs/core/Alert/Alert.d.ts +47 -28
- package/cjs/core/Alert/Alert.js +73 -21
- package/cjs/core/Avatar/Avatar.js +1 -1
- package/cjs/core/AvatarGroup/AvatarGroup.js +1 -1
- package/cjs/core/Breadcrumbs/Breadcrumbs.js +2 -3
- package/cjs/core/ButtonGroup/ButtonGroup.js +1 -4
- package/cjs/core/Buttons/DropdownButton/DropdownButton.js +3 -5
- package/cjs/core/Carousel/Carousel.d.ts +2 -2
- package/cjs/core/Carousel/Carousel.js +3 -5
- package/cjs/core/Carousel/CarouselDotsList.js +8 -10
- package/cjs/core/Carousel/CarouselNavigation.d.ts +2 -2
- package/cjs/core/Carousel/CarouselNavigation.js +3 -5
- package/cjs/core/Carousel/CarouselSlider.js +10 -15
- package/cjs/core/ColorPicker/ColorBuilder.js +7 -10
- package/cjs/core/ColorPicker/ColorInputPanel.js +12 -15
- package/cjs/core/ColorPicker/ColorPalette.js +4 -6
- package/cjs/core/ColorPicker/ColorPicker.js +3 -3
- package/cjs/core/ComboBox/ComboBox.js +25 -32
- package/cjs/core/ComboBox/ComboBoxDropdown.js +1 -2
- package/cjs/core/ComboBox/ComboBoxEndIcon.js +1 -1
- package/cjs/core/ComboBox/ComboBoxInput.js +21 -20
- package/cjs/core/ComboBox/ComboBoxMenu.js +3 -4
- package/cjs/core/ComboBox/ComboBoxMenuItem.js +2 -2
- package/cjs/core/ComboBox/helpers.js +4 -5
- package/cjs/core/DatePicker/DatePicker.js +32 -32
- package/cjs/core/Dialog/Dialog.js +11 -4
- package/cjs/core/Dialog/DialogBackdrop.js +1 -1
- package/cjs/core/Dialog/DialogContext.d.ts +11 -0
- package/cjs/core/Dialog/DialogMain.js +16 -22
- package/cjs/core/DropdownMenu/DropdownMenu.js +6 -8
- package/cjs/core/ExpandableBlock/ExpandableBlock.js +2 -2
- package/cjs/core/FileUpload/FileEmptyCard.js +1 -1
- package/cjs/core/FileUpload/FileUpload.d.ts +3 -4
- package/cjs/core/FileUpload/FileUpload.js +5 -8
- package/cjs/core/FileUpload/FileUploadCard.js +9 -10
- package/cjs/core/FileUpload/FileUploadTemplate.d.ts +1 -0
- package/cjs/core/FileUpload/FileUploadTemplate.js +1 -0
- package/cjs/core/InformationPanel/InformationPanel.js +1 -4
- package/cjs/core/LabeledInput/LabeledInput.js +1 -1
- package/cjs/core/LabeledTextarea/LabeledTextarea.js +1 -1
- package/cjs/core/Menu/Menu.js +3 -4
- package/cjs/core/Menu/MenuItem.js +8 -11
- package/cjs/core/Modal/Modal.d.ts +8 -9
- package/cjs/core/Modal/Modal.js +7 -17
- package/cjs/core/SearchBox/SearchBox.js +12 -12
- package/cjs/core/Select/Select.js +12 -17
- package/cjs/core/SideNavigation/SideNavigation.js +2 -2
- package/cjs/core/Slider/Slider.js +16 -19
- package/cjs/core/Slider/Thumb.js +1 -1
- package/cjs/core/StatusMessage/StatusMessage.js +1 -1
- package/cjs/core/Stepper/Stepper.js +1 -1
- package/cjs/core/Stepper/StepperStep.js +1 -1
- package/cjs/core/Table/Table.js +15 -15
- package/cjs/core/Table/TablePaginator.js +2 -3
- package/cjs/core/Table/TableRowMemoized.js +38 -45
- package/cjs/core/Table/actionHandlers/expandHandler.js +3 -3
- package/cjs/core/Table/actionHandlers/filterHandler.js +4 -5
- package/cjs/core/Table/actionHandlers/selectHandler.js +6 -6
- package/cjs/core/Table/cells/DefaultCell.js +1 -1
- package/cjs/core/Table/cells/EditableCell.js +6 -12
- package/cjs/core/Table/columns/actionColumn.js +3 -6
- package/cjs/core/Table/columns/expanderColumn.js +3 -3
- package/cjs/core/Table/columns/selectionColumn.js +4 -4
- package/cjs/core/Table/filters/DateRangeFilter/DatePickerInput.js +2 -4
- package/cjs/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -3
- package/cjs/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +2 -3
- package/cjs/core/Table/filters/TextFilter/TextFilter.js +1 -2
- package/cjs/core/Table/hooks/useResizeColumns.js +16 -22
- package/cjs/core/Table/hooks/useScrollToRow.js +1 -2
- package/cjs/core/Table/hooks/useStickyColumns.js +3 -5
- package/cjs/core/Table/hooks/useSubRowFiltering.js +2 -4
- package/cjs/core/Tabs/Tabs.js +13 -16
- package/cjs/core/ThemeProvider/ThemeContext.d.ts +1 -1
- package/cjs/core/ThemeProvider/ThemeProvider.d.ts +2 -3
- package/cjs/core/ThemeProvider/ThemeProvider.js +14 -13
- package/cjs/core/Tile/Tile.js +2 -3
- package/cjs/core/TimePicker/TimePicker.js +13 -13
- package/cjs/core/Toast/Toast.d.ts +5 -10
- package/cjs/core/Toast/Toast.js +17 -16
- package/cjs/core/Toast/Toaster.d.ts +24 -26
- package/cjs/core/Toast/Toaster.js +91 -121
- package/cjs/core/Toast/index.d.ts +1 -4
- package/cjs/core/Toast/index.js +3 -6
- package/cjs/core/TransferList/TransferList.js +3 -4
- package/cjs/core/Tree/Tree.js +9 -13
- package/cjs/core/Tree/TreeNode.js +9 -10
- package/cjs/core/index.d.ts +1 -2
- package/cjs/core/index.js +2 -5
- package/cjs/core/utils/color/ColorValue.js +9 -15
- package/cjs/core/utils/components/AutoclearingHiddenLiveRegion.js +2 -3
- package/cjs/core/utils/components/FocusTrap.js +4 -4
- package/cjs/core/utils/components/MiddleTextTruncation.js +1 -2
- package/cjs/core/utils/components/Popover.d.ts +1 -1
- package/cjs/core/utils/components/Popover.js +5 -8
- package/cjs/core/utils/components/Resizer.js +7 -6
- package/cjs/core/utils/components/VirtualScroll.js +14 -21
- package/cjs/core/utils/functions/dom.d.ts +0 -8
- package/cjs/core/utils/functions/dom.js +3 -26
- package/cjs/core/utils/functions/polymorphic.d.ts +1 -1
- package/cjs/core/utils/functions/polymorphic.js +1 -1
- package/cjs/core/utils/functions/supports.js +1 -1
- package/cjs/core/utils/hooks/index.d.ts +0 -1
- package/cjs/core/utils/hooks/index.js +0 -1
- package/cjs/core/utils/hooks/useContainerWidth.js +1 -1
- package/cjs/core/utils/hooks/useDragAndDrop.js +8 -10
- package/cjs/core/utils/hooks/useEventListener.js +1 -1
- package/cjs/core/utils/hooks/useGlobals.d.ts +9 -2
- package/cjs/core/utils/hooks/useGlobals.js +6 -4
- package/cjs/core/utils/hooks/useId.js +1 -2
- package/cjs/core/utils/hooks/useIntersection.js +2 -3
- package/cjs/core/utils/hooks/useMediaQuery.js +6 -8
- package/cjs/core/utils/hooks/useOverflow.js +1 -2
- package/cjs/core/utils/hooks/useResizeObserver.js +3 -4
- package/cjs/styles.js +1 -4
- package/esm/core/Alert/Alert.d.ts +47 -28
- package/esm/core/Alert/Alert.js +74 -22
- package/esm/core/Avatar/Avatar.js +1 -1
- package/esm/core/AvatarGroup/AvatarGroup.js +1 -1
- package/esm/core/Breadcrumbs/Breadcrumbs.js +2 -3
- package/esm/core/ButtonGroup/ButtonGroup.js +1 -4
- package/esm/core/Buttons/DropdownButton/DropdownButton.js +3 -5
- package/esm/core/Carousel/Carousel.d.ts +2 -2
- package/esm/core/Carousel/Carousel.js +3 -5
- package/esm/core/Carousel/CarouselDotsList.js +8 -10
- package/esm/core/Carousel/CarouselNavigation.d.ts +2 -2
- package/esm/core/Carousel/CarouselNavigation.js +3 -5
- package/esm/core/Carousel/CarouselSlider.js +10 -15
- package/esm/core/ColorPicker/ColorBuilder.js +7 -10
- package/esm/core/ColorPicker/ColorInputPanel.js +12 -15
- package/esm/core/ColorPicker/ColorPalette.js +4 -6
- package/esm/core/ColorPicker/ColorPicker.js +3 -3
- package/esm/core/ComboBox/ComboBox.js +25 -32
- package/esm/core/ComboBox/ComboBoxDropdown.js +1 -2
- package/esm/core/ComboBox/ComboBoxEndIcon.js +1 -1
- package/esm/core/ComboBox/ComboBoxInput.js +21 -20
- package/esm/core/ComboBox/ComboBoxMenu.js +3 -4
- package/esm/core/ComboBox/ComboBoxMenuItem.js +2 -2
- package/esm/core/ComboBox/helpers.js +4 -5
- package/esm/core/DatePicker/DatePicker.js +32 -32
- package/esm/core/Dialog/Dialog.js +12 -5
- package/esm/core/Dialog/DialogBackdrop.js +1 -1
- package/esm/core/Dialog/DialogContext.d.ts +11 -0
- package/esm/core/Dialog/DialogMain.js +16 -22
- package/esm/core/DropdownMenu/DropdownMenu.js +6 -8
- package/esm/core/ExpandableBlock/ExpandableBlock.js +2 -2
- package/esm/core/FileUpload/FileEmptyCard.js +1 -1
- package/esm/core/FileUpload/FileUpload.d.ts +3 -4
- package/esm/core/FileUpload/FileUpload.js +5 -8
- package/esm/core/FileUpload/FileUploadCard.js +9 -10
- package/esm/core/FileUpload/FileUploadTemplate.d.ts +1 -0
- package/esm/core/FileUpload/FileUploadTemplate.js +1 -0
- package/esm/core/InformationPanel/InformationPanel.js +1 -4
- package/esm/core/LabeledInput/LabeledInput.js +1 -1
- package/esm/core/LabeledTextarea/LabeledTextarea.js +1 -1
- package/esm/core/Menu/Menu.js +3 -4
- package/esm/core/Menu/MenuItem.js +8 -11
- package/esm/core/Modal/Modal.d.ts +8 -9
- package/esm/core/Modal/Modal.js +3 -10
- package/esm/core/SearchBox/SearchBox.js +12 -12
- package/esm/core/Select/Select.js +12 -17
- package/esm/core/SideNavigation/SideNavigation.js +2 -2
- package/esm/core/Slider/Slider.js +16 -19
- package/esm/core/Slider/Thumb.js +1 -1
- package/esm/core/StatusMessage/StatusMessage.js +1 -1
- package/esm/core/Stepper/Stepper.js +1 -1
- package/esm/core/Stepper/StepperStep.js +1 -1
- package/esm/core/Table/Table.js +15 -15
- package/esm/core/Table/TablePaginator.js +2 -3
- package/esm/core/Table/TableRowMemoized.js +38 -45
- package/esm/core/Table/actionHandlers/expandHandler.js +3 -3
- package/esm/core/Table/actionHandlers/filterHandler.js +4 -5
- package/esm/core/Table/actionHandlers/selectHandler.js +6 -6
- package/esm/core/Table/cells/DefaultCell.js +1 -1
- package/esm/core/Table/cells/EditableCell.js +6 -12
- package/esm/core/Table/columns/actionColumn.js +3 -6
- package/esm/core/Table/columns/expanderColumn.js +3 -3
- package/esm/core/Table/columns/selectionColumn.js +4 -4
- package/esm/core/Table/filters/DateRangeFilter/DatePickerInput.js +2 -4
- package/esm/core/Table/filters/DateRangeFilter/DateRangeFilter.js +2 -3
- package/esm/core/Table/filters/NumberRangeFilter/NumberRangeFilter.js +2 -3
- package/esm/core/Table/filters/TextFilter/TextFilter.js +1 -2
- package/esm/core/Table/hooks/useResizeColumns.js +16 -22
- package/esm/core/Table/hooks/useScrollToRow.js +1 -2
- package/esm/core/Table/hooks/useStickyColumns.js +3 -5
- package/esm/core/Table/hooks/useSubRowFiltering.js +2 -4
- package/esm/core/Tabs/Tabs.js +13 -16
- package/esm/core/ThemeProvider/ThemeContext.d.ts +1 -1
- package/esm/core/ThemeProvider/ThemeProvider.d.ts +2 -3
- package/esm/core/ThemeProvider/ThemeProvider.js +15 -14
- package/esm/core/Tile/Tile.js +2 -3
- package/esm/core/TimePicker/TimePicker.js +13 -13
- package/esm/core/Toast/Toast.d.ts +5 -10
- package/esm/core/Toast/Toast.js +18 -17
- package/esm/core/Toast/Toaster.d.ts +24 -26
- package/esm/core/Toast/Toaster.js +85 -121
- package/esm/core/Toast/index.d.ts +1 -4
- package/esm/core/Toast/index.js +1 -3
- package/esm/core/TransferList/TransferList.js +3 -4
- package/esm/core/Tree/Tree.js +9 -13
- package/esm/core/Tree/TreeNode.js +9 -10
- package/esm/core/index.d.ts +1 -2
- package/esm/core/index.js +1 -1
- package/esm/core/utils/color/ColorValue.js +9 -15
- package/esm/core/utils/components/AutoclearingHiddenLiveRegion.js +2 -3
- package/esm/core/utils/components/FocusTrap.js +4 -4
- package/esm/core/utils/components/MiddleTextTruncation.js +1 -2
- package/esm/core/utils/components/Popover.d.ts +1 -1
- package/esm/core/utils/components/Popover.js +5 -8
- package/esm/core/utils/components/Resizer.js +7 -6
- package/esm/core/utils/components/VirtualScroll.js +14 -21
- package/esm/core/utils/functions/dom.d.ts +0 -8
- package/esm/core/utils/functions/dom.js +2 -21
- package/esm/core/utils/functions/polymorphic.d.ts +1 -1
- package/esm/core/utils/functions/polymorphic.js +1 -1
- package/esm/core/utils/functions/supports.js +1 -1
- package/esm/core/utils/hooks/index.d.ts +0 -1
- package/esm/core/utils/hooks/index.js +0 -1
- package/esm/core/utils/hooks/useContainerWidth.js +1 -1
- package/esm/core/utils/hooks/useDragAndDrop.js +8 -10
- package/esm/core/utils/hooks/useEventListener.js +1 -1
- package/esm/core/utils/hooks/useGlobals.d.ts +9 -2
- package/esm/core/utils/hooks/useGlobals.js +6 -4
- package/esm/core/utils/hooks/useId.js +1 -2
- package/esm/core/utils/hooks/useIntersection.js +2 -3
- package/esm/core/utils/hooks/useMediaQuery.js +6 -8
- package/esm/core/utils/hooks/useOverflow.js +1 -2
- package/esm/core/utils/hooks/useResizeObserver.js +3 -4
- package/esm/styles.js +1 -4
- package/package.json +2 -2
- package/styles.css +19 -20
- package/cjs/core/Toast/ToastWrapper.d.ts +0 -10
- package/cjs/core/Toast/ToastWrapper.js +0 -49
- package/cjs/core/utils/hooks/useIsThemeAlreadySet.d.ts +0 -7
- package/cjs/core/utils/hooks/useIsThemeAlreadySet.js +0 -54
- package/esm/core/Toast/ToastWrapper.d.ts +0 -10
- package/esm/core/Toast/ToastWrapper.js +0 -20
- package/esm/core/utils/hooks/useIsThemeAlreadySet.d.ts +0 -7
- package/esm/core/utils/hooks/useIsThemeAlreadySet.js +0 -27
|
@@ -18,7 +18,6 @@ import { useColorPickerContext } from './ColorPickerContext.js';
|
|
|
18
18
|
* </ColorPicker>
|
|
19
19
|
*/
|
|
20
20
|
export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
21
|
-
var _a, _b, _c, _d, _f, _g, _h, _j;
|
|
22
21
|
const { defaultColorFormat, allowedColorFormats = ['hsl', 'rgb', 'hex'], className, ...rest } = props;
|
|
23
22
|
const inputsContainerRef = React.useRef(null);
|
|
24
23
|
const { activeColor, applyHsvColorChange, hsvColor, showAlpha } = useColorPickerContext();
|
|
@@ -29,14 +28,13 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
29
28
|
// need to use state since input may have parsing error
|
|
30
29
|
const [input, setInput] = React.useState(['', '', '', '']);
|
|
31
30
|
React.useEffect(() => {
|
|
32
|
-
var _a, _b;
|
|
33
31
|
if (currentFormat === 'hsl') {
|
|
34
32
|
const hsl = activeColor.toHslColor();
|
|
35
33
|
setInput([
|
|
36
34
|
ColorValue.getFormattedColorNumber(hsvColor.h),
|
|
37
35
|
ColorValue.getFormattedColorNumber(hsl.s),
|
|
38
36
|
ColorValue.getFormattedColorNumber(hsl.l),
|
|
39
|
-
ColorValue.getFormattedColorNumber(
|
|
37
|
+
ColorValue.getFormattedColorNumber(hsl.a ?? activeColor.getAlpha() / 255, 2),
|
|
40
38
|
]);
|
|
41
39
|
}
|
|
42
40
|
else if (currentFormat === 'rgb') {
|
|
@@ -45,7 +43,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
45
43
|
rgb.r.toString(),
|
|
46
44
|
rgb.g.toString(),
|
|
47
45
|
rgb.b.toString(),
|
|
48
|
-
ColorValue.getFormattedColorNumber(
|
|
46
|
+
ColorValue.getFormattedColorNumber(rgb.a ?? activeColor.getAlpha() / 255, 2),
|
|
49
47
|
]);
|
|
50
48
|
}
|
|
51
49
|
else {
|
|
@@ -55,9 +53,8 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
55
53
|
}, [activeColor, hsvColor.h, currentFormat, showAlpha]);
|
|
56
54
|
const [validHexInput, setValidHexInput] = React.useState(true);
|
|
57
55
|
const swapColorFormat = React.useCallback(() => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
allowedColorFormats.length]) !== null && _a !== void 0 ? _a : allowedColorFormats[0];
|
|
56
|
+
const newFormat = allowedColorFormats[(allowedColorFormats.indexOf(currentFormat) + 1) %
|
|
57
|
+
allowedColorFormats.length] ?? allowedColorFormats[0];
|
|
61
58
|
setCurrentFormat(newFormat);
|
|
62
59
|
}, [currentFormat, allowedColorFormats]);
|
|
63
60
|
const isFocusInside = (focused) => !!(focused &&
|
|
@@ -138,7 +135,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
138
135
|
React.createElement(InputContainer, { status: Number(input[0]) < 0 || Number(input[0]) > 360
|
|
139
136
|
? 'negative'
|
|
140
137
|
: undefined },
|
|
141
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '359', step: '.1', placeholder: 'H', value:
|
|
138
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '359', step: '.1', placeholder: 'H', value: input[0] ?? '', onChange: (event) => {
|
|
142
139
|
setInput([event.target.value, input[1], input[2], input[3]]);
|
|
143
140
|
}, onKeyDown: (event) => {
|
|
144
141
|
if (event.key === 'Enter') {
|
|
@@ -154,7 +151,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
154
151
|
React.createElement(InputContainer, { status: Number(input[1]) < 0 || Number(input[1]) > 100
|
|
155
152
|
? 'negative'
|
|
156
153
|
: undefined },
|
|
157
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '100', step: '.1', placeholder: 'S', value:
|
|
154
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '100', step: '.1', placeholder: 'S', value: input[1] ?? '', onChange: (event) => {
|
|
158
155
|
setInput([input[0], event.target.value, input[2], input[3]]);
|
|
159
156
|
}, onKeyDown: (event) => {
|
|
160
157
|
if (event.key === 'Enter') {
|
|
@@ -170,7 +167,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
170
167
|
React.createElement(InputContainer, { status: Number(input[2]) < 0 || Number(input[2]) > 100
|
|
171
168
|
? 'negative'
|
|
172
169
|
: undefined },
|
|
173
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '100', step: '.1', placeholder: 'L', value:
|
|
170
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '100', step: '.1', placeholder: 'L', value: input[2] ?? '', onChange: (event) => {
|
|
174
171
|
setInput([input[0], input[1], event.target.value, input[3]]);
|
|
175
172
|
}, onKeyDown: (event) => {
|
|
176
173
|
if (event.key === 'Enter') {
|
|
@@ -186,7 +183,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
186
183
|
showAlpha && (React.createElement(InputContainer, { status: Number(input[3]) < 0 || Number(input[3]) > 1
|
|
187
184
|
? 'negative'
|
|
188
185
|
: undefined },
|
|
189
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '1', step: '.01', placeholder: 'A', value:
|
|
186
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '1', step: '.01', placeholder: 'A', value: input[3] ?? '', onChange: (event) => {
|
|
190
187
|
setInput([input[0], input[1], input[2], event.target.value]);
|
|
191
188
|
}, onKeyDown: (event) => {
|
|
192
189
|
if (event.key === 'Enter') {
|
|
@@ -203,7 +200,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
203
200
|
React.createElement(InputContainer, { status: Number(input[0]) < 0 || Number(input[0]) > 255
|
|
204
201
|
? 'negative'
|
|
205
202
|
: undefined },
|
|
206
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'R', value:
|
|
203
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'R', value: input[0] ?? '', onChange: (event) => {
|
|
207
204
|
setInput([event.target.value, input[1], input[2], input[3]]);
|
|
208
205
|
}, onKeyDown: (event) => {
|
|
209
206
|
if (event.key === 'Enter') {
|
|
@@ -219,7 +216,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
219
216
|
React.createElement(InputContainer, { status: Number(input[1]) < 0 || Number(input[1]) > 255
|
|
220
217
|
? 'negative'
|
|
221
218
|
: undefined },
|
|
222
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'G', value:
|
|
219
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'G', value: input[1] ?? '', onChange: (event) => {
|
|
223
220
|
setInput([input[0], event.target.value, input[2], input[3]]);
|
|
224
221
|
}, onKeyDown: (event) => {
|
|
225
222
|
if (event.key === 'Enter') {
|
|
@@ -235,7 +232,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
235
232
|
React.createElement(InputContainer, { status: Number(input[2]) < 0 || Number(input[2]) > 255
|
|
236
233
|
? 'negative'
|
|
237
234
|
: undefined },
|
|
238
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'B', value:
|
|
235
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '255', placeholder: 'B', value: input[2] ?? '', onChange: (event) => {
|
|
239
236
|
setInput([input[0], input[1], event.target.value, input[3]]);
|
|
240
237
|
}, onKeyDown: (event) => {
|
|
241
238
|
if (event.key === 'Enter') {
|
|
@@ -251,7 +248,7 @@ export const ColorInputPanel = React.forwardRef((props, ref) => {
|
|
|
251
248
|
showAlpha && (React.createElement(InputContainer, { status: Number(input[3]) < 0 || Number(input[3]) > 1
|
|
252
249
|
? 'negative'
|
|
253
250
|
: undefined },
|
|
254
|
-
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '1', step: '.01', placeholder: 'A', value:
|
|
251
|
+
React.createElement(Input, { size: 'small', type: 'number', min: '0', max: '1', step: '.01', placeholder: 'A', value: input[3] ?? '', onChange: (event) => {
|
|
255
252
|
setInput([input[0], input[1], input[2], event.target.value]);
|
|
256
253
|
}, onKeyDown: (event) => {
|
|
257
254
|
if (event.key === 'Enter') {
|
|
@@ -25,9 +25,8 @@ export const ColorPalette = React.forwardRef((props, ref) => {
|
|
|
25
25
|
const [focusedIndex, setFocusedIndex] = React.useState();
|
|
26
26
|
// callback ref to set tabindex=0 on first child if none of the swatches are tabbable
|
|
27
27
|
const setDefaultTabIndex = (el) => {
|
|
28
|
-
var _a;
|
|
29
28
|
if (el && !el.querySelector('[tabindex="0"]')) {
|
|
30
|
-
|
|
29
|
+
el.firstElementChild?.setAttribute('tabindex', '0');
|
|
31
30
|
}
|
|
32
31
|
};
|
|
33
32
|
const paletteRef = React.useRef(null);
|
|
@@ -41,7 +40,7 @@ export const ColorPalette = React.forwardRef((props, ref) => {
|
|
|
41
40
|
if (!swatches.length) {
|
|
42
41
|
return;
|
|
43
42
|
}
|
|
44
|
-
const currentIndex = swatches.findIndex((swatch) =>
|
|
43
|
+
const currentIndex = swatches.findIndex((swatch) => swatch === paletteRef.current?.ownerDocument.activeElement);
|
|
45
44
|
if (currentIndex < 0) {
|
|
46
45
|
return;
|
|
47
46
|
}
|
|
@@ -83,10 +82,9 @@ export const ColorPalette = React.forwardRef((props, ref) => {
|
|
|
83
82
|
};
|
|
84
83
|
// call focus() when focusedIndex changes
|
|
85
84
|
React.useEffect(() => {
|
|
86
|
-
var _a;
|
|
87
85
|
if (focusedIndex != null) {
|
|
88
86
|
const swatches = getFocusableElements(paletteRef.current);
|
|
89
|
-
|
|
87
|
+
swatches[focusedIndex]?.focus();
|
|
90
88
|
}
|
|
91
89
|
}, [focusedIndex]);
|
|
92
90
|
return (React.createElement(Box, { className: cx('iui-color-palette-wrapper', className), ref: ref, ...rest },
|
|
@@ -98,7 +96,7 @@ export const ColorPalette = React.forwardRef((props, ref) => {
|
|
|
98
96
|
const color = getColorValue(_color);
|
|
99
97
|
return (React.createElement(ColorSwatch, { key: index, color: color, onClick: (event) => {
|
|
100
98
|
event.preventDefault();
|
|
101
|
-
onChangeComplete
|
|
99
|
+
onChangeComplete?.(color);
|
|
102
100
|
setActiveColor(color);
|
|
103
101
|
}, isActive: color.equals(activeColor) }));
|
|
104
102
|
}))));
|
|
@@ -54,13 +54,13 @@ export const ColorPicker = React.forwardRef((props, forwardedRef) => {
|
|
|
54
54
|
const applyHsvColorChange = React.useCallback((newColor, selectionChanged, newColorValue) => {
|
|
55
55
|
// save the HSV values
|
|
56
56
|
setHsvColor(newColor);
|
|
57
|
-
const newActiveColor = newColorValue
|
|
57
|
+
const newActiveColor = newColorValue ?? ColorValue.create(newColor);
|
|
58
58
|
// Only update selected color when dragging is done
|
|
59
59
|
if (selectionChanged) {
|
|
60
|
-
onChangeComplete
|
|
60
|
+
onChangeComplete?.(newActiveColor);
|
|
61
61
|
}
|
|
62
62
|
else {
|
|
63
|
-
onChange
|
|
63
|
+
onChange?.(newActiveColor);
|
|
64
64
|
}
|
|
65
65
|
activeColorTbgr.current = newActiveColor.toTbgr();
|
|
66
66
|
// this converts it to store in tbgr
|
|
@@ -24,8 +24,7 @@ const isSingleOnChange = (onChange, multiple) => {
|
|
|
24
24
|
};
|
|
25
25
|
/** Returns either `option.id` or derives a stable id using `idPrefix` and `option.label` (without whitespace) */
|
|
26
26
|
const getOptionId = (option, idPrefix) => {
|
|
27
|
-
|
|
28
|
-
return (_a = option.id) !== null && _a !== void 0 ? _a : `${idPrefix}-option-${option.label.replace(/\s/g, '-')}`;
|
|
27
|
+
return option.id ?? `${idPrefix}-option-${option.label.replace(/\s/g, '-')}`;
|
|
29
28
|
};
|
|
30
29
|
/**
|
|
31
30
|
* ComboBox component that allows typing a value to filter the options in dropdown list.
|
|
@@ -41,13 +40,11 @@ const getOptionId = (option, idPrefix) => {
|
|
|
41
40
|
* />
|
|
42
41
|
*/
|
|
43
42
|
export const ComboBox = (props) => {
|
|
44
|
-
var _a, _b;
|
|
45
43
|
const { options, value: valueProp, onChange, filterFunction, inputProps, dropdownMenuProps, emptyStateMessage = 'No options found', itemRenderer, enableVirtualization = false, multiple = false, onShow, onHide, ...rest } = props;
|
|
46
44
|
// Generate a stateful random id if not specified
|
|
47
|
-
const [id] = React.useState(() =>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
});
|
|
45
|
+
const [id] = React.useState(() => props.id ??
|
|
46
|
+
(inputProps?.id && `${inputProps.id}-cb`) ??
|
|
47
|
+
`iui-cb-${getRandomValue(10)}`);
|
|
51
48
|
// Refs get set in subcomponents
|
|
52
49
|
const inputRef = React.useRef(null);
|
|
53
50
|
const menuRef = React.useRef(null);
|
|
@@ -73,7 +70,7 @@ export const ComboBox = (props) => {
|
|
|
73
70
|
const getSelectedIndexes = React.useCallback(() => {
|
|
74
71
|
if (isMultipleEnabled(valueProp, multiple)) {
|
|
75
72
|
const indexArray = [];
|
|
76
|
-
valueProp
|
|
73
|
+
valueProp?.forEach((value) => {
|
|
77
74
|
const indexToAdd = options.findIndex((option) => option.value === value);
|
|
78
75
|
if (indexToAdd > -1) {
|
|
79
76
|
indexArray.push(indexToAdd);
|
|
@@ -92,10 +89,9 @@ export const ComboBox = (props) => {
|
|
|
92
89
|
focusedIndex: -1,
|
|
93
90
|
});
|
|
94
91
|
useIsomorphicLayoutEffect(() => {
|
|
95
|
-
var _a, _b;
|
|
96
92
|
// When the dropdown opens
|
|
97
93
|
if (isOpen) {
|
|
98
|
-
|
|
94
|
+
inputRef.current?.focus(); // Focus the input
|
|
99
95
|
// Reset the filtered list (does not reset when multiple enabled)
|
|
100
96
|
if (!multiple) {
|
|
101
97
|
setFilteredOptions(optionsRef.current);
|
|
@@ -109,7 +105,7 @@ export const ComboBox = (props) => {
|
|
|
109
105
|
// Reset the input value if not multiple
|
|
110
106
|
if (!isMultipleEnabled(selected, multiple)) {
|
|
111
107
|
setInputValue(selected != undefined && selected >= 0
|
|
112
|
-
?
|
|
108
|
+
? optionsRef.current[selected]?.label
|
|
113
109
|
: '');
|
|
114
110
|
}
|
|
115
111
|
}
|
|
@@ -124,9 +120,9 @@ export const ComboBox = (props) => {
|
|
|
124
120
|
// Update filtered options to the latest value options according to input value
|
|
125
121
|
const [filteredOptions, setFilteredOptions] = React.useState(options);
|
|
126
122
|
React.useEffect(() => {
|
|
127
|
-
var _a;
|
|
128
123
|
if (inputValue) {
|
|
129
|
-
setFilteredOptions(
|
|
124
|
+
setFilteredOptions(filterFunction?.(options, inputValue) ??
|
|
125
|
+
options.filter((option) => option.label.toLowerCase().includes(inputValue.toLowerCase())));
|
|
130
126
|
}
|
|
131
127
|
else {
|
|
132
128
|
setFilteredOptions(options);
|
|
@@ -136,18 +132,18 @@ export const ComboBox = (props) => {
|
|
|
136
132
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
137
133
|
}, [options]);
|
|
138
134
|
// Filter options based on input value
|
|
139
|
-
const [inputValue, setInputValue] = React.useState(
|
|
135
|
+
const [inputValue, setInputValue] = React.useState(inputProps?.value?.toString() ?? '');
|
|
140
136
|
const [liveRegionSelection, setLiveRegionSelection] = React.useState('');
|
|
141
137
|
const handleOnInput = React.useCallback((event) => {
|
|
142
|
-
var _a, _b;
|
|
143
138
|
const { value } = event.currentTarget;
|
|
144
139
|
setInputValue(value);
|
|
145
140
|
dispatch({ type: 'open' }); // reopen when typing
|
|
146
|
-
setFilteredOptions(
|
|
141
|
+
setFilteredOptions(filterFunction?.(optionsRef.current, value) ??
|
|
142
|
+
optionsRef.current.filter((option) => option.label.toLowerCase().includes(value.toLowerCase())));
|
|
147
143
|
if (focusedIndex != -1) {
|
|
148
144
|
dispatch({ type: 'focus', value: -1 });
|
|
149
145
|
}
|
|
150
|
-
|
|
146
|
+
inputProps?.onChange?.(event);
|
|
151
147
|
}, [filterFunction, focusedIndex, inputProps, optionsRef]);
|
|
152
148
|
// When the value prop changes, update the selected index/indices
|
|
153
149
|
React.useEffect(() => {
|
|
@@ -196,23 +192,21 @@ export const ComboBox = (props) => {
|
|
|
196
192
|
}, [selected]);
|
|
197
193
|
// Calls user defined onChange
|
|
198
194
|
const onChangeHandler = React.useCallback((__originalIndex, actionType, newArray) => {
|
|
199
|
-
var _a, _b, _c, _d;
|
|
200
195
|
if (isSingleOnChange(onChangeProp.current, multiple)) {
|
|
201
|
-
|
|
196
|
+
onChangeProp.current?.(optionsRef.current[__originalIndex]?.value);
|
|
202
197
|
}
|
|
203
198
|
else {
|
|
204
199
|
actionType &&
|
|
205
200
|
newArray &&
|
|
206
|
-
|
|
207
|
-
value:
|
|
201
|
+
onChangeProp.current?.(newArray?.map((item) => optionsRef.current[item]?.value), {
|
|
202
|
+
value: optionsRef.current[__originalIndex]?.value,
|
|
208
203
|
type: actionType,
|
|
209
|
-
})
|
|
204
|
+
});
|
|
210
205
|
}
|
|
211
206
|
}, [multiple, onChangeProp, optionsRef]);
|
|
212
207
|
const onClickHandler = React.useCallback((__originalIndex) => {
|
|
213
|
-
|
|
214
|
-
(
|
|
215
|
-
if ((_b = optionsRef.current[__originalIndex]) === null || _b === void 0 ? void 0 : _b.disabled) {
|
|
208
|
+
inputRef.current?.focus({ preventScroll: true }); // return focus to input
|
|
209
|
+
if (optionsRef.current[__originalIndex]?.disabled) {
|
|
216
210
|
return;
|
|
217
211
|
}
|
|
218
212
|
if (isMultipleEnabled(selected, multiple)) {
|
|
@@ -224,7 +218,7 @@ export const ComboBox = (props) => {
|
|
|
224
218
|
onChangeHandler(__originalIndex, actionType, newArray);
|
|
225
219
|
// update live region
|
|
226
220
|
setLiveRegionSelection(newArray
|
|
227
|
-
.map((item) =>
|
|
221
|
+
.map((item) => optionsRef.current[item]?.label)
|
|
228
222
|
.filter(Boolean)
|
|
229
223
|
.join(', '));
|
|
230
224
|
}
|
|
@@ -245,7 +239,7 @@ export const ComboBox = (props) => {
|
|
|
245
239
|
const optionId = getOptionId(option, id);
|
|
246
240
|
const { __originalIndex } = optionsExtraInfoRef.current[optionId];
|
|
247
241
|
const { icon, startIcon: startIconProp, ...restOptions } = option;
|
|
248
|
-
const startIcon = startIconProp
|
|
242
|
+
const startIcon = startIconProp ?? icon;
|
|
249
243
|
const customItem = itemRenderer
|
|
250
244
|
? itemRenderer(option, {
|
|
251
245
|
isFocused: focusedIndex === __originalIndex,
|
|
@@ -256,9 +250,8 @@ export const ComboBox = (props) => {
|
|
|
256
250
|
: null;
|
|
257
251
|
return customItem ? (React.cloneElement(customItem, {
|
|
258
252
|
onClick: (e) => {
|
|
259
|
-
var _a, _b;
|
|
260
253
|
onClickHandler(__originalIndex);
|
|
261
|
-
|
|
254
|
+
customItem.props.onClick?.(e);
|
|
262
255
|
},
|
|
263
256
|
// ComboBox.MenuItem handles scrollIntoView, data-iui-index and focused through context
|
|
264
257
|
// but we still need to pass them here for backwards compatibility with MenuItem
|
|
@@ -267,7 +260,7 @@ export const ComboBox = (props) => {
|
|
|
267
260
|
'data-iui-filtered-index': filteredIndex,
|
|
268
261
|
ref: mergeRefs(customItem.props.ref, (el) => {
|
|
269
262
|
if (!enableVirtualization && focusedIndex === __originalIndex) {
|
|
270
|
-
el
|
|
263
|
+
el?.scrollIntoView({ block: 'nearest' });
|
|
271
264
|
}
|
|
272
265
|
}),
|
|
273
266
|
})) : (React.createElement(ComboBoxMenuItem, { key: optionId, id: optionId, startIcon: startIcon, ...restOptions, isSelected: isMenuItemSelected(__originalIndex), onClick: () => {
|
|
@@ -297,7 +290,7 @@ export const ComboBox = (props) => {
|
|
|
297
290
|
getMenuItem,
|
|
298
291
|
multiple,
|
|
299
292
|
} },
|
|
300
|
-
React.createElement(ComboBoxInputContainer, { disabled: inputProps
|
|
293
|
+
React.createElement(ComboBoxInputContainer, { disabled: inputProps?.disabled, ...rest },
|
|
301
294
|
React.createElement(React.Fragment, null,
|
|
302
295
|
React.createElement(ComboBoxInput, { value: inputValue, ...inputProps, onChange: handleOnInput, selectTags: isMultipleEnabled(selected, multiple)
|
|
303
296
|
? selected.map((index) => {
|
|
@@ -305,7 +298,7 @@ export const ComboBox = (props) => {
|
|
|
305
298
|
return (React.createElement(SelectTag, { key: item.label, label: item.label }));
|
|
306
299
|
})
|
|
307
300
|
: undefined })),
|
|
308
|
-
React.createElement(ComboBoxEndIcon, { disabled: inputProps
|
|
301
|
+
React.createElement(ComboBoxEndIcon, { disabled: inputProps?.disabled, isOpen: isOpen }),
|
|
309
302
|
multiple ? (React.createElement(AutoclearingHiddenLiveRegion, { text: liveRegionSelection })) : null),
|
|
310
303
|
React.createElement(ComboBoxDropdown, { ...dropdownMenuProps, onShow: onShow, onHide: onHide },
|
|
311
304
|
React.createElement(ComboBoxMenu, null, filteredOptions.length > 0 && !enableVirtualization
|
|
@@ -17,8 +17,7 @@ export const ComboBoxDropdown = React.forwardRef((props, forwardedRef) => {
|
|
|
17
17
|
}
|
|
18
18
|
}, [dispatch, props.visible]);
|
|
19
19
|
return (React.createElement(Popover, { placement: 'bottom-start', visible: isOpen, onClickOutside: React.useCallback((_, { target }) => {
|
|
20
|
-
|
|
21
|
-
if (!((_a = toggleButtonRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))) {
|
|
20
|
+
if (!toggleButtonRef.current?.contains(target)) {
|
|
22
21
|
dispatch({ type: 'close' });
|
|
23
22
|
}
|
|
24
23
|
}, [dispatch, toggleButtonRef]), animation: 'shift-away', duration: 200, reference: inputRef, ref: forwardedRef, content: children, ...rest }));
|
|
@@ -17,6 +17,6 @@ export const ComboBoxEndIcon = React.forwardRef((props, forwardedRef) => {
|
|
|
17
17
|
'iui-open': isOpen,
|
|
18
18
|
}, className), onClick: mergeEventHandlers(onClickProp, () => {
|
|
19
19
|
dispatch({ type: isOpen ? 'close' : 'open' });
|
|
20
|
-
}), ...rest }, children
|
|
20
|
+
}), ...rest }, children ?? React.createElement(SvgCaretDownSmall, { "aria-hidden": true })));
|
|
21
21
|
});
|
|
22
22
|
ComboBoxEndIcon.displayName = 'ComboBoxEndIcon';
|
|
@@ -13,18 +13,16 @@ export const ComboBoxInput = React.forwardRef((props, forwardedRef) => {
|
|
|
13
13
|
const dispatch = useSafeContext(ComboBoxActionContext);
|
|
14
14
|
const { inputRef, menuRef, optionsExtraInfoRef } = useSafeContext(ComboBoxRefsContext);
|
|
15
15
|
const refs = useMergedRefs(inputRef, forwardedRef);
|
|
16
|
-
const focusedIndexRef = React.useRef(focusedIndex
|
|
16
|
+
const focusedIndexRef = React.useRef(focusedIndex ?? -1);
|
|
17
17
|
React.useEffect(() => {
|
|
18
|
-
focusedIndexRef.current = focusedIndex
|
|
18
|
+
focusedIndexRef.current = focusedIndex ?? -1;
|
|
19
19
|
}, [focusedIndex]);
|
|
20
20
|
const getIdFromIndex = (index) => {
|
|
21
|
-
|
|
22
|
-
return ((_c = (_b = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-iui-index="${index}"]`)) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : '');
|
|
21
|
+
return (menuRef.current?.querySelector(`[data-iui-index="${index}"]`)?.id ?? '');
|
|
23
22
|
};
|
|
24
23
|
const handleKeyDown = React.useCallback((event) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const length = (_a = Object.keys(optionsExtraInfoRef.current).length) !== null && _a !== void 0 ? _a : 0;
|
|
24
|
+
onKeyDownProp?.(event);
|
|
25
|
+
const length = Object.keys(optionsExtraInfoRef.current).length ?? 0;
|
|
28
26
|
if (event.altKey) {
|
|
29
27
|
return;
|
|
30
28
|
}
|
|
@@ -38,22 +36,23 @@ export const ComboBoxInput = React.forwardRef((props, forwardedRef) => {
|
|
|
38
36
|
return;
|
|
39
37
|
}
|
|
40
38
|
if (focusedIndexRef.current === -1) {
|
|
41
|
-
const currentElement =
|
|
39
|
+
const currentElement = menuRef.current?.querySelector('[data-iui-index]');
|
|
42
40
|
return dispatch({
|
|
43
41
|
type: 'focus',
|
|
44
|
-
value: Number(
|
|
42
|
+
value: Number(currentElement?.getAttribute('data-iui-index') ?? 0),
|
|
45
43
|
});
|
|
46
44
|
}
|
|
47
45
|
// If virtualization is enabled, dont let round scrolling
|
|
48
46
|
if (enableVirtualization &&
|
|
49
|
-
!
|
|
47
|
+
!menuRef.current?.querySelector(`[data-iui-index="${focusedIndexRef.current}"]`)?.nextElementSibling) {
|
|
50
48
|
return;
|
|
51
49
|
}
|
|
52
50
|
let nextIndex = focusedIndexRef.current;
|
|
53
51
|
do {
|
|
54
|
-
const currentElement =
|
|
55
|
-
const nextElement =
|
|
56
|
-
|
|
52
|
+
const currentElement = menuRef.current?.querySelector(`[data-iui-index="${nextIndex}"]`);
|
|
53
|
+
const nextElement = currentElement?.nextElementSibling ??
|
|
54
|
+
menuRef.current?.querySelector('[data-iui-index]');
|
|
55
|
+
nextIndex = Number(nextElement?.getAttribute('data-iui-index'));
|
|
57
56
|
if (nextElement) {
|
|
58
57
|
return dispatch({ type: 'focus', value: nextIndex });
|
|
59
58
|
}
|
|
@@ -70,20 +69,22 @@ export const ComboBoxInput = React.forwardRef((props, forwardedRef) => {
|
|
|
70
69
|
}
|
|
71
70
|
// If virtualization is enabled, dont let round scrolling
|
|
72
71
|
if (enableVirtualization &&
|
|
73
|
-
!
|
|
72
|
+
!menuRef.current?.querySelector(`[data-iui-index="${focusedIndexRef.current}"]`)?.previousElementSibling) {
|
|
74
73
|
return;
|
|
75
74
|
}
|
|
76
75
|
if (focusedIndexRef.current === -1) {
|
|
77
76
|
return dispatch({
|
|
78
77
|
type: 'focus',
|
|
79
|
-
value:
|
|
78
|
+
value: Object.values(optionsExtraInfoRef.current)?.[length - 1]
|
|
79
|
+
.__originalIndex ?? -1,
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
let prevIndex = focusedIndexRef.current;
|
|
83
83
|
do {
|
|
84
|
-
const currentElement =
|
|
85
|
-
const prevElement =
|
|
86
|
-
|
|
84
|
+
const currentElement = menuRef.current?.querySelector(`[data-iui-index="${prevIndex}"]`);
|
|
85
|
+
const prevElement = currentElement?.previousElementSibling ??
|
|
86
|
+
menuRef.current?.querySelector('[data-iui-index]:last-of-type');
|
|
87
|
+
prevIndex = Number(prevElement?.getAttribute('data-iui-index'));
|
|
87
88
|
if (prevElement) {
|
|
88
89
|
return dispatch({ type: 'focus', value: prevIndex });
|
|
89
90
|
}
|
|
@@ -94,7 +95,7 @@ export const ComboBoxInput = React.forwardRef((props, forwardedRef) => {
|
|
|
94
95
|
event.preventDefault();
|
|
95
96
|
if (isOpen) {
|
|
96
97
|
if (focusedIndexRef.current > -1) {
|
|
97
|
-
onClickHandler
|
|
98
|
+
onClickHandler?.(focusedIndexRef.current);
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
else {
|
|
@@ -122,7 +123,7 @@ export const ComboBoxInput = React.forwardRef((props, forwardedRef) => {
|
|
|
122
123
|
]);
|
|
123
124
|
const handleFocus = React.useCallback((event) => {
|
|
124
125
|
dispatch({ type: 'open' });
|
|
125
|
-
onFocusProp
|
|
126
|
+
onFocusProp?.(event);
|
|
126
127
|
}, [dispatch, onFocusProp]);
|
|
127
128
|
const handleClick = React.useCallback(() => {
|
|
128
129
|
if (!isOpen) {
|
|
@@ -8,7 +8,7 @@ import { Menu } from '../Menu/index.js';
|
|
|
8
8
|
import { Surface } from '../Surface/index.js';
|
|
9
9
|
import { useSafeContext, useMergedRefs, useVirtualization, mergeRefs, getWindow, } from '../utils/index.js';
|
|
10
10
|
import { ComboBoxStateContext, ComboBoxRefsContext } from './helpers.js';
|
|
11
|
-
const isOverflowOverlaySupported = () =>
|
|
11
|
+
const isOverflowOverlaySupported = () => getWindow()?.CSS?.supports?.('overflow: overlay');
|
|
12
12
|
const VirtualizedComboBoxMenu = React.forwardRef(({ children, className, style, ...rest }, forwardedRef) => {
|
|
13
13
|
const { minWidth, id, filteredOptions, getMenuItem, focusedIndex } = useSafeContext(ComboBoxStateContext);
|
|
14
14
|
const { menuRef } = useSafeContext(ComboBoxRefsContext);
|
|
@@ -17,12 +17,11 @@ const VirtualizedComboBoxMenu = React.forwardRef(({ children, className, style,
|
|
|
17
17
|
: children, // Here is expected empty state content
|
|
18
18
|
[filteredOptions, getMenuItem, children]);
|
|
19
19
|
const focusedVisibleIndex = React.useMemo(() => {
|
|
20
|
-
|
|
21
|
-
const currentElement = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-iui-index="${focusedIndex}"]`);
|
|
20
|
+
const currentElement = menuRef.current?.querySelector(`[data-iui-index="${focusedIndex}"]`);
|
|
22
21
|
if (!currentElement) {
|
|
23
22
|
return focusedIndex;
|
|
24
23
|
}
|
|
25
|
-
return Number(
|
|
24
|
+
return Number(currentElement.getAttribute('data-iui-filtered-index') ?? focusedIndex);
|
|
26
25
|
}, [focusedIndex, menuRef]);
|
|
27
26
|
const { outerProps, innerProps, visibleChildren } = useVirtualization({
|
|
28
27
|
// 'Fool' VirtualScroll by passing length 1
|
|
@@ -11,11 +11,11 @@ export const ComboBoxMenuItem = React.memo(React.forwardRef((props, forwardedRef
|
|
|
11
11
|
const { focusedIndex, enableVirtualization } = useSafeContext(ComboBoxStateContext);
|
|
12
12
|
const focusRef = (el) => {
|
|
13
13
|
if (!enableVirtualization && focusedIndex === index) {
|
|
14
|
-
el
|
|
14
|
+
el?.scrollIntoView({ block: 'nearest' });
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
const refs = useMergedRefs(forwardedRef, focusRef);
|
|
18
|
-
return (React.createElement(ListItem, { actionable: true, size: size, active: isSelected, disabled: disabled, focused: focusedIndex === index, ref: refs, onClick: () => onClick
|
|
18
|
+
return (React.createElement(ListItem, { actionable: true, size: size, active: isSelected, disabled: disabled, focused: focusedIndex === index, ref: refs, onClick: () => onClick?.(value), role: role, tabIndex: role === 'presentation' ? undefined : -1, "aria-selected": isSelected, "aria-disabled": disabled, "data-iui-index": index, ...rest },
|
|
19
19
|
startIcon && (React.createElement(ListItem.Icon, { as: 'span', "aria-hidden": true }, startIcon)),
|
|
20
20
|
React.createElement(ListItem.Content, null,
|
|
21
21
|
children,
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import * as React from 'react';
|
|
6
6
|
export const comboBoxReducer = (state, action) => {
|
|
7
|
-
var _a, _b, _c, _d, _e;
|
|
8
7
|
switch (action.type) {
|
|
9
8
|
case 'open': {
|
|
10
9
|
return { ...state, isOpen: true };
|
|
@@ -18,8 +17,8 @@ export const comboBoxReducer = (state, action) => {
|
|
|
18
17
|
}
|
|
19
18
|
return {
|
|
20
19
|
...state,
|
|
21
|
-
selected:
|
|
22
|
-
focusedIndex:
|
|
20
|
+
selected: action.value ?? state.selected,
|
|
21
|
+
focusedIndex: action.value ?? state.focusedIndex,
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
24
|
case 'multiselect': {
|
|
@@ -32,12 +31,12 @@ export const comboBoxReducer = (state, action) => {
|
|
|
32
31
|
if (Array.isArray(state.selected)) {
|
|
33
32
|
return {
|
|
34
33
|
...state,
|
|
35
|
-
focusedIndex:
|
|
34
|
+
focusedIndex: action.value ?? -1,
|
|
36
35
|
};
|
|
37
36
|
}
|
|
38
37
|
return {
|
|
39
38
|
...state,
|
|
40
|
-
focusedIndex:
|
|
39
|
+
focusedIndex: action.value ?? state.selected ?? -1,
|
|
41
40
|
};
|
|
42
41
|
}
|
|
43
42
|
default: {
|