@patternfly/react-core 5.2.0-prerelease.11 → 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 (165) hide show
  1. package/CHANGELOG.md +13 -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/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  120. package/dist/esm/components/CalendarMonth/CalendarMonth.js +15 -39
  121. package/dist/esm/components/CalendarMonth/CalendarMonth.js.map +1 -1
  122. package/dist/esm/components/InputGroup/InputGroup.d.ts.map +1 -1
  123. package/dist/esm/components/InputGroup/InputGroup.js +1 -51
  124. package/dist/esm/components/InputGroup/InputGroup.js.map +1 -1
  125. package/dist/esm/helpers/Popper/Popper.d.ts.map +1 -1
  126. package/dist/esm/helpers/Popper/Popper.js +3 -2
  127. package/dist/esm/helpers/Popper/Popper.js.map +1 -1
  128. package/dist/esm/helpers/datetimeUtils.d.ts +1 -1
  129. package/dist/esm/helpers/datetimeUtils.d.ts.map +1 -1
  130. package/dist/esm/helpers/datetimeUtils.js.map +1 -1
  131. package/dist/js/components/CalendarMonth/CalendarMonth.d.ts.map +1 -1
  132. package/dist/js/components/CalendarMonth/CalendarMonth.js +15 -39
  133. package/dist/js/components/CalendarMonth/CalendarMonth.js.map +1 -1
  134. package/dist/js/components/InputGroup/InputGroup.d.ts.map +1 -1
  135. package/dist/js/components/InputGroup/InputGroup.js +1 -51
  136. package/dist/js/components/InputGroup/InputGroup.js.map +1 -1
  137. package/dist/js/helpers/Popper/Popper.d.ts.map +1 -1
  138. package/dist/js/helpers/Popper/Popper.js +3 -2
  139. package/dist/js/helpers/Popper/Popper.js.map +1 -1
  140. package/dist/js/helpers/datetimeUtils.d.ts +1 -1
  141. package/dist/js/helpers/datetimeUtils.d.ts.map +1 -1
  142. package/dist/js/helpers/datetimeUtils.js.map +1 -1
  143. package/dist/umd/react-core.min.js +1 -1
  144. package/helpers/package.json +1 -1
  145. package/layouts/package.json +1 -1
  146. package/next/package.json +1 -1
  147. package/package.json +2 -2
  148. package/src/components/CalendarMonth/CalendarMonth.tsx +18 -43
  149. package/src/components/InputGroup/InputGroup.tsx +1 -53
  150. package/src/components/InputGroup/__tests__/InputGroup.test.tsx +7 -44
  151. package/src/components/NumberInput/__tests__/NumberInput.test.tsx +0 -1
  152. package/src/demos/Nav.md +10 -1673
  153. package/src/demos/examples/Nav/NavDefault.tsx +98 -0
  154. package/src/demos/examples/Nav/NavDrilldown.tsx +2 -0
  155. package/src/demos/examples/Nav/NavExpandable.tsx +124 -0
  156. package/src/demos/examples/Nav/NavFlyout.tsx +278 -0
  157. package/src/demos/examples/Nav/NavGrouped.tsx +99 -0
  158. package/src/demos/examples/Nav/NavHorizontal.tsx +237 -0
  159. package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +297 -0
  160. package/src/demos/examples/Nav/NavManual.tsx +273 -0
  161. package/src/demos/examples/Nav/NavWithSubnav.tsx +142 -0
  162. package/src/demos/examples/Nav/deprecated/NavLight.tsx +96 -0
  163. package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +92 -0
  164. package/src/helpers/Popper/Popper.tsx +3 -1
  165. package/src/helpers/datetimeUtils.ts +1 -1
@@ -0,0 +1,237 @@
1
+ import React from 'react';
2
+ import {
3
+ Avatar,
4
+ Brand,
5
+ Button,
6
+ ButtonVariant,
7
+ Card,
8
+ CardBody,
9
+ Divider,
10
+ Dropdown,
11
+ DropdownGroup,
12
+ DropdownItem,
13
+ DropdownList,
14
+ Gallery,
15
+ GalleryItem,
16
+ Masthead,
17
+ MastheadMain,
18
+ MastheadBrand,
19
+ MastheadContent,
20
+ MenuToggle,
21
+ Nav,
22
+ NavItem,
23
+ NavList,
24
+ Page,
25
+ PageSection,
26
+ PageSectionVariants,
27
+ SkipToContent,
28
+ TextContent,
29
+ Text,
30
+ Toolbar,
31
+ ToolbarContent,
32
+ ToolbarGroup,
33
+ ToolbarItem
34
+ } from '@patternfly/react-core';
35
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
36
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
37
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
38
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
39
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
40
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
41
+ import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
42
+ import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
43
+
44
+ export const NavHorizontal: React.FunctionComponent = () => {
45
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
46
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
47
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
48
+ const [activeItem, setActiveItem] = React.useState<string | number>(0);
49
+
50
+ const onNavSelect = (
51
+ _event: React.FormEvent<HTMLInputElement>,
52
+ selectedItem: {
53
+ groupId: number | string;
54
+ itemId: number | string;
55
+ to: string;
56
+ }
57
+ ) => setActiveItem(selectedItem.itemId);
58
+
59
+ const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
60
+ const onDropdownSelect = () => setIsDropdownOpen(false);
61
+ const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
62
+ const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
63
+ const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
64
+ const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
65
+
66
+ const PageNav = (
67
+ <Nav onSelect={onNavSelect} aria-label="Nav" variant="horizontal">
68
+ <NavList>
69
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
70
+ <NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
71
+ System Panel
72
+ </NavItem>
73
+ <NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
74
+ Policy
75
+ </NavItem>
76
+ <NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
77
+ Authentication
78
+ </NavItem>
79
+ <NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
80
+ Network Services
81
+ </NavItem>
82
+ <NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
83
+ Server
84
+ </NavItem>
85
+ </NavList>
86
+ </Nav>
87
+ );
88
+ const kebabDropdownItems = (
89
+ <>
90
+ <DropdownItem>
91
+ <CogIcon /> Settings
92
+ </DropdownItem>
93
+ <DropdownItem>
94
+ <HelpIcon /> Help
95
+ </DropdownItem>
96
+ </>
97
+ );
98
+ const userDropdownItems = (
99
+ <>
100
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
101
+ <DropdownItem key="group 2 user">User management</DropdownItem>
102
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
103
+ </>
104
+ );
105
+
106
+ const headerToolbar = (
107
+ <Toolbar id="toolbar" isFullHeight isStatic>
108
+ <ToolbarContent>
109
+ <ToolbarItem isOverflowContainer>{PageNav}</ToolbarItem>
110
+ <ToolbarGroup
111
+ variant="icon-button-group"
112
+ align={{ default: 'alignRight' }}
113
+ spacer={{ default: 'spacerNone', md: 'spacerMd' }}
114
+ >
115
+ <ToolbarItem>
116
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
117
+ </ToolbarItem>
118
+ <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
119
+ <ToolbarItem>
120
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
121
+ </ToolbarItem>
122
+ <ToolbarItem>
123
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
124
+ </ToolbarItem>
125
+ </ToolbarGroup>
126
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
127
+ <Dropdown
128
+ isOpen={isKebabDropdownOpen}
129
+ onSelect={onKebabDropdownSelect}
130
+ onOpenChange={setIsKebabDropdownOpen}
131
+ popperProps={{ position: 'right' }}
132
+ toggle={(toggleRef) => (
133
+ <MenuToggle
134
+ ref={toggleRef}
135
+ isExpanded={isKebabDropdownOpen}
136
+ onClick={onKebabDropdownToggle}
137
+ variant="plain"
138
+ aria-label="Settings and help"
139
+ >
140
+ <EllipsisVIcon aria-hidden="true" />
141
+ </MenuToggle>
142
+ )}
143
+ >
144
+ <DropdownList>{kebabDropdownItems}</DropdownList>
145
+ </Dropdown>
146
+ </ToolbarItem>
147
+ <ToolbarItem visibility={{ md: 'hidden' }}>
148
+ <Dropdown
149
+ isOpen={isFullKebabDropdownOpen}
150
+ onSelect={onFullKebabSelect}
151
+ onOpenChange={setIsFullKebabDropdownOpen}
152
+ popperProps={{ position: 'right' }}
153
+ toggle={(toggleRef) => (
154
+ <MenuToggle
155
+ ref={toggleRef}
156
+ isExpanded={isFullKebabDropdownOpen}
157
+ onClick={onFullKebabToggle}
158
+ variant="plain"
159
+ aria-label="Toolbar menu"
160
+ >
161
+ <EllipsisVIcon aria-hidden="true" />
162
+ </MenuToggle>
163
+ )}
164
+ >
165
+ <DropdownGroup key="group 2" aria-label="User actions">
166
+ <DropdownList>{userDropdownItems}</DropdownList>
167
+ </DropdownGroup>
168
+ <Divider />
169
+ <DropdownList>{kebabDropdownItems}</DropdownList>
170
+ </Dropdown>
171
+ </ToolbarItem>
172
+ </ToolbarGroup>
173
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
174
+ <Dropdown
175
+ isOpen={isDropdownOpen}
176
+ onSelect={onDropdownSelect}
177
+ onOpenChange={setIsDropdownOpen}
178
+ popperProps={{ position: 'right' }}
179
+ toggle={(toggleRef) => (
180
+ <MenuToggle
181
+ ref={toggleRef}
182
+ isExpanded={isDropdownOpen}
183
+ onClick={onDropdownToggle}
184
+ icon={<Avatar src={imgAvatar} alt="" />}
185
+ isFullHeight
186
+ >
187
+ Ned Username
188
+ </MenuToggle>
189
+ )}
190
+ >
191
+ <DropdownList>{userDropdownItems}</DropdownList>
192
+ </Dropdown>
193
+ </ToolbarItem>
194
+ </ToolbarContent>
195
+ </Toolbar>
196
+ );
197
+ const Header = (
198
+ <Masthead>
199
+ <MastheadMain>
200
+ <MastheadBrand>
201
+ <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
202
+ </MastheadBrand>
203
+ </MastheadMain>
204
+ <MastheadContent>{headerToolbar}</MastheadContent>
205
+ </Masthead>
206
+ );
207
+
208
+ const pageId = 'main-content-page-layout-horizontal-nav';
209
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
210
+
211
+ return (
212
+ <React.Fragment>
213
+ <Page header={Header} skipToContent={PageSkipToContent} breadcrumb={DashboardBreadcrumb} mainContainerId={pageId}>
214
+ <PageSection variant={PageSectionVariants.light}>
215
+ <TextContent>
216
+ <Text component="h1">Main title</Text>
217
+ <Text component="p">
218
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
219
+ of its relative line height of 1.5.
220
+ </Text>
221
+ </TextContent>
222
+ </PageSection>
223
+ <PageSection>
224
+ <Gallery hasGutter>
225
+ {Array.from({ length: 10 }, (_value: any, index: React.Key) => (
226
+ <GalleryItem key={index}>
227
+ <Card>
228
+ <CardBody>This is a card</CardBody>
229
+ </Card>
230
+ </GalleryItem>
231
+ ))}
232
+ </Gallery>
233
+ </PageSection>
234
+ </Page>
235
+ </React.Fragment>
236
+ );
237
+ };
@@ -0,0 +1,297 @@
1
+ import React from 'react';
2
+ import {
3
+ Avatar,
4
+ Brand,
5
+ Button,
6
+ ButtonVariant,
7
+ Card,
8
+ CardBody,
9
+ Divider,
10
+ Dropdown,
11
+ DropdownGroup,
12
+ DropdownItem,
13
+ DropdownList,
14
+ Gallery,
15
+ GalleryItem,
16
+ MenuToggle,
17
+ Masthead,
18
+ MastheadBrand,
19
+ MastheadContent,
20
+ MastheadMain,
21
+ MastheadToggle,
22
+ Nav,
23
+ NavItem,
24
+ NavList,
25
+ Page,
26
+ PageSection,
27
+ PageSectionVariants,
28
+ PageSectionTypes,
29
+ PageToggleButton,
30
+ SkipToContent,
31
+ TextContent,
32
+ Text,
33
+ Toolbar,
34
+ ToolbarContent,
35
+ ToolbarGroup,
36
+ ToolbarItem
37
+ } from '@patternfly/react-core';
38
+ import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon';
39
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
40
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
41
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
42
+ import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
43
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
44
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
45
+ import pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';
46
+ import { DashboardBreadcrumb } from '@patternfly/react-core/src/demos/DashboardWrapper';
47
+
48
+ export const NavHorizontalWithSubnav: React.FunctionComponent = () => {
49
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
50
+ const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);
51
+ const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false);
52
+ const [activeItem, setActiveItem] = React.useState<string | number>(0);
53
+ const [activeSubNavItem, setActiveSubNavItem] = React.useState<string | number>(7);
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 onSubNavSelect = (
65
+ _event: React.FormEvent<HTMLInputElement>,
66
+ selectedItem: {
67
+ groupId: number | string;
68
+ itemId: number | string;
69
+ to: string;
70
+ }
71
+ ) => setActiveSubNavItem(selectedItem.itemId);
72
+
73
+ const onDropdownToggle = () => setIsDropdownOpen((prevState) => !prevState);
74
+ const onDropdownSelect = () => setIsDropdownOpen(false);
75
+ const onKebabDropdownToggle = () => setIsKebabDropdownOpen((prevState) => !prevState);
76
+ const onKebabDropdownSelect = () => setIsKebabDropdownOpen(false);
77
+ const onFullKebabToggle = () => setIsFullKebabDropdownOpen((prevState) => !prevState);
78
+ const onFullKebabSelect = () => setIsFullKebabDropdownOpen(false);
79
+
80
+ const PageNav = (
81
+ <Nav onSelect={onNavSelect} aria-label="Nav" variant="horizontal">
82
+ <NavList>
83
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
84
+ <NavItem preventDefault itemId={0} isActive={activeItem === 0} to="#">
85
+ System Panel
86
+ </NavItem>
87
+ <NavItem preventDefault itemId={1} isActive={activeItem === 1} to="#">
88
+ Policy
89
+ </NavItem>
90
+ <NavItem preventDefault itemId={2} isActive={activeItem === 2} to="#">
91
+ Authentication
92
+ </NavItem>
93
+ <NavItem preventDefault itemId={3} isActive={activeItem === 3} to="#">
94
+ Network Services
95
+ </NavItem>
96
+ <NavItem preventDefault itemId={4} isActive={activeItem === 4} to="#">
97
+ Server
98
+ </NavItem>
99
+ <NavItem preventDefault itemId={5} isActive={activeItem === 5} to="#">
100
+ Other horizontal nav item 1
101
+ </NavItem>
102
+ <NavItem preventDefault itemId={6} isActive={activeItem === 6} to="#">
103
+ Other horizontal nav item 2
104
+ </NavItem>
105
+ </NavList>
106
+ </Nav>
107
+ );
108
+ const kebabDropdownItems = (
109
+ <>
110
+ <DropdownItem>
111
+ <CogIcon /> Settings
112
+ </DropdownItem>
113
+ <DropdownItem>
114
+ <HelpIcon /> Help
115
+ </DropdownItem>
116
+ </>
117
+ );
118
+ const userDropdownItems = (
119
+ <>
120
+ <DropdownItem key="group 2 profile">My profile</DropdownItem>
121
+ <DropdownItem key="group 2 user">User management</DropdownItem>
122
+ <DropdownItem key="group 2 logout">Logout</DropdownItem>
123
+ </>
124
+ );
125
+
126
+ const SubNav = (
127
+ <Nav onSelect={onSubNavSelect} aria-label="Subnav" variant="horizontal-subnav">
128
+ <NavList>
129
+ {/* Preventing default click behavior on each NavItem for demo purposes only */}
130
+ <NavItem preventDefault itemId={7} isActive={activeSubNavItem === 7} to="#">
131
+ Horizontal subnav item 1
132
+ </NavItem>
133
+ <NavItem preventDefault itemId={8} isActive={activeSubNavItem === 8} to="#">
134
+ Horizontal subnav item 2
135
+ </NavItem>
136
+ <NavItem preventDefault itemId={9} isActive={activeSubNavItem === 9} to="#">
137
+ Horizontal subnav item 3
138
+ </NavItem>
139
+ <NavItem preventDefault itemId={10} isActive={activeSubNavItem === 10} to="#">
140
+ Horizontal subnav item 4
141
+ </NavItem>
142
+ <NavItem preventDefault itemId={11} isActive={activeSubNavItem === 11} to="#">
143
+ Horizontal subnav item 5
144
+ </NavItem>
145
+ <NavItem preventDefault itemId={12} isActive={activeSubNavItem === 12} to="#">
146
+ Horizontal subnav item 6
147
+ </NavItem>
148
+ <NavItem preventDefault itemId={13} isActive={activeSubNavItem === 13} to="#">
149
+ Horizontal subnav item 7
150
+ </NavItem>
151
+ </NavList>
152
+ </Nav>
153
+ );
154
+
155
+ const headerToolbar = (
156
+ <Toolbar id="toolbar" isFullHeight isStatic>
157
+ <ToolbarContent>
158
+ <ToolbarItem isOverflowContainer>{PageNav}</ToolbarItem>
159
+ <ToolbarGroup
160
+ variant="icon-button-group"
161
+ align={{ default: 'alignRight' }}
162
+ spacer={{ default: 'spacerNone', md: 'spacerMd' }}
163
+ >
164
+ <ToolbarItem>
165
+ <Button aria-label="Notifications" variant={ButtonVariant.plain} icon={<BellIcon />} onClick={() => {}} />
166
+ </ToolbarItem>
167
+ <ToolbarGroup variant="icon-button-group" visibility={{ default: 'hidden', lg: 'visible' }}>
168
+ <ToolbarItem>
169
+ <Button aria-label="Settings" variant={ButtonVariant.plain} icon={<CogIcon />} />
170
+ </ToolbarItem>
171
+ <ToolbarItem>
172
+ <Button aria-label="Help" variant={ButtonVariant.plain} icon={<QuestionCircleIcon />} />
173
+ </ToolbarItem>
174
+ </ToolbarGroup>
175
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>
176
+ <Dropdown
177
+ isOpen={isKebabDropdownOpen}
178
+ onSelect={onKebabDropdownSelect}
179
+ onOpenChange={setIsKebabDropdownOpen}
180
+ popperProps={{ position: 'right' }}
181
+ toggle={(toggleRef) => (
182
+ <MenuToggle
183
+ ref={toggleRef}
184
+ isExpanded={isKebabDropdownOpen}
185
+ onClick={onKebabDropdownToggle}
186
+ variant="plain"
187
+ aria-label="Settings and help"
188
+ >
189
+ <EllipsisVIcon aria-hidden="true" />
190
+ </MenuToggle>
191
+ )}
192
+ >
193
+ <DropdownList>{kebabDropdownItems}</DropdownList>
194
+ </Dropdown>
195
+ </ToolbarItem>
196
+ <ToolbarItem visibility={{ md: 'hidden' }}>
197
+ <Dropdown
198
+ isOpen={isFullKebabDropdownOpen}
199
+ onSelect={onFullKebabSelect}
200
+ onOpenChange={setIsFullKebabDropdownOpen}
201
+ popperProps={{ position: 'right' }}
202
+ toggle={(toggleRef) => (
203
+ <MenuToggle
204
+ ref={toggleRef}
205
+ isExpanded={isFullKebabDropdownOpen}
206
+ onClick={onFullKebabToggle}
207
+ variant="plain"
208
+ aria-label="Toolbar menu"
209
+ >
210
+ <EllipsisVIcon aria-hidden="true" />
211
+ </MenuToggle>
212
+ )}
213
+ >
214
+ <DropdownGroup key="group 2" aria-label="User actions">
215
+ <DropdownList>{userDropdownItems}</DropdownList>
216
+ </DropdownGroup>
217
+ <Divider />
218
+ <DropdownList>{kebabDropdownItems}</DropdownList>
219
+ </Dropdown>
220
+ </ToolbarItem>
221
+ </ToolbarGroup>
222
+ <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>
223
+ <Dropdown
224
+ isOpen={isDropdownOpen}
225
+ onSelect={onDropdownSelect}
226
+ onOpenChange={setIsDropdownOpen}
227
+ popperProps={{ position: 'right' }}
228
+ toggle={(toggleRef) => (
229
+ <MenuToggle
230
+ ref={toggleRef}
231
+ isExpanded={isDropdownOpen}
232
+ onClick={onDropdownToggle}
233
+ icon={<Avatar src={imgAvatar} alt="" />}
234
+ isFullHeight
235
+ >
236
+ Ned Username
237
+ </MenuToggle>
238
+ )}
239
+ >
240
+ <DropdownList>{userDropdownItems}</DropdownList>
241
+ </Dropdown>
242
+ </ToolbarItem>
243
+ </ToolbarContent>
244
+ </Toolbar>
245
+ );
246
+ const Header = (
247
+ <Masthead>
248
+ <MastheadToggle>
249
+ <PageToggleButton variant="plain" aria-label="Global navigation">
250
+ <BarsIcon />
251
+ </PageToggleButton>
252
+ </MastheadToggle>
253
+ <MastheadMain>
254
+ <MastheadBrand>
255
+ <Brand src={pfLogo} alt="PatternFly" heights={{ default: '36px' }} />
256
+ </MastheadBrand>
257
+ </MastheadMain>
258
+ <MastheadContent>{headerToolbar}</MastheadContent>
259
+ </Masthead>
260
+ );
261
+
262
+ const pageId = 'main-content-page-layout-horizontal-nav';
263
+ const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
264
+
265
+ return (
266
+ <React.Fragment>
267
+ <Page header={Header} skipToContent={PageSkipToContent} mainContainerId={pageId}>
268
+ <PageSection type={PageSectionTypes.subNav} isWidthLimited>
269
+ {SubNav}
270
+ </PageSection>
271
+ <PageSection type={PageSectionTypes.breadcrumb} isWidthLimited>
272
+ {DashboardBreadcrumb}
273
+ </PageSection>
274
+ <PageSection variant={PageSectionVariants.light}>
275
+ <TextContent>
276
+ <Text component="h1">Main title</Text>
277
+ <Text component="p">
278
+ Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
279
+ of it’s relative line height of 1.5.
280
+ </Text>
281
+ </TextContent>
282
+ </PageSection>
283
+ <PageSection>
284
+ <Gallery hasGutter>
285
+ {Array.from({ length: 10 }, (_value: any, index: React.Key) => (
286
+ <GalleryItem key={index}>
287
+ <Card>
288
+ <CardBody>This is a card</CardBody>
289
+ </Card>
290
+ </GalleryItem>
291
+ ))}
292
+ </Gallery>
293
+ </PageSection>
294
+ </Page>
295
+ </React.Fragment>
296
+ );
297
+ };