Get Started
Components
- Alert
- Avatar
- Badge
- Breadcrumb
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Checkbox Group
- ComboBox
- Command
- Data Table
- Date Field
- Date Picker
- Date Range Picker
- Dialog
- Disclosure
- Disclosure Group
- Drawer
- Empty
- Field
- File Trigger
- Form
- Grid List
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- ListBox
- Menu
- Number Field
- Pagination
- Popover
- Progress Bar
- Radio Group
- Range Calendar
- Resizable
- Search Field
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Spinner
- Switch
- Table
- Tabs
- Tag Group
- Text Field
- Textarea
- Time Field
- Toast
- Toggle Button
- Toggle Button Group
- Tooltip
- Tree
- Typography
AI Elements
React Component
A simple counter component with increment and decrement buttons
counter.tsxexport default function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
)
}import { CopyIcon, DownloadIcon, FileCodeIcon } from "lucide-react"
import {
Artifact,
ArtifactAction,
ArtifactActions,
ArtifactClose,
ArtifactContent,
ArtifactDescription,
ArtifactHeader,
ArtifactTitle,
} from "@/components/ai-elements/artifact"
export function ArtifactDemo() {
return (
<Artifact className="w-full max-w-2xl">
<ArtifactHeader>
<div className="space-y-1">
<ArtifactTitle>React Component</ArtifactTitle>
<ArtifactDescription>
A simple counter component with increment and decrement buttons
</ArtifactDescription>
</div>
<ArtifactActions>
<ArtifactAction tooltip="Copy code" label="Copy">
<CopyIcon className="size-4" />
</ArtifactAction>
<ArtifactAction tooltip="Download" label="Download">
<DownloadIcon className="size-4" />
</ArtifactAction>
<ArtifactClose />
</ArtifactActions>
</ArtifactHeader>
<ArtifactContent>
<div className="flex items-center gap-2 text-sm">
<FileCodeIcon className="text-muted-foreground size-4" />
<code className="text-foreground">counter.tsx</code>
</div>
<pre className="text-muted-foreground mt-4 text-xs">
{`export function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
)
}`}
</pre>
</ArtifactContent>
</Artifact>
)
}
Installation
CLI
Manual
pnpmnpmyarnbunpnpm dlx shadcn@latest add artifact
Usage
import {
Artifact,
ArtifactHeader,
ArtifactTitle,
ArtifactDescription,
ArtifactActions,
ArtifactAction,
ArtifactContent,
ArtifactClose,
} from "@/components/ai-elements/artifact"<Artifact>
<ArtifactHeader>
<div>
<ArtifactTitle>Component Name</ArtifactTitle>
<ArtifactDescription>Description</ArtifactDescription>
</div>
<ArtifactActions>
<ArtifactAction tooltip="Copy"><CopyIcon /></ArtifactAction>
<ArtifactClose />
</ArtifactActions>
</ArtifactHeader>
<ArtifactContent>
{/* Your content here */}
</ArtifactContent>
</Artifact>Examples
Default
React Component
A simple counter component with increment and decrement buttons
counter.tsxexport default function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
)
}import { CopyIcon, DownloadIcon, FileCodeIcon } from "lucide-react"
import {
Artifact,
ArtifactAction,
ArtifactActions,
ArtifactClose,
ArtifactContent,
ArtifactDescription,
ArtifactHeader,
ArtifactTitle,
} from "@/components/ai-elements/artifact"
export function ArtifactDemo() {
return (
<Artifact className="w-full max-w-2xl">
<ArtifactHeader>
<div className="space-y-1">
<ArtifactTitle>React Component</ArtifactTitle>
<ArtifactDescription>
A simple counter component with increment and decrement buttons
</ArtifactDescription>
</div>
<ArtifactActions>
<ArtifactAction tooltip="Copy code" label="Copy">
<CopyIcon className="size-4" />
</ArtifactAction>
<ArtifactAction tooltip="Download" label="Download">
<DownloadIcon className="size-4" />
</ArtifactAction>
<ArtifactClose />
</ArtifactActions>
</ArtifactHeader>
<ArtifactContent>
<div className="flex items-center gap-2 text-sm">
<FileCodeIcon className="text-muted-foreground size-4" />
<code className="text-foreground">counter.tsx</code>
</div>
<pre className="text-muted-foreground mt-4 text-xs">
{`export function Counter() {
const [count, setCount] = useState(0)
return (
<div>
<button onClick={() => setCount(count - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
)
}`}
</pre>
</ArtifactContent>
</Artifact>
)
}
import { CopyIcon, DownloadIcon } from "lucide-react"
export default function Example() {
return (
<Artifact>
<ArtifactHeader>
<div className="space-y-1">
<ArtifactTitle>React Component</ArtifactTitle>
<ArtifactDescription>
A simple counter component
</ArtifactDescription>
</div>
<ArtifactActions>
<ArtifactAction tooltip="Copy" label="Copy">
<CopyIcon className="size-4" />
</ArtifactAction>
<ArtifactAction tooltip="Download" label="Download">
<DownloadIcon className="size-4" />
</ArtifactAction>
<ArtifactClose />
</ArtifactActions>
</ArtifactHeader>
<ArtifactContent>
<pre className="text-xs">
{`export default function Counter() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}`}
</pre>
</ArtifactContent>
</Artifact>
)
}API Reference
Artifact
Main container for the artifact.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactHeader
Header section with title and actions.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactTitle
Title of the artifact.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactDescription
Description text.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactActions
Container for action buttons.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactAction
Individual action button.
| Prop | Type | Default | Description |
|---|---|---|---|
tooltip | string | - | Tooltip text |
label | string | - | Accessible label |
icon | LucideIcon | - | Icon component |
className | string | - | Custom CSS classes |
ArtifactContent
Content area.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |
ArtifactClose
Close button.
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Custom CSS classes |