{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "chat-empty-state",
  "title": "Chat Empty State",
  "description": "A first-run greeting with staggered suggestion chips.",
  "dependencies": [
    "lucide-react"
  ],
  "files": [
    {
      "path": "components/spectrumui/blocks/ai-assistants/chat-empty-state.tsx",
      "content": "'use client';\n\nimport { Sparkles } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport type { SuggestedPrompt } from './types';\n\nconst KEYFRAMES = `\n@keyframes su-msg-in { from { opacity: 0; transform: translateY(6px) } to { opacity: 1; transform: none } }\n`;\n\nexport type ChatEmptyStateVariant = 'Default' | 'Centered';\n\nexport interface ChatEmptyStateProps {\n  title?: string;\n  subtitle?: string;\n  prompts?: SuggestedPrompt[];\n  onSelectPrompt?: (prompt: SuggestedPrompt) => void;\n  variant?: ChatEmptyStateVariant;\n  className?: string;\n}\n\nexport function ChatEmptyState({\n  title = 'What do you want to know?',\n  subtitle = 'Ask a question, or start from one of these.',\n  prompts = [],\n  onSelectPrompt,\n  variant = 'Default',\n  className,\n}: ChatEmptyStateProps) {\n  const centered = variant === 'Centered';\n\n  return (\n    <div\n      className={cn(\n        'w-full max-w-[520px]',\n        centered && 'flex flex-col items-center text-center',\n        className,\n      )}\n    >\n      <style dangerouslySetInnerHTML={{ __html: KEYFRAMES }} />\n\n      <div className=\"grid size-9 place-items-center rounded-xl border border-black/[0.07] bg-black/[0.02] dark:border-white/[0.08] dark:bg-white/[0.04]\">\n        <Sparkles className=\"size-4 text-neutral-500 dark:text-neutral-400\" />\n      </div>\n\n      <h3 className=\"mt-4 text-[16px] font-semibold tracking-[-0.2px] text-neutral-900 dark:text-neutral-50\">\n        {title}\n      </h3>\n      <p className=\"mt-1.5 text-[13px] leading-[1.6] text-neutral-500 dark:text-neutral-400\">\n        {subtitle}\n      </p>\n\n      {prompts.length > 0 && (\n        <div\n          className={cn(\n            'mt-5 flex flex-wrap gap-1.5',\n            centered && 'justify-center',\n          )}\n        >\n          {prompts.map((prompt, index) => (\n            <button\n              key={prompt.id}\n              type=\"button\"\n              onClick={() => onSelectPrompt?.(prompt)}\n              style={{ animationDelay: `${Math.min(index, 5) * 50}ms` }}\n              className={cn(\n                'rounded-full border border-black/[0.08] bg-white px-3 py-1.5 text-[12.5px] text-neutral-600',\n                'transition-[color,border-color,transform] duration-150 active:scale-[0.96]',\n                'hover:border-black/[0.16] hover:bg-black/[0.02] hover:text-neutral-900',\n                'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-neutral-400',\n                'motion-safe:animate-[su-msg-in_240ms_cubic-bezier(0.23,1,0.32,1)_both]',\n                'dark:border-white/[0.1] dark:bg-white/[0.03] dark:text-neutral-300 dark:hover:border-white/[0.2] dark:hover:bg-white/[0.06] dark:hover:text-neutral-50',\n              )}\n            >\n              {prompt.label}\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport default ChatEmptyState;\n",
      "type": "registry:block",
      "target": "components/spectrumui/blocks/ai-assistants/chat-empty-state.tsx"
    },
    {
      "path": "components/spectrumui/blocks/ai-assistants/types.ts",
      "content": "export type MessageRole = 'user' | 'assistant' | 'system';\n\nexport type MessageState = 'streaming' | 'complete' | 'error';\n\nexport interface Attachment {\n  id: string;\n  name: string;\n  size: number;\n  type: string;\n  url?: string;\n  previewUrl?: string;\n}\n\nexport interface Citation {\n  id: string;\n  index: number;\n  url: string;\n  title: string;\n  snippet?: string;\n  favicon?: string;\n}\n\nexport type ToolCallStatus = 'pending' | 'running' | 'success' | 'error' | 'cancelled';\n\nexport interface ToolCall {\n  id: string;\n  name: string;\n  args?: Record<string, unknown>;\n  result?: string;\n  status: ToolCallStatus;\n  startedAt?: number;\n  completedAt?: number;\n  children?: ToolCall[];\n  parallel?: boolean;\n}\n\nexport interface ReasoningStep {\n  id: string;\n  content: string;\n}\n\nexport interface Reasoning {\n  steps: ReasoningStep[];\n  status: 'thinking' | 'complete';\n  durationMs?: number;\n}\n\nexport interface Message {\n  id: string;\n  role: MessageRole;\n  content: string;\n  createdAt?: number;\n  state?: MessageState;\n  attachments?: Attachment[];\n  citations?: Citation[];\n  toolCalls?: ToolCall[];\n  reasoning?: Reasoning;\n}\n\nexport interface Conversation {\n  id: string;\n  label: string;\n}\n\nexport interface ModelOption {\n  id: string;\n  name: string;\n  description?: string;\n  badge?: string;\n  disabled?: boolean;\n}\n\nexport interface SuggestedPrompt {\n  id: string;\n  label: string;\n  prompt?: string;\n}\n\nexport type MessageFeedback = 'positive' | 'negative';\n\nexport interface UsageState {\n  promptTokens: number;\n  completionTokens: number;\n  contextWindow: number;\n  estimatedCostUsd?: number;\n}\n",
      "type": "registry:file",
      "target": "components/spectrumui/blocks/ai-assistants/types.ts"
    }
  ],
  "type": "registry:block"
}
