@carbon/react 1.107.1 → 1.108.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/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +960 -960
- package/es/components/Button/Button.d.ts +2 -2
- package/es/components/Button/ButtonBase.js +5 -5
- package/es/components/ChatButton/ChatButton.d.ts +1 -1
- package/es/components/ChatButton/ChatButton.js +1 -1
- package/es/components/ComposedModal/ComposedModal.js +10 -5
- package/es/components/ComposedModal/ModalFooter.d.ts +5 -0
- package/es/components/ComposedModal/ModalFooter.js +3 -1
- package/es/components/Dialog/Dialog.d.ts +5 -0
- package/es/components/Dialog/Dialog.js +3 -1
- package/es/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
- package/es/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
- package/es/components/FileUploader/FileUploader.d.ts +5 -0
- package/es/components/FileUploader/FileUploader.js +14 -6
- package/es/components/FileUploader/FileUploaderItem.d.ts +5 -1
- package/es/components/FileUploader/FileUploaderItem.js +4 -2
- package/es/components/FileUploader/Filename.d.ts +5 -1
- package/es/components/FileUploader/Filename.js +2 -1
- package/es/components/Menu/MenuItem.js +16 -7
- package/es/components/Modal/Modal.d.ts +5 -0
- package/es/components/Modal/Modal.js +26 -13
- package/es/components/Modal/isTopmostVisibleModal.d.ts +7 -0
- package/es/components/Modal/isTopmostVisibleModal.js +21 -0
- package/es/components/MultiSelect/FilterableMultiSelect.js +9 -8
- package/es/components/MultiSelect/MultiSelect.js +9 -8
- package/es/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
- package/es/components/MultiSelect/tools/isSelectAllItem.js +17 -0
- package/es/components/MultiSelect/tools/sorting.js +1 -1
- package/es/components/OverflowMenuItem/OverflowMenuItem.js +3 -2
- package/es/components/PageHeader/PageHeader.d.ts +4 -0
- package/es/components/PageHeader/PageHeader.js +18 -0
- package/es/components/PageHeader/index.d.ts +4 -0
- package/es/components/Tabs/Tabs.d.ts +5 -1
- package/es/components/Tabs/Tabs.js +2 -1
- package/es/components/UIShell/SwitcherDivider.d.ts +2 -2
- package/es/components/UIShell/SwitcherDivider.js +2 -2
- package/es/internal/warning.d.ts +1 -1
- package/lib/components/Button/Button.d.ts +2 -2
- package/lib/components/Button/ButtonBase.js +5 -5
- package/lib/components/ChatButton/ChatButton.d.ts +1 -1
- package/lib/components/ChatButton/ChatButton.js +1 -1
- package/lib/components/ComposedModal/ComposedModal.js +10 -5
- package/lib/components/ComposedModal/ModalFooter.d.ts +5 -0
- package/lib/components/ComposedModal/ModalFooter.js +3 -1
- package/lib/components/Dialog/Dialog.d.ts +5 -0
- package/lib/components/Dialog/Dialog.js +3 -1
- package/lib/components/ErrorBoundary/ErrorBoundaryContext.d.ts +1 -1
- package/lib/components/ErrorBoundary/ErrorBoundaryContext.js +1 -1
- package/lib/components/FileUploader/FileUploader.d.ts +5 -0
- package/lib/components/FileUploader/FileUploader.js +14 -6
- package/lib/components/FileUploader/FileUploaderItem.d.ts +5 -1
- package/lib/components/FileUploader/FileUploaderItem.js +4 -2
- package/lib/components/FileUploader/Filename.d.ts +5 -1
- package/lib/components/FileUploader/Filename.js +2 -1
- package/lib/components/Menu/MenuItem.js +15 -6
- package/lib/components/Modal/Modal.d.ts +5 -0
- package/lib/components/Modal/Modal.js +26 -13
- package/lib/components/Modal/isTopmostVisibleModal.d.ts +7 -0
- package/lib/components/Modal/isTopmostVisibleModal.js +21 -0
- package/lib/components/MultiSelect/FilterableMultiSelect.js +9 -8
- package/lib/components/MultiSelect/MultiSelect.js +9 -8
- package/lib/components/MultiSelect/tools/isSelectAllItem.d.ts +9 -0
- package/lib/components/MultiSelect/tools/isSelectAllItem.js +17 -0
- package/lib/components/MultiSelect/tools/sorting.js +3 -3
- package/lib/components/OverflowMenuItem/OverflowMenuItem.js +3 -2
- package/lib/components/PageHeader/PageHeader.d.ts +4 -0
- package/lib/components/PageHeader/PageHeader.js +18 -0
- package/lib/components/PageHeader/index.d.ts +4 -0
- package/lib/components/Tabs/Tabs.d.ts +5 -1
- package/lib/components/Tabs/Tabs.js +2 -1
- package/lib/components/UIShell/SwitcherDivider.d.ts +2 -2
- package/lib/components/UIShell/SwitcherDivider.js +2 -2
- package/lib/internal/warning.d.ts +1 -1
- package/lib/internal/warning.js +1 -1
- package/package.json +10 -10
|
@@ -25,6 +25,7 @@ import ListBoxTrigger from "../ListBox/next/ListBoxTrigger.js";
|
|
|
25
25
|
import { mergeRefs } from "../../tools/mergeRefs.js";
|
|
26
26
|
import { defaultFilterItems } from "./filter.js";
|
|
27
27
|
import { sortingPropTypes } from "./MultiSelectPropTypes.js";
|
|
28
|
+
import { isSelectAllItem } from "./tools/isSelectAllItem.js";
|
|
28
29
|
import { defaultCompareItems, defaultSortItems } from "./tools/sorting.js";
|
|
29
30
|
import { useSelection } from "../../internal/Selection.js";
|
|
30
31
|
import classNames from "classnames";
|
|
@@ -60,8 +61,8 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
60
61
|
itemToString,
|
|
61
62
|
filterItems
|
|
62
63
|
]);
|
|
63
|
-
const nonSelectAllItems = useMemo(() => filteredItems.filter((item) => !item
|
|
64
|
-
const selectAll = filteredItems.some(
|
|
64
|
+
const nonSelectAllItems = useMemo(() => filteredItems.filter((item) => !isSelectAllItem(item)), [filteredItems]);
|
|
65
|
+
const selectAll = filteredItems.some(isSelectAllItem);
|
|
65
66
|
const { selectedItems: controlledSelectedItems, onItemChange, clearSelection, toggleAll } = useSelection({
|
|
66
67
|
disabled,
|
|
67
68
|
initialSelectedItems,
|
|
@@ -129,7 +130,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
129
130
|
setIsOpen(open);
|
|
130
131
|
}, [open]);
|
|
131
132
|
const sortedItems = useMemo(() => {
|
|
132
|
-
const selectAllItem = items.find(
|
|
133
|
+
const selectAllItem = items.find(isSelectAllItem);
|
|
133
134
|
const selectableRealItems = nonSelectAllItems.filter((item) => !item.disabled);
|
|
134
135
|
const sortedReal = sortItems(nonSelectAllItems, {
|
|
135
136
|
selectedItems: {
|
|
@@ -265,7 +266,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
265
266
|
switch (type) {
|
|
266
267
|
case InputKeyDownEnter:
|
|
267
268
|
if (sortedItems.length === 0) return changes;
|
|
268
|
-
if (changes.selectedItem && changes.selectedItem.disabled !== true) if (changes.selectedItem
|
|
269
|
+
if (changes.selectedItem && changes.selectedItem.disabled !== true) if (isSelectAllItem(changes.selectedItem)) handleSelectAllClick();
|
|
269
270
|
else onItemChange(changes.selectedItem);
|
|
270
271
|
setHighlightedIndex(changes.selectedItem);
|
|
271
272
|
return {
|
|
@@ -273,7 +274,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
273
274
|
highlightedIndex: state.highlightedIndex
|
|
274
275
|
};
|
|
275
276
|
case ItemClick:
|
|
276
|
-
if (changes.selectedItem
|
|
277
|
+
if (isSelectAllItem(changes.selectedItem)) handleSelectAllClick();
|
|
277
278
|
else onItemChange(changes.selectedItem);
|
|
278
279
|
setHighlightedIndex(changes.selectedItem);
|
|
279
280
|
return changes;
|
|
@@ -371,7 +372,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
371
372
|
const candidate = slug ?? decorator;
|
|
372
373
|
const candidateIsAILabel = isComponentElement(candidate, AILabel);
|
|
373
374
|
const normalizedDecorator = candidateIsAILabel ? cloneElement(candidate, { size: "mini" }) : candidate;
|
|
374
|
-
const selectedItemsLength = controlledSelectedItems.filter((item) => !item
|
|
375
|
+
const selectedItemsLength = controlledSelectedItems.filter((item) => !isSelectAllItem(item)).length;
|
|
375
376
|
const className = classNames(`${prefix}--multi-select`, `${prefix}--combo-box`, `${prefix}--multi-select--filterable`, {
|
|
376
377
|
[`${prefix}--multi-select--invalid`]: normalizedProps.invalid,
|
|
377
378
|
[`${prefix}--multi-select--invalid--focused`]: inputFocused && normalizedProps.invalid,
|
|
@@ -528,7 +529,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
528
529
|
children: isOpen ? sortedItems.map((item, index) => {
|
|
529
530
|
let isChecked;
|
|
530
531
|
let isIndeterminate = false;
|
|
531
|
-
if (item
|
|
532
|
+
if (isSelectAllItem(item)) {
|
|
532
533
|
isChecked = selectAllStatus.checked;
|
|
533
534
|
isIndeterminate = selectAllStatus.indeterminate;
|
|
534
535
|
} else isChecked = controlledSelectedItems.filter((selected) => isEqual(selected, item)).length > 0;
|
|
@@ -542,7 +543,7 @@ const FilterableMultiSelect = forwardRef(function FilterableMultiSelect({ autoAl
|
|
|
542
543
|
return /* @__PURE__ */ jsx(ListBox.MenuItem, {
|
|
543
544
|
"aria-label": itemText,
|
|
544
545
|
"aria-checked": isIndeterminate ? "mixed" : isChecked,
|
|
545
|
-
isActive: isChecked && !item
|
|
546
|
+
isActive: isChecked && !isSelectAllItem(item),
|
|
546
547
|
isHighlighted: highlightedIndex === index,
|
|
547
548
|
title: itemText,
|
|
548
549
|
disabled,
|
|
@@ -23,6 +23,7 @@ import { FormContext } from "../FluidForm/FormContext.js";
|
|
|
23
23
|
import ListBox from "../ListBox/index.js";
|
|
24
24
|
import { mergeRefs } from "../../tools/mergeRefs.js";
|
|
25
25
|
import { sortingPropTypes } from "./MultiSelectPropTypes.js";
|
|
26
|
+
import { isSelectAllItem } from "./tools/isSelectAllItem.js";
|
|
26
27
|
import { defaultCompareItems, defaultSortItems } from "./tools/sorting.js";
|
|
27
28
|
import { useSelection } from "../../internal/Selection.js";
|
|
28
29
|
import classNames from "classnames";
|
|
@@ -50,7 +51,7 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
|
|
|
50
51
|
return true;
|
|
51
52
|
});
|
|
52
53
|
}, [items]);
|
|
53
|
-
const selectAll = filteredItems.some(
|
|
54
|
+
const selectAll = filteredItems.some(isSelectAllItem);
|
|
54
55
|
const prefix = usePrefix();
|
|
55
56
|
const { isFluid } = useContext(FormContext);
|
|
56
57
|
const multiSelectInstanceId = useId();
|
|
@@ -280,7 +281,7 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
|
|
|
280
281
|
const candidate = slug ?? decorator;
|
|
281
282
|
const normalizedDecorator = isComponentElement(candidate, AILabel) ? cloneElement(candidate, { size: "mini" }) : candidate;
|
|
282
283
|
const itemsSelectedText = selectedItems.length > 0 && selectedItems.map((item) => item?.text);
|
|
283
|
-
const selectedItemsLength = selectAll ? selectedItems.filter((item) => !item
|
|
284
|
+
const selectedItemsLength = selectAll ? selectedItems.filter((item) => !isSelectAllItem(item)).length : selectedItems.length;
|
|
284
285
|
const menuProps = useMemo(() => getMenuProps({
|
|
285
286
|
ref: enableFloatingStyles ? refs.setFloating : null,
|
|
286
287
|
hidden: !isOpen
|
|
@@ -294,9 +295,9 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
|
|
|
294
295
|
const labelProps = isValidElement(titleText) ? { id: allLabelProps.id } : allLabelProps;
|
|
295
296
|
const getSelectionStats = useCallback((selectedItems, filteredItems) => {
|
|
296
297
|
return {
|
|
297
|
-
hasIndividualSelections: selectedItems.some((selected) => !selected
|
|
298
|
-
nonSelectAllSelectedCount: selectedItems.filter((selected) => !selected
|
|
299
|
-
totalSelectableCount: filteredItems.filter((item) => !item
|
|
298
|
+
hasIndividualSelections: selectedItems.some((selected) => !isSelectAllItem(selected)),
|
|
299
|
+
nonSelectAllSelectedCount: selectedItems.filter((selected) => !isSelectAllItem(selected)).length,
|
|
300
|
+
totalSelectableCount: filteredItems.filter((item) => !isSelectAllItem(item) && !item.disabled).length
|
|
300
301
|
};
|
|
301
302
|
}, [selectedItems, filteredItems]);
|
|
302
303
|
return /* @__PURE__ */ jsxs("div", {
|
|
@@ -372,15 +373,15 @@ const MultiSelect = React.forwardRef(({ autoAlign = false, className: containerC
|
|
|
372
373
|
...menuProps,
|
|
373
374
|
children: isOpen && sortItems(filteredItems, sortOptions).map((item, index) => {
|
|
374
375
|
const { hasIndividualSelections, nonSelectAllSelectedCount, totalSelectableCount } = getSelectionStats(selectedItems, filteredItems);
|
|
375
|
-
const isChecked = item
|
|
376
|
-
const isIndeterminate = item
|
|
376
|
+
const isChecked = isSelectAllItem(item) ? nonSelectAllSelectedCount === totalSelectableCount && totalSelectableCount > 0 : selectedItems.some((selected) => isEqual(selected, item));
|
|
377
|
+
const isIndeterminate = isSelectAllItem(item) && hasIndividualSelections && nonSelectAllSelectedCount < totalSelectableCount;
|
|
377
378
|
const itemProps = getItemProps({
|
|
378
379
|
item,
|
|
379
380
|
["aria-selected"]: isChecked
|
|
380
381
|
});
|
|
381
382
|
const itemText = itemToString(item);
|
|
382
383
|
return /* @__PURE__ */ jsx(ListBox.MenuItem, {
|
|
383
|
-
isActive: isChecked && !item
|
|
384
|
+
isActive: isChecked && !isSelectAllItem(item),
|
|
384
385
|
"aria-label": itemText,
|
|
385
386
|
"aria-checked": isIndeterminate ? "mixed" : isChecked,
|
|
386
387
|
isHighlighted: highlightedIndex === index,
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2026
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
export declare const isSelectAllItem: (item: unknown) => item is {
|
|
8
|
+
isSelectAll?: boolean;
|
|
9
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2026
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
//#region src/components/MultiSelect/tools/isSelectAllItem.ts
|
|
9
|
+
/**
|
|
10
|
+
* Copyright IBM Corp. 2026
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
13
|
+
* LICENSE file in the root directory of this source tree.
|
|
14
|
+
*/
|
|
15
|
+
const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { isSelectAllItem };
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { isSelectAllItem } from "./isSelectAllItem.js";
|
|
8
9
|
//#region src/components/MultiSelect/tools/sorting.ts
|
|
9
|
-
const isSelectAllItem = (item) => typeof item === "object" && item !== null && "isSelectAll" in item;
|
|
10
10
|
/**
|
|
11
11
|
* Use `localeCompare` with the `numeric` option enabled to sort two
|
|
12
12
|
* alphanumeric strings.
|
|
@@ -23,7 +23,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
23
23
|
* LICENSE file in the root directory of this source tree.
|
|
24
24
|
*/
|
|
25
25
|
const OverflowMenuItem = forwardRef((props, ref) => {
|
|
26
|
-
const { className, closeMenu, dangerDescription = "
|
|
26
|
+
const { className, closeMenu, dangerDescription = "", disabled = false, handleOverflowMenuItemFocus, hasDivider = false, href, isDelete = false, index, itemText = "Provide itemText", onClick = () => {}, onKeyDown = () => {}, requireTitle, title, wrapperClassName, ...rest } = props;
|
|
27
27
|
const prefix = usePrefix();
|
|
28
28
|
function setTabFocus(evt) {
|
|
29
29
|
if (match(evt, ArrowDown)) handleOverflowMenuItemFocus?.({
|
|
@@ -47,13 +47,14 @@ const OverflowMenuItem = forwardRef((props, ref) => {
|
|
|
47
47
|
[`${prefix}--overflow-menu-options__option--disabled`]: disabled
|
|
48
48
|
}, wrapperClassName);
|
|
49
49
|
const TagToUse = href ? "a" : "button";
|
|
50
|
+
const hasDangerDescription = isDelete && Boolean(dangerDescription);
|
|
50
51
|
const assistiveId = useId("danger-description");
|
|
51
52
|
const OverflowMenuItemContent = (() => {
|
|
52
53
|
if (typeof itemText !== "string") return itemText;
|
|
53
54
|
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
54
55
|
className: `${prefix}--overflow-menu-options__option-content`,
|
|
55
56
|
children: itemText
|
|
56
|
-
}),
|
|
57
|
+
}), hasDangerDescription && /* @__PURE__ */ jsx("span", {
|
|
57
58
|
id: assistiveId,
|
|
58
59
|
className: `${prefix}--visually-hidden`,
|
|
59
60
|
children: dangerDescription
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated PageHeader has moved to Carbon for IBM Products.
|
|
9
|
+
* See https://github.com/carbon-design-system/carbon/issues/21926
|
|
10
|
+
*/
|
|
7
11
|
import React, { type ElementType } from 'react';
|
|
8
12
|
import PropTypes from 'prop-types';
|
|
9
13
|
import { TYPES } from '../Tag/Tag';
|
|
@@ -13,6 +13,7 @@ import AspectRatio from "../AspectRatio/AspectRatio.js";
|
|
|
13
13
|
import { Popover, PopoverContent } from "../Popover/index.js";
|
|
14
14
|
import { DefinitionTooltip } from "../Tooltip/DefinitionTooltip.js";
|
|
15
15
|
import { MenuItem } from "../Menu/MenuItem.js";
|
|
16
|
+
import { deprecateComponent } from "../../prop-types/deprecateComponent.js";
|
|
16
17
|
import { GridAsGridComponent } from "../Grid/Grid.js";
|
|
17
18
|
import Column from "../Grid/Column.js";
|
|
18
19
|
import { MenuButton } from "../MenuButton/index.js";
|
|
@@ -33,7 +34,18 @@ import { breakpoints } from "@carbon/layout";
|
|
|
33
34
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
34
35
|
* LICENSE file in the root directory of this source tree.
|
|
35
36
|
*/
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated PageHeader has moved to Carbon for IBM Products.
|
|
39
|
+
* See https://github.com/carbon-design-system/carbon/issues/21926
|
|
40
|
+
*/
|
|
41
|
+
const pageHeaderDeprecationMessage = (componentName) => `The \`${componentName}\` component in \`@carbon/react\` has been deprecated and moved to \`@carbon/ibm-products\`. See https://github.com/carbon-design-system/carbon/issues/21926`;
|
|
42
|
+
const usePageHeaderDeprecation = (componentName) => {
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
deprecateComponent(componentName, pageHeaderDeprecationMessage(componentName));
|
|
45
|
+
}, [componentName]);
|
|
46
|
+
};
|
|
36
47
|
const PageHeader = React.forwardRef(({ className, children, ...other }, ref) => {
|
|
48
|
+
usePageHeaderDeprecation("PageHeader");
|
|
37
49
|
return /* @__PURE__ */ jsx("div", {
|
|
38
50
|
className: classNames({ [`${usePrefix()}--page-header`]: true }, className),
|
|
39
51
|
ref,
|
|
@@ -43,6 +55,7 @@ const PageHeader = React.forwardRef(({ className, children, ...other }, ref) =>
|
|
|
43
55
|
});
|
|
44
56
|
PageHeader.displayName = "PageHeader";
|
|
45
57
|
const PageHeaderBreadcrumbBar = React.forwardRef(({ border = true, className, children, renderIcon: IconElement, contentActions, contentActionsFlush, pageActions, pageActionsFlush, ...other }, ref) => {
|
|
58
|
+
usePageHeaderDeprecation("PageHeaderBreadcrumbBar");
|
|
46
59
|
const prefix = usePrefix();
|
|
47
60
|
const classNames$1 = classNames({
|
|
48
61
|
[`${prefix}--page-header__breadcrumb-bar`]: true,
|
|
@@ -79,6 +92,7 @@ const PageHeaderBreadcrumbBar = React.forwardRef(({ border = true, className, ch
|
|
|
79
92
|
});
|
|
80
93
|
PageHeaderBreadcrumbBar.displayName = "PageHeaderBreadcrumbBar";
|
|
81
94
|
const PageHeaderContent = React.forwardRef(({ className, children, title, renderIcon: IconElement, contextualActions, pageActions, ...other }, ref) => {
|
|
95
|
+
usePageHeaderDeprecation("PageHeaderContent");
|
|
82
96
|
const prefix = usePrefix();
|
|
83
97
|
const classNames$2 = classNames({ [`${prefix}--page-header__content`]: true }, className);
|
|
84
98
|
const titleRef = useRef(null);
|
|
@@ -141,6 +155,7 @@ PageHeaderContent.propTypes = {
|
|
|
141
155
|
pageActions: PropTypes.node
|
|
142
156
|
};
|
|
143
157
|
const PageHeaderContentPageActions = ({ className, children, menuButtonLabel = "Actions", actions, ...other }) => {
|
|
158
|
+
usePageHeaderDeprecation("PageHeaderContentPageActions");
|
|
144
159
|
const classNames$3 = classNames({ [`${usePrefix()}--page-header__content__page-actions`]: true }, className);
|
|
145
160
|
const containerRef = useRef(null);
|
|
146
161
|
const offsetRef = useRef(null);
|
|
@@ -194,6 +209,7 @@ PageHeaderContentPageActions.propTypes = {
|
|
|
194
209
|
actions: PropTypes.oneOfType([PropTypes.node, PropTypes.array])
|
|
195
210
|
};
|
|
196
211
|
const PageHeaderContentText = ({ className, children, subtitle, ...other }) => {
|
|
212
|
+
usePageHeaderDeprecation("PageHeaderContentText");
|
|
197
213
|
const prefix = usePrefix();
|
|
198
214
|
return /* @__PURE__ */ jsxs("div", {
|
|
199
215
|
className: classNames({ [`${prefix}--page-header__content__body`]: true }, className),
|
|
@@ -212,6 +228,7 @@ PageHeaderContentText.propTypes = {
|
|
|
212
228
|
subtitle: PropTypes.string
|
|
213
229
|
};
|
|
214
230
|
const PageHeaderHeroImage = ({ className, children, ...other }) => {
|
|
231
|
+
usePageHeaderDeprecation("PageHeaderHeroImage");
|
|
215
232
|
const classNames$4 = classNames({ [`${usePrefix()}--page-header__hero-image`]: true }, className);
|
|
216
233
|
const isLg = useMatchMedia(`(min-width: ${breakpoints.lg.width})`);
|
|
217
234
|
return /* @__PURE__ */ jsx(AspectRatio, {
|
|
@@ -227,6 +244,7 @@ PageHeaderHeroImage.propTypes = {
|
|
|
227
244
|
className: PropTypes.string
|
|
228
245
|
};
|
|
229
246
|
const PageHeaderTabBar = React.forwardRef(({ className, children, tags = [], ...other }, ref) => {
|
|
247
|
+
usePageHeaderDeprecation("PageHeaderTabBar");
|
|
230
248
|
const prefix = usePrefix();
|
|
231
249
|
const classNames$5 = classNames({ [`${prefix}--page-header__tab-bar`]: true }, className);
|
|
232
250
|
const [openPopover, setOpenPopover] = useState(false);
|
|
@@ -4,5 +4,9 @@
|
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated PageHeader has moved to Carbon for IBM Products.
|
|
9
|
+
* See https://github.com/carbon-design-system/carbon/issues/21926
|
|
10
|
+
*/
|
|
7
11
|
export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderTabBar, PageHeaderHeroImage, Root, BreadcrumbBar, Content, ContentPageActions, ContentText, TabBar, HeroImage, } from './PageHeader';
|
|
8
12
|
export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderTabBarProps, PageHeaderHeroImageProps, } from './PageHeader';
|
|
@@ -192,8 +192,12 @@ export interface TabListProps extends DivAttributes {
|
|
|
192
192
|
* on component rerender
|
|
193
193
|
*/
|
|
194
194
|
scrollIntoView?: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Specify the size of the tabs.
|
|
197
|
+
*/
|
|
198
|
+
size?: 'sm' | 'md' | 'lg';
|
|
195
199
|
}
|
|
196
|
-
declare function TabList({ activation, 'aria-label': label, children, className: customClassName, contained, fullWidth, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait, scrollIntoView, ...rest }: TabListProps): import("react/jsx-runtime").JSX.Element;
|
|
200
|
+
declare function TabList({ activation, 'aria-label': label, children, className: customClassName, contained, fullWidth, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait, scrollIntoView, size, ...rest }: TabListProps): import("react/jsx-runtime").JSX.Element;
|
|
197
201
|
declare namespace TabList {
|
|
198
202
|
var propTypes: {
|
|
199
203
|
/**
|
|
@@ -144,7 +144,7 @@ function getNextIndexVertical(event, total, index) {
|
|
|
144
144
|
default: return index;
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
function TabList({ activation = "automatic", "aria-label": label, children, className: customClassName, contained = false, fullWidth = false, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait = 200, scrollIntoView, ...rest }) {
|
|
147
|
+
function TabList({ activation = "automatic", "aria-label": label, children, className: customClassName, contained = false, fullWidth = false, iconSize, leftOverflowButtonProps, light, rightOverflowButtonProps, scrollDebounceWait = 200, scrollIntoView, size, ...rest }) {
|
|
148
148
|
const { activeIndex, selectedIndex, setSelectedIndex, setActiveIndex, dismissable } = React.useContext(TabsContext);
|
|
149
149
|
const prefix = usePrefix();
|
|
150
150
|
const ref = useRef(null);
|
|
@@ -161,6 +161,7 @@ function TabList({ activation = "automatic", "aria-label": label, children, clas
|
|
|
161
161
|
[`${prefix}--tabs__icon--default`]: iconSize === "default",
|
|
162
162
|
[`${prefix}--tabs__icon--lg`]: iconSize === "lg",
|
|
163
163
|
[`${prefix}--layout--size-lg`]: iconSize === "lg",
|
|
164
|
+
[`${prefix}--layout--size-${size}`]: size && contained && !hasSecondaryLabelTabs,
|
|
164
165
|
[`${prefix}--tabs--tall`]: hasSecondaryLabelTabs,
|
|
165
166
|
[`${prefix}--tabs--full-width`]: distributeWidth,
|
|
166
167
|
[`${prefix}--tabs--dismissable`]: dismissable
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import PropTypes from 'prop-types';
|
|
8
8
|
export interface SwitcherDividerProps {
|
|
9
9
|
/**
|
|
10
|
-
* Optionally provide a custom class to apply to the underlying `<
|
|
10
|
+
* Optionally provide a custom class to apply to the underlying `<hr>` node
|
|
11
11
|
*/
|
|
12
12
|
className?: string;
|
|
13
13
|
}
|
|
@@ -15,7 +15,7 @@ declare const SwitcherDivider: {
|
|
|
15
15
|
({ className: customClassName, ...other }: SwitcherDividerProps): import("react/jsx-runtime").JSX.Element;
|
|
16
16
|
propTypes: {
|
|
17
17
|
/**
|
|
18
|
-
* Optionally provide a custom class to apply to the underlying `<
|
|
18
|
+
* Optionally provide a custom class to apply to the underlying `<hr>` node
|
|
19
19
|
*/
|
|
20
20
|
className: PropTypes.Requireable<string>;
|
|
21
21
|
};
|
|
@@ -13,10 +13,10 @@ import { jsx } from "react/jsx-runtime";
|
|
|
13
13
|
//#region src/components/UIShell/SwitcherDivider.tsx
|
|
14
14
|
const SwitcherDivider = ({ className: customClassName, ...other }) => {
|
|
15
15
|
const classNames$1 = classNames(`${usePrefix()}--switcher__item--divider`, { [customClassName || ""]: !!customClassName });
|
|
16
|
-
return /* @__PURE__ */ jsx("hr", {
|
|
16
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("hr", {
|
|
17
17
|
...other,
|
|
18
18
|
className: classNames$1
|
|
19
|
-
});
|
|
19
|
+
}) });
|
|
20
20
|
};
|
|
21
21
|
SwitcherDivider.propTypes = { className: PropTypes.string };
|
|
22
22
|
//#endregion
|
package/es/internal/warning.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
import React
|
|
7
|
+
import React from 'react';
|
|
8
8
|
import { IconButtonKind } from '../IconButton';
|
|
9
9
|
import { PolymorphicComponentPropWithRef } from '../../internal/PolymorphicProps';
|
|
10
10
|
export declare const ButtonKinds: readonly ["primary", "secondary", "danger", "ghost", "danger--primary", "danger--ghost", "danger--tertiary", "tertiary"];
|
|
@@ -82,6 +82,6 @@ export interface ButtonBaseProps extends React.ButtonHTMLAttributes<HTMLButtonEl
|
|
|
82
82
|
tooltipPosition?: ButtonTooltipPosition;
|
|
83
83
|
}
|
|
84
84
|
export type ButtonProps<T extends React.ElementType> = PolymorphicComponentPropWithRef<T, ButtonBaseProps>;
|
|
85
|
-
export type ButtonComponent = <T extends React.ElementType = 'button'>(props: ButtonProps<T
|
|
85
|
+
export type ButtonComponent = <T extends React.ElementType = 'button'>(props: ButtonProps<T>, context?: any) => React.ReactElement | any;
|
|
86
86
|
declare const _default: ButtonComponent;
|
|
87
87
|
export default _default;
|
|
@@ -20,7 +20,7 @@ let react_jsx_runtime = require("react/jsx-runtime");
|
|
|
20
20
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
21
21
|
* LICENSE file in the root directory of this source tree.
|
|
22
22
|
*/
|
|
23
|
-
const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children, className, dangerDescription = "
|
|
23
|
+
const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children, className, dangerDescription = "", disabled = false, hasIconOnly = false, href, iconDescription, isExpressive = false, isSelected, kind = "primary", onBlur, onClick, onFocus, onMouseEnter, onMouseLeave, renderIcon: ButtonImageElement, size, tabIndex, type = "button", ...rest }, ref) {
|
|
24
24
|
const prefix = require_usePrefix.usePrefix();
|
|
25
25
|
const commonProps = {
|
|
26
26
|
tabIndex,
|
|
@@ -46,23 +46,23 @@ const ButtonBase = react.default.forwardRef(function ButtonBase({ as, children,
|
|
|
46
46
|
className: `${prefix}--btn__icon`,
|
|
47
47
|
"aria-hidden": "true"
|
|
48
48
|
});
|
|
49
|
-
const
|
|
49
|
+
const hasDangerDescription = [
|
|
50
50
|
"danger",
|
|
51
51
|
"danger--tertiary",
|
|
52
52
|
"danger--ghost"
|
|
53
|
-
];
|
|
53
|
+
].includes(kind) && Boolean(dangerDescription);
|
|
54
54
|
let component = "button";
|
|
55
55
|
const assistiveId = require_useId.useId("danger-description");
|
|
56
56
|
const { "aria-pressed": ariaPressed, "aria-describedby": ariaDescribedBy } = rest;
|
|
57
57
|
let otherProps = {
|
|
58
58
|
disabled,
|
|
59
59
|
type,
|
|
60
|
-
"aria-describedby":
|
|
60
|
+
"aria-describedby": hasDangerDescription ? assistiveId : ariaDescribedBy || void 0,
|
|
61
61
|
"aria-pressed": ariaPressed ?? (hasIconOnly && kind === "ghost" ? isSelected : void 0)
|
|
62
62
|
};
|
|
63
63
|
const anchorProps = { href };
|
|
64
64
|
let assistiveText = null;
|
|
65
|
-
if (
|
|
65
|
+
if (hasDangerDescription) assistiveText = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
66
66
|
id: assistiveId,
|
|
67
67
|
className: `${prefix}--visually-hidden`,
|
|
68
68
|
children: dangerDescription
|
|
@@ -17,7 +17,7 @@ prop_types = require_runtime.__toESM(prop_types);
|
|
|
17
17
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
18
18
|
//#region src/components/ChatButton/ChatButton.tsx
|
|
19
19
|
/**
|
|
20
|
-
* Copyright IBM Corp. 2024,
|
|
20
|
+
* Copyright IBM Corp. 2024, 2026
|
|
21
21
|
*
|
|
22
22
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
23
23
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -27,6 +27,7 @@ const require_wrapFocus = require("../../internal/wrapFocus.js");
|
|
|
27
27
|
const require_Dialog = require("../Dialog/Dialog.js");
|
|
28
28
|
const require_useComposedModalState = require("./useComposedModalState.js");
|
|
29
29
|
const require_ComposedModalPresence = require("./ComposedModalPresence.js");
|
|
30
|
+
const require_isTopmostVisibleModal = require("../Modal/isTopmostVisibleModal.js");
|
|
30
31
|
let classnames = require("classnames");
|
|
31
32
|
classnames = require_runtime.__toESM(classnames);
|
|
32
33
|
let react = require("react");
|
|
@@ -102,9 +103,14 @@ const ComposedModalDialog = react.default.forwardRef(function ComposedModalDialo
|
|
|
102
103
|
const button = (0, react.useRef)(null);
|
|
103
104
|
const startSentinel = (0, react.useRef)(null);
|
|
104
105
|
const endSentinel = (0, react.useRef)(null);
|
|
106
|
+
const modalRef = (0, react.useRef)(null);
|
|
105
107
|
const onMouseDownTarget = (0, react.useRef)(null);
|
|
106
108
|
const presenceContext = (0, react.useContext)(require_ComposedModalPresence.ComposedModalPresenceContext);
|
|
107
|
-
const mergedRefs = (0, _floating_ui_react.useMergeRefs)([
|
|
109
|
+
const mergedRefs = (0, _floating_ui_react.useMergeRefs)([
|
|
110
|
+
modalRef,
|
|
111
|
+
ref,
|
|
112
|
+
presenceContext?.presenceRef
|
|
113
|
+
]);
|
|
108
114
|
const enablePresence = require_index.useFeatureFlag("enable-presence") || presenceContext?.autoEnablePresence;
|
|
109
115
|
const open = externalOpen || enablePresence;
|
|
110
116
|
const modalState = require_useComposedModalState.useComposedModalState(open);
|
|
@@ -188,15 +194,14 @@ const ComposedModalDialog = react.default.forwardRef(function ComposedModalDialo
|
|
|
188
194
|
(0, react.useEffect)(() => {
|
|
189
195
|
if (!open) return;
|
|
190
196
|
const handleEscapeKey = (event) => {
|
|
191
|
-
if (require_match.match(event, require_keys.Escape)) {
|
|
197
|
+
if (require_match.match(event, require_keys.Escape) && require_isTopmostVisibleModal.isTopmostVisibleModal(modalRef.current, prefix)) {
|
|
192
198
|
event.preventDefault();
|
|
193
|
-
event.stopPropagation();
|
|
194
199
|
closeModal(event);
|
|
195
200
|
}
|
|
196
201
|
};
|
|
197
|
-
document.addEventListener("keydown", handleEscapeKey
|
|
202
|
+
document.addEventListener("keydown", handleEscapeKey);
|
|
198
203
|
return () => {
|
|
199
|
-
document.removeEventListener("keydown", handleEscapeKey
|
|
204
|
+
document.removeEventListener("keydown", handleEscapeKey);
|
|
200
205
|
};
|
|
201
206
|
}, [open]);
|
|
202
207
|
(0, react.useEffect)(() => {
|
|
@@ -36,6 +36,11 @@ export interface ModalFooterProps {
|
|
|
36
36
|
* Note that this prop is not applied if you render primary/danger button by yourself
|
|
37
37
|
*/
|
|
38
38
|
danger?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Specify the message read by screen readers for the danger primary button.
|
|
41
|
+
* Defaults to an empty string; provide localized text to opt in.
|
|
42
|
+
*/
|
|
43
|
+
dangerDescription?: string;
|
|
39
44
|
/**
|
|
40
45
|
* The `ref` callback for the primary button.
|
|
41
46
|
*/
|
|
@@ -65,7 +65,7 @@ SecondaryButtonSet.propTypes = {
|
|
|
65
65
|
},
|
|
66
66
|
secondaryClassName: prop_types.default.string
|
|
67
67
|
};
|
|
68
|
-
const ModalFooter = react.default.forwardRef(function ModalFooter({ children, className: customClassName, closeModal = require_noopFn.noopFn, danger, inputref, onRequestClose = require_noopFn.noopFn, onRequestSubmit = require_noopFn.noopFn, primaryButtonDisabled, primaryButtonText, primaryClassName, secondaryButtonText, secondaryButtons, secondaryClassName, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, ...rest }, ref) {
|
|
68
|
+
const ModalFooter = react.default.forwardRef(function ModalFooter({ children, className: customClassName, closeModal = require_noopFn.noopFn, danger, dangerDescription = "", inputref, onRequestClose = require_noopFn.noopFn, onRequestSubmit = require_noopFn.noopFn, primaryButtonDisabled, primaryButtonText, primaryClassName, secondaryButtonText, secondaryButtons, secondaryClassName, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, ...rest }, ref) {
|
|
69
69
|
const prefix = require_usePrefix.usePrefix();
|
|
70
70
|
const footerClass = (0, classnames.default)(`${prefix}--modal-footer`, customClassName, Array.isArray(secondaryButtons) && secondaryButtons.length === 2 ? `${prefix}--modal-footer--three-button` : null);
|
|
71
71
|
const primaryButtonClass = (0, classnames.default)(primaryClassName, loadingStatus !== "inactive" ? `${prefix}--btn--loading` : null);
|
|
@@ -89,6 +89,7 @@ const ModalFooter = react.default.forwardRef(function ModalFooter({ children, cl
|
|
|
89
89
|
onClick: onRequestSubmit,
|
|
90
90
|
className: primaryButtonClass,
|
|
91
91
|
disabled: loadingActive || primaryButtonDisabled,
|
|
92
|
+
dangerDescription,
|
|
92
93
|
kind: danger ? "danger" : "primary",
|
|
93
94
|
ref: inputref,
|
|
94
95
|
children: loadingStatus === "inactive" ? primaryButtonText : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$2.default, {
|
|
@@ -108,6 +109,7 @@ ModalFooter.propTypes = {
|
|
|
108
109
|
className: prop_types.default.string,
|
|
109
110
|
closeModal: prop_types.default.func,
|
|
110
111
|
danger: prop_types.default.bool,
|
|
112
|
+
dangerDescription: prop_types.default.string,
|
|
111
113
|
inputref: prop_types.default.oneOfType([prop_types.default.func, prop_types.default.shape({ current: prop_types.default.any })]),
|
|
112
114
|
loadingDescription: prop_types.default.string,
|
|
113
115
|
loadingIconDescription: prop_types.default.string,
|
|
@@ -232,6 +232,11 @@ interface DialogFooterProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
232
232
|
* Specify whether the Dialog is for dangerous actions
|
|
233
233
|
*/
|
|
234
234
|
danger?: boolean;
|
|
235
|
+
/**
|
|
236
|
+
* Specify the message read by screen readers for the danger primary button.
|
|
237
|
+
* Defaults to an empty string; provide localized text to opt in.
|
|
238
|
+
*/
|
|
239
|
+
dangerDescription?: string;
|
|
235
240
|
/**
|
|
236
241
|
* Specify loading status
|
|
237
242
|
*/
|
|
@@ -252,7 +252,7 @@ DialogBody.propTypes = {
|
|
|
252
252
|
className: prop_types.default.string,
|
|
253
253
|
hasScrollingContent: prop_types.default.bool
|
|
254
254
|
};
|
|
255
|
-
const DialogFooter = react.default.forwardRef(({ children, className, onRequestClose = require_noopFn.noopFn, onSecondarySubmit, onRequestSubmit = require_noopFn.noopFn, primaryButtonText = "Save", primaryButtonDisabled = false, secondaryButtonText = "Cancel", secondaryButtons, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, danger = false, ...rest }, ref) => {
|
|
255
|
+
const DialogFooter = react.default.forwardRef(({ children, className, onRequestClose = require_noopFn.noopFn, onSecondarySubmit, onRequestSubmit = require_noopFn.noopFn, primaryButtonText = "Save", primaryButtonDisabled = false, secondaryButtonText = "Cancel", secondaryButtons, loadingStatus = "inactive", loadingDescription, loadingIconDescription, onLoadingSuccess = require_noopFn.noopFn, danger = false, dangerDescription = "", ...rest }, ref) => {
|
|
256
256
|
const prefix = require_usePrefix.usePrefix();
|
|
257
257
|
const button = (0, react.useRef)(null);
|
|
258
258
|
const { isOpen } = (0, react.useContext)(DialogContext);
|
|
@@ -300,6 +300,7 @@ const DialogFooter = react.default.forwardRef(({ children, className, onRequestC
|
|
|
300
300
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_index$1.default, {
|
|
301
301
|
className: primaryButtonClass,
|
|
302
302
|
kind: danger ? "danger" : "primary",
|
|
303
|
+
dangerDescription,
|
|
303
304
|
disabled: loadingActive || primaryButtonDisabled,
|
|
304
305
|
onClick: onRequestSubmit,
|
|
305
306
|
ref: button,
|
|
@@ -337,6 +338,7 @@ DialogFooter.propTypes = {
|
|
|
337
338
|
return null;
|
|
338
339
|
},
|
|
339
340
|
danger: prop_types.default.bool,
|
|
341
|
+
dangerDescription: prop_types.default.string,
|
|
340
342
|
loadingStatus: prop_types.default.oneOf([
|
|
341
343
|
"inactive",
|
|
342
344
|
"active",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
require("../../_virtual/_rolldown/runtime.js");
|
|
9
9
|
//#region src/components/ErrorBoundary/ErrorBoundaryContext.ts
|
|
10
10
|
/**
|
|
11
|
-
* Copyright IBM Corp. 2016,
|
|
11
|
+
* Copyright IBM Corp. 2016, 2026
|
|
12
12
|
*
|
|
13
13
|
* This source code is licensed under the Apache-2.0 license found in the
|
|
14
14
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -11,6 +11,7 @@ interface FileItem {
|
|
|
11
11
|
file: File & {
|
|
12
12
|
invalidFileType?: boolean;
|
|
13
13
|
};
|
|
14
|
+
disabled?: boolean;
|
|
14
15
|
}
|
|
15
16
|
export interface FileChangeData {
|
|
16
17
|
addedFiles: FileItem[];
|
|
@@ -113,6 +114,10 @@ export interface FileUploaderHandle {
|
|
|
113
114
|
* Get current files (only available when 'enable-enhanced-file-uploader' feature flag is enabled)
|
|
114
115
|
*/
|
|
115
116
|
getCurrentFiles?: () => FileItem[];
|
|
117
|
+
/**
|
|
118
|
+
* Set current files (only available when 'enable-enhanced-file-uploader' feature flag is enabled)
|
|
119
|
+
*/
|
|
120
|
+
setCurrentFiles?: (files: FileItem[]) => void;
|
|
116
121
|
}
|
|
117
122
|
declare const FileUploader: {
|
|
118
123
|
(props: FileUploaderProps): React.ReactElement;
|