:root {
--neon-cyan: #00ffff;
--neon-magenta: #ff00ff;
--neon-yellow: #ffff00;
--neon-green: #39ff14;
--neon-orange: #ff6600;
--neon-pink: #ff1493;
--bg-void: #0a0a0f;
--bg-terminal: #0d1117;
--bg-panel: #161b22;
--bg-elevated: #21262d;
--text-primary: #e6edf3;
--text-secondary: #8b949e;
--text-muted: #484f58;
--gradient-neon: linear-gradient(135deg, var(--neon-cyan), var(--neon-magenta));
--gradient-terminal: linear-gradient(180deg, var(--bg-terminal) 0%, var(--bg-void) 100%);
--glow-cyan: 0 0 10px var(--neon-cyan), 0 0 20px var(--neon-cyan), 0 0 40px var(--neon-cyan);
--glow-magenta: 0 0 10px var(--neon-magenta), 0 0 20px var(--neon-magenta), 0 0 40px var(--neon-magenta);
--glow-green: 0 0 10px var(--neon-green), 0 0 20px var(--neon-green);
--font-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', Consolas, monospace;
--font-display: 'Orbitron', 'Rajdhani', sans-serif;
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2rem;
--space-2xl: 3rem;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-base: 300ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1);
--z-base: 0;
--z-overlay: 100;
--z-modal: 200;
--z-toast: 300;
}
[data-theme="light"] {
--bg-void: #f0f0f5;
--bg-terminal: #ffffff;
--bg-panel: #f5f5f5;
--bg-elevated: #e8e8e8;
--text-primary: #1a1a2e;
--text-secondary: #4a4a5a;
--text-muted: #8a8a9a;
--neon-cyan: #0088aa;
--neon-magenta: #aa0088;
--neon-green: #00aa44;
}
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
font-size: 16px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
font-family: var(--font-mono);
background: var(--gradient-terminal);
color: var(--text-primary);
line-height: 1.6;
min-height: 100vh;
overflow-x: hidden;
}
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 255, 255, 0.03) 2px,
rgba(0, 255, 255, 0.03) 4px
);
z-index: var(--z-overlay);
}
[data-theme="light"] body::before {
background: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 136, 170, 0.02) 2px,
rgba(0, 136, 170, 0.02) 4px
);
}
.neon-text {
text-shadow: var(--glow-cyan);
color: var(--neon-cyan);
}
.neon-text--magenta {
text-shadow: var(--glow-magenta);
color: var(--neon-magenta);
}
.neon-text--green {
text-shadow: var(--glow-green);
color: var(--neon-green);
}
.text-muted {
color: var(--text-muted);
}
.neon-pulse {
animation: neonPulse 2s ease-in-out infinite;
}
@keyframes neonPulse {
0%, 100% {
text-shadow:
0 0 5px var(--neon-cyan),
0 0 10px var(--neon-cyan),
0 0 20px var(--neon-cyan);
opacity: 1;
}
50% {
text-shadow:
0 0 2px var(--neon-cyan),
0 0 5px var(--neon-cyan),
0 0 10px var(--neon-cyan);
opacity: 0.8;
}
}
.glitch {
position: relative;
animation: glitchSkew 1s infinite linear alternate-reverse;
}
.glitch::before,
.glitch::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.glitch::before {
left: 2px;
text-shadow: -2px 0 var(--neon-magenta);
clip: rect(44px, 450px, 56px, 0);
animation: glitchAnim 5s infinite linear alternate-reverse;
}
.glitch::after {
left: -2px;
text-shadow: -2px 0 var(--neon-cyan);
clip: rect(44px, 450px, 56px, 0);
animation: glitchAnim2 5s infinite linear alternate-reverse;
}
@keyframes glitchSkew {
0% { transform: skew(0deg); }
20% { transform: skew(0deg); }
21% { transform: skew(1deg); }
22% { transform: skew(-1deg); }
23% { transform: skew(0deg); }
100% { transform: skew(0deg); }
}
@keyframes glitchAnim {
0% { clip: rect(31px, 9999px, 94px, 0); transform: skew(0.5deg); }
5% { clip: rect(70px, 9999px, 71px, 0); transform: skew(0.4deg); }
10% { clip: rect(29px, 9999px, 24px, 0); transform: skew(0.6deg); }
15% { clip: rect(3px, 9999px, 42px, 0); transform: skew(0.3deg); }
20% { clip: rect(51px, 9999px, 7px, 0); transform: skew(0.5deg); }
25% { clip: rect(13px, 9999px, 89px, 0); transform: skew(0.4deg); }
30% { clip: rect(64px, 9999px, 26px, 0); transform: skew(0.6deg); }
35% { clip: rect(41px, 9999px, 58px, 0); transform: skew(0.3deg); }
40% { clip: rect(87px, 9999px, 75px, 0); transform: skew(0.5deg); }
45% { clip: rect(22px, 9999px, 33px, 0); transform: skew(0.4deg); }
50% { clip: rect(56px, 9999px, 12px, 0); transform: skew(0.6deg); }
55% { clip: rect(8px, 9999px, 67px, 0); transform: skew(0.3deg); }
60% { clip: rect(95px, 9999px, 44px, 0); transform: skew(0.5deg); }
65% { clip: rect(18px, 9999px, 82px, 0); transform: skew(0.4deg); }
70% { clip: rect(39px, 9999px, 55px, 0); transform: skew(0.6deg); }
75% { clip: rect(73px, 9999px, 28px, 0); transform: skew(0.3deg); }
80% { clip: rect(5px, 9999px, 91px, 0); transform: skew(0.5deg); }
85% { clip: rect(48px, 9999px, 36px, 0); transform: skew(0.4deg); }
90% { clip: rect(62px, 9999px, 19px, 0); transform: skew(0.6deg); }
95% { clip: rect(84px, 9999px, 79px, 0); transform: skew(0.3deg); }
100% { clip: rect(27px, 9999px, 63px, 0); transform: skew(0.5deg); }
}
@keyframes glitchAnim2 {
0% { clip: rect(65px, 9999px, 99px, 0); transform: skew(0.5deg); }
5% { clip: rect(12px, 9999px, 77px, 0); transform: skew(-0.4deg); }
10% { clip: rect(45px, 9999px, 23px, 0); transform: skew(0.3deg); }
15% { clip: rect(88px, 9999px, 54px, 0); transform: skew(-0.6deg); }
20% { clip: rect(33px, 9999px, 8px, 0); transform: skew(0.4deg); }
25% { clip: rect(76px, 9999px, 41px, 0); transform: skew(-0.3deg); }
30% { clip: rect(19px, 9999px, 86px, 0); transform: skew(0.5deg); }
35% { clip: rect(57px, 9999px, 15px, 0); transform: skew(-0.4deg); }
40% { clip: rect(4px, 9999px, 69px, 0); transform: skew(0.3deg); }
45% { clip: rect(92px, 9999px, 38px, 0); transform: skew(-0.6deg); }
50% { clip: rect(26px, 9999px, 81px, 0); transform: skew(0.4deg); }
55% { clip: rect(61px, 9999px, 47px, 0); transform: skew(-0.3deg); }
60% { clip: rect(11px, 9999px, 94px, 0); transform: skew(0.5deg); }
65% { clip: rect(79px, 9999px, 22px, 0); transform: skew(-0.4deg); }
70% { clip: rect(34px, 9999px, 66px, 0); transform: skew(0.3deg); }
75% { clip: rect(97px, 9999px, 3px, 0); transform: skew(-0.6deg); }
80% { clip: rect(43px, 9999px, 58px, 0); transform: skew(0.4deg); }
85% { clip: rect(7px, 9999px, 85px, 0); transform: skew(-0.3deg); }
90% { clip: rect(71px, 9999px, 31px, 0); transform: skew(0.5deg); }
95% { clip: rect(52px, 9999px, 74px, 0); transform: skew(-0.4deg); }
100% { clip: rect(16px, 9999px, 49px, 0); transform: skew(0.3deg); }
}
.terminal {
background: var(--bg-terminal);
border: 1px solid var(--neon-cyan);
border-radius: var(--radius-md);
box-shadow:
0 0 10px rgba(0, 255, 255, 0.2),
inset 0 0 20px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.terminal__header {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-md);
background: var(--bg-elevated);
border-bottom: 1px solid var(--neon-cyan);
}
.terminal__dot {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--neon-magenta);
}
.terminal__dot--yellow { background: var(--neon-yellow); }
.terminal__dot--green { background: var(--neon-green); }
.terminal__title {
font-size: 0.875rem;
color: var(--text-secondary);
margin-left: auto;
}
.terminal__body {
padding: var(--space-md);
font-family: var(--font-mono);
font-size: 0.875rem;
line-height: 1.8;
}
.terminal__prompt {
color: var(--neon-green);
}
.terminal__prompt::before {
content: '> ';
color: var(--neon-cyan);
}
.terminal__cursor {
display: inline-block;
width: 8px;
height: 1.2em;
background: var(--neon-cyan);
margin-left: 2px;
animation: blink 1s step-end infinite;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.btn {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-lg);
font-family: var(--font-mono);
font-size: 0.875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--neon-cyan);
background: transparent;
border: 2px solid var(--neon-cyan);
border-radius: var(--radius-sm);
cursor: pointer;
overflow: hidden;
transition: all var(--transition-fast);
text-decoration: none;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(0, 255, 255, 0.4),
transparent
);
transition: left var(--transition-base);
}
.btn:hover::before {
left: 100%;
}
.btn:hover {
box-shadow: var(--glow-cyan);
transform: translateY(-2px);
}
.btn:active {
transform: translateY(0);
}
.btn--magenta {
color: var(--neon-magenta);
border-color: var(--neon-magenta);
}
.btn--magenta:hover {
box-shadow: var(--glow-magenta);
}
.btn--filled {
background: var(--neon-cyan);
color: var(--bg-void);
}
.btn--filled:hover {
background: var(--neon-magenta);
border-color: var(--neon-magenta);
}
.btn--small {
padding: var(--space-xs) var(--space-md);
font-size: 0.75rem;
}
.input {
width: 100%;
padding: var(--space-sm) var(--space-md);
font-family: var(--font-mono);
font-size: 1rem;
color: var(--text-primary);
background: var(--bg-terminal);
border: 1px solid var(--text-muted);
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
}
.input:focus {
outline: none;
border-color: var(--neon-cyan);
box-shadow: 0 0 10px rgba(0, 255, 255, 0.3);
}
.input::placeholder {
color: var(--text-muted);
}
.slider {
-webkit-appearance: none;
width: 100%;
height: 8px;
border-radius: var(--radius-sm);
background: var(--bg-elevated);
outline: none;
margin: var(--space-sm) 0;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--neon-cyan);
cursor: pointer;
box-shadow: var(--glow-cyan);
}
.slider::-moz-range-thumb {
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--neon-cyan);
cursor: pointer;
border: none;
box-shadow: var(--glow-cyan);
}
.card {
position: relative;
background: var(--bg-panel);
border: 1px solid var(--text-muted);
border-radius: var(--radius-md);
padding: var(--space-lg);
transition: all var(--transition-base);
}
.card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: var(--gradient-neon);
opacity: 0;
transition: opacity var(--transition-fast);
}
.card:hover {
border-color: var(--neon-cyan);
transform: translateY(-4px);
}
.card:hover::before {
opacity: 1;
}
.card__title {
font-family: var(--font-display);
font-size: 1.25rem;
font-weight: 700;
color: var(--neon-cyan);
margin-bottom: var(--space-sm);
}
.card__content {
color: var(--text-secondary);
}
.progress {
height: 8px;
background: var(--bg-elevated);
border-radius: var(--radius-sm);
overflow: hidden;
}
.progress__bar {
height: 100%;
background: var(--gradient-neon);
border-radius: var(--radius-sm);
transition: width var(--transition-slow);
position: relative;
}
.progress__bar::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.3) 50%,
transparent 100%
);
animation: progressShine 2s infinite;
}
@keyframes progressShine {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.skeleton {
background: linear-gradient(
90deg,
var(--bg-elevated) 0%,
var(--bg-panel) 50%,
var(--bg-elevated) 100%
);
background-size: 200% 100%;
animation: skeletonShimmer 1.5s infinite;
border-radius: var(--radius-sm);
}
@keyframes skeletonShimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.skeleton--text {
height: 1rem;
margin-bottom: var(--space-sm);
}
.skeleton--title {
height: 1.5rem;
width: 60%;
margin-bottom: var(--space-md);
}
.skeleton--avatar {
width: 48px;
height: 48px;
border-radius: 50%;
}
.toast-container {
position: fixed;
bottom: var(--space-lg);
right: var(--space-lg);
z-index: var(--z-toast);
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.toast {
padding: var(--space-md) var(--space-lg);
background: var(--bg-panel);
border-left: 4px solid var(--neon-cyan);
border-radius: var(--radius-sm);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
transform: translateX(120%);
transition: transform var(--transition-base);
display: flex;
align-items: center;
gap: var(--space-sm);
}
.toast--visible {
transform: translateX(0);
}
.toast--success { border-left-color: var(--neon-green); }
.toast--warning { border-left-color: var(--neon-yellow); }
.toast--error { border-left-color: var(--neon-magenta); }
.toast__icon {
width: 20px;
height: 20px;
flex-shrink: 0;
}
.toast__icon svg {
width: 100%;
height: 100%;
fill: none;
stroke: currentColor;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
.toast--success .toast__icon { color: var(--neon-green); }
.toast--warning .toast__icon { color: var(--neon-yellow); }
.toast--error .toast__icon { color: var(--neon-magenta); }
.toast__message { color: var(--text-primary); }
.grid {
display: grid;
gap: var(--space-lg);
}
.grid--2 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 1024px) {
.grid--4 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
.grid--4,
.grid--3,
.grid--2 { grid-template-columns: 1fr; }
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--space-lg);
}
.section {
padding: var(--space-2xl) 0;
}
.section--dark {
background: var(--bg-void);
}
.section__title {
font-family: var(--font-display);
font-size: 2rem;
text-align: center;
margin-bottom: var(--space-xl);
color: var(--neon-cyan);
}
.divider {
border: none;
border-top: 1px solid var(--text-muted);
margin: var(--space-md) 0;
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
:focus-visible {
outline: 2px solid var(--neon-cyan);
outline-offset: 2px;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}