@carbon/react 1.91.0 → 1.92.0-rc.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 +951 -976
- package/es/components/Accordion/AccordionItem.d.ts +12 -1
- package/es/components/Accordion/AccordionItem.js +9 -2
- package/es/components/Breadcrumb/BreadcrumbItem.js +1 -1
- package/es/components/Checkbox/Checkbox.js +2 -2
- package/es/components/ComboBox/ComboBox.js +39 -23
- package/es/components/ComboButton/index.js +1 -1
- package/es/components/ComposedModal/ComposedModal.js +66 -17
- package/es/components/ComposedModal/ComposedModalPresence.d.ts +34 -0
- package/es/components/ComposedModal/ComposedModalPresence.js +42 -0
- package/es/components/ComposedModal/index.d.ts +1 -0
- package/es/components/ComposedModal/useComposedModalState.d.ts +7 -0
- package/es/components/ComposedModal/useComposedModalState.js +24 -0
- package/es/components/DataTable/TableBatchActions.js +2 -2
- package/es/components/DatePickerInput/DatePickerInput.js +2 -2
- package/es/components/Dialog/Dialog.js +2 -2
- package/es/components/Dropdown/Dropdown.js +5 -5
- package/es/components/ExpandableSearch/ExpandableSearch.d.ts +1 -1
- package/es/components/ExpandableSearch/ExpandableSearch.js +1 -1
- package/es/components/FeatureFlags/index.d.ts +2 -1
- package/es/components/FeatureFlags/index.js +3 -1
- package/es/components/FileUploader/FileUploader.js +2 -2
- package/es/components/FileUploader/FileUploaderItem.js +2 -2
- package/es/components/FluidTextInput/FluidPasswordInput.js +24 -5
- package/es/components/FluidTextInput/index.js +1 -1
- package/es/components/FormLabel/FormLabel.js +1 -1
- package/es/components/ListBox/ListBox.d.ts +1 -1
- package/es/components/ListBox/ListBox.js +1 -2
- package/es/components/ListItem/ListItem.js +1 -1
- package/es/components/Menu/MenuItem.js +2 -2
- package/es/components/MenuButton/index.d.ts +1 -1
- package/es/components/MenuButton/index.js +1 -1
- package/es/components/Modal/Modal.js +60 -10
- package/es/components/Modal/ModalPresence.d.ts +32 -0
- package/es/components/Modal/ModalPresence.js +37 -0
- package/es/components/Modal/index.d.ts +2 -1
- package/es/components/Modal/index.js +1 -0
- package/es/components/MultiSelect/FilterableMultiSelect.js +3 -3
- package/es/components/MultiSelect/MultiSelect.js +6 -5
- package/es/components/Notification/Notification.js +2 -2
- package/es/components/NumberInput/NumberInput.d.ts +21 -11
- package/es/components/NumberInput/NumberInput.js +40 -26
- package/es/components/OverflowMenu/OverflowMenu.js +2 -3
- package/es/components/OverflowMenu/next/index.js +1 -1
- package/es/components/OverflowMenuItem/OverflowMenuItem.js +1 -1
- package/es/components/PageHeader/PageHeader.js +2 -2
- package/es/components/ProgressIndicator/ProgressIndicator.js +1 -1
- package/es/components/RadioButton/RadioButton.js +3 -3
- package/es/components/RadioButtonGroup/RadioButtonGroup.js +2 -2
- package/es/components/RadioTile/RadioTile.js +2 -2
- package/es/components/Select/Select.js +2 -2
- package/es/components/Slider/Slider.js +2 -2
- package/es/components/StructuredList/StructuredList.js +2 -2
- package/es/components/Tabs/Tabs.js +2 -2
- package/es/components/Tag/DismissibleTag.js +3 -3
- package/es/components/Tag/OperationalTag.js +3 -3
- package/es/components/Tag/SelectableTag.js +3 -3
- package/es/components/Tag/Tag.js +2 -2
- package/es/components/Text/Text.d.ts +1 -1
- package/es/components/Text/Text.js +0 -1
- package/es/components/Text/TextDirection.d.ts +1 -1
- package/es/components/Text/TextDirection.js +0 -1
- package/es/components/Text/createTextComponent.d.ts +2 -8
- package/es/components/Text/createTextComponent.js +2 -2
- package/es/components/Text/index.d.ts +0 -8
- package/es/components/TextArea/TextArea.js +2 -2
- package/es/components/TextInput/TextInput.js +2 -2
- package/es/components/Tile/Tile.js +2 -2
- package/es/components/Toggle/Toggle.js +2 -2
- package/es/components/UIShell/Switcher.js +0 -26
- package/es/index.d.ts +1 -1
- package/es/index.js +6 -4
- package/es/internal/useNormalizedInputProps.js +2 -2
- package/es/internal/usePresence.d.ts +17 -0
- package/es/internal/usePresence.js +66 -0
- package/es/internal/usePresenceContext.d.ts +25 -0
- package/es/internal/usePresenceContext.js +46 -0
- package/es/tools/mergeRefs.d.ts +5 -5
- package/es/tools/mergeRefs.js +16 -12
- package/lib/components/Accordion/AccordionItem.d.ts +12 -1
- package/lib/components/Accordion/AccordionItem.js +9 -2
- package/lib/components/Breadcrumb/BreadcrumbItem.js +1 -1
- package/lib/components/Checkbox/Checkbox.js +2 -2
- package/lib/components/ComboBox/ComboBox.js +39 -23
- package/lib/components/ComboButton/index.js +1 -1
- package/lib/components/ComposedModal/ComposedModal.js +65 -16
- package/lib/components/ComposedModal/ComposedModalPresence.d.ts +34 -0
- package/lib/components/ComposedModal/ComposedModalPresence.js +46 -0
- package/lib/components/ComposedModal/index.d.ts +1 -0
- package/lib/components/ComposedModal/useComposedModalState.d.ts +7 -0
- package/lib/components/ComposedModal/useComposedModalState.js +26 -0
- package/lib/components/DataTable/TableBatchActions.js +2 -2
- package/lib/components/DatePickerInput/DatePickerInput.js +2 -2
- package/lib/components/Dialog/Dialog.js +2 -2
- package/lib/components/Dropdown/Dropdown.js +3 -3
- package/lib/components/ExpandableSearch/ExpandableSearch.d.ts +1 -1
- package/lib/components/ExpandableSearch/ExpandableSearch.js +1 -1
- package/lib/components/FeatureFlags/index.d.ts +2 -1
- package/lib/components/FeatureFlags/index.js +3 -1
- package/lib/components/FileUploader/FileUploader.js +2 -2
- package/lib/components/FileUploader/FileUploaderItem.js +2 -2
- package/lib/components/FluidTextInput/FluidPasswordInput.js +26 -5
- package/lib/components/FluidTextInput/index.js +2 -1
- package/lib/components/FormLabel/FormLabel.js +1 -1
- package/lib/components/ListBox/ListBox.d.ts +1 -1
- package/lib/components/ListBox/ListBox.js +1 -2
- package/lib/components/ListItem/ListItem.js +1 -1
- package/lib/components/Menu/MenuItem.js +2 -2
- package/lib/components/MenuButton/index.d.ts +1 -1
- package/lib/components/MenuButton/index.js +1 -1
- package/lib/components/Modal/Modal.js +59 -9
- package/lib/components/Modal/ModalPresence.d.ts +32 -0
- package/lib/components/Modal/ModalPresence.js +41 -0
- package/lib/components/Modal/index.d.ts +2 -1
- package/lib/components/Modal/index.js +1 -0
- package/lib/components/MultiSelect/FilterableMultiSelect.js +3 -3
- package/lib/components/MultiSelect/MultiSelect.js +4 -3
- package/lib/components/Notification/Notification.js +2 -2
- package/lib/components/NumberInput/NumberInput.d.ts +21 -11
- package/lib/components/NumberInput/NumberInput.js +40 -26
- package/lib/components/OverflowMenu/OverflowMenu.js +2 -3
- package/lib/components/OverflowMenu/next/index.js +1 -1
- package/lib/components/OverflowMenuItem/OverflowMenuItem.js +1 -1
- package/lib/components/PageHeader/PageHeader.js +2 -2
- package/lib/components/ProgressIndicator/ProgressIndicator.js +1 -1
- package/lib/components/RadioButton/RadioButton.js +3 -3
- package/lib/components/RadioButtonGroup/RadioButtonGroup.js +3 -3
- package/lib/components/RadioTile/RadioTile.js +2 -2
- package/lib/components/Select/Select.js +2 -2
- package/lib/components/Slider/Slider.js +2 -2
- package/lib/components/StructuredList/StructuredList.js +2 -2
- package/lib/components/Tabs/Tabs.js +2 -2
- package/lib/components/Tag/DismissibleTag.js +3 -3
- package/lib/components/Tag/OperationalTag.js +3 -3
- package/lib/components/Tag/SelectableTag.js +3 -3
- package/lib/components/Tag/Tag.js +2 -2
- package/lib/components/Text/Text.d.ts +1 -1
- package/lib/components/Text/Text.js +0 -1
- package/lib/components/Text/TextDirection.d.ts +1 -1
- package/lib/components/Text/TextDirection.js +0 -1
- package/lib/components/Text/createTextComponent.d.ts +2 -8
- package/lib/components/Text/createTextComponent.js +2 -2
- package/lib/components/Text/index.d.ts +0 -8
- package/lib/components/TextArea/TextArea.js +2 -2
- package/lib/components/TextInput/TextInput.js +2 -2
- package/lib/components/Tile/Tile.js +2 -2
- package/lib/components/Toggle/Toggle.js +2 -2
- package/lib/components/UIShell/Switcher.js +0 -26
- package/lib/index.d.ts +1 -1
- package/lib/index.js +13 -8
- package/lib/internal/useNormalizedInputProps.js +2 -2
- package/lib/internal/usePresence.d.ts +17 -0
- package/lib/internal/usePresence.js +68 -0
- package/lib/internal/usePresenceContext.d.ts +25 -0
- package/lib/internal/usePresenceContext.js +48 -0
- package/lib/tools/mergeRefs.d.ts +5 -5
- package/lib/tools/mergeRefs.js +16 -14
- package/package.json +7 -7
- package/telemetry.yml +4 -0
- package/es/components/Text/index.js +0 -16
- package/lib/components/Text/index.js +0 -20
|
@@ -32,6 +32,10 @@ var Dialog = require('../Dialog/Dialog.js');
|
|
|
32
32
|
var warning = require('../../internal/warning.js');
|
|
33
33
|
var index$2 = require('../AILabel/index.js');
|
|
34
34
|
var utils = require('../../internal/utils.js');
|
|
35
|
+
var react = require('@floating-ui/react');
|
|
36
|
+
var ComposedModalPresence = require('./ComposedModalPresence.js');
|
|
37
|
+
var useId = require('../../internal/useId.js');
|
|
38
|
+
var useComposedModalState = require('./useComposedModalState.js');
|
|
35
39
|
var debounce = require('../../node_modules/es-toolkit/dist/compat/function/debounce.js');
|
|
36
40
|
|
|
37
41
|
const ModalBody = /*#__PURE__*/React.forwardRef(function ModalBody({
|
|
@@ -72,7 +76,7 @@ const ModalBody = /*#__PURE__*/React.forwardRef(function ModalBody({
|
|
|
72
76
|
return /*#__PURE__*/React.createElement(index.Layer, _rollupPluginBabelHelpers.extends({
|
|
73
77
|
className: contentClass
|
|
74
78
|
}, hasScrollingContentProps, rest, {
|
|
75
|
-
ref: mergeRefs.
|
|
79
|
+
ref: mergeRefs.mergeRefs(contentRef, ref)
|
|
76
80
|
}), children);
|
|
77
81
|
});
|
|
78
82
|
ModalBody.propTypes = {
|
|
@@ -99,6 +103,34 @@ ModalBody.propTypes = {
|
|
|
99
103
|
hasScrollingContent: PropTypes.bool
|
|
100
104
|
};
|
|
101
105
|
const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
106
|
+
open,
|
|
107
|
+
...props
|
|
108
|
+
}, ref) {
|
|
109
|
+
const id = useId.useId();
|
|
110
|
+
const enablePresence = index$1.useFeatureFlag('enable-presence');
|
|
111
|
+
const hasPresenceContext = Boolean(React.useContext(ComposedModalPresence.ComposedModalPresenceContext));
|
|
112
|
+
const hasPresenceOptIn = enablePresence || hasPresenceContext;
|
|
113
|
+
const exclusivePresenceContext = ComposedModalPresence.useExclusiveComposedModalPresenceContext(id);
|
|
114
|
+
|
|
115
|
+
// if opt in and not exclusive to a presence context, wrap with presence
|
|
116
|
+
if (hasPresenceOptIn && !exclusivePresenceContext) {
|
|
117
|
+
return /*#__PURE__*/React.createElement(ComposedModalPresence.ComposedModalPresence, {
|
|
118
|
+
open: open ?? false,
|
|
119
|
+
_presenceId: id
|
|
120
|
+
// do not auto enable styles for opt-in by feature flag
|
|
121
|
+
,
|
|
122
|
+
_autoEnablePresence: hasPresenceContext
|
|
123
|
+
}, /*#__PURE__*/React.createElement(ComposedModalDialog, _rollupPluginBabelHelpers.extends({
|
|
124
|
+
open: true,
|
|
125
|
+
ref: ref
|
|
126
|
+
}, props)));
|
|
127
|
+
}
|
|
128
|
+
return /*#__PURE__*/React.createElement(ComposedModalDialog, _rollupPluginBabelHelpers.extends({
|
|
129
|
+
ref: ref,
|
|
130
|
+
open: open
|
|
131
|
+
}, props));
|
|
132
|
+
});
|
|
133
|
+
const ComposedModalDialog = /*#__PURE__*/React.forwardRef(function ComposedModalDialog({
|
|
102
134
|
['aria-labelledby']: ariaLabelledBy,
|
|
103
135
|
['aria-label']: ariaLabel,
|
|
104
136
|
children,
|
|
@@ -109,7 +141,7 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
109
141
|
isFullWidth,
|
|
110
142
|
onClose,
|
|
111
143
|
onKeyDown,
|
|
112
|
-
open,
|
|
144
|
+
open: externalOpen,
|
|
113
145
|
preventCloseOnClickOutside,
|
|
114
146
|
selectorPrimaryFocus = '[data-modal-primary-focus]',
|
|
115
147
|
selectorsFloatingMenus,
|
|
@@ -119,27 +151,30 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
119
151
|
...rest
|
|
120
152
|
}, ref) {
|
|
121
153
|
const prefix = usePrefix.usePrefix();
|
|
122
|
-
const [isOpen, setIsOpen] = React.useState(!!open);
|
|
123
|
-
const [wasOpen, setWasOpen] = React.useState(!!open);
|
|
124
154
|
const innerModal = React.useRef(null);
|
|
125
155
|
const button = React.useRef(null);
|
|
126
156
|
const startSentinel = React.useRef(null);
|
|
127
157
|
const endSentinel = React.useRef(null);
|
|
128
158
|
const onMouseDownTarget = React.useRef(null);
|
|
159
|
+
const presenceContext = React.useContext(ComposedModalPresence.ComposedModalPresenceContext);
|
|
160
|
+
const mergedRefs = react.useMergeRefs([ref, presenceContext?.presenceRef]);
|
|
161
|
+
const enablePresence = index$1.useFeatureFlag('enable-presence') || presenceContext?.autoEnablePresence;
|
|
162
|
+
|
|
163
|
+
// always mark as open when mounted with presence
|
|
164
|
+
const open = externalOpen || enablePresence;
|
|
165
|
+
const modalState = useComposedModalState.useComposedModalState(open);
|
|
166
|
+
const [isOpen, setIsOpen] = presenceContext?.modalState ?? modalState;
|
|
129
167
|
const enableDialogElement = index$1.useFeatureFlag('enable-dialog-element');
|
|
130
168
|
const focusTrapWithoutSentinels = index$1.useFeatureFlag('enable-experimental-focus-wrap-without-sentinels');
|
|
131
169
|
process.env.NODE_ENV !== "production" ? warning.warning(!(focusTrapWithoutSentinels && enableDialogElement), '`<Modal>` detected both `focusTrapWithoutSentinels` and ' + '`enableDialogElement` feature flags are enabled. The native dialog ' + 'element handles focus, so `enableDialogElement` must be off for ' + '`focusTrapWithoutSentinels` to have any effect.') : void 0;
|
|
132
170
|
|
|
133
|
-
//
|
|
134
|
-
// and propagate it to the document.body
|
|
171
|
+
// Propagate open/close state to the document.body
|
|
135
172
|
React.useEffect(() => {
|
|
136
|
-
if (!enableDialogElement
|
|
137
|
-
setIsOpen(!!open);
|
|
138
|
-
setWasOpen(!!open);
|
|
173
|
+
if (!enableDialogElement) {
|
|
139
174
|
toggleClass.toggleClass(document.body, `${prefix}--body--with-modal-open`, !!open);
|
|
140
175
|
}
|
|
141
176
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20071
|
|
142
|
-
}, [open,
|
|
177
|
+
}, [open, prefix]);
|
|
143
178
|
// Remove the document.body className on unmount
|
|
144
179
|
React.useEffect(() => {
|
|
145
180
|
if (!enableDialogElement) {
|
|
@@ -230,7 +265,8 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
230
265
|
}
|
|
231
266
|
}
|
|
232
267
|
const modalClass = cx(`${prefix}--modal`, {
|
|
233
|
-
'is-visible': isOpen,
|
|
268
|
+
'is-visible': enablePresence || isOpen,
|
|
269
|
+
[`${prefix}--modal--enable-presence`]: presenceContext?.autoEnablePresence,
|
|
234
270
|
[`${prefix}--modal--danger`]: danger,
|
|
235
271
|
[`${prefix}--modal--slug`]: slug,
|
|
236
272
|
[`${prefix}--modal--decorator`]: decorator
|
|
@@ -284,12 +320,23 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
284
320
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20071
|
|
285
321
|
}, [open]);
|
|
286
322
|
React.useEffect(() => {
|
|
287
|
-
if (!enableDialogElement && !open && launcherButtonRef) {
|
|
323
|
+
if (!enableDialogElement && !enablePresence && !open && launcherButtonRef) {
|
|
288
324
|
setTimeout(() => {
|
|
289
325
|
launcherButtonRef.current?.focus();
|
|
290
326
|
});
|
|
291
327
|
}
|
|
292
|
-
}, [enableDialogElement, open, launcherButtonRef]);
|
|
328
|
+
}, [enableDialogElement, enablePresence, open, launcherButtonRef]);
|
|
329
|
+
// Focus launcherButtonRef on unmount
|
|
330
|
+
React.useEffect(() => {
|
|
331
|
+
const launcherButton = launcherButtonRef?.current;
|
|
332
|
+
return () => {
|
|
333
|
+
if (enablePresence && launcherButton) {
|
|
334
|
+
setTimeout(() => {
|
|
335
|
+
launcherButton.focus();
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
}, [enablePresence, launcherButtonRef]);
|
|
293
340
|
React.useEffect(() => {
|
|
294
341
|
if (!enableDialogElement) {
|
|
295
342
|
const initialFocus = focusContainerElement => {
|
|
@@ -328,7 +375,8 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
328
375
|
modal: true,
|
|
329
376
|
className: containerClass,
|
|
330
377
|
"aria-label": ariaLabel ? ariaLabel : generatedAriaLabel,
|
|
331
|
-
"aria-labelledby": ariaLabelledBy
|
|
378
|
+
"aria-labelledby": ariaLabelledBy,
|
|
379
|
+
"data-exiting": presenceContext?.isExiting || undefined
|
|
332
380
|
}, /*#__PURE__*/React.createElement("div", {
|
|
333
381
|
ref: innerModal,
|
|
334
382
|
className: `${prefix}--modal-container-body`
|
|
@@ -357,13 +405,14 @@ const ComposedModal = /*#__PURE__*/React.forwardRef(function ComposedModal({
|
|
|
357
405
|
return /*#__PURE__*/React.createElement(index.Layer, _rollupPluginBabelHelpers.extends({}, rest, {
|
|
358
406
|
level: 0,
|
|
359
407
|
role: "presentation",
|
|
360
|
-
ref:
|
|
408
|
+
ref: mergedRefs,
|
|
361
409
|
"aria-hidden": !open,
|
|
362
410
|
onBlur: handleBlur,
|
|
363
411
|
onClick: events.composeEventHandlers([rest?.onClick, handleOnClick]),
|
|
364
412
|
onMouseDown: events.composeEventHandlers([rest?.onMouseDown, handleOnMouseDown]),
|
|
365
413
|
onKeyDown: handleKeyDown,
|
|
366
|
-
className: modalClass
|
|
414
|
+
className: modalClass,
|
|
415
|
+
"data-exiting": presenceContext?.isExiting || undefined
|
|
367
416
|
}), modalBody);
|
|
368
417
|
});
|
|
369
418
|
ComposedModal.propTypes = {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2025
|
|
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
|
+
import React, { type PropsWithChildren } from 'react';
|
|
8
|
+
import { type PresenceContext } from '../../internal/usePresenceContext';
|
|
9
|
+
import { useComposedModalState } from './useComposedModalState';
|
|
10
|
+
export interface ComposedModalPresenceProps {
|
|
11
|
+
/**
|
|
12
|
+
* Specify whether the Modal is currently open
|
|
13
|
+
*/
|
|
14
|
+
open: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Internal property for backwards compatibility. Specify whether the Modal should opt in to presence mode.
|
|
17
|
+
*/
|
|
18
|
+
_autoEnablePresence?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Internal property to predefine the presence context's id for exclusivity.
|
|
21
|
+
*/
|
|
22
|
+
_presenceId?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const ComposedModalPresence: ({ open, _presenceId: presenceId, _autoEnablePresence: autoEnablePresence, children, }: PropsWithChildren<ComposedModalPresenceProps>) => import("react/jsx-runtime").JSX.Element | null;
|
|
25
|
+
interface ComposedModalPresenceContextProps extends PresenceContext {
|
|
26
|
+
modalState: ReturnType<typeof useComposedModalState>;
|
|
27
|
+
autoEnablePresence: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare const ComposedModalPresenceContext: React.Context<ComposedModalPresenceContextProps | undefined>;
|
|
30
|
+
/**
|
|
31
|
+
* Handles occurrences where only a single composed modal must consume a context.
|
|
32
|
+
*/
|
|
33
|
+
export declare const useExclusiveComposedModalPresenceContext: (id: string) => ComposedModalPresenceContextProps | undefined;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
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
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
var React = require('react');
|
|
11
|
+
var usePresenceContext = require('../../internal/usePresenceContext.js');
|
|
12
|
+
var useComposedModalState = require('./useComposedModalState.js');
|
|
13
|
+
|
|
14
|
+
const ComposedModalPresence = ({
|
|
15
|
+
open,
|
|
16
|
+
_presenceId: presenceId,
|
|
17
|
+
_autoEnablePresence: autoEnablePresence = true,
|
|
18
|
+
children
|
|
19
|
+
}) => {
|
|
20
|
+
// Since the modal could be used without an onClose callback, we need to be aware of the internal isOpen state
|
|
21
|
+
const modalState = useComposedModalState.useComposedModalState(open);
|
|
22
|
+
const [isOpen] = modalState;
|
|
23
|
+
const [isPresent, context] = usePresenceContext.usePresenceContext(isOpen, presenceId);
|
|
24
|
+
const presenceContextValue = React.useMemo(() => ({
|
|
25
|
+
modalState,
|
|
26
|
+
autoEnablePresence,
|
|
27
|
+
...context
|
|
28
|
+
}), [modalState, autoEnablePresence, context]);
|
|
29
|
+
if (!isPresent) return null;
|
|
30
|
+
return /*#__PURE__*/React.createElement(ComposedModalPresenceContext, {
|
|
31
|
+
value: presenceContextValue
|
|
32
|
+
}, children);
|
|
33
|
+
};
|
|
34
|
+
const ComposedModalPresenceContext = /*#__PURE__*/React.createContext(undefined);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Handles occurrences where only a single composed modal must consume a context.
|
|
38
|
+
*/
|
|
39
|
+
const useExclusiveComposedModalPresenceContext = id => {
|
|
40
|
+
const ctx = React.useContext(ComposedModalPresenceContext);
|
|
41
|
+
return ctx?.isPresenceExclusive(id) ? ctx : undefined;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
exports.ComposedModalPresence = ComposedModalPresence;
|
|
45
|
+
exports.ComposedModalPresenceContext = ComposedModalPresenceContext;
|
|
46
|
+
exports.useExclusiveComposedModalPresenceContext = useExclusiveComposedModalPresenceContext;
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import ComposedModal from './ComposedModal';
|
|
8
8
|
export { default as ComposedModal, type ComposedModalProps, ModalBody, type ModalBodyProps, } from './ComposedModal';
|
|
9
|
+
export { ComposedModalPresence, type ComposedModalPresenceProps, } from './ComposedModalPresence';
|
|
9
10
|
export { ModalHeader, type ModalHeaderProps } from './ModalHeader';
|
|
10
11
|
export { ModalFooter, type ModalFooterProps } from './ModalFooter';
|
|
11
12
|
export default ComposedModal;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2025
|
|
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 useComposedModalState: (open: boolean | undefined) => readonly [boolean, import("react").Dispatch<import("react").SetStateAction<boolean>>];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
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
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
var React = require('react');
|
|
11
|
+
|
|
12
|
+
const useComposedModalState = open => {
|
|
13
|
+
const [isOpen, setIsOpen] = React.useState(!!open);
|
|
14
|
+
const [wasOpen, setWasOpen] = React.useState(!!open);
|
|
15
|
+
|
|
16
|
+
// Keep track of modal open/close state
|
|
17
|
+
React.useEffect(() => {
|
|
18
|
+
if (open !== wasOpen) {
|
|
19
|
+
setIsOpen(!!open);
|
|
20
|
+
setWasOpen(!!open);
|
|
21
|
+
}
|
|
22
|
+
}, [open, wasOpen]);
|
|
23
|
+
return React.useMemo(() => [isOpen, setIsOpen], [isOpen]);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
exports.useComposedModalState = useComposedModalState;
|
|
@@ -16,9 +16,9 @@ var React = require('react');
|
|
|
16
16
|
var Button = require('../Button/Button.js');
|
|
17
17
|
require('../Button/Button.Skeleton.js');
|
|
18
18
|
var TableActionList = require('./TableActionList.js');
|
|
19
|
-
require('../Text/index.js');
|
|
20
|
-
var usePrefix = require('../../internal/usePrefix.js');
|
|
21
19
|
var Text = require('../Text/Text.js');
|
|
20
|
+
require('../Text/TextDirection.js');
|
|
21
|
+
var usePrefix = require('../../internal/usePrefix.js');
|
|
22
22
|
|
|
23
23
|
const TableBatchActionsTranslationKeys = ['carbon.table.batch.cancel', 'carbon.table.batch.items.selected', 'carbon.table.batch.item.selected', 'carbon.table.batch.selectAll'];
|
|
24
24
|
const translationKeys = {
|
|
@@ -18,11 +18,11 @@ var usePrefix = require('../../internal/usePrefix.js');
|
|
|
18
18
|
require('../FluidForm/FluidForm.js');
|
|
19
19
|
var FormContext = require('../FluidForm/FormContext.js');
|
|
20
20
|
var useId = require('../../internal/useId.js');
|
|
21
|
-
require('../Text/
|
|
21
|
+
var Text = require('../Text/Text.js');
|
|
22
|
+
require('../Text/TextDirection.js');
|
|
22
23
|
var deprecate = require('../../prop-types/deprecate.js');
|
|
23
24
|
var index = require('../AILabel/index.js');
|
|
24
25
|
var utils = require('../../internal/utils.js');
|
|
25
|
-
var Text = require('../Text/Text.js');
|
|
26
26
|
|
|
27
27
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- https://github.com/carbon-design-system/carbon/issues/20071
|
|
28
28
|
|
|
@@ -16,7 +16,8 @@ var cx = require('classnames');
|
|
|
16
16
|
var iconsReact = require('@carbon/icons-react');
|
|
17
17
|
var index = require('../IconButton/index.js');
|
|
18
18
|
var noopFn = require('../../internal/noopFn.js');
|
|
19
|
-
require('../Text/
|
|
19
|
+
var Text = require('../Text/Text.js');
|
|
20
|
+
require('../Text/TextDirection.js');
|
|
20
21
|
var index$1 = require('../Layer/index.js');
|
|
21
22
|
var ButtonSet = require('../ButtonSet/ButtonSet.js');
|
|
22
23
|
var Button = require('../Button/Button.js');
|
|
@@ -24,7 +25,6 @@ require('../Button/Button.Skeleton.js');
|
|
|
24
25
|
var useId = require('../../internal/useId.js');
|
|
25
26
|
var InlineLoading = require('../InlineLoading/InlineLoading.js');
|
|
26
27
|
var debounce = require('../../node_modules/es-toolkit/dist/compat/function/debounce.js');
|
|
27
|
-
var Text = require('../Text/Text.js');
|
|
28
28
|
|
|
29
29
|
const DialogContext = /*#__PURE__*/React.createContext({});
|
|
30
30
|
|
|
@@ -255,7 +255,8 @@ const Dropdown = /*#__PURE__*/React.forwardRef(({
|
|
|
255
255
|
const handleFocus = evt => {
|
|
256
256
|
setIsFocused(evt.type === 'focus' && !selectedItem ? true : false);
|
|
257
257
|
};
|
|
258
|
-
const
|
|
258
|
+
const buttonRef = React.useRef(null);
|
|
259
|
+
const mergedRef = mergeRefs.mergeRefs(toggleButtonProps.ref, ref, buttonRef);
|
|
259
260
|
const [currTimer, setCurrTimer] = React.useState();
|
|
260
261
|
const [isTyping, setIsTyping] = React.useState(false);
|
|
261
262
|
const onKeyDownHandler = React.useCallback(evt => {
|
|
@@ -291,7 +292,7 @@ const Dropdown = /*#__PURE__*/React.forwardRef(({
|
|
|
291
292
|
// NOTE: does not prevent click
|
|
292
293
|
evt.preventDefault();
|
|
293
294
|
// focus on the element as per readonly input behavior
|
|
294
|
-
|
|
295
|
+
buttonRef.current?.focus();
|
|
295
296
|
},
|
|
296
297
|
onKeyDown: evt => {
|
|
297
298
|
const selectAccessKeys = ['ArrowDown', 'ArrowUp', ' ', 'Enter'];
|
|
@@ -306,7 +307,6 @@ const Dropdown = /*#__PURE__*/React.forwardRef(({
|
|
|
306
307
|
onKeyDown: onKeyDownHandler
|
|
307
308
|
};
|
|
308
309
|
}
|
|
309
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps -- https://github.com/carbon-design-system/carbon/issues/20071
|
|
310
310
|
}, [readOnly, onKeyDownHandler]);
|
|
311
311
|
const menuProps = React.useMemo(() => getMenuProps({
|
|
312
312
|
ref: enableFloatingStyles || autoAlign ? refs.setFloating : null
|
|
@@ -65,7 +65,7 @@ const ExpandableSearch = /*#__PURE__*/React.forwardRef(function ExpandableSearch
|
|
|
65
65
|
return /*#__PURE__*/React.createElement(Search.default, _rollupPluginBabelHelpers.extends({}, props, {
|
|
66
66
|
defaultValue: defaultValue,
|
|
67
67
|
isExpanded: expanded,
|
|
68
|
-
ref: mergeRefs.
|
|
68
|
+
ref: mergeRefs.mergeRefs(searchRef, forwardedRef),
|
|
69
69
|
className: classes,
|
|
70
70
|
onBlur: events.composeEventHandlers([onBlur, handleBlur]),
|
|
71
71
|
onChange: events.composeEventHandlers([onChange, handleChange]),
|
|
@@ -17,6 +17,7 @@ export interface FeatureFlagsProps {
|
|
|
17
17
|
enableDialogElement?: boolean;
|
|
18
18
|
enableV12DynamicFloatingStyles?: boolean;
|
|
19
19
|
enableEnhancedFileUploader?: boolean;
|
|
20
|
+
enablePresence?: boolean;
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
23
|
* Our FeatureFlagContext is used alongside the FeatureFlags component to enable
|
|
@@ -28,7 +29,7 @@ declare const FeatureFlagContext: React.Context<any>;
|
|
|
28
29
|
* along with the current `FeatureFlagContext` to provide consumers to check if
|
|
29
30
|
* a feature flag is enabled or disabled in a given React tree
|
|
30
31
|
*/
|
|
31
|
-
declare function FeatureFlags({ children, flags, enableV12TileDefaultIcons, enableV12TileRadioIcons, enableV12Overflowmenu, enableTreeviewControllable, enableExperimentalFocusWrapWithoutSentinels, enableDialogElement, enableV12DynamicFloatingStyles, enableEnhancedFileUploader, }: FeatureFlagsProps): JSX.Element;
|
|
32
|
+
declare function FeatureFlags({ children, flags, enableV12TileDefaultIcons, enableV12TileRadioIcons, enableV12Overflowmenu, enableTreeviewControllable, enableExperimentalFocusWrapWithoutSentinels, enableDialogElement, enableV12DynamicFloatingStyles, enableEnhancedFileUploader, enablePresence, }: FeatureFlagsProps): JSX.Element;
|
|
32
33
|
declare namespace FeatureFlags {
|
|
33
34
|
var propTypes: {
|
|
34
35
|
children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
|
|
@@ -34,7 +34,8 @@ function FeatureFlags({
|
|
|
34
34
|
enableExperimentalFocusWrapWithoutSentinels = false,
|
|
35
35
|
enableDialogElement = false,
|
|
36
36
|
enableV12DynamicFloatingStyles = false,
|
|
37
|
-
enableEnhancedFileUploader = false
|
|
37
|
+
enableEnhancedFileUploader = false,
|
|
38
|
+
enablePresence = false
|
|
38
39
|
}) {
|
|
39
40
|
const parentScope = React.useContext(FeatureFlagContext);
|
|
40
41
|
const [prevParentScope, setPrevParentScope] = React.useState(parentScope);
|
|
@@ -47,6 +48,7 @@ function FeatureFlags({
|
|
|
47
48
|
'enable-dialog-element': enableDialogElement,
|
|
48
49
|
'enable-v12-dynamic-floating-styles': enableV12DynamicFloatingStyles,
|
|
49
50
|
'enable-enhanced-file-uploader': enableEnhancedFileUploader,
|
|
51
|
+
'enable-presence': enablePresence,
|
|
50
52
|
...flags
|
|
51
53
|
};
|
|
52
54
|
const [scope, updateScope] = React.useState(() => {
|
|
@@ -19,10 +19,10 @@ var Button = require('../Button/Button.js');
|
|
|
19
19
|
var keys = require('../../internal/keyboard/keys.js');
|
|
20
20
|
var match = require('../../internal/keyboard/match.js');
|
|
21
21
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
22
|
-
require('../Text/
|
|
22
|
+
var Text = require('../Text/Text.js');
|
|
23
|
+
require('../Text/TextDirection.js');
|
|
23
24
|
var useId = require('../../internal/useId.js');
|
|
24
25
|
var index = require('../FeatureFlags/index.js');
|
|
25
|
-
var Text = require('../Text/Text.js');
|
|
26
26
|
|
|
27
27
|
// eslint-disable-next-line react/display-name -- https://github.com/carbon-design-system/carbon/issues/20071
|
|
28
28
|
const FileUploader = /*#__PURE__*/React.forwardRef(({
|
|
@@ -19,10 +19,10 @@ var match = require('../../internal/keyboard/match.js');
|
|
|
19
19
|
var useId = require('../../internal/useId.js');
|
|
20
20
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
21
21
|
var noopFn = require('../../internal/noopFn.js');
|
|
22
|
-
require('../Text/
|
|
22
|
+
var Text = require('../Text/Text.js');
|
|
23
|
+
require('../Text/TextDirection.js');
|
|
23
24
|
require('../Tooltip/DefinitionTooltip.js');
|
|
24
25
|
var Tooltip = require('../Tooltip/Tooltip.js');
|
|
25
|
-
var Text = require('../Text/Text.js');
|
|
26
26
|
|
|
27
27
|
function FileUploaderItem({
|
|
28
28
|
uuid,
|
|
@@ -7,13 +7,32 @@
|
|
|
7
7
|
|
|
8
8
|
'use strict';
|
|
9
9
|
|
|
10
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
|
+
|
|
12
|
+
var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
|
|
10
13
|
var PropTypes = require('prop-types');
|
|
11
|
-
require('react');
|
|
12
|
-
require('classnames');
|
|
14
|
+
var React = require('react');
|
|
15
|
+
var cx = require('classnames');
|
|
13
16
|
require('../TextInput/ControlledPasswordInput.js');
|
|
14
|
-
require('../TextInput/PasswordInput.js');
|
|
17
|
+
var PasswordInput = require('../TextInput/PasswordInput.js');
|
|
18
|
+
var usePrefix = require('../../internal/usePrefix.js');
|
|
19
|
+
var FormContext = require('../FluidForm/FormContext.js');
|
|
15
20
|
|
|
16
|
-
({
|
|
21
|
+
const FluidPasswordInput = ({
|
|
22
|
+
className,
|
|
23
|
+
...other
|
|
24
|
+
}) => {
|
|
25
|
+
const prefix = usePrefix.usePrefix();
|
|
26
|
+
const classNames = cx(className, `${prefix}--text-input--fluid`);
|
|
27
|
+
return /*#__PURE__*/React.createElement(FormContext.FormContext.Provider, {
|
|
28
|
+
value: {
|
|
29
|
+
isFluid: true
|
|
30
|
+
}
|
|
31
|
+
}, /*#__PURE__*/React.createElement(PasswordInput.default, _rollupPluginBabelHelpers.extends({
|
|
32
|
+
className: classNames
|
|
33
|
+
}, other)));
|
|
34
|
+
};
|
|
35
|
+
FluidPasswordInput.propTypes = {
|
|
17
36
|
/**
|
|
18
37
|
* Specify an optional className to be applied to the outer FluidForm wrapper
|
|
19
38
|
*/
|
|
@@ -90,4 +109,6 @@ require('../TextInput/PasswordInput.js');
|
|
|
90
109
|
* Whether or not the component is readonly
|
|
91
110
|
*/
|
|
92
111
|
readOnly: PropTypes.bool
|
|
93
|
-
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
exports.default = FluidPasswordInput;
|
|
@@ -10,11 +10,12 @@
|
|
|
10
10
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
11
|
|
|
12
12
|
var FluidTextInput = require('./FluidTextInput.js');
|
|
13
|
-
require('./FluidPasswordInput.js');
|
|
13
|
+
var FluidPasswordInput = require('./FluidPasswordInput.js');
|
|
14
14
|
var FluidTextInput_Skeleton = require('./FluidTextInput.Skeleton.js');
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
exports.FluidTextInput = FluidTextInput.default;
|
|
19
19
|
exports.default = FluidTextInput.default;
|
|
20
|
+
exports.FluidPasswordInput = FluidPasswordInput.default;
|
|
20
21
|
exports.FluidTextInputSkeleton = FluidTextInput_Skeleton.default;
|
|
@@ -14,8 +14,8 @@ var PropTypes = require('prop-types');
|
|
|
14
14
|
var React = require('react');
|
|
15
15
|
var cx = require('classnames');
|
|
16
16
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
17
|
-
require('../Text/index.js');
|
|
18
17
|
var Text = require('../Text/Text.js');
|
|
18
|
+
require('../Text/TextDirection.js');
|
|
19
19
|
|
|
20
20
|
function FormLabel({
|
|
21
21
|
className: customClassName,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
import React, { type HTMLAttributes } from 'react';
|
|
8
|
-
import { type ListBoxSize, type ListBoxType } from '
|
|
8
|
+
import { type ListBoxSize, type ListBoxType } from './ListBoxPropTypes';
|
|
9
9
|
type ExcludedAttributes = 'onKeyDown' | 'onKeyPress' | 'ref';
|
|
10
10
|
export interface ListBoxProps extends Omit<HTMLAttributes<HTMLDivElement>, ExcludedAttributes> {
|
|
11
11
|
/**
|
|
@@ -14,11 +14,10 @@ var cx = require('classnames');
|
|
|
14
14
|
var React = require('react');
|
|
15
15
|
var PropTypes = require('prop-types');
|
|
16
16
|
var deprecate = require('../../prop-types/deprecate.js');
|
|
17
|
-
require('./
|
|
17
|
+
var ListBoxPropTypes = require('./ListBoxPropTypes.js');
|
|
18
18
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
19
19
|
require('../FluidForm/FluidForm.js');
|
|
20
20
|
var FormContext = require('../FluidForm/FormContext.js');
|
|
21
|
-
var ListBoxPropTypes = require('./ListBoxPropTypes.js');
|
|
22
21
|
|
|
23
22
|
const handleOnKeyDown = event => {
|
|
24
23
|
if (event.keyCode === 27) {
|
|
@@ -14,8 +14,8 @@ var PropTypes = require('prop-types');
|
|
|
14
14
|
var React = require('react');
|
|
15
15
|
var cx = require('classnames');
|
|
16
16
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
17
|
-
require('../Text/index.js');
|
|
18
17
|
var Text = require('../Text/Text.js');
|
|
18
|
+
require('../Text/TextDirection.js');
|
|
19
19
|
|
|
20
20
|
function ListItem({
|
|
21
21
|
className,
|
|
@@ -22,9 +22,9 @@ var Menu = require('./Menu.js');
|
|
|
22
22
|
var MenuContext = require('./MenuContext.js');
|
|
23
23
|
require('../LayoutDirection/LayoutDirection.js');
|
|
24
24
|
var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
|
|
25
|
-
require('../Text/index.js');
|
|
26
|
-
var defaultItemToString = require('../../internal/defaultItemToString.js');
|
|
27
25
|
var Text = require('../Text/Text.js');
|
|
26
|
+
require('../Text/TextDirection.js');
|
|
27
|
+
var defaultItemToString = require('../../internal/defaultItemToString.js');
|
|
28
28
|
|
|
29
29
|
var _Checkmark, _CaretLeft, _CaretRight;
|
|
30
30
|
const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem({
|
|
@@ -88,7 +88,7 @@ const MenuButton = /*#__PURE__*/React.forwardRef(({
|
|
|
88
88
|
middleware: middlewares,
|
|
89
89
|
whileElementsMounted: react.autoUpdate
|
|
90
90
|
});
|
|
91
|
-
const ref = mergeRefs.
|
|
91
|
+
const ref = mergeRefs.mergeRefs(forwardRef, triggerRef);
|
|
92
92
|
const {
|
|
93
93
|
open,
|
|
94
94
|
handleClick: hookOnClick,
|