/* style.css - All styles for the portfolio site */

/* ── DESIGN TOKENS ──
   Single source of truth for brand colors. Use these via var(--name) in new code.
   Consolidation done in this pass:
     #83A6CE / rgba(131,166,206,...) -> #83A6CE / rgba(131,166,206,...)  (one blue)
     #83A6CE, #F4F7FB               -> #83A6CE                          (kill bright variants)
     #6ee7b7, #6ee7b7, rgba(110,231,183,...) -> #6ee7b7 / rgba(110,231,183,...)  (one green)
     rgba(229,201,215, 0.55/0.6/0.65/0.72/0.75/0.78/0.82) -> 0.7        (one muted body)
*/
:root {
  --bg-deep:     #03122F;
  --blue:        #83A6CE;
  --pink:        #C48CB3;
  --pink-light:  #E5C9D7;
  --green:       #6ee7b7;
  --gold:        #c89a5a;
  --text:        #F4F7FB;
  --text-strong: #ffffff;
  --text-muted:  rgba(229,201,215,0.7);
  --text-faint:  rgba(244,247,251,0.5);
}

/* ── RESET ── */
* { box-sizing: border-box; margin: 0; padding: 0; }
html { overflow-x: hidden; overflow-y: auto; }
body { font-family: "Plus Jakarta Sans", sans-serif; color: #F4F7FB; background: #03122F; overflow-x: hidden; }

/* ── THREE.JS CANVAS ──
   Scoped to the Projects section only. JS adds .three-active to <body>
   when #projects is in the viewport; we fade in/out and the animation
   loop pauses while invisible to save CPU/GPU. */
#three-bg {
  position: fixed; inset: 0; z-index: 0;
  pointer-events: none; width: 100%; height: 100%;
  opacity: 0;
  transition: opacity 0.5s ease;
}
body.three-active #three-bg { opacity: 1; }

/* ── NOISE OVERLAY ── */
.noise-overlay {
  position: fixed; inset: 0; z-index: 9998;
  pointer-events: none; opacity: 0.04;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 256px 256px;
}

/* Native cursor restored. Interactive elements use default browser pointer via a/button + cursor: pointer. */

/* ── SCROLL PROGRESS BAR ── */
.scroll-progress {
  position: fixed; top: 0; left: 0;
  height: 2px; width: 0%;
  background: linear-gradient(90deg, #83A6CE, #C48CB3);
  z-index: 999; transition: width 0.1s linear;
}

/* ── SECTIONS ── */
.section {
  position: relative; z-index: 1;
  min-height: 100vh;
  display: flex; flex-direction: column;
}
.section + .section::before {
  content: '';
  position: absolute; top: 0; left: 10%; right: 10%;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(131,166,206,0.25), rgba(196,140,179,0.25), transparent);
  z-index: 2;
}

#home     { background: linear-gradient(180deg, #03122F 0%, #0a1628 100%); }
#about    { background: linear-gradient(180deg, #0a1628 0%, #0D1137 100%); }
#skills   { background: linear-gradient(180deg, #0D1137 0%, #111535 100%); }
#homelab  { background: linear-gradient(180deg, #272640 0%, #22213a 100%); }
#ccna     { background: linear-gradient(180deg, #272640 0%, #22213a 100%); }
#msp      { background: linear-gradient(180deg, #0D1137 0%, #111535 100%); }
#research { background: linear-gradient(180deg, #1a1530 0%, #15102a 100%); }

/* Inner-page sections sit at scroll y=0, so the default padding-top creates an empty strip
   below the fixed nav. Reduce padding-top to nav-height + small breathing room. */
#homelab > .section-inner,
#ccna    > .section-inner,
#msp     > .section-inner,
#research > .section-inner {
  padding-top: calc(34px + clamp(8px, 1.5vh, 18px) * 2 + 16px);
}
#contact  { background: linear-gradient(180deg, #144552 0%, #0f3a47 100%); }

/* ── NAV ── */
nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 200;
  padding: clamp(8px, 1.5vh, 18px) 0;
  background: rgba(0,0,0,0.3);
  backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
  transition: background 0.3s;
}
.nav-inner {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 4px;
  max-width: 1200px; margin: 0 auto; width: 100%;
  padding: 0 clamp(16px, 5vw, 56px);
}
.nav-logo {
  display: flex; align-items: center; text-decoration: none;
}
.nav-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  object-fit: cover;
  box-shadow: 0 0 0 2.5px rgba(3,18,47,0.9), 0 0 0 4px rgba(131,166,206,0.35);
  transition: transform 0.25s, box-shadow 0.25s;
  margin-left: 4px;
}
.nav-avatar:hover { transform: scale(1.08); box-shadow: 0 0 0 2.5px rgba(3,18,47,0.9), 0 0 0 4px #C48CB3; }
.nav-links { display: flex; flex-wrap: wrap; gap: 4px; list-style: none; }
.nav-link {
  background: none; border: none; cursor: pointer; text-decoration: none;
  padding: clamp(4px, 0.8vh, 7px) clamp(8px, 1.2vw, 18px); border-radius: 40px;
  font-family: "Plus Jakarta Sans", sans-serif;
  font-size: clamp(0.58rem, 1vw, 0.78rem); font-weight: 600;
  letter-spacing: 0.06em; text-transform: uppercase;
  color: rgba(255,255,255,0.55); white-space: nowrap;
  transition: all 0.2s;
}
.nav-link:hover  { color: #fff; background: rgba(255,255,255,0.07); }
.nav-link.active { color: #fff; background: rgba(255,255,255,0.12); }

/* Hamburger - hidden on desktop */
.nav-toggle-cb { display: none; }
.hamburger     { display: none; }
.ham-line {
  display: block; width: 22px; height: 2px;
  background: #fff; border-radius: 2px;
  transition: transform 0.3s ease, opacity 0.3s ease;
}

/* ── SECTION INNER ── */
.section-inner {
  flex: 1; display: flex; flex-direction: column;
  padding: clamp(100px, 14vh, 140px) clamp(16px, 5vw, 56px) clamp(60px, 8vh, 100px);
  max-width: 1200px; margin: 0 auto; width: 100%;
}

/* ── HOME ── */
#home .section-inner { justify-content: center; min-height: 100vh; }
#home .home-badge      { margin-bottom: clamp(10px, 1.5vh, 18px); }
#home h1               { margin-bottom: clamp(12px, 1.8vh, 20px); }
#home .typewriter-wrap { margin-bottom: clamp(14px, 2vh, 24px); min-height: 1.6em; }
#home .home-bio        { margin-bottom: clamp(14px, 2vh, 28px); line-height: 1.7; }
#home .home-actions    { margin-bottom: clamp(10px, 1.5vh, 18px); }
#home .stats-row       { margin-top:    clamp(12px, 2vh,   28px); }
.home-badge {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 5px 14px; border-radius: 40px;
  border: 1px solid rgba(196,140,179,0.3);
  background: rgba(196,140,179,0.08);
  font-family: "DM Mono", monospace;
  font-size: 0.65rem; letter-spacing: 0.18em; text-transform: uppercase;
  color: #C48CB3; margin-bottom: 28px; width: fit-content;
}
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.2; } }

h1 {
  font-size: clamp(3.2rem, 7vw, 6rem);
  font-weight: 800; line-height: 0.95;
  color: #fff; letter-spacing: -0.02em; margin-bottom: 16px;
  text-shadow: 0 0 60px rgba(131,166,206,0.12);
  text-wrap: balance;
}
h1 .blue { color: #83A6CE; display: block; margin-top: 0.20em; }

.typewriter-wrap {
  display: flex; align-items: center;
  font-family: "DM Mono", monospace;
  font-size: clamp(0.9rem, 1.8vw, 1.2rem);
  color: #C48CB3; font-weight: 500;
  margin-bottom: 28px; min-height: 2em;
}
.typewriter-text   { color: #E5C9D7; }
.typewriter-cursor {
  display: inline-block; width: 2px; height: 1.1em;
  background: #C48CB3; margin-left: 2px;
  animation: blink 1s step-end infinite; vertical-align: middle;
}
@keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }

.home-bio {
  font-size: 1rem; font-weight: 300;
  color: rgba(229,201,215,0.7);
  max-width: 69ch; line-height: 1.7;
  margin-bottom: clamp(20px, 3.5vh, 44px); text-align: left; text-wrap: pretty;
}
.home-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-bottom: clamp(10px, 1.5vh, 18px); }
.chip {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 18px; border-radius: 8px;
  border: 1px solid rgba(255,255,255,0.1);
  background: rgba(255,255,255,0.05);
  color: rgba(255,255,255,0.8); text-decoration: none;
  font-size: 0.78rem; font-weight: 500; transition: all 0.2s;
}
.chip:hover { border-color: #83A6CE; color: #83A6CE; background: rgba(131,166,206,0.1); }
.chip svg { width: 13px; height: 13px; stroke: currentColor; fill: none; stroke-width: 2; flex-shrink: 0; }

.btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 13px 30px; border-radius: 8px;
  font-weight: 700; font-size: 0.83rem;
  letter-spacing: 0.04em; cursor: pointer;
  border: none; transition: all 0.18s; font-family: inherit;
  text-decoration: none;
}
.btn-solid   { background: #83A6CE; color: #181A2F; }
.btn-solid:hover { background: #E5C9D7; transform: translateY(-2px); }
.btn-outline { border: 1px solid rgba(255,255,255,0.15); color: #fff; background: transparent; }
.btn-outline:hover { border-color: #C48CB3; color: #C48CB3; }

/* ── SCROLL HINT ── */
.scroll-hint {
  display: flex; align-items: center; gap: 10px;
  margin-top: clamp(24px, 4vh, 48px);
  font-family: "DM Mono", monospace;
  font-size: 0.62rem; letter-spacing: 0.15em; text-transform: uppercase;
  color: rgba(255,255,255,0.7);
  text-shadow: 0 0 12px rgba(255,255,255,0.15);
}
.scroll-hint svg { color: rgba(255,255,255,0.7); filter: drop-shadow(0 0 6px rgba(255,255,255,0.15)); }
.scroll-dot {
  animation: scroll-bounce 2s ease-in-out infinite;
  fill: #6ee7b7;
}
@keyframes scroll-bounce {
  0%, 100% { transform: translateY(0); opacity: 1; }
  50% { transform: translateY(8px); opacity: 0.3; }
}

/* ── STATS ── */
.stats-row {
  display: flex; flex-wrap: wrap; gap: 0;
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 12px; overflow: hidden;
  margin-top: clamp(20px, 4vh, 52px); width: fit-content; max-width: 100%;
}
.stat {
  padding: clamp(10px, 2vh, 20px) clamp(14px, 2.5vw, 28px); text-align: center;
  border-right: 1px solid rgba(255,255,255,0.08);
}
.stat:last-child { border-right: none; }
.stat-n {
  display: block; font-size: clamp(1.1rem, 2.5vw, 1.8rem); font-weight: 800;
  color: #83A6CE; line-height: 1;
  text-shadow: 0 0 25px rgba(131,166,206,0.25);
}
.stat-l { display: block; font-size: clamp(0.52rem, 0.9vw, 0.62rem); color: rgba(229,201,215,0.5); letter-spacing: 0.1em; text-transform: uppercase; margin-top: 5px; font-weight: 600; }

/* ── SECTION TITLES ── */
h2 {
  font-size: clamp(1.5rem, 3.5vw, 2.8rem);
  font-weight: 800; color: #fff;
  letter-spacing: -0.015em; padding-bottom: 0.11em; margin-bottom: clamp(20px, 3.5vh, 44px); line-height: 1.05;
  text-shadow: 0 0 50px rgba(131,166,206,0.1);
  text-wrap: balance;
}
h2 .blue { color: #83A6CE; }
h2 .pink { color: #C48CB3; }

/* ── ABOUT ── */
.about-layout { display: grid; grid-template-columns: 1fr 2fr; gap: 40px; align-items: start; }
.about-layout > * { min-width: 0; }
.photo-info { display: flex; flex-direction: column; min-width: 0; align-items: center; width: 100%; }
.photo-wrap   { position: relative; display: flex; flex-direction: column; align-items: center; text-align: center; }
.photo-circle {
  width: clamp(160px, 14vw, 260px); height: clamp(160px, 14vw, 260px); border-radius: 50%;
  overflow: hidden; border: 3px solid rgba(131,166,206,0.3);
  box-shadow: 0 0 50px rgba(131,166,206,0.2), 0 0 100px rgba(131,166,206,0.08);
}
.photo-circle img { width: 100%; height: 100%; object-fit: cover; object-position: center top; }
.photo-name  { margin-top: 16px; margin-bottom: 6px; text-align: center; font-size: 1.1rem; font-weight: 700; color: #fff; }
.about-role  { font-family: "DM Mono", monospace; letter-spacing: 0.14em; text-transform: uppercase; color: #83A6CE; margin-bottom: 16px; font-weight: 500; }
.about-text  { font-weight: 300; color: rgba(229,201,215,0.7); line-height: 1.75; margin-bottom: clamp(16px, 2.5vh, 32px); text-align: left; text-wrap: pretty; overflow-wrap: break-word; word-break: normal; }
.stack-logos { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px; }
.stack-logos .logo-pill { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: 6px; border: 1px solid rgba(131,166,206,0.2); background: rgba(255,255,255,0.03); font-family: "DM Mono", monospace; font-size: 0.62rem; color: rgba(229,201,215,0.8); letter-spacing: 0.08em; text-transform: uppercase; }
/* Long horizontal info cards (Foundation / Delivery) */
.long-stack { display: flex; flex-direction: column; gap: 16px; }
.long-card {
  padding: 18px 22px;
  border-radius: 14px;
  border: 1px solid rgba(255,255,255,0.06);
  background: linear-gradient(145deg, rgba(2,38,85,0.55), rgba(39,38,64,0.35));
  transition: border-color 0.25s, transform 0.25s, box-shadow 0.25s;
  position: relative; overflow: hidden;
}
.long-card::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: var(--ct, #83A6CE); opacity: 0.85;
  transform: scaleX(0); transform-origin: left;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.long-card:hover::before { transform: scaleX(1); }
.long-card:hover { border-color: rgba(131,166,206,0.3); transform: translateY(-2px); }
.long-title {
  font-family: "DM Mono", monospace;
  font-size: 0.65rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ct, #83A6CE);
  margin-bottom: 12px;
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(255,255,255,0.06);
}
.long-list {
  list-style: none; padding: 0; margin: 0;
  columns: 2; column-gap: 28px;
}
.long-list li {
  font-size: 0.85rem;
  color: rgba(229,201,215,0.7);
  line-height: 1.45;
  font-weight: 300;
  margin-bottom: 6px;
  break-inside: avoid;
  display: flex;
  align-items: center;
  gap: 7px;
}
.long-list li::before {
  content: '';
  flex: 0 0 5px;
  width: 5px; height: 1px;
  background: #83A6CE;
}

/* ── PHOTO TIMELINE ── */
.photo-tl {
  position: relative;
  margin: 14px auto 0;
  width: 100%;
  max-width: 280px;
  display: flex;
  flex-direction: column;
}
.ptl-items { position: relative; display: flex; flex-direction: column; justify-content: space-between; }
.ptl-items::before {
  content: "";
  position: absolute; left: 50%;
  top: var(--tl-top, 8px); bottom: var(--tl-bottom, 34px);
  width: 1px;
  background: rgba(131,166,206,0.25);
  transform: translateX(-0.5px); z-index: 0;
}
.ptl-headers { display: flex; align-items: baseline; margin-bottom: 12px; }
.ptl-head-edu,
.ptl-head-exp {
  font-family: "DM Mono", monospace;
  font-size: 0.65rem; letter-spacing: 0.15em;
  text-transform: uppercase; color: #83A6CE;
}
.ptl-head-edu { width: calc(50% - 15px); flex-shrink: 0; text-align: right; padding-right: 12px; }
.ptl-head-exp { margin-left: 30px; flex: 1; text-align: left; }
.ptl-item { position: relative; width: calc(50% - 15px); margin-bottom: 6px; }
/* Extra vertical gap when two consecutive items are on the SAME side
   (otherwise they stack tight because the opposite column is empty) */
.ptl-edu + .ptl-edu, .ptl-exp + .ptl-exp { margin-top: 18px; }
.ptl-edu { text-align: right; padding-right: 12px; }
.ptl-edu .ptl-dot { right: -20px; }
.ptl-exp { margin-left: calc(50% + 15px); text-align: left; padding-left: 12px; }
.ptl-exp .ptl-dot { left: -20px; }
.ptl-dot {
  position: absolute; top: 3px; width: 10px; height: 10px;
  border-radius: 50%; border: 2px solid #83A6CE;
  background: #181A2F; z-index: 1;
}
.ptl-yr {
  display: block; font-family: "DM Mono", monospace;
  font-size: 0.7rem; color: #C48CB3;
  letter-spacing: 0.08em; margin-bottom: 3px; line-height: 1.2;
}
.ptl-role {
  font-size: 0.85rem; font-weight: 500;
  color: rgba(244,247,251,0.85); line-height: 1.45;
  overflow-wrap: break-word;
}

/* ── WINS (mirrored icon-card layout) ── */
.wins-heading { margin-top: 24px; margin-bottom: 18px; }
.wins-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 0; }

/* CTA row below wins-grid: directs to resume + LinkedIn */
.wins-cta {
  display: flex; flex-wrap: wrap; gap: 12px;
  justify-content: center; align-items: center;
  margin: 0 0 36px;
  padding: 20px;
  border-top: 1px solid rgba(255,255,255,0.06);
  color: rgba(244,247,251,0.6);
  font-size: 0.9rem;
}
.wins-cta a {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 10px 18px;
  background: rgba(131,166,206,0.1);
  border: 1px solid rgba(131,166,206,0.35);
  border-radius: 999px;
  color: #83A6CE;
  text-decoration: none;
  font-weight: 600; font-size: 0.85rem;
  transition: background 0.2s, border-color 0.2s, transform 0.2s;
}
.wins-cta a:hover {
  background: rgba(131,166,206,0.18);
  border-color: rgba(131,166,206,0.6);
  transform: translateY(-1px);
}
.win-card {
  display: grid;
  grid-template-columns: 1fr minmax(120px, 35%);
  border: 1px solid rgba(255,255,255,0.06);
  border-radius: 16px;
  background: linear-gradient(145deg, rgba(2,38,85,0.7), rgba(39,38,64,0.4));
  position: relative; overflow: hidden;
  transition: border-color 0.22s, transform 0.22s, box-shadow 0.22s;
  min-height: 200px;
}
.win-card.flip { grid-template-columns: minmax(120px, 35%) 1fr; }
.win-card::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: var(--ct, #83A6CE); opacity: 0.85;
  transform: scaleX(0); transform-origin: left;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
  z-index: 2;
}
.win-card:hover::before { transform: scaleX(1); }
.win-card:hover { border-color: rgba(131,166,206,0.18); transform: translateY(-3px); box-shadow: 0 12px 40px rgba(0,0,0,0.4); }
.win-body { padding: 22px 24px; display: flex; flex-direction: column; gap: 10px; justify-content: center; }
.win-num    { font-family: "DM Mono", monospace; font-size: 0.6rem; color: #C48CB3; letter-spacing: 0.15em; text-transform: uppercase; }
.win-body h3 { font-size: 1.1rem; font-weight: 700; color: #fff; margin: 0; line-height: 1.25; }
.win-rule { width: 42px; height: 2px; background: var(--ct, #83A6CE); opacity: 0.7; border-radius: 2px; }
.win-body p  { font-size: 0.9rem; color: rgba(229,201,215,0.7); line-height: 1.55; font-weight: 300; margin: 0; }
.win-thumb {
  position: relative; overflow: hidden;
  border-left: 1px solid rgba(255,255,255,0.06);
  display: flex; align-items: center; justify-content: center;
  padding: 16px; box-sizing: border-box;
}
.win-card.flip .win-thumb { border-left: none; border-right: 1px solid rgba(255,255,255,0.06); }
.win-icon {
  max-width: 100%; max-height: clamp(120px, 18vw, 200px);
  object-fit: contain; object-position: center;
  transition: transform 0.5s ease;
}
.win-card:hover .win-icon { transform: scale(1.04); }
.win-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.win-chip { font-family: "DM Mono", monospace; font-size: 0.58rem; letter-spacing: 0.08em; text-transform: uppercase; color: #C48CB3; padding: 3px 7px; border-radius: 4px; background: rgba(196,140,179,0.08); border: 1px solid rgba(196,140,179,0.2); }
.win-accent      { color: #c89a5a; }

/* ── GLOW CARD EFFECT ── */
.glow-card { position: relative; overflow: hidden; }
.glow-card::after {
  content: '';
  position: absolute; inset: 0;
  background: radial-gradient(600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(131,166,206,0.06), transparent 40%);
  pointer-events: none; opacity: 0;
  transition: opacity 0.3s;
}
.glow-card:hover::after { opacity: 1; }

/* ── SKILLS ── */
#skills h2 { margin-bottom: clamp(36px, 5vh, 56px); }
/* Mirrored mini-card grid: 2 cards per row, images meet in the middle */
.skills-mirror-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 18px; }

.skill-mini {
  display: grid;
  grid-template-columns: 1fr minmax(120px, 35%);
  border: 1px solid rgba(255,255,255,0.06);
  border-radius: 16px;
  background: linear-gradient(145deg, rgba(2,38,85,0.7), rgba(39,38,64,0.4));
  position: relative; overflow: hidden;
  transition: border-color 0.22s, transform 0.22s, box-shadow 0.22s;
  min-height: 190px;
}
.skill-mini.flip { grid-template-columns: minmax(120px, 35%) 1fr; }
.skill-mini.solo { grid-column: 1 / -1; grid-template-columns: 1fr minmax(280px, 35%); }

.skill-mini::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px;
  background: var(--ct, #83A6CE); opacity: 0.85;
  transform: scaleX(0); transform-origin: left;
  transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
  z-index: 2;
}
.skill-mini.revealed::before { transform: scaleX(1); }
.skill-mini:hover { border-color: rgba(131,166,206,0.18); transform: translateY(-3px); box-shadow: 0 12px 40px rgba(0,0,0,0.4); }

.mini-thumb {
  position: relative; overflow: hidden;
  border-left: 1px solid rgba(255,255,255,0.06);
  display: flex; align-items: center; justify-content: center;
  padding: 16px; box-sizing: border-box;
}
.skill-mini.flip .mini-thumb { border-left: none; border-right: 1px solid rgba(255,255,255,0.06); }
.mini-thumb img {
  max-width: 100%; max-height: clamp(120px, 18vw, 200px);
  object-fit: contain; object-position: center;
  transition: transform 0.5s ease;
}
/* Solo (full-width) card: image fills the wider thumb edge-to-edge instead of letterboxing */
.skill-mini.solo .mini-thumb { padding: 0; }
.skill-mini.solo .mini-thumb img {
  width: 100%; height: 100%;
  max-width: none; max-height: none;
  object-fit: cover;
}
.skill-mini:hover .mini-thumb img { transform: scale(1.04); }

.mini-body {
  padding: 22px 24px;
  display: flex; flex-direction: column; gap: 10px; justify-content: center;
}
.mini-body h3 { font-size: clamp(1.05rem, 1.3vw, 1.25rem); color: #fff; letter-spacing: -0.01em; margin: 0; line-height: 1.25; }
.mini-rule { width: 42px; height: 2px; background: var(--ct, #83A6CE); opacity: 0.7; border-radius: 2px; }

.skill-mini ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 7px; }
.skill-mini li { font-size: 0.85rem; color: rgba(180,210,240,0.72); line-height: 1.5; padding-left: 13px; position: relative; }
.skill-mini li::before { content: ''; position: absolute; left: 0; top: 0.7em; width: 6px; height: 1px; background: var(--ct, #83A6CE); opacity: 0.75; }

/* Placeholder thumb until real images are added: gradient tinted by --ct + centered icon */
/* ── SKILLS BOTTOM BANNER ── */
.skills-banner {
  margin-top: clamp(28px,4vh,48px);
  padding: 28px 32px; border-radius: 16px;
  background: linear-gradient(135deg,rgba(2,38,85,0.8),rgba(62,31,71,0.6));
  border: 1px solid rgba(131,166,206,0.12);
  display: flex; flex-direction: column; gap: 16px;
}
.skills-banner h3 { font-size: clamp(1.1rem,2vw,1.6rem); font-weight: 700; margin-bottom: 4px; }
.skills-banner h3 em { font-style: normal; color: #83A6CE; }
.skills-banner p { font-size: 0.78rem; color: rgba(180,210,240,0.55); line-height: 1.65; }
.skills-banner p strong { color: #83A6CE; font-weight: 600; }
.sb-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.sb-chip {
  display: flex; align-items: center; gap: 7px; padding: 8px 13px;
  border-radius: 10px; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.08);
  font-size: 0.7rem; font-weight: 600; color: #F4F7FB;
  transition: background 0.2s, border-color 0.2s;
}
.sb-chip.hot { border-color: rgba(131,166,206,0.24); background: rgba(131,166,206,0.08); }
.sb-chip svg { width: 14px; height: 14px; stroke: #83A6CE; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
.sb-chip.hot svg { stroke: #83A6CE; }
.sb-divider {
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(131,166,206,0.22), rgba(196,140,179,0.22), transparent);
  margin: 4px 0;
}
.skills-banner .certs-section { margin: 0; }
.skills-banner .certs-label { margin-bottom: 12px; }
.sb-cta-row { display: flex; justify-content: flex-end; }
.sb-cta {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 24px; border-radius: 10px; background: #83A6CE; color: #001233;
  font-size: 0.8rem; font-weight: 800; text-decoration: none;
  box-shadow: 0 0 24px rgba(131,166,206,0.3); transition: opacity 0.2s, transform 0.2s;
}
.sb-cta:hover { opacity: 0.9; transform: translateY(-2px); }
.sb-cta svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2.5; stroke-linecap: round; }

/* ── HOMELAB ── */
.homelab-meta { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 28px; }
.lab-updated { display: inline-flex; align-items: center; gap: 8px; padding: 5px 14px; border-radius: 40px; border: 1px solid rgba(131,166,206,0.3); background: rgba(131,166,206,0.08); font-family: "DM Mono", monospace; font-size: 0.62rem; letter-spacing: 0.12em; text-transform: uppercase; color: #83A6CE; }
.lab-updated .upd-dot { width: 5px; height: 5px; border-radius: 50%; background: #6ee7b7; animation: pulse 2s infinite; }
.lab-github {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 5px 14px; border-radius: 40px;
  border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.05);
  font-family: "DM Mono", monospace; font-size: 0.62rem; letter-spacing: 0.08em;
  color: rgba(255,255,255,0.7); text-decoration: none; transition: all 0.2s;
}
.lab-github:hover { border-color: #83A6CE; color: #83A6CE; background: rgba(131,166,206,0.1); }
.lab-github svg { width: 13px; height: 13px; stroke: currentColor; fill: none; stroke-width: 2; }

.homelab-layout { display: grid; grid-template-columns: 2.2fr 1.4fr; gap: 28px; align-items: stretch; }
.homelab-layout > div:last-of-type { display: flex; flex-direction: column; min-height: 0; }
.diagram-wrap a   { display: block; border-radius: 8px; border: 1px solid rgba(255,255,255,0.07); transition: border-color 0.2s, transform 0.18s; position: relative; }
.diagram-wrap a:hover { border-color: rgba(131,166,206,0.35); transform: translateY(-3px); }
.diagram-wrap img { width: 100%; height: auto; display: block; object-fit: contain; border-radius: 8px; }
.hw-list  { display: grid; grid-template-columns: 1fr; grid-auto-rows: 1fr; gap: 6px; margin-bottom: 0; flex: 1; min-height: 0; }
.hw-item  { display: flex; flex-direction: column; gap: 0; padding: 4px 12px; min-height: 0; justify-content: center; border: 1px solid rgba(255,255,255,0.07); border-radius: 8px; background: rgba(255,255,255,0.04); transition: border-color 0.2s, transform 0.18s; position: relative; overflow: hidden; }
.hw-item:hover { border-color: rgba(131,166,206,0.35); transform: translateY(-3px); }
.hw-k { font-family: "DM Mono", monospace; font-size: 0.55rem; color: #83A6CE; text-transform: uppercase; letter-spacing: 0.12em; }
.hw-v { font-size: 1rem; color: #fff; font-weight: 400; line-height: 1.25; }
.vlan-tags { display: flex; gap: 6px; flex-wrap: wrap; }
.vlan-tags-row { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; margin-top: 16px; }
.vlan-tags-row .vtag { justify-content: center; padding: 8px 12px; font-size: 0.65rem; }
@media (max-width: 720px) { .vlan-tags-row { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 420px) { .vlan-tags-row { grid-template-columns: repeat(2, 1fr); } }
.vtag { padding: 3px 10px; border-radius: 40px; font-family: "DM Mono", monospace; font-size: 0.58rem; letter-spacing: 0.07em; font-weight: 500; text-decoration: none; cursor: pointer; transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease; display: inline-flex; align-items: center; justify-content: space-between; gap: 12px; }
.vtag::after { content: ''; display: inline-block; width: 16px; height: 16px; border: 1px solid rgba(255,255,255,0.45); border-radius: 4px; background: rgba(255,255,255,0.10) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 3h7v7m0-7L5 11' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/10px 10px no-repeat; box-shadow: 0 0 6px rgba(255,255,255,0.25); transition: box-shadow 0.2s, transform 0.2s, border-color 0.2s; }
.vtag:hover { transform: translateY(-3px) scale(1.05); }
.vtag:hover::after { box-shadow: 0 0 12px rgba(255,255,255,0.55); border-color: rgba(255,255,255,0.75); transform: translate(1px, -1px); }
.v0 { background: rgba(180,180,190,0.08);  color: rgba(220,220,230,0.75); border: 1px solid rgba(180,180,190,0.22); }
.v0:hover { box-shadow: 0 4px 18px rgba(180,180,190,0.22); border-color: rgba(180,180,190,0.45); }
.v1 { background: rgba(131,166,206,0.12); color: #83A6CE;               border: 1px solid rgba(131,166,206,0.28); }
.v1:hover { box-shadow: 0 4px 18px rgba(131,166,206,0.3); border-color: rgba(131,166,206,0.55); }
.v2 { background: rgba(196,140,179,0.10); color: #C48CB3;               border: 1px solid rgba(196,140,179,0.25); }
.v2:hover { box-shadow: 0 4px 18px rgba(196,140,179,0.3); border-color: rgba(196,140,179,0.5); }
.v3 { background: rgba(255,255,255,0.05); color: rgba(229,201,215,0.7); border: 1px solid rgba(255,255,255,0.08); }
.v3:hover { box-shadow: 0 4px 18px rgba(229,201,215,0.2); border-color: rgba(255,255,255,0.2); }
.v4 { background: rgba(110,231,183,0.10); color: #6ee7b7;               border: 1px solid rgba(110,231,183,0.25); }
.v4:hover { box-shadow: 0 4px 18px rgba(110,231,183,0.3); border-color: rgba(110,231,183,0.5); }
.v5 { background: rgba(241,196, 15,0.08); color: #f1c40f;               border: 1px solid rgba(241,196, 15,0.20); }
.v5:hover { box-shadow: 0 4px 18px rgba(241,196,15,0.25); border-color: rgba(241,196,15,0.45); }

.homelab-blurbs { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 32px; }
.win-sm { padding: 22px 24px; border: 1px solid rgba(255,255,255,0.07); border-radius: 10px; background: rgba(255,255,255,0.04); transition: border-color 0.2s, transform 0.18s; position: relative; overflow: hidden; }
.win-sm:hover { border-color: rgba(131,166,206,0.35); transform: translateY(-3px); }
.win-sm h4 { font-size: 1.125rem; font-weight: 700; color: #fff; margin-bottom: 8px; line-height: 1.3; }
.win-sm p  { font-size: 1rem; color: rgba(229,201,215,0.7); font-weight: 300; line-height: 1.65; }

/* Timeline */
.lab-section-title { font-family: "DM Mono", monospace; font-size: clamp(0.7rem, 1.1vw, 0.88rem); letter-spacing: clamp(0.18em, 0.5vw, 0.32em); text-transform: uppercase; color: #C48CB3; margin: 44px 0 24px; text-align: center; padding: 0 clamp(10px, 3vw, 40px); }
.lab-timeline { position: relative; max-width: 1100px; margin: 0 auto; padding: 0 20px; }
.lab-timeline::before { content: ""; position: absolute; left: 50%; top: 0; bottom: var(--lab-tl-bottom, 0); width: 1px; background: linear-gradient(to bottom, #83A6CE, rgba(131,166,206,0.15)); transform: translateX(-50%); }
.tl-item { position: relative; width: 45%; margin-bottom: 28px; border: 1px solid rgba(255,255,255,0.08); border-radius: 10px; padding: 14px 12px; background: rgba(255,255,255,0.03); transition: border-color 0.2s, transform 0.18s; }
.tl-item:hover { border-color: rgba(131,166,206,0.35); transform: translateY(-3px); }
.tl-item:nth-child(odd)  { margin-left: 0;   text-align: right; padding-right: 36px; }
.tl-item:nth-child(even) { margin-left: 55%; text-align: left;  padding-left:  36px; }
.tl-item:last-child { margin-bottom: 0; }
.tl-date, .tl-title, .tl-desc { text-align: left; }
.tl-desc ul { text-align: left; text-wrap: pretty; }
.tl-dot { position: absolute; top: 6px; width: 12px; height: 12px; border-radius: 50%; border: 2px solid #83A6CE; background: #1b1b1e; z-index: 1; }
.tl-item:nth-child(odd)  .tl-dot { right: -18px; }
.tl-item:nth-child(even) .tl-dot { left:  -18px; }
.tl-item:first-child .tl-dot { background: #6ee7b7; border-color: #6ee7b7; box-shadow: 0 0 12px rgba(110,231,183,0.4); }
.tl-date  { font-family: "DM Mono", monospace; font-size: 0.6rem; color: #83A6CE; letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 4px; font-weight: 500; }
.tl-title { font-size: 1.125rem; font-weight: 700; color: #E5C9D7; margin-bottom: 10px; padding-bottom: 8px; border-bottom: 1px solid rgba(255,255,255,0.08); line-height: 1.3; }
.tl-desc  { font-size: 1rem; color: rgba(229,201,215,0.7); font-weight: 300; line-height: 1.65; margin-top: 8px; }
.tl-desc ul { padding-left: 14px; }

/* ── APPROACH ── */
.approach-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; margin-bottom: 36px; }
.approach-card {
  padding: 28px 26px; border: 1px solid rgba(255,255,255,0.08);
  border-radius: 10px; background: rgba(255,255,255,0.04);
  transition: border-color 0.3s, transform 0.25s;
  position: relative; overflow: hidden;
}
.approach-card:hover { border-color: rgba(131,166,206,0.3); transform: translateY(-2px); }
.approach-num { font-family: "DM Mono", monospace; font-size: 0.6rem; color: #C48CB3; letter-spacing: 0.15em; text-transform: uppercase; margin-bottom: 10px; }
.approach-card h3 { font-size: 1.125rem; font-weight: 700; color: #fff; margin-bottom: 10px; line-height: 1.3; }
.approach-card p  { font-size: 1rem; color: rgba(229,201,215,0.7); font-weight: 300; line-height: 1.65; }

/* ── CERTS ── */
.certs-section { margin-top: 36px; }
.certs-label { font-family: "DM Mono", monospace; font-size: 0.62rem; letter-spacing: 0.18em; text-transform: uppercase; color: #C48CB3; margin-bottom: 16px; }
.certs-grid { display: flex; flex-wrap: wrap; gap: 10px; }
.cert-badge {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 16px; border-radius: 8px;
  border: 1px solid rgba(255,255,255,0.09);
  background: rgba(255,255,255,0.04);
  font-size: 0.75rem; font-weight: 600; color: #fff;
}
.cert-badge .cert-icon  { font-size: 1rem; }
.cert-year {
  font-family: "Plus Jakarta Sans", system-ui, -apple-system, sans-serif;
  font-size: 0.78rem;
  font-weight: 500;
  color: rgba(229,201,215,0.7);
  margin-left: 6px;
  letter-spacing: 0.01em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* ── CONTACT ── */
.contact-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: stretch; }
.contact-tagline { font-size: clamp(1.1rem, 2vw, 1.5rem); font-weight: 700; color: #F4F7FB; max-width: 440px; line-height: 1.4; margin-bottom: 12px; }
.contact-sub     { font-size: 1rem; color: rgba(244,247,251,0.65); margin-bottom: 12px; font-weight: 300; line-height: 1.65; }
.contact-chips   { display: flex; flex-direction: column; gap: 12px; }
.contact-chip {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 20px; border-radius: 10px;
  border: 1px solid rgba(255,255,255,0.15);
  background: rgba(255,255,255,0.07);
  color: #F4F7FB; text-decoration: none;
  font-size: 1rem; font-weight: 600; transition: all 0.2s;
}
.contact-chip:hover { background: rgba(255,255,255,0.14); transform: translateX(4px); }
.contact-chip svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2; flex-shrink: 0; }
.avail-box    { padding: 36px; border-radius: 12px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.12); }
.avail-label  { font-family: "DM Mono", monospace; font-size: 0.62rem; letter-spacing: 0.18em; text-transform: uppercase; color: rgba(244,247,251,0.5); margin-bottom: 12px; }
.avail-status { font-size: 1.6rem; font-weight: 800; color: #F4F7FB; margin-bottom: 8px; }
.avail-dot    { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: #C48CB3; margin-right: 8px; animation: pulse 2s infinite; }
.avail-text   { font-size: 1rem; color: rgba(244,247,251,0.65); font-weight: 300; line-height: 1.65; }
.avail-text + .avail-text { margin-top: 16px; }
a.avail-cta-box {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  text-decoration: none;
  color: inherit;
  border: 1px solid rgba(255,255,255,0.16);
  box-shadow:
    0 0 24px rgba(255,255,255,0.05),
    0 0 60px rgba(255,255,255,0.025);
  transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.2s ease;
}
a.avail-cta-box:hover {
  border-color: rgba(255,255,255,0.32);
  box-shadow:
    0 0 32px rgba(255,255,255,0.10),
    0 0 80px rgba(255,255,255,0.05);
  transform: translateY(-2px);
}
a.avail-cta-box .avail-status svg { stroke: currentColor; fill: none; stroke-width: 2; opacity: 0.55; transition: opacity 0.2s, transform 0.2s; }
a.avail-cta-box:hover .avail-status svg { opacity: 1; transform: translate(2px, -2px); }
a.avail-cta-box .avail-dot { background: #6ee7b7; }

/* ── REVEAL ANIMATIONS (initial states - GSAP animates from these) ── */
.reveal, .reveal-stagger > *, .reveal-slide-left, .reveal-slide-right, .reveal-scale, .reveal-clip {
  opacity: 0;
  will-change: transform, opacity;
}
/* Hero stays visible on load (no reveal animation for above-the-fold) */
#home .reveal,
#home .reveal-stagger > *,
#home .reveal-slide-left,
#home .reveal-slide-right,
#home .reveal-scale,
#home .reveal-clip {
  opacity: 1;
}

/* ── WORD SPLIT ANIMATION ── */
.reveal-text .word { display: inline-block; overflow: visible; vertical-align: bottom; padding-bottom: 0.08em; }
.reveal-text .word.anim-done { overflow: visible; }
.reveal-text .word-inner { display: inline-block; }

/* ── RESPONSIVE ── */

/* Mobile nav (hamburger): < 768px */
@media (max-width: 767px) {
  .hamburger {
    display: flex; flex-direction: column; gap: 5px;
    cursor: pointer; padding: 8px 4px; z-index: 210;
    background: none; border: none;
    -webkit-tap-highlight-color: transparent;
  }
  .nav-inner { flex-wrap: nowrap; }
  .nav-avatar { width: 30px; height: 30px; }
  .nav-links {
    position: fixed; top: 0; left: 0; right: 0;
    flex-direction: column; align-items: stretch;
    background: rgba(3,6,20,0.97);
    backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px);
    gap: 4px; max-height: 0; overflow: hidden;
    opacity: 0; pointer-events: none; z-index: 205;
    border-bottom: 1px solid rgba(255,255,255,0.1);
    padding: 0;
    transition: max-height 0.4s cubic-bezier(0.4,0,0.2,1),
                opacity    0.3s ease,
                padding    0.4s cubic-bezier(0.4,0,0.2,1);
  }
  .nav-toggle-cb:checked ~ .nav-links {
    max-height: 100vh; opacity: 1; pointer-events: all;
    padding: 80px 24px 32px;
  }
  .nav-links li { width: 100%; }
  .nav-link {
    display: block; width: 100%; text-align: left;
    font-size: 1rem; padding: 14px 18px;
    border-radius: 10px; letter-spacing: 0.05em;
    color: rgba(255,255,255,0.65);
  }
  .nav-link:hover,
  .nav-link.active { color: #fff; background: rgba(255,255,255,0.08); }
  .nav-toggle-cb:checked ~ .hamburger .ham-line:nth-child(1) { transform: translateY(7px)  rotate( 45deg); }
  .nav-toggle-cb:checked ~ .hamburger .ham-line:nth-child(2) { opacity: 0; }
  .nav-toggle-cb:checked ~ .hamburger .ham-line:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
}

/* Tablet: <= 860px */
@media (max-width: 860px) {
  .about-layout { grid-template-columns: 1fr; gap: 20px; }
  .photo-wrap   { display: flex !important; flex-direction: row !important; align-items: center; gap: 16px; }
  .photo-circle { width: clamp(72px, 14vw, 110px) !important; height: clamp(72px, 14vw, 110px) !important; flex-shrink: 0; }
  .photo-info   { flex: 1 1 0; min-width: 0; overflow: hidden; flex-direction: column; }
  .photo-name   { margin-top: 0 !important; text-align: left !important; white-space: normal; }
  .about-layout > div:last-child { overflow: hidden; min-width: 0; max-width: 100%; }
  .homelab-layout { grid-template-columns: 1fr; gap: 24px; }
  .contact-layout { grid-template-columns: 1fr; gap: 24px; }
  .skills-mirror-grid { grid-template-columns: 1fr; }
  .skill-mini { grid-template-columns: 1fr minmax(100px, 25%); min-height: auto; }
  .skill-mini.flip { grid-template-columns: minmax(100px, 25%) 1fr; }
  .skill-mini.solo { grid-template-columns: 1fr; min-height: auto; }
  .project-featured { grid-template-columns: 1fr !important; }
  .featured-thumb {
    border-right: none;
    border-bottom: 1px solid rgba(255,255,255,0.06);
    aspect-ratio: 16 / 9;
    min-height: auto !important;
    max-height: 240px;
  }
  .featured-thumb img { width: 100%; height: 100%; object-fit: cover; }
  .project-featured .lab-strip { display: none; }
}

/* Small tablet: <= 768px - wins and approach go single-column */
@media (max-width: 768px) {
  .wins-grid, .approach-grid { grid-template-columns: 1fr; }
}

/* Mobile portrait: <= 600px */
@media (max-width: 600px) {
  .section-inner { padding: clamp(90px, 13vh, 110px) 16px 40px; }
  h1 { font-size: clamp(1.9rem, 9vw, 2.8rem); }
  .long-list { columns: 1; }
  .stats-row   { width: 100%; }
  .stat { flex: 1 1 auto; min-width: calc(33% - 1px); border-right: 1px solid rgba(255,255,255,0.18); border-bottom: 1px solid rgba(255,255,255,0.18); }
  .stat:nth-child(3) { border-right: none; }
  .stat:nth-last-child(-n+2) { border-bottom: none; }
  .stat:last-child { border-right: none; }
  .home-bio { text-align: left; }
  #home .home-actions { gap: 8px; }
  #home .home-actions .btn  { flex: 1 1 calc(50% - 4px); justify-content: center; padding: 10px 14px; }
  #home .home-actions .chip { flex: 1 1 calc(50% - 4px); justify-content: center; font-size: 0.7rem; padding: 7px 10px; }
  .about-text { text-align: left; }
  .about-layout { gap: 16px; }
  .photo-wrap   { flex-direction: column !important; align-items: center !important; gap: 10px !important; width: 100%; }
  .photo-circle { width: 90px !important; height: 90px !important; }
  .photo-info   { width: 100% !important; flex: none !important; overflow: visible !important; }
  .photo-name   { text-align: center !important; margin-bottom: 10px; }
  .photo-tl     { width: 100%; }
  .ptl-headers  { margin-bottom: 6px; }
  .ptl-item     { margin-bottom: 12px; }
  .skill-mini, .skill-mini.solo { grid-template-columns: 1fr minmax(90px, 22%); min-height: auto; }
  .skill-mini.flip { grid-template-columns: minmax(90px, 22%) 1fr; min-height: auto; }
  .mini-thumb { padding: 12px; }
  .skills-banner { padding: 20px 18px; }
  .lab-timeline::before { left: 14px; transform: none; }
  .tl-item {
    width: 100% !important; margin-left: 0 !important;
    text-align: left !important; padding-left: 36px !important;
    padding-right: 12px !important;
  }
  .tl-item .tl-dot { left: 8px !important; right: auto !important; }
  .homelab-blurbs { grid-template-columns: 1fr; }
  .scroll-hint { display: none; }
}

/* Narrow phones: <= 480px */
@media (max-width: 480px) {
  .section-inner { padding-left: 12px; padding-right: 12px; }
  .long-card { padding: 14px 14px; }
  .win-card { grid-template-columns: 1fr; min-height: auto; }
  .win-card.flip { grid-template-columns: 1fr; }
  .win-thumb { justify-content: center; padding: 12px; border-left: none !important; border-right: none !important; border-top: 1px solid rgba(255,255,255,0.06); }
  .win-icon { max-width: 100%; max-height: clamp(90px, 16vw, 160px); width: auto; height: auto; }
  .win-body { padding: 16px; }
  .win-chips { gap: 4px; }
  .skill-mini, .skill-mini.solo { grid-template-columns: 1fr; min-height: auto; }
  .skill-mini.flip { grid-template-columns: 1fr; }
  .mini-thumb { border-left: none !important; border-right: none !important; border-top: 1px solid rgba(255,255,255,0.06); padding: 12px; }
  .mini-body { padding: 16px; }
  .skills-banner { padding: 16px 14px; }
  .sb-chip { padding: 6px 10px; }
  .contact-chip { padding: 12px 14px; }
  .avail-box { padding: 24px 18px; }
  .featured-body { padding: 18px !important; }
  .msp-stats { width: 100%; }
  .msp-stat { flex: 1 1 auto; min-width: calc(50% - 1px); }
  .msp-stat:nth-child(2n) { border-right: none; }
  .msp-stat:nth-child(odd) { border-right: 1px solid rgba(255,255,255,0.08); }
  .nav-inner { padding: 0 12px; }
  .btn { padding: 11px 20px; }
  .chip { padding: 7px 12px; }
  .ptl-head-edu, .ptl-head-exp { font-size: 0.58rem; }
  .wins-cta { padding: 16px 12px; flex-direction: column; text-align: center; }
}

/* Mobile landscape */
@media (orientation: landscape) and (max-height: 600px) {
  .section-inner { padding: 80px 16px 30px; }
  #home .section-inner { min-height: unset; }
  h1 { font-size: clamp(1.5rem, 5vw, 2.6rem); margin-bottom: 5px; }
  h2 { font-size: clamp(1rem, 3vw, 1.5rem); margin-bottom: 10px; }
  .home-badge    { margin-bottom: 7px; }
  .typewriter-wrap { margin-bottom: 7px; min-height: unset; }
  .home-bio      { margin-bottom: 8px; font-size: 0.82rem; }
  .stats-row     { margin-top: 10px; }
  .stat          { padding: 7px 12px; }
  .stat-n        { font-size: 1rem; }
  .about-layout  { grid-template-columns: clamp(110px, 18vw, 150px) 1fr !important; gap: 18px; align-items: start; }
  .photo-wrap    { flex-direction: column !important; align-items: center; }
  .photo-circle  { width: clamp(80px, 12vw, 108px) !important; height: clamp(80px, 12vw, 108px) !important; }
  .photo-name    { margin-top: 8px !important; text-align: center !important; font-size: 0.74rem; }
  .photo-tl      { display: none; }
  .long-card     { padding: 12px 14px; }
  .long-list     { columns: 2; column-gap: 14px; }
  .homelab-layout { grid-template-columns: 1fr 1fr !important; gap: 16px; }
  .contact-layout { grid-template-columns: 1fr 1fr !important; gap: 20px; align-items: start; }
  .wins-grid, .approach-grid { grid-template-columns: 1fr 1fr !important; gap: 8px; }
  .win-card, .win-card.flip { grid-template-columns: 1fr minmax(80px, 28%); min-height: 160px; }
  .win-body { padding: 14px 16px; gap: 8px; }
  .win-icon { max-width: 100%; max-height: clamp(90px, 16vw, 160px); width: auto; height: auto; }
  .approach-card  { padding: 10px 12px; }
  .skills-mirror-grid { grid-template-columns: 1fr; gap: 10px; }
  .skill-mini, .skill-mini.solo { grid-template-columns: 1fr minmax(90px, 22%); min-height: auto; }
  .skill-mini.flip { grid-template-columns: minmax(90px, 22%) 1fr; min-height: auto; }
  .mini-body     { padding: 14px 16px; gap: 8px; }
  .mini-thumb    { padding: 10px; }
  .avail-box     { padding: 16px; }
  .scroll-hint   { display: none; }
}

/* ── PREFERS REDUCED MOTION ── */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  .reveal, .reveal-stagger > *, .reveal-slide-left, .reveal-slide-right, .reveal-scale, .reveal-clip {
    opacity: 1 !important;
    transform: none !important;
  }
  .scroll-dot { animation: none; }
  #three-bg { opacity: 0.3; }
}

/* ══════════════════════════════════════════════════════════════════
   PROJECTS HUB SECTION
   Featured Homelab card + Research / Vlog row + Coming Soon state
   ══════════════════════════════════════════════════════════════════ */

.section-sub {
  color: rgba(255,255,255,0.65);
  font-size: clamp(0.95rem, 1.1vw, 1.05rem);
  max-width: 640px;
  margin-top: 0.5rem;
  margin-bottom: 2rem;
  line-height: 1.6;
}

/* Featured card (Homelab) - full width, image + text side-by-side */
.project-featured {
  display: grid;
  grid-template-columns: minmax(280px, 42%) 1fr;
  gap: 0;
  padding: 0 !important;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  margin-bottom: 1.25rem;
  position: relative;
}

/* Card-level CLICK pill (top-right corner indicator) */
.card-ext-arrow {
  position: absolute;
  top: 12px;
  right: 12px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: rgba(131,166,206,0.10);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  border: 1px solid rgba(131,166,206,0.4);
  border-radius: 999px;
  color: #83A6CE;
  padding: 6px 12px 6px 10px;
  z-index: 3;
  pointer-events: none;
  animation: card-ext-arrow-breath 6s ease-in-out infinite;
}
.card-ext-arrow::before {
  content: 'Click';
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
}
.card-ext-arrow svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  fill: none;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  animation: card-ext-arrow-drift 6s ease-in-out infinite;
}
@keyframes card-ext-arrow-breath {
  0%, 100% { box-shadow: 0 0 0 0 rgba(131,166,206,0);     border-color: rgba(131,166,206,0.45); }
  50%      { box-shadow: 0 0 10px 0 rgba(131,166,206,0.5); border-color: rgba(131,166,206,0.95); }
}
@keyframes card-ext-arrow-drift {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(3px, -3px); }
}
@media (prefers-reduced-motion: reduce) {
  .card-ext-arrow, .card-ext-arrow svg { animation: none; }
}
.project-soon .card-ext-arrow { display: none; }

/* Responsive shrink for the CLICK pill on small screens so it does not crowd small cards */
@media (max-width: 600px) {
  .card-ext-arrow { padding: 4px 9px 4px 8px; gap: 5px; }
  .card-ext-arrow::before { font-size: 0.56rem; letter-spacing: 0.14em; }
  .card-ext-arrow svg { width: 12px; height: 12px; }
  .click-cta { padding: 3px 8px; }
  .click-cta-text { font-size: 0.55rem; letter-spacing: 0.14em; }
  .click-cta svg { width: 10px; height: 10px; }
}

/* Inline CLICK pill (used next to Live Tool tag on Find Jobs card) */
.click-cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: rgba(131,166,206,0.10);
  border: 1px solid rgba(131,166,206,0.4);
  border-radius: 999px;
  color: #83A6CE;
  padding: 4px 10px 4px 10px;
  pointer-events: none;
  animation: click-cta-breath 6s ease-in-out infinite;
}
.click-cta-text {
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
}
.click-cta svg {
  width: 12px;
  height: 12px;
  stroke: currentColor;
  fill: none;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  animation: click-cta-drift 6s ease-in-out infinite;
}
@keyframes click-cta-breath {
  0%, 100% { box-shadow: 0 0 0 rgba(131,166,206,0);       border-color: rgba(131,166,206,0.3); }
  50%      { box-shadow: 0 0 22px rgba(131,166,206,0.55); border-color: rgba(131,166,206,0.9); }
}
@keyframes click-cta-drift {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(3px, -3px); }
}
@media (prefers-reduced-motion: reduce) {
  .click-cta, .click-cta svg { animation: none; }
}
.featured-thumb {
  position: relative;
  overflow: hidden;
  background: transparent;
  border-right: 1px solid rgba(255,255,255,0.06);
  min-height: 240px;
}
.featured-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  transition: transform 0.5s ease;
}
.project-featured:hover .featured-thumb img { transform: scale(1.04); }
.project-featured.spotlight {
  border: 1px solid rgba(255,255,255,0.55);
  box-shadow:
    0 0 24px rgba(255,255,255,0.15),
    0 0 60px rgba(255,255,255,0.06);
}
.project-featured.spotlight:hover {
  border-color: rgba(255,255,255,0.75);
  box-shadow:
    0 0 32px rgba(255,255,255,0.22),
    0 0 80px rgba(255,255,255,0.10);
}
.project-featured.spotlight .featured-tag {
  animation: featuredPulse 10s ease-in-out infinite;
}
@keyframes featuredPulse {
  0%, 100% { box-shadow: 0 0 0 rgba(131,166,206,0); }
  50%      { box-shadow: 0 0 18px rgba(131,166,206,0.5); }
}
.featured-body {
  padding: 32px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  justify-content: center;
}
.featured-tag {
  display: inline-block;
  width: fit-content;
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #83A6CE;
  background: rgba(131,166,206,0.1);
  border: 1px solid rgba(131,166,206,0.25);
  padding: 4px 10px;
  border-radius: 999px;
  font-weight: 600;
}
.featured-body h3 {
  font-size: clamp(1.4rem, 2vw, 1.75rem);
  margin: 0;
  letter-spacing: -0.015em;
}
.featured-body p {
  color: rgba(255,255,255,0.72);
  font-size: 0.95rem;
  line-height: 1.6;
  margin: 0;
}

/* Row of 2 cards beneath the featured */
.projects-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}

/* Standard small project card (Research, Vlog) */
.project-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 28px 26px !important;
  text-decoration: none;
  color: inherit;
  min-height: 240px;
  position: relative;
}
.project-card h3 {
  font-size: clamp(1.15rem, 1.6vw, 1.4rem);
  margin: 0;
  letter-spacing: -0.01em;
}
.project-card p {
  color: rgba(255,255,255,0.7);
  font-size: 0.95rem;
  line-height: 1.55;
  margin: 0;
  flex-grow: 1;
}
.project-icon {
  width: 56px;
  height: 56px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 14px;
  background: linear-gradient(135deg, rgba(131,166,206,0.18), rgba(167,139,250,0.18));
  border: 1px solid rgba(255,255,255,0.08);
  color: #83A6CE;
  margin-bottom: 4px;
}
.card-arrow {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.9rem;
  color: #83A6CE;
  font-weight: 500;
  margin-top: 6px;
  transition: gap 0.25s ease, color 0.25s ease;
}
a.project-card:hover .card-arrow,
a.project-featured:hover .card-arrow {
  gap: 12px;
  color: #83A6CE;
}
a.project-card:hover .project-icon {
  transform: scale(1.05);
  transition: transform 0.3s ease;
}

/* "Coming Soon" disabled state for Vlog */
.project-soon {
  opacity: 0.55;
  cursor: not-allowed;
  filter: grayscale(0.4);
}
.project-soon:hover { transform: none !important; }
.soon-badge {
  position: absolute;
  top: 16px;
  right: 16px;
  font-size: 0.7rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #fbbf24;
  background: rgba(251,191,36,0.1);
  border: 1px solid rgba(251,191,36,0.3);
  padding: 4px 10px;
  border-radius: 999px;
  font-weight: 600;
}
.card-arrow.soon { color: rgba(255,255,255,0.4); }

/* MSP-style stats bar (used on MSP page and home MSP card) */
.msp-stats { display: flex; flex-wrap: wrap; gap: 0; border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; overflow: hidden; margin: 24px 0 36px; width: fit-content; max-width: 100%; }
.msp-stat { padding: clamp(10px, 2vh, 18px) clamp(14px, 2.5vw, 26px); text-align: center; border-right: 1px solid rgba(255,255,255,0.08); }
.msp-stat:last-child { border-right: none; }
.msp-stat-n { display: block; font-size: clamp(1.1rem, 2.4vw, 1.7rem); font-weight: 800; color: #10b981; line-height: 1; }
.msp-stat-l { display: block; font-size: clamp(0.52rem, 0.9vw, 0.62rem); color: rgba(229,201,215,0.7); letter-spacing: 0.1em; text-transform: uppercase; margin-top: 5px; font-weight: 600; }

/* Strong clickable-card affordance pattern */
/* (1) deeper hover lift, (2) title underline on hover, (3) arrow slides on hover */
.card-strong-hover { transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease; }
.skill-mini.card-strong-hover:hover,
.win-card.card-strong-hover:hover,
.avail-box.card-strong-hover:hover { transform: translateY(-5px); }
.card-strong-hover:hover h3 {
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 4px;
  text-decoration-color: var(--ct, #83A6CE);
}
.card-strong-hover:hover .card-arrow {
  gap: 12px;
  color: var(--ct, #83A6CE);
}
/* avail-box variants: underline the label, slide the inline arrow on hover */
.avail-box.card-strong-hover:hover .avail-label {
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 4px;
}
.avail-box.card-strong-hover .avail-status svg { transition: transform 0.25s ease; }
.avail-box.card-strong-hover:hover .avail-status svg { transform: translate(3px, -3px); }

/* Mobile: featured stacks, row collapses to 1 column */
/* Side-by-side scales fluidly down to mobile, stacks only on actual phones */
@media (max-width: 768px) {
  .featured-body { padding: 24px; }
  .projects-row { grid-template-columns: 1fr; }
}
/* (Featured project + solo skill collapse rules promoted to 860px block above) */

/* Inner-page "Back to Projects" link (homelab.html, research.html) */
.back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.9rem;
  color: rgba(255,255,255,0.65);
  text-decoration: none;
  margin-bottom: 1.25rem;
  padding: 6px 12px;
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 999px;
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease;
}
.back-link:hover {
  color: #83A6CE;
  border-color: rgba(131,166,206,0.4);
  background: rgba(131,166,206,0.06);
}

/* ══════════════════════════════════════════════════════════════════
   FEATURED CARD VARIANTS + LAB STRIP
   Compact + reversed featured cards for Homelab and CCNA Lab,
   plus the inline walkthrough strip with cycling thumbnails.
   ══════════════════════════════════════════════════════════════════ */

/* Highlight key credentials in body text without shouting */
.project-featured .featured-body p strong {
  color: rgba(255, 255, 255, 0.95);
  font-weight: 600;
}

/* Compact variant: ~30% shorter than the standard featured card */
.project-featured.compact .featured-thumb { min-height: 168px; }
.project-featured.compact .featured-body { padding: 36px 22px 24px; gap: 10px; }
.project-featured.compact .featured-body h3 { font-size: clamp(1.15rem, 1.5vw, 1.4rem); }
.project-featured.compact .featured-body p { font-size: 0.88rem; line-height: 1.5; }

/* Lab strip: thin walkthrough teaser inside the card body */
.lab-strip {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 8px 14px 8px 8px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.07);
  border-radius: 12px;
  margin-top: 14px;
  margin-bottom: 6px;
  text-decoration: none;
  color: inherit;
  transition: all 0.25s;
}
.lab-strip:hover {
  border-color: rgba(131, 166, 206, 0.35);
  transform: translateY(-1px);
}
.lab-strip-thumb {
  flex: 0 0 auto;
  width: 64px;
  height: 64px;
  border-radius: 8px;
  background-size: cover;
  background-position: center;
  border: 1px solid rgba(255, 255, 255, 0.08);
  display: flex; align-items: center; justify-content: center;
  font-size: 28px;
  color: #83A6CE;
  position: relative;
  overflow: hidden;
}
.lab-strip-thumb .slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 0.9s ease;
  background-size: cover;
  background-position: center;
}
.lab-strip-thumb .slide.active { opacity: 1; }
.lab-strip-thumb .ext-arrow {
  position: absolute;
  top: 4px;
  right: 4px;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 6px 2px 5px;
  background: rgba(131,166,206,0.12);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  border: 1px solid rgba(131,166,206,0.4);
  border-radius: 999px;
  color: #83A6CE;
  z-index: 2;
  animation: card-ext-arrow-breath 6s ease-in-out infinite;
}
.lab-strip-thumb .ext-arrow::before {
  content: 'Click';
  font-family: "DM Mono", monospace;
  font-size: 0.48rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  line-height: 1;
  white-space: nowrap;
}
.lab-strip-thumb .ext-arrow svg {
  width: 8px;
  height: 8px;
  stroke: currentColor;
  fill: none;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  animation: card-ext-arrow-drift 6s ease-in-out infinite;
}
.lab-strip-text { flex: 1; min-width: 0; line-height: 1.4; }
.lab-strip-text strong {
  display: block;
  color: rgba(255, 255, 255, 0.95);
  font-size: 13px;
  font-weight: 600;
  margin-bottom: 2px;
}
.lab-strip-text span {
  color: rgba(255, 255, 255, 0.6);
  font-size: 12px;
}
.lab-strip-badge {
  flex: 0 0 auto;
  padding: 3px 9px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: #83A6CE;
  background: rgba(131, 166, 206, 0.1);
  border: 1px solid rgba(131, 166, 206, 0.3);
  border-radius: 999px;
}
/* ── INITIAL HASH-SCROLL CURTAIN ──
   When the URL has a hash on first load, .hash-resolving is set on <html>
   by an inline <head> script before the body paints. We hide just the
   .section-inner (not the whole <main>) so each section's gradient stays
   visible during the resolve phase: hard-refreshing #about shows About's
   navy gradient, #contact shows Contact's teal gradient, etc.
   Projects has no gradient, so it still shows the canvas dots, which
   matches its normal look.
   main.js removes .hash-resolving and adds .hash-resolved once the target
   offsetTop is stable across consecutive frames. */
html.hash-resolving .section-inner { visibility: hidden; }
html.hash-resolved  .section-inner {
  visibility: visible;
  animation: hash-fade-in 0.22s ease-out;
}
@keyframes hash-fade-in {
  from { opacity: 0.001; }
  to   { opacity: 1; }
}

/* ── UNIFIED TYPE SCALE ──
   Same kind of element shares one size across every section.
   Hierarchy preserved: home H1 > section H2 > card title > body > list > mono label.
   Home H1 (name) and section H2s already used responsive clamp values and
   are intentionally left alone. DM Mono stays on small uppercase metadata
   labels for the "tech" accent feel; only its size is unified.

   Skipped on purpose because changing them would break tight grids or
   alter featured display elements:
     .stat-n, .stat-l (counters), .typewriter,
     .skills-banner h3 (feature CTA), .contact-tagline (large body),
     .avail-status (CTA), .hw-k, .hw-v, .vtag (tight homelab grids),
     .cert-badge main text (credential display), .section-sub (already
     close at clamp(0.95rem, 1.1vw, 1.05rem)).

   Appended at the end so the original per-component rules stay intact
   and these overrides win by source order. Easy to roll back by
   deleting this block. */

/* TIER: card titles (h3, h4 inside cards) -> 1.125rem */
.win-body h3,
.mini-body h3,
.tl-title,
.approach-card h3 {
  font-size: 1.125rem;
}

/* TIER: body paragraphs -> 1rem */
.about-text,
.win-body p,
.win-sm p,
.tl-desc,
.approach-card p,
.contact-sub,
.avail-text {
  font-size: 1rem;
}

/* TIER: compact body / list items -> 0.95rem */
.skill-mini li,
.long-list li,
.skills-banner p {
  font-size: 0.95rem;
}

/* TIER: small mono uppercase labels -> 0.62rem */
.home-badge,
.about-role,
.win-num,
.win-chip,
.tl-date,
.approach-num,
.certs-label,
.cert-year,
.avail-label,
.stack-logos .logo-pill {
  font-size: 0.62rem;
}

/* About section: bio at 1rem, box title eyebrow-small, bullets moderate */
#about .about-text { font-size: 1rem; }
#about .long-title { font-size: 0.7rem; }
#about .long-list li { font-size: 0.85rem; }
#about .about-role {
  display: inline-flex;
  align-items: center;
  font-size: 0.7rem;
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px solid rgba(131,166,206,0.4);
  background: rgba(131,166,206,0.06);
  width: fit-content;
}
#about .stack-logos .logo-pill { font-size: 0.72rem; }

/* ── KEYBOARD FOCUS RINGS ──
   :focus-visible only triggers on keyboard navigation (Tab/Shift+Tab),
   not on mouse clicks. WCAG 2.4.7 requires a visible focus indicator. */
:focus { outline: none; }
:focus-visible {
  outline: 2px solid #83A6CE;
  outline-offset: 3px;
  border-radius: 4px;
}
.nav-link:focus-visible,
.btn:focus-visible,
.chip:focus-visible,
.contact-chip:focus-visible,
.sb-cta:focus-visible,
.cert-badge:focus-visible,
.win-card:focus-visible,
.skill-mini:focus-visible {
  outline-offset: 2px;
  border-radius: inherit;
}

/* ── SITE FOOTER ──
   Hardcoded "Last updated" date. Bump manually when shipping visible changes. */
.site-footer {
  position: relative; z-index: 2;
  text-align: center;
  padding: 24px 16px 32px;
  font-family: "DM Mono", monospace;
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(244,247,251,0.55);
  border-top: 1px solid rgba(255,255,255,0.04);
  background: #03122F;
}
.site-footer .sep { margin: 0 10px; opacity: 0.5; }

/* ── CONTACT CHIP HIERARCHY ──
   Email is primary (full opacity, brand border).
   LinkedIn / GitHub / Resume are secondary (muted, smaller padding). */
.contact-chip.primary {
  border-color: rgba(131,166,206,0.45);
  background: rgba(131,166,206,0.10);
}
.contact-chip.secondary {
  padding: 11px 16px;
  font-size: 0.92rem;
  font-weight: 500;
  color: rgba(244,247,251,0.72);
  border-color: rgba(255,255,255,0.10);
  background: rgba(255,255,255,0.04);
}
.contact-chip.secondary:hover {
  color: #F4F7FB;
  background: rgba(255,255,255,0.08);
}
.contact-note {
  margin-top: 14px;
  font-family: "DM Mono", monospace;
  font-size: 0.62rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(244,247,251,0.45);
}

/* ── "Book a 30-min call" inner button-box ──
   Box only around the headline text inside the CTA card so the
   click target is obvious. Slow glow draws attention without the
   whole card pulsing. Hover pauses the animation. */
a.avail-cta-box .avail-status {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 10px 18px; margin-top: 4px;
  border-radius: 10px;
  border: 1px solid rgba(110,231,183,0.55);
  background: rgba(110,231,183,0.08);
  width: fit-content;
  animation: avail-cta-glow 4s ease-in-out infinite;
}
@keyframes avail-cta-glow {
  0%, 100% { box-shadow: 0 0 10px rgba(110,231,183,0.18); }
  50%      { box-shadow: 0 0 28px rgba(110,231,183,0.55); }
}
a.avail-cta-box:hover .avail-status {
  animation-play-state: paused;
  border-color: rgba(110,231,183,0.85);
  background: rgba(110,231,183,0.14);
  box-shadow: 0 0 32px rgba(110,231,183,0.5);
}
@media (prefers-reduced-motion: reduce) {
  a.avail-cta-box .avail-status { animation: none; }
}

/* Brand emphasis inside contact paragraphs */
.contact-sub .emp { color: #83A6CE; font-weight: 700; }

/* Earned cert badges are now clickable Credly links */
a.cert-badge {
  text-decoration: none;
  color: inherit;
  cursor: pointer;
  transition: border-color 0.2s, transform 0.2s, background 0.2s;
}
a.cert-badge:hover {
  border-color: rgba(131,166,206,0.55);
  background: rgba(131,166,206,0.10);
  transform: translateY(-1px);
}

/* Neon "Latest Project" button: a single white line draws around the border once,
   glows briefly, slowly dims, then a final echo glow flashes on the button itself. */
.btn-neon {
  position: relative;
  isolation: isolate;
  animation:
    btn-flash 1s ease-out 3.5s 1,
    btn-breathe 3s ease-in-out 5.5s 1;
}
@keyframes btn-flash {
  0%   { box-shadow: 0 0 0 rgba(255, 255, 255, 0); }
  30%  { box-shadow: 0 0 12px rgba(255, 255, 255, 0.42), 0 0 26px rgba(196, 140, 179, 0.3); }
  100% { box-shadow: 0 0 0 rgba(255, 255, 255, 0); }
}
@keyframes btn-breathe {
  0%   { box-shadow: 0 0 0 rgba(255, 255, 255, 0); }
  45%  { box-shadow: 0 0 18px rgba(255, 255, 255, 0.65), 0 0 38px rgba(196, 140, 179, 0.5); }
  100% { box-shadow: 0 0 0 rgba(255, 255, 255, 0); }
}
.btn-neon .neon-svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  overflow: visible;
  z-index: 1;
}
.btn-neon .btn-label {
  position: relative;
  z-index: 2;
}
/* Trail: grows from 0 to full perimeter as the dot travels (3s, slow start).
   Path length ~490 viewBox units; dasharray transitions guarantee a single
   continuous visible segment at every frame, no pathLength normalization.

   ⚠️ KNOWN BUG (unresolved): On real phone widths (Note 9, S10, S25, iPhone),
   this animation still renders TWO visible segments at start instead of one.
   Tested fixes that did NOT resolve it:
     - removed pathLength="100" attribute
     - switched stroke-linecap from round to butt
     - hidden .neon-dot on ≤600px
     - dasharray transition vs dashoffset variants
   Suspected root cause: vector-effect: non-scaling-stroke + preserveAspectRatio="none"
   cause inconsistent dasharray length math on mobile browsers. Revisit later.
   Likely needs a JS-driven approach using path.getTotalLength() or replacement
   with a CSS-only conic-gradient border beam. */
.neon-trail {
  fill: none;
  stroke: #ffffff;
  stroke-width: 1.1;
  stroke-linecap: butt;
  vector-effect: non-scaling-stroke;
  stroke-dasharray: 0 490;
  opacity: 0;
  filter:
    drop-shadow(0 0 1px   rgba(255, 255, 255, 0.8))
    drop-shadow(0 0 2.5px rgba(255, 255, 255, 0.4))
    drop-shadow(0 0 5px   rgba(196, 140, 179, 0.25));
  animation:
    neon-trail-grow 3s 0.5s 1 forwards,
    neon-trail-flash 1s ease-out 3.5s 1 forwards,
    neon-breathe 3s ease-in-out 5.5s 1 forwards;
}
@keyframes neon-trail-flash {
  0%   {
    opacity: 1;
    filter:
      drop-shadow(0 0 1px   rgba(255, 255, 255, 0.8))
      drop-shadow(0 0 2.5px rgba(255, 255, 255, 0.4))
      drop-shadow(0 0 5px   rgba(196, 140, 179, 0.25));
  }
  30%  {
    opacity: 1;
    filter:
      drop-shadow(0 0 2px  rgba(255, 255, 255, 0.5))
      drop-shadow(0 0 6px  rgba(255, 255, 255, 0.45))
      drop-shadow(0 0 12px rgba(196, 140, 179, 0.35));
  }
  100% {
    opacity: 0;
    filter:
      drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.05));
  }
}
@keyframes neon-trail-grow {
  0%   { stroke-dasharray: 0 490;   opacity: 0; animation-timing-function: linear; }
  4%   { stroke-dasharray: 0 490;   opacity: 1; animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); }
  100% { stroke-dasharray: 490 0;   opacity: 1; }
}

/* Dot: small bright droplet that leads the trail around the perimeter.
   Fades out as it returns to the start so it doesn't reappear at the end. */
.neon-dot {
  fill: none;
  stroke: #ffffff;
  stroke-width: 3;
  stroke-linecap: round;
  vector-effect: non-scaling-stroke;
  /* 2-unit beam, 488-unit gap, total 490 = full path length (one beam visible) */
  stroke-dasharray: 2 488;
  stroke-dashoffset: 0;
  opacity: 0;
  filter:
    drop-shadow(0 0 3px  rgba(255, 255, 255, 1))
    drop-shadow(0 0 7px  rgba(255, 255, 255, 0.8))
    drop-shadow(0 0 14px rgba(196, 140, 179, 0.65));
  animation:
    neon-dot-travel 3s 0.5s 1 forwards,
    neon-dot-fade 0.4s ease-out 3.1s 1 forwards;
}
@keyframes neon-dot-travel {
  0%   { stroke-dashoffset: 0;    opacity: 0; animation-timing-function: linear; }
  4%   { stroke-dashoffset: 0;    opacity: 1; animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); }
  100% { stroke-dashoffset: -490; opacity: 1; }
}
@keyframes neon-dot-fade {
  0%   { opacity: 1; }
  100% { opacity: 0; }
}

/* Breathing glow on the trail: starts invisible (default state), swells to bright,
   then fades back out (3s total, slow inhale + slow exhale). */
@keyframes neon-breathe {
  0%   {
    opacity: 0;
    filter:
      drop-shadow(0 0 1px rgba(255, 255, 255, 0.4));
  }
  50%  {
    opacity: 1;
    filter:
      drop-shadow(0 0 3px  rgba(255, 255, 255, 1))
      drop-shadow(0 0 8px  rgba(255, 255, 255, 0.75))
      drop-shadow(0 0 18px rgba(196, 140, 179, 0.55));
  }
  100% {
    opacity: 0;
    filter:
      drop-shadow(0 0 0.5px rgba(255, 255, 255, 0.05));
  }
}
@media (prefers-reduced-motion: reduce) {
  .btn-neon { animation: none; }
  .neon-trail, .neon-dot { animation: none; opacity: 0; }
}
/* Mobile: hide the traveling dot (dasharray rendering on small SVG paths is
   inconsistent across iOS Safari, Chrome Android, and Brave). Trail still draws. */
@media (max-width: 600px) {
  .neon-dot { display: none; }
}
