@carbon/react 1.43.0-rc.0 → 1.44.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 (46) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +1161 -1001
  2. package/es/components/ComboBox/ComboBox.js +12 -0
  3. package/es/components/ComboButton/index.js +2 -1
  4. package/es/components/ComposedModal/ComposedModal.d.ts +3 -3
  5. package/es/components/ComposedModal/ComposedModal.js +3 -3
  6. package/es/components/ContextMenu/useContextMenu.js +2 -1
  7. package/es/components/DataTableSkeleton/DataTableSkeleton.js +1 -1
  8. package/es/components/Dropdown/Dropdown.js +4 -1
  9. package/es/components/Link/Link.d.ts +5 -0
  10. package/es/components/Link/Link.js +9 -2
  11. package/es/components/Menu/Menu.js +14 -0
  12. package/es/components/Menu/MenuContext.js +1 -0
  13. package/es/components/Menu/MenuItem.js +19 -4
  14. package/es/components/MenuButton/index.js +3 -1
  15. package/es/components/Slug/index.js +1 -1
  16. package/es/components/UIShell/SideNav.js +1 -1
  17. package/es/components/UIShell/Switcher.d.ts +38 -0
  18. package/es/components/UIShell/Switcher.js +14 -13
  19. package/es/components/UIShell/SwitcherDivider.d.ts +9 -0
  20. package/es/components/UIShell/SwitcherDivider.js +4 -5
  21. package/es/components/UIShell/SwitcherItem.d.ts +49 -0
  22. package/es/components/UIShell/SwitcherItem.js +13 -17
  23. package/es/prop-types/tools/getDisplayName.js +34 -0
  24. package/lib/components/ComboBox/ComboBox.js +12 -0
  25. package/lib/components/ComboButton/index.js +2 -1
  26. package/lib/components/ComposedModal/ComposedModal.d.ts +3 -3
  27. package/lib/components/ComposedModal/ComposedModal.js +3 -3
  28. package/lib/components/ContextMenu/useContextMenu.js +2 -1
  29. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +1 -1
  30. package/lib/components/Dropdown/Dropdown.js +4 -1
  31. package/lib/components/Link/Link.d.ts +5 -0
  32. package/lib/components/Link/Link.js +9 -2
  33. package/lib/components/Menu/Menu.js +14 -0
  34. package/lib/components/Menu/MenuContext.js +1 -0
  35. package/lib/components/Menu/MenuItem.js +19 -4
  36. package/lib/components/MenuButton/index.js +3 -1
  37. package/lib/components/Slug/index.js +1 -1
  38. package/lib/components/UIShell/SideNav.js +1 -1
  39. package/lib/components/UIShell/Switcher.d.ts +38 -0
  40. package/lib/components/UIShell/Switcher.js +13 -12
  41. package/lib/components/UIShell/SwitcherDivider.d.ts +9 -0
  42. package/lib/components/UIShell/SwitcherDivider.js +4 -5
  43. package/lib/components/UIShell/SwitcherItem.d.ts +49 -0
  44. package/lib/components/UIShell/SwitcherItem.js +12 -16
  45. package/lib/prop-types/tools/getDisplayName.js +38 -0
  46. package/package.json +3 -3
@@ -362,6 +362,18 @@ const ComboBox = /*#__PURE__*/React.forwardRef((props, ref) => {
362
362
  if (match.match(event, keys.End) && event.code !== 'Numpad1') {
363
363
  event.target.setSelectionRange(event.target.value.length, event.target.value.length);
364
364
  }
365
+ if (event.altKey && event.key == 'ArrowDown') {
366
+ event.preventDownshiftDefault = true;
367
+ if (!isOpen) {
368
+ toggleMenu();
369
+ }
370
+ }
371
+ if (event.altKey && event.key == 'ArrowUp') {
372
+ event.preventDownshiftDefault = true;
373
+ if (isOpen) {
374
+ toggleMenu();
375
+ }
376
+ }
365
377
  }
366
378
  });
367
379
  const handleFocus = evt => {
@@ -78,7 +78,7 @@ const ComboButton = /*#__PURE__*/React__default["default"].forwardRef(function C
78
78
  }
79
79
  }
80
80
  function handleOpen() {
81
- menuRef.current.style.width = `${width}px`;
81
+ menuRef.current.style.inlineSize = `${width}px`;
82
82
  }
83
83
  const containerClasses = cx__default["default"](`${prefix}--combo-button__container`, `${prefix}--combo-button__container--${size}`, {
84
84
  [`${prefix}--combo-button__container--open`]: open
@@ -110,6 +110,7 @@ const ComboButton = /*#__PURE__*/React__default["default"].forwardRef(function C
110
110
  ref: menuRef,
111
111
  id: id,
112
112
  label: t('carbon.combo-button.additional-actions'),
113
+ mode: "basic",
113
114
  size: size,
114
115
  open: open,
115
116
  onClose: handleClose,
@@ -4,7 +4,7 @@ export interface ModalBodyProps extends HTMLAttributes<HTMLDivElement> {
4
4
  children?: ReactNode;
5
5
  /**
6
6
  * Provide whether the modal content has a form element.
7
- * If `true` is used here, non-form child content should have `bx--modal-content__regular-content` class.
7
+ * If `true` is used here, non-form child content should have `cds--modal-content__regular-content` class.
8
8
  */
9
9
  hasForm?: boolean;
10
10
  /**
@@ -15,11 +15,11 @@ export interface ModalBodyProps extends HTMLAttributes<HTMLDivElement> {
15
15
  export declare const ModalBody: React.ForwardRefExoticComponent<ModalBodyProps & React.RefAttributes<HTMLDivElement>>;
16
16
  export interface ComposedModalProps extends HTMLAttributes<HTMLDivElement> {
17
17
  /**
18
- * Specify the aria-label for bx--modal-container
18
+ * Specify the aria-label for cds--modal-container
19
19
  */
20
20
  'aria-label'?: string;
21
21
  /**
22
- * Specify the aria-labelledby for bx--modal-container
22
+ * Specify the aria-labelledby for cds--modal-container
23
23
  */
24
24
  'aria-labelledby'?: string;
25
25
  /**
@@ -66,7 +66,7 @@ ModalBody.propTypes = {
66
66
  className: PropTypes__default["default"].string,
67
67
  /**
68
68
  * Provide whether the modal content has a form element.
69
- * If `true` is used here, non-form child content should have `bx--modal-content__regular-content` class.
69
+ * If `true` is used here, non-form child content should have `cds--modal-content__regular-content` class.
70
70
  */
71
71
  hasForm: PropTypes__default["default"].bool,
72
72
  /**
@@ -241,11 +241,11 @@ const ComposedModal = /*#__PURE__*/React__default["default"].forwardRef(function
241
241
  });
242
242
  ComposedModal.propTypes = {
243
243
  /**
244
- * Specify the aria-label for bx--modal-container
244
+ * Specify the aria-label for cds--modal-container
245
245
  */
246
246
  ['aria-label']: PropTypes__default["default"].string,
247
247
  /**
248
- * Specify the aria-labelledby for bx--modal-container
248
+ * Specify the aria-labelledby for cds--modal-container
249
249
  */
250
250
  ['aria-labelledby']: PropTypes__default["default"].string,
251
251
  /**
@@ -44,7 +44,8 @@ function useContextMenu() {
44
44
  open,
45
45
  x: position[0],
46
46
  y: position[1],
47
- onClose
47
+ onClose,
48
+ mode: 'full'
48
49
  };
49
50
  }
50
51
 
@@ -73,7 +73,7 @@ const DataTableSkeleton = _ref => {
73
73
  }, rest), /*#__PURE__*/React__default["default"].createElement("thead", null, /*#__PURE__*/React__default["default"].createElement("tr", null, columnsArray.map(i => /*#__PURE__*/React__default["default"].createElement("th", {
74
74
  key: i
75
75
  }, headers ? /*#__PURE__*/React__default["default"].createElement("div", {
76
- className: "bx--table-header-label"
76
+ className: "cds--table-header-label"
77
77
  }, headers[i]?.header) : _span2 || (_span2 = /*#__PURE__*/React__default["default"].createElement("span", null)))))), /*#__PURE__*/React__default["default"].createElement("tbody", null, rows)));
78
78
  };
79
79
  DataTableSkeleton.propTypes = {
@@ -287,6 +287,9 @@ const Dropdown = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref) =
287
287
  item,
288
288
  index: index$1
289
289
  });
290
+ if (item !== null && typeof item === 'object' && Object.prototype.hasOwnProperty.call(item, 'id')) {
291
+ itemProps.id = item['id'];
292
+ }
290
293
  const title = isObject && 'text' in item && itemToElement ? item.text : itemToString(item);
291
294
  return /*#__PURE__*/React__default["default"].createElement(index["default"].MenuItem, _rollupPluginBabelHelpers["extends"]({
292
295
  key: itemProps.id,
@@ -314,7 +317,7 @@ Dropdown.propTypes = {
314
317
  */
315
318
  ariaLabel: deprecate["default"](PropTypes__default["default"].string, 'This prop syntax has been deprecated. Please use the new `aria-label`.'),
316
319
  /**
317
- * Provide a custom className to be applied on the bx--dropdown node
320
+ * Provide a custom className to be applied on the cds--dropdown node
318
321
  */
319
322
  className: PropTypes__default["default"].string,
320
323
  /**
@@ -6,6 +6,11 @@
6
6
  */
7
7
  import React, { AnchorHTMLAttributes, AriaAttributes, ComponentType, HTMLAttributeAnchorTarget } from 'react';
8
8
  export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
9
+ /**
10
+ * Provide a custom element or component to render the top-level node for the
11
+ * component.
12
+ */
13
+ as?: string | undefined;
9
14
  /**
10
15
  * @description Indicates the element that represents the
11
16
  * current item within a container or set of related
@@ -23,6 +23,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
23
23
 
24
24
  const Link = /*#__PURE__*/React__default["default"].forwardRef(function Link(_ref, ref) {
25
25
  let {
26
+ as: BaseComponent,
26
27
  children,
27
28
  className: customClassName,
28
29
  href,
@@ -43,7 +44,7 @@ const Link = /*#__PURE__*/React__default["default"].forwardRef(function Link(_re
43
44
  });
44
45
  const rel = target === '_blank' ? 'noopener' : undefined;
45
46
  const linkProps = {
46
- className,
47
+ className: BaseComponent ? undefined : className,
47
48
  rel,
48
49
  target
49
50
  };
@@ -56,7 +57,8 @@ const Link = /*#__PURE__*/React__default["default"].forwardRef(function Link(_re
56
57
  linkProps.role = 'link';
57
58
  linkProps['aria-disabled'] = true;
58
59
  }
59
- return /*#__PURE__*/React__default["default"].createElement("a", _rollupPluginBabelHelpers["extends"]({
60
+ const BaseComponentAsAny = BaseComponent ?? 'a';
61
+ return /*#__PURE__*/React__default["default"].createElement(BaseComponentAsAny, _rollupPluginBabelHelpers["extends"]({
60
62
  ref: ref
61
63
  }, linkProps, rest), children, !inline && Icon && /*#__PURE__*/React__default["default"].createElement("div", {
62
64
  className: `${prefix}--link__icon`
@@ -64,6 +66,11 @@ const Link = /*#__PURE__*/React__default["default"].forwardRef(function Link(_re
64
66
  });
65
67
  Link.displayName = 'Link';
66
68
  Link.propTypes = {
69
+ /**
70
+ * Provide a custom element or component to render the top-level node for the
71
+ * component.
72
+ */
73
+ as: PropTypes__default["default"].string,
67
74
  /**
68
75
  * Provide the content for the Link
69
76
  */
@@ -16,6 +16,7 @@ var React = require('react');
16
16
  var ReactDOM = require('react-dom');
17
17
  var useMergedRefs = require('../../internal/useMergedRefs.js');
18
18
  var usePrefix = require('../../internal/usePrefix.js');
19
+ var warning = require('../../internal/warning.js');
19
20
  var MenuContext = require('./MenuContext.js');
20
21
  var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
21
22
  var match = require('../../internal/keyboard/match.js');
@@ -34,6 +35,7 @@ const Menu = /*#__PURE__*/React__default["default"].forwardRef(function Menu(_re
34
35
  children,
35
36
  className,
36
37
  label,
38
+ mode = 'full',
37
39
  onClose,
38
40
  onOpen,
39
41
  open,
@@ -47,10 +49,14 @@ const Menu = /*#__PURE__*/React__default["default"].forwardRef(function Menu(_re
47
49
  const focusReturn = React.useRef(null);
48
50
  const context = React.useContext(MenuContext.MenuContext);
49
51
  const isRoot = context.state.isRoot;
52
+ if (context.state.mode === 'basic' && !isRoot) {
53
+ process.env.NODE_ENV !== "production" ? warning.warning(false, 'Nested menus are not supported when the menu is in "basic" mode.') : void 0;
54
+ }
50
55
  const menuSize = isRoot ? size : context.state.size;
51
56
  const [childState, childDispatch] = React.useReducer(MenuContext.menuReducer, {
52
57
  ...context.state,
53
58
  isRoot: false,
59
+ mode,
54
60
  size,
55
61
  requestCloseRoot: isRoot ? handleClose : context.state.requestCloseRoot
56
62
  });
@@ -255,6 +261,14 @@ Menu.propTypes = {
255
261
  * A label describing the Menu.
256
262
  */
257
263
  label: PropTypes__default["default"].string,
264
+ /**
265
+ * The mode of this menu. Defaults to full.
266
+ * `full` supports nesting and selectable menu items, but no icons.
267
+ * `basic` supports icons but no nesting or selectable menu items.
268
+ *
269
+ * **This prop is not intended for use and will be set by the respective implementation (like useContextMenu, MenuButton, and ComboButton).**
270
+ */
271
+ mode: PropTypes__default["default"].oneOf(['full', 'basic']),
258
272
  /**
259
273
  * Provide an optional function to be called when the Menu should be closed.
260
274
  */
@@ -17,6 +17,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
17
 
18
18
  const menuDefaultState = {
19
19
  isRoot: true,
20
+ mode: 'full',
20
21
  hasIcons: false,
21
22
  size: null,
22
23
  items: [],
@@ -17,6 +17,7 @@ var iconsReact = require('@carbon/icons-react');
17
17
  var useControllableState = require('../../internal/useControllableState.js');
18
18
  var useMergedRefs = require('../../internal/useMergedRefs.js');
19
19
  var usePrefix = require('../../internal/usePrefix.js');
20
+ var warning = require('../../internal/warning.js');
20
21
  var Menu = require('./Menu.js');
21
22
  var MenuContext = require('./MenuContext.js');
22
23
  require('../Text/index.js');
@@ -153,6 +154,14 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
153
154
  setRtl(false);
154
155
  }
155
156
  }, [direction]);
157
+ const iconsAllowed = context.state.mode === 'basic' || rest.role === 'menuitemcheckbox' || rest.role === 'menuitemradio';
158
+ React.useEffect(() => {
159
+ if (iconsAllowed && IconElement && !context.state.hasIcons) {
160
+ context.dispatch({
161
+ type: 'enableIcons'
162
+ });
163
+ }
164
+ }, [iconsAllowed, IconElement, context.state.hasIcons, context]);
156
165
  return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({
157
166
  role: "menuitem"
158
167
  }, rest, {
@@ -168,7 +177,7 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
168
177
  onKeyDown: handleKeyDown
169
178
  }), /*#__PURE__*/React__default["default"].createElement("div", {
170
179
  className: `${prefix}--menu-item__icon`
171
- }, IconElement && /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
180
+ }, iconsAllowed && IconElement && /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(Text.Text, {
172
181
  as: "div",
173
182
  className: `${prefix}--menu-item__label`
174
183
  }, label), shortcut && !hasChildren && /*#__PURE__*/React__default["default"].createElement("div", {
@@ -212,7 +221,7 @@ MenuItem.propTypes = {
212
221
  */
213
222
  onClick: PropTypes__default["default"].func,
214
223
  /**
215
- * This prop is not intended for use. The only supported icons are Checkmarks to depict single- and multi-selects. This prop is used by MenuItemSelectable and MenuItemRadioGroup automatically.
224
+ * Only applicable if the parent menu is in `basic` mode. Sets the menu item's icon.
216
225
  */
217
226
  renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object]),
218
227
  /**
@@ -231,6 +240,9 @@ const MenuItemSelectable = /*#__PURE__*/React__default["default"].forwardRef(fun
231
240
  } = _ref2;
232
241
  const prefix = usePrefix.usePrefix();
233
242
  const context = React.useContext(MenuContext.MenuContext);
243
+ if (context.state.mode === 'basic') {
244
+ process.env.NODE_ENV !== "production" ? warning.warning(false, 'MenuItemSelectable is not supported when the menu is in "basic" mode.') : void 0;
245
+ }
234
246
  const [checked, setChecked] = useControllableState.useControllableState({
235
247
  value: selected,
236
248
  onChange,
@@ -256,7 +268,7 @@ const MenuItemSelectable = /*#__PURE__*/React__default["default"].forwardRef(fun
256
268
  className: classNames,
257
269
  role: "menuitemcheckbox",
258
270
  "aria-checked": checked,
259
- renderIcon: checked && iconsReact.Checkmark,
271
+ renderIcon: checked ? iconsReact.Checkmark : undefined,
260
272
  onClick: handleClick
261
273
  }));
262
274
  });
@@ -328,6 +340,9 @@ const MenuItemRadioGroup = /*#__PURE__*/React__default["default"].forwardRef(fun
328
340
  } = _ref4;
329
341
  const prefix = usePrefix.usePrefix();
330
342
  const context = React.useContext(MenuContext.MenuContext);
343
+ if (context.state.mode === 'basic') {
344
+ process.env.NODE_ENV !== "production" ? warning.warning(false, 'MenuItemRadioGroup is not supported when the menu is in "basic" mode.') : void 0;
345
+ }
331
346
  const [selection, setSelection] = useControllableState.useControllableState({
332
347
  value: selectedItem,
333
348
  onChange,
@@ -359,7 +374,7 @@ const MenuItemRadioGroup = /*#__PURE__*/React__default["default"].forwardRef(fun
359
374
  label: itemToString(item),
360
375
  role: "menuitemradio",
361
376
  "aria-checked": item === selection,
362
- renderIcon: item === selection && iconsReact.Checkmark,
377
+ renderIcon: item === selection ? iconsReact.Checkmark : undefined,
363
378
  onClick: e => {
364
379
  handleClick(item, e);
365
380
  }
@@ -67,6 +67,7 @@ const MenuButton = /*#__PURE__*/React__default["default"].forwardRef(function Me
67
67
  function handleOpen() {
68
68
  menuRef.current.style.inlineSize = `${width}px`;
69
69
  }
70
+ const containerClasses = cx__default["default"](`${prefix}--menu-button__container`, className);
70
71
  const triggerClasses = cx__default["default"](`${prefix}--menu-button__trigger`, {
71
72
  [`${prefix}--menu-button__trigger--open`]: open
72
73
  });
@@ -74,7 +75,7 @@ const MenuButton = /*#__PURE__*/React__default["default"].forwardRef(function Me
74
75
  return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, rest, {
75
76
  ref: ref,
76
77
  "aria-owns": open ? id : null,
77
- className: className
78
+ className: containerClasses
78
79
  }), /*#__PURE__*/React__default["default"].createElement(Button["default"], {
79
80
  className: triggerClasses,
80
81
  size: size,
@@ -90,6 +91,7 @@ const MenuButton = /*#__PURE__*/React__default["default"].forwardRef(function Me
90
91
  ref: menuRef,
91
92
  id: id,
92
93
  label: label,
94
+ mode: "basic",
93
95
  size: size,
94
96
  open: open,
95
97
  onClose: handleClose,
@@ -113,7 +113,7 @@ const Slug = /*#__PURE__*/React__default["default"].forwardRef(function Slug(_re
113
113
  onRevertClick(evt);
114
114
  }
115
115
  };
116
- const ariaLabel = `${aiText} - ${slugLabel}`;
116
+ const ariaLabel = !aiTextLabel ? `${aiText} - ${slugLabel}` : `${aiText} - ${aiTextLabel}`;
117
117
  return /*#__PURE__*/React__default["default"].createElement("div", {
118
118
  className: slugClasses,
119
119
  ref: ref,
@@ -180,7 +180,7 @@ function SideNavRenderFunction(_ref, ref) {
180
180
  tabIndex: -1,
181
181
  ref: navRef,
182
182
  className: `${prefix}--side-nav__navigation ${className}`,
183
- inert: !isRail && (expanded || isLg ? undefined : -1)
183
+ inert: !isRail ? expanded || isLg ? undefined : -1 : undefined
184
184
  }, accessibilityLabel, eventHandlers, other), childrenToRender));
185
185
  }
186
186
  const SideNav = /*#__PURE__*/React__default["default"].forwardRef(SideNavRenderFunction);
@@ -0,0 +1,38 @@
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
+ * Copyright IBM Corp. 2016, 2023
9
+ *
10
+ * This source code is licensed under the Apache-2.0 license found in the
11
+ * LICENSE file in the root directory of this source tree.
12
+ */
13
+ import React, { ReactNode } from 'react';
14
+ interface BaseSwitcherProps {
15
+ /**
16
+ * expects to receive <SwitcherItem />
17
+ */
18
+ children: ReactNode;
19
+ /**
20
+ * Optionally provide a custom class to apply to the underlying `<ul>` node
21
+ */
22
+ className?: string;
23
+ /**
24
+ * Specify whether the panel is expanded
25
+ */
26
+ expanded?: boolean;
27
+ }
28
+ interface SwitcherWithAriaLabel extends BaseSwitcherProps {
29
+ 'aria-label': string;
30
+ 'aria-labelledby'?: never;
31
+ }
32
+ interface SwitcherWithAriaLabelledBy extends BaseSwitcherProps {
33
+ 'aria-label'?: never;
34
+ 'aria-labelledby': string;
35
+ }
36
+ type SwitcherProps = SwitcherWithAriaLabel | SwitcherWithAriaLabelledBy;
37
+ declare const Switcher: React.ForwardRefExoticComponent<SwitcherProps & React.RefAttributes<HTMLUListElement>>;
38
+ export default Switcher;
@@ -12,10 +12,11 @@ Object.defineProperty(exports, '__esModule', { value: true });
12
12
  var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
13
13
  var React = require('react');
14
14
  var cx = require('classnames');
15
- var PropTypes = require('prop-types');
16
- var AriaPropTypes = require('../../prop-types/AriaPropTypes.js');
17
15
  var usePrefix = require('../../internal/usePrefix.js');
18
16
  var useMergedRefs = require('../../internal/useMergedRefs.js');
17
+ var PropTypes = require('prop-types');
18
+ var AriaPropTypes = require('../../prop-types/AriaPropTypes.js');
19
+ var getDisplayName = require('../../prop-types/tools/getDisplayName.js');
19
20
 
20
21
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
21
22
 
@@ -23,7 +24,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
23
24
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
24
25
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
25
26
 
26
- const Switcher = /*#__PURE__*/React__default["default"].forwardRef(function Switcher(props, forwardRef) {
27
+ const Switcher = /*#__PURE__*/React.forwardRef(function Switcher(props, forwardRef) {
27
28
  const switcherRef = React.useRef(null);
28
29
  const ref = useMergedRefs.useMergedRefs([switcherRef, forwardRef]);
29
30
  const prefix = usePrefix.usePrefix();
@@ -39,7 +40,7 @@ const Switcher = /*#__PURE__*/React__default["default"].forwardRef(function Swit
39
40
  'aria-labelledby': ariaLabelledBy
40
41
  };
41
42
  const className = cx__default["default"](`${prefix}--switcher`, {
42
- [customClassName]: !!customClassName
43
+ [customClassName || '']: !!customClassName
43
44
  });
44
45
  const handleSwitcherItemFocus = _ref => {
45
46
  let {
@@ -64,13 +65,14 @@ const Switcher = /*#__PURE__*/React__default["default"].forwardRef(function Swit
64
65
  return enabledIndices[nextIndex];
65
66
  }
66
67
  })();
67
- const switcherItem = switcherRef.current.children[nextValidIndex].children[0];
68
- switcherItem?.focus();
68
+ const switcherItem = switcherRef.current?.children[nextValidIndex]?.children[0];
69
+ if (switcherItem) {
70
+ switcherItem.focus();
71
+ }
69
72
  };
70
- const childrenWithProps = React__default["default"].Children.toArray(children).map((child, index) => {
71
- // handleSwitcherItemFocus should only be passed down if the child is a SwitcherItem
72
- // SwitcherDivider, for example, does not accept a handleSwitcherItemFocus prop
73
- if (child.type?.displayName === 'SwitcherItem') {
73
+ const childrenWithProps = React__default["default"].Children.map(children, (child, index) => {
74
+ // only setup click handlers if onChange event is passed
75
+ if ( /*#__PURE__*/React__default["default"].isValidElement(child) && child.type && getDisplayName["default"](child.type) === 'Switcher') {
74
76
  return /*#__PURE__*/React__default["default"].cloneElement(child, {
75
77
  handleSwitcherItemFocus,
76
78
  index,
@@ -108,6 +110,5 @@ Switcher.propTypes = {
108
110
  */
109
111
  expanded: PropTypes__default["default"].bool
110
112
  };
111
- var Switcher$1 = Switcher;
112
113
 
113
- exports["default"] = Switcher$1;
114
+ exports["default"] = Switcher;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ interface SwitcherDividerProps {
3
+ /**
4
+ * Optionally provide a custom class to apply to the underlying `<li>` node
5
+ */
6
+ className?: string;
7
+ }
8
+ declare const SwitcherDivider: React.FC<SwitcherDividerProps>;
9
+ export default SwitcherDivider;
@@ -27,11 +27,11 @@ const SwitcherDivider = _ref => {
27
27
  ...other
28
28
  } = _ref;
29
29
  const prefix = usePrefix.usePrefix();
30
- const className = cx__default["default"](`${prefix}--switcher__item--divider`, {
31
- [customClassName]: !!customClassName
30
+ const classNames = cx__default["default"](`${prefix}--switcher__item--divider`, {
31
+ [customClassName || '']: !!customClassName
32
32
  });
33
33
  return /*#__PURE__*/React__default["default"].createElement("hr", _rollupPluginBabelHelpers["extends"]({}, other, {
34
- className: className
34
+ className: classNames
35
35
  }));
36
36
  };
37
37
  SwitcherDivider.propTypes = {
@@ -40,6 +40,5 @@ SwitcherDivider.propTypes = {
40
40
  */
41
41
  className: PropTypes__default["default"].string
42
42
  };
43
- var SwitcherDivider$1 = SwitcherDivider;
44
43
 
45
- exports["default"] = SwitcherDivider$1;
44
+ exports["default"] = SwitcherDivider;
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ interface BaseSwitcherItemProps {
3
+ /**
4
+ * Specify the text content for the link
5
+ */
6
+ children: React.ReactNode;
7
+ /**
8
+ * Optionally provide a custom class to apply to the underlying `<li>` node
9
+ */
10
+ className?: string;
11
+ /**
12
+ * event handlers
13
+ */
14
+ handleSwitcherItemFocus?: (event: {
15
+ currentIndex: number;
16
+ direction: number;
17
+ }) => void;
18
+ /**
19
+ * Specify the index of the SwitcherItem
20
+ */
21
+ index?: number;
22
+ /**
23
+ * event handlers
24
+ */
25
+ onKeyDown?: (event: KeyboardEvent) => void;
26
+ /**
27
+ * Specify the tab index of the Link
28
+ */
29
+ tabIndex?: number;
30
+ /**
31
+ * Specify whether the panel is expanded
32
+ */
33
+ expanded?: boolean;
34
+ /**
35
+ * Specify whether the panel is selected
36
+ */
37
+ isSelected?: boolean;
38
+ }
39
+ interface SwitcherItemWithAriaLabel extends BaseSwitcherItemProps {
40
+ 'aria-label': string;
41
+ 'aria-labelledby'?: never;
42
+ }
43
+ interface SwitcherItemWithAriaLabelledBy extends BaseSwitcherItemProps {
44
+ 'aria-label'?: never;
45
+ 'aria-labelledby': string;
46
+ }
47
+ type SwitcherItemProps = SwitcherItemWithAriaLabel | SwitcherItemWithAriaLabelledBy;
48
+ declare const SwitcherItem: React.ForwardRefExoticComponent<SwitcherItemProps & React.RefAttributes<React.ElementType<any>>>;
49
+ export default SwitcherItem;
@@ -13,9 +13,9 @@ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelper
13
13
  var React = require('react');
14
14
  var cx = require('classnames');
15
15
  var PropTypes = require('prop-types');
16
- var AriaPropTypes = require('../../prop-types/AriaPropTypes.js');
17
16
  var Link = require('./Link.js');
18
17
  var usePrefix = require('../../internal/usePrefix.js');
18
+ var AriaPropTypes = require('../../prop-types/AriaPropTypes.js');
19
19
  var match = require('../../internal/keyboard/match.js');
20
20
  var keys = require('../../internal/keyboard/keys.js');
21
21
 
@@ -25,8 +25,8 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
25
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
26
26
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
27
27
 
28
- const SwitcherItem = /*#__PURE__*/React__default["default"].forwardRef(function SwitcherItem(_ref, ref) {
29
- let {
28
+ const SwitcherItem = /*#__PURE__*/React.forwardRef(function SwitcherItem(props, forwardRef) {
29
+ const {
30
30
  'aria-label': ariaLabel,
31
31
  'aria-labelledby': ariaLabelledBy,
32
32
  className: customClassName,
@@ -38,10 +38,10 @@ const SwitcherItem = /*#__PURE__*/React__default["default"].forwardRef(function
38
38
  handleSwitcherItemFocus,
39
39
  onKeyDown = () => {},
40
40
  ...rest
41
- } = _ref;
41
+ } = props;
42
42
  const prefix = usePrefix.usePrefix();
43
- const className = cx__default["default"](`${prefix}--switcher__item`, {
44
- [customClassName]: !!customClassName
43
+ const classNames = cx__default["default"](`${prefix}--switcher__item`, {
44
+ [customClassName || '']: !!customClassName
45
45
  });
46
46
  const accessibilityLabel = {
47
47
  'aria-label': ariaLabel,
@@ -54,36 +54,33 @@ const SwitcherItem = /*#__PURE__*/React__default["default"].forwardRef(function
54
54
  if (match.match(evt, keys.ArrowDown)) {
55
55
  evt.preventDefault();
56
56
  handleSwitcherItemFocus?.({
57
- currentIndex: index,
57
+ currentIndex: index || -1,
58
58
  direction: 1
59
59
  });
60
60
  }
61
61
  if (match.match(evt, keys.ArrowUp)) {
62
62
  evt.preventDefault();
63
63
  handleSwitcherItemFocus?.({
64
- currentIndex: index,
64
+ currentIndex: index || -1,
65
65
  direction: -1
66
66
  });
67
67
  }
68
68
  }
69
69
  return /*#__PURE__*/React__default["default"].createElement("li", {
70
- className: className
70
+ className: classNames
71
71
  }, /*#__PURE__*/React__default["default"].createElement(Link["default"], _rollupPluginBabelHelpers["extends"]({
72
72
  onKeyDown: evt => {
73
73
  setTabFocus(evt);
74
74
  onKeyDown(evt);
75
- }
75
+ },
76
+ ref: forwardRef
76
77
  }, rest, {
77
- ref: ref,
78
78
  className: linkClassName,
79
79
  tabIndex: tabIndex
80
80
  }, accessibilityLabel), children));
81
81
  });
82
82
  SwitcherItem.displayName = 'SwitcherItem';
83
83
  SwitcherItem.propTypes = {
84
- /**
85
- * Required props for accessibility label on the underlying menuitem
86
- */
87
84
  ...AriaPropTypes.AriaLabelPropType,
88
85
  /**
89
86
  * Specify the text content for the link
@@ -110,6 +107,5 @@ SwitcherItem.propTypes = {
110
107
  */
111
108
  tabIndex: PropTypes__default["default"].number
112
109
  };
113
- var SwitcherItem$1 = SwitcherItem;
114
110
 
115
- exports["default"] = SwitcherItem$1;
111
+ exports["default"] = SwitcherItem;