@patternfly/react-core 4.229.0 → 4.231.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 (131) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/esm/components/ContextSelector/ContextSelector.d.ts +4 -2
  3. package/dist/esm/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  4. package/dist/esm/components/ContextSelector/ContextSelector.js.map +1 -1
  5. package/dist/esm/components/ContextSelector/ContextSelectorToggle.d.ts +4 -2
  6. package/dist/esm/components/ContextSelector/ContextSelectorToggle.d.ts.map +1 -1
  7. package/dist/esm/components/ContextSelector/ContextSelectorToggle.js.map +1 -1
  8. package/dist/esm/components/MenuToggle/MenuToggle.d.ts +8 -0
  9. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  10. package/dist/esm/components/MenuToggle/MenuToggle.js +12 -7
  11. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  12. package/dist/esm/components/MenuToggle/MenuToggleAction.d.ts +19 -0
  13. package/dist/esm/components/MenuToggle/MenuToggleAction.d.ts.map +1 -0
  14. package/dist/esm/components/MenuToggle/MenuToggleAction.js +17 -0
  15. package/dist/esm/components/MenuToggle/MenuToggleAction.js.map +1 -0
  16. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.d.ts +36 -0
  17. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.d.ts.map +1 -0
  18. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.js +43 -0
  19. package/dist/esm/components/MenuToggle/MenuToggleCheckbox.js.map +1 -0
  20. package/dist/esm/components/MenuToggle/index.d.ts +2 -0
  21. package/dist/esm/components/MenuToggle/index.d.ts.map +1 -1
  22. package/dist/esm/components/MenuToggle/index.js +2 -0
  23. package/dist/esm/components/MenuToggle/index.js.map +1 -1
  24. package/dist/esm/components/Page/Page.d.ts +13 -0
  25. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  26. package/dist/esm/components/Page/Page.js +18 -19
  27. package/dist/esm/components/Page/Page.js.map +1 -1
  28. package/dist/esm/components/Page/PageBreadcrumb.d.ts +11 -2
  29. package/dist/esm/components/Page/PageBreadcrumb.d.ts.map +1 -1
  30. package/dist/esm/components/Page/PageBreadcrumb.js +5 -2
  31. package/dist/esm/components/Page/PageBreadcrumb.js.map +1 -1
  32. package/dist/esm/components/Page/PageGroup.d.ts +11 -2
  33. package/dist/esm/components/Page/PageGroup.d.ts.map +1 -1
  34. package/dist/esm/components/Page/PageGroup.js +5 -2
  35. package/dist/esm/components/Page/PageGroup.js.map +1 -1
  36. package/dist/esm/components/Page/PageNavigation.d.ts +11 -2
  37. package/dist/esm/components/Page/PageNavigation.d.ts.map +1 -1
  38. package/dist/esm/components/Page/PageNavigation.js +5 -2
  39. package/dist/esm/components/Page/PageNavigation.js.map +1 -1
  40. package/dist/esm/components/Page/PageSection.d.ts +10 -1
  41. package/dist/esm/components/Page/PageSection.d.ts.map +1 -1
  42. package/dist/esm/components/Page/PageSection.js +4 -2
  43. package/dist/esm/components/Page/PageSection.js.map +1 -1
  44. package/dist/esm/helpers/constants.d.ts +14 -0
  45. package/dist/esm/helpers/constants.d.ts.map +1 -1
  46. package/dist/esm/helpers/constants.js +24 -0
  47. package/dist/esm/helpers/constants.js.map +1 -1
  48. package/dist/esm/helpers/util.d.ts +8 -1
  49. package/dist/esm/helpers/util.d.ts.map +1 -1
  50. package/dist/esm/helpers/util.js +36 -9
  51. package/dist/esm/helpers/util.js.map +1 -1
  52. package/dist/js/components/ContextSelector/ContextSelector.d.ts +4 -2
  53. package/dist/js/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  54. package/dist/js/components/ContextSelector/ContextSelector.js.map +1 -1
  55. package/dist/js/components/ContextSelector/ContextSelectorToggle.d.ts +4 -2
  56. package/dist/js/components/ContextSelector/ContextSelectorToggle.d.ts.map +1 -1
  57. package/dist/js/components/ContextSelector/ContextSelectorToggle.js.map +1 -1
  58. package/dist/js/components/MenuToggle/MenuToggle.d.ts +8 -0
  59. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  60. package/dist/js/components/MenuToggle/MenuToggle.js +12 -7
  61. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  62. package/dist/js/components/MenuToggle/MenuToggleAction.d.ts +19 -0
  63. package/dist/js/components/MenuToggle/MenuToggleAction.d.ts.map +1 -0
  64. package/dist/js/components/MenuToggle/MenuToggleAction.js +21 -0
  65. package/dist/js/components/MenuToggle/MenuToggleAction.js.map +1 -0
  66. package/dist/js/components/MenuToggle/MenuToggleCheckbox.d.ts +36 -0
  67. package/dist/js/components/MenuToggle/MenuToggleCheckbox.d.ts.map +1 -0
  68. package/dist/js/components/MenuToggle/MenuToggleCheckbox.js +47 -0
  69. package/dist/js/components/MenuToggle/MenuToggleCheckbox.js.map +1 -0
  70. package/dist/js/components/MenuToggle/index.d.ts +2 -0
  71. package/dist/js/components/MenuToggle/index.d.ts.map +1 -1
  72. package/dist/js/components/MenuToggle/index.js +2 -0
  73. package/dist/js/components/MenuToggle/index.js.map +1 -1
  74. package/dist/js/components/Page/Page.d.ts +13 -0
  75. package/dist/js/components/Page/Page.d.ts.map +1 -1
  76. package/dist/js/components/Page/Page.js +17 -18
  77. package/dist/js/components/Page/Page.js.map +1 -1
  78. package/dist/js/components/Page/PageBreadcrumb.d.ts +11 -2
  79. package/dist/js/components/Page/PageBreadcrumb.d.ts.map +1 -1
  80. package/dist/js/components/Page/PageBreadcrumb.js +5 -2
  81. package/dist/js/components/Page/PageBreadcrumb.js.map +1 -1
  82. package/dist/js/components/Page/PageGroup.d.ts +11 -2
  83. package/dist/js/components/Page/PageGroup.d.ts.map +1 -1
  84. package/dist/js/components/Page/PageGroup.js +5 -2
  85. package/dist/js/components/Page/PageGroup.js.map +1 -1
  86. package/dist/js/components/Page/PageNavigation.d.ts +11 -2
  87. package/dist/js/components/Page/PageNavigation.d.ts.map +1 -1
  88. package/dist/js/components/Page/PageNavigation.js +5 -2
  89. package/dist/js/components/Page/PageNavigation.js.map +1 -1
  90. package/dist/js/components/Page/PageSection.d.ts +10 -1
  91. package/dist/js/components/Page/PageSection.d.ts.map +1 -1
  92. package/dist/js/components/Page/PageSection.js +4 -2
  93. package/dist/js/components/Page/PageSection.js.map +1 -1
  94. package/dist/js/helpers/constants.d.ts +14 -0
  95. package/dist/js/helpers/constants.d.ts.map +1 -1
  96. package/dist/js/helpers/constants.js +26 -1
  97. package/dist/js/helpers/constants.js.map +1 -1
  98. package/dist/js/helpers/util.d.ts +8 -1
  99. package/dist/js/helpers/util.d.ts.map +1 -1
  100. package/dist/js/helpers/util.js +37 -9
  101. package/dist/js/helpers/util.js.map +1 -1
  102. package/dist/umd/react-core.css +60 -10
  103. package/dist/umd/react-core.js +220 -72
  104. package/dist/umd/react-core.min.css +124 -74
  105. package/dist/umd/react-core.min.js +6 -5
  106. package/package.json +6 -6
  107. package/src/components/ContextSelector/ContextSelector.tsx +4 -2
  108. package/src/components/ContextSelector/ContextSelectorToggle.tsx +4 -2
  109. package/src/components/MenuToggle/MenuToggle.tsx +53 -27
  110. package/src/components/MenuToggle/MenuToggleAction.tsx +42 -0
  111. package/src/components/MenuToggle/MenuToggleCheckbox.tsx +104 -0
  112. package/src/components/MenuToggle/__tests__/__snapshots__/MenuToggle.test.tsx.snap +1 -1
  113. package/src/components/MenuToggle/examples/MenuToggle.md +35 -2
  114. package/src/components/MenuToggle/examples/MenuToggleSplitButtonAction.tsx +51 -0
  115. package/src/components/MenuToggle/examples/MenuToggleSplitButtonActionPrimary.tsx +58 -0
  116. package/src/components/MenuToggle/examples/MenuToggleSplitButtonActionSecondary.tsx +58 -0
  117. package/src/components/MenuToggle/examples/MenuToggleSplitButtonCheckbox.tsx +40 -0
  118. package/src/components/MenuToggle/examples/MenuToggleSplitButtonCheckboxPrimary.tsx +55 -0
  119. package/src/components/MenuToggle/examples/MenuToggleSplitButtonCheckboxSecondary.tsx +55 -0
  120. package/src/components/MenuToggle/examples/MenuToggleSplitButtonCheckboxWithText.tsx +52 -0
  121. package/src/components/MenuToggle/index.ts +2 -0
  122. package/src/components/Page/Page.tsx +58 -21
  123. package/src/components/Page/PageBreadcrumb.tsx +37 -20
  124. package/src/components/Page/PageGroup.tsx +35 -19
  125. package/src/components/Page/PageNavigation.tsx +37 -20
  126. package/src/components/Page/PageSection.tsx +41 -25
  127. package/src/components/Page/__tests__/Page.test.tsx +126 -2
  128. package/src/components/Page/__tests__/__snapshots__/Page.test.tsx.snap +683 -14
  129. package/src/demos/Page/Page.md +356 -3
  130. package/src/helpers/constants.ts +28 -0
  131. package/src/helpers/util.ts +44 -9
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { MenuToggleCheckbox, MenuToggle } from '@patternfly/react-core';
3
+
4
+ export const MenuToggleSplitButtonCheckboxSecondary: React.FunctionComponent = () => (
5
+ <React.Fragment>
6
+ <MenuToggle
7
+ isDisabled
8
+ variant="secondary"
9
+ splitButtonOptions={{
10
+ items: [
11
+ <MenuToggleCheckbox
12
+ id="split-button-checkbox-secondary-disabled-example"
13
+ key="split-checkbox-secondary-disabled"
14
+ aria-label="Select all"
15
+ isDisabled
16
+ >
17
+ 10 selected
18
+ </MenuToggleCheckbox>
19
+ ]
20
+ }}
21
+ aria-label="Secondary menu toggle with checkbox split button"
22
+ />{' '}
23
+ <MenuToggle
24
+ variant="secondary"
25
+ splitButtonOptions={{
26
+ items: [
27
+ <MenuToggleCheckbox
28
+ id="split-button-checkbox-secondary-example"
29
+ key="split-checkbox-secondary"
30
+ aria-label="Select all"
31
+ >
32
+ 10 selected
33
+ </MenuToggleCheckbox>
34
+ ]
35
+ }}
36
+ aria-label="Secondary menu toggle with checkbox split button"
37
+ />{' '}
38
+ <MenuToggle
39
+ isExpanded
40
+ variant="secondary"
41
+ splitButtonOptions={{
42
+ items: [
43
+ <MenuToggleCheckbox
44
+ id="split-button-checkbox-secondary-expanded-example"
45
+ key="split-checkbox-secondary-expanded"
46
+ aria-label="Select all"
47
+ >
48
+ 10 selected
49
+ </MenuToggleCheckbox>
50
+ ]
51
+ }}
52
+ aria-label="Secondary menu toggle with checkbox split button"
53
+ />
54
+ </React.Fragment>
55
+ );
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ import { MenuToggleCheckbox, MenuToggle } from '@patternfly/react-core';
3
+
4
+ export const MenuToggleSplitButtonCheckboxWithText: React.FunctionComponent = () => (
5
+ <React.Fragment>
6
+ <MenuToggle
7
+ isDisabled
8
+ splitButtonOptions={{
9
+ items: [
10
+ <MenuToggleCheckbox
11
+ id="split-button-checkbox-with-text-disabled-example"
12
+ key="split-checkbox-with-text-disabled"
13
+ aria-label="Select all"
14
+ isDisabled
15
+ >
16
+ 10 selected
17
+ </MenuToggleCheckbox>
18
+ ]
19
+ }}
20
+ aria-label="Menu toggle with checkbox split button and text"
21
+ />{' '}
22
+ <MenuToggle
23
+ splitButtonOptions={{
24
+ items: [
25
+ <MenuToggleCheckbox
26
+ id="split-button-checkbox-with-text-example"
27
+ key="split-checkbox-with-text"
28
+ aria-label="Select all"
29
+ >
30
+ 10 selected
31
+ </MenuToggleCheckbox>
32
+ ]
33
+ }}
34
+ aria-label="Menu toggle with checkbox split button and text"
35
+ />{' '}
36
+ <MenuToggle
37
+ isExpanded
38
+ splitButtonOptions={{
39
+ items: [
40
+ <MenuToggleCheckbox
41
+ id="split-button-checkbox-with-text-expanded-example"
42
+ key="split-checkbox-with-text-expanded"
43
+ aria-label="Select all"
44
+ >
45
+ 10 selected
46
+ </MenuToggleCheckbox>
47
+ ]
48
+ }}
49
+ aria-label="Menu toggle with checkbox split button and text"
50
+ />
51
+ </React.Fragment>
52
+ );
@@ -1 +1,3 @@
1
1
  export * from './MenuToggle';
2
+ export * from './MenuToggleAction';
3
+ export * from './MenuToggleCheckbox';
@@ -4,9 +4,10 @@ import { css } from '@patternfly/react-styles';
4
4
  import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/global_breakpoint_xl';
5
5
  import { debounce, canUseDOM } from '../../helpers/util';
6
6
  import { Drawer, DrawerContent, DrawerContentBody, DrawerPanelContent } from '../Drawer';
7
- import { PageGroup, PageGroupProps } from './PageGroup';
7
+ import { PageBreadcrumbProps } from './PageBreadcrumb';
8
+ import { PageGroupProps } from './PageGroup';
8
9
  import { getResizeObserver } from '../../helpers/resizeObserver';
9
- import { getBreakpoint } from '../../helpers/util';
10
+ import { formatBreakpointMods, getBreakpoint, getVerticalBreakpoint } from '../../helpers/util';
10
11
 
11
12
  export enum PageLayouts {
12
13
  vertical = 'vertical',
@@ -18,14 +19,19 @@ export interface PageContextProps {
18
19
  onNavToggle: () => void;
19
20
  isNavOpen: boolean;
20
21
  width: number;
22
+ height: number;
21
23
  getBreakpoint: (width: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
24
+ getVerticalBreakpoint: (height: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
22
25
  }
26
+
23
27
  export const pageContextDefaults: PageContextProps = {
24
28
  isManagedSidebar: false,
25
29
  isNavOpen: false,
26
30
  onNavToggle: () => null,
27
31
  width: null,
28
- getBreakpoint
32
+ height: null,
33
+ getBreakpoint,
34
+ getVerticalBreakpoint
29
35
  };
30
36
  export const PageContext = React.createContext<PageContextProps>(pageContextDefaults);
31
37
 
@@ -80,6 +86,13 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
80
86
  * https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/helpers/util.ts
81
87
  */
82
88
  getBreakpoint?: (width: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
89
+ /**
90
+ * The page resize observer uses the breakpoints returned from this function when adding the pf-m-breakpoint-[default|sm|md|lg|xl|2xl] class
91
+ * You can override the default getVerticalBreakpoint function to return breakpoints at different sizes than the default
92
+ * You can view the default getVerticalBreakpoint function here:
93
+ * https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/helpers/util.ts
94
+ */
95
+ getVerticalBreakpoint?: (height: number | null) => 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
83
96
  /** Breadcrumb component for the page */
84
97
  breadcrumb?: React.ReactNode;
85
98
  /** Tertiary nav component for the page */
@@ -94,6 +107,8 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
94
107
  additionalGroupedContent?: React.ReactNode;
95
108
  /** Additional props of the group */
96
109
  groupProps?: PageGroupProps;
110
+ /** Additional props of the breadcrumb */
111
+ breadcrumbProps?: PageBreadcrumbProps;
97
112
  }
98
113
 
99
114
  export interface PageState {
@@ -101,6 +116,7 @@ export interface PageState {
101
116
  mobileIsNavOpen: boolean;
102
117
  mobileView: boolean;
103
118
  width: number;
119
+ height: number;
104
120
  }
105
121
 
106
122
  export class Page extends React.Component<PageProps, PageState> {
@@ -113,7 +129,8 @@ export class Page extends React.Component<PageProps, PageState> {
113
129
  mainTabIndex: -1,
114
130
  isNotificationDrawerExpanded: false,
115
131
  onNotificationDrawerExpand: () => null,
116
- getBreakpoint
132
+ getBreakpoint,
133
+ getVerticalBreakpoint
117
134
  };
118
135
  mainRef = React.createRef<HTMLDivElement>();
119
136
  pageRef = React.createRef<HTMLDivElement>();
@@ -128,7 +145,8 @@ export class Page extends React.Component<PageProps, PageState> {
128
145
  desktopIsNavOpen: managedSidebarOpen,
129
146
  mobileIsNavOpen: false,
130
147
  mobileView: false,
131
- width: null
148
+ width: null,
149
+ height: null
132
150
  };
133
151
  }
134
152
 
@@ -179,7 +197,8 @@ export class Page extends React.Component<PageProps, PageState> {
179
197
  if (mobileView !== this.state.mobileView) {
180
198
  this.setState({ mobileView });
181
199
  }
182
- this.pageRef.current && this.setState({ width: this.pageRef.current.clientWidth });
200
+ this.pageRef.current &&
201
+ this.setState({ width: this.pageRef.current.clientWidth, height: this.pageRef.current.clientHeight });
183
202
  };
184
203
 
185
204
  handleResize = debounce(this.resize, 250);
@@ -223,6 +242,7 @@ export class Page extends React.Component<PageProps, PageState> {
223
242
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
224
243
  onPageResize,
225
244
  getBreakpoint,
245
+ getVerticalBreakpoint,
226
246
  mainAriaLabel,
227
247
  mainTabIndex,
228
248
  tertiaryNav,
@@ -230,16 +250,19 @@ export class Page extends React.Component<PageProps, PageState> {
230
250
  isBreadcrumbGrouped,
231
251
  additionalGroupedContent,
232
252
  groupProps,
253
+ breadcrumbProps,
233
254
  ...rest
234
255
  } = this.props;
235
- const { mobileView, mobileIsNavOpen, desktopIsNavOpen, width } = this.state;
256
+ const { mobileView, mobileIsNavOpen, desktopIsNavOpen, width, height } = this.state;
236
257
 
237
258
  const context = {
238
259
  isManagedSidebar,
239
260
  onNavToggle: mobileView ? this.onNavToggleMobile : this.onNavToggleDesktop,
240
261
  isNavOpen: mobileView ? mobileIsNavOpen : desktopIsNavOpen,
241
262
  width,
242
- getBreakpoint
263
+ height,
264
+ getBreakpoint,
265
+ getVerticalBreakpoint
243
266
  };
244
267
 
245
268
  let nav = null;
@@ -253,25 +276,38 @@ export class Page extends React.Component<PageProps, PageState> {
253
276
  nav = <div className={css(styles.pageMainNav)}>{tertiaryNav}</div>;
254
277
  }
255
278
 
256
- let crumb = null;
257
- if (breadcrumb && isBreadcrumbWidthLimited) {
258
- crumb = (
259
- <section className={css(styles.pageMainBreadcrumb, styles.modifiers.limitWidth)}>
260
- <div className={css(styles.pageMainBody)}>{breadcrumb}</div>
261
- </section>
262
- );
263
- } else if (breadcrumb) {
264
- crumb = <section className={css(styles.pageMainBreadcrumb)}>{breadcrumb}</section>;
265
- }
279
+ const crumb = breadcrumb ? (
280
+ <section
281
+ className={css(
282
+ styles.pageMainBreadcrumb,
283
+ isBreadcrumbWidthLimited && styles.modifiers.limitWidth,
284
+ formatBreakpointMods(
285
+ breadcrumbProps?.stickyOnBreakpoint,
286
+ styles,
287
+ 'sticky-',
288
+ getVerticalBreakpoint(height),
289
+ true
290
+ )
291
+ )}
292
+ >
293
+ {isBreadcrumbWidthLimited ? <div className={css(styles.pageMainBody)}>{breadcrumb}</div> : breadcrumb}
294
+ </section>
295
+ ) : null;
266
296
 
267
297
  const isGrouped = isTertiaryNavGrouped || isBreadcrumbGrouped || additionalGroupedContent;
268
298
 
269
299
  const group = isGrouped ? (
270
- <PageGroup {...groupProps}>
300
+ <div
301
+ className={css(
302
+ styles.pageMainGroup,
303
+ formatBreakpointMods(groupProps?.stickyOnBreakpoint, styles, 'sticky-', getVerticalBreakpoint(height), true)
304
+ )}
305
+ {...groupProps}
306
+ >
271
307
  {isTertiaryNavGrouped && nav}
272
308
  {isBreadcrumbGrouped && crumb}
273
309
  {additionalGroupedContent}
274
- </PageGroup>
310
+ </div>
275
311
  ) : null;
276
312
 
277
313
  const main = (
@@ -299,8 +335,9 @@ export class Page extends React.Component<PageProps, PageState> {
299
335
  {...rest}
300
336
  className={css(
301
337
  styles.page,
302
- width !== null && 'pf-m-resize-observer',
338
+ width !== null && height !== null && 'pf-m-resize-observer',
303
339
  width !== null && `pf-m-breakpoint-${getBreakpoint(width)}`,
340
+ height !== null && `pf-m-height-breakpoint-${getVerticalBreakpoint(height)}`,
304
341
  className
305
342
  )}
306
343
  >
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Page/page';
4
+ import { formatBreakpointMods } from '../../helpers/util';
5
+ import { PageContext } from '../Page/Page';
4
6
 
5
7
  export interface PageBreadcrumbProps extends React.HTMLProps<HTMLElement> {
6
8
  /** Additional classes to apply to the PageBreadcrumb */
@@ -9,8 +11,17 @@ export interface PageBreadcrumbProps extends React.HTMLProps<HTMLElement> {
9
11
  children?: React.ReactNode;
10
12
  /** Limits the width of the breadcrumb */
11
13
  isWidthLimited?: boolean;
12
- /** Modifier indicating if the PageBreadcrumb is sticky to the top or bottom */
14
+ /** @deprecated Use the stickyOnBreakpoint prop instead - Modifier indicating if the PageBreadcrumb is sticky to the top or bottom */
13
15
  sticky?: 'top' | 'bottom';
16
+ /** Modifier indicating if the PageBreadcrumb is sticky to the top or bottom at various breakpoints */
17
+ stickyOnBreakpoint?: {
18
+ default?: 'top' | 'bottom';
19
+ sm?: 'top' | 'bottom';
20
+ md?: 'top' | 'bottom';
21
+ lg?: 'top' | 'bottom';
22
+ xl?: 'top' | 'bottom';
23
+ '2xl'?: 'top' | 'bottom';
24
+ };
14
25
  /** Flag indicating if PageBreadcrumb should have a shadow at the top */
15
26
  hasShadowTop?: boolean;
16
27
  /** Flag indicating if PageBreadcrumb should have a shadow at the bottom */
@@ -24,27 +35,33 @@ export const PageBreadcrumb = ({
24
35
  children,
25
36
  isWidthLimited,
26
37
  sticky,
38
+ stickyOnBreakpoint,
27
39
  hasShadowTop = false,
28
40
  hasShadowBottom = false,
29
41
  hasOverflowScroll = false,
30
42
  ...props
31
- }: PageBreadcrumbProps) => (
32
- <section
33
- className={css(
34
- styles.pageMainBreadcrumb,
35
- isWidthLimited && styles.modifiers.limitWidth,
36
- sticky === 'top' && styles.modifiers.stickyTop,
37
- sticky === 'bottom' && styles.modifiers.stickyBottom,
38
- hasShadowTop && styles.modifiers.shadowTop,
39
- hasShadowBottom && styles.modifiers.shadowBottom,
40
- hasOverflowScroll && styles.modifiers.overflowScroll,
41
- className
42
- )}
43
- {...(hasOverflowScroll && { tabIndex: 0 })}
44
- {...props}
45
- >
46
- {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
47
- {!isWidthLimited && children}
48
- </section>
49
- );
43
+ }: PageBreadcrumbProps) => {
44
+ const { height, getVerticalBreakpoint } = React.useContext(PageContext);
45
+
46
+ return (
47
+ <section
48
+ className={css(
49
+ styles.pageMainBreadcrumb,
50
+ formatBreakpointMods(stickyOnBreakpoint, styles, 'sticky-', getVerticalBreakpoint(height), true),
51
+ isWidthLimited && styles.modifiers.limitWidth,
52
+ sticky === 'top' && styles.modifiers.stickyTop,
53
+ sticky === 'bottom' && styles.modifiers.stickyBottom,
54
+ hasShadowTop && styles.modifiers.shadowTop,
55
+ hasShadowBottom && styles.modifiers.shadowBottom,
56
+ hasOverflowScroll && styles.modifiers.overflowScroll,
57
+ className
58
+ )}
59
+ {...(hasOverflowScroll && { tabIndex: 0 })}
60
+ {...props}
61
+ >
62
+ {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
63
+ {!isWidthLimited && children}
64
+ </section>
65
+ );
66
+ };
50
67
  PageBreadcrumb.displayName = 'PageBreadcrumb';
@@ -1,14 +1,24 @@
1
1
  import * as React from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Page/page';
4
-
4
+ import { formatBreakpointMods } from '../../helpers/util';
5
+ import { PageContext } from '../Page/Page';
5
6
  export interface PageGroupProps extends React.HTMLProps<HTMLDivElement> {
6
7
  /** Additional classes to apply to the PageGroup */
7
8
  className?: string;
8
9
  /** Content rendered inside of the PageGroup */
9
10
  children?: React.ReactNode;
10
- /** Modifier indicating if PageGroup is sticky to the top or bottom */
11
+ /** @deprecated Use the stickyOnBreakpoint prop instead - Modifier indicating if the PageBreadcrumb is sticky to the top or bottom */
11
12
  sticky?: 'top' | 'bottom';
13
+ /** Modifier indicating if the PageBreadcrumb is sticky to the top or bottom at various breakpoints */
14
+ stickyOnBreakpoint?: {
15
+ default?: 'top' | 'bottom';
16
+ sm?: 'top' | 'bottom';
17
+ md?: 'top' | 'bottom';
18
+ lg?: 'top' | 'bottom';
19
+ xl?: 'top' | 'bottom';
20
+ '2xl'?: 'top' | 'bottom';
21
+ };
12
22
  /** Modifier indicating if PageGroup should have a shadow at the top */
13
23
  hasShadowTop?: boolean;
14
24
  /** Modifier indicating if PageGroup should have a shadow at the bottom */
@@ -21,25 +31,31 @@ export const PageGroup = ({
21
31
  className = '',
22
32
  children,
23
33
  sticky,
34
+ stickyOnBreakpoint,
24
35
  hasShadowTop = false,
25
36
  hasShadowBottom = false,
26
37
  hasOverflowScroll = false,
27
38
  ...props
28
- }: PageGroupProps) => (
29
- <div
30
- {...props}
31
- className={css(
32
- styles.pageMainGroup,
33
- sticky === 'top' && styles.modifiers.stickyTop,
34
- sticky === 'bottom' && styles.modifiers.stickyBottom,
35
- hasShadowTop && styles.modifiers.shadowTop,
36
- hasShadowBottom && styles.modifiers.shadowBottom,
37
- hasOverflowScroll && styles.modifiers.overflowScroll,
38
- className
39
- )}
40
- {...(hasOverflowScroll && { tabIndex: 0 })}
41
- >
42
- {children}
43
- </div>
44
- );
39
+ }: PageGroupProps) => {
40
+ const { height, getVerticalBreakpoint } = React.useContext(PageContext);
41
+
42
+ return (
43
+ <div
44
+ {...props}
45
+ className={css(
46
+ styles.pageMainGroup,
47
+ formatBreakpointMods(stickyOnBreakpoint, styles, 'sticky-', getVerticalBreakpoint(height), true),
48
+ sticky === 'top' && styles.modifiers.stickyTop,
49
+ sticky === 'bottom' && styles.modifiers.stickyBottom,
50
+ hasShadowTop && styles.modifiers.shadowTop,
51
+ hasShadowBottom && styles.modifiers.shadowBottom,
52
+ hasOverflowScroll && styles.modifiers.overflowScroll,
53
+ className
54
+ )}
55
+ {...(hasOverflowScroll && { tabIndex: 0 })}
56
+ >
57
+ {children}
58
+ </div>
59
+ );
60
+ };
45
61
  PageGroup.displayName = 'PageGroup';
@@ -1,6 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Page/page';
4
+ import { formatBreakpointMods } from '../../helpers/util';
5
+ import { PageContext } from '../Page/Page';
4
6
 
5
7
  export interface PageNavigationProps extends React.HTMLProps<HTMLDivElement> {
6
8
  /** Additional classes to apply to the PageNavigation */
@@ -9,8 +11,17 @@ export interface PageNavigationProps extends React.HTMLProps<HTMLDivElement> {
9
11
  children?: React.ReactNode;
10
12
  /** Limits the width of the PageNavigation */
11
13
  isWidthLimited?: boolean;
12
- /** Modifier indicating if the PageNavigation is sticky to the top or bottom */
14
+ /** @deprecated Use the stickyOnBreakpoint prop instead - Modifier indicating if the PageBreadcrumb is sticky to the top or bottom */
13
15
  sticky?: 'top' | 'bottom';
16
+ /** Modifier indicating if the PageBreadcrumb is sticky to the top or bottom at various breakpoints */
17
+ stickyOnBreakpoint?: {
18
+ default?: 'top' | 'bottom';
19
+ sm?: 'top' | 'bottom';
20
+ md?: 'top' | 'bottom';
21
+ lg?: 'top' | 'bottom';
22
+ xl?: 'top' | 'bottom';
23
+ '2xl'?: 'top' | 'bottom';
24
+ };
14
25
  /** Flag indicating if PageNavigation should have a shadow at the top */
15
26
  hasShadowTop?: boolean;
16
27
  /** Flag indicating if PageNavigation should have a shadow at the bottom */
@@ -24,27 +35,33 @@ export const PageNavigation = ({
24
35
  children,
25
36
  isWidthLimited,
26
37
  sticky,
38
+ stickyOnBreakpoint,
27
39
  hasShadowTop = false,
28
40
  hasShadowBottom = false,
29
41
  hasOverflowScroll = false,
30
42
  ...props
31
- }: PageNavigationProps) => (
32
- <div
33
- className={css(
34
- styles.pageMainNav,
35
- isWidthLimited && styles.modifiers.limitWidth,
36
- sticky === 'top' && styles.modifiers.stickyTop,
37
- sticky === 'bottom' && styles.modifiers.stickyBottom,
38
- hasShadowTop && styles.modifiers.shadowTop,
39
- hasShadowBottom && styles.modifiers.shadowBottom,
40
- hasOverflowScroll && styles.modifiers.overflowScroll,
41
- className
42
- )}
43
- {...(hasOverflowScroll && { tabIndex: 0 })}
44
- {...props}
45
- >
46
- {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
47
- {!isWidthLimited && children}
48
- </div>
49
- );
43
+ }: PageNavigationProps) => {
44
+ const { height, getVerticalBreakpoint } = React.useContext(PageContext);
45
+
46
+ return (
47
+ <div
48
+ className={css(
49
+ styles.pageMainNav,
50
+ formatBreakpointMods(stickyOnBreakpoint, styles, 'sticky-', getVerticalBreakpoint(height), true),
51
+ isWidthLimited && styles.modifiers.limitWidth,
52
+ sticky === 'top' && styles.modifiers.stickyTop,
53
+ sticky === 'bottom' && styles.modifiers.stickyBottom,
54
+ hasShadowTop && styles.modifiers.shadowTop,
55
+ hasShadowBottom && styles.modifiers.shadowBottom,
56
+ hasOverflowScroll && styles.modifiers.overflowScroll,
57
+ className
58
+ )}
59
+ {...(hasOverflowScroll && { tabIndex: 0 })}
60
+ {...props}
61
+ >
62
+ {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
63
+ {!isWidthLimited && children}
64
+ </div>
65
+ );
66
+ };
50
67
  PageNavigation.displayName = 'PageNavigation';
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import styles from '@patternfly/react-styles/css/components/Page/page';
3
3
  import { css } from '@patternfly/react-styles';
4
4
  import { formatBreakpointMods } from '../../helpers/util';
5
+ import { PageContext } from '../Page/Page';
5
6
 
6
7
  export enum PageSectionVariants {
7
8
  default = 'default',
@@ -43,8 +44,17 @@ export interface PageSectionProps extends React.HTMLProps<HTMLDivElement> {
43
44
  xl?: 'padding' | 'noPadding';
44
45
  '2xl'?: 'padding' | 'noPadding';
45
46
  };
46
- /** Modifier indicating if PageSection is sticky to the top or bottom */
47
+ /** @deprecated Use the stickyOnBreakpoint prop instead - Modifier indicating if the PageBreadcrumb is sticky to the top or bottom */
47
48
  sticky?: 'top' | 'bottom';
49
+ /** Modifier indicating if the PageBreadcrumb is sticky to the top or bottom at various breakpoints */
50
+ stickyOnBreakpoint?: {
51
+ default?: 'top' | 'bottom';
52
+ sm?: 'top' | 'bottom';
53
+ md?: 'top' | 'bottom';
54
+ lg?: 'top' | 'bottom';
55
+ xl?: 'top' | 'bottom';
56
+ '2xl'?: 'top' | 'bottom';
57
+ };
48
58
  /** Modifier indicating if PageSection should have a shadow at the top */
49
59
  hasShadowTop?: boolean;
50
60
  /** Modifier indicating if PageSection should have a shadow at the bottom */
@@ -79,32 +89,38 @@ export const PageSection: React.FunctionComponent<PageSectionProps> = ({
79
89
  isWidthLimited = false,
80
90
  isCenterAligned = false,
81
91
  sticky,
92
+ stickyOnBreakpoint,
82
93
  hasShadowTop = false,
83
94
  hasShadowBottom = false,
84
95
  hasOverflowScroll = false,
85
96
  ...props
86
- }: PageSectionProps) => (
87
- <section
88
- {...props}
89
- className={css(
90
- variantType[type],
91
- formatBreakpointMods(padding, styles),
92
- variantStyle[variant],
93
- isFilled === false && styles.modifiers.noFill,
94
- isFilled === true && styles.modifiers.fill,
95
- isWidthLimited && styles.modifiers.limitWidth,
96
- isWidthLimited && isCenterAligned && type !== PageSectionTypes.subNav && styles.modifiers.alignCenter,
97
- sticky === 'top' && styles.modifiers.stickyTop,
98
- sticky === 'bottom' && styles.modifiers.stickyBottom,
99
- hasShadowTop && styles.modifiers.shadowTop,
100
- hasShadowBottom && styles.modifiers.shadowBottom,
101
- hasOverflowScroll && styles.modifiers.overflowScroll,
102
- className
103
- )}
104
- {...(hasOverflowScroll && { tabIndex: 0 })}
105
- >
106
- {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
107
- {!isWidthLimited && children}
108
- </section>
109
- );
97
+ }: PageSectionProps) => {
98
+ const { height, getVerticalBreakpoint } = React.useContext(PageContext);
99
+
100
+ return (
101
+ <section
102
+ {...props}
103
+ className={css(
104
+ variantType[type],
105
+ formatBreakpointMods(padding, styles),
106
+ formatBreakpointMods(stickyOnBreakpoint, styles, 'sticky-', getVerticalBreakpoint(height), true),
107
+ variantStyle[variant],
108
+ isFilled === false && styles.modifiers.noFill,
109
+ isFilled === true && styles.modifiers.fill,
110
+ isWidthLimited && styles.modifiers.limitWidth,
111
+ isWidthLimited && isCenterAligned && type !== PageSectionTypes.subNav && styles.modifiers.alignCenter,
112
+ sticky === 'top' && styles.modifiers.stickyTop,
113
+ sticky === 'bottom' && styles.modifiers.stickyBottom,
114
+ hasShadowTop && styles.modifiers.shadowTop,
115
+ hasShadowBottom && styles.modifiers.shadowBottom,
116
+ hasOverflowScroll && styles.modifiers.overflowScroll,
117
+ className
118
+ )}
119
+ {...(hasOverflowScroll && { tabIndex: 0 })}
120
+ >
121
+ {isWidthLimited && <div className={css(styles.pageMainBody)}>{children}</div>}
122
+ {!isWidthLimited && children}
123
+ </section>
124
+ );
125
+ };
110
126
  PageSection.displayName = 'PageSection';