@carbon/react 1.62.1 → 1.63.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 (54) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +822 -822
  2. package/es/components/Checkbox/Checkbox.js +2 -3
  3. package/es/components/CheckboxGroup/CheckboxGroup.js +2 -3
  4. package/es/components/ComboBox/ComboBox.js +4 -3
  5. package/es/components/DataTable/DataTable.js +1 -1
  6. package/es/components/DataTable/TableSelectRow.js +3 -2
  7. package/es/components/DataTable/TableToolbarSearch.js +3 -4
  8. package/es/components/DatePickerInput/DatePickerInput.js +2 -3
  9. package/es/components/Dropdown/Dropdown.js +3 -6
  10. package/es/components/FluidSearch/FluidSearch.Skeleton.js +40 -0
  11. package/es/components/FluidSearch/FluidSearch.js +96 -0
  12. package/es/components/Modal/Modal.js +2 -3
  13. package/es/components/MultiSelect/FilterableMultiSelect.js +10 -7
  14. package/es/components/MultiSelect/MultiSelect.js +10 -10
  15. package/es/components/Pagination/experimental/PageSelector.js +2 -3
  16. package/es/components/RadioButtonGroup/RadioButtonGroup.js +2 -5
  17. package/es/components/Select/Select.js +3 -6
  18. package/es/components/Tag/DismissibleTag.js +2 -3
  19. package/es/components/Tag/OperationalTag.js +2 -3
  20. package/es/components/Tag/SelectableTag.js +2 -3
  21. package/es/components/Tag/Tag.js +3 -5
  22. package/es/components/TextArea/TextArea.js +32 -6
  23. package/es/components/TextInput/ControlledPasswordInput.js +3 -6
  24. package/es/components/TextInput/TextInput.js +29 -2
  25. package/es/index.d.ts +1 -0
  26. package/es/index.js +2 -0
  27. package/es/internal/useAnnouncer.js +8 -3
  28. package/lib/components/Checkbox/Checkbox.js +2 -3
  29. package/lib/components/CheckboxGroup/CheckboxGroup.js +2 -3
  30. package/lib/components/ComboBox/ComboBox.js +4 -3
  31. package/lib/components/DataTable/DataTable.js +1 -1
  32. package/lib/components/DataTable/TableSelectRow.js +2 -1
  33. package/lib/components/DataTable/TableToolbarSearch.js +2 -3
  34. package/lib/components/DatePickerInput/DatePickerInput.js +2 -3
  35. package/lib/components/Dropdown/Dropdown.js +2 -5
  36. package/lib/components/FluidSearch/FluidSearch.Skeleton.js +50 -0
  37. package/lib/components/FluidSearch/FluidSearch.js +106 -0
  38. package/lib/components/Modal/Modal.js +2 -3
  39. package/lib/components/MultiSelect/FilterableMultiSelect.js +9 -6
  40. package/lib/components/MultiSelect/MultiSelect.js +9 -9
  41. package/lib/components/Pagination/experimental/PageSelector.js +2 -3
  42. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +2 -5
  43. package/lib/components/Select/Select.js +2 -5
  44. package/lib/components/Tag/DismissibleTag.js +2 -3
  45. package/lib/components/Tag/OperationalTag.js +2 -3
  46. package/lib/components/Tag/SelectableTag.js +2 -3
  47. package/lib/components/Tag/Tag.js +3 -5
  48. package/lib/components/TextArea/TextArea.js +32 -6
  49. package/lib/components/TextInput/ControlledPasswordInput.js +2 -5
  50. package/lib/components/TextInput/TextInput.js +28 -1
  51. package/lib/index.d.ts +1 -0
  52. package/lib/index.js +4 -0
  53. package/lib/internal/useAnnouncer.js +8 -3
  54. package/package.json +18 -17
@@ -472,9 +472,13 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
472
472
  setInputValue('');
473
473
  }
474
474
  }));
475
- const menuProps = getMenuProps({}, {
475
+
476
+ // Memoize the value of getMenuProps to avoid an infinite loop
477
+ const menuProps = React.useMemo(() => getMenuProps({
478
+ ref: autoAlign ? refs.setFloating : null
479
+ }, {
476
480
  suppressRefError: true
477
- });
481
+ }), [autoAlign]);
478
482
  const handleFocus = evt => {
479
483
  if (evt?.target.classList.contains(`${prefix}--tag__close-icon`) || evt?.target.classList.contains(`${prefix}--list-box__selection`)) {
480
484
  setIsFocused(false);
@@ -500,6 +504,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
500
504
  disabled: disabled,
501
505
  light: light,
502
506
  ref: ref,
507
+ id: id,
503
508
  invalid: invalid,
504
509
  invalidText: invalidText,
505
510
  warn: warn,
@@ -508,7 +513,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
508
513
  size: size
509
514
  }, /*#__PURE__*/React__default["default"].createElement("div", {
510
515
  className: `${prefix}--list-box__field`,
511
- ref: refs.setReference
516
+ ref: autoAlign ? refs.setReference : null
512
517
  }, controlledSelectedItems.length > 0 &&
513
518
  /*#__PURE__*/
514
519
  // @ts-expect-error: It is expecting a non-required prop called: "onClearSelection"
@@ -549,9 +554,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
549
554
  // @ts-expect-error
550
555
  isOpen: isOpen,
551
556
  translateWithId: translateWithId
552
- }))), normalizedSlug, /*#__PURE__*/React__default["default"].createElement(index["default"].Menu, _rollupPluginBabelHelpers["extends"]({}, menuProps, {
553
- ref: refs.setFloating
554
- }), isOpen ? sortedItems.map((item, index$1) => {
557
+ }))), normalizedSlug, /*#__PURE__*/React__default["default"].createElement(index["default"].Menu, menuProps, isOpen ? sortedItems.map((item, index$1) => {
555
558
  const isChecked = controlledSelectedItems.filter(selected => isEqual__default["default"](selected, item)).length > 0;
556
559
  const itemProps = getItemProps({
557
560
  item,
@@ -20,7 +20,7 @@ var index = require('../ListBox/index.js');
20
20
  var MultiSelectPropTypes = require('./MultiSelectPropTypes.js');
21
21
  var sorting = require('./tools/sorting.js');
22
22
  var Selection = require('../../internal/Selection.js');
23
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
23
+ var useId = require('../../internal/useId.js');
24
24
  var mergeRefs = require('../../tools/mergeRefs.js');
25
25
  var deprecate = require('../../prop-types/deprecate.js');
26
26
  var usePrefix = require('../../internal/usePrefix.js');
@@ -39,7 +39,6 @@ var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
39
39
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
40
40
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
41
41
 
42
- const getInstanceId = setupGetInstanceId["default"]();
43
42
  const {
44
43
  ItemClick,
45
44
  ToggleButtonBlur,
@@ -110,9 +109,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
110
109
  const {
111
110
  isFluid
112
111
  } = React.useContext(FormContext.FormContext);
113
- const {
114
- current: multiSelectInstanceId
115
- } = React.useRef(getInstanceId());
112
+ const multiSelectInstanceId = useId.useId();
116
113
  const [isFocused, setIsFocused] = React.useState(false);
117
114
  const [inputFocused, setInputFocused] = React.useState(false);
118
115
  const [isOpen, setIsOpen] = React.useState(open || false);
@@ -406,6 +403,11 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
406
403
  });
407
404
  }
408
405
  const itemsSelectedText = selectedItems.length > 0 && selectedItems.map(item => item?.text);
406
+
407
+ // Memoize the value of getMenuProps to avoid an infinite loop
408
+ const menuProps = React.useMemo(() => getMenuProps({
409
+ ref: autoAlign ? refs.setFloating : null
410
+ }), [autoAlign]);
409
411
  return /*#__PURE__*/React__default["default"].createElement("div", {
410
412
  className: wrapperClasses
411
413
  }, /*#__PURE__*/React__default["default"].createElement("label", _rollupPluginBabelHelpers["extends"]({
@@ -432,7 +434,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
432
434
  className: `${prefix}--list-box__invalid-icon ${prefix}--list-box__invalid-icon--warning`
433
435
  }), /*#__PURE__*/React__default["default"].createElement("div", {
434
436
  className: multiSelectFieldWrapperClasses,
435
- ref: refs.setReference
437
+ ref: autoAlign ? refs.setReference : null
436
438
  }, selectedItems.length > 0 && /*#__PURE__*/React__default["default"].createElement(index["default"].Selection, {
437
439
  readOnly: readOnly,
438
440
  clearSelection: !disabled && !readOnly ? clearSelection : noopFn.noopFn,
@@ -455,9 +457,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
455
457
  }, label), /*#__PURE__*/React__default["default"].createElement(index["default"].MenuIcon, {
456
458
  isOpen: isOpen,
457
459
  translateWithId: translateWithId
458
- })), normalizedSlug), /*#__PURE__*/React__default["default"].createElement(index["default"].Menu, getMenuProps({
459
- ref: refs.setFloating
460
- }), isOpen &&
460
+ })), normalizedSlug), /*#__PURE__*/React__default["default"].createElement(index["default"].Menu, menuProps, isOpen &&
461
461
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
462
462
  sortItems(filteredItems, sortOptions).map((item, index$1) => {
463
463
  const isChecked = selectedItems.filter(selected => isEqual__default["default"](selected, item)).length > 0;
@@ -13,7 +13,7 @@ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHel
13
13
  var React = require('react');
14
14
  var PropTypes = require('prop-types');
15
15
  var cx = require('classnames');
16
- var setupGetInstanceId = require('../../../tools/setupGetInstanceId.js');
16
+ var useId = require('../../../internal/useId.js');
17
17
  var Select = require('../../Select/Select.js');
18
18
  require('../../Select/Select.Skeleton.js');
19
19
  var SelectItem = require('../../SelectItem/SelectItem.js');
@@ -25,7 +25,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
25
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
26
26
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
27
27
 
28
- const getInstanceId = setupGetInstanceId["default"]();
29
28
  function PageSelector(_ref) {
30
29
  let {
31
30
  className = null,
@@ -37,7 +36,7 @@ function PageSelector(_ref) {
37
36
  } = _ref;
38
37
  const prefix = usePrefix.usePrefix();
39
38
  const namespace = `${prefix}--unstable-pagination__page-selector`;
40
- const instanceId = `${namespace}__select-${getInstanceId()}`;
39
+ const instanceId = `${namespace}__select-${useId.useId()}`;
41
40
  const renderPages = total => {
42
41
  const pages = [];
43
42
  for (let counter = 1; counter <= total; counter += 1) {
@@ -17,7 +17,7 @@ var index = require('../Text/index.js');
17
17
  var usePrefix = require('../../internal/usePrefix.js');
18
18
  var iconsReact = require('@carbon/icons-react');
19
19
  var mergeRefs = require('../../tools/mergeRefs.js');
20
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
20
+ var useId = require('../../internal/useId.js');
21
21
 
22
22
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
23
 
@@ -25,7 +25,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
25
25
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
26
26
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
27
27
 
28
- const getInstanceId = setupGetInstanceId["default"]();
29
28
  const RadioButtonGroup = /*#__PURE__*/React__default["default"].forwardRef((props, ref) => {
30
29
  const {
31
30
  children,
@@ -51,9 +50,7 @@ const RadioButtonGroup = /*#__PURE__*/React__default["default"].forwardRef((prop
51
50
  const prefix = usePrefix.usePrefix();
52
51
  const [selected, setSelected] = React.useState(valueSelected ?? defaultSelected);
53
52
  const [prevValueSelected, setPrevValueSelected] = React.useState(valueSelected);
54
- const {
55
- current: radioButtonGroupInstanceId
56
- } = React.useRef(getInstanceId());
53
+ const radioButtonGroupInstanceId = useId.useId();
57
54
 
58
55
  /**
59
56
  * prop + state alignment - getDerivedStateFromProps
@@ -18,7 +18,7 @@ var deprecate = require('../../prop-types/deprecate.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 setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
21
+ var useId = require('../../internal/useId.js');
22
22
  var events = require('../../tools/events.js');
23
23
  require('../Text/index.js');
24
24
  var Text = require('../Text/Text.js');
@@ -29,7 +29,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
29
29
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
30
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
31
31
 
32
- const getInstanceId = setupGetInstanceId["default"]();
33
32
  const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select(_ref, ref) {
34
33
  let {
35
34
  className,
@@ -60,9 +59,7 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
60
59
  } = React.useContext(FormContext.FormContext);
61
60
  const [isFocused, setIsFocused] = React.useState(false);
62
61
  const [title, setTitle] = React.useState('');
63
- const {
64
- current: selectInstanceId
65
- } = React.useRef(getInstanceId());
62
+ const selectInstanceId = useId.useId();
66
63
  const selectClasses = cx__default["default"]({
67
64
  [`${prefix}--select`]: true,
68
65
  [`${prefix}--select--inline`]: inline,
@@ -13,7 +13,7 @@ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelper
13
13
  var PropTypes = require('prop-types');
14
14
  var React = require('react');
15
15
  var cx = require('classnames');
16
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
16
+ var useId = require('../../internal/useId.js');
17
17
  var usePrefix = require('../../internal/usePrefix.js');
18
18
  var Tag = require('./Tag.js');
19
19
  var iconsReact = require('@carbon/icons-react');
@@ -30,7 +30,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
30
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
31
31
 
32
32
  var _Close;
33
- const getInstanceId = setupGetInstanceId["default"]();
34
33
  const DismissibleTag = _ref => {
35
34
  let {
36
35
  className,
@@ -47,7 +46,7 @@ const DismissibleTag = _ref => {
47
46
  } = _ref;
48
47
  const prefix = usePrefix.usePrefix();
49
48
  const tagLabelRef = React.useRef();
50
- const tagId = id || `tag-${getInstanceId()}`;
49
+ const tagId = id || `tag-${useId.useId()}`;
51
50
  const tagClasses = cx__default["default"](`${prefix}--tag--filter`, className);
52
51
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
53
52
  React.useLayoutEffect(() => {
@@ -13,7 +13,7 @@ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelper
13
13
  var PropTypes = require('prop-types');
14
14
  var React = require('react');
15
15
  var cx = require('classnames');
16
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
16
+ var useId = require('../../internal/useId.js');
17
17
  var usePrefix = require('../../internal/usePrefix.js');
18
18
  var Tag = require('./Tag.js');
19
19
  require('../Tooltip/DefinitionTooltip.js');
@@ -28,7 +28,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
28
28
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
29
29
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
30
30
 
31
- const getInstanceId = setupGetInstanceId["default"]();
32
31
  const TYPES = {
33
32
  red: 'Red',
34
33
  magenta: 'Magenta',
@@ -55,7 +54,7 @@ const OperationalTag = _ref => {
55
54
  } = _ref;
56
55
  const prefix = usePrefix.usePrefix();
57
56
  const tagRef = React.useRef();
58
- const tagId = id || `tag-${getInstanceId()}`;
57
+ const tagId = id || `tag-${useId.useId()}`;
59
58
  const tagClasses = cx__default["default"](`${prefix}--tag--operational`, className);
60
59
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
61
60
  React.useLayoutEffect(() => {
@@ -13,7 +13,7 @@ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelper
13
13
  var PropTypes = require('prop-types');
14
14
  var React = require('react');
15
15
  var cx = require('classnames');
16
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
16
+ var useId = require('../../internal/useId.js');
17
17
  var usePrefix = require('../../internal/usePrefix.js');
18
18
  var Tag = require('./Tag.js');
19
19
  require('../Tooltip/DefinitionTooltip.js');
@@ -28,7 +28,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
28
28
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
29
29
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
30
30
 
31
- const getInstanceId = setupGetInstanceId["default"]();
32
31
  const SelectableTag = _ref => {
33
32
  let {
34
33
  className,
@@ -43,7 +42,7 @@ const SelectableTag = _ref => {
43
42
  } = _ref;
44
43
  const prefix = usePrefix.usePrefix();
45
44
  const tagRef = React.useRef();
46
- const tagId = id || `tag-${getInstanceId()}`;
45
+ const tagId = id || `tag-${useId.useId()}`;
47
46
  const [selectedTag, setSelectedTag] = React.useState(selected);
48
47
  const tagClasses = cx__default["default"](`${prefix}--tag--selectable`, className, {
49
48
  [`${prefix}--tag--selectable-selected`]: selectedTag
@@ -14,7 +14,7 @@ var PropTypes = require('prop-types');
14
14
  var React = require('react');
15
15
  var cx = require('classnames');
16
16
  var iconsReact = require('@carbon/icons-react');
17
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
17
+ var useId = require('../../internal/useId.js');
18
18
  var usePrefix = require('../../internal/usePrefix.js');
19
19
  require('../Text/index.js');
20
20
  var deprecate = require('../../prop-types/deprecate.js');
@@ -31,7 +31,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
31
31
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
32
32
 
33
33
  var _Close;
34
- const getInstanceId = setupGetInstanceId["default"]();
35
34
  const TYPES = {
36
35
  red: 'Red',
37
36
  magenta: 'Magenta',
@@ -73,7 +72,7 @@ const Tag = /*#__PURE__*/React__default["default"].forwardRef(function Tag(_ref,
73
72
  const prefix = usePrefix.usePrefix();
74
73
  const tagRef = React.useRef();
75
74
  const ref = react.useMergeRefs([forwardRef, tagRef]);
76
- const tagId = id || `tag-${getInstanceId()}`;
75
+ const tagId = id || `tag-${useId.useId()}`;
77
76
  const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
78
77
  React.useLayoutEffect(() => {
79
78
  const newElement = tagRef.current?.getElementsByClassName(`${prefix}--tag__label`)[0];
@@ -127,8 +126,7 @@ const Tag = /*#__PURE__*/React__default["default"].forwardRef(function Tag(_ref,
127
126
  }
128
127
  const ComponentTag = BaseComponent ?? (other.onClick || className?.includes(`${prefix}--tag--operational`) ? 'button' : 'div');
129
128
  const labelClasses = cx__default["default"]({
130
- [`${prefix}--tag__label`]: !isInteractiveTag,
131
- [`${prefix}--tag--${type}`]: type && !isInteractiveTag
129
+ [`${prefix}--tag__label`]: !isInteractiveTag
132
130
  });
133
131
  return /*#__PURE__*/React__default["default"].createElement(ComponentTag, _rollupPluginBabelHelpers["extends"]({
134
132
  ref: ref,
@@ -21,7 +21,7 @@ var FormContext = require('../FluidForm/FormContext.js');
21
21
  var useAnnouncer = require('../../internal/useAnnouncer.js');
22
22
  var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
23
23
  var useMergedRefs = require('../../internal/useMergedRefs.js');
24
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
24
+ var useId = require('../../internal/useId.js');
25
25
  var noopFn = require('../../internal/noopFn.js');
26
26
  require('../Text/index.js');
27
27
  var Text = require('../Text/Text.js');
@@ -32,7 +32,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
32
32
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
33
33
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
34
34
 
35
- const getInstanceId = setupGetInstanceId["default"]();
36
35
  const TextArea = /*#__PURE__*/React__default["default"].forwardRef((props, forwardRef) => {
37
36
  const {
38
37
  className,
@@ -65,9 +64,7 @@ const TextArea = /*#__PURE__*/React__default["default"].forwardRef((props, forwa
65
64
  defaultValue,
66
65
  value
67
66
  } = other;
68
- const {
69
- current: textAreaInstanceId
70
- } = React.useRef(getInstanceId());
67
+ const textAreaInstanceId = useId.useId();
71
68
  const textareaRef = React.useRef(null);
72
69
  const ref = useMergedRefs.useMergedRefs([forwardRef, textareaRef]);
73
70
  function getInitialTextCount() {
@@ -227,7 +224,33 @@ const TextArea = /*#__PURE__*/React__default["default"].forwardRef((props, forwa
227
224
  textareaProps.maxLength = maxCount;
228
225
  }
229
226
  }
227
+ const announcerRef = React.useRef(null);
228
+ const [prevAnnouncement, setPrevAnnouncement] = React.useState('');
230
229
  const ariaAnnouncement = useAnnouncer.useAnnouncer(textCount, maxCount, counterMode === 'word' ? 'words' : undefined);
230
+ React.useEffect(() => {
231
+ if (ariaAnnouncement && ariaAnnouncement !== prevAnnouncement) {
232
+ const announcer = announcerRef.current;
233
+ if (announcer) {
234
+ // Clear the content first
235
+ announcer.textContent = '';
236
+
237
+ // Set the new content after a small delay
238
+ const timeoutId = setTimeout(() => {
239
+ if (announcer) {
240
+ announcer.textContent = ariaAnnouncement;
241
+ setPrevAnnouncement(ariaAnnouncement);
242
+ }
243
+ }, counterMode === 'word' ? 2000 : 1000);
244
+
245
+ //clear the timeout
246
+ return () => {
247
+ if (timeoutId) {
248
+ clearTimeout(timeoutId);
249
+ }
250
+ };
251
+ }
252
+ }
253
+ }, [ariaAnnouncement, prevAnnouncement, counterMode]);
231
254
  const input = /*#__PURE__*/React__default["default"].createElement("textarea", _rollupPluginBabelHelpers["extends"]({}, other, textareaProps, {
232
255
  placeholder: placeholder,
233
256
  "aria-readonly": other.readOnly ? true : false,
@@ -260,7 +283,10 @@ const TextArea = /*#__PURE__*/React__default["default"].forwardRef((props, forwa
260
283
  className: `${prefix}--text-area__invalid-icon ${prefix}--text-area__invalid-icon--warning`
261
284
  }), input, normalizedSlug, /*#__PURE__*/React__default["default"].createElement("span", {
262
285
  className: `${prefix}--text-area__counter-alert`,
263
- role: "alert"
286
+ role: "alert",
287
+ "aria-live": "assertive",
288
+ "aria-atomic": "true",
289
+ ref: announcerRef
264
290
  }, ariaAnnouncement), isFluid && /*#__PURE__*/React__default["default"].createElement("hr", {
265
291
  className: `${prefix}--text-area__divider`
266
292
  }), isFluid && invalid ? error : null, isFluid && warn && !invalid ? warning : null), !invalid && !warn && !isFluid ? helper : null, invalid && !isFluid ? error : null, warn && !invalid && !isFluid ? warning : null);
@@ -18,7 +18,7 @@ var util = require('./util.js');
18
18
  var warning = require('../../internal/warning.js');
19
19
  var deprecate = require('../../prop-types/deprecate.js');
20
20
  var usePrefix = require('../../internal/usePrefix.js');
21
- var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
21
+ var useId = require('../../internal/useId.js');
22
22
  var noopFn = require('../../internal/noopFn.js');
23
23
 
24
24
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -27,7 +27,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
27
27
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
28
28
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
29
29
 
30
- const getInstanceId = setupGetInstanceId["default"]();
31
30
  let didWarnAboutDeprecation = false;
32
31
  const ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRef(function ControlledPasswordInput(_ref, ref) {
33
32
  let {
@@ -55,9 +54,7 @@ const ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRe
55
54
  ...other
56
55
  } = _ref;
57
56
  const prefix = usePrefix.usePrefix();
58
- const {
59
- current: controlledPasswordInstanceId
60
- } = React.useRef(getInstanceId());
57
+ const controlledPasswordInstanceId = useId.useId();
61
58
  if (process.env.NODE_ENV !== "production") {
62
59
  process.env.NODE_ENV !== "production" ? warning.warning(didWarnAboutDeprecation, '`<TextInput.ControlledPasswordInput>` has been deprecated in favor of `<TextInput.PasswordInput />` and will be removed in the next major release of `carbon-components-react`') : void 0;
63
60
  didWarnAboutDeprecation = true;
@@ -162,7 +162,31 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
162
162
  const {
163
163
  isFluid
164
164
  } = React.useContext(FormContext.FormContext);
165
+ const announcerRef = React.useRef(null);
166
+ const [prevAnnouncement, setPrevAnnouncement] = React.useState('');
165
167
  const ariaAnnouncement = useAnnouncer.useAnnouncer(textCount, maxCount);
168
+ React.useEffect(() => {
169
+ if (ariaAnnouncement && ariaAnnouncement !== prevAnnouncement) {
170
+ const announcer = announcerRef.current;
171
+ if (announcer) {
172
+ // Clear the content first
173
+ announcer.textContent = '';
174
+ // Set the new content after a small delay
175
+ const timeoutId = setTimeout(() => {
176
+ if (announcer) {
177
+ announcer.textContent = ariaAnnouncement;
178
+ setPrevAnnouncement(ariaAnnouncement);
179
+ }
180
+ }, 1000);
181
+ // clear the timeout
182
+ return () => {
183
+ if (timeoutId) {
184
+ clearTimeout(timeoutId);
185
+ }
186
+ };
187
+ }
188
+ }
189
+ }, [ariaAnnouncement, prevAnnouncement]);
166
190
  const Icon = normalizedProps.icon;
167
191
 
168
192
  // Slug is always size `mini`
@@ -185,7 +209,10 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
185
209
  className: iconClasses
186
210
  }), input, normalizedSlug, /*#__PURE__*/React__default["default"].createElement("span", {
187
211
  className: `${prefix}--text-input__counter-alert`,
188
- role: "alert"
212
+ role: "alert",
213
+ "aria-live": "assertive",
214
+ "aria-atomic": "true",
215
+ ref: announcerRef
189
216
  }, ariaAnnouncement), isFluid && /*#__PURE__*/React__default["default"].createElement("hr", {
190
217
  className: `${prefix}--text-input__divider`
191
218
  }), isFluid && !inline && normalizedProps.validation), !isFluid && !inline && (normalizedProps.validation || helper)));
package/lib/index.d.ts CHANGED
@@ -102,6 +102,7 @@ export { FluidDatePickerInput as unstable__FluidDatePickerInput } from './compon
102
102
  export { FluidDropdown as unstable__FluidDropdown, FluidDropdownSkeleton as unstable__FluidDropdownSkeleton, } from './components/FluidDropdown';
103
103
  export { FluidMultiSelect as unstable__FluidMultiSelect, FluidMultiSelectSkeleton as unstable__FluidMultiSelectSkeleton, } from './components/FluidMultiSelect';
104
104
  export { FluidSelect as unstable__FluidSelect, FluidSelectSkeleton as unstable__FluidSelectSkeleton, } from './components/FluidSelect';
105
+ export { FluidSearch as unstable__FluidSearch, FluidSearchSkeleton as unstable__FluidSearchSkeleton, } from './components/FluidSearch';
105
106
  export { FluidTextArea as unstable__FluidTextArea, FluidTextAreaSkeleton as unstable__FluidTextAreaSkeleton, } from './components/FluidTextArea';
106
107
  export { FluidTextInput as unstable__FluidTextInput, FluidTextInputSkeleton as unstable__FluidTextInputSkeleton, } from './components/FluidTextInput';
107
108
  export { FluidTimePicker as unstable__FluidTimePicker, FluidTimePickerSkeleton as unstable__FluidTimePickerSkeleton, } from './components/FluidTimePicker';
package/lib/index.js CHANGED
@@ -179,6 +179,7 @@ var index$g = require('./components/Theme/index.js');
179
179
  var usePrefix = require('./internal/usePrefix.js');
180
180
  var useIdPrefix = require('./internal/useIdPrefix.js');
181
181
  var FluidDatePicker_Skeleton = require('./components/FluidDatePicker/FluidDatePicker.Skeleton.js');
182
+ var FluidSearch_Skeleton = require('./components/FluidSearch/FluidSearch.Skeleton.js');
182
183
  var FluidTextArea = require('./components/FluidTextArea/FluidTextArea.js');
183
184
  var FluidTextArea_Skeleton = require('./components/FluidTextArea/FluidTextArea.Skeleton.js');
184
185
  var FluidTextInput = require('./components/FluidTextInput/FluidTextInput.js');
@@ -202,6 +203,7 @@ var FluidMultiSelect = require('./components/FluidMultiSelect/FluidMultiSelect.j
202
203
  var FluidMultiSelect_Skeleton = require('./components/FluidMultiSelect/FluidMultiSelect.Skeleton.js');
203
204
  var FluidSelect = require('./components/FluidSelect/FluidSelect.js');
204
205
  var FluidSelect_Skeleton = require('./components/FluidSelect/FluidSelect.Skeleton.js');
206
+ var FluidSearch = require('./components/FluidSearch/FluidSearch.js');
205
207
  var FluidTimePicker = require('./components/FluidTimePicker/FluidTimePicker.js');
206
208
  var FluidTimePicker_Skeleton = require('./components/FluidTimePicker/FluidTimePicker.Skeleton.js');
207
209
  var FluidTimePickerSelect = require('./components/FluidTimePickerSelect/FluidTimePickerSelect.js');
@@ -453,6 +455,7 @@ exports.PrefixContext = usePrefix.PrefixContext;
453
455
  exports.usePrefix = usePrefix.usePrefix;
454
456
  exports.useIdPrefix = useIdPrefix.useIdPrefix;
455
457
  exports.unstable__FluidDatePickerSkeleton = FluidDatePicker_Skeleton["default"];
458
+ exports.unstable__FluidSearchSkeleton = FluidSearch_Skeleton["default"];
456
459
  exports.unstable__FluidTextArea = FluidTextArea["default"];
457
460
  exports.unstable__FluidTextAreaSkeleton = FluidTextArea_Skeleton["default"];
458
461
  exports.unstable__FluidTextInput = FluidTextInput["default"];
@@ -476,6 +479,7 @@ exports.unstable__FluidMultiSelect = FluidMultiSelect["default"];
476
479
  exports.unstable__FluidMultiSelectSkeleton = FluidMultiSelect_Skeleton["default"];
477
480
  exports.unstable__FluidSelect = FluidSelect["default"];
478
481
  exports.unstable__FluidSelectSkeleton = FluidSelect_Skeleton["default"];
482
+ exports.unstable__FluidSearch = FluidSearch["default"];
479
483
  exports.unstable__FluidTimePicker = FluidTimePicker["default"];
480
484
  exports.unstable__FluidTimePickerSkeleton = FluidTimePicker_Skeleton["default"];
481
485
  exports.unstable__FluidTimePickerSelect = FluidTimePickerSelect["default"];
@@ -11,10 +11,15 @@ Object.defineProperty(exports, '__esModule', { value: true });
11
11
 
12
12
  function useAnnouncer(textCount, maxCount) {
13
13
  let entityName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'characters';
14
- const lastTen = maxCount - 10;
15
- if (textCount >= lastTen) {
16
- return `${maxCount - textCount} ${entityName} left.`;
14
+ const remaining = maxCount - textCount;
15
+ if (remaining <= 10 && remaining > 0) {
16
+ const entity = remaining === 1 ? entityName.slice(0, -1) : entityName;
17
+ return `${remaining} ${entity} left.`;
17
18
  }
19
+ if (remaining <= 0) {
20
+ return `Maximum ${entityName} reached.`;
21
+ }
22
+ return null;
18
23
  }
19
24
 
20
25
  exports.useAnnouncer = useAnnouncer;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbon/react",
3
3
  "description": "React components for the Carbon Design System",
4
- "version": "1.62.1",
4
+ "version": "1.63.0-rc.0",
5
5
  "license": "Apache-2.0",
6
6
  "main": "lib/index.js",
7
7
  "module": "es/index.js",
@@ -47,11 +47,11 @@
47
47
  "sass": "^1.33.0"
48
48
  },
49
49
  "dependencies": {
50
- "@babel/runtime": "^7.18.3",
51
- "@carbon/feature-flags": "^0.20.0",
52
- "@carbon/icons-react": "^11.45.0",
53
- "@carbon/layout": "^11.23.0",
54
- "@carbon/styles": "^1.61.0",
50
+ "@babel/runtime": "^7.24.7",
51
+ "@carbon/feature-flags": "^0.21.0-rc.0",
52
+ "@carbon/icons-react": "^11.46.0-rc.0",
53
+ "@carbon/layout": "^11.24.0-rc.0",
54
+ "@carbon/styles": "^1.62.0-rc.0",
55
55
  "@floating-ui/react": "^0.26.0",
56
56
  "@ibm/telemetry-js": "^1.5.0",
57
57
  "classnames": "2.5.1",
@@ -65,22 +65,23 @@
65
65
  "lodash.omit": "^4.5.0",
66
66
  "lodash.throttle": "^4.1.1",
67
67
  "prop-types": "^15.7.2",
68
+ "react-fast-compare": "^3.2.2",
68
69
  "react-is": "^18.2.0",
69
70
  "tabbable": "^6.2.0",
70
71
  "use-resize-observer": "^6.0.0",
71
72
  "window-or-global": "^1.0.1"
72
73
  },
73
74
  "devDependencies": {
74
- "@babel/core": "^7.18.2",
75
- "@babel/plugin-proposal-class-properties": "^7.17.12",
76
- "@babel/plugin-proposal-export-default-from": "^7.17.12",
77
- "@babel/plugin-proposal-export-namespace-from": "^7.17.12",
78
- "@babel/plugin-transform-react-constant-elements": "^7.17.12",
79
- "@babel/preset-env": "^7.22.4",
80
- "@babel/preset-react": "^7.22.3",
81
- "@babel/preset-typescript": "^7.21.5",
75
+ "@babel/core": "^7.24.7",
76
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
77
+ "@babel/plugin-proposal-export-default-from": "^7.24.7",
78
+ "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
79
+ "@babel/plugin-transform-react-constant-elements": "^7.24.7",
80
+ "@babel/preset-env": "^7.24.7",
81
+ "@babel/preset-react": "^7.24.7",
82
+ "@babel/preset-typescript": "^7.24.7",
82
83
  "@carbon/test-utils": "^10.30.0",
83
- "@carbon/themes": "^11.37.0",
84
+ "@carbon/themes": "^11.38.0-rc.0",
84
85
  "@figma/code-connect": "^1.0.2",
85
86
  "@rollup/plugin-babel": "^6.0.0",
86
87
  "@rollup/plugin-commonjs": "^26.0.0",
@@ -99,7 +100,7 @@
99
100
  "autoprefixer": "^10.4.0",
100
101
  "babel-loader": "^9.0.0",
101
102
  "babel-plugin-dev-expression": "^0.2.3",
102
- "babel-preset-carbon": "^0.5.0",
103
+ "babel-preset-carbon": "^0.6.0-rc.0",
103
104
  "browserify-zlib": "^0.2.0",
104
105
  "browserslist-config-carbon": "^11.2.0",
105
106
  "clipboardy": "^2.1.0",
@@ -141,5 +142,5 @@
141
142
  "**/*.scss",
142
143
  "**/*.css"
143
144
  ],
144
- "gitHead": "14d9d64e3d9dfc98c8c36841952ff0faec627d03"
145
+ "gitHead": "326ac312c2b669937ede1c0c68c0e3a6d9c34135"
145
146
  }