@carbon/ibm-products 2.84.0 → 2.85.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 +18 -13
- 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 +18 -13
- 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 +18 -13
- 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 +18 -13
- 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/Coachmark/next/Coachmark/ContentHeader.js +2 -1
- package/es/components/ConditionBuilder/ConditionBuilderItem/ConditionBuilderItem.js +12 -1
- package/es/components/CreateTearsheet/CreateTearsheet.d.ts +1 -0
- package/es/components/CreateTearsheet/CreateTearsheet.js +3 -0
- package/es/components/CreateTearsheet/CreateTearsheetStep.d.ts +4 -0
- package/es/components/CreateTearsheet/CreateTearsheetStep.js +7 -1
- package/es/components/EditInPlace/EditInPlace.d.ts +12 -1
- package/es/components/EditInPlace/EditInPlace.js +52 -31
- package/es/components/ImportModal/ImportModal.d.ts +5 -1
- package/es/components/ImportModal/ImportModal.js +12 -6
- package/es/components/PageHeader/next/PageHeader.d.ts +15 -238
- package/es/components/PageHeader/next/PageHeader.js +25 -637
- package/es/components/PageHeader/next/PageHeaderBreadcrumbBar.d.ts +41 -0
- package/es/components/PageHeader/next/PageHeaderBreadcrumbBar.js +74 -0
- package/es/components/PageHeader/next/PageHeaderBreadcrumbOverflow.d.ts +12 -0
- package/es/components/PageHeader/next/PageHeaderBreadcrumbOverflow.js +82 -0
- package/es/components/PageHeader/next/PageHeaderContent.d.ts +39 -0
- package/es/components/PageHeader/next/PageHeaderContent.js +129 -0
- package/es/components/PageHeader/next/PageHeaderContentPageActions.d.ts +52 -0
- package/es/components/PageHeader/next/PageHeaderContentPageActions.js +126 -0
- package/es/components/PageHeader/next/PageHeaderContentText.d.ts +44 -0
- package/es/components/PageHeader/next/PageHeaderContentText.js +54 -0
- package/es/components/PageHeader/next/PageHeaderHeroImage.d.ts +36 -0
- package/es/components/PageHeader/next/PageHeaderHeroImage.js +62 -0
- package/es/components/PageHeader/next/PageHeaderScrollButton.d.ts +13 -0
- package/es/components/PageHeader/next/PageHeaderScrollButton.js +73 -0
- package/es/components/PageHeader/next/PageHeaderTabBar.d.ts +19 -0
- package/es/components/PageHeader/next/PageHeaderTabBar.js +66 -0
- package/es/components/PageHeader/next/PageHeaderTagOverflow.d.ts +13 -0
- package/es/components/PageHeader/next/PageHeaderTagOverflow.js +68 -0
- package/es/components/PageHeader/next/PageHeaderTitleBreadcrumb.d.ts +9 -0
- package/es/components/PageHeader/next/PageHeaderTitleBreadcrumb.js +43 -0
- package/es/components/PageHeader/next/index.d.ts +3 -2
- package/es/components/PageHeader/next/index.js +11 -1
- package/es/global/js/hooks/useCreateComponentStepChange.d.ts +2 -1
- package/es/global/js/hooks/useCreateComponentStepChange.js +3 -2
- package/es/global/js/hooks/usePortalTarget.js +1 -1
- package/es/global/js/utils/makeDraggable/makeDraggable.js +22 -13
- package/lib/components/Coachmark/next/Coachmark/ContentHeader.js +2 -1
- package/lib/components/ConditionBuilder/ConditionBuilderItem/ConditionBuilderItem.js +12 -1
- package/lib/components/CreateTearsheet/CreateTearsheet.d.ts +1 -0
- package/lib/components/CreateTearsheet/CreateTearsheet.js +3 -0
- package/lib/components/CreateTearsheet/CreateTearsheetStep.d.ts +4 -0
- package/lib/components/CreateTearsheet/CreateTearsheetStep.js +7 -1
- package/lib/components/EditInPlace/EditInPlace.d.ts +12 -1
- package/lib/components/EditInPlace/EditInPlace.js +50 -29
- package/lib/components/ImportModal/ImportModal.d.ts +5 -1
- package/lib/components/ImportModal/ImportModal.js +12 -6
- package/lib/components/PageHeader/next/PageHeader.d.ts +15 -238
- package/lib/components/PageHeader/next/PageHeader.js +42 -654
- package/lib/components/PageHeader/next/PageHeaderBreadcrumbBar.d.ts +41 -0
- package/lib/components/PageHeader/next/PageHeaderBreadcrumbBar.js +76 -0
- package/lib/components/PageHeader/next/PageHeaderBreadcrumbOverflow.d.ts +12 -0
- package/lib/components/PageHeader/next/PageHeaderBreadcrumbOverflow.js +84 -0
- package/lib/components/PageHeader/next/PageHeaderContent.d.ts +39 -0
- package/lib/components/PageHeader/next/PageHeaderContent.js +131 -0
- package/lib/components/PageHeader/next/PageHeaderContentPageActions.d.ts +52 -0
- package/lib/components/PageHeader/next/PageHeaderContentPageActions.js +128 -0
- package/lib/components/PageHeader/next/PageHeaderContentText.d.ts +44 -0
- package/lib/components/PageHeader/next/PageHeaderContentText.js +56 -0
- package/lib/components/PageHeader/next/PageHeaderHeroImage.d.ts +36 -0
- package/lib/components/PageHeader/next/PageHeaderHeroImage.js +64 -0
- package/lib/components/PageHeader/next/PageHeaderScrollButton.d.ts +13 -0
- package/lib/components/PageHeader/next/PageHeaderScrollButton.js +75 -0
- package/lib/components/PageHeader/next/PageHeaderTabBar.d.ts +19 -0
- package/lib/components/PageHeader/next/PageHeaderTabBar.js +68 -0
- package/lib/components/PageHeader/next/PageHeaderTagOverflow.d.ts +13 -0
- package/lib/components/PageHeader/next/PageHeaderTagOverflow.js +70 -0
- package/lib/components/PageHeader/next/PageHeaderTitleBreadcrumb.d.ts +9 -0
- package/lib/components/PageHeader/next/PageHeaderTitleBreadcrumb.js +45 -0
- package/lib/components/PageHeader/next/index.d.ts +3 -2
- package/lib/components/PageHeader/next/index.js +20 -10
- package/lib/global/js/hooks/useCreateComponentStepChange.d.ts +2 -1
- package/lib/global/js/hooks/useCreateComponentStepChange.js +3 -2
- package/lib/global/js/hooks/usePortalTarget.js +1 -1
- package/lib/global/js/utils/makeDraggable/makeDraggable.js +22 -13
- package/package.json +7 -7
- package/scss/components/Datagrid/_datagrid.scss +7 -10
- package/scss/components/EditInPlace/_edit-in-place.scss +11 -3
- package/scss/components/PageHeader/_page-header.scss +2 -1
- package/telemetry.yml +13 -0
|
@@ -6,20 +6,23 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { extends as _extends } from '../../../_virtual/_rollupPluginBabelHelpers.js';
|
|
9
|
-
import React__default, {
|
|
10
|
-
import PropTypes from '../../../_virtual/index.js';
|
|
9
|
+
import React__default, { useState, useRef, useEffect } from 'react';
|
|
11
10
|
import cx from 'classnames';
|
|
12
|
-
import { Grid, Column, Section, DefinitionTooltip, unstable_Text, Heading, Popover, PopoverContent, IconButton, BreadcrumbItem, usePrefix, Breadcrumb, MenuButton, MenuItem, AspectRatio } from '@carbon/react';
|
|
13
|
-
import { breakpoints } from '@carbon/layout';
|
|
14
11
|
import { blockClass } from '../PageHeaderUtils.js';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { ChevronUp } from '@carbon/react/icons';
|
|
18
|
-
import { PageHeaderContext, usePageHeader } from './context.js';
|
|
19
|
-
import { getHeaderOffset, scrollableAncestor } from './utils.js';
|
|
12
|
+
import { PageHeaderContext } from './context.js';
|
|
13
|
+
import { getHeaderOffset } from './utils.js';
|
|
20
14
|
import { pkg } from '../../../settings.js';
|
|
21
15
|
import { useResizeObserver } from '../../../global/js/hooks/useResizeObserver.js';
|
|
22
|
-
import {
|
|
16
|
+
import { PageHeaderBreadcrumbBar } from './PageHeaderBreadcrumbBar.js';
|
|
17
|
+
import { PageHeaderContent } from './PageHeaderContent.js';
|
|
18
|
+
import { PageHeaderContentPageActions } from './PageHeaderContentPageActions.js';
|
|
19
|
+
import { PageHeaderContentText } from './PageHeaderContentText.js';
|
|
20
|
+
import { PageHeaderHeroImage } from './PageHeaderHeroImage.js';
|
|
21
|
+
import { PageHeaderTabBar } from './PageHeaderTabBar.js';
|
|
22
|
+
import { PageHeaderTagOverflow } from './PageHeaderTagOverflow.js';
|
|
23
|
+
import { PageHeaderScrollButton } from './PageHeaderScrollButton.js';
|
|
24
|
+
import { PageHeaderTitleBreadcrumb } from './PageHeaderTitleBreadcrumb.js';
|
|
25
|
+
import { PageHeaderBreadcrumbOverflow } from './PageHeaderBreadcrumbOverflow.js';
|
|
23
26
|
|
|
24
27
|
/**
|
|
25
28
|
* ----------
|
|
@@ -107,40 +110,31 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
|
107
110
|
});
|
|
108
111
|
}, {
|
|
109
112
|
root: null,
|
|
110
|
-
rootMargin: `${(predefinedContentPadding +
|
|
113
|
+
rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 24) * -1}px 0px 0px 0px`,
|
|
111
114
|
threshold: 0.1
|
|
112
115
|
});
|
|
113
|
-
if (refs?.contentRef
|
|
114
|
-
contentObserver.observe(refs
|
|
116
|
+
if (refs?.contentRef?.current) {
|
|
117
|
+
contentObserver.observe(refs.contentRef.current);
|
|
115
118
|
}
|
|
116
|
-
if (refs?.titleRef
|
|
117
|
-
titleObserver.observe(refs
|
|
119
|
+
if (refs?.titleRef?.current) {
|
|
120
|
+
titleObserver.observe(refs.titleRef.current);
|
|
118
121
|
}
|
|
119
|
-
if (refs?.contentActions
|
|
120
|
-
contentActionsObserver.observe(refs
|
|
122
|
+
if (refs?.contentActions?.current) {
|
|
123
|
+
contentActionsObserver.observe(refs.contentActions.current);
|
|
121
124
|
}
|
|
122
125
|
return () => {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
contentObserver.unobserve(refs?.contentRef.current);
|
|
127
|
-
if (!refs?.titleRef?.current) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
titleObserver.unobserve(refs?.titleRef.current);
|
|
131
|
-
if (!refs?.contentActions?.current) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
contentActionsObserver.unobserve(refs?.contentActions.current);
|
|
126
|
+
contentObserver.disconnect();
|
|
127
|
+
titleObserver.disconnect();
|
|
128
|
+
contentActionsObserver.disconnect();
|
|
135
129
|
};
|
|
136
|
-
}, [refs, componentRef]);
|
|
130
|
+
}, [refs?.contentRef, refs?.titleRef, refs?.contentActions, componentRef]);
|
|
137
131
|
return /*#__PURE__*/React__default.createElement(PageHeaderContext.Provider, {
|
|
138
132
|
value: {
|
|
139
133
|
refs,
|
|
140
134
|
setRefs,
|
|
141
|
-
fullyCollapsed,
|
|
142
135
|
pageActionsInstance,
|
|
143
136
|
setPageActionsInstance,
|
|
137
|
+
fullyCollapsed,
|
|
144
138
|
titleClipped,
|
|
145
139
|
contentActionsClipped,
|
|
146
140
|
breadcrumbActionsClipped
|
|
@@ -152,612 +146,6 @@ const PageHeader = /*#__PURE__*/React__default.forwardRef(function PageHeader(_r
|
|
|
152
146
|
});
|
|
153
147
|
PageHeader.displayName = 'PageHeader';
|
|
154
148
|
|
|
155
|
-
/**
|
|
156
|
-
* -----------------------
|
|
157
|
-
* PageHeaderBreadcrumbBar
|
|
158
|
-
* -----------------------
|
|
159
|
-
*/
|
|
160
|
-
|
|
161
|
-
const PageHeaderBreadcrumbBar = /*#__PURE__*/React__default.forwardRef(function PageHeaderBreadcrumbBar(_ref2, ref) {
|
|
162
|
-
let {
|
|
163
|
-
border = true,
|
|
164
|
-
className,
|
|
165
|
-
children,
|
|
166
|
-
renderIcon: IconElement,
|
|
167
|
-
contentActions,
|
|
168
|
-
contentActionsFlush,
|
|
169
|
-
pageActions,
|
|
170
|
-
pageActionsFlush,
|
|
171
|
-
...other
|
|
172
|
-
} = _ref2;
|
|
173
|
-
const context = usePageHeader();
|
|
174
|
-
const {
|
|
175
|
-
pageActionsInstance: globalActions,
|
|
176
|
-
contentActionsClipped
|
|
177
|
-
} = context;
|
|
178
|
-
const classNames = cx({
|
|
179
|
-
[`${blockClass}__breadcrumb-bar`]: true,
|
|
180
|
-
[`${blockClass}__breadcrumb-bar-border`]: border,
|
|
181
|
-
[`${blockClass}__breadcrumb__actions-flush`]: pageActionsFlush
|
|
182
|
-
}, className);
|
|
183
|
-
const contentActionsClasses = cx({
|
|
184
|
-
[`${blockClass}__breadcrumb__content-actions`]: !contentActionsFlush,
|
|
185
|
-
[`${blockClass}__breadcrumb__content-actions-with-global-actions`]: !!globalActions,
|
|
186
|
-
[`${blockClass}__breadcrumb__content-actions-with-global-actions--show`]: contentActionsClipped
|
|
187
|
-
});
|
|
188
|
-
return /*#__PURE__*/React__default.createElement(PageHeaderContext.Provider, {
|
|
189
|
-
value: {
|
|
190
|
-
...context,
|
|
191
|
-
isContentActionsInBreadcrumbBar: true
|
|
192
|
-
}
|
|
193
|
-
}, /*#__PURE__*/React__default.createElement("div", _extends({
|
|
194
|
-
className: classNames,
|
|
195
|
-
ref: ref
|
|
196
|
-
}, other), /*#__PURE__*/React__default.createElement(Grid, null, /*#__PURE__*/React__default.createElement(Column, {
|
|
197
|
-
lg: 16,
|
|
198
|
-
md: 8,
|
|
199
|
-
sm: 4
|
|
200
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
201
|
-
className: `${blockClass}__breadcrumb-container`
|
|
202
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
203
|
-
className: `${blockClass}__breadcrumb-wrapper`
|
|
204
|
-
}, IconElement && /*#__PURE__*/React__default.createElement("div", {
|
|
205
|
-
className: `${blockClass}__breadcrumb__icon`
|
|
206
|
-
}, /*#__PURE__*/React__default.createElement(IconElement, null)), children), /*#__PURE__*/React__default.createElement("div", {
|
|
207
|
-
className: `${blockClass}__breadcrumb__actions`
|
|
208
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
209
|
-
className: contentActionsClasses
|
|
210
|
-
}, contentActions), pageActions))))));
|
|
211
|
-
});
|
|
212
|
-
PageHeaderBreadcrumbBar.displayName = 'PageHeaderBreadcrumbBar';
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* -----------------
|
|
216
|
-
* PageHeaderContent
|
|
217
|
-
* -----------------
|
|
218
|
-
*/
|
|
219
|
-
|
|
220
|
-
const PageHeaderContent = /*#__PURE__*/React__default.forwardRef(function PageHeaderContent(_ref3, ref) {
|
|
221
|
-
let {
|
|
222
|
-
className,
|
|
223
|
-
children,
|
|
224
|
-
title,
|
|
225
|
-
renderIcon: IconElement,
|
|
226
|
-
contextualActions,
|
|
227
|
-
pageActions,
|
|
228
|
-
...other
|
|
229
|
-
} = _ref3;
|
|
230
|
-
const contentRef = useRef(null);
|
|
231
|
-
const componentRef = ref ?? contentRef;
|
|
232
|
-
const {
|
|
233
|
-
setRefs,
|
|
234
|
-
setPageActionsInstance
|
|
235
|
-
} = usePageHeader();
|
|
236
|
-
const classNames = cx({
|
|
237
|
-
[`${blockClass}__content`]: true
|
|
238
|
-
}, className);
|
|
239
|
-
const titleRef = useRef(null);
|
|
240
|
-
useEffect(() => {
|
|
241
|
-
if (componentRef?.current) {
|
|
242
|
-
setRefs(prev => ({
|
|
243
|
-
...prev,
|
|
244
|
-
contentRef: componentRef,
|
|
245
|
-
titleRef
|
|
246
|
-
}));
|
|
247
|
-
}
|
|
248
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
249
|
-
}, []);
|
|
250
|
-
useEffect(() => {
|
|
251
|
-
if (pageActions) {
|
|
252
|
-
setPageActionsInstance(pageActions);
|
|
253
|
-
}
|
|
254
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
255
|
-
}, [pageActions]);
|
|
256
|
-
const [isEllipsisApplied, setIsEllipsisApplied] = useState(false);
|
|
257
|
-
const isEllipsisActive = element => {
|
|
258
|
-
setIsEllipsisApplied(element.offsetHeight < element.scrollHeight);
|
|
259
|
-
return element.offsetHeight < element.scrollHeight;
|
|
260
|
-
};
|
|
261
|
-
useIsomorphicEffect(() => {
|
|
262
|
-
titleRef.current && isEllipsisActive(titleRef.current);
|
|
263
|
-
}, [title]);
|
|
264
|
-
return /*#__PURE__*/React__default.createElement(Section, _extends({
|
|
265
|
-
as: "div",
|
|
266
|
-
className: classNames,
|
|
267
|
-
ref: componentRef
|
|
268
|
-
}, other), /*#__PURE__*/React__default.createElement(Grid, null, /*#__PURE__*/React__default.createElement(Column, {
|
|
269
|
-
lg: 16,
|
|
270
|
-
md: 8,
|
|
271
|
-
sm: 4
|
|
272
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
273
|
-
className: `${blockClass}__content__title-wrapper`
|
|
274
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
275
|
-
className: `${blockClass}__content__start`
|
|
276
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
277
|
-
className: `${blockClass}__content__title-container`
|
|
278
|
-
}, IconElement && /*#__PURE__*/React__default.createElement("div", {
|
|
279
|
-
className: `${blockClass}__content__icon`
|
|
280
|
-
}, /*#__PURE__*/React__default.createElement(IconElement, null)), isEllipsisApplied ? /*#__PURE__*/React__default.createElement(DefinitionTooltip, {
|
|
281
|
-
definition: title
|
|
282
|
-
}, /*#__PURE__*/React__default.createElement(unstable_Text, {
|
|
283
|
-
ref: titleRef,
|
|
284
|
-
as: Heading,
|
|
285
|
-
className: `${blockClass}__content__title`
|
|
286
|
-
}, title)) : /*#__PURE__*/React__default.createElement(unstable_Text, {
|
|
287
|
-
ref: titleRef,
|
|
288
|
-
as: Heading,
|
|
289
|
-
className: `${blockClass}__content__title`
|
|
290
|
-
}, title)), contextualActions && /*#__PURE__*/React__default.createElement("div", {
|
|
291
|
-
className: `${blockClass}__content__contextual-actions`
|
|
292
|
-
}, contextualActions)), pageActions), children)));
|
|
293
|
-
});
|
|
294
|
-
PageHeaderContent.displayName = 'PageHeaderContent';
|
|
295
|
-
PageHeaderContent.propTypes = {
|
|
296
|
-
/**
|
|
297
|
-
* Provide child elements to be rendered inside PageHeaderContent.
|
|
298
|
-
*/
|
|
299
|
-
children: PropTypes.node,
|
|
300
|
-
/**
|
|
301
|
-
* Specify an optional className to be added to your PageHeaderContent
|
|
302
|
-
*/
|
|
303
|
-
className: PropTypes.string,
|
|
304
|
-
/**
|
|
305
|
-
* The PageHeaderContent's contextual actions
|
|
306
|
-
*/
|
|
307
|
-
contextualActions: PropTypes.node,
|
|
308
|
-
/**
|
|
309
|
-
* The PageHeaderContent's page actions
|
|
310
|
-
*/
|
|
311
|
-
pageActions: PropTypes.node,
|
|
312
|
-
/**
|
|
313
|
-
* Provide an optional icon to render in front of the PageHeaderContent's title.
|
|
314
|
-
*/
|
|
315
|
-
renderIcon: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
|
|
316
|
-
/**
|
|
317
|
-
* The PageHeaderContent's subtitle
|
|
318
|
-
*/
|
|
319
|
-
subtitle: PropTypes.string,
|
|
320
|
-
/**
|
|
321
|
-
* The PageHeaderContent's title
|
|
322
|
-
*/
|
|
323
|
-
title: PropTypes.string.isRequired
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* ----------------
|
|
328
|
-
* PageHeaderContentPageActions
|
|
329
|
-
* ----------------
|
|
330
|
-
*/
|
|
331
|
-
|
|
332
|
-
const PageHeaderContentPageActions = _ref4 => {
|
|
333
|
-
let {
|
|
334
|
-
className,
|
|
335
|
-
children,
|
|
336
|
-
menuButtonLabel = 'Actions',
|
|
337
|
-
actions,
|
|
338
|
-
...other
|
|
339
|
-
} = _ref4;
|
|
340
|
-
const {
|
|
341
|
-
setRefs,
|
|
342
|
-
contentActionsClipped,
|
|
343
|
-
breadcrumbActionsClipped,
|
|
344
|
-
isContentActionsInBreadcrumbBar: isInBreadcrumbBar
|
|
345
|
-
} = usePageHeader();
|
|
346
|
-
const classNames = cx(`${blockClass}__content__page-actions`, {
|
|
347
|
-
// Revisit this:
|
|
348
|
-
// May want to only add this class if there are content actions in the breadcrumb bar as well
|
|
349
|
-
[`${blockClass}__content__page-actions--clipped`]: isInBreadcrumbBar ? breadcrumbActionsClipped : contentActionsClipped
|
|
350
|
-
}, className);
|
|
351
|
-
const containerRef = useRef(null);
|
|
352
|
-
const offsetRef = useRef(null);
|
|
353
|
-
const [menuButtonVisibility, setMenuButtonVisibility] = useState(false);
|
|
354
|
-
const [hiddenItems, setHiddenItems] = useState([]);
|
|
355
|
-
|
|
356
|
-
// need to set the grid columns width based on the menu button's width
|
|
357
|
-
// to avoid overlapping when resizing
|
|
358
|
-
useIsomorphicEffect(() => {
|
|
359
|
-
if (menuButtonVisibility && offsetRef.current) {
|
|
360
|
-
const width = offsetRef.current.offsetWidth;
|
|
361
|
-
document.documentElement.style.setProperty('--page-header-title-grid-width', `${width}px`);
|
|
362
|
-
}
|
|
363
|
-
}, [menuButtonVisibility]);
|
|
364
|
-
useEffect(() => {
|
|
365
|
-
if (isInBreadcrumbBar) {
|
|
366
|
-
setRefs(prev => ({
|
|
367
|
-
...prev,
|
|
368
|
-
breadcrumbActions: containerRef
|
|
369
|
-
}));
|
|
370
|
-
} else {
|
|
371
|
-
setRefs(prev => ({
|
|
372
|
-
...prev,
|
|
373
|
-
contentActions: containerRef
|
|
374
|
-
}));
|
|
375
|
-
}
|
|
376
|
-
}, [isInBreadcrumbBar, setRefs]);
|
|
377
|
-
useEffect(() => {
|
|
378
|
-
if (!containerRef.current || !Array.isArray(actions)) {
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
createOverflowHandler$1({
|
|
382
|
-
container: containerRef.current,
|
|
383
|
-
// exclude the hidden menu button from children
|
|
384
|
-
maxVisibleItems: containerRef.current.children.length - 1,
|
|
385
|
-
onChange: (visible, hidden) => {
|
|
386
|
-
setHiddenItems(actions?.slice(visible.length));
|
|
387
|
-
if (hidden.length > 0) {
|
|
388
|
-
setMenuButtonVisibility(true);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
}, [actions]);
|
|
393
|
-
return /*#__PURE__*/React__default.createElement("div", _extends({
|
|
394
|
-
className: classNames,
|
|
395
|
-
ref: containerRef
|
|
396
|
-
}, other), Array.isArray(actions) && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, actions.map(action => /*#__PURE__*/React__default.createElement("div", {
|
|
397
|
-
key: action.id
|
|
398
|
-
}, /*#__PURE__*/React__default.cloneElement(action.body, {
|
|
399
|
-
...action.body.props,
|
|
400
|
-
onClick: action.onClick
|
|
401
|
-
}))), /*#__PURE__*/React__default.createElement("span", {
|
|
402
|
-
"data-offset": true,
|
|
403
|
-
"data-hidden": true,
|
|
404
|
-
ref: offsetRef
|
|
405
|
-
}, /*#__PURE__*/React__default.createElement(MenuButton, {
|
|
406
|
-
menuAlignment: "bottom-end",
|
|
407
|
-
label: menuButtonLabel,
|
|
408
|
-
size: "md"
|
|
409
|
-
}, [...hiddenItems].reverse().map(item => /*#__PURE__*/React__default.createElement(MenuItem, _extends({
|
|
410
|
-
key: item.id,
|
|
411
|
-
onClick: item.onClick
|
|
412
|
-
}, item.menuItem)))))));
|
|
413
|
-
};
|
|
414
|
-
PageHeaderContentPageActions.displayName = 'PageHeaderContentPageActions';
|
|
415
|
-
PageHeaderContentPageActions.propTypes = {
|
|
416
|
-
/**
|
|
417
|
-
* The PageHeaderContent's page actions
|
|
418
|
-
*/
|
|
419
|
-
actions: PropTypes.oneOfType([PropTypes.node, PropTypes.array]),
|
|
420
|
-
/**
|
|
421
|
-
* Provide child elements to be rendered inside PageHeaderContentPageActions.
|
|
422
|
-
*/
|
|
423
|
-
children: PropTypes.node,
|
|
424
|
-
/**
|
|
425
|
-
* Specify an optional className to be added to your PageHeaderContentPageActions
|
|
426
|
-
*/
|
|
427
|
-
className: PropTypes.string,
|
|
428
|
-
/**
|
|
429
|
-
* The PageHeaderContent's collapsible Menu button label
|
|
430
|
-
*/
|
|
431
|
-
menuButtonLabel: PropTypes.string
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
/**
|
|
435
|
-
* ----------------
|
|
436
|
-
* PageHeaderContentText
|
|
437
|
-
* ----------------
|
|
438
|
-
*/
|
|
439
|
-
|
|
440
|
-
const PageHeaderContentText = _ref5 => {
|
|
441
|
-
let {
|
|
442
|
-
className,
|
|
443
|
-
children,
|
|
444
|
-
subtitle,
|
|
445
|
-
...other
|
|
446
|
-
} = _ref5;
|
|
447
|
-
const classNames = cx({
|
|
448
|
-
[`${blockClass}__content__body`]: true
|
|
449
|
-
}, className);
|
|
450
|
-
return /*#__PURE__*/React__default.createElement("div", _extends({
|
|
451
|
-
className: classNames
|
|
452
|
-
}, other), subtitle && /*#__PURE__*/React__default.createElement(unstable_Text, {
|
|
453
|
-
as: "h3",
|
|
454
|
-
className: `${blockClass}__content__subtitle`
|
|
455
|
-
}, subtitle), children);
|
|
456
|
-
};
|
|
457
|
-
PageHeaderContentText.displayName = 'PageHeaderContentText';
|
|
458
|
-
PageHeaderContentText.propTypes = {
|
|
459
|
-
/**
|
|
460
|
-
* Provide child elements to be rendered inside PageHeaderContentText.
|
|
461
|
-
*/
|
|
462
|
-
children: PropTypes.node,
|
|
463
|
-
/**
|
|
464
|
-
* Specify an optional className to be added to your PageHeaderContentText
|
|
465
|
-
*/
|
|
466
|
-
className: PropTypes.string,
|
|
467
|
-
/**
|
|
468
|
-
* The PageHeaderContent's subtitle
|
|
469
|
-
*/
|
|
470
|
-
subtitle: PropTypes.string
|
|
471
|
-
};
|
|
472
|
-
|
|
473
|
-
/**
|
|
474
|
-
* ----------------
|
|
475
|
-
* PageHeaderHeroImage
|
|
476
|
-
* ----------------
|
|
477
|
-
*/
|
|
478
|
-
|
|
479
|
-
const PageHeaderHeroImage = _ref6 => {
|
|
480
|
-
let {
|
|
481
|
-
className,
|
|
482
|
-
children,
|
|
483
|
-
...other
|
|
484
|
-
} = _ref6;
|
|
485
|
-
const [lgBreakpoint, setLgBreakpoint] = useState(false);
|
|
486
|
-
const classNames = cx({
|
|
487
|
-
[`${blockClass}__hero-image`]: true
|
|
488
|
-
}, className);
|
|
489
|
-
const lgMediaQuery = `(min-width: ${breakpoints.lg.width})`;
|
|
490
|
-
useEffect(() => {
|
|
491
|
-
const listener = event => {
|
|
492
|
-
setLgBreakpoint(event.matches);
|
|
493
|
-
};
|
|
494
|
-
const mediaQueryList = window.matchMedia(lgMediaQuery);
|
|
495
|
-
mediaQueryList.addEventListener('change', listener);
|
|
496
|
-
setLgBreakpoint(mediaQueryList.matches);
|
|
497
|
-
return () => {
|
|
498
|
-
mediaQueryList.removeEventListener('change', listener);
|
|
499
|
-
};
|
|
500
|
-
}, [lgMediaQuery]);
|
|
501
|
-
return /*#__PURE__*/React__default.createElement(AspectRatio, _extends({
|
|
502
|
-
className: classNames
|
|
503
|
-
}, other, {
|
|
504
|
-
ratio: lgBreakpoint ? '2x1' : '3x2'
|
|
505
|
-
}), children);
|
|
506
|
-
};
|
|
507
|
-
PageHeaderHeroImage.displayName = 'PageHeaderHeroImage';
|
|
508
|
-
PageHeaderHeroImage.propTypes = {
|
|
509
|
-
/**
|
|
510
|
-
* Provide child elements to be rendered inside PageHeaderHeroImage.
|
|
511
|
-
*/
|
|
512
|
-
children: PropTypes.node,
|
|
513
|
-
/**
|
|
514
|
-
* Specify an optional className to be added to your PageHeaderHeroImage
|
|
515
|
-
*/
|
|
516
|
-
className: PropTypes.string
|
|
517
|
-
};
|
|
518
|
-
|
|
519
|
-
/**
|
|
520
|
-
* ----------------
|
|
521
|
-
* PageHeaderTabBar
|
|
522
|
-
* ----------------
|
|
523
|
-
*/
|
|
524
|
-
|
|
525
|
-
const PageHeaderTabBar = /*#__PURE__*/React__default.forwardRef(function PageHeaderTabBar(_ref7, ref) {
|
|
526
|
-
let {
|
|
527
|
-
className,
|
|
528
|
-
children,
|
|
529
|
-
tags,
|
|
530
|
-
scroller,
|
|
531
|
-
...other
|
|
532
|
-
} = _ref7;
|
|
533
|
-
const classNames = cx({
|
|
534
|
-
[`${blockClass}__tab-bar`]: true
|
|
535
|
-
}, className);
|
|
536
|
-
const renderScroller = () => scroller && /*#__PURE__*/React__default.createElement("div", {
|
|
537
|
-
className: `${pkg.prefix}--page-header--scroller-button-container`
|
|
538
|
-
}, scroller);
|
|
539
|
-
|
|
540
|
-
// Early return if no tags are provided
|
|
541
|
-
if (!tags) {
|
|
542
|
-
return /*#__PURE__*/React__default.createElement("div", _extends({
|
|
543
|
-
className: classNames,
|
|
544
|
-
ref: ref
|
|
545
|
-
}, other), /*#__PURE__*/React__default.createElement(Grid, {
|
|
546
|
-
condensed: true
|
|
547
|
-
}, /*#__PURE__*/React__default.createElement(Column, {
|
|
548
|
-
lg: 16,
|
|
549
|
-
md: 8,
|
|
550
|
-
sm: 4
|
|
551
|
-
}, children, renderScroller())));
|
|
552
|
-
}
|
|
553
|
-
return /*#__PURE__*/React__default.createElement("div", _extends({
|
|
554
|
-
className: classNames,
|
|
555
|
-
ref: ref
|
|
556
|
-
}, other), /*#__PURE__*/React__default.createElement(Grid, {
|
|
557
|
-
condensed: true
|
|
558
|
-
}, /*#__PURE__*/React__default.createElement(Column, {
|
|
559
|
-
lg: 16,
|
|
560
|
-
md: 8,
|
|
561
|
-
sm: 4
|
|
562
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
563
|
-
className: cx(`${blockClass}__tab-bar--tablist`, {
|
|
564
|
-
[`${pkg.prefix}--page-header__tab-bar--with-scroller`]: !!scroller
|
|
565
|
-
})
|
|
566
|
-
}, children, tags, renderScroller()))));
|
|
567
|
-
});
|
|
568
|
-
PageHeaderTabBar.displayName = 'PageHeaderTabBar';
|
|
569
|
-
const PageHeaderTagOverflow = /*#__PURE__*/React__default.forwardRef((_ref8, ref) => {
|
|
570
|
-
let {
|
|
571
|
-
renderOverflowTag,
|
|
572
|
-
renderPopoverContent,
|
|
573
|
-
children
|
|
574
|
-
} = _ref8;
|
|
575
|
-
const [openPopover, setOpenPopover] = useState(false);
|
|
576
|
-
const [hiddenTags, setHiddenTags] = useState([]);
|
|
577
|
-
const localRef = useRef(null);
|
|
578
|
-
const tagsContainerRef = ref || localRef;
|
|
579
|
-
// To close popover when window resizes
|
|
580
|
-
useEffect(() => {
|
|
581
|
-
const handleResize = () => {
|
|
582
|
-
// Close the popover when window resizes to prevent unwanted opens
|
|
583
|
-
setOpenPopover(false);
|
|
584
|
-
};
|
|
585
|
-
window.addEventListener('resize', handleResize);
|
|
586
|
-
return () => {
|
|
587
|
-
window.removeEventListener('resize', handleResize);
|
|
588
|
-
};
|
|
589
|
-
}, []);
|
|
590
|
-
const handleOverflowClick = useCallback(event => {
|
|
591
|
-
event.stopPropagation();
|
|
592
|
-
setOpenPopover(prev => !prev);
|
|
593
|
-
}, []);
|
|
594
|
-
useEffect(() => {
|
|
595
|
-
createOverflowHandler({
|
|
596
|
-
container: tagsContainerRef.current,
|
|
597
|
-
onChange: (_, hidden) => {
|
|
598
|
-
setHiddenTags(hidden);
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
// Don't want ref in dependency array
|
|
602
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
603
|
-
}, []);
|
|
604
|
-
return /*#__PURE__*/React__default.createElement("div", {
|
|
605
|
-
ref: tagsContainerRef,
|
|
606
|
-
className: cx(`${pkg.prefix}--page-header--tag-overflow-container`, {
|
|
607
|
-
[`${pkg.prefix}--page-header--tag-overflow-container__has-no-hidden-items`]: !hiddenTags.length
|
|
608
|
-
})
|
|
609
|
-
}, children, /*#__PURE__*/React__default.createElement(Popover, {
|
|
610
|
-
open: openPopover,
|
|
611
|
-
onRequestClose: () => setOpenPopover(false),
|
|
612
|
-
"data-fixed": true,
|
|
613
|
-
className: cx(`${pkg.prefix}--page-header--tag-overflow-popover`, {
|
|
614
|
-
[`${pkg.prefix}--page-header--tag-overflow-popover__hidden`]: !hiddenTags.length
|
|
615
|
-
})
|
|
616
|
-
}, renderOverflowTag?.(hiddenTags, handleOverflowClick, openPopover), /*#__PURE__*/React__default.createElement(PopoverContent, null, /*#__PURE__*/React__default.createElement("div", {
|
|
617
|
-
className: `${blockClass}__tags-popover-list`
|
|
618
|
-
}, renderPopoverContent?.(hiddenTags)))));
|
|
619
|
-
});
|
|
620
|
-
PageHeaderTagOverflow.displayName = 'PageHeaderTagOverflow';
|
|
621
|
-
const PageHeaderScrollButton = /*#__PURE__*/React__default.forwardRef(function PageHeaderExpander(_ref9, ref) {
|
|
622
|
-
let {
|
|
623
|
-
className,
|
|
624
|
-
children,
|
|
625
|
-
label,
|
|
626
|
-
onClick,
|
|
627
|
-
collapseText = 'Collapse',
|
|
628
|
-
expandText = 'Expand',
|
|
629
|
-
...other
|
|
630
|
-
} = _ref9;
|
|
631
|
-
const {
|
|
632
|
-
refs,
|
|
633
|
-
fullyCollapsed
|
|
634
|
-
} = usePageHeader();
|
|
635
|
-
const handleScroller = isFullyCollapsed => {
|
|
636
|
-
if (!refs?.contentRef?.current) {
|
|
637
|
-
return;
|
|
638
|
-
}
|
|
639
|
-
const scrollableTarget = scrollableAncestor(refs?.contentRef.current);
|
|
640
|
-
|
|
641
|
-
// Page header content is not fully collapsed
|
|
642
|
-
if (!isFullyCollapsed) {
|
|
643
|
-
const pageHeaderContentHeight = refs?.contentRef.current.offsetHeight;
|
|
644
|
-
scrollableTarget?.scrollTo({
|
|
645
|
-
top: pageHeaderContentHeight,
|
|
646
|
-
// headerTopValue, check if breadcrumb bar is included
|
|
647
|
-
behavior: 'smooth'
|
|
648
|
-
});
|
|
649
|
-
} else {
|
|
650
|
-
// Page header content is fully collapsed
|
|
651
|
-
scrollableTarget?.scrollTo({
|
|
652
|
-
top: 0,
|
|
653
|
-
behavior: 'smooth'
|
|
654
|
-
});
|
|
655
|
-
}
|
|
656
|
-
};
|
|
657
|
-
return /*#__PURE__*/React__default.createElement(IconButton, _extends({
|
|
658
|
-
ref: ref,
|
|
659
|
-
label: fullyCollapsed ? expandText : collapseText,
|
|
660
|
-
size: "md",
|
|
661
|
-
kind: "ghost",
|
|
662
|
-
autoAlign: true
|
|
663
|
-
}, other, {
|
|
664
|
-
onClick: event => {
|
|
665
|
-
onClick?.(event);
|
|
666
|
-
handleScroller(!!fullyCollapsed);
|
|
667
|
-
},
|
|
668
|
-
className: cx(className, `${pkg.prefix}--page-header--scroller-button`)
|
|
669
|
-
}), /*#__PURE__*/React__default.createElement(ChevronUp, {
|
|
670
|
-
className: cx(`${pkg.prefix}--page-header--scroller-button-icon`, {
|
|
671
|
-
[`${pkg.prefix}--page-header--scroller-button-icon-collapsed`]: fullyCollapsed
|
|
672
|
-
})
|
|
673
|
-
}));
|
|
674
|
-
});
|
|
675
|
-
const PageHeaderTitleBreadcrumb = /*#__PURE__*/forwardRef((_ref10, ref) => {
|
|
676
|
-
let {
|
|
677
|
-
className,
|
|
678
|
-
children,
|
|
679
|
-
...other
|
|
680
|
-
} = _ref10;
|
|
681
|
-
const {
|
|
682
|
-
titleClipped,
|
|
683
|
-
refs
|
|
684
|
-
} = usePageHeader();
|
|
685
|
-
return /*#__PURE__*/React__default.createElement(BreadcrumbItem, _extends({
|
|
686
|
-
ref: ref,
|
|
687
|
-
isCurrentPage: true
|
|
688
|
-
}, other, {
|
|
689
|
-
className: cx(className, `${pkg.prefix}--page-header-title-breadcrumb`, {
|
|
690
|
-
[`${pkg.prefix}--page-header-title-breadcrumb-show`]: titleClipped && refs?.titleRef,
|
|
691
|
-
[`${pkg.prefix}--page-header-title-breadcrumb-show__with-content-element`]: !!refs?.contentRef,
|
|
692
|
-
[`${pkg.prefix}--page-header-title-breadcrumb-show__without-content-element`]: !refs?.contentRef
|
|
693
|
-
})
|
|
694
|
-
}), children);
|
|
695
|
-
});
|
|
696
|
-
// This component is a wrapper for the Breadcrumb, and renders breadcrumb items as children
|
|
697
|
-
// including the overflow breadcrumb item. The overflowHandler determines what elements
|
|
698
|
-
// are visible and hidden and passes the hidden elements back to the render prop used
|
|
699
|
-
// to display the overflow breadcrumb
|
|
700
|
-
const PageHeaderBreadcrumbOverflow = /*#__PURE__*/forwardRef((_ref11, ref) => {
|
|
701
|
-
let {
|
|
702
|
-
renderOverflowBreadcrumb,
|
|
703
|
-
className,
|
|
704
|
-
children,
|
|
705
|
-
...other
|
|
706
|
-
} = _ref11;
|
|
707
|
-
const [hiddenBreadcrumbs, setHiddenBreadcrumbs] = React__default.useState([]);
|
|
708
|
-
const fallbackRef = useRef(null);
|
|
709
|
-
const componentRef = ref ?? fallbackRef;
|
|
710
|
-
|
|
711
|
-
// Initialize overflow resize handler
|
|
712
|
-
const carbonPrefix = usePrefix();
|
|
713
|
-
useEffect(() => {
|
|
714
|
-
if (!componentRef) {
|
|
715
|
-
return;
|
|
716
|
-
}
|
|
717
|
-
const breadcrumbList = componentRef?.current.querySelector(`.${carbonPrefix}--breadcrumb`);
|
|
718
|
-
createOverflowHandler({
|
|
719
|
-
container: breadcrumbList,
|
|
720
|
-
onChange: (_, hidden) => {
|
|
721
|
-
setHiddenBreadcrumbs(hidden);
|
|
722
|
-
}
|
|
723
|
-
});
|
|
724
|
-
// Don't want ref or carbon prefix in dependency array
|
|
725
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
726
|
-
}, []);
|
|
727
|
-
const renderChildren = () => {
|
|
728
|
-
// Only BreadcrumbItems and TitleBreadcrumbs are valid children
|
|
729
|
-
const filteredBreadcrumbs = React__default.Children.toArray(children).filter(child => {
|
|
730
|
-
if (/*#__PURE__*/React__default.isValidElement(child)) {
|
|
731
|
-
return child.type === BreadcrumbItem || PageHeaderTitleBreadcrumb;
|
|
732
|
-
}
|
|
733
|
-
});
|
|
734
|
-
// We need to clone the renderProp for the overflow breadcrumb item
|
|
735
|
-
// to place it before the title breadcrumb according to the design
|
|
736
|
-
if (filteredBreadcrumbs) {
|
|
737
|
-
const overflowBreadcrumb = renderOverflowBreadcrumb?.(hiddenBreadcrumbs);
|
|
738
|
-
// If no overflow breadcrumb provided, return here with the rest of the children
|
|
739
|
-
if (!overflowBreadcrumb) {
|
|
740
|
-
return children;
|
|
741
|
-
}
|
|
742
|
-
const clonedTitleBreadcrumb = /*#__PURE__*/React__default.cloneElement(overflowBreadcrumb, {
|
|
743
|
-
key: 'cloned overflow breadcrumb item',
|
|
744
|
-
'data-fixed': true,
|
|
745
|
-
className: cx(`${pkg.prefix}--page-header-breadcrumb-overflow-item`, {
|
|
746
|
-
[`${pkg.prefix}--page-header-overflow-breadcrumb-item-with-items`]: hiddenBreadcrumbs.length
|
|
747
|
-
})
|
|
748
|
-
});
|
|
749
|
-
const clonedChildren = [...filteredBreadcrumbs];
|
|
750
|
-
clonedChildren.splice(filteredBreadcrumbs.length - 1, 0, clonedTitleBreadcrumb); // second to last position
|
|
751
|
-
return clonedChildren;
|
|
752
|
-
}
|
|
753
|
-
return children;
|
|
754
|
-
};
|
|
755
|
-
return /*#__PURE__*/React__default.createElement(Breadcrumb, _extends({
|
|
756
|
-
className: cx(className, `${pkg.prefix}--page-header-breadcrumb-overflow`),
|
|
757
|
-
ref: componentRef
|
|
758
|
-
}, other), renderChildren());
|
|
759
|
-
});
|
|
760
|
-
|
|
761
149
|
/**
|
|
762
150
|
* -------
|
|
763
151
|
* Exports
|