@patternfly/react-core 6.0.0-alpha.77 → 6.0.0-alpha.78

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 (153) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/Tile/package.json +1 -1
  74. package/dist/dynamic/components/TimePicker/package.json +1 -1
  75. package/dist/dynamic/components/Timestamp/package.json +1 -1
  76. package/dist/dynamic/components/Title/package.json +1 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  78. package/dist/dynamic/components/Toolbar/package.json +1 -1
  79. package/dist/dynamic/components/Tooltip/package.json +1 -1
  80. package/dist/dynamic/components/TreeView/package.json +1 -1
  81. package/dist/dynamic/components/Truncate/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  95. package/dist/dynamic/helpers/constants/package.json +1 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  99. package/dist/dynamic/helpers/package.json +1 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  105. package/dist/dynamic/helpers/util/package.json +1 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  107. package/dist/dynamic/layouts/Flex/package.json +1 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  109. package/dist/dynamic/layouts/Grid/package.json +1 -1
  110. package/dist/dynamic/layouts/Level/package.json +1 -1
  111. package/dist/dynamic/layouts/Split/package.json +1 -1
  112. package/dist/dynamic/layouts/Stack/package.json +1 -1
  113. package/dist/dynamic/styles/package.json +1 -1
  114. package/dist/esm/components/JumpLinks/JumpLinks.d.ts.map +1 -1
  115. package/dist/esm/components/JumpLinks/JumpLinks.js +2 -7
  116. package/dist/esm/components/JumpLinks/JumpLinks.js.map +1 -1
  117. package/dist/esm/components/Page/PageSidebarBody.d.ts +2 -0
  118. package/dist/esm/components/Page/PageSidebarBody.d.ts.map +1 -1
  119. package/dist/esm/components/Page/PageSidebarBody.js +2 -2
  120. package/dist/esm/components/Page/PageSidebarBody.js.map +1 -1
  121. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  122. package/dist/esm/components/Tabs/Tabs.js +2 -4
  123. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  124. package/dist/js/components/JumpLinks/JumpLinks.d.ts.map +1 -1
  125. package/dist/js/components/JumpLinks/JumpLinks.js +2 -7
  126. package/dist/js/components/JumpLinks/JumpLinks.js.map +1 -1
  127. package/dist/js/components/Page/PageSidebarBody.d.ts +2 -0
  128. package/dist/js/components/Page/PageSidebarBody.d.ts.map +1 -1
  129. package/dist/js/components/Page/PageSidebarBody.js +2 -2
  130. package/dist/js/components/Page/PageSidebarBody.js.map +1 -1
  131. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  132. package/dist/js/components/Tabs/Tabs.js +2 -4
  133. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  134. package/dist/styles/assets/images/img_avatar-dark.svg +22 -16
  135. package/dist/styles/assets/images/img_avatar-light.svg +25 -18
  136. package/dist/styles/assets/pficon/pf-v6-pficon.woff2 +0 -0
  137. package/dist/styles/assets/pficon/pficon.scss +36 -0
  138. package/dist/styles/base-no-reset.css +936 -905
  139. package/dist/styles/base.css +936 -905
  140. package/dist/umd/assets/{output-BHzG532B.css → output-Dt8Et40Q.css} +1545 -2331
  141. package/dist/umd/react-core.min.js +3 -3
  142. package/helpers/package.json +1 -1
  143. package/layouts/package.json +1 -1
  144. package/next/package.json +1 -1
  145. package/package.json +6 -6
  146. package/src/components/JumpLinks/JumpLinks.tsx +6 -4
  147. package/src/components/JumpLinks/__tests__/__snapshots__/JumpLinks.test.tsx.snap +6 -6
  148. package/src/components/Page/PageSidebarBody.tsx +4 -0
  149. package/src/components/Page/examples/PageMultipleSidebarBody.tsx +6 -3
  150. package/src/components/Tabs/Tabs.tsx +6 -8
  151. package/src/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +5 -3
  152. package/src/demos/Page.md +6 -0
  153. package/src/demos/examples/Page/PageContextSelector.tsx +319 -0
@@ -3,6 +3,6 @@
3
3
  "main": "../dist/js/helpers/index.js",
4
4
  "module": "../dist/esm/helpers/index.js",
5
5
  "typings": "../dist/esm/helpers/index.d.ts",
6
- "version": "6.0.0-alpha.76",
6
+ "version": "6.0.0-alpha.77",
7
7
  "private": true
8
8
  }
@@ -3,6 +3,6 @@
3
3
  "main": "../dist/js/layouts/index.js",
4
4
  "module": "../dist/esm/layouts/index.js",
5
5
  "typings": "../dist/esm/layouts/index.d.ts",
6
- "version": "6.0.0-alpha.76",
6
+ "version": "6.0.0-alpha.77",
7
7
  "private": true
8
8
  }
package/next/package.json CHANGED
@@ -3,6 +3,6 @@
3
3
  "main": "../dist/js/next/index.js",
4
4
  "module": "../dist/esm/next/index.js",
5
5
  "typings": "../dist/esm/next/index.d.ts",
6
- "version": "6.0.0-alpha.76",
6
+ "version": "6.0.0-alpha.77",
7
7
  "private": true
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-alpha.77",
3
+ "version": "6.0.0-alpha.78",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -47,15 +47,15 @@
47
47
  "clean:exports": "node scripts/cleanDistExports.js"
48
48
  },
49
49
  "dependencies": {
50
- "@patternfly/react-icons": "^6.0.0-alpha.28",
51
- "@patternfly/react-styles": "^6.0.0-alpha.27",
52
- "@patternfly/react-tokens": "^6.0.0-alpha.27",
50
+ "@patternfly/react-icons": "^6.0.0-alpha.29",
51
+ "@patternfly/react-styles": "^6.0.0-alpha.28",
52
+ "@patternfly/react-tokens": "^6.0.0-alpha.28",
53
53
  "focus-trap": "7.5.4",
54
54
  "react-dropzone": "^14.2.3",
55
55
  "tslib": "^2.6.2"
56
56
  },
57
57
  "devDependencies": {
58
- "@patternfly/patternfly": "6.0.0-alpha.166",
58
+ "@patternfly/patternfly": "6.0.0-alpha.180",
59
59
  "case-anything": "^2.1.13",
60
60
  "css": "^3.0.0",
61
61
  "fs-extra": "^11.2.0"
@@ -64,5 +64,5 @@
64
64
  "react": "^17 || ^18",
65
65
  "react-dom": "^17 || ^18"
66
66
  },
67
- "gitHead": "6aa99644b0c6023e74c89dfc428522e09e0420ee"
67
+ "gitHead": "4eb47e70a3ba0ce15d70b03b8cf9602f7a7215f3"
68
68
  }
@@ -249,11 +249,13 @@ export const JumpLinks: React.FunctionComponent<JumpLinksProps> = ({
249
249
  onClick={() => setIsExpanded(!isExpanded)}
250
250
  aria-label={toggleAriaLabel}
251
251
  aria-expanded={isExpanded}
252
+ icon={
253
+ <span className={styles.jumpLinksToggleIcon}>
254
+ <AngleRightIcon />
255
+ </span>
256
+ }
252
257
  >
253
- <span className={styles.jumpLinksToggleIcon}>
254
- <AngleRightIcon />
255
- </span>
256
- {label && <span className={css(styles.jumpLinksToggleText)}> {label} </span>}
258
+ {label && label}
257
259
  </Button>
258
260
  </div>
259
261
  )}
@@ -26,7 +26,7 @@ exports[`expandable vertical with subsection 1`] = `
26
26
  type="button"
27
27
  >
28
28
  <span
29
- class="pf-v6-c-button__text"
29
+ class="pf-v6-c-button__icon pf-m-start"
30
30
  >
31
31
  <span
32
32
  class="pf-v6-c-jump-links__toggle-icon"
@@ -45,11 +45,11 @@ exports[`expandable vertical with subsection 1`] = `
45
45
  />
46
46
  </svg>
47
47
  </span>
48
- <span
49
- class="pf-v6-c-jump-links__toggle-text"
50
- >
51
- Jump to section
52
- </span>
48
+ </span>
49
+ <span
50
+ class="pf-v6-c-button__text"
51
+ >
52
+ Jump to section
53
53
  </span>
54
54
  </button>
55
55
  </div>
@@ -11,6 +11,8 @@ export interface PageSidebarBodyProps extends React.HTMLProps<HTMLDivElement> {
11
11
  usePageInsets?: boolean;
12
12
  /** Flag indicating that the page sidebar body should fill the available vertical space. */
13
13
  isFilled?: boolean;
14
+ /** Flag indicating that the page sidebar body is for a context selector/perspective switcher */
15
+ isContextSelector?: boolean;
14
16
  }
15
17
 
16
18
  export const PageSidebarBody: React.FunctionComponent<PageSidebarBodyProps> = ({
@@ -18,6 +20,7 @@ export const PageSidebarBody: React.FunctionComponent<PageSidebarBodyProps> = ({
18
20
  className,
19
21
  usePageInsets,
20
22
  isFilled,
23
+ isContextSelector,
21
24
  ...props
22
25
  }: PageSidebarBodyProps) => (
23
26
  <div
@@ -26,6 +29,7 @@ export const PageSidebarBody: React.FunctionComponent<PageSidebarBodyProps> = ({
26
29
  usePageInsets && styles.modifiers.pageInsets,
27
30
  isFilled === false && styles.modifiers.noFill,
28
31
  isFilled === true && styles.modifiers.fill,
32
+ isContextSelector === true && styles.modifiers.contextSelector,
29
33
  className
30
34
  )}
31
35
  {...props}
@@ -55,10 +55,13 @@ export const PageMultipleSidebarBody: React.FunctionComponent = () => {
55
55
 
56
56
  const sidebar = (
57
57
  <PageSidebar isSidebarOpen={isSidebarOpen} id="multiple-sidebar-body-sidebar">
58
- <PageSidebarBody usePageInsets>First sidebar body (with insets)</PageSidebarBody>
59
- <PageSidebarBody isFilled={true}>Second sidebar body (with fill)</PageSidebarBody>
58
+ <PageSidebarBody isContextSelector>
59
+ First sidebar body (for a context selector/perspective switcher)
60
+ </PageSidebarBody>
61
+ <PageSidebarBody usePageInsets>Second sidebar body (with insets)</PageSidebarBody>
62
+ <PageSidebarBody isFilled={true}>Third sidebar body (with fill)</PageSidebarBody>
60
63
  <PageSidebarBody isFilled={false} usePageInsets>
61
- Third sidebar body (with insets and no fill)
64
+ Fourth sidebar body (with insets and no fill)
62
65
  </PageSidebarBody>
63
66
  </PageSidebar>
64
67
  );
@@ -521,15 +521,13 @@ class Tabs extends React.Component<TabsProps, TabsState> {
521
521
  aria-expanded={isExpandedLocal}
522
522
  id={`${randomId}-button`}
523
523
  aria-labelledby={`${randomId}-text ${randomId}-button`}
524
- >
525
- <span className={css(styles.tabsToggleIcon)}>
526
- <AngleRightIcon arian-hidden="true" />
527
- </span>
528
- {toggleText && (
529
- <span className={css(styles.tabsToggleText)} id={`${randomId}-text`}>
530
- {toggleText}
524
+ icon={
525
+ <span className={css(styles.tabsToggleIcon)}>
526
+ <AngleRightIcon />
531
527
  </span>
532
- )}
528
+ }
529
+ >
530
+ {toggleText && <span id={`${randomId}-text`}>{toggleText}</span>}
533
531
  </Button>
534
532
  </div>
535
533
  </div>
@@ -417,14 +417,13 @@ exports[`should render expandable vertical tabs 1`] = `
417
417
  type="button"
418
418
  >
419
419
  <span
420
- class="pf-v6-c-button__text"
420
+ class="pf-v6-c-button__icon pf-m-start"
421
421
  >
422
422
  <span
423
423
  class="pf-v6-c-tabs__toggle-icon"
424
424
  >
425
425
  <svg
426
426
  aria-hidden="true"
427
- arian-hidden="true"
428
427
  class="pf-v6-svg"
429
428
  fill="currentColor"
430
429
  height="1em"
@@ -437,8 +436,11 @@ exports[`should render expandable vertical tabs 1`] = `
437
436
  />
438
437
  </svg>
439
438
  </span>
439
+ </span>
440
+ <span
441
+ class="pf-v6-c-button__text"
442
+ >
440
443
  <span
441
- class="pf-v6-c-tabs__toggle-text"
442
444
  id="generated-id-text"
443
445
  >
444
446
  toggle
package/src/demos/Page.md CHANGED
@@ -41,3 +41,9 @@ This demonstrates a variety of navigation patterns in the context of a full page
41
41
  ```ts file='./examples/Page/PageStickySectionBreadcrumb.tsx' isFullscreen
42
42
 
43
43
  ```
44
+
45
+ ### Context selector/perspective switcher in sidebar
46
+
47
+ ```ts file='./examples/Page/PageContextSelector.tsx' isFullscreen
48
+
49
+ ```
@@ -0,0 +1,319 @@
1
+ import React from 'react';
2
+ import {
3
+ Avatar,
4
+ Brand,
5
+ Breadcrumb,
6
+ BreadcrumbItem,
7
+ Button,
8
+ ButtonVariant,
9
+ Card,
10
+ CardBody,
11
+ Divider,
12
+ Dropdown,
13
+ DropdownGroup,
14
+ DropdownItem,
15
+ DropdownList,
16
+ Gallery,
17
+ GalleryItem,
18
+ Masthead,
19
+ MastheadBrand,
20
+ MastheadContent,
21
+ MastheadMain,
22
+ MastheadToggle,
23
+ MenuToggle,
24
+ MenuToggleElement,
25
+ Nav,
26
+ NavItem,
27
+ NavList,
28
+ Page,
29
+ PageSection,
30
+ PageSidebar,
31
+ PageSidebarBody,
32
+ PageToggleButton,
33
+ SkipToContent,
34
+ Text,
35
+ TextContent,
36
+ Toolbar,
37
+ ToolbarContent,
38
+ ToolbarGroup,
39
+ ToolbarItem
40
+ } from '@patternfly/react-core';
41
+ import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
42
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
43
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
44
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
45
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
46
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
47
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
48
+ import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
49
+ interface NavOnSelectProps {
50
+ groupId: number | string;
51
+ itemId: number | string;
52
+ to: string;
53
+ }
54
+
55
+ export const PageStickySectionBreadcrumb: React.FunctionComponent = () => {
56
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
57
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
58
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
59
+ const [isContextSelectorOpen, setIsContextSelectorOpen] = React.useState(false);
60
+ const [activeItem, setActiveItem] = React.useState(1);
61
+
62
+ const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {
63
+ typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
64
+ };
65
+
66
+ const onDropdownToggle = () => {
67
+ setIsDropdownOpen(!isDropdownOpen);
68
+ };
69
+
70
+ const onDropdownSelect = () => {
71
+ setIsDropdownOpen(false);
72
+ };
73
+
74
+ const onKebabDropdownToggle = () => {
75
+ setIsKebabDropdownOpen(!isKebabDropdownOpen);
76
+ };
77
+
78
+ const onKebabDropdownSelect = () => {
79
+ setIsKebabDropdownOpen(false);
80
+ };
81
+
82
+ const onFullKebabDropdownToggle = () => {
83
+ setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);
84
+ };
85
+
86
+ const onFullKebabDropdownSelect = () => {
87
+ setIsFullKebabDropdownOpen(false);
88
+ };
89
+
90
+ const onContextSelectorToggle = () => {
91
+ setIsContextSelectorOpen(!isContextSelectorOpen);
92
+ };
93
+
94
+ const onContextSelectorSelect = () => {
95
+ setIsContextSelectorOpen(false);
96
+ };
97
+
98
+ const dashboardBreadcrumb = (
99
+ <Breadcrumb>
100
+ <BreadcrumbItem>Section home</BreadcrumbItem>
101
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
102
+ <BreadcrumbItem to="#">Section title</BreadcrumbItem>
103
+ <BreadcrumbItem to="#" isActive>
104
+ Section landing
105
+ </BreadcrumbItem>
106
+ </Breadcrumb>
107
+ );
108
+
109
+ const kebabDropdownItems = (
110
+ <>
111
+ <DropdownItem>
112
+ <CogIcon /> Settings
113
+ </DropdownItem>
114
+ <DropdownItem>
115
+ <HelpIcon /> Help
116
+ </DropdownItem>
117
+ </>
118
+ );
119
+
120
+ const contextSelectorDropdownItems = (
121
+ <>
122
+ <DropdownItem>Developer</DropdownItem>
123
+ <DropdownItem>Admin</DropdownItem>
124
+ </>
125
+ );
126
+
127
+ const userDropdownItems = (
128
+ <>
129
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
130
+ <DropdownItem key="group 2 user">User management</DropdownItem>
131
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
132
+ </>
133
+ );
134
+
135
+ const headerToolbar = (
136
+ <Toolbar id="toolbar" isFullHeight isStatic>
137
+ <ToolbarContent>
138
+ <ToolbarGroup
139
+ variant="icon-button-group"
140
+ align={{ default: 'alignEnd' }}
141
+ gap={{ default: 'gapNone', md: 'gapMd' }}
142
+ >
143
+ <ToolbarItem>
144
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} />
145
+ </ToolbarItem>
146
+ <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
147
+ <ToolbarItem>
148
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
149
+ </ToolbarItem>
150
+ <ToolbarItem>
151
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
152
+ </ToolbarItem>
153
+ </ToolbarGroup>
154
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
155
+ <Dropdown
156
+ isOpen={isKebabDropdownOpen}
157
+ onSelect={onKebabDropdownSelect}
158
+ onOpenChange={(isOpen: boolean) => setIsKebabDropdownOpen(isOpen)}
159
+ popperProps={{ position: 'right' }}
160
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
161
+ <MenuToggle
162
+ ref={toggleRef}
163
+ onClick={onKebabDropdownToggle}
164
+ isExpanded={isKebabDropdownOpen}
165
+ variant="plain"
166
+ aria-label="Settings and help"
167
+ >
168
+ <EllipsisVIcon aria-hidden="true" />
169
+ </MenuToggle>
170
+ )}
171
+ >
172
+ <DropdownList>{kebabDropdownItems}</DropdownList>
173
+ </Dropdown>
174
+ </ToolbarItem>
175
+ <ToolbarItem visibility={{ md: 'hidden' }}>
176
+ <Dropdown
177
+ isOpen={isFullKebabDropdownOpen}
178
+ onSelect={onFullKebabDropdownSelect}
179
+ onOpenChange={(isOpen: boolean) => setIsFullKebabDropdownOpen(isOpen)}
180
+ popperProps={{ position: 'right' }}
181
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
182
+ <MenuToggle
183
+ ref={toggleRef}
184
+ onClick={onFullKebabDropdownToggle}
185
+ isExpanded={isFullKebabDropdownOpen}
186
+ variant="plain"
187
+ aria-label="Toolbar menu"
188
+ >
189
+ <EllipsisVIcon aria-hidden="true" />
190
+ </MenuToggle>
191
+ )}
192
+ >
193
+ <DropdownGroup key="group 2" aria-label="User actions">
194
+ <DropdownList>{userDropdownItems}</DropdownList>
195
+ </DropdownGroup>
196
+ <Divider />
197
+ <DropdownList>{kebabDropdownItems}</DropdownList>
198
+ </Dropdown>
199
+ </ToolbarItem>
200
+ </ToolbarGroup>
201
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
202
+ <Dropdown
203
+ isOpen={isDropdownOpen}
204
+ onSelect={onDropdownSelect}
205
+ onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}
206
+ popperProps={{ position: 'right' }}
207
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
208
+ <MenuToggle
209
+ ref={toggleRef}
210
+ onClick={onDropdownToggle}
211
+ isFullHeight
212
+ isExpanded={isDropdownOpen}
213
+ icon={<Avatar src={imgAvatar} alt="" />}
214
+ >
215
+ Ned Username
216
+ </MenuToggle>
217
+ )}
218
+ >
219
+ <DropdownList>{userDropdownItems}</DropdownList>
220
+ </Dropdown>
221
+ </ToolbarItem>
222
+ </ToolbarContent>
223
+ </Toolbar>
224
+ );
225
+
226
+ const masthead = (
227
+ <Masthead>
228
+ <MastheadToggle>
229
+ <PageToggleButton variant="plain" aria-label="Global navigation">
230
+ <BarsIcon />
231
+ </PageToggleButton>
232
+ </MastheadToggle>
233
+ <MastheadMain>
234
+ <MastheadBrand>
235
+ <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
236
+ </MastheadBrand>
237
+ </MastheadMain>
238
+ <MastheadContent>{headerToolbar}</MastheadContent>
239
+ </Masthead>
240
+ );
241
+
242
+ const pageNav = (
243
+ <Nav onSelect={onNavSelect}>
244
+ <NavList>
245
+ <NavItem itemId={0} isActive={activeItem === 0} to="#system-panel">
246
+ System panel
247
+ </NavItem>
248
+ <NavItem itemId={1} isActive={activeItem === 1} to="#policy">
249
+ Policy
250
+ </NavItem>
251
+ <NavItem itemId={2} isActive={activeItem === 2} to="#auth">
252
+ Authentication
253
+ </NavItem>
254
+ <NavItem itemId={3} isActive={activeItem === 3} to="#network">
255
+ Network services
256
+ </NavItem>
257
+ <NavItem itemId={4} isActive={activeItem === 4} to="#server">
258
+ Server
259
+ </NavItem>
260
+ </NavList>
261
+ </Nav>
262
+ );
263
+
264
+ const pageContextSelector = (
265
+ <Dropdown
266
+ isOpen={isContextSelectorOpen}
267
+ onSelect={onContextSelectorSelect}
268
+ onOpenChange={(isOpen: boolean) => setIsContextSelectorOpen(isOpen)}
269
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
270
+ <MenuToggle ref={toggleRef} onClick={onContextSelectorToggle} isExpanded={isContextSelectorOpen} isFullWidth>
271
+ Developer
272
+ </MenuToggle>
273
+ )}
274
+ >
275
+ <DropdownList>{contextSelectorDropdownItems}</DropdownList>
276
+ </Dropdown>
277
+ );
278
+
279
+ const sidebar = (
280
+ <PageSidebar>
281
+ <PageSidebarBody isContextSelector>{pageContextSelector}</PageSidebarBody>
282
+ <PageSidebarBody>{pageNav}</PageSidebarBody>
283
+ </PageSidebar>
284
+ );
285
+
286
+ const mainContainerId = 'main-content';
287
+
288
+ const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
289
+
290
+ return (
291
+ <Page
292
+ masthead={masthead}
293
+ sidebar={sidebar}
294
+ isManagedSidebar
295
+ skipToContent={pageSkipToContent}
296
+ breadcrumb={dashboardBreadcrumb}
297
+ mainContainerId={mainContainerId}
298
+ isBreadcrumbWidthLimited
299
+ >
300
+ <PageSection isWidthLimited>
301
+ <TextContent>
302
+ <Text component="h1">Main title</Text>
303
+ <Text component="p">This is a full page demo.</Text>
304
+ </TextContent>
305
+ </PageSection>
306
+ <PageSection isWidthLimited>
307
+ <Gallery hasGutter>
308
+ {Array.from({ length: 50 }).map((_value, index) => (
309
+ <GalleryItem key={index}>
310
+ <Card>
311
+ <CardBody>This is a card</CardBody>
312
+ </Card>
313
+ </GalleryItem>
314
+ ))}
315
+ </Gallery>
316
+ </PageSection>
317
+ </Page>
318
+ );
319
+ };