Claude-skill-registry ai-elements
AI Elements component library for AI-native applications. Use when building chatbots, AI workflows, or integrating with Vercel AI SDK's useChat hook.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ai-elements" ~/.claude/skills/majiayu000-claude-skill-registry-ai-elements && rm -rf "$T"
manifest:
skills/data/ai-elements/SKILL.mdsource content
AI Elements
Build AI-native applications with pre-built components on shadcn/ui.
Quick Start
# Install all AI Elements components bunx --bun ai-elements@latest # or via shadcn CLI bunx --bun shadcn@latest add @ai-elements/all # Install AI SDK dependencies bun add ai @ai-sdk/react zod
Components install to
@/components/ai-elements/.
Component Quick Reference
Chatbot Components
| Component | Purpose |
|---|---|
| Auto-scroll chat container |
| Single message wrapper (user/assistant) |
| Streaming markdown renderer (uses ) |
| Rich input with attachments, model picker |
| Collapsible thinking display |
| Citation/reference display |
| Tool execution visualization |
| Step-by-step breakdown |
| Inline citation badge with hover card carousel |
| Collapsible plan card with streaming title |
| Collapsible task breakdown display |
| Todo/message queue with sections |
Workflow Components
| Component | Purpose |
|---|---|
| React Flow wrapper for visual workflows |
| Workflow node with header/content/footer |
| Animated/temporary edge connections |
| Zoom/fit view controls |
| Positioned overlay panels |
| Token usage tracking display |
Utility Components
| Component | Purpose |
|---|---|
| Syntax highlighted code (Shiki) |
| Loading indicator |
| Streaming text effect |
| Tool confirmation dialog |
| Quick action chips |
| Model picker dialog with provider logos |
| Open query in external chat (ChatGPT, Claude, etc.) |
| Iframe preview with URL bar and console |
Core Integration Pattern
'use client'; import { useChat } from '@ai-sdk/react'; import { Conversation, ConversationContent } from '@/components/ai-elements/conversation'; import { Message, MessageContent, MessageResponse } from '@/components/ai-elements/message'; import { Reasoning, ReasoningTrigger, ReasoningContent } from '@/components/ai-elements/reasoning'; import { Sources, SourcesTrigger, SourcesContent, Source } from '@/components/ai-elements/sources'; export function Chat() { const { messages, sendMessage, status } = useChat(); return ( <Conversation> <ConversationContent> {messages.map((message) => ( <div key={message.id}> {message.parts.map((part, i) => { switch (part.type) { case 'text': return ( <Message key={i} from={message.role}> <MessageContent> <MessageResponse>{part.text}</MessageResponse> </MessageContent> </Message> ); case 'reasoning': return ( <Reasoning key={i} isStreaming={status === 'streaming'}> <ReasoningTrigger /> <ReasoningContent>{part.text}</ReasoningContent> </Reasoning> ); case 'source-url': return <Source key={i} href={part.url} title={part.title} />; } })} </div> ))} </ConversationContent> </Conversation> ); }
API Route Pattern
// app/api/chat/route.ts import { streamText, UIMessage, convertToModelMessages } from 'ai'; export const maxDuration = 30; export async function POST(req: Request) { const { messages, model }: { messages: UIMessage[]; model: string } = await req.json(); const result = streamText({ model, messages: convertToModelMessages(messages), system: 'You are a helpful assistant.', }); return result.toUIMessageStreamResponse({ sendSources: true, sendReasoning: true, }); }
Key Patterns
Message Parts Switching
Messages have
parts array. Switch on part.type:
- Regular text contenttext
- Model thinking/reasoningreasoning
- Citation with URLsource-url
- Tool invocations (input, output, error)tool-*
Compound Components
Most components use compound pattern:
<Conversation> <ConversationContent>{/* messages */}</ConversationContent> <ConversationScrollButton /> </Conversation> <Message from="assistant"> <MessageContent> <MessageResponse>{text}</MessageResponse> </MessageContent> <MessageActions> <MessageAction label="Copy"><CopyIcon /></MessageAction> </MessageActions> </Message>
File Attachments
<PromptInput onSubmit={handleSubmit} globalDrop multiple> <PromptInputHeader> <PromptInputAttachments> {(attachment) => <PromptInputAttachment data={attachment} />} </PromptInputAttachments> </PromptInputHeader> <PromptInputBody> <PromptInputTextarea /> </PromptInputBody> <PromptInputFooter> <PromptInputTools> <PromptInputActionMenu> <PromptInputActionMenuTrigger /> <PromptInputActionMenuContent> <PromptInputActionAddAttachments /> </PromptInputActionMenuContent> </PromptInputActionMenu> </PromptInputTools> <PromptInputSubmit status={status} /> </PromptInputFooter> </PromptInput>
References
- Chatbot Components - Conversation, Message, PromptInput, Reasoning, Sources, Tool, InlineCitation, Plan, Task, Queue
- Workflow Components - Canvas, Node, Edge, Controls
- Utility Components - CodeBlock, Loader, Shimmer, ModelSelector, OpenIn, WebPreview
- AI SDK Integration - useChat, API routes, message parts
Dependencies
Key dependencies used by AI Elements:
| Package | Purpose |
|---|---|
| Streaming markdown renderer for and |
| Syntax highlighting for |
| Auto-scroll behavior for |
| Animations for |
| Token cost calculation for |
Package Manager
Always use bun, never npm:
(not npm install)bun add
(not npx)bunx --bun