Skip to content

Commit 6e7a466

Browse files
author
Your Name
committed
2 parents 3876c12 + c737057 commit 6e7a466

File tree

4 files changed

+68
-35
lines changed

4 files changed

+68
-35
lines changed

packages/components/src/core/ContentCard/ContentCard.types.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { CardProps } from "@mui/material";
22
import { SdsMinimalButtonProps } from "../Button";
3+
import { ReactNode } from "react";
34

4-
interface BaseContentCardProps extends CardProps {
5+
export interface BaseContentCardProps extends CardProps {
56
sdsType?: "wide" | "narrow";
6-
overlineText?: string;
7-
titleText?: string;
8-
subtitleText?: string;
9-
metadataText?: string;
7+
overlineText?: ReactNode;
8+
titleText?: ReactNode;
9+
subtitleText?: ReactNode;
10+
metadataText?: ReactNode;
1011
boundingBox?: boolean;
1112
decorativeBorder?: boolean;
12-
children?: React.ReactNode;
13+
children?: ReactNode;
1314
clickableCard?: boolean;
1415
clickableCardProps?: Partial<SdsMinimalButtonProps>;
1516
buttonsPosition?: "left" | "right";
@@ -29,7 +30,7 @@ interface BaseContentCardProps extends CardProps {
2930

3031
export interface ImageContentCardProps extends BaseContentCardProps {
3132
visualElementType: "image";
32-
image?: React.ReactNode;
33+
image?: ReactNode;
3334
imagePosition?: "left" | "right";
3435
imagePadding?: boolean;
3536
imageSize?: number;
@@ -38,7 +39,7 @@ export interface ImageContentCardProps extends BaseContentCardProps {
3839

3940
export interface IconContentCardProps extends BaseContentCardProps {
4041
visualElementType: "icon";
41-
icon?: React.ReactNode;
42+
icon?: ReactNode;
4243
image?: never;
4344
imageSize?: never;
4445
imagePosition?: never;

packages/components/src/core/ContentCard/__tests__/index.test.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,13 @@ describe("ContentCard", () => {
128128
render(<Test sdsType="narrow" />);
129129
expect(screen.getByTestId(CONTENT_CARD_TEST_ID)).toBeInTheDocument();
130130
});
131+
132+
it("renders content card with ReactNode as titleText", () => {
133+
const CustomTitle = () => (
134+
<span data-testid="custom-title">Custom Title</span>
135+
);
136+
render(<Test titleText={<CustomTitle />} />);
137+
expect(screen.getByTestId("custom-title")).toBeInTheDocument();
138+
expect(screen.getByText("Custom Title")).toBeInTheDocument();
139+
});
131140
});

packages/components/src/core/ContentCard/components/ContentCardTitle/index.tsx

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { forwardRef } from "react";
1+
import { forwardRef, ReactNode } from "react";
22
import {
33
StyledOverlineText,
44
StyledTitleText,
@@ -7,12 +7,13 @@ import {
77
StyledTitleWrapper,
88
} from "./style";
99
import { EMPTY_OBJECT } from "src/common/utils";
10+
import { BaseContentCardProps } from "../../ContentCard.types";
1011

11-
export interface ContentCardTitleProps {
12-
overlineText?: string;
13-
titleText?: string;
14-
subtitleText?: string;
15-
metadataText?: string;
12+
export interface ContentCardTitleProps
13+
extends Pick<
14+
BaseContentCardProps,
15+
"overlineText" | "titleText" | "subtitleText" | "metadataText"
16+
> {
1617
classes?: {
1718
cardHeader?: string;
1819
cardOverline?: string;
@@ -22,9 +23,35 @@ export interface ContentCardTitleProps {
2223
};
2324
}
2425

25-
/**
26-
* @see https://mui.com/material-ui/react-dialog/
27-
*/
26+
interface TextComponentProps {
27+
text: string | ReactNode;
28+
className?: string;
29+
}
30+
31+
type StyledTextComponentProps = {
32+
className?: string;
33+
children: ReactNode;
34+
};
35+
36+
const createTextComponent = (
37+
StyledComponent: React.ComponentType<StyledTextComponentProps>
38+
) => {
39+
return ({ text, className }: TextComponentProps) => {
40+
if (!text) return null;
41+
42+
return typeof text === "string" ? (
43+
<StyledComponent className={className}>{text}</StyledComponent>
44+
) : (
45+
text
46+
);
47+
};
48+
};
49+
50+
const OverlineText = createTextComponent(StyledOverlineText);
51+
const TitleText = createTextComponent(StyledTitleText);
52+
const SubtitleText = createTextComponent(StyledSubtitleText);
53+
const MetadataText = createTextComponent(StyledMetadataText);
54+
2855
const ContentCardTitle = forwardRef<HTMLDivElement, ContentCardTitleProps>(
2956
function ContentCardTitle(props: ContentCardTitleProps, ref): JSX.Element {
3057
const {
@@ -46,25 +73,11 @@ const ContentCardTitle = forwardRef<HTMLDivElement, ContentCardTitleProps>(
4673
return (
4774
<div ref={ref}>
4875
<StyledTitleWrapper className={cardHeader}>
49-
{overlineText && (
50-
<StyledOverlineText className={cardOverline}>
51-
{overlineText}
52-
</StyledOverlineText>
53-
)}
54-
{titleText && (
55-
<StyledTitleText className={cardTitle}>{titleText}</StyledTitleText>
56-
)}
57-
{subtitleText && (
58-
<StyledSubtitleText className={cardSubtitle}>
59-
{subtitleText}
60-
</StyledSubtitleText>
61-
)}
76+
<OverlineText text={overlineText} className={cardOverline} />
77+
<TitleText text={titleText} className={cardTitle} />
78+
<SubtitleText text={subtitleText} className={cardSubtitle} />
6279
</StyledTitleWrapper>
63-
{metadataText && (
64-
<StyledMetadataText className={cardMetadata}>
65-
{metadataText}
66-
</StyledMetadataText>
67-
)}
80+
<MetadataText text={metadataText} className={cardMetadata} />
6881
</div>
6982
);
7083
}

packages/components/src/core/ContentCard/index.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,21 @@ import {
2222
CONTENT_CARD_WIDE_TYPE_MIN_WIDTH_LOW_BOUNDARY,
2323
ContentCardProps,
2424
} from "./ContentCard.types";
25+
import {
26+
StyledTitleText,
27+
StyledSubtitleText,
28+
StyledMetadataText,
29+
StyledOverlineText,
30+
} from "./components/ContentCardTitle/style";
2531

2632
export {
2733
ContentCardActions,
2834
StyledContentCardBody as ContentCardBody,
2935
CardMedia as ContentCardMedia,
36+
StyledTitleText as ContentCardTitle,
37+
StyledSubtitleText as ContentCardSubtitle,
38+
StyledMetadataText as ContentCardMetadata,
39+
StyledOverlineText as ContentCardOverline,
3040
};
3141

3242
export type {

0 commit comments

Comments
 (0)