@carbon/ibm-products 2.72.0 → 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.
Files changed (47) hide show
  1. package/css/index-full-carbon.css +26 -12
  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 +26 -12
  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 +26 -12
  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 +26 -12
  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/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -0
  18. package/es/components/CreateFullPage/CreateFullPage.js +2 -1
  19. package/es/components/CreateModal/CreateModal.js +2 -1
  20. package/es/components/CreateSidePanel/CreateSidePanel.js +2 -1
  21. package/es/components/CreateTearsheet/CreateTearsheet.js +2 -1
  22. package/es/components/CreateTearsheetNarrow/CreateTearsheetNarrow.js +2 -1
  23. package/es/components/EmptyStates/EmptyStateContent.js +1 -1
  24. package/es/components/EmptyStates/EmptyStateV2.js +1 -1
  25. package/es/components/PageHeader/next/PageHeader.js +65 -9
  26. package/es/components/PageHeader/next/context.d.ts +4 -0
  27. package/es/components/PageHeader/next/context.js +4 -1
  28. package/es/components/PageHeader/next/overflowHandler.js +1 -1
  29. package/es/components/SidePanel/SidePanel.js +1 -1
  30. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -0
  31. package/lib/components/CreateFullPage/CreateFullPage.js +2 -1
  32. package/lib/components/CreateModal/CreateModal.js +2 -1
  33. package/lib/components/CreateSidePanel/CreateSidePanel.js +2 -1
  34. package/lib/components/CreateTearsheet/CreateTearsheet.js +2 -1
  35. package/lib/components/CreateTearsheetNarrow/CreateTearsheetNarrow.js +2 -1
  36. package/lib/components/EmptyStates/EmptyStateContent.js +1 -1
  37. package/lib/components/EmptyStates/EmptyStateV2.js +1 -1
  38. package/lib/components/PageHeader/next/PageHeader.js +65 -9
  39. package/lib/components/PageHeader/next/context.d.ts +4 -0
  40. package/lib/components/PageHeader/next/context.js +4 -1
  41. package/lib/components/PageHeader/next/overflowHandler.js +1 -1
  42. package/lib/components/SidePanel/SidePanel.js +1 -1
  43. package/package.json +6 -6
  44. package/scss/components/Coachmark/_bubble.scss +1 -2
  45. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +1 -1
  46. package/scss/components/PageHeader/_page-header.scss +41 -18
  47. 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("p", {
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("p", {
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 && refs?.contentRef?.current) {
49
- const pageHeaderContentHeight = refs?.contentRef?.current?.offsetHeight;
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
- contentObserver.unobserve(refs?.titleRef.current);
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
- titleClipped
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 classNames = cx({
291
- [`${blockClass}__content__page-actions`]: true
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.paddingLeft) + parseInt(computedStyles.paddingRight) + parseInt(computedStyles.marginLeft) + parseInt(computedStyles.marginRight) : size + parseInt(computedStyles.paddingTop) + parseInt(computedStyles.paddingBottom) + parseInt(computedStyles.marginTop) + parseInt(computedStyles.marginBottom);
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("p", {
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("p", {
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 && refs?.contentRef?.current) {
51
- const pageHeaderContentHeight = refs?.contentRef?.current?.offsetHeight;
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
- contentObserver.unobserve(refs?.titleRef.current);
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
- titleClipped
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 classNames = cx({
293
- [`${PageHeaderUtils.blockClass}__content__page-actions`]: true
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.paddingLeft) + parseInt(computedStyles.paddingRight) + parseInt(computedStyles.marginLeft) + parseInt(computedStyles.marginRight) : size + parseInt(computedStyles.paddingTop) + parseInt(computedStyles.paddingBottom) + parseInt(computedStyles.marginTop) + parseInt(computedStyles.marginBottom);
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`,