@patternfly/react-core 6.2.1-prerelease.1 → 6.2.1-prerelease.10

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 (330) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/TimePicker/package.json +1 -1
  74. package/dist/dynamic/components/Timestamp/package.json +1 -1
  75. package/dist/dynamic/components/Title/package.json +1 -1
  76. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  77. package/dist/dynamic/components/Toolbar/package.json +1 -1
  78. package/dist/dynamic/components/Tooltip/package.json +1 -1
  79. package/dist/dynamic/components/TreeView/package.json +1 -1
  80. package/dist/dynamic/components/Truncate/package.json +1 -1
  81. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/package.json +1 -1
  83. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  95. package/dist/dynamic/helpers/constants/package.json +1 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  99. package/dist/dynamic/helpers/package.json +1 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  105. package/dist/dynamic/helpers/util/package.json +1 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  107. package/dist/dynamic/layouts/Flex/package.json +1 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  109. package/dist/dynamic/layouts/Grid/package.json +1 -1
  110. package/dist/dynamic/layouts/Level/package.json +1 -1
  111. package/dist/dynamic/layouts/Split/package.json +1 -1
  112. package/dist/dynamic/layouts/Stack/package.json +1 -1
  113. package/dist/dynamic/styles/package.json +1 -1
  114. package/dist/esm/components/Divider/Divider.d.ts +2 -0
  115. package/dist/esm/components/Divider/Divider.d.ts.map +1 -1
  116. package/dist/esm/components/Divider/Divider.js +2 -2
  117. package/dist/esm/components/Divider/Divider.js.map +1 -1
  118. package/dist/esm/components/Dropdown/DropdownGroup.d.ts +1 -1
  119. package/dist/esm/components/Dropdown/DropdownGroup.d.ts.map +1 -1
  120. package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts +1 -1
  121. package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
  122. package/dist/esm/components/ExpandableSection/ExpandableSectionToggle.d.ts +1 -1
  123. package/dist/esm/components/ExpandableSection/ExpandableSectionToggle.d.ts.map +1 -1
  124. package/dist/esm/components/Form/FormFieldGroup.d.ts +1 -1
  125. package/dist/esm/components/Form/FormFieldGroup.d.ts.map +1 -1
  126. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts +1 -1
  127. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  128. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts +1 -1
  129. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  130. package/dist/esm/components/List/List.d.ts.map +1 -1
  131. package/dist/esm/components/List/List.js +2 -2
  132. package/dist/esm/components/List/List.js.map +1 -1
  133. package/dist/esm/components/List/ListItem.d.ts +4 -2
  134. package/dist/esm/components/List/ListItem.d.ts.map +1 -1
  135. package/dist/esm/components/List/ListItem.js +2 -2
  136. package/dist/esm/components/List/ListItem.js.map +1 -1
  137. package/dist/esm/components/LoginPage/LoginForm.d.ts +2 -0
  138. package/dist/esm/components/LoginPage/LoginForm.d.ts.map +1 -1
  139. package/dist/esm/components/LoginPage/LoginForm.js +3 -3
  140. package/dist/esm/components/LoginPage/LoginForm.js.map +1 -1
  141. package/dist/esm/components/Nav/Nav.d.ts +1 -1
  142. package/dist/esm/components/Nav/Nav.d.ts.map +1 -1
  143. package/dist/esm/components/Nav/NavItemSeparator.d.ts.map +1 -1
  144. package/dist/esm/components/Nav/NavItemSeparator.js +2 -2
  145. package/dist/esm/components/Nav/NavItemSeparator.js.map +1 -1
  146. package/dist/esm/components/Page/Page.d.ts +3 -1
  147. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  148. package/dist/esm/components/Page/Page.js +1 -1
  149. package/dist/esm/components/Page/Page.js.map +1 -1
  150. package/dist/esm/components/Select/SelectGroup.d.ts +1 -1
  151. package/dist/esm/components/Select/SelectGroup.d.ts.map +1 -1
  152. package/dist/esm/components/Tabs/Tabs.d.ts +1 -1
  153. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  154. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  155. package/dist/esm/components/Toolbar/ToolbarGroup.d.ts +1 -1
  156. package/dist/esm/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
  157. package/dist/esm/components/Toolbar/ToolbarItem.d.ts.map +1 -1
  158. package/dist/esm/components/Toolbar/ToolbarItem.js +4 -3
  159. package/dist/esm/components/Toolbar/ToolbarItem.js.map +1 -1
  160. package/dist/esm/components/Truncate/Truncate.d.ts +11 -1
  161. package/dist/esm/components/Truncate/Truncate.d.ts.map +1 -1
  162. package/dist/esm/components/Truncate/Truncate.js +43 -6
  163. package/dist/esm/components/Truncate/Truncate.js.map +1 -1
  164. package/dist/esm/components/Wizard/WizardNavInternal.js.map +1 -1
  165. package/dist/esm/deprecated/components/Wizard/WizardNavItem.d.ts.map +1 -1
  166. package/dist/esm/deprecated/components/Wizard/WizardNavItem.js +1 -1
  167. package/dist/esm/deprecated/components/Wizard/WizardNavItem.js.map +1 -1
  168. package/dist/js/components/Divider/Divider.d.ts +2 -0
  169. package/dist/js/components/Divider/Divider.d.ts.map +1 -1
  170. package/dist/js/components/Divider/Divider.js +2 -2
  171. package/dist/js/components/Divider/Divider.js.map +1 -1
  172. package/dist/js/components/Dropdown/DropdownGroup.d.ts +1 -1
  173. package/dist/js/components/Dropdown/DropdownGroup.d.ts.map +1 -1
  174. package/dist/js/components/ExpandableSection/ExpandableSection.d.ts +1 -1
  175. package/dist/js/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
  176. package/dist/js/components/ExpandableSection/ExpandableSectionToggle.d.ts +1 -1
  177. package/dist/js/components/ExpandableSection/ExpandableSectionToggle.d.ts.map +1 -1
  178. package/dist/js/components/Form/FormFieldGroup.d.ts +1 -1
  179. package/dist/js/components/Form/FormFieldGroup.d.ts.map +1 -1
  180. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts +1 -1
  181. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts.map +1 -1
  182. package/dist/js/components/Form/InternalFormFieldGroup.d.ts +1 -1
  183. package/dist/js/components/Form/InternalFormFieldGroup.d.ts.map +1 -1
  184. package/dist/js/components/List/List.d.ts.map +1 -1
  185. package/dist/js/components/List/List.js +2 -2
  186. package/dist/js/components/List/List.js.map +1 -1
  187. package/dist/js/components/List/ListItem.d.ts +4 -2
  188. package/dist/js/components/List/ListItem.d.ts.map +1 -1
  189. package/dist/js/components/List/ListItem.js +2 -2
  190. package/dist/js/components/List/ListItem.js.map +1 -1
  191. package/dist/js/components/LoginPage/LoginForm.d.ts +2 -0
  192. package/dist/js/components/LoginPage/LoginForm.d.ts.map +1 -1
  193. package/dist/js/components/LoginPage/LoginForm.js +3 -3
  194. package/dist/js/components/LoginPage/LoginForm.js.map +1 -1
  195. package/dist/js/components/Nav/Nav.d.ts +1 -1
  196. package/dist/js/components/Nav/Nav.d.ts.map +1 -1
  197. package/dist/js/components/Nav/NavItemSeparator.d.ts.map +1 -1
  198. package/dist/js/components/Nav/NavItemSeparator.js +2 -2
  199. package/dist/js/components/Nav/NavItemSeparator.js.map +1 -1
  200. package/dist/js/components/Page/Page.d.ts +3 -1
  201. package/dist/js/components/Page/Page.d.ts.map +1 -1
  202. package/dist/js/components/Page/Page.js +1 -1
  203. package/dist/js/components/Page/Page.js.map +1 -1
  204. package/dist/js/components/Select/SelectGroup.d.ts +1 -1
  205. package/dist/js/components/Select/SelectGroup.d.ts.map +1 -1
  206. package/dist/js/components/Tabs/Tabs.d.ts +1 -1
  207. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  208. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  209. package/dist/js/components/Toolbar/ToolbarGroup.d.ts +1 -1
  210. package/dist/js/components/Toolbar/ToolbarGroup.d.ts.map +1 -1
  211. package/dist/js/components/Toolbar/ToolbarItem.d.ts.map +1 -1
  212. package/dist/js/components/Toolbar/ToolbarItem.js +4 -3
  213. package/dist/js/components/Toolbar/ToolbarItem.js.map +1 -1
  214. package/dist/js/components/Truncate/Truncate.d.ts +11 -1
  215. package/dist/js/components/Truncate/Truncate.d.ts.map +1 -1
  216. package/dist/js/components/Truncate/Truncate.js +42 -5
  217. package/dist/js/components/Truncate/Truncate.js.map +1 -1
  218. package/dist/js/components/Wizard/WizardNavInternal.js.map +1 -1
  219. package/dist/js/deprecated/components/Wizard/WizardNavItem.d.ts.map +1 -1
  220. package/dist/js/deprecated/components/Wizard/WizardNavItem.js +1 -1
  221. package/dist/js/deprecated/components/Wizard/WizardNavItem.js.map +1 -1
  222. package/dist/umd/assets/{output-o1HtgXp0.css → output-yL8pnk-q.css} +17964 -17876
  223. package/dist/umd/react-core.min.js +3 -3
  224. package/helpers/package.json +1 -1
  225. package/layouts/package.json +1 -1
  226. package/next/package.json +1 -1
  227. package/package.json +8 -8
  228. package/src/components/Alert/examples/Alert.md +0 -3
  229. package/src/components/Card/examples/Card.md +4 -0
  230. package/src/components/Card/examples/CardHeaderWraps.tsx +26 -0
  231. package/src/components/DescriptionList/examples/DescriptionListAutoFitBasic.tsx +1 -1
  232. package/src/components/DescriptionList/examples/DescriptionListAutoFitMinWidthModified.tsx +5 -1
  233. package/src/components/DescriptionList/examples/DescriptionListAutoFitMinWidthResponsive.tsx +5 -1
  234. package/src/components/DescriptionList/examples/DescriptionListBasic.tsx +1 -1
  235. package/src/components/DescriptionList/examples/DescriptionListColumnFill.tsx +1 -1
  236. package/src/components/DescriptionList/examples/DescriptionListCompact.tsx +1 -1
  237. package/src/components/DescriptionList/examples/DescriptionListCompactHorizontal.tsx +1 -1
  238. package/src/components/DescriptionList/examples/DescriptionListDefaultAutoColumn.tsx +1 -1
  239. package/src/components/DescriptionList/examples/DescriptionListDefaultInlineGrid.tsx +1 -1
  240. package/src/components/DescriptionList/examples/DescriptionListDefaultResponsiveColumns.tsx +1 -1
  241. package/src/components/DescriptionList/examples/DescriptionListDefaultThreeColLg.tsx +1 -1
  242. package/src/components/DescriptionList/examples/DescriptionListDefaultTwoCol.tsx +1 -0
  243. package/src/components/DescriptionList/examples/DescriptionListDisplaySizeAndCardHorizontalTermWidth.tsx +7 -1
  244. package/src/components/DescriptionList/examples/DescriptionListDisplaySizeAndCardThreeColumn.tsx +5 -1
  245. package/src/components/DescriptionList/examples/DescriptionListFluidHorizontal.tsx +1 -1
  246. package/src/components/DescriptionList/examples/DescriptionListHorizontal.tsx +1 -1
  247. package/src/components/DescriptionList/examples/DescriptionListHorizontalAutoColumn.tsx +6 -1
  248. package/src/components/DescriptionList/examples/DescriptionListHorizontalCustomTermWidth.tsx +1 -0
  249. package/src/components/DescriptionList/examples/DescriptionListHorizontalResponsiveColumns.tsx +1 -1
  250. package/src/components/DescriptionList/examples/DescriptionListHorizontalThreeColLg.tsx +1 -1
  251. package/src/components/DescriptionList/examples/DescriptionListHorizontalTwoCol.tsx +1 -1
  252. package/src/components/DescriptionList/examples/DescriptionListIconsOnTerms.tsx +1 -1
  253. package/src/components/DescriptionList/examples/DescriptionListResponsiveHoriVertGroup.tsx +1 -0
  254. package/src/components/DescriptionList/examples/DescriptionListWithCard.tsx +1 -1
  255. package/src/components/DescriptionList/examples/DescriptionListWithLargeDisplaySize.tsx +1 -1
  256. package/src/components/DescriptionList/examples/DescriptionListWithLargeDisplaySizeAndCard.tsx +5 -1
  257. package/src/components/DescriptionList/examples/DescriptionListWithTermHelpText.tsx +1 -1
  258. package/src/components/Divider/Divider.tsx +4 -1
  259. package/src/components/Divider/__tests__/Divider.test.tsx +10 -0
  260. package/src/components/Dropdown/DropdownGroup.tsx +1 -1
  261. package/src/components/DualListSelector/examples/DualListSelectorBasicSearch.tsx +1 -0
  262. package/src/components/DualListSelector/examples/DualListSelectorComplexOptionsActions.tsx +1 -0
  263. package/src/components/DualListSelector/examples/DualListSelectorTree.tsx +1 -0
  264. package/src/components/ExpandableSection/ExpandableSection.tsx +1 -1
  265. package/src/components/ExpandableSection/ExpandableSectionToggle.tsx +1 -1
  266. package/src/components/ExpandableSection/examples/ExpandableSectionBasic.tsx +5 -1
  267. package/src/components/ExpandableSection/examples/ExpandableSectionDetached.tsx +1 -1
  268. package/src/components/ExpandableSection/examples/ExpandableSectionDisclosure.tsx +3 -1
  269. package/src/components/ExpandableSection/examples/ExpandableSectionIndented.tsx +1 -1
  270. package/src/components/ExpandableSection/examples/ExpandableSectionTruncateExpansion.tsx +1 -1
  271. package/src/components/ExpandableSection/examples/ExpandableSectionUncontrolled.tsx +1 -1
  272. package/src/components/ExpandableSection/examples/ExpandableSectionUncontrolledDynamicToggleText.tsx +4 -1
  273. package/src/components/Form/FormFieldGroup.tsx +1 -1
  274. package/src/components/Form/FormFieldGroupExpandable.tsx +1 -1
  275. package/src/components/Form/InternalFormFieldGroup.tsx +1 -1
  276. package/src/components/List/List.tsx +3 -0
  277. package/src/components/List/ListItem.tsx +7 -4
  278. package/src/components/List/__tests__/List.test.tsx +97 -101
  279. package/src/components/List/__tests__/ListItem.test.tsx +51 -0
  280. package/src/components/List/__tests__/__snapshots__/List.test.tsx.snap +4 -261
  281. package/src/components/List/__tests__/__snapshots__/ListItem.test.tsx.snap +34 -0
  282. package/src/components/LoginPage/LoginForm.tsx +5 -2
  283. package/src/components/LoginPage/__tests__/LoginForm.test.tsx +12 -0
  284. package/src/components/LoginPage/examples/LoginPage.md +1 -0
  285. package/src/components/Nav/Nav.tsx +1 -1
  286. package/src/components/Nav/NavItemSeparator.tsx +2 -1
  287. package/src/components/Page/Page.tsx +4 -1
  288. package/src/components/Page/__tests__/Page.test.tsx +18 -0
  289. package/src/components/Progress/examples/ProgressTitleOutsideOfProgressBar.tsx +1 -1
  290. package/src/components/SearchInput/examples/SearchInputAdvanced.tsx +1 -0
  291. package/src/components/SearchInput/examples/SearchInputBasic.tsx +1 -0
  292. package/src/components/SearchInput/examples/SearchInputFocusSearch.tsx +7 -1
  293. package/src/components/SearchInput/examples/SearchInputWithExpandable.tsx +1 -0
  294. package/src/components/SearchInput/examples/SearchInputWithNavigableOptions.tsx +1 -0
  295. package/src/components/SearchInput/examples/SearchInputWithResultCount.tsx +1 -0
  296. package/src/components/SearchInput/examples/SearchInputWithSubmitButton.tsx +1 -0
  297. package/src/components/Select/SelectGroup.tsx +1 -1
  298. package/src/components/Skeleton/examples/SkeletonDefault.tsx +1 -1
  299. package/src/components/Skeleton/examples/SkeletonPercentageHeight.tsx +6 -6
  300. package/src/components/Skeleton/examples/SkeletonPercentageWidth.tsx +5 -5
  301. package/src/components/Skeleton/examples/SkeletonShapes.tsx +9 -9
  302. package/src/components/Skeleton/examples/SkeletonText.tsx +7 -7
  303. package/src/components/Tabs/Tabs.tsx +3 -1
  304. package/src/components/Toolbar/ToolbarGroup.tsx +1 -1
  305. package/src/components/Toolbar/ToolbarItem.tsx +11 -1
  306. package/src/components/Truncate/Truncate.tsx +109 -22
  307. package/src/components/Truncate/__tests__/Truncate.test.tsx +70 -2
  308. package/src/components/Truncate/__tests__/__snapshots__/Truncate.test.tsx.snap +37 -0
  309. package/src/components/Truncate/examples/Truncate.md +32 -36
  310. package/src/components/Truncate/examples/TruncateCustomTooltipPosition.tsx +10 -0
  311. package/src/components/Truncate/examples/TruncateDefault.tsx +7 -0
  312. package/src/components/Truncate/examples/TruncateMaxChars.tsx +27 -0
  313. package/src/components/Truncate/examples/TruncateMiddle.tsx +11 -0
  314. package/src/components/Truncate/examples/TruncateStart.tsx +7 -0
  315. package/src/components/Wizard/WizardNavInternal.tsx +1 -1
  316. package/src/components/Wizard/examples/WizardGetCurrentStep.tsx +1 -1
  317. package/src/demos/DescriptionList/examples/DescriptionListBasic.tsx +1 -1
  318. package/src/demos/DescriptionList/examples/DescriptionListInDrawer.tsx +1 -1
  319. package/src/demos/ExpandableSection/examples/ExpandableTextDemo.tsx +1 -1
  320. package/src/demos/SearchInput/SearchInput.md +2 -0
  321. package/src/demos/examples/Card/CardDetails.tsx +2 -2
  322. package/src/demos/examples/Card/CardEventsView.tsx +1 -1
  323. package/src/demos/examples/Card/CardLogView.tsx +1 -1
  324. package/src/demos/examples/Card/CardStatusTabbed.tsx +3 -3
  325. package/src/demos/examples/Skeleton/SkeletonCard.tsx +6 -6
  326. package/src/deprecated/components/Wizard/WizardNavItem.tsx +13 -11
  327. package/src/deprecated/components/Wizard/__tests__/Generated/__snapshots__/WizardNavItem.test.tsx.snap +5 -1
  328. package/src/deprecated/components/Wizard/__tests__/__snapshots__/Wizard.test.tsx.snap +83 -31
  329. package/src/components/List/__tests__/Generated/ListItem.test.tsx +0 -12
  330. package/src/components/List/__tests__/Generated/__snapshots__/ListItem.test.tsx.snap +0 -13
@@ -48,4 +48,16 @@ describe('LoginForm', () => {
48
48
  const { asFragment } = render(<LoginForm isShowPasswordEnabled />);
49
49
  expect(asFragment()).toMatchSnapshot();
50
50
  });
51
+
52
+ test('Renders LoginForm with password field required by default', () => {
53
+ render(<LoginForm />);
54
+ const passwordField = screen.getByLabelText(/password/i);
55
+ expect(passwordField).toBeRequired();
56
+ });
57
+
58
+ test('Renders LoginForm with password field not required when isPasswordRequired set to false', () => {
59
+ render(<LoginForm isPasswordRequired={false} />);
60
+ const passwordField = screen.getByLabelText(/password/i);
61
+ expect(passwordField).not.toBeRequired();
62
+ });
51
63
  });
@@ -31,6 +31,7 @@ import GitlabIcon from '@patternfly/react-icons/dist/esm/icons/gitlab-icon';
31
31
 
32
32
  ### Basic
33
33
 
34
+ By default, a login page requires users to enter both a username and a password into their respective fields. The username must always be a required field, but you can make the password optional by passing the `isPasswordRequired` property to the `<LoginForm>`.
34
35
  ```ts file='./LoginPageBasic.tsx' isFullscreen
35
36
 
36
37
  ```
@@ -10,7 +10,7 @@ export type NavSelectClickHandler = (
10
10
  to: string
11
11
  ) => void;
12
12
  export interface NavProps
13
- extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, 'onSelect'>,
13
+ extends Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, 'onSelect' | 'onToggle'>,
14
14
  OUIAProps {
15
15
  /** Anything that can be rendered inside of the nav */
16
16
  children?: React.ReactNode;
@@ -2,6 +2,7 @@ import { Divider, DividerProps } from '../Divider';
2
2
 
3
3
  export const NavItemSeparator: React.FunctionComponent<DividerProps> = ({
4
4
  component = 'li',
5
+ role = 'presentation',
5
6
  ...props
6
- }: DividerProps) => <Divider component={component} {...props} />;
7
+ }: DividerProps) => <Divider component={component} role={role} {...props} />;
7
8
  NavItemSeparator.displayName = 'NavItemSeparator';
@@ -22,7 +22,9 @@ export interface PageProps extends React.HTMLProps<HTMLDivElement> {
22
22
  className?: string;
23
23
  /** Masthead component (e.g. <Masthead />) */
24
24
  masthead?: React.ReactNode;
25
- /** Sidebar component for a side nav (e.g. <PageSidebar />) */
25
+ /** Sidebar component for a side nav, recommended to be a PageSidebar. If set to null, the page grid layout
26
+ * will render without a sidebar.
27
+ */
26
28
  sidebar?: React.ReactNode;
27
29
  /** Notification drawer component for an optional notification drawer (e.g. <NotificationDrawer />) */
28
30
  notificationDrawer?: React.ReactNode;
@@ -336,6 +338,7 @@ class Page extends Component<PageProps, PageState> {
336
338
  width !== null && height !== null && 'pf-m-resize-observer',
337
339
  width !== null && `pf-m-breakpoint-${getBreakpoint(width)}`,
338
340
  height !== null && `pf-m-height-breakpoint-${getVerticalBreakpoint(height)}`,
341
+ sidebar === null && styles.modifiers.noSidebar,
339
342
  className
340
343
  )}
341
344
  >
@@ -353,6 +353,24 @@ describe('Page', () => {
353
353
  expect(asFragment()).toMatchSnapshot();
354
354
  });
355
355
 
356
+ test(`Does not render with class ${styles.modifiers.noSidebar} by default`, () => {
357
+ render(<Page data-testid="page"></Page>);
358
+
359
+ expect(screen.getByTestId('page')).not.toHaveClass(styles.modifiers.noSidebar);
360
+ });
361
+
362
+ test(`Does not render with class ${styles.modifiers.noSidebar} when sidebar prop is passed with valid content`, () => {
363
+ render(<Page data-testid="page" sidebar={<div>sidebar content</div>}></Page>);
364
+
365
+ expect(screen.getByTestId('page')).not.toHaveClass(styles.modifiers.noSidebar);
366
+ });
367
+
368
+ test(`Renders with class ${styles.modifiers.noSidebar} when sidebar is set to null`, () => {
369
+ render(<Page data-testid="page" sidebar={null}></Page>);
370
+
371
+ expect(screen.getByTestId('page')).toHaveClass(styles.modifiers.noSidebar);
372
+ });
373
+
356
374
  test(`Does not render with ${styles.modifiers.fill} or ${styles.modifiers.noFill} if isContentFilled is not passed`, () => {
357
375
  render(<Page {...props} role="main"></Page>);
358
376
 
@@ -8,7 +8,7 @@ import {
8
8
  } from '@patternfly/react-core';
9
9
 
10
10
  export const ProgressTitleOutsideOfProgressBar: React.FunctionComponent = () => (
11
- <DescriptionList>
11
+ <DescriptionList aria-label="Progress Title outside of progress bar">
12
12
  <DescriptionListGroup>
13
13
  <DescriptionListTerm id="title-outside-progress-example-label">Title outside of progress bar</DescriptionListTerm>
14
14
  <DescriptionListDescription>
@@ -32,6 +32,7 @@ export const SearchInputAdvanced: React.FunctionComponent = () => {
32
32
  />
33
33
  <br />
34
34
  <SearchInput
35
+ aria-label="Advanced search"
35
36
  attributes={[
36
37
  { attr: 'username', display: 'Username' },
37
38
  { attr: 'firstname', display: 'First name' }
@@ -10,6 +10,7 @@ export const SearchInputBasic: React.FunctionComponent = () => {
10
10
 
11
11
  return (
12
12
  <SearchInput
13
+ aria-label="Search basic example"
13
14
  placeholder="Find by name"
14
15
  value={value}
15
16
  onChange={(_event, value) => onChange(value)}
@@ -7,7 +7,13 @@ export const SearchInputFocusSearch: React.FunctionComponent = () => {
7
7
 
8
8
  return (
9
9
  <>
10
- <SearchInput ref={ref} value={value} onChange={(_event, value) => setValue(value)} onClear={() => setValue('')} />
10
+ <SearchInput
11
+ ref={ref}
12
+ value={value}
13
+ onChange={(_event, value) => setValue(value)}
14
+ onClear={() => setValue('')}
15
+ aria-label="Search focus using ref example"
16
+ />
11
17
  <Button onClick={() => ref.current && ref.current.focus()}>Focus on the search input</Button>
12
18
  </>
13
19
  );
@@ -15,6 +15,7 @@ export const SearchInputWithExpandable: React.FunctionComponent = () => {
15
15
 
16
16
  return (
17
17
  <SearchInput
18
+ aria-label="Search with expandable button example"
18
19
  placeholder="Find by name"
19
20
  value={value}
20
21
  onChange={(_event, value) => onChange(value)}
@@ -29,6 +29,7 @@ export const SearchInputWithNavigableOptions: React.FunctionComponent = () => {
29
29
 
30
30
  return (
31
31
  <SearchInput
32
+ aria-label="Search match with navigable options example"
32
33
  placeholder="Find by name"
33
34
  value={value}
34
35
  onChange={(_event, value) => onChange(value)}
@@ -17,6 +17,7 @@ export const SearchInputWithResultCount: React.FunctionComponent = () => {
17
17
 
18
18
  return (
19
19
  <SearchInput
20
+ aria-label="Match with result count"
20
21
  placeholder="Find by name"
21
22
  value={value}
22
23
  onChange={(_event, value) => onChange(value)}
@@ -6,6 +6,7 @@ export const SearchInputWithSubmitButton: React.FunctionComponent = () => {
6
6
 
7
7
  return (
8
8
  <SearchInput
9
+ aria-label="Search with submit button example"
9
10
  placeholder="Find by name"
10
11
  value={value}
11
12
  onChange={(_event, value) => setValue(value)}
@@ -10,7 +10,7 @@ export interface SelectGroupProps extends Omit<MenuGroupProps, 'ref'> {
10
10
  /** Classes applied to root element of select group */
11
11
  className?: string;
12
12
  /** Label of the select group */
13
- label?: string;
13
+ label?: React.ReactNode;
14
14
  }
15
15
 
16
16
  export const SelectGroup: React.FunctionComponent<SelectGroupProps> = ({
@@ -1,3 +1,3 @@
1
1
  import { Skeleton } from '@patternfly/react-core';
2
2
 
3
- export const SkeletonDefault: React.FunctionComponent = () => <Skeleton screenreaderText="Loading contents" />;
3
+ export const SkeletonDefault: React.FunctionComponent = () => <Skeleton screenreaderText="Loading default content" />;
@@ -2,11 +2,11 @@ import { Skeleton } from '@patternfly/react-core';
2
2
 
3
3
  export const SkeletonPercentageHeight: React.FunctionComponent = () => (
4
4
  <div style={{ height: '400px', display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between' }}>
5
- <Skeleton height="25%" width="15%" screenreaderText="Loaded 25% of content" />
6
- <Skeleton height="33%" width="15%" screenreaderText="Loaded 33% of content" />
7
- <Skeleton height="50%" width="15%" screenreaderText="Loaded 50% of content" />
8
- <Skeleton height="66%" width="15%" screenreaderText="Loaded 66% of content" />
9
- <Skeleton height="75%" width="15%" screenreaderText="Loaded 75% of content" />
10
- <Skeleton height="100%" width="15%" screenreaderText="Loaded 100% of content" />
5
+ <Skeleton height="25%" width="15%" screenreaderText="Loading percentage height content" />
6
+ <Skeleton height="33%" width="15%" />
7
+ <Skeleton height="50%" width="15%" />
8
+ <Skeleton height="66%" width="15%" />
9
+ <Skeleton height="75%" width="15%" />
10
+ <Skeleton height="100%" width="15%" />
11
11
  </div>
12
12
  );
@@ -3,15 +3,15 @@ import { Skeleton } from '@patternfly/react-core';
3
3
 
4
4
  export const SkeletonPercentageWidth: React.FunctionComponent = () => (
5
5
  <Fragment>
6
- <Skeleton width="25%" screenreaderText="Loaded 25% of content" />
6
+ <Skeleton width="25%" screenreaderText="Loading percentage width content" />
7
7
  <br />
8
- <Skeleton width="33%" screenreaderText="Loaded 33% of content" />
8
+ <Skeleton width="33%" />
9
9
  <br />
10
- <Skeleton width="50%" screenreaderText="Loaded 50% of content" />
10
+ <Skeleton width="50%" />
11
11
  <br />
12
- <Skeleton width="66%" screenreaderText="Loaded 66% of content" />
12
+ <Skeleton width="66%" />
13
13
  <br />
14
- <Skeleton width="75%" screenreaderText="Loaded 75% of content" />
14
+ <Skeleton width="75%" />
15
15
  <br />
16
16
  <Skeleton />
17
17
  </Fragment>
@@ -4,36 +4,36 @@ import { Skeleton } from '@patternfly/react-core';
4
4
  export const SkeletonShapes: React.FunctionComponent = () => (
5
5
  <Fragment>
6
6
  Small circle
7
- <Skeleton shape="circle" width="15%" screenreaderText="Loading small circle contents" />
7
+ <Skeleton shape="circle" width="15%" screenreaderText="Loading circle content" />
8
8
  <br />
9
9
  Medium circle
10
- <Skeleton shape="circle" width="30%" screenreaderText="Loading medium circle contents" />
10
+ <Skeleton shape="circle" width="30%" />
11
11
  <br />
12
12
  Large circle
13
- <Skeleton shape="circle" width="50%" screenreaderText="Loading large circle contents" />
13
+ <Skeleton shape="circle" width="50%" />
14
14
  <br />
15
15
  Small square
16
- <Skeleton shape="square" width="15%" screenreaderText="Loading small square contents" />
16
+ <Skeleton shape="square" width="15%" screenreaderText="Loading square content" />
17
17
  <br />
18
18
  Medium square
19
- <Skeleton shape="square" width="30%" screenreaderText="Loading medium square contents" />
19
+ <Skeleton shape="square" width="30%" />
20
20
  <br />
21
21
  Large square
22
- <Skeleton shape="square" width="50%" screenreaderText="Loading large square contents" />
22
+ <Skeleton shape="square" width="50%" />
23
23
  <br />
24
24
  Small rectangle
25
25
  <div style={{ height: '200px' }}>
26
- <Skeleton height="50%" width="50%" screenreaderText="Loading small rectangle contents" />
26
+ <Skeleton height="50%" width="50%" screenreaderText="Loading rectangle content" />
27
27
  </div>
28
28
  <br />
29
29
  Medium rectangle
30
30
  <div style={{ height: '200px' }}>
31
- <Skeleton height="75%" width="75%" screenreaderText="Loading medium rectangle contents" />
31
+ <Skeleton height="75%" width="75%" />
32
32
  </div>
33
33
  <br />
34
34
  Large rectangle
35
35
  <div style={{ height: '200px' }}>
36
- <Skeleton height="100%" screenreaderText="Loading large rectangle contents" />
36
+ <Skeleton height="100%" />
37
37
  </div>
38
38
  </Fragment>
39
39
  );
@@ -12,24 +12,24 @@ import t_global_font_size_sm from '@patternfly/react-tokens/dist/esm/t_global_fo
12
12
  export const SkeletonText: React.FunctionComponent = () => (
13
13
  <Fragment>
14
14
  {t_global_font_size_4xl.name}
15
- <Skeleton fontSize="4xl" screenreaderText="Loading font size 4xl" />
15
+ <Skeleton fontSize="4xl" screenreaderText="Loading text content" />
16
16
  <br />
17
17
  {t_global_font_size_3xl.name}
18
- <Skeleton fontSize="3xl" screenreaderText="Loading font size 3xl" />
18
+ <Skeleton fontSize="3xl" />
19
19
  <br />
20
20
  {t_global_font_size_2xl.name}
21
- <Skeleton fontSize="2xl" screenreaderText="Loading font size 2xl" />
21
+ <Skeleton fontSize="2xl" />
22
22
  <br />
23
23
  {t_global_font_size_xl.name}
24
- <Skeleton fontSize="xl" screenreaderText="Loading font size xl" />
24
+ <Skeleton fontSize="xl" />
25
25
  <br />
26
26
  {t_global_font_size_lg.name}
27
- <Skeleton fontSize="lg" screenreaderText="Loading font size lg" />
27
+ <Skeleton fontSize="lg" />
28
28
  <br />
29
29
  {t_global_font_size_md.name}
30
- <Skeleton fontSize="md" screenreaderText="Loading font size md" />
30
+ <Skeleton fontSize="md" />
31
31
  <br />
32
32
  {t_global_font_size_sm.name}
33
- <Skeleton fontSize="sm" screenreaderText="Loading font size sm" />
33
+ <Skeleton fontSize="sm" />
34
34
  </Fragment>
35
35
  );
@@ -31,7 +31,9 @@ export interface HorizontalOverflowObject {
31
31
  type TabElement = React.ReactElement<TabProps, React.JSXElementConstructor<TabProps>>;
32
32
  type TabsChild = TabElement | boolean | null | undefined;
33
33
 
34
- export interface TabsProps extends Omit<React.HTMLProps<HTMLElement | HTMLDivElement>, 'onSelect'>, OUIAProps {
34
+ export interface TabsProps
35
+ extends Omit<React.HTMLProps<HTMLElement | HTMLDivElement>, 'onSelect' | 'onToggle'>,
36
+ OUIAProps {
35
37
  /** Content rendered inside the tabs component. Only `Tab` components or expressions resulting in a falsy value are allowed here. */
36
38
  children: TabsChild | TabsChild[];
37
39
  /** Additional classes added to the tabs */
@@ -12,7 +12,7 @@ export enum ToolbarGroupVariant {
12
12
  'label-group' = 'label-group'
13
13
  }
14
14
 
15
- export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref'> {
15
+ export interface ToolbarGroupProps extends Omit<React.HTMLProps<HTMLDivElement>, 'ref' | 'onToggle'> {
16
16
  /** Classes applied to root element of the data toolbar group */
17
17
  className?: string;
18
18
  /** A type modifier which modifies spacing specifically depending on the type of group */
@@ -185,10 +185,19 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
185
185
  children,
186
186
  isAllExpanded,
187
187
  isOverflowContainer,
188
+ role,
188
189
  ...props
189
190
  }: ToolbarItemProps) => {
190
191
  if (variant === ToolbarItemVariant.separator) {
191
- return <Divider className={css(className)} orientation={{ default: 'vertical' }} {...props} />;
192
+ const isDividerRoleValid = role === 'separator' || role === 'presentation';
193
+ return (
194
+ <Divider
195
+ className={css(className)}
196
+ orientation={{ default: 'vertical' }}
197
+ {...props}
198
+ {...(isDividerRoleValid && { role: role as 'separator' | 'presentation' })}
199
+ />
200
+ );
192
201
  }
193
202
 
194
203
  return (
@@ -217,6 +226,7 @@ export const ToolbarItem: React.FunctionComponent<ToolbarItemProps> = ({
217
226
  )}
218
227
  {...(variant === 'label' && { 'aria-hidden': true })}
219
228
  id={id}
229
+ role={role}
220
230
  {...props}
221
231
  >
222
232
  {children}
@@ -22,8 +22,18 @@ export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
22
22
  className?: string;
23
23
  /** Text to truncate */
24
24
  content: string;
25
- /** The number of characters displayed in the second half of the truncation */
25
+ /** The number of characters displayed in the second half of a middle truncation. This will be overridden by
26
+ * the maxCharsDisplayed prop.
27
+ */
26
28
  trailingNumChars?: number;
29
+ /** The maximum number of characters to display before truncating. This will always truncate content
30
+ * when its length exceeds the value passed to this prop, and container width/resizing will not affect truncation.
31
+ */
32
+ maxCharsDisplayed?: number;
33
+ /** The content to use to signify omission of characters when using the maxCharsDisplayed prop.
34
+ * By default this will render an ellipsis.
35
+ */
36
+ omissionContent?: string;
27
37
  /** Where the text will be truncated */
28
38
  position?: 'start' | 'middle' | 'end';
29
39
  /** Tooltip position */
@@ -49,13 +59,15 @@ export interface TruncateProps extends React.HTMLProps<HTMLSpanElement> {
49
59
  refToGetParent?: React.RefObject<any>;
50
60
  }
51
61
 
52
- const sliceContent = (str: string, slice: number) => [str.slice(0, str.length - slice), str.slice(-slice)];
62
+ const sliceTrailingContent = (str: string, slice: number) => [str.slice(0, str.length - slice), str.slice(-slice)];
53
63
 
54
64
  export const Truncate: React.FunctionComponent<TruncateProps> = ({
55
65
  className,
56
66
  position = 'end',
57
67
  tooltipPosition = 'top',
58
68
  trailingNumChars = 7,
69
+ maxCharsDisplayed,
70
+ omissionContent = '\u2026',
59
71
  content,
60
72
  refToGetParent,
61
73
  ...props
@@ -63,11 +75,17 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
63
75
  const [isTruncated, setIsTruncated] = useState(true);
64
76
  const [parentElement, setParentElement] = useState<HTMLElement>(null);
65
77
  const [textElement, setTextElement] = useState<HTMLElement>(null);
78
+ const [shouldRenderByMaxChars, setShouldRenderByMaxChars] = useState(maxCharsDisplayed > 0);
66
79
 
67
80
  const textRef = useRef<HTMLElement>(null);
68
81
  const subParentRef = useRef<HTMLDivElement>(null);
69
82
  const observer = useRef(null);
70
83
 
84
+ if (maxCharsDisplayed <= 0) {
85
+ // eslint-disable-next-line no-console
86
+ console.warn('Truncate: the maxCharsDisplayed must be greater than 0, otherwise no content will be visible.');
87
+ }
88
+
71
89
  const getActualWidth = (element: Element) => {
72
90
  const computedStyle = getComputedStyle(element);
73
91
 
@@ -100,7 +118,7 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
100
118
  }, [textRef, subParentRef, textElement, parentElement]);
101
119
 
102
120
  useEffect(() => {
103
- if (textElement && parentElement && !observer.current) {
121
+ if (textElement && parentElement && !observer.current && !shouldRenderByMaxChars) {
104
122
  const totalTextWidth = calculateTotalTextWidth(textElement, trailingNumChars, content);
105
123
  const textWidth = position === 'middle' ? totalTextWidth : textElement.scrollWidth;
106
124
 
@@ -115,31 +133,100 @@ export const Truncate: React.FunctionComponent<TruncateProps> = ({
115
133
  observer();
116
134
  };
117
135
  }
118
- }, [textElement, parentElement, trailingNumChars, content, position]);
136
+ }, [textElement, parentElement, trailingNumChars, content, position, shouldRenderByMaxChars]);
119
137
 
120
- const truncateBody = (
121
- <span ref={subParentRef} className={css(styles.truncate, className)} {...props}>
122
- {(position === TruncatePosition.end || position === TruncatePosition.start) && (
123
- <span ref={textRef} className={truncateStyles[position]}>
124
- {content}
125
- {position === TruncatePosition.start && <Fragment>&lrm;</Fragment>}
126
- </span>
127
- )}
128
- {position === TruncatePosition.middle && content.length - trailingNumChars > minWidthCharacters && (
129
- <Fragment>
130
- <span ref={textRef} className={styles.truncateStart}>
131
- {sliceContent(content, trailingNumChars)[0]}
138
+ useEffect(() => {
139
+ if (shouldRenderByMaxChars) {
140
+ setIsTruncated(content.length > maxCharsDisplayed);
141
+ }
142
+ }, [shouldRenderByMaxChars]);
143
+
144
+ useEffect(() => {
145
+ setShouldRenderByMaxChars(maxCharsDisplayed > 0);
146
+ }, [maxCharsDisplayed]);
147
+
148
+ const renderResizeObserverContent = () => {
149
+ if (position === TruncatePosition.end || position === TruncatePosition.start) {
150
+ return (
151
+ <>
152
+ <span ref={textRef} className={truncateStyles[position]}>
153
+ {content}
154
+ {position === TruncatePosition.start && <Fragment>&lrm;</Fragment>}
132
155
  </span>
133
- <span className={styles.truncateEnd}>{sliceContent(content, trailingNumChars)[1]}</span>
134
- </Fragment>
135
- )}
136
- {position === TruncatePosition.middle && content.length - trailingNumChars <= minWidthCharacters && (
156
+ </>
157
+ );
158
+ }
159
+
160
+ const shouldSliceContent = content.length - trailingNumChars > minWidthCharacters;
161
+ return (
162
+ <>
137
163
  <Fragment>
138
164
  <span ref={textRef} className={styles.truncateStart}>
139
- {content}
165
+ {shouldSliceContent ? sliceTrailingContent(content, trailingNumChars)[0] : content}
140
166
  </span>
167
+ {shouldSliceContent && (
168
+ <span className={styles.truncateEnd}>{sliceTrailingContent(content, trailingNumChars)[1]}</span>
169
+ )}
141
170
  </Fragment>
142
- )}
171
+ </>
172
+ );
173
+ };
174
+
175
+ const renderMaxDisplayContent = () => {
176
+ const renderVisibleContent = (contentToRender: string) => (
177
+ <span className={`${styles.truncate}__text`}>{contentToRender}</span>
178
+ );
179
+ if (!isTruncated) {
180
+ return renderVisibleContent(content);
181
+ }
182
+
183
+ const omissionElement = (
184
+ <span className={`${styles.truncate}__omission`} aria-hidden="true">
185
+ {omissionContent}
186
+ </span>
187
+ );
188
+ const renderVisuallyHiddenContent = (contentToHide: string) => (
189
+ <span className="pf-v6-screen-reader">{contentToHide}</span>
190
+ );
191
+
192
+ if (position === TruncatePosition.start) {
193
+ return (
194
+ <>
195
+ {renderVisuallyHiddenContent(content.slice(0, maxCharsDisplayed * -1))}
196
+ {omissionElement}
197
+ {renderVisibleContent(content.slice(maxCharsDisplayed * -1))}
198
+ </>
199
+ );
200
+ }
201
+ if (position === TruncatePosition.end) {
202
+ return (
203
+ <>
204
+ {renderVisibleContent(content.slice(0, maxCharsDisplayed))}
205
+ {omissionElement}
206
+ {renderVisuallyHiddenContent(content.slice(maxCharsDisplayed))}
207
+ </>
208
+ );
209
+ }
210
+
211
+ const trueMiddleStart = Math.floor(maxCharsDisplayed / 2);
212
+ const trueMiddleEnd = Math.ceil(maxCharsDisplayed / 2) * -1;
213
+ return (
214
+ <>
215
+ {renderVisibleContent(content.slice(0, trueMiddleStart))}
216
+ {omissionElement}
217
+ {renderVisuallyHiddenContent(content.slice(trueMiddleStart, trueMiddleEnd))}
218
+ {renderVisibleContent(content.slice(trueMiddleEnd))}
219
+ </>
220
+ );
221
+ };
222
+
223
+ const truncateBody = (
224
+ <span
225
+ ref={subParentRef}
226
+ className={css(styles.truncate, shouldRenderByMaxChars && styles.modifiers.fixed, className)}
227
+ {...props}
228
+ >
229
+ {!shouldRenderByMaxChars ? renderResizeObserverContent() : renderMaxDisplayContent()}
143
230
  </span>
144
231
  );
145
232
 
@@ -1,4 +1,4 @@
1
- import { render, screen } from '@testing-library/react';
1
+ import { render, screen, within } from '@testing-library/react';
2
2
  import { Truncate } from '../Truncate';
3
3
  import styles from '@patternfly/react-styles/css/components/Truncate/truncate';
4
4
  import '@testing-library/jest-dom';
@@ -24,7 +24,7 @@ test(`renders with class ${styles.truncate}`, () => {
24
24
 
25
25
  const test = screen.getByLabelText('test-id');
26
26
 
27
- expect(test).toHaveClass(styles.truncate);
27
+ expect(test).toHaveClass(styles.truncate, { exact: true });
28
28
  });
29
29
 
30
30
  test('renders with custom class name passed via prop', () => {
@@ -148,3 +148,71 @@ test('renders with inherited element props spread to the component', () => {
148
148
 
149
149
  expect(screen.getByTestId('test-id')).toHaveAccessibleName('labelling-id');
150
150
  });
151
+
152
+ describe('Truncation with maxCharsDisplayed', () => {
153
+ test(`Does not render with class ${styles.modifiers.fixed} when maxCharsDisplayed is 0`, () => {
154
+ render(<Truncate maxCharsDisplayed={0} data-testid="truncate-component" content="Test content" />);
155
+
156
+ expect(screen.getByTestId('truncate-component')).not.toHaveClass(styles.modifiers.fixed);
157
+ });
158
+
159
+ test(`Renders with class ${styles.modifiers.fixed} when maxCharsDisplayed is greater than 0`, () => {
160
+ render(<Truncate maxCharsDisplayed={1} data-testid="truncate-component" content="Test content" />);
161
+
162
+ expect(screen.getByTestId('truncate-component')).toHaveClass(styles.modifiers.fixed);
163
+ });
164
+
165
+ test('Renders with hidden truncated content at end by default when maxCharsDisplayed is passed', () => {
166
+ render(<Truncate content="Default end position content truncated" maxCharsDisplayed={6} />);
167
+
168
+ expect(screen.getByText('Defaul')).toHaveClass(`${styles.truncate}__text`, { exact: true });
169
+ expect(screen.getByText('t end position content truncated')).toHaveClass('pf-v6-screen-reader');
170
+ });
171
+
172
+ test('Renders with hidden truncated content at middle position when maxCharsDisplayed is passed and position="middle"', () => {
173
+ render(<Truncate position="middle" content="Middle position contents being truncated" maxCharsDisplayed={10} />);
174
+
175
+ expect(screen.getByText('Middl')).toHaveClass(`${styles.truncate}__text`, { exact: true });
176
+ expect(screen.getByText('e position contents being trun')).toHaveClass('pf-v6-screen-reader');
177
+ expect(screen.getByText('cated')).toHaveClass(`${styles.truncate}__text`, { exact: true });
178
+ });
179
+
180
+ test('Renders with hidden truncated content at start when maxCharsDisplayed is passed and position="start"', () => {
181
+ render(<Truncate position="start" content="Start position content truncated" maxCharsDisplayed={6} />);
182
+
183
+ expect(screen.getByText('Start position content tru')).toHaveClass('pf-v6-screen-reader');
184
+ expect(screen.getByText('ncated')).toHaveClass(`${styles.truncate}__text`, { exact: true });
185
+ });
186
+
187
+ test('Renders full content when maxCharsDisplayed exceeds the length of the content', () => {
188
+ render(<Truncate content="This full content is rendered" maxCharsDisplayed={90} />);
189
+
190
+ expect(screen.getByText('This full content is rendered')).toHaveClass(`${styles.truncate}__text`, { exact: true });
191
+ });
192
+
193
+ test('Renders ellipsis as omission content by default', () => {
194
+ render(<Truncate content="Test truncation content" maxCharsDisplayed={5} />);
195
+
196
+ expect(screen.getByText('\u2026')).toHaveClass(`${styles.truncate}__omission`, { exact: true });
197
+ expect(screen.getByText('\u2026')).toHaveAttribute('aria-hidden', 'true');
198
+ });
199
+
200
+ test('Renders custom omission content when omissionContent is passed', () => {
201
+ render(<Truncate omissionContent="---" content="Test truncation content" maxCharsDisplayed={5} />);
202
+
203
+ expect(screen.getByText('---')).toHaveClass(`${styles.truncate}__omission`, { exact: true });
204
+ expect(screen.getByText('---')).toHaveAttribute('aria-hidden', 'true');
205
+ });
206
+
207
+ test('Does not render omission content when maxCharsDisplayed exceeds the length of the content ', () => {
208
+ render(<Truncate content="Test truncation content" maxCharsDisplayed={99} />);
209
+
210
+ expect(screen.queryByText('\u2026')).not.toBeInTheDocument();
211
+ });
212
+
213
+ test('Matches snapshot with default position', () => {
214
+ const { asFragment } = render(<Truncate content="Test truncation content" maxCharsDisplayed={3} />);
215
+
216
+ expect(asFragment()).toMatchSnapshot();
217
+ });
218
+ });