@patternfly/react-core 6.3.0-prerelease.18 → 6.3.0-prerelease.19

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 (131) hide show
  1. package/CHANGELOG.md +6 -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/Button/Button.d.ts +4 -0
  115. package/dist/esm/components/Button/Button.d.ts.map +1 -1
  116. package/dist/esm/components/Button/Button.js +20 -3
  117. package/dist/esm/components/Button/Button.js.map +1 -1
  118. package/dist/js/components/Button/Button.d.ts +4 -0
  119. package/dist/js/components/Button/Button.d.ts.map +1 -1
  120. package/dist/js/components/Button/Button.js +20 -3
  121. package/dist/js/components/Button/Button.js.map +1 -1
  122. package/dist/umd/assets/{output-CNooK7aQ.css → output-BA_GjePx.css} +19552 -19552
  123. package/dist/umd/react-core.min.js +1 -1
  124. package/helpers/package.json +1 -1
  125. package/layouts/package.json +1 -1
  126. package/next/package.json +1 -1
  127. package/package.json +2 -2
  128. package/src/components/Button/Button.tsx +48 -5
  129. package/src/components/Button/__tests__/Button.test.tsx +25 -0
  130. package/src/components/Button/examples/Button.md +8 -1
  131. package/src/components/Button/examples/ButtonFavorite.tsx +18 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.3.0-prerelease.17","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.3.0-prerelease.18","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.3.0-prerelease.17","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.3.0-prerelease.18","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.3.0-prerelease.17","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.3.0-prerelease.18","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.3.0-prerelease.18",
3
+ "version": "6.3.0-prerelease.19",
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",
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "2a9c798759283f3a0d482ec6ffd3dd9eb0d3807d"
66
+ "gitHead": "e53720b71b9d2fc075e476f5f1b3a5f7b7c3055c"
67
67
  }
@@ -4,6 +4,8 @@ import { css } from '@patternfly/react-styles';
4
4
  import { Spinner, spinnerSize } from '../Spinner';
5
5
  import { useOUIAProps, OUIAProps } from '../../helpers/OUIA/ouia';
6
6
  import { Badge } from '../Badge';
7
+ import StarIcon from '@patternfly/react-icons/dist/esm/icons/star-icon';
8
+ import OutlinedStarIcon from '@patternfly/react-icons/dist/esm/icons/outlined-star-icon';
7
9
 
8
10
  export enum ButtonVariant {
9
11
  primary = 'primary',
@@ -71,6 +73,10 @@ export interface ButtonProps extends Omit<React.HTMLProps<HTMLButtonElement>, 'r
71
73
  inoperableEvents?: string[];
72
74
  /** Adds inline styling to a link button */
73
75
  isInline?: boolean;
76
+ /** Adds favorite styling to a button */
77
+ isFavorite?: boolean;
78
+ /** Flag indicating whether the button is favorited or not, only when isFavorite is true. */
79
+ isFavorited?: boolean;
74
80
  /** Adds styling which affects the size of the button */
75
81
  size?: 'default' | 'sm' | 'lg';
76
82
  /** Sets button type */
@@ -117,6 +123,8 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
117
123
  size = ButtonSize.default,
118
124
  inoperableEvents = ['onClick', 'onKeyPress'],
119
125
  isInline = false,
126
+ isFavorite = false,
127
+ isFavorited = false,
120
128
  type = ButtonType.button,
121
129
  variant = ButtonVariant.primary,
122
130
  state = ButtonState.unread,
@@ -132,11 +140,19 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
132
140
  countOptions,
133
141
  ...props
134
142
  }: ButtonProps) => {
143
+ if (isFavorite && !ariaLabel && !props['aria-labelledby']) {
144
+ // eslint-disable-next-line no-console
145
+ console.error(
146
+ 'Button: Each favorite button must have a unique accessible name provided via aria-label or aria-labelledby'
147
+ );
148
+ }
149
+
135
150
  const ouiaProps = useOUIAProps(Button.displayName, ouiaId, ouiaSafe, variant);
136
151
  const Component = component as any;
137
152
  const isButtonElement = Component === 'button';
138
153
  const isInlineSpan = isInline && Component === 'span';
139
154
  const isIconAlignedAtEnd = iconPosition === 'end' || iconPosition === 'right';
155
+ const shouldOverrideIcon = isFavorite;
140
156
 
141
157
  const preventedEvents = inoperableEvents.reduce(
142
158
  (handlers, eventToPrevent) => ({
@@ -158,11 +174,36 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
158
174
  }
159
175
  };
160
176
 
161
- const _icon = icon && (
162
- <span className={css(styles.buttonIcon, children && styles.modifiers[isIconAlignedAtEnd ? 'end' : 'start'])}>
163
- {icon}
164
- </span>
165
- );
177
+ const renderIcon = () => {
178
+ let iconContent;
179
+
180
+ if (isFavorite) {
181
+ iconContent = (
182
+ <>
183
+ <span className={css('pf-v6-c-button__icon-favorite')}>
184
+ <OutlinedStarIcon />
185
+ </span>
186
+ <span className={css('pf-v6-c-button__icon-favorited')}>
187
+ <StarIcon />
188
+ </span>
189
+ </>
190
+ );
191
+ }
192
+
193
+ if (icon && !shouldOverrideIcon) {
194
+ iconContent = icon;
195
+ }
196
+
197
+ return (
198
+ iconContent && (
199
+ <span className={css(styles.buttonIcon, children && styles.modifiers[isIconAlignedAtEnd ? 'end' : 'start'])}>
200
+ {iconContent}
201
+ </span>
202
+ )
203
+ );
204
+ };
205
+
206
+ const _icon = renderIcon();
166
207
  const _children = children && <span className={css('pf-v6-c-button__text')}>{children}</span>;
167
208
  // We only want to render the aria-disabled attribute when true, similar to the disabled attribute natively.
168
209
  const shouldRenderAriaDisabled = isAriaDisabled || (!isButtonElement && isDisabled);
@@ -181,6 +222,8 @@ const ButtonBase: React.FunctionComponent<ButtonProps> = ({
181
222
  isAriaDisabled && styles.modifiers.ariaDisabled,
182
223
  isClicked && styles.modifiers.clicked,
183
224
  isInline && variant === ButtonVariant.link && styles.modifiers.inline,
225
+ isFavorite && styles.modifiers.favorite,
226
+ isFavorite && isFavorited && styles.modifiers.favorited,
184
227
  isDanger && (variant === ButtonVariant.secondary || variant === ButtonVariant.link) && styles.modifiers.danger,
185
228
  isLoading !== null && variant !== ButtonVariant.plain && styles.modifiers.progress,
186
229
  isLoading && styles.modifiers.inProgress,
@@ -248,3 +248,28 @@ test(`Renders basic button`, () => {
248
248
  const { asFragment } = render(<Button aria-label="basic button">Basic Button</Button>);
249
249
  expect(asFragment()).toMatchSnapshot();
250
250
  });
251
+
252
+ test(`Renders with class ${styles.modifiers.favorite} when isFavorite is true`, () => {
253
+ render(<Button isFavorite />);
254
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.favorite);
255
+ });
256
+
257
+ test(`Renders with class ${styles.modifiers.favorited} when isFavorite is true and isFavorited is true`, () => {
258
+ render(<Button isFavorite isFavorited />);
259
+ expect(screen.getByRole('button')).toHaveClass(styles.modifiers.favorited);
260
+ });
261
+
262
+ test(`Does not render with class ${styles.modifiers.favorite} when isFavorite is false`, () => {
263
+ render(<Button />);
264
+ expect(screen.getByRole('button')).not.toHaveClass(styles.modifiers.favorite);
265
+ });
266
+
267
+ test(`Does not render with class ${styles.modifiers.favorited} when isFavorite is true and isFavorited is false`, () => {
268
+ render(<Button isFavorite />);
269
+ expect(screen.getByRole('button')).not.toHaveClass(styles.modifiers.favorited);
270
+ });
271
+
272
+ test('Overrides icon prop when isFavorite is true', () => {
273
+ render(<Button isFavorite icon={<div>Icon content</div>} />);
274
+ expect(screen.queryByText('Icon content')).not.toBeInTheDocument();
275
+ });
@@ -125,6 +125,13 @@ Stateful buttons are ideal for displaying the state of notifications. Use `varia
125
125
  ```ts file="./ButtonStateful.tsx"
126
126
  ```
127
127
 
128
+ ### Favorite
129
+
130
+ You can pass both the `isFavorite` and `variant="plain"` properties into the `<Button>` to create a favorite button. Passing the `isFavorited` property will determine the current favorited state and update styling accordingly.
131
+
132
+ ```ts file = "./ButtonFavorite.tsx"
133
+ ```
134
+
128
135
  ## Using router links
129
136
 
130
137
  Router links can be used for in-app linking in React environments to prevent page reloading. To use a `Link` component from a router package, you can follow our [custom component example](#custom-component) and pass a callback to the `component` property of the `Button`:
@@ -133,4 +140,4 @@ Router links can be used for in-app linking in React environments to prevent pag
133
140
  <Button variant="link" component={(props: any) => <Link {...props} to="#" />}>
134
141
  Router link
135
142
  </Button>
136
- ```
143
+ ```
@@ -0,0 +1,18 @@
1
+ import { useState } from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+
4
+ export const ButtonFavorite: React.FunctionComponent = () => {
5
+ const [isFavorited, setIsFavorited] = useState(false);
6
+ const toggleFavorite = () => {
7
+ setIsFavorited(!isFavorited);
8
+ };
9
+ return (
10
+ <Button
11
+ variant="plain"
12
+ aria-label={isFavorited ? 'Favorite example favorited' : 'Favorite example not favorited'}
13
+ isFavorite
14
+ isFavorited={isFavorited}
15
+ onClick={toggleFavorite}
16
+ />
17
+ );
18
+ };