VOW // NEXTUI

Button

Elegant button with primary, secondary, and ghost variants in three sizes. Burgundy accent, serif labels, refined spacing. Renders as a Next.js Link when an href is provided.

$npx @voltenworks/shipui add button --theme vow
Or install the base component for free:
Live Preview
Open full demo
voltenworks.com/shipui/vow/demo/components#01-button
Usage
TSX
<Button variant="primary" size="md">Begin your consultation</Button>
Variants
<Button variant="primary">Begin your consultation</Button>
<Button variant="secondary">View collections</Button>
<Button variant="ghost">Learn more</Button>
<Button variant="primary" size="sm">Inquire</Button>
<Button variant="primary" size="lg">Book now</Button>
Source
TSX
import Link from 'next/link'
import { cn } from '@/lib/utils'

type Variant = 'primary' | 'secondary' | 'ghost'
type Size = 'sm' | 'md' | 'lg'

const variantClass: Record<Variant, string> = {
  primary: 'btn-primary',
  secondary: 'btn-secondary',
  ghost: 'btn-ghost',
}

const sizeClass: Record<Size, string> = {
  sm: 'btn-sm',
  md: 'btn-md',
  lg: 'btn-lg',
}

interface ButtonBaseProps {
  variant?: Variant
  size?: Size
  children: React.ReactNode
  className?: string
}

interface ButtonAsLink extends ButtonBaseProps {
  href: string
  onClick?: never
}

interface ButtonAsButton extends ButtonBaseProps {
  href?: never
  onClick?: () => void
}

type ButtonProps = ButtonAsLink | ButtonAsButton

export function Button({
  variant = 'primary',
  size = 'md',
  href,
  onClick,
  children,
  className,
}: ButtonProps): React.JSX.Element {
  const classes = cn('btn-base', variantClass[variant], sizeClass[size], className)

  if (href) {
    return (
      <Link href={href} className={classes}>
        {children}
      </Link>
    )
  }

  return (
    <button type="button" className={classes} onClick={onClick}>
      {children}
    </button>
  )
}
Preview in theme demoGet full theme, $29
Works withNext.js 15React 19Tailwind v4TypeScript 5
More from VOW // NEXT
VOW // NEXTUI

Badge

Refined badge with burgundy, gold, sage, ink, and ivory variants. Delicate uppercase tracking for floral and event contexts.

VOW // NEXTUI

Text

Polymorphic text component with body, caption, label, and code variants. Serif display for headings, clean sans for body.

VOW // NEXTUI

Card

Service card with numbered index, title, description, and tag. Clean lines and refined spacing for floral atelier services.