@carbon/react 1.84.0-rc.0 → 1.84.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 +883 -883
- package/es/components/ComposedModal/ComposedModal.js +19 -2
- package/es/components/Modal/Modal.js +19 -2
- package/es/components/MultiSelect/FilterableMultiSelect.js +21 -0
- package/es/components/OverflowMenu/OverflowMenu.js +4 -5
- package/es/components/PageHeader/PageHeader.d.ts +10 -9
- package/es/components/PageHeader/PageHeader.js +92 -32
- package/es/components/PageHeader/index.d.ts +2 -2
- package/es/components/PageHeader/index.js +1 -1
- package/es/components/Search/Search.js +0 -1
- package/es/components/Slider/Slider.js +6 -0
- package/es/components/TextArea/TextArea.js +4 -4
- package/es/components/TileGroup/TileGroup.d.ts +4 -4
- package/es/components/TileGroup/TileGroup.js +45 -53
- package/es/components/TileGroup/index.d.ts +3 -3
- package/es/components/UIShell/HeaderMenuItem.js +2 -1
- package/es/index.js +1 -1
- package/es/internal/useOverflowItems.d.ts +29 -0
- package/es/internal/useOverflowItems.js +122 -0
- package/lib/components/ComposedModal/ComposedModal.js +19 -2
- package/lib/components/Modal/Modal.js +19 -2
- package/lib/components/MultiSelect/FilterableMultiSelect.js +21 -0
- package/lib/components/OverflowMenu/OverflowMenu.js +4 -5
- package/lib/components/PageHeader/PageHeader.d.ts +10 -9
- package/lib/components/PageHeader/PageHeader.js +90 -32
- package/lib/components/PageHeader/index.d.ts +2 -2
- package/lib/components/PageHeader/index.js +0 -2
- package/lib/components/Search/Search.js +0 -1
- package/lib/components/Slider/Slider.js +6 -0
- package/lib/components/TextArea/TextArea.js +4 -4
- package/lib/components/TileGroup/TileGroup.d.ts +4 -4
- package/lib/components/TileGroup/TileGroup.js +44 -52
- package/lib/components/TileGroup/index.d.ts +3 -3
- package/lib/components/UIShell/HeaderMenuItem.js +2 -1
- package/lib/index.js +1 -1
- package/lib/internal/useOverflowItems.d.ts +29 -0
- package/lib/internal/useOverflowItems.js +126 -0
- package/package.json +9 -9
- package/telemetry.yml +2 -0
|
@@ -0,0 +1,122 @@
|
|
|
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
|
+
import { useRef, useState, useMemo, useEffect } from 'react';
|
|
9
|
+
import { useResizeObserver } from './useResizeObserver.js';
|
|
10
|
+
import { usePreviousValue } from './usePreviousValue.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Manages overflow items in a container by automatically hiding items that don't fit.
|
|
14
|
+
* @param items - Array of items to manage for overflow, each must have an `id` property.
|
|
15
|
+
* @param containerRef - React ref to the container element that holds the items.
|
|
16
|
+
* @param offsetRef - Optional ref to an offset element (like a "more" button) whose width is reserved when calculating available space.
|
|
17
|
+
* @param maxItems - Optional maximum number of visible items. If undefined, only container space constrains visibility.
|
|
18
|
+
* @param onChange - Optional callback called when hidden items change. Receives array of currently hidden items.
|
|
19
|
+
* @returns Object with `visibleItems` (items to display), `hiddenItems` (items that don't fit), and `itemRefHandler` (function to attach refs to items for width measurement).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const useOverflowItems = (items, containerRef, offsetRef, maxItems, onChange) => {
|
|
23
|
+
const itemsRef = useRef(null);
|
|
24
|
+
const [maxWidth, setMaxWidth] = useState(0);
|
|
25
|
+
if (!items || !Array.isArray(items)) {
|
|
26
|
+
return {
|
|
27
|
+
visibleItems: [],
|
|
28
|
+
hiddenItems: [],
|
|
29
|
+
itemRefHandler: () => {}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const handleResize = () => {
|
|
33
|
+
if (containerRef.current) {
|
|
34
|
+
const offset = offsetRef?.current?.offsetWidth || 0;
|
|
35
|
+
const newMax = containerRef.current.offsetWidth - offset;
|
|
36
|
+
setMaxWidth(newMax);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
useResizeObserver({
|
|
40
|
+
ref: containerRef,
|
|
41
|
+
onResize: handleResize
|
|
42
|
+
});
|
|
43
|
+
const getMap = () => {
|
|
44
|
+
if (!itemsRef.current) {
|
|
45
|
+
itemsRef.current = new Map();
|
|
46
|
+
}
|
|
47
|
+
return itemsRef.current;
|
|
48
|
+
};
|
|
49
|
+
const itemRefHandler = (id, node) => {
|
|
50
|
+
const map = getMap();
|
|
51
|
+
if (node) {
|
|
52
|
+
const style = getComputedStyle?.(node);
|
|
53
|
+
const totalWidth = node.offsetWidth + parseInt(style.marginLeft) + parseInt(style.marginRight);
|
|
54
|
+
map.set(id, totalWidth);
|
|
55
|
+
}
|
|
56
|
+
return () => {
|
|
57
|
+
map.delete(id);
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const getVisibleItems = () => {
|
|
61
|
+
if (!items || Array.isArray(items) === false) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
if (!containerRef) {
|
|
65
|
+
return items;
|
|
66
|
+
}
|
|
67
|
+
const map = getMap();
|
|
68
|
+
let maxReached = false;
|
|
69
|
+
let accumulatedWidth = 0;
|
|
70
|
+
const visibleItems = items.slice(0, maxItems).reduce((prev, cur) => {
|
|
71
|
+
if (maxReached) {
|
|
72
|
+
return prev;
|
|
73
|
+
}
|
|
74
|
+
const itemWidth = map.get(cur.id) || 0;
|
|
75
|
+
const willFit = accumulatedWidth + itemWidth <= maxWidth;
|
|
76
|
+
if (willFit) {
|
|
77
|
+
accumulatedWidth += itemWidth;
|
|
78
|
+
prev.push(cur);
|
|
79
|
+
} else {
|
|
80
|
+
maxReached = true;
|
|
81
|
+
}
|
|
82
|
+
return prev;
|
|
83
|
+
}, []);
|
|
84
|
+
return visibleItems;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// Memoize visible items calculation to avoid recalculating on every render
|
|
88
|
+
const visibleItems = useMemo(() => {
|
|
89
|
+
if (!Array.isArray(items)) {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
return getVisibleItems();
|
|
93
|
+
}, [items, maxWidth, maxItems]);
|
|
94
|
+
|
|
95
|
+
// Memoize hidden items calculation
|
|
96
|
+
const hiddenItems = useMemo(() => {
|
|
97
|
+
if (!Array.isArray(items)) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
return items.slice(visibleItems.length);
|
|
101
|
+
}, [items, visibleItems]);
|
|
102
|
+
|
|
103
|
+
// Use previous value to compare and only call onChange when needed
|
|
104
|
+
const previousHiddenItems = usePreviousValue(hiddenItems);
|
|
105
|
+
|
|
106
|
+
// Only call onChange if hidden items actually changed
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (previousHiddenItems && onChange) {
|
|
109
|
+
const hasChanged = hiddenItems.length !== previousHiddenItems.length || hiddenItems.some((item, index) => item !== previousHiddenItems[index]);
|
|
110
|
+
if (hasChanged) {
|
|
111
|
+
onChange(hiddenItems);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}, [hiddenItems, previousHiddenItems, onChange]);
|
|
115
|
+
return {
|
|
116
|
+
visibleItems,
|
|
117
|
+
itemRefHandler,
|
|
118
|
+
hiddenItems
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export { useOverflowItems as default };
|
|
@@ -186,7 +186,7 @@ const ComposedModal = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
186
186
|
target: oldActiveNode,
|
|
187
187
|
relatedTarget: currentActiveNode
|
|
188
188
|
}) {
|
|
189
|
-
if (open && currentActiveNode && oldActiveNode && innerModal.current) {
|
|
189
|
+
if (!enableDialogElement && !focusTrapWithoutSentinels && open && currentActiveNode && oldActiveNode && innerModal.current) {
|
|
190
190
|
const {
|
|
191
191
|
current: bodyNode
|
|
192
192
|
} = innerModal;
|
|
@@ -205,6 +205,23 @@ const ComposedModal = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
205
205
|
selectorsFloatingMenus: selectorsFloatingMenus?.filter(Boolean)
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
|
+
|
|
209
|
+
// Adjust scroll if needed so that element with focus is not obscured by gradient
|
|
210
|
+
const modalContent = document.querySelector(`.${prefix}--modal-content`);
|
|
211
|
+
if (!modalContent || !modalContent.classList.contains(`${prefix}--modal-scroll-content`) || !currentActiveNode || !modalContent.contains(currentActiveNode)) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const lastContent = modalContent.children[modalContent.children.length - 1];
|
|
215
|
+
const gradientSpacing = modalContent.scrollHeight - lastContent.offsetTop - lastContent.clientHeight;
|
|
216
|
+
for (let elem of modalContent.children) {
|
|
217
|
+
if (elem.contains(currentActiveNode)) {
|
|
218
|
+
const spaceBelow = modalContent.clientHeight - elem.offsetTop + modalContent.scrollTop - elem.clientHeight;
|
|
219
|
+
if (spaceBelow < gradientSpacing) {
|
|
220
|
+
modalContent.scrollTop = modalContent.scrollTop + (gradientSpacing - spaceBelow);
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
208
225
|
}
|
|
209
226
|
function closeModal(evt) {
|
|
210
227
|
if (!onClose || onClose(evt) !== false) {
|
|
@@ -319,7 +336,7 @@ const ComposedModal = /*#__PURE__*/React__default["default"].forwardRef(function
|
|
|
319
336
|
role: "presentation",
|
|
320
337
|
ref: ref,
|
|
321
338
|
"aria-hidden": !open,
|
|
322
|
-
onBlur:
|
|
339
|
+
onBlur: handleBlur,
|
|
323
340
|
onClick: events.composeEventHandlers([rest?.onClick, handleOnClick]),
|
|
324
341
|
onMouseDown: events.composeEventHandlers([rest?.onMouseDown, handleOnMouseDown]),
|
|
325
342
|
onKeyDown: handleKeyDown,
|
|
@@ -139,7 +139,7 @@ const Modal = /*#__PURE__*/React__default["default"].forwardRef(function Modal({
|
|
|
139
139
|
target: oldActiveNode,
|
|
140
140
|
relatedTarget: currentActiveNode
|
|
141
141
|
}) {
|
|
142
|
-
if (open && oldActiveNode instanceof HTMLElement && currentActiveNode instanceof HTMLElement) {
|
|
142
|
+
if (!enableDialogElement && open && oldActiveNode instanceof HTMLElement && currentActiveNode instanceof HTMLElement) {
|
|
143
143
|
const {
|
|
144
144
|
current: bodyNode
|
|
145
145
|
} = innerModal;
|
|
@@ -158,6 +158,23 @@ const Modal = /*#__PURE__*/React__default["default"].forwardRef(function Modal({
|
|
|
158
158
|
selectorsFloatingMenus
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
|
+
|
|
162
|
+
// Adjust scroll if needed so that element with focus is not obscured by gradient
|
|
163
|
+
const modalContent = document.querySelector(`.${prefix}--modal-content`);
|
|
164
|
+
if (!modalContent || !modalContent.classList.contains(`${prefix}--modal-scroll-content`) || !currentActiveNode || !modalContent.contains(currentActiveNode)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const lastContent = modalContent.children[modalContent.children.length - 1];
|
|
168
|
+
const gradientSpacing = modalContent.scrollHeight - lastContent.offsetTop - lastContent.clientHeight;
|
|
169
|
+
for (let elem of modalContent.children) {
|
|
170
|
+
if (elem.contains(currentActiveNode)) {
|
|
171
|
+
const spaceBelow = modalContent.clientHeight - elem.offsetTop + modalContent.scrollTop - elem.clientHeight;
|
|
172
|
+
if (spaceBelow < gradientSpacing) {
|
|
173
|
+
modalContent.scrollTop = modalContent.scrollTop + (gradientSpacing - spaceBelow);
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
161
178
|
}
|
|
162
179
|
const onSecondaryButtonClick = onSecondarySubmit ? onSecondarySubmit : onRequestClose;
|
|
163
180
|
const modalClasses = cx__default["default"](`${prefix}--modal`, {
|
|
@@ -414,7 +431,7 @@ const Modal = /*#__PURE__*/React__default["default"].forwardRef(function Modal({
|
|
|
414
431
|
level: 0,
|
|
415
432
|
onKeyDown: handleKeyDown,
|
|
416
433
|
onClick: events.composeEventHandlers([rest?.onClick, handleOnClick]),
|
|
417
|
-
onBlur:
|
|
434
|
+
onBlur: handleBlur,
|
|
418
435
|
className: modalClasses,
|
|
419
436
|
role: "presentation",
|
|
420
437
|
ref: ref
|
|
@@ -260,6 +260,27 @@ const FilterableMultiSelect = /*#__PURE__*/React.forwardRef(function FilterableM
|
|
|
260
260
|
onMenuChange?.(isOpen);
|
|
261
261
|
}
|
|
262
262
|
}, [isOpen, onMenuChange, open]);
|
|
263
|
+
React.useEffect(() => {
|
|
264
|
+
const handleClickOutside = event => {
|
|
265
|
+
const target = event.target;
|
|
266
|
+
const wrapper = document.getElementById(id)?.closest(`.${prefix}--multi-select__wrapper`);
|
|
267
|
+
|
|
268
|
+
// If click is outside our component and menu is open or input is focused
|
|
269
|
+
if (wrapper && !wrapper.contains(target)) {
|
|
270
|
+
if (isOpen || inputFocused) {
|
|
271
|
+
setIsOpen(false);
|
|
272
|
+
setInputFocused(false);
|
|
273
|
+
setInputValue('');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
if (inputFocused || isOpen) {
|
|
278
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
279
|
+
}
|
|
280
|
+
return () => {
|
|
281
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
282
|
+
};
|
|
283
|
+
}, [isOpen, inputFocused]);
|
|
263
284
|
const {
|
|
264
285
|
getToggleButtonProps,
|
|
265
286
|
getLabelProps,
|
|
@@ -154,14 +154,14 @@ const OverflowMenu = /*#__PURE__*/React.forwardRef(({
|
|
|
154
154
|
setHasMountedTrigger(true);
|
|
155
155
|
}
|
|
156
156
|
}, []);
|
|
157
|
-
|
|
158
|
-
// Call `onClose` when menu closes.
|
|
159
157
|
React.useEffect(() => {
|
|
160
|
-
if (
|
|
158
|
+
if (open && !prevOpenState.current) {
|
|
159
|
+
onOpen();
|
|
160
|
+
} else if (!open && prevOpenState.current) {
|
|
161
161
|
onClose();
|
|
162
162
|
}
|
|
163
163
|
prevOpenState.current = open;
|
|
164
|
-
}, [open, onClose]);
|
|
164
|
+
}, [open, onClose, onOpen]);
|
|
165
165
|
useOutsideClick.useOutsideClick(wrapperRef, ({
|
|
166
166
|
target
|
|
167
167
|
}) => {
|
|
@@ -270,7 +270,6 @@ const OverflowMenu = /*#__PURE__*/React.forwardRef(({
|
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
272
|
}, !hasFocusin);
|
|
273
|
-
onOpen();
|
|
274
273
|
};
|
|
275
274
|
const getTarget = () => {
|
|
276
275
|
const triggerEl = triggerRef.current;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import React, { type ComponentType, type FunctionComponent } from 'react';
|
|
8
8
|
import PropTypes from 'prop-types';
|
|
9
|
-
import {
|
|
9
|
+
import { TYPES } from '../Tag/Tag';
|
|
10
10
|
/**
|
|
11
11
|
* ----------
|
|
12
12
|
* PageHeader
|
|
@@ -199,16 +199,18 @@ declare const PageHeaderHeroImage: {
|
|
|
199
199
|
* PageHeaderTabBar
|
|
200
200
|
* ----------------
|
|
201
201
|
*/
|
|
202
|
+
interface TagItem {
|
|
203
|
+
type: keyof typeof TYPES;
|
|
204
|
+
text: string;
|
|
205
|
+
size?: 'sm' | 'md' | 'lg';
|
|
206
|
+
id: string;
|
|
207
|
+
}
|
|
202
208
|
interface PageHeaderTabBarProps {
|
|
203
209
|
children?: React.ReactNode;
|
|
204
210
|
className?: string;
|
|
211
|
+
tags?: TagItem[];
|
|
205
212
|
}
|
|
206
213
|
declare const PageHeaderTabBar: React.ForwardRefExoticComponent<PageHeaderTabBarProps & React.RefAttributes<HTMLDivElement>>;
|
|
207
|
-
interface PageHeaderTabsProps extends React.ComponentProps<typeof BaseTabs> {
|
|
208
|
-
children?: React.ReactNode;
|
|
209
|
-
className?: string;
|
|
210
|
-
}
|
|
211
|
-
declare const PageHeaderTabs: React.ForwardRefExoticComponent<PageHeaderTabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
212
214
|
/**
|
|
213
215
|
* -------
|
|
214
216
|
* Exports
|
|
@@ -272,6 +274,5 @@ declare const HeroImage: {
|
|
|
272
274
|
};
|
|
273
275
|
};
|
|
274
276
|
declare const TabBar: React.ForwardRefExoticComponent<PageHeaderTabBarProps & React.RefAttributes<HTMLDivElement>>;
|
|
275
|
-
|
|
276
|
-
export {
|
|
277
|
-
export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderHeroImageProps, PageHeaderTabBarProps, PageHeaderTabsProps, };
|
|
277
|
+
export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderHeroImage, PageHeaderTabBar, Root, BreadcrumbBar, Content, ContentPageActions, ContentText, HeroImage, TabBar, };
|
|
278
|
+
export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderHeroImageProps, PageHeaderTabBarProps, };
|
|
@@ -24,7 +24,14 @@ var DefinitionTooltip = require('../Tooltip/DefinitionTooltip.js');
|
|
|
24
24
|
require('../Tooltip/Tooltip.js');
|
|
25
25
|
var AspectRatio = require('../AspectRatio/AspectRatio.js');
|
|
26
26
|
var utilities = require('@carbon/utilities');
|
|
27
|
-
var
|
|
27
|
+
var Tag = require('../Tag/Tag.js');
|
|
28
|
+
require('../Tag/DismissibleTag.js');
|
|
29
|
+
var OperationalTag = require('../Tag/OperationalTag.js');
|
|
30
|
+
require('../Tag/SelectableTag.js');
|
|
31
|
+
require('../Tag/Tag.Skeleton.js');
|
|
32
|
+
var useOverflowItems = require('../../internal/useOverflowItems.js');
|
|
33
|
+
var index$1 = require('../Popover/index.js');
|
|
34
|
+
var useId = require('../../internal/useId.js');
|
|
28
35
|
require('../Grid/FlexGrid.js');
|
|
29
36
|
var Grid = require('../Grid/Grid.js');
|
|
30
37
|
require('../Grid/Row.js');
|
|
@@ -365,46 +372,101 @@ PageHeaderHeroImage.propTypes = {
|
|
|
365
372
|
const PageHeaderTabBar = /*#__PURE__*/React__default["default"].forwardRef(function PageHeaderTabBar({
|
|
366
373
|
className,
|
|
367
374
|
children,
|
|
375
|
+
tags = [],
|
|
368
376
|
...other
|
|
369
377
|
}, ref) {
|
|
370
378
|
const prefix = usePrefix.usePrefix();
|
|
371
379
|
const classNames = cx__default["default"]({
|
|
372
380
|
[`${prefix}--page-header__tab-bar`]: true
|
|
373
381
|
}, className);
|
|
382
|
+
// Early return if no tags are provided
|
|
383
|
+
if (!tags.length) {
|
|
384
|
+
return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
385
|
+
className: classNames,
|
|
386
|
+
ref: ref
|
|
387
|
+
}, other), /*#__PURE__*/React__default["default"].createElement(Grid.Grid, null, /*#__PURE__*/React__default["default"].createElement(Column["default"], {
|
|
388
|
+
lg: 16,
|
|
389
|
+
md: 8,
|
|
390
|
+
sm: 4
|
|
391
|
+
}, children)));
|
|
392
|
+
}
|
|
393
|
+
const [openPopover, setOpenPopover] = React.useState(false);
|
|
394
|
+
const tagSize = tags[0]?.size || 'md';
|
|
395
|
+
const instanceId = useId.useId('PageHeaderTabBar');
|
|
396
|
+
const tagsWithIds = React.useMemo(() => {
|
|
397
|
+
return tags.map((tag, index) => ({
|
|
398
|
+
...tag,
|
|
399
|
+
id: tag.id || `tag-${index}-${instanceId}`
|
|
400
|
+
}));
|
|
401
|
+
}, [tags]);
|
|
402
|
+
const tagsContainerRef = React.useRef(null);
|
|
403
|
+
const offsetRef = React.useRef(null);
|
|
404
|
+
// To close popover when window resizes
|
|
405
|
+
React.useEffect(() => {
|
|
406
|
+
const handleResize = () => {
|
|
407
|
+
// Close the popover when window resizes to prevent unwanted opens
|
|
408
|
+
setOpenPopover(false);
|
|
409
|
+
};
|
|
410
|
+
window.addEventListener('resize', handleResize);
|
|
411
|
+
return () => {
|
|
412
|
+
window.removeEventListener('resize', handleResize);
|
|
413
|
+
};
|
|
414
|
+
}, []);
|
|
415
|
+
|
|
416
|
+
// overflow items hook
|
|
417
|
+
const {
|
|
418
|
+
visibleItems = [],
|
|
419
|
+
hiddenItems = [],
|
|
420
|
+
itemRefHandler = () => {}
|
|
421
|
+
} = useOverflowItems["default"](tagsWithIds, tagsContainerRef, offsetRef) || {
|
|
422
|
+
visibleItems: [],
|
|
423
|
+
hiddenItems: [],
|
|
424
|
+
itemRefHandler: () => {}
|
|
425
|
+
};
|
|
426
|
+
const handleOverflowClick = React.useCallback(event => {
|
|
427
|
+
event.stopPropagation();
|
|
428
|
+
setOpenPopover(prev => !prev);
|
|
429
|
+
}, []);
|
|
430
|
+
|
|
431
|
+
// Function to render tags
|
|
432
|
+
const renderTags = () => /*#__PURE__*/React__default["default"].createElement("div", {
|
|
433
|
+
className: `${prefix}--page-header__tags`,
|
|
434
|
+
ref: tagsContainerRef
|
|
435
|
+
}, visibleItems.map(tag => /*#__PURE__*/React__default["default"].createElement(Tag["default"], {
|
|
436
|
+
key: tag.id,
|
|
437
|
+
ref: node => itemRefHandler(tag.id, node),
|
|
438
|
+
type: tag.type,
|
|
439
|
+
size: tag.size,
|
|
440
|
+
className: `${prefix}--page-header__tag-item`
|
|
441
|
+
}, tag.text)), hiddenItems.length > 0 && /*#__PURE__*/React__default["default"].createElement(index$1.Popover, {
|
|
442
|
+
open: openPopover,
|
|
443
|
+
onRequestClose: () => setOpenPopover(false)
|
|
444
|
+
}, /*#__PURE__*/React__default["default"].createElement(OperationalTag["default"], {
|
|
445
|
+
onClick: handleOverflowClick,
|
|
446
|
+
"aria-expanded": openPopover,
|
|
447
|
+
text: `+${hiddenItems.length}`,
|
|
448
|
+
size: tagSize
|
|
449
|
+
}), /*#__PURE__*/React__default["default"].createElement(index$1.PopoverContent, {
|
|
450
|
+
className: "tag-popover-content"
|
|
451
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
452
|
+
className: `${prefix}--page-header__tags-popover-list`
|
|
453
|
+
}, hiddenItems.map(tag => /*#__PURE__*/React__default["default"].createElement(Tag["default"], {
|
|
454
|
+
key: tag.id,
|
|
455
|
+
type: tag.type,
|
|
456
|
+
size: tag.size
|
|
457
|
+
}, tag.text))))));
|
|
374
458
|
return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
375
459
|
className: classNames,
|
|
376
460
|
ref: ref
|
|
377
|
-
}, other),
|
|
378
|
-
});
|
|
379
|
-
PageHeaderTabBar.displayName = 'PageHeaderTabBar';
|
|
380
|
-
const PageHeaderTabs = /*#__PURE__*/React__default["default"].forwardRef(function PageHeaderTabs({
|
|
381
|
-
className,
|
|
382
|
-
children,
|
|
383
|
-
...other
|
|
384
|
-
}, ref) {
|
|
385
|
-
const prefix = usePrefix.usePrefix();
|
|
386
|
-
const childrenArray = React__default["default"].Children.toArray(children);
|
|
387
|
-
let tabListElement = null;
|
|
388
|
-
const otherChildren = [];
|
|
389
|
-
|
|
390
|
-
// extract the TabList component so we can wrap a needed div around for
|
|
391
|
-
// layout purposes
|
|
392
|
-
childrenArray.forEach(child => {
|
|
393
|
-
if (child?.type?.displayName === 'TabList' || child?.type?.name === 'TabList') {
|
|
394
|
-
tabListElement = child;
|
|
395
|
-
} else {
|
|
396
|
-
otherChildren.push(child);
|
|
397
|
-
}
|
|
398
|
-
});
|
|
399
|
-
return /*#__PURE__*/React__default["default"].createElement(Tabs$1.Tabs, other, tabListElement && /*#__PURE__*/React__default["default"].createElement("div", {
|
|
400
|
-
className: `${prefix}--page-header__tablist-wrapper`
|
|
401
|
-
}, /*#__PURE__*/React__default["default"].createElement(Grid.Grid, null, /*#__PURE__*/React__default["default"].createElement(Column["default"], {
|
|
461
|
+
}, other), /*#__PURE__*/React__default["default"].createElement(Grid.Grid, null, /*#__PURE__*/React__default["default"].createElement(Column["default"], {
|
|
402
462
|
lg: 16,
|
|
403
463
|
md: 8,
|
|
404
464
|
sm: 4
|
|
405
|
-
},
|
|
465
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
466
|
+
className: `${prefix}--page-header__tab-bar--tablist`
|
|
467
|
+
}, children, tags.length > 0 && renderTags()))));
|
|
406
468
|
});
|
|
407
|
-
|
|
469
|
+
PageHeaderTabBar.displayName = 'PageHeaderTabBar';
|
|
408
470
|
|
|
409
471
|
/**
|
|
410
472
|
* -------
|
|
@@ -425,8 +487,6 @@ const HeroImage = PageHeaderHeroImage;
|
|
|
425
487
|
HeroImage.displayName = 'PageHeaderHeroImage';
|
|
426
488
|
const TabBar = PageHeaderTabBar;
|
|
427
489
|
TabBar.displayName = 'PageHeaderTabBar';
|
|
428
|
-
const Tabs = PageHeaderTabs;
|
|
429
|
-
Tabs.displayName = 'PageHeader.Tabs';
|
|
430
490
|
|
|
431
491
|
exports.BreadcrumbBar = BreadcrumbBar;
|
|
432
492
|
exports.Content = Content;
|
|
@@ -440,7 +500,5 @@ exports.PageHeaderContentPageActions = PageHeaderContentPageActions;
|
|
|
440
500
|
exports.PageHeaderContentText = PageHeaderContentText;
|
|
441
501
|
exports.PageHeaderHeroImage = PageHeaderHeroImage;
|
|
442
502
|
exports.PageHeaderTabBar = PageHeaderTabBar;
|
|
443
|
-
exports.PageHeaderTabs = PageHeaderTabs;
|
|
444
503
|
exports.Root = Root;
|
|
445
504
|
exports.TabBar = TabBar;
|
|
446
|
-
exports.Tabs = Tabs;
|
|
@@ -4,5 +4,5 @@
|
|
|
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
|
-
export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderTabBar, PageHeaderHeroImage,
|
|
8
|
-
export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderTabBarProps, PageHeaderHeroImageProps,
|
|
7
|
+
export { PageHeader, PageHeaderBreadcrumbBar, PageHeaderContent, PageHeaderContentPageActions, PageHeaderContentText, PageHeaderTabBar, PageHeaderHeroImage, Root, BreadcrumbBar, Content, ContentPageActions, ContentText, TabBar, HeroImage, } from './PageHeader';
|
|
8
|
+
export type { PageHeaderProps, PageHeaderBreadcrumbBarProps, PageHeaderContentProps, PageHeaderContentPageActionsProps, PageHeaderContentTextProps, PageHeaderTabBarProps, PageHeaderHeroImageProps, } from './PageHeader';
|
|
@@ -25,7 +25,5 @@ exports.PageHeaderContentPageActions = PageHeader.PageHeaderContentPageActions;
|
|
|
25
25
|
exports.PageHeaderContentText = PageHeader.PageHeaderContentText;
|
|
26
26
|
exports.PageHeaderHeroImage = PageHeader.PageHeaderHeroImage;
|
|
27
27
|
exports.PageHeaderTabBar = PageHeader.PageHeaderTabBar;
|
|
28
|
-
exports.PageHeaderTabs = PageHeader.PageHeaderTabs;
|
|
29
28
|
exports.Root = PageHeader.Root;
|
|
30
29
|
exports.TabBar = PageHeader.TabBar;
|
|
31
|
-
exports.Tabs = PageHeader.Tabs;
|
|
@@ -144,7 +144,6 @@ const Search = /*#__PURE__*/React__default["default"].forwardRef(function Search
|
|
|
144
144
|
"aria-label": placeholder,
|
|
145
145
|
className: searchClasses
|
|
146
146
|
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
|
147
|
-
"aria-label": onExpand ? 'button' : undefined,
|
|
148
147
|
"aria-labelledby": onExpand ? searchId : undefined,
|
|
149
148
|
role: onExpand ? 'button' : undefined,
|
|
150
149
|
className: `${prefix}--search-magnifier`,
|
|
@@ -768,6 +768,9 @@ class Slider extends React.PureComponent {
|
|
|
768
768
|
valueUpper,
|
|
769
769
|
leftUpper
|
|
770
770
|
});
|
|
771
|
+
if (this.filledTrackRef.current) {
|
|
772
|
+
this.filledTrackRef.current.style.transform = this.state.isRtl ? `translate(${100 - this.state.leftUpper}%, -50%) scaleX(${(this.state.leftUpper - this.state.left) / 100})` : `translate(${this.state.left}%, -50%) scaleX(${(this.state.leftUpper - this.state.left) / 100})`;
|
|
773
|
+
}
|
|
771
774
|
} else {
|
|
772
775
|
const {
|
|
773
776
|
value,
|
|
@@ -781,6 +784,9 @@ class Slider extends React.PureComponent {
|
|
|
781
784
|
value,
|
|
782
785
|
left
|
|
783
786
|
});
|
|
787
|
+
if (this.filledTrackRef.current) {
|
|
788
|
+
this.filledTrackRef.current.style.transform = this.state.isRtl ? `translate(100%, -50%) scaleX(-${this.state.left / 100})` : `translate(0%, -50%) scaleX(${this.state.left / 100})`;
|
|
789
|
+
}
|
|
784
790
|
}
|
|
785
791
|
}
|
|
786
792
|
}
|
|
@@ -75,7 +75,7 @@ const TextArea = frFn((props, forwardRef) => {
|
|
|
75
75
|
if (counterMode === 'character') {
|
|
76
76
|
return strValue.length;
|
|
77
77
|
} else {
|
|
78
|
-
return strValue.match(/\
|
|
78
|
+
return strValue.match(/\p{L}+/gu)?.length || 0;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
const [textCount, setTextCount] = React.useState(getInitialTextCount());
|
|
@@ -107,8 +107,8 @@ const TextArea = frFn((props, forwardRef) => {
|
|
|
107
107
|
onPaste: evt => {
|
|
108
108
|
if (!disabled) {
|
|
109
109
|
if (counterMode === 'word' && enableCounter && typeof maxCount !== 'undefined' && textareaRef.current !== null) {
|
|
110
|
-
const existingWords = textareaRef.current.value.match(/\
|
|
111
|
-
const pastedWords = evt.clipboardData.getData('Text').match(/\
|
|
110
|
+
const existingWords = textareaRef.current.value.match(/\p{L}+/gu) || [];
|
|
111
|
+
const pastedWords = evt.clipboardData.getData('Text').match(/\p{L}+/gu) || [];
|
|
112
112
|
const totalWords = existingWords.length + pastedWords.length;
|
|
113
113
|
if (totalWords > maxCount) {
|
|
114
114
|
evt.preventDefault();
|
|
@@ -137,7 +137,7 @@ const TextArea = frFn((props, forwardRef) => {
|
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
139
139
|
if (enableCounter && typeof maxCount !== 'undefined' && textareaRef.current !== null) {
|
|
140
|
-
const matchedWords = evt.target?.value?.match(/\
|
|
140
|
+
const matchedWords = evt.target?.value?.match(/\p{L}+/gu);
|
|
141
141
|
if (matchedWords && matchedWords.length <= maxCount) {
|
|
142
142
|
textareaRef.current.removeAttribute('maxLength');
|
|
143
143
|
setTimeout(() => {
|
|
@@ -45,8 +45,9 @@ export interface TileGroupProps extends Omit<HTMLAttributes<HTMLFieldSetElement>
|
|
|
45
45
|
*/
|
|
46
46
|
required?: boolean;
|
|
47
47
|
}
|
|
48
|
-
declare const TileGroup: {
|
|
49
|
-
(
|
|
48
|
+
export declare const TileGroup: {
|
|
49
|
+
({ children, className, defaultSelected, disabled, legend, name, onChange, valueSelected, required, }: TileGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
displayName: string;
|
|
50
51
|
propTypes: {
|
|
51
52
|
/**
|
|
52
53
|
* Provide a collection of <RadioTile> components to render in the group
|
|
@@ -86,6 +87,5 @@ declare const TileGroup: {
|
|
|
86
87
|
*/
|
|
87
88
|
valueSelected: PropTypes.Requireable<NonNullable<string | number | null | undefined>>;
|
|
88
89
|
};
|
|
89
|
-
displayName: string;
|
|
90
90
|
};
|
|
91
|
-
export
|
|
91
|
+
export {};
|