PromoTag

Компактный цветной тег для маркетинговых подписей (NEW, SALE, BETA), категорий и акцентных меток. По умолчанию — <div>; при onClick<button>; при as='a' или as={Link} — ссылка с пробросом href / to.

Демо

Preview
Promo tag
Prop
Type
Value
appearance
neutral | primary | red | orange | yellow | green | blue | violet | pink
data-test-id
text
label
text
roleAppearance
accent | decor
size
xs | s | m
Code
<PromoTag appearance="primary" roleAppearance="accent" size="xs" label="Promo tag" />

Когда использовать

  • Пометка карточки товара/услуги — новинка, скидка, хит.
  • Цветовая категоризация в списках (темы, теги статей).
  • Статусная метка, которая не несёт функциональной семантики (для статусов берите Status).

Когда не нужен: интерактивные chip’ы с удалением — берите Chip/Tag; функциональные статусы — берите Status.

Анатомия

Appearance

Цветовая палитра: primary — брендовый акцент, neutral — без окраски; red, orange, yellow, green, blue, violet, pink — декоративные категории.

Size

xs — плотные ленты/карточки; s — дефолт; m — для крупных промо-блоков.

Role appearance (default accent)

Роль, в которой применяется выбранный appearance:

  • accent — насыщенная заливка, для главных меток (новинка, sale).
  • decor — мягкая декоративная подложка, для категоризации и тегов.

Установка

pnpm add @cloud-ru/ds-promo-tag
import { PromoTag } from '@cloud-ru/ds-promo-tag'

Примеры использования

Базовый тег

Базовый тег
NEW
tsx
import { PromoTag } from '@cloud-ru/ds-promo-tag';

export function Basic() {
  return <PromoTag label='NEW' appearance='primary' roleAppearance='accent' />;
}

Палитра

ПалитраОсновные цветовые appearance.
Primary
Green
Red
Violet
tsx
import { PromoTag } from '@cloud-ru/ds-promo-tag';

export function Colors() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <PromoTag label='Primary' appearance='primary' />
      <PromoTag label='Green' appearance='green' />
      <PromoTag label='Red' appearance='red' />
      <PromoTag label='Violet' appearance='violet' />
    </div>
  );
}

Кликабельный тег

Кликабельный тегПередайте onClick — компонент отрендерится как <button>.
tsx
import { PromoTag } from '@cloud-ru/ds-promo-tag';
import { useState } from 'react';

export function Clickable() {
  const [clicked, setClicked] = useState(false);

  return <PromoTag label={clicked ? 'Нажато' : 'Кликабельный'} appearance='blue' onClick={() => setClicked(true)} />;
}

Polymorphic

Polymorphicas='a' с href или as={Link} с to — для react-router-dom и внешних ссылок.
tsx
import { APPEARANCE, PromoTag, ROLE_APPEARANCE } from '@cloud-ru/ds-promo-tag';
import { ComponentPropsWithoutRef, forwardRef } from 'react';

type MockLinkProps = Omit<ComponentPropsWithoutRef<'a'>, 'href'> & { to: string };

const MockLink = forwardRef<HTMLAnchorElement, MockLinkProps>(({ to, onClick, children, ...rest }, ref) => (
  <a ref={ref} href={to} onClick={onClick} {...rest}>
    {children}
  </a>
));
MockLink.displayName = 'MockLink';

export function Polymorphic() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <PromoTag
        as='a'
        href='https://example.com'
        target='_blank'
        label='External promo'
        appearance={APPEARANCE.Blue}
        roleAppearance={ROLE_APPEARANCE.Decor}
      />
      <PromoTag
        as={MockLink}
        to='https://example.com'
        label='Preview link'
        appearance={APPEARANCE.Primary}
        roleAppearance={ROLE_APPEARANCE.Accent}
      />
    </div>
  );
}

Props

Types

PropsPromoTagProps
PropTypeDefaultRequiredDescription
afterContentReactNodenullnoКонтент после текста
appearance"blue" | "green" | "neutral" | "orange" | "pink" | "primary" | "red" | "violet" | "yellow"primarynoВнешний вид
asElementTypenoЭлемент или компонент для рендера: 'button' | 'a' | Link из react-router-dom и т.п.
beforeContentReactNodenullnoКонтент перед текстом
classNamestringnoCSS-класс
data-test-idstringno
innerRefanynoRef на реальный DOM-элемент/инстанс, который рендерится через `as`. Явный проп вместо forwardRef — как в Button и AiToolBadge.
labelstringnoТекст компонента
onClickMouseEventHandler<HTMLElement>noКолбэк для обработки клика на тег
roleAppearance"accent" | "decor"accentnoРоль, в которой применяется `appearance`: акцентная заливка или декоративная
size"m" | "s" | "xs"snoРазмер

Unions

Types

PromoTagProps

Unions

Storybook

Figma