@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.
Files changed (40) hide show
  1. package/.playwright/INTERNAL_AVT_REPORT_DO_NOT_USE.json +869 -799
  2. package/es/components/DatePicker/DatePicker.d.ts +1 -1
  3. package/es/components/DatePicker/DatePicker.js +2 -2
  4. package/es/components/DatePicker/plugins/appendToPlugin.d.ts +12 -0
  5. package/es/components/DatePicker/plugins/appendToPlugin.js +9 -12
  6. package/es/components/Menu/Menu.js +7 -2
  7. package/es/components/Menu/MenuItem.js +13 -2
  8. package/es/components/MultiSelect/FilterableMultiSelect.js +1 -1
  9. package/es/components/MultiSelect/filter.d.ts +10 -0
  10. package/es/components/MultiSelect/filter.js +21 -0
  11. package/es/components/Slider/Slider.d.ts +59 -198
  12. package/es/components/Slider/Slider.js +68 -120
  13. package/es/components/Tabs/usePressable.d.ts +19 -0
  14. package/es/components/Tabs/usePressable.js +19 -33
  15. package/es/components/Tooltip/Tooltip.d.ts +2 -2
  16. package/es/components/Tooltip/Tooltip.js +2 -2
  17. package/es/components/TreeView/TreeNode.d.ts +22 -0
  18. package/es/components/TreeView/TreeNode.js +116 -9
  19. package/es/components/UIShell/HeaderPanel.js +5 -7
  20. package/lib/components/DatePicker/DatePicker.d.ts +1 -1
  21. package/lib/components/DatePicker/DatePicker.js +1 -1
  22. package/lib/components/DatePicker/plugins/appendToPlugin.d.ts +12 -0
  23. package/lib/components/DatePicker/plugins/appendToPlugin.js +9 -12
  24. package/lib/components/Menu/Menu.js +7 -2
  25. package/lib/components/Menu/MenuItem.js +13 -2
  26. package/lib/components/MultiSelect/FilterableMultiSelect.js +1 -1
  27. package/lib/components/MultiSelect/filter.d.ts +10 -0
  28. package/lib/components/MultiSelect/filter.js +25 -0
  29. package/lib/components/Slider/Slider.d.ts +59 -198
  30. package/lib/components/Slider/Slider.js +67 -119
  31. package/lib/components/Tabs/usePressable.d.ts +19 -0
  32. package/lib/components/Tabs/usePressable.js +19 -33
  33. package/lib/components/Tooltip/Tooltip.d.ts +2 -2
  34. package/lib/components/Tooltip/Tooltip.js +2 -2
  35. package/lib/components/TreeView/TreeNode.d.ts +22 -0
  36. package/lib/components/TreeView/TreeNode.js +115 -8
  37. package/lib/components/UIShell/HeaderPanel.js +5 -7
  38. package/package.json +6 -6
  39. package/es/components/ComboBox/tools/filter.js +0 -18
  40. 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
- }), label)));
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
- }), label));
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
- }), label))), /*#__PURE__*/React__default["default"].createElement("ul", {
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
- }), label)), /*#__PURE__*/React__default["default"].createElement("ul", {
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
- activeElement
74
- } = document;
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 && !activeElement.closest(`.${prefix}--header-panel--expanded`) && !activeElement.closest(`.${prefix}--header__action`) && !headerPanelReference?.current?.classList.contains(`${prefix}--switcher`) && expanded) {
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.0-rc.0",
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-rc.0",
57
- "@carbon/layout": "^11.36.0-rc.0",
58
- "@carbon/styles": "^1.84.0-rc.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-rc.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": "80ee492dc5079b90b8bca04f49497a90b60a366e"
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;