CardServiceSmall
Компактная интерактивная строка: эмблема + заголовок + promo badge + кнопка «Избранное».
Установка
pnpm add @cloud-ru/ds-uikit-product-card-predefined
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined'
Примеры использования
Базовый пример
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function Basic() {
return <CardServiceSmall title='Название сервиса' emblem={{ icon: PlaceholderSVG }} />;
}Promo badge
Название сервиса
Promo Tag
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { APPEARANCE, ROLE_APPEARANCE, SIZE } from '@cloud-ru/ds-promo-tag';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithPromoTag() {
return (
<CardServiceSmall
title='Название сервиса'
emblem={{ icon: PlaceholderSVG }}
promoBadge={{
label: 'Promo Tag',
appearance: APPEARANCE.Primary,
role: ROLE_APPEARANCE.Accent,
size: SIZE.Xs,
}}
/>
);
}Обрезка заголовка
Очень длинное название сервиса, которое не помещается в одну строку и обрезается через TruncateString
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
const longTitle =
'Очень длинное название сервиса, которое не помещается в одну строку и обрезается через TruncateString';
export function WithTruncate() {
return (
<div style={{ maxWidth: 280 }}>
<CardServiceSmall title={longTitle} emblem={{ icon: PlaceholderSVG }} truncate={{ title: 1 }} />
</div>
);
}Выбранное состояние
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithChecked() {
return <CardServiceSmall title='Название сервиса' emblem={{ icon: PlaceholderSVG }} checked />;
}Рамка (outline)
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithOutline() {
return <CardServiceSmall title='Название сервиса' emblem={{ icon: PlaceholderSVG }} outline />;
}Кнопка «Избранное» (always)
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall, VISIBILITY_STRATEGY } from '@cloud-ru/ds-uikit-product-card-predefined';
import { useState } from 'react';
export function WithFavorite() {
const [isFavorite, setIsFavorite] = useState(false);
return (
<CardServiceSmall
title='Название сервиса'
emblem={{ icon: PlaceholderSVG }}
favorite={{
enabled: true,
visibilityStrategy: VISIBILITY_STRATEGY.always,
checked: isFavorite,
onChange: setIsFavorite,
}}
/>
);
}Кнопка «Избранное» (hover)
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall, VISIBILITY_STRATEGY } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithFavoriteHover() {
return (
<CardServiceSmall
title='Название сервиса'
emblem={{ icon: PlaceholderSVG }}
favorite={{
enabled: true,
visibilityStrategy: VISIBILITY_STRATEGY.hover,
}}
/>
);
}Неактивное состояние
Название сервиса
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function Disabled() {
return <CardServiceSmall title='Название сервиса' emblem={{ icon: PlaceholderSVG }} disabled />;
}Обработка клика
Название сервиса
Кликов по карточке: 0
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { Typography } from '@cloud-ru/ds-typography';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
import { useState } from 'react';
export function WithOnClick() {
const [clicks, setClicks] = useState(0);
return (
<div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
<CardServiceSmall
title='Название сервиса'
emblem={{ icon: PlaceholderSVG }}
onClick={() => setClicks(c => c + 1)}
/>
<Typography variant='body' size='m'>
Кликов по карточке: {clicks}
</Typography>
</div>
);
}Ссылка (polymorphic)
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceSmall } from '@cloud-ru/ds-uikit-product-card-predefined';
export function PolymorphicLink() {
return (
<CardServiceSmall
as='a'
href='https://cloud.ru'
target='_blank'
title='Ссылка-сервис'
emblem={{ icon: PlaceholderSVG }}
/>
);
}Props
Types
Props
CardServiceSmallProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
as | ElementType | — | no | Полиморфный элемент: `'div'`, `'a'`, `{Link}` и т.д. |
checked | boolean | — | no | Выбранное состояние |
className | string | — | no | CSS-класс корневого элемента |
data-test-id | string | — | no | Support prop для тестов |
disabled | boolean | — | no | Неактивное состояние |
emblem | ReactElement<any, string | JSXElementConstructor<any>> | { icon: JSXElementConstructor<{ className?: string | undefined; size?: number | undefined; }>; } | — | yes | Эмблема: объект с иконкой-компонентом. Принимает `{ icon: JSXElementConstructor }` или произвольный ReactElement. |
favorite | (FavoriteProps & { visibilityStrategy: "hover" | "always"; }) | — | no | Настройки кнопки «Избранное». `visibilityStrategy` обязателен. |
innerRef | any | — | no | Ref на реальный DOM-элемент / инстанс |
outline | boolean | — | no | Рамка вокруг карточки |
promoBadge | PromoTagProps | — | no | Промо-тег (бейдж). Тип — `PromoTagProps` из `@cloud-ru/ds-promo-tag`. |
title | string | — | yes | Заголовок карточки |
truncate | { title?: number; } | — | no | Настройки обрезки заголовка |