AiSuggestion

Компонент Suggestion / Simple — pill-чип для AI-сценариев: быстрый выбор подсказки с иконкой и коротким текстом.

Демо

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

  • Подсказки в AI-чате или поиске с генерацией.
  • Быстрые действия рядом с полем ввода (suggested prompts).

Анатомия

Appearance

  • neutral — нейтральная обводка и серый текст (Figma: Primary=Off).
  • primary — акцентная обводка и зелёный текст (Figma: Primary=On).

Size

  • s — компактный размер, 32px по высоте (Figma: Mobile=Off).
  • m — увеличенный размер, 40px по высоте (Figma: Mobile=On).

Состояния hover и focus реализованы через CSS (:hover, :focus-visible), а не через пропы.

Установка

pnpm add @cloud-ru/ds-ai-suggestion
import { AiSuggestionSimple, AiSuggestionParent, APPEARANCE, CHILD_TYPE, SIZE } from '@cloud-ru/ds-ai-suggestion';

Примеры

Базовый

Базовый
tsx
import { AiSuggestionSimple, APPEARANCE, SIZE } from '@cloud-ru/ds-ai-suggestion';
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';

export function Basic() {
  return (
    <AiSuggestionSimple label='Label text' icon={<PlaceholderSVG />} appearance={APPEARANCE.Primary} size={SIZE.M} />
  );
}

AiSuggestionParent

Компонент Suggestion / Parent — триггер с chevron; по клику в одну строку показывает вложенные AiSuggestionSimple и другие AiSuggestionParent (рекурсивно). Список задаётся пропом items. Повторный клик по триггеру сворачивает группу.

  • expanded / onExpandedChange — controlled / uncontrolled раскрытие (без expanded по умолчанию свёрнут).
  • В свёрнутом виде триггер neutral (Figma: Activated=Off), в раскрытом — primary (Activated=On).
  • Вложенные подсказки в items всегда рендерятся как AiSuggestionSimple с appearance="primary"; проп appearance для элементов списка недоступен.
  • Элемент items: без type или type: 'suggestion'AiSuggestionSimple; type: 'parent' → вложенная группа.

Раскрывающаяся группа

Раскрывающаяся группа
tsx
import { AiSuggestionParent, CHILD_TYPE } from '@cloud-ru/ds-ai-suggestion';
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';

export function ParentExpandable() {
  return (
    <AiSuggestionParent
      label='Label text'
      icon={<PlaceholderSVG />}
      items={[
        { label: 'Suggestion 1', icon: <PlaceholderSVG /> },
        { label: 'Suggestion 2' },
        {
          type: CHILD_TYPE.Parent,
          label: 'More',
          icon: <PlaceholderSVG />,
          items: [
            { label: 'Nested A' },
            {
              label: 'More nested',
              items: [{ label: 'Nested B' }, { label: 'Nested C' }],
            },
          ],
        },
      ]}
    />
  );
}

Controlled parent

Controlled parent

Controlled parent
tsx
import { AiSuggestionParent, SIZE } from '@cloud-ru/ds-ai-suggestion';
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { useState } from 'react';

export function ControlledParent() {
  const [expanded, setExpanded] = useState(false);

  return (
    <AiSuggestionParent
      label='Suggested actions'
      icon={<PlaceholderSVG />}
      size={SIZE.S}
      expanded={expanded}
      onExpandedChange={setExpanded}
      items={[{ label: 'Summarize this thread' }, { label: 'Write follow-up email' }, { label: 'Create TODO list' }]}
    />
  );
}

Nested groups

Nested groups

Nested groups
tsx
import { AiSuggestionParent, CHILD_TYPE, SIZE } from '@cloud-ru/ds-ai-suggestion';
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';

export function NestedParent() {
  return (
    <AiSuggestionParent
      label='Label text'
      icon={<PlaceholderSVG />}
      size={SIZE.S}
      items={[
        { label: 'Simple suggestion A' },
        {
          type: CHILD_TYPE.Parent,
          key: 'group-a',
          label: 'Group A',
          icon: <PlaceholderSVG />,
          items: [{ label: 'A 1' }, { label: 'A 2' }],
        },
        {
          type: CHILD_TYPE.Parent,
          key: 'group-b',
          label: 'Group B',
          icon: <PlaceholderSVG />,
          items: [
            { label: 'B 1' },
            {
              type: CHILD_TYPE.Parent,
              key: 'group-b-2',
              label: 'Group B.2',
              icon: <PlaceholderSVG />,
              items: [{ label: 'B 2.1' }],
            },
          ],
        },
      ]}
    />
  );
}

Свойства

AiSuggestionSimple

Types

PropsAiSuggestionSimpleProps
PropTypeDefaultRequiredDescription
appearance"neutral" | "primary"neutralnoВнешний вид (Figma: Primary On/Off)
classNamestringnoДополнительный CSS-класс
data-test-idstringno
disabledbooleanfalsenoБлокирует взаимодействие
iconReactNodenoИконка слева от текста
labelstringLabel textnoТекст подсказки
size"m" | "s"snoРазмер (Figma: Mobile Off → `s`, Mobile On → `m`)

Unions

Types

AiSuggestionSimpleProps

Unions

AiSuggestionParent

Types

PropsAiSuggestionParentInternalProps
PropTypeDefaultRequiredDescription
classNamestringnoДополнительный CSS-класс
data-test-idstringno
defaultExpandedbooleanfalsenoUncontrolled — initial expanded
disabledbooleanfalsenoБлокирует взаимодействие
expandedbooleannoControlled — раскрыт (Figma: Activated=On)
iconReactNodenoИконка слева от текста
itemsAiSuggestionParentItem[][]noВложенные подсказки и группы
labelstringLabel textnoТекст на триггере
onExpandedChange((expanded: boolean) => void)noКолбэк toggle (controlled и uncontrolled)
onItemClick((index: number, event: MouseEvent<HTMLButtonElement, MouseEvent>) => void)noКолбэк клика по вложенной подсказке
shownbooleantruenoРодительская группа раскрыта — управляет видимостью вложенной ветки
size"m" | "s"snoРазмер (Figma: Mobile Off → `s`, Mobile On → `m`)

Unions

Types

AiSuggestionParentInternalProps

Unions

Storybook

Figma