@import 'tailwindcss'; @theme { --color-*: initial; } @variant dark (&:where(.dark, .dark *)); @layer base { :root { /* Light mode colors */ --bg-primary: 250 250 250; --bg-secondary: 240 240 243; --bg-tertiary: 228 228 231; --text-primary: 24 24 27; --text-secondary: 63 63 70; --text-muted: 113 113 122; --border-primary: 212 212 216; --border-subtle: 228 228 231; --text-color: #1f1f1f; /* Desaturated cyberpunk for light mode - darker for readability */ --neon-pink: #7a3d52; --neon-cyan: #2d5a63; --neon-purple: #5a4670; --neon-magenta: #7a3d6b; } .dark { /* Dark mode colors - INDUSTRIAL */ --bg-primary: 24 24 27; --bg-secondary: 15 23 42; --bg-tertiary: 30 41 59; --text-primary: 241 245 249; --text-secondary: 203 213 225; --text-muted: 100 116 139; --border-primary: 71 85 105; --border-subtle: 30 41 59; --text-color: #d4d4d8; /* Desaturated cyberpunk for dark mode */ --neon-pink: #8a5568; --neon-cyan: #4d7580; --neon-purple: #6a5685; --neon-magenta: #8a5579; } } @layer utilities { /* Scrollbar hiding utility */ .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } /* Industrial/Terminal aesthetic utilities */ .grid-bg { background-image: linear-gradient(rgba(100, 116, 139, 0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(100, 116, 139, 0.1) 1px, transparent 1px); background-size: 20px 20px; } /* Noise texture */ .noise-bg { background-image: url('/noise.svg'); opacity: 0.03; pointer-events: none; } /* Scanline effect */ .scanline { background: linear-gradient(0deg, transparent 0%, rgba(6, 182, 212, 0.1) 50%, transparent 100%); background-size: 100% 3px; pointer-events: none; } .scanline::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient( to bottom, transparent 0%, rgba(6, 182, 212, 0.05) 50%, transparent 100% ); animation: scanline 8s linear infinite; pointer-events: none; } /* CRT screen curvature effect */ .crt-effect { animation: flicker 0.15s infinite; } /* Glitch text effect */ .glitch-text { position: relative; } .glitch-text::before, .glitch-text::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; } .glitch-text.active::before { color: #06b6d4; animation: glitch-1 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%); transform: translate(-2px, -2px); opacity: 0.8; } .glitch-text.active::after { color: #10b981; animation: glitch-2 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%); transform: translate(2px, 2px); opacity: 0.8; } /* Consolidated keyframes to avoid duplication */ @keyframes glitch-1 { 0%, 100% { clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%); transform: translate(0); } 20% { clip-path: polygon(0 15%, 100% 15%, 100% 65%, 0 65%); } 40% { clip-path: polygon(0 30%, 100% 30%, 100% 70%, 0 70%); } 60% { clip-path: polygon(0 5%, 100% 5%, 100% 60%, 0 60%); } 80% { clip-path: polygon(0 25%, 100% 25%, 100% 40%, 0 40%); } } @keyframes glitch-2 { 0%, 100% { clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%); transform: translate(0); } 20% { clip-path: polygon(0 70%, 100% 70%, 100% 95%, 0 95%); } 40% { clip-path: polygon(0 40%, 100% 40%, 100% 85%, 0 85%); } 60% { clip-path: polygon(0 60%, 100% 60%, 100% 100%, 0 100%); } 80% { clip-path: polygon(0 50%, 100% 50%, 100% 90%, 0 90%); } } /* Grayscale filter with instant toggle */ .grayscale { filter: grayscale(100%); } .grayscale-0 { filter: grayscale(0%); } /* Cyberpunk Glitch Effect for Button */ .glitch-btn { position: relative; animation: glitch 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } .glitch-layer { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; opacity: 0.8; clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%); } .glitch-layer:first-of-type { animation: glitch-1 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); color: rgb(6 182 212); /* cyan-500 */ transform: translate(-2px, 0); clip-path: polygon(0 0, 100% 0, 100% 35%, 0 35%); } .glitch-layer:last-of-type { animation: glitch-2 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); color: rgb(16 185 129); /* emerald-500 */ transform: translate(2px, 0); clip-path: polygon(0 65%, 100% 65%, 100% 100%, 0 100%); } /* Border Pulse Animation */ .border-pulse { animation: pulse-border 2s ease-in-out infinite; } /* Screen Flicker Effect */ body.screen-flicker { animation: flicker 150ms ease-in-out; } body.screen-flicker::before { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(6, 182, 212, 0.1); pointer-events: none; z-index: 9999; animation: flicker 150ms ease-in-out; } /* CRT Noise Texture */ @supports (filter: url('#noise')) { .noise-bg { filter: url('#noise'); } } /* SCP-style subtle flicker hover */ @keyframes scp-flicker { 0%, 100% { border-color: rgb(71 85 105); box-shadow: 0 0 0 rgba(90, 139, 149, 0); transform: translate(0, 0); } 20% { border-color: var(--neon-cyan); box-shadow: 0 0 3px rgba(90, 139, 149, 0.3); transform: translate(-0.5px, 0); } 40% { border-color: rgb(71 85 105); box-shadow: 0 0 0 rgba(90, 139, 149, 0); transform: translate(0, 0); } 60% { border-color: var(--neon-cyan); box-shadow: 0 0 2px rgba(90, 139, 149, 0.2); transform: translate(0.5px, 0); } } .cyber-glitch-hover { transition: all 0.15s ease; position: relative; } .cyber-glitch-hover:hover { animation: scp-flicker 150ms ease-in-out 3; border-color: var(--neon-cyan) !important; box-shadow: 0 1px 4px rgba(90, 139, 149, 0.15), inset 0 0 8px rgba(90, 139, 149, 0.05); } /* Navbar hide on scroll */ .navbar-hidden { transform: translateY(-100%); transition: transform 0.3s ease-in-out; } .navbar-visible { transform: translateY(0); transition: transform 0.3s ease-in-out; } /* Cyberpunk neon glow on focus - 80s style */ .cyber-focus:focus { outline: none; box-shadow: 0 0 10px var(--neon-cyan), 0 0 20px rgba(0, 255, 255, 0.5), inset 0 0 10px rgba(0, 255, 255, 0.1); border-color: var(--neon-cyan); } .cyber-focus-pink:focus { outline: none; box-shadow: 0 0 10px var(--neon-pink), 0 0 20px rgba(255, 0, 128, 0.5), inset 0 0 10px rgba(255, 0, 128, 0.1); border-color: var(--neon-pink); } /* Cyberpunk Prose Styling */ .cyberpunk-prose { color: var(--text-color); } .cyberpunk-prose h1, .cyberpunk-prose h2, .cyberpunk-prose h3 { color: var(--neon-cyan); font-family: var(--font-jetbrains-mono); font-weight: 700; text-transform: uppercase; letter-spacing: -0.025em; } .cyberpunk-prose h1 { font-size: 2.25rem; margin-bottom: 2rem; margin-top: 3rem; padding-bottom: 1rem; border-bottom: 2px solid var(--neon-cyan); } .cyberpunk-prose h2 { font-size: 1.875rem; margin-bottom: 1.5rem; margin-top: 2.5rem; } .cyberpunk-prose h3 { font-size: 1.5rem; margin-bottom: 1rem; margin-top: 2rem; } .cyberpunk-prose p { line-height: 1.625; margin-bottom: 1.5rem; font-size: 1.125rem; } .cyberpunk-prose a { color: var(--neon-magenta); text-decoration: none; font-weight: 600; transition: color 0.2s; } .cyberpunk-prose a:hover { color: var(--neon-pink); } .cyberpunk-prose ul, .cyberpunk-prose ol { padding-left: 1.5rem; margin-bottom: 1.5rem; } .cyberpunk-prose ul > * + *, .cyberpunk-prose ol > * + * { margin-top: 0.5rem; } .cyberpunk-prose li { font-size: 1.125rem; } .cyberpunk-prose blockquote { border-left: 4px solid var(--neon-magenta); padding-left: 1.5rem; font-style: italic; color: rgb(161 161 170); background-color: #000; padding-top: 1.5rem; padding-bottom: 1.5rem; margin-top: 2rem; margin-bottom: 2rem; position: relative; box-shadow: -4px 0 15px rgba(155, 90, 142, 0.3), inset 0 0 20px rgba(155, 90, 142, 0.05); } .cyberpunk-prose blockquote::before { content: '"'; position: absolute; top: -0.5rem; left: 0.5rem; font-size: 3.75rem; color: var(--neon-magenta); opacity: 0.3; font-family: monospace; } .cyberpunk-prose code { color: var(--neon-cyan); background-color: #000; padding: 0.125rem 0.5rem; font-size: 0.875rem; font-family: monospace; border: 2px solid var(--neon-cyan); box-shadow: 0 0 8px rgba(90, 139, 149, 0.3); text-shadow: 0 0 6px rgba(90, 139, 149, 0.6); } .cyberpunk-prose pre { background-color: #000; border: 4px solid var(--neon-purple); padding: 1.5rem; margin-top: 2rem; margin-bottom: 2rem; overflow-x: auto; box-shadow: 0 0 25px rgba(123, 101, 147, 0.6), inset 0 0 25px rgba(123, 101, 147, 0.1); } .cyberpunk-prose pre code { background-color: transparent; border: 0; padding: 0; } .cyberpunk-prose img { margin: 2rem; /* border: 4px solid var(--neon-pink); */ box-shadow: 0 0 2px rgba(155, 90, 110, 0.5); } .cyberpunk-prose hr { border-color: rgb(39 39 42); border-top-width: 2px; margin-top: 3rem; margin-bottom: 3rem; } } /* === MOBILE RESPONSIVE UTILITIES === */ @media (max-width: 767px) { .show-mobile-only { display: block; } .hide-mobile { display: none !important; } } @media (min-width: 768px) { .show-mobile-only { display: none !important; } .hide-mobile { display: block; } } /* === BUTTON GLITCH EFFECT === */ @layer utilities { .glitch-btn-cyber { --glitch-shimmy: 5; --glitch-clip-1: polygon(0 2%, 100% 2%, 100% 95%, 95% 95%, 95% 90%, 85% 90%, 85% 95%, 8% 95%, 0 70%); --glitch-clip-2: polygon(0 78%, 100% 78%, 100% 100%, 95% 100%, 95% 90%, 85% 90%, 85% 100%, 8% 100%, 0 78%); --glitch-clip-3: polygon(0 44%, 100% 44%, 100% 54%, 95% 54%, 95% 54%, 85% 54%, 85% 54%, 8% 54%, 0 54%); --glitch-clip-4: polygon(0 0, 100% 0, 100% 0, 95% 0, 95% 0, 85% 0, 85% 0, 8% 0, 0 0); --glitch-clip-5: polygon(0 40%, 100% 40%, 100% 85%, 95% 85%, 95% 85%, 85% 85%, 85% 85%, 8% 85%, 0 70%); --glitch-clip-6: polygon(0 63%, 100% 63%, 100% 80%, 95% 80%, 95% 80%, 85% 80%, 85% 80%, 8% 80%, 0 70%); } .glitch-overlay { position: absolute; inset: 0; display: none; align-items: center; justify-content: center; pointer-events: none; color: var(--neon-cyan); z-index: 10; } .glitch-btn-cyber:is(:hover, :focus-visible) .glitch-overlay { display: flex; animation: glitch-btn-animate 2s infinite; } @keyframes glitch-btn-animate { 0% { clip-path: var(--glitch-clip-1); } 2%, 8% { clip-path: var(--glitch-clip-2); transform: translate(calc(var(--glitch-shimmy) * -1%), 0); } 6% { clip-path: var(--glitch-clip-2); transform: translate(calc(var(--glitch-shimmy) * 1%), 0); } 9% { clip-path: var(--glitch-clip-2); transform: translate(0, 0); } 10% { clip-path: var(--glitch-clip-3); transform: translate(calc(var(--glitch-shimmy) * 1%), 0); } 13% { clip-path: var(--glitch-clip-3); transform: translate(0, 0); } 14%, 21% { clip-path: var(--glitch-clip-4); transform: translate(calc(var(--glitch-shimmy) * 1%), 0); } 25%, 30% { clip-path: var(--glitch-clip-5); transform: translate(calc(var(--glitch-shimmy) * -1%), 0); } 35%, 45% { clip-path: var(--glitch-clip-6); transform: translate(calc(var(--glitch-shimmy) * -1%), 0); } 40% { clip-path: var(--glitch-clip-6); transform: translate(calc(var(--glitch-shimmy) * 1%), 0); } 50% { clip-path: var(--glitch-clip-6); transform: translate(0, 0); } 55% { clip-path: var(--glitch-clip-3); transform: translate(calc(var(--glitch-shimmy) * 1%), 0); } 60% { clip-path: var(--glitch-clip-3); transform: translate(0, 0); } 61%, 100% { clip-path: var(--glitch-clip-4); } } .glitch-btn-subtle { --glitch-shimmy: 2; } .glitch-overlay-pink { color: var(--neon-pink); } .glitch-overlay-purple { color: var(--neon-purple); } .glitch-overlay-magenta { color: var(--neon-magenta); } @media (prefers-reduced-motion: reduce) { .glitch-btn-cyber:is(:hover, :focus-visible) .glitch-overlay { animation: none; display: none; } } }