@patternfly/react-core 6.6.1-prerelease.5 → 6.6.1-prerelease.7

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 (175) hide show
  1. package/CHANGELOG.md +10 -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 +1 -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 +2 -0
  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/helpers/index.d.ts +1 -0
  135. package/dist/esm/helpers/index.d.ts.map +1 -1
  136. package/dist/esm/helpers/index.js +1 -0
  137. package/dist/esm/helpers/index.js.map +1 -1
  138. package/dist/js/components/Compass/Compass.d.ts +2 -0
  139. package/dist/js/components/Compass/Compass.d.ts.map +1 -1
  140. package/dist/js/components/Compass/Compass.js +2 -2
  141. package/dist/js/components/Compass/Compass.js.map +1 -1
  142. package/dist/js/components/Nav/NavExpandable.d.ts +2 -0
  143. package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
  144. package/dist/js/components/Nav/NavExpandable.js +6 -4
  145. package/dist/js/components/Nav/NavExpandable.js.map +1 -1
  146. package/dist/js/components/Page/Page.d.ts +2 -0
  147. package/dist/js/components/Page/Page.d.ts.map +1 -1
  148. package/dist/js/components/Page/Page.js +4 -3
  149. package/dist/js/components/Page/Page.js.map +1 -1
  150. package/dist/js/helpers/index.d.ts +1 -0
  151. package/dist/js/helpers/index.d.ts.map +1 -1
  152. package/dist/js/helpers/index.js +1 -0
  153. package/dist/js/helpers/index.js.map +1 -1
  154. package/dist/umd/assets/{output-J0Cx1pi_.css → output-BGwwN1RO.css} +18944 -18944
  155. package/dist/umd/react-core.min.js +3 -3
  156. package/helpers/package.json +1 -1
  157. package/layouts/package.json +1 -1
  158. package/next/package.json +1 -1
  159. package/package.json +3 -3
  160. package/src/components/Compass/Compass.tsx +4 -0
  161. package/src/components/Compass/__tests__/Compass.test.tsx +15 -0
  162. package/src/components/Nav/NavExpandable.tsx +12 -2
  163. package/src/components/Nav/__tests__/Generated/__snapshots__/NavExpandable.test.tsx.snap +5 -1
  164. package/src/components/Nav/__tests__/NavExpandable.test.tsx +21 -0
  165. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +15 -3
  166. package/src/components/Nav/examples/Nav.md +17 -4
  167. package/src/components/Nav/examples/NavDocked.tsx +98 -0
  168. package/src/components/Nav/examples/NavIcons.tsx +8 -8
  169. package/src/components/Page/Page.tsx +5 -0
  170. package/src/components/Page/__tests__/Page.test.tsx +20 -0
  171. package/src/demos/Compass/Compass.md +3 -1
  172. package/src/demos/Compass/examples/CompassDockDemo.tsx +111 -5
  173. package/src/demos/Nav.md +4 -2
  174. package/src/demos/examples/Nav/NavDockedNav.tsx +113 -7
  175. package/src/helpers/index.ts +1 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.6.1-prerelease.4","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.6.1-prerelease.6","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.6.1-prerelease.4","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.6.1-prerelease.6","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.6.1-prerelease.4","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.6.1-prerelease.6","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.6.1-prerelease.5",
3
+ "version": "6.6.1-prerelease.7",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -46,7 +46,7 @@
46
46
  "subpaths": "node ../../scripts/exportSubpaths.mjs --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.6.1-prerelease.1",
49
+ "@patternfly/react-icons": "^6.6.1-prerelease.2",
50
50
  "@patternfly/react-styles": "^6.6.1-prerelease.1",
51
51
  "@patternfly/react-tokens": "^6.6.1-prerelease.1",
52
52
  "focus-trap": "7.6.6",
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "a01cd6377b953ae8f01eb2dc632311a2373dfeac"
66
+ "gitHead": "a2d7f2396e73fb6f9e599dcfcaba23c6fb0d042d"
67
67
  }
@@ -12,6 +12,8 @@ export interface CompassProps extends React.HTMLProps<HTMLDivElement> {
12
12
  dock?: React.ReactNode;
13
13
  /** @beta Flag indicating the docked nav is expanded on mobile. Only applies when dock content is passed. */
14
14
  isDockExpanded?: boolean;
15
+ /** @beta Flag indicating a docked nav is expanded as an overlay, triggered by expandable nav children. Only applies when dock content is passed. */
16
+ isDockExpandableExpanded?: boolean;
15
17
  /** @beta Flag indicating the docked nav should display text on desktop. Only applies when dock content is passed, and
16
18
  * will handle toggling the visibility of the text in individual isDocked components.
17
19
  */
@@ -45,6 +47,7 @@ export const Compass: React.FunctionComponent<CompassProps> = ({
45
47
  masthead,
46
48
  dock,
47
49
  isDockExpanded,
50
+ isDockExpandableExpanded,
48
51
  isDockTextExpanded,
49
52
  header,
50
53
  isHeaderExpanded = true,
@@ -69,6 +72,7 @@ export const Compass: React.FunctionComponent<CompassProps> = ({
69
72
  className={css(
70
73
  `${styles.compass}__dock`,
71
74
  isDockExpanded && styles.modifiers.expanded,
75
+ isDockExpandableExpanded && styles.modifiers.expandableExpanded,
72
76
  isDockTextExpanded && styles.modifiers.textExpanded
73
77
  )}
74
78
  >
@@ -94,6 +94,21 @@ test('Renders footer without expanded class and with inert when isFooterExpanded
94
94
  expect(footerElement).toHaveAttribute('inert');
95
95
  });
96
96
 
97
+ test(`Renders with ${styles.modifiers.expandableExpanded} class when isDockExpandableExpanded is true`, () => {
98
+ render(<Compass dock={<div>Dock content</div>} isDockExpandableExpanded />);
99
+ expect(screen.getByText('Dock content').parentElement).toHaveClass(styles.modifiers.expandableExpanded);
100
+ });
101
+
102
+ test(`Does not render with ${styles.modifiers.expandableExpanded} class when isDockExpandableExpanded is false`, () => {
103
+ render(<Compass dock={<div>Dock content</div>} isDockExpandableExpanded={false} />);
104
+ expect(screen.getByText('Dock content').parentElement).not.toHaveClass(styles.modifiers.expandableExpanded);
105
+ });
106
+
107
+ test(`Does not render with ${styles.modifiers.expandableExpanded} class by default`, () => {
108
+ render(<Compass dock={<div>Dock content</div>} />);
109
+ expect(screen.getByText('Dock content').parentElement).not.toHaveClass(styles.modifiers.expandableExpanded);
110
+ });
111
+
97
112
  test('Renders with drawer when drawerContent is provided', () => {
98
113
  render(<Compass drawerContent={<div>Drawer content</div>} />);
99
114
  expect(screen.getByText('Drawer content')).toBeVisible();
@@ -8,6 +8,7 @@ import { PickOptional } from '../../helpers/typeUtils';
8
8
  import { getOUIAProps, OUIAProps } from '../../helpers';
9
9
  import { SSRSafeIds } from '../../helpers/SSRSafeIds/SSRSafeIds';
10
10
  import { IS_INERT } from '../../helpers/inert';
11
+ import RhUiEllipsisHorizontalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-horizontal-fill-icon';
11
12
 
12
13
  export interface NavExpandableProps
13
14
  extends Omit<React.DetailedHTMLProps<React.LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, 'title'>, OUIAProps {
@@ -17,6 +18,8 @@ export interface NavExpandableProps
17
18
  srText?: string;
18
19
  /** Boolean to pragmatically expand or collapse section */
19
20
  isExpanded?: boolean;
21
+ /** Adds an expandable icon to indicate the section is expandable */
22
+ hasExpandableIcon?: boolean;
20
23
  /** Anything that can be rendered inside of the expandable list */
21
24
  children?: React.ReactNode;
22
25
  /** Additional classes added to the container */
@@ -50,7 +53,8 @@ class NavExpandable extends Component<NavExpandableProps, NavExpandableState> {
50
53
  className: '',
51
54
  groupId: null as string,
52
55
  isActive: false,
53
- id: ''
56
+ id: '',
57
+ hasExpandableIcon: false
54
58
  };
55
59
 
56
60
  state = {
@@ -100,6 +104,7 @@ class NavExpandable extends Component<NavExpandableProps, NavExpandableState> {
100
104
  id,
101
105
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
102
106
  isExpanded,
107
+ hasExpandableIcon,
103
108
  buttonProps,
104
109
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
105
110
  onExpand,
@@ -137,7 +142,12 @@ class NavExpandable extends Component<NavExpandableProps, NavExpandableState> {
137
142
  {...buttonProps}
138
143
  >
139
144
  {icon && <span className={css(styles.navLinkIcon)}>{icon}</span>}
140
- {typeof title !== 'string' ? <span className={css(styles.navLinkText)}>{title}</span> : title}
145
+ {hasExpandableIcon && (
146
+ <span className={css(styles.navLinkExpandableIcon)}>
147
+ <RhUiEllipsisHorizontalFillIcon />
148
+ </span>
149
+ )}
150
+ <span className={css(styles.navLinkText)}>{title}</span>
141
151
  <span className={css(styles.navToggle)}>
142
152
  <span className={css(styles.navToggleIcon)}>
143
153
  <RhMicronsCaretDownIcon />
@@ -12,7 +12,11 @@ exports[`NavExpandable should match snapshot (auto-generated) 1`] = `
12
12
  aria-expanded="false"
13
13
  class="pf-v6-c-nav__link"
14
14
  >
15
- string
15
+ <span
16
+ class="pf-v6-c-nav__link-text"
17
+ >
18
+ string
19
+ </span>
16
20
  <span
17
21
  class="pf-v6-c-nav__toggle"
18
22
  >
@@ -30,3 +30,24 @@ test('Does not render nav link icon wrapper when icon prop is not provided', ()
30
30
  const button = screen.getByRole('button', { name: 'NavExpandable' });
31
31
  expect(button.querySelector('.pf-v6-c-nav__link-icon')).not.toBeInTheDocument();
32
32
  });
33
+
34
+ test(`Renders with expandable icon when hasExpandableIcon is true`, () => {
35
+ render(<NavExpandable id="grp-1" title="NavExpandable" hasExpandableIcon={true}></NavExpandable>);
36
+
37
+ const button = screen.getByRole('button', { name: 'NavExpandable' });
38
+ expect(button.querySelector('.pf-v6-c-nav__link-expandable-icon')).toBeInTheDocument();
39
+ });
40
+
41
+ test(`Does not render expandable icon when hasExpandableIcon is false`, () => {
42
+ render(<NavExpandable id="grp-1" title="NavExpandable" hasExpandableIcon={false}></NavExpandable>);
43
+
44
+ const button = screen.getByRole('button', { name: 'NavExpandable' });
45
+ expect(button.querySelector('.pf-v6-c-nav__link-expandable-icon')).not.toBeInTheDocument();
46
+ });
47
+
48
+ test(`Does not render expandable icon by default`, () => {
49
+ render(<NavExpandable id="grp-1" title="NavExpandable"></NavExpandable>);
50
+
51
+ const button = screen.getByRole('button', { name: 'NavExpandable' });
52
+ expect(button.querySelector('.pf-v6-c-nav__link-expandable-icon')).not.toBeInTheDocument();
53
+ });
@@ -196,7 +196,11 @@ exports[`Nav Expandable Nav List - Trigger toggle 1`] = `
196
196
  class="pf-v6-c-nav__link"
197
197
  id="grp-1"
198
198
  >
199
- Section 1
199
+ <span
200
+ class="pf-v6-c-nav__link-text"
201
+ >
202
+ Section 1
203
+ </span>
200
204
  <span
201
205
  class="pf-v6-c-nav__toggle"
202
206
  >
@@ -329,7 +333,11 @@ exports[`Nav Expandable Nav List 1`] = `
329
333
  class="pf-v6-c-nav__link"
330
334
  id="grp-1"
331
335
  >
332
- Section 1
336
+ <span
337
+ class="pf-v6-c-nav__link-text"
338
+ >
339
+ Section 1
340
+ </span>
333
341
  <span
334
342
  class="pf-v6-c-nav__toggle"
335
343
  >
@@ -461,7 +469,11 @@ exports[`Nav Expandable Nav List with aria label 1`] = `
461
469
  aria-expanded="false"
462
470
  class="pf-v6-c-nav__link"
463
471
  >
464
- Section 1
472
+ <span
473
+ class="pf-v6-c-nav__link-text"
474
+ >
475
+ Section 1
476
+ </span>
465
477
  <span
466
478
  class="pf-v6-c-nav__toggle"
467
479
  >
@@ -9,11 +9,12 @@ ouia: true
9
9
  import { useState } from 'react';
10
10
  import './nav.css';
11
11
  import RhMicronsCaretRightIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-caret-right-icon';
12
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
13
- import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
14
- import RhUiFolderOpenFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-open-fill-icon';
15
- import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
12
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
13
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
14
+ import RhUiFolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-open-icon';
15
+ import RhUiCloudIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-icon';
16
16
  import RhUiLinkIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-link-icon';
17
+ import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
17
18
 
18
19
  ## Examples
19
20
 
@@ -81,6 +82,18 @@ A flyout should be a `Menu` component. Press `space` or `right arrow` to open a
81
82
 
82
83
  ```
83
84
 
85
+ ### Docked
86
+
87
+ The docked variant of `Navigation` displays only icons passed to child `NavItems` or `NavExpandable`. Text becomes visible when `isDockTextExpanded` or `isDockExpandableExpanded` are applied to an outer page or compass dock.
88
+
89
+ `NavExpandable` items should include the `hasExpandableIcon` prop to indicate their expandable nature while in the collapsed state of the docked nav as the caret will not be rendered.
90
+
91
+ See the [docked nav demo](/components/navigation/react-demos#docked-nav) for a fully functional example.
92
+
93
+ ```ts file="./NavDocked.tsx"
94
+
95
+ ```
96
+
84
97
  ## Types
85
98
 
86
99
  ### NavSelectClickHandler
@@ -0,0 +1,98 @@
1
+ import { useState } from 'react';
2
+ import { Nav, NavItem, NavList, NavExpandable } from '@patternfly/react-core';
3
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
4
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
5
+ import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
6
+ import RhUiCloudIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-icon';
7
+
8
+ export const NavDocked: React.FunctionComponent = () => {
9
+ const [activeItem, setActiveItem] = useState(0);
10
+ const [isGroupExpanded, setIsGroupExpanded] = useState(false);
11
+
12
+ const onSelect = (_event: React.FormEvent<HTMLInputElement>, result: { itemId: number | string }) => {
13
+ setActiveItem(result.itemId as number);
14
+ };
15
+
16
+ const onToggle = (
17
+ _event: React.MouseEvent<HTMLButtonElement>,
18
+ result: { groupId: number | string; isExpanded: boolean }
19
+ ) => {
20
+ setIsGroupExpanded(result.isExpanded);
21
+ };
22
+
23
+ return (
24
+ <Nav variant="docked" onSelect={onSelect} onToggle={onToggle} aria-label="Default global" ouiaId="DefaultNav">
25
+ <NavList>
26
+ <NavItem
27
+ icon={<RhUiCubesIcon />}
28
+ preventDefault
29
+ id="nav-default-link1"
30
+ to="#nav-default-link1"
31
+ itemId={0}
32
+ isActive={activeItem === 0}
33
+ >
34
+ Default Link 1
35
+ </NavItem>
36
+ <NavItem
37
+ icon={<RhUiCloudIcon />}
38
+ preventDefault
39
+ id="nav-default-link2"
40
+ to="#nav-default-link2"
41
+ itemId={1}
42
+ isActive={activeItem === 1}
43
+ >
44
+ Default Link 2
45
+ </NavItem>
46
+ <NavItem
47
+ icon={<RhUiCodeIcon />}
48
+ preventDefault
49
+ id="nav-default-link3"
50
+ to="#nav-default-link3"
51
+ itemId={2}
52
+ isActive={activeItem === 2}
53
+ >
54
+ Default Link 3
55
+ </NavItem>
56
+ <NavExpandable
57
+ title="Expandable Group 1"
58
+ groupId="nav-expandable-group-1"
59
+ icon={<RhUiFolderIcon />}
60
+ isExpanded={isGroupExpanded}
61
+ hasExpandableIcon
62
+ buttonProps={{ 'aria-label': 'Expandable Group 1' }}
63
+ >
64
+ <NavItem
65
+ preventDefault
66
+ id="expandable-1"
67
+ to="#expandable-1"
68
+ groupId="nav-expandable-group-1"
69
+ itemId={3}
70
+ isActive={activeItem === 3}
71
+ >
72
+ Subnav 1 Link 1
73
+ </NavItem>
74
+ <NavItem
75
+ preventDefault
76
+ id="expandable-2"
77
+ to="#expandable-2"
78
+ groupId="nav-expandable-group-1"
79
+ itemId={4}
80
+ isActive={activeItem === 4}
81
+ >
82
+ Subnav 1 Link 2
83
+ </NavItem>
84
+ <NavItem
85
+ preventDefault
86
+ id="expandable-3"
87
+ to="#expandable-3"
88
+ groupId="nav-expandable-group-1"
89
+ itemId={5}
90
+ isActive={activeItem === 5}
91
+ >
92
+ Subnav 1 Link 3
93
+ </NavItem>
94
+ </NavExpandable>
95
+ </NavList>
96
+ </Nav>
97
+ );
98
+ };
@@ -1,9 +1,9 @@
1
1
  import { useState } from 'react';
2
2
  import { Nav, NavExpandable, NavItem, NavList } from '@patternfly/react-core';
3
- import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
4
- import RhUiFolderFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-fill-icon';
5
- import RhUiFolderOpenFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-open-fill-icon';
6
- import RhUiCloudFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-fill-icon';
3
+ import RhUiCubesIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cubes-icon';
4
+ import RhUiFolderIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-icon';
5
+ import RhUiFolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-folder-open-icon';
6
+ import RhUiCloudIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-cloud-icon';
7
7
  import RhUiLinkIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-link-icon';
8
8
 
9
9
  export const NavIcons: React.FunctionComponent = () => {
@@ -22,7 +22,7 @@ export const NavIcons: React.FunctionComponent = () => {
22
22
  to="#nav-icon-link1"
23
23
  itemId={0}
24
24
  isActive={activeItem === 0}
25
- icon={<CubeIcon />}
25
+ icon={<RhUiCubesIcon />}
26
26
  >
27
27
  Link 1
28
28
  </NavItem>
@@ -32,7 +32,7 @@ export const NavIcons: React.FunctionComponent = () => {
32
32
  to="#nav-icon-link2"
33
33
  itemId={1}
34
34
  isActive={activeItem === 1}
35
- icon={<RhUiFolderFillIcon />}
35
+ icon={<RhUiFolderIcon />}
36
36
  >
37
37
  Link 2
38
38
  </NavItem>
@@ -42,7 +42,7 @@ export const NavIcons: React.FunctionComponent = () => {
42
42
  to="#nav-icon-link3"
43
43
  itemId={2}
44
44
  isActive={activeItem === 2}
45
- icon={<RhUiCloudFillIcon />}
45
+ icon={<RhUiCloudIcon />}
46
46
  >
47
47
  Link 3
48
48
  </NavItem>
@@ -56,7 +56,7 @@ export const NavIcons: React.FunctionComponent = () => {
56
56
  >
57
57
  Link 4
58
58
  </NavItem>
59
- <NavExpandable title="Expandable" icon={<RhUiFolderOpenFillIcon />} groupId="nav-icon-expandable">
59
+ <NavExpandable title="Expandable" icon={<RhUiFolderOpenIcon />} groupId="nav-icon-expandable">
60
60
  <NavItem
61
61
  preventDefault
62
62
  id="nav-icon-expandable-link1"
@@ -24,6 +24,8 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
24
24
  variant?: 'default' | 'docked';
25
25
  /** @beta Flag indicating the docked nav is expanded on mobile. Only applies when variant is docked. */
26
26
  isDockExpanded?: boolean;
27
+ /** @beta Flag indicating a docked nav is expanded as an overlay, triggered by expandable nav children. Only applies when dock content is passed. */
28
+ isDockExpandableExpanded?: boolean;
27
29
  /** @beta Flag indicating the docked nav should display text on desktop. Only applies when variant is docked, and
28
30
  * will handle toggling the visibility of the text in individual isDocked components.
29
31
  */
@@ -134,6 +136,7 @@ class Page extends Component<PageProps, PageState> {
134
136
  defaultManagedSidebarIsOpen: true,
135
137
  mainTabIndex: -1,
136
138
  isNotificationDrawerExpanded: false,
139
+ isDockExpandableExpanded: false,
137
140
  onNotificationDrawerExpand: () => null,
138
141
  mainComponent: 'main',
139
142
  getBreakpoint,
@@ -248,6 +251,7 @@ class Page extends Component<PageProps, PageState> {
248
251
  variant,
249
252
  isDockExpanded = false,
250
253
  isDockTextExpanded = false,
254
+ isDockExpandableExpanded = false,
251
255
  masthead,
252
256
  dockContent,
253
257
  sidebar,
@@ -374,6 +378,7 @@ class Page extends Component<PageProps, PageState> {
374
378
  className={css(
375
379
  styles.pageDock,
376
380
  isDockExpanded && styles.modifiers.expanded,
381
+ isDockExpandableExpanded && styles.modifiers.expandableExpanded,
377
382
  isDockTextExpanded && styles.modifiers.textExpanded
378
383
  )}
379
384
  >
@@ -482,6 +482,26 @@ describe('Page docked variant', () => {
482
482
  expect(pageDock).toHaveClass(styles.modifiers.textExpanded);
483
483
  });
484
484
 
485
+ test(`Does not render with ${styles.modifiers.expandableExpanded} when by default and variant is docked`, () => {
486
+ render(<Page variant="docked" dockContent={<>Dock content</>} masthead={<>Masthead</>} data-testid="page"></Page>);
487
+ const pageDock = screen.getByText('Dock content').closest(`.${styles.pageDock}`);
488
+ expect(pageDock).not.toHaveClass(styles.modifiers.expandableExpanded);
489
+ });
490
+
491
+ test(`Renders with ${styles.modifiers.expandableExpanded} when isDockExpandableExpanded is true and variant is docked`, () => {
492
+ render(
493
+ <Page
494
+ variant="docked"
495
+ isDockExpandableExpanded
496
+ dockContent={<>Dock content</>}
497
+ masthead={<>Masthead</>}
498
+ data-testid="page"
499
+ ></Page>
500
+ );
501
+ const pageDock = screen.getByText('Dock content').closest(`.${styles.pageDock}`);
502
+ expect(pageDock).toHaveClass(styles.modifiers.expandableExpanded);
503
+ });
504
+
485
505
  test(`Renders with ${styles.pageDockMain} wrapper when variant is docked`, () => {
486
506
  render(<Page variant="docked" dockContent={<>Dock content</>} masthead={<>Masthead</>} data-testid="page"></Page>);
487
507
 
@@ -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