Card
Feature card with icon, title, optional badge, and description. Accepts an accent prop for a highlighted border variant. Icon set: book, code, key, zap, layers, terminal, shield, cpu.
<Card item={{ icon: 'zap', title: 'Fast by default', description: 'Optimized for edge runtimes.' }} /><Card item={{ icon: 'zap', title: 'Fast by default', description: 'Optimized for edge runtimes.' }} /><Card accent item={{ icon: 'shield', title: 'Secure', tag: 'New', tagVariant: 'green', description: 'Zero-trust request signing.' }} /><Card item={{ icon: 'terminal', title: 'CLI first', description: 'Install, scaffold, and deploy from the terminal.' }} />import type * as React from 'react'
import { cn } from '@/lib/utils'
import type { CardItem } from '@/types'
const icons: Record<CardItem['icon'], React.JSX.Element> = {
book: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20" />
<path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z" />
</svg>
),
code: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" />
</svg>
),
key: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<path d="M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4" />
</svg>
),
zap: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" />
</svg>
),
layers: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<polygon points="12 2 2 7 12 12 22 7 12 2" />
<polyline points="2 17 12 22 22 17" />
<polyline points="2 12 12 17 22 12" />
</svg>
),
terminal: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<polyline points="4 17 10 11 4 5" /><line x1="12" y1="19" x2="20" y2="19" />
</svg>
),
shield: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
</svg>
),
cpu: (
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round">
<rect x="9" y="9" width="6" height="6" /><rect x="2" y="2" width="20" height="20" rx="2" />
<path d="M9 2v2M15 2v2M9 20v2M15 20v2M2 9h2M2 15h2M20 9h2M20 15h2" />
</svg>
),
}
interface CardIconProps { icon: CardItem['icon'] }
function CardIcon({ icon }: CardIconProps): React.JSX.Element {
return icons[icon]
}
interface CardProps {
item: CardItem
accent?: boolean
className?: string
}
export function Card({ item, accent = false, className }: CardProps): React.JSX.Element {
return (
<div className={cn('vault-card', accent && 'vault-card--accent', className)}>
<div className="vault-card-header">
<div className="vault-card-icon">
<CardIcon icon={item.icon} />
</div>
<div>
<div className="vault-card-title">{item.title}</div>
{item.tag && (
<span className={cn('vault-badge', `vault-badge--${item.tagVariant ?? 'muted'}`, 'mt-1')}>
{item.tag}
</span>
)}
</div>
</div>
<p className="vault-card-desc">{item.description}</p>
</div>
)
}
Button
Dark docs-style button with primary, secondary, and ghost variants in three sizes. Renders as a Next.js Link for internal hrefs and a plain anchor for external links.
Badge
Semantic status badge with six color variants: green, blue, yellow, red, purple, and muted. Suited for version tags, API status labels, and changelog markers.
Callout
Inline callout block with four semantic variants: info, warn, tip, and danger. Each renders a matching icon and left-accent color for inline documentation alerts.
CodeBlock
Syntax-highlighted code block with a header showing the language or file title and a one-click copy button. Client component with clipboard feedback.