Artifact

PreviousNext

Display generated artifacts like code, designs, or documents with actions.

React Component

A simple counter component with increment and decrement buttons

counter.tsx
export 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

pnpm 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.tsx
export 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.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactHeader

Header section with title and actions.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactTitle

Title of the artifact.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactDescription

Description text.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactActions

Container for action buttons.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactAction

Individual action button.

PropTypeDefaultDescription
tooltipstring-Tooltip text
labelstring-Accessible label
iconLucideIcon-Icon component
classNamestring-Custom CSS classes

ArtifactContent

Content area.

PropTypeDefaultDescription
classNamestring-Custom CSS classes

ArtifactClose

Close button.

PropTypeDefaultDescription
classNamestring-Custom CSS classes