@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.
Files changed (161) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +951 -976
  2. package/es/components/Accordion/AccordionItem.d.ts +12 -1
  3. package/es/components/Accordion/AccordionItem.js +9 -2
  4. package/es/components/Breadcrumb/BreadcrumbItem.js +1 -1
  5. package/es/components/Checkbox/Checkbox.js +2 -2
  6. package/es/components/ComboBox/ComboBox.js +39 -23
  7. package/es/components/ComboButton/index.js +1 -1
  8. package/es/components/ComposedModal/ComposedModal.js +66 -17
  9. package/es/components/ComposedModal/ComposedModalPresence.d.ts +34 -0
  10. package/es/components/ComposedModal/ComposedModalPresence.js +42 -0
  11. package/es/components/ComposedModal/index.d.ts +1 -0
  12. package/es/components/ComposedModal/useComposedModalState.d.ts +7 -0
  13. package/es/components/ComposedModal/useComposedModalState.js +24 -0
  14. package/es/components/DataTable/TableBatchActions.js +2 -2
  15. package/es/components/DatePickerInput/DatePickerInput.js +2 -2
  16. package/es/components/Dialog/Dialog.js +2 -2
  17. package/es/components/Dropdown/Dropdown.js +5 -5
  18. package/es/components/ExpandableSearch/ExpandableSearch.d.ts +1 -1
  19. package/es/components/ExpandableSearch/ExpandableSearch.js +1 -1
  20. package/es/components/FeatureFlags/index.d.ts +2 -1
  21. package/es/components/FeatureFlags/index.js +3 -1
  22. package/es/components/FileUploader/FileUploader.js +2 -2
  23. package/es/components/FileUploader/FileUploaderItem.js +2 -2
  24. package/es/components/FluidTextInput/FluidPasswordInput.js +24 -5
  25. package/es/components/FluidTextInput/index.js +1 -1
  26. package/es/components/FormLabel/FormLabel.js +1 -1
  27. package/es/components/ListBox/ListBox.d.ts +1 -1
  28. package/es/components/ListBox/ListBox.js +1 -2
  29. package/es/components/ListItem/ListItem.js +1 -1
  30. package/es/components/Menu/MenuItem.js +2 -2
  31. package/es/components/MenuButton/index.d.ts +1 -1
  32. package/es/components/MenuButton/index.js +1 -1
  33. package/es/components/Modal/Modal.js +60 -10
  34. package/es/components/Modal/ModalPresence.d.ts +32 -0
  35. package/es/components/Modal/ModalPresence.js +37 -0
  36. package/es/components/Modal/index.d.ts +2 -1
  37. package/es/components/Modal/index.js +1 -0
  38. package/es/components/MultiSelect/FilterableMultiSelect.js +3 -3
  39. package/es/components/MultiSelect/MultiSelect.js +6 -5
  40. package/es/components/Notification/Notification.js +2 -2
  41. package/es/components/NumberInput/NumberInput.d.ts +21 -11
  42. package/es/components/NumberInput/NumberInput.js +40 -26
  43. package/es/components/OverflowMenu/OverflowMenu.js +2 -3
  44. package/es/components/OverflowMenu/next/index.js +1 -1
  45. package/es/components/OverflowMenuItem/OverflowMenuItem.js +1 -1
  46. package/es/components/PageHeader/PageHeader.js +2 -2
  47. package/es/components/ProgressIndicator/ProgressIndicator.js +1 -1
  48. package/es/components/RadioButton/RadioButton.js +3 -3
  49. package/es/components/RadioButtonGroup/RadioButtonGroup.js +2 -2
  50. package/es/components/RadioTile/RadioTile.js +2 -2
  51. package/es/components/Select/Select.js +2 -2
  52. package/es/components/Slider/Slider.js +2 -2
  53. package/es/components/StructuredList/StructuredList.js +2 -2
  54. package/es/components/Tabs/Tabs.js +2 -2
  55. package/es/components/Tag/DismissibleTag.js +3 -3
  56. package/es/components/Tag/OperationalTag.js +3 -3
  57. package/es/components/Tag/SelectableTag.js +3 -3
  58. package/es/components/Tag/Tag.js +2 -2
  59. package/es/components/Text/Text.d.ts +1 -1
  60. package/es/components/Text/Text.js +0 -1
  61. package/es/components/Text/TextDirection.d.ts +1 -1
  62. package/es/components/Text/TextDirection.js +0 -1
  63. package/es/components/Text/createTextComponent.d.ts +2 -8
  64. package/es/components/Text/createTextComponent.js +2 -2
  65. package/es/components/Text/index.d.ts +0 -8
  66. package/es/components/TextArea/TextArea.js +2 -2
  67. package/es/components/TextInput/TextInput.js +2 -2
  68. package/es/components/Tile/Tile.js +2 -2
  69. package/es/components/Toggle/Toggle.js +2 -2
  70. package/es/components/UIShell/Switcher.js +0 -26
  71. package/es/index.d.ts +1 -1
  72. package/es/index.js +6 -4
  73. package/es/internal/useNormalizedInputProps.js +2 -2
  74. package/es/internal/usePresence.d.ts +17 -0
  75. package/es/internal/usePresence.js +66 -0
  76. package/es/internal/usePresenceContext.d.ts +25 -0
  77. package/es/internal/usePresenceContext.js +46 -0
  78. package/es/tools/mergeRefs.d.ts +5 -5
  79. package/es/tools/mergeRefs.js +16 -12
  80. package/lib/components/Accordion/AccordionItem.d.ts +12 -1
  81. package/lib/components/Accordion/AccordionItem.js +9 -2
  82. package/lib/components/Breadcrumb/BreadcrumbItem.js +1 -1
  83. package/lib/components/Checkbox/Checkbox.js +2 -2
  84. package/lib/components/ComboBox/ComboBox.js +39 -23
  85. package/lib/components/ComboButton/index.js +1 -1
  86. package/lib/components/ComposedModal/ComposedModal.js +65 -16
  87. package/lib/components/ComposedModal/ComposedModalPresence.d.ts +34 -0
  88. package/lib/components/ComposedModal/ComposedModalPresence.js +46 -0
  89. package/lib/components/ComposedModal/index.d.ts +1 -0
  90. package/lib/components/ComposedModal/useComposedModalState.d.ts +7 -0
  91. package/lib/components/ComposedModal/useComposedModalState.js +26 -0
  92. package/lib/components/DataTable/TableBatchActions.js +2 -2
  93. package/lib/components/DatePickerInput/DatePickerInput.js +2 -2
  94. package/lib/components/Dialog/Dialog.js +2 -2
  95. package/lib/components/Dropdown/Dropdown.js +3 -3
  96. package/lib/components/ExpandableSearch/ExpandableSearch.d.ts +1 -1
  97. package/lib/components/ExpandableSearch/ExpandableSearch.js +1 -1
  98. package/lib/components/FeatureFlags/index.d.ts +2 -1
  99. package/lib/components/FeatureFlags/index.js +3 -1
  100. package/lib/components/FileUploader/FileUploader.js +2 -2
  101. package/lib/components/FileUploader/FileUploaderItem.js +2 -2
  102. package/lib/components/FluidTextInput/FluidPasswordInput.js +26 -5
  103. package/lib/components/FluidTextInput/index.js +2 -1
  104. package/lib/components/FormLabel/FormLabel.js +1 -1
  105. package/lib/components/ListBox/ListBox.d.ts +1 -1
  106. package/lib/components/ListBox/ListBox.js +1 -2
  107. package/lib/components/ListItem/ListItem.js +1 -1
  108. package/lib/components/Menu/MenuItem.js +2 -2
  109. package/lib/components/MenuButton/index.d.ts +1 -1
  110. package/lib/components/MenuButton/index.js +1 -1
  111. package/lib/components/Modal/Modal.js +59 -9
  112. package/lib/components/Modal/ModalPresence.d.ts +32 -0
  113. package/lib/components/Modal/ModalPresence.js +41 -0
  114. package/lib/components/Modal/index.d.ts +2 -1
  115. package/lib/components/Modal/index.js +1 -0
  116. package/lib/components/MultiSelect/FilterableMultiSelect.js +3 -3
  117. package/lib/components/MultiSelect/MultiSelect.js +4 -3
  118. package/lib/components/Notification/Notification.js +2 -2
  119. package/lib/components/NumberInput/NumberInput.d.ts +21 -11
  120. package/lib/components/NumberInput/NumberInput.js +40 -26
  121. package/lib/components/OverflowMenu/OverflowMenu.js +2 -3
  122. package/lib/components/OverflowMenu/next/index.js +1 -1
  123. package/lib/components/OverflowMenuItem/OverflowMenuItem.js +1 -1
  124. package/lib/components/PageHeader/PageHeader.js +2 -2
  125. package/lib/components/ProgressIndicator/ProgressIndicator.js +1 -1
  126. package/lib/components/RadioButton/RadioButton.js +3 -3
  127. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +3 -3
  128. package/lib/components/RadioTile/RadioTile.js +2 -2
  129. package/lib/components/Select/Select.js +2 -2
  130. package/lib/components/Slider/Slider.js +2 -2
  131. package/lib/components/StructuredList/StructuredList.js +2 -2
  132. package/lib/components/Tabs/Tabs.js +2 -2
  133. package/lib/components/Tag/DismissibleTag.js +3 -3
  134. package/lib/components/Tag/OperationalTag.js +3 -3
  135. package/lib/components/Tag/SelectableTag.js +3 -3
  136. package/lib/components/Tag/Tag.js +2 -2
  137. package/lib/components/Text/Text.d.ts +1 -1
  138. package/lib/components/Text/Text.js +0 -1
  139. package/lib/components/Text/TextDirection.d.ts +1 -1
  140. package/lib/components/Text/TextDirection.js +0 -1
  141. package/lib/components/Text/createTextComponent.d.ts +2 -8
  142. package/lib/components/Text/createTextComponent.js +2 -2
  143. package/lib/components/Text/index.d.ts +0 -8
  144. package/lib/components/TextArea/TextArea.js +2 -2
  145. package/lib/components/TextInput/TextInput.js +2 -2
  146. package/lib/components/Tile/Tile.js +2 -2
  147. package/lib/components/Toggle/Toggle.js +2 -2
  148. package/lib/components/UIShell/Switcher.js +0 -26
  149. package/lib/index.d.ts +1 -1
  150. package/lib/index.js +13 -8
  151. package/lib/internal/useNormalizedInputProps.js +2 -2
  152. package/lib/internal/usePresence.d.ts +17 -0
  153. package/lib/internal/usePresence.js +68 -0
  154. package/lib/internal/usePresenceContext.d.ts +25 -0
  155. package/lib/internal/usePresenceContext.js +48 -0
  156. package/lib/tools/mergeRefs.d.ts +5 -5
  157. package/lib/tools/mergeRefs.js +16 -14
  158. package/package.json +7 -7
  159. package/telemetry.yml +4 -0
  160. package/es/components/Text/index.js +0 -16
  161. 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.default(contentRef, ref)
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
- // Keep track of modal open/close state
134
- // and propagate it to the document.body
171
+ // Propagate open/close state to the document.body
135
172
  React.useEffect(() => {
136
- if (!enableDialogElement && open !== wasOpen) {
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, wasOpen, prefix]);
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: 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/index.js');
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/index.js');
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 mergedRef = mergeRefs.default(toggleButtonProps.ref, ref);
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
- mergedRef?.current?.focus();
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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2021
2
+ * Copyright IBM Corp. 2021, 2025
3
3
  *
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.
@@ -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.default(searchRef, forwardedRef),
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/index.js');
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/index.js');
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('./index.js');
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({
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2023
2
+ * Copyright IBM Corp. 2023, 2025
3
3
  *
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.
@@ -88,7 +88,7 @@ const MenuButton = /*#__PURE__*/React.forwardRef(({
88
88
  middleware: middlewares,
89
89
  whileElementsMounted: react.autoUpdate
90
90
  });
91
- const ref = mergeRefs.default(forwardRef, triggerRef);
91
+ const ref = mergeRefs.mergeRefs(forwardRef, triggerRef);
92
92
  const {
93
93
  open,
94
94
  handleClick: hookOnClick,