@patternfly/react-core 5.1.1-prerelease.1 → 5.1.1-prerelease.11

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 (245) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/package.json +1 -1
  119. package/dist/esm/components/BackToTop/BackToTop.js +1 -1
  120. package/dist/esm/components/BackToTop/BackToTop.js.map +1 -1
  121. package/dist/esm/components/Button/Button.d.ts +2 -2
  122. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  123. package/dist/esm/components/Button/Button.js +3 -3
  124. package/dist/esm/components/Button/Button.js.map +1 -1
  125. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts +16 -0
  126. package/dist/esm/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  127. package/dist/esm/components/Drawer/DrawerPanelContent.js +55 -15
  128. package/dist/esm/components/Drawer/DrawerPanelContent.js.map +1 -1
  129. package/dist/esm/components/Icon/Icon.d.ts +4 -0
  130. package/dist/esm/components/Icon/Icon.d.ts.map +1 -1
  131. package/dist/esm/components/Icon/Icon.js +2 -2
  132. package/dist/esm/components/Icon/Icon.js.map +1 -1
  133. package/dist/esm/components/Nav/NavItem.d.ts +1 -1
  134. package/dist/esm/components/Nav/NavItem.d.ts.map +1 -1
  135. package/dist/esm/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  136. package/dist/esm/components/Toolbar/ToolbarContent.js +8 -6
  137. package/dist/esm/components/Toolbar/ToolbarContent.js.map +1 -1
  138. package/dist/esm/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  139. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js +3 -5
  140. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  141. package/dist/esm/components/Toolbar/ToolbarFilter.d.ts +4 -0
  142. package/dist/esm/components/Toolbar/ToolbarFilter.d.ts.map +1 -1
  143. package/dist/esm/components/Toolbar/ToolbarFilter.js +8 -4
  144. package/dist/esm/components/Toolbar/ToolbarFilter.js.map +1 -1
  145. package/dist/esm/components/Toolbar/ToolbarToggleGroup.d.ts +14 -0
  146. package/dist/esm/components/Toolbar/ToolbarToggleGroup.d.ts.map +1 -1
  147. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js +21 -20
  148. package/dist/esm/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  149. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts +4 -0
  150. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  151. package/dist/esm/components/Toolbar/ToolbarUtils.js +2 -1
  152. package/dist/esm/components/Toolbar/ToolbarUtils.js.map +1 -1
  153. package/dist/esm/components/Toolbar/index.d.ts +1 -0
  154. package/dist/esm/components/Toolbar/index.d.ts.map +1 -1
  155. package/dist/esm/components/Toolbar/index.js +1 -0
  156. package/dist/esm/components/Toolbar/index.js.map +1 -1
  157. package/dist/esm/deprecated/components/Select/Select.d.ts.map +1 -1
  158. package/dist/esm/deprecated/components/Select/Select.js +43 -42
  159. package/dist/esm/deprecated/components/Select/Select.js.map +1 -1
  160. package/dist/js/components/BackToTop/BackToTop.js +1 -1
  161. package/dist/js/components/BackToTop/BackToTop.js.map +1 -1
  162. package/dist/js/components/Button/Button.d.ts +2 -2
  163. package/dist/js/components/Button/Button.d.ts.map +1 -1
  164. package/dist/js/components/Button/Button.js +3 -3
  165. package/dist/js/components/Button/Button.js.map +1 -1
  166. package/dist/js/components/Drawer/DrawerPanelContent.d.ts +16 -0
  167. package/dist/js/components/Drawer/DrawerPanelContent.d.ts.map +1 -1
  168. package/dist/js/components/Drawer/DrawerPanelContent.js +55 -15
  169. package/dist/js/components/Drawer/DrawerPanelContent.js.map +1 -1
  170. package/dist/js/components/Icon/Icon.d.ts +4 -0
  171. package/dist/js/components/Icon/Icon.d.ts.map +1 -1
  172. package/dist/js/components/Icon/Icon.js +2 -2
  173. package/dist/js/components/Icon/Icon.js.map +1 -1
  174. package/dist/js/components/Nav/NavItem.d.ts +1 -1
  175. package/dist/js/components/Nav/NavItem.d.ts.map +1 -1
  176. package/dist/js/components/Toolbar/ToolbarContent.d.ts.map +1 -1
  177. package/dist/js/components/Toolbar/ToolbarContent.js +8 -6
  178. package/dist/js/components/Toolbar/ToolbarContent.js.map +1 -1
  179. package/dist/js/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  180. package/dist/js/components/Toolbar/ToolbarExpandableContent.js +3 -5
  181. package/dist/js/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  182. package/dist/js/components/Toolbar/ToolbarFilter.d.ts +4 -0
  183. package/dist/js/components/Toolbar/ToolbarFilter.d.ts.map +1 -1
  184. package/dist/js/components/Toolbar/ToolbarFilter.js +8 -4
  185. package/dist/js/components/Toolbar/ToolbarFilter.js.map +1 -1
  186. package/dist/js/components/Toolbar/ToolbarToggleGroup.d.ts +14 -0
  187. package/dist/js/components/Toolbar/ToolbarToggleGroup.d.ts.map +1 -1
  188. package/dist/js/components/Toolbar/ToolbarToggleGroup.js +21 -20
  189. package/dist/js/components/Toolbar/ToolbarToggleGroup.js.map +1 -1
  190. package/dist/js/components/Toolbar/ToolbarUtils.d.ts +4 -0
  191. package/dist/js/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  192. package/dist/js/components/Toolbar/ToolbarUtils.js +2 -1
  193. package/dist/js/components/Toolbar/ToolbarUtils.js.map +1 -1
  194. package/dist/js/components/Toolbar/index.d.ts +1 -0
  195. package/dist/js/components/Toolbar/index.d.ts.map +1 -1
  196. package/dist/js/components/Toolbar/index.js +1 -0
  197. package/dist/js/components/Toolbar/index.js.map +1 -1
  198. package/dist/js/deprecated/components/Select/Select.d.ts.map +1 -1
  199. package/dist/js/deprecated/components/Select/Select.js +43 -42
  200. package/dist/js/deprecated/components/Select/Select.js.map +1 -1
  201. package/dist/styles/base-no-reset.css +19 -0
  202. package/dist/styles/base.css +19 -0
  203. package/dist/umd/react-core.min.js +3 -3
  204. package/helpers/package.json +1 -1
  205. package/layouts/package.json +1 -1
  206. package/next/package.json +1 -1
  207. package/package.json +6 -6
  208. package/src/components/Alert/__tests__/AlertGroup.test.tsx +77 -73
  209. package/src/components/BackToTop/BackToTop.tsx +1 -1
  210. package/src/components/BackToTop/__tests__/BackToTop.test.tsx +1 -1
  211. package/src/components/BackToTop/__tests__/__snapshots__/BackToTop.test.tsx.snap +1 -1
  212. package/src/components/Button/Button.tsx +5 -5
  213. package/src/components/Button/examples/ButtonVariations.tsx +1 -1
  214. package/src/components/Drawer/DrawerPanelContent.tsx +120 -55
  215. package/src/components/Drawer/__tests__/DrawerPanelContent.test.tsx +89 -0
  216. package/src/components/Drawer/examples/Drawer.md +31 -0
  217. package/src/components/Drawer/examples/DrawerFocusTrap.tsx +58 -0
  218. package/src/components/Icon/Icon.tsx +15 -1
  219. package/src/components/Icon/__tests__/Icon.test.tsx +16 -0
  220. package/src/components/Nav/NavItem.tsx +1 -1
  221. package/src/components/SearchInput/examples/SearchInputAdvanced.tsx +1 -1
  222. package/src/components/Tile/examples/Tile.md +14 -10
  223. package/src/components/Toolbar/ToolbarContent.tsx +7 -11
  224. package/src/components/Toolbar/ToolbarExpandableContent.tsx +7 -3
  225. package/src/components/Toolbar/ToolbarFilter.tsx +12 -2
  226. package/src/components/Toolbar/ToolbarToggleGroup.tsx +92 -47
  227. package/src/components/Toolbar/ToolbarUtils.tsx +6 -1
  228. package/src/components/Toolbar/__tests__/Generated/__snapshots__/ToolbarContent.test.tsx.snap +0 -8
  229. package/src/components/Toolbar/__tests__/Toolbar.test.tsx +3 -4
  230. package/src/components/Toolbar/__tests__/ToolbarToggleGroup.test.tsx +13 -10
  231. package/src/components/Toolbar/__tests__/__snapshots__/Toolbar.test.tsx.snap +0 -59
  232. package/src/components/Toolbar/examples/Test.tsx +258 -0
  233. package/src/components/Toolbar/examples/Toolbar.md +12 -6
  234. package/src/components/Toolbar/index.ts +1 -0
  235. package/src/demos/Card/Card.md +3 -664
  236. package/src/demos/Card/examples/CardView.tsx +575 -0
  237. package/src/demos/CardDemos.md +4 -4
  238. package/src/demos/NotificationDrawer/NotificationDrawer.md +2 -1435
  239. package/src/demos/NotificationDrawer/examples/NotificationDrawerBasic.tsx +557 -0
  240. package/src/demos/NotificationDrawer/examples/NotificationDrawerGrouped.tsx +796 -0
  241. package/src/demos/PrimaryDetail.md +2 -2
  242. package/src/deprecated/components/Select/Select.tsx +47 -45
  243. package/src/deprecated/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +9 -5
  244. package/src/components/Alert/__tests__/__snapshots__/AlertGroup.test.tsx.snap +0 -10
  245. /package/src/demos/Card/{CardData.jsx → examples/CardData.jsx} +0 -0
@@ -13,6 +13,7 @@ propComponents:
13
13
  DrawerActions,
14
14
  DrawerCloseButton,
15
15
  DrawerColorVariant,
16
+ DrawerPanelFocusTrapObject
16
17
  ]
17
18
  section: components
18
19
  ---
@@ -22,56 +23,67 @@ section: components
22
23
  ### Basic
23
24
 
24
25
  ```ts file="./DrawerBasic.tsx"
26
+
25
27
  ```
26
28
 
27
29
  ### Panel on right
28
30
 
29
31
  ```ts file="./DrawerPanelRight.tsx"
32
+
30
33
  ```
31
34
 
32
35
  ### Panel on left
33
36
 
34
37
  ```ts file="./DrawerPanelLeft.tsx"
38
+
35
39
  ```
36
40
 
37
41
  ### Panel on bottom
38
42
 
39
43
  ```ts file="./DrawerPanelBottom.tsx"
44
+
40
45
  ```
41
46
 
42
47
  ### Basic inline
43
48
 
44
49
  ```ts file="./DrawerBasicInline.tsx"
50
+
45
51
  ```
46
52
 
47
53
  ### Inline panel on right
48
54
 
49
55
  ```ts file="./DrawerInlinePanelRight.tsx"
56
+
50
57
  ```
51
58
 
52
59
  ### Inline panel on left
53
60
 
54
61
  ```ts file="./DrawerInlinePanelLeft.tsx"
62
+
55
63
  ```
56
64
 
57
65
  ### Stacked content body elements
58
66
 
59
67
  ```ts file="./DrawerStackedContentBodyElements.tsx"
68
+
60
69
  ```
61
70
 
62
71
  ### Modified content padding
63
72
 
64
73
  ```ts file="DrawerModifiedContentPadding.tsx"
74
+
65
75
  ```
66
76
 
67
77
  ### Modified panel padding
68
78
 
69
79
  ```ts file="DrawerModifiedPanelPadding.tsx"
80
+
70
81
  ```
71
82
 
72
83
  ### Additional section above drawer content
73
84
 
74
85
  ```ts file="DrawerAdditionalSectionAboveContent.tsx"
86
+
75
87
  ```
76
88
 
77
89
  ### Static drawer
@@ -79,34 +91,53 @@ section: components
79
91
  **Note:** For mobile viewports, all drawer variants behave the same way. At the `md` breakpoint, or where `.pf-m-static{-on-[lg, xl, 2xl]}` is applied, the `static drawer` variant’s `close button` is automatically hidden because the drawer panel doesn’t close by design.
80
92
 
81
93
  ```ts file="DrawerStatic.tsx"
94
+
82
95
  ```
83
96
 
84
97
  ### Breakpoint
85
98
 
86
99
  ```ts file="DrawerBreakpoint.tsx"
100
+
87
101
  ```
88
102
 
89
103
  ### Resizable on right
90
104
 
91
105
  ```ts file="DrawerResizableOnRight.tsx"
106
+
92
107
  ```
93
108
 
94
109
  ### Resizable on left
95
110
 
96
111
  ```ts file="DrawerResizableOnLeft.tsx"
112
+
97
113
  ```
98
114
 
99
115
  ### Resizable on bottom
100
116
 
101
117
  ```ts file="DrawerResizableOnBottom.tsx"
118
+
102
119
  ```
103
120
 
104
121
  ### Resizable on inline
105
122
 
106
123
  ```ts file="DrawerResizableOnInline.tsx"
124
+
107
125
  ```
108
126
 
109
127
  ### Panel with secondary background
110
128
 
111
129
  ```ts file="DrawerSecondaryBackground.tsx"
130
+
131
+ ```
132
+
133
+ ### With focus trap
134
+
135
+ When a [focus trap](/accessibility/product-development-guide#trapping-focus) is enabled on an element, a user will only be able to interact with the contents of that element until the focus trap is closed or deactivated.
136
+
137
+ To enable and customize a focus trap on a drawer panel, apply the `focusTrap` property to the `<DrawerPanelContent>` component. Enabling a focus trap with `focusTrap.enabled` will also automatically place focus on the first focusable element when the drawer panel expands, and return focus to the previously focused element when it collapses.
138
+
139
+ To customize which element receives focus when the drawer panel expands, use the `focusTrap.elementToFocusOnExpand` property.
140
+
141
+ ```ts file="./DrawerFocusTrap.tsx"
142
+
112
143
  ```
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import {
3
+ Drawer,
4
+ DrawerPanelContent,
5
+ DrawerContent,
6
+ DrawerContentBody,
7
+ DrawerHead,
8
+ DrawerActions,
9
+ DrawerCloseButton,
10
+ Button
11
+ } from '@patternfly/react-core';
12
+
13
+ export const DrawerFocusTrap: React.FunctionComponent = () => {
14
+ const [isExpanded, setIsExpanded] = React.useState(false);
15
+
16
+ const onClick = () => {
17
+ setIsExpanded(!isExpanded);
18
+ };
19
+
20
+ const onCloseClick = () => {
21
+ setIsExpanded(false);
22
+ };
23
+
24
+ // An onKeyDown property must be passed to the Drawer component to handle closing
25
+ // the drawer panel and deactivating the focus trap via the Escape key.
26
+ const onEscape = (event: React.KeyboardEvent) => {
27
+ if (event.key === 'Escape') {
28
+ setIsExpanded(false);
29
+ }
30
+ };
31
+
32
+ const panelContent = (
33
+ <DrawerPanelContent focusTrap={{ enabled: true }}>
34
+ <DrawerHead>
35
+ <span>drawer-panel</span>
36
+ <DrawerActions>
37
+ <DrawerCloseButton onClick={onCloseClick} />
38
+ </DrawerActions>
39
+ </DrawerHead>
40
+ </DrawerPanelContent>
41
+ );
42
+
43
+ const drawerContent =
44
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat,nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.';
45
+
46
+ return (
47
+ <React.Fragment>
48
+ <Button aria-expanded={isExpanded} onClick={onClick}>
49
+ Toggle drawer with focus trap
50
+ </Button>
51
+ <Drawer onKeyDown={onEscape} isExpanded={isExpanded}>
52
+ <DrawerContent panelContent={panelContent}>
53
+ <DrawerContentBody>{drawerContent}</DrawerContentBody>
54
+ </DrawerContent>
55
+ </Drawer>
56
+ </React.Fragment>
57
+ );
58
+ };
@@ -24,6 +24,10 @@ export interface IconComponentProps extends Omit<React.HTMLProps<HTMLSpanElement
24
24
  isInProgress?: boolean;
25
25
  /** Aria-label for the default progress icon */
26
26
  defaultProgressArialabel?: string;
27
+ /** @beta Flag indicating whether the icon passed as children should be mirrored for
28
+ * right to left (RTL) languages. This will not mirror the icon passed to progressIcon.
29
+ */
30
+ shouldMirrorRTL?: boolean;
27
31
  }
28
32
 
29
33
  export const Icon: React.FunctionComponent<IconComponentProps> = ({
@@ -37,6 +41,7 @@ export const Icon: React.FunctionComponent<IconComponentProps> = ({
37
41
  isInline = false,
38
42
  isInProgress = false,
39
43
  defaultProgressArialabel = 'Loading...',
44
+ shouldMirrorRTL = false,
40
45
  ...props
41
46
  }: IconComponentProps) => {
42
47
  const _progressIcon = progressIcon ?? <Spinner diameter="1em" aria-label={defaultProgressArialabel} />;
@@ -52,7 +57,16 @@ export const Icon: React.FunctionComponent<IconComponentProps> = ({
52
57
  )}
53
58
  {...props}
54
59
  >
55
- <span className={css(styles.iconContent, styles.modifiers[iconSize], styles.modifiers[status])}>{children}</span>
60
+ <span
61
+ className={css(
62
+ styles.iconContent,
63
+ styles.modifiers[iconSize],
64
+ styles.modifiers[status],
65
+ shouldMirrorRTL && 'pf-v5-m-mirror-inline-rtl'
66
+ )}
67
+ >
68
+ {children}
69
+ </span>
56
70
  {isInProgress && (
57
71
  <span className={css(styles.iconProgress, styles.modifiers[progressIconSize], className)}>{_progressIcon}</span>
58
72
  )}
@@ -194,3 +194,19 @@ test('renders progress icon successfully', () => {
194
194
  );
195
195
  expect(asFragment()).toMatchSnapshot();
196
196
  });
197
+
198
+ test('Renders with class pf-v5-m-mirror-inline-rtl on icon passed as children when shouldMirrorRTL is true', () => {
199
+ render(<Icon shouldMirrorRTL>Icon content</Icon>);
200
+
201
+ expect(screen.getByText('Icon content')).toHaveClass('pf-v5-m-mirror-inline-rtl');
202
+ });
203
+
204
+ test('Does not render with class pf-v5-m-mirror-inline-rtl on progressIcon when shouldMirrorRTL is true', () => {
205
+ render(
206
+ <Icon shouldMirrorRTL isInProgress progressIcon="Progress icon">
207
+ Icon content
208
+ </Icon>
209
+ );
210
+
211
+ expect(screen.getByText('Progress icon')).not.toHaveClass('pf-v5-m-mirror-inline-rtl');
212
+ });
@@ -27,7 +27,7 @@ export interface NavItemProps extends Omit<React.HTMLProps<HTMLAnchorElement>, '
27
27
  /** Callback for item click */
28
28
  onClick?: NavSelectClickHandler;
29
29
  /** Component used to render NavItems if React.isValidElement(children) is false */
30
- component?: React.ReactNode;
30
+ component?: React.ElementType<any> | React.ComponentType<any>;
31
31
  /** Flyout of a nav item. This should be a Menu component. Should not be used if the to prop is defined. */
32
32
  flyout?: React.ReactElement;
33
33
  /** Callback when flyout is opened or closed */
@@ -44,7 +44,7 @@ export const SearchInputAdvanced: React.FunctionComponent = () => {
44
44
  formAdditionalItems={
45
45
  useCustomFooter ? (
46
46
  <FormGroup>
47
- <Button variant="link" isInline icon={<ExternalLinkSquareAltIcon />} iconPosition="right">
47
+ <Button variant="link" isInline icon={<ExternalLinkSquareAltIcon />} iconPosition="end">
48
48
  Link
49
49
  </Button>
50
50
  </FormGroup>
@@ -12,32 +12,36 @@ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
12
12
 
13
13
  Keyboard interaction patterns and a11y is implemented in the Tile demos, located in the [Demo section](/components/tile/react-demos).
14
14
 
15
- ### Basic
16
-
15
+ ### Basic tile
16
+ Basic tiles can appear in one of three states: a default state, selected state, and a disabled state. To change the state of a tile, use the properties `isSelected` and `isDisabled`.
17
17
  ```ts file="./TileBasic.tsx"
18
18
  ```
19
19
 
20
- ### With subtext
21
-
20
+ ### With subtext
21
+ Tile subtext can provide users with additional context. To add subtext, pass a short description to the `<Tile>` component.
22
22
  ```ts file="./TileWithSubtext.tsx"
23
23
  ```
24
24
 
25
25
  ### With icon
26
-
26
+ Icons can provide a visual cue that helps users understand what the tile is being used for. To add an icon, use the `icon` property.
27
27
  ```ts file="./TileWithIcon.tsx"
28
28
  ```
29
29
 
30
- ### Stacked
31
-
30
+ ### With stacked icon
31
+ You can further customize a tile’s appearance by placing an icon above the title. To stack your icon on top of a tile’s title, use the `isStacked` property.
32
32
  ```ts file="./TileStacked.tsx"
33
33
  ```
34
34
 
35
- ### Stacked with large icons
35
+ ### With large icons
36
+ You can make your icons larger to help catch a user’s attention. To increase the size of an icon, use the `isDisplayLarge` property.
36
37
 
38
+ Be aware that `isDisplayLarge` can only be used when `isStacked` is also applied.
37
39
  ```ts file="./TileStackedWithLargeIcons.tsx"
38
40
  ```
39
41
 
40
- ### With extra content
42
+ ### With long subtext
43
+ To provide users with a large amount of context, subtext can be elongated to wrap around to the next line. To format a long subtext, you can pass the component `Flex` into `<Tile>`.
41
44
 
45
+ You can also change the type of `Flex` you can use so that the line breaks in the subtext fits your needs. You can do this by changing the default flex. The standard is `default: “flex_1”`, and changing the number in the default will also change where the sentence breaks.
42
46
  ```ts file="./TileWithExtraContent.tsx"
43
- ```
47
+ ```
@@ -3,7 +3,6 @@ import styles from '@patternfly/react-styles/css/components/Toolbar/toolbar';
3
3
  import { css } from '@patternfly/react-styles';
4
4
  import { ToolbarContentContext, ToolbarContext } from './ToolbarUtils';
5
5
  import { formatBreakpointMods } from '../../helpers/util';
6
- import { ToolbarExpandableContent } from './ToolbarExpandableContent';
7
6
  import { PageContext } from '../Page/PageContext';
8
7
 
9
8
  export interface ToolbarContentProps extends React.HTMLProps<HTMLDivElement> {
@@ -70,6 +69,7 @@ class ToolbarContent extends React.Component<ToolbarContentProps> {
70
69
  formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
71
70
  className
72
71
  )}
72
+ ref={this.expandableContentRef}
73
73
  {...props}
74
74
  >
75
75
  <ToolbarContext.Consumer>
@@ -77,6 +77,7 @@ class ToolbarContent extends React.Component<ToolbarContentProps> {
77
77
  clearAllFilters: clearAllFiltersContext,
78
78
  clearFiltersButtonText: clearFiltersButtonContext,
79
79
  showClearFiltersButton: showClearFiltersButtonContext,
80
+ isExpanded: isExpandedContext,
80
81
  toolbarId: toolbarIdContext
81
82
  }) => {
82
83
  const expandableContentId = `${
@@ -87,7 +88,11 @@ class ToolbarContent extends React.Component<ToolbarContentProps> {
87
88
  value={{
88
89
  expandableContentRef: this.expandableContentRef,
89
90
  expandableContentId,
90
- chipContainerRef: this.chipContainerRef
91
+ chipContainerRef: this.chipContainerRef,
92
+ isExpanded: isExpanded || isExpandedContext,
93
+ clearAllFilters: clearAllFilters || clearAllFiltersContext,
94
+ clearFiltersButtonText: clearFiltersButtonText || clearFiltersButtonContext,
95
+ showClearFiltersButton: showClearFiltersButton || showClearFiltersButtonContext
91
96
  }}
92
97
  >
93
98
  <div
@@ -103,15 +108,6 @@ class ToolbarContent extends React.Component<ToolbarContentProps> {
103
108
  >
104
109
  {children}
105
110
  </div>
106
- <ToolbarExpandableContent
107
- id={expandableContentId}
108
- isExpanded={isExpanded}
109
- expandableContentRef={this.expandableContentRef}
110
- chipContainerRef={this.chipContainerRef}
111
- clearAllFilters={clearAllFilters || clearAllFiltersContext}
112
- showClearFiltersButton={showClearFiltersButton || showClearFiltersButtonContext}
113
- clearFiltersButtonText={clearFiltersButtonText || clearFiltersButtonContext}
114
- />
115
111
  </ToolbarContentContext.Provider>
116
112
  );
117
113
  }}
@@ -37,10 +37,10 @@ class ToolbarExpandableContent extends React.Component<ToolbarExpandableContentP
37
37
 
38
38
  render() {
39
39
  const {
40
+ children,
40
41
  className,
41
42
  expandableContentRef,
42
43
  chipContainerRef,
43
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
44
44
  isExpanded,
45
45
  clearAllFilters,
46
46
  clearFiltersButtonText,
@@ -54,8 +54,12 @@ class ToolbarExpandableContent extends React.Component<ToolbarExpandableContentP
54
54
  };
55
55
 
56
56
  return (
57
- <div className={css(styles.toolbarExpandableContent, className)} ref={expandableContentRef} {...props}>
58
- <ToolbarGroup />
57
+ <div
58
+ className={css(styles.toolbarExpandableContent, isExpanded && styles.modifiers.expanded, className)}
59
+ ref={expandableContentRef}
60
+ {...props}
61
+ >
62
+ <ToolbarGroup>{children}</ToolbarGroup>
59
63
  {numberOfFilters > 0 && (
60
64
  <ToolbarGroup className={styles.modifiers.chipContainer}>
61
65
  <ToolbarGroup ref={chipContainerRef} />
@@ -21,6 +21,8 @@ export interface ToolbarChip {
21
21
  }
22
22
 
23
23
  export interface ToolbarFilterProps extends ToolbarItemProps {
24
+ /** Flag indicating when toolbar toggle group is expanded for non-managed toolbar toggle groups. */
25
+ isExpanded?: boolean;
24
26
  /** An array of strings to be displayed as chips in the expandable content */
25
27
  chips?: (string | ToolbarChip)[];
26
28
  /** Callback passed by consumer used to close the entire chip group */
@@ -37,6 +39,8 @@ export interface ToolbarFilterProps extends ToolbarItemProps {
37
39
  categoryName: string | ToolbarChipGroup;
38
40
  /** Flag to show the toolbar item */
39
41
  showToolbarItem?: boolean;
42
+ /** Reference to a chip container created with a custom expandable content group, for non-managed multiple toolbar toggle groups. */
43
+ expandableChipContainerRef?: React.RefObject<HTMLDivElement>;
40
44
  }
41
45
 
42
46
  interface ToolbarFilterState {
@@ -90,9 +94,12 @@ class ToolbarFilter extends React.Component<ToolbarFilterProps, ToolbarFilterSta
90
94
  chipGroupCollapsedText,
91
95
  categoryName,
92
96
  showToolbarItem,
97
+ isExpanded,
98
+ expandableChipContainerRef,
93
99
  ...props
94
100
  } = this.props;
95
- const { isExpanded, chipGroupContentRef } = this.context;
101
+ const { isExpanded: managedIsExpanded, chipGroupContentRef } = this.context;
102
+ const _isExpanded = isExpanded !== undefined ? isExpanded : managedIsExpanded;
96
103
  const categoryKey =
97
104
  typeof categoryName !== 'string' && categoryName.hasOwnProperty('key')
98
105
  ? categoryName.key
@@ -123,7 +130,7 @@ class ToolbarFilter extends React.Component<ToolbarFilterProps, ToolbarFilterSta
123
130
  </ToolbarItem>
124
131
  ) : null;
125
132
 
126
- if (!isExpanded && this.state.isMounted) {
133
+ if (!_isExpanded && this.state.isMounted) {
127
134
  return (
128
135
  <React.Fragment>
129
136
  {showToolbarItem && <ToolbarItem {...props}>{children}</ToolbarItem>}
@@ -138,6 +145,9 @@ class ToolbarFilter extends React.Component<ToolbarFilterProps, ToolbarFilterSta
138
145
  <React.Fragment>
139
146
  {showToolbarItem && <ToolbarItem {...props}>{children}</ToolbarItem>}
140
147
  {chipContainerRef.current && ReactDOM.createPortal(chipGroup, chipContainerRef.current)}
148
+ {expandableChipContainerRef &&
149
+ expandableChipContainerRef.current &&
150
+ ReactDOM.createPortal(chipGroup, expandableChipContainerRef.current)}
141
151
  </React.Fragment>
142
152
  )}
143
153
  </ToolbarContentContext.Consumer>
@@ -8,8 +8,13 @@ import { Button } from '../Button';
8
8
  import globalBreakpointLg from '@patternfly/react-tokens/dist/esm/global_breakpoint_lg';
9
9
  import { formatBreakpointMods, toCamel, canUseDOM } from '../../helpers/util';
10
10
  import { PageContext } from '../Page/PageContext';
11
+ import { ToolbarExpandableContent } from './ToolbarExpandableContent';
11
12
 
12
13
  export interface ToolbarToggleGroupProps extends ToolbarGroupProps {
14
+ /** Flag indicating when toggle group is expanded for non-managed toolbar toggle groups. */
15
+ isExpanded?: boolean;
16
+ /** Callback for toggle group click event for non-managed toolbar toggle groups. */
17
+ onToggle?: (event: React.MouseEvent) => void;
13
18
  /** An icon to be rendered when the toggle group has collapsed down */
14
19
  toggleIcon: React.ReactNode;
15
20
  /** Controls when filters are shown and when the toggle button is hidden. */
@@ -46,10 +51,21 @@ export interface ToolbarToggleGroupProps extends ToolbarGroupProps {
46
51
  xl?: 'spaceItemsNone' | 'spaceItemsSm' | 'spaceItemsMd' | 'spaceItemsLg';
47
52
  '2xl'?: 'spaceItemsNone' | 'spaceItemsSm' | 'spaceItemsMd' | 'spaceItemsLg';
48
53
  };
54
+ /** Reference to a chip container group for filters inside the toolbar toggle group */
55
+ chipContainerRef?: React.RefObject<any>;
56
+ /** Optional callback for clearing all filters in the toolbar toggle group */
57
+ clearAllFilters?: () => void;
58
+ /** Flag indicating that the clear all filters button should be visible in the toolbar toggle group */
59
+ showClearFiltersButton?: boolean;
60
+ /** Text to display in the clear all filters button of the toolbar toggle group */
61
+ clearFiltersButtonText?: string;
49
62
  }
50
63
 
51
64
  class ToolbarToggleGroup extends React.Component<ToolbarToggleGroupProps> {
52
65
  static displayName = 'ToolbarToggleGroup';
66
+ toggleRef = React.createRef<HTMLButtonElement>();
67
+ expandableContentRef = React.createRef<HTMLDivElement>();
68
+
53
69
  isContentPopup = () => {
54
70
  const viewportSize = canUseDOM ? window.innerWidth : 1200;
55
71
  const lgBreakpointValue = parseInt(globalBreakpointLg.value);
@@ -67,6 +83,12 @@ class ToolbarToggleGroup extends React.Component<ToolbarToggleGroupProps> {
67
83
  spaceItems,
68
84
  className,
69
85
  children,
86
+ isExpanded,
87
+ onToggle,
88
+ chipContainerRef,
89
+ clearAllFilters,
90
+ showClearFiltersButton,
91
+ clearFiltersButtonText,
70
92
  ...props
71
93
  } = this.props;
72
94
 
@@ -79,64 +101,87 @@ class ToolbarToggleGroup extends React.Component<ToolbarToggleGroupProps> {
79
101
  <PageContext.Consumer>
80
102
  {({ width, getBreakpoint }) => (
81
103
  <ToolbarContext.Consumer>
82
- {({ isExpanded, toggleIsExpanded }) => (
83
- <ToolbarContentContext.Consumer>
84
- {({ expandableContentRef, expandableContentId }) => {
85
- if (expandableContentRef.current && expandableContentRef.current.classList) {
86
- if (isExpanded) {
87
- expandableContentRef.current.classList.add(styles.modifiers.expanded);
88
- } else {
89
- expandableContentRef.current.classList.remove(styles.modifiers.expanded);
90
- }
91
- }
104
+ {({ toggleIsExpanded: managedOnToggle }) => {
105
+ const _onToggle = onToggle !== undefined ? onToggle : managedOnToggle;
106
+
107
+ return (
108
+ <ToolbarContentContext.Consumer>
109
+ {({
110
+ expandableContentRef,
111
+ expandableContentId,
112
+ chipContainerRef: managedChipContainerRef,
113
+ isExpanded: managedIsExpanded,
114
+ clearAllFilters: clearAllFiltersContext,
115
+ clearFiltersButtonText: clearFiltersButtonContext,
116
+ showClearFiltersButton: showClearFiltersButtonContext
117
+ }) => {
118
+ const _isExpanded = isExpanded !== undefined ? isExpanded : managedIsExpanded;
119
+ const _chipContainerRef =
120
+ chipContainerRef !== undefined ? chipContainerRef : managedChipContainerRef;
121
+
122
+ const breakpointMod: {
123
+ md?: 'show';
124
+ lg?: 'show';
125
+ xl?: 'show';
126
+ '2xl'?: 'show';
127
+ } = {};
128
+ breakpointMod[breakpoint] = 'show';
92
129
 
93
- const breakpointMod: {
94
- md?: 'show';
95
- lg?: 'show';
96
- xl?: 'show';
97
- '2xl'?: 'show';
98
- } = {};
99
- breakpointMod[breakpoint] = 'show';
130
+ const expandableContent = (
131
+ <ToolbarExpandableContent
132
+ id={expandableContentId}
133
+ expandableContentRef={this.expandableContentRef}
134
+ isExpanded={_isExpanded}
135
+ clearAllFilters={clearAllFilters || clearAllFiltersContext}
136
+ showClearFiltersButton={showClearFiltersButton || showClearFiltersButtonContext}
137
+ clearFiltersButtonText={clearFiltersButtonText || clearFiltersButtonContext}
138
+ chipContainerRef={_chipContainerRef}
139
+ >
140
+ {children}
141
+ </ToolbarExpandableContent>
142
+ );
100
143
 
101
- return (
102
- <div
103
- className={css(
104
- styles.toolbarGroup,
105
- styles.modifiers.toggleGroup,
106
- variant &&
107
- styles.modifiers[toCamel(variant) as 'filterGroup' | 'iconButtonGroup' | 'buttonGroup'],
108
- formatBreakpointMods(breakpointMod, styles, '', getBreakpoint(width)),
109
- formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
110
- formatBreakpointMods(alignment, styles, '', getBreakpoint(width)),
111
- formatBreakpointMods(spacer, styles, '', getBreakpoint(width)),
112
- formatBreakpointMods(spaceItems, styles, '', getBreakpoint(width)),
113
- className
114
- )}
115
- {...props}
116
- >
144
+ const toggleButton = (
117
145
  <div className={css(styles.toolbarToggle)}>
118
146
  <Button
119
147
  variant="plain"
120
- onClick={toggleIsExpanded}
148
+ onClick={_onToggle}
121
149
  aria-label="Show Filters"
122
- {...(isExpanded && { 'aria-expanded': true })}
123
- aria-haspopup={isExpanded && this.isContentPopup()}
150
+ {...(_isExpanded && { 'aria-expanded': true })}
151
+ aria-haspopup={_isExpanded && this.isContentPopup()}
124
152
  aria-controls={expandableContentId}
153
+ ref={this.toggleRef}
125
154
  >
126
155
  {toggleIcon}
127
156
  </Button>
128
157
  </div>
129
- {isExpanded
130
- ? (ReactDOM.createPortal(
131
- children,
132
- expandableContentRef.current.firstElementChild
133
- ) as React.ReactElement)
134
- : children}
135
- </div>
136
- );
137
- }}
138
- </ToolbarContentContext.Consumer>
139
- )}
158
+ );
159
+
160
+ return (
161
+ <div
162
+ className={css(
163
+ styles.toolbarGroup,
164
+ styles.modifiers.toggleGroup,
165
+ variant &&
166
+ styles.modifiers[toCamel(variant) as 'filterGroup' | 'iconButtonGroup' | 'buttonGroup'],
167
+ formatBreakpointMods(breakpointMod, styles, '', getBreakpoint(width)),
168
+ formatBreakpointMods(visibility, styles, '', getBreakpoint(width)),
169
+ formatBreakpointMods(alignment, styles, '', getBreakpoint(width)),
170
+ formatBreakpointMods(spacer, styles, '', getBreakpoint(width)),
171
+ formatBreakpointMods(spaceItems, styles, '', getBreakpoint(width)),
172
+ className
173
+ )}
174
+ {...props}
175
+ >
176
+ {toggleButton}
177
+ {_isExpanded && ReactDOM.createPortal(expandableContent, expandableContentRef.current)}
178
+ {!_isExpanded && children}
179
+ </div>
180
+ );
181
+ }}
182
+ </ToolbarContentContext.Consumer>
183
+ );
184
+ }}
140
185
  </ToolbarContext.Consumer>
141
186
  )}
142
187
  </PageContext.Consumer>
@@ -31,12 +31,17 @@ interface ToolbarContentContextProps {
31
31
  expandableContentRef: RefObject<HTMLDivElement>;
32
32
  expandableContentId: string;
33
33
  chipContainerRef: RefObject<any>;
34
+ isExpanded?: boolean;
35
+ clearAllFilters?: () => void;
36
+ clearFiltersButtonText?: string;
37
+ showClearFiltersButton?: boolean;
34
38
  }
35
39
 
36
40
  export const ToolbarContentContext = React.createContext<ToolbarContentContextProps>({
37
41
  expandableContentRef: null,
38
42
  expandableContentId: '',
39
- chipContainerRef: null
43
+ chipContainerRef: null,
44
+ clearAllFilters: () => {}
40
45
  });
41
46
 
42
47
  export const globalBreakpoints = {
@@ -12,14 +12,6 @@ exports[`ToolbarContent should match snapshot (auto-generated) 1`] = `
12
12
  ReactNode
13
13
  </div>
14
14
  </div>
15
- <div
16
- class="pf-v5-c-toolbar__expandable-content"
17
- id="string-expandable-content-0"
18
- >
19
- <div
20
- class="pf-v5-c-toolbar__group"
21
- />
22
- </div>
23
15
  </div>
24
16
  </DocumentFragment>
25
17
  `;