@patternfly/react-core 5.2.0-prerelease.12 → 5.2.0-prerelease.13

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 (144) 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/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/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/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/package.json +1 -1
  119. package/dist/esm/components/InputGroup/InputGroup.d.ts.map +1 -1
  120. package/dist/esm/components/InputGroup/InputGroup.js +1 -51
  121. package/dist/esm/components/InputGroup/InputGroup.js.map +1 -1
  122. package/dist/js/components/InputGroup/InputGroup.d.ts.map +1 -1
  123. package/dist/js/components/InputGroup/InputGroup.js +1 -51
  124. package/dist/js/components/InputGroup/InputGroup.js.map +1 -1
  125. package/dist/umd/react-core.min.js +1 -1
  126. package/helpers/package.json +1 -1
  127. package/layouts/package.json +1 -1
  128. package/next/package.json +1 -1
  129. package/package.json +2 -2
  130. package/src/components/InputGroup/InputGroup.tsx +1 -53
  131. package/src/components/InputGroup/__tests__/InputGroup.test.tsx +7 -44
  132. package/src/components/NumberInput/__tests__/NumberInput.test.tsx +0 -1
  133. package/src/demos/Nav.md +10 -1673
  134. package/src/demos/examples/Nav/NavDefault.tsx +98 -0
  135. package/src/demos/examples/Nav/NavDrilldown.tsx +2 -0
  136. package/src/demos/examples/Nav/NavExpandable.tsx +124 -0
  137. package/src/demos/examples/Nav/NavFlyout.tsx +278 -0
  138. package/src/demos/examples/Nav/NavGrouped.tsx +99 -0
  139. package/src/demos/examples/Nav/NavHorizontal.tsx +237 -0
  140. package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +297 -0
  141. package/src/demos/examples/Nav/NavManual.tsx +273 -0
  142. package/src/demos/examples/Nav/NavWithSubnav.tsx +142 -0
  143. package/src/demos/examples/Nav/deprecated/NavLight.tsx +96 -0
  144. package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +92 -0
@@ -0,0 +1,98 @@
1
+ import React from 'react';
2
+ import {
3
+ Card,
4
+ CardBody,
5
+ Gallery,
6
+ GalleryItem,
7
+ Nav,
8
+ NavItem,
9
+ NavList,
10
+ Page,
11
+ PageSection,
12
+ PageSectionVariants,
13
+ PageSidebar,
14
+ PageSidebarBody,
15
+ SkipToContent,
16
+ TextContent,
17
+ Text
18
+ } from '@patternfly/react-core';
19
+ import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
20
+ import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
21
+
22
+ export const NavDefault: React.FunctionComponent = () => {
23
+ const [activeItem, setActiveItem] = React.useState<number | string>(0);
24
+
25
+ const onNavSelect = (
26
+ _event: React.FormEvent<HTMLInputElement>,
27
+ selectedItem: {
28
+ groupId: number | string;
29
+ itemId: number | string;
30
+ to: string;
31
+ }
32
+ ) => setActiveItem(selectedItem.itemId);
33
+
34
+ const PageNav = (
35
+ <Nav onSelect={onNavSelect} aria-label="Nav">
36
+ <NavList>
37
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
38
+ <NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
39
+ System Panel
40
+ </NavItem>
41
+ <NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
42
+ Policy
43
+ </NavItem>
44
+ <NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
45
+ Authentication
46
+ </NavItem>
47
+ <NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
48
+ Network Services
49
+ </NavItem>
50
+ <NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
51
+ Server
52
+ </NavItem>
53
+ </NavList>
54
+ </Nav>
55
+ );
56
+
57
+ const Sidebar = (
58
+ <PageSidebar>
59
+ <PageSidebarBody>{PageNav}</PageSidebarBody>
60
+ </PageSidebar>
61
+ );
62
+ const pageId = 'main-content-page-layout-default-nav';
63
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
64
+
65
+ return (
66
+ <>
67
+ <Page
68
+ header={<DashboardHeader />}
69
+ sidebar={Sidebar}
70
+ isManagedSidebar
71
+ skipToContent={PageSkipToContent}
72
+ breadcrumb={DashboardBreadcrumb}
73
+ mainContainerId={pageId}
74
+ >
75
+ <PageSection variant={PageSectionVariants.light}>
76
+ <TextContent>
77
+ <Text component="h1">Main title</Text>
78
+ <Text component="p">
79
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
80
+ of its relative line height of 1.5.
81
+ </Text>
82
+ </TextContent>
83
+ </PageSection>
84
+ <PageSection>
85
+ <Gallery hasGutter>
86
+ {Array.from({ length: 10 }, (_value: any, index: React.Key) => (
87
+ <GalleryItem key={index}>
88
+ <Card>
89
+ <CardBody>This is a card</CardBody>
90
+ </Card>
91
+ </GalleryItem>
92
+ ))}
93
+ </Gallery>
94
+ </PageSection>
95
+ </Page>
96
+ </>
97
+ );
98
+ };
@@ -13,6 +13,7 @@ import {
13
13
  PageSection
14
14
  } from '@patternfly/react-core';
15
15
  import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
16
+
16
17
  interface MenuHeights {
17
18
  [menuId: string]: number;
18
19
  }
@@ -26,6 +27,7 @@ function getNavLayer(menuId: string): number {
26
27
  case 'subMenu-2':
27
28
  return 3;
28
29
  }
30
+ return 1;
29
31
  }
30
32
 
31
33
  const subMenuTwo: JSX.Element = (
@@ -0,0 +1,124 @@
1
+ import React from 'react';
2
+ import {
3
+ Card,
4
+ CardBody,
5
+ Gallery,
6
+ GalleryItem,
7
+ Nav,
8
+ NavExpandable,
9
+ NavItem,
10
+ NavList,
11
+ Page,
12
+ PageSection,
13
+ PageSectionVariants,
14
+ PageSidebar,
15
+ PageSidebarBody,
16
+ SkipToContent,
17
+ TextContent,
18
+ Text
19
+ } from '@patternfly/react-core';
20
+ import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
21
+ import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
22
+
23
+ export const NavExpandableDemo: React.FunctionComponent = () => {
24
+ const [activeGroup, setActiveGroup] = React.useState<string | number>('grp-1');
25
+ const [activeItem, setActiveItem] = React.useState<string | number>('grp-1_itm-1');
26
+
27
+ const onNavSelect = (
28
+ _event: React.FormEvent<HTMLInputElement>,
29
+ selectedItem: {
30
+ groupId: number | string;
31
+ itemId: number | string;
32
+ to: string;
33
+ }
34
+ ) => {
35
+ setActiveItem(selectedItem.itemId);
36
+ setActiveGroup(selectedItem.groupId);
37
+ };
38
+
39
+ const PageNav = (
40
+ <Nav onSelect={onNavSelect} aria-label="Nav">
41
+ <NavList>
42
+ <NavExpandable title="System Panel" groupId="grp-1" isActive={activeGroup === 'grp-1'} isExpanded>
43
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
44
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'} to="#">
45
+ Overview
46
+ </NavItem>
47
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'} to="#">
48
+ Resource usage
49
+ </NavItem>
50
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'} to="#">
51
+ Hypervisors
52
+ </NavItem>
53
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'} to="#">
54
+ Instances
55
+ </NavItem>
56
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'} to="#">
57
+ Volumes
58
+ </NavItem>
59
+ <NavItem preventDefault groupId="grp-1" itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'} to="#">
60
+ Network
61
+ </NavItem>
62
+ </NavExpandable>
63
+ <NavExpandable title="Policy" groupId="grp-2" isActive={activeGroup === 'grp-2'}>
64
+ <NavItem preventDefault groupId="grp-2" itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'} to="#">
65
+ Subnav link 1
66
+ </NavItem>
67
+ <NavItem preventDefault groupId="grp-2" itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'} to="#">
68
+ Subnav link 2
69
+ </NavItem>
70
+ </NavExpandable>
71
+ <NavExpandable title="Authentication" groupId="grp-3" isActive={activeGroup === 'grp-3'}>
72
+ <NavItem preventDefault groupId="grp-3" itemId="grp-3_itm-1" isActive={activeItem === 'grp-3_itm-1'} to="#">
73
+ Subnav link 1
74
+ </NavItem>
75
+ <NavItem preventDefault groupId="grp-3" itemId="grp-3_itm-2" isActive={activeItem === 'grp-3_itm-2'} to="#">
76
+ Subnav link 2
77
+ </NavItem>
78
+ </NavExpandable>
79
+ </NavList>
80
+ </Nav>
81
+ );
82
+
83
+ const Sidebar = (
84
+ <PageSidebar>
85
+ <PageSidebarBody>{PageNav}</PageSidebarBody>
86
+ </PageSidebar>
87
+ );
88
+ const pageId = 'main-content-page-layout-expandable-nav';
89
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
90
+
91
+ return (
92
+ <React.Fragment>
93
+ <Page
94
+ header={<DashboardHeader />}
95
+ sidebar={Sidebar}
96
+ isManagedSidebar
97
+ skipToContent={PageSkipToContent}
98
+ breadcrumb={DashboardBreadcrumb}
99
+ mainContainerId={pageId}
100
+ >
101
+ <PageSection variant={PageSectionVariants.light}>
102
+ <TextContent>
103
+ <Text component="h1">Main title</Text>
104
+ <Text component="p">
105
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
106
+ of its relative line height of 1.5.
107
+ </Text>
108
+ </TextContent>
109
+ </PageSection>
110
+ <PageSection>
111
+ <Gallery hasGutter>
112
+ {Array.from({ length: 10 }, (_value: any, index: React.Key) => (
113
+ <GalleryItem key={index}>
114
+ <Card>
115
+ <CardBody>This is a card</CardBody>
116
+ </Card>
117
+ </GalleryItem>
118
+ ))}
119
+ </Gallery>
120
+ </PageSection>
121
+ </Page>
122
+ </React.Fragment>
123
+ );
124
+ };
@@ -0,0 +1,278 @@
1
+ import React from 'react';
2
+ import {
3
+ Avatar,
4
+ Brand,
5
+ Button,
6
+ ButtonVariant,
7
+ Divider,
8
+ Dropdown,
9
+ DropdownGroup,
10
+ DropdownItem,
11
+ DropdownList,
12
+ Masthead,
13
+ MastheadBrand,
14
+ MastheadContent,
15
+ MastheadMain,
16
+ MastheadToggle,
17
+ Menu,
18
+ MenuContent,
19
+ MenuItem,
20
+ MenuList,
21
+ MenuToggle,
22
+ Nav,
23
+ NavItem,
24
+ NavList,
25
+ Page,
26
+ PageSection,
27
+ PageSectionVariants,
28
+ PageSidebar,
29
+ PageSidebarBody,
30
+ PageToggleButton,
31
+ SkipToContent,
32
+ Toolbar,
33
+ ToolbarContent,
34
+ ToolbarGroup,
35
+ ToolbarItem
36
+ } from '@patternfly/react-core';
37
+ import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
38
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
39
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
40
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
41
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
42
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
43
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
44
+ import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
45
+
46
+ export const NavFlyout: React.FunctionComponent = () => {
47
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
48
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
49
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
50
+ const [isMobileView, setIsMobileView] = React.useState(false);
51
+ const [isSidebarOpenDesktop, setIsSidebarOpenDesktop] = React.useState(true);
52
+ const [isSidebarOpenMobile, setIsSidebarOpenMobile] = React.useState(false);
53
+ const [activeItem, setActiveItem] = React.useState<number | string>(0);
54
+
55
+ const onNavSelect = (
56
+ _event: React.FormEvent<HTMLInputElement>,
57
+ selectedItem: {
58
+ groupId: number | string;
59
+ itemId: number | string;
60
+ to: string;
61
+ }
62
+ ) => setActiveItem(selectedItem.itemId);
63
+
64
+ const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
65
+ const onDropdownSelect = () => setIsDropdownOpen(false);
66
+ const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
67
+ const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
68
+ const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
69
+ const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
70
+ const onSidebarToggleDesktop = () => setIsSidebarOpenDesktop((prevState) => !prevState);
71
+ const onSidebarToggleMobile = () => setIsSidebarOpenMobile((prevState) => !prevState);
72
+
73
+ interface PageOptions {
74
+ mobileView: boolean;
75
+ windowSize: number;
76
+ }
77
+
78
+ const onPageResize = (_event: MouseEvent | TouchEvent | React.KeyboardEvent, { mobileView }: PageOptions) =>
79
+ setIsMobileView(mobileView);
80
+
81
+ const onMenuSelect = (_event: React.MouseEvent | undefined, itemId: string | number | undefined) => {
82
+ itemId && setActiveItem(itemId);
83
+ };
84
+
85
+ const numFlyouts = 5;
86
+ const FlyoutMenu = ({ depth, children }) => (
87
+ <Menu key={depth} containsFlyout isNavFlyout id={`menu-${depth}`} onSelect={onMenuSelect}>
88
+ <MenuContent>
89
+ <MenuList>
90
+ <MenuItem flyoutMenu={children} itemId={`next-menu-${depth}`}>
91
+ Additional settings
92
+ </MenuItem>
93
+ {[...Array(numFlyouts - depth).keys()].map((j) => (
94
+ <MenuItem key={`${depth}-${j}`} itemId={`${depth}-${j}`} to={`#menu-link-${depth}-${j}`}>
95
+ Settings menu {depth} item {j}
96
+ </MenuItem>
97
+ ))}
98
+ <MenuItem flyoutMenu={children} itemId={`next-menu-2-${depth}`}>
99
+ Additional settings
100
+ </MenuItem>
101
+ </MenuList>
102
+ </MenuContent>
103
+ </Menu>
104
+ );
105
+ let curFlyout = <FlyoutMenu depth={1}>{}</FlyoutMenu>;
106
+ for (let i = 2; i < numFlyouts - 1; i++) {
107
+ curFlyout = <FlyoutMenu depth={i}>{curFlyout}</FlyoutMenu>;
108
+ }
109
+
110
+ const kebabDropdownItems = (
111
+ <>
112
+ <DropdownItem>
113
+ <CogIcon /> Settings
114
+ </DropdownItem>
115
+ <DropdownItem>
116
+ <HelpIcon /> Help
117
+ </DropdownItem>
118
+ </>
119
+ );
120
+ const userDropdownItems = (
121
+ <>
122
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
123
+ <DropdownItem key="group 2 user">User management</DropdownItem>
124
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
125
+ </>
126
+ );
127
+
128
+ const headerToolbar = (
129
+ <Toolbar id="toolbar" isFullHeight isStatic>
130
+ <ToolbarContent>
131
+ <ToolbarGroup
132
+ variant="icon-button-group"
133
+ align={{ default: 'alignRight' }}
134
+ spacer={{ default: 'spacerNone', md: 'spacerMd' }}
135
+ >
136
+ <ToolbarItem>
137
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
138
+ </ToolbarItem>
139
+ <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
140
+ <ToolbarItem>
141
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
142
+ </ToolbarItem>
143
+ <ToolbarItem>
144
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
145
+ </ToolbarItem>
146
+ </ToolbarGroup>
147
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
148
+ <Dropdown
149
+ isOpen={isKebabDropdownOpen}
150
+ onSelect={onKebabDropdownSelect}
151
+ onOpenChange={setIsKebabDropdownOpen}
152
+ popperProps={{ position: 'right' }}
153
+ toggle={(toggleRef) => (
154
+ <MenuToggle
155
+ ref={toggleRef}
156
+ isExpanded={isKebabDropdownOpen}
157
+ onClick={onKebabDropdownToggle}
158
+ variant="plain"
159
+ aria-label="Settings and help"
160
+ >
161
+ <EllipsisVIcon aria-hidden="true" />
162
+ </MenuToggle>
163
+ )}
164
+ >
165
+ <DropdownList>{kebabDropdownItems}</DropdownList>
166
+ </Dropdown>
167
+ </ToolbarItem>
168
+ <ToolbarItem visibility={{ md: 'hidden' }}>
169
+ <Dropdown
170
+ isOpen={isFullKebabDropdownOpen}
171
+ onSelect={onFullKebabSelect}
172
+ onOpenChange={setIsFullKebabDropdownOpen}
173
+ popperProps={{ position: 'right' }}
174
+ toggle={(toggleRef) => (
175
+ <MenuToggle
176
+ ref={toggleRef}
177
+ isExpanded={isFullKebabDropdownOpen}
178
+ onClick={onFullKebabToggle}
179
+ variant="plain"
180
+ aria-label="Toolbar menu"
181
+ >
182
+ <EllipsisVIcon aria-hidden="true" />
183
+ </MenuToggle>
184
+ )}
185
+ >
186
+ <DropdownGroup key="group 2" aria-label="User actions">
187
+ <DropdownList>{userDropdownItems}</DropdownList>
188
+ </DropdownGroup>
189
+ <Divider />
190
+ <DropdownList>{kebabDropdownItems}</DropdownList>
191
+ </Dropdown>
192
+ </ToolbarItem>
193
+ </ToolbarGroup>
194
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
195
+ <Dropdown
196
+ isOpen={isDropdownOpen}
197
+ onSelect={onDropdownSelect}
198
+ onOpenChange={setIsDropdownOpen}
199
+ popperProps={{ position: 'right' }}
200
+ toggle={(toggleRef) => (
201
+ <MenuToggle
202
+ ref={toggleRef}
203
+ isExpanded={isDropdownOpen}
204
+ onClick={onDropdownToggle}
205
+ icon={<Avatar src={imgAvatar} alt="" />}
206
+ isFullHeight
207
+ >
208
+ Ned Username
209
+ </MenuToggle>
210
+ )}
211
+ >
212
+ <DropdownList>{userDropdownItems}</DropdownList>
213
+ </Dropdown>
214
+ </ToolbarItem>
215
+ </ToolbarContent>
216
+ </Toolbar>
217
+ );
218
+
219
+ const Header = (
220
+ <Masthead>
221
+ <MastheadToggle>
222
+ <PageToggleButton
223
+ onSidebarToggle={isMobileView ? onSidebarToggleMobile : onSidebarToggleDesktop}
224
+ variant="plain"
225
+ aria-label="Global navigation"
226
+ >
227
+ <BarsIcon />
228
+ </PageToggleButton>
229
+ </MastheadToggle>
230
+ <MastheadMain>
231
+ <MastheadBrand>
232
+ <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
233
+ </MastheadBrand>
234
+ </MastheadMain>
235
+ <MastheadContent>{headerToolbar}</MastheadContent>
236
+ </Masthead>
237
+ );
238
+
239
+ const isSidebarOpen = isMobileView ? isSidebarOpenMobile : isSidebarOpenDesktop;
240
+
241
+ const Sidebar = (
242
+ <PageSidebar isSidebarOpen={isSidebarOpen} style={isSidebarOpen ? { overflow: 'visible' } : {}}>
243
+ <PageSidebarBody>
244
+ <Nav onSelect={onNavSelect}>
245
+ <NavList>
246
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
247
+ <NavItem preventDefault id="flyout-link1" to="#flyout-link1" itemId={0} isActive={activeItem === 0}>
248
+ System Panel
249
+ </NavItem>
250
+ <NavItem preventDefault flyout={curFlyout} id="flyout-link2" itemId={1} isActive={activeItem === 1}>
251
+ Settings
252
+ </NavItem>
253
+ <NavItem preventDefault id="flyout-link3" to="#flyout-link3" itemId={2} isActive={activeItem === 2}>
254
+ Authentication
255
+ </NavItem>
256
+ </NavList>
257
+ </Nav>
258
+ </PageSidebarBody>
259
+ </PageSidebar>
260
+ );
261
+
262
+ const pageId = 'main-content-page-layout-flyout-nav';
263
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
264
+
265
+ return (
266
+ <Page
267
+ header={Header}
268
+ sidebar={Sidebar}
269
+ onPageResize={onPageResize}
270
+ skipToContent={PageSkipToContent}
271
+ mainContainerId={pageId}
272
+ >
273
+ <PageSection variant={PageSectionVariants.darker}>Section with darker background</PageSection>
274
+ <PageSection variant={PageSectionVariants.dark}>Section with dark background</PageSection>
275
+ <PageSection variant={PageSectionVariants.light}>Section with light background</PageSection>
276
+ </Page>
277
+ );
278
+ };
@@ -0,0 +1,99 @@
1
+ import React from 'react';
2
+ import {
3
+ Nav,
4
+ NavGroup,
5
+ NavItem,
6
+ Page,
7
+ PageSection,
8
+ PageSectionVariants,
9
+ PageSidebar,
10
+ PageSidebarBody,
11
+ SkipToContent,
12
+ TextContent,
13
+ Text
14
+ } from '@patternfly/react-core';
15
+ import { DashboardHeader } from '@patternfly/react-core/src/demos/DashboardHeader';
16
+
17
+ export const NavGrouped: React.FunctionComponent = () => {
18
+ const [activeItem, setActiveItem] = React.useState<number | string>('grp-1_itm-1');
19
+
20
+ const onNavSelect = (
21
+ _event: React.FormEvent<HTMLInputElement>,
22
+ selectedItem: {
23
+ groupId: number | string;
24
+ itemId: number | string;
25
+ to: string;
26
+ }
27
+ ) => setActiveItem(selectedItem.itemId);
28
+
29
+ const PageNav = (
30
+ <Nav onSelect={onNavSelect} aria-label="Nav">
31
+ <NavGroup title="System Panel">
32
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
33
+ <NavItem preventDefault itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'} to="#">
34
+ Overview
35
+ </NavItem>
36
+ <NavItem preventDefault itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'} to="#">
37
+ Resource Usage
38
+ </NavItem>
39
+ <NavItem preventDefault itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'} to="#">
40
+ Hypervisors
41
+ </NavItem>
42
+ <NavItem preventDefault itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'} to="#">
43
+ Instances
44
+ </NavItem>
45
+ <NavItem preventDefault itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'} to="#">
46
+ Volumes
47
+ </NavItem>
48
+ <NavItem preventDefault itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'} to="#">
49
+ Network
50
+ </NavItem>
51
+ </NavGroup>
52
+ <NavGroup title="Policy">
53
+ <NavItem preventDefault itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'} to="#">
54
+ Hosts
55
+ </NavItem>
56
+ <NavItem preventDefault itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'} to="#">
57
+ Virtual Machines
58
+ </NavItem>
59
+ <NavItem preventDefault itemId="grp-2_itm-3" isActive={activeItem === 'grp-2_itm-3'} to="#">
60
+ Storage
61
+ </NavItem>
62
+ </NavGroup>
63
+ </Nav>
64
+ );
65
+
66
+ const Sidebar = (
67
+ <PageSidebar>
68
+ <PageSidebarBody>{PageNav}</PageSidebarBody>
69
+ </PageSidebar>
70
+ );
71
+ const pageId = 'main-content-page-layout-group-nav';
72
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
73
+
74
+ return (
75
+ <>
76
+ <Page
77
+ header={<DashboardHeader />}
78
+ sidebar={Sidebar}
79
+ isManagedSidebar
80
+ skipToContent={PageSkipToContent}
81
+ mainContainerId={pageId}
82
+ >
83
+ <PageSection variant={PageSectionVariants.light}>
84
+ <TextContent>
85
+ <Text component="h1">Main title</Text>
86
+ <Text component="p">
87
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
88
+ of its relative line height of 1.5.
89
+ </Text>
90
+ </TextContent>
91
+ </PageSection>
92
+ <PageSection variant={PageSectionVariants.light}>Light</PageSection>
93
+ <PageSection variant={PageSectionVariants.dark}>Dark</PageSection>
94
+ <PageSection variant={PageSectionVariants.darker}>Darker</PageSection>
95
+ <PageSection>Content</PageSection>
96
+ </Page>
97
+ </>
98
+ );
99
+ };