Chat Artifact

Surface'ы артефактов чата — side-panel контейнер (header/actions) и borderless inline-хост живого артефакта прямо в потоке.

Установка

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

Panel — side-panel контейнер

Claude-style однострочная шапка — ChatArtifactInfo orientation="inline" ставит заголовок и тип-тег на одну baseline-линию (Title · Type), а паттерн «скачать» собирается из Menu + MenuTrigger, отрендеренного как ChatArtifactAction.

Inline — живой артефакт в потоке

ChatArtifactInline — borderless, прозрачный, без тени и padding: подложку рисует САМ артефакт. Контролы () скрыты по умолчанию и проявляются по ховеру обёртки, остаются видимы при открытом меню. Во время status="streaming" контролы подавляются.

Error boundary — логика приложения; DS отдаёт только визуальный fallback ChatArtifactInlineFallback, который приложение передаёт boundary как fallback.

Живая панель (ArtifactPreviewPanel) переопределяет стилевой дефолт ChatArtifact через className="rounded-none border-0 bg-transparent shadow-none" — оболочка снимает карточную поверхность, чтобы хостовая панель сама задавала рамки.

Card — артефакт-чип в ленте

ChatArtifactCard — встраиваемый в ленту чип артефакта: document-tile «выглядывает» из левого слота и распрямляется по spring-ховеру, вся карточка кликабельна и открывает артефакт в панели через onOpen. Глиф-«вид» (Code2, BarChart3…) — child, подпись — строка Title · Type, действия скачать / открыть — ChatArtifactCardAction (link или onClick, всегда останавливают всплытие, чтобы не триггерить открытие). 1:1 с паттерном ChatFileCard.

status ведёт жизненный цикл чипа: "loading" ставит aria-busy, блокирует открытие и меняет глиф на спиннер; "error" подсвечивает сбой генерации (destructive-рамка + warning-глиф).

API

Семейство Panel

Семейство Inline

Семейство Card

Состояния

Panel

  • default — стилевая карточка rounded-lg border bg-card shadow-sm.
  • full-bleedrounded-none border-0 bg-transparent shadow-none (живая панель).
  • header: stacked / inlineChatArtifactInfo orientation переключает заголовок над подписью ↔ однострочный Title · Type.
  • header: with-back / with-toggle — ведущая Back-кнопка и сегментированный Preview/Code-тоггл собираются в левый слот шапки потребителем.
  • action: idle / copy → copiedCopyIcon ↔ CheckIcon, возврат ~1.6 c; download-menu — ghost icon-кнопка как MenuTrigger.

Inline

  • idle / hover — контролы скрыты (opacity-0), проявляются по group-hover/inline.
  • menu-open остаётся видим через has-[[data-popup-open]].
  • streaming — контролы подавлены, пока артефакт собирается.
  • host: auto / fixed — авто-высота с clip rounded-[10px] ↔ фикс-окно прокрутки.
  • errorChatArtifactInlineFallback с опциональной ссылкой «Открыть в панели».

Card

  • idle — хайрлайн-рамка (border-foreground/15), document-tile выглядывает из левого слота.
  • hover — spring-распрямление тайла (ease-[cubic-bezier(0,0.9,0.5,1.35)]), hover:border-foreground/30.
  • open — выбранная поверхность border-foreground/30 bg-muted/30, aria-pressed.
  • loadingaria-busy, спиннер вместо глифа, открытие заблокировано.
  • errorborder-destructive/40 bg-destructive/[0.03] + warning-глиф.

Все цвета — семантические токены (bg-card/bg-muted/bg-popover, bg-secondary/hover:bg-accent, text-muted-foreground, border). rounded-[10px] и h-[min(640px,70vh)] — замеренная под claude геометрия inline-хоста. Разрешение копируемого текста, построение download-URL и error boundary остаются в приложении — DS принимает только onCopy/onDownload и визуальный fallback.

Oracul DS

Built for the future of AI-driven interfaces.