Getting Started
Components
- Agent Status
- Agent Template Card
- API Key Card
- Audio Player
- Bar Visualizer
- Channel Status Card
- Chat Composer
- Code Editor
- Condition Builder
- Confirm Dialog
- Conversation
- Conversation Bar
- Dataset Card
- Document Status Badge
- Extraction Strategy Select
- File Icon
- File Upload
- Indexing Progress
- Live Waveform
- Matrix
- Message
- Mic Selector
- Model Diff View
- Model Selector
- Model Type Filter
- Node Catalog
- Option Editor
- Orb
- Output Variables View
- Package Card
- Prompt Editor
- Provider Status Card
- Radio Card
- Resource Card
- Resource Sidebar
- Response
- Run Node List
- Scrub Bar
- Segment Card
- Shimmering Text
- Speech Input
- Token Trend Chart
- Tool Call Card
- Transcript Viewer
- Usage Stat Card
- Variable Binding Editor
- Variable Selector
- Voice Button
- Voice Picker
- Waveform
- Workflow Node Card
- Workspace Selector
Starter
For small teams testing agent workflows.
100k credits
$19
- Shared workspace
- Usage history
Popular
Growth
For production agents and customer channels.
1M credits
$149
- Priority queues
- Provider routing
- Team analytics
Scale
For high-volume automation and enterprise controls.
10M credits
Custom
- Dedicated support
- Custom limits
import { PackageCard } from "@/components/ui/package-card"
export function PackageCardDemo() {
return (
<div className="grid w-full max-w-3xl gap-3 sm:grid-cols-3">
<PackageCard
title="Starter"
points="100k credits"
price="$19"
description="For small teams testing agent workflows."
features={["Shared workspace", "Usage history"]}
/>
<PackageCard
title="Growth"
points="1M credits"
price="$149"
badge="Popular"
description="For production agents and customer channels."
features={["Priority queues", "Provider routing", "Team analytics"]}
/>
<PackageCard
title="Scale"
points="10M credits"
price="Custom"
description="For high-volume automation and enterprise controls."
features={["Dedicated support", "Custom limits"]}
/>
</div>
)
}
Installation
pnpm dlx shadcn@latest add https://ui.zgi.ai/r/package-card.jsonpnpm dlx shadcn@latest add https://ui.zgi.ai/r/package-card.json
yarn dlx shadcn@latest add https://ui.zgi.ai/r/package-card.jsonComponent
"use client"
import * as React from "react"
import { CheckIcon, Loader2Icon } from "lucide-react"
import { cn } from "@/lib/utils"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Skeleton } from "@/components/ui/skeleton"
export interface PackageCardProps
extends Omit<React.ComponentProps<typeof Card>, "title"> {
title: React.ReactNode
points: React.ReactNode
price: React.ReactNode
description?: React.ReactNode
badge?: React.ReactNode
features?: React.ReactNode[]
actionLabel?: React.ReactNode
loading?: boolean
busy?: boolean
onSelect?: () => void
}
export function PackageCard({
title,
points,
price,
description,
badge,
features = [],
actionLabel = "Buy now",
loading = false,
busy = false,
onSelect,
className,
...props
}: PackageCardProps) {
if (loading) {
return (
<Card className={cn("rounded-lg py-0", className)} {...props}>
<CardContent className="space-y-4 p-4">
<Skeleton className="h-5 w-28" />
<Skeleton className="h-8 w-36" />
<Skeleton className="h-5 w-20" />
<Skeleton className="h-9 w-full" />
</CardContent>
</Card>
)
}
return (
<Card
className={cn(
"hover:border-primary/40 relative overflow-hidden rounded-lg py-0 transition-colors",
className
)}
{...props}
>
<CardContent className="flex min-h-56 flex-col gap-4 p-4">
{badge ? (
<Badge className="absolute top-3 right-3 rounded-md">{badge}</Badge>
) : null}
<div className="pr-16">
<h3 className="text-sm font-medium">{title}</h3>
{description ? (
<p className="text-muted-foreground mt-1 line-clamp-2 text-xs leading-5">
{description}
</p>
) : null}
</div>
<div>
<div className="text-2xl font-semibold tracking-normal">{points}</div>
<div className="text-muted-foreground mt-1 text-sm">{price}</div>
</div>
{features.length ? (
<ul className="space-y-2 text-xs">
{features.map((feature, index) => (
<li key={index} className="flex gap-2">
<CheckIcon className="text-primary mt-0.5 size-3.5 shrink-0" />
<span className="text-muted-foreground">{feature}</span>
</li>
))}
</ul>
) : null}
<Button
type="button"
className="mt-auto h-9 rounded-md"
disabled={busy}
onClick={onSelect}
>
{busy ? <Loader2Icon className="size-4 animate-spin" /> : null}
{actionLabel}
</Button>
</CardContent>
</Card>
)
}
Usage
import { PackageCard } from "@/components/ui/package-card"
export function Example() {
return (
<PackageCard
title="Growth"
points="1M credits"
price="$149"
badge="Popular"
features={["Priority queues", "Team analytics"]}
/>
)
}Props
| Prop | Type | Default |
|---|---|---|
| title | ReactNode | required |
| points | ReactNode | required |
| price | ReactNode | required |
| description | ReactNode | - |
| badge | ReactNode | - |
| features | ReactNode[] | [] |
| actionLabel | ReactNode | "Buy now" |
| loading | boolean | false |
| busy | boolean | false |
| onSelect | () => void | - |
Deploy and Scale Agents with ZGI
ZGI delivers the infrastructure and developer experience you need to ship reliable audio & agent applications at scale.
Talk to an expert