Chat Prompt Input

Композер чата — обёртка с авторастущим textarea, панелью инструментов, кластером инструментов, кнопкой отправки/остановки, триггером вложений, выбором модели и чипом исследования.

Установка

Использование

Вложения внутри композера

Черновые вложения живут внутри скруглённой оболочки композера, над textarea — 1:1 с фронтендом. Оберните плитки в ChatPromptInputAttachments и поставьте его первым дочерним элементом <ChatPromptInput>: форма сама задаёт p-3.5 оболочки и gap-3 до textarea, так что обёртка — это просто ряд flex flex-wrap gap-3. Плитки — из @oracul/chat-attachments (крестик удаления -top-2 -left-2 появляется при наведении).

Полный композер с меню

ChatPromptInputMenuTrigger и ChatPromptInputModelTrigger — это универсальные оболочки-триггеры: содержимое меню (модели, навыки, коннекторы, переключатели) потребитель собирает сам через @oracul/menu. Триггеры только задают форму кнопок. Правый кластер (выбор модели + отправка) оборачивается в <div className="flex items-center gap-2"> — асимметричный отступ намеренный, отдельного примитива для него нет.

Режим исследования

ChatPromptInputResearchChip показывается только когда режим активен. В покое — только иконка 28×28; при наведении расширяется до пилюли с лейблом и крестиком удаления. Активация чипа вызывает onRemove. Переключатели режимов собираются через MenuCheckboxItem variant="switch".

Полный композер (навыки, коннекторы, усилие, модели)

Самый близкий к рабочей странице вариант: меню + с подменю Навыки / Коннекторы (MenuSubTrigger), листовыми пунктами и тумблерами Исследование / Веб-поиск; выбор модели с двухстрочными строками ChatPromptInputModelRow (имя + слоган + галочка), подменю Усилие с уровнями, бейджем ChatPromptInputDefaultBadge и подсказкой для максимального уровня, тумблером Мышление, подменю Больше моделей; и ChatPromptInputDisclaimer в подвале.

Подсветка команд и коннекторов

Вместо ChatPromptInputTextarea можно использовать SlashHighlightedTextarea — реальный композер чата: /команды и @коннекторы подсвечиваются, при наведении показывают карточку (ChatTokenChip → описание + тип), а по клику открывают модалку. Подсвечиваются только реальные токены из commands / connectors.

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

Все состояния ChatPromptInputSubmit рядом плюс демо авто-роста textarea.

Поведение

  • Enter — отправка формы.
  • Shift + Enter — новая строка.
  • Textarea авто-растёт от minHeight=48 до maxHeight=200 (настраивается через props).
  • После отправки поле ввода очищается и снова получает фокус.
  • Фокус-кольцо живёт на обёртке формы (focus-within), а не на самом textarea.
  • elevation управляет глубиной тени: raised (новый чат, 0 4px 20px) по умолчанию, flat (внутри чата, 0 2px 10px).

Состояния

ChatPromptInputSubmit

  • ready / error — вариант default (primary), иконка ArrowUp, rounded-full, 32×32.
  • streaming / submitted — вариант outline (плоский), иконка остановки Square.
  • disableddisabled (например !isGenerating && !canSend) даёт opacity-64 + pointer-events-none.
  • status всегда проброшен в data-status (включая error, чьи визуалы совпадают с ready).

ChatPromptInputModelTrigger

  • rest / hover — ghost-кнопка, при наведении bg-accent; open управляется меню.
  • with-suffixsuffix рендерится приглушённым font-normal спаном (усилие / extended).
  • showChevron (по умолчанию true) добавляет ChevronDown с opacity-60.

ChatPromptInputResearchChip

  • rest — только иконка 28×28, bg-info/10, text-info-foreground.
  • hoverbg-info/15, расширяется до авто-ширины, показывает лейбл и крестик удаления (когда задан onRemove).
  • focus-visiblering-2 ring-ring.
  • tone (enum, по умолчанию info) сохраняет компонент переиспользуемым.

ChatPromptInputMenuTrigger / ChatPromptInputAttachmentTrigger

  • rest / hover / open — ghost icon-sm 28×28. MenuTrigger — для меню вложений, AttachmentTrigger — для прямого выбора файла (скрытый <input type="file">).

ChatPromptInputModelRow

  • restMenuItem с раскладкой grid-cols-[1fr_auto]: имя слева, завершающая колонка справа.
  • selected — завершающий Check !size-5 text-info.
  • unselected — спейсер size-3.5 вместо галочки (строки выровнены).
  • inline — двухстрочная раскладка: имя text-foreground + слоган text-xs приглушённый (pb-[7.5px]).
  • highlighteddata-highlighted bg-accent (наследуется от MenuItem).

ChatPromptInputDefaultBadge

  • Тонкая обёртка над Badge (size="sm", variant="secondary"). Универсальный лейбл — работает для любой пилюли «default» (По умолчанию).

ChatPromptInputDisclaimer

  • Центрированный приглушённый <p> text-xs. Позиционирование (рабочее absolute bottom-4) намеренно отброшено — это забота потребителя, отвечающего за раскладку.

API

Oracul DS

Built for the future of AI-driven interfaces.