Setup Guide
One-time setup for using WANTED // NEXT components. Add these to your project, then copy any component from the theme.
The cn() utility combines clsx and tailwind-merge for conditional class names. Install both packages.
npm install clsx tailwind-mergeCreate lib/utils.ts with the cn() helper. Every component imports this for class name merging.
import { type ClassValue, clsx } from 'clsx'
import { twMerge } from 'tailwind-merge'
export function cn(...inputs: ClassValue[]): string {
return twMerge(clsx(inputs))
}Add the WANTED // NEXT design tokens to your globals.css. These define colors, fonts, and animation tokens used by every component in the theme.
@theme {
/* ─── Color Tokens ─── */
--color-accent: #C4841D;
--color-accent-dark: #9A6615;
--color-accent-light: #D4A04A;
--color-cream: #F5EDD6;
--color-cream-dark: #E8DFC5;
--color-parchment: #EDE4CB;
--color-ink: #2A1F0E;
--color-ink-light: #4A3D28;
--color-charcoal: #1A1208;
--color-dust: #B8A88A;
--color-rust: #8B4513;
--color-blood: #6B1C0A;
--color-sage: #7A7A5A;
/* ─── Fonts ─── */
--font-display: 'Rye', serif;
--font-body: 'Courier Prime', monospace;
/* ─── Radius ─── */
--radius-sm: 0px;
--radius-md: 0px;
--radius-lg: 0px;
/* ─── Shadows ─── */
--shadow-poster: 4px 4px 0 var(--color-ink), 6px 6px 0 rgba(42,31,14,0.3);
--shadow-soft: 0 2px 20px rgba(42,31,14,0.15);
}Each component may need its own CSS classes in your globals.css. Copy the styles for the components you use.
/* ─── BUTTON SYSTEM ─── */
.btn {
display: inline-block;
font-family: var(--font-courier-prime, var(--font-body));
font-size: 11px;
letter-spacing: 4px;
text-transform: uppercase;
text-decoration: none;
text-align: center;
border: 2px solid var(--color-ink);
cursor: pointer;
transition: all 0.2s;
font-weight: 700;
line-height: 1;
}
.btn-sm { padding: 8px 16px; font-size: 10px; }
.btn-md { padding: 12px 24px; font-size: 11px; }
.btn-lg { padding: 16px 32px; font-size: 12px; }
.btn-primary {
background: var(--color-accent);
border-color: var(--color-accent);
color: var(--color-charcoal);
}
.btn-primary:hover {
background: var(--color-accent-dark);
border-color: var(--color-accent-dark);
}
.btn-secondary {
background: transparent;
border-color: var(--color-ink);
color: var(--color-ink);
}
.btn-secondary:hover {
background: var(--color-ink);
color: var(--color-cream);
}
.btn-ghost {
background: transparent;
border-color: transparent;
color: var(--color-accent);
}
.btn-ghost:hover {
background: rgba(196,132,29,0.1);
border-color: rgba(196,132,29,0.2);
}
.btn-secondary-dark {
background: transparent;
border-color: var(--color-dust);
color: var(--color-dust);
}
.btn-secondary-dark:hover {
background: var(--color-dust);
color: var(--color-ink);
}/* ─── BADGE SYSTEM ─── */
.badge {
font-size: 9px;
letter-spacing: 5px;
text-transform: uppercase;
padding: 4px 12px;
display: inline-block;
font-family: var(--font-courier-prime, var(--font-body));
font-weight: 700;
}
.badge-critical {
background: var(--color-blood);
color: var(--color-cream);
}
.badge-high {
background: var(--color-accent);
color: var(--color-charcoal);
}
.badge-medium {
background: var(--color-dust);
color: var(--color-ink);
}
.badge-accent {
background: var(--color-ink);
color: var(--color-accent);
}/* ─── TEXT SYSTEM ─── */
.text-body {
font-size: 14px;
color: var(--color-ink-light);
line-height: 1.8;
}
.text-caption {
font-size: 11px;
color: var(--color-sage);
letter-spacing: 2px;
text-transform: uppercase;
}
.text-label {
font-size: 10px;
font-weight: 700;
letter-spacing: 4px;
text-transform: uppercase;
color: var(--color-rust);
}
.text-code {
font-family: var(--font-courier-prime, var(--font-body));
font-size: 13px;
background: var(--color-cream-dark);
color: var(--color-ink);
padding: 2px 8px;
border: 1px solid var(--color-dust);
}/* ─── CARD SYSTEM ─── */
.card {
background: var(--color-parchment);
border: 2px solid var(--color-ink);
padding: 32px;
position: relative;
transition: transform 0.2s;
}
.card:hover { transform: translateY(-2px); }
.card-tag {
margin-bottom: 16px;
}
.card-title {
font-family: var(--font-rye, var(--font-display));
font-size: 20px;
color: var(--color-ink);
margin-bottom: 12px;
line-height: 1.3;
}
.card-desc {
font-size: 13px;
color: var(--color-ink-light);
line-height: 1.7;
}Button
Western bounty button with primary, secondary, ghost, and secondary-dark variants in three sizes. Gold accent, uppercase Rye display font, parchment textures. Renders as a Next.js Link when an href is provided.
Badge
Severity badge with critical, high, medium, and accent variants. Uppercase labels for bounty threat levels and status indicators.
Text
Polymorphic text component with body, caption, label, and code variants. Rye for display headings, Source Serif for body copy, western parchment palette.
Card
Bounty card with tag badge, title, and description. Dark parchment surface with severity-colored badge indicators for vulnerability and threat categories.