@tailwind base; @tailwind components; @tailwind utilities; @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&family=Playfair+Display:ital,wght@0,400;0,700;1,400&family=Roboto+Mono:wght@300;400&display=swap'); :root { --font-playfair: 'Playfair Display', serif; --font-inter: 'Inter', sans-serif; --font-roboto-mono: 'Roboto Mono', monospace; } body { background-color: #050505; color: #ffffff; overflow-x: hidden; -webkit-font-smoothing: antialiased; } /* Custom Scrollbar */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #050505; } ::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #555; } /* Noise Overlay */ .noise-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 50; opacity: 0.07; background-image: url('data:image/svg+xml,%3Csvg viewBox=%220 0 200 200%22 xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cfilter id=%22noiseFilter%22%3E%3CfeTurbulence type=%22fractalNoise%22 baseFrequency=%220.8%22 numOctaves=%223%22 stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect width=%22100%25%22 height=%22100%25%22 filter=%22url(%23noiseFilter)%22 opacity=%221%22/%3E%3C/svg%3E'); } /* Liquid Metal Button Effect */ .liquid-btn { position: relative; overflow: hidden; transition: all 0.5s ease; background: #fff; color: #000; } .liquid-btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); transition: 0.5s; } .liquid-btn:hover::before { left: 100%; } /* Electric Card Border */ .electric-border { position: relative; background: rgba(10, 10, 10, 0.8); backdrop-filter: blur(10px); } .electric-border::after { content: ''; position: absolute; bottom: -1px; left: 0; width: 100%; height: 1px; background: linear-gradient(90deg, transparent, #fff, transparent); opacity: 0.5; } .electric-border:hover::after { opacity: 1; box-shadow: 0 0 10px #fff; } /* Glitch Text Classes */ .glitch { position: relative; } .glitch::before, .glitch::after { content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #050505; } .glitch::before { left: 2px; text-shadow: -1px 0 #00ffff; clip: rect(24px, 550px, 90px, 0); animation: glitch-anim-2 3s infinite linear alternate-reverse; } .glitch::after { left: -2px; text-shadow: -1px 0 #ff00ff; clip: rect(85px, 550px, 140px, 0); animation: glitch-anim-1 2.5s infinite linear alternate-reverse; } @keyframes glitch-anim-1 { 0% { clip: rect(20px, 9999px, 80px, 0); } 20% { clip: rect(130px, 9999px, 160px, 0); } 40% { clip: rect(60px, 9999px, 100px, 0); } 60% { clip: rect(10px, 9999px, 40px, 0); } 80% { clip: rect(120px, 9999px, 150px, 0); } 100% { clip: rect(40px, 9999px, 90px, 0); } } @keyframes glitch-anim-2 { 0% { clip: rect(120px, 9999px, 150px, 0); } 20% { clip: rect(10px, 9999px, 50px, 0); } 40% { clip: rect(90px, 9999px, 110px, 0); } 60% { clip: rect(30px, 9999px, 70px, 0); } 80% { clip: rect(60px, 9999px, 100px, 0); } 100% { clip: rect(140px, 9999px, 170px, 0); } }