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 badgeЧерез promoBadge в правом верхнем углу отображается промо-бейдж.
Название сервиса
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,
      }}
    />
  );
}

Обрезка заголовка

Обрезка заголовкаtruncate.title ограничивает число строк заголовка через TruncateString.
Очень длинное название сервиса, которое не помещается в одну строку и обрезается через 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>
  );
}

Выбранное состояние

Выбранное состояниеchecked подсвечивает карточку как выбранную.
Название сервиса
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)

Рамка (outline)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)

Кнопка «Избранное» (always)favorite.visibilityStrategy="always" — кнопка видна постоянно; checked и onChange задают controlled-режим.
Название сервиса
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)

Кнопка «Избранное» (hover)favorite.visibilityStrategy="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,
      }}
    />
  );
}

Неактивное состояние

Неактивное состояниеdisabled блокирует взаимодействие с карточкой.
Название сервиса
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 />;
}

Обработка клика

Обработка кликаonClick передаётся в корневой Card — карточка интерактивна по умолчанию.
Название сервиса

Кликов по карточке: 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)

Ссылка (polymorphic)Через as и href карточка рендерится как якорь.
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

PropsCardServiceSmallProps
PropTypeDefaultRequiredDescription
asElementTypenoПолиморфный элемент: `'div'`, `'a'`, `{Link}` и т.д.
checkedbooleannoВыбранное состояние
classNamestringnoCSS-класс корневого элемента
data-test-idstringnoSupport prop для тестов
disabledbooleannoНеактивное состояние
emblemReactElement<any, string | JSXElementConstructor<any>> | { icon: JSXElementConstructor<{ className?: string | undefined; size?: number | undefined; }>; }yesЭмблема: объект с иконкой-компонентом. Принимает `{ icon: JSXElementConstructor }` или произвольный ReactElement.
favorite(FavoriteProps & { visibilityStrategy: "hover" | "always"; })noНастройки кнопки «Избранное». `visibilityStrategy` обязателен.
innerRefanynoRef на реальный DOM-элемент / инстанс
outlinebooleannoРамка вокруг карточки
promoBadgePromoTagPropsnoПромо-тег (бейдж). Тип — `PromoTagProps` из `@cloud-ru/ds-promo-tag`.
titlestringyesЗаголовок карточки
truncate{ title?: number; }noНастройки обрезки заголовка

Types

CardServiceSmallProps

Storybook

Figma