---
name: ai-elements
description: Vercel AI Elements for workflow UI components. Use when building chat interfaces, displaying tool execution, showing reasoning/thinking, or creating job queues. Triggers on ai-elements, Queue, Confirmation, Tool, Reasoning, Shimmer, Loader, Message, Conversation, PromptInput.
---
# AI Elements
AI Elements is a comprehensive React component library for building AI-powered user interfaces. The library provides 30+ components specifically designed for chat interfaces, tool execution visualization, reasoning displays, and workflow management.
## Installation
Install via shadcn registry:
```bash
npx shadcn@latest add https://ai-elements.vercel.app/r/[component-name]
```
**Import Pattern**: Components are imported from individual files, not a barrel export:
```tsx
// Correct - import from specific files
import { Conversation } from "@/components/ai-elements/conversation";
import { Message } from "@/components/ai-elements/message";
import { PromptInput } from "@/components/ai-elements/prompt-input";
// Incorrect - no barrel export
import { Conversation, Message } from "@/components/ai-elements";
```
## Component Categories
### Conversation Components
Components for displaying chat-style interfaces with messages, attachments, and auto-scrolling behavior.
- **Conversation**: Container with auto-scroll capabilities
- **Message**: Individual message display with role-based styling
- **MessageAttachment**: File and image attachments
- **MessageBranch**: Alternative response navigation
See [references/conversation.md](references/conversation.md) for details.
### Prompt Input Components
Advanced text input with file attachments, drag-and-drop, speech input, and state management.
- **PromptInput**: Form container with file handling
- **PromptInputTextarea**: Auto-expanding textarea
- **PromptInputSubmit**: Status-aware submit button
- **PromptInputAttachments**: File attachment display
- **PromptInputProvider**: Global state management
See [references/prompt-input.md](references/prompt-input.md) for details.
### Workflow Components
Components for displaying job queues, tool execution, and approval workflows.
- **Queue**: Job queue container
- **QueueItem**: Individual queue items with status
- **Tool**: Tool execution display with collapsible states
- **Confirmation**: Approval workflow component
- **Reasoning**: Collapsible thinking/reasoning display
See [references/workflow.md](references/workflow.md) for details.
### Visualization Components
ReactFlow-based components for workflow visualization and custom node types.
- **Canvas**: ReactFlow wrapper with aviation-specific defaults
- **Node**: Custom node component with handles
- **Edge**: Temporary and Animated edge types
- **Controls, Panel, Toolbar**: Navigation and control elements
See [references/visualization.md](references/visualization.md) for details.
## Integration with shadcn/ui
AI Elements is built on top of shadcn/ui and integrates seamlessly with its theming system:
- Uses shadcn/ui's design tokens (colors, spacing, typography)
- Respects light/dark mode via CSS variables
- Compatible with shadcn/ui components (Button, Card, Collapsible, etc.)
- Follows shadcn/ui's component composition patterns
## Key Design Patterns
### Component Composition
AI Elements follows a composition-first approach where larger components are built from smaller primitives:
```tsx
```
### Context-Based State
Many components use React Context for state management:
- `PromptInputProvider` for global input state
- `MessageBranch` for alternative response navigation
- `Confirmation` for approval workflow state
- `Reasoning` for collapsible thinking state
### Controlled vs Uncontrolled
Components support both controlled and uncontrolled patterns:
```tsx
// Uncontrolled (self-managed state)
// Controlled (external state)
```
## Tool State Machine
The Tool component follows the Vercel AI SDK's state machine:
1. `input-streaming`: Parameters being received
2. `input-available`: Ready to execute
3. `approval-requested`: Awaiting user approval (SDK v6)
4. `approval-responded`: User responded (SDK v6)
5. `output-available`: Execution completed
6. `output-error`: Execution failed
7. `output-denied`: Approval denied
## Queue Patterns
Queue components support hierarchical organization:
```tsx
} />
Task description
```
## Auto-Scroll Behavior
The Conversation component uses the `use-stick-to-bottom` hook for intelligent auto-scrolling:
- Automatically scrolls to bottom when new messages arrive
- Pauses auto-scroll when user scrolls up
- Provides scroll-to-bottom button when not at bottom
- Supports smooth and instant scroll modes
## File Attachment Handling
PromptInput provides comprehensive file handling:
- Drag-and-drop support (local or global)
- Paste image/file support
- File type validation (accept prop)
- File size limits (maxFileSize prop)
- Maximum file count (maxFiles prop)
- Preview for images, icons for files
- Automatic blob URL to data URL conversion on submit
## Speech Input
The PromptInputSpeechButton uses the Web Speech API for voice input:
- Browser-based speech recognition
- Continuous recognition mode
- Interim results support
- Automatic text insertion into textarea
- Visual feedback during recording
## Reasoning Auto-Collapse
The Reasoning component provides auto-collapse behavior:
- Opens automatically when streaming starts
- Closes 1 second after streaming ends
- Tracks thinking duration in seconds
- Displays "Thinking..." with shimmer effect during streaming
- Shows "Thought for N seconds" when complete
## TypeScript Types
All components are fully typed with TypeScript:
```typescript
import type { ToolUIPart, FileUIPart, UIMessage } from "ai";
type ToolProps = ComponentProps;
type QueueItemProps = ComponentProps<"li">;
type MessageAttachmentProps = HTMLAttributes & {
data: FileUIPart;
onRemove?: () => void;
};
```
## Common Use Cases
### Chat Interface
Combine Conversation, Message, and PromptInput for a complete chat UI:
```tsx
import { Conversation, ConversationContent, ConversationScrollButton } from "@/components/ai-elements/conversation";
import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message";
import {
PromptInput,
PromptInputTextarea,
PromptInputFooter,
PromptInputTools,
PromptInputButton,
PromptInputSubmit
} from "@/components/ai-elements/prompt-input";
{messages.map(msg => (
{msg.content}
))}
attachments.openFileDialog()}>
```
### Tool Execution Display
Show tool execution with expandable details:
```tsx
import { Tool, ToolHeader, ToolContent, ToolInput, ToolOutput } from "@/components/ai-elements/tool";
{toolInvocations.map(tool => (
{tool.result && (
)}
))}
```
### Approval Workflow
Request user confirmation before executing actions:
```tsx
import {
Confirmation,
ConfirmationTitle,
ConfirmationRequest,
ConfirmationActions,
ConfirmationAction,
ConfirmationAccepted,
ConfirmationRejected
} from "@/components/ai-elements/confirmation";
Approve deletion of {resource}?
Approve
Reject
Action approved and executed.
Action rejected.
```
### Job Queue Management
Display task lists with completion status:
```tsx
import {
Queue,
QueueSection,
QueueSectionTrigger,
QueueSectionLabel,
QueueSectionContent,
QueueList,
QueueItem,
QueueItemIndicator,
QueueItemContent,
QueueItemDescription
} from "@/components/ai-elements/queue";
{todos.map(todo => (
{todo.title}
{todo.description && (
{todo.description}
)}
))}
```
## Accessibility
Components include accessibility features:
- ARIA labels and roles
- Keyboard navigation support
- Screen reader announcements
- Focus management
- Semantic HTML elements
## Animation
Many components use Framer Motion for smooth animations:
- Shimmer effect for loading states
- Collapsible content transitions
- Edge animations in Canvas
- Loader spinner rotation
## References
- [Conversation Components](references/conversation.md)
- [Prompt Input Components](references/prompt-input.md)
- [Workflow Components](references/workflow.md)
- [Visualization Components](references/visualization.md)