@carbon/react 1.85.0-rc.0 → 1.85.1
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 +869 -799
- package/es/components/DatePicker/DatePicker.d.ts +1 -1
- package/es/components/DatePicker/DatePicker.js +2 -2
- package/es/components/DatePicker/plugins/appendToPlugin.d.ts +12 -0
- package/es/components/DatePicker/plugins/appendToPlugin.js +9 -12
- package/es/components/Menu/Menu.js +7 -2
- package/es/components/Menu/MenuItem.js +13 -2
- package/es/components/MultiSelect/FilterableMultiSelect.js +1 -1
- package/es/components/MultiSelect/filter.d.ts +10 -0
- package/es/components/MultiSelect/filter.js +21 -0
- package/es/components/Slider/Slider.d.ts +59 -198
- package/es/components/Slider/Slider.js +68 -120
- package/es/components/Tabs/usePressable.d.ts +19 -0
- package/es/components/Tabs/usePressable.js +19 -33
- package/es/components/Tooltip/Tooltip.d.ts +2 -2
- package/es/components/Tooltip/Tooltip.js +2 -2
- package/es/components/TreeView/TreeNode.d.ts +22 -0
- package/es/components/TreeView/TreeNode.js +116 -9
- package/es/components/UIShell/HeaderPanel.js +5 -7
- package/lib/components/DatePicker/DatePicker.d.ts +1 -1
- package/lib/components/DatePicker/DatePicker.js +1 -1
- package/lib/components/DatePicker/plugins/appendToPlugin.d.ts +12 -0
- package/lib/components/DatePicker/plugins/appendToPlugin.js +9 -12
- package/lib/components/Menu/Menu.js +7 -2
- package/lib/components/Menu/MenuItem.js +13 -2
- package/lib/components/MultiSelect/FilterableMultiSelect.js +1 -1
- package/lib/components/MultiSelect/filter.d.ts +10 -0
- package/lib/components/MultiSelect/filter.js +25 -0
- package/lib/components/Slider/Slider.d.ts +59 -198
- package/lib/components/Slider/Slider.js +67 -119
- package/lib/components/Tabs/usePressable.d.ts +19 -0
- package/lib/components/Tabs/usePressable.js +19 -33
- package/lib/components/Tooltip/Tooltip.d.ts +2 -2
- package/lib/components/Tooltip/Tooltip.js +2 -2
- package/lib/components/TreeView/TreeNode.d.ts +22 -0
- package/lib/components/TreeView/TreeNode.js +115 -8
- package/lib/components/UIShell/HeaderPanel.js +5 -7
- package/package.json +6 -6
- package/es/components/ComboBox/tools/filter.js +0 -18
- package/lib/components/ComboBox/tools/filter.js +0 -22
|
@@ -20,6 +20,7 @@ var useControllableState = require('../../internal/useControllableState.js');
|
|
|
20
20
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
21
21
|
var useId = require('../../internal/useId.js');
|
|
22
22
|
var index = require('../FeatureFlags/index.js');
|
|
23
|
+
var index$1 = require('../IconButton/index.js');
|
|
23
24
|
|
|
24
25
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
25
26
|
|
|
@@ -27,6 +28,74 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
|
|
|
27
28
|
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
|
|
28
29
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
29
30
|
|
|
31
|
+
const extractTextContent = node => {
|
|
32
|
+
if (node === null || node === undefined) return '';
|
|
33
|
+
if (typeof node === 'string') return node;
|
|
34
|
+
if (typeof node === 'number') return String(node);
|
|
35
|
+
if (typeof node === 'boolean') return String(node);
|
|
36
|
+
if (Array.isArray(node)) {
|
|
37
|
+
return node.map(extractTextContent).join('');
|
|
38
|
+
}
|
|
39
|
+
if (/*#__PURE__*/React__default["default"].isValidElement(node)) {
|
|
40
|
+
const element = node;
|
|
41
|
+
const children = element.props.children;
|
|
42
|
+
return extractTextContent(children);
|
|
43
|
+
}
|
|
44
|
+
return '';
|
|
45
|
+
};
|
|
46
|
+
const useEllipsisCheck = (label, detailsWrapperRef) => {
|
|
47
|
+
const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
|
|
48
|
+
const labelTextRef = React.useRef(null);
|
|
49
|
+
const checkEllipsis = React.useCallback(() => {
|
|
50
|
+
const element = labelTextRef.current;
|
|
51
|
+
if (!element) {
|
|
52
|
+
setIsEllipsisApplied(false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (element.offsetWidth === 0) {
|
|
56
|
+
setIsEllipsisApplied(false);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const checkElement = detailsWrapperRef.current || element;
|
|
60
|
+
if (checkElement && checkElement.offsetWidth > 0) {
|
|
61
|
+
const isTextTruncated = element.scrollWidth > checkElement.offsetWidth;
|
|
62
|
+
setIsEllipsisApplied(isTextTruncated);
|
|
63
|
+
} else {
|
|
64
|
+
setIsEllipsisApplied(false);
|
|
65
|
+
}
|
|
66
|
+
}, [detailsWrapperRef]);
|
|
67
|
+
React.useEffect(() => {
|
|
68
|
+
let animationFrameId;
|
|
69
|
+
animationFrameId = requestAnimationFrame(checkEllipsis);
|
|
70
|
+
let resizeObserver;
|
|
71
|
+
if (typeof window !== 'undefined' && typeof window.ResizeObserver !== 'undefined' && labelTextRef.current) {
|
|
72
|
+
resizeObserver = new window.ResizeObserver(() => {
|
|
73
|
+
requestAnimationFrame(checkEllipsis);
|
|
74
|
+
});
|
|
75
|
+
resizeObserver.observe(labelTextRef.current);
|
|
76
|
+
if (detailsWrapperRef.current) {
|
|
77
|
+
resizeObserver.observe(detailsWrapperRef.current);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return () => {
|
|
81
|
+
cancelAnimationFrame(animationFrameId);
|
|
82
|
+
if (resizeObserver) {
|
|
83
|
+
if (labelTextRef.current) {
|
|
84
|
+
resizeObserver.unobserve(labelTextRef.current);
|
|
85
|
+
}
|
|
86
|
+
if (detailsWrapperRef.current) {
|
|
87
|
+
resizeObserver.unobserve(detailsWrapperRef.current);
|
|
88
|
+
}
|
|
89
|
+
resizeObserver.disconnect();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}, [checkEllipsis, detailsWrapperRef]);
|
|
93
|
+
return {
|
|
94
|
+
labelTextRef,
|
|
95
|
+
isEllipsisApplied,
|
|
96
|
+
tooltipText: extractTextContent(label)
|
|
97
|
+
};
|
|
98
|
+
};
|
|
30
99
|
const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
31
100
|
active,
|
|
32
101
|
children,
|
|
@@ -45,11 +114,18 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
45
114
|
selected: propSelected,
|
|
46
115
|
value,
|
|
47
116
|
href,
|
|
117
|
+
align = 'bottom',
|
|
118
|
+
autoAlign = false,
|
|
48
119
|
...rest
|
|
49
120
|
}, forwardedRef) => {
|
|
50
|
-
// These are provided by the parent TreeView component
|
|
51
121
|
const depth = propDepth;
|
|
52
122
|
const selected = propSelected;
|
|
123
|
+
const detailsWrapperRef = React.useRef(null);
|
|
124
|
+
const {
|
|
125
|
+
labelTextRef,
|
|
126
|
+
isEllipsisApplied,
|
|
127
|
+
tooltipText
|
|
128
|
+
} = useEllipsisCheck(label, detailsWrapperRef);
|
|
53
129
|
const enableTreeviewControllable = index.useFeatureFlag('enable-treeview-controllable');
|
|
54
130
|
const {
|
|
55
131
|
current: id
|
|
@@ -71,6 +147,25 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
71
147
|
const currentNode = React.useRef(null);
|
|
72
148
|
const currentNodeLabel = React.useRef(null);
|
|
73
149
|
const prefix = usePrefix.usePrefix();
|
|
150
|
+
const renderLabelText = () => {
|
|
151
|
+
if (isEllipsisApplied && tooltipText) {
|
|
152
|
+
return /*#__PURE__*/React__default["default"].createElement(index$1.IconButton, {
|
|
153
|
+
label: tooltipText,
|
|
154
|
+
kind: "ghost",
|
|
155
|
+
align: align,
|
|
156
|
+
autoAlign: autoAlign,
|
|
157
|
+
className: `${prefix}--tree-node__label__text-button`,
|
|
158
|
+
wrapperClasses: `${prefix}--popover-container`
|
|
159
|
+
}, /*#__PURE__*/React__default["default"].createElement("span", {
|
|
160
|
+
ref: labelTextRef,
|
|
161
|
+
className: `${prefix}--tree-node__label__text`
|
|
162
|
+
}, label));
|
|
163
|
+
}
|
|
164
|
+
return /*#__PURE__*/React__default["default"].createElement("span", {
|
|
165
|
+
ref: labelTextRef,
|
|
166
|
+
className: `${prefix}--tree-node__label__text`
|
|
167
|
+
}, label);
|
|
168
|
+
};
|
|
74
169
|
const setRefs = element => {
|
|
75
170
|
currentNode.current = element;
|
|
76
171
|
if (typeof forwardedRef === 'function') {
|
|
@@ -310,7 +405,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
310
405
|
ref: currentNodeLabel
|
|
311
406
|
}, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
312
407
|
className: `${prefix}--tree-node__icon`
|
|
313
|
-
}),
|
|
408
|
+
}), renderLabelText())));
|
|
314
409
|
} else {
|
|
315
410
|
return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({}, treeNodeProps, {
|
|
316
411
|
ref: setRefs
|
|
@@ -319,7 +414,7 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
319
414
|
ref: currentNodeLabel
|
|
320
415
|
}, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
321
416
|
className: `${prefix}--tree-node__icon`
|
|
322
|
-
}),
|
|
417
|
+
}), renderLabelText()));
|
|
323
418
|
}
|
|
324
419
|
}
|
|
325
420
|
if (href) {
|
|
@@ -342,10 +437,11 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
342
437
|
}, /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretDown, {
|
|
343
438
|
className: toggleClasses
|
|
344
439
|
})), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
345
|
-
className: `${prefix}--tree-node__label__details
|
|
440
|
+
className: `${prefix}--tree-node__label__details`,
|
|
441
|
+
ref: detailsWrapperRef
|
|
346
442
|
}, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
347
443
|
className: `${prefix}--tree-node__icon`
|
|
348
|
-
}),
|
|
444
|
+
}), renderLabelText()))), /*#__PURE__*/React__default["default"].createElement("ul", {
|
|
349
445
|
id: `${id}-subtree`,
|
|
350
446
|
role: "group",
|
|
351
447
|
className: cx__default["default"](`${prefix}--tree-node__children`, {
|
|
@@ -368,10 +464,11 @@ const TreeNode = /*#__PURE__*/React__default["default"].forwardRef(({
|
|
|
368
464
|
}, /*#__PURE__*/React__default["default"].createElement(iconsReact.CaretDown, {
|
|
369
465
|
className: toggleClasses
|
|
370
466
|
})), /*#__PURE__*/React__default["default"].createElement("span", {
|
|
371
|
-
className: `${prefix}--tree-node__label__details
|
|
467
|
+
className: `${prefix}--tree-node__label__details`,
|
|
468
|
+
ref: detailsWrapperRef
|
|
372
469
|
}, Icon && /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
373
470
|
className: `${prefix}--tree-node__icon`
|
|
374
|
-
}),
|
|
471
|
+
}), renderLabelText())), /*#__PURE__*/React__default["default"].createElement("ul", {
|
|
375
472
|
id: `${id}-subtree`,
|
|
376
473
|
role: "group",
|
|
377
474
|
className: cx__default["default"](`${prefix}--tree-node__children`, {
|
|
@@ -454,7 +551,17 @@ TreeNode.propTypes = {
|
|
|
454
551
|
/**
|
|
455
552
|
* Optional: The URL the TreeNode is linking to
|
|
456
553
|
*/
|
|
457
|
-
href: PropTypes__default["default"].string
|
|
554
|
+
href: PropTypes__default["default"].string,
|
|
555
|
+
/**
|
|
556
|
+
* Specify how the tooltip should align when text is truncated
|
|
557
|
+
*/
|
|
558
|
+
align: PropTypes__default["default"].oneOf(['top', 'bottom', 'left', 'right', 'top-start', 'top-end', 'bottom-start', 'bottom-end', 'left-end', 'left-start', 'right-end', 'right-start']),
|
|
559
|
+
/**
|
|
560
|
+
* **Experimental**: Will attempt to automatically align the floating
|
|
561
|
+
* element to avoid collisions with the viewport and being clipped by
|
|
562
|
+
* ancestor elements.
|
|
563
|
+
*/
|
|
564
|
+
autoAlign: PropTypes__default["default"].bool
|
|
458
565
|
};
|
|
459
566
|
TreeNode.displayName = 'TreeNode';
|
|
460
567
|
|
|
@@ -68,14 +68,12 @@ const HeaderPanel = /*#__PURE__*/React__default["default"].forwardRef(function H
|
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
-
useEvent.useWindowEvent('click',
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (!(activeElement instanceof HTMLElement)) return;
|
|
76
|
-
setLastClickedElement(activeElement);
|
|
71
|
+
useEvent.useWindowEvent('click', event => {
|
|
72
|
+
const target = event.target;
|
|
73
|
+
if (!(target instanceof HTMLElement)) return;
|
|
74
|
+
setLastClickedElement(target);
|
|
77
75
|
const isChildASwitcher = /*#__PURE__*/React.isValidElement(children) && typeof children.type !== 'string' && children.type === Switcher["default"];
|
|
78
|
-
if (isChildASwitcher && !
|
|
76
|
+
if (isChildASwitcher && !target.closest(`.${prefix}--header-panel--expanded`) && !target.closest(`.${prefix}--header__action`) && !headerPanelReference?.current?.classList.contains(`${prefix}--switcher`) && expanded) {
|
|
79
77
|
setExpandedState(false);
|
|
80
78
|
onHeaderPanelFocus();
|
|
81
79
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carbon/react",
|
|
3
3
|
"description": "React components for the Carbon Design System",
|
|
4
|
-
"version": "1.85.
|
|
4
|
+
"version": "1.85.1",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/index.d.ts",
|
|
@@ -53,9 +53,9 @@
|
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@babel/runtime": "^7.27.3",
|
|
55
55
|
"@carbon/feature-flags": "^0.27.0",
|
|
56
|
-
"@carbon/icons-react": "^11.62.0
|
|
57
|
-
"@carbon/layout": "^11.36.0
|
|
58
|
-
"@carbon/styles": "^1.84.0
|
|
56
|
+
"@carbon/icons-react": "^11.62.0",
|
|
57
|
+
"@carbon/layout": "^11.36.0",
|
|
58
|
+
"@carbon/styles": "^1.84.0",
|
|
59
59
|
"@carbon/utilities": "^0.7.0",
|
|
60
60
|
"@floating-ui/react": "^0.27.4",
|
|
61
61
|
"@ibm/telemetry-js": "^1.5.0",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"@babel/preset-react": "^7.27.1",
|
|
81
81
|
"@babel/preset-typescript": "^7.27.1",
|
|
82
82
|
"@carbon/test-utils": "^10.36.0",
|
|
83
|
-
"@carbon/themes": "^11.55.0
|
|
83
|
+
"@carbon/themes": "^11.55.0",
|
|
84
84
|
"@figma/code-connect": "^1.3.2",
|
|
85
85
|
"@rollup/plugin-babel": "^6.0.0",
|
|
86
86
|
"@rollup/plugin-commonjs": "^28.0.0",
|
|
@@ -139,5 +139,5 @@
|
|
|
139
139
|
"**/*.scss",
|
|
140
140
|
"**/*.css"
|
|
141
141
|
],
|
|
142
|
-
"gitHead": "
|
|
142
|
+
"gitHead": "467c96c1d82d6b1261cf8f17ee1c8b27d0bc572f"
|
|
143
143
|
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright IBM Corp. 2016, 2023
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const defaultFilterItems = (items, {
|
|
9
|
-
itemToString,
|
|
10
|
-
inputValue
|
|
11
|
-
}) => items.filter(item => {
|
|
12
|
-
if (!inputValue) {
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
return itemToString(item).toLowerCase().includes(inputValue.toLowerCase());
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
export { defaultFilterItems };
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright IBM Corp. 2016, 2023
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
-
* LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
'use strict';
|
|
9
|
-
|
|
10
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
|
-
|
|
12
|
-
const defaultFilterItems = (items, {
|
|
13
|
-
itemToString,
|
|
14
|
-
inputValue
|
|
15
|
-
}) => items.filter(item => {
|
|
16
|
-
if (!inputValue) {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
return itemToString(item).toLowerCase().includes(inputValue.toLowerCase());
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
exports.defaultFilterItems = defaultFilterItems;
|