@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
@@ -4,11 +4,12 @@ exports[`should render accessible tabs 1`] = `
4
4
  <DocumentFragment>
5
5
  <nav
6
6
  aria-label="accessible Tabs example"
7
- class="pf-v6-c-tabs"
8
- data-ouia-component-id="OUIA-Generated-Tabs-9"
7
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
8
+ data-ouia-component-id="OUIA-Generated-Tabs-12"
9
9
  data-ouia-component-type="PF6/Tabs"
10
10
  data-ouia-safe="true"
11
11
  id="accessibleTabs"
12
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
12
13
  >
13
14
  <ul
14
15
  class="pf-v6-c-tabs__list"
@@ -120,11 +121,12 @@ exports[`should render accessible tabs 1`] = `
120
121
  exports[`should render box tabs 1`] = `
121
122
  <DocumentFragment>
122
123
  <div
123
- class="pf-v6-c-tabs pf-m-box"
124
- data-ouia-component-id="OUIA-Generated-Tabs-8"
124
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-box pf-m-initializing-accent"
125
+ data-ouia-component-id="OUIA-Generated-Tabs-11"
125
126
  data-ouia-component-type="PF6/Tabs"
126
127
  data-ouia-safe="true"
127
128
  id="boxTabs"
129
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
128
130
  >
129
131
  <ul
130
132
  class="pf-v6-c-tabs__list"
@@ -278,11 +280,12 @@ exports[`should render box tabs 1`] = `
278
280
  exports[`should render box tabs of secondary variant 1`] = `
279
281
  <DocumentFragment>
280
282
  <div
281
- class="pf-v6-c-tabs pf-m-box pf-m-secondary"
282
- data-ouia-component-id="OUIA-Generated-Tabs-15"
283
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-box pf-m-secondary pf-m-initializing-accent"
284
+ data-ouia-component-id="OUIA-Generated-Tabs-18"
283
285
  data-ouia-component-type="PF6/Tabs"
284
286
  data-ouia-safe="true"
285
287
  id="boxSecondaryVariantTabs"
288
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
286
289
  >
287
290
  <ul
288
291
  class="pf-v6-c-tabs__list"
@@ -394,11 +397,12 @@ exports[`should render box tabs of secondary variant 1`] = `
394
397
  exports[`should render expandable vertical tabs 1`] = `
395
398
  <DocumentFragment>
396
399
  <div
397
- class="pf-v6-c-tabs pf-m-vertical pf-m-expandable"
398
- data-ouia-component-id="OUIA-Generated-Tabs-6"
400
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-vertical pf-m-expandable pf-m-initializing-accent"
401
+ data-ouia-component-id="OUIA-Generated-Tabs-9"
399
402
  data-ouia-component-type="PF6/Tabs"
400
403
  data-ouia-safe="true"
401
404
  id="verticalTabs"
405
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
402
406
  >
403
407
  <div
404
408
  class="pf-v6-c-tabs__toggle"
@@ -600,11 +604,12 @@ exports[`should render expandable vertical tabs 1`] = `
600
604
  exports[`should render filled tabs 1`] = `
601
605
  <DocumentFragment>
602
606
  <div
603
- class="pf-v6-c-tabs pf-m-fill"
604
- data-ouia-component-id="OUIA-Generated-Tabs-10"
607
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-fill pf-m-initializing-accent"
608
+ data-ouia-component-id="OUIA-Generated-Tabs-13"
605
609
  data-ouia-component-type="PF6/Tabs"
606
610
  data-ouia-safe="true"
607
611
  id="filledTabs"
612
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
608
613
  >
609
614
  <ul
610
615
  class="pf-v6-c-tabs__list"
@@ -716,11 +721,12 @@ exports[`should render filled tabs 1`] = `
716
721
  exports[`should render simple tabs 1`] = `
717
722
  <DocumentFragment>
718
723
  <div
719
- class="pf-v6-c-tabs"
720
- data-ouia-component-id="OUIA-Generated-Tabs-1"
724
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
725
+ data-ouia-component-id="OUIA-Generated-Tabs-4"
721
726
  data-ouia-component-type="PF6/Tabs"
722
727
  data-ouia-safe="true"
723
728
  id="simpleTabs"
729
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
724
730
  >
725
731
  <ul
726
732
  class="pf-v6-c-tabs__list"
@@ -874,11 +880,12 @@ exports[`should render simple tabs 1`] = `
874
880
  exports[`should render subtabs 1`] = `
875
881
  <DocumentFragment>
876
882
  <div
877
- class="pf-v6-c-tabs"
878
- data-ouia-component-id="OUIA-Generated-Tabs-11"
883
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
884
+ data-ouia-component-id="OUIA-Generated-Tabs-14"
879
885
  data-ouia-component-type="PF6/Tabs"
880
886
  data-ouia-safe="true"
881
887
  id="primarieTabs"
888
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
882
889
  >
883
890
  <ul
884
891
  class="pf-v6-c-tabs__list"
@@ -959,11 +966,12 @@ exports[`should render subtabs 1`] = `
959
966
  tabindex="0"
960
967
  >
961
968
  <div
962
- class="pf-v6-c-tabs pf-m-subtab"
963
- data-ouia-component-id="OUIA-Generated-Tabs-12"
969
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-subtab pf-m-initializing-accent"
970
+ data-ouia-component-id="OUIA-Generated-Tabs-15"
964
971
  data-ouia-component-type="PF6/Tabs"
965
972
  data-ouia-safe="true"
966
973
  id="subtabs"
974
+ style="--pf-v6-c-tabs--link-accent--length: 0; --pf-v6-c-tabs--link-accent--start: 0;"
967
975
  >
968
976
  <ul
969
977
  class="pf-v6-c-tabs__list"
@@ -1101,11 +1109,12 @@ exports[`should render subtabs 1`] = `
1101
1109
  exports[`should render tabs with eventKey Strings 1`] = `
1102
1110
  <DocumentFragment>
1103
1111
  <div
1104
- class="pf-v6-c-tabs"
1105
- data-ouia-component-id="OUIA-Generated-Tabs-13"
1112
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1113
+ data-ouia-component-id="OUIA-Generated-Tabs-16"
1106
1114
  data-ouia-component-type="PF6/Tabs"
1107
1115
  data-ouia-safe="true"
1108
1116
  id="eventKeyTabs"
1117
+ style="--pf-v6-c-tabs--link-accent--length: 0; --pf-v6-c-tabs--link-accent--start: 0;"
1109
1118
  >
1110
1119
  <ul
1111
1120
  class="pf-v6-c-tabs__list"
@@ -1218,11 +1227,12 @@ exports[`should render tabs with eventKey Strings 1`] = `
1218
1227
  exports[`should render tabs with no bottom border 1`] = `
1219
1228
  <DocumentFragment>
1220
1229
  <div
1221
- class="pf-v6-c-tabs pf-m-no-border-bottom"
1222
- data-ouia-component-id="OUIA-Generated-Tabs-16"
1230
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-no-border-bottom pf-m-initializing-accent"
1231
+ data-ouia-component-id="OUIA-Generated-Tabs-19"
1223
1232
  data-ouia-component-type="PF6/Tabs"
1224
1233
  data-ouia-safe="true"
1225
1234
  id="noBottomBorderTabs"
1235
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
1226
1236
  >
1227
1237
  <ul
1228
1238
  class="pf-v6-c-tabs__list"
@@ -1334,11 +1344,12 @@ exports[`should render tabs with no bottom border 1`] = `
1334
1344
  exports[`should render tabs with separate content 1`] = `
1335
1345
  <DocumentFragment>
1336
1346
  <div
1337
- class="pf-v6-c-tabs"
1338
- data-ouia-component-id="OUIA-Generated-Tabs-14"
1347
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1348
+ data-ouia-component-id="OUIA-Generated-Tabs-17"
1339
1349
  data-ouia-component-type="PF6/Tabs"
1340
1350
  data-ouia-safe="true"
1341
1351
  id="separateTabs"
1352
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
1342
1353
  >
1343
1354
  <ul
1344
1355
  class="pf-v6-c-tabs__list"
@@ -1460,10 +1471,11 @@ exports[`should render tabs with separate content 1`] = `
1460
1471
  exports[`should render uncontrolled tabs 1`] = `
1461
1472
  <DocumentFragment>
1462
1473
  <div
1463
- class="pf-v6-c-tabs"
1464
- data-ouia-component-id="OUIA-Generated-Tabs-4"
1474
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1475
+ data-ouia-component-id="OUIA-Generated-Tabs-7"
1465
1476
  data-ouia-component-type="PF6/Tabs"
1466
1477
  data-ouia-safe="true"
1478
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
1467
1479
  >
1468
1480
  <ul
1469
1481
  class="pf-v6-c-tabs__list"
@@ -1617,11 +1629,12 @@ exports[`should render uncontrolled tabs 1`] = `
1617
1629
  exports[`should render vertical tabs 1`] = `
1618
1630
  <DocumentFragment>
1619
1631
  <div
1620
- class="pf-v6-c-tabs pf-m-vertical"
1621
- data-ouia-component-id="OUIA-Generated-Tabs-5"
1632
+ class="pf-v6-c-tabs pf-m-animate-current pf-m-vertical pf-m-initializing-accent"
1633
+ data-ouia-component-id="OUIA-Generated-Tabs-8"
1622
1634
  data-ouia-component-type="PF6/Tabs"
1623
1635
  data-ouia-safe="true"
1624
1636
  id="verticalTabs"
1637
+ style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
1625
1638
  >
1626
1639
  <ul
1627
1640
  class="pf-v6-c-tabs__list"
@@ -2,7 +2,7 @@
2
2
  id: Tabs
3
3
  section: components
4
4
  cssPrefix: pf-v6-c-tabs
5
- propComponents: ['Tabs', 'Tab', 'TabContent', 'TabContentBody', 'TabTitleText', 'TabTitleIcon', 'horizontalOverflowObject', 'TabAction']
5
+ propComponents: ['Tabs', 'Tab', 'TabContent', 'TabContentBody', 'TabTitleText', 'TabTitleIcon', 'HorizontalOverflowObject', 'HorizontalOverflowPopperProps', 'TabAction']
6
6
  ouia: true
7
7
  ---
8
8
 
@@ -1,7 +1,7 @@
1
1
  import { Timestamp, TimestampFormat } from '@patternfly/react-core';
2
2
 
3
3
  export const TimestampBasicFormats: React.FunctionComponent = () => {
4
- const currentDate = new Date();
4
+ const currentDate = new Date('2025-04-21T23:35:25');
5
5
 
6
6
  return (
7
7
  <>
@@ -1,7 +1,7 @@
1
1
  import { Timestamp, TimestampTooltipVariant } from '@patternfly/react-core';
2
2
 
3
3
  export const TimestampDefaultTooltip: React.FunctionComponent = () => {
4
- const currentDate = new Date();
4
+ const currentDate = new Date('2025-04-21T14:30:00');
5
5
 
6
6
  return (
7
7
  <>
@@ -186,9 +186,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
186
186
  <>
187
187
  {hasBadge && children && (
188
188
  <span className={css(styles.treeViewNodeCount)}>
189
- <Badge {...badgeProps}>
190
- {customBadgeContent ? customBadgeContent : (children as React.ReactElement<any>).props.data.length}
191
- </Badge>
189
+ <Badge {...badgeProps}>{customBadgeContent ?? (children as React.ReactElement<any>).props.data.length}</Badge>
192
190
  </span>
193
191
  )}
194
192
  {hasBadge && !children && customBadgeContent !== undefined && (
@@ -264,6 +264,16 @@ test('Renders badge with customBadgeContent when hasBadge and children are passe
264
264
  expect(screen.getByText(requiredProps.name).nextElementSibling).toHaveTextContent('Custom badge');
265
265
  });
266
266
 
267
+ test('Renders badge with customBadgeContent being number 0 when hasBadge and children are passed', () => {
268
+ render(
269
+ <TreeViewListItem hasBadge customBadgeContent={0} {...requiredProps}>
270
+ <TreeView data={[{ name: 'Parent name 1' }, { name: 'Parent name 2' }]} />
271
+ </TreeViewListItem>
272
+ );
273
+
274
+ expect(screen.getByText(requiredProps.name).nextElementSibling).toHaveTextContent('0');
275
+ });
276
+
267
277
  test('Renders badge with customBadgeContent when hasBadge is passed and children are not passed', () => {
268
278
  render(<TreeViewListItem hasBadge customBadgeContent="Custom badge" {...requiredProps} />);
269
279
 
@@ -1,7 +1,8 @@
1
- import { Fragment, useEffect, useRef, useState } from 'react';
1
+ import { Fragment, useEffect, useRef, useState, forwardRef } from 'react';
2
2
  import styles from '@patternfly/react-styles/css/components/Truncate/truncate';
3
3
  import { css } from '@patternfly/react-styles';
4
- import { Tooltip, TooltipPosition } from '../Tooltip';
4
+ import { Tooltip, TooltipPosition, TooltipProps } from '../Tooltip';
5
+ import { getReferenceElement } from '../../helpers';
5
6
  import { getResizeObserver } from '../../helpers/resizeObserver';
6
7
 
7
8
  export enum TruncatePosition {
@@ -17,11 +18,15 @@ const truncateStyles = {
17
18
 
18
19
  const minWidthCharacters: number = 12;
19
20
 
20
- export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
21
+ export interface TruncateProps extends Omit<React.HTMLProps<HTMLSpanElement | HTMLAnchorElement>, 'ref'> {
21
22
  /** Class to add to outer span */
22
23
  className?: string;
23
24
  /** Text to truncate */
24
25
  content: string;
26
+ /** An HREF to turn the truncate wrapper into an anchor element. For more custom control, use the
27
+ * tooltipProps with a triggerRef property passed in.
28
+ */
29
+ href?: string;
25
30
  /** The number of characters displayed in the second half of a middle truncation. This will be overridden by
26
31
  * the maxCharsDisplayed prop.
27
32
  */
@@ -52,24 +57,24 @@ export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
52
57
  | 'left-end'
53
58
  | 'right-start'
54
59
  | 'right-end';
55
- /** @hide The element whose parent to reference when calculating whether truncation should occur. This must be an ancestor
56
- * of the ClipboardCopy, and must have a valid width value. For internal use only, do not use as it is not part of the public API
57
- * and is subject to change.
58
- */
59
- refToGetParent?: React.RefObject<any>;
60
+ /** Additional props to pass to the tooltip. */
61
+ tooltipProps?: Omit<TooltipProps, 'content'>;
62
+ /** @hide Forwarded ref */
63
+ innerRef?: React.Ref<any>;
60
64
  }
61
65
 
62
66
  const sliceTrailingContent = (str: string, slice: number) => [str.slice(0, str.length - slice), str.slice(-slice)];
63
67
 
64
- export const Truncate: React.FunctionComponent<TruncateProps> = ({
68
+ const TruncateBase: React.FunctionComponent<TruncateProps> = ({
65
69
  className,
70
+ href,
66
71
  position = 'end',
67
72
  tooltipPosition = 'top',
73
+ tooltipProps,
68
74
  trailingNumChars = 7,
69
75
  maxCharsDisplayed,
70
76
  omissionContent = '\u2026',
71
77
  content,
72
- refToGetParent,
73
78
  ...props
74
79
  }: TruncateProps) => {
75
80
  const [isTruncated, setIsTruncated] = useState(true);
@@ -78,7 +83,8 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
78
83
  const [shouldRenderByMaxChars, setShouldRenderByMaxChars] = useState(maxCharsDisplayed > 0);
79
84
 
80
85
  const textRef = useRef<HTMLElement>(null);
81
- const subParentRef = useRef<HTMLDivElement>(null);
86
+ const defaultSubParentRef = useRef<any>(null);
87
+ const subParentRef = tooltipProps?.triggerRef || defaultSubParentRef;
82
88
  const observer = useRef(null);
83
89
 
84
90
  if (maxCharsDisplayed <= 0) {
@@ -108,11 +114,14 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
108
114
  if (textRef && textRef.current && !textElement) {
109
115
  setTextElement(textRef.current);
110
116
  }
117
+ }, [textRef, textElement]);
111
118
 
112
- if ((refToGetParent?.current || (subParentRef?.current && subParentRef.current.parentElement)) && !parentElement) {
113
- setParentElement(refToGetParent?.current.parentElement || subParentRef?.current.parentElement);
119
+ useEffect(() => {
120
+ const refElement = getReferenceElement(subParentRef);
121
+ if (refElement?.parentElement && !parentElement) {
122
+ setParentElement(refElement.parentElement);
114
123
  }
115
- }, [textRef, subParentRef, textElement, parentElement]);
124
+ }, [subParentRef, parentElement]);
116
125
 
117
126
  useEffect(() => {
118
127
  if (textElement && parentElement && !observer.current && !shouldRenderByMaxChars) {
@@ -142,13 +151,18 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
142
151
  setShouldRenderByMaxChars(maxCharsDisplayed > 0);
143
152
  }, [maxCharsDisplayed]);
144
153
 
154
+ const lrmEntity = <Fragment>&lrm;</Fragment>;
155
+ const isStartPosition = position === TruncatePosition.start;
156
+ const isEndPosition = position === TruncatePosition.end;
157
+
145
158
  const renderResizeObserverContent = () => {
146
- if (position === TruncatePosition.end || position === TruncatePosition.start) {
159
+ if (isEndPosition || isStartPosition) {
147
160
  return (
148
161
  <>
149
162
  <span ref={textRef} className={truncateStyles[position]}>
163
+ {isStartPosition && lrmEntity}
150
164
  {content}
151
- {position === TruncatePosition.start && <Fragment>&lrm;</Fragment>}
165
+ {isStartPosition && lrmEntity}
152
166
  </span>
153
167
  </>
154
168
  );
@@ -195,7 +209,7 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
195
209
  </>
196
210
  );
197
211
  }
198
- if (position === TruncatePosition.end) {
212
+ if (isEndPosition) {
199
213
  return (
200
214
  <>
201
215
  {renderVisibleContent(content.slice(0, maxCharsDisplayed))}
@@ -217,25 +231,37 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
217
231
  );
218
232
  };
219
233
 
234
+ const TruncateWrapper = href ? 'a' : 'span';
220
235
  const truncateBody = (
221
- <span
222
- ref={subParentRef}
236
+ <TruncateWrapper
237
+ ref={!tooltipProps?.triggerRef ? (subParentRef as React.MutableRefObject<any>) : null}
238
+ href={href}
223
239
  className={css(styles.truncate, shouldRenderByMaxChars && styles.modifiers.fixed, className)}
224
- {...(isTruncated && { tabIndex: 0 })}
240
+ {...(isTruncated && !href && !tooltipProps?.triggerRef && { tabIndex: 0 })}
225
241
  {...props}
226
242
  >
227
243
  {!shouldRenderByMaxChars ? renderResizeObserverContent() : renderMaxDisplayContent()}
228
- </span>
244
+ </TruncateWrapper>
229
245
  );
230
246
 
231
247
  return (
232
248
  <>
233
249
  {isTruncated && (
234
- <Tooltip hidden={!isTruncated} position={tooltipPosition} content={content} triggerRef={subParentRef} />
250
+ <Tooltip
251
+ hidden={!isTruncated}
252
+ position={tooltipPosition}
253
+ content={content}
254
+ triggerRef={subParentRef}
255
+ {...tooltipProps}
256
+ />
235
257
  )}
236
258
  {truncateBody}
237
259
  </>
238
260
  );
239
261
  };
240
262
 
263
+ export const Truncate = forwardRef((props: TruncateProps, ref: React.Ref<HTMLAnchorElement | HTMLSpanElement>) => (
264
+ <TruncateBase innerRef={ref} {...props} />
265
+ ));
266
+
241
267
  Truncate.displayName = 'Truncate';
@@ -1,5 +1,5 @@
1
1
  import { render, screen, within } from '@testing-library/react';
2
- import { Truncate } from '../Truncate';
2
+ import { Truncate, TruncatePosition } from '../Truncate';
3
3
  import styles from '@patternfly/react-styles/css/components/Truncate/truncate';
4
4
  import '@testing-library/jest-dom';
5
5
 
@@ -19,6 +19,24 @@ global.ResizeObserver = jest.fn().mockImplementation(() => ({
19
19
  disconnect: jest.fn()
20
20
  }));
21
21
 
22
+ test('Renders with span wrapper by default', () => {
23
+ render(<Truncate content={''} data-testid="test-id" />);
24
+
25
+ expect(screen.getByTestId('test-id').tagName).toBe('SPAN');
26
+ });
27
+
28
+ test('Renders with anchor wrapper when href prop is passed', () => {
29
+ render(<Truncate content={'Link content'} href="#" />);
30
+
31
+ expect(screen.getByRole('link')).toHaveTextContent('Link content');
32
+ });
33
+
34
+ test('Passes href to anchor when href prop is passed', () => {
35
+ render(<Truncate content={'Link content'} href="#home" />);
36
+
37
+ expect(screen.getByRole('link')).toHaveAttribute('href', '#home');
38
+ });
39
+
22
40
  test(`renders with class ${styles.truncate}`, () => {
23
41
  render(<Truncate content={''} aria-label="test-id" />);
24
42
 
@@ -67,7 +85,9 @@ test('renders default truncation', () => {
67
85
  expect(asFragment()).toMatchSnapshot();
68
86
  });
69
87
 
70
- test('renders start truncation with &lrm; at end', () => {
88
+ // If this snapshot fails and the output text doesn't seem like it's changed, it most likely
89
+ // is due to the &lrm; HTML entity isn't rendering correctly.
90
+ test('renders start truncation with &lrm; at start and end', () => {
71
91
  const { asFragment } = render(
72
92
  <Truncate
73
93
  content={'Vestibulum interdum risus et enim faucibus, sit amet molestie est accumsan.'}
@@ -143,6 +163,12 @@ test('renders tooltip content', () => {
143
163
  expect(input).toBeVisible();
144
164
  });
145
165
 
166
+ test('Renders with additional tooltip props spread', () => {
167
+ render(<Truncate content={''} tooltipProps={{ distance: 32 }} />);
168
+
169
+ expect(screen.getByTestId('Tooltip-mock')).toHaveAttribute('distance', '32');
170
+ });
171
+
146
172
  test('renders with inherited element props spread to the component', () => {
147
173
  render(<Truncate content={'Test'} data-testid="test-id" aria-label="labelling-id" />);
148
174
 
@@ -65,7 +65,7 @@ exports[`renders default truncation 1`] = `
65
65
  </DocumentFragment>
66
66
  `;
67
67
 
68
- exports[`renders start truncation with &lrm; at end 1`] = `
68
+ exports[`renders start truncation with &lrm; at start and end 1`] = `
69
69
  <DocumentFragment>
70
70
  <div
71
71
  data-testid="Tooltip-mock"
@@ -86,7 +86,7 @@ exports[`renders start truncation with &lrm; at end 1`] = `
86
86
  <span
87
87
  class="pf-v6-c-truncate__end"
88
88
  >
89
- Vestibulum interdum risus et enim faucibus, sit amet molestie est accumsan.‎
89
+ Vestibulum interdum risus et enim faucibus, sit amet molestie est accumsan.‎
90
90
  </span>
91
91
  </span>
92
92
  </DocumentFragment>
@@ -52,3 +52,11 @@ Truncating based on a maximum amount of characters will truncate the content at
52
52
  ```ts file="./TruncateMaxChars.tsx"
53
53
 
54
54
  ```
55
+
56
+ ### With links
57
+
58
+ To truncate link text, you can pass the `href` property in.
59
+
60
+ ```ts file="./TruncateLinks.tsx"
61
+
62
+ ```
@@ -0,0 +1,22 @@
1
+ import { Truncate } from '@patternfly/react-core';
2
+
3
+ export const TruncateLinks: React.FunctionComponent = () => {
4
+ const content = 'A very lengthy anchor text content to trigger truncation';
5
+ return (
6
+ <>
7
+ <div>With default width-observing truncation:</div>
8
+ <div className="truncate-example-resize">
9
+ <Truncate href="#" content={content} />
10
+ <Truncate position="start" href="#" content={content} />
11
+ <Truncate position="middle" href="#" content={content} />
12
+ </div>
13
+ <br />
14
+ <div>With max characters truncation:</div>
15
+ <Truncate maxCharsDisplayed={15} href="#" content={content} />
16
+ <br />
17
+ <Truncate maxCharsDisplayed={15} position="start" href="#" content={content} />
18
+ <br />
19
+ <Truncate maxCharsDisplayed={15} position="middle" href="#" content={content} />
20
+ </>
21
+ );
22
+ };
@@ -39,16 +39,16 @@ class BannerDemo extends React.Component {
39
39
  return (
40
40
  <Fragment>
41
41
  <DashboardWrapper banner={banner} breadcrumb={null}>
42
- <PageSection>
42
+ <PageSection aria-labelledby="main-title">
43
43
  <Content>
44
- <h1>Main title</h1>
44
+ <h1 id="main-title">Main title</h1>
45
45
  <p>
46
46
  Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />
47
47
  of it’s relative line height of 1.5.
48
48
  </p>
49
49
  </Content>
50
50
  </PageSection>
51
- <PageSection>
51
+ <PageSection aria-label='Cards gallery'>
52
52
  <Gallery hasGutter>
53
53
  {Array.from({ length: 30 }).map((_value, index) => (
54
54
  <GalleryItem key={index}>
@@ -112,9 +112,9 @@ class BannerDemo extends React.Component {
112
112
  </FlexItem>
113
113
  <FlexItem grow={{ default: 'grow' }} style={{ minHeight: 0 }}>
114
114
  <DashboardWrapper breadcrumb={null}>
115
- <PageSection>
115
+ <PageSection aria-labelledby="main-title">
116
116
  <Content>
117
- <h1>Main title</h1>
117
+ <h1 id='main-title'>Main title</h1>
118
118
  <p>
119
119
  Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because{' '}
120
120
  <br />
@@ -122,7 +122,7 @@ class BannerDemo extends React.Component {
122
122
  </p>
123
123
  </Content>
124
124
  </PageSection>
125
- <PageSection>
125
+ <PageSection aria-label='Cards gallery'>
126
126
  <Gallery hasGutter>
127
127
  {Array.from({ length: 30 }).map((_value, index) => (
128
128
  <GalleryItem key={index}>
@@ -14,7 +14,7 @@ import chart_color_yellow_100 from '@patternfly/react-tokens/dist/esm/chart_colo
14
14
  import chart_color_yellow_300 from '@patternfly/react-tokens/dist/esm/chart_color_yellow_300';
15
15
  import chart_color_orange_300 from '@patternfly/react-tokens/dist/esm/chart_color_orange_300';
16
16
  import chart_color_red_orange_400 from '@patternfly/react-tokens/dist/esm/chart_color_red_orange_400';
17
- import l_gallery_GridTemplateColumns_min from '@patternfly/react-tokens/dist/esm/l_gallery_GridTemplateColumns_min';
17
+ import cssGridTemplateColumnsMin from '@patternfly/react-tokens/dist/esm/l_gallery_GridTemplateColumns_min';
18
18
  import t_global_text_color_subtle from '@patternfly/react-tokens/dist/esm/t_global_text_color_subtle';
19
19
  import flex from '@patternfly/react-styles/css/utilities/Flex/flex';
20
20
  import text from '@patternfly/react-styles/css/utilities/Text/text';
@@ -465,16 +465,16 @@ export const CardViewBasic: React.FunctionComponent = () => {
465
465
  return (
466
466
  <Fragment>
467
467
  <DashboardWrapper mainContainerId="main-content-card-view-default-nav" breadcrumb={null}>
468
- <PageSection>
468
+ <PageSection aria-labelledby="projects">
469
469
  <Content>
470
- <h1>Projects</h1>
470
+ <h1 id="projects">Projects</h1>
471
471
  <p>This is a demo that showcases PatternFly cards.</p>
472
472
  </Content>
473
473
  <Toolbar id="toolbar-group-types" clearAllFilters={onDelete}>
474
474
  <ToolbarContent>{toolbarItems}</ToolbarContent>
475
475
  </Toolbar>
476
476
  </PageSection>
477
- <PageSection isFilled>
477
+ <PageSection isFilled aria-label="Selectable card gallery">
478
478
  <Gallery hasGutter aria-label="Selectable card container">
479
479
  <Card isCompact>
480
480
  <Bullseye>
@@ -546,7 +546,12 @@ export const CardViewBasic: React.FunctionComponent = () => {
546
546
  ))}
547
547
  </Gallery>
548
548
  </PageSection>
549
- <PageSection isFilled={false} stickyOnBreakpoint={{ default: 'bottom' }} padding={{ default: 'noPadding' }}>
549
+ <PageSection
550
+ isFilled={false}
551
+ stickyOnBreakpoint={{ default: 'bottom' }}
552
+ padding={{ default: 'noPadding' }}
553
+ aria-label="Pagination controls"
554
+ >
550
555
  <Pagination
551
556
  itemCount={totalItemCount}
552
557
  page={page}
@@ -33,13 +33,15 @@ export const DataListActionable: React.FunctionComponent = () => {
33
33
 
34
34
  return (
35
35
  <DashboardWrapper mainContainerId="main-content-datalist-view-actions" breadcrumb={null}>
36
- <PageSection>
36
+ <PageSection aria-labelledby="projects">
37
37
  <Content>
38
- <Title headingLevel="h1">Projects</Title>
38
+ <Title headingLevel="h1" id="projects">
39
+ Projects
40
+ </Title>
39
41
  <Content component="p">This is a demo that showcases PatternFly Data List</Content>
40
42
  </Content>
41
43
  </PageSection>
42
- <PageSection>
44
+ <PageSection aria-label="Data list of projects">
43
45
  <DataList aria-label="single action data list example ">
44
46
  {!isDeleted && (
45
47
  <DataListItem aria-labelledby="single-action-item1">
@@ -69,9 +69,9 @@ export const DataListBasic: React.FunctionComponent = () => {
69
69
  return (
70
70
  <Fragment>
71
71
  <DashboardWrapper mainContainerId="main-content-datalist-view-default-nav" breadcrumb={null}>
72
- <PageSection>
72
+ <PageSection aria-labelledby="projects">
73
73
  <Content>
74
- <h1>Projects</h1>
74
+ <h1 id="projects">Projects</h1>
75
75
  <p>This is a demo that showcases PatternFly data list</p>
76
76
  </Content>
77
77
  </PageSection>
@@ -133,9 +133,9 @@ export const DataListExpandableControlInToolbar: React.FunctionComponent = () =>
133
133
  return (
134
134
  <Fragment>
135
135
  <DashboardWrapper mainContainerId="main-content-datalist-view-default-nav" breadcrumb={null}>
136
- <PageSection>
136
+ <PageSection aria-labelledby="projects">
137
137
  <Content>
138
- <h1>Projects</h1>
138
+ <h1 id="projects">Projects</h1>
139
139
  <p>This is a demo that showcases PatternFly data list</p>
140
140
  </Content>
141
141
  </PageSection>