import * as React from 'react'; import * as PropTypes from 'prop-types'; // @ts-ignore import ConditionalWrap from 'conditional-wrap'; // @ts-ignore import { useUniqueId } from '../uniqueId'; import CardCard, { LocalCardCardProps, CardCardProps, cardCardPropTypes, cardCardDefaultProps } from './CardCard'; import CardContent, { CardContentProps } from './CardContent'; import CardHeader, { CardHeaderProps } from './CardHeader'; import CardFooter, { CardFooterProps } from './CardFooter'; import CardTitle, { CardTitleProps } from './CardTitle'; export type LocalCardProps = LocalCardCardProps & { a11yDescriptionId?: string; a11yTitleId?: string; children: React.ReactNode; className?: string; footer?: string | React.ReactElement; headerActions?: React.ReactElement; isFullWidth?: boolean; title?: string | React.ReactElement; }; export type CardProps = CardCardProps & LocalCardProps; export type CardComponents = { Card: React.FunctionComponent; Header: React.FunctionComponent; Content: React.FunctionComponent; Footer: React.FunctionComponent; Title: React.FunctionComponent; }; export const Card: React.FunctionComponent & CardComponents = ({ a11yDescriptionId: _a11yDescriptionId, a11yTitleId: _a11yTitleId, children, footer, headerActions, title, ...props }) => { const titleId = useUniqueId('Card'); const descriptionId = useUniqueId('Card'); const a11yDescriptionId = _a11yDescriptionId || descriptionId; const a11yTitleId = _a11yTitleId || titleId; return ( {title && ( {typeof title === 'string' ? {title} : title} {headerActions &&
{headerActions}
}
)} {children}} > {children} {footer && {footer}}
); }; Card.Card = CardCard; Card.Header = CardHeader; Card.Content = CardContent; Card.Footer = CardFooter; Card.Title = CardTitle; export const cardPropTypes = { ...cardCardPropTypes, a11yDescriptionId: PropTypes.string, a11yTitleId: PropTypes.string, children: PropTypes.node.isRequired, className: PropTypes.string, footer: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), headerActions: PropTypes.element, isFullWidth: PropTypes.bool, title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]) }; Card.propTypes = cardPropTypes; export const cardDefaultProps = { ...cardCardDefaultProps, a11yDescriptionId: undefined, a11yTitleId: undefined, className: undefined, footer: undefined, headerActions: undefined, isFullWidth: false, title: undefined }; Card.defaultProps = cardDefaultProps; // @ts-ignore const C: React.FunctionComponent & CardComponents = Card; export default C;