@patternfly/react-core 6.3.0-prerelease.2 → 6.3.0-prerelease.20

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 (386) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/CONTRIBUTING.md +3 -5
  3. package/components/package.json +1 -1
  4. package/deprecated/package.json +1 -1
  5. package/dist/dynamic/components/AboutModal/package.json +1 -1
  6. package/dist/dynamic/components/Accordion/package.json +1 -1
  7. package/dist/dynamic/components/ActionList/package.json +1 -1
  8. package/dist/dynamic/components/Alert/package.json +1 -1
  9. package/dist/dynamic/components/Avatar/package.json +1 -1
  10. package/dist/dynamic/components/BackToTop/package.json +1 -1
  11. package/dist/dynamic/components/Backdrop/package.json +1 -1
  12. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  13. package/dist/dynamic/components/Badge/package.json +1 -1
  14. package/dist/dynamic/components/Banner/package.json +1 -1
  15. package/dist/dynamic/components/Brand/package.json +1 -1
  16. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  17. package/dist/dynamic/components/Button/package.json +1 -1
  18. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  19. package/dist/dynamic/components/Card/package.json +1 -1
  20. package/dist/dynamic/components/Checkbox/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/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/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/TextArea/package.json +1 -1
  72. package/dist/dynamic/components/TextInput/package.json +1 -1
  73. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  74. package/dist/dynamic/components/TimePicker/package.json +1 -1
  75. package/dist/dynamic/components/Timestamp/package.json +1 -1
  76. package/dist/dynamic/components/Title/package.json +1 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  78. package/dist/dynamic/components/Toolbar/package.json +1 -1
  79. package/dist/dynamic/components/Tooltip/package.json +1 -1
  80. package/dist/dynamic/components/TreeView/package.json +1 -1
  81. package/dist/dynamic/components/Truncate/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/package.json +1 -1
  91. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  92. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  93. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  94. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  95. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  96. package/dist/dynamic/helpers/constants/package.json +1 -1
  97. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  99. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  100. package/dist/dynamic/helpers/package.json +1 -1
  101. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  102. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  104. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  105. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  106. package/dist/dynamic/helpers/util/package.json +1 -1
  107. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  108. package/dist/dynamic/layouts/Flex/package.json +1 -1
  109. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  110. package/dist/dynamic/layouts/Grid/package.json +1 -1
  111. package/dist/dynamic/layouts/Level/package.json +1 -1
  112. package/dist/dynamic/layouts/Split/package.json +1 -1
  113. package/dist/dynamic/layouts/Stack/package.json +1 -1
  114. package/dist/dynamic/styles/package.json +1 -1
  115. package/dist/dynamic-modules.json +2 -0
  116. package/dist/esm/components/Button/Button.d.ts +4 -0
  117. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  118. package/dist/esm/components/Button/Button.js +20 -3
  119. package/dist/esm/components/Button/Button.js.map +1 -1
  120. package/dist/esm/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  121. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js +2 -2
  122. package/dist/esm/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  123. package/dist/esm/components/DualListSelector/DualListSelector.d.ts +5 -0
  124. package/dist/esm/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  125. package/dist/esm/components/DualListSelector/DualListSelector.js +4 -3
  126. package/dist/esm/components/DualListSelector/DualListSelector.js.map +1 -1
  127. package/dist/esm/components/DualListSelector/DualListSelectorContext.d.ts +1 -0
  128. package/dist/esm/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -1
  129. package/dist/esm/components/DualListSelector/DualListSelectorContext.js +1 -1
  130. package/dist/esm/components/DualListSelector/DualListSelectorContext.js.map +1 -1
  131. package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -1
  132. package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.js +1 -1
  133. package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -1
  134. package/dist/esm/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -1
  135. package/dist/esm/components/DualListSelector/DualListSelectorTree.js +4 -1
  136. package/dist/esm/components/DualListSelector/DualListSelectorTree.js.map +1 -1
  137. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts +5 -0
  138. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
  139. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js +8 -4
  140. package/dist/esm/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
  141. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts +5 -0
  142. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  143. package/dist/esm/components/Form/FormFieldGroupExpandable.js +2 -2
  144. package/dist/esm/components/Form/FormFieldGroupExpandable.js.map +1 -1
  145. package/dist/esm/components/Form/FormGroupLabelHelp.js +2 -2
  146. package/dist/esm/components/Form/FormGroupLabelHelp.js.map +1 -1
  147. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts +5 -0
  148. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  149. package/dist/esm/components/Form/InternalFormFieldGroup.js +2 -2
  150. package/dist/esm/components/Form/InternalFormFieldGroup.js.map +1 -1
  151. package/dist/esm/components/Nav/NavExpandable.d.ts.map +1 -1
  152. package/dist/esm/components/Nav/NavExpandable.js +1 -1
  153. package/dist/esm/components/Nav/NavExpandable.js.map +1 -1
  154. package/dist/esm/components/SearchInput/SearchInput.d.ts +2 -0
  155. package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
  156. package/dist/esm/components/SearchInput/SearchInput.js +2 -2
  157. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  158. package/dist/esm/components/Tabs/OverflowTab.d.ts +26 -0
  159. package/dist/esm/components/Tabs/OverflowTab.d.ts.map +1 -1
  160. package/dist/esm/components/Tabs/OverflowTab.js +2 -2
  161. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -1
  162. package/dist/esm/components/Tabs/Tab.d.ts.map +1 -1
  163. package/dist/esm/components/Tabs/Tab.js +5 -2
  164. package/dist/esm/components/Tabs/Tab.js.map +1 -1
  165. package/dist/esm/components/Tabs/Tabs.d.ts +8 -0
  166. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  167. package/dist/esm/components/Tabs/Tabs.js +41 -9
  168. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  169. package/dist/esm/components/Tabs/TabsContext.d.ts +1 -0
  170. package/dist/esm/components/Tabs/TabsContext.d.ts.map +1 -1
  171. package/dist/esm/components/Tabs/TabsContext.js +1 -0
  172. package/dist/esm/components/Tabs/TabsContext.js.map +1 -1
  173. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  174. package/dist/esm/components/TreeView/TreeViewListItem.js +1 -1
  175. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  176. package/dist/esm/components/Truncate/Truncate.d.ts +11 -8
  177. package/dist/esm/components/Truncate/Truncate.d.ts.map +1 -1
  178. package/dist/esm/components/Truncate/Truncate.js +22 -12
  179. package/dist/esm/components/Truncate/Truncate.js.map +1 -1
  180. package/dist/esm/demos/sampleData.d.ts.map +1 -1
  181. package/dist/esm/demos/sampleData.js +225 -226
  182. package/dist/esm/demos/sampleData.js.map +1 -1
  183. package/dist/esm/demos/sampleDataRTL.d.ts +7 -0
  184. package/dist/esm/demos/sampleDataRTL.d.ts.map +1 -0
  185. package/dist/esm/demos/sampleDataRTL.js +128 -0
  186. package/dist/esm/demos/sampleDataRTL.js.map +1 -0
  187. package/dist/esm/helpers/KeyboardHandler.js +3 -2
  188. package/dist/esm/helpers/KeyboardHandler.js.map +1 -1
  189. package/dist/esm/helpers/Popper/Popper.d.ts.map +1 -1
  190. package/dist/esm/helpers/Popper/Popper.js +1 -0
  191. package/dist/esm/helpers/Popper/Popper.js.map +1 -1
  192. package/dist/esm/helpers/util.d.ts +17 -0
  193. package/dist/esm/helpers/util.d.ts.map +1 -1
  194. package/dist/esm/helpers/util.js +36 -0
  195. package/dist/esm/helpers/util.js.map +1 -1
  196. package/dist/js/components/Button/Button.d.ts +4 -0
  197. package/dist/js/components/Button/Button.d.ts.map +1 -1
  198. package/dist/js/components/Button/Button.js +20 -3
  199. package/dist/js/components/Button/Button.js.map +1 -1
  200. package/dist/js/components/ClipboardCopy/ClipboardCopy.d.ts.map +1 -1
  201. package/dist/js/components/ClipboardCopy/ClipboardCopy.js +2 -2
  202. package/dist/js/components/ClipboardCopy/ClipboardCopy.js.map +1 -1
  203. package/dist/js/components/DualListSelector/DualListSelector.d.ts +5 -0
  204. package/dist/js/components/DualListSelector/DualListSelector.d.ts.map +1 -1
  205. package/dist/js/components/DualListSelector/DualListSelector.js +4 -3
  206. package/dist/js/components/DualListSelector/DualListSelector.js.map +1 -1
  207. package/dist/js/components/DualListSelector/DualListSelectorContext.d.ts +1 -0
  208. package/dist/js/components/DualListSelector/DualListSelectorContext.d.ts.map +1 -1
  209. package/dist/js/components/DualListSelector/DualListSelectorContext.js +1 -1
  210. package/dist/js/components/DualListSelector/DualListSelectorContext.js.map +1 -1
  211. package/dist/js/components/DualListSelector/DualListSelectorListWrapper.d.ts.map +1 -1
  212. package/dist/js/components/DualListSelector/DualListSelectorListWrapper.js +1 -1
  213. package/dist/js/components/DualListSelector/DualListSelectorListWrapper.js.map +1 -1
  214. package/dist/js/components/DualListSelector/DualListSelectorTree.d.ts.map +1 -1
  215. package/dist/js/components/DualListSelector/DualListSelectorTree.js +4 -1
  216. package/dist/js/components/DualListSelector/DualListSelectorTree.js.map +1 -1
  217. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts +5 -0
  218. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.d.ts.map +1 -1
  219. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js +7 -3
  220. package/dist/js/components/DualListSelector/DualListSelectorTreeItem.js.map +1 -1
  221. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts +5 -0
  222. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  223. package/dist/js/components/Form/FormFieldGroupExpandable.js +2 -2
  224. package/dist/js/components/Form/FormFieldGroupExpandable.js.map +1 -1
  225. package/dist/js/components/Form/FormGroupLabelHelp.js +2 -2
  226. package/dist/js/components/Form/FormGroupLabelHelp.js.map +1 -1
  227. package/dist/js/components/Form/InternalFormFieldGroup.d.ts +5 -0
  228. package/dist/js/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  229. package/dist/js/components/Form/InternalFormFieldGroup.js +2 -2
  230. package/dist/js/components/Form/InternalFormFieldGroup.js.map +1 -1
  231. package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
  232. package/dist/js/components/Nav/NavExpandable.js +1 -1
  233. package/dist/js/components/Nav/NavExpandable.js.map +1 -1
  234. package/dist/js/components/SearchInput/SearchInput.d.ts +2 -0
  235. package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
  236. package/dist/js/components/SearchInput/SearchInput.js +2 -2
  237. package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
  238. package/dist/js/components/Tabs/OverflowTab.d.ts +26 -0
  239. package/dist/js/components/Tabs/OverflowTab.d.ts.map +1 -1
  240. package/dist/js/components/Tabs/OverflowTab.js +2 -2
  241. package/dist/js/components/Tabs/OverflowTab.js.map +1 -1
  242. package/dist/js/components/Tabs/Tab.d.ts.map +1 -1
  243. package/dist/js/components/Tabs/Tab.js +4 -1
  244. package/dist/js/components/Tabs/Tab.js.map +1 -1
  245. package/dist/js/components/Tabs/Tabs.d.ts +8 -0
  246. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  247. package/dist/js/components/Tabs/Tabs.js +40 -8
  248. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  249. package/dist/js/components/Tabs/TabsContext.d.ts +1 -0
  250. package/dist/js/components/Tabs/TabsContext.d.ts.map +1 -1
  251. package/dist/js/components/Tabs/TabsContext.js +1 -0
  252. package/dist/js/components/Tabs/TabsContext.js.map +1 -1
  253. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  254. package/dist/js/components/TreeView/TreeViewListItem.js +1 -1
  255. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  256. package/dist/js/components/Truncate/Truncate.d.ts +11 -8
  257. package/dist/js/components/Truncate/Truncate.d.ts.map +1 -1
  258. package/dist/js/components/Truncate/Truncate.js +21 -12
  259. package/dist/js/components/Truncate/Truncate.js.map +1 -1
  260. package/dist/js/demos/sampleData.d.ts.map +1 -1
  261. package/dist/js/demos/sampleData.js +225 -226
  262. package/dist/js/demos/sampleData.js.map +1 -1
  263. package/dist/js/demos/sampleDataRTL.d.ts +7 -0
  264. package/dist/js/demos/sampleDataRTL.d.ts.map +1 -0
  265. package/dist/js/demos/sampleDataRTL.js +131 -0
  266. package/dist/js/demos/sampleDataRTL.js.map +1 -0
  267. package/dist/js/helpers/KeyboardHandler.js +3 -2
  268. package/dist/js/helpers/KeyboardHandler.js.map +1 -1
  269. package/dist/js/helpers/Popper/Popper.d.ts.map +1 -1
  270. package/dist/js/helpers/Popper/Popper.js +1 -0
  271. package/dist/js/helpers/Popper/Popper.js.map +1 -1
  272. package/dist/js/helpers/util.d.ts +17 -0
  273. package/dist/js/helpers/util.d.ts.map +1 -1
  274. package/dist/js/helpers/util.js +39 -1
  275. package/dist/js/helpers/util.js.map +1 -1
  276. package/dist/styles/assets/images/icon-help.hbs +3 -0
  277. package/dist/styles/assets/images/icon-outlined-star.hbs +3 -0
  278. package/dist/styles/assets/images/icon-star.hbs +3 -0
  279. package/dist/styles/base-no-reset.css +11 -11
  280. package/dist/styles/base.css +11 -11
  281. package/dist/umd/assets/{output-CTQ3-b33.css → output-DzgMn5vn.css} +18950 -18401
  282. package/dist/umd/react-core.min.js +3 -3
  283. package/helpers/package.json +1 -1
  284. package/layouts/package.json +1 -1
  285. package/next/package.json +1 -1
  286. package/package.json +6 -6
  287. package/src/components/Button/Button.tsx +48 -5
  288. package/src/components/Button/__tests__/Button.test.tsx +25 -0
  289. package/src/components/Button/examples/Button.md +8 -1
  290. package/src/components/Button/examples/ButtonFavorite.tsx +18 -0
  291. package/src/components/Card/examples/Card.md +1 -1
  292. package/src/components/Card/examples/CardSelectable.tsx +73 -60
  293. package/src/components/Card/examples/CardSingleSelectable.tsx +65 -48
  294. package/src/components/ClipboardCopy/ClipboardCopy.tsx +2 -1
  295. package/src/components/DualListSelector/DualListSelector.tsx +18 -4
  296. package/src/components/DualListSelector/DualListSelectorContext.ts +2 -1
  297. package/src/components/DualListSelector/DualListSelectorListWrapper.tsx +8 -5
  298. package/src/components/DualListSelector/DualListSelectorTree.tsx +4 -0
  299. package/src/components/DualListSelector/DualListSelectorTreeItem.tsx +17 -2
  300. package/src/components/DualListSelector/__tests__/DualListSelector.test.tsx +32 -1
  301. package/src/components/DualListSelector/__tests__/DualListSelectorTreeItem.test.tsx +55 -0
  302. package/src/components/DualListSelector/examples/DualListSelectorTree.tsx +1 -1
  303. package/src/components/Form/FormFieldGroupExpandable.tsx +7 -0
  304. package/src/components/Form/FormGroupLabelHelp.tsx +2 -2
  305. package/src/components/Form/InternalFormFieldGroup.tsx +19 -3
  306. package/src/components/Form/__tests__/FormFieldGroupExpandable.test.tsx +55 -0
  307. package/src/components/Form/examples/FormFieldGroups.tsx +7 -1
  308. package/src/components/LoginPage/examples/LoginPageBasic.tsx +1 -1
  309. package/src/components/LoginPage/examples/LoginPageLanguageSelect.tsx +1 -1
  310. package/src/components/LoginPage/examples/LoginPageShowHidePassword.tsx +1 -1
  311. package/src/components/Nav/NavExpandable.tsx +6 -1
  312. package/src/components/Nav/__tests__/Generated/__snapshots__/NavExpandable.test.tsx.snap +1 -0
  313. package/src/components/Nav/__tests__/NavExpandable.test.tsx +15 -0
  314. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +3 -0
  315. package/src/components/Page/examples/Page.md +1 -1
  316. package/src/components/Page/examples/PageCenteredSection.tsx +3 -4
  317. package/src/components/Page/examples/PageGroupSection.tsx +9 -3
  318. package/src/components/Page/examples/PageHorizontalNav.tsx +9 -3
  319. package/src/components/Page/examples/PageMainSectionPadding.tsx +12 -4
  320. package/src/components/Page/examples/PageMainSectionVariations.tsx +6 -6
  321. package/src/components/Page/examples/PageMultipleSidebarBody.tsx +9 -3
  322. package/src/components/Page/examples/PageUncontrolledNav.tsx +9 -3
  323. package/src/components/Page/examples/PageVerticalNav.tsx +9 -3
  324. package/src/components/Page/examples/PageWithOrWithoutFill.tsx +8 -4
  325. package/src/components/SearchInput/SearchInput.tsx +8 -1
  326. package/src/components/Select/examples/Select.md +3 -26
  327. package/src/components/Skeleton/examples/SkeletonText.tsx +0 -1
  328. package/src/components/Tabs/OverflowTab.tsx +29 -0
  329. package/src/components/Tabs/Tab.tsx +6 -2
  330. package/src/components/Tabs/Tabs.tsx +70 -11
  331. package/src/components/Tabs/TabsContext.ts +2 -0
  332. package/src/components/Tabs/__tests__/Tabs.test.tsx +43 -1
  333. package/src/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +39 -26
  334. package/src/components/Tabs/examples/Tabs.md +1 -1
  335. package/src/components/Timestamp/examples/TimestampBasicFormats.tsx +1 -1
  336. package/src/components/Timestamp/examples/TimestampDefaultTooltip.tsx +1 -1
  337. package/src/components/TreeView/TreeViewListItem.tsx +1 -3
  338. package/src/components/TreeView/__tests__/TreeViewListItem.test.tsx +10 -0
  339. package/src/components/Truncate/Truncate.tsx +48 -22
  340. package/src/components/Truncate/__tests__/Truncate.test.tsx +28 -2
  341. package/src/components/Truncate/__tests__/__snapshots__/Truncate.test.tsx.snap +2 -2
  342. package/src/components/Truncate/examples/Truncate.md +8 -0
  343. package/src/components/Truncate/examples/TruncateLinks.tsx +22 -0
  344. package/src/demos/Banner.md +6 -6
  345. package/src/demos/CardDemos.md +1 -1
  346. package/src/demos/CardView/examples/CardView.tsx +9 -4
  347. package/src/demos/DataList/examples/DataListActionable.tsx +5 -3
  348. package/src/demos/DataList/examples/DataListBasic.tsx +2 -2
  349. package/src/demos/DataList/examples/DataListExpandableControlInToolbar.tsx +2 -2
  350. package/src/demos/DataList/examples/DataListStaticBottomPagination.tsx +4 -2
  351. package/src/demos/DescriptionList/examples/DescriptionListBasic.tsx +4 -4
  352. package/src/demos/DescriptionList/examples/DescriptionListInDrawer.tsx +5 -3
  353. package/src/demos/JumpLinks.md +5 -5
  354. package/src/demos/PasswordGenerator.md +1 -1
  355. package/src/demos/RTL/RTL.md +1 -0
  356. package/src/demos/RTL/examples/PaginatedTable.tsx +16 -44
  357. package/src/demos/Tabs.md +6 -6
  358. package/src/demos/examples/AlertGroup/AlertGroupToastWithNotificationDrawer.tsx +6 -6
  359. package/src/demos/examples/BackToTop/BackToTopNameDemo.tsx +2 -2
  360. package/src/demos/examples/Card/CardAggregateStatus.tsx +2 -6
  361. package/src/demos/examples/Card/CardDetails.tsx +2 -3
  362. package/src/demos/examples/Card/CardEventsView.tsx +2 -3
  363. package/src/demos/examples/Card/CardLogView.tsx +2 -3
  364. package/src/demos/examples/Card/CardStatus.tsx +0 -1
  365. package/src/demos/examples/Card/CardUtilizationDemo3.tsx +0 -1
  366. package/src/demos/examples/Masthead/MastheadWithHorizontalNav.tsx +5 -3
  367. package/src/demos/examples/Masthead/MastheadWithUtilitiesAndUserDropdownMenu.tsx +3 -3
  368. package/src/demos/examples/Nav/NavDefault.tsx +3 -3
  369. package/src/demos/examples/Nav/NavDrilldown.tsx +1 -1
  370. package/src/demos/examples/Nav/NavExpandable.tsx +3 -3
  371. package/src/demos/examples/Nav/NavFlyout.tsx +9 -3
  372. package/src/demos/examples/Nav/NavGrouped.tsx +14 -6
  373. package/src/demos/examples/Nav/NavHorizontal.tsx +3 -3
  374. package/src/demos/examples/Nav/NavHorizontalWithSubnav.tsx +5 -5
  375. package/src/demos/examples/Nav/NavManual.tsx +3 -3
  376. package/src/demos/examples/Nav/NavWithSubnav.tsx +5 -5
  377. package/src/demos/examples/Tabs/ModalTabs.tsx +3 -3
  378. package/src/demos/examples/Tabs/NestedTabs.tsx +2 -2
  379. package/src/demos/examples/Tabs/NestedUnindentedTabs.tsx +2 -2
  380. package/src/demos/examples/Tabs/TabsAndTable.tsx +3 -3
  381. package/src/demos/sampleData.tsx +225 -227
  382. package/src/demos/sampleDataRTL.tsx +133 -0
  383. package/src/helpers/KeyboardHandler.tsx +2 -2
  384. package/src/helpers/Popper/Popper.tsx +1 -0
  385. package/src/helpers/util.ts +45 -0
  386. package/src/demos/RTL/examples/PaginatedTable.jsx +0 -504
@@ -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.3.0-prerelease.1","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.3.0-prerelease.19","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.3.0-prerelease.1","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.3.0-prerelease.19","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.3.0-prerelease.1","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.3.0-prerelease.19","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.3.0-prerelease.2",
3
+ "version": "6.3.0-prerelease.20",
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,15 +46,15 @@
46
46
  "subpaths": "node ../../scripts/exportSubpaths.mjs --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.3.0-prerelease.1",
50
- "@patternfly/react-styles": "^6.3.0-prerelease.1",
51
- "@patternfly/react-tokens": "^6.3.0-prerelease.1",
49
+ "@patternfly/react-icons": "^6.3.0-prerelease.5",
50
+ "@patternfly/react-styles": "^6.3.0-prerelease.5",
51
+ "@patternfly/react-tokens": "^6.3.0-prerelease.5",
52
52
  "focus-trap": "7.6.4",
53
53
  "react-dropzone": "^14.3.5",
54
54
  "tslib": "^2.8.1"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "6.3.0-prerelease.6",
57
+ "@patternfly/patternfly": "6.3.0-prerelease.26",
58
58
  "case-anything": "^3.1.2",
59
59
  "css": "^3.0.0",
60
60
  "fs-extra": "^11.3.0"
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "b9a84887122c428ff6d9d6dd8246a5f2b34e18a7"
66
+ "gitHead": "9e7c8ba6afb5ad01cbac427089f8f9032e523628"
67
67
  }
@@ -4,6 +4,8 @@ import { css } from '@patternfly/react-styles';
4
4
  import { Spinner, spinnerSize } from '../Spinner';
5
5
  import { useOUIAProps, OUIAProps } from '../../helpers/OUIA/ouia';
6
6
  import { Badge } from '../Badge';
7
+ import StarIcon from '@patternfly/react-icons/dist/esm/icons/star-icon';
8
+ import OutlinedStarIcon from '@patternfly/react-icons/dist/esm/icons/outlined-star-icon';
7
9
 
8
10
  export enum ButtonVariant {
9
11
  primary = 'primary',
@@ -71,6 +73,10 @@ export interface ButtonProps extends Omit<React.HTMLProps<HTMLButtonElement>, 'r
71
73
  inoperableEvents?: string[];
72
74
  /** Adds inline styling to a link button */
73
75
  isInline?: boolean;
76
+ /** Adds favorite styling to a button */
77
+ isFavorite?: boolean;
78
+ /** Flag indicating whether the button is favorited or not, only when isFavorite is true. */
79
+ isFavorited?: boolean;
74
80
  /** Adds styling which affects the size of the button */
75
81
  size?: 'default' | 'sm' | 'lg';
76
82
  /** Sets button type */
@@ -117,6 +123,8 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
117
123
  size = ButtonSize.default,
118
124
  inoperableEvents = ['onClick', 'onKeyPress'],
119
125
  isInline = false,
126
+ isFavorite = false,
127
+ isFavorited = false,
120
128
  type = ButtonType.button,
121
129
  variant = ButtonVariant.primary,
122
130
  state = ButtonState.unread,
@@ -132,11 +140,19 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
132
140
  countOptions,
133
141
  ...props
134
142
  }: ButtonProps) => {
143
+ if (isFavorite && !ariaLabel && !props['aria-labelledby']) {
144
+ // eslint-disable-next-line no-console
145
+ console.error(
146
+ 'Button: Each favorite button must have a unique accessible name provided via aria-label or aria-labelledby'
147
+ );
148
+ }
149
+
135
150
  const ouiaProps = useOUIAProps(Button.displayName, ouiaId, ouiaSafe, variant);
136
151
  const Component = component as any;
137
152
  const isButtonElement = Component === 'button';
138
153
  const isInlineSpan = isInline && Component === 'span';
139
154
  const isIconAlignedAtEnd = iconPosition === 'end' || iconPosition === 'right';
155
+ const shouldOverrideIcon = isFavorite;
140
156
 
141
157
  const preventedEvents = inoperableEvents.reduce(
142
158
  (handlers, eventToPrevent) => ({
@@ -158,11 +174,36 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
158
174
  }
159
175
  };
160
176
 
161
- const _icon = icon && (
162
- <span className={css(styles.buttonIcon, children && styles.modifiers[isIconAlignedAtEnd ? 'end' : 'start'])}>
163
- {icon}
164
- </span>
165
- );
177
+ const renderIcon = () => {
178
+ let iconContent;
179
+
180
+ if (isFavorite) {
181
+ iconContent = (
182
+ <>
183
+ <span className={css('pf-v6-c-button__icon-favorite')}>
184
+ <OutlinedStarIcon />
185
+ </span>
186
+ <span className={css('pf-v6-c-button__icon-favorited')}>
187
+ <StarIcon />
188
+ </span>
189
+ </>
190
+ );
191
+ }
192
+
193
+ if (icon && !shouldOverrideIcon) {
194
+ iconContent = icon;
195
+ }
196
+
197
+ return (
198
+ iconContent && (
199
+ <span className={css(styles.buttonIcon, children && styles.modifiers[isIconAlignedAtEnd ? 'end' : 'start'])}>
200
+ {iconContent}
201
+ </span>
202
+ )
203
+ );
204
+ };
205
+
206
+ const _icon = renderIcon();
166
207
  const _children = children && <span className={css('pf-v6-c-button__text')}>{children}</span>;
167
208
  // We only want to render the aria-disabled attribute when true, similar to the disabled attribute natively.
168
209
  const shouldRenderAriaDisabled = isAriaDisabled || (!isButtonElement && isDisabled);
@@ -181,6 +222,8 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
181
222
  isAriaDisabled && styles.modifiers.ariaDisabled,
182
223
  isClicked && styles.modifiers.clicked,
183
224
  isInline && variant === ButtonVariant.link && styles.modifiers.inline,
225
+ isFavorite && styles.modifiers.favorite,
226
+ isFavorite && isFavorited && styles.modifiers.favorited,
184
227
  isDanger && (variant === ButtonVariant.secondary || variant === ButtonVariant.link) && styles.modifiers.danger,
185
228
  isLoading !== null && variant !== ButtonVariant.plain && styles.modifiers.progress,
186
229
  isLoading && styles.modifiers.inProgress,
@@ -248,3 +248,28 @@ test(`Renders basic button`, () => {
248
248
  const { asFragment } = render(<Button aria-label="basic button">Basic Button</Button>);
249
249
  expect(asFragment()).toMatchSnapshot();
250
250
  });
251
+
252
+ test(`Renders with class ${styles.modifiers.favorite} when isFavorite is true`, () => {
253
+ render(<Button isFavorite />);
254
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.favorite);
255
+ });
256
+
257
+ test(`Renders with class ${styles.modifiers.favorited} when isFavorite is true and isFavorited is true`, () => {
258
+ render(<Button isFavorite isFavorited />);
259
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.favorited);
260
+ });
261
+
262
+ test(`Does not render with class ${styles.modifiers.favorite} when isFavorite is false`, () => {
263
+ render(<Button />);
264
+ expect(screen.getByRole('button')).not.toHaveClass(styles.modifiers.favorite);
265
+ });
266
+
267
+ test(`Does not render with class ${styles.modifiers.favorited} when isFavorite is true and isFavorited is false`, () => {
268
+ render(<Button isFavorite />);
269
+ expect(screen.getByRole('button')).not.toHaveClass(styles.modifiers.favorited);
270
+ });
271
+
272
+ test('Overrides icon prop when isFavorite is true', () => {
273
+ render(<Button isFavorite icon={<div>Icon content</div>} />);
274
+ expect(screen.queryByText('Icon content')).not.toBeInTheDocument();
275
+ });
@@ -125,6 +125,13 @@ Stateful buttons are ideal for displaying the state of notifications. Use `varia
125
125
  ```ts file="./ButtonStateful.tsx"
126
126
  ```
127
127
 
128
+ ### Favorite
129
+
130
+ You can pass both the `isFavorite` and `variant="plain"` properties into the `<Button>` to create a favorite button. Passing the `isFavorited` property will determine the current favorited state and update styling accordingly.
131
+
132
+ ```ts file = "./ButtonFavorite.tsx"
133
+ ```
134
+
128
135
  ## Using router links
129
136
 
130
137
  Router links can be used for in-app linking in React environments to prevent page reloading. To use a `Link` component from a router package, you can follow our [custom component example](#custom-component) and pass a callback to the `component` property of the `Button`:
@@ -133,4 +140,4 @@ Router links can be used for in-app linking in React environments to prevent pag
133
140
  <Button variant="link" component={(props: any) => <Link {...props} to="#" />}>
134
141
  Router link
135
142
  </Button>
136
- ```
143
+ ```
@@ -0,0 +1,18 @@
1
+ import { useState } from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+
4
+ export const ButtonFavorite: React.FunctionComponent = () => {
5
+ const [isFavorited, setIsFavorited] = useState(false);
6
+ const toggleFavorite = () => {
7
+ setIsFavorited(!isFavorited);
8
+ };
9
+ return (
10
+ <Button
11
+ variant="plain"
12
+ aria-label={isFavorited ? 'Favorite example favorited' : 'Favorite example not favorited'}
13
+ isFavorite
14
+ isFavorited={isFavorited}
15
+ onClick={toggleFavorite}
16
+ />
17
+ );
18
+ };
@@ -131,7 +131,7 @@ You must avoid rendering any other interactive content within the `<Card>` when
131
131
 
132
132
  ### Single selectable
133
133
 
134
- When a group of single selectable cards are related, you must pass the same `name` property to each card's `selectableActions` property.
134
+ When a group of single selectable cards are related, you must pass the same `name` property to each card's `selectableActions` property. For more guidance on selectable cards with hidden input, see our [cards as tiles examples](#cards-as-tiles).
135
135
 
136
136
  ```ts file='./CardSingleSelectable.tsx'
137
137
 
@@ -5,7 +5,8 @@ export const SelectableCard: React.FunctionComponent = () => {
5
5
  const [isChecked1, setIsChecked1] = useState(false);
6
6
  const [isChecked2, setIsChecked2] = useState(false);
7
7
  const [isChecked3, setIsChecked3] = useState(false);
8
- const [isSecondary, setIsSecondary] = useState<boolean>(false);
8
+ const [isSecondary, setIsSecondary] = useState(false);
9
+ const [displayCheckbox, setDisplayCheckbox] = useState(false);
9
10
 
10
11
  const id1 = 'selectable-card-input-1';
11
12
  const id2 = 'selectable-card-input-2';
@@ -31,6 +32,10 @@ export const SelectableCard: React.FunctionComponent = () => {
31
32
  setIsSecondary(checked);
32
33
  };
33
34
 
35
+ const toggleHide = (checked: boolean) => {
36
+ setDisplayCheckbox(checked);
37
+ };
38
+
34
39
  return (
35
40
  <>
36
41
  <Checkbox
@@ -40,68 +45,76 @@ export const SelectableCard: React.FunctionComponent = () => {
40
45
  id="toggle-variant-selectable"
41
46
  name="toggle-variant"
42
47
  />
43
- <div style={{ marginTop: '15px' }}>
44
- <Gallery hasGutter>
45
- <Card
46
- id="selectable-card-example-1"
47
- isSelectable
48
- isSelected={isChecked1}
49
- variant={isSecondary ? 'secondary' : 'default'}
48
+ <Checkbox
49
+ label="Hide checkbox"
50
+ isChecked={displayCheckbox}
51
+ onChange={(_event, checked) => toggleHide(checked)}
52
+ id="selectable-toggle-hide-checkbox"
53
+ name="toggle-hide"
54
+ />
55
+ <Gallery hasGutter style={{ marginTop: '15px' }}>
56
+ <Card
57
+ id="selectable-card-example-1"
58
+ isSelectable
59
+ isSelected={isChecked1}
60
+ variant={isSecondary ? 'secondary' : 'default'}
61
+ >
62
+ <CardHeader
63
+ selectableActions={{
64
+ selectableActionId: id1,
65
+ selectableActionAriaLabelledby: 'selectable-card-example-1',
66
+ name: id1,
67
+ onChange,
68
+ hasNoOffset: true,
69
+ isHidden: displayCheckbox
70
+ }}
50
71
  >
51
- <CardHeader
52
- selectableActions={{
53
- selectableActionId: id1,
54
- selectableActionAriaLabelledby: 'selectable-card-example-1',
55
- name: id1,
56
- onChange,
57
- hasNoOffset: true
58
- }}
59
- >
60
- <CardTitle>First card</CardTitle>
61
- </CardHeader>
62
- <CardBody>This card is selectable.</CardBody>
63
- </Card>
64
- <Card
65
- id="selectable-card-example-2"
66
- isSelectable
67
- isSelected={isChecked2}
68
- variant={isSecondary ? 'secondary' : 'default'}
72
+ <CardTitle>First card</CardTitle>
73
+ </CardHeader>
74
+ <CardBody>This card is selectable.</CardBody>
75
+ </Card>
76
+ <Card
77
+ id="selectable-card-example-2"
78
+ isSelectable
79
+ isSelected={isChecked2}
80
+ variant={isSecondary ? 'secondary' : 'default'}
81
+ >
82
+ <CardHeader
83
+ selectableActions={{
84
+ selectableActionId: id2,
85
+ selectableActionAriaLabelledby: 'selectable-card-example-2',
86
+ name: id2,
87
+ onChange,
88
+ hasNoOffset: true,
89
+ isHidden: displayCheckbox
90
+ }}
69
91
  >
70
- <CardHeader
71
- selectableActions={{
72
- selectableActionId: id2,
73
- selectableActionAriaLabelledby: 'selectable-card-example-2',
74
- name: id2,
75
- onChange,
76
- hasNoOffset: true
77
- }}
78
- >
79
- <CardTitle>Second card</CardTitle>
80
- </CardHeader>
81
- <CardBody>This card is selectable.</CardBody>
82
- </Card>
83
- <Card
84
- id="selectable-card-example-3"
85
- isSelectable
86
- isDisabled
87
- isSelected={isChecked3}
88
- variant={isSecondary ? 'secondary' : 'default'}
92
+ <CardTitle>Second card</CardTitle>
93
+ </CardHeader>
94
+ <CardBody>This card is selectable.</CardBody>
95
+ </Card>
96
+ <Card
97
+ id="selectable-card-example-3"
98
+ isSelectable
99
+ isDisabled
100
+ isSelected={isChecked3}
101
+ variant={isSecondary ? 'secondary' : 'default'}
102
+ >
103
+ <CardHeader
104
+ selectableActions={{
105
+ selectableActionId: id3,
106
+ selectableActionAriaLabelledby: 'selectable-card-example-3',
107
+ name: id3,
108
+ onChange,
109
+ hasNoOffset: true,
110
+ isHidden: displayCheckbox
111
+ }}
89
112
  >
90
- <CardHeader
91
- selectableActions={{
92
- selectableActionId: id3,
93
- selectableActionAriaLabelledby: 'selectable-card-example-3',
94
- name: id3,
95
- onChange,
96
- hasNoOffset: true
97
- }}
98
- >
99
- <CardTitle>Third card</CardTitle>
100
- </CardHeader>
101
- <CardBody>This card is selectable but disabled.</CardBody>
102
- </Card>
103
- </Gallery>
104
- </div>
113
+ <CardTitle>Third card</CardTitle>
114
+ </CardHeader>
115
+ <CardBody>This card is selectable but disabled.</CardBody>
116
+ </Card>
117
+ </Gallery>
105
118
  </>
106
119
  );
107
120
  };
@@ -1,63 +1,80 @@
1
1
  import { useState } from 'react';
2
- import { Card, CardHeader, CardTitle, CardBody, Gallery } from '@patternfly/react-core';
2
+ import { Card, CardHeader, CardTitle, CardBody, Gallery, Checkbox } from '@patternfly/react-core';
3
3
 
4
4
  export const SingleSelectableCard: React.FunctionComponent = () => {
5
5
  const [isChecked, setIsChecked] = useState('');
6
6
  const id1 = 'single-selectable-card-input-1';
7
7
  const id2 = 'single-selectable-card-input-2';
8
8
  const id3 = 'single-selectable-card-input-3';
9
+ const [displayRadioButton, setDisplayRadioButton] = useState(false);
9
10
 
10
11
  const onChange = (event: React.FormEvent<HTMLInputElement>) => {
11
12
  setIsChecked(event.currentTarget.id);
12
13
  };
13
14
 
15
+ const toggleHide = (checked: boolean) => {
16
+ setDisplayRadioButton(checked);
17
+ };
18
+
14
19
  return (
15
- <Gallery hasGutter>
16
- <Card id="single-selectable-card-example-1" isSelectable isSelected={isChecked === id1}>
17
- <CardHeader
18
- selectableActions={{
19
- selectableActionId: id1,
20
- selectableActionAriaLabelledby: 'single-selectable-card-example-1',
21
- name: 'single-selectable-card-example',
22
- variant: 'single',
23
- onChange,
24
- hasNoOffset: true
25
- }}
26
- >
27
- <CardTitle>First card</CardTitle>
28
- </CardHeader>
29
- <CardBody>This card is single selectable.</CardBody>
30
- </Card>
31
- <Card id="single-selectable-card-example-2" isSelectable isSelected={isChecked === id2}>
32
- <CardHeader
33
- selectableActions={{
34
- selectableActionId: id2,
35
- selectableActionAriaLabelledby: 'single-selectable-card-example-2',
36
- name: 'single-selectable-card-example',
37
- variant: 'single',
38
- onChange,
39
- hasNoOffset: true
40
- }}
41
- >
42
- <CardTitle>Second card</CardTitle>
43
- </CardHeader>
44
- <CardBody>This card is single selectable.</CardBody>
45
- </Card>
46
- <Card id="single-selectable-card-example-3" isSelectable isDisabled isSelected={isChecked === id3}>
47
- <CardHeader
48
- selectableActions={{
49
- selectableActionId: id3,
50
- selectableActionAriaLabelledby: 'single-selectable-card-example-3',
51
- name: 'single-selectable-card-example',
52
- variant: 'single',
53
- onChange,
54
- hasNoOffset: true
55
- }}
56
- >
57
- <CardTitle>Third card</CardTitle>
58
- </CardHeader>
59
- <CardBody>This card is single selectable but disabled.</CardBody>
60
- </Card>
61
- </Gallery>
20
+ <>
21
+ <Checkbox
22
+ label="Hide radio button"
23
+ isChecked={displayRadioButton}
24
+ onChange={(_event, checked) => toggleHide(checked)}
25
+ id="single-select-toggle-hide-radio-button"
26
+ name="toggle-hide"
27
+ />
28
+ <Gallery hasGutter style={{ marginTop: '15px' }}>
29
+ <Card id="single-selectable-card-example-1" isSelectable isSelected={isChecked === id1}>
30
+ <CardHeader
31
+ selectableActions={{
32
+ selectableActionId: id1,
33
+ selectableActionAriaLabelledby: 'single-selectable-card-example-1',
34
+ name: 'single-selectable-card-example',
35
+ variant: 'single',
36
+ onChange,
37
+ hasNoOffset: true,
38
+ isHidden: displayRadioButton
39
+ }}
40
+ >
41
+ <CardTitle>First card</CardTitle>
42
+ </CardHeader>
43
+ <CardBody>This card is single selectable.</CardBody>
44
+ </Card>
45
+ <Card id="single-selectable-card-example-2" isSelectable isSelected={isChecked === id2}>
46
+ <CardHeader
47
+ selectableActions={{
48
+ selectableActionId: id2,
49
+ selectableActionAriaLabelledby: 'single-selectable-card-example-2',
50
+ name: 'single-selectable-card-example',
51
+ variant: 'single',
52
+ onChange,
53
+ hasNoOffset: true,
54
+ isHidden: displayRadioButton
55
+ }}
56
+ >
57
+ <CardTitle>Second card</CardTitle>
58
+ </CardHeader>
59
+ <CardBody>This card is single selectable.</CardBody>
60
+ </Card>
61
+ <Card id="single-selectable-card-example-3" isSelectable isDisabled isSelected={isChecked === id3}>
62
+ <CardHeader
63
+ selectableActions={{
64
+ selectableActionId: id3,
65
+ selectableActionAriaLabelledby: 'single-selectable-card-example-3',
66
+ name: 'single-selectable-card-example',
67
+ variant: 'single',
68
+ onChange,
69
+ hasNoOffset: true,
70
+ isHidden: displayRadioButton
71
+ }}
72
+ >
73
+ <CardTitle>Third card</CardTitle>
74
+ </CardHeader>
75
+ <CardBody>This card is single selectable but disabled.</CardBody>
76
+ </Card>
77
+ </Gallery>
78
+ </>
62
79
  );
63
80
  };
@@ -204,7 +204,7 @@ class ClipboardCopy extends Component<ClipboardCopyProps, ClipboardCopyState> {
204
204
  const shouldTruncate = variant === ClipboardCopyVariant.inlineCompact && truncation;
205
205
  const inlineCompactContent = shouldTruncate ? (
206
206
  <Truncate
207
- refToGetParent={this.clipboardRef}
207
+ tooltipProps={{ triggerRef: this.clipboardRef }}
208
208
  content={copyableText}
209
209
  {...(typeof truncation === 'object' && truncation)}
210
210
  />
@@ -223,6 +223,7 @@ class ClipboardCopy extends Component<ClipboardCopyProps, ClipboardCopyState> {
223
223
  className
224
224
  )}
225
225
  ref={this.clipboardRef}
226
+ {...(shouldTruncate && { tabIndex: 0 })}
226
227
  {...divProps}
227
228
  {...getOUIAProps(ClipboardCopy.displayName, ouiaId, ouiaSafe)}
228
229
  >
@@ -17,13 +17,19 @@ export interface DualListSelectorProps {
17
17
  isTree?: boolean;
18
18
  /** Content to be rendered in the dual list selector. */
19
19
  children?: React.ReactNode;
20
+ /** Flag indicating whether a tree dual list selector has animations. This will always render
21
+ * nested dual list selector items rather than dynamically rendering them. This prop will be removed in
22
+ * the next breaking change release in favor of defaulting to always-rendered items.
23
+ */
24
+ hasAnimations?: boolean;
20
25
  }
21
26
 
22
27
  class DualListSelector extends Component<DualListSelectorProps> {
23
28
  static displayName = 'DualListSelector';
24
29
  static defaultProps: PickOptional<DualListSelectorProps> = {
25
30
  children: '',
26
- isTree: false
31
+ isTree: false,
32
+ hasAnimations: false
27
33
  };
28
34
 
29
35
  constructor(props: DualListSelectorProps) {
@@ -31,13 +37,21 @@ class DualListSelector extends Component<DualListSelectorProps> {
31
37
  }
32
38
 
33
39
  render() {
34
- const { className, children, id, isTree, ...props } = this.props;
40
+ const { className, children, id, isTree, hasAnimations, ...props } = this.props;
35
41
 
36
42
  return (
37
- <DualListSelectorContext.Provider value={{ isTree }}>
43
+ <DualListSelectorContext.Provider value={{ isTree, hasAnimations }}>
38
44
  <GenerateId>
39
45
  {(randomId) => (
40
- <div className={css(styles.dualListSelector, className)} id={id || randomId} {...props}>
46
+ <div
47
+ className={css(
48
+ styles.dualListSelector,
49
+ hasAnimations && isTree && styles.modifiers.animateExpand,
50
+ className
51
+ )}
52
+ id={id || randomId}
53
+ {...props}
54
+ >
41
55
  {children}
42
56
  </div>
43
57
  )}
@@ -1,7 +1,8 @@
1
1
  import { createContext } from 'react';
2
2
  export const DualListSelectorContext = createContext<{
3
3
  isTree?: boolean;
4
- }>({ isTree: false });
4
+ hasAnimations?: boolean;
5
+ }>({ isTree: false, hasAnimations: false });
5
6
 
6
7
  export const DualListSelectorListContext = createContext<{
7
8
  setFocusedOption?: (id: string) => void;
@@ -56,14 +56,17 @@ export const DualListSelectorListWrapperBase: React.FunctionComponent<DualListSe
56
56
  }
57
57
  event.stopImmediatePropagation();
58
58
  const validOptions = isTree
59
- ? (Array.from(
60
- menuRef.current.querySelectorAll(
61
- `.${styles.dualListSelectorItemToggle}, .${styles.dualListSelectorItemCheck} > input`
62
- )
63
- ) as Element[])
59
+ ? (
60
+ Array.from(
61
+ menuRef.current.querySelectorAll(
62
+ `.${styles.dualListSelectorItemToggle}, .${styles.dualListSelectorItemCheck} > input`
63
+ )
64
+ ) as Element[]
65
+ ).filter((item) => !item.closest(`.${styles.dualListSelectorList}[inert]`))
64
66
  : (Array.from(menuRef.current.getElementsByTagName('LI')) as Element[]).filter(
65
67
  (el) => !el.classList.contains('pf-m-disabled')
66
68
  );
69
+
67
70
  const activeElement = document.activeElement;
68
71
  handleArrows(
69
72
  event,
@@ -1,5 +1,7 @@
1
+ import { useContext } from 'react';
1
2
  import { css } from '@patternfly/react-styles';
2
3
  import styles from '@patternfly/react-styles/css/components/DualListSelector/dual-list-selector';
4
+ import { DualListSelectorContext } from './DualListSelectorContext';
3
5
  import { DualListSelectorTreeItem } from './DualListSelectorTreeItem';
4
6
 
5
7
  export interface DualListSelectorTreeItemData {
@@ -68,11 +70,13 @@ export const DualListSelectorTree: React.FunctionComponent<DualListSelectorTreeP
68
70
  isDisabled = false,
69
71
  ...props
70
72
  }: DualListSelectorTreeProps) => {
73
+ const { hasAnimations } = useContext(DualListSelectorContext);
71
74
  const dataToRender = typeof data === 'function' ? data() : data;
72
75
  const tree = dataToRender.map((item) => (
73
76
  <DualListSelectorTreeItem
74
77
  key={item.id}
75
78
  text={item.text}
79
+ hasAnimations={hasAnimations}
76
80
  id={item.id}
77
81
  defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
78
82
  onOptionCheck={onOptionCheck}