CardServiceLight
Компактная интерактивная строка: иконка + текст + promo tag + кнопка «Избранное» (ArrowRight/Left keyboard nav).
Когда использовать
- Компактные списки сервисов в сайдбаре или меню.
- Строка с иконкой, названием и кнопкой «Избранное».
Установка
pnpm add @cloud-ru/ds-uikit-product-card-predefined
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined'
Примеры использования
Базовый пример
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
export function Basic() {
return <CardServiceLight title='Мой сервис' icon={<PlaceholderSVG size={24} />} />;
}Promo tag
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithPromoTag() {
return <CardServiceLight title='Мой сервис' icon={<PlaceholderSVG size={24} />} promoTag={{ variant: 'preview' }} />;
}Обрезка заголовка
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
const longTitle =
'Очень длинное название сервиса, которое не помещается в одну строку и обрезается через TruncateString';
export function WithTruncate() {
return (
<div style={{ maxWidth: 280 }}>
<CardServiceLight title={longTitle} icon={<PlaceholderSVG size={24} />} truncate={{ title: 1 }} />
</div>
);
}Кнопка «Избранное» (always)
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight, VISIBILITY_STRATEGY } from '@cloud-ru/ds-uikit-product-card-predefined';
import { useState } from 'react';
export function WithFavorite() {
const [isFavorite, setIsFavorite] = useState(false);
return (
<CardServiceLight
title='Мой сервис'
icon={<PlaceholderSVG size={24} />}
actionsVisibility={VISIBILITY_STRATEGY.always}
favorite={{
enabled: true,
checked: isFavorite,
onChange: setIsFavorite,
}}
/>
);
}Кнопка «Избранное» (hover)
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight, VISIBILITY_STRATEGY } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithFavoriteHover() {
return (
<CardServiceLight
title='Мой сервис'
icon={<PlaceholderSVG size={24} />}
actionsVisibility={VISIBILITY_STRATEGY.hover}
favorite={{
enabled: true,
}}
/>
);
}Неактивное состояние
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
export function Disabled() {
return <CardServiceLight title='Мой сервис' icon={<PlaceholderSVG size={24} />} disabled />;
}Обработка клика
Кликов по карточке: 0
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { Typography } from '@cloud-ru/ds-typography';
import { CardServiceLight } 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 }}>
<CardServiceLight title='Мой сервис' icon={<PlaceholderSVG size={24} />} 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 { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
export function PolymorphicLink() {
return (
<CardServiceLight
as='a'
href='https://cloud.ru'
target='_blank'
title='Ссылка-сервис'
icon={<PlaceholderSVG size={24} />}
/>
);
}Видимость действий
Проп карточки actionsVisibility ('hover' по умолчанию) управляет всеми
действиями сразу — тултипом, избранным и кнопкой раскрытия.
Props
Types
Props
CardServiceLightProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
actionsVisibility | "always" | "hover" | 'hover' | no | Формат отображения дополнительных действий: всегда или при наведении и фокусе |
as | ElementType | — | no | Полиморфный элемент: `'button'`, `'a'`, `{Link}` и т.д. |
className | string | — | no | CSS-класс корневого элемента |
data-test-id | string | — | no | Support prop для тестов |
disabled | boolean | false | no | Неактивное состояние |
expandable | { value: boolean; onClick(): void; } | — | no | Настройки кнопки раскрытия |
favorite | FavoriteProps | — | no | Настройки кнопки «Избранное». Keyboard: ArrowRight на карточке → tooltip (если есть) → Favorite; ArrowLeft — в обратном порядке. |
icon | ReactElement<any, string | JSXElementConstructor<any>> | — | no | Иконка сервиса |
innerRef | any | — | no | Ref на реальный DOM-элемент / инстанс |
promoTag | CardPromoTagProps | — | no | Настройки promo tag. При отсутствии не отображается |
title | string | — | yes | Заголовок карточки |
tooltip | Omit<TooltipProps, "size" | "trigger"> | — | no | Подсказка с иконкой «?» рядом с заголовком |
truncate | { title?: number; } | — | no | Настройки обрезки текста заголовка |
Unions
Types
CardServiceLightProps
CardPromoTagProps
FavoriteProps
Unions
VisibilityStrategy
Related props
PolymorphicRef
PromoTagPredefinedBaseProps
TooltipProps
Адаптивность
Desktop-first: раскладку берёт AdaptiveProvider. На mobile:
- у внутреннего
.containerставитсяdata-mobile—min-height40 вместо 32; - кнопки действий рендерятся с размером
sвместоm.
Отдельного пропа раскладки нет; форс — toolbar-global layoutType / вложенный
AdaptiveProvider / withLayoutType.