.avatar, .glass-card, .section, .timeline-entry, body, h2.section-title, html { position: relative; } /* ====================== Self-hosted Fonts ====================== */ /* Space Grotesk (400, 500, 700) */ @font-face { font-family: "SpaceGroteskLocal"; src: url("fonts/Space_Grotesk/static/SpaceGrotesk-Regular.woff2") format("truetype"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "SpaceGroteskLocal"; src: url("/fonts/Space_Grotesk/static/SpaceGrotesk-Medium.woff2") format("truetype"); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: "SpaceGroteskLocal"; src: url("fonts/Space_Grotesk/static/SpaceGrotesk-Bold.woff2") format("truetype"); font-weight: 700; font-style: normal; font-display: swap; } /* Share Tech Mono (Regular) */ @font-face { font-family: "ShareTechMonoLocal"; src: url("fonts/Share_Tech_Mono/ShareTechMono-Regular.woff2") format("truetype"); font-weight: 400; font-style: normal; font-display: swap; } /* JetBrains Mono (400 + 500) */ @font-face { font-family: "JetBrainsMonoLocal"; src: url("fonts/JetBrains_Mono/static/JetBrainsMono-Regular.ttf") format("truetype"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "JetBrainsMonoLocal"; src: url("fonts/JetBrains_Mono/static/JetBrainsMono-Regular.woff2") format("truetype"); font-weight: 500; font-style: normal; font-display: swap; } .avatar::after, .glass-card::after, .glass-card::before, .section::before, .timeline::before { content: ""; position: absolute; } .btn.neon, .edu-list li::before { font-weight: 700; color: var(--neon); } .btn.neon, .subtitle { color: var(--neon); color: var(--neon); } .center, .contact-links { text-align: center; } :root { --neon: #00ffee; --neon-weak: rgba(0, 255, 238, 0.12); --bg-1: #0c001f; --bg-2: #000000; --glass-border: rgba(255, 255, 255, 0.12); --glass-blur: 15px; --accent: #f0f; --card-radius: 16px; --ease: cubic-bezier(0.16, 0.84, 0.44, 1); --font-heading: "ShareTechMonoLocal", monospace; --font-body: "SpaceGroteskLocal", system-ui, sans-serif; --font-code: "JetBrainsMonoLocal", monospace; } * { margin: 0; padding: 0; box-sizing: border-box; } body, html { font-family: var(--font-body); background: radial-gradient( 1200px 600px at 10% 10%, rgba(0, 255, 238, 0.03), transparent 6% ), radial-gradient( 900px 500px at 90% 80%, rgba(240, 0, 255, 0.03), transparent 8% ), linear-gradient(180deg, var(--bg-1) 0, var(--bg-2) 100%); color: #fff; scroll-behavior: smooth; overflow-x: hidden; min-height: 100vh; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } h1, h2, h3 { font-family: var(--font-heading); text-transform: uppercase; letter-spacing: 1px; color: #fff; text-shadow: 0 0 6px rgba(255, 255, 255, 0.9), 0 0 12px rgba(0, 255, 238, 0.6), 0 0 22px rgba(0, 255, 238, 0.35); margin-bottom: 0.75rem; } code, pre, .code { font-family: var(--font-code); } .holo { background: linear-gradient(90deg, #fff, var(--neon), var(--accent), #fff); -webkit-background-clip: text; /* for Chrome/Safari */ background-clip: text; /* standard property */ -webkit-text-fill-color: transparent; color: transparent; /* fallback for Firefox/others */ background-size: 200% 100%; animation: 6s linear infinite holoShift; } @keyframes holoShift { 0%, 100% { background-position: 0 50%; } 50% { background-position: 100% 50%; } } h2.section-title { font-size: 2.5rem; margin-bottom: 2rem; animation: 2.5s infinite flicker; } li, p { line-height: 1.8; color: #d0d6dd; } @keyframes flicker { 0%, 100% { opacity: 1; filter: drop-shadow(0 0 0 rgba(0, 255, 238, 0)); } 50% { opacity: 0.88; filter: drop-shadow(0 0 8px rgba(0, 255, 238, 0.3)); } 75% { opacity: 0.96; filter: drop-shadow(0 0 6px rgba(0, 255, 238, 0.15)); } } .avatar { width: 160px; height: 160px; border-radius: 50%; margin: 1.5rem auto; border: 4px solid var(--neon); box-shadow: 0 8px 30px rgba(0, 255, 238, 0.12), inset 0 -6px 18px rgba(0, 0, 0, 0.4); display: block; transition: transform 0.8s var(--ease), box-shadow 0.4s var(--ease); transform-origin: center; z-index: 3; } .avatar.float { animation: 6s ease-in-out infinite avatarFloat; } @keyframes avatarFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px) rotateZ(-0.5deg); } } .avatar::after { inset: 0; border-radius: 50%; background: linear-gradient( 120deg, transparent 0, rgba(0, 255, 238, 0.06) 40%, rgba(255, 255, 255, 0.09) 50%, rgba(0, 255, 238, 0.06) 60%, transparent 100% ); transform: translateX(-120%); mix-blend-mode: screen; transition: transform 0.9s var(--ease); pointer-events: none; } .avatar:hover::after { transform: translateX(120%); } .section { padding: 5rem 2rem; max-width: 1200px; margin: 0 auto; z-index: 1; } .section::before { inset: 0; pointer-events: none; background: radial-gradient( 600px 160px at 10% 10%, rgba(0, 255, 238, 0.02), transparent 10% ), radial-gradient( 500px 120px at 90% 90%, rgba(240, 0, 255, 0.02), transparent 10% ); z-index: 0; } .glass-card { background: linear-gradient( 180deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.02) ); border: 1px solid var(--glass-border); border-radius: var(--card-radius); backdrop-filter: blur(var(--glass-blur)) saturate(1.1); -webkit-backdrop-filter: blur(var(--glass-blur)); box-shadow: 0 6px 24px rgba(0, 0, 0, 0.6), 0 0 40px rgba(0, 255, 238, 0.04); padding: 2rem; transition: all 0.35s var(--ease); overflow: hidden; } .glass-card::after { inset: -2px; border-radius: calc(var(--card-radius) + 2px); background: linear-gradient( 90deg, transparent, rgba(0, 255, 238, 0.12), rgba(240, 0, 255, 0.06), transparent ); filter: blur(12px); opacity: 0; transform: scale(0.98); transition: opacity 0.45s var(--ease), transform 0.45s var(--ease); pointer-events: none; } .glass-card:hover::after { opacity: 1; transform: scale(1); } .glass-card::before { top: 0; left: -110%; width: 220%; height: 100%; background: linear-gradient( 120deg, transparent, rgba(0, 255, 238, 0.14), transparent ); animation: 6s linear infinite lightSweep; pointer-events: none; mix-blend-mode: screen; } .glass-card:hover { transform: translateY(-8px) scale(1.01); box-shadow: 0 18px 50px rgba(0, 0, 0, 0.6), 0 0 40px rgba(0, 255, 238, 0.08); border-color: rgba(0, 255, 238, 0.22); } .contact-links { margin-top: 2rem; z-index: 4; } .btn.neon { display: inline-block; margin: 0 10px; padding: 12px 24px; border: 2px solid var(--neon); text-decoration: none; border-radius: 8px; background: linear-gradient(180deg, rgba(255, 255, 255, 0.02), transparent); transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease); z-index: 2; } .btn.neon:hover { transform: translateY(-6px) scale(1.02); box-shadow: 0 6px 30px rgba(0, 255, 238, 0.12), 0 0 30px rgba(0, 255, 238, 0.12); } .btn.neon .ripple { position: absolute; width: 18px; height: 18px; border-radius: 50%; transform: translate(-50%, -50%) scale(0); background: radial-gradient( circle, rgba(255, 255, 255, 0.2) 0, rgba(0, 255, 238, 0.12) 50%, transparent 100% ); pointer-events: none; opacity: 0; } .courses-grid, .skills-grid { display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); margin-top: 2rem; } .course, .skill-category { transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease); will-change: transform; } .course:hover, .skill-category:hover { transform: translateY(-6px); box-shadow: 0 16px 40px rgba(0, 0, 0, 0.6), 0 0 30px rgba(0, 255, 238, 0.03); } .timeline-entry { margin-bottom: 2rem; overflow: visible; padding-left: 48px; } #tsparticles, .parallax-layer { position: fixed; z-index: 0; pointer-events: none; } .timeline-entry h3 { font-size: 1.4rem; margin-bottom: 0.5rem; } .timeline-entry .date { font-size: 0.9rem; color: rgba(0, 255, 238, 0.66); margin-bottom: 0.5rem; display: block; } .timeline::before { left: 20px; top: 0; bottom: 0; width: 3px; background: linear-gradient( 180deg, rgba(0, 255, 238, 0.18), rgba(240, 0, 255, 0.08) ); border-radius: 2px; box-shadow: 0 0 18px rgba(0, 255, 238, 0.04); } .edu-list li { margin-bottom: 1.2rem; padding-left: 8px; position: relative; } .edu-list li::before { content: "•"; position: absolute; left: 0; } .tilt:hover { transform: perspective(1000px) rotateY(2deg) rotateX(2deg) translateY(-4px); } .section { opacity: 0; transform: translateY(40px); transition: all 0.6s var(--ease); } .section.visible { opacity: 1; transform: translateY(0); } #tsparticles { top: 0; left: 0; width: 100%; height: 100%; } .parallax-layer { inset: 0; mix-blend-mode: screen; } .parallax-aurora { background: radial-gradient( 800px 200px at 10% 20%, rgba(0, 255, 238, 0.04), transparent 10% ), radial-gradient( 600px 180px at 90% 80%, rgba(240, 0, 255, 0.03), transparent 8% ); filter: blur(40px) saturate(1.2); opacity: 0.9; transform: translateZ(0); transition: transform 0.8s var(--ease); } .parallax-bokeh { background-image: radial-gradient( circle at 10% 15%, rgba(255, 255, 255, 0.03) 0, transparent 60% ), radial-gradient( circle at 80% 80%, rgba(240, 0, 255, 0.02) 0, transparent 60% ); filter: blur(30px); opacity: 0.7; } .blob { position: absolute; width: 420px; height: 420px; border-radius: 45% 55% 50% 50%; background: linear-gradient( 120deg, rgba(0, 255, 238, 0.06), rgba(240, 0, 255, 0.06) ); filter: blur(36px); opacity: 0.7; pointer-events: none; will-change: transform; } .blob.left { left: -140px; top: 40vh; transform: scale(0.8); } .blob.right { right: -160px; top: 10vh; transform: scale(0.6); } @media (max-width: 768px) { h2.section-title { font-size: 1.8rem; } .btn.neon { padding: 10px 18px; } .avatar { width: 120px; height: 120px; } } @media (max-width: 430px) { body { font-size: 15px; } .btn.neon { display: block; margin: 1rem auto; width: 80%; text-align: center; } } .glass-card:hover { box-shadow: 0 0 15px rgba(0, 255, 255, 0.2), 0 0 40px rgba(0, 255, 255, 0.15); transform: scale(1.015); } body { cursor: none; } /* ===== Matrix cursor styles ===== */ .cursor-dot, .cursor-outline { position: fixed; top: 0; left: 0; pointer-events: none; transform: translate3d(-50%, -50%, 0); transition: opacity 200ms linear; z-index: 9999; mix-blend-mode: screen; } /* small neon green center */ .cursor-dot { width: 10px; height: 10px; border-radius: 50%; background: #00ff41; /* matrix green */ box-shadow: 0 0 8px #00ff41, 0 0 18px rgba(0, 255, 65, 0.25), inset 0 0 6px rgba(255, 255, 255, 0.05); transform: translate3d(-50%, -50%, 0) scale(1); transition: transform 120ms ease, opacity 180ms linear; will-change: transform, opacity; } /* larger soft outline that lags behind (gives trailing feel) */ .cursor-outline { width: 44px; height: 44px; border-radius: 50%; border: 1.5px solid rgba(0, 255, 65, 0.12); box-shadow: 0 0 22px rgba(0, 255, 65, 0.12), 0 0 6px rgba(0, 255, 65, 0.06); transform: translate3d(-50%, -50%, 0) scale(1); transition: width 200ms ease, height 200ms ease, opacity 200ms linear; will-change: transform, width, height, opacity; backdrop-filter: blur(2px); opacity: 0.95; } /* reduce cursor during interactive elements like links */ .cursor-outline.cursor-small { width: 28px; height: 28px; opacity: 0.9; } .cursor-dot.hidden, .cursor-outline.hidden { opacity: 0; /* hide when leaving window */ } /* optional: little pulsing effect */ @keyframes matrix-pulse { 0% { transform: translate3d(-50%, -50%, 0) scale(1); } 50% { transform: translate3d(-50%, -50%, 0) scale(1.15); } 100% { transform: translate3d(-50%, -50%, 0) scale(1); } } .cursor-dot.pulse { animation: matrix-pulse 1400ms infinite ease-in-out; } h2.section-title::after { content: ""; position: absolute; left: -100%; top: 50%; height: 2px; width: 200%; background: linear-gradient(90deg, transparent, var(--neon), transparent); animation: 3s linear infinite shimmer; } @keyframes shimmer { 0% { left: -100%; } 100% { left: 100%; } } .btn.neon { position: relative; overflow: hidden; } .btn.neon::after { content: ""; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient( circle, rgba(0, 255, 238, 0.18) 0, transparent 60% ); animation: 3.5s ease-in-out infinite sparkle; pointer-events: none; } @keyframes sparkle { 0%, 100% { transform: translate(0, 0); opacity: 0.25; } 50% { transform: translate(50%, 50%); opacity: 0.9; } } .subtitle { font-size: 1.2rem; overflow: hidden; white-space: nowrap; border-right: 2px solid var(--neon); width: fit-content; margin: auto; animation: 4s steps(30) typing, 0.75s step-end infinite blink; } @keyframes typing { from { width: 0; } to { width: 100%; } } @keyframes blink { from, to { border-color: transparent; } 50% { border-color: var(--neon); } } .h1-glitch::after, .h1-glitch::before { content: attr(data-text); position: absolute; left: 0; top: 0; width: 100%; opacity: 0.14; mix-blend-mode: screen; clip-path: polygon(0 0, 100% 0, 100% 40%, 0 40%); transform: translate(2px, -2px); animation: 2.5s linear infinite glitchA; } .h1-glitch::after { transform: translate(-2px, 2px); animation: 3.2s linear infinite glitchB; opacity: 0.12; } @keyframes glitchA { 0%, 100% { transform: translate(2px, -2px); } 50% { transform: translate(-6px, 3px); } } @keyframes glitchB { 0%, 100% { transform: translate(-2px, 2px); } 50% { transform: translate(6px, -3px); } } .magnetic { transition: transform 0.35s var(--ease); } .clickPulse { animation: 0.6s ease-out clickPulseAnim; } @keyframes clickPulseAnim { 0% { transform: scale(1); opacity: 1; } 100% { transform: scale(2.6); opacity: 0; } } .page-bottom-fade { position: fixed; left: 0; right: 0; bottom: 0; height: 80px; background: linear-gradient(180deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.6)); pointer-events: none; z-index: 2; } @media (max-width: 900px) { .blob { display: none; } .parallax-aurora { opacity: 0.5; filter: blur(28px); } } .section.active { box-shadow: 0 0 40px rgba(0, 255, 238, 0.03) inset; border-radius: 12px; }