@patternfly/react-core 6.5.0-prerelease.6 → 6.5.0-prerelease.8

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 (153) hide show
  1. package/CHANGELOG.md +10 -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/Compass/package.json +1 -1
  23. package/dist/dynamic/components/Content/package.json +1 -1
  24. package/dist/dynamic/components/DataList/package.json +1 -1
  25. package/dist/dynamic/components/DatePicker/package.json +1 -1
  26. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  27. package/dist/dynamic/components/Divider/package.json +1 -1
  28. package/dist/dynamic/components/Drawer/package.json +1 -1
  29. package/dist/dynamic/components/Dropdown/package.json +1 -1
  30. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  31. package/dist/dynamic/components/EmptyState/package.json +1 -1
  32. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  33. package/dist/dynamic/components/FileUpload/package.json +1 -1
  34. package/dist/dynamic/components/Form/package.json +1 -1
  35. package/dist/dynamic/components/FormSelect/package.json +1 -1
  36. package/dist/dynamic/components/HelperText/package.json +1 -1
  37. package/dist/dynamic/components/Hint/package.json +1 -1
  38. package/dist/dynamic/components/Icon/package.json +1 -1
  39. package/dist/dynamic/components/InputGroup/package.json +1 -1
  40. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  41. package/dist/dynamic/components/Label/package.json +1 -1
  42. package/dist/dynamic/components/List/package.json +1 -1
  43. package/dist/dynamic/components/LoginPage/package.json +1 -1
  44. package/dist/dynamic/components/Masthead/package.json +1 -1
  45. package/dist/dynamic/components/Menu/package.json +1 -1
  46. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  47. package/dist/dynamic/components/Modal/package.json +1 -1
  48. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  49. package/dist/dynamic/components/Nav/package.json +1 -1
  50. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  51. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  52. package/dist/dynamic/components/NumberInput/package.json +1 -1
  53. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  54. package/dist/dynamic/components/Page/package.json +1 -1
  55. package/dist/dynamic/components/Pagination/package.json +1 -1
  56. package/dist/dynamic/components/Panel/package.json +1 -1
  57. package/dist/dynamic/components/Popover/package.json +1 -1
  58. package/dist/dynamic/components/Progress/package.json +1 -1
  59. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  60. package/dist/dynamic/components/Radio/package.json +1 -1
  61. package/dist/dynamic/components/SearchInput/package.json +1 -1
  62. package/dist/dynamic/components/Select/package.json +1 -1
  63. package/dist/dynamic/components/Sidebar/package.json +1 -1
  64. package/dist/dynamic/components/SimpleList/package.json +1 -1
  65. package/dist/dynamic/components/Skeleton/package.json +1 -1
  66. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  67. package/dist/dynamic/components/Slider/package.json +1 -1
  68. package/dist/dynamic/components/Spinner/package.json +1 -1
  69. package/dist/dynamic/components/Switch/package.json +1 -1
  70. package/dist/dynamic/components/Tabs/package.json +1 -1
  71. package/dist/dynamic/components/TextArea/package.json +1 -1
  72. package/dist/dynamic/components/TextInput/package.json +1 -1
  73. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  74. package/dist/dynamic/components/TimePicker/package.json +1 -1
  75. package/dist/dynamic/components/Timestamp/package.json +1 -1
  76. package/dist/dynamic/components/Title/package.json +1 -1
  77. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  78. package/dist/dynamic/components/Toolbar/package.json +1 -1
  79. package/dist/dynamic/components/Tooltip/package.json +1 -1
  80. package/dist/dynamic/components/TreeView/package.json +1 -1
  81. package/dist/dynamic/components/Truncate/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  83. package/dist/dynamic/components/Wizard/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  90. package/dist/dynamic/deprecated/components/package.json +1 -1
  91. package/dist/dynamic/helpers/AnimationsProvider/AnimationsProvider/package.json +1 -1
  92. package/dist/dynamic/helpers/AnimationsProvider/package.json +1 -1
  93. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  94. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  95. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  96. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  97. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  98. package/dist/dynamic/helpers/constants/package.json +1 -1
  99. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  100. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  101. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  102. package/dist/dynamic/helpers/package.json +1 -1
  103. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  104. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  105. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  106. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  107. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  108. package/dist/dynamic/helpers/util/package.json +1 -1
  109. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  110. package/dist/dynamic/layouts/Flex/package.json +1 -1
  111. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  112. package/dist/dynamic/layouts/Grid/package.json +1 -1
  113. package/dist/dynamic/layouts/Level/package.json +1 -1
  114. package/dist/dynamic/layouts/Split/package.json +1 -1
  115. package/dist/dynamic/layouts/Stack/package.json +1 -1
  116. package/dist/dynamic/styles/package.json +1 -1
  117. package/dist/esm/components/Card/CardSubtitle.d.ts +9 -0
  118. package/dist/esm/components/Card/CardSubtitle.d.ts.map +1 -0
  119. package/dist/esm/components/Card/CardSubtitle.js +10 -0
  120. package/dist/esm/components/Card/CardSubtitle.js.map +1 -0
  121. package/dist/esm/components/Card/CardTitle.d.ts +2 -0
  122. package/dist/esm/components/Card/CardTitle.d.ts.map +1 -1
  123. package/dist/esm/components/Card/CardTitle.js +5 -3
  124. package/dist/esm/components/Card/CardTitle.js.map +1 -1
  125. package/dist/js/components/Card/CardSubtitle.d.ts +9 -0
  126. package/dist/js/components/Card/CardSubtitle.d.ts.map +1 -0
  127. package/dist/js/components/Card/CardSubtitle.js +14 -0
  128. package/dist/js/components/Card/CardSubtitle.js.map +1 -0
  129. package/dist/js/components/Card/CardTitle.d.ts +2 -0
  130. package/dist/js/components/Card/CardTitle.d.ts.map +1 -1
  131. package/dist/js/components/Card/CardTitle.js +4 -2
  132. package/dist/js/components/Card/CardTitle.js.map +1 -1
  133. package/dist/styles/base-no-reset.css +5 -0
  134. package/dist/styles/base.css +12 -0
  135. package/dist/umd/assets/{output-DHHQhDXH.css → output-DvnkHQzQ.css} +20828 -20805
  136. package/dist/umd/react-core.min.js +2 -2
  137. package/helpers/package.json +1 -1
  138. package/layouts/package.json +1 -1
  139. package/next/package.json +1 -1
  140. package/package.json +6 -6
  141. package/src/components/Card/CardSubtitle.tsx +20 -0
  142. package/src/components/Card/CardTitle.tsx +6 -0
  143. package/src/components/Card/__tests__/CardSubtitle.test.tsx +48 -0
  144. package/src/components/Card/__tests__/CardTitle.test.tsx +27 -17
  145. package/src/components/Card/__tests__/__snapshots__/CardSubtitle.test.tsx.snap +21 -0
  146. package/src/components/Card/__tests__/__snapshots__/CardTitle.test.tsx.snap +1 -1
  147. package/src/components/Card/examples/Card.md +16 -1
  148. package/src/components/Card/examples/CardSubtitle.tsx +9 -0
  149. package/src/components/Card/examples/CardSubtitleActions.tsx +107 -0
  150. package/src/components/Compass/examples/CompassDemo.tsx +6 -6
  151. package/src/components/DataList/__tests__/DataList.test.tsx +6 -0
  152. package/src/components/Tabs/__tests__/Tabs.test.tsx +60 -0
  153. package/src/components/Tabs/__tests__/__snapshots__/Tabs.test.tsx.snap +13 -13
@@ -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.5.0-prerelease.5","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.5.0-prerelease.7","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.5.0-prerelease.5","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.5.0-prerelease.7","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.5.0-prerelease.5","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.5.0-prerelease.7","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.5.0-prerelease.6",
3
+ "version": "6.5.0-prerelease.8",
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.mjs --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.5.0-prerelease.2",
50
- "@patternfly/react-styles": "^6.5.0-prerelease.2",
51
- "@patternfly/react-tokens": "^6.5.0-prerelease.2",
49
+ "@patternfly/react-icons": "^6.5.0-prerelease.3",
50
+ "@patternfly/react-styles": "^6.5.0-prerelease.3",
51
+ "@patternfly/react-tokens": "^6.5.0-prerelease.3",
52
52
  "focus-trap": "7.6.4",
53
53
  "react-dropzone": "^14.3.5",
54
54
  "tslib": "^2.8.1"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "6.5.0-prerelease.12",
57
+ "@patternfly/patternfly": "6.5.0-prerelease.14",
58
58
  "case-anything": "^3.1.2",
59
59
  "css": "^3.0.0",
60
60
  "fs-extra": "^11.3.0"
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "070b384f310888ebad56fff18677a08c49d35883"
66
+ "gitHead": "a88ecfa753389be67ee88657914fc030440838f3"
67
67
  }
@@ -0,0 +1,20 @@
1
+ import { css } from '@patternfly/react-styles';
2
+ import styles from '@patternfly/react-styles/css/components/Card/card';
3
+
4
+ export interface CardSubtitleProps {
5
+ /** Content rendered inside the description. */
6
+ children?: React.ReactNode;
7
+ /** Id of the description. */
8
+ id?: string;
9
+ }
10
+
11
+ export const CardSubtitle: React.FunctionComponent<CardSubtitleProps> = ({
12
+ children = null,
13
+ id = '',
14
+ ...props
15
+ }: CardSubtitleProps) => (
16
+ <div {...props} id={id} className={css(styles.cardSubtitle)}>
17
+ {children}
18
+ </div>
19
+ );
20
+ CardSubtitle.displayName = 'CardSubtitle';
@@ -2,6 +2,7 @@ import { useContext } from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Card/card';
4
4
  import { CardContext } from './Card';
5
+ import { CardSubtitle } from './CardSubtitle';
5
6
 
6
7
  export interface CardTitleProps extends React.HTMLProps<HTMLDivElement> {
7
8
  /** Content rendered inside the CardTitle */
@@ -10,23 +11,28 @@ export interface CardTitleProps extends React.HTMLProps<HTMLDivElement> {
10
11
  className?: string;
11
12
  /** Sets the base component to render. defaults to div */
12
13
  component?: keyof React.JSX.IntrinsicElements;
14
+ /** @beta Subtitle of the card title */
15
+ subtitle?: React.ReactNode;
13
16
  }
14
17
 
15
18
  export const CardTitle: React.FunctionComponent<CardTitleProps> = ({
16
19
  children,
17
20
  className,
18
21
  component = 'div',
22
+ subtitle,
19
23
  ...props
20
24
  }: CardTitleProps) => {
21
25
  const { cardId } = useContext(CardContext);
22
26
  const Component = component as any;
23
27
  const titleId = cardId ? `${cardId}-title` : '';
28
+ const subtitleId = cardId ? `${cardId}-subtitle` : '';
24
29
 
25
30
  return (
26
31
  <div className={css(styles.cardTitle)}>
27
32
  <Component className={css(styles.cardTitleText, className)} id={titleId || undefined} {...props}>
28
33
  {children}
29
34
  </Component>
35
+ {subtitle && <CardSubtitle id={subtitleId}>{subtitle}</CardSubtitle>}
30
36
  </div>
31
37
  );
32
38
  };
@@ -0,0 +1,48 @@
1
+ import { render, screen } from '@testing-library/react';
2
+ import { CardSubtitle } from '../CardSubtitle';
3
+ import styles from '@patternfly/react-styles/css/components/Card/card';
4
+
5
+ test('Renders without children', () => {
6
+ render(
7
+ <div data-testid="container">
8
+ <CardSubtitle />
9
+ </div>
10
+ );
11
+
12
+ expect(screen.getByTestId('container').firstChild).toBeVisible();
13
+ });
14
+
15
+ test('Renders with children', () => {
16
+ render(<CardSubtitle>Subtitle content</CardSubtitle>);
17
+
18
+ expect(screen.getByText('Subtitle content')).toBeInTheDocument();
19
+ });
20
+
21
+ test(`Renders with class ${styles.cardSubtitle} by default`, () => {
22
+ render(<CardSubtitle>Subtitle content</CardSubtitle>);
23
+
24
+ expect(screen.getByText('Subtitle content')).toHaveClass(styles.cardSubtitle, { exact: true });
25
+ });
26
+
27
+ test('Renders with id when passed', () => {
28
+ render(<CardSubtitle id="subtitle-id">Subtitle content</CardSubtitle>);
29
+
30
+ expect(screen.getByText('Subtitle content')).toHaveAttribute('id', 'subtitle-id');
31
+ });
32
+
33
+ test('extra props are spread to the root element', () => {
34
+ const testId = 'card-subtitle';
35
+
36
+ render(<CardSubtitle data-testid={testId} />);
37
+ expect(screen.getByTestId(testId)).toBeInTheDocument();
38
+ });
39
+
40
+ test('Matches snapshot without children', () => {
41
+ const { asFragment } = render(<CardSubtitle />);
42
+ expect(asFragment()).toMatchSnapshot();
43
+ });
44
+
45
+ test('Matches snapshot with children', () => {
46
+ const { asFragment } = render(<CardSubtitle>Subtitle content</CardSubtitle>);
47
+ expect(asFragment()).toMatchSnapshot();
48
+ });
@@ -1,21 +1,31 @@
1
1
  import { render, screen } from '@testing-library/react';
2
2
  import { CardTitle } from '../CardTitle';
3
3
 
4
- describe('CardTitle', () => {
5
- test('renders with PatternFly Core styles', () => {
6
- const { asFragment } = render(<CardTitle>text</CardTitle>);
7
- expect(asFragment()).toMatchSnapshot();
8
- });
9
-
10
- test('className is added to the root element', () => {
11
- render(<CardTitle className="extra-class">text</CardTitle>);
12
- expect(screen.getByText('text')).toHaveClass('extra-class');
13
- });
14
-
15
- test('extra props are spread to the root element', () => {
16
- const testId = 'card-header';
17
-
18
- render(<CardTitle data-testid={testId} />);
19
- expect(screen.getByTestId(testId)).toBeInTheDocument();
20
- });
4
+ test('Renders with custom class when passed', () => {
5
+ render(<CardTitle className="extra-class">text</CardTitle>);
6
+ expect(screen.getByText('text')).toHaveClass('extra-class');
7
+ });
8
+
9
+ test('Does not render with card subtitle by default', () => {
10
+ render(<CardTitle>text</CardTitle>);
11
+
12
+ expect(screen.queryByText('text')?.nextElementSibling).not.toBeInTheDocument();
13
+ });
14
+
15
+ test('Renders with card subtitle when subtitle is passed', () => {
16
+ render(<CardTitle subtitle="subtitle content">text</CardTitle>);
17
+
18
+ expect(screen.getByText('subtitle content')).toBeInTheDocument();
19
+ });
20
+
21
+ test('extra props are spread to the root element', () => {
22
+ const testId = 'card-header';
23
+
24
+ render(<CardTitle data-testid={testId} />);
25
+ expect(screen.getByTestId(testId)).toBeInTheDocument();
26
+ });
27
+
28
+ test('Matches snapshot', () => {
29
+ const { asFragment } = render(<CardTitle>text</CardTitle>);
30
+ expect(asFragment()).toMatchSnapshot();
21
31
  });
@@ -0,0 +1,21 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Matches snapshot with children 1`] = `
4
+ <DocumentFragment>
5
+ <div
6
+ class="pf-v6-c-card__subtitle"
7
+ id=""
8
+ >
9
+ Subtitle content
10
+ </div>
11
+ </DocumentFragment>
12
+ `;
13
+
14
+ exports[`Matches snapshot without children 1`] = `
15
+ <DocumentFragment>
16
+ <div
17
+ class="pf-v6-c-card__subtitle"
18
+ id=""
19
+ />
20
+ </DocumentFragment>
21
+ `;
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`CardTitle renders with PatternFly Core styles 1`] = `
3
+ exports[`Matches snapshot 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
6
  class="pf-v6-c-card__title"
@@ -28,7 +28,20 @@ import PlusIcon from '@patternfly/react-icons/dist/esm/icons/plus-icon';
28
28
 
29
29
  Basic cards typically have a `<CardTitle>`, `<CardBody>` and `<CardFooter>`. You may omit these components as needed, but it is recommended to at least include a `<CardBody>` to provide details about the card item.
30
30
 
31
- ```ts file='./CardBasic.tsx'
31
+ ```ts file='./CardBasic.tsx'
32
+
33
+ ```
34
+ ### Card with subtitle
35
+
36
+ A basic card that also has a subtitle
37
+
38
+ ```ts file='./CardSubtitle.tsx' isBeta
39
+
40
+ ```
41
+ ### Card with subtitle and Actions
42
+ This card demonstrates having an image, action, and subtitle in a single card.
43
+
44
+ ```ts file='./CardSubtitleActions.tsx' isBeta
32
45
 
33
46
  ```
34
47
 
@@ -71,6 +84,8 @@ Select the "actions hasNoOffset" checkbox in the example below to illustrate thi
71
84
 
72
85
  ```
73
86
 
87
+
88
+
74
89
  ### Title inline with images and actions
75
90
 
76
91
  Moving `<CardTitle>` within the `<CardHeader>` will style it inline with any images or actions.
@@ -0,0 +1,9 @@
1
+ import { Card, CardTitle, CardBody, CardFooter } from '@patternfly/react-core';
2
+
3
+ export const CardSubtitle: React.FunctionComponent = () => (
4
+ <Card ouiaId="CardSubtitle">
5
+ <CardTitle subtitle="Subtitle">Title</CardTitle>
6
+ <CardBody>Body</CardBody>
7
+ <CardFooter>Footer</CardFooter>
8
+ </Card>
9
+ );
@@ -0,0 +1,107 @@
1
+ import { useState } from 'react';
2
+ import {
3
+ Brand,
4
+ Card,
5
+ CardHeader,
6
+ CardTitle,
7
+ CardBody,
8
+ CardFooter,
9
+ Checkbox,
10
+ Dropdown,
11
+ DropdownList,
12
+ DropdownItem,
13
+ MenuToggle,
14
+ MenuToggleElement,
15
+ Divider
16
+ } from '@patternfly/react-core';
17
+ import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
18
+ import pfLogo from '../../assets/PF-HorizontalLogo-Color.svg';
19
+
20
+ export const CardWithImageAndActions: React.FunctionComponent = () => {
21
+ const [isOpen, setIsOpen] = useState<boolean>(false);
22
+ const [isChecked, setIsChecked] = useState<boolean>(false);
23
+ const [hasNoOffset, setHasNoOffset] = useState<boolean>(false);
24
+
25
+ const onSelect = () => {
26
+ setIsOpen(!isOpen);
27
+ };
28
+ const onClick = (checked: boolean) => {
29
+ setIsChecked(checked);
30
+ };
31
+ const toggleOffset = (checked: boolean) => {
32
+ setHasNoOffset(checked);
33
+ };
34
+
35
+ const dropdownItems = (
36
+ <>
37
+ <DropdownItem key="action">Action</DropdownItem>
38
+ {/* Prevent default onClick functionality for example purposes */}
39
+ <DropdownItem key="link" to="#" onClick={(event: any) => event.preventDefault()}>
40
+ Link
41
+ </DropdownItem>
42
+ <DropdownItem key="disabled action" isDisabled>
43
+ Disabled Action
44
+ </DropdownItem>
45
+ <DropdownItem key="disabled link" isDisabled to="#" onClick={(event: any) => event.preventDefault()}>
46
+ Disabled Link
47
+ </DropdownItem>
48
+ <Divider component="li" key="separator" />
49
+ <DropdownItem key="separated action">Separated Action</DropdownItem>
50
+ <DropdownItem key="separated link" to="#" onClick={(event: any) => event.preventDefault()}>
51
+ Separated Link
52
+ </DropdownItem>
53
+ </>
54
+ );
55
+
56
+ const headerActions = (
57
+ <>
58
+ <Dropdown
59
+ onSelect={onSelect}
60
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
61
+ <MenuToggle
62
+ ref={toggleRef}
63
+ isExpanded={isOpen}
64
+ onClick={() => setIsOpen(!isOpen)}
65
+ variant="plain"
66
+ aria-label="Card header images and actions example kebab toggle"
67
+ icon={<EllipsisVIcon />}
68
+ />
69
+ )}
70
+ isOpen={isOpen}
71
+ onOpenChange={(isOpen: boolean) => setIsOpen(isOpen)}
72
+ >
73
+ <DropdownList>{dropdownItems}</DropdownList>
74
+ </Dropdown>
75
+ <Checkbox
76
+ isChecked={isChecked}
77
+ onChange={(_event, checked) => onClick(checked)}
78
+ aria-label="card checkbox example"
79
+ id="check-1"
80
+ name="check1"
81
+ />
82
+ </>
83
+ );
84
+
85
+ return (
86
+ <>
87
+ <Checkbox
88
+ label="actions hasNoOffset"
89
+ isChecked={hasNoOffset}
90
+ onChange={(_event, checked) => toggleOffset(checked)}
91
+ aria-label="remove actions offset"
92
+ id="toggle-actions-offset"
93
+ name="toggle-actions-offset"
94
+ />
95
+ <div style={{ marginTop: '15px' }}>
96
+ <Card>
97
+ <CardHeader actions={{ actions: headerActions, hasNoOffset }}>
98
+ <Brand src={pfLogo} alt="PatternFly logo" style={{ width: '300px' }} />
99
+ </CardHeader>
100
+ <CardTitle subtitle="Subtitle">Title</CardTitle>
101
+ <CardBody>Body</CardBody>
102
+ <CardFooter>Footer</CardFooter>
103
+ </Card>
104
+ </div>
105
+ </>
106
+ );
107
+ };
@@ -81,33 +81,33 @@ export const CompassBasic: React.FunctionComponent = () => {
81
81
 
82
82
  const sidebarContent = (
83
83
  <CompassPanel isPill>
84
- <ActionList isIconList className="pf-m-vertical" /* isVertical */>
84
+ <ActionList isIconList isVertical>
85
85
  <ActionListGroup>
86
86
  <ActionListItem>
87
87
  <Tooltip content="Play">
88
- <Button variant="plain" icon={<PlayIcon />} aria-label="Play" />
88
+ <Button isCircle variant="plain" icon={<PlayIcon />} aria-label="Play" />
89
89
  </Tooltip>
90
90
  </ActionListItem>
91
91
  <ActionListItem>
92
92
  <Tooltip content="Add">
93
- <Button variant="plain" icon={<OutlinedPlusSquare />} aria-label="Add" />
93
+ <Button isCircle variant="plain" icon={<OutlinedPlusSquare />} aria-label="Add" />
94
94
  </Tooltip>
95
95
  </ActionListItem>
96
96
  </ActionListGroup>
97
97
  <ActionListItem>
98
98
  <Tooltip content="Copy">
99
- <Button variant="plain" icon={<OutlinedCopy />} aria-label="Copy" />
99
+ <Button isCircle variant="plain" icon={<OutlinedCopy />} aria-label="Copy" />
100
100
  </Tooltip>
101
101
  </ActionListItem>
102
102
  <ActionListGroup>
103
103
  <ActionListItem>
104
104
  <Tooltip content="Help">
105
- <Button variant="plain" icon={<OutlinedQuestionCircleIcon />} aria-label="Help" />
105
+ <Button isCircle variant="plain" icon={<OutlinedQuestionCircleIcon />} aria-label="Help" />
106
106
  </Tooltip>
107
107
  </ActionListItem>
108
108
  <ActionListItem>
109
109
  <Tooltip content="Second copy">
110
- <Button variant="plain" icon={<OutlinedCopy />} aria-label="Copy2" />
110
+ <Button isCircle variant="plain" icon={<OutlinedCopy />} aria-label="Copy2" />
111
111
  </Tooltip>
112
112
  </ActionListItem>
113
113
  </ActionListGroup>
@@ -71,6 +71,12 @@ test('Renders custom class when passed', () => {
71
71
  expect(screen.getByLabelText('list')).toHaveClass('data-list-custom');
72
72
  });
73
73
 
74
+ test(`Renders with class ${styles.modifiers.plain} when isPlain is true`, () => {
75
+ render(<DataList key="list-id-1" isPlain aria-label="list" />);
76
+
77
+ expect(screen.getByLabelText('list')).toHaveClass(styles.modifiers.plain);
78
+ });
79
+
74
80
  test('Renders with a hidden input to improve a11y when onSelectableRowChange is passed', () => {
75
81
  render(
76
82
  <DataList aria-label="this is a simple list" onSelectableRowChange={() => {}}>
@@ -166,6 +166,66 @@ test(`Does not render with class ${styles.modifiers.initializingAccent} when unc
166
166
  expect(screen.getByRole('region')).not.toHaveClass(styles.modifiers.initializingAccent);
167
167
  });
168
168
 
169
+ test(`Renders with class ${styles.modifiers.nav} when isNav is true`, () => {
170
+ render(
171
+ <Tabs isNav role="region">
172
+ <Tab title="Test title" eventKey={0}>
173
+ Tab Content
174
+ </Tab>
175
+ </Tabs>
176
+ );
177
+
178
+ expect(screen.getByRole('region')).toHaveClass(styles.modifiers.nav);
179
+ });
180
+
181
+ test(`Renders with div wrapper by default`, () => {
182
+ render(
183
+ <Tabs>
184
+ <Tab title="Test title" eventKey={0}>
185
+ Tab Content
186
+ </Tab>
187
+ </Tabs>
188
+ );
189
+
190
+ expect(screen.queryByRole('navigation')).not.toBeInTheDocument();
191
+ });
192
+
193
+ test(`Renders with nav wrapper when component="nav"`, () => {
194
+ render(
195
+ <Tabs component="nav">
196
+ <Tab title="Test title" eventKey={0}>
197
+ Tab Content
198
+ </Tab>
199
+ </Tabs>
200
+ );
201
+
202
+ expect(screen.getByRole('navigation')).toBeInTheDocument();
203
+ });
204
+
205
+ test(`Renders with nav wrapper when isNav is true`, () => {
206
+ render(
207
+ <Tabs isNav>
208
+ <Tab title="Test title" eventKey={0}>
209
+ Tab Content
210
+ </Tab>
211
+ </Tabs>
212
+ );
213
+
214
+ expect(screen.getByRole('navigation')).toBeInTheDocument();
215
+ });
216
+
217
+ test(`Overrides isNav nav wrapper when component="div" is passed`, () => {
218
+ render(
219
+ <Tabs component="div" isNav>
220
+ <Tab title="Test title" eventKey={0}>
221
+ Tab Content
222
+ </Tab>
223
+ </Tabs>
224
+ );
225
+
226
+ expect(screen.queryByRole('navigation')).not.toBeInTheDocument();
227
+ });
228
+
169
229
  test('should render simple tabs', () => {
170
230
  const { asFragment } = render(
171
231
  <Tabs id="simpleTabs">
@@ -5,7 +5,7 @@ exports[`should render accessible tabs 1`] = `
5
5
  <nav
6
6
  aria-label="accessible Tabs example"
7
7
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
8
- data-ouia-component-id="OUIA-Generated-Tabs-14"
8
+ data-ouia-component-id="OUIA-Generated-Tabs-19"
9
9
  data-ouia-component-type="PF6/Tabs"
10
10
  data-ouia-safe="true"
11
11
  id="accessibleTabs"
@@ -122,7 +122,7 @@ exports[`should render box tabs 1`] = `
122
122
  <DocumentFragment>
123
123
  <div
124
124
  class="pf-v6-c-tabs pf-m-animate-current pf-m-box pf-m-initializing-accent"
125
- data-ouia-component-id="OUIA-Generated-Tabs-13"
125
+ data-ouia-component-id="OUIA-Generated-Tabs-18"
126
126
  data-ouia-component-type="PF6/Tabs"
127
127
  data-ouia-safe="true"
128
128
  id="boxTabs"
@@ -281,7 +281,7 @@ exports[`should render box tabs of secondary variant 1`] = `
281
281
  <DocumentFragment>
282
282
  <div
283
283
  class="pf-v6-c-tabs pf-m-animate-current pf-m-box pf-m-secondary pf-m-initializing-accent"
284
- data-ouia-component-id="OUIA-Generated-Tabs-24"
284
+ data-ouia-component-id="OUIA-Generated-Tabs-29"
285
285
  data-ouia-component-type="PF6/Tabs"
286
286
  data-ouia-safe="true"
287
287
  id="boxSecondaryVariantTabs"
@@ -398,7 +398,7 @@ exports[`should render expandable vertical tabs 1`] = `
398
398
  <DocumentFragment>
399
399
  <div
400
400
  class="pf-v6-c-tabs pf-m-animate-current pf-m-vertical pf-m-expandable pf-m-initializing-accent"
401
- data-ouia-component-id="OUIA-Generated-Tabs-11"
401
+ data-ouia-component-id="OUIA-Generated-Tabs-16"
402
402
  data-ouia-component-type="PF6/Tabs"
403
403
  data-ouia-safe="true"
404
404
  id="verticalTabs"
@@ -605,7 +605,7 @@ exports[`should render filled tabs 1`] = `
605
605
  <DocumentFragment>
606
606
  <div
607
607
  class="pf-v6-c-tabs pf-m-animate-current pf-m-fill pf-m-initializing-accent"
608
- data-ouia-component-id="OUIA-Generated-Tabs-15"
608
+ data-ouia-component-id="OUIA-Generated-Tabs-20"
609
609
  data-ouia-component-type="PF6/Tabs"
610
610
  data-ouia-safe="true"
611
611
  id="filledTabs"
@@ -722,7 +722,7 @@ exports[`should render simple tabs 1`] = `
722
722
  <DocumentFragment>
723
723
  <div
724
724
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
725
- data-ouia-component-id="OUIA-Generated-Tabs-6"
725
+ data-ouia-component-id="OUIA-Generated-Tabs-11"
726
726
  data-ouia-component-type="PF6/Tabs"
727
727
  data-ouia-safe="true"
728
728
  id="simpleTabs"
@@ -881,7 +881,7 @@ exports[`should render subtabs 1`] = `
881
881
  <DocumentFragment>
882
882
  <div
883
883
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
884
- data-ouia-component-id="OUIA-Generated-Tabs-16"
884
+ data-ouia-component-id="OUIA-Generated-Tabs-21"
885
885
  data-ouia-component-type="PF6/Tabs"
886
886
  data-ouia-safe="true"
887
887
  id="primarieTabs"
@@ -967,7 +967,7 @@ exports[`should render subtabs 1`] = `
967
967
  >
968
968
  <div
969
969
  class="pf-v6-c-tabs pf-m-animate-current pf-m-subtab pf-m-initializing-accent"
970
- data-ouia-component-id="OUIA-Generated-Tabs-17"
970
+ data-ouia-component-id="OUIA-Generated-Tabs-22"
971
971
  data-ouia-component-type="PF6/Tabs"
972
972
  data-ouia-safe="true"
973
973
  id="subtabs"
@@ -1110,7 +1110,7 @@ exports[`should render tabs with eventKey Strings 1`] = `
1110
1110
  <DocumentFragment>
1111
1111
  <div
1112
1112
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1113
- data-ouia-component-id="OUIA-Generated-Tabs-18"
1113
+ data-ouia-component-id="OUIA-Generated-Tabs-23"
1114
1114
  data-ouia-component-type="PF6/Tabs"
1115
1115
  data-ouia-safe="true"
1116
1116
  id="eventKeyTabs"
@@ -1228,7 +1228,7 @@ exports[`should render tabs with no bottom border 1`] = `
1228
1228
  <DocumentFragment>
1229
1229
  <div
1230
1230
  class="pf-v6-c-tabs pf-m-animate-current pf-m-no-border-bottom pf-m-initializing-accent"
1231
- data-ouia-component-id="OUIA-Generated-Tabs-25"
1231
+ data-ouia-component-id="OUIA-Generated-Tabs-30"
1232
1232
  data-ouia-component-type="PF6/Tabs"
1233
1233
  data-ouia-safe="true"
1234
1234
  id="noBottomBorderTabs"
@@ -1345,7 +1345,7 @@ exports[`should render tabs with separate content 1`] = `
1345
1345
  <DocumentFragment>
1346
1346
  <div
1347
1347
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1348
- data-ouia-component-id="OUIA-Generated-Tabs-19"
1348
+ data-ouia-component-id="OUIA-Generated-Tabs-24"
1349
1349
  data-ouia-component-type="PF6/Tabs"
1350
1350
  data-ouia-safe="true"
1351
1351
  id="separateTabs"
@@ -1472,7 +1472,7 @@ exports[`should render uncontrolled tabs 1`] = `
1472
1472
  <DocumentFragment>
1473
1473
  <div
1474
1474
  class="pf-v6-c-tabs pf-m-animate-current pf-m-initializing-accent"
1475
- data-ouia-component-id="OUIA-Generated-Tabs-9"
1475
+ data-ouia-component-id="OUIA-Generated-Tabs-14"
1476
1476
  data-ouia-component-type="PF6/Tabs"
1477
1477
  data-ouia-safe="true"
1478
1478
  style="--pf-v6-c-tabs--link-accent--length: 0px; --pf-v6-c-tabs--link-accent--start: 0px;"
@@ -1630,7 +1630,7 @@ exports[`should render vertical tabs 1`] = `
1630
1630
  <DocumentFragment>
1631
1631
  <div
1632
1632
  class="pf-v6-c-tabs pf-m-animate-current pf-m-vertical pf-m-initializing-accent"
1633
- data-ouia-component-id="OUIA-Generated-Tabs-10"
1633
+ data-ouia-component-id="OUIA-Generated-Tabs-15"
1634
1634
  data-ouia-component-type="PF6/Tabs"
1635
1635
  data-ouia-safe="true"
1636
1636
  id="verticalTabs"