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
Мой сервис
New
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { APPEARANCE, ROLE_APPEARANCE, SIZE } from '@cloud-ru/ds-promo-tag';
import { CardServiceLight } from '@cloud-ru/ds-uikit-product-card-predefined';
export function WithPromoTag() {
return (
<CardServiceLight
title='Мой сервис'
icon={<PlaceholderSVG size={24} />}
promoTag={{
label: 'New',
appearance: APPEARANCE.Primary,
role: ROLE_APPEARANCE.Accent,
size: SIZE.Xs,
}}
/>
);
}Обрезка заголовка
Очень длинное название сервиса, которое не помещается в одну строку и обрезается через TruncateString
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} />}
favorite={{
enabled: true,
visibilityStrategy: VISIBILITY_STRATEGY.always,
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} />}
favorite={{
enabled: true,
visibilityStrategy: VISIBILITY_STRATEGY.hover,
}}
/>
);
}Неактивное состояние
Мой сервис
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} />}
/>
);
}Props
Types
Props
CardServiceLightProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
as | ElementType | — | no | Полиморфный элемент: `'button'`, `'a'`, `{Link}` и т.д. |
className | string | — | no | CSS-класс корневого элемента |
data-test-id | string | — | no | Support prop для тестов |
disabled | boolean | — | no | Неактивное состояние |
favorite | FavoriteProps | — | no | Настройки кнопки «Избранное». Keyboard: ArrowRight на карточке → фокус на Favourite; ArrowLeft на Favourite → фокус на карточку. |
icon | ReactElement<any, string | JSXElementConstructor<any>> | — | no | Иконка сервиса |
innerRef | any | — | no | Ref на реальный DOM-элемент / инстанс |
onKeyDown | KeyboardEventHandler<HTMLElement> | — | no | Колбэк нажатия клавиши клавиатуры на карточке |
promoTag | PromoTagProps | — | no | Настройки promo tag. При отсутствии не отображается |
title | string | — | yes | Заголовок карточки |
truncate | { title?: number; } | — | no | Настройки обрезки текста заголовка |