@patternfly/react-core 5.0.0-alpha.69 → 5.0.0-alpha.70

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 (287) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/esm/components/AboutModal/AboutModal.d.ts +1 -1
  3. package/dist/esm/components/AboutModal/AboutModal.d.ts.map +1 -1
  4. package/dist/esm/components/AboutModal/AboutModal.js +9 -5
  5. package/dist/esm/components/AboutModal/AboutModal.js.map +1 -1
  6. package/dist/esm/components/AboutModal/package.json +1 -1
  7. package/dist/esm/components/Accordion/package.json +1 -1
  8. package/dist/esm/components/ActionList/package.json +1 -1
  9. package/dist/esm/components/Alert/package.json +1 -1
  10. package/dist/esm/components/AlertGroup/package.json +1 -1
  11. package/dist/esm/components/Avatar/package.json +1 -1
  12. package/dist/esm/components/BackToTop/package.json +1 -1
  13. package/dist/esm/components/Backdrop/package.json +1 -1
  14. package/dist/esm/components/BackgroundImage/BackgroundImage.d.ts +3 -12
  15. package/dist/esm/components/BackgroundImage/BackgroundImage.d.ts.map +1 -1
  16. package/dist/esm/components/BackgroundImage/BackgroundImage.js +8 -34
  17. package/dist/esm/components/BackgroundImage/BackgroundImage.js.map +1 -1
  18. package/dist/esm/components/BackgroundImage/package.json +1 -1
  19. package/dist/esm/components/Badge/package.json +1 -1
  20. package/dist/esm/components/Banner/package.json +1 -1
  21. package/dist/esm/components/Brand/package.json +1 -1
  22. package/dist/esm/components/Breadcrumb/package.json +1 -1
  23. package/dist/esm/components/Button/package.json +1 -1
  24. package/dist/esm/components/CalendarMonth/package.json +1 -1
  25. package/dist/esm/components/Card/package.json +1 -1
  26. package/dist/esm/components/Checkbox/package.json +1 -1
  27. package/dist/esm/components/Chip/package.json +1 -1
  28. package/dist/esm/components/ChipGroup/package.json +1 -1
  29. package/dist/esm/components/ClipboardCopy/package.json +1 -1
  30. package/dist/esm/components/CodeBlock/package.json +1 -1
  31. package/dist/esm/components/DataList/package.json +1 -1
  32. package/dist/esm/components/DatePicker/package.json +1 -1
  33. package/dist/esm/components/DescriptionList/package.json +1 -1
  34. package/dist/esm/components/Divider/package.json +1 -1
  35. package/dist/esm/components/DragDrop/package.json +1 -1
  36. package/dist/esm/components/Drawer/package.json +1 -1
  37. package/dist/esm/components/Dropdown/package.json +1 -1
  38. package/dist/esm/components/DualListSelector/package.json +1 -1
  39. package/dist/esm/components/EmptyState/package.json +1 -1
  40. package/dist/esm/components/ExpandableSection/package.json +1 -1
  41. package/dist/esm/components/FileUpload/package.json +1 -1
  42. package/dist/esm/components/Form/FormContext.d.ts +41 -0
  43. package/dist/esm/components/Form/FormContext.d.ts.map +1 -0
  44. package/dist/esm/components/Form/FormContext.js +62 -0
  45. package/dist/esm/components/Form/FormContext.js.map +1 -0
  46. package/dist/esm/components/Form/index.d.ts +1 -0
  47. package/dist/esm/components/Form/index.d.ts.map +1 -1
  48. package/dist/esm/components/Form/index.js +1 -0
  49. package/dist/esm/components/Form/index.js.map +1 -1
  50. package/dist/esm/components/Form/package.json +1 -1
  51. package/dist/esm/components/FormSelect/package.json +1 -1
  52. package/dist/esm/components/HelperText/package.json +1 -1
  53. package/dist/esm/components/Hint/package.json +1 -1
  54. package/dist/esm/components/Icon/package.json +1 -1
  55. package/dist/esm/components/InputGroup/package.json +1 -1
  56. package/dist/esm/components/JumpLinks/package.json +1 -1
  57. package/dist/esm/components/Label/package.json +1 -1
  58. package/dist/esm/components/LabelGroup/package.json +1 -1
  59. package/dist/esm/components/List/package.json +1 -1
  60. package/dist/esm/components/LoginPage/LoginPage.d.ts +1 -4
  61. package/dist/esm/components/LoginPage/LoginPage.d.ts.map +1 -1
  62. package/dist/esm/components/LoginPage/LoginPage.js +2 -2
  63. package/dist/esm/components/LoginPage/LoginPage.js.map +1 -1
  64. package/dist/esm/components/LoginPage/package.json +1 -1
  65. package/dist/esm/components/Masthead/package.json +1 -1
  66. package/dist/esm/components/Menu/MenuItem.d.ts +1 -1
  67. package/dist/esm/components/Menu/package.json +1 -1
  68. package/dist/esm/components/MenuToggle/package.json +1 -1
  69. package/dist/esm/components/Modal/package.json +1 -1
  70. package/dist/esm/components/MultipleFileUpload/package.json +1 -1
  71. package/dist/esm/components/Nav/package.json +1 -1
  72. package/dist/esm/components/NotificationBadge/package.json +1 -1
  73. package/dist/esm/components/NotificationDrawer/package.json +1 -1
  74. package/dist/esm/components/NumberInput/package.json +1 -1
  75. package/dist/esm/components/OverflowMenu/package.json +1 -1
  76. package/dist/esm/components/Page/package.json +1 -1
  77. package/dist/esm/components/Pagination/package.json +1 -1
  78. package/dist/esm/components/Panel/package.json +1 -1
  79. package/dist/esm/components/Popover/package.json +1 -1
  80. package/dist/esm/components/Progress/package.json +1 -1
  81. package/dist/esm/components/ProgressStepper/package.json +1 -1
  82. package/dist/esm/components/Radio/package.json +1 -1
  83. package/dist/esm/components/SearchInput/package.json +1 -1
  84. package/dist/esm/components/Select/package.json +1 -1
  85. package/dist/esm/components/Sidebar/package.json +1 -1
  86. package/dist/esm/components/SimpleList/package.json +1 -1
  87. package/dist/esm/components/Skeleton/package.json +1 -1
  88. package/dist/esm/components/SkipToContent/package.json +1 -1
  89. package/dist/esm/components/Slider/package.json +1 -1
  90. package/dist/esm/components/Spinner/package.json +1 -1
  91. package/dist/esm/components/Switch/package.json +1 -1
  92. package/dist/esm/components/Tabs/package.json +1 -1
  93. package/dist/esm/components/Text/package.json +1 -1
  94. package/dist/esm/components/TextArea/package.json +1 -1
  95. package/dist/esm/components/TextInput/package.json +1 -1
  96. package/dist/esm/components/TextInputGroup/package.json +1 -1
  97. package/dist/esm/components/Tile/package.json +1 -1
  98. package/dist/esm/components/TimePicker/package.json +1 -1
  99. package/dist/esm/components/Timestamp/package.json +1 -1
  100. package/dist/esm/components/Title/package.json +1 -1
  101. package/dist/esm/components/ToggleGroup/package.json +1 -1
  102. package/dist/esm/components/Toolbar/package.json +1 -1
  103. package/dist/esm/components/Tooltip/package.json +1 -1
  104. package/dist/esm/components/TreeView/package.json +1 -1
  105. package/dist/esm/components/Truncate/package.json +1 -1
  106. package/dist/esm/components/Wizard/package.json +1 -1
  107. package/dist/esm/components/package.json +1 -1
  108. package/dist/esm/deprecated/components/ApplicationLauncher/package.json +1 -1
  109. package/dist/esm/deprecated/components/ContextSelector/package.json +1 -1
  110. package/dist/esm/deprecated/components/Dropdown/package.json +1 -1
  111. package/dist/esm/deprecated/components/OptionsMenu/package.json +1 -1
  112. package/dist/esm/deprecated/components/PageHeader/package.json +1 -1
  113. package/dist/esm/deprecated/components/Select/package.json +1 -1
  114. package/dist/esm/deprecated/components/package.json +1 -1
  115. package/dist/esm/deprecated/package.json +1 -1
  116. package/dist/esm/helpers/Popper/thirdparty/popper-core/package.json +1 -1
  117. package/dist/esm/helpers/package.json +1 -1
  118. package/dist/esm/layouts/Bullseye/package.json +1 -1
  119. package/dist/esm/layouts/Flex/package.json +1 -1
  120. package/dist/esm/layouts/Gallery/package.json +1 -1
  121. package/dist/esm/layouts/Grid/package.json +1 -1
  122. package/dist/esm/layouts/Level/package.json +1 -1
  123. package/dist/esm/layouts/Split/package.json +1 -1
  124. package/dist/esm/layouts/Stack/package.json +1 -1
  125. package/dist/esm/layouts/package.json +1 -1
  126. package/dist/esm/next/components/Wizard/hooks/package.json +1 -1
  127. package/dist/esm/next/components/Wizard/package.json +1 -1
  128. package/dist/esm/next/components/package.json +1 -1
  129. package/dist/esm/next/package.json +1 -1
  130. package/dist/esm/package.json +1 -1
  131. package/dist/js/components/AboutModal/AboutModal.d.ts +1 -1
  132. package/dist/js/components/AboutModal/AboutModal.d.ts.map +1 -1
  133. package/dist/js/components/AboutModal/AboutModal.js +9 -5
  134. package/dist/js/components/AboutModal/AboutModal.js.map +1 -1
  135. package/dist/js/components/AboutModal/package.json +1 -1
  136. package/dist/js/components/Accordion/package.json +1 -1
  137. package/dist/js/components/ActionList/package.json +1 -1
  138. package/dist/js/components/Alert/package.json +1 -1
  139. package/dist/js/components/AlertGroup/package.json +1 -1
  140. package/dist/js/components/Avatar/package.json +1 -1
  141. package/dist/js/components/BackToTop/package.json +1 -1
  142. package/dist/js/components/Backdrop/package.json +1 -1
  143. package/dist/js/components/BackgroundImage/BackgroundImage.d.ts +3 -12
  144. package/dist/js/components/BackgroundImage/BackgroundImage.d.ts.map +1 -1
  145. package/dist/js/components/BackgroundImage/BackgroundImage.js +8 -34
  146. package/dist/js/components/BackgroundImage/BackgroundImage.js.map +1 -1
  147. package/dist/js/components/BackgroundImage/package.json +1 -1
  148. package/dist/js/components/Badge/package.json +1 -1
  149. package/dist/js/components/Banner/package.json +1 -1
  150. package/dist/js/components/Brand/package.json +1 -1
  151. package/dist/js/components/Breadcrumb/package.json +1 -1
  152. package/dist/js/components/Button/package.json +1 -1
  153. package/dist/js/components/CalendarMonth/package.json +1 -1
  154. package/dist/js/components/Card/package.json +1 -1
  155. package/dist/js/components/Checkbox/package.json +1 -1
  156. package/dist/js/components/Chip/package.json +1 -1
  157. package/dist/js/components/ChipGroup/package.json +1 -1
  158. package/dist/js/components/ClipboardCopy/package.json +1 -1
  159. package/dist/js/components/CodeBlock/package.json +1 -1
  160. package/dist/js/components/DataList/package.json +1 -1
  161. package/dist/js/components/DatePicker/package.json +1 -1
  162. package/dist/js/components/DescriptionList/package.json +1 -1
  163. package/dist/js/components/Divider/package.json +1 -1
  164. package/dist/js/components/DragDrop/package.json +1 -1
  165. package/dist/js/components/Drawer/package.json +1 -1
  166. package/dist/js/components/Dropdown/package.json +1 -1
  167. package/dist/js/components/DualListSelector/package.json +1 -1
  168. package/dist/js/components/EmptyState/package.json +1 -1
  169. package/dist/js/components/ExpandableSection/package.json +1 -1
  170. package/dist/js/components/FileUpload/package.json +1 -1
  171. package/dist/js/components/Form/FormContext.d.ts +41 -0
  172. package/dist/js/components/Form/FormContext.d.ts.map +1 -0
  173. package/dist/js/components/Form/FormContext.js +67 -0
  174. package/dist/js/components/Form/FormContext.js.map +1 -0
  175. package/dist/js/components/Form/index.d.ts +1 -0
  176. package/dist/js/components/Form/index.d.ts.map +1 -1
  177. package/dist/js/components/Form/index.js +1 -0
  178. package/dist/js/components/Form/index.js.map +1 -1
  179. package/dist/js/components/Form/package.json +1 -1
  180. package/dist/js/components/FormSelect/package.json +1 -1
  181. package/dist/js/components/HelperText/package.json +1 -1
  182. package/dist/js/components/Hint/package.json +1 -1
  183. package/dist/js/components/Icon/package.json +1 -1
  184. package/dist/js/components/InputGroup/package.json +1 -1
  185. package/dist/js/components/JumpLinks/package.json +1 -1
  186. package/dist/js/components/Label/package.json +1 -1
  187. package/dist/js/components/LabelGroup/package.json +1 -1
  188. package/dist/js/components/List/package.json +1 -1
  189. package/dist/js/components/LoginPage/LoginPage.d.ts +1 -4
  190. package/dist/js/components/LoginPage/LoginPage.d.ts.map +1 -1
  191. package/dist/js/components/LoginPage/LoginPage.js +2 -2
  192. package/dist/js/components/LoginPage/LoginPage.js.map +1 -1
  193. package/dist/js/components/LoginPage/package.json +1 -1
  194. package/dist/js/components/Masthead/package.json +1 -1
  195. package/dist/js/components/Menu/MenuItem.d.ts +1 -1
  196. package/dist/js/components/Menu/package.json +1 -1
  197. package/dist/js/components/MenuToggle/package.json +1 -1
  198. package/dist/js/components/Modal/package.json +1 -1
  199. package/dist/js/components/MultipleFileUpload/package.json +1 -1
  200. package/dist/js/components/Nav/package.json +1 -1
  201. package/dist/js/components/NotificationBadge/package.json +1 -1
  202. package/dist/js/components/NotificationDrawer/package.json +1 -1
  203. package/dist/js/components/NumberInput/package.json +1 -1
  204. package/dist/js/components/OverflowMenu/package.json +1 -1
  205. package/dist/js/components/Page/package.json +1 -1
  206. package/dist/js/components/Pagination/package.json +1 -1
  207. package/dist/js/components/Panel/package.json +1 -1
  208. package/dist/js/components/Popover/package.json +1 -1
  209. package/dist/js/components/Progress/package.json +1 -1
  210. package/dist/js/components/ProgressStepper/package.json +1 -1
  211. package/dist/js/components/Radio/package.json +1 -1
  212. package/dist/js/components/SearchInput/package.json +1 -1
  213. package/dist/js/components/Select/package.json +1 -1
  214. package/dist/js/components/Sidebar/package.json +1 -1
  215. package/dist/js/components/SimpleList/package.json +1 -1
  216. package/dist/js/components/Skeleton/package.json +1 -1
  217. package/dist/js/components/SkipToContent/package.json +1 -1
  218. package/dist/js/components/Slider/package.json +1 -1
  219. package/dist/js/components/Spinner/package.json +1 -1
  220. package/dist/js/components/Switch/package.json +1 -1
  221. package/dist/js/components/Tabs/package.json +1 -1
  222. package/dist/js/components/Text/package.json +1 -1
  223. package/dist/js/components/TextArea/package.json +1 -1
  224. package/dist/js/components/TextInput/package.json +1 -1
  225. package/dist/js/components/TextInputGroup/package.json +1 -1
  226. package/dist/js/components/Tile/package.json +1 -1
  227. package/dist/js/components/TimePicker/package.json +1 -1
  228. package/dist/js/components/Timestamp/package.json +1 -1
  229. package/dist/js/components/Title/package.json +1 -1
  230. package/dist/js/components/ToggleGroup/package.json +1 -1
  231. package/dist/js/components/Toolbar/package.json +1 -1
  232. package/dist/js/components/Tooltip/package.json +1 -1
  233. package/dist/js/components/TreeView/package.json +1 -1
  234. package/dist/js/components/Truncate/package.json +1 -1
  235. package/dist/js/components/Wizard/package.json +1 -1
  236. package/dist/js/components/package.json +1 -1
  237. package/dist/js/deprecated/components/ApplicationLauncher/package.json +1 -1
  238. package/dist/js/deprecated/components/ContextSelector/package.json +1 -1
  239. package/dist/js/deprecated/components/Dropdown/package.json +1 -1
  240. package/dist/js/deprecated/components/OptionsMenu/package.json +1 -1
  241. package/dist/js/deprecated/components/PageHeader/package.json +1 -1
  242. package/dist/js/deprecated/components/Select/package.json +1 -1
  243. package/dist/js/deprecated/components/package.json +1 -1
  244. package/dist/js/deprecated/package.json +1 -1
  245. package/dist/js/helpers/Popper/thirdparty/popper-core/package.json +1 -1
  246. package/dist/js/helpers/package.json +1 -1
  247. package/dist/js/layouts/Bullseye/package.json +1 -1
  248. package/dist/js/layouts/Flex/package.json +1 -1
  249. package/dist/js/layouts/Gallery/package.json +1 -1
  250. package/dist/js/layouts/Grid/package.json +1 -1
  251. package/dist/js/layouts/Level/package.json +1 -1
  252. package/dist/js/layouts/Split/package.json +1 -1
  253. package/dist/js/layouts/Stack/package.json +1 -1
  254. package/dist/js/layouts/package.json +1 -1
  255. package/dist/js/next/components/Wizard/hooks/package.json +1 -1
  256. package/dist/js/next/components/Wizard/package.json +1 -1
  257. package/dist/js/next/components/package.json +1 -1
  258. package/dist/js/next/package.json +1 -1
  259. package/dist/js/package.json +1 -1
  260. package/dist/umd/react-core.min.js +3 -3
  261. package/package.json +3 -3
  262. package/src/components/AboutModal/AboutModal.tsx +20 -12
  263. package/src/components/BackgroundImage/BackgroundImage.tsx +17 -67
  264. package/src/components/BackgroundImage/__tests__/__snapshots__/BackgroundImage.test.tsx.snap +4 -18
  265. package/src/components/BackgroundImage/examples/BackgroundImageBasic.tsx +3 -12
  266. package/src/components/Form/FormContext.tsx +129 -0
  267. package/src/components/Form/__tests__/FormContext.test.tsx +238 -0
  268. package/src/components/Form/examples/Form.md +8 -0
  269. package/src/components/Form/examples/FormState.tsx +120 -0
  270. package/src/components/Form/index.ts +1 -0
  271. package/src/components/LoginPage/LoginPage.tsx +3 -6
  272. package/src/components/LoginPage/__tests__/LoginPage.test.tsx +0 -1
  273. package/src/components/LoginPage/__tests__/__snapshots__/LoginPage.test.tsx.snap +2 -10
  274. package/src/components/LoginPage/examples/LoginPageBasic.tsx +1 -9
  275. package/src/components/LoginPage/examples/LoginPageLanguageSelect.tsx +1 -9
  276. package/src/components/LoginPage/examples/LoginPageShowHidePassword.tsx +1 -9
  277. package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts +0 -7
  278. package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts.map +0 -1
  279. package/dist/esm/components/AboutModal/AboutModalBoxHero.js +0 -16
  280. package/dist/esm/components/AboutModal/AboutModalBoxHero.js.map +0 -1
  281. package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts +0 -7
  282. package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts.map +0 -1
  283. package/dist/js/components/AboutModal/AboutModalBoxHero.js +0 -20
  284. package/dist/js/components/AboutModal/AboutModalBoxHero.js.map +0 -1
  285. package/src/components/AboutModal/AboutModalBoxHero.tsx +0 -28
  286. package/src/components/AboutModal/__tests__/AboutModalBoxHero.test.tsx +0 -8
  287. package/src/components/AboutModal/__tests__/__snapshots__/AboutModalBoxHero.test.tsx.snap +0 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.0.0-alpha.69",
3
+ "version": "5.0.0-alpha.70",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -41,7 +41,7 @@
41
41
  "scripts": {
42
42
  "build:umd": "rollup -c --environment IS_PRODUCTION",
43
43
  "build:single:packages": "node ../../scripts/build-single-packages.js --config single-packages.config.json",
44
- "clean": "rimraf dist",
44
+ "clean": "rimraf dist components layouts helpers next deprecated node_modules",
45
45
  "generate": "node scripts/copyStyles.js",
46
46
  "subpaths": "node scripts/createSubpaths.js"
47
47
  },
@@ -71,5 +71,5 @@
71
71
  "react": "^17 || ^18",
72
72
  "react-dom": "^17 || ^18"
73
73
  },
74
- "gitHead": "d6a4c242e02d38bd99910318571cda3adbfb1d9c"
74
+ "gitHead": "753176875ba927d0dabff46ea1f50bf7fab13698"
75
75
  }
@@ -2,12 +2,13 @@ import * as React from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import { AboutModalBoxContent } from './AboutModalBoxContent';
4
4
  import { AboutModalBoxHeader } from './AboutModalBoxHeader';
5
- import { AboutModalBoxHero } from './AboutModalBoxHero';
6
5
  import { AboutModalBoxBrand } from './AboutModalBoxBrand';
7
6
  import { AboutModalBoxCloseButton } from './AboutModalBoxCloseButton';
8
7
  import { AboutModalBox } from './AboutModalBox';
9
8
  import { Modal, ModalVariant } from '../Modal';
10
9
  import { GenerateId } from '../../helpers/GenerateId/GenerateId';
10
+ // eslint-disable-next-line camelcase
11
+ import c_about_modal_box_BackgroundImage from '@patternfly/react-tokens/dist/esm/c_about_modal_box_BackgroundImage';
11
12
 
12
13
  export interface AboutModalProps extends React.HTMLProps<HTMLDivElement> {
13
14
  /** Content rendered inside the about modal */
@@ -26,7 +27,7 @@ export interface AboutModalProps extends React.HTMLProps<HTMLDivElement> {
26
27
  brandImageSrc: string;
27
28
  /** The alternate text of the brand image */
28
29
  brandImageAlt: string;
29
- /** The URL of the image for the background */
30
+ /** The URL or file path of the image for the background */
30
31
  backgroundImageSrc?: string;
31
32
  /** Prevents the about modal from rendering content inside a container; allows for more flexible layouts */
32
33
  hasNoContentContainer?: boolean;
@@ -59,7 +60,10 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
59
60
  }: AboutModalProps) => {
60
61
  if (brandImageSrc && !brandImageAlt) {
61
62
  // eslint-disable-next-line no-console
62
- console.error('AboutModal:', 'brandImageAlt is required when a brandImageSrc is specified, and should not be an empty string.');
63
+ console.error(
64
+ 'AboutModal:',
65
+ 'brandImageAlt is required when a brandImageSrc is specified, and should not be an empty string.'
66
+ );
63
67
  }
64
68
 
65
69
  if (!productName && !ariaLabel) {
@@ -72,11 +76,11 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
72
76
  }
73
77
  return (
74
78
  <GenerateId prefix="pf-about-modal-title-">
75
- {ariaLabelledBy => (
79
+ {(ariaLabelledBy) => (
76
80
  <Modal
77
81
  isOpen={isOpen}
78
82
  variant={ModalVariant.large}
79
- {...(productName && {'aria-labelledby': ariaLabelledBy})}
83
+ {...(productName && { 'aria-labelledby': ariaLabelledBy })}
80
84
  aria-label={ariaLabel}
81
85
  onEscapePress={onClose}
82
86
  showClose={false}
@@ -84,18 +88,22 @@ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
84
88
  disableFocusTrap={disableFocusTrap}
85
89
  hasNoBodyWrapper
86
90
  >
87
- <AboutModalBox className={css(className)}>
91
+ <AboutModalBox
92
+ style={
93
+ /* eslint-disable camelcase */
94
+ backgroundImageSrc
95
+ ? { [c_about_modal_box_BackgroundImage.name as string]: `url(${backgroundImageSrc})` }
96
+ : {}
97
+ /* eslint-enable camelcase */
98
+ }
99
+ className={css(className)}
100
+ >
88
101
  <AboutModalBoxBrand src={brandImageSrc} alt={brandImageAlt} />
89
102
  <AboutModalBoxCloseButton aria-label={closeButtonAriaLabel} onClose={onClose} />
90
103
  {productName && <AboutModalBoxHeader id={ariaLabelledBy} productName={productName} />}
91
- <AboutModalBoxContent
92
- trademark={trademark}
93
- hasNoContentContainer={hasNoContentContainer}
94
- {...props}
95
- >
104
+ <AboutModalBoxContent trademark={trademark} hasNoContentContainer={hasNoContentContainer} {...props}>
96
105
  {children}
97
106
  </AboutModalBoxContent>
98
- <AboutModalBoxHero backgroundImageSrc={backgroundImageSrc} />
99
107
  </AboutModalBox>
100
108
  </Modal>
101
109
  )}
@@ -1,80 +1,30 @@
1
1
  import * as React from 'react';
2
- // Commented imports that no longer exist. This component will be updated with issue #8452 resolution
3
-
4
- // import cssVar from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage';
5
- // import cssVarName2x from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_2x';
6
- // import cssVarNameSm from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_sm';
7
- // import cssVarNameSm2x from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_sm_2x';
8
- // import cssVarNameLg from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage_lg';
9
- // import cssVarNameFilter from '@patternfly/react-tokens/dist/esm/c_background_image_Filter';
10
2
  import { css } from '@patternfly/react-styles';
11
3
  import styles from '@patternfly/react-styles/css/components/BackgroundImage/background-image';
12
-
13
- export interface BackgroundImageSrcMap {
14
- xs: string;
15
- xs2x: string;
16
- sm: string;
17
- sm2x: string;
18
- lg: string;
19
- }
20
-
21
- // const defaultFilter = (
22
- // <filter>
23
- // <feColorMatrix type="matrix" values="1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0"></feColorMatrix>
24
- // <feComponentTransfer colorInterpolationFilters="sRGB" result="duotone">
25
- // <feFuncR type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncR>
26
- // <feFuncG type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncG>
27
- // <feFuncB type="table" tableValues="0.086274509803922 0.43921568627451"></feFuncB>
28
- // <feFuncA type="table" tableValues="0 1"></feFuncA>
29
- // </feComponentTransfer>
30
- // </filter>
31
- // );
4
+ // eslint-disable-next-line camelcase
5
+ import c_background_image_BackgroundImage from '@patternfly/react-tokens/dist/esm/c_background_image_BackgroundImage';
32
6
 
33
7
  export interface BackgroundImageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'src'> {
34
- /** Additional classes added to the background. */
8
+ /** Additional classes added to the background image. */
35
9
  className?: string;
36
- /** Override svg filter to use */
37
- filter?: React.ReactElement;
38
- /** Override image styles using a string or BackgroundImageSrc */
39
- src: string | BackgroundImageSrcMap;
10
+ /** The URL or file path of the image for the background */
11
+ src: string;
40
12
  }
41
13
 
42
- // let filterCounter = 0;
43
-
44
14
  export const BackgroundImage: React.FunctionComponent<BackgroundImageProps> = ({
45
15
  className,
46
- // src,
47
- // filter = defaultFilter,
16
+ src,
48
17
  ...props
49
- }: BackgroundImageProps) =>
50
- // const getUrlValue = (size: keyof BackgroundImageSrcMap) => {
51
- // if (typeof src === 'string') {
52
- // return `url(${src})`;
53
- // } else if (typeof src === 'object') {
54
- // return `url(${src[size]})`;
55
- // }
56
-
57
- // return '';
58
- // };
59
-
60
- // const filterNum = React.useMemo(() => filterCounter++, []);
61
- // const filterId = `patternfly-background-image-filter-overlay${filterNum}`;
62
- // const style = {
63
- // [cssVar.name]: getUrlValue('xs'),
64
- // [cssVarName2x.name]: getUrlValue('xs2x'),
65
- // [cssVarNameSm.name]: getUrlValue('sm'),
66
- // [cssVarNameSm2x.name]: getUrlValue('sm2x'),
67
- // [cssVarNameLg.name]: getUrlValue('lg'),
68
- // [cssVarNameFilter.name]: `url(#${filterId})`
69
- // } as React.CSSProperties;
18
+ }: BackgroundImageProps) => (
19
+ <div
20
+ className={css(styles.backgroundImage, className)}
21
+ /* eslint-disable camelcase */
22
+ style={{
23
+ [c_background_image_BackgroundImage.name as string]: `url(${src})`
24
+ }}
25
+ /* eslint-enable camelcase */
26
+ {...props}
27
+ ></div>
28
+ );
70
29
 
71
- (
72
- // TODO: removed inline style add it back with issue #8452 resolution. Also commented out the "React.cloneElement(filter, { id: filterId })} "
73
- <div className={css(styles.backgroundImage, className)} {...props}>
74
- <svg xmlns="http://www.w3.org/2000/svg" className="pf-c-background-image__filter" width="0" height="0">
75
- {/* {React.cloneElement(filter, { id: filterId })} */}
76
- </svg>
77
- </div>
78
- )
79
- ;
80
30
  BackgroundImage.displayName = 'BackgroundImage';
@@ -4,15 +4,8 @@ exports[`BackgroundImage 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
6
  class="pf-c-background-image"
7
- src="[object Object]"
8
- >
9
- <svg
10
- class="pf-c-background-image__filter"
11
- height="0"
12
- width="0"
13
- xmlns="http://www.w3.org/2000/svg"
14
- />
15
- </div>
7
+ style="--pf-c-background-image--BackgroundImage: url([object Object]);"
8
+ />
16
9
  </DocumentFragment>
17
10
  `;
18
11
 
@@ -20,14 +13,7 @@ exports[`allows passing in a single string as the image src 1`] = `
20
13
  <DocumentFragment>
21
14
  <div
22
15
  class="pf-c-background-image"
23
- src="/assets/images/pfbg_1200.jpg"
24
- >
25
- <svg
26
- class="pf-c-background-image__filter"
27
- height="0"
28
- width="0"
29
- xmlns="http://www.w3.org/2000/svg"
30
- />
31
- </div>
16
+ style="--pf-c-background-image--BackgroundImage: url(/assets/images/pfbg_1200.jpg);"
17
+ />
32
18
  </DocumentFragment>
33
19
  `;
@@ -1,15 +1,6 @@
1
1
  import React from 'react';
2
2
  import { BackgroundImage } from '@patternfly/react-core';
3
3
 
4
- /**
5
- * Note: When using background-filter.svg, you must also include #image_overlay as the fragment identifier
6
- */
7
- const images = {
8
- xs: '/assets/images/pfbg_576.jpg',
9
- xs2x: '/assets/images/pfbg_576@2x.jpg',
10
- sm: '/assets/images/pfbg_768.jpg',
11
- sm2x: '/assets/images/pfbg_768@2x.jpg',
12
- lg: '/assets/images/pfbg_1200.jpg'
13
- };
14
-
15
- export const BackgroundImageBasic: React.FunctionComponent = () => <BackgroundImage src={images} />;
4
+ export const BackgroundImageBasic: React.FunctionComponent = () => (
5
+ <BackgroundImage src="/assets/images/pfbg-icon.svg" />
6
+ );
@@ -0,0 +1,129 @@
1
+ import React, { Dispatch, SetStateAction } from 'react';
2
+
3
+ export interface FormContextProps {
4
+ /** Record of values for all fieldIds */
5
+ values: Record<string, string>;
6
+ /** Record of errors for all fieldIds */
7
+ errors: Record<string, string>;
8
+ /** Record of touched state for all fieldIds */
9
+ touched: Record<string, boolean>;
10
+ /** Flag to determine the overall validity. True if the record of errors is empty. */
11
+ isValid: boolean;
12
+
13
+ /** Get the value for a given fieldId */
14
+ getValue(fieldId: string): string;
15
+ /** Set the value for a given fieldId */
16
+ setValue(fieldId: string, value: string): void;
17
+ /** Set multiple values within the managed record of values */
18
+ setValues: Dispatch<SetStateAction<Record<string, string>>>;
19
+
20
+ /** Get the error message for a given fieldId */
21
+ getError(fieldId: string): string;
22
+ /** Set the error message for a given fieldId */
23
+ setError(fieldId: string, error: string | undefined): void;
24
+ /** Set multiple errors within the managed record of errors */
25
+ setErrors: Dispatch<SetStateAction<Record<string, string>>>;
26
+
27
+ /** Used to determine touched state for a given fieldId */
28
+ isTouched(fieldId: string): boolean;
29
+ /** Used to update the touched state for a given fieldId */
30
+ setTouched(fieldId: string, isTouched: boolean): void;
31
+
32
+ /** Triggers all fieldId-specific validators */
33
+ validate(): Record<string, string | null>;
34
+ /** Set a validator for a specific fieldId */
35
+ setValidator(fieldId: string, validate: (value: string) => string | null): void;
36
+ }
37
+
38
+ const FormContext = React.createContext({} as FormContextProps);
39
+
40
+ export const FormContextConsumer = FormContext.Consumer;
41
+
42
+ export interface FormContextProviderProps {
43
+ /** Record of initial values */
44
+ initialValues?: Record<string, string>;
45
+ /** Any react node. Can optionally use render function to return context props. */
46
+ children?: React.ReactNode | ((props: FormContextProps) => React.ReactNode);
47
+ }
48
+
49
+ export const FormContextProvider: React.FC<FormContextProviderProps> = ({ initialValues, children }) => {
50
+ const [values, setValues] = React.useState<Record<string, string>>(initialValues || {});
51
+ const [errors, setErrors] = React.useState<Record<string, string>>({});
52
+ const [validators, setValidators] = React.useState<Record<string, Function>>({});
53
+ const [touched, setTouched] = React.useState<Record<string, boolean>>({});
54
+ const isValid = Object.keys(errors)?.length === 0;
55
+
56
+ const getValue = (fieldId: string) =>
57
+ Object.entries(values).reduce((acc, [id, value]) => (id === fieldId ? value : acc), '');
58
+
59
+ const setValue = (fieldId: string, value: string, triggerValidation: boolean = true) => {
60
+ if (values[fieldId] !== value) {
61
+ setValues((prevValues) => ({ ...prevValues, [fieldId]: value }));
62
+ triggerValidation && validators[fieldId]?.(value);
63
+ }
64
+ };
65
+
66
+ const getError = (fieldId: string) =>
67
+ Object.entries(errors).reduce((acc, [id, error]) => (id === fieldId ? error : acc), '');
68
+
69
+ const setError = (fieldId: string, error: string) =>
70
+ errors[fieldId] !== error &&
71
+ setErrors(({ [fieldId]: _, ...prevErrors }) => ({
72
+ ...prevErrors,
73
+ ...(!!error && { [fieldId]: error })
74
+ }));
75
+
76
+ const isTouched = (fieldId: string) =>
77
+ Object.entries(touched).reduce((acc, [id, isTouched]) => (id === fieldId ? isTouched : acc), false);
78
+
79
+ const setFieldTouched = (fieldId: string, isTouched: boolean) =>
80
+ touched[fieldId] !== isTouched &&
81
+ setTouched(({ [fieldId]: _, ...prevTouched }) => ({
82
+ ...prevTouched,
83
+ ...(isTouched && { [fieldId]: isTouched })
84
+ }));
85
+
86
+ const setValidator = (fieldId: string, validate: (value: string) => string | null) =>
87
+ validators[fieldId] !== validate && setValidators((prevValidators) => ({ ...prevValidators, [fieldId]: validate }));
88
+
89
+ // Accumulate and return errors from all fields with validators.
90
+ const validate = () =>
91
+ Object.entries(validators)?.reduce((acc: Record<string, string>, [id, validateField]) => {
92
+ const fieldError = validateField(values[id]);
93
+
94
+ if (fieldError) {
95
+ acc[id] = fieldError;
96
+ }
97
+
98
+ return acc;
99
+ }, {});
100
+
101
+ return (
102
+ <FormContext.Provider
103
+ value={{
104
+ values,
105
+ errors,
106
+ touched,
107
+ isValid,
108
+ setValues,
109
+ setErrors,
110
+ getValue,
111
+ setValue,
112
+ getError,
113
+ setError,
114
+ validate,
115
+ setValidator,
116
+ isTouched,
117
+ setTouched: setFieldTouched
118
+ }}
119
+ >
120
+ {typeof children === 'function' ? (
121
+ <FormContext.Consumer>{(formContext) => children(formContext)}</FormContext.Consumer>
122
+ ) : (
123
+ children
124
+ )}
125
+ </FormContext.Provider>
126
+ );
127
+ };
128
+
129
+ export const useFormContext = () => React.useContext(FormContext);
@@ -0,0 +1,238 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { FormContextConsumer, FormContextProvider } from '../FormContext';
5
+
6
+ const customRender = (ui, initialValues?: Record<string, any>) => {
7
+ return render(<FormContextProvider initialValues={initialValues}>{ui}</FormContextProvider>);
8
+ };
9
+
10
+ test('consumers can show all values from "values" provided by "initialValues"', () => {
11
+ const initialValues = { fieldOneId: 'some value', fieldTwoId: 'some other value' };
12
+
13
+ customRender(
14
+ <FormContextConsumer>
15
+ {({ values }) => Object.values(values).map((value) => <span key={value}>{value}</span>)}
16
+ </FormContextConsumer>,
17
+ initialValues
18
+ );
19
+
20
+ Object.values(initialValues).forEach((initialValue) => expect(screen.getByText(initialValue)).toBeVisible());
21
+ });
22
+
23
+ test('consumer results in "isValid" as "true" without errors and "false" with errors', async () => {
24
+ const user = userEvent.setup();
25
+ const initialValues = { someId: 'some value' };
26
+ const onChange = (setValue, setError) => (event) => {
27
+ const { value } = event.target;
28
+ setValue('someId', value);
29
+
30
+ if (!value) {
31
+ setError('someId', 'Some error!');
32
+ }
33
+ };
34
+
35
+ customRender(
36
+ <FormContextConsumer>
37
+ {({ values, setValue, setError, isValid }) => (
38
+ <>
39
+ <input onChange={onChange(setValue, setError)} value={values.someId} />
40
+ {`isValid: ${isValid}`}
41
+ </>
42
+ )}
43
+ </FormContextConsumer>,
44
+ initialValues
45
+ );
46
+
47
+ expect(screen.getByText(/^isValid:/)).toHaveTextContent('isValid: true');
48
+
49
+ await user.clear(screen.getByRole('textbox'));
50
+ expect(screen.getByText(/^isValid:/)).toHaveTextContent('isValid: false');
51
+ });
52
+
53
+ test('using getValue, the consumer can show a value passed from initialValues', () => {
54
+ customRender(<FormContextConsumer>{({ getValue }) => <>{getValue('someId')}</>}</FormContextConsumer>, {
55
+ someId: 'some value'
56
+ });
57
+
58
+ expect(screen.getByText('some value')).toBeVisible();
59
+ });
60
+
61
+ test('sets a new value for a single field using setValue', async () => {
62
+ const user = userEvent.setup();
63
+
64
+ customRender(
65
+ <FormContextConsumer>
66
+ {({ getValue, setValue }) => {
67
+ return <input onChange={(event) => setValue('someId', event.target.value)} value={getValue('someId')} />;
68
+ }}
69
+ </FormContextConsumer>,
70
+ {
71
+ someId: 'some value'
72
+ }
73
+ );
74
+
75
+ const consumerInput = screen.getByRole('textbox');
76
+
77
+ await user.clear(consumerInput);
78
+ await user.type(consumerInput, 'some updated value');
79
+
80
+ expect(consumerInput).toHaveValue('some updated value');
81
+ });
82
+
83
+ test('using setValues, consumers can set multiple values at once', async () => {
84
+ const user = userEvent.setup();
85
+ const newValues = { someId: 'updated value', someNewId: 'new value' };
86
+
87
+ customRender(
88
+ <FormContextConsumer>
89
+ {({ values, setValues }) => {
90
+ return (
91
+ <>
92
+ <input type="checkbox" onClick={() => setValues(newValues)} />
93
+ {Object.entries(values).map(([fieldId, value]) => (
94
+ <span key={fieldId}>{`${fieldId}: ${value}`}</span>
95
+ ))}
96
+ </>
97
+ );
98
+ }}
99
+ </FormContextConsumer>,
100
+ {
101
+ someId: 'some value'
102
+ }
103
+ );
104
+
105
+ await user.click(screen.getByRole('checkbox'));
106
+ Object.entries(newValues).map(([fieldId, value]) => expect(screen.getByText(`${fieldId}: ${value}`)).toBeVisible());
107
+ });
108
+
109
+ test('using getError, the consumer returns an error', async () => {
110
+ const user = userEvent.setup();
111
+
112
+ customRender(
113
+ <FormContextConsumer>
114
+ {({ getError, setError }) => (
115
+ <>
116
+ <input type="checkbox" onClick={() => setError('someId', 'some error!')} />
117
+ {getError('someId')}
118
+ </>
119
+ )}
120
+ </FormContextConsumer>
121
+ );
122
+
123
+ await user.click(screen.getByRole('checkbox'));
124
+ expect(screen.getByText('some error!')).toBeVisible();
125
+ });
126
+
127
+ test('sets a new error for a single field using setError', async () => {
128
+ const user = userEvent.setup();
129
+
130
+ customRender(
131
+ <FormContextConsumer>
132
+ {({ errors, setError }) => {
133
+ return (
134
+ <>
135
+ <input type="checkbox" onClick={() => setError('someId', 'some error!')} />
136
+ {`Error: ${errors.someId}`}
137
+ </>
138
+ );
139
+ }}
140
+ </FormContextConsumer>
141
+ );
142
+
143
+ await user.click(screen.getByRole('checkbox'));
144
+ expect(screen.getByText(/^Error:/)).toHaveTextContent('Error: some error!');
145
+ });
146
+
147
+ test('using setErrors, consumers can set multiple errors at once', async () => {
148
+ const user = userEvent.setup();
149
+ const newErrors = { someId: 'some error!', someNewId: 'new field error!' };
150
+
151
+ customRender(
152
+ <FormContextConsumer>
153
+ {({ errors, setErrors }) => {
154
+ return (
155
+ <>
156
+ <input type="checkbox" onClick={() => setErrors(newErrors)} />
157
+ {Object.entries(errors).map(([fieldId, error]) => (
158
+ <span key={fieldId}>{`${fieldId}: ${error}`}</span>
159
+ ))}
160
+ </>
161
+ );
162
+ }}
163
+ </FormContextConsumer>,
164
+ {
165
+ someId: 'some value'
166
+ }
167
+ );
168
+
169
+ await user.click(screen.getByRole('checkbox'));
170
+ Object.entries(newErrors).map(([fieldId, error]) => expect(screen.getByText(`${fieldId}: ${error}`)).toBeVisible());
171
+ });
172
+
173
+ test('sets a new touched state for a single field using setTouched', async () => {
174
+ const user = userEvent.setup();
175
+
176
+ customRender(
177
+ <FormContextConsumer>
178
+ {({ touched, setTouched }) => {
179
+ return (
180
+ <>
181
+ <input type="checkbox" onClick={() => setTouched('someId', true)} />
182
+ {`isTouched: ${touched.someId}`}
183
+ </>
184
+ );
185
+ }}
186
+ </FormContextConsumer>
187
+ );
188
+
189
+ await user.click(screen.getByRole('checkbox'));
190
+ expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: true');
191
+ });
192
+
193
+ test("can get a single field's touched state by using isTouched", async () => {
194
+ const user = userEvent.setup();
195
+
196
+ customRender(
197
+ <FormContextConsumer>
198
+ {({ touched, setTouched, isTouched }) => {
199
+ return (
200
+ <>
201
+ <input type="checkbox" onClick={() => setTouched('someId', !touched.someId)} />
202
+ {`isTouched: ${isTouched('someId')}`}
203
+ </>
204
+ );
205
+ }}
206
+ </FormContextConsumer>
207
+ );
208
+
209
+ const consumerCheckbox = screen.getByRole('checkbox');
210
+
211
+ await user.click(consumerCheckbox);
212
+ expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: true');
213
+
214
+ await user.click(consumerCheckbox);
215
+ expect(screen.getByText(/^isTouched:/)).toHaveTextContent('isTouched: false');
216
+ });
217
+
218
+ test('validate returns errors set by the "setValidator" function', async () => {
219
+ const user = userEvent.setup();
220
+
221
+ customRender(
222
+ <FormContextConsumer>
223
+ {({ validate, setValidator }) => {
224
+ const errors = validate();
225
+
226
+ return (
227
+ <>
228
+ <input type="checkbox" onClick={() => setValidator('someId', (value) => (!value ? 'some error!' : null))} />
229
+ {`Error: ${errors.someId}`}
230
+ </>
231
+ );
232
+ }}
233
+ </FormContextConsumer>
234
+ );
235
+
236
+ await user.click(screen.getByRole('checkbox'));
237
+ expect(screen.getByText(/^Error:/)).toHaveTextContent('Error: some error!');
238
+ });
@@ -14,6 +14,8 @@ propComponents:
14
14
  'FormFieldGroupExpandable',
15
15
  'FormFieldGroupHeader',
16
16
  'FormFieldGroupHeaderTitleTextObject',
17
+ 'FormContextProps',
18
+ 'FormContextProviderProps',
17
19
  'Button',
18
20
  'Popover'
19
21
  ]
@@ -114,3 +116,9 @@ When using helper text inside a `FormGroup`, the `HelperText` component should b
114
116
  ```ts file="./FormFieldGroups.tsx"
115
117
 
116
118
  ```
119
+
120
+ ### Form state
121
+
122
+ ```ts file="./FormState.tsx" isBeta
123
+
124
+ ```