@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.
- package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +9242 -0
- package/es/components/DataTable/Table.js +21 -1
- package/es/components/Grid/CSSGrid.js +1 -1
- package/es/components/Grid/ColumnHang.js +1 -1
- package/es/components/Grid/GridContext.d.ts +2 -2
- package/es/components/Grid/GridContext.js +1 -1
- package/es/components/Heading/index.d.ts +5 -40
- package/es/components/Heading/index.js +11 -6
- package/es/components/Icon/Icon.Skeleton.d.ts +25 -0
- package/es/components/Icon/Icon.Skeleton.js +1 -4
- package/es/components/Icon/index.d.ts +7 -0
- package/es/components/IconButton/index.js +9 -1
- package/es/components/Layer/index.js +5 -3
- package/es/components/Menu/Menu.js +14 -2
- package/es/components/Menu/MenuItem.js +28 -7
- package/es/components/MenuButton/index.js +1 -1
- package/es/components/MultiSelect/FilterableMultiSelect.js +6 -6
- package/es/components/MultiSelect/MultiSelect.js +6 -0
- package/es/components/Slider/Slider.d.ts +1 -0
- package/es/components/Slider/Slider.js +16 -5
- package/es/components/Tabs/Tabs.js +6 -8
- package/es/components/Tag/Tag.Skeleton.js +6 -3
- package/es/components/Tag/Tag.js +2 -2
- package/es/components/Text/Text.js +1 -1
- package/es/components/TextInput/PasswordInput.js +3 -1
- package/es/components/Theme/index.d.ts +3 -15
- package/es/components/Theme/index.js +6 -3
- package/es/components/TreeView/TreeNode.js +2 -2
- package/es/components/UIShell/HeaderMenu.js +11 -11
- package/lib/components/DataTable/Table.js +20 -0
- package/lib/components/Grid/CSSGrid.js +1 -1
- package/lib/components/Grid/ColumnHang.js +1 -1
- package/lib/components/Grid/GridContext.d.ts +2 -2
- package/lib/components/Grid/GridContext.js +1 -1
- package/lib/components/Heading/index.d.ts +5 -40
- package/lib/components/Heading/index.js +11 -6
- package/lib/components/Icon/Icon.Skeleton.d.ts +25 -0
- package/lib/components/Icon/Icon.Skeleton.js +1 -4
- package/lib/components/Icon/index.d.ts +7 -0
- package/lib/components/IconButton/index.js +9 -1
- package/lib/components/Layer/index.js +5 -3
- package/lib/components/Menu/Menu.js +14 -2
- package/lib/components/Menu/MenuItem.js +30 -9
- package/lib/components/MenuButton/index.js +1 -1
- package/lib/components/MultiSelect/FilterableMultiSelect.js +5 -5
- package/lib/components/MultiSelect/MultiSelect.js +6 -0
- package/lib/components/Slider/Slider.d.ts +1 -0
- package/lib/components/Slider/Slider.js +16 -5
- package/lib/components/Tabs/Tabs.js +6 -8
- package/lib/components/Tag/Tag.Skeleton.js +6 -3
- package/lib/components/Tag/Tag.js +2 -2
- package/lib/components/Text/Text.js +1 -1
- package/lib/components/TextInput/PasswordInput.js +3 -1
- package/lib/components/Theme/index.d.ts +3 -15
- package/lib/components/Theme/index.js +6 -3
- package/lib/components/TreeView/TreeNode.js +2 -2
- package/lib/components/UIShell/HeaderMenu.js +11 -11
- 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
|
|
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
|
|
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
|
-
},
|
|
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.
|
|
191
|
-
currentNodeLabel.current.style.
|
|
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
|
|
61
|
-
*
|
|
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
|
-
//
|
|
65
|
-
//
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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,
|
|
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,
|
|
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
|
-
},
|
|
32
|
+
}, rest));
|
|
36
33
|
};
|
|
37
34
|
IconSkeleton.propTypes = {
|
|
38
35
|
/**
|
|
@@ -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`,
|
|
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"]({
|
|
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
|
-
|
|
76
|
-
|
|
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
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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(
|
|
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 &&
|
|
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 &&
|
|
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.
|
|
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 :
|
|
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.
|
|
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
|
-
|
|
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({
|