@patternfly/react-core 6.6.1-prerelease.4 → 6.6.1-prerelease.6

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 (200) hide show
  1. package/CHANGELOG.md +16 -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/Compass/package.json +1 -1
  23. package/dist/dynamic/components/Content/package.json +1 -1
  24. package/dist/dynamic/components/DataList/package.json +1 -1
  25. package/dist/dynamic/components/DatePicker/package.json +1 -1
  26. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  27. package/dist/dynamic/components/Divider/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/Hero/package.json +1 -1
  38. package/dist/dynamic/components/Hint/package.json +1 -1
  39. package/dist/dynamic/components/Icon/package.json +1 -1
  40. package/dist/dynamic/components/InputGroup/package.json +1 -1
  41. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  42. package/dist/dynamic/components/Label/package.json +1 -1
  43. package/dist/dynamic/components/List/package.json +1 -1
  44. package/dist/dynamic/components/LoginPage/package.json +1 -1
  45. package/dist/dynamic/components/Masthead/package.json +1 -1
  46. package/dist/dynamic/components/Menu/package.json +1 -1
  47. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  48. package/dist/dynamic/components/Modal/package.json +1 -1
  49. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  50. package/dist/dynamic/components/Nav/package.json +1 -1
  51. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  52. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  53. package/dist/dynamic/components/NumberInput/package.json +1 -1
  54. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  55. package/dist/dynamic/components/Page/package.json +1 -1
  56. package/dist/dynamic/components/Pagination/package.json +1 -1
  57. package/dist/dynamic/components/Panel/package.json +1 -1
  58. package/dist/dynamic/components/Popover/package.json +1 -1
  59. package/dist/dynamic/components/Progress/package.json +1 -1
  60. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  61. package/dist/dynamic/components/Radio/package.json +1 -1
  62. package/dist/dynamic/components/SearchInput/package.json +1 -1
  63. package/dist/dynamic/components/Select/package.json +1 -1
  64. package/dist/dynamic/components/Sidebar/package.json +1 -1
  65. package/dist/dynamic/components/SimpleList/package.json +1 -1
  66. package/dist/dynamic/components/Skeleton/package.json +1 -1
  67. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  68. package/dist/dynamic/components/Slider/package.json +1 -1
  69. package/dist/dynamic/components/Spinner/package.json +1 -1
  70. package/dist/dynamic/components/Switch/package.json +1 -1
  71. package/dist/dynamic/components/Tabs/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/TimePicker/package.json +1 -1
  76. package/dist/dynamic/components/Timestamp/package.json +1 -1
  77. package/dist/dynamic/components/Title/package.json +1 -1
  78. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  79. package/dist/dynamic/components/Toolbar/package.json +1 -1
  80. package/dist/dynamic/components/Tooltip/package.json +1 -1
  81. package/dist/dynamic/components/TreeView/package.json +1 -1
  82. package/dist/dynamic/components/Truncate/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/package.json +1 -1
  92. package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -1
  93. package/dist/dynamic/helpers/AnimationsProvider/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/SSRSafeIds/SSRSafeIds/package.json +1 -1
  100. package/dist/dynamic/helpers/constants/package.json +1 -1
  101. package/dist/dynamic/helpers/datetimeUtils/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/inert/package.json +1 -1
  105. package/dist/dynamic/helpers/package.json +1 -1
  106. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  107. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  108. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  109. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  110. package/dist/dynamic/helpers/useSSRSafeId/package.json +1 -1
  111. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  112. package/dist/dynamic/helpers/util/package.json +1 -1
  113. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  114. package/dist/dynamic/layouts/Flex/package.json +1 -1
  115. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  116. package/dist/dynamic/layouts/Grid/package.json +1 -1
  117. package/dist/dynamic/layouts/Level/package.json +1 -1
  118. package/dist/dynamic/layouts/Split/package.json +1 -1
  119. package/dist/dynamic/layouts/Stack/package.json +1 -1
  120. package/dist/dynamic/styles/package.json +1 -1
  121. package/dist/dynamic-modules.json +3 -0
  122. package/dist/esm/components/Compass/Compass.d.ts +2 -0
  123. package/dist/esm/components/Compass/Compass.d.ts.map +1 -1
  124. package/dist/esm/components/Compass/Compass.js +2 -2
  125. package/dist/esm/components/Compass/Compass.js.map +1 -1
  126. package/dist/esm/components/Nav/NavExpandable.d.ts +2 -0
  127. package/dist/esm/components/Nav/NavExpandable.d.ts.map +1 -1
  128. package/dist/esm/components/Nav/NavExpandable.js +6 -4
  129. package/dist/esm/components/Nav/NavExpandable.js.map +1 -1
  130. package/dist/esm/components/Page/Page.d.ts +6 -1
  131. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  132. package/dist/esm/components/Page/Page.js +4 -3
  133. package/dist/esm/components/Page/Page.js.map +1 -1
  134. package/dist/esm/components/Page/PageHeader.d.ts +11 -0
  135. package/dist/esm/components/Page/PageHeader.d.ts.map +1 -0
  136. package/dist/esm/components/Page/PageHeader.js +11 -0
  137. package/dist/esm/components/Page/PageHeader.js.map +1 -0
  138. package/dist/esm/components/Page/index.d.ts +1 -0
  139. package/dist/esm/components/Page/index.d.ts.map +1 -1
  140. package/dist/esm/components/Page/index.js +1 -0
  141. package/dist/esm/components/Page/index.js.map +1 -1
  142. package/dist/esm/helpers/index.d.ts +1 -0
  143. package/dist/esm/helpers/index.d.ts.map +1 -1
  144. package/dist/esm/helpers/index.js +1 -0
  145. package/dist/esm/helpers/index.js.map +1 -1
  146. package/dist/js/components/Compass/Compass.d.ts +2 -0
  147. package/dist/js/components/Compass/Compass.d.ts.map +1 -1
  148. package/dist/js/components/Compass/Compass.js +2 -2
  149. package/dist/js/components/Compass/Compass.js.map +1 -1
  150. package/dist/js/components/Nav/NavExpandable.d.ts +2 -0
  151. package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
  152. package/dist/js/components/Nav/NavExpandable.js +6 -4
  153. package/dist/js/components/Nav/NavExpandable.js.map +1 -1
  154. package/dist/js/components/Page/Page.d.ts +6 -1
  155. package/dist/js/components/Page/Page.d.ts.map +1 -1
  156. package/dist/js/components/Page/Page.js +4 -3
  157. package/dist/js/components/Page/Page.js.map +1 -1
  158. package/dist/js/components/Page/PageHeader.d.ts +11 -0
  159. package/dist/js/components/Page/PageHeader.d.ts.map +1 -0
  160. package/dist/js/components/Page/PageHeader.js +15 -0
  161. package/dist/js/components/Page/PageHeader.js.map +1 -0
  162. package/dist/js/components/Page/index.d.ts +1 -0
  163. package/dist/js/components/Page/index.d.ts.map +1 -1
  164. package/dist/js/components/Page/index.js +1 -0
  165. package/dist/js/components/Page/index.js.map +1 -1
  166. package/dist/js/helpers/index.d.ts +1 -0
  167. package/dist/js/helpers/index.d.ts.map +1 -1
  168. package/dist/js/helpers/index.js +1 -0
  169. package/dist/js/helpers/index.js.map +1 -1
  170. package/dist/umd/assets/{output-CB485rDk.css → output-C3dFbrt3.css} +16242 -16164
  171. package/dist/umd/react-core.min.js +3 -3
  172. package/helpers/package.json +1 -1
  173. package/layouts/package.json +1 -1
  174. package/next/package.json +1 -1
  175. package/package.json +6 -6
  176. package/src/components/Compass/Compass.tsx +4 -0
  177. package/src/components/Compass/__tests__/Compass.test.tsx +15 -0
  178. package/src/components/List/__tests__/__snapshots__/ListItem.test.tsx.snap +1 -3
  179. package/src/components/Nav/NavExpandable.tsx +12 -2
  180. package/src/components/Nav/__tests__/Generated/__snapshots__/NavExpandable.test.tsx.snap +5 -1
  181. package/src/components/Nav/__tests__/NavExpandable.test.tsx +21 -0
  182. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +15 -4
  183. package/src/components/Nav/examples/Nav.md +17 -4
  184. package/src/components/Nav/examples/NavDocked.tsx +98 -0
  185. package/src/components/Nav/examples/NavIcons.tsx +8 -8
  186. package/src/components/Page/Page.tsx +9 -1
  187. package/src/components/Page/PageHeader.tsx +28 -0
  188. package/src/components/Page/__tests__/Page.test.tsx +33 -0
  189. package/src/components/Page/__tests__/PageHeader.test.tsx +33 -0
  190. package/src/components/Page/examples/Page.md +19 -2
  191. package/src/components/Page/examples/PageHeaderContent.tsx +19 -0
  192. package/src/components/Page/index.ts +1 -0
  193. package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +2 -8
  194. package/src/components/ToggleGroup/__tests__/__snapshots__/ToggleGroupItemElement.test.tsx.snap +1 -3
  195. package/src/demos/Compass/Compass.md +3 -1
  196. package/src/demos/Compass/examples/CompassDockDemo.tsx +111 -5
  197. package/src/demos/Nav.md +4 -2
  198. package/src/demos/examples/Nav/NavDockedNav.tsx +113 -7
  199. package/src/helpers/index.ts +1 -0
  200. package/src/layouts/Flex/__tests__/__snapshots__/Flex.test.tsx.snap +3 -9
@@ -2,6 +2,7 @@ export * from './Page';
2
2
  export * from './PageBody';
3
3
  export * from './PageBreadcrumb';
4
4
  export * from './PageGroup';
5
+ export * from './PageHeader';
5
6
  export * from './PageSidebar';
6
7
  export * from './PageSidebarBody';
7
8
  export * from './PageSection';
@@ -2,9 +2,7 @@
2
2
 
3
3
  exports[`SearchInput advanced search 1`] = `
4
4
  <DocumentFragment>
5
- <div
6
- class=""
7
- >
5
+ <div>
8
6
  <div
9
7
  class="pf-v6-c-input-group"
10
8
  >
@@ -145,7 +143,6 @@ exports[`SearchInput advanced search 1`] = `
145
143
  exports[`SearchInput advanced search with custom attributes 1`] = `
146
144
  <DocumentFragment>
147
145
  <div
148
- class=""
149
146
  data-testid="test-id"
150
147
  >
151
148
  <div
@@ -282,7 +279,6 @@ exports[`SearchInput advanced search with custom attributes 1`] = `
282
279
  </div>
283
280
  </div>
284
281
  <div
285
- class=""
286
282
  data-popper-escaped="true"
287
283
  data-popper-placement="bottom-start"
288
284
  data-popper-reference-hidden="true"
@@ -490,9 +486,7 @@ exports[`SearchInput advanced search with custom attributes 1`] = `
490
486
 
491
487
  exports[`SearchInput renders search input in strict mode 1`] = `
492
488
  <DocumentFragment>
493
- <div
494
- class=""
495
- >
489
+ <div>
496
490
  <div
497
491
  class="pf-v6-c-input-group"
498
492
  >
@@ -2,9 +2,7 @@
2
2
 
3
3
  exports[`empty 1`] = `
4
4
  <DocumentFragment>
5
- <span
6
- class=""
7
- />
5
+ <span />
8
6
  </DocumentFragment>
9
7
  `;
10
8
 
@@ -8,7 +8,6 @@ import RhUiPlayFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-play-
8
8
  import RhUiAddSquareIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-add-square-icon';
9
9
  import RhUiCopyIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-copy-icon';
10
10
  import RhUiQuestionMarkCircleIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-icon';
11
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
12
11
  import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
13
12
  import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
14
13
  import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
@@ -18,6 +17,9 @@ import imgAvatar from '../assets/avatarImg.svg';
18
17
  import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
19
18
  import pfLogo from '../assets/PF-IconLogo-color.svg';
20
19
  import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
20
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
21
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
22
+ import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
21
23
 
22
24
  ## Demos
23
25
 
@@ -26,14 +26,17 @@ import {
26
26
  Button,
27
27
  Tooltip,
28
28
  Divider,
29
- PageToggleButton
29
+ PageToggleButton,
30
+ NavExpandable
30
31
  } from '@patternfly/react-core';
31
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
32
32
  import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
33
33
  import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
34
34
  import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
35
35
  import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
36
36
  import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-search-icon';
37
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
38
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
39
+ import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
37
40
  import pfLogo from '../../assets/PF-IconLogo-color.svg';
38
41
  import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
39
42
  import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
@@ -46,8 +49,10 @@ interface NavOnSelectProps {
46
49
 
47
50
  export const CompassDockDemo: React.FunctionComponent = () => {
48
51
  const [activeItem, setActiveItem] = useState<number>(0);
52
+ const [isNavGroupExpanded, setIsNavGroupExpanded] = useState(false);
49
53
  const [isDockExpanded, setIsDockExpanded] = useState(false);
50
54
  const [isDockTextExpanded, setIsDockTextExpanded] = useState(false);
55
+ const [isDockExpandableExpanded, setIsDockExpandableExpanded] = useState(false);
51
56
  const [isMobile, setIsMobile] = useState(false);
52
57
 
53
58
  useEffect(() => {
@@ -63,14 +68,60 @@ export const CompassDockDemo: React.FunctionComponent = () => {
63
68
  return () => mediaQuery.removeEventListener('change', handleResize);
64
69
  }, []);
65
70
 
71
+ const handleDockClickOutside = (event: MouseEvent) => {
72
+ if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
73
+ return;
74
+ }
75
+
76
+ const dockedMastheadElement = document.getElementById('docked-masthead');
77
+ const dockedMobileMastheadToggle = document.getElementById('mobile-masthead-toggle');
78
+
79
+ if (
80
+ dockedMastheadElement &&
81
+ !dockedMastheadElement.contains(event.target as Node) &&
82
+ !dockedMobileMastheadToggle?.contains(event.target as Node) &&
83
+ (isDockExpandableExpanded || isDockExpanded)
84
+ ) {
85
+ setIsDockExpandableExpanded(false);
86
+ setIsDockExpanded(false);
87
+ }
88
+ };
89
+
90
+ const handleDockKeydown = (_event: KeyboardEvent) => {
91
+ if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
92
+ return;
93
+ }
94
+
95
+ if (_event.key === 'Escape') {
96
+ setIsDockExpandableExpanded(false);
97
+ setIsDockExpanded(false);
98
+ }
99
+ };
100
+
101
+ useEffect(() => {
102
+ window.addEventListener('click', handleDockClickOutside);
103
+ window.addEventListener('keydown', handleDockKeydown);
104
+
105
+ return () => {
106
+ window.removeEventListener('click', handleDockClickOutside);
107
+ window.removeEventListener('keydown', handleDockKeydown);
108
+ };
109
+ }, [isDockExpandableExpanded, isDockTextExpanded, isDockExpanded, isMobile]);
110
+
66
111
  const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {
67
112
  typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
113
+
114
+ setIsDockExpandableExpanded(false);
115
+ setIsDockTextExpanded(false);
116
+ setIsDockExpanded(false);
68
117
  };
69
118
 
70
119
  const navItem1Ref = useRef<HTMLAnchorElement>(null);
71
120
  const navItem2Ref = useRef<HTMLAnchorElement>(null);
72
121
  const navItem3Ref = useRef<HTMLAnchorElement>(null);
73
122
  const navItem4Ref = useRef<HTMLAnchorElement>(null);
123
+ const navItem5Ref = useRef<HTMLAnchorElement>(null);
124
+ const navItem6Ref = useRef<HTMLAnchorElement>(null);
74
125
  const settingsRef = useRef<HTMLButtonElement>(null);
75
126
  const helpRef = useRef<HTMLButtonElement>(null);
76
127
  const appsRef = useRef<HTMLButtonElement>(null);
@@ -95,7 +146,35 @@ export const CompassDockDemo: React.FunctionComponent = () => {
95
146
  }, 200);
96
147
  }
97
148
  } else {
98
- setIsDockTextExpanded(!isDockTextExpanded);
149
+ const nextDockTextExpanded = !isDockTextExpanded;
150
+ setIsDockTextExpanded(nextDockTextExpanded);
151
+
152
+ if (!nextDockTextExpanded) {
153
+ setIsDockExpandableExpanded(false);
154
+ }
155
+
156
+ if (isDockExpandableExpanded) {
157
+ setIsDockExpandableExpanded(false);
158
+ setIsDockTextExpanded(false);
159
+ }
160
+ }
161
+ };
162
+
163
+ const onToggleNavGroup = (_event: React.MouseEvent<HTMLButtonElement>, isExpanded: boolean) => {
164
+ if (!isDockExpandableExpanded && !isDockTextExpanded && !isDockExpanded) {
165
+ setIsNavGroupExpanded(true);
166
+ } else {
167
+ setIsNavGroupExpanded(isExpanded);
168
+ }
169
+
170
+ if (!isMobile) {
171
+ if (!isDockExpandableExpanded && !isDockTextExpanded) {
172
+ setIsDockExpandableExpanded(true);
173
+ }
174
+
175
+ if (!isDockTextExpanded) {
176
+ setIsDockTextExpanded(false);
177
+ }
99
178
  }
100
179
  };
101
180
 
@@ -201,6 +280,7 @@ export const CompassDockDemo: React.FunctionComponent = () => {
201
280
  isSidebarOpen={isDockExpanded}
202
281
  onSidebarToggle={onMobileToggle}
203
282
  isHamburgerButton
283
+ id="mobile-masthead-toggle"
204
284
  />
205
285
  </MastheadToggle>
206
286
  <MastheadBrand>
@@ -255,12 +335,35 @@ export const CompassDockDemo: React.FunctionComponent = () => {
255
335
  to="#nav-icon-link1"
256
336
  itemId={0}
257
337
  isActive={activeItem === 0}
258
- icon={<CubeIcon />}
338
+ icon={<RhUiCubesIcon />}
259
339
  anchorRef={navItem1Ref}
260
340
  aria-label="System panel"
261
341
  >
262
342
  System panel
263
343
  </NavItem>
344
+ <NavExpandable
345
+ title="Folder"
346
+ groupId={4}
347
+ isExpanded={isNavGroupExpanded}
348
+ icon={<RhUiFolderIcon />}
349
+ hasExpandableIcon={!isMobile}
350
+ buttonProps={{ ref: navItem5Ref, 'aria-label': 'Folder' }}
351
+ onExpand={onToggleNavGroup}
352
+ >
353
+ <NavItem
354
+ preventDefault
355
+ id="expandable3rd-1"
356
+ to="#expandable3rd-1"
357
+ groupId="nav-expand3rd-group-1"
358
+ itemId={5}
359
+ isActive={activeItem === 5}
360
+ icon={<RhUiResourceIcon />}
361
+ anchorRef={navItem6Ref}
362
+ aria-label="Subnav link 1"
363
+ >
364
+ Subnav link 1
365
+ </NavItem>
366
+ </NavExpandable>
264
367
  <NavItem
265
368
  key="nav-icon-link2"
266
369
  preventDefault
@@ -302,12 +405,14 @@ export const CompassDockDemo: React.FunctionComponent = () => {
302
405
  </NavItem>
303
406
  </NavList>
304
407
  </Nav>
305
- {!isDockTextExpanded && !isDockExpanded && (
408
+ {!isDockTextExpanded && !isDockExpanded && !isDockExpandableExpanded && (
306
409
  <>
307
410
  <Tooltip aria="none" aria-live="off" triggerRef={navItem1Ref} content="System panel"></Tooltip>
308
411
  <Tooltip aria="none" aria-live="off" triggerRef={navItem2Ref} content="Policy"></Tooltip>
309
412
  <Tooltip aria="none" aria-live="off" triggerRef={navItem3Ref} content="Authentication"></Tooltip>
310
413
  <Tooltip aria="none" aria-live="off" triggerRef={navItem4Ref} content="Network services"></Tooltip>
414
+ <Tooltip aria="none" aria-live="off" triggerRef={navItem5Ref} content="Folder"></Tooltip>
415
+ <Tooltip aria="none" aria-live="off" triggerRef={navItem6Ref} content="Subnav link 1"></Tooltip>
311
416
  </>
312
417
  )}
313
418
  </ToolbarItem>
@@ -405,6 +510,7 @@ export const CompassDockDemo: React.FunctionComponent = () => {
405
510
  masthead={mobileMasthead}
406
511
  dock={dockContent}
407
512
  isDockExpanded={isDockExpanded}
513
+ isDockExpandableExpanded={isDockExpandableExpanded}
408
514
  isDockTextExpanded={isDockTextExpanded}
409
515
  main={mainContent}
410
516
  backgroundSrcDark="/assets/images/pf-background.svg"
package/src/demos/Nav.md CHANGED
@@ -12,7 +12,6 @@ import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-
12
12
  import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-menu-bars-icon';
13
13
  import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
14
14
  import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
15
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
16
15
  import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
17
16
  import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
18
17
  import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
@@ -21,7 +20,10 @@ import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-micro
21
20
  import pfIconLogo from '@patternfly/react-core/src/demos/assets/PF-IconLogo-color.svg';
22
21
  import { DashboardBreadcrumb } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
23
22
  import { DashboardHeader } from '@patternfly/react-core/dist/js/demos/DashboardHeader';
24
- import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_xl';
23
+ import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
24
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
25
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
26
+ import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
25
27
 
26
28
  ## Demos
27
29
 
@@ -28,17 +28,20 @@ import {
28
28
  ToolbarContent,
29
29
  ToolbarGroup,
30
30
  ToolbarItem,
31
- Tooltip
31
+ Tooltip,
32
+ NavExpandable
32
33
  } from '@patternfly/react-core';
33
34
  import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
34
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
35
35
  import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
36
36
  import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
37
37
  import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
38
38
  import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
39
39
  import RhMicronsSearchIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-search-icon';
40
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
41
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
42
+ import RhUiResourceIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-resource-icon';
40
43
  import pfIconLogo from '@patternfly/react-core/src/demos/assets/PF-IconLogo-color.svg';
41
- import globalBreakpointXl from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_xl';
44
+ import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
42
45
  import { IS_INERT } from '../../../helpers/inert';
43
46
 
44
47
  interface NavOnSelectProps {
@@ -49,12 +52,14 @@ interface NavOnSelectProps {
49
52
 
50
53
  export const NavDockedNav: React.FunctionComponent = () => {
51
54
  const [activeItem, setActiveItem] = useState(1);
55
+ const [isNavGroupExpanded, setIsNavGroupExpanded] = useState(false);
52
56
  const [isDockExpanded, setIsDockExpanded] = useState(false);
53
57
  const [isDockTextExpanded, setIsDockTextExpanded] = useState(false);
58
+ const [isDockExpandableExpanded, setIsDockExpandableExpanded] = useState(false);
54
59
  const [isMobile, setIsMobile] = useState(false);
55
60
 
56
61
  useEffect(() => {
57
- const mobileBreakpoint = Number.parseInt(globalBreakpointXl.value) * 16;
62
+ const mobileBreakpoint = Number.parseInt(globalBreakpointLg.value) * 16;
58
63
  const mediaQuery = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);
59
64
  const handleResize = (e: MediaQueryListEvent | MediaQueryList) => {
60
65
  setIsMobile(e.matches);
@@ -66,8 +71,52 @@ export const NavDockedNav: React.FunctionComponent = () => {
66
71
  return () => mediaQuery.removeEventListener('change', handleResize);
67
72
  }, []);
68
73
 
74
+ const handleDockClickOutside = (event: MouseEvent) => {
75
+ if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
76
+ return;
77
+ }
78
+
79
+ const dockedMastheadElement = document.getElementById('docked-masthead');
80
+ const dockedMobileMastheadToggle = document.getElementById('mobile-masthead-toggle');
81
+
82
+ if (
83
+ dockedMastheadElement &&
84
+ !dockedMastheadElement.contains(event.target as Node) &&
85
+ !dockedMobileMastheadToggle?.contains(event.target as Node) &&
86
+ (isDockExpandableExpanded || isDockExpanded)
87
+ ) {
88
+ setIsDockExpandableExpanded(false);
89
+ setIsDockExpanded(false);
90
+ }
91
+ };
92
+
93
+ const handleDockKeydown = (_event: KeyboardEvent) => {
94
+ if ((!isMobile && !isDockExpandableExpanded) || (isMobile && !isDockExpanded)) {
95
+ return;
96
+ }
97
+
98
+ if (_event.key === 'Escape') {
99
+ setIsDockExpandableExpanded(false);
100
+ setIsDockExpanded(false);
101
+ }
102
+ };
103
+
104
+ useEffect(() => {
105
+ window.addEventListener('click', handleDockClickOutside);
106
+ window.addEventListener('keydown', handleDockKeydown);
107
+
108
+ return () => {
109
+ window.removeEventListener('click', handleDockClickOutside);
110
+ window.removeEventListener('keydown', handleDockKeydown);
111
+ };
112
+ }, [isDockExpandableExpanded, isDockTextExpanded, isDockExpanded, isMobile]);
113
+
69
114
  const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {
70
115
  typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);
116
+
117
+ setIsDockExpandableExpanded(false);
118
+ setIsDockTextExpanded(false);
119
+ setIsDockExpanded(false);
71
120
  };
72
121
 
73
122
  const mobileTextLogo = (
@@ -181,6 +230,8 @@ export const NavDockedNav: React.FunctionComponent = () => {
181
230
  const navItem2Ref = useRef<HTMLAnchorElement>(null);
182
231
  const navItem3Ref = useRef<HTMLAnchorElement>(null);
183
232
  const navItem4Ref = useRef<HTMLAnchorElement>(null);
233
+ const navItem5Ref = useRef<HTMLAnchorElement>(null);
234
+ const navItem6Ref = useRef<HTMLAnchorElement>(null);
184
235
  const appsRef = useRef<HTMLButtonElement>(null);
185
236
  const settingsRef = useRef<HTMLButtonElement>(null);
186
237
  const helpRef = useRef<HTMLButtonElement>(null);
@@ -205,7 +256,35 @@ export const NavDockedNav: React.FunctionComponent = () => {
205
256
  }, 200);
206
257
  }
207
258
  } else {
208
- setIsDockTextExpanded(!isDockTextExpanded);
259
+ const nextDockTextExpanded = !isDockTextExpanded;
260
+ setIsDockTextExpanded(nextDockTextExpanded);
261
+
262
+ if (!nextDockTextExpanded) {
263
+ setIsDockExpandableExpanded(false);
264
+ }
265
+
266
+ if (isDockExpandableExpanded) {
267
+ setIsDockExpandableExpanded(false);
268
+ setIsDockTextExpanded(false);
269
+ }
270
+ }
271
+ };
272
+
273
+ const onToggleNavGroup = (_event: React.MouseEvent<HTMLButtonElement>, isExpanded: boolean) => {
274
+ if (!isDockExpandableExpanded && !isDockTextExpanded && !isDockExpanded) {
275
+ setIsNavGroupExpanded(true);
276
+ } else {
277
+ setIsNavGroupExpanded(isExpanded);
278
+ }
279
+
280
+ if (!isMobile) {
281
+ if (!isDockExpandableExpanded && !isDockTextExpanded) {
282
+ setIsDockExpandableExpanded(true);
283
+ }
284
+
285
+ if (!isDockTextExpanded) {
286
+ setIsDockTextExpanded(false);
287
+ }
209
288
  }
210
289
  };
211
290
 
@@ -221,6 +300,7 @@ export const NavDockedNav: React.FunctionComponent = () => {
221
300
  isSidebarOpen={isDockExpanded}
222
301
  onSidebarToggle={onMobileToggle}
223
302
  isHamburgerButton
303
+ id="mobile-masthead-toggle"
224
304
  />
225
305
  </MastheadToggle>
226
306
  <MastheadBrand>
@@ -278,12 +358,35 @@ export const NavDockedNav: React.FunctionComponent = () => {
278
358
  to="#nav-link1"
279
359
  itemId={0}
280
360
  isActive={activeItem === 0}
281
- icon={<CubeIcon />}
361
+ icon={<RhUiCubesIcon />}
282
362
  anchorRef={navItem1Ref}
283
363
  aria-label="System panel"
284
364
  >
285
365
  System panel
286
366
  </NavItem>
367
+ <NavExpandable
368
+ title="Folder"
369
+ groupId="nav-expandable-group-1"
370
+ isExpanded={isNavGroupExpanded}
371
+ icon={<RhUiFolderIcon />}
372
+ hasExpandableIcon={!isMobile}
373
+ buttonProps={{ ref: navItem5Ref, 'aria-label': 'Folder' }}
374
+ onExpand={onToggleNavGroup}
375
+ >
376
+ <NavItem
377
+ preventDefault
378
+ id="nav-expandable-item-1"
379
+ to="#nav-expandable-item-1"
380
+ groupId="nav-expandable-group-1"
381
+ itemId={5}
382
+ isActive={activeItem === 5}
383
+ icon={<RhUiResourceIcon />}
384
+ anchorRef={navItem6Ref}
385
+ aria-label="Subnav link 1"
386
+ >
387
+ Subnav link 1
388
+ </NavItem>
389
+ </NavExpandable>
287
390
  <NavItem
288
391
  preventDefault
289
392
  id="nav-link2"
@@ -322,12 +425,14 @@ export const NavDockedNav: React.FunctionComponent = () => {
322
425
  </NavItem>
323
426
  </NavList>
324
427
  </Nav>
325
- {!isDockTextExpanded && !isDockExpanded && (
428
+ {!isDockTextExpanded && !isDockExpanded && !isDockExpandableExpanded && (
326
429
  <>
327
430
  <Tooltip aria="none" aria-live="off" triggerRef={navItem1Ref} content="System panel"></Tooltip>
328
431
  <Tooltip aria="none" aria-live="off" triggerRef={navItem2Ref} content="Policy"></Tooltip>
329
432
  <Tooltip aria="none" aria-live="off" triggerRef={navItem3Ref} content="Authentication"></Tooltip>
330
433
  <Tooltip aria="none" aria-live="off" triggerRef={navItem4Ref} content="Network services"></Tooltip>
434
+ <Tooltip aria="none" aria-live="off" triggerRef={navItem5Ref} content="Folder"></Tooltip>
435
+ <Tooltip aria="none" aria-live="off" triggerRef={navItem6Ref} content="Subnav link 1"></Tooltip>
331
436
  </>
332
437
  )}
333
438
  </ToolbarItem>
@@ -428,6 +533,7 @@ export const NavDockedNav: React.FunctionComponent = () => {
428
533
  <Page
429
534
  variant="docked"
430
535
  isDockExpanded={isDockExpanded}
536
+ isDockExpandableExpanded={isDockExpandableExpanded}
431
537
  isDockTextExpanded={isDockTextExpanded}
432
538
  masthead={mobileMasthead}
433
539
  dockContent={dockedMasthead}
@@ -14,3 +14,4 @@ export * from './KeyboardHandler';
14
14
  export * from './resizeObserver';
15
15
  export * from './useInterval';
16
16
  export * from './datetimeUtils';
17
+ export * from './inert';
@@ -8,9 +8,7 @@ exports[`Flex Nested flex 1`] = `
8
8
  <div
9
9
  class="pf-v6-l-flex"
10
10
  >
11
- <div
12
- class=""
13
- >
11
+ <div>
14
12
  Test
15
13
  </div>
16
14
  </div>
@@ -23,9 +21,7 @@ exports[`Flex Simple flex with single item 1`] = `
23
21
  <div
24
22
  class="pf-v6-l-flex"
25
23
  >
26
- <div
27
- class=""
28
- >
24
+ <div>
29
25
  Test
30
26
  </div>
31
27
  </div>
@@ -37,9 +33,7 @@ exports[`Flex alternative component 1`] = `
37
33
  <ul
38
34
  class="pf-v6-l-flex"
39
35
  >
40
- <li
41
- class=""
42
- >
36
+ <li>
43
37
  Test
44
38
  </li>
45
39
  </ul>