@patternfly/react-core 6.0.0-alpha.10 → 6.0.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/Chip/package.json +1 -1
  21. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  22. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/DragDrop/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/Text/package.json +1 -1
  72. package/dist/dynamic/components/TextArea/package.json +1 -1
  73. package/dist/dynamic/components/TextInput/package.json +1 -1
  74. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  75. package/dist/dynamic/components/Tile/package.json +1 -1
  76. package/dist/dynamic/components/TimePicker/package.json +1 -1
  77. package/dist/dynamic/components/Timestamp/package.json +1 -1
  78. package/dist/dynamic/components/Title/package.json +1 -1
  79. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  80. package/dist/dynamic/components/Toolbar/package.json +1 -1
  81. package/dist/dynamic/components/Tooltip/package.json +1 -1
  82. package/dist/dynamic/components/TreeView/package.json +1 -1
  83. package/dist/dynamic/components/Truncate/package.json +1 -1
  84. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  85. package/dist/dynamic/components/Wizard/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/ApplicationLauncher/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/ContextSelector/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Dropdown/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/OptionsMenu/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/PageHeader/package.json +1 -1
  91. package/dist/dynamic/deprecated/components/Select/package.json +1 -1
  92. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  93. package/dist/dynamic/deprecated/components/package.json +1 -1
  94. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  95. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  96. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  97. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  98. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  99. package/dist/dynamic/helpers/constants/package.json +1 -1
  100. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/favorites/package.json +1 -1
  102. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  103. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  104. package/dist/dynamic/helpers/package.json +1 -1
  105. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  106. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  107. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  108. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  109. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  110. package/dist/dynamic/helpers/util/package.json +1 -1
  111. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  112. package/dist/dynamic/layouts/Flex/package.json +1 -1
  113. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  114. package/dist/dynamic/layouts/Grid/package.json +1 -1
  115. package/dist/dynamic/layouts/Level/package.json +1 -1
  116. package/dist/dynamic/layouts/Split/package.json +1 -1
  117. package/dist/dynamic/layouts/Stack/package.json +1 -1
  118. package/dist/dynamic/next/components/package.json +1 -1
  119. package/dist/esm/components/Button/Button.d.ts +14 -4
  120. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  121. package/dist/esm/components/Button/Button.js +9 -8
  122. package/dist/esm/components/Button/Button.js.map +1 -1
  123. package/dist/esm/components/Nav/Nav.d.ts +1 -3
  124. package/dist/esm/components/Nav/Nav.d.ts.map +1 -1
  125. package/dist/esm/components/Nav/Nav.js +4 -5
  126. package/dist/esm/components/Nav/Nav.js.map +1 -1
  127. package/dist/esm/components/Nav/NavExpandable.d.ts.map +1 -1
  128. package/dist/esm/components/Nav/NavExpandable.js +1 -1
  129. package/dist/esm/components/Nav/NavExpandable.js.map +1 -1
  130. package/dist/esm/components/Nav/NavItem.d.ts.map +1 -1
  131. package/dist/esm/components/Nav/NavItem.js +4 -2
  132. package/dist/esm/components/Nav/NavItem.js.map +1 -1
  133. package/dist/esm/components/Nav/NavList.d.ts.map +1 -1
  134. package/dist/esm/components/Nav/NavList.js +9 -4
  135. package/dist/esm/components/Nav/NavList.js.map +1 -1
  136. package/dist/esm/components/Page/Page.d.ts +6 -6
  137. package/dist/esm/components/Page/Page.d.ts.map +1 -1
  138. package/dist/esm/components/Page/Page.js +9 -9
  139. package/dist/esm/components/Page/Page.js.map +1 -1
  140. package/dist/js/components/Button/Button.d.ts +14 -4
  141. package/dist/js/components/Button/Button.d.ts.map +1 -1
  142. package/dist/js/components/Button/Button.js +10 -9
  143. package/dist/js/components/Button/Button.js.map +1 -1
  144. package/dist/js/components/Nav/Nav.d.ts +1 -3
  145. package/dist/js/components/Nav/Nav.d.ts.map +1 -1
  146. package/dist/js/components/Nav/Nav.js +4 -5
  147. package/dist/js/components/Nav/Nav.js.map +1 -1
  148. package/dist/js/components/Nav/NavExpandable.d.ts.map +1 -1
  149. package/dist/js/components/Nav/NavExpandable.js +1 -1
  150. package/dist/js/components/Nav/NavExpandable.js.map +1 -1
  151. package/dist/js/components/Nav/NavItem.d.ts.map +1 -1
  152. package/dist/js/components/Nav/NavItem.js +4 -2
  153. package/dist/js/components/Nav/NavItem.js.map +1 -1
  154. package/dist/js/components/Nav/NavList.d.ts.map +1 -1
  155. package/dist/js/components/Nav/NavList.js +9 -4
  156. package/dist/js/components/Nav/NavList.js.map +1 -1
  157. package/dist/js/components/Page/Page.d.ts +6 -6
  158. package/dist/js/components/Page/Page.d.ts.map +1 -1
  159. package/dist/js/components/Page/Page.js +9 -9
  160. package/dist/js/components/Page/Page.js.map +1 -1
  161. package/dist/umd/react-core.min.js +1 -1
  162. package/helpers/package.json +1 -1
  163. package/layouts/package.json +1 -1
  164. package/next/package.json +1 -1
  165. package/package.json +6 -6
  166. package/src/components/Button/Button.tsx +21 -9
  167. package/src/components/Button/__tests__/Button.test.tsx +20 -5
  168. package/src/components/Button/__tests__/__snapshots__/Button.test.tsx.snap +1 -1
  169. package/src/components/Button/examples/Button.md +17 -0
  170. package/src/components/Button/examples/ButtonAriaDisabled.tsx +21 -45
  171. package/src/components/Button/examples/ButtonCallToAction.tsx +8 -10
  172. package/src/components/Button/examples/ButtonDisabled.tsx +44 -31
  173. package/src/components/Button/examples/ButtonLinks.tsx +14 -14
  174. package/src/components/Button/examples/ButtonPlainHasNoPadding.tsx +13 -0
  175. package/src/components/Button/examples/ButtonProgress.tsx +22 -17
  176. package/src/components/Button/examples/ButtonSmall.tsx +7 -9
  177. package/src/components/Button/examples/ButtonStateful.tsx +32 -0
  178. package/src/components/Button/examples/ButtonTypes.tsx +6 -4
  179. package/src/components/Button/examples/ButtonVariations.tsx +58 -43
  180. package/src/components/Button/examples/ButtonWithCount.tsx +75 -68
  181. package/src/components/Nav/Nav.tsx +5 -11
  182. package/src/components/Nav/NavExpandable.tsx +0 -1
  183. package/src/components/Nav/NavItem.tsx +4 -2
  184. package/src/components/Nav/NavList.tsx +27 -18
  185. package/src/components/Nav/__tests__/Generated/__snapshots__/NavExpandable.test.tsx.snap +1 -1
  186. package/src/components/Nav/__tests__/Nav.test.tsx +2 -32
  187. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +156 -362
  188. package/src/components/Nav/examples/Nav.md +0 -6
  189. package/src/components/Nav/examples/NavExpandable.tsx +1 -2
  190. package/src/components/Nav/examples/nav.css +0 -14
  191. package/src/components/Page/Page.tsx +16 -16
  192. package/src/components/Page/__tests__/Page.test.tsx +5 -5
  193. package/src/components/Page/__tests__/__snapshots__/Page.test.tsx.snap +178 -106
  194. package/src/components/Page/examples/Page.md +1 -11
  195. package/src/components/Page/examples/PageGroupSection.tsx +1 -1
  196. package/src/demos/Nav.md +0 -10
  197. package/src/demos/examples/Masthead/MastheadWithUtilitiesAndUserDropdownMenu.tsx +1 -2
  198. package/src/components/Nav/examples/NavLegacyTertiary.tsx +0 -32
  199. package/src/components/Page/examples/PageTertiaryNav.tsx +0 -41
  200. package/src/demos/examples/Nav/deprecated/NavLight.tsx +0 -95
  201. package/src/demos/examples/Nav/deprecated/NavTertiary.tsx +0 -91
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-alpha.9","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.0.0-alpha.10","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-alpha.9","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.0.0-alpha.10","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-alpha.9","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.0.0-alpha.10","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.0.0-alpha.10",
3
+ "version": "6.0.0-alpha.11",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -46,15 +46,15 @@
46
46
  "subpaths": "node ../../scripts/exportSubpaths.js --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.0.0-alpha.6",
50
- "@patternfly/react-styles": "^6.0.0-alpha.6",
51
- "@patternfly/react-tokens": "^6.0.0-alpha.6",
49
+ "@patternfly/react-icons": "^6.0.0-alpha.7",
50
+ "@patternfly/react-styles": "^6.0.0-alpha.7",
51
+ "@patternfly/react-tokens": "^6.0.0-alpha.7",
52
52
  "focus-trap": "7.5.2",
53
53
  "react-dropzone": "^14.2.3",
54
54
  "tslib": "^2.5.0"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "6.0.0-alpha.49",
57
+ "@patternfly/patternfly": "6.0.0-alpha.51",
58
58
  "@rollup/plugin-commonjs": "^25.0.0",
59
59
  "@rollup/plugin-node-resolve": "^15.0.2",
60
60
  "@rollup/plugin-replace": "^5.0.2",
@@ -72,5 +72,5 @@
72
72
  "react": "^17 || ^18",
73
73
  "react-dom": "^17 || ^18"
74
74
  },
75
- "gitHead": "a90b9d4b4ca299a42104d2c3cefae79bb2e05b6b"
75
+ "gitHead": "325ae0434cbad9fe482fd586aafaf3235ca254f7"
76
76
  }
@@ -13,7 +13,8 @@ export enum ButtonVariant {
13
13
  warning = 'warning',
14
14
  link = 'link',
15
15
  plain = 'plain',
16
- control = 'control'
16
+ control = 'control',
17
+ stateful = 'stateful'
17
18
  }
18
19
 
19
20
  export enum ButtonType {
@@ -28,6 +29,12 @@ export enum ButtonSize {
28
29
  lg = 'lg'
29
30
  }
30
31
 
32
+ export enum ButtonState {
33
+ read = 'read',
34
+ unread = 'unread',
35
+ attention = 'attention'
36
+ }
37
+
31
38
  export interface BadgeCountObject {
32
39
  /** Adds styling to the badge to indicate it has been read */
33
40
  isRead?: boolean;
@@ -44,8 +51,8 @@ export interface ButtonProps extends Omit<React.HTMLProps<HTMLButtonElement>, 'r
44
51
  className?: string;
45
52
  /** Sets the base component to render. defaults to button */
46
53
  component?: React.ElementType<any> | React.ComponentType<any>;
47
- /** Adds active styling to button. */
48
- isActive?: boolean;
54
+ /** Adds clicked styling to button. */
55
+ isClicked?: boolean;
49
56
  /** Adds block styling to button */
50
57
  isBlock?: boolean;
51
58
  /** Adds disabled styling and disables the button using the disabled html attribute */
@@ -69,7 +76,11 @@ export interface ButtonProps extends Omit<React.HTMLProps<HTMLButtonElement>, 'r
69
76
  /** Sets button type */
70
77
  type?: 'button' | 'submit' | 'reset';
71
78
  /** Adds button variant styles */
72
- variant?: 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'link' | 'plain' | 'control';
79
+ variant?: 'primary' | 'secondary' | 'tertiary' | 'danger' | 'warning' | 'link' | 'plain' | 'control' | 'stateful';
80
+ /** Sets state of the stateful button variant. Default is "unread" */
81
+ state?: 'read' | 'unread' | 'attention';
82
+ /** Applies no padding on a plain button variant. Use when plain button is placed inline with text */
83
+ hasNoPadding?: boolean;
73
84
  /** Sets position of the icon. Note: "left" and "right" are deprecated. Use "start" and "end" instead */
74
85
  iconPosition?: 'start' | 'end' | 'left' | 'right';
75
86
  /** Adds accessible text to the button. */
@@ -94,9 +105,7 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
94
105
  children = null,
95
106
  className = '',
96
107
  component = 'button',
97
- // TODO: Update eslint ignore when issue #9907 is resolved
98
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
99
- isActive = false,
108
+ isClicked = false,
100
109
  isBlock = false,
101
110
  isDisabled = false,
102
111
  isAriaDisabled = false,
@@ -110,6 +119,8 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
110
119
  isInline = false,
111
120
  type = ButtonType.button,
112
121
  variant = ButtonVariant.primary,
122
+ state = ButtonState.unread,
123
+ hasNoPadding = false,
113
124
  iconPosition = 'start',
114
125
  'aria-label': ariaLabel = null,
115
126
  icon = null,
@@ -157,12 +168,13 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
157
168
  isBlock && styles.modifiers.block,
158
169
  isDisabled && styles.modifiers.disabled,
159
170
  isAriaDisabled && styles.modifiers.ariaDisabled,
160
- // TODO: Update when issue #9907 is resolved
161
- // isActive && styles.modifiers.active,
171
+ isClicked && styles.modifiers.clicked,
162
172
  isInline && variant === ButtonVariant.link && styles.modifiers.inline,
163
173
  isDanger && (variant === ButtonVariant.secondary || variant === ButtonVariant.link) && styles.modifiers.danger,
164
174
  isLoading !== null && variant !== ButtonVariant.plain && styles.modifiers.progress,
165
175
  isLoading && styles.modifiers.inProgress,
176
+ hasNoPadding && variant === ButtonVariant.plain && styles.modifiers.noPadding,
177
+ variant === ButtonVariant.stateful && styles.modifiers[state],
166
178
  size === ButtonSize.sm && styles.modifiers.small,
167
179
  size === ButtonSize.lg && styles.modifiers.displayLg,
168
180
  className
@@ -2,7 +2,7 @@ import React from 'react';
2
2
 
3
3
  import { render, screen } from '@testing-library/react';
4
4
 
5
- import { Button, ButtonVariant } from '../Button';
5
+ import { Button, ButtonState, ButtonVariant } from '../Button';
6
6
 
7
7
  Object.values(ButtonVariant).forEach((variant) => {
8
8
  if (variant !== 'primary') {
@@ -55,10 +55,9 @@ test('Renders with class pf-m-block when isBlock = true', () => {
55
55
  expect(screen.getByRole('button')).toHaveClass('pf-m-block');
56
56
  });
57
57
 
58
- // TODO: Reenable or remove with issue #9907
59
- xtest('Renders with class pf-m-active when isActive = true', () => {
60
- render(<Button isActive>Active Button</Button>);
61
- expect(screen.getByRole('button')).toHaveClass('pf-m-active');
58
+ xtest('Renders with class pf-m-clicked when isClicked = true', () => {
59
+ render(<Button isClicked>Clicked Button</Button>);
60
+ expect(screen.getByRole('button')).toHaveClass('pf-m-clicked');
62
61
  });
63
62
 
64
63
  test('Renders with class pf-m-disabled when isDisabled = true', () => {
@@ -80,6 +79,22 @@ test('Does not disable button when isDisabled = true and component = a', () => {
80
79
  expect(screen.getByText('Disabled yet focusable button')).not.toHaveProperty('disabled');
81
80
  });
82
81
 
82
+ test('Renders with class pf-m-unread by default when variant = stateful', () => {
83
+ render(<Button variant="stateful">Stateful Button</Button>);
84
+ expect(screen.getByRole('button')).toHaveClass('pf-m-stateful', 'pf-m-unread');
85
+ });
86
+
87
+ Object.values(ButtonState).forEach((state) => {
88
+ test(`Renders with class pf-m-${state} when state = ${state} and variant = stateful`, () => {
89
+ render(
90
+ <Button variant="stateful" state={state}>
91
+ Stateful Button - {state}
92
+ </Button>
93
+ );
94
+ expect(screen.getByRole('button')).toHaveClass('pf-m-stateful', `pf-m-${state}`);
95
+ });
96
+ });
97
+
83
98
  test('Renders with class pf-m-danger when isDanger = true and variant = secondary', () => {
84
99
  render(
85
100
  <Button variant="secondary" isDanger>
@@ -6,7 +6,7 @@ exports[`Renders basic button 1`] = `
6
6
  aria-disabled="false"
7
7
  aria-label="basic button"
8
8
  class="pf-v5-c-button pf-m-primary"
9
- data-ouia-component-id="OUIA-Generated-Button-primary-26"
9
+ data-ouia-component-id="OUIA-Generated-Button-primary-27"
10
10
  data-ouia-component-type="PF5/Button"
11
11
  data-ouia-safe="true"
12
12
  type="button"
@@ -12,6 +12,8 @@ import ExternalLinkSquareAltIcon from '@patternfly/react-icons/dist/esm/icons/ex
12
12
  import CopyIcon from '@patternfly/react-icons/dist/esm/icons/copy-icon';
13
13
  import ArrowRightIcon from '@patternfly/react-icons/dist/esm/icons/arrow-right-icon';
14
14
  import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
15
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
16
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
15
17
  import { Link } from '@reach/router';
16
18
 
17
19
  ## Examples
@@ -33,6 +35,7 @@ PatternFly supports several button styling variants to be used in different scen
33
35
  | Link | Links are labeled, but have no background or border. Use for actions that require less emphasis, actions that navigate users to another page within the same window, and/or actions that navigate to external pages in a new window. Links may be placed inline with text using the `isInline` property.|
34
36
  | Plain | Plain buttons have no styling and are intended to be labeled with icons. |
35
37
  | Control | Control buttons can be labeled with text or icons. Primarily intended to be paired with other controls in an [input group](/components/input-group). |
38
+ | Stateful | Stateful buttons are ideal for displaying the state of notifications. They have 3 states: `read`, `unread` and `attention`.
36
39
 
37
40
  ### Disabled buttons
38
41
 
@@ -107,3 +110,17 @@ Buttons can display a `count` in the form of a badge to indicate some value or n
107
110
 
108
111
  ```ts file="./ButtonWithCount.tsx" isBeta
109
112
  ```
113
+
114
+ ### Plain with no padding
115
+
116
+ To display a plain/icon button inline with text, use `noPadding` prop in addition to `variant="plain"`.
117
+
118
+ ```ts file="./ButtonPlainHasNoPadding.tsx"
119
+ ```
120
+
121
+ ### Stateful
122
+
123
+ Stateful buttons are ideal for displaying the state of notifications. Use `variant="stateful"` alongside with the `state` property, which can have these 3 values: `read`, `unread` (used as default) and `attention` (which means unread and requires attention).
124
+
125
+ ```ts file="./ButtonStateful.tsx"
126
+ ```
@@ -1,52 +1,28 @@
1
1
  import React from 'react';
2
- import { Button, Tooltip } from '@patternfly/react-core';
3
- import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
2
+ import { Button, Flex, Tooltip } from '@patternfly/react-core';
4
3
  import PlusCircleIcon from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';
5
4
 
6
5
  export const ButtonAriaDisabled: React.FunctionComponent = () => (
7
- <React.Fragment>
8
- <Button isAriaDisabled>Primary aria disabled</Button>
9
- <Button isAriaDisabled>Secondary aria disabled</Button>{' '}
10
- <Button variant="secondary" isDanger isAriaDisabled>
11
- Danger secondary aria disabled
12
- </Button>{' '}
13
- <Button isAriaDisabled variant="tertiary">
14
- Tertiary aria disabled
15
- </Button>{' '}
16
- <Button isAriaDisabled variant="danger">
17
- Danger disabled
18
- </Button>{' '}
19
- <Button isAriaDisabled variant="warning">
20
- Warning disabled
21
- </Button>
22
- <br />
23
- <br />
24
- <Button isAriaDisabled variant="link" icon={<PlusCircleIcon />}>
25
- Link aria disabled
26
- </Button>{' '}
27
- <Button isAriaDisabled variant="link" isInline>
28
- Inline link aria disabled
29
- </Button>{' '}
30
- <Button variant="link" isDanger isAriaDisabled>
31
- Danger link disabled
32
- </Button>{' '}
33
- <Button isAriaDisabled variant="plain" aria-label="Action">
34
- <TimesIcon />
35
- </Button>{' '}
36
- <Button isAriaDisabled variant="control">
37
- Control aria disabled
38
- </Button>
39
- <br />
40
- <br />
41
- <Tooltip content="Aria-disabled buttons are like disabled buttons, but focusable. Allows for tooltip support.">
42
- <Button isAriaDisabled variant="secondary">
43
- Secondary button to core docs
6
+ <>
7
+ <Flex columnGap={{ default: 'columnGapSm' }}>
8
+ <Button isAriaDisabled>Primary aria disabled</Button>
9
+ <Button isAriaDisabled variant="link" icon={<PlusCircleIcon />}>
10
+ Link aria disabled
44
11
  </Button>
45
- </Tooltip>{' '}
46
- <Tooltip content="Aria-disabled link as button with tooltip">
47
- <Button component="a" isAriaDisabled href="https://pf4.patternfly.org/" target="_blank" variant="tertiary">
48
- Tertiary link as button to core docs
12
+ <Button isAriaDisabled variant="link" isInline>
13
+ Inline link aria disabled
49
14
  </Button>
50
- </Tooltip>
51
- </React.Fragment>
15
+ </Flex>
16
+ <br />
17
+ <Flex columnGap={{ default: 'columnGapSm' }}>
18
+ <Tooltip content="Aria-disabled buttons are like disabled buttons, but focusable. Allows for tooltip support.">
19
+ <Button isAriaDisabled>Primary button with tooltip</Button>
20
+ </Tooltip>
21
+ <Tooltip content="Aria-disabled link as button with tooltip">
22
+ <Button component="a" isAriaDisabled href="https://www.patternfly.org/" target="_blank" variant="secondary">
23
+ Secondary link as button to PatternFly home
24
+ </Button>
25
+ </Tooltip>
26
+ </Flex>
27
+ </>
52
28
  );
@@ -1,22 +1,20 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
  import ArrowRightIcon from '@patternfly/react-icons/dist/esm/icons/arrow-right-icon';
4
4
 
5
5
  export const ButtonCallToAction: React.FunctionComponent = () => (
6
- <React.Fragment>
6
+ <Flex columnGap={{ default: 'columnGapSm' }}>
7
7
  <Button variant="primary" size="lg">
8
8
  Call to action
9
- </Button>{' '}
9
+ </Button>
10
10
  <Button variant="secondary" size="lg">
11
11
  Call to action
12
- </Button>{' '}
12
+ </Button>
13
13
  <Button variant="tertiary" size="lg">
14
14
  Call to action
15
- </Button>{' '}
16
- <Button variant="link" size="lg">
17
- Call to action <ArrowRightIcon />
18
15
  </Button>
19
- <br />
20
- <br />
21
- </React.Fragment>
16
+ <Button variant="link" size="lg" icon={<ArrowRightIcon />} iconPosition="end">
17
+ Call to action
18
+ </Button>
19
+ </Flex>
22
20
  );
@@ -1,39 +1,52 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
  import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
4
4
  import PlusCircleIcon from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';
5
+ import CopyIcon from '@patternfly/react-icons/dist/esm/icons/copy-icon';
5
6
 
6
7
  export const ButtonDisabled: React.FunctionComponent = () => (
7
- <React.Fragment>
8
- <Button isDisabled>Primary disabled</Button> <Button isDisabled>Secondary disabled</Button>{' '}
9
- <Button variant="secondary" isDanger isDisabled>
10
- Danger secondary disabled
11
- </Button>{' '}
12
- <Button isDisabled variant="tertiary">
13
- Tertiary disabled
14
- </Button>{' '}
15
- <Button isDisabled variant="danger">
16
- Danger disabled
17
- </Button>{' '}
18
- <Button isDisabled variant="warning">
19
- Warning disabled
20
- </Button>
8
+ <>
9
+ <Flex columnGap={{ default: 'columnGapSm' }}>
10
+ <Button isDisabled>Primary</Button>
11
+ <Button variant="secondary" isDisabled>
12
+ Secondary
13
+ </Button>
14
+ <Button variant="secondary" isDanger isDisabled>
15
+ Danger secondary
16
+ </Button>
17
+ <Button isDisabled variant="tertiary">
18
+ Tertiary
19
+ </Button>
20
+ <Button isDisabled variant="danger">
21
+ Danger
22
+ </Button>
23
+ <Button isDisabled variant="warning">
24
+ Warning
25
+ </Button>
26
+ </Flex>
21
27
  <br />
28
+ <Flex columnGap={{ default: 'columnGapSm' }}>
29
+ <Button isDisabled variant="link" icon={<PlusCircleIcon />}>
30
+ Link
31
+ </Button>
32
+ <Button isDisabled variant="link" isInline>
33
+ Inline link
34
+ </Button>
35
+ <Button variant="link" isDanger isDisabled>
36
+ Danger link
37
+ </Button>
38
+ <Button isDisabled variant="plain" aria-label="Action">
39
+ <TimesIcon />
40
+ </Button>
41
+ </Flex>
22
42
  <br />
23
- <Button isDisabled variant="link" icon={<PlusCircleIcon />}>
24
- Link disabled
25
- </Button>{' '}
26
- <Button isDisabled variant="link" isInline>
27
- Inline link disabled
28
- </Button>{' '}
29
- <Button variant="link" isDanger isDisabled>
30
- Danger link disabled
31
- </Button>{' '}
32
- <Button isDisabled variant="plain" aria-label="Action">
33
- <TimesIcon />
34
- </Button>{' '}
35
- <Button isDisabled variant="control">
36
- Control disabled
37
- </Button>
38
- </React.Fragment>
43
+ <Flex columnGap={{ default: 'columnGapSm' }}>
44
+ <Button isDisabled variant="control">
45
+ Control
46
+ </Button>
47
+ <Button isDisabled variant="control" aria-label="Copy">
48
+ <CopyIcon />
49
+ </Button>
50
+ </Flex>
51
+ </>
39
52
  );
@@ -1,19 +1,19 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
 
4
4
  export const ButtonLinks: React.FunctionComponent = () => (
5
- <React.Fragment>
6
- <Button component="a" href="https://pf4.patternfly.org/" target="_blank" variant="primary">
7
- Link to core docs
8
- </Button>{' '}
9
- <Button component="a" href="https://pf4.patternfly.org/" target="_blank" variant="secondary">
10
- Secondary link to core docs
11
- </Button>{' '}
12
- <Button isDisabled component="a" href="https://pf4.patternfly.org/" target="_blank" variant="tertiary">
13
- Tertiary link to core docs
14
- </Button>{' '}
15
- <Button component="a" href="https://pf4.patternfly.org/contribution/#modifiers" variant="link">
16
- Jump to modifiers in contribution guidelines
5
+ <Flex>
6
+ <Button component="a" href="https://www.patternfly.org/" target="_blank" variant="primary">
7
+ Link to PatternFly home
17
8
  </Button>
18
- </React.Fragment>
9
+ <Button component="a" href="https://www.patternfly.org/" target="_blank" variant="secondary">
10
+ Secondary link to PatternFly home
11
+ </Button>
12
+ <Button isDisabled component="a" href="https://www.patternfly.org/" target="_blank" variant="tertiary">
13
+ Tertiary link to PatternFly home
14
+ </Button>
15
+ <Button component="a" href="https://www.patternfly.org/" variant="link">
16
+ Jump to PatternFly home
17
+ </Button>
18
+ </Flex>
19
19
  );
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';
4
+
5
+ export const ButtonPlainHasNoPadding: React.FunctionComponent = () => (
6
+ <p>
7
+ This is an example of a button
8
+ <Button variant="plain" hasNoPadding aria-label="More info">
9
+ <QuestionCircleIcon />
10
+ </Button>
11
+ which is placed inline with text
12
+ </p>
13
+ );
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
  import UploadIcon from '@patternfly/react-icons/dist/esm/icons/upload-icon';
4
4
 
5
5
  interface LoadingPropsType {
@@ -36,19 +36,24 @@ export const ButtonProgress: React.FunctionComponent = () => {
36
36
  uploadingProps.isLoading = isUploading;
37
37
 
38
38
  return (
39
- <React.Fragment>
40
- <Button
41
- variant="primary"
42
- id="primary-loading-button"
43
- onClick={() => setIsPrimaryLoading(!isPrimaryLoading)}
44
- {...primaryLoadingProps}
45
- >
46
- {isPrimaryLoading ? 'Click to stop loading' : 'Click to start loading'}
47
- </Button>{' '}
48
- <Button variant="secondary" onClick={() => setIsSecondaryLoading(!isSecondaryLoading)} {...secondaryLoadingProps}>
49
- {isSecondaryLoading ? 'Click to stop loading' : 'Click to start loading'}
50
- </Button>{' '}
51
- <br />
39
+ <>
40
+ <Flex columnGap={{ default: 'columnGapSm' }}>
41
+ <Button
42
+ variant="primary"
43
+ id="primary-loading-button"
44
+ onClick={() => setIsPrimaryLoading(!isPrimaryLoading)}
45
+ {...primaryLoadingProps}
46
+ >
47
+ {isPrimaryLoading ? 'Click to stop loading' : 'Click to start loading'}
48
+ </Button>
49
+ <Button
50
+ variant="secondary"
51
+ onClick={() => setIsSecondaryLoading(!isSecondaryLoading)}
52
+ {...secondaryLoadingProps}
53
+ >
54
+ {isSecondaryLoading ? 'Click to stop loading' : 'Click to start loading'}
55
+ </Button>
56
+ </Flex>
52
57
  <br />
53
58
  <Button
54
59
  variant="plain"
@@ -56,12 +61,12 @@ export const ButtonProgress: React.FunctionComponent = () => {
56
61
  onClick={() => setIsUploading(!isUploading)}
57
62
  icon={<UploadIcon />}
58
63
  {...uploadingProps}
59
- />{' '}
64
+ />
60
65
  <br />
61
66
  <br />
62
67
  <Button variant="link" isInline onClick={() => setIsInlineLoading(!isInlineLoading)} {...inlineLoadingProps}>
63
68
  {isInlineLoading ? 'Pause loading logs' : 'Resume loading logs'}
64
- </Button>{' '}
65
- </React.Fragment>
69
+ </Button>
70
+ </>
66
71
  );
67
72
  };
@@ -1,24 +1,22 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
 
4
4
  export const ButtonSmall: React.FunctionComponent = () => (
5
- <React.Fragment>
5
+ <Flex columnGap={{ default: 'columnGapSm' }}>
6
6
  <Button variant="primary" size="sm">
7
7
  Primary
8
- </Button>{' '}
8
+ </Button>
9
9
  <Button variant="secondary" size="sm">
10
10
  Secondary
11
- </Button>{' '}
11
+ </Button>
12
12
  <Button variant="tertiary" size="sm">
13
13
  Tertiary
14
- </Button>{' '}
14
+ </Button>
15
15
  <Button variant="danger" size="sm">
16
16
  Danger
17
- </Button>{' '}
17
+ </Button>
18
18
  <Button variant="warning" size="sm">
19
19
  Warning
20
20
  </Button>
21
- <br />
22
- <br />
23
- </React.Fragment>
21
+ </Flex>
24
22
  );
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
+ import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
4
+
5
+ export const ButtonStateful: React.FunctionComponent = () => (
6
+ <Flex>
7
+ <div>
8
+ <div>
9
+ <strong>Read</strong>
10
+ </div>
11
+ <Button variant="stateful" state="read" icon={<BellIcon />}>
12
+ 10 <span className="pf-v5-screen-reader">items</span>
13
+ </Button>
14
+ </div>
15
+ <div>
16
+ <div>
17
+ <strong>Unread</strong>
18
+ </div>
19
+ <Button variant="stateful" state="unread" icon={<BellIcon />}>
20
+ 10 <span className="pf-v5-screen-reader">unread items</span>
21
+ </Button>
22
+ </div>
23
+ <div>
24
+ <div>
25
+ <strong>Attention</strong>
26
+ </div>
27
+ <Button variant="stateful" state="attention" icon={<BellIcon />}>
28
+ 10 <span className="pf-v5-screen-reader">unread items, needs attention</span>
29
+ </Button>
30
+ </div>
31
+ </Flex>
32
+ );
@@ -1,8 +1,10 @@
1
1
  import React from 'react';
2
- import { Button } from '@patternfly/react-core';
2
+ import { Button, Flex } from '@patternfly/react-core';
3
3
 
4
4
  export const ButtonTypes: React.FunctionComponent = () => (
5
- <React.Fragment>
6
- <Button type="submit">Submit</Button> <Button type="reset">Reset</Button> <Button>Default</Button>
7
- </React.Fragment>
5
+ <Flex columnGap={{ default: 'columnGapSm' }}>
6
+ <Button type="submit">Submit</Button>
7
+ <Button type="reset">Reset</Button>
8
+ <Button>Default</Button>
9
+ </Flex>
8
10
  );