@patternfly/react-core 6.5.0-prerelease.62 → 6.5.0-prerelease.64

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 (223) hide show
  1. package/CHANGELOG.md +14 -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/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/useSSRSafeId/package.json +1 -1
  110. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  111. package/dist/dynamic/helpers/util/package.json +1 -1
  112. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  113. package/dist/dynamic/layouts/Flex/package.json +1 -1
  114. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  115. package/dist/dynamic/layouts/Grid/package.json +1 -1
  116. package/dist/dynamic/layouts/Level/package.json +1 -1
  117. package/dist/dynamic/layouts/Split/package.json +1 -1
  118. package/dist/dynamic/layouts/Stack/package.json +1 -1
  119. package/dist/dynamic/styles/package.json +1 -1
  120. package/dist/dynamic-modules.json +2 -0
  121. package/dist/esm/components/Compass/Compass.d.ts +9 -1
  122. package/dist/esm/components/Compass/Compass.d.ts.map +1 -1
  123. package/dist/esm/components/Compass/Compass.js +2 -2
  124. package/dist/esm/components/Compass/Compass.js.map +1 -1
  125. package/dist/esm/components/Compass/CompassDockMain.d.ts +9 -0
  126. package/dist/esm/components/Compass/CompassDockMain.d.ts.map +1 -0
  127. package/dist/esm/components/Compass/CompassDockMain.js +10 -0
  128. package/dist/esm/components/Compass/CompassDockMain.js.map +1 -0
  129. package/dist/esm/components/Compass/index.d.ts +1 -0
  130. package/dist/esm/components/Compass/index.d.ts.map +1 -1
  131. package/dist/esm/components/Compass/index.js +1 -0
  132. package/dist/esm/components/Compass/index.js.map +1 -1
  133. package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts +7 -1
  134. package/dist/esm/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
  135. package/dist/esm/components/OverflowMenu/OverflowMenu.js +33 -3
  136. package/dist/esm/components/OverflowMenu/OverflowMenu.js.map +1 -1
  137. package/dist/esm/components/Page/Page.d.ts +3 -3
  138. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  139. package/dist/esm/components/Toolbar/Toolbar.d.ts +5 -1
  140. package/dist/esm/components/Toolbar/Toolbar.d.ts.map +1 -1
  141. package/dist/esm/components/Toolbar/Toolbar.js +2 -2
  142. package/dist/esm/components/Toolbar/Toolbar.js.map +1 -1
  143. package/dist/esm/components/Toolbar/ToolbarContent.d.ts +9 -1
  144. package/dist/esm/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  145. package/dist/esm/components/Toolbar/ToolbarContent.js +2 -2
  146. package/dist/esm/components/Toolbar/ToolbarContent.js.map +1 -1
  147. package/dist/esm/components/Toolbar/ToolbarGroup.d.ts +9 -1
  148. package/dist/esm/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
  149. package/dist/esm/components/Toolbar/ToolbarGroup.js +3 -3
  150. package/dist/esm/components/Toolbar/ToolbarGroup.js.map +1 -1
  151. package/dist/esm/components/Toolbar/ToolbarItem.d.ts +9 -1
  152. package/dist/esm/components/Toolbar/ToolbarItem.d.ts.map +1 -1
  153. package/dist/esm/components/Toolbar/ToolbarItem.js +2 -2
  154. package/dist/esm/components/Toolbar/ToolbarItem.js.map +1 -1
  155. package/dist/js/components/Compass/Compass.d.ts +9 -1
  156. package/dist/js/components/Compass/Compass.d.ts.map +1 -1
  157. package/dist/js/components/Compass/Compass.js +2 -2
  158. package/dist/js/components/Compass/Compass.js.map +1 -1
  159. package/dist/js/components/Compass/CompassDockMain.d.ts +9 -0
  160. package/dist/js/components/Compass/CompassDockMain.d.ts.map +1 -0
  161. package/dist/js/components/Compass/CompassDockMain.js +14 -0
  162. package/dist/js/components/Compass/CompassDockMain.js.map +1 -0
  163. package/dist/js/components/Compass/index.d.ts +1 -0
  164. package/dist/js/components/Compass/index.d.ts.map +1 -1
  165. package/dist/js/components/Compass/index.js +1 -0
  166. package/dist/js/components/Compass/index.js.map +1 -1
  167. package/dist/js/components/OverflowMenu/OverflowMenu.d.ts +7 -1
  168. package/dist/js/components/OverflowMenu/OverflowMenu.d.ts.map +1 -1
  169. package/dist/js/components/OverflowMenu/OverflowMenu.js +32 -2
  170. package/dist/js/components/OverflowMenu/OverflowMenu.js.map +1 -1
  171. package/dist/js/components/Page/Page.d.ts +3 -3
  172. package/dist/js/components/Page/Page.d.ts.map +1 -1
  173. package/dist/js/components/Toolbar/Toolbar.d.ts +5 -1
  174. package/dist/js/components/Toolbar/Toolbar.d.ts.map +1 -1
  175. package/dist/js/components/Toolbar/Toolbar.js +2 -2
  176. package/dist/js/components/Toolbar/Toolbar.js.map +1 -1
  177. package/dist/js/components/Toolbar/ToolbarContent.d.ts +9 -1
  178. package/dist/js/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  179. package/dist/js/components/Toolbar/ToolbarContent.js +2 -2
  180. package/dist/js/components/Toolbar/ToolbarContent.js.map +1 -1
  181. package/dist/js/components/Toolbar/ToolbarGroup.d.ts +9 -1
  182. package/dist/js/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
  183. package/dist/js/components/Toolbar/ToolbarGroup.js +3 -3
  184. package/dist/js/components/Toolbar/ToolbarGroup.js.map +1 -1
  185. package/dist/js/components/Toolbar/ToolbarItem.d.ts +9 -1
  186. package/dist/js/components/Toolbar/ToolbarItem.d.ts.map +1 -1
  187. package/dist/js/components/Toolbar/ToolbarItem.js +2 -2
  188. package/dist/js/components/Toolbar/ToolbarItem.js.map +1 -1
  189. package/dist/umd/assets/{output-C2ilqqsl.css → output-BwoQb44a.css} +22943 -22734
  190. package/dist/umd/react-core.min.js +1 -1
  191. package/helpers/package.json +1 -1
  192. package/layouts/package.json +1 -1
  193. package/next/package.json +1 -1
  194. package/package.json +6 -6
  195. package/src/components/Compass/Compass.tsx +24 -2
  196. package/src/components/Compass/CompassDockMain.tsx +21 -0
  197. package/src/components/Compass/__tests__/Compass.test.tsx +30 -0
  198. package/src/components/Compass/__tests__/CompassDockMain.test.tsx +41 -0
  199. package/src/components/Compass/__tests__/__snapshots__/CompassDockMain.test.tsx.snap +13 -0
  200. package/src/components/Compass/index.ts +1 -0
  201. package/src/components/EmptyState/__tests__/EmptyState.test.tsx +2 -2
  202. package/src/components/EmptyState/__tests__/__snapshots__/EmptyState.test.tsx.snap +2 -2
  203. package/src/components/MenuToggle/__tests__/__snapshots__/MenuToggle.test.tsx.snap +1 -1
  204. package/src/components/OverflowMenu/OverflowMenu.tsx +42 -4
  205. package/src/components/OverflowMenu/__tests__/OverflowMenu.test.tsx +18 -0
  206. package/src/components/OverflowMenu/examples/OverflowMenu.md +17 -1
  207. package/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainerHeight.tsx +109 -0
  208. package/src/components/OverflowMenu/examples/OverflowMenuSimpleVertical.tsx +76 -0
  209. package/src/components/Page/Page.tsx +3 -3
  210. package/src/components/Toolbar/Toolbar.tsx +9 -1
  211. package/src/components/Toolbar/ToolbarContent.tsx +12 -2
  212. package/src/components/Toolbar/ToolbarGroup.tsx +12 -2
  213. package/src/components/Toolbar/ToolbarItem.tsx +12 -2
  214. package/src/components/Toolbar/__tests__/Toolbar.test.tsx +63 -2
  215. package/src/components/Toolbar/__tests__/ToolbarGroup.test.tsx +26 -0
  216. package/src/components/Toolbar/__tests__/ToolbarItem.test.tsx +26 -0
  217. package/src/components/Toolbar/examples/Toolbar.md +19 -1
  218. package/src/components/Toolbar/examples/ToolbarDynamicSticky.tsx +75 -0
  219. package/src/components/Toolbar/examples/ToolbarVertical.tsx +22 -0
  220. package/src/demos/Compass/Compass.md +4 -1
  221. package/src/demos/Compass/examples/CompassDockDemo.tsx +311 -130
  222. package/src/demos/Nav.md +2 -1
  223. package/src/demos/examples/Nav/NavDockedNav.tsx +32 -10
@@ -8,7 +8,7 @@ import { PageContext } from '../Page/PageContext';
8
8
  export interface ToolbarContentProps extends React.HTMLProps<HTMLDivElement> {
9
9
  /** Classes applied to root element of the data toolbar content row */
10
10
  className?: string;
11
- /** Visibility at various breakpoints. */
11
+ /** Visibility at various width breakpoints. */
12
12
  visibility?: {
13
13
  default?: 'hidden' | 'visible';
14
14
  md?: 'hidden' | 'visible';
@@ -16,6 +16,14 @@ export interface ToolbarContentProps extends React.HTMLProps<HTMLDivElement> {
16
16
  xl?: 'hidden' | 'visible';
17
17
  '2xl'?: 'hidden' | 'visible';
18
18
  };
19
+ /** Visibility at various height breakpoints. */
20
+ visibilityAtHeight?: {
21
+ default?: 'hidden' | 'visible';
22
+ md?: 'hidden' | 'visible';
23
+ lg?: 'hidden' | 'visible';
24
+ xl?: 'hidden' | 'visible';
25
+ '2xl'?: 'hidden' | 'visible';
26
+ };
19
27
  /** Value to set for content wrapping at various breakpoints */
20
28
  rowWrap?: {
21
29
  default?: 'wrap' | 'nowrap';
@@ -59,6 +67,7 @@ class ToolbarContent extends Component<ToolbarContentProps> {
59
67
  isExpanded,
60
68
  toolbarId,
61
69
  visibility,
70
+ visibilityAtHeight,
62
71
  rowWrap,
63
72
  alignItems,
64
73
  clearAllFilters,
@@ -69,11 +78,12 @@ class ToolbarContent extends Component<ToolbarContentProps> {
69
78
 
70
79
  return (
71
80
  <PageContext.Consumer>
72
- {({ width, getBreakpoint }) => (
81
+ {({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
73
82
  <div
74
83
  className={css(
75
84
  styles.toolbarContent,
76
85
  formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
86
+ formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
77
87
  className
78
88
  )}
79
89
  ref={this.expandableContentRef}
@@ -23,7 +23,7 @@ export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>,
23
23
  | 'action-group-inline'
24
24
  | 'action-group-plain'
25
25
  | 'label-group';
26
- /** Visibility at various breakpoints. */
26
+ /** Visibility at various width breakpoints. */
27
27
  visibility?: {
28
28
  default?: 'hidden' | 'visible';
29
29
  md?: 'hidden' | 'visible';
@@ -31,6 +31,14 @@ export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>,
31
31
  xl?: 'hidden' | 'visible';
32
32
  '2xl'?: 'hidden' | 'visible';
33
33
  };
34
+ /** Visibility at various height breakpoints. */
35
+ visibilityAtHeight?: {
36
+ default?: 'hidden' | 'visible';
37
+ md?: 'hidden' | 'visible';
38
+ lg?: 'hidden' | 'visible';
39
+ xl?: 'hidden' | 'visible';
40
+ '2xl'?: 'hidden' | 'visible';
41
+ };
34
42
  /** Applies to a child of a flex layout, and aligns that child (and any adjacent children on the other side of it) to one side of the main axis */
35
43
  align?: {
36
44
  default?: 'alignEnd' | 'alignStart' | 'alignCenter';
@@ -178,6 +186,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
178
186
  render() {
179
187
  const {
180
188
  visibility,
189
+ visibilityAtHeight,
181
190
  align,
182
191
  alignItems,
183
192
  alignSelf,
@@ -195,7 +204,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
195
204
 
196
205
  return (
197
206
  <PageContext.Consumer>
198
- {({ width, getBreakpoint }) => (
207
+ {({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
199
208
  <div
200
209
  className={css(
201
210
  styles.toolbarGroup,
@@ -209,6 +218,7 @@ class ToolbarGroupWithRef extends Component<ToolbarGroupProps> {
209
218
  | 'labelGroup'
210
219
  ],
211
220
  formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
221
+ formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
212
222
  formatBreakpointMods(align, styles, '', getBreakpoint(width)),
213
223
  formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
214
224
  formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
@@ -17,7 +17,7 @@ export interface ToolbarItemProps extends React.HTMLProps<HTMLDivElement> {
17
17
  className?: string;
18
18
  /** A type modifier which modifies spacing specifically depending on the type of item */
19
19
  variant?: ToolbarItemVariant | 'pagination' | 'label' | 'label-group' | 'separator' | 'expand-all';
20
- /** Visibility at various breakpoints. */
20
+ /** Visibility at various width breakpoints. */
21
21
  visibility?: {
22
22
  default?: 'hidden' | 'visible';
23
23
  md?: 'hidden' | 'visible';
@@ -25,6 +25,14 @@ export interface ToolbarItemProps extends React.HTMLProps<HTMLDivElement> {
25
25
  xl?: 'hidden' | 'visible';
26
26
  '2xl'?: 'hidden' | 'visible';
27
27
  };
28
+ /** Visibility at various height breakpoints. */
29
+ visibilityAtHeight?: {
30
+ default?: 'hidden' | 'visible';
31
+ md?: 'hidden' | 'visible';
32
+ lg?: 'hidden' | 'visible';
33
+ xl?: 'hidden' | 'visible';
34
+ '2xl'?: 'hidden' | 'visible';
35
+ };
28
36
  /** Applies to a child of a flex layout, and aligns that child (and any adjacent children on the other side of it) to one side of the main axis */
29
37
  align?: {
30
38
  default?: 'alignEnd' | 'alignStart' | 'alignCenter';
@@ -174,6 +182,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
174
182
  className,
175
183
  variant,
176
184
  visibility,
185
+ visibilityAtHeight,
177
186
  gap,
178
187
  columnGap,
179
188
  rowGap,
@@ -202,7 +211,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
202
211
 
203
212
  return (
204
213
  <PageContext.Consumer>
205
- {({ width, getBreakpoint }) => (
214
+ {({ width, getBreakpoint, height, getVerticalBreakpoint }) => (
206
215
  <div
207
216
  className={css(
208
217
  styles.toolbarItem,
@@ -211,6 +220,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
211
220
  isAllExpanded && styles.modifiers.expanded,
212
221
  isOverflowContainer && styles.modifiers.overflowContainer,
213
222
  formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
223
+ formatBreakpointMods(visibilityAtHeight, styles, '', getVerticalBreakpoint(height), true),
214
224
  formatBreakpointMods(align, styles, '', getBreakpoint(width)),
215
225
  formatBreakpointMods(gap, styles, '', getBreakpoint(width)),
216
226
  formatBreakpointMods(columnGap, styles, '', getBreakpoint(width)),
@@ -1,4 +1,4 @@
1
- import { Fragment } from 'react';
1
+ import { createElement, Fragment } from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import '@testing-library/jest-dom';
4
4
 
@@ -206,6 +206,32 @@ describe('Toolbar', () => {
206
206
  });
207
207
  });
208
208
 
209
+ const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
210
+ describe.each(bps)(`ToolbarContent visibilityAtHeight`, (bp) => {
211
+ it(`Applies correct visible class at ${bp}`, () => {
212
+ render(
213
+ <ToolbarContent data-testid="toolbarcontent" visibilityAtHeight={{ [bp]: 'visible' }}>
214
+ Test
215
+ </ToolbarContent>
216
+ );
217
+
218
+ if (bp !== 'default') {
219
+ expect(screen.getByTestId('toolbarcontent')).toHaveClass(`pf-m-visible-on-${bp}-height`);
220
+ }
221
+ });
222
+
223
+ it(`Applies correct hidden class at ${bp}`, () => {
224
+ render(
225
+ <ToolbarContent data-testid="toolbarcontent" visibilityAtHeight={{ [bp]: 'hidden' }}>
226
+ Test
227
+ </ToolbarContent>
228
+ );
229
+
230
+ const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
231
+ expect(screen.getByTestId('toolbarcontent')).toHaveClass(expectedClass);
232
+ });
233
+ });
234
+
209
235
  it(`Renders toolbar without ${styles.modifiers.vertical} by default`, () => {
210
236
  render(
211
237
  <Toolbar data-testid="Toolbar-test-is-not-vertical">
@@ -220,7 +246,7 @@ describe('Toolbar', () => {
220
246
  expect(screen.getByTestId('Toolbar-test-is-not-vertical')).not.toHaveClass(styles.modifiers.vertical);
221
247
  });
222
248
 
223
- it('Renders with class ${styles.modifiers.vertical} when isVertical is true', () => {
249
+ it(`Renders with class ${styles.modifiers.vertical} when isVertical is true`, () => {
224
250
  const items = (
225
251
  <Fragment>
226
252
  <ToolbarItem>Test</ToolbarItem>
@@ -238,4 +264,39 @@ describe('Toolbar', () => {
238
264
 
239
265
  expect(screen.getByTestId('Toolbar-test-is-vertical')).toHaveClass(styles.modifiers.vertical);
240
266
  });
267
+
268
+ it(`Does not add ${styles.modifiers.stickyBase} and ${styles.modifiers.stickyStuck} classes by default`, () => {
269
+ render(
270
+ <Toolbar data-testid="toolbar-sticky-default">
271
+ <ToolbarContent>
272
+ <ToolbarItem>Test</ToolbarItem>
273
+ </ToolbarContent>
274
+ </Toolbar>
275
+ );
276
+ const el = screen.getByTestId('toolbar-sticky-default');
277
+ expect(el).not.toHaveClass(styles.modifiers.stickyBase);
278
+ expect(el).not.toHaveClass(styles.modifiers.stickyStuck);
279
+ });
280
+
281
+ it(`Adds ${styles.modifiers.stickyBase} when isStickyBase is true`, () => {
282
+ render(
283
+ <Toolbar data-testid="toolbar-sticky-base" isStickyBase>
284
+ <ToolbarContent>
285
+ <ToolbarItem>Test</ToolbarItem>
286
+ </ToolbarContent>
287
+ </Toolbar>
288
+ );
289
+ expect(screen.getByTestId('toolbar-sticky-base')).toHaveClass(styles.modifiers.stickyBase);
290
+ });
291
+
292
+ it(`Adds ${styles.modifiers.stickyStuck} when isStickyStuck is true`, () => {
293
+ render(
294
+ <Toolbar data-testid="toolbar-sticky-stuck" isStickyStuck>
295
+ <ToolbarContent>
296
+ <ToolbarItem>Test</ToolbarItem>
297
+ </ToolbarContent>
298
+ </Toolbar>
299
+ );
300
+ expect(screen.getByTestId('toolbar-sticky-stuck')).toHaveClass(styles.modifiers.stickyStuck);
301
+ });
241
302
  });
@@ -37,4 +37,30 @@ describe('ToolbarGroup', () => {
37
37
  });
38
38
  });
39
39
  });
40
+
41
+ const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
42
+ describe.each(bps)(`ToolbarGroup visibilityAtHeight`, (bp) => {
43
+ it(`Applies correct visible class at ${bp}`, () => {
44
+ render(
45
+ <ToolbarGroup data-testid="toolbargroup" visibilityAtHeight={{ [bp]: 'visible' }}>
46
+ Test
47
+ </ToolbarGroup>
48
+ );
49
+
50
+ if (bp !== 'default') {
51
+ expect(screen.getByTestId('toolbargroup')).toHaveClass(`pf-m-visible-on-${bp}-height`);
52
+ }
53
+ });
54
+
55
+ it(`Applies correct hidden class at ${bp}`, () => {
56
+ render(
57
+ <ToolbarGroup data-testid="toolbargroup" visibilityAtHeight={{ [bp]: 'hidden' }}>
58
+ Test
59
+ </ToolbarGroup>
60
+ );
61
+
62
+ const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
63
+ expect(screen.getByTestId('toolbargroup')).toHaveClass(expectedClass);
64
+ });
65
+ });
40
66
  });
@@ -37,4 +37,30 @@ describe('ToolbarItem', () => {
37
37
  });
38
38
  });
39
39
  });
40
+
41
+ const bps = ['default', 'md', 'lg', 'xl', '2xl'] as const;
42
+ describe.each(bps)(`ToolbarItem visibilityAtHeight`, (bp) => {
43
+ it(`Applies correct visible class at ${bp}`, () => {
44
+ render(
45
+ <ToolbarItem data-testid="toolbaritem" visibilityAtHeight={{ [bp]: 'visible' }}>
46
+ Test
47
+ </ToolbarItem>
48
+ );
49
+
50
+ if (bp !== 'default') {
51
+ expect(screen.getByTestId('toolbaritem')).toHaveClass(`pf-m-visible-on-${bp}-height`);
52
+ }
53
+ });
54
+
55
+ it(`Applies correct hidden class at ${bp}`, () => {
56
+ render(
57
+ <ToolbarItem data-testid="toolbaritem" visibilityAtHeight={{ [bp]: 'hidden' }}>
58
+ Test
59
+ </ToolbarItem>
60
+ );
61
+
62
+ const expectedClass = bp === 'default' ? 'pf-m-hidden' : `pf-m-hidden-on-${bp}-height`;
63
+ expect(screen.getByTestId('toolbaritem')).toHaveClass(expectedClass);
64
+ });
65
+ });
40
66
  });
@@ -5,7 +5,7 @@ propComponents: ['Toolbar', 'ToolbarContent', 'ToolbarGroup', 'ToolbarItem', 'To
5
5
  section: components
6
6
  ---
7
7
 
8
- import { Fragment, useState } from 'react';
8
+ import { Fragment, useState, useLayoutEffect, useRef } from 'react';
9
9
 
10
10
  import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon';
11
11
  import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon';
@@ -34,6 +34,14 @@ To adjust a toolbar’s inset, use the `inset` property. You can set the inset v
34
34
 
35
35
  ```
36
36
 
37
+ ### Vertical toolbar
38
+
39
+ A toolbar's orientation may be changed using the `isVertical` property. Responsive behavior when height is adjusted may be customized for the `ToolbarContent`, `ToolbarGroup`, and `ToolbarItem` components using their respective `visibilityAtHeight` property.
40
+
41
+ ```ts file="./ToolbarVertical.tsx"
42
+
43
+ ```
44
+
37
45
  ### Sticky toolbar
38
46
 
39
47
  To lock a toolbar and prevent it from scrolling with other content, use a sticky toolbar.
@@ -44,6 +52,14 @@ In the following example, toggle the "is toolbar sticky" checkbox to see the dif
44
52
 
45
53
  ```
46
54
 
55
+ ### Dynamic sticky toolbar
56
+
57
+ A toolbar may alternatively be made sticky with two properties: `isStickyBase` and `isStickyStuck` - which allows separate control of the sticky position and sticky styling respectively. In this example, `isStickyStuck` is only applied when the sticky element is not at the top of the scroll parent container.
58
+
59
+ ```ts file="./ToolbarDynamicSticky.tsx"
60
+
61
+ ```
62
+
47
63
  ### With groups of items
48
64
 
49
65
  You can group similar items together to create desired associations and to enable items to respond to changes in viewport width together.
@@ -114,11 +130,13 @@ When all of a toolbar's required elements cannot fit in a single line, you can s
114
130
  ```
115
131
 
116
132
  ## Examples with spacers and wrapping
133
+
117
134
  You may adjust the space between toolbar items to arrange them into groups. Read our spacers documentation to learn more about using spacers.
118
135
 
119
136
  Items are spaced “16px” apart by default and can be modified by changing their or their parents' `gap`, `columnGap`, and `rowGap` properties. You can set the property values at multiple breakpoints, including "default", "md", "lg", "xl", and "2xl".
120
137
 
121
138
  ### Toolbar content wrapping
139
+
122
140
  The toolbar content section will wrap by default, but you can set the `rowRap` property to `noWrap` to make it not wrap.
123
141
 
124
142
  ```ts file="./ToolbarContentWrap.tsx"
@@ -0,0 +1,75 @@
1
+ import { useLayoutEffect, useState, useRef } from 'react';
2
+ import { Toolbar, ToolbarItem, ToolbarContent, SearchInput, Checkbox } from '@patternfly/react-core';
3
+
4
+ const useIsStuckFromScrollParent = ({
5
+ shouldTrack,
6
+ scrollParentRef
7
+ }: {
8
+ /** Indicates whether to track the scroll top position of the scroll parent element */
9
+ shouldTrack: boolean;
10
+ /** Reference to the scroll parent element */
11
+ scrollParentRef: React.RefObject<any>;
12
+ }): boolean => {
13
+ const [isStuck, setIsStuck] = useState(false);
14
+
15
+ useLayoutEffect(() => {
16
+ if (!shouldTrack) {
17
+ setIsStuck(false);
18
+ return;
19
+ }
20
+
21
+ const scrollElement = scrollParentRef.current;
22
+ if (!scrollElement) {
23
+ setIsStuck(false);
24
+ return;
25
+ }
26
+
27
+ const syncFromScroll = () => {
28
+ setIsStuck(scrollElement.scrollTop > 0);
29
+ };
30
+ syncFromScroll();
31
+ scrollElement.addEventListener('scroll', syncFromScroll, { passive: true });
32
+ return () => scrollElement.removeEventListener('scroll', syncFromScroll);
33
+ }, [shouldTrack, scrollParentRef]);
34
+
35
+ return isStuck;
36
+ };
37
+
38
+ export const ToolbarDynamicSticky = () => {
39
+ const scrollParentRef = useRef<HTMLDivElement>(null);
40
+ const isStickyStuck = useIsStuckFromScrollParent({ shouldTrack: true, scrollParentRef });
41
+ const [showEvenOnly, setShowEvenOnly] = useState(true);
42
+ const [searchValue, setSearchValue] = useState('');
43
+ const array = Array.from(Array(30), (_, x) => x); // create array of numbers from 1-30 for demo purposes
44
+ const numbers = showEvenOnly ? array.filter((number) => number % 2 === 0) : array;
45
+
46
+ return (
47
+ <div id="dynamic-sticky-scroll-parent" ref={scrollParentRef} style={{ overflowY: 'scroll', height: '200px' }}>
48
+ <Toolbar id="toolbar-dynamic-sticky" inset={{ default: 'insetNone' }} isStickyBase isStickyStuck={isStickyStuck}>
49
+ <ToolbarContent>
50
+ <ToolbarItem>
51
+ <SearchInput
52
+ aria-label="Sticky example search input"
53
+ value={searchValue}
54
+ onChange={(_event, value) => setSearchValue(value)}
55
+ onClear={() => setSearchValue('')}
56
+ />
57
+ </ToolbarItem>
58
+ <ToolbarItem alignSelf="center">
59
+ <Checkbox
60
+ label="Show only even number items"
61
+ isChecked={showEvenOnly}
62
+ onChange={(_event, checked) => setShowEvenOnly(checked)}
63
+ id="showOnlyEvenCheckbox"
64
+ />
65
+ </ToolbarItem>
66
+ </ToolbarContent>
67
+ </Toolbar>
68
+ <ul>
69
+ {numbers.map((number) => (
70
+ <li key={number}>{`item ${number}`}</li>
71
+ ))}
72
+ </ul>
73
+ </div>
74
+ );
75
+ };
@@ -0,0 +1,22 @@
1
+ import { Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem } from '@patternfly/react-core';
2
+
3
+ export const ToolbarVertical: React.FunctionComponent = () => (
4
+ <Toolbar id="toolbar-vertical" isVertical>
5
+ <ToolbarContent>
6
+ <ToolbarGroup variant="action-group-plain">
7
+ <ToolbarItem>Item 1</ToolbarItem>
8
+ <ToolbarItem>Item 2</ToolbarItem>
9
+ <ToolbarItem>Item 3</ToolbarItem>
10
+ </ToolbarGroup>
11
+ <ToolbarGroup variant="action-group-plain" visibilityAtHeight={{ default: 'hidden', md: 'visible' }}>
12
+ <ToolbarItem>Item 4 (visible above md breakpoint)</ToolbarItem>
13
+ <ToolbarItem visibilityAtHeight={{ default: 'hidden', lg: 'visible' }}>
14
+ Item 5 (visible above lg breakpoint)
15
+ </ToolbarItem>
16
+ <ToolbarItem visibilityAtHeight={{ default: 'hidden', lg: 'visible' }}>
17
+ Item 6 (visible above lg breakpoint)
18
+ </ToolbarItem>
19
+ </ToolbarGroup>
20
+ </ToolbarContent>
21
+ </Toolbar>
22
+ );
@@ -4,7 +4,7 @@ section: AI
4
4
  subsection: Generative UIs
5
5
  ---
6
6
 
7
- import { useRef, useState } from 'react';
7
+ import { useRef, useState, useEffect } from 'react';
8
8
  import PlayIcon from '@patternfly/react-icons/dist/esm/icons/play-icon';
9
9
  import OutlinedPlusSquare from '@patternfly/react-icons/dist/esm/icons/outlined-plus-square-icon';
10
10
  import OutlinedCopy from '@patternfly/react-icons/dist/esm/icons/outlined-copy-icon';
@@ -14,8 +14,11 @@ import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon';
14
14
  import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
15
15
  import CloudIcon from '@patternfly/react-icons/dist/esm/icons/cloud-icon';
16
16
  import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon';
17
+ import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
17
18
  import imgAvatar from '../assets/avatarImg.svg';
19
+ import ThIcon from '@patternfly/react-icons/dist/esm/icons/th-icon';
18
20
  import pfLogo from '../assets/PF-IconLogo-color.svg';
21
+ import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/t_global_breakpoint_lg';
19
22
 
20
23
  ## Demos
21
24