Version: 1.0.0 Theme: VOLCANIC - Dark Luxe Nuclear Observatory
ReactorMap is an interactive 3D visualization of global nuclear power infrastructure. The design language combines:
- Scientific precision - Data-driven, technical aesthetic
- Dark luxury - Premium feel with volcanic/obsidian palette
- Nuclear energy themes - Radioactive greens, warning colors, glow effects
| Name | Variable | Hex | Usage |
|---|---|---|---|
| Obsidian | --obsidian |
#050505 |
Primary background |
| Charcoal | --charcoal |
#111111 |
Secondary background, panels |
| Cream | --cream |
#f5f0e8 |
Primary text |
| Silver | --silver |
#a0a0a0 |
Secondary text, muted content |
| Muted | --muted |
#666666 |
Disabled states, subtle text |
| Name | Variable | Hex | Usage |
|---|---|---|---|
| Lava | --lava |
#e85d04 |
Primary accent, CTAs, links |
| Lava Light | --lava-light |
#ff7b29 |
Hover states |
| Reactor Green | --reactor-green |
#22ff66 |
Operational status, success |
| Status | Color | Hex |
|---|---|---|
| Operational | Green | #22ff66 |
| Under Construction | Yellow | #ffee00 |
| Planned | Blue | #00aaff |
| Suspended | Orange | #ff9900 |
| Shutdown | Gray | #888888 |
| Cancelled | Red | #ff4444 |
// Background
bg-obsidian // #050505
bg-charcoal // #111111
// Text
text-cream // #f5f0e8
text-silver // #a0a0a0
text-muted // #666666
text-lava // #e85d04
text-lava-light // #ff7b29
// Accents
bg-lava/20 // Semi-transparent orange
text-[#22ff66] // Reactor green (operational)| Type | Font | Variable | Fallbacks |
|---|---|---|---|
| Display | Cormorant Garamond | --font-display |
Georgia, serif |
| Body | IBM Plex Sans | --font-body |
system-ui, sans-serif |
| Mono | JetBrains Mono | --font-mono |
Fira Code, monospace |
| Element | Classes | Size |
|---|---|---|
| Page Title | text-4xl md:text-6xl font-display font-bold |
36px → 60px |
| Section Title | text-2xl font-semibold |
24px |
| Card Title | text-xl font-semibold |
20px |
| Body | text-base |
16px |
| Small | text-sm |
14px |
| Caption | text-xs |
12px |
// Page title
<h1 className="text-4xl md:text-6xl font-display font-bold mb-4">
Page Title
</h1>
// Section heading
<h2 className="text-2xl font-semibold mb-4 text-cream">
Section Title
</h2>
// Monospace numbers/data
<span className="font-mono font-bold text-[#22ff66]">
441
</span>Standard hero with glow effect for index pages.
<div className="relative overflow-hidden">
{/* Glow Effect */}
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[300px] bg-[#22ff66]/10 rounded-full blur-[100px]" />
</div>
<div className="max-w-6xl mx-auto px-4 py-12 relative">
<div className="text-center mb-8">
<h1 className="text-4xl md:text-6xl font-display font-bold mb-4">
Page Title
</h1>
<p className="text-xl text-silver">
Subtitle text
</p>
</div>
{/* Stats Row */}
<div className="flex flex-wrap justify-center gap-6 text-center">
<div>
<div className="text-2xl font-mono font-bold text-[#22ff66]">123</div>
<div className="text-sm text-silver">Label</div>
</div>
<div className="w-px bg-white/20" />
<div>
<div className="text-2xl font-mono font-bold text-cream">456</div>
<div className="text-sm text-silver">Label</div>
</div>
</div>
</div>
</div>Frosted glass effect for cards and containers.
<div className="glass-panel rounded-xl p-6">
{/* Content */}
</div>CSS Definition:
.glass-panel {
background: rgba(255, 255, 255, 0.03);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
}Standard header with back navigation and CTA.
<header className="border-b border-white/10 bg-charcoal/50 backdrop-blur-xl">
<div className="max-w-6xl mx-auto px-4 py-4 flex items-center justify-between">
<Link href="/" className="flex items-center gap-2 text-silver hover:text-cream transition-colors">
<ArrowLeftIcon className="w-5 h-5" />
<span className="font-medium">ReactorMap</span>
</Link>
<Link href="/" className="flex items-center gap-2 px-4 py-2 bg-lava/20 hover:bg-lava/30 text-lava-light rounded-lg transition-colors">
<MapIcon className="w-4 h-4" />
View on Map
</Link>
</div>
</header>Simple breadcrumb navigation.
<nav className="max-w-6xl mx-auto px-4 py-3 text-sm text-silver">
<ol className="flex items-center gap-2">
<li>
<Link href="/" className="hover:text-cream transition-colors">Home</Link>
</li>
<li>/</li>
<li className="text-cream">Current Page</li>
</ol>
</nav>For displaying key metrics.
<div className="text-center">
<div className="text-2xl font-mono font-bold text-[#22ff66]">
{value}
</div>
<div className="text-sm text-silver">{label}</div>
</div>Colored indicator for reactor status.
<span className="flex items-center gap-2">
<span
className="w-3 h-3 rounded-full"
style={{ backgroundColor: statusColor }}
/>
<span>{statusLabel}</span>
</span><button className="btn-primary">
Primary Action
</button>
// Or with Tailwind
<button className="px-6 py-3 bg-lava hover:bg-lava-light text-cream rounded-lg font-medium transition-colors">
Primary Action
</button><button className="btn-secondary">
Secondary Action
</button>
// Or with Tailwind
<button className="px-6 py-3 border border-white/20 hover:bg-white/5 text-cream rounded-lg transition-colors">
Secondary Action
</button><Link className="px-4 py-2 glass-panel rounded-lg hover:bg-white/10 transition-colors">
Browse by Country →
</Link>Horizontal progress indicator.
<div className="h-2 bg-white/10 rounded-full overflow-hidden">
<div
className="h-full bg-lava rounded-full transition-all"
style={{ width: `${percentage}%` }}
/>
</div>Standard table styling.
<div className="glass-panel rounded-xl overflow-hidden">
<div className="overflow-x-auto">
<table className="w-full">
<thead className="bg-white/5 border-b border-white/10">
<tr>
<th className="text-left px-4 py-3 font-medium text-silver">Header</th>
</tr>
</thead>
<tbody>
<tr className="border-b border-white/5 hover:bg-white/5 transition-colors">
<td className="px-4 py-3">Cell</td>
</tr>
</tbody>
</table>
</div>
</div><main className="min-h-screen bg-obsidian text-cream">
{/* Header */}
<PageHeader />
{/* Breadcrumb */}
<Breadcrumb items={[...]} />
{/* Hero Section */}
<Hero title="..." subtitle="..." stats={[...]} />
{/* Main Content */}
<div className="max-w-6xl mx-auto px-4 py-8">
{/* Content sections */}
</div>
{/* Footer/Data Source */}
<p className="mt-12 text-sm text-muted text-center">
Data source: IAEA PRIS database • Updated regularly
</p>
</main>| Width | Class | Usage |
|---|---|---|
| Small | max-w-4xl |
About page, text-heavy content |
| Standard | max-w-6xl |
Index pages, grids |
| Full | max-w-7xl |
Wide layouts |
// 3-column responsive grid
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
{/* Cards */}
</div>
// 2-column grid
<div className="grid gap-4 md:grid-cols-2">
{/* Cards */}
</div>Using Tailwind's default scale with common patterns:
| Token | Value | Usage |
|---|---|---|
gap-2 |
8px | Inline elements |
gap-4 |
16px | Card grid gaps |
gap-6 |
24px | Section gaps |
py-3 |
12px | Nav/breadcrumb padding |
py-4 |
16px | Header padding |
py-8 |
32px | Content section padding |
py-12 |
48px | Hero section padding |
mb-4 |
16px | Heading bottom margin |
mb-8 |
32px | Section bottom margin |
// Green glow (default for heroes)
<div className="absolute ... w-[600px] h-[300px] bg-[#22ff66]/10 rounded-full blur-[100px]" />
// Orange/lava glow (alternative)
<div className="absolute ... bg-lava/10 rounded-full blur-[100px]" />/* Standard transition for interactive elements */
transition-colors /* For color changes */
transition-all /* For complex animations */
/* Duration: 150ms (Tailwind default) */// Links
hover:text-cream
hover:text-lava
// Buttons/Cards
hover:bg-white/5
hover:bg-white/10
hover:bg-lava/30- Primary text (
creamonobsidian): 15.4:1 ratio - Secondary text (
silveronobsidian): 7.2:1 ratio - Accent links (
lavaonobsidian): 5.1:1 ratio
focus:outline-none
focus:ring-2
focus:ring-lava
focus:ring-offset-2
focus:ring-offset-obsidianMinimum 44x44px for interactive elements on mobile.
Using inline SVG with Heroicons patterns:
// Standard icon size
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="..." />
</svg>
// Small icon size
<svg className="w-4 h-4" ... />ReactorMap is dark-mode only. The obsidian/charcoal palette provides:
- Reduced eye strain for data-heavy viewing
- Premium, observatory-like aesthetic
- Better contrast for colorful status indicators
- Optimal viewing of the 3D globe visualization
/**
* Component description
*/
export default function ComponentName({ prop1, prop2 }: Props) {
// JSON-LD structured data (if needed)
const jsonLd = { ... };
return (
<>
{/* Structured data */}
<script type="application/ld+json" ... />
{/* Main content */}
<main className="min-h-screen bg-obsidian text-cream">
...
</main>
</>
);
}src/
├── app/ # Next.js App Router pages
├── components/
│ ├── ui/ # Shared UI components
│ │ ├── Hero.tsx
│ │ ├── GlassPanel.tsx
│ │ ├── PageHeader.tsx
│ │ └── ...
│ └── v3/ # Globe/3D components
├── lib/ # Utilities and types
└── styles/ # Global styles