Building Blocks for the Web
Clean, modern building blocks. Copy and paste into your PRISM apps. Works with all frameworks. Open Source. Free forever.
AI Chat
AI
Site Assistant
Claude Sonnet 5
Add a pricing section to my landing page.
Read the landing page
Hero, features, footer — no pricing yet.
Planned a three-tier layout
Delegated the build to sub-agents
Delegated to 3 sub-agents
Referenced 5 SaaS layouts + Stripe Checkout.
src/components/Pricing.tsx+88
Done — I added a three-tier pricing section and wired the CTAs:
- Starter, Pro, and Business tiers
- Buttons link to
/signup - Styling reuses your existing card tokens
tsx
<Pricing tiers={3} cta="/signup" />
src/app/page.tsx+42−5
src/components/Pricing.tsx+88
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72<div class="flex h-[560px] flex-col rounded-xl border bg-background">
<div class="flex items-center gap-2 border-b px-4 py-3">
{icon("sparkles", "h-4 w-4 text-primary")}
<span class="font-semibold">Site Assistant</span>
<Badge variant="secondary">Claude Sonnet 5</Badge>
</div>
<Conversation class="flex-1">
<Message from="user">
<MessageAvatar from="user" />
<MessageContent from="user">Add a pricing section to my landing page.</MessageContent>
</Message>
<Message from="assistant" class="group">
<MessageAvatar from="assistant" />
<div class="flex min-w-0 flex-col items-start gap-1.5">
<MessageContent>
<ChainOfThought>
<ChainOfThoughtStep status="complete" label="Read the landing page">
Hero, features, footer — no pricing yet.
</ChainOfThoughtStep>
<ChainOfThoughtStep status="complete" label="Planned a three-tier layout" />
<ChainOfThoughtStep status="complete" label="Delegated the build to sub-agents" />
</ChainOfThought>
<Agents label="Delegated to 3 sub-agents">
<Agent name="researcher" role="gathers pricing patterns" state="complete">
Referenced 5 SaaS layouts + Stripe Checkout.
</Agent>
<Agent name="builder" role="writes the component" state="complete">
<FileDiff file="src/components/Pricing.tsx" added={88} kind="create" />
</Agent>
<Agent name="reviewer" role="checks a11y + responsive" state="running" />
</Agents>
<Response>{reply}</Response>
<Tool name="update_site_content" state="complete">
<FileDiff file="src/app/page.tsx" added={42} removed={5} kind="edit" />
<FileDiff file="src/components/Pricing.tsx" added={88} kind="create" />
</Tool>
<Sources label="Sources">
<Source index={1} href="#">SaaS pricing patterns</Source>
<Source index={2} href="#">shadcn/ui — Card</Source>
</Sources>
</MessageContent>
<Actions>
<Action label="Copy" icon="copy" copy={reply} />
<Action label="Regenerate" icon="refresh-cw" />
<Action label="Good response" icon="thumbs-up" toggle />
<Action label="Bad response" icon="thumbs-down" toggle />
</Actions>
</div>
</Message>
</Conversation>
<div class="border-t p-3">
<PromptInput action="/api/chat">
<PromptInputTextarea placeholder="Describe a change to your site…" />
<PromptInputToolbar>
<PromptInputTools>
<PromptInputButton label="Attach a file">{icon("paperclip")}</PromptInputButton>
<PromptInputModelSelect models={MODELS} />
</PromptInputTools>
<PromptInputHint>⏎ to send</PromptInputHint>
<PromptInputSubmit state="ready" />
</PromptInputToolbar>
</PromptInput>
</div>
</div>
AI Assistant
AILanding page pricingClaude Sonnet 5
Add a pricing section to my landing page.
Read the landing page
Hero, features, footer — no pricing yet.
Planned a three-tier layout
Delegated the build to sub-agents
Delegated to 3 sub-agents
Referenced 5 SaaS layouts + Stripe Checkout.
src/components/Pricing.tsx+88
Done — I added a three-tier pricing section and wired the CTAs:
- Starter, Pro, and Business tiers
- Buttons link to
/signup - Styling reuses your existing card tokens
tsx
<Pricing tiers={3} cta="/signup" />
src/app/page.tsx+42−5
src/components/Pricing.tsx+88
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96<div class="flex h-[600px] overflow-hidden rounded-xl border">
<ConversationSidebar>
<ConversationSidebarHeader>
<ConversationNewButton />
<ConversationSearch />
</ConversationSidebarHeader>
<ConversationList>
<ConversationGroup label="Today">
<ConversationItem active>Landing page pricing</ConversationItem>
<ConversationItem>Blog post ideas</ConversationItem>
</ConversationGroup>
<ConversationGroup label="Yesterday">
<ConversationItem>SEO title rewrite</ConversationItem>
<ConversationItem>Contact form fields</ConversationItem>
</ConversationGroup>
</ConversationList>
<ConversationSidebarFooter>
<Avatar fallback="BX" class="h-7 w-7" />
<span class="truncate">ben@webdesign29</span>
</ConversationSidebarFooter>
</ConversationSidebar>
<div class="flex min-w-0 flex-1 flex-col bg-background">
<div class="flex items-center gap-2 border-b px-4 py-3">
<span class="font-semibold">Landing page pricing</span>
<Badge variant="secondary" class="ml-auto">Claude Sonnet 5</Badge>
</div>
<Conversation class="flex-1">
<Message from="user">
<MessageAvatar from="user" />
<MessageContent from="user">Add a pricing section to my landing page.</MessageContent>
</Message>
<Message from="assistant" class="group">
<MessageAvatar from="assistant" />
<div class="flex min-w-0 flex-col items-start gap-1.5">
<MessageContent>
<ChainOfThought>
<ChainOfThoughtStep status="complete" label="Read the landing page">
Hero, features, footer — no pricing yet.
</ChainOfThoughtStep>
<ChainOfThoughtStep status="complete" label="Planned a three-tier layout" />
<ChainOfThoughtStep status="complete" label="Delegated the build to sub-agents" />
</ChainOfThought>
<Agents label="Delegated to 3 sub-agents">
<Agent name="researcher" role="gathers pricing patterns" state="complete">
Referenced 5 SaaS layouts + Stripe Checkout.
</Agent>
<Agent name="builder" role="writes the component" state="complete">
<FileDiff file="src/components/Pricing.tsx" added={88} kind="create" />
</Agent>
<Agent name="reviewer" role="checks a11y + responsive" state="running" />
</Agents>
<Response>{reply}</Response>
<Tool name="update_site_content" state="complete">
<FileDiff file="src/app/page.tsx" added={42} removed={5} kind="edit" />
<FileDiff file="src/components/Pricing.tsx" added={88} kind="create" />
</Tool>
<Sources label="Sources">
<Source index={1} href="#">SaaS pricing patterns</Source>
<Source index={2} href="#">shadcn/ui — Card</Source>
</Sources>
</MessageContent>
<Actions>
<Action label="Copy" icon="copy" copy={reply} />
<Action label="Regenerate" icon="refresh-cw" />
<Action label="Good response" icon="thumbs-up" toggle />
<Action label="Bad response" icon="thumbs-down" toggle />
</Actions>
</div>
</Message>
</Conversation>
<div class="border-t p-3">
<PromptInput action="/api/chat">
<PromptInputTextarea placeholder="Describe a change to your site…" />
<PromptInputToolbar>
<PromptInputTools>
<PromptInputButton label="Attach a file">{icon("paperclip")}</PromptInputButton>
<PromptInputModelSelect models={MODELS} />
</PromptInputTools>
<PromptInputHint>⏎ to send</PromptInputHint>
<PromptInputSubmit state="ready" />
</PromptInputToolbar>
</PromptInput>
</div>
</div>
</div>
AI Agent
AIAdd a pricing section to my landing page.
Read the current landing page
Research pricing patterns
Build the Pricing component
Wire CTAs + verify responsive
Chose a three-tier layout
Starter / Pro / Business, reusing your card tokens.
Delegating to specialised sub-agents
Delegated to 3 sub-agents
Referenced 5 SaaS layouts + Stripe Checkout.
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<Message from="assistant" class="group">
<MessageAvatar from="assistant" />
<div class="flex min-w-0 flex-1 flex-col items-start gap-2">
<Task title="Add a pricing section" state="running">
<TaskItem status="complete">Read the current landing page</TaskItem>
<TaskItem status="complete">Research pricing patterns</TaskItem>
<TaskItem status="active">Build the Pricing component</TaskItem>
<TaskItem status="pending">Wire CTAs + verify responsive</TaskItem>
</Task>
<ChainOfThought>
<ChainOfThoughtStep status="complete" label="Chose a three-tier layout">
Starter / Pro / Business, reusing your card tokens.
</ChainOfThoughtStep>
<ChainOfThoughtStep status="active" label="Delegating to specialised sub-agents" />
</ChainOfThought>
<Agents label="Delegated to 3 sub-agents">
<Agent name="researcher" role="gathers pricing patterns" state="complete">
Referenced 5 SaaS layouts + Stripe Checkout.
</Agent>
<Agent name="builder" role="writes the component" state="running" />
<Agent name="reviewer" role="checks a11y + responsive" state="pending" />
</Agents>
</div>
</Message>
AI Prompt
AIWhat should we build?
Describe a change and I'll apply it to your site — or start from one of these.
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<div class="flex min-h-[460px] flex-col items-center justify-center gap-6 p-8">
<ChatEmpty
title="What should we build?"
description="Describe a change and I'll apply it to your site — or start from one of these."
/>
<div class="grid w-full max-w-2xl gap-3 sm:grid-cols-2">
{SUGGESTIONS.map(([title, detail]) => (
<button class="flex flex-col items-start gap-1 rounded-lg border bg-background p-3 text-left hover:bg-accent">
<span class="text-sm font-medium">{title}</span>
<span class="text-xs text-muted-foreground">{detail}</span>
</button>
))}
</div>
<div class="w-full max-w-2xl">
<PromptInput action="/api/chat">
<PromptInputTextarea placeholder="Describe a change to your site…" />
<PromptInputToolbar>
<PromptInputTools>
<PromptInputButton label="Attach a file">{icon("paperclip")}</PromptInputButton>
<PromptInputModelSelect models={MODELS} />
</PromptInputTools>
<PromptInputHint>⏎ to send</PromptInputHint>
<PromptInputSubmit state="ready" />
</PromptInputToolbar>
</PromptInput>
</div>
</div>
Dashboard
Application
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<div class="flex min-h-[440px] overflow-hidden rounded-lg border">
<aside class="hidden w-52 flex-col border-r bg-sidebar p-2 md:flex">
<div class="flex items-center gap-2 px-2 py-3 font-semibold">{icon("command")} Acme Inc</div>
{NAV.map((label, i) => (
<a href="#" class={cn("flex items-center gap-2 rounded-md px-2 py-1.5 text-sm", i === 0 && "bg-accent")}>
{icon(ICONS[i])} {label}
</a>
))}
</aside>
<div class="flex-1">
<div class="flex h-14 items-center gap-3 border-b px-4">
<Input placeholder="Search…" class="max-w-sm" />
<Avatar fallback="BX" class="ml-auto h-8 w-8" />
</div>
<div class="space-y-4 p-4">
<div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
{STATS.map((s) => (
<Card>
<CardHeader><CardDescription>{s.label}</CardDescription></CardHeader>
<CardContent><div class="text-2xl font-bold">{s.value}</div></CardContent>
</Card>
))}
</div>
<Card><CardHeader><CardTitle>Overview</CardTitle></CardHeader><CardContent><AreaChart /></CardContent></Card>
</div>
</div>
</div>
Login
AuthenticationLogin
Enter your email below to login to your account.
Don't have an account? Sign up
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<div class="flex min-h-[440px] items-center justify-center p-6">
<Card class="w-full max-w-sm">
<CardHeader>
<CardTitle class="text-2xl">Login</CardTitle>
<CardDescription>Enter your email below to login to your account.</CardDescription>
</CardHeader>
<CardContent class="grid gap-4">
<div class="grid gap-2">
<Label>Email</Label>
<Input type="email" placeholder="m@example.com" />
</div>
<div class="grid gap-2">
<div class="flex items-center">
<Label>Password</Label>
<a href="#" class="ml-auto text-sm underline">Forgot your password?</a>
</div>
<Input type="password" />
</div>
<Button class="w-full">Login</Button>
<Button variant="outline" class="w-full">{icon("command")} Login with bext</Button>
</CardContent>
<CardFooter class="justify-center text-sm">
Don't have an account? <a href="#" class="ml-1 underline">Sign up</a>
</CardFooter>
</Card>
</div>
Sign up (split)
AuthenticationCreate an account
Enter your details to get started.
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<div class="grid min-h-[440px] overflow-hidden rounded-lg border lg:grid-cols-2">
<div class="flex items-center justify-center p-8">
<Card class="w-full max-w-sm border-0 shadow-none">
<CardHeader class="px-0">
<CardTitle class="text-2xl">Create an account</CardTitle>
<CardDescription>Enter your details to get started.</CardDescription>
</CardHeader>
<CardContent class="grid gap-4 px-0">
<div class="grid grid-cols-2 gap-3">
<div class="grid gap-2"><Label>First name</Label><Input placeholder="Max" /></div>
<div class="grid gap-2"><Label>Last name</Label><Input placeholder="Robinson" /></div>
</div>
<div class="grid gap-2"><Label>Email</Label><Input type="email" placeholder="m@example.com" /></div>
<div class="grid gap-2"><Label>Password</Label><Input type="password" /></div>
<Button class="w-full">Create account</Button>
</CardContent>
</Card>
</div>
<div class="hidden bg-muted lg:flex items-center justify-center">
<div class="flex h-16 w-16 items-center justify-center rounded-2xl bg-foreground text-background">
{icon("command", "h-8 w-8")}
</div>
</div>
</div>
Stats
MarketingTotal Revenue
$45,231.89
+20.1% from last month
Subscriptions
+2,350
+180.1% from last month
Sales
+12,234
+19% from last month
Active Now
+573
+201 since last hour
tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14<div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
{STATS.map((s) => (
<Card>
<CardHeader class="flex flex-row items-center justify-between pb-2">
<CardDescription>{s.label}</CardDescription>
{icon(s.icon, "h-4 w-4 text-muted-foreground")}
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">{s.value}</div>
<p class="text-xs text-muted-foreground">{s.delta}</p>
</CardContent>
</Card>
))}
</div>