@carbon/react 1.37.0 → 1.38.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 (68) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +924 -660
  2. package/es/components/DataTable/DataTable.js +1 -1
  3. package/es/components/DataTable/Table.js +21 -1
  4. package/es/components/Grid/CSSGrid.js +1 -1
  5. package/es/components/Grid/ColumnHang.js +1 -1
  6. package/es/components/Grid/GridContext.d.ts +2 -2
  7. package/es/components/Grid/GridContext.js +1 -1
  8. package/es/components/Heading/index.d.ts +5 -40
  9. package/es/components/Heading/index.js +11 -6
  10. package/es/components/Icon/Icon.Skeleton.d.ts +25 -0
  11. package/es/components/Icon/Icon.Skeleton.js +1 -4
  12. package/es/components/Icon/index.d.ts +7 -0
  13. package/es/components/IconButton/index.js +9 -1
  14. package/es/components/Layer/index.js +5 -3
  15. package/es/components/ListBox/ListBoxMenuItem.js +2 -1
  16. package/es/components/Menu/Menu.js +14 -2
  17. package/es/components/Menu/MenuItem.js +28 -7
  18. package/es/components/MenuButton/index.js +1 -1
  19. package/es/components/MultiSelect/FilterableMultiSelect.js +6 -6
  20. package/es/components/MultiSelect/MultiSelect.js +6 -0
  21. package/es/components/Notification/Notification.js +4 -2
  22. package/es/components/Slider/Slider.d.ts +1 -0
  23. package/es/components/Slider/Slider.js +16 -5
  24. package/es/components/Tabs/Tabs.js +6 -8
  25. package/es/components/Tag/Tag.Skeleton.js +6 -3
  26. package/es/components/Tag/Tag.js +2 -2
  27. package/es/components/Text/Text.js +1 -1
  28. package/es/components/TextInput/PasswordInput.js +3 -1
  29. package/es/components/Theme/index.d.ts +3 -15
  30. package/es/components/Theme/index.js +6 -3
  31. package/es/components/TreeView/TreeNode.js +2 -2
  32. package/es/components/UIShell/HeaderMenu.js +11 -11
  33. package/es/components/UIShell/HeaderMenuItem.d.ts +9 -5
  34. package/es/components/UIShell/HeaderMenuItem.js +2 -3
  35. package/lib/components/DataTable/DataTable.js +1 -1
  36. package/lib/components/DataTable/Table.js +20 -0
  37. package/lib/components/Grid/CSSGrid.js +1 -1
  38. package/lib/components/Grid/ColumnHang.js +1 -1
  39. package/lib/components/Grid/GridContext.d.ts +2 -2
  40. package/lib/components/Grid/GridContext.js +1 -1
  41. package/lib/components/Heading/index.d.ts +5 -40
  42. package/lib/components/Heading/index.js +11 -6
  43. package/lib/components/Icon/Icon.Skeleton.d.ts +25 -0
  44. package/lib/components/Icon/Icon.Skeleton.js +1 -4
  45. package/lib/components/Icon/index.d.ts +7 -0
  46. package/lib/components/IconButton/index.js +9 -1
  47. package/lib/components/Layer/index.js +5 -3
  48. package/lib/components/ListBox/ListBoxMenuItem.js +2 -1
  49. package/lib/components/Menu/Menu.js +14 -2
  50. package/lib/components/Menu/MenuItem.js +30 -9
  51. package/lib/components/MenuButton/index.js +1 -1
  52. package/lib/components/MultiSelect/FilterableMultiSelect.js +5 -5
  53. package/lib/components/MultiSelect/MultiSelect.js +6 -0
  54. package/lib/components/Notification/Notification.js +4 -2
  55. package/lib/components/Slider/Slider.d.ts +1 -0
  56. package/lib/components/Slider/Slider.js +16 -5
  57. package/lib/components/Tabs/Tabs.js +6 -8
  58. package/lib/components/Tag/Tag.Skeleton.js +6 -3
  59. package/lib/components/Tag/Tag.js +2 -2
  60. package/lib/components/Text/Text.js +1 -1
  61. package/lib/components/TextInput/PasswordInput.js +3 -1
  62. package/lib/components/Theme/index.d.ts +3 -15
  63. package/lib/components/Theme/index.js +6 -3
  64. package/lib/components/TreeView/TreeNode.js +2 -2
  65. package/lib/components/UIShell/HeaderMenu.js +11 -11
  66. package/lib/components/UIShell/HeaderMenuItem.d.ts +9 -5
  67. package/lib/components/UIShell/HeaderMenuItem.js +2 -3
  68. package/package.json +5 -5
@@ -37,7 +37,7 @@ const Tag = _ref => {
37
37
  type,
38
38
  filter,
39
39
  renderIcon: CustomIconElement,
40
- title,
40
+ title = 'Clear filter',
41
41
  disabled,
42
42
  onClose,
43
43
  size,
@@ -75,7 +75,7 @@ const Tag = _ref => {
75
75
  className: `${prefix}--tag__close-icon`,
76
76
  onClick: handleClose,
77
77
  disabled: disabled,
78
- "aria-labelledby": tagId,
78
+ "aria-label": title,
79
79
  title: title
80
80
  }, _Close || (_Close = /*#__PURE__*/React__default.createElement(Close, null))));
81
81
  }
@@ -14,7 +14,7 @@ function Text(_ref) {
14
14
  let {
15
15
  as,
16
16
  children,
17
- dir = 'auto',
17
+ dir,
18
18
  ...rest
19
19
  } = _ref;
20
20
  // TODO: Update with context typing once its been converted to TS
@@ -66,7 +66,9 @@ const PasswordInput = /*#__PURE__*/React__default.forwardRef(function PasswordIn
66
66
  [`${prefix}--text-input--light`]: light,
67
67
  [`${prefix}--text-input--invalid`]: normalizedProps.invalid,
68
68
  [`${prefix}--text-input--warning`]: normalizedProps.warn,
69
- [`${prefix}--text-input--${size}`]: size
69
+ [`${prefix}--text-input--${size}`]: size,
70
+ // TODO: V12 - Remove this class
71
+ [`${prefix}--layout--size-${size}`]: size
70
72
  });
71
73
  const sharedTextInputProps = {
72
74
  id,
@@ -5,26 +5,14 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import PropTypes from 'prop-types';
8
- import React, { ElementType, type PropsWithChildren } from 'react';
8
+ import React, { ElementType } from 'react';
9
9
  import { PolymorphicProps } from '../../types/common';
10
10
  interface GlobalThemeProps {
11
11
  theme?: 'white' | 'g10' | 'g90' | 'g100';
12
+ children?: React.ReactNode;
12
13
  }
13
14
  export declare const ThemeContext: React.Context<GlobalThemeProps>;
14
- export declare function GlobalTheme({ children, theme, }: PropsWithChildren<GlobalThemeProps>): JSX.Element;
15
- export declare namespace GlobalTheme {
16
- var propTypes: {
17
- /**
18
- * Provide child elements to be rendered inside of `GlobalTheme`, this is
19
- * typically the root of your app
20
- */
21
- children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
22
- /**
23
- * Specify the global theme for your app
24
- */
25
- theme: PropTypes.Requireable<string>;
26
- };
27
- }
15
+ export declare const GlobalTheme: React.ForwardRefExoticComponent<GlobalThemeProps & React.RefAttributes<unknown>>;
28
16
  type ThemeBaseProps = GlobalThemeProps & {
29
17
  className?: string;
30
18
  };
@@ -15,7 +15,7 @@ import { LayerContext } from '../Layer/LayerContext.js';
15
15
  const ThemeContext = /*#__PURE__*/React__default.createContext({
16
16
  theme: 'white'
17
17
  });
18
- function GlobalTheme(_ref) {
18
+ const GlobalTheme = /*#__PURE__*/React__default.forwardRef(function GlobalTheme(_ref, ref) {
19
19
  let {
20
20
  children,
21
21
  theme
@@ -25,10 +25,13 @@ function GlobalTheme(_ref) {
25
25
  theme
26
26
  };
27
27
  }, [theme]);
28
+ const childrenWithProps = /*#__PURE__*/React__default.cloneElement(children, {
29
+ ref: ref
30
+ });
28
31
  return /*#__PURE__*/React__default.createElement(ThemeContext.Provider, {
29
32
  value: value
30
- }, children);
31
- }
33
+ }, childrenWithProps);
34
+ });
32
35
  GlobalTheme.propTypes = {
33
36
  /**
34
37
  * Provide child elements to be rendered inside of `GlobalTheme`, this is
@@ -187,8 +187,8 @@ function TreeNode(_ref) {
187
187
  return depth + 2.5;
188
188
  };
189
189
  if (currentNodeLabel.current) {
190
- currentNodeLabel.current.style.marginLeft = `-${calcOffset()}rem`;
191
- currentNodeLabel.current.style.paddingLeft = `${calcOffset()}rem`;
190
+ currentNodeLabel.current.style.marginInlineStart = `-${calcOffset()}rem`;
191
+ currentNodeLabel.current.style.paddingInlineStart = `${calcOffset()}rem`;
192
192
  }
193
193
 
194
194
  // sync props and state
@@ -57,20 +57,20 @@ class HeaderMenu extends React__default.Component {
57
57
  });
58
58
  /**
59
59
  * Handle our blur event from our underlying menuitems. Will mostly be used
60
- * for toggling the expansion status of our menu in response to a user
61
- * clicking off of the menu or menubar.
60
+ * for closing our menu in response to a user clicking off or tabbing out of
61
+ * the menu or menubar.
62
62
  */
63
63
  _defineProperty(this, "handleOnBlur", event => {
64
- // Rough guess for a blur event that is triggered outside of our menu or
65
- // menubar context
66
- const itemTriggeredBlur = this.items.find(element => element === event.relatedTarget);
67
- if (event.relatedTarget && (event.relatedTarget.getAttribute('href') && event.relatedTarget.getAttribute('href') !== '#' || itemTriggeredBlur)) {
68
- return;
64
+ // Close the menu on blur when the related target is not a sibling menu item
65
+ // or a child in a submenu
66
+ const siblingItemBlurredTo = this.items.find(element => element === event.relatedTarget);
67
+ const childItemBlurredTo = this._subMenus.current?.contains(event.relatedTarget);
68
+ if (!siblingItemBlurredTo && !childItemBlurredTo) {
69
+ this.setState({
70
+ expanded: false,
71
+ selectedIndex: null
72
+ });
69
73
  }
70
- this.setState({
71
- expanded: false,
72
- selectedIndex: null
73
- });
74
74
  });
75
75
  /**
76
76
  * ref handler for our menu button. If we are supplied a `focusRef` prop, we also
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import React, { type ComponentProps, type ReactNode, ElementType } from 'react';
7
+ import { type ComponentProps, type ForwardedRef, type ReactNode, ElementType, WeakValidationMap } from 'react';
8
8
  import { LinkProps } from './Link';
9
9
  type HeaderMenuItemProps<E extends ElementType> = LinkProps<E> & {
10
10
  className?: string | undefined;
@@ -15,8 +15,12 @@ type HeaderMenuItemProps<E extends ElementType> = LinkProps<E> & {
15
15
  role?: ComponentProps<'li'>['role'];
16
16
  tabIndex?: number | undefined;
17
17
  };
18
- declare const HeaderMenuItem: (<E extends React.ElementType<any> = "a">(props: HeaderMenuItemProps<E>) => JSX.Element) & {
19
- displayName?: string | undefined;
20
- propTypes?: React.WeakValidationMap<HeaderMenuItemProps<any>> | undefined;
21
- };
18
+ export interface HeaderMenuItemComponent {
19
+ <E extends ElementType = 'a'>(props: HeaderMenuItemProps<E> & {
20
+ ref?: ForwardedRef<ElementType>;
21
+ }): JSX.Element | null;
22
+ displayName?: string;
23
+ propTypes?: WeakValidationMap<HeaderMenuItemProps<any>>;
24
+ }
25
+ declare const HeaderMenuItem: HeaderMenuItemComponent;
22
26
  export default HeaderMenuItem;
@@ -13,7 +13,7 @@ import Link, { LinkPropTypes } from './Link.js';
13
13
  import { usePrefix } from '../../internal/usePrefix.js';
14
14
  import deprecate from '../../prop-types/deprecate.js';
15
15
 
16
- function HeaderMenuItemRenderFunction(_ref, ref) {
16
+ const HeaderMenuItem = /*#__PURE__*/forwardRef(function HeaderMenuItemRenderFunction(_ref, ref) {
17
17
  let {
18
18
  className,
19
19
  isActive,
@@ -45,8 +45,7 @@ function HeaderMenuItemRenderFunction(_ref, ref) {
45
45
  }), /*#__PURE__*/React__default.createElement("span", {
46
46
  className: `${prefix}--text-truncate--end`
47
47
  }, children)));
48
- }
49
- const HeaderMenuItem = /*#__PURE__*/forwardRef(HeaderMenuItemRenderFunction);
48
+ });
50
49
  HeaderMenuItem.displayName = 'HeaderMenuItem';
51
50
  HeaderMenuItem.propTypes = {
52
51
  /**
@@ -271,7 +271,7 @@ class DataTable extends React__default["default"].Component {
271
271
  checked: row.isSelected,
272
272
  onSelect: events.composeEventHandlers([_this.handleOnSelectRow(row.id), onClick]),
273
273
  id: `${_this.getTablePrefix()}__select-row-${row.id}`,
274
- name: `select-row-${row.id}`,
274
+ name: `select-row`,
275
275
  ariaLabel: t(translationKey),
276
276
  disabled: row.disabled,
277
277
  radio: _this.props.radio || null
@@ -71,6 +71,7 @@ const Table = _ref => {
71
71
  descriptionId
72
72
  } = React.useContext(TableContext.TableContext);
73
73
  const prefix = usePrefix.usePrefix();
74
+ const [isScrollable, setIsScrollable] = React.useState(false);
74
75
  const tableRef = React.useRef(null);
75
76
  const componentClass = cx__default["default"](`${prefix}--data-table`, className, {
76
77
  [`${prefix}--data-table--${size}`]: size,
@@ -109,6 +110,22 @@ const Table = _ref => {
109
110
  const debouncedSetTableAlignment = debounce__default["default"](setTableAlignment, 100);
110
111
  useEvent.useWindowEvent('resize', debouncedSetTableAlignment);
111
112
 
113
+ // Used to set a tabIndex when the Table is horizontally scrollable
114
+ const setTabIndex = React.useCallback(() => {
115
+ const tableContainer = tableRef?.current?.parentNode;
116
+ const tableHeader = tableRef?.current?.firstChild;
117
+ if (tableHeader?.scrollWidth > tableContainer?.clientWidth) {
118
+ setIsScrollable(true);
119
+ } else {
120
+ setIsScrollable(false);
121
+ }
122
+ }, []);
123
+ const debouncedSetTabIndex = debounce__default["default"](setTabIndex, 100);
124
+ useEvent.useWindowEvent('resize', debouncedSetTabIndex);
125
+ React.useLayoutEffect(() => {
126
+ setTabIndex();
127
+ }, [setTabIndex]);
128
+
112
129
  // recalculate table alignment once fonts have loaded
113
130
  if (typeof document !== 'undefined' && document?.fonts?.status && document.fonts.status !== 'loaded') {
114
131
  document.fonts.ready.then(() => {
@@ -120,6 +137,9 @@ const Table = _ref => {
120
137
  }, [setTableAlignment, size]);
121
138
  const table = /*#__PURE__*/React__default["default"].createElement("div", {
122
139
  className: `${prefix}--data-table-content`
140
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
141
+ ,
142
+ tabIndex: isScrollable ? 0 : undefined
123
143
  }, /*#__PURE__*/React__default["default"].createElement("table", _rollupPluginBabelHelpers["extends"]({
124
144
  "aria-labelledby": titleId,
125
145
  "aria-describedby": descriptionId
@@ -129,7 +129,7 @@ Subgrid.propTypes = {
129
129
  */
130
130
  className: PropTypes__default["default"].string,
131
131
  /**
132
- * Specify the grid mode for the subgrid
132
+ * Specify the gutter mode for the subgrid
133
133
  */
134
134
  mode: PropTypes__default["default"].oneOf(['wide', 'narrow', 'condensed'])
135
135
  };
@@ -23,7 +23,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
23
23
 
24
24
  /**
25
25
  * Helper component for rendering content that hangs on the column. Useful when
26
- * trying to align content across different grid modes
26
+ * trying to align content across different gutter modes
27
27
  */
28
28
  function ColumnHang(_ref) {
29
29
  let {
@@ -8,7 +8,7 @@ import * as React from 'react';
8
8
  export type GridMode = 'flexbox' | 'css-grid';
9
9
  export interface GridSettingContext {
10
10
  /**
11
- * The grid mode for the GridContext
11
+ * The gutter mode for the GridContext
12
12
  */
13
13
  mode: GridMode;
14
14
  /**
@@ -23,7 +23,7 @@ export interface GridSettingsProps {
23
23
  */
24
24
  children?: React.ReactNode;
25
25
  /**
26
- * Specify the grid mode for the GridContext
26
+ * Specify the gutter mode for the GridContext
27
27
  */
28
28
  mode: GridMode;
29
29
  /**
@@ -67,7 +67,7 @@ GridSettings.propTypes = {
67
67
  */
68
68
  children: PropTypes__default["default"].node,
69
69
  /**
70
- * Specify the grid mode for the GridContext
70
+ * Specify the gutter mode for the GridContext
71
71
  */
72
72
  mode: PropTypes__default["default"].oneOf(gridModes).isRequired,
73
73
  /**
@@ -4,48 +4,13 @@
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import PropTypes from 'prop-types';
8
- import { type ElementType } from 'react';
9
- import type { PolymorphicProps } from '../../types/common';
7
+ import React from 'react';
10
8
  type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
11
9
  type SectionBaseProps = {
12
10
  level?: HeadingLevel;
13
11
  };
14
- type SectionProps<E extends ElementType> = PolymorphicProps<E, SectionBaseProps>;
15
- export declare function Section<E extends ElementType = 'section'>({ as: BaseComponent, level: levelOverride, ...rest }: SectionProps<E>): JSX.Element;
16
- export declare namespace Section {
17
- var propTypes: {
18
- /**
19
- * Provide an alternative tag or component to use instead of the default
20
- * <section> element
21
- */
22
- as: PropTypes.Requireable<PropTypes.ReactComponentLike>;
23
- /**
24
- * Specify the content that will be placed in the component
25
- */
26
- children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
27
- /**
28
- * Specify a class name for the outermost node of the component
29
- */
30
- className: PropTypes.Requireable<string>;
31
- /**
32
- * Overrides the level of the section
33
- */
34
- level: PropTypes.Requireable<number>;
35
- };
36
- }
37
- type HeadingProps = JSX.IntrinsicElements[`h${HeadingLevel}`];
38
- export declare function Heading(props: HeadingProps): JSX.Element;
39
- export declare namespace Heading {
40
- var propTypes: {
41
- /**
42
- * Specify the content that will be placed in the component
43
- */
44
- children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
45
- /**
46
- * Specify a class name for the outermost node of the component
47
- */
48
- className: PropTypes.Requireable<string>;
49
- };
50
- }
12
+ export declare const Section: React.ForwardRefExoticComponent<Pick<SectionBaseProps & Omit<any, "as"> & {
13
+ as?: React.ElementType<any> | undefined;
14
+ }, string | number | symbol> & React.RefAttributes<unknown>>;
15
+ export declare const Heading: React.ForwardRefExoticComponent<Pick<React.ClassAttributes<HTMLHeadingElement> & React.HTMLAttributes<HTMLHeadingElement>, "key" | keyof React.HTMLAttributes<HTMLHeadingElement>> & React.RefAttributes<HTMLHeadingElement>>;
51
16
  export {};
@@ -9,6 +9,7 @@
9
9
 
10
10
  Object.defineProperty(exports, '__esModule', { value: true });
11
11
 
12
+ var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
12
13
  var PropTypes = require('prop-types');
13
14
  var React = require('react');
14
15
 
@@ -18,7 +19,7 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
18
19
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
19
20
 
20
21
  const HeadingContext = /*#__PURE__*/React__default["default"].createContext(1);
21
- function Section(_ref) {
22
+ const Section = /*#__PURE__*/React__default["default"].forwardRef(function Section(_ref, ref) {
22
23
  let {
23
24
  as: BaseComponent = 'section',
24
25
  level: levelOverride,
@@ -29,8 +30,10 @@ function Section(_ref) {
29
30
  const BaseComponentAsAny = BaseComponent;
30
31
  return /*#__PURE__*/React__default["default"].createElement(HeadingContext.Provider, {
31
32
  value: Math.min(level, 6)
32
- }, /*#__PURE__*/React__default["default"].createElement(BaseComponentAsAny, rest));
33
- }
33
+ }, /*#__PURE__*/React__default["default"].createElement(BaseComponentAsAny, _rollupPluginBabelHelpers["extends"]({
34
+ ref: ref
35
+ }, rest)));
36
+ });
34
37
  Section.propTypes = {
35
38
  /**
36
39
  * Provide an alternative tag or component to use instead of the default
@@ -50,10 +53,12 @@ Section.propTypes = {
50
53
  */
51
54
  level: PropTypes__default["default"].number
52
55
  };
53
- function Heading(props) {
56
+ const Heading = /*#__PURE__*/React__default["default"].forwardRef(function Heading(props, ref) {
54
57
  const HeadingIntrinsic = `h${React__default["default"].useContext(HeadingContext)}`;
55
- return /*#__PURE__*/React__default["default"].createElement(HeadingIntrinsic, props);
56
- }
58
+ return /*#__PURE__*/React__default["default"].createElement(HeadingIntrinsic, _rollupPluginBabelHelpers["extends"]({
59
+ ref: ref
60
+ }, props));
61
+ });
57
62
  Heading.propTypes = {
58
63
  /**
59
64
  * Specify the content that will be placed in the component
@@ -0,0 +1,25 @@
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
+ import PropTypes from 'prop-types';
8
+ import { ComponentProps } from 'react';
9
+ export interface IconSkeletonProps extends ComponentProps<'div'> {
10
+ /**
11
+ * Specify an optional className to add.
12
+ */
13
+ className?: string;
14
+ }
15
+ declare const IconSkeleton: {
16
+ ({ className, ...rest }: IconSkeletonProps): JSX.Element;
17
+ propTypes: {
18
+ /**
19
+ * Specify an optional className to add.
20
+ */
21
+ className: PropTypes.Requireable<string>;
22
+ };
23
+ };
24
+ export default IconSkeleton;
25
+ export { IconSkeleton };
@@ -27,12 +27,9 @@ const IconSkeleton = _ref => {
27
27
  ...rest
28
28
  } = _ref;
29
29
  const prefix = usePrefix.usePrefix();
30
- const props = {
31
- ...rest
32
- };
33
30
  return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
34
31
  className: cx__default["default"](`${prefix}--icon--skeleton`, className)
35
- }, props));
32
+ }, rest));
36
33
  };
37
34
  IconSkeleton.propTypes = {
38
35
  /**
@@ -0,0 +1,7 @@
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
+ export * from './Icon.Skeleton';
@@ -39,6 +39,7 @@ const IconButton = /*#__PURE__*/React__default["default"].forwardRef(function Ic
39
39
  leaveDelayMs = 100,
40
40
  wrapperClasses,
41
41
  size,
42
+ isSelected,
42
43
  ...rest
43
44
  } = props;
44
45
  const prefix = usePrefix.usePrefix();
@@ -58,7 +59,9 @@ const IconButton = /*#__PURE__*/React__default["default"].forwardRef(function Ic
58
59
  kind: kind,
59
60
  ref: ref,
60
61
  size: size,
61
- className: cx__default["default"](`${prefix}--btn--icon-only`, className)
62
+ className: cx__default["default"](`${prefix}--btn--icon-only`, {
63
+ [`${prefix}--btn--selected`]: isSelected
64
+ }, className)
62
65
  }), children));
63
66
  });
64
67
  IconButton.propTypes = {
@@ -90,6 +93,11 @@ IconButton.propTypes = {
90
93
  * Specify the duration in milliseconds to delay before displaying the tooltip
91
94
  */
92
95
  enterDelayMs: PropTypes__default["default"].number,
96
+ /**
97
+ * Specify whether the IconButton is currently selected
98
+ */
99
+
100
+ isSelected: PropTypes__default["default"].bool,
93
101
  /**
94
102
  * Specify the type of button to be used as the base for the IconButton
95
103
  */
@@ -36,7 +36,7 @@ function useLayer() {
36
36
  level
37
37
  };
38
38
  }
39
- function Layer(_ref) {
39
+ const Layer = /*#__PURE__*/React__default["default"].forwardRef(function Layer(_ref, ref) {
40
40
  let {
41
41
  as: BaseComponent = 'div',
42
42
  className: customClassName,
@@ -52,10 +52,12 @@ function Layer(_ref) {
52
52
  const value = Math.max(0, Math.min(level + 1, MAX_LEVEL));
53
53
  return /*#__PURE__*/React__default["default"].createElement(LayerContext.LayerContext.Provider, {
54
54
  value: value
55
- }, /*#__PURE__*/React__default["default"].createElement(BaseComponent, _rollupPluginBabelHelpers["extends"]({}, rest, {
55
+ }, /*#__PURE__*/React__default["default"].createElement(BaseComponent, _rollupPluginBabelHelpers["extends"]({
56
+ ref: ref
57
+ }, rest, {
56
58
  className: className
57
59
  }), children));
58
- }
60
+ });
59
61
  Layer.propTypes = {
60
62
  /**
61
63
  * Specify a custom component or element to be rendered as the top-level
@@ -24,10 +24,11 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
24
24
  function useIsTruncated(ref) {
25
25
  const [isTruncated, setIsTruncated] = React.useState(false);
26
26
  React.useEffect(() => {
27
+ const element = ref.current;
27
28
  const {
28
29
  offsetWidth,
29
30
  scrollWidth
30
- } = ref.current;
31
+ } = element.lastElementChild?.lastElementChild || element;
31
32
  setIsTruncated(offsetWidth < scrollWidth);
32
33
  }, [ref, setIsTruncated]);
33
34
  return isTruncated;
@@ -17,6 +17,7 @@ var ReactDOM = require('react-dom');
17
17
  var useMergedRefs = require('../../internal/useMergedRefs.js');
18
18
  var usePrefix = require('../../internal/usePrefix.js');
19
19
  var MenuContext = require('./MenuContext.js');
20
+ var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
20
21
  var match = require('../../internal/keyboard/match.js');
21
22
  var keys = require('../../internal/keyboard/keys.js');
22
23
 
@@ -63,6 +64,11 @@ const Menu = /*#__PURE__*/React__default["default"].forwardRef(function Menu(_re
63
64
  const ref = useMergedRefs.useMergedRefs([forwardRef, menu]);
64
65
  const [position, setPosition] = React.useState([-1, -1]);
65
66
  const focusableItems = childContext.state.items.filter(item => !item.disabled && item.ref.current);
67
+
68
+ // Set RTL based on document direction or `LayoutDirection`
69
+ const {
70
+ direction
71
+ } = useLayoutDirection.useLayoutDirection();
66
72
  function returnFocus() {
67
73
  if (focusReturn.current) {
68
74
  focusReturn.current.focus();
@@ -72,8 +78,14 @@ const Menu = /*#__PURE__*/React__default["default"].forwardRef(function Menu(_re
72
78
  if (menu.current) {
73
79
  focusReturn.current = document.activeElement;
74
80
  const pos = calculatePosition();
75
- menu.current.style.left = `${pos[0]}px`;
76
- menu.current.style.top = `${pos[1]}px`;
81
+ if ((document?.dir === 'rtl' || direction === 'rtl') && !rest?.id?.includes('MenuButton')) {
82
+ menu.current.style.insetInlineStart = `initial`;
83
+ menu.current.style.insetInlineEnd = `${pos[0]}px`;
84
+ } else {
85
+ menu.current.style.insetInlineStart = `${pos[0]}px`;
86
+ menu.current.style.insetInlineEnd = `initial`;
87
+ }
88
+ menu.current.style.insetBlockStart = `${pos[1]}px`;
77
89
  setPosition(pos);
78
90
  menu.current.focus();
79
91
  if (onOpen) {
@@ -13,12 +13,13 @@ 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 icons = require('@carbon/react/icons');
16
+ 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
20
  var Menu = require('./Menu.js');
21
21
  var MenuContext = require('./MenuContext.js');
22
+ var useLayoutDirection = require('../LayoutDirection/useLayoutDirection.js');
22
23
  var match = require('../../internal/keyboard/match.js');
23
24
  var keys = require('../../internal/keyboard/keys.js');
24
25
 
@@ -28,7 +29,7 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
28
29
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
29
30
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
31
 
31
- var _CaretRight;
32
+ var _CaretLeft, _CaretRight;
32
33
  const hoverIntentDelay = 150; // in ms
33
34
 
34
35
  const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function MenuItem(_ref, forwardRef) {
@@ -51,6 +52,7 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
51
52
  x: -1,
52
53
  y: -1
53
54
  });
55
+ const [isRtl, setRtl] = React.useState(false);
54
56
  const hasChildren = Boolean(children);
55
57
  const [submenuOpen, setSubmenuOpen] = React.useState(false);
56
58
  const hoverIntentTimeout = React.useRef(null);
@@ -72,10 +74,17 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
72
74
  width,
73
75
  height
74
76
  } = menuItem.current.getBoundingClientRect();
75
- setBoundaries({
76
- x: [x, x + width],
77
- y: [y, y + height]
78
- });
77
+ if (isRtl) {
78
+ setBoundaries({
79
+ x: [-x, x - width],
80
+ y: [y, y + height]
81
+ });
82
+ } else {
83
+ setBoundaries({
84
+ x: [x, x + width],
85
+ y: [y, y + height]
86
+ });
87
+ }
79
88
  setSubmenuOpen(true);
80
89
  }
81
90
  function closeSubmenu() {
@@ -130,6 +139,18 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
130
139
  registerItem();
131
140
  // eslint-disable-next-line react-hooks/exhaustive-deps
132
141
  }, []);
142
+
143
+ // Set RTL based on document direction or `LayoutDirection`
144
+ const {
145
+ direction
146
+ } = useLayoutDirection.useLayoutDirection();
147
+ React.useEffect(() => {
148
+ if (document?.dir === 'rtl' || direction === 'rtl') {
149
+ setRtl(true);
150
+ } else {
151
+ setRtl(false);
152
+ }
153
+ }, [direction]);
133
154
  return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({
134
155
  role: "menuitem"
135
156
  }, rest, {
@@ -151,7 +172,7 @@ const MenuItem = /*#__PURE__*/React__default["default"].forwardRef(function Menu
151
172
  className: `${prefix}--menu-item__shortcut`
152
173
  }, shortcut), hasChildren && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
153
174
  className: `${prefix}--menu-item__shortcut`
154
- }, _CaretRight || (_CaretRight = /*#__PURE__*/React__default["default"].createElement(icons.CaretRight, null))), /*#__PURE__*/React__default["default"].createElement(Menu.Menu, {
175
+ }, isRtl ? _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, {
155
176
  label: label,
156
177
  open: submenuOpen,
157
178
  onClose: () => {
@@ -232,7 +253,7 @@ const MenuItemSelectable = /*#__PURE__*/React__default["default"].forwardRef(fun
232
253
  className: classNames,
233
254
  role: "menuitemcheckbox",
234
255
  "aria-checked": checked,
235
- renderIcon: checked && icons.Checkmark,
256
+ renderIcon: checked && iconsReact.Checkmark,
236
257
  onClick: handleClick
237
258
  }));
238
259
  });
@@ -335,7 +356,7 @@ const MenuItemRadioGroup = /*#__PURE__*/React__default["default"].forwardRef(fun
335
356
  label: itemToString(item),
336
357
  role: "menuitemradio",
337
358
  "aria-checked": item === selection,
338
- renderIcon: item === selection && icons.Checkmark,
359
+ renderIcon: item === selection && iconsReact.Checkmark,
339
360
  onClick: e => {
340
361
  handleClick(item, e);
341
362
  }
@@ -65,7 +65,7 @@ const MenuButton = /*#__PURE__*/React__default["default"].forwardRef(function Me
65
65
  }
66
66
  }
67
67
  function handleOpen() {
68
- menuRef.current.style.width = `${width}px`;
68
+ menuRef.current.style.inlineSize = `${width}px`;
69
69
  }
70
70
  const triggerClasses = cx__default["default"](`${prefix}--menu-button__trigger`, {
71
71
  [`${prefix}--menu-button__trigger--open`]: open