import { Card, PolymorphicRef } from '@cloud-ru/ds-card'; import { PromoTag, PromoTagProps } from '@cloud-ru/ds-promo-tag'; import { TruncateString } from '@cloud-ru/ds-truncate-string'; import { Typography } from '@cloud-ru/ds-typography'; import { withInnerRefSupport } from '@cloud-ru/ds-utils'; import cn from 'classnames'; import { ComponentPropsWithoutRef, ElementType, ReactElement } from 'react'; import { CARD_SIZE, CARD_SUGGEST_TRUNCATE_DEFAULTS, TEST_IDS } from '../../constants'; import { CardSize } from '../../types'; import styles from './styles.module.scss'; type BaseCardSuggestProps = { /** Заголовок */ title: string; /** Описание */ content: string; /** * Размер: управляет типографикой и отступами. * `'m'` — roleTitle/m + roleBody/m, padding 16px; * `'s'` — roleTitle/s + roleBody/s, padding 8px. * @default 'm' */ size?: CardSize; /** Настройки обрезки текста */ truncate?: { /** Максимальное количество строк заголовка */ title?: number; /** Максимальное количество строк содержимого */ content?: number; }; /** Неактивное состояние */ disabled?: boolean; /** * Промо-тег. * Используйте `PromoTagProps` из `@cloud-ru/ds-promo-tag`. */ promoBadge?: PromoTagProps; /** CSS-класс корневого элемента */ className?: string; /** Support prop для тестов */ 'data-test-id'?: string; }; export type CardSuggestProps = BaseCardSuggestProps & { /** Полиморфный элемент: `'div'`, `'a'`, `{Link}` и т.д. */ as?: T; /** Ref на реальный DOM-элемент / инстанс */ innerRef?: PolymorphicRef; } & Omit, keyof BaseCardSuggestProps | 'as' | 'ref'>; export function CardSuggest({ title, content, size = CARD_SIZE.M, truncate, disabled, promoBadge, className, as, innerRef, 'data-test-id': dataTestId, ...rest }: CardSuggestProps): ReactElement | null { const truncateLines = { ...CARD_SUGGEST_TRUNCATE_DEFAULTS, ...truncate }; return ( as={as} innerRef={innerRef} disabled={disabled} interactive className={cn(styles.root, className)} data-test-id={dataTestId ?? TEST_IDS.cardSuggest} data-size={size} {...(rest as ComponentPropsWithoutRef)} >
{promoBadge && (
)}
); } withInnerRefSupport(CardSuggest);