CERN Particle Detector UI Design System
This skill provides the complete design system for the Composition app's "CERN Particle Detector" aesthetic - inspired by CERN control rooms, ATLAS/CMS detector visualizations, and particle physics instrumentation.
When to Use This Skill
- Building new UI components
- Styling existing components
- Implementing layout patterns
- Creating detector-style interfaces
- Building 3D workstation controls
Design Philosophy
NOT a generic terminal. This is a research instrument interface:
- Circular/radial elements - detector cross-sections, not rectangular cards
- Wire chamber aesthetic - fine grids, track visualizations
- Particle color language - each color has scientific meaning
- Data-dense but elegant - like real physics control software
Color Palette
Void (Backgrounds)
| Variable |
Hex |
Usage |
--void-deep |
#030305 |
Page background |
--void-primary |
#060609 |
Main background |
--void-secondary |
#0a0a0f |
Panel backgrounds |
--void-tertiary |
#0f0f16 |
Elevated surfaces |
--void-elevated |
#14141e |
Cards, modals |
Wire Chamber
| Variable |
Hex |
Usage |
--wire-dim |
#1a1a2e |
Subtle borders, grids |
--wire-medium |
#252540 |
Scrollbars, dividers |
--wire-bright |
#3d3d66 |
Hover states, accents |
Particle Colors
| Variable |
Hex |
Meaning |
--particle-gold |
#ffd700 |
Verified, stable, heavy particles |
--particle-cyan |
#00d4ff |
Active tracking, live data, leptons |
--particle-magenta |
#ff2d7e |
Collisions, processing, bosons |
--particle-green |
#39ff14 |
Element traces, hadrons |
--particle-orange |
#ff8c00 |
Warnings, estimations, jets |
Node Types (Composition Hierarchy)
| Variable |
Hex |
Type |
--node-product |
#ffffff |
Product nodes |
--node-component |
--particle-cyan |
Component nodes |
--node-material |
--particle-orange |
Material nodes |
--node-chemical |
--particle-green |
Chemical nodes |
--node-element |
--particle-gold |
Element nodes |
Text
| Variable |
Hex |
Usage |
--text-bright |
#f0f0f8 |
Headings, emphasis |
--text-primary |
#d0d0e0 |
Body text |
--text-secondary |
#8080a0 |
Labels, muted |
--text-tertiary |
#505070 |
Disabled, hints |
--text-data |
--particle-cyan |
Data values |
--text-highlight |
--particle-gold |
Verified data |
Typography
--font-display: 'DM Sans', system-ui, sans-serif;
--font-mono: 'Space Mono', 'Overpass Mono', monospace;
--font-data: 'Overpass Mono', 'Space Mono', monospace;
Usage Classes
// Display text
className="font-display text-lg font-semibold text-[var(--text-bright)]"
// Mono labels
className="font-mono text-xs text-[var(--text-secondary)] uppercase tracking-wider"
// Data readouts
className="font-data text-sm text-[var(--text-data)] tabular-nums"
// Detector label style
className="label-detector" // 10px, uppercase, 0.15em tracking
Component Patterns
Detector Panel
<div className="detector-panel">
<div className="detector-panel-header">
<span className="label-detector">Panel Title</span>
</div>
<div className="detector-panel-content">
{children}
</div>
</div>
Detector Input
<input
className="detector-input"
placeholder="Enter value..."
/>
Detector Buttons
// Standard
<button className="btn-detector">Action</button>
// Primary (cyan gradient)
<button className="btn-detector btn-detector-primary">Analyze</button>
// Gold accent
<button className="btn-detector btn-detector-gold">Verify</button>
Status Indicator
<div className="status-indicator status-active" /> // Cyan with pulse
<div className="status-indicator status-verified" /> // Gold
<div className="status-indicator status-warning" /> // Orange
<div className="status-indicator status-error" /> // Magenta
Specimen Tag
<button className="specimen-tag">iPhone 15 Pro</button>
Has automatic cyan dot before text, hover glow effect.
Readout Display
<div className="flex flex-col gap-1">
<span className="label-detector">Label</span>
<div className="font-data text-lg tabular-nums">
<span className="particle-cyan">42.5</span>
<span className="text-[var(--text-tertiary)] text-sm ml-1">units</span>
</div>
</div>
Wire Frame Container
<div className="wire-frame p-4">
{/* Has corner brackets automatically */}
{children}
</div>
Layout Patterns
Detector Background
<div className="detector-bg min-h-screen">
{/* Radial rings + grid pattern + center glow */}
</div>
App Shell
┌────────────────────────────────────────────────────────────┐
│ ◉ STATUS │ TITLE │ SESSION │
├──────────┼────────────────────────────────────┼────────────┤
│ SIDEBAR │ MAIN CONTENT │ READOUTS │
│ │ │ │
│ │ │ │
├──────────┴────────────────────────────────────┴────────────┤
│ BOTTOM PANEL (Tabs: Hierarchy | Chat) │
└────────────────────────────────────────────────────────────┘
Corner Brackets (Decorative)
<div className="fixed top-4 left-4 w-8 h-8 border-l-2 border-t-2 border-[var(--wire-dim)]" />
<div className="fixed top-4 right-4 w-8 h-8 border-r-2 border-t-2 border-[var(--wire-dim)]" />
<div className="fixed bottom-4 left-4 w-8 h-8 border-l-2 border-b-2 border-[var(--wire-dim)]" />
<div className="fixed bottom-4 right-4 w-8 h-8 border-r-2 border-b-2 border-[var(--wire-dim)]" />
Animation Classes
.animate-pulse-ring /* Expanding ring for status indicators */
.animate-detector-scan /* 360° rotation for scanning effects */
.animate-data-stream /* Horizontal data flow */
.animate-glow-pulse /* Opacity pulse for active elements */
.animate-fade-in /* 300ms fade in */
.animate-slide-up /* 300ms slide up with fade */
.animate-slide-in-right /* 300ms slide from right */
/* Stagger delays */
.stagger-1 through .stagger-5 /* 50ms increments */
Transitions
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
--ease-in-out-expo: cubic-bezier(0.87, 0, 0.13, 1);
--duration-instant: 50ms;
--duration-fast: 150ms;
--duration-normal: 300ms;
--duration-slow: 500ms;
Motion Principles
- Quick responses (150ms) for hover/click feedback
- Expo easing for smooth, physics-like movement
- Pulse animations for live status indicators
- Staggered reveals for list items
- Spring physics for 3D camera movements
Accessibility
- Maintain WCAG 2.1 AA contrast ratios (particle colors are designed for this)
- All interactive elements keyboard accessible
- Focus indicators:
outline: 1px solid var(--particle-cyan); outline-offset: 2px;
- Status changes announced to screen readers
- Reduced motion: Respect
prefers-reduced-motion
SVG Patterns
Detector Rings
<svg viewBox="0 0 400 400">
{[160, 140, 120, 100, 80].map((r, i) => (
<circle
key={i}
cx="200" cy="200" r={r}
stroke="var(--wire-dim)"
strokeWidth="1"
fill="none"
opacity={0.5 - i * 0.08}
/>
))}
</svg>
Sector Lines
{Array.from({ length: 12 }).map((_, i) => {
const angle = (i * 30 * Math.PI) / 180;
return (
<line
x1={200 + 60 * Math.cos(angle)}
y1={200 + 60 * Math.sin(angle)}
x2={200 + 165 * Math.cos(angle)}
y2={200 + 165 * Math.sin(angle)}
stroke="var(--wire-dim)"
strokeWidth="1"
opacity="0.3"
/>
);
})}