/* Base */ * { box-sizing: border-box; } html { scroll-behavior: smooth; } :root { --background: #0e120e; --foreground: #e2f1e2; --muted: #8aa78a; --surface: #101710; --surface-2: #142014; --border: #182418; --accent: #7fc27f; --accent-2: #a7e6a7; --font-body: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; --font-heading: ui-rounded, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; } body { margin: 0; color: var(--foreground); background: var(--background); font-family: var(--font-body); line-height: 1.65; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .container { max-width: 1100px; margin: 0 auto; padding: 24px; } main.container { padding: 0; } main.container>section:not(.hero-fullscreen), main.container>.card { padding: 24px; } /* Top Bar */ .site-header { position: fixed; width: 100%; top: 0; z-index: 20; backdrop-filter: saturate(1.2) blur(6px); border-bottom: 1px solid #1b281b; background: #0f150f; height: 70px; display: flex; align-items: center; } .site-header .inner { display: flex; align-items: center; gap: 16px; justify-content: space-between; position: relative; height: 100%; } .brand { display: flex; align-items: center; gap: 10px; color: var(--foreground); text-decoration: none; } .logo { width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; font-weight: 700; font-family: var(--font-heading); color: #0e120e; background: var(--accent); border: 1px solid #2a392a; } .site-nav { display: flex; gap: 16px; align-items: center; } .site-nav a { color: var(--muted); text-decoration: none; padding: 10px 8px; border-radius: 8px; position: relative; } .site-nav a:hover, .site-nav a[aria-current="page"] { color: var(--foreground); } .site-nav a::after { content: ""; position: absolute; left: 8px; right: 8px; bottom: 6px; height: 2px; background: var(--accent); opacity: 0; transform: scaleX(0.5); transition: opacity 0.25s, transform 0.25s; } .site-nav a:hover::after, .site-nav a[aria-current="page"]::after { opacity: 1; transform: none; } /* Mobile nav toggle */ .menu-toggle { display: none; align-items: center; gap: 8px; border: 1px solid #2a392a; background: var(--surface); color: var(--foreground); border-radius: 10px; padding: 8px 10px; cursor: pointer; } .menu-toggle .bars { width: 18px; height: 12px; position: relative; display: inline-block; } .menu-toggle .bars::before, .menu-toggle .bars::after, .menu-toggle .bars span { content: ""; position: absolute; left: 0; right: 0; height: 2px; background: var(--foreground); border-radius: 2px; } .menu-toggle .bars::before { top: 0; } .menu-toggle .bars::after { bottom: 0; } .menu-toggle .bars span { top: 5px; } /* Hero */ .hero { display: block; text-align: center; } .hero-fullscreen { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; } .hero-card { max-width: 800px; margin: 0 auto; display: block; } .eyebrow { color: var(--muted); text-transform: uppercase; letter-spacing: 0.12em; font-size: 0.85rem; margin: 0 0 6px; text-align: center; } .hero h1 { font-family: var(--font-heading); font-size: clamp(1.9rem, 4.2vw, 2.8rem); line-height: 1.15; margin: 0 0 10px; color: var(--accent-2); margin-bottom: 1.5rem; } .hero h1>span { display: inline-block; opacity: 0; animation: slideUpWord 0.6s ease forwards; } .hero h1>span:nth-child(1) { animation-delay: 0.1s; } .hero h1>span:nth-child(2) { animation-delay: 0.2s; } .hero h1>span:nth-child(3) { animation-delay: 0.3s; } .hero h1>span:nth-child(4) { animation-delay: 0.4s; } .hero h1>span:nth-child(5) { animation-delay: 0.5s; } .hero h1>span:nth-child(6) { animation-delay: 0.6s; } .hero h1>span:nth-child(7) { animation-delay: 0.7s; } .hero h1>span:nth-child(8) { animation-delay: 0.8s; } .hero h1>span:nth-child(9) { animation-delay: 0.9s; } .hero h1>span:nth-child(10) { animation-delay: 1s; } .hero h1>span:nth-child(11) { animation-delay: 1.1s; } @keyframes slideUpWord { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .animate-fade-in { opacity: 0; animation: fadeIn 0.8s ease forwards; animation-delay: 0.2s; } .animate-fade-in-delayed { opacity: 0; animation: fadeIn 0.8s ease forwards; animation-delay: 1.3s; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .hero p { margin: 0 0 14px; margin-bottom: 2rem; } .cta { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; } /* Sections */ section { margin-top: 48px; } section.hero-fullscreen { margin-top: 0; } section:first-of-type { margin-top: 0; } .card { background: var(--surface); border: 1px solid var(--border); border-radius: 16px; padding: 18px; margin: 24px 8px; } h2 { font-family: var(--font-heading); font-size: clamp(1.2rem, 2.2vw, 1.4rem); color: var(--accent); margin: 0 0 10px; } p.lead { color: var(--muted); margin-top: 0; } /* Skills (grouped tags) */ .skill-groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; } .group { background: var(--surface-2); border: 1px solid #223222; border-radius: 14px; padding: 12px; } .group h3 { margin: 0 0 8px; font-size: 0.95rem; color: var(--accent-2); letter-spacing: 0.02em; font-weight: 600; } .tags { display: flex; flex-wrap: wrap; gap: 6px; } .tags>span { border: 1px solid #263626; border-radius: 999px; padding: 4px 8px; font-size: 0.85rem; color: var(--muted); } /* Timeline */ .timeline { position: relative; padding-left: 20px; } .timeline::before { content: ""; position: absolute; left: 8px; top: 0; bottom: 0; width: 2px; background: #204020; } .t-item { position: relative; margin: 14px 0; padding-left: 18px; } .t-item::before { content: ""; position: absolute; left: -1px; top: 0.45rem; width: 10px; height: 10px; border-radius: 50%; background: var(--accent); } .t-role { font-weight: 600; } .t-org a { color: var(--accent); } .t-bullets { margin: 0.3rem 0 0.2rem 1rem; } /* Projects */ .proj-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; } .proj { border: 1px solid var(--border); border-radius: 14px; background: var(--surface-2); padding: 14px; transition: transform 0.2s ease; } .proj:hover { transform: translateY(-3px); } .stack { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; } .badge { border: 1px solid #263626; border-radius: 999px; padding: 4px 8px; color: var(--muted); font-size: 0.85rem; } /* Links */ a { color: var(--accent); text-decoration: underline; text-decoration-color: var(--accent); text-decoration-thickness: 0.08em; text-underline-offset: 2px; transition: color 0.2s ease, text-decoration-color 0.2s ease; } a:hover { color: var(--accent-2); text-decoration-color: var(--accent-2); } a:visited { color: var(--accent); } a:visited:hover { color: var(--accent-2); } @keyframes slideInFromTop { from { opacity: 0; transform: translateY(-100%); } to { opacity: 1; transform: translateY(0); } } /* Buttons */ .btn { display: inline-block; padding: 10px 20px; border-radius: 10px; text-decoration: none; font-weight: 600; transition: all 0.2s ease; border: 1px solid var(--border); background: var(--surface); color: var(--foreground); } .btn:hover { background: var(--surface-2); transform: translateY(-2px); } .btn.primary { background: var(--accent); color: var(--background); border-color: var(--accent); } .btn.primary:hover { background: var(--accent-2); border-color: var(--accent-2); color: var(--background); } /* Clickable project cards */ .proj { text-decoration: none; color: inherit; display: block; } .proj:focus-visible { outline: 2px solid var(--accent-2); outline-offset: 2px; } /* Footer */ footer { border-top: 1px solid #1e2a1e; margin-top: 38px; padding: 18px 0; color: var(--muted); } footer .to-top { float: right; } /* Reveal + Scrollspy */ .reveal { opacity: 0; transform: translateY(10px); transition: opacity 0.6s ease, transform 0.6s ease; will-change: opacity, transform; } .revealed { opacity: 1; transform: none; } /* Responsive */ @media (max-width: 840px) { .hero { grid-template-columns: 1fr; } .avatar { width: 140px; height: 140px; } } @media (max-width: 760px) { .container { padding: 16px; } main.container>section:not(.hero-fullscreen), main.container>.card { padding: 16px; } .hero-fullscreen { min-height: calc(100vh - 70px); padding: 24px 16px; } section { margin-top: 32px; } .menu-toggle { display: inline-flex; } .site-nav { position: fixed; left: 16px; right: 16px; top: 78px; /* 70px header height + 8px gap */ background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 8px; gap: 0; display: none; z-index: 25; } .site-nav.is-open { display: flex; flex-direction: column; } .site-nav a { display: block; padding: 12px 10px; border-radius: 8px; } }