import React from 'react';
import clsx from 'clsx';
/**
* Color variants for the TextCard component
* Maps to Figma design tokens:
* - green: Primary/Green/300 (#21E46B) → $green-300
* - neutral-light: Neutral/200 (#E6EAF0) → $gray-200
* - neutral-dark: Neutral/300 (#CAD4DF) → $gray-300
* - lilac: Primary/Lilac/200 (#D9CAFF) → $lilac-200
*/
export type TextCardColor = 'green' | 'neutral-light' | 'neutral-dark' | 'lilac';
export interface TextCardProps extends React.ComponentPropsWithoutRef<'article'> {
/** Card title text (heading-lg typography) */
title: React.ReactNode;
/** Card description text (body-l typography) */
description?: React.ReactNode;
/** Optional link URL - makes the card clickable */
href?: string;
/** Background color variant */
color?: TextCardColor;
}
/**
* TextCard Component
*
* A card component with a title at the top and description at the bottom.
* Used within the CardsTwoColumn pattern to display content in a 2x2 grid.
*
* Features:
* - 4 color variants: green, neutral-light, neutral-dark, lilac
* - Responsive typography and spacing
* - Title uses heading-lg typography (Tobias Light)
* - Description uses body-l typography (Booton Light)
*
* Responsive behavior:
* - Desktop: 604px × 340px, 24px padding
* - Tablet: Full width × 309px, 20px padding
* - Mobile: Full width × 274px, 16px padding
*
* @example
* ```tsx
*
* ```
*/
export const TextCard = React.forwardRef(
(props, ref) => {
const {
title,
description,
href,
color = 'neutral-light',
className,
...rest
} = props;
const rootClasses = clsx(
'bds-text-card',
`bds-text-card--${color}`,
className
);
const CardWrapper = href ? 'a' : 'article';
const wrapperProps = href
? { href, className: rootClasses, ref: ref as React.Ref }
: { className: rootClasses, ref };
return (
{/* Title at top */}
{title}
{/* Description at bottom */}
{description && (
)}
);
}
);
TextCard.displayName = 'TextCard';
export default TextCard;