@carbon/react 1.63.2 → 1.64.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 (102) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +1562 -1193
  2. package/es/components/{Slug → AILabel}/index.js +47 -35
  3. package/es/components/{AiSkeleton/AiSkeletonIcon.d.ts → AISkeleton/AISkeletonIcon.d.ts} +4 -4
  4. package/es/components/{AiSkeleton/AiSkeletonIcon.js → AISkeleton/AISkeletonIcon.js} +5 -5
  5. package/es/components/{AiSkeleton/AiSkeletonPlaceholder.d.ts → AISkeleton/AISkeletonPlaceholder.d.ts} +4 -4
  6. package/es/components/{AiSkeleton/AiSkeletonPlaceholder.js → AISkeleton/AISkeletonPlaceholder.js} +5 -5
  7. package/es/components/{AiSkeleton/AiSkeletonText.d.ts → AISkeleton/AISkeletonText.d.ts} +4 -4
  8. package/es/components/{AiSkeleton/AiSkeletonText.js → AISkeleton/AISkeletonText.js} +3 -3
  9. package/es/components/AISkeleton/index.d.ts +10 -0
  10. package/es/components/Accordion/AccordionItem.js +1 -0
  11. package/es/components/CheckboxGroup/CheckboxGroup.js +1 -1
  12. package/es/components/ComboBox/ComboBox.js +4 -4
  13. package/es/components/ComposedModal/ComposedModal.js +1 -1
  14. package/es/components/DataTable/DataTable.js +1 -1
  15. package/es/components/DatePicker/DatePicker.js +16 -1
  16. package/es/components/DatePickerInput/DatePickerInput.js +1 -1
  17. package/es/components/Dropdown/Dropdown.js +12 -6
  18. package/es/components/FluidMultiSelect/FluidMultiSelect.js +4 -2
  19. package/es/components/Menu/MenuItem.js +45 -63
  20. package/es/components/Modal/Modal.js +1 -1
  21. package/es/components/MultiSelect/FilterableMultiSelect.js +44 -23
  22. package/es/components/MultiSelect/MultiSelect.js +6 -4
  23. package/es/components/NumberInput/NumberInput.js +12 -4
  24. package/es/components/OverflowMenu/OverflowMenu.js +2 -1
  25. package/es/components/OverflowMenu/next/index.js +2 -1
  26. package/es/components/RadioButtonGroup/RadioButtonGroup.js +1 -1
  27. package/es/components/RadioTile/RadioTile.js +1 -1
  28. package/es/components/Select/Select.js +1 -1
  29. package/es/components/Tabs/Tabs.js +3 -3
  30. package/es/components/Tag/DismissibleTag.js +1 -1
  31. package/es/components/Tag/OperationalTag.js +1 -1
  32. package/es/components/Tag/SelectableTag.js +3 -1
  33. package/es/components/Tag/Tag.js +1 -1
  34. package/es/components/TextArea/TextArea.js +1 -1
  35. package/es/components/TextInput/PasswordInput.js +5 -0
  36. package/es/components/TextInput/TextInput.js +1 -1
  37. package/es/components/Tile/Tile.js +2 -2
  38. package/es/components/TreeView/TreeNode.d.ts +150 -0
  39. package/es/components/TreeView/TreeNode.js +22 -15
  40. package/es/components/TreeView/TreeView.d.ts +59 -0
  41. package/es/components/TreeView/TreeView.js +37 -23
  42. package/es/components/TreeView/index.d.ts +11 -0
  43. package/es/components/UIShell/SwitcherItem.d.ts +4 -0
  44. package/es/components/UIShell/SwitcherItem.js +7 -1
  45. package/es/index.d.ts +4 -2
  46. package/es/index.js +6 -6
  47. package/es/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js +143 -0
  48. package/es/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js +39 -0
  49. package/lib/components/{Slug → AILabel}/index.js +49 -37
  50. package/lib/components/{AiSkeleton/AiSkeletonIcon.d.ts → AISkeleton/AISkeletonIcon.d.ts} +4 -4
  51. package/lib/components/{AiSkeleton/AiSkeletonIcon.js → AISkeleton/AISkeletonIcon.js} +5 -5
  52. package/lib/components/{AiSkeleton/AiSkeletonPlaceholder.d.ts → AISkeleton/AISkeletonPlaceholder.d.ts} +4 -4
  53. package/lib/components/{AiSkeleton/AiSkeletonPlaceholder.js → AISkeleton/AISkeletonPlaceholder.js} +5 -5
  54. package/lib/components/{AiSkeleton/AiSkeletonText.d.ts → AISkeleton/AISkeletonText.d.ts} +4 -4
  55. package/lib/components/{AiSkeleton/AiSkeletonText.js → AISkeleton/AISkeletonText.js} +3 -3
  56. package/lib/components/AISkeleton/index.d.ts +10 -0
  57. package/lib/components/Accordion/AccordionItem.js +1 -0
  58. package/lib/components/CheckboxGroup/CheckboxGroup.js +1 -1
  59. package/lib/components/ComboBox/ComboBox.js +4 -4
  60. package/lib/components/ComposedModal/ComposedModal.js +1 -1
  61. package/lib/components/DataTable/DataTable.js +2 -2
  62. package/lib/components/DatePicker/DatePicker.js +15 -0
  63. package/lib/components/DatePickerInput/DatePickerInput.js +1 -1
  64. package/lib/components/Dropdown/Dropdown.js +12 -6
  65. package/lib/components/FluidMultiSelect/FluidMultiSelect.js +4 -2
  66. package/lib/components/Menu/MenuItem.js +44 -62
  67. package/lib/components/Modal/Modal.js +1 -1
  68. package/lib/components/MultiSelect/FilterableMultiSelect.js +43 -22
  69. package/lib/components/MultiSelect/MultiSelect.js +6 -4
  70. package/lib/components/NumberInput/NumberInput.js +12 -4
  71. package/lib/components/OverflowMenu/OverflowMenu.js +2 -1
  72. package/lib/components/OverflowMenu/next/index.js +2 -1
  73. package/lib/components/RadioButtonGroup/RadioButtonGroup.js +1 -1
  74. package/lib/components/RadioTile/RadioTile.js +1 -1
  75. package/lib/components/Select/Select.js +1 -1
  76. package/lib/components/Tabs/Tabs.js +2 -2
  77. package/lib/components/Tag/DismissibleTag.js +1 -1
  78. package/lib/components/Tag/OperationalTag.js +1 -1
  79. package/lib/components/Tag/SelectableTag.js +3 -1
  80. package/lib/components/Tag/Tag.js +1 -1
  81. package/lib/components/TextArea/TextArea.js +1 -1
  82. package/lib/components/TextInput/PasswordInput.js +5 -0
  83. package/lib/components/TextInput/TextInput.js +1 -1
  84. package/lib/components/Tile/Tile.js +2 -2
  85. package/lib/components/TreeView/TreeNode.d.ts +150 -0
  86. package/lib/components/TreeView/TreeNode.js +24 -17
  87. package/lib/components/TreeView/TreeView.d.ts +59 -0
  88. package/lib/components/TreeView/TreeView.js +39 -25
  89. package/lib/components/TreeView/index.d.ts +11 -0
  90. package/lib/components/UIShell/SwitcherItem.d.ts +4 -0
  91. package/lib/components/UIShell/SwitcherItem.js +7 -1
  92. package/lib/index.d.ts +4 -2
  93. package/lib/index.js +20 -14
  94. package/lib/node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js +148 -0
  95. package/lib/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs.js +47 -0
  96. package/package.json +5 -5
  97. package/scss/components/ai-label/_ai-label.scss +9 -0
  98. package/scss/components/ai-label/_index.scss +9 -0
  99. package/es/components/AiSkeleton/index.d.ts +0 -10
  100. package/es/components/DataTable/tools/instanceId.js +0 -20
  101. package/lib/components/AiSkeleton/index.d.ts +0 -10
  102. package/lib/components/DataTable/tools/instanceId.js +0 -24
@@ -562,6 +562,21 @@ const DatePicker = /*#__PURE__*/React__default["default"].forwardRef(function Da
562
562
  }
563
563
  }, [value, prefix]); //eslint-disable-line react-hooks/exhaustive-deps
564
564
 
565
+ React.useEffect(() => {
566
+ if (!calendarRef.current || !startInputField.current) return;
567
+ const handleKeyDown = event => {
568
+ if (match.match(event, keys.Tab) && !event.shiftKey && document.activeElement === endInputField.current && calendarRef.current.isOpen) {
569
+ calendarRef.current.close();
570
+ // Remove focus from endDate calendar input
571
+ document.activeElement instanceof HTMLElement &&
572
+ // this is to fix the TS warning
573
+ document?.activeElement?.blur();
574
+ onCalendarClose(calendarRef.current.selectedDates, '', calendarRef.current, event);
575
+ }
576
+ };
577
+ document.addEventListener('keydown', handleKeyDown, true);
578
+ return () => document.removeEventListener('keydown', handleKeyDown, true);
579
+ }, [calendarRef, startInputField, endInputField, onCalendarClose]);
565
580
  let fluidError;
566
581
  if (isFluid) {
567
582
  if (invalid) {
@@ -107,7 +107,7 @@ const DatePickerInput = /*#__PURE__*/React__default["default"].forwardRef(functi
107
107
 
108
108
  // Slug is always size `mini`
109
109
  let normalizedSlug;
110
- if (slug && slug['type']?.displayName === 'Slug') {
110
+ if (slug && slug['type']?.displayName === 'AILabel') {
111
111
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
112
112
  size: 'mini'
113
113
  });
@@ -23,6 +23,7 @@ require('../FluidForm/FluidForm.js');
23
23
  var FormContext = require('../FluidForm/FormContext.js');
24
24
  var useId = require('../../internal/useId.js');
25
25
  var react = require('@floating-ui/react');
26
+ var floatingUi_core = require('../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs.js');
26
27
  var ListBoxPropTypes = require('../ListBox/ListBoxPropTypes.js');
27
28
 
28
29
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -82,7 +83,8 @@ const Dropdown = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref) =
82
83
  } = _ref;
83
84
  const {
84
85
  refs,
85
- floatingStyles
86
+ floatingStyles,
87
+ middlewareData
86
88
  } = react.useFloating(autoAlign ? {
87
89
  placement: direction,
88
90
  // The floating element is positioned relative to its nearest
@@ -101,15 +103,19 @@ const Dropdown = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref) =
101
103
  width: `${rects.reference.width}px`
102
104
  });
103
105
  }
104
- }), react.flip()],
106
+ }), react.flip(), floatingUi_core.hide()],
105
107
  whileElementsMounted: react.autoUpdate
106
108
  } : {} // When autoAlign is turned off, floating-ui will not be used
107
109
  );
108
110
  React.useEffect(() => {
109
111
  if (autoAlign) {
110
- Object.keys(floatingStyles).forEach(style => {
112
+ const updatedFloatingStyles = {
113
+ ...floatingStyles,
114
+ visibility: middlewareData.hide?.referenceHidden ? 'hidden' : 'visible'
115
+ };
116
+ Object.keys(updatedFloatingStyles).forEach(style => {
111
117
  if (refs.floating.current) {
112
- refs.floating.current.style[style] = floatingStyles[style];
118
+ refs.floating.current.style[style] = updatedFloatingStyles[style];
113
119
  }
114
120
  });
115
121
  }
@@ -270,11 +276,11 @@ const Dropdown = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref) =
270
276
  };
271
277
  const menuProps = React.useMemo(() => getMenuProps({
272
278
  ref: autoAlign ? refs.setFloating : null
273
- }), [autoAlign]);
279
+ }), [autoAlign, getMenuProps, refs.setFloating]);
274
280
 
275
281
  // Slug is always size `mini`
276
282
  let normalizedSlug;
277
- if (slug && slug['type']?.displayName === 'Slug') {
283
+ if (slug && slug['type']?.displayName === 'AILabel') {
278
284
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
279
285
  size: 'mini'
280
286
  });
@@ -63,7 +63,8 @@ FluidMultiSelect.propTypes = {
63
63
  clearSelectionText: PropTypes__default["default"].string,
64
64
  /**
65
65
  * Provide a compare function that is used to determine the ordering of
66
- * options. See 'sortItems' for more control.
66
+ * options. See 'sortItems' for more control. Consider declaring function
67
+ * with `useCallback` to prevent unnecessary re-renders.
67
68
  */
68
69
  compareItems: PropTypes__default["default"].func,
69
70
  /**
@@ -116,7 +117,8 @@ FluidMultiSelect.propTypes = {
116
117
  /**
117
118
  * Helper function passed to downshift that allows the library to render a
118
119
  * given item to a string label. By default, it extracts the `label` field
119
- * from a given item to serve as the item label in the list.
120
+ * from a given item to serve as the item label in the list. Consider
121
+ * declaring function with `useCallback` to prevent unnecessary re-renders.
120
122
  */
121
123
  itemToString: PropTypes__default["default"].func,
122
124
  /**
@@ -13,6 +13,7 @@ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelper
13
13
  var cx = require('classnames');
14
14
  var PropTypes = require('prop-types');
15
15
  var React = require('react');
16
+ var react = require('@floating-ui/react');
16
17
  var iconsReact = require('@carbon/icons-react');
17
18
  var useControllableState = require('../../internal/useControllableState.js');
18
19
  var useMergedRefs = require('../../internal/useMergedRefs.js');
@@ -33,9 +34,6 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
33
34
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
34
35
 
35
36
  var _CaretLeft, _CaretRight;
36
- const hoverIntentDelay = 150; // in ms
37
- const leaveIntentDelay = 300; // in ms
38
-
39
37
  const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRef) {
40
38
  let {
41
39
  children,
@@ -48,19 +46,37 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
48
46
  shortcut,
49
47
  ...rest
50
48
  } = _ref;
49
+ const [submenuOpen, setSubmenuOpen] = React.useState(false);
50
+ const [rtl, setRtl] = React.useState(false);
51
+ const {
52
+ refs,
53
+ floatingStyles,
54
+ context: floatingContext
55
+ } = react.useFloating({
56
+ open: submenuOpen,
57
+ onOpenChange: setSubmenuOpen,
58
+ placement: rtl ? 'left-start' : 'right-start',
59
+ whileElementsMounted: react.autoUpdate,
60
+ middleware: [react.offset({
61
+ mainAxis: -6,
62
+ crossAxis: -6
63
+ })]
64
+ });
65
+ const {
66
+ getReferenceProps,
67
+ getFloatingProps
68
+ } = react.useInteractions([react.useHover(floatingContext, {
69
+ delay: 100,
70
+ enabled: true,
71
+ handleClose: react.safePolygon({
72
+ requireIntent: false
73
+ })
74
+ })]);
51
75
  const prefix = usePrefix.usePrefix();
52
76
  const context = React.useContext(MenuContext.MenuContext);
53
77
  const menuItem = React.useRef(null);
54
- const ref = useMergedRefs.useMergedRefs([forwardRef, menuItem]);
55
- const [boundaries, setBoundaries] = React.useState({
56
- x: -1,
57
- y: -1
58
- });
59
- const [rtl, setRtl] = React.useState(false);
78
+ const ref = useMergedRefs.useMergedRefs([forwardRef, menuItem, refs.setReference]);
60
79
  const hasChildren = Boolean(children);
61
- const [submenuOpen, setSubmenuOpen] = React.useState(false);
62
- const hoverIntentTimeout = React.useRef(null);
63
- const leaveIntentTimeout = React.useRef(null);
64
80
  const isDisabled = disabled && !hasChildren;
65
81
  const isDanger = kind === 'danger' && !hasChildren;
66
82
  function registerItem() {
@@ -76,31 +92,10 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
76
92
  if (!menuItem.current) {
77
93
  return;
78
94
  }
79
- const {
80
- x,
81
- y,
82
- width,
83
- height
84
- } = menuItem.current.getBoundingClientRect();
85
- if (rtl) {
86
- setBoundaries({
87
- x: [-x, x - width],
88
- y: [y, y + height]
89
- });
90
- } else {
91
- setBoundaries({
92
- x: [x, x + width],
93
- y: [y, y + height]
94
- });
95
- }
96
95
  setSubmenuOpen(true);
97
96
  }
98
97
  function closeSubmenu() {
99
98
  setSubmenuOpen(false);
100
- setBoundaries({
101
- x: -1,
102
- y: -1
103
- });
104
99
  }
105
100
  function handleClick(e) {
106
101
  if (!isDisabled) {
@@ -114,27 +109,6 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
114
109
  }
115
110
  }
116
111
  }
117
- function handleMouseEnter() {
118
- if (leaveIntentTimeout.current) {
119
- // When mouse reenters before closing keep sub menu open
120
- clearTimeout(leaveIntentTimeout.current);
121
- leaveIntentTimeout.current = null;
122
- }
123
- hoverIntentTimeout.current = setTimeout(() => {
124
- openSubmenu();
125
- }, hoverIntentDelay);
126
- }
127
- function handleMouseLeave() {
128
- if (hoverIntentTimeout.current) {
129
- clearTimeout(hoverIntentTimeout.current);
130
- // Avoid closing the sub menu as soon as mouse leaves
131
- // prevents accidental closure due to scroll bar
132
- leaveIntentTimeout.current = setTimeout(() => {
133
- closeSubmenu();
134
- menuItem.current?.focus();
135
- }, leaveIntentDelay);
136
- }
137
- }
138
112
  function handleKeyDown(e) {
139
113
  if (hasChildren && match.match(e, keys.ArrowRight)) {
140
114
  openSubmenu();
@@ -179,7 +153,18 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
179
153
  });
180
154
  }
181
155
  }, [iconsAllowed, IconElement, context.state.hasIcons, context]);
182
- return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({
156
+ React.useEffect(() => {
157
+ Object.keys(floatingStyles).forEach(style => {
158
+ if (refs.floating.current && style !== 'position') {
159
+ refs.floating.current.style[style] = floatingStyles[style];
160
+ }
161
+ });
162
+ }, [floatingStyles, refs.floating]);
163
+ return /*#__PURE__*/React__default["default"].createElement(react.FloatingFocusManager, {
164
+ context: floatingContext,
165
+ order: ['reference', 'floating'],
166
+ modal: false
167
+ }, /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({
183
168
  role: "menuitem"
184
169
  }, rest, {
185
170
  ref: ref,
@@ -189,10 +174,8 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
189
174
  "aria-haspopup": hasChildren ?? undefined,
190
175
  "aria-expanded": hasChildren ? submenuOpen : undefined,
191
176
  onClick: handleClick,
192
- onMouseEnter: hasChildren ? handleMouseEnter : undefined,
193
- onMouseLeave: hasChildren ? handleMouseLeave : undefined,
194
177
  onKeyDown: handleKeyDown
195
- }), /*#__PURE__*/React__default["default"].createElement("div", {
178
+ }, getReferenceProps()), /*#__PURE__*/React__default["default"].createElement("div", {
196
179
  className: `${prefix}--menu-item__icon`
197
180
  }, iconsAllowed && IconElement && /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
198
181
  as: "div",
@@ -202,16 +185,15 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(_ref, forwardRe
202
185
  className: `${prefix}--menu-item__shortcut`
203
186
  }, shortcut), hasChildren && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
204
187
  className: `${prefix}--menu-item__shortcut`
205
- }, rtl ? _CaretLeft || (_CaretLeft = /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretLeft, null)) : _CaretRight || (_CaretRight = /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretRight, null))), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, {
188
+ }, rtl ? _CaretLeft || (_CaretLeft = /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretLeft, null)) : _CaretRight || (_CaretRight = /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretRight, null))), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, _rollupPluginBabelHelpers["extends"]({
206
189
  label: label,
207
190
  open: submenuOpen,
208
191
  onClose: () => {
209
192
  closeSubmenu();
210
193
  menuItem.current?.focus();
211
194
  },
212
- x: boundaries.x,
213
- y: boundaries.y
214
- }, children)));
195
+ ref: refs.setFloating
196
+ }, getFloatingProps()), children))));
215
197
  });
216
198
  MenuItem.propTypes = {
217
199
  /**
@@ -240,7 +240,7 @@ const Modal = /*#__PURE__*/React__default["default"].forwardRef(function Modal(_
240
240
 
241
241
  // Slug is always size `sm`
242
242
  let normalizedSlug;
243
- if (slug && slug['type']?.displayName === 'Slug') {
243
+ if (slug && slug['type']?.displayName === 'AILabel') {
244
244
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
245
245
  size: 'sm'
246
246
  });
@@ -176,20 +176,23 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
176
176
  setPrevOpen(open);
177
177
  }
178
178
 
179
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
180
- const sortedItems = sortItems(filterItems(items, {
181
- itemToString: itemToString$1,
182
- inputValue
183
- }), {
184
- selectedItems: {
185
- top: controlledSelectedItems,
186
- fixed: [],
187
- 'top-after-reopen': topItems
188
- }[selectionFeedback],
189
- itemToString: itemToString$1,
190
- compareItems,
191
- locale
192
- });
179
+ // memoize sorted items to reduce unnecessary expensive sort on rerender
180
+ const sortedItems = React.useMemo(() => {
181
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
182
+ return sortItems(filterItems(items, {
183
+ itemToString: itemToString$1,
184
+ inputValue
185
+ }), {
186
+ selectedItems: {
187
+ top: controlledSelectedItems,
188
+ fixed: [],
189
+ 'top-after-reopen': topItems
190
+ }[selectionFeedback],
191
+ itemToString: itemToString$1,
192
+ compareItems,
193
+ locale
194
+ });
195
+ }, [items, inputValue, controlledSelectedItems, topItems, selectionFeedback, itemToString$1, compareItems, locale]);
193
196
  const inline = type === 'inline';
194
197
  const showWarning = !invalid && warn;
195
198
  const wrapperClasses = cx__default["default"](`${prefix}--multi-select__wrapper`, `${prefix}--multi-select--filterable__wrapper`, `${prefix}--list-box__wrapper`, containerClassName, {
@@ -229,9 +232,15 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
229
232
  setTopItems(controlledSelectedItems);
230
233
  }
231
234
  }, [controlledSelectedItems, isOpen, setTopItems]);
235
+ const validateHighlightFocus = () => {
236
+ if (controlledSelectedItems.length > 0) {
237
+ setHighlightedIndex(0);
238
+ }
239
+ };
232
240
  function handleMenuChange(forceIsOpen) {
233
241
  const nextIsOpen = forceIsOpen ?? !isOpen;
234
242
  setIsOpen(nextIsOpen);
243
+ validateHighlightFocus();
235
244
  if (onMenuChange) {
236
245
  onMenuChange(nextIsOpen);
237
246
  }
@@ -249,9 +258,8 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
249
258
  } = Downshift.useCombobox({
250
259
  isOpen,
251
260
  items: sortedItems,
261
+ // defaultHighlightedIndex: 0, // after selection, highlight the first item.
252
262
  itemToString: itemToString$1,
253
- defaultHighlightedIndex: 0,
254
- // after selection, highlight the first item.
255
263
  id,
256
264
  labelId,
257
265
  menuId,
@@ -296,24 +304,37 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
296
304
  return changes;
297
305
  case FunctionToggleMenu:
298
306
  case ToggleButtonClick:
307
+ validateHighlightFocus();
299
308
  if (changes.isOpen && !changes.selectedItem) {
300
309
  return {
301
- ...changes,
302
- highlightedIndex: 0
310
+ ...changes
303
311
  };
304
312
  }
305
- return changes;
313
+ return {
314
+ ...changes,
315
+ highlightedIndex: null
316
+ };
306
317
  case InputChange:
307
318
  if (onInputValueChange) {
308
319
  onInputValueChange(changes.inputValue);
309
320
  }
310
321
  setInputValue(changes.inputValue ?? '');
311
322
  setIsOpen(true);
312
- return changes;
323
+ return {
324
+ ...changes,
325
+ highlightedIndex: 0
326
+ };
313
327
  case InputClick:
328
+ validateHighlightFocus();
329
+ if (changes.isOpen && !changes.selectedItem) {
330
+ return {
331
+ ...changes
332
+ };
333
+ }
314
334
  return {
315
335
  ...changes,
316
- isOpen: false
336
+ isOpen: false,
337
+ highlightedIndex: null
317
338
  };
318
339
  case MenuMouseLeave:
319
340
  return {
@@ -397,7 +418,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
397
418
 
398
419
  // Slug is always size `mini`
399
420
  let normalizedSlug;
400
- if (slug && slug['type']?.displayName === 'Slug') {
421
+ if (slug && slug['type']?.displayName === 'AILabel') {
401
422
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
402
423
  size: 'mini'
403
424
  });
@@ -322,7 +322,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
322
322
  setIsOpenWrapper(changes.isOpen || false);
323
323
  return {
324
324
  ...changes,
325
- highlightedIndex: 0
325
+ highlightedIndex: controlledSelectedItems.length > 0 ? 0 : undefined
326
326
  };
327
327
  case ItemClick:
328
328
  setHighlightedIndex(changes.selectedItem);
@@ -397,7 +397,7 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
397
397
 
398
398
  // Slug is always size `mini`
399
399
  let normalizedSlug;
400
- if (slug && slug['type']?.displayName === 'Slug') {
400
+ if (slug && slug['type']?.displayName === 'AILabel') {
401
401
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
402
402
  size: 'mini'
403
403
  });
@@ -517,7 +517,8 @@ MultiSelect.propTypes = {
517
517
  clearSelectionText: PropTypes__default["default"].string,
518
518
  /**
519
519
  * Provide a compare function that is used to determine the ordering of
520
- * options. See 'sortItems' for more control.
520
+ * options. See 'sortItems' for more control. Consider
521
+ * declaring function with `useCallback` to prevent unnecessary re-renders.
521
522
  */
522
523
  compareItems: PropTypes__default["default"].func,
523
524
  /**
@@ -571,7 +572,8 @@ MultiSelect.propTypes = {
571
572
  /**
572
573
  * Helper function passed to downshift that allows the library to render a
573
574
  * given item to a string label. By default, it extracts the `label` field
574
- * from a given item to serve as the item label in the list.
575
+ * from a given item to serve as the item label in the list. Consider
576
+ * declaring function with `useCallback` to prevent unnecessary re-renders.
575
577
  */
576
578
  itemToString: PropTypes__default["default"].func,
577
579
  /**
@@ -173,9 +173,17 @@ const NumberInput = /*#__PURE__*/React__default["default"].forwardRef(function N
173
173
  const Icon = normalizedProps.icon;
174
174
  function handleStepperClick(event, direction) {
175
175
  if (inputRef.current) {
176
- direction === 'up' ? inputRef.current.stepUp() : inputRef.current.stepDown();
176
+ const currentValue = Number(inputRef.current.value);
177
+ let newValue = direction === 'up' ? currentValue + step : currentValue - step;
178
+ if (min !== undefined) {
179
+ newValue = Math.max(newValue, min);
180
+ }
181
+ if (max !== undefined) {
182
+ newValue = Math.min(newValue, max);
183
+ }
184
+ const currentInputValue = inputRef.current ? inputRef.current.value : '';
177
185
  const state = {
178
- value: allowEmpty && inputRef.current.value === '' ? '' : Number(inputRef.current.value),
186
+ value: allowEmpty && currentInputValue === '' && step === 0 ? '' : newValue,
179
187
  direction: direction
180
188
  };
181
189
  setValue(state.value);
@@ -190,7 +198,7 @@ const NumberInput = /*#__PURE__*/React__default["default"].forwardRef(function N
190
198
 
191
199
  // Slug is always size `mini`
192
200
  let normalizedSlug;
193
- if (slug && slug['type']?.displayName === 'Slug') {
201
+ if (slug && slug['type']?.displayName === 'AILabel') {
194
202
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
195
203
  size: 'mini'
196
204
  });
@@ -198,7 +206,7 @@ const NumberInput = /*#__PURE__*/React__default["default"].forwardRef(function N
198
206
 
199
207
  // Need to update the internal value when the revert button is clicked
200
208
  let isRevertActive;
201
- if (slug && slug['type']?.displayName === 'Slug') {
209
+ if (slug && slug['type']?.displayName === 'AILabel') {
202
210
  isRevertActive = normalizedSlug.props.revertActive;
203
211
  }
204
212
  React.useEffect(() => {
@@ -416,7 +416,8 @@ class OverflowMenu extends React__default["default"].Component {
416
416
  id: id,
417
417
  ref: mergeRefs["default"](this._triggerRef, ref),
418
418
  size: size,
419
- label: iconDescription
419
+ label: iconDescription,
420
+ kind: "ghost"
420
421
  }), /*#__PURE__*/React__default["default"].createElement(IconElement, iconProps)), open && this.state.hasMountedTrigger && wrappedMenuBody));
421
422
  }
422
423
  }
@@ -106,7 +106,8 @@ const OverflowMenu = /*#__PURE__*/React__default["default"].forwardRef(function
106
106
  onMouseDown: handleMousedown,
107
107
  ref: floatingRef,
108
108
  label: label,
109
- align: tooltipAlignment
109
+ align: tooltipAlignment,
110
+ kind: "ghost"
110
111
  }, /*#__PURE__*/React__default["default"].createElement(IconElement, {
111
112
  className: `${prefix}--overflow-menu__icon`
112
113
  })), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, {
@@ -111,7 +111,7 @@ const RadioButtonGroup = /*#__PURE__*/React__default["default"].forwardRef((prop
111
111
 
112
112
  // Slug is always size `mini`
113
113
  let normalizedSlug;
114
- if (slug && slug['type']?.displayName === 'Slug') {
114
+ if (slug && slug['type']?.displayName === 'AILabel') {
115
115
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
116
116
  size: 'mini',
117
117
  kind: 'default'
@@ -81,7 +81,7 @@ const RadioTile = /*#__PURE__*/React__default["default"].forwardRef(function Rad
81
81
 
82
82
  // Slug is always size `xs`
83
83
  let normalizedSlug;
84
- if (slug && slug['type']?.displayName === 'Slug') {
84
+ if (slug && slug['type']?.displayName === 'AILabel') {
85
85
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
86
86
  size: 'xs'
87
87
  });
@@ -135,7 +135,7 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
135
135
 
136
136
  // Slug is always size `mini`
137
137
  let normalizedSlug;
138
- if (slug && slug['type']?.displayName === 'Slug') {
138
+ if (slug && slug['type']?.displayName === 'AILabel') {
139
139
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
140
140
  size: 'mini'
141
141
  });
@@ -798,7 +798,7 @@ const Tab = /*#__PURE__*/React.forwardRef(function Tab(_ref8, forwardRef) {
798
798
  };
799
799
  useEvent.useEvent(dismissIconRef, 'mouseover', onDismissIconMouseEnter);
800
800
  useEvent.useEvent(dismissIconRef, 'mouseleave', onDismissIconMouseLeave);
801
- React.useLayoutEffect(() => {
801
+ useIsomorphicEffect["default"](() => {
802
802
  function handler() {
803
803
  const elementTabId = document.getElementById(`${id}`) || tabRef.current;
804
804
  if (elementTabId?.closest(`.${prefix}--tabs--vertical`)) {
@@ -1139,7 +1139,7 @@ function TabPanels(_ref11) {
1139
1139
  const prefix = usePrefix.usePrefix();
1140
1140
  const refs = React.useRef([]);
1141
1141
  const hiddenStates = React.useRef([]);
1142
- React.useLayoutEffect(() => {
1142
+ useIsomorphicEffect["default"](() => {
1143
1143
  const tabContainer = refs.current[0]?.previousElementSibling;
1144
1144
  const isVertical = tabContainer?.classList.contains(`${prefix}--tabs--vertical`);
1145
1145
  const parentHasHeight = tabContainer?.parentElement?.style.height;
@@ -60,7 +60,7 @@ const DismissibleTag = _ref => {
60
60
  }
61
61
  };
62
62
  let normalizedSlug;
63
- if (slug && slug['type']?.displayName === 'Slug') {
63
+ if (slug && slug['type']?.displayName === 'AILabel') {
64
64
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
65
65
  size: 'sm',
66
66
  kind: 'inline'
@@ -62,7 +62,7 @@ const OperationalTag = _ref => {
62
62
  setIsEllipsisApplied(isEllipsisActive.isEllipsisActive(newElement));
63
63
  }, [prefix, tagRef]);
64
64
  let normalizedSlug;
65
- if (slug && slug['type']?.displayName === 'Slug') {
65
+ if (slug && slug['type']?.displayName === 'AILabel') {
66
66
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
67
67
  size: 'sm',
68
68
  kind: 'inline'
@@ -53,7 +53,7 @@ const SelectableTag = _ref => {
53
53
  setIsEllipsisApplied(isEllipsisActive.isEllipsisActive(newElement));
54
54
  }, [prefix, tagRef]);
55
55
  let normalizedSlug;
56
- if (slug && slug['type']?.displayName === 'Slug') {
56
+ if (slug && slug['type']?.displayName === 'AILabel') {
57
57
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
58
58
  size: 'sm',
59
59
  kind: 'inline'
@@ -75,6 +75,7 @@ const SelectableTag = _ref => {
75
75
  leaveDelayMs: 0,
76
76
  onMouseEnter: () => false
77
77
  }, /*#__PURE__*/React__default["default"].createElement(Tag["default"], _rollupPluginBabelHelpers["extends"]({
78
+ "aria-pressed": selectedTag,
78
79
  ref: tagRef,
79
80
  slug: slug,
80
81
  size: size,
@@ -89,6 +90,7 @@ const SelectableTag = _ref => {
89
90
  }, text), normalizedSlug));
90
91
  }
91
92
  return /*#__PURE__*/React__default["default"].createElement(Tag["default"], _rollupPluginBabelHelpers["extends"]({
93
+ "aria-pressed": selectedTag,
92
94
  ref: tagRef,
93
95
  slug: slug,
94
96
  size: size,
@@ -99,7 +99,7 @@ const Tag = /*#__PURE__*/React__default["default"].forwardRef(function Tag(_ref,
99
99
 
100
100
  // Slug is always size `md` and `inline`
101
101
  let normalizedSlug;
102
- if (slug && slug['type']?.displayName === 'Slug' && !isInteractiveTag) {
102
+ if (slug && slug['type']?.displayName === 'AILabel' && !isInteractiveTag) {
103
103
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
104
104
  size: 'sm',
105
105
  kind: 'inline'
@@ -265,7 +265,7 @@ const TextArea = /*#__PURE__*/React__default["default"].forwardRef((props, forwa
265
265
 
266
266
  // Slug is always size `mini`
267
267
  let normalizedSlug;
268
- if (slug && slug['type']?.displayName === 'Slug') {
268
+ if (slug && slug['type']?.displayName === 'AILabel') {
269
269
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
270
270
  size: 'mini'
271
271
  });
@@ -158,6 +158,11 @@ const PasswordInput = /*#__PURE__*/React__default["default"].forwardRef(function
158
158
  if (tooltipPosition === 'right' || tooltipPosition === 'left') {
159
159
  align = tooltipPosition;
160
160
  }
161
+ if (!hidePasswordLabel || hidePasswordLabel.trim() === '') {
162
+ console.warn('Warning: The "hidePasswordLabel" should not be blank.');
163
+ } else if (!showPasswordLabel || showPasswordLabel.trim() === '') {
164
+ console.warn('Warning: The "showPasswordLabel" should not be blank.');
165
+ }
161
166
  const input = /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("input", _rollupPluginBabelHelpers["extends"]({}, util.textInputProps({
162
167
  sharedTextInputProps,
163
168
  invalid: normalizedProps.invalid,
@@ -191,7 +191,7 @@ const TextInput = /*#__PURE__*/React__default["default"].forwardRef(function Tex
191
191
 
192
192
  // Slug is always size `mini`
193
193
  let normalizedSlug;
194
- if (slug && slug['type']?.displayName === 'Slug') {
194
+ if (slug && slug['type']?.displayName === 'AILabel') {
195
195
  normalizedSlug = /*#__PURE__*/React__default["default"].cloneElement(slug, {
196
196
  size: 'mini'
197
197
  });