import * as React from 'react'; import { classNames, hasReactNode } from '@vkontakte/vkjs'; import { getFetchPriorityProp } from '../../lib/utils'; import type { HasComponent, HasRef, HasRootRef } from '../../types'; import { Card, type CardProps } from '../Card/Card'; import { Tappable, type TappableOmitProps } from '../Tappable/Tappable'; import { Caption } from '../Typography/Caption/Caption'; import { Footnote } from '../Typography/Footnote/Footnote'; import { Headline } from '../Typography/Headline/Headline'; import { Text } from '../Typography/Text/Text'; import styles from './ContentCard.module.css'; export interface ContentCardProps extends HasRootRef, HasComponent, Omit, Omit, keyof React.HTMLAttributes>, HasRef { /** Текст над заголовком. */ overTitle?: React.ReactNode; /** Заголовок. */ title?: React.ReactNode; /** Позволяет поменять тег используемый для заголовка. */ titleComponent?: React.ElementType; /** Текст. */ description?: React.ReactNode; /** Нижний текст. */ caption?: React.ReactNode; /** Максимальная высота изображения. */ maxHeight?: number; /** * Внешний вид карточки. */ mode?: CardProps['mode']; /** * Пользовательское значения стиля `object-fit` для картинки * Подробнее можно почитать в [документации](https://developer.mozilla.org/ru/docs/Web/CSS/object-fit). */ imageObjectFit?: React.CSSProperties['objectFit']; } /** * @see https://vkui.io/components/content-card */ export const ContentCard = ({ overTitle, title, titleComponent = 'span', description, caption, // card props className, mode = 'shadow', style, getRootRef, // img props getRef, maxHeight, src, srcSet, alt = '', width = '100%', height, crossOrigin, decoding, loading, referrerPolicy, sizes, useMap, fetchPriority, imageObjectFit, hasHover = false, hasActive = false, Component = 'li', ...restProps }: ContentCardProps): React.ReactNode => { return ( {(src || srcSet) && ( {alt} )}
{hasReactNode(overTitle) && ( {overTitle} )} {hasReactNode(title) && ( {title} )} {hasReactNode(description) && {description}} {hasReactNode(caption) && ( {caption} )}
); };