VAULT // NEXTUI

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.

$npx @voltenworks/shipui add card --theme vault
Or install the base component for free:
Live Preview
Open full demo
voltenworks.com/shipui/vault/demo/components
Usage
TSX
<Card item={{ icon: 'zap', title: 'Fast by default', description: 'Optimized for edge runtimes.' }} />
Variants
<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.' }} />
Source
TSX
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>
  )
}
Preview in theme demoGet full theme, $29
Works withNext.js 15React 19Tailwind v4TypeScript 5
More from VAULT // NEXT
VAULT // NEXTUI

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.

VAULT // NEXTUI

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.

VAULT // NEXTUI

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.

VAULT // NEXTUI

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.