@carbon/react 1.37.0-rc.1 → 1.38.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 (58) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +9242 -0
  2. package/es/components/DataTable/Table.js +21 -1
  3. package/es/components/Grid/CSSGrid.js +1 -1
  4. package/es/components/Grid/ColumnHang.js +1 -1
  5. package/es/components/Grid/GridContext.d.ts +2 -2
  6. package/es/components/Grid/GridContext.js +1 -1
  7. package/es/components/Heading/index.d.ts +5 -40
  8. package/es/components/Heading/index.js +11 -6
  9. package/es/components/Icon/Icon.Skeleton.d.ts +25 -0
  10. package/es/components/Icon/Icon.Skeleton.js +1 -4
  11. package/es/components/Icon/index.d.ts +7 -0
  12. package/es/components/IconButton/index.js +9 -1
  13. package/es/components/Layer/index.js +5 -3
  14. package/es/components/Menu/Menu.js +14 -2
  15. package/es/components/Menu/MenuItem.js +28 -7
  16. package/es/components/MenuButton/index.js +1 -1
  17. package/es/components/MultiSelect/FilterableMultiSelect.js +6 -6
  18. package/es/components/MultiSelect/MultiSelect.js +6 -0
  19. package/es/components/Slider/Slider.d.ts +1 -0
  20. package/es/components/Slider/Slider.js +16 -5
  21. package/es/components/Tabs/Tabs.js +6 -8
  22. package/es/components/Tag/Tag.Skeleton.js +6 -3
  23. package/es/components/Tag/Tag.js +2 -2
  24. package/es/components/Text/Text.js +1 -1
  25. package/es/components/TextInput/PasswordInput.js +3 -1
  26. package/es/components/Theme/index.d.ts +3 -15
  27. package/es/components/Theme/index.js +6 -3
  28. package/es/components/TreeView/TreeNode.js +2 -2
  29. package/es/components/UIShell/HeaderMenu.js +11 -11
  30. package/lib/components/DataTable/Table.js +20 -0
  31. package/lib/components/Grid/CSSGrid.js +1 -1
  32. package/lib/components/Grid/ColumnHang.js +1 -1
  33. package/lib/components/Grid/GridContext.d.ts +2 -2
  34. package/lib/components/Grid/GridContext.js +1 -1
  35. package/lib/components/Heading/index.d.ts +5 -40
  36. package/lib/components/Heading/index.js +11 -6
  37. package/lib/components/Icon/Icon.Skeleton.d.ts +25 -0
  38. package/lib/components/Icon/Icon.Skeleton.js +1 -4
  39. package/lib/components/Icon/index.d.ts +7 -0
  40. package/lib/components/IconButton/index.js +9 -1
  41. package/lib/components/Layer/index.js +5 -3
  42. package/lib/components/Menu/Menu.js +14 -2
  43. package/lib/components/Menu/MenuItem.js +30 -9
  44. package/lib/components/MenuButton/index.js +1 -1
  45. package/lib/components/MultiSelect/FilterableMultiSelect.js +5 -5
  46. package/lib/components/MultiSelect/MultiSelect.js +6 -0
  47. package/lib/components/Slider/Slider.d.ts +1 -0
  48. package/lib/components/Slider/Slider.js +16 -5
  49. package/lib/components/Tabs/Tabs.js +6 -8
  50. package/lib/components/Tag/Tag.Skeleton.js +6 -3
  51. package/lib/components/Tag/Tag.js +2 -2
  52. package/lib/components/Text/Text.js +1 -1
  53. package/lib/components/TextInput/PasswordInput.js +3 -1
  54. package/lib/components/Theme/index.d.ts +3 -15
  55. package/lib/components/Theme/index.js +6 -3
  56. package/lib/components/TreeView/TreeNode.js +2 -2
  57. package/lib/components/UIShell/HeaderMenu.js +11 -11
  58. package/package.json +7 -6
@@ -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
@@ -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
@@ -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
@@ -163,7 +163,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
163
163
  case stateChangeTypes.keyDownArrowUp:
164
164
  case stateChangeTypes.keyDownHome:
165
165
  case stateChangeTypes.keyDownEnd:
166
- setHighlightedIndex(changes.highlightedIndex !== undefined ? changes.highlightedIndex : null);
166
+ setHighlightedIndex(changes.highlightedIndex !== undefined ? changes.highlightedIndex : 0);
167
167
  if (stateChangeTypes.keyDownArrowDown === type && !isOpen) {
168
168
  handleOnMenuChange(true);
169
169
  }
@@ -194,8 +194,8 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
194
194
  handleOnMenuChange(false);
195
195
  }
196
196
  }
197
- function clearInputValue() {
198
- setInputValue('');
197
+ function clearInputValue(event) {
198
+ textInput.current.value.length === 1 || match.match(event, keys.Escape) ? setInputValue('') : setInputValue(textInput.current.value);
199
199
  if (textInput.current) {
200
200
  textInput.current.focus();
201
201
  }
@@ -297,10 +297,10 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
297
297
  if (match.match(event, keys.Delete) || match.match(event, keys.Escape)) {
298
298
  if (isOpen) {
299
299
  handleOnMenuChange(true);
300
- clearInputValue();
300
+ clearInputValue(event);
301
301
  event.stopPropagation();
302
302
  } else if (!isOpen) {
303
- clearInputValue();
303
+ clearInputValue(event);
304
304
  clearSelection();
305
305
  event.stopPropagation();
306
306
  }
@@ -266,6 +266,12 @@ const MultiSelect = /*#__PURE__*/React__default["default"].forwardRef((_ref, ref
266
266
  const itemArray = document.querySelectorAll(`li.${prefix}--list-box__menu-item[role="option"]`);
267
267
  props.scrollIntoView(itemArray[highlightedIndex]);
268
268
  }
269
+ if (highlightedIndex === -1) {
270
+ return {
271
+ ...changes,
272
+ highlightedIndex: 0
273
+ };
274
+ }
269
275
  return changes;
270
276
  case ItemMouseMove:
271
277
  return {
@@ -270,6 +270,7 @@ export default class Slider extends PureComponent<SliderProps> {
270
270
  left: number;
271
271
  needsOnRelease: boolean;
272
272
  isValid: boolean;
273
+ isRtl: boolean;
273
274
  };
274
275
  thumbRef: React.RefObject<HTMLDivElement>;
275
276
  filledTrackRef: React.RefObject<HTMLDivElement>;
@@ -53,7 +53,8 @@ class Slider extends React.PureComponent {
53
53
  value: this.props.value,
54
54
  left: 0,
55
55
  needsOnRelease: false,
56
- isValid: true
56
+ isValid: true,
57
+ isRtl: false
57
58
  });
58
59
  _rollupPluginBabelHelpers.defineProperty(this, "thumbRef", void 0);
59
60
  _rollupPluginBabelHelpers.defineProperty(this, "filledTrackRef", void 0);
@@ -295,7 +296,7 @@ class Slider extends React.PureComponent {
295
296
  // use the provided value or state's value to calculate it instead.
296
297
  let leftPercent;
297
298
  if (clientX != null) {
298
- const leftOffset = clientX - (boundingRect?.left ?? 0);
299
+ const leftOffset = this.state.isRtl ? (boundingRect?.right ?? 0) - clientX : clientX - (boundingRect?.left ?? 0);
299
300
  leftPercent = leftOffset / width;
300
301
  } else {
301
302
  if (value == null) {
@@ -336,7 +337,8 @@ class Slider extends React.PureComponent {
336
337
  });
337
338
  this.setState({
338
339
  value,
339
- left
340
+ left,
341
+ isRtl: document?.dir === 'rtl'
340
342
  });
341
343
  }
342
344
  }
@@ -353,11 +355,20 @@ class Slider extends React.PureComponent {
353
355
  // Fire onChange event handler if present, if there's a usable value, and
354
356
  // if the value is different from the last one
355
357
 
358
+ // Set alternative positioning if direction is 'rtl'
356
359
  if (this.thumbRef.current) {
357
- this.thumbRef.current.style.left = `${this.state.left}%`;
360
+ if (this.state.isRtl) {
361
+ this.thumbRef.current.style.insetInlineStart = `calc(${this.state.left}% - 14px)`;
362
+ } else {
363
+ this.thumbRef.current.style.insetInlineStart = `${this.state.left}%`;
364
+ }
358
365
  }
359
366
  if (this.filledTrackRef.current) {
360
- this.filledTrackRef.current.style.transform = `translate(0%, -50%) scaleX(${this.state.left / 100})`;
367
+ if (this.state.isRtl) {
368
+ this.filledTrackRef.current.style.transform = `translate(100%, -50%) scaleX(-${this.state.left / 100})`;
369
+ } else {
370
+ this.filledTrackRef.current.style.transform = `translate(0%, -50%) scaleX(${this.state.left / 100})`;
371
+ }
361
372
  }
362
373
  if (prevState.value !== this.state.value && typeof this.props.onChange === 'function') {
363
374
  this.props.onChange({