Vibe coding
Artifact
A container component for displaying generated content like code, documents, or other outputs with built-in actions.
The Artifact component provides a structured container for displaying generated content like code, documents, or other outputs with built-in header actions.
Dijkstra's Algorithm Implementation
Updated 1 minute ago
1# Dijkstra's Algorithm implementation
2import heapq
3
4def dijkstra(graph, start):
5 distances = {node: float('inf') for node in graph}
6 distances[start] = 0
7 heap = [(0, start)]
8 visited = set()
9
10 while heap:
11 current_distance, current_node = heapq.heappop(heap)
12 if current_node in visited:
13 continue
14 visited.add(current_node)
15
16 for neighbor, weight in graph[current_node].items():
17 distance = current_distance + weight
18 if distance < distances[neighbor]:
19 distances[neighbor] = distance
20 heapq.heappush(heap, (distance, neighbor))
21
22 return distances
23
24# Example graph
25 graph = {
26 'A': {'B': 1, 'C': 4},
27 'B': {'A': 1, 'C': 2, 'D': 5},
28 'C': {'A': 4, 'B': 2, 'D': 1},
29 'D': {'B': 5, 'C': 1}
30}
31
32print(dijkstra(graph, 'A'))1# Dijkstra's Algorithm implementation
2import heapq
3
4def dijkstra(graph, start):
5 distances = {node: float('inf') for node in graph}
6 distances[start] = 0
7 heap = [(0, start)]
8 visited = set()
9
10 while heap:
11 current_distance, current_node = heapq.heappop(heap)
12 if current_node in visited:
13 continue
14 visited.add(current_node)
15
16 for neighbor, weight in graph[current_node].items():
17 distance = current_distance + weight
18 if distance < distances[neighbor]:
19 distances[neighbor] = distance
20 heapq.heappush(heap, (distance, neighbor))
21
22 return distances
23
24# Example graph
25 graph = {
26 'A': {'B': 1, 'C': 4},
27 'B': {'A': 1, 'C': 2, 'D': 5},
28 'C': {'A': 4, 'B': 2, 'D': 1},
29 'D': {'B': 5, 'C': 1}
30}
31
32print(dijkstra(graph, 'A'))"use client";import { Artifact, ArtifactAction, ArtifactActions, ArtifactContent, ArtifactDescription, ArtifactHeader, ArtifactTitle,} from "@/components/ai-elements/elements/artifact";import { CodeBlock } from "@/components/ai-elements/elements/code-block";import { CopyIcon, DownloadIcon, PlayIcon, RefreshCwIcon, ShareIcon,} from "lucide-react";const code = `# Dijkstra's Algorithm implementationimport heapqdef dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 heap = [(0, start)] visited = set() while heap: current_distance, current_node = heapq.heappop(heap) if current_node in visited: continue visited.add(current_node) for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return distances# Example graph graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1}}print(dijkstra(graph, 'A'))`;const Example = () => ( <Artifact> <ArtifactHeader> <div> <ArtifactTitle>Dijkstra's Algorithm Implementation</ArtifactTitle> <ArtifactDescription>Updated 1 minute ago</ArtifactDescription> </div> <div className="flex items-center gap-2"> <ArtifactActions> <ArtifactAction icon={PlayIcon} label="Run" onClick={() => console.log("Run")} tooltip="Run code" /> <ArtifactAction icon={CopyIcon} label="Copy" onClick={() => console.log("Copy")} tooltip="Copy to clipboard" /> <ArtifactAction icon={RefreshCwIcon} label="Regenerate" onClick={() => console.log("Regenerate")} tooltip="Regenerate content" /> <ArtifactAction icon={DownloadIcon} label="Download" onClick={() => console.log("Download")} tooltip="Download file" /> <ArtifactAction icon={ShareIcon} label="Share" onClick={() => console.log("Share")} tooltip="Share artifact" /> </ArtifactActions> </div> </ArtifactHeader> <ArtifactContent className="p-0"> <CodeBlock className="border-none" code={code} language="python" showLineNumbers /> </ArtifactContent> </Artifact>);export default Example;Installation
npx ai-elements@latest add artifactnpx shadcn@latest add @ai-elements/artifact"use client";import { Button } from "@repo/shadcn-ui/components/ui/button";import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger,} from "@repo/shadcn-ui/components/ui/tooltip";import { cn } from "@repo/shadcn-ui/lib/utils";import { type LucideIcon, XIcon } from "lucide-react";import type { ComponentProps, HTMLAttributes } from "react";export type ArtifactProps = HTMLAttributes<HTMLDivElement>;export const Artifact = ({ className, ...props }: ArtifactProps) => ( <div className={cn( "flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm", className )} {...props} />);export type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;export const ArtifactHeader = ({ className, ...props}: ArtifactHeaderProps) => ( <div className={cn( "flex items-center justify-between border-b bg-muted/50 px-4 py-3", className )} {...props} />);export type ArtifactCloseProps = ComponentProps<typeof Button>;export const ArtifactClose = ({ className, children, size = "sm", variant = "ghost", ...props}: ArtifactCloseProps) => ( <Button className={cn( "size-8 p-0 text-muted-foreground hover:text-foreground", className )} size={size} type="button" variant={variant} {...props} > {children ?? <XIcon className="size-4" />} <span className="sr-only">Close</span> </Button>);export type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;export const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => ( <p className={cn("font-medium text-foreground text-sm", className)} {...props} />);export type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;export const ArtifactDescription = ({ className, ...props}: ArtifactDescriptionProps) => ( <p className={cn("text-muted-foreground text-sm", className)} {...props} />);export type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;export const ArtifactActions = ({ className, ...props}: ArtifactActionsProps) => ( <div className={cn("flex items-center gap-1", className)} {...props} />);export type ArtifactActionProps = ComponentProps<typeof Button> & { tooltip?: string; label?: string; icon?: LucideIcon;};export const ArtifactAction = ({ tooltip, label, icon: Icon, children, className, size = "sm", variant = "ghost", ...props}: ArtifactActionProps) => { const button = ( <Button className={cn( "size-8 p-0 text-muted-foreground hover:text-foreground", className )} size={size} type="button" variant={variant} {...props} > {Icon ? <Icon className="size-4" /> : children} <span className="sr-only">{label || tooltip}</span> </Button> ); if (tooltip) { return ( <TooltipProvider> <Tooltip> <TooltipTrigger asChild>{button}</TooltipTrigger> <TooltipContent> <p>{tooltip}</p> </TooltipContent> </Tooltip> </TooltipProvider> ); } return button;};export type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;export const ArtifactContent = ({ className, ...props}: ArtifactContentProps) => ( <div className={cn("flex-1 overflow-auto p-4", className)} {...props} />);Usage
import {
Artifact,
ArtifactAction,
ArtifactActions,
ArtifactContent,
ArtifactDescription,
ArtifactHeader,
ArtifactTitle,
} from '@/components/ai-elements/artifact';<Artifact>
<ArtifactHeader>
<div>
<ArtifactTitle>Dijkstra's Algorithm Implementation</ArtifactTitle>
<ArtifactDescription>Updated 1 minute ago</ArtifactDescription>
</div>
<ArtifactActions>
<ArtifactAction icon={CopyIcon} label="Copy" tooltip="Copy to clipboard" />
</ArtifactActions>
</ArtifactHeader>
<ArtifactContent>
{/* Your content here */}
</ArtifactContent>
</Artifact>Features
- Structured container with header and content areas
- Built-in header with title and description support
- Flexible action buttons with tooltips
- Customizable styling for all subcomponents
- Support for close buttons and action groups
- Clean, modern design with border and shadow
- Responsive layout that adapts to content
- TypeScript support with proper type definitions
- Composable architecture for maximum flexibility
Examples
With Code Display
Dijkstra's Algorithm Implementation
Updated 1 minute ago
1# Dijkstra's Algorithm implementation
2import heapq
3
4def dijkstra(graph, start):
5 distances = {node: float('inf') for node in graph}
6 distances[start] = 0
7 heap = [(0, start)]
8 visited = set()
9
10 while heap:
11 current_distance, current_node = heapq.heappop(heap)
12 if current_node in visited:
13 continue
14 visited.add(current_node)
15
16 for neighbor, weight in graph[current_node].items():
17 distance = current_distance + weight
18 if distance < distances[neighbor]:
19 distances[neighbor] = distance
20 heapq.heappush(heap, (distance, neighbor))
21
22 return distances
23
24# Example graph
25 graph = {
26 'A': {'B': 1, 'C': 4},
27 'B': {'A': 1, 'C': 2, 'D': 5},
28 'C': {'A': 4, 'B': 2, 'D': 1},
29 'D': {'B': 5, 'C': 1}
30}
31
32print(dijkstra(graph, 'A'))1# Dijkstra's Algorithm implementation
2import heapq
3
4def dijkstra(graph, start):
5 distances = {node: float('inf') for node in graph}
6 distances[start] = 0
7 heap = [(0, start)]
8 visited = set()
9
10 while heap:
11 current_distance, current_node = heapq.heappop(heap)
12 if current_node in visited:
13 continue
14 visited.add(current_node)
15
16 for neighbor, weight in graph[current_node].items():
17 distance = current_distance + weight
18 if distance < distances[neighbor]:
19 distances[neighbor] = distance
20 heapq.heappush(heap, (distance, neighbor))
21
22 return distances
23
24# Example graph
25 graph = {
26 'A': {'B': 1, 'C': 4},
27 'B': {'A': 1, 'C': 2, 'D': 5},
28 'C': {'A': 4, 'B': 2, 'D': 1},
29 'D': {'B': 5, 'C': 1}
30}
31
32print(dijkstra(graph, 'A'))"use client";import { Artifact, ArtifactAction, ArtifactActions, ArtifactContent, ArtifactDescription, ArtifactHeader, ArtifactTitle,} from "@/components/ai-elements/elements/artifact";import { CodeBlock } from "@/components/ai-elements/elements/code-block";import { CopyIcon, DownloadIcon, PlayIcon, RefreshCwIcon, ShareIcon,} from "lucide-react";const code = `# Dijkstra's Algorithm implementationimport heapqdef dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 heap = [(0, start)] visited = set() while heap: current_distance, current_node = heapq.heappop(heap) if current_node in visited: continue visited.add(current_node) for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return distances# Example graph graph = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1}}print(dijkstra(graph, 'A'))`;const Example = () => ( <Artifact> <ArtifactHeader> <div> <ArtifactTitle>Dijkstra's Algorithm Implementation</ArtifactTitle> <ArtifactDescription>Updated 1 minute ago</ArtifactDescription> </div> <div className="flex items-center gap-2"> <ArtifactActions> <ArtifactAction icon={PlayIcon} label="Run" onClick={() => console.log("Run")} tooltip="Run code" /> <ArtifactAction icon={CopyIcon} label="Copy" onClick={() => console.log("Copy")} tooltip="Copy to clipboard" /> <ArtifactAction icon={RefreshCwIcon} label="Regenerate" onClick={() => console.log("Regenerate")} tooltip="Regenerate content" /> <ArtifactAction icon={DownloadIcon} label="Download" onClick={() => console.log("Download")} tooltip="Download file" /> <ArtifactAction icon={ShareIcon} label="Share" onClick={() => console.log("Share")} tooltip="Share artifact" /> </ArtifactActions> </div> </ArtifactHeader> <ArtifactContent className="p-0"> <CodeBlock className="border-none" code={code} language="python" showLineNumbers /> </ArtifactContent> </Artifact>);export default Example;Props
<Artifact />
Prop
Type
<ArtifactHeader />
Prop
Type
<ArtifactTitle />
Prop
Type
<ArtifactDescription />
Prop
Type
<ArtifactActions />
Prop
Type
<ArtifactAction />
Prop
Type
<ArtifactClose />
Prop
Type
<ArtifactContent />
Prop
Type