Chat File Card

Плашка файла/артефакта в ленте чата с «пружинной» плиткой-документом, заголовком, подписью и действиями.

Установка

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

Компонент полностью контролируемый и не зависит от типов приложения: иконка передаётся как children, действия — через render={<a href download />} или onClick, а открытие предпросмотра делегируется колбэку onOpen. interactive выводится из onOpen, но его можно переопределить пропом. Жизненный цикл артефакта задаётся пропом status ("idle" | "loading" | "error").

Композиция

  • <ChatFileCard> — корневая плашка. Рендерит невидимую кнопку inset-0 поверх карточки, когда есть onOpen (или interactive), и проставляет data-state, aria-pressed, aria-busy. Пропы status и disabled управляют доступностью открытия.
  • <ChatFileCardIcon> — плитка-«документ» в левом слоте; children — любая иконка. При status="loading" показывает спиннер, при status="error" — предупреждающий значок.
  • <ChatFileCardContent> — колонка текста (усекаемые ChatFileCardTitle / ChatFileCardSubtitle); ChatFileCardActions располагается рядом, как соседний элемент.
  • <ChatFileCardActions> + <ChatFileCardAction> — действия. iconOnly переключает квадрат 32×32 и текстовую кнопку; каждое действие останавливает всплытие, чтобы не сработал onOpen карточки. Действия автоматически блокируются при status="loading" и поддерживают индивидуальный disabled.

Состояния

  • idle — спокойная тёплая подложка (bg-background, в dark — bg-card), плитка слегка наклонена и выглядывает снизу.
  • hover — при наведении плитка выпрямляется и чуть подрастает (cubic-bezier(0,0.9,0.5,1.35)), поверхность поднимается до bg-card (light) / лёгкого осветления (dark), бордер /15 → /30. Только для интерактивных карточек в состоянии idle.
  • open / selectedopen добавляет aria-pressed, бордер border-foreground/30 и bg-muted/30; перекрывает ховер.
  • loading / streamingstatus="loading" ставит aria-busy, заменяет иконку спиннером, блокирует open-кнопку и все действия, пока файл генерируется.
  • errorstatus="error" показывает предупреждающий значок, деструктивный бордер и подложку, и отключает ховер; действие-ретрай остаётся доступным.
  • disableddisabled (или status="loading") отключает open-кнопку; disabled на ChatFileCardAction отключает отдельное действие.
  • non-interactive — без onOpen (или interactive={false}) нет inset-кнопки, курсора-указателя и подъёма поверхности — статичный display-only чип.
  • actions — одно иконочное действие (iconOnly), текстовая кнопка (например «Save skill»), несколько действий или совсем без действий.
  • truncation — длинные заголовок и подпись усекаются в одну строку с многоточием; title даёт нативный тултип.
  • focus-visible — кольцо фокуса (focus-visible:ring-inset, чтобы не обрезалось overflow-hidden карточки) на inset open-кнопке и на каждом действии при навигации с клавиатуры.

Открыта / выбрана

Загрузка

Ошибка

Усечение текста

Неинтерактивная

Oracul DS

Built for the future of AI-driven interfaces.