@cloud-ru/ds-ai-suggestion-panel

中文文档
1.0.8发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 3266

Полоса вопросов-подсказок к ассистенту: кнопка Giga, вопросы, «+N» со скрытыми вопросами и кнопка закрытия.

原始使用文档
文档目录15 节
  1. Когда использовать
  2. Анатомия
  3. Size (default s )
  4. Размеры
  5. Состояния вопроса
  6. Перенос в «+N»
  7. Установка
  8. Примеры использования
  9. Базовый
  10. Загрузка ответа
  11. Кнопка закрытия
  12. Props
  13. Смотри также
  14. Адаптивность
  15. Как переопределить

AiSuggestionPanel

@cloud-ru/ds-ai-suggestion-panel — Полоса вопросов-подсказок к ассистенту — кнопка Giga, вопросы, «+N» со скрытыми вопросами и кнопка закрытия.

Полоса коротких вопросов к ассистенту: пользователь задаёт вопрос одним нажатием, компонент сообщает, какой вопрос нажат. Полоса второстепенна на странице — цветной в ней только логотип Giga.

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

  • Рядом с контекстом, по которому ассистент может ответить: алерт, ресурс, страница сервиса.
  • Когда вопросы известны заранее и их немного — до нескольких штук в одну строку.

Когда не нужен:

  • Вопрос нужно ввести свободным текстом:
    • используйте поле запроса @cloud-ru/ds-ai-field-request.
  • Подсказка одна и стоит отдельно от полосы:
    • используйте AiSuggestionSimple из @cloud-ru/ds-ai-suggestion.

Компонент не решает, когда показываться и скрываться, не отправляет вопрос ассистенту и не включает загрузку сам — это делает потребитель.

Анатомия

Слева направо:

  • Кнопка Giga — открывает тултип со ссылкой на документацию ассистента, сообщает о нажатии через onLogoClick.
  • Вопросы — по одному сегменту на элемент items, между сегментами разделители.
  • «+N» — появляется, когда вопросы не помещаются по ширине: открывает список скрытых вопросов.
  • Кнопка закрытия — справа от рамки. Показывается, если передан onClose.

Size (default s)

  • s — высота 32.
  • m — высота 40.

Размеры

import { AiSuggestionPanel, SIZE } from '@cloud-ru/ds-ai-suggestion-panel';

const ITEMS = [
  { value: 'alert-reason', label: 'Почему сработал алерт?' },
  { value: 'vm-traffic', label: 'Где посмотреть трафик ВМ?' },
];

export function Sizes() {
  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 12, alignItems: 'flex-start' }}>
      <AiSuggestionPanel items={ITEMS} size={SIZE.S} />
      <AiSuggestionPanel items={ITEMS} size={SIZE.M} />
    </div>
  );
}

Состояния вопроса

  • disabled — подпись блёклая, нажатие не обрабатывается.
  • loading — после подписи индикатор загрузки, повторное нажатие не обрабатывается.

Hover, pressed и focus реализованы через CSS (:hover, :active, :focus-visible). Кнопка закрытия на устройствах с курсором появляется при наведении на полосу или фокусе внутри неё, на сенсорных устройствах видна всегда.

Перенос в «+N»

Подпись вопроса занимает одну строку и не обрезается. Полоса не переносит сегменты и не прокручивает их: те, что не помещаются в ширину контейнера, уходят в список «+N». Хотя бы один вопрос остаётся в полосе всегда.

Установка

pnpm add @cloud-ru/ds-ai-suggestion-panel
import { AiSuggestionPanel, SIZE } from '@cloud-ru/ds-ai-suggestion-panel';

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

Базовый

Вопросы, которые не помещаются по ширине, уходят в «+N»

import { AiSuggestionPanel } from '@cloud-ru/ds-ai-suggestion-panel';
import { Typography } from '@cloud-ru/ds-typography';
import { useState } from 'react';

const ITEMS = [
  { value: 'alert-reason', label: 'Почему сработал алерт?' },
  { value: 'vm-monitoring', label: 'Как настроить мониторинг всех ВМ?' },
  { value: 'vm-traffic', label: 'Где посмотреть трафик ВМ?' },
  { value: 'alert-vm-off', label: 'Как создать алерт, если ВМ выключена?' },
  { value: 'vm-metrics', label: 'Какие проблемы видны по метрикам ВМ?' },
];

export function Basic() {
  const [selected, setSelected] = useState<string>();
  const selectedLabel = ITEMS.find(item => item.value === selected)?.label;

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 12, alignItems: 'flex-start' }}>
      <AiSuggestionPanel items={ITEMS} onItemClick={setSelected} />
      <Typography variant='body' size='s'>
        {selectedLabel ? `Выбран вопрос: ${selectedLabel}` : 'Нажмите на вопрос'}
      </Typography>
    </div>
  );
}

Загрузка ответа

Нажатый вопрос переходит в loading, пока ассистент отвечает

import { AiSuggestionPanel, AiSuggestionPanelItem } from '@cloud-ru/ds-ai-suggestion-panel';
import { useEffect, useState } from 'react';

const QUESTIONS: AiSuggestionPanelItem[] = [
  { value: 'alert-reason', label: 'Почему сработал алерт?' },
  { value: 'vm-monitoring', label: 'Как настроить мониторинг всех ВМ?' },
  { value: 'vm-traffic', label: 'Где посмотреть трафик ВМ?' },
];

/** Время «ответа ассистента» в демо. */
const ANSWER_DELAY_MS = 2000;

export function LoadingFlow() {
  const [pendingValue, setPendingValue] = useState<string>();

  useEffect(() => {
    if (!pendingValue) return;

    const timer = setTimeout(() => setPendingValue(undefined), ANSWER_DELAY_MS);

    return () => clearTimeout(timer);
  }, [pendingValue]);

  const items = QUESTIONS.map(question => ({ ...question, loading: question.value === pendingValue }));

  return <AiSuggestionPanel items={items} onItemClick={setPendingValue} />;
}

Кнопка закрытия

onClose только сообщает о нажатии — полосу скрывает потребитель

import { AiSuggestionPanel } from '@cloud-ru/ds-ai-suggestion-panel';
import { Button } from '@cloud-ru/ds-button';
import { useState } from 'react';

const ITEMS = [
  { value: 'alert-reason', label: 'Почему сработал алерт?' },
  { value: 'vm-traffic', label: 'Где посмотреть трафик ВМ?' },
];

export function WithClose() {
  const [visible, setVisible] = useState(true);

  if (!visible) {
    return <Button label='Показать подсказки' view='outline' appearance='neutral' onClick={() => setVisible(true)} />;
  }

  return <AiSuggestionPanel items={ITEMS} onClose={() => setVisible(false)} />;
}

Props

AiSuggestionPanelProps

PropTypeDefaultDescription
classNamestring—CSS-класс корня.
data-test-idstring—
docsUrlstringhttps://cloud.ru/docs/ai_assistant_cloudia/ug/indexСсылка «Документация» в тултипе кнопки Giga.
innerRefRef<HTMLDivElement>—Ссылка на корневой элемент.
itemsAiSuggestionPanelItem—Вопросы полосы. Те, что не помещаются по ширине, компонент переносит в сегмент «+N»
со списком.
layoutPresetsAiSuggestionPanelLayoutDefaults | LayoutPresets—Переопределение пресетов раскладки (mobile, desktop, …) для size.
onClose(() => void)—Нажатие на кнопку закрытия. Без колбэка кнопка не показывается. Полосу компонент не скрывает.
onItemClick((value: string) => void)—Нажатие на вопрос — в полосе или в списке «+N».
onLogoClick(() => void)—Нажатие на кнопку Giga.
size"m" | "s"—Размер полосы: s — высота 32, m — высота 40. По умолчанию s, на mobile-раскладке — m.
Явное значение задаёт desktop; mobile переопределяется через layoutPresets.mobile.

AiSuggestionPanelItem

PropTypeDefaultDescription
disabledboolean | undefined—Неактивный вопрос: нажатие не обрабатывается.
labelstring—Текст вопроса. Занимает одну строку и не обрезается.
loadingboolean | undefined—Вопрос отправляется ассистенту: после подписи показывается индикатор загрузки, повторное
нажатие не обрабатывается. Состояние выставляет потребитель.
valuestring—Идентификатор вопроса; приходит в onItemClick.

AiSuggestionPanelLayoutDefaults

PropTypeDefaultDescription
size"m" | "s"—Размер полосы.
  • Size = "m" | "s"

Смотри также

  • @cloud-ru/ds-ai-suggestion — отдельная подсказка-чип и раскрывающаяся группа.
  • @cloud-ru/ds-ai-button-giga — кнопка Giga, из которой собрана ячейка логотипа.

Адаптивность

AiSuggestionPanel — адаптивный компонент класса preset-defaults: DOM один, по раскладке меняются только дефолты пропсов. Раскладку компонент читает из контекста @cloud-ru/ds-adaptive — отдельного пропа layoutType нет.

На mobile полоса размера m и повторяет макет мобильной раскладки: высота 40, подпись 14/20, кнопка Giga 40, кнопка закрытия 32.

Пропdesktopmobile
sizesm

Источник mobile-дефолтов — экспортируемая константа AI_SUGGESTION_PANEL_LAYOUT_PRESETS.

Как переопределить

Приоритет (от высшего к низшему): layoutPresets[layout] (инстанс) → DS-пресет AI_SUGGESTION_PANEL_LAYOUT_PRESETS → явный проп (= desktop-значение) → базовый дефолт.

import { AiSuggestionPanel } from '@cloud-ru/ds-ai-suggestion-panel'

// Явный проп задаёт desktop-значение, на mobile полоса остаётся размера m
<AiSuggestionPanel items={items} size='m' />

// Оставить размер s на mobile
<AiSuggestionPanel items={items} layoutPresets={{ mobile: { size: 's' } }} />

版本与发布记录

@cloud-ru/ds-ai-suggestion-panel 共发布 35 个版本,首次发布于 2026/10/20;过去 12 个月发布了 35 个版本。

版本发布日期距今
1.0.8latest2026/11/11今天
1.0.8-preview-e8fe6b56.0preview2026/11/11今天
1.0.8-preview-c0e895ed.02026/11/11今天
1.0.8-preview-90b10112.02026/11/11今天
1.0.8-preview-fd7dd437.02026/11/101 天前
1.0.8-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-ai-suggestion-panel 的常见问题

@cloud-ru/ds-ai-suggestion-panel 是什么?

Полоса вопросов-подсказок к ассистенту: кнопка Giga, вопросы, «+N» со скрытыми вопросами и кнопка закрытия.

如何安装 @cloud-ru/ds-ai-suggestion-panel?

在项目目录运行 npm install @cloud-ru/ds-ai-suggestion-panel,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-ai-suggestion-panel 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-ai-suggestion-panel 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-ai-suggestion-panel 可以商用吗?

@cloud-ru/ds-ai-suggestion-panel 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-ai-suggestion-panel 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-ai-suggestion-panel 在 2026/10/10 – 2026/11/08 这 30 天内被下载 3,266 次,日均约 109 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-ai-suggestion-panel 还在维护吗?

最新版本 1.0.8 发布于 2026/11/11(今天);至今共发布 35 个版本,其中过去 12 个月发布了 35 个;首次发布于 2026/10/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。