@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.
Files changed (97) hide show
  1. package/css/index-full-carbon.css +18 -13
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +1 -1
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +18 -13
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +1 -1
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +18 -13
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +1 -1
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +18 -13
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +1 -1
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/Coachmark/next/Coachmark/ContentHeader.js +2 -1
  18. package/es/components/ConditionBuilder/ConditionBuilderItem/ConditionBuilderItem.js +12 -1
  19. package/es/components/CreateTearsheet/CreateTearsheet.d.ts +1 -0
  20. package/es/components/CreateTearsheet/CreateTearsheet.js +3 -0
  21. package/es/components/CreateTearsheet/CreateTearsheetStep.d.ts +4 -0
  22. package/es/components/CreateTearsheet/CreateTearsheetStep.js +7 -1
  23. package/es/components/EditInPlace/EditInPlace.d.ts +12 -1
  24. package/es/components/EditInPlace/EditInPlace.js +52 -31
  25. package/es/components/ImportModal/ImportModal.d.ts +5 -1
  26. package/es/components/ImportModal/ImportModal.js +12 -6
  27. package/es/components/PageHeader/next/PageHeader.d.ts +15 -238
  28. package/es/components/PageHeader/next/PageHeader.js +25 -637
  29. package/es/components/PageHeader/next/PageHeaderBreadcrumbBar.d.ts +41 -0
  30. package/es/components/PageHeader/next/PageHeaderBreadcrumbBar.js +74 -0
  31. package/es/components/PageHeader/next/PageHeaderBreadcrumbOverflow.d.ts +12 -0
  32. package/es/components/PageHeader/next/PageHeaderBreadcrumbOverflow.js +82 -0
  33. package/es/components/PageHeader/next/PageHeaderContent.d.ts +39 -0
  34. package/es/components/PageHeader/next/PageHeaderContent.js +129 -0
  35. package/es/components/PageHeader/next/PageHeaderContentPageActions.d.ts +52 -0
  36. package/es/components/PageHeader/next/PageHeaderContentPageActions.js +126 -0
  37. package/es/components/PageHeader/next/PageHeaderContentText.d.ts +44 -0
  38. package/es/components/PageHeader/next/PageHeaderContentText.js +54 -0
  39. package/es/components/PageHeader/next/PageHeaderHeroImage.d.ts +36 -0
  40. package/es/components/PageHeader/next/PageHeaderHeroImage.js +62 -0
  41. package/es/components/PageHeader/next/PageHeaderScrollButton.d.ts +13 -0
  42. package/es/components/PageHeader/next/PageHeaderScrollButton.js +73 -0
  43. package/es/components/PageHeader/next/PageHeaderTabBar.d.ts +19 -0
  44. package/es/components/PageHeader/next/PageHeaderTabBar.js +66 -0
  45. package/es/components/PageHeader/next/PageHeaderTagOverflow.d.ts +13 -0
  46. package/es/components/PageHeader/next/PageHeaderTagOverflow.js +68 -0
  47. package/es/components/PageHeader/next/PageHeaderTitleBreadcrumb.d.ts +9 -0
  48. package/es/components/PageHeader/next/PageHeaderTitleBreadcrumb.js +43 -0
  49. package/es/components/PageHeader/next/index.d.ts +3 -2
  50. package/es/components/PageHeader/next/index.js +11 -1
  51. package/es/global/js/hooks/useCreateComponentStepChange.d.ts +2 -1
  52. package/es/global/js/hooks/useCreateComponentStepChange.js +3 -2
  53. package/es/global/js/hooks/usePortalTarget.js +1 -1
  54. package/es/global/js/utils/makeDraggable/makeDraggable.js +22 -13
  55. package/lib/components/Coachmark/next/Coachmark/ContentHeader.js +2 -1
  56. package/lib/components/ConditionBuilder/ConditionBuilderItem/ConditionBuilderItem.js +12 -1
  57. package/lib/components/CreateTearsheet/CreateTearsheet.d.ts +1 -0
  58. package/lib/components/CreateTearsheet/CreateTearsheet.js +3 -0
  59. package/lib/components/CreateTearsheet/CreateTearsheetStep.d.ts +4 -0
  60. package/lib/components/CreateTearsheet/CreateTearsheetStep.js +7 -1
  61. package/lib/components/EditInPlace/EditInPlace.d.ts +12 -1
  62. package/lib/components/EditInPlace/EditInPlace.js +50 -29
  63. package/lib/components/ImportModal/ImportModal.d.ts +5 -1
  64. package/lib/components/ImportModal/ImportModal.js +12 -6
  65. package/lib/components/PageHeader/next/PageHeader.d.ts +15 -238
  66. package/lib/components/PageHeader/next/PageHeader.js +42 -654
  67. package/lib/components/PageHeader/next/PageHeaderBreadcrumbBar.d.ts +41 -0
  68. package/lib/components/PageHeader/next/PageHeaderBreadcrumbBar.js +76 -0
  69. package/lib/components/PageHeader/next/PageHeaderBreadcrumbOverflow.d.ts +12 -0
  70. package/lib/components/PageHeader/next/PageHeaderBreadcrumbOverflow.js +84 -0
  71. package/lib/components/PageHeader/next/PageHeaderContent.d.ts +39 -0
  72. package/lib/components/PageHeader/next/PageHeaderContent.js +131 -0
  73. package/lib/components/PageHeader/next/PageHeaderContentPageActions.d.ts +52 -0
  74. package/lib/components/PageHeader/next/PageHeaderContentPageActions.js +128 -0
  75. package/lib/components/PageHeader/next/PageHeaderContentText.d.ts +44 -0
  76. package/lib/components/PageHeader/next/PageHeaderContentText.js +56 -0
  77. package/lib/components/PageHeader/next/PageHeaderHeroImage.d.ts +36 -0
  78. package/lib/components/PageHeader/next/PageHeaderHeroImage.js +64 -0
  79. package/lib/components/PageHeader/next/PageHeaderScrollButton.d.ts +13 -0
  80. package/lib/components/PageHeader/next/PageHeaderScrollButton.js +75 -0
  81. package/lib/components/PageHeader/next/PageHeaderTabBar.d.ts +19 -0
  82. package/lib/components/PageHeader/next/PageHeaderTabBar.js +68 -0
  83. package/lib/components/PageHeader/next/PageHeaderTagOverflow.d.ts +13 -0
  84. package/lib/components/PageHeader/next/PageHeaderTagOverflow.js +70 -0
  85. package/lib/components/PageHeader/next/PageHeaderTitleBreadcrumb.d.ts +9 -0
  86. package/lib/components/PageHeader/next/PageHeaderTitleBreadcrumb.js +45 -0
  87. package/lib/components/PageHeader/next/index.d.ts +3 -2
  88. package/lib/components/PageHeader/next/index.js +20 -10
  89. package/lib/global/js/hooks/useCreateComponentStepChange.d.ts +2 -1
  90. package/lib/global/js/hooks/useCreateComponentStepChange.js +3 -2
  91. package/lib/global/js/hooks/usePortalTarget.js +1 -1
  92. package/lib/global/js/utils/makeDraggable/makeDraggable.js +22 -13
  93. package/package.json +7 -7
  94. package/scss/components/Datagrid/_datagrid.scss +7 -10
  95. package/scss/components/EditInPlace/_edit-in-place.scss +11 -3
  96. package/scss/components/PageHeader/_page-header.scss +2 -1
  97. 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, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';
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 { createOverflowHandler } from './overflowHandler.js';
16
- import { createOverflowHandler as createOverflowHandler$1 } from '@carbon/utilities';
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 { useIsomorphicEffect } from '../../../global/js/hooks/useIsomorphicEffect.js';
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 + totalTitleHeight + totalHeaderOffset + 48) * -1}px 0px 0px 0px`,
113
+ rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 24) * -1}px 0px 0px 0px`,
111
114
  threshold: 0.1
112
115
  });
113
- if (refs?.contentRef.current) {
114
- contentObserver.observe(refs?.contentRef.current);
116
+ if (refs?.contentRef?.current) {
117
+ contentObserver.observe(refs.contentRef.current);
115
118
  }
116
- if (refs?.titleRef.current) {
117
- titleObserver.observe(refs?.titleRef.current);
119
+ if (refs?.titleRef?.current) {
120
+ titleObserver.observe(refs.titleRef.current);
118
121
  }
119
- if (refs?.contentActions.current) {
120
- contentActionsObserver.observe(refs?.contentActions.current);
122
+ if (refs?.contentActions?.current) {
123
+ contentActionsObserver.observe(refs.contentActions.current);
121
124
  }
122
125
  return () => {
123
- if (!refs?.contentRef?.current) {
124
- return;
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