@carbon/ibm-products 2.72.1 → 2.73.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/css/index-full-carbon.css +26 -12
- package/css/index-full-carbon.css.map +1 -1
- package/css/index-full-carbon.min.css +1 -1
- package/css/index-full-carbon.min.css.map +1 -1
- package/css/index-without-carbon-released-only.css +26 -12
- package/css/index-without-carbon-released-only.css.map +1 -1
- package/css/index-without-carbon-released-only.min.css +1 -1
- package/css/index-without-carbon-released-only.min.css.map +1 -1
- package/css/index-without-carbon.css +26 -12
- package/css/index-without-carbon.css.map +1 -1
- package/css/index-without-carbon.min.css +1 -1
- package/css/index-without-carbon.min.css.map +1 -1
- package/css/index.css +26 -12
- package/css/index.css.map +1 -1
- package/css/index.min.css +1 -1
- package/css/index.min.css.map +1 -1
- package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -0
- package/es/components/CreateFullPage/CreateFullPage.js +2 -1
- package/es/components/CreateModal/CreateModal.js +2 -1
- package/es/components/CreateSidePanel/CreateSidePanel.js +2 -1
- package/es/components/CreateTearsheet/CreateTearsheet.js +2 -1
- package/es/components/CreateTearsheetNarrow/CreateTearsheetNarrow.js +2 -1
- package/es/components/EmptyStates/EmptyStateContent.js +1 -1
- package/es/components/EmptyStates/EmptyStateV2.js +1 -1
- package/es/components/PageHeader/next/PageHeader.js +65 -9
- package/es/components/PageHeader/next/context.d.ts +4 -0
- package/es/components/PageHeader/next/context.js +4 -1
- package/es/components/PageHeader/next/overflowHandler.js +1 -1
- package/es/components/SidePanel/SidePanel.js +1 -1
- package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -0
- package/lib/components/CreateFullPage/CreateFullPage.js +2 -1
- package/lib/components/CreateModal/CreateModal.js +2 -1
- package/lib/components/CreateSidePanel/CreateSidePanel.js +2 -1
- package/lib/components/CreateTearsheet/CreateTearsheet.js +2 -1
- package/lib/components/CreateTearsheetNarrow/CreateTearsheetNarrow.js +2 -1
- package/lib/components/EmptyStates/EmptyStateContent.js +1 -1
- package/lib/components/EmptyStates/EmptyStateV2.js +1 -1
- package/lib/components/PageHeader/next/PageHeader.js +65 -9
- package/lib/components/PageHeader/next/context.d.ts +4 -0
- package/lib/components/PageHeader/next/context.js +4 -1
- package/lib/components/PageHeader/next/overflowHandler.js +1 -1
- package/lib/components/SidePanel/SidePanel.js +1 -1
- package/package.json +6 -6
- package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +1 -1
- package/scss/components/PageHeader/_page-header.scss +41 -18
- package/scss/components/SidePanel/_side-panel.scss +6 -1
@@ -63,6 +63,7 @@ let BreadcrumbWithOverflow = _ref => {
|
|
63
63
|
}, /*#__PURE__*/React__default.createElement(unstable_FeatureFlags, {
|
64
64
|
enableV12Overflowmenu: true
|
65
65
|
}, /*#__PURE__*/React__default.createElement(OverflowMenu, {
|
66
|
+
role: "navigation",
|
66
67
|
"aria-label": overflowAriaLabel,
|
67
68
|
label: overflowAriaLabel // also needs setting to avoid a11y "Accessible name does not match or contain the visible label text"
|
68
69
|
,
|
@@ -92,6 +93,7 @@ let BreadcrumbWithOverflow = _ref => {
|
|
92
93
|
}, /*#__PURE__*/React__default.createElement(BreadcrumbItem, {
|
93
94
|
key: `${blockClass}-hidden-overflow-${internalId}`
|
94
95
|
}, /*#__PURE__*/React__default.createElement(OverflowMenu, {
|
96
|
+
role: "navigation",
|
95
97
|
"aria-label": overflowAriaLabel,
|
96
98
|
renderIcon: props => /*#__PURE__*/React__default.createElement(OverflowMenuHorizontal, _extends({
|
97
99
|
size: 32
|
@@ -173,7 +173,8 @@ let CreateFullPage = /*#__PURE__*/React__default.forwardRef((_ref, ref) => {
|
|
173
173
|
className: `${blockClass}__content`
|
174
174
|
}, /*#__PURE__*/React__default.createElement(Form, {
|
175
175
|
className: `${blockClass}__form`,
|
176
|
-
"aria-label": title
|
176
|
+
"aria-label": title,
|
177
|
+
onSubmit: e => e.preventDefault()
|
177
178
|
}, /*#__PURE__*/React__default.createElement(StepsContext.Provider, {
|
178
179
|
value: {
|
179
180
|
currentStep,
|
@@ -63,7 +63,8 @@ let CreateModal = /*#__PURE__*/React__default.forwardRef((props, ref) => {
|
|
63
63
|
className: `${blockClass}__description`
|
64
64
|
}, description), /*#__PURE__*/React__default.createElement(Form, {
|
65
65
|
className: `${blockClass}__form`,
|
66
|
-
"aria-label": title
|
66
|
+
"aria-label": title,
|
67
|
+
onSubmit: e => e.preventDefault()
|
67
68
|
}, children)), /*#__PURE__*/React__default.createElement(ModalFooter, null, /*#__PURE__*/React__default.createElement(Button, {
|
68
69
|
type: "button",
|
69
70
|
kind: "secondary",
|
@@ -82,7 +82,8 @@ let CreateSidePanel = /*#__PURE__*/React__default.forwardRef((_ref, ref) => {
|
|
82
82
|
className: `${blockClass}__form-description-text ${blockClass}__content-text`
|
83
83
|
}, formDescription), /*#__PURE__*/React__default.createElement(Form, {
|
84
84
|
className: `${blockClass}__form`,
|
85
|
-
"aria-labelledby": formTitleId
|
85
|
+
"aria-labelledby": formTitleId,
|
86
|
+
onSubmit: e => e.preventDefault()
|
86
87
|
}, children));
|
87
88
|
});
|
88
89
|
CreateSidePanel = pkg.checkComponentEnabled(CreateSidePanel, componentName);
|
@@ -167,7 +167,8 @@ let CreateTearsheet = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
167
167
|
className: `${blockClass}__content`,
|
168
168
|
ref: contentRef
|
169
169
|
}, /*#__PURE__*/React__default.createElement(Form, {
|
170
|
-
"aria-label": title
|
170
|
+
"aria-label": title,
|
171
|
+
onSubmit: e => e.preventDefault()
|
171
172
|
}, /*#__PURE__*/React__default.createElement(StepsContext.Provider, {
|
172
173
|
value: {
|
173
174
|
currentStep,
|
@@ -78,7 +78,8 @@ let CreateTearsheetNarrow = /*#__PURE__*/React__default.forwardRef((_ref, ref) =
|
|
78
78
|
className: cx(`${blockClass}__form-description-text`, formTextClass)
|
79
79
|
}, formDescription), /*#__PURE__*/React__default.createElement(Form, {
|
80
80
|
className: `${blockClass}__form`,
|
81
|
-
"aria-labelledby": formTitleId
|
81
|
+
"aria-labelledby": formTitleId,
|
82
|
+
onSubmit: e => e.preventDefault()
|
82
83
|
}, children));
|
83
84
|
});
|
84
85
|
|
@@ -31,7 +31,7 @@ const EmptyStateContent = props => {
|
|
31
31
|
className: cx(`${blockClass}__header`, {
|
32
32
|
[`${blockClass}__header--small`]: size === 'sm'
|
33
33
|
})
|
34
|
-
}, title), subtitle && /*#__PURE__*/React__default.createElement("
|
34
|
+
}, title), subtitle && /*#__PURE__*/React__default.createElement("div", {
|
35
35
|
className: cx(`${blockClass}__subtitle`, {
|
36
36
|
[`${blockClass}__subtitle--small`]: size === 'sm'
|
37
37
|
})
|
@@ -59,7 +59,7 @@ let EmptyStateV2 = /*#__PURE__*/React__default.forwardRef((props, ref) => {
|
|
59
59
|
className: cx(`${blockClass}__header`, {
|
60
60
|
[`${blockClass}__header--small`]: size === 'sm'
|
61
61
|
})
|
62
|
-
}, title), subtitle && /*#__PURE__*/React__default.createElement("
|
62
|
+
}, title), subtitle && /*#__PURE__*/React__default.createElement("div", {
|
63
63
|
className: cx(`${blockClass}__subtitle`, {
|
64
64
|
[`${blockClass}__subtitle--small`]: size === 'sm'
|
65
65
|
})
|
@@ -35,6 +35,7 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
35
35
|
...other
|
36
36
|
} = _ref;
|
37
37
|
const [refs, setRefs] = useState({});
|
38
|
+
const [pageActionsInstance, setPageActionsInstance] = useState(null);
|
38
39
|
const tempRef = useRef(null);
|
39
40
|
const componentRef = ref ?? tempRef;
|
40
41
|
const classNames = cx({
|
@@ -45,8 +46,10 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
45
46
|
// Used to set CSS custom property with PageHeaderContent height to be used
|
46
47
|
// for sticky positioning
|
47
48
|
useResizeObserver(componentRef, () => {
|
48
|
-
if (componentRef?.current
|
49
|
-
|
49
|
+
if (componentRef?.current) {
|
50
|
+
// It's possible we don't have the content element
|
51
|
+
// in which case we set it's height to 0
|
52
|
+
const pageHeaderContentHeight = refs?.contentRef?.current?.offsetHeight ?? 0;
|
50
53
|
const totalHeaderOffset = getHeaderOffset(componentRef?.current);
|
51
54
|
componentRef?.current.style.setProperty(`--${pkg.prefix}-page-header-header-top`, `${(Math.round(pageHeaderContentHeight) - totalHeaderOffset) * -1}px`);
|
52
55
|
componentRef?.current.style.setProperty(`--${pkg.prefix}-page-header-breadcrumb-top`, `${totalHeaderOffset}px`);
|
@@ -54,6 +57,7 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
54
57
|
});
|
55
58
|
const [fullyCollapsed, setFullyCollapsed] = useState(false);
|
56
59
|
const [titleClipped, setTitleClipped] = useState(false);
|
60
|
+
const [contentActionsClipped, setContentActionsClipped] = useState(false);
|
57
61
|
|
58
62
|
// Intersection Observer setup, tracks if the PageHeaderContent is visible on page.
|
59
63
|
// If it is not visible, we should set fully collapsed to true so that the
|
@@ -91,12 +95,29 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
91
95
|
rootMargin: `${(predefinedContentPadding + totalTitleHeight + totalHeaderOffset + 24) * -1}px 0px 0px 0px`,
|
92
96
|
threshold: 0.1
|
93
97
|
});
|
98
|
+
if (!refs?.contentActions?.current) {
|
99
|
+
return;
|
100
|
+
}
|
101
|
+
const contentActionsObserver = new IntersectionObserver(entries => {
|
102
|
+
entries.forEach(entry => {
|
103
|
+
if (entry.target === refs?.contentActions.current) {
|
104
|
+
setContentActionsClipped(!entry.isIntersecting);
|
105
|
+
}
|
106
|
+
});
|
107
|
+
}, {
|
108
|
+
root: null,
|
109
|
+
rootMargin: `${(predefinedContentPadding + totalTitleHeight + totalHeaderOffset + 48) * -1}px 0px 0px 0px`,
|
110
|
+
threshold: 0.1
|
111
|
+
});
|
94
112
|
if (refs?.contentRef.current) {
|
95
113
|
contentObserver.observe(refs?.contentRef.current);
|
96
114
|
}
|
97
115
|
if (refs?.titleRef.current) {
|
98
116
|
titleObserver.observe(refs?.titleRef.current);
|
99
117
|
}
|
118
|
+
if (refs?.contentActions.current) {
|
119
|
+
contentActionsObserver.observe(refs?.contentActions.current);
|
120
|
+
}
|
100
121
|
return () => {
|
101
122
|
if (!refs?.contentRef?.current) {
|
102
123
|
return;
|
@@ -105,7 +126,11 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
105
126
|
if (!refs?.titleRef?.current) {
|
106
127
|
return;
|
107
128
|
}
|
108
|
-
|
129
|
+
titleObserver.unobserve(refs?.titleRef.current);
|
130
|
+
if (!refs?.contentActions?.current) {
|
131
|
+
return;
|
132
|
+
}
|
133
|
+
contentActionsObserver.unobserve(refs?.contentActions.current);
|
109
134
|
};
|
110
135
|
}, [refs, componentRef]);
|
111
136
|
return /*#__PURE__*/React__default.createElement(PageHeaderContext.Provider, {
|
@@ -113,7 +138,10 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
113
138
|
refs,
|
114
139
|
setRefs,
|
115
140
|
fullyCollapsed,
|
116
|
-
|
141
|
+
pageActionsInstance,
|
142
|
+
setPageActionsInstance,
|
143
|
+
titleClipped,
|
144
|
+
contentActionsClipped
|
117
145
|
}
|
118
146
|
}, /*#__PURE__*/React__default.createElement("div", _extends({
|
119
147
|
className: classNames,
|
@@ -140,13 +168,19 @@ const PageHeaderBreadcrumbBar = /*#__PURE__*/React__default.forwardRef(function
|
|
140
168
|
pageActionsFlush,
|
141
169
|
...other
|
142
170
|
} = _ref2;
|
171
|
+
const {
|
172
|
+
pageActionsInstance: globalActions,
|
173
|
+
contentActionsClipped
|
174
|
+
} = usePageHeader();
|
143
175
|
const classNames = cx({
|
144
176
|
[`${blockClass}__breadcrumb-bar`]: true,
|
145
177
|
[`${blockClass}__breadcrumb-bar-border`]: border,
|
146
178
|
[`${blockClass}__breadcrumb__actions-flush`]: pageActionsFlush
|
147
179
|
}, className);
|
148
180
|
const contentActionsClasses = cx({
|
149
|
-
[`${blockClass}__breadcrumb__content-actions`]: !contentActionsFlush
|
181
|
+
[`${blockClass}__breadcrumb__content-actions`]: !contentActionsFlush,
|
182
|
+
[`${blockClass}__breadcrumb__content-actions-with-global-actions`]: !!globalActions,
|
183
|
+
[`${blockClass}__breadcrumb__content-actions-with-global-actions--show`]: contentActionsClipped
|
150
184
|
});
|
151
185
|
return /*#__PURE__*/React__default.createElement("div", _extends({
|
152
186
|
className: classNames,
|
@@ -188,7 +222,8 @@ const PageHeaderContent = /*#__PURE__*/React__default.forwardRef(function PageHe
|
|
188
222
|
const contentRef = useRef(null);
|
189
223
|
const componentRef = ref ?? contentRef;
|
190
224
|
const {
|
191
|
-
setRefs
|
225
|
+
setRefs,
|
226
|
+
setPageActionsInstance
|
192
227
|
} = usePageHeader();
|
193
228
|
const classNames = cx({
|
194
229
|
[`${blockClass}__content`]: true
|
@@ -204,6 +239,12 @@ const PageHeaderContent = /*#__PURE__*/React__default.forwardRef(function PageHe
|
|
204
239
|
}
|
205
240
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
206
241
|
}, []);
|
242
|
+
useEffect(() => {
|
243
|
+
if (pageActions) {
|
244
|
+
setPageActionsInstance(pageActions);
|
245
|
+
}
|
246
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
247
|
+
}, [pageActions]);
|
207
248
|
const [isEllipsisApplied, setIsEllipsisApplied] = useState(false);
|
208
249
|
const isEllipsisActive = element => {
|
209
250
|
setIsEllipsisApplied(element.offsetHeight < element.scrollHeight);
|
@@ -287,8 +328,14 @@ const PageHeaderContentPageActions = _ref4 => {
|
|
287
328
|
actions,
|
288
329
|
...other
|
289
330
|
} = _ref4;
|
290
|
-
const
|
291
|
-
|
331
|
+
const {
|
332
|
+
setRefs,
|
333
|
+
contentActionsClipped
|
334
|
+
} = usePageHeader();
|
335
|
+
const classNames = cx(`${blockClass}__content__page-actions`, {
|
336
|
+
// Revisit this:
|
337
|
+
// May want to only add this class if there are content actions in the breadcrumb bar as well
|
338
|
+
[`${blockClass}__content__page-actions--clipped`]: contentActionsClipped
|
292
339
|
}, className);
|
293
340
|
const containerRef = useRef(null);
|
294
341
|
const offsetRef = useRef(null);
|
@@ -303,6 +350,13 @@ const PageHeaderContentPageActions = _ref4 => {
|
|
303
350
|
document.documentElement.style.setProperty('--page-header-title-grid-width', `${width}px`);
|
304
351
|
}
|
305
352
|
}, [menuButtonVisibility]);
|
353
|
+
useEffect(() => {
|
354
|
+
setRefs(prev => ({
|
355
|
+
...prev,
|
356
|
+
contentActions: containerRef
|
357
|
+
}));
|
358
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
359
|
+
}, []);
|
306
360
|
useEffect(() => {
|
307
361
|
if (!containerRef.current || !Array.isArray(actions)) {
|
308
362
|
return;
|
@@ -625,7 +679,9 @@ const PageHeaderTitleBreadcrumb = /*#__PURE__*/forwardRef((_ref9, ref) => {
|
|
625
679
|
isCurrentPage: true
|
626
680
|
}, other, {
|
627
681
|
className: cx(className, `${pkg.prefix}--page-header-title-breadcrumb`, {
|
628
|
-
[`${pkg.prefix}--page-header-title-breadcrumb-show`]: titleClipped && refs?.titleRef
|
682
|
+
[`${pkg.prefix}--page-header-title-breadcrumb-show`]: titleClipped && refs?.titleRef,
|
683
|
+
[`${pkg.prefix}--page-header-title-breadcrumb-show__with-content-element`]: !!refs?.contentRef,
|
684
|
+
[`${pkg.prefix}--page-header-title-breadcrumb-show__without-content-element`]: !refs?.contentRef
|
629
685
|
})
|
630
686
|
}), children);
|
631
687
|
});
|
@@ -13,12 +13,16 @@ import { RefObject } from 'react';
|
|
13
13
|
export type PageHeaderRefs = {
|
14
14
|
contentRef?: RefObject<HTMLDivElement | null>;
|
15
15
|
titleRef?: RefObject<HTMLHeadingElement | null>;
|
16
|
+
contentActions?: RefObject<HTMLDivElement | null>;
|
16
17
|
};
|
17
18
|
type PageHeaderContextType = {
|
18
19
|
refs?: PageHeaderRefs;
|
19
20
|
setRefs: React.Dispatch<React.SetStateAction<PageHeaderRefs>>;
|
21
|
+
pageActionsInstance?: React.ReactNode;
|
22
|
+
setPageActionsInstance: React.Dispatch<React.SetStateAction<React.ReactNode>>;
|
20
23
|
fullyCollapsed?: boolean;
|
21
24
|
titleClipped?: boolean;
|
25
|
+
contentActionsClipped?: boolean;
|
22
26
|
};
|
23
27
|
export declare const PageHeaderContext: import("react").Context<PageHeaderContextType | undefined>;
|
24
28
|
export declare function usePageHeader(): PageHeaderContextType;
|
@@ -17,7 +17,10 @@ const PageHeaderContext = /*#__PURE__*/createContext({
|
|
17
17
|
fullyCollapsed: false,
|
18
18
|
setRefs: () => {},
|
19
19
|
refs: {},
|
20
|
-
titleClipped: false
|
20
|
+
titleClipped: false,
|
21
|
+
contentActionsClipped: false,
|
22
|
+
pageActionsInstance: null,
|
23
|
+
setPageActionsInstance: () => {}
|
21
24
|
});
|
22
25
|
function usePageHeader() {
|
23
26
|
const context = useContext(PageHeaderContext);
|
@@ -27,7 +27,7 @@ function getSize(el, dimension) {
|
|
27
27
|
let size = el.getBoundingClientRect()[dimension];
|
28
28
|
el.style.display = originalDisplay;
|
29
29
|
const computedStyles = getComputedStyle(el);
|
30
|
-
size = dimension === 'width' ? size + parseInt(computedStyles.
|
30
|
+
size = dimension === 'width' ? size + parseInt(computedStyles.marginLeft) + parseInt(computedStyles.marginRight) : size + parseInt(computedStyles.marginTop) + parseInt(computedStyles.marginBottom);
|
31
31
|
return size;
|
32
32
|
}
|
33
33
|
|
@@ -459,7 +459,7 @@ const SidePanelBase = /*#__PURE__*/React__default.forwardRef((props, ref) => {
|
|
459
459
|
}, _ArrowLeft || (_ArrowLeft = /*#__PURE__*/React__default.createElement(ArrowLeft, null))), title && title.length && labelText && labelText.length && /*#__PURE__*/React__default.createElement("p", {
|
460
460
|
className: `${blockClass}__label-text`,
|
461
461
|
ref: labelTextRef
|
462
|
-
}, labelText), title && title.length && renderTitle(), /*#__PURE__*/React__default.createElement("div", {
|
462
|
+
}, labelText), title && title.length && renderTitle(), (normalizedDecorator || !hideCloseButton) && /*#__PURE__*/React__default.createElement("div", {
|
463
463
|
className: `${blockClass}__decorator-and-close`
|
464
464
|
}, normalizedDecorator, !hideCloseButton && /*#__PURE__*/React__default.createElement(IconButton, {
|
465
465
|
className: `${blockClass}__close-button`,
|
@@ -65,6 +65,7 @@ exports.BreadcrumbWithOverflow = _ref => {
|
|
65
65
|
}, /*#__PURE__*/React.createElement(react.unstable_FeatureFlags, {
|
66
66
|
enableV12Overflowmenu: true
|
67
67
|
}, /*#__PURE__*/React.createElement(react.OverflowMenu, {
|
68
|
+
role: "navigation",
|
68
69
|
"aria-label": overflowAriaLabel,
|
69
70
|
label: overflowAriaLabel // also needs setting to avoid a11y "Accessible name does not match or contain the visible label text"
|
70
71
|
,
|
@@ -94,6 +95,7 @@ exports.BreadcrumbWithOverflow = _ref => {
|
|
94
95
|
}, /*#__PURE__*/React.createElement(react.BreadcrumbItem, {
|
95
96
|
key: `${blockClass}-hidden-overflow-${internalId}`
|
96
97
|
}, /*#__PURE__*/React.createElement(react.OverflowMenu, {
|
98
|
+
role: "navigation",
|
97
99
|
"aria-label": overflowAriaLabel,
|
98
100
|
renderIcon: props => /*#__PURE__*/React.createElement(icons.OverflowMenuHorizontal, _rollupPluginBabelHelpers.extends({
|
99
101
|
size: 32
|
@@ -175,7 +175,8 @@ exports.CreateFullPage = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
175
175
|
className: `${blockClass}__content`
|
176
176
|
}, /*#__PURE__*/React.createElement(react.Form, {
|
177
177
|
className: `${blockClass}__form`,
|
178
|
-
"aria-label": title
|
178
|
+
"aria-label": title,
|
179
|
+
onSubmit: e => e.preventDefault()
|
179
180
|
}, /*#__PURE__*/React.createElement(StepsContext.Provider, {
|
180
181
|
value: {
|
181
182
|
currentStep,
|
@@ -65,7 +65,8 @@ exports.CreateModal = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
65
65
|
className: `${blockClass}__description`
|
66
66
|
}, description), /*#__PURE__*/React.createElement(react.Form, {
|
67
67
|
className: `${blockClass}__form`,
|
68
|
-
"aria-label": title
|
68
|
+
"aria-label": title,
|
69
|
+
onSubmit: e => e.preventDefault()
|
69
70
|
}, children)), /*#__PURE__*/React.createElement(react.ModalFooter, null, /*#__PURE__*/React.createElement(react.Button, {
|
70
71
|
type: "button",
|
71
72
|
kind: "secondary",
|
@@ -84,7 +84,8 @@ exports.CreateSidePanel = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
84
84
|
className: `${blockClass}__form-description-text ${blockClass}__content-text`
|
85
85
|
}, formDescription), /*#__PURE__*/React.createElement(react.Form, {
|
86
86
|
className: `${blockClass}__form`,
|
87
|
-
"aria-labelledby": formTitleId
|
87
|
+
"aria-labelledby": formTitleId,
|
88
|
+
onSubmit: e => e.preventDefault()
|
88
89
|
}, children));
|
89
90
|
});
|
90
91
|
exports.CreateSidePanel = settings.pkg.checkComponentEnabled(exports.CreateSidePanel, componentName);
|
@@ -169,7 +169,8 @@ exports.CreateTearsheet = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
169
169
|
className: `${blockClass}__content`,
|
170
170
|
ref: contentRef
|
171
171
|
}, /*#__PURE__*/React.createElement(react.Form, {
|
172
|
-
"aria-label": title
|
172
|
+
"aria-label": title,
|
173
|
+
onSubmit: e => e.preventDefault()
|
173
174
|
}, /*#__PURE__*/React.createElement(StepsContext.Provider, {
|
174
175
|
value: {
|
175
176
|
currentStep,
|
@@ -80,7 +80,8 @@ exports.CreateTearsheetNarrow = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
80
80
|
className: cx(`${blockClass}__form-description-text`, formTextClass)
|
81
81
|
}, formDescription), /*#__PURE__*/React.createElement(react.Form, {
|
82
82
|
className: `${blockClass}__form`,
|
83
|
-
"aria-labelledby": formTitleId
|
83
|
+
"aria-labelledby": formTitleId,
|
84
|
+
onSubmit: e => e.preventDefault()
|
84
85
|
}, children));
|
85
86
|
});
|
86
87
|
|
@@ -33,7 +33,7 @@ const EmptyStateContent = props => {
|
|
33
33
|
className: cx(`${blockClass}__header`, {
|
34
34
|
[`${blockClass}__header--small`]: size === 'sm'
|
35
35
|
})
|
36
|
-
}, title), subtitle && /*#__PURE__*/React.createElement("
|
36
|
+
}, title), subtitle && /*#__PURE__*/React.createElement("div", {
|
37
37
|
className: cx(`${blockClass}__subtitle`, {
|
38
38
|
[`${blockClass}__subtitle--small`]: size === 'sm'
|
39
39
|
})
|
@@ -61,7 +61,7 @@ exports.EmptyStateV2 = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
61
61
|
className: cx(`${blockClass}__header`, {
|
62
62
|
[`${blockClass}__header--small`]: size === 'sm'
|
63
63
|
})
|
64
|
-
}, title), subtitle && /*#__PURE__*/React.createElement("
|
64
|
+
}, title), subtitle && /*#__PURE__*/React.createElement("div", {
|
65
65
|
className: cx(`${blockClass}__subtitle`, {
|
66
66
|
[`${blockClass}__subtitle--small`]: size === 'sm'
|
67
67
|
})
|
@@ -37,6 +37,7 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
37
37
|
...other
|
38
38
|
} = _ref;
|
39
39
|
const [refs, setRefs] = React.useState({});
|
40
|
+
const [pageActionsInstance, setPageActionsInstance] = React.useState(null);
|
40
41
|
const tempRef = React.useRef(null);
|
41
42
|
const componentRef = ref ?? tempRef;
|
42
43
|
const classNames = cx({
|
@@ -47,8 +48,10 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
47
48
|
// Used to set CSS custom property with PageHeaderContent height to be used
|
48
49
|
// for sticky positioning
|
49
50
|
useResizeObserver.useResizeObserver(componentRef, () => {
|
50
|
-
if (componentRef?.current
|
51
|
-
|
51
|
+
if (componentRef?.current) {
|
52
|
+
// It's possible we don't have the content element
|
53
|
+
// in which case we set it's height to 0
|
54
|
+
const pageHeaderContentHeight = refs?.contentRef?.current?.offsetHeight ?? 0;
|
52
55
|
const totalHeaderOffset = utils.getHeaderOffset(componentRef?.current);
|
53
56
|
componentRef?.current.style.setProperty(`--${settings.pkg.prefix}-page-header-header-top`, `${(Math.round(pageHeaderContentHeight) - totalHeaderOffset) * -1}px`);
|
54
57
|
componentRef?.current.style.setProperty(`--${settings.pkg.prefix}-page-header-breadcrumb-top`, `${totalHeaderOffset}px`);
|
@@ -56,6 +59,7 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
56
59
|
});
|
57
60
|
const [fullyCollapsed, setFullyCollapsed] = React.useState(false);
|
58
61
|
const [titleClipped, setTitleClipped] = React.useState(false);
|
62
|
+
const [contentActionsClipped, setContentActionsClipped] = React.useState(false);
|
59
63
|
|
60
64
|
// Intersection Observer setup, tracks if the PageHeaderContent is visible on page.
|
61
65
|
// If it is not visible, we should set fully collapsed to true so that the
|
@@ -93,12 +97,29 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
93
97
|
rootMargin: `${(predefinedContentPadding + totalTitleHeight + totalHeaderOffset + 24) * -1}px 0px 0px 0px`,
|
94
98
|
threshold: 0.1
|
95
99
|
});
|
100
|
+
if (!refs?.contentActions?.current) {
|
101
|
+
return;
|
102
|
+
}
|
103
|
+
const contentActionsObserver = new IntersectionObserver(entries => {
|
104
|
+
entries.forEach(entry => {
|
105
|
+
if (entry.target === refs?.contentActions.current) {
|
106
|
+
setContentActionsClipped(!entry.isIntersecting);
|
107
|
+
}
|
108
|
+
});
|
109
|
+
}, {
|
110
|
+
root: null,
|
111
|
+
rootMargin: `${(predefinedContentPadding + totalTitleHeight + totalHeaderOffset + 48) * -1}px 0px 0px 0px`,
|
112
|
+
threshold: 0.1
|
113
|
+
});
|
96
114
|
if (refs?.contentRef.current) {
|
97
115
|
contentObserver.observe(refs?.contentRef.current);
|
98
116
|
}
|
99
117
|
if (refs?.titleRef.current) {
|
100
118
|
titleObserver.observe(refs?.titleRef.current);
|
101
119
|
}
|
120
|
+
if (refs?.contentActions.current) {
|
121
|
+
contentActionsObserver.observe(refs?.contentActions.current);
|
122
|
+
}
|
102
123
|
return () => {
|
103
124
|
if (!refs?.contentRef?.current) {
|
104
125
|
return;
|
@@ -107,7 +128,11 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
107
128
|
if (!refs?.titleRef?.current) {
|
108
129
|
return;
|
109
130
|
}
|
110
|
-
|
131
|
+
titleObserver.unobserve(refs?.titleRef.current);
|
132
|
+
if (!refs?.contentActions?.current) {
|
133
|
+
return;
|
134
|
+
}
|
135
|
+
contentActionsObserver.unobserve(refs?.contentActions.current);
|
111
136
|
};
|
112
137
|
}, [refs, componentRef]);
|
113
138
|
return /*#__PURE__*/React.createElement(context.PageHeaderContext.Provider, {
|
@@ -115,7 +140,10 @@ const PageHeader = /*#__PURE__*/React.forwardRef(function PageHeader(_ref, ref)
|
|
115
140
|
refs,
|
116
141
|
setRefs,
|
117
142
|
fullyCollapsed,
|
118
|
-
|
143
|
+
pageActionsInstance,
|
144
|
+
setPageActionsInstance,
|
145
|
+
titleClipped,
|
146
|
+
contentActionsClipped
|
119
147
|
}
|
120
148
|
}, /*#__PURE__*/React.createElement("div", _rollupPluginBabelHelpers.extends({
|
121
149
|
className: classNames,
|
@@ -142,13 +170,19 @@ const PageHeaderBreadcrumbBar = /*#__PURE__*/React.forwardRef(function PageHeade
|
|
142
170
|
pageActionsFlush,
|
143
171
|
...other
|
144
172
|
} = _ref2;
|
173
|
+
const {
|
174
|
+
pageActionsInstance: globalActions,
|
175
|
+
contentActionsClipped
|
176
|
+
} = context.usePageHeader();
|
145
177
|
const classNames = cx({
|
146
178
|
[`${PageHeaderUtils.blockClass}__breadcrumb-bar`]: true,
|
147
179
|
[`${PageHeaderUtils.blockClass}__breadcrumb-bar-border`]: border,
|
148
180
|
[`${PageHeaderUtils.blockClass}__breadcrumb__actions-flush`]: pageActionsFlush
|
149
181
|
}, className);
|
150
182
|
const contentActionsClasses = cx({
|
151
|
-
[`${PageHeaderUtils.blockClass}__breadcrumb__content-actions`]: !contentActionsFlush
|
183
|
+
[`${PageHeaderUtils.blockClass}__breadcrumb__content-actions`]: !contentActionsFlush,
|
184
|
+
[`${PageHeaderUtils.blockClass}__breadcrumb__content-actions-with-global-actions`]: !!globalActions,
|
185
|
+
[`${PageHeaderUtils.blockClass}__breadcrumb__content-actions-with-global-actions--show`]: contentActionsClipped
|
152
186
|
});
|
153
187
|
return /*#__PURE__*/React.createElement("div", _rollupPluginBabelHelpers.extends({
|
154
188
|
className: classNames,
|
@@ -190,7 +224,8 @@ const PageHeaderContent = /*#__PURE__*/React.forwardRef(function PageHeaderConte
|
|
190
224
|
const contentRef = React.useRef(null);
|
191
225
|
const componentRef = ref ?? contentRef;
|
192
226
|
const {
|
193
|
-
setRefs
|
227
|
+
setRefs,
|
228
|
+
setPageActionsInstance
|
194
229
|
} = context.usePageHeader();
|
195
230
|
const classNames = cx({
|
196
231
|
[`${PageHeaderUtils.blockClass}__content`]: true
|
@@ -206,6 +241,12 @@ const PageHeaderContent = /*#__PURE__*/React.forwardRef(function PageHeaderConte
|
|
206
241
|
}
|
207
242
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
208
243
|
}, []);
|
244
|
+
React.useEffect(() => {
|
245
|
+
if (pageActions) {
|
246
|
+
setPageActionsInstance(pageActions);
|
247
|
+
}
|
248
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
249
|
+
}, [pageActions]);
|
209
250
|
const [isEllipsisApplied, setIsEllipsisApplied] = React.useState(false);
|
210
251
|
const isEllipsisActive = element => {
|
211
252
|
setIsEllipsisApplied(element.offsetHeight < element.scrollHeight);
|
@@ -289,8 +330,14 @@ const PageHeaderContentPageActions = _ref4 => {
|
|
289
330
|
actions,
|
290
331
|
...other
|
291
332
|
} = _ref4;
|
292
|
-
const
|
293
|
-
|
333
|
+
const {
|
334
|
+
setRefs,
|
335
|
+
contentActionsClipped
|
336
|
+
} = context.usePageHeader();
|
337
|
+
const classNames = cx(`${PageHeaderUtils.blockClass}__content__page-actions`, {
|
338
|
+
// Revisit this:
|
339
|
+
// May want to only add this class if there are content actions in the breadcrumb bar as well
|
340
|
+
[`${PageHeaderUtils.blockClass}__content__page-actions--clipped`]: contentActionsClipped
|
294
341
|
}, className);
|
295
342
|
const containerRef = React.useRef(null);
|
296
343
|
const offsetRef = React.useRef(null);
|
@@ -305,6 +352,13 @@ const PageHeaderContentPageActions = _ref4 => {
|
|
305
352
|
document.documentElement.style.setProperty('--page-header-title-grid-width', `${width}px`);
|
306
353
|
}
|
307
354
|
}, [menuButtonVisibility]);
|
355
|
+
React.useEffect(() => {
|
356
|
+
setRefs(prev => ({
|
357
|
+
...prev,
|
358
|
+
contentActions: containerRef
|
359
|
+
}));
|
360
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
361
|
+
}, []);
|
308
362
|
React.useEffect(() => {
|
309
363
|
if (!containerRef.current || !Array.isArray(actions)) {
|
310
364
|
return;
|
@@ -627,7 +681,9 @@ const PageHeaderTitleBreadcrumb = /*#__PURE__*/React.forwardRef((_ref9, ref) =>
|
|
627
681
|
isCurrentPage: true
|
628
682
|
}, other, {
|
629
683
|
className: cx(className, `${settings.pkg.prefix}--page-header-title-breadcrumb`, {
|
630
|
-
[`${settings.pkg.prefix}--page-header-title-breadcrumb-show`]: titleClipped && refs?.titleRef
|
684
|
+
[`${settings.pkg.prefix}--page-header-title-breadcrumb-show`]: titleClipped && refs?.titleRef,
|
685
|
+
[`${settings.pkg.prefix}--page-header-title-breadcrumb-show__with-content-element`]: !!refs?.contentRef,
|
686
|
+
[`${settings.pkg.prefix}--page-header-title-breadcrumb-show__without-content-element`]: !refs?.contentRef
|
631
687
|
})
|
632
688
|
}), children);
|
633
689
|
});
|
@@ -13,12 +13,16 @@ import { RefObject } from 'react';
|
|
13
13
|
export type PageHeaderRefs = {
|
14
14
|
contentRef?: RefObject<HTMLDivElement | null>;
|
15
15
|
titleRef?: RefObject<HTMLHeadingElement | null>;
|
16
|
+
contentActions?: RefObject<HTMLDivElement | null>;
|
16
17
|
};
|
17
18
|
type PageHeaderContextType = {
|
18
19
|
refs?: PageHeaderRefs;
|
19
20
|
setRefs: React.Dispatch<React.SetStateAction<PageHeaderRefs>>;
|
21
|
+
pageActionsInstance?: React.ReactNode;
|
22
|
+
setPageActionsInstance: React.Dispatch<React.SetStateAction<React.ReactNode>>;
|
20
23
|
fullyCollapsed?: boolean;
|
21
24
|
titleClipped?: boolean;
|
25
|
+
contentActionsClipped?: boolean;
|
22
26
|
};
|
23
27
|
export declare const PageHeaderContext: import("react").Context<PageHeaderContextType | undefined>;
|
24
28
|
export declare function usePageHeader(): PageHeaderContextType;
|
@@ -19,7 +19,10 @@ const PageHeaderContext = /*#__PURE__*/React.createContext({
|
|
19
19
|
fullyCollapsed: false,
|
20
20
|
setRefs: () => {},
|
21
21
|
refs: {},
|
22
|
-
titleClipped: false
|
22
|
+
titleClipped: false,
|
23
|
+
contentActionsClipped: false,
|
24
|
+
pageActionsInstance: null,
|
25
|
+
setPageActionsInstance: () => {}
|
23
26
|
});
|
24
27
|
function usePageHeader() {
|
25
28
|
const context = React.useContext(PageHeaderContext);
|
@@ -29,7 +29,7 @@ function getSize(el, dimension) {
|
|
29
29
|
let size = el.getBoundingClientRect()[dimension];
|
30
30
|
el.style.display = originalDisplay;
|
31
31
|
const computedStyles = getComputedStyle(el);
|
32
|
-
size = dimension === 'width' ? size + parseInt(computedStyles.
|
32
|
+
size = dimension === 'width' ? size + parseInt(computedStyles.marginLeft) + parseInt(computedStyles.marginRight) : size + parseInt(computedStyles.marginTop) + parseInt(computedStyles.marginBottom);
|
33
33
|
return size;
|
34
34
|
}
|
35
35
|
|
@@ -461,7 +461,7 @@ const SidePanelBase = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
461
461
|
}, _ArrowLeft || (_ArrowLeft = /*#__PURE__*/React.createElement(icons.ArrowLeft, null))), title && title.length && labelText && labelText.length && /*#__PURE__*/React.createElement("p", {
|
462
462
|
className: `${blockClass}__label-text`,
|
463
463
|
ref: labelTextRef
|
464
|
-
}, labelText), title && title.length && renderTitle(), /*#__PURE__*/React.createElement("div", {
|
464
|
+
}, labelText), title && title.length && renderTitle(), (normalizedDecorator || !hideCloseButton) && /*#__PURE__*/React.createElement("div", {
|
465
465
|
className: `${blockClass}__decorator-and-close`
|
466
466
|
}, normalizedDecorator, !hideCloseButton && /*#__PURE__*/React.createElement(react.IconButton, {
|
467
467
|
className: `${blockClass}__close-button`,
|