:root{
  /* Professional enterprise palette */
  --bg: #f6f7f9;
  --bg-alt: #ffffff;
  --text: #111827; /* near-black */
  --muted: #6b7280; /* gray-500 */
  --primary: #0a2540; /* deep navy */
  --primary-600: #081d32;
  --accent: #2e77ff; /* subtle accent for hovers */
  --primary-100: #e8eef7;
  --card: #ffffff;
  --border: #e5e7eb;
  --shadow: 0 10px 30px rgba(16,24,40,0.08);
  /* Glowing gradient presets */
  --grad-cool: conic-gradient(from 0deg, #ff77e9, #8b5cf6, #22d3ee, #ff77e9);
  --grad-warm: conic-gradient(from 180deg, #ff7a59, #ff1f8f, #06b6d4, #ff7a59);
  --glow-size: 50vw;
  --glow-blur: 90px;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
  color: var(--text);
  background: var(--bg);
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  user-select:text;
}
/* Layered animated background glows */
body::before, body::after{
  content:"";
  position:fixed;
  width:var(--glow-size);
  height:var(--glow-size);
  border-radius:50%;
  top:10vh; left:50%;
  transform:translate3d(-50%,0,0);
  filter:blur(var(--glow-blur));
  opacity:.45;
  pointer-events:none;
  z-index:-1;
  will-change:transform, filter, opacity;
}
body::before{
  background: var(--grad-cool);
  mix-blend-mode: screen;
}
body::after{
  background: var(--grad-warm);
  top:auto; bottom:5vh;
  opacity:.35;
  mix-blend-mode: screen;
}
@media (prefers-reduced-motion: no-preference){
  body::before{animation: driftOne 22s ease-in-out infinite, spinSlow 30s linear infinite reverse}
  body::after{animation: driftTwo 28s ease-in-out infinite, spinSlow 24s linear infinite}
}
img{max-width:100%;display:block}

.skip-link{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden}
.skip-link:focus{left:1rem;top:1rem;width:auto;height:auto;padding:.5rem .75rem;background:#000;color:#fff;border-radius:.5rem;z-index:999}

.site-header{position:sticky;top:0;background:var(--card);border-bottom:1px solid var(--border);box-shadow:var(--shadow);z-index:10;backdrop-filter:none;transition:background-color .3s ease, border-color .3s ease, box-shadow .3s ease, backdrop-filter .3s ease}
.site-header.scrolled{
  background: color-mix(in oklab, var(--card) 70%, transparent);
  border-color: color-mix(in oklab, var(--border) 55%, transparent);
  box-shadow: 0 10px 30px rgba(16,24,40,0.10);
  backdrop-filter: blur(12px) saturate(1.15);
}
.nav{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.9rem 1rem;max-width:1200px;margin:0 auto}
.brand{font-weight:800;text-decoration:none;color:var(--primary);letter-spacing:.2px;line-height:1.2}
.nav-toggle{font-size:1.1rem;background:none;border:2px solid var(--border);border-radius:.6rem;padding:.25rem .5rem;color:var(--text)}
.nav-menu{display:flex;gap:.25rem;list-style:none;margin:0;padding:0}
.nav-menu a{color:var(--text);text-decoration:none;padding:.6rem .8rem;border-radius:.5rem}
.nav-menu a:hover,.nav-menu a:focus{background:var(--primary-100);color:var(--primary)}
.nav-menu a.active{background:var(--primary);color:#fff}
.theme-control,.anim-control{display:flex;align-items:center;gap:.5rem}
.anim-label{font-size:.9rem;color:var(--muted)}

@media (max-width: 800px){
  .nav-menu{display:flex;flex-direction:column;gap:.25rem;background:var(--card);border:1px solid var(--border);padding:.5rem;border-radius:.75rem;position:absolute;right:1rem;top:3.25rem;box-shadow:var(--shadow)}
}

.hero{position:relative;overflow:hidden;border-bottom:1px solid var(--border);background:linear-gradient(180deg, var(--card), var(--bg))}
/* Next.js-like gradient beams behind hero */
.hero::before{
  content:"";position:absolute;inset:-20% -10% auto -10%;height:60%;pointer-events:none;z-index:0;
  background: radial-gradient(60% 40% at 20% 30%, color-mix(in oklab, var(--accent) 28%, transparent) 0, transparent 60%),
              radial-gradient(60% 40% at 80% 20%, color-mix(in oklab, var(--primary) 22%, transparent) 0, transparent 60%);
  filter: blur(30px) saturate(1.1);
  opacity:.45;
}
.hero::after{
  content:"";position:absolute;left:-10%;right:-10%;top:0;height:2px;background:linear-gradient(90deg, transparent, rgba(46,119,255,.5), transparent);opacity:.5;animation:gradientPulse 5s ease-in-out infinite;pointer-events:none
}
.hero-inner{position:relative;z-index:1}
.hero-inner{display:grid;grid-template-columns: 260px 1fr;gap:2rem;align-items:center;max-width:1100px;margin:0 auto;padding:2.5rem 1rem}
.hero-photo{border:4px solid var(--card);box-shadow:var(--shadow);border-radius:1rem;background:var(--card)}
.hero-text h1{font-size:clamp(1.8rem, 2.6vw + 1rem, 2.8rem);margin:.25rem 0 .25rem}
.hero-text .role{font-weight:700;color:var(--primary);margin:0 0 .25rem}
.headline{color:var(--muted);margin:.25rem 0 .5rem;font-weight:600}
.summary{margin:.25rem 0 1rem;color:var(--text)}
.tagline{font-size:1.05rem;color:var(--text);margin:.25rem 0 1rem}
.quick-facts{margin:0 0 1rem 1rem}
.quick-facts li{color:var(--text)}
.cta{display:flex;gap:.75rem;margin-top:.5rem;flex-wrap:wrap}
.btn{display:inline-block;padding:.7rem 1rem;border-radius:.6rem;text-decoration:none;font-weight:700;border:1px solid transparent;transition:transform .2s ease, box-shadow .2s ease, background-color .2s ease, color .2s ease}
.btn:hover{transform:translateY(-1px);box-shadow:0 8px 24px rgba(16,24,40,0.12)}
.btn .icon{transition:transform .2s ease}
.btn:hover .icon{transform:translateX(2px)}
.btn.primary{background:var(--primary);color:#fff;border-color:var(--primary)}
.btn.primary:hover{background:var(--primary-600)}
.btn.ghost{border-color:var(--primary);color:var(--primary);background:transparent}
.btn.ghost:hover{background:var(--primary-100)}
.btn.outline{background:transparent;border-color:var(--border);color:var(--primary)}
.btn.outline:hover{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-100)}

.section{padding:3rem 1rem}
.section.alt{background:var(--bg-alt)}
.container{max-width:1200px;margin:0 auto}

h1{font-size:clamp(1.8rem, 2.6vw + 1rem, 3rem);margin:0 0 .75rem;letter-spacing:.2px}
h2{font-size:clamp(1.5rem, 1.8vw + .6rem, 2.1rem);margin:0 0 1rem}
.muted{color:var(--muted)}
.note{color:#18324d;background:#eef5fd;border-left:4px solid var(--primary);padding:.5rem .75rem;border-radius:.5rem}

.timeline{list-style:none;padding:0;margin:0;display:grid;gap:1.25rem}
.timeline li{display:grid;grid-template-columns:24px 1fr;gap:1rem;align-items:start}
.timeline .dot{width:12px;height:12px;border-radius:50%;margin-top:.45rem;background:var(--primary);box-shadow:0 0 0 6px rgba(11,92,171,.12)}
.timeline .content{background:var(--card);border:1px solid var(--border);border-radius:.75rem;box-shadow:var(--shadow);padding:1rem}

.card{background:var(--card);border:1px solid var(--border);border-radius:.75rem;box-shadow:var(--shadow);padding:1rem;margin:.9rem 0;transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;will-change:transform}
.card:hover{transform:translateY(-4px);box-shadow:0 16px 40px rgba(16,24,40,0.14);border-color:color-mix(in oklab, var(--border) 40%, var(--accent) 20%)}

.grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:1rem;align-items:stretch}
.cards{display:grid;gap:1rem;align-items:stretch}
.cards.four{grid-template-columns:repeat(4,1fr)}
@media (max-width: 1100px){.cards.four{grid-template-columns:repeat(3,1fr)}}
@media (max-width: 800px){.cards.four{grid-template-columns:repeat(2,1fr)}}
@media (max-width: 520px){.cards.four{grid-template-columns:1fr}}
.grid.two{grid-template-columns:1fr 1fr}
.project{background:var(--card);border:1px solid var(--border);border-radius:.75rem;box-shadow:var(--shadow);padding:1rem;border-top:4px solid var(--primary);display:flex;flex-direction:column;height:100%}
.tags{display:flex;gap:.5rem;list-style:none;padding:0;margin:.5rem 0 0}
.tags li{background:#f4f7fb;border:1px solid var(--border);border-radius:999px;padding:.25rem .6rem;font-size:.85rem;color:#0a2e57}
.link{color:var(--primary);text-decoration:none}
.link:hover{text-decoration:underline}
/* Animated underline for any .link-like text */
.link, .nav-menu a{
  background-image: linear-gradient(currentColor, currentColor);
  background-size: 0% 2px;
  background-repeat: no-repeat;
  background-position: 0 100%;
  transition: background-size .25s ease;
}
.link:hover, .nav-menu a:hover{background-size: 100% 2px}

.skill-list{display:grid;grid-template-columns:1fr 1fr;gap:1rem}
.skill-list li{margin:.25rem 0}

.cert-list{columns:2;gap:2rem}
.cert-list li{break-inside:avoid;margin:.25rem 0}

.contact-cards{display:flex;flex-wrap:wrap;gap:.75rem;margin:1rem 0}
.contact-card{display:inline-block;padding:.6rem .8rem;border:1px solid var(--border);border-radius:.6rem;background:var(--card);color:var(--text);text-decoration:none}
.contact-card:hover{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-100)}

.site-footer{padding:2rem 1rem;border-top:1px solid var(--border);color:var(--muted);background:var(--card)}
.footer-grid{display:grid;grid-template-columns:2fr 2fr 1fr;gap:1.25rem;align-items:start}
.footer-col .brandline{font-weight:800;color:var(--primary);margin:0}
.footer-col .tag{margin:.25rem 0 0;color:var(--muted)}
.footer-col .label{font-weight:700;color:var(--text);margin:0 0 .25rem}
.footer-nav{display:flex;flex-direction:column;gap:.4rem}
.footer-bottom{margin-top:1rem;padding-top:1rem;border-top:1px dashed var(--border);text-align:center}
@media (max-width: 800px){
  .footer-grid{grid-template-columns:1fr}
  .footer-nav{flex-direction:row;flex-wrap:wrap;gap:.75rem}
}

/* Media alignment for embeds inside project cards */
.video-embed iframe{width:100%;height:auto;aspect-ratio:16/9;border:0;border-radius:.5rem}
.link-embed .project-link{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border:1px solid var(--border);border-radius:.5rem;text-decoration:none;color:var(--primary)}
.link-embed .project-link:hover{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-100)}

/* Responsive tweaks */
@media (max-width: 900px){
  .hero-inner{grid-template-columns:1fr;}
  .hero-photo{max-width:320px}
}


/* ===== Motion & Animation System (CSS-only, lightweight) ===== */
@keyframes fadeIn{
  from{opacity:0;transform:translateY(6px)}
  to{opacity:1;transform:translateY(0)}
}
@keyframes riseUp{
  from{opacity:0;transform:translateY(14px)}
  to{opacity:1;transform:translateY(0)}
}
@keyframes scaleIn{
  0%{opacity:0;transform:translate3d(0,8px,0) scale(.8)}
  100%{opacity:1;transform:translate3d(0,0,0) scale(1)}
}
@keyframes blurIn{
  0%{opacity:0;filter:blur(8px);transform:translate3d(0,10px,0)}
  100%{opacity:1;filter:blur(0);transform:translate3d(0,0,0)}
}
@keyframes floatIn{
  0%{opacity:0;transform:translate3d(0,18px,0) scale(.98)}
  60%{opacity:1}
  100%{opacity:1;transform:translate3d(0,0,0) scale(1)}
}
@keyframes gradientPulse{
  0%{opacity:.0;transform:translateX(-10%)}
  50%{opacity:.35}
  100%{opacity:.0;transform:translateX(110%)}
}
@keyframes pulseLine{
  0%{stroke-dashoffset:180}
  100%{stroke-dashoffset:0}
}
@keyframes shimmer{
  0%{background-position:-200% 0}
  100%{background-position:200% 0}
}
@keyframes spinSlow{to{transform:translate3d(-50%,0,0) rotate(1turn)}}
@keyframes driftOne{
  0%{transform:translate3d(-50%, -3vh, 0)}
  50%{transform:translate3d(-40%, 2vh, 0)}
  100%{transform:translate3d(-50%, -3vh, 0)}
}
@keyframes driftTwo{
  0%{transform:translate3d(-50%, 3vh, 0)}
  50%{transform:translate3d(-60%, -2vh, 0)}
  100%{transform:translate3d(-50%, 3vh, 0)}
}
@keyframes gradientTextShift{
  0%{background-position:0% 50%}
  50%{background-position:100% 50%}
  100%{background-position:0% 50%}
}

/* Utility classes applied in markup */
/* Elements are initially subtle and reveal when in-view (set by script) */
.anim-fade-in{opacity:0;transform:translateY(6px)}
.anim-fade-in.in-view{animation:fadeIn .7s cubic-bezier(.2,.6,.2,1) both}
.anim-rise{opacity:0;transform:translateY(14px)}
.anim-rise.in-view{animation:riseUp .8s cubic-bezier(.2,.7,.2,1) both}

/* New animation variants */
.anim-scale-in{opacity:0;transform:scale(.8)}
.anim-scale-in.in-view{animation:scaleIn .8s cubic-bezier(.2,.7,.2,1) both}
.anim-blur-in{opacity:0;filter:blur(8px)}
.anim-blur-in.in-view{animation:blurIn .9s cubic-bezier(.2,.7,.2,1) both}

/* Staggered reveal utility */
.anim-stagger > *, .stagger > *{
  opacity:0; transform:translate3d(0,10px,0);
}
.anim-stagger.in-view > *, .stagger.in-view > *{opacity:1; transform:none}
.anim-stagger > *:not(.in-view), .stagger > *:not(.in-view){opacity:0}
.stagger > *.in-view{animation:riseUp .7s cubic-bezier(.2,.7,.2,1) both}
.stagger{--delay-step:80ms}
.stagger > *:nth-child(1){animation-delay:calc(0 * var(--delay-step))}
.stagger > *:nth-child(2){animation-delay:calc(1 * var(--delay-step))}
.stagger > *:nth-child(3){animation-delay:calc(2 * var(--delay-step))}
.stagger > *:nth-child(4){animation-delay:calc(3 * var(--delay-step))}
.stagger > *:nth-child(5){animation-delay:calc(4 * var(--delay-step))}
.stagger > *:nth-child(6){animation-delay:calc(5 * var(--delay-step))}
.stagger > *:nth-child(7){animation-delay:calc(6 * var(--delay-step))}
.stagger > *:nth-child(8){animation-delay:calc(7 * var(--delay-step))}
.stagger > *:nth-child(9){animation-delay:calc(8 * var(--delay-step))}

/* React cards use inline style animation: floatIn */
.card.compact{will-change:transform,opacity}

/* Decorative motion layers on sections and cards */
.section{position:relative;overflow:hidden}
.section::before{
  content:"";position:absolute;inset:auto -20%;top:-1px;height:2px;pointer-events:none;
  background:linear-gradient(90deg, transparent, rgba(46,119,255,.7), transparent);
  filter:blur(.3px);opacity:.35;animation:gradientPulse 3.2s ease-in-out infinite;
}
.section::after{
  content:"";position:absolute;inset:auto 0 0 0;height:1px;pointer-events:none;background:linear-gradient(90deg, transparent, rgba(10,37,64,.25), transparent);
}
.card{position:relative;overflow:hidden}
.card::before{
  /* thin pulsing line framing content */
  content:"";position:absolute;left:-10%;right:-10%;top:0;height:1px;background:linear-gradient(90deg,transparent,rgba(46,119,255,.5),transparent);opacity:.2;animation:gradientPulse 4.2s ease-in-out infinite;pointer-events:none;
}
.card::after{
  /* subtle stacked placeholder bars to hint streaming updates */
  content:"";position:absolute;left:1rem;right:1rem;top:.85rem;height:40%;
  background:linear-gradient(90deg, rgba(0,0,0,0.04) 25%, rgba(0,0,0,0.08) 37%, rgba(0,0,0,0.04) 63%);
  background-size:200% 100%;opacity:.10;border-radius:.5rem;animation:shimmer 2.6s linear infinite;
  mask:linear-gradient(#000 0 18%, transparent 18% 28%, #000 28% 46%, transparent 46% 54%, #000 54% 70%, transparent 70% 78%, #000 78% 100%);
  pointer-events:none;
}
.card:hover::before{opacity:.35}

/* Interactive glow effects for buttons and cards */
.btn, .card{isolation:isolate}
.btn::before, .card::before{will-change:transform, opacity}
.btn::after{
  content:""; position:absolute; inset:-2px; border-radius:inherit; pointer-events:none; z-index:-1;
  background: var(--grad-cool);
  opacity:0; filter:blur(8px);
  mix-blend-mode:screen; transform:translate3d(0,0,0);
}
@media (prefers-reduced-motion: no-preference){
  .btn::after{animation: spinSlow 20s linear infinite}
}
.btn:hover{transform:scale(1.03)}
.btn:hover::after{opacity:.6}

.card{
  transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.card::selection{background:transparent}
.card .glow-border{pointer-events:none}
.card::before{z-index:2}
.card::after{z-index:1}
.card::marker{content:""}
.card::selection{color:inherit}
.card:hover{transform:translateY(-4px) scale(1.02)}
.card::part(glow){contain:paint}

/* ===== Powered By neon connection lines ===== */
.powered{padding:4rem 0 2rem;background:linear-gradient(180deg, color-mix(in oklab, var(--bg) 92%, transparent), var(--bg));}
.powered-wrap{position:relative;max-width:1200px;margin:0 auto;padding:2rem 1rem 0}
.pb-chip{
  position:absolute;left:50%;top:0;transform:translate(-50%,-50%);
  background:color-mix(in oklab, var(--card) 86%, transparent);
  color:var(--text);border:1px solid var(--border);box-shadow:var(--shadow);
  border-radius:.75rem;padding:.5rem 1rem;font-weight:800;font-size:.95rem;
}
.pb-diagram{position:absolute;inset:0 0 auto 0;height:260px;width:100%;z-index:0;pointer-events:none}
.pb-line path{fill:none}
/* Base line styling */
.pb-line .halo{stroke-width:1.6;opacity:.6;filter:url(#pb-glow)}
.pb-line .core{stroke-width:1.6;opacity:.98;stroke-linecap:round;stroke-linejoin:round}

/* Traveling glow "spark" that moves along the path */
.pb-line .spark{
  stroke-width:3;
  stroke:#fff;
  filter:url(#pb-glow);
  opacity:.85;
  stroke-linecap:round;
  mix-blend-mode:screen;
}

/* Progressive draw setup using normalized pathLength=1000 */
.pb-line .core,
.pb-line .halo,
.pb-line .spark{
  stroke-dasharray:1000;
  stroke-dashoffset:1000;
  opacity:0;
}

/* Keyframes for draw/fade and spark travel */
@keyframes pb-draw-segment{from{stroke-dashoffset:1000} to{stroke-dashoffset:0}}
@keyframes pb-fade-in{from{opacity:0} to{opacity:1}}
@keyframes pb-fade-out{from{opacity:1} to{opacity:0}}
@keyframes pb-spark-travel{from{stroke-dashoffset:1000; opacity:0} 5%{opacity:.9} 90%{opacity:.9} to{stroke-dashoffset:0; opacity:0}}

/* Colors (exact associations) */
.pb-line--react .core{stroke:#22d3ee}
.pb-line--react .halo{stroke:#22d3ee}

.pb-line--tp .core{stroke:#ff38b4}
.pb-line--tp .halo{stroke:#ff38b4}

.pb-line--swc .core{stroke:#f59e0b}
.pb-line--swc .halo{stroke:#f59e0b}

/*
  Sequenced appearance pattern (approx. 6s cycle):
  - React (cyan) draws first then fades out.
  - Turbopack (magenta) draws after React and remains visible longer.
  - SWC (orange) appears later and remains visible to the end of the cycle.
*/
:root{ --pb-cycle: 6s }

/* React (cyan) — start at 0s, draw fast, fade by ~40% */
.pb-line--react .halo,
.pb-line--react .core{
  animation:
    pb-fade-in calc(var(--pb-cycle) * .05) ease forwards 0s,
    pb-draw-segment calc(var(--pb-cycle) * .20) ease forwards 0s,
    pb-fade-out calc(var(--pb-cycle) * .12) ease forwards calc(var(--pb-cycle) * .28);
}
.pb-line--react .spark{
  /* Short bright traveler while drawing */
  stroke-dasharray:120 880;
  animation: pb-spark-travel calc(var(--pb-cycle) * .20) ease forwards 0s;
}

/* Turbopack (magenta) — start later, stay visible */
.pb-line--tp .halo,
.pb-line--tp .core{
  animation:
    pb-fade-in calc(var(--pb-cycle) * .06) ease forwards calc(var(--pb-cycle) * .12),
    pb-draw-segment calc(var(--pb-cycle) * .22) ease forwards calc(var(--pb-cycle) * .12);
}
.pb-line--tp .spark{
  stroke-dasharray:130 870;
  animation: pb-spark-travel calc(var(--pb-cycle) * .22) ease forwards calc(var(--pb-cycle) * .12);
}

/* SWC (orange) — appears latest and remains visible */
.pb-line--swc .halo,
.pb-line--swc .core{
  animation:
    pb-fade-in calc(var(--pb-cycle) * .06) ease forwards calc(var(--pb-cycle) * .46),
    pb-draw-segment calc(var(--pb-cycle) * .20) ease forwards calc(var(--pb-cycle) * .46);
}
.pb-line--swc .spark{
  stroke-dasharray:120 880;
  animation: pb-spark-travel calc(var(--pb-cycle) * .20) ease forwards calc(var(--pb-cycle) * .46);
}

/* Cards row */
.pb-cards{position:relative;z-index:1;display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-top:170px}
.pb-card{background:var(--card);border:1px solid var(--border);border-radius:.9rem;box-shadow:var(--shadow);padding:1rem;min-height:140px;display:flex;flex-direction:column;gap:.35rem}
.pb-card h3{margin:.25rem 0 .25rem}
.pb-icon{font-size:1.4rem;opacity:.85}

@media (max-width: 900px){
  .pb-diagram{height:220px}
  .pb-cards{grid-template-columns:1fr;gap:.9rem;margin-top:140px}
}

@media (prefers-reduced-motion: reduce){
  .pb-line .core, .pb-line .halo, .pb-line .spark{animation:none;stroke-dasharray:none;opacity:1}
}
.card::backdrop{background:transparent}
.card::view-transition-old(*), .card::view-transition-new(*){isolation:auto}
.card::marker{content:""}
.card::file-selector-button{mix-blend-mode:normal}
.card::before{background:linear-gradient(90deg,transparent,rgba(46,119,255,.5),transparent)}
.card::after{mask: none}
.card:hover::after{opacity:.12}

/* Gradient text utility */
.text-gradient{
  background: linear-gradient(90deg, #ff77e9, #8b5cf6, #22d3ee, #ff77e9);
  background-size: 200% 200%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
@media (prefers-reduced-motion: no-preference){
  .text-gradient{animation: gradientTextShift 16s ease-in-out infinite}
}

/* Staggered reveals for grid children to mimic Next.js cascade */
.grid > *:where(.anim-rise,.anim-fade-in){
  --delay-step: 80ms;
}
.grid > *:nth-child(1){animation-delay:calc(0 * var(--delay-step))}
.grid > *:nth-child(2){animation-delay:calc(1 * var(--delay-step))}
.grid > *:nth-child(3){animation-delay:calc(2 * var(--delay-step))}
.grid > *:nth-child(4){animation-delay:calc(3 * var(--delay-step))}
.grid > *:nth-child(5){animation-delay:calc(4 * var(--delay-step))}
.grid > *:nth-child(6){animation-delay:calc(5 * var(--delay-step))}
.grid > *:nth-child(7){animation-delay:calc(6 * var(--delay-step))}
.grid > *:nth-child(8){animation-delay:calc(7 * var(--delay-step))}
.grid > *:nth-child(9){animation-delay:calc(8 * var(--delay-step))}

/* Make motion more visible when forced */
html[data-anim="force"] .section::before{opacity:.55}
html[data-anim="force"] .card::after{opacity:.18}

/* Avatar/photo subtle activity */
.hero-photo img{transition:filter .8s ease, transform .8s ease}
.hero:hover .hero-photo img{filter:saturate(1.05) brightness(1.02)}

/* Avatar and navigation dim/bright cycle to illustrate resolving data */
@keyframes glowCycle{
  0%{filter:brightness(.98)}
  50%{filter:brightness(1.06)}
  100%{filter:brightness(.98)}
}
.hero .hero-photo{animation:glowCycle 6s ease-in-out infinite}
.nav-menu a{transition:color .3s ease, background-color .3s ease}
.nav-menu a.active, .nav-menu a:hover{animation:none}
.nav-menu::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:2px;pointer-events:none;
  background:linear-gradient(90deg, transparent, rgba(46,119,255,.5), transparent);
  animation:gradientPulse 5s ease-in-out infinite;
}

/* Respect reduced-motion preference */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important}
  /* Keep content visible if motion reduced */
  .anim-fade-in, .anim-rise, .anim-scale-in, .anim-blur-in{opacity:1 !important; transform:none !important; filter:none !important}
  .anim-stagger > *, .stagger > *{opacity:1 !important; transform:none !important}
  body::before, body::after{animation:none !important}
}

/* Force animations ON regardless of OS setting when data-anim="force" is set on <html> */
html[data-anim="force"] *,
html[data-anim="force"] *::before,
html[data-anim="force"] *::after{animation-duration:initial !important; animation-iteration-count:initial !important; transition-duration:initial !important}
/* Restore initial states so entrance animations can play, but never hide elements already revealed */
html[data-anim="force"] .anim-fade-in:not(.in-view){opacity:0; transform:translateY(6px)}
html[data-anim="force"] .anim-rise:not(.in-view){opacity:0; transform:translateY(14px)}
@media (max-width: 800px){
  .grid{grid-template-columns:1fr 1fr}
  .cert-list{columns:1}
}

/* Smooth scrolling like Next.js docs/marketing */
@media (prefers-reduced-motion: no-preference){
  html{scroll-behavior:smooth}
}
@media (max-width: 520px){
  .grid{grid-template-columns:1fr}
  .skill-list{grid-template-columns:1fr}
}


/* Responsive YouTube embeds */
.video-embed{position:relative;width:100%;aspect-ratio:16/9;background:#000;border-radius:.6rem;overflow:hidden;box-shadow:var(--shadow);margin-top:.75rem}
.video-embed iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

/* External project link preview (no black box) */
.link-embed{position:relative;width:100%;border-radius:.6rem;overflow:hidden;box-shadow:var(--shadow);margin-top:.75rem;border:1px solid var(--border);background:linear-gradient(180deg, #ffffff, #f8fafc)}
.link-embed .project-link{
  display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.9rem 1rem;text-decoration:none;color:var(--primary);
}
.link-embed .project-link:hover{background:var(--primary-100)}
.link-embed .project-link .label{font-weight:700}
.link-embed .project-link .hint{color:var(--muted);font-size:.9rem}
.link-embed .project-link .arrow{margin-left:auto;color:var(--primary)}

/* Subtle motion & entrance animations */
@media (prefers-reduced-motion: no-preference){
  .anim-fade-in{animation:fadeIn .6s ease-out both}
  .anim-rise{animation:rise .6s ease-out both}
}

@keyframes fadeIn{
  from{opacity:0}
  to{opacity:1}
}
@keyframes rise{
  from{opacity:0; transform:translateY(14px)}
  to{opacity:1; transform:translateY(0)}
}

/* Theme variants */
:root{
  /* Existing variables define the Light theme */
}

/* Explicit Light theme (overrides system preference when selected) */
:root[data-theme='light']{
  --bg: #f6f7f9;
  --bg-alt: #ffffff;
  --text: #111827;
  --muted: #6b7280;
  --primary: #0a2540;
  --primary-600: #081d32;
  --accent: #2e77ff;
  --primary-100: #e8eef7;
  --card: #ffffff;
  --border: #e5e7eb;
  --shadow: 0 10px 30px rgba(16,24,40,0.08);
}

/* Dark theme */
:root[data-theme='dark']{
  --bg: #0b1220;
  --bg-alt: #0f172a;
  --text: #e5e7eb;
  --muted: #9aa3b2;
  --primary: #5ea1ff;
  --primary-600: #3c7ae6;
  --accent: #8ab6ff;
  --primary-100: #12223d;
  --card: #0f172a;
  --border: #1f2a44;
  --shadow: 0 12px 30px rgba(0,0,0,0.45);
}

/* Color‑blind friendly high‑contrast theme (blue/orange, avoids red/green reliance) */
:root[data-theme='cb']{
  --bg: #ffffff;
  --bg-alt: #f7f7f7;
  --text: #111111;
  --muted: #4b5563;
  --primary: #004e98; /* deep blue */
  --primary-600: #003c75;
  --accent: #f28f3b; /* orange accent */
  --primary-100: #e6f0fb;
  --card: #ffffff;
  --border: #d1d5db;
  --shadow: 0 10px 28px rgba(17,24,39,0.10);
}

/* Prefer system dark when no explicit choice (script sets data-theme when chosen) */
@media (prefers-color-scheme: dark){
  :root:not([data-theme]){
    --bg: #0b1220;
    --bg-alt: #0f172a;
    --text: #e5e7eb;
    --muted: #9aa3b2;
    --primary: #5ea1ff;
    --primary-600: #3c7ae6;
    --accent: #8ab6ff;
    --primary-100: #12223d;
    --card: #0f172a;
    --border: #1f2a44;
    --shadow: 0 12px 30px rgba(0,0,0,0.45);
  }
}

/* Theme control */
.theme-control{margin-left:auto;display:flex;align-items:center;gap:.5rem}
.theme-select{appearance:none;padding:.45rem .65rem;border:1px solid var(--border);border-radius:.5rem;background:var(--card);color:var(--text);box-shadow:var(--shadow);min-width:8.5rem}
.theme-select:focus{outline:3px solid var(--primary-100);border-color:var(--primary)}

/* Accessibility helpers */
.visually-hidden{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}

/* Project video alignment helpers */
.project .video-embed{margin-top:auto}


/* Standardize project text line counts for alignment */
.project h3{
  line-height:1.3;
  display:-webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; /* show exactly two lines */
  overflow:hidden;
  min-height: calc(1.3em * 2); /* reserve space so all titles align */
}
.project p{
  line-height:1.6;
  display:-webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; /* show exactly three lines */
  overflow:hidden;
  min-height: calc(1.6em * 3); /* equalize description height across cards */
}


/* Theme selector fix: correct :root selectors to ensure theme works on all pages */
:root{
  --bg: #f6f7f9;
  --bg-alt: #ffffff;
  --text: #111827;
  --muted: #6b7280;
  --primary: #0a2540;
  --primary-600: #081d32;
  --accent: #2e77ff;
  --primary-100: #e8eef7;
  --card: #ffffff;
  --border: #e5e7eb;
  --shadow: 0 10px 30px rgba(16,24,40,0.08);
}

:root[data-theme='light']{
  --bg: #f6f7f9;
  --bg-alt: #ffffff;
  --text: #111827;
  --muted: #6b7280;
  --primary: #0a2540;
  --primary-600: #081d32;
  --accent: #2e77ff;
  --primary-100: #e8eef7;
  --card: #ffffff;
  --border: #e5e7eb;
  --shadow: 0 10px 30px rgba(16,24,40,0.08);
}

:root[data-theme='dark']{
  --bg: #0b1220;
  --bg-alt: #0f172a;
  --text: #e5e7eb;
  --muted: #9aa3b2;
  --primary: #5ea1ff;
  --primary-600: #3c7ae6;
  --accent: #8ab6ff;
  --primary-100: #12223d;
  --card: #0f172a;
  --border: #1f2a44;
  --shadow: 0 12px 30px rgba(0,0,0,0.45);
}

:root[data-theme='cb']{
  --bg: #ffffff;
  --bg-alt: #f7f7f7;
  --text: #111111;
  --muted: #4b5563;
  --primary: #004e98;
  --primary-600: #003c75;
  --accent: #f28f3b;
  --primary-100: #e6f0fb;
  --card: #ffffff;
  --border: #d1d5db;
  --shadow: 0 10px 28px rgba(17,24,39,0.10);
}
