
:root{--ink:#10203c;--muted:#61708a;--line:#e5eaf2;--brand:#2764ff;--brand2:#7a5cff;--cyan:#24b6e8;--soft:#f6f9ff;--soft2:#fff8f2;--card:#fff;--shadow:0 18px 55px rgba(32,63,120,.11);--radius:26px}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--ink);background:#fff;line-height:1.6}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}.container{width:min(1180px,calc(100% - 40px));margin:auto}.topbar{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.9);backdrop-filter:blur(18px);border-bottom:1px solid rgba(229,234,242,.8)}.nav{height:76px;display:flex;align-items:center;justify-content:space-between;gap:28px}.brand{display:flex;align-items:center;gap:10px;font-weight:900;letter-spacing:-.04em;font-size:23px}.brand-logo{width:34px;height:34px;object-fit:contain;border-radius:9px;flex:0 0 34px}.brand-word{display:inline-flex;align-items:baseline;gap:0;color:var(--ink);white-space:nowrap}.brand-dot{color:var(--brand);margin-left:0}.navlinks{display:flex;align-items:center;gap:25px;font-size:14px;font-weight:700;color:#46536d}.navlinks a:hover{color:var(--brand)}.lang{display:flex}.lang a{border:1px solid var(--line);border-radius:12px;display:inline-flex;align-items:center;gap:7px;background:#fff;padding:8px 11px;font-weight:750;font-size:14px;line-height:1;transition:.2s ease}.lang a:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(24,45,90,.08)}.lang img{width:23px;height:23px;border-radius:50%;object-fit:cover;box-shadow:0 0 0 1px rgba(16,33,63,.10)}.hero{position:relative;overflow:hidden;padding:92px 0 78px;background:linear-gradient(135deg,#fff 0%,#f6f9ff 55%,#fff8f2 100%)}.hero:before{content:"";position:absolute;width:520px;height:520px;border-radius:50%;background:radial-gradient(circle,rgba(39,100,255,.15),rgba(39,100,255,0) 68%);right:-150px;top:-160px}.hero:after{content:"";position:absolute;width:380px;height:380px;border-radius:50%;background:radial-gradient(circle,rgba(122,92,255,.12),rgba(122,92,255,0) 68%);left:-160px;bottom:-200px}.hero-grid{position:relative;z-index:1;display:grid;grid-template-columns:1.2fr .8fr;align-items:center;gap:72px}.eyebrow{display:inline-flex;align-items:center;gap:10px;padding:9px 13px;border-radius:999px;background:#fff;border:1px solid #dce5ff;box-shadow:0 8px 25px rgba(39,100,255,.08);font-size:13px;font-weight:800;color:#3159b6}.dot{width:8px;height:8px;background:#31bf76;border-radius:50%;box-shadow:0 0 0 5px rgba(49,191,118,.12)}h1{font-size:clamp(48px,6.2vw,82px);line-height:1.02;letter-spacing:-.055em;margin:22px 0 22px}.gradient{background:linear-gradient(90deg,var(--brand),var(--brand2));-webkit-background-clip:text;background-clip:text;color:transparent}.gradient-word{display:inline-block;padding-right:.065em}.lead{font-size:20px;color:var(--muted);max-width:760px;margin:0}.hero-actions{display:flex;gap:13px;flex-wrap:wrap;margin-top:32px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;padding:14px 20px;border-radius:14px;font-weight:800;font-size:14px;border:1px solid transparent;transition:.2s}.btn-primary{background:linear-gradient(90deg,var(--brand),#4d7dff);color:white;box-shadow:0 12px 28px rgba(39,100,255,.24)}.btn-primary:hover{transform:translateY(-2px)}.btn-secondary{background:#fff;border-color:#dbe3ef}.btn-secondary:hover{border-color:#9fb7ff;color:var(--brand)}.quick{display:flex;gap:22px;flex-wrap:wrap;margin-top:36px;color:#55647f;font-weight:700;font-size:13px}.quick span{display:flex;align-items:center;gap:8px}.portrait-wrap{position:relative;min-height:470px;display:grid;place-items:center}.portrait-card{width:360px;height:420px;border-radius:38px;background:#fff;padding:18px;box-shadow:var(--shadow);transform:rotate(2.5deg);position:relative}.portrait-card:before{content:"";position:absolute;inset:-14px 20px 18px -20px;border-radius:42px;background:linear-gradient(145deg,#dfe9ff,#fff0e4);z-index:-1;transform:rotate(-5deg)}.portrait-card img{width:100%;height:100%;object-fit:cover;border-radius:28px;background:linear-gradient(145deg,#e7efff 0%,#f1ebff 52%,#fff1e6 100%)}.floating{position:absolute;background:#fff;border:1px solid #e7ebf4;border-radius:18px;padding:13px 16px;box-shadow:0 14px 35px rgba(42,64,105,.13);font-weight:800;font-size:13px}.floating.one{left:5px;top:70px}.floating.two{right:-6px;bottom:74px}.floating strong{color:var(--brand)}section{padding:92px 0}.section-kicker{font-size:13px;font-weight:900;text-transform:uppercase;letter-spacing:.14em;color:var(--brand)}.section-head{display:flex;justify-content:space-between;align-items:end;gap:30px;margin-bottom:42px}.section-head h2{font-size:clamp(36px,4.5vw,55px);line-height:1.06;letter-spacing:-.04em;margin:8px 0 0}.section-head p{max-width:520px;color:var(--muted);margin:0}.about-grid{display:grid;grid-template-columns:.85fr 1.15fr;gap:54px;align-items:start}.about-card{background:linear-gradient(145deg,#f4f8ff,#fff);border:1px solid #e3eaff;border-radius:var(--radius);padding:32px}.about-card h3{font-size:28px;letter-spacing:-.03em;margin:0 0 13px}.about-role-title span{display:block}.about-role-title .about-role-specialty{margin-left:.75em;margin-top:.12em}.about-card p{color:var(--muted)}.stats{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin-top:24px}.stat{background:#fff;border:1px solid var(--line);border-radius:18px;padding:18px}.stat b{font-size:26px;display:block}.stat span{font-size:12px;color:var(--muted);font-weight:700}.stat small{display:block;margin-top:5px;font-size:10px;line-height:1.35;color:#7b879c;font-weight:700}.timeline{display:grid;gap:15px}.exp{display:grid;grid-template-columns:130px 1fr;gap:24px;padding:24px;border:1px solid var(--line);border-radius:21px;background:#fff;transition:.2s}.exp:hover{box-shadow:0 14px 35px rgba(43,69,118,.09);transform:translateY(-2px);border-color:#cfdcff}.exp .date{font-weight:900;color:var(--brand);font-size:13px}.exp-side{display:flex;flex-direction:column;align-items:flex-start;gap:14px}.exp-logo{width:78px;height:78px;border-radius:50%;display:grid;place-items:center;overflow:hidden;background:linear-gradient(145deg,#f7faff,#fff8f4);border:1px solid #dfe7f5;box-shadow:0 10px 24px rgba(39,100,255,.10)}.exp-logo img{width:100%;height:100%;object-fit:contain;border-radius:50%;background:#fff}.exp h3{margin:0;font-size:20px}.exp h4{margin:3px 0 9px;color:#5b6981;font-size:14px}.exp p{margin:0;color:var(--muted);font-size:14px}.exp-list{margin:0;padding-left:18px;color:var(--muted);font-size:14px;display:grid;gap:7px}.exp-list li::marker{color:var(--brand)}.exp-tech{margin-top:12px;font-size:12.5px;color:#52627c;background:#f7f9ff;border:1px solid #e7ecf7;border-radius:10px;padding:8px 10px;display:inline-block}.exp-tech strong{color:#334766}.tech-section{background:linear-gradient(180deg,#f8fbff,#fff)}.tech-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:12px}.tech{min-height:116px;background:#fff;border:1px solid var(--line);border-radius:19px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;padding:14px;box-shadow:0 7px 20px rgba(33,55,95,.045);transition:.18s}.tech:hover{transform:translateY(-5px);box-shadow:0 16px 28px rgba(40,70,125,.11);border-color:#cdd9fb}.tech img{height:43px;width:58px;object-fit:contain}.tech span{font-size:11.5px;font-weight:800;color:#4e5b74;text-align:center}.projects{background:#fff}.project-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}.project{border:1px solid var(--line);border-radius:27px;overflow:hidden;background:#fff;box-shadow:0 11px 33px rgba(29,50,91,.065);transition:.2s}.project:hover{transform:translateY(-5px);box-shadow:0 22px 50px rgba(29,50,91,.12)}.project-media{height:270px;background:#f4f6fb;display:grid;place-items:center;overflow:hidden;padding:18px}.project-media img{width:100%;height:100%;object-fit:contain;border-radius:16px}.project-body{padding:25px}.project-num{font-size:12px;font-weight:900;color:var(--brand);letter-spacing:.12em}.project h3{font-size:24px;line-height:1.15;letter-spacing:-.025em;margin:9px 0}.project p{color:var(--muted);font-size:14px;margin:0}.tags{display:flex;flex-wrap:wrap;gap:8px;margin:19px 0}.tag{padding:6px 9px;border-radius:999px;background:#f1f5ff;color:#3159b6;font-size:11px;font-weight:800}.project-link{display:inline-flex;align-items:center;gap:7px;font-weight:900;font-size:13px;color:var(--brand)}.video-section{background:linear-gradient(135deg,#f7faff,#fff8f3)}.video-grid{display:grid;grid-template-columns:1fr 1fr;gap:25px}.video-card{background:#fff;border:1px solid var(--line);border-radius:25px;padding:18px;box-shadow:0 14px 38px rgba(30,53,95,.07)}.video-frame{aspect-ratio:16/9;border:0;width:100%;border-radius:17px}.video-card h3{margin:16px 3px 3px;font-size:19px}.video-card p{margin:0 3px;color:var(--muted);font-size:13px}.contact{padding-bottom:70px}.contact-panel{border-radius:32px;padding:48px;background:linear-gradient(135deg,#edf4ff,#fff6ee);border:1px solid #e1e8f6;display:grid;grid-template-columns:1.2fr .8fr;gap:30px;align-items:center}.contact-panel h2{font-size:45px;line-height:1.05;letter-spacing:-.04em;margin:0 0 14px}.contact-panel p{color:var(--muted);margin:0}.contact-actions{display:grid;gap:10px}.social{background:#fff;border:1px solid #e0e6f1;border-radius:15px;padding:14px 16px;font-weight:800;display:flex;align-items:center;gap:11px}.social img{width:25px;height:25px;object-fit:contain}.footer{padding:26px 0 40px;border-top:1px solid var(--line);color:#78849a;font-size:12px}.footer .container{display:flex;justify-content:space-between;gap:20px}.menu-btn{display:none;background:white;border:1px solid var(--line);border-radius:12px;width:42px;height:42px;font-size:20px}.mobile-menu{display:none}.resume-strip{margin-top:18px;display:flex;gap:10px;flex-wrap:wrap}.resume-strip a{font-size:12px;font-weight:800;color:var(--brand)}
@media(max-width:980px){.navlinks{display:none}.menu-btn{display:block}.hero-grid,.about-grid,.contact-panel{grid-template-columns:1fr}.portrait-wrap{min-height:420px}.portrait-card{width:330px;height:390px}.tech-grid{grid-template-columns:repeat(5,1fr)}.project-grid{grid-template-columns:1fr}.video-grid{grid-template-columns:1fr}.mobile-menu.open{display:flex;position:absolute;top:76px;left:0;right:0;background:#fff;border-bottom:1px solid var(--line);padding:18px 24px;flex-direction:column;gap:12px;box-shadow:0 20px 35px rgba(20,40,80,.08)}.mobile-menu a{font-weight:800;color:#4d5a72}.lang{margin-left:auto}}
@media(max-width:700px){.container{width:min(100% - 28px,1180px)}.hero{padding:65px 0 58px}.hero-grid{gap:35px}h1{font-size:52px}.lead{font-size:17px}.portrait-card{width:290px;height:345px}.floating.one{left:0;top:35px}.floating.two{right:0;bottom:42px}.quick{gap:12px}.section-head{display:block}.section-head p{margin-top:15px}.exp{grid-template-columns:1fr;gap:10px}.exp-side{flex-direction:row;align-items:center;justify-content:space-between}.exp-logo{width:66px;height:66px}.tech-grid{grid-template-columns:repeat(3,1fr)}.tech{min-height:103px}.project-media{height:220px}.contact-panel{padding:30px}.contact-panel h2{font-size:36px}.footer .container{display:block}.footer .container div+div{margin-top:6px}}

@media(max-width:640px){.about-role-title .about-role-specialty{margin-left:.45em}}

/* V2.50 — Hero homepage fixes: preserve descenders and full portrait circle */
.hero h1{
  line-height:1.065;
}
.hero .gradient-word{
  padding-bottom:.10em;
  margin-bottom:-.10em;
  overflow:visible;
}
.hero .portrait-card img{
  object-fit:contain;
  object-position:center center;
}


/* V2.51 — About summary full-width + alternating professional timeline.
   Header/navbar intentionally untouched. */
#about .about-layout{
  display:block;
}
#about .about-card{
  width:100%;
  padding:34px 38px;
}
#about .about-card > p{
  max-width:980px;
  font-size:15px;
  line-height:1.75;
}
#about .stats{
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:16px;
  margin-top:24px;
}
#about .stat{
  min-height:118px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  padding:20px 22px;
}
#about .stat b{
  font-size:30px;
}
#about .experience-heading{
  display:flex;
  align-items:center;
  gap:14px;
  margin:58px 0 28px;
}
#about .experience-heading-line{
  width:38px;
  height:4px;
  border-radius:999px;
  background:linear-gradient(90deg,#2764ff,#7658ff);
  flex:0 0 auto;
}
#about .experience-heading h3{
  margin:0;
  font-size:17px;
  line-height:1.2;
  letter-spacing:.035em;
  color:var(--ink);
}

#about .timeline{
  position:relative;
  display:flex;
  flex-direction:column;
  gap:26px;
  padding:4px 0 2px;
}
#about .timeline::before{
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:50%;
  width:2px;
  transform:translateX(-50%);
  background:linear-gradient(180deg,#dbe5ff 0%,#bfcfff 48%,#e7e1ff 100%);
  border-radius:999px;
}
#about .timeline .exp{
  position:relative;
  width:calc(50% - 50px);
  grid-template-columns:104px minmax(0,1fr);
  gap:18px;
  padding:22px;
  z-index:1;
}
#about .timeline .exp:nth-child(odd){
  align-self:flex-start;
}
#about .timeline .exp:nth-child(even){
  align-self:flex-end;
}
#about .timeline .exp::before{
  content:"";
  position:absolute;
  top:50%;
  width:14px;
  height:14px;
  border-radius:50%;
  background:var(--brand);
  border:4px solid #fff;
  box-shadow:0 0 0 4px #e5ecff;
  transform:translateY(-50%);
  z-index:3;
}
#about .timeline .exp::after{
  content:"";
  position:absolute;
  top:50%;
  height:2px;
  width:50px;
  background:#d6e0fa;
  transform:translateY(-50%);
  z-index:0;
}
#about .timeline .exp:nth-child(odd)::before{
  right:-57px;
}
#about .timeline .exp:nth-child(even)::before{
  left:-57px;
}
#about .timeline .exp:nth-child(odd)::after{
  right:-50px;
}
#about .timeline .exp:nth-child(even)::after{
  left:-50px;
}
#about .timeline .exp-side{
  gap:11px;
}
#about .timeline .exp-logo{
  width:68px;
  height:68px;
}
#about .timeline .exp h3{
  font-size:19px;
}

@media(max-width:980px){
  #about .stats{
    grid-template-columns:repeat(2,minmax(0,1fr));
  }
  #about .experience-heading{
    margin-top:46px;
  }
  #about .timeline{
    padding-left:54px;
  }
  #about .timeline::before{
    left:22px;
    transform:none;
  }
  #about .timeline .exp{
    width:100%;
    align-self:stretch !important;
  }
  #about .timeline .exp::before,
  #about .timeline .exp:nth-child(odd)::before,
  #about .timeline .exp:nth-child(even)::before{
    left:-39px;
    right:auto;
  }
  #about .timeline .exp::after,
  #about .timeline .exp:nth-child(odd)::after,
  #about .timeline .exp:nth-child(even)::after{
    left:-32px;
    right:auto;
    width:32px;
  }
}
@media(max-width:700px){
  #about .about-card{
    padding:28px 24px;
  }
  #about .stats{
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:12px;
  }
  #about .stat{
    min-height:108px;
    padding:17px;
  }
  #about .timeline{
    padding-left:44px;
    gap:18px;
  }
  #about .timeline::before{
    left:16px;
  }
  #about .timeline .exp{
    grid-template-columns:1fr;
    gap:10px;
    padding:19px;
  }
  #about .timeline .exp::before,
  #about .timeline .exp:nth-child(odd)::before,
  #about .timeline .exp:nth-child(even)::before{
    left:-35px;
  }
  #about .timeline .exp::after,
  #about .timeline .exp:nth-child(odd)::after,
  #about .timeline .exp:nth-child(even)::after{
    left:-28px;
    width:28px;
  }
  #about .timeline .exp-side{
    flex-direction:row;
    align-items:center;
    justify-content:space-between;
  }
  #about .timeline .exp-logo{
    width:60px;
    height:60px;
  }
}


/* V2.52 - interactive home project cards */
.project{cursor:pointer}
.project:hover{transform:translateY(-7px);box-shadow:0 24px 54px rgba(29,50,91,.14);border-color:#c4d2ff}
.project:focus-visible{outline:3px solid rgba(39,100,255,.28);outline-offset:4px;transform:translateY(-3px);box-shadow:0 18px 42px rgba(29,50,91,.12)}
@media (prefers-reduced-motion: reduce){.project{transition:none}.project:hover,.project:focus-visible{transform:none}}

/* V2.54 — Footer alignment: match CV footer position. */
.footer .container{
  justify-content:flex-end;
  text-align:right;
}
@media(max-width:700px){
  .footer .container{
    display:block;
    text-align:right;
  }
}


/* V2.55 — Homepage about-card text alignment only. Navbar intentionally untouched. */
#about .about-role-title{
  display:flex;
  align-items:baseline;
  gap:.34em;
  flex-wrap:nowrap;
  white-space:nowrap;
}
#about .about-role-title span{
  display:inline;
}
#about .about-role-title .about-role-specialty{
  margin-left:0;
  margin-top:0;
}
#about .about-card > p{
  max-width:none;
}
#about .about-no-break{
  white-space:nowrap;
}
@media(max-width:700px){
  #about .about-role-title{
    display:block;
    white-space:normal;
  }
  #about .about-role-title .about-role-specialty{
    display:block;
    margin-left:.45em;
    margin-top:.12em;
  }
  #about .about-no-break{
    white-space:normal;
  }
}


/* V2.56 — About title/CV link alignment + project GitHub hover feedback.
   Navbar/header intentionally untouched. */
#about .about-title-row{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  gap:24px;
  width:100%;
}
#about .about-title-row > h3{
  margin-bottom:13px;
  min-width:0;
}
#about .resume-strip-inline{
  margin-top:0;
  flex:0 0 auto;
  white-space:nowrap;
}
#about .resume-strip-inline a{
  transition:text-decoration-color .18s ease,color .18s ease;
}
#about .resume-strip-inline a:hover{
  text-decoration:underline;
  text-underline-offset:3px;
}
.project:hover .project-link,
.project:focus-visible .project-link,
.project:focus-within .project-link{
  text-decoration:underline;
  text-underline-offset:3px;
}
@media(max-width:700px){
  #about .about-title-row{
    align-items:flex-start;
    flex-wrap:wrap;
    gap:8px 18px;
  }
  #about .resume-strip-inline{
    width:100%;
  }
}

/* V2.59 - Stack technique: cartes interactives façon jeu */
.tech-grid{position:relative}
.tech{position:relative;cursor:grab;user-select:none;-webkit-user-select:none;will-change:transform,box-shadow;border-color;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease,opacity .18s ease}
.tech:active{cursor:grabbing}
.tech.tech-dragging-source{opacity:.28;transform:scale(.96);border-style:dashed;border-color:#9fb7ff;box-shadow:none}
.tech.tech-drop-target{transform:translateY(-4px) scale(1.025);border-color:#7f9dff;box-shadow:0 16px 34px rgba(39,100,255,.16),0 0 0 3px rgba(39,100,255,.08)}
.tech-drag-ghost{position:fixed;z-index:9999;pointer-events:none;margin:0;opacity:.97;cursor:grabbing;transform:rotate(2.2deg) scale(1.055);box-shadow:0 24px 55px rgba(26,52,105,.22),0 8px 20px rgba(26,52,105,.14);border-color:#aabfff!important;background:#fff;transition:none!important}
.tech-grid.tech-drag-active .tech:not(.tech-dragging-source):not(.tech-drop-target){transform:scale(.985)}
@media(prefers-reduced-motion:reduce){.tech,.tech.tech-drop-target,.tech-grid.tech-drag-active .tech{transition:none!important}.tech-drag-ghost{transform:none}}

/* V2.60 — Homepage journey atmosphere.
   Decorative layer only: navbar, content and CV pages remain untouched. */
main#top{
  position:relative;
  isolation:isolate;
  overflow:hidden;
  background:
    linear-gradient(180deg,
      #ffffff 0%,
      #f5f8ff 20%,
      #faf7ff 38%,
      #fff8f2 56%,
      #f4f9ff 74%,
      #f8fbfa 100%);
}
main#top > .hero{
  position:relative;
  z-index:3;
}
main#top > section:not(.hero){
  position:relative;
  z-index:2;
}

/* Softly different "chapters" so scrolling feels like a continuous journey. */
#about{
  background:
    radial-gradient(circle at 9% 18%,rgba(74,113,255,.10),transparent 29%),
    radial-gradient(circle at 89% 70%,rgba(136,103,255,.09),transparent 27%),
    linear-gradient(180deg,rgba(247,250,255,.72),rgba(252,249,255,.64));
  background-size:115% 115%,120% 120%,100% 100%;
  animation:journeyChapterDrift 20s ease-in-out infinite alternate;
}
.projects{
  background:
    radial-gradient(circle at 92% 16%,rgba(242,163,116,.11),transparent 28%),
    radial-gradient(circle at 8% 78%,rgba(70,111,255,.085),transparent 29%),
    linear-gradient(180deg,rgba(255,251,247,.76),rgba(248,249,255,.68));
  background-size:118% 118%,120% 120%,100% 100%;
  animation:journeyChapterDrift 24s ease-in-out -7s infinite alternate;
}
.video-section{
  background:
    radial-gradient(circle at 12% 30%,rgba(122,92,255,.10),transparent 27%),
    radial-gradient(circle at 88% 76%,rgba(241,167,125,.11),transparent 28%),
    linear-gradient(180deg,rgba(247,249,255,.72),rgba(255,249,244,.70));
  background-size:118% 118%,118% 118%,100% 100%;
  animation:journeyChapterDrift 22s ease-in-out -11s infinite alternate;
}
.tech-section{
  background:
    radial-gradient(circle at 90% 20%,rgba(72,186,179,.09),transparent 28%),
    radial-gradient(circle at 10% 77%,rgba(70,111,255,.09),transparent 30%),
    linear-gradient(180deg,rgba(245,251,251,.74),rgba(247,250,255,.72));
  background-size:118% 118%,120% 120%,100% 100%;
  animation:journeyChapterDrift 25s ease-in-out -4s infinite alternate;
}
.contact{
  background:
    radial-gradient(circle at 8% 20%,rgba(122,92,255,.09),transparent 30%),
    radial-gradient(circle at 92% 80%,rgba(242,163,116,.10),transparent 27%),
    linear-gradient(180deg,rgba(248,249,255,.74),rgba(255,250,246,.80));
  background-size:120% 120%,118% 118%,100% 100%;
  animation:journeyChapterDrift 23s ease-in-out -14s infinite alternate;
}

/* Continuous route in the background. It stays behind every content card. */
.journey-track{
  position:absolute;
  z-index:1;
  top:620px;
  left:0;
  right:0;
  bottom:70px;
  pointer-events:none;
  opacity:.76;
  overflow:hidden;
}
.journey-track svg{
  width:100%;
  height:100%;
  display:block;
  overflow:visible;
}
.journey-line{
  fill:none;
  vector-effect:non-scaling-stroke;
  stroke-linecap:round;
  stroke-linejoin:round;
}
.journey-line-soft{
  stroke:url(#journeyGradient);
  stroke-width:10;
  opacity:.10;
}
.journey-line-flow{
  stroke:url(#journeyGradient);
  stroke-width:2.2;
  stroke-dasharray:7 15;
  opacity:.50;
  animation:journeyRouteFlow 9s linear infinite;
}
.journey-waypoints circle{
  fill:#fff;
  stroke:#7799ff;
  stroke-width:2;
  vector-effect:non-scaling-stroke;
  filter:drop-shadow(0 4px 8px rgba(64,88,150,.16));
  transform-box:fill-box;
  transform-origin:center;
  animation:journeyWaypointPulse 3.8s ease-in-out infinite;
}
.journey-waypoints circle:nth-child(2){animation-delay:-.7s}
.journey-waypoints circle:nth-child(3){animation-delay:-1.4s}
.journey-waypoints circle:nth-child(4){animation-delay:-2.1s}
.journey-waypoints circle:nth-child(5){animation-delay:-2.8s}
.journey-waypoints circle:nth-child(6){animation-delay:-3.5s}

/* Keep white cards readable while the scenery moves behind them. */
#about .about-card,
#about .exp,
.projects .project,
.video-section .video-card,
.tech-section .tech,
.contact .contact-panel{
  position:relative;
  z-index:2;
}

@keyframes journeyRouteFlow{
  to{stroke-dashoffset:-88}
}
@keyframes journeyWaypointPulse{
  0%,100%{transform:scale(1);opacity:.72}
  50%{transform:scale(1.42);opacity:1}
}
@keyframes journeyChapterDrift{
  0%{background-position:0% 0%,100% 100%,0 0}
  100%{background-position:8% 5%,92% 94%,0 0}
}

@media(max-width:980px){
  .journey-track{top:760px;opacity:.60}
  .journey-line-soft{stroke-width:8}
  .journey-line-flow{stroke-width:1.8}
}
@media(max-width:700px){
  .journey-track{
    top:900px;
    left:-34%;
    right:-34%;
    opacity:.42;
  }
  #about,.projects,.video-section,.tech-section,.contact{
    background-size:145% 145%,145% 145%,100% 100%;
  }
}
@media(prefers-reduced-motion:reduce){
  #about,.projects,.video-section,.tech-section,.contact,
  .journey-line-flow,.journey-waypoints circle{
    animation:none !important;
  }
}

/* V2.62 — Engineering Journey: lightweight, monochrome and scroll-driven.
   Goal: a continuous professional journey without costly parallax/blur layers. */
body{background:#eef2f8}
main#top{
  position:relative;
  isolation:isolate;
  overflow:hidden;
  background-color:#f5f7fb;
  background-image:
    linear-gradient(rgba(73,94,135,.035) 1px,transparent 1px),
    linear-gradient(90deg,rgba(73,94,135,.035) 1px,transparent 1px),
    radial-gradient(circle at 15% 18%,rgba(48,91,191,.07),transparent 24%),
    radial-gradient(circle at 86% 68%,rgba(48,91,191,.055),transparent 26%);
  background-size:64px 64px,64px 64px,100% 100%,100% 100%;
}
main#top > section:not(.hero){background:transparent!important;animation:none!important}

/* A cooler, more technical entrance. Only transform-based motion is used. */
.hero{
  background:
    radial-gradient(circle at 79% 42%,rgba(50,97,207,.12),transparent 31%),
    linear-gradient(135deg,#fbfcff 0%,#eff3fa 56%,#f7f9fc 100%)!important;
}
.hero:before{
  width:560px;height:560px;right:-170px;top:-185px;
  background:radial-gradient(circle,rgba(50,97,207,.12),rgba(50,97,207,0) 70%);
}
.hero:after{
  content:"";
  position:absolute;
  inset:-48px;
  width:auto;height:auto;left:-48px;right:-48px;top:-48px;bottom:-48px;
  border-radius:0;
  background-image:
    linear-gradient(rgba(69,91,135,.045) 1px,transparent 1px),
    linear-gradient(90deg,rgba(69,91,135,.045) 1px,transparent 1px);
  background-size:46px 46px;
  opacity:.36;
  transform:translate3d(0,0,0);
  animation:engineeringGridDrift 26s linear infinite;
  pointer-events:none;
}
.hero-grid{position:relative;z-index:2}
.portrait-wrap::before{
  content:"";
  position:absolute;
  width:438px;height:438px;
  border-radius:50%;
  border:1px dashed rgba(57,91,164,.26);
  box-shadow:0 0 0 18px rgba(56,91,169,.025);
  pointer-events:none;
  animation:engineeringOrbit 28s linear infinite;
}
.portrait-wrap::after{
  content:"";
  position:absolute;
  width:10px;height:10px;
  border-radius:50%;
  background:#3b6fe5;
  box-shadow:0 0 0 6px rgba(59,111,229,.09);
  transform:translate(214px,-10px);
  pointer-events:none;
  animation:engineeringOrbitDot 28s linear infinite;
}

/* The page is one world, not a collection of colored panels. */
#about,.projects,.video-section,.tech-section,.contact{
  border-top:1px solid rgba(80,103,149,.07);
  border-bottom:0;
}
#about .about-card,
#about .exp,
.projects .project,
.video-section .video-card,
.tech-section .tech,
.contact .contact-panel{
  position:relative;
  z-index:3;
}

/* The route is the visual backbone. It is filled by the user's actual scroll. */
.journey-track{
  top:600px;
  bottom:40px;
  opacity:1;
  z-index:1;
  filter:none;
}
.journey-line-soft{
  stroke:url(#journeyGradient);
  stroke-width:12;
  opacity:.10;
}
.journey-line-flow{
  stroke:#8ea2c9;
  stroke-width:1.8;
  stroke-dasharray:5 15;
  opacity:.33;
  animation:none!important;
}
.journey-line-progress{
  fill:none;
  stroke:url(#journeyProgressGradient);
  stroke-width:3.2;
  stroke-linecap:round;
  stroke-linejoin:round;
  vector-effect:non-scaling-stroke;
  opacity:.86;
}
.journey-waypoints circle{
  fill:#f7f9fc;
  stroke:#93a6cc;
  stroke-width:2;
  opacity:.75;
  filter:none;
  animation:none!important;
  transition:fill .28s ease,stroke .28s ease,opacity .28s ease,transform .28s ease;
  transform-box:fill-box;
  transform-origin:center;
}
.journey-waypoints circle.is-reached{
  fill:#3569dc;
  stroke:#ffffff;
  opacity:1;
  transform:scale(1.16);
}
.journey-traveler{
  fill:#ffffff;
  stroke:#3569dc;
  stroke-width:3;
  vector-effect:non-scaling-stroke;
  filter:drop-shadow(0 2px 5px rgba(39,78,162,.28));
}

/* Chapters gently enter as the visitor reaches them; no continuous scroll work. */
.journey-reveal{
  opacity:0;
  transform:translateY(22px);
  transition:opacity .62s ease,transform .62s cubic-bezier(.2,.7,.2,1);
}
.journey-reveal.is-visible{opacity:1;transform:none}

/* Small technical chapter cue in the page margins. */
#about::after,.projects::after,.video-section::after,.tech-section::after,.contact::after{
  position:absolute;
  z-index:1;
  top:52px;
  right:max(22px,calc((100vw - 1180px)/2 - 58px));
  font-size:11px;
  font-weight:900;
  letter-spacing:.18em;
  color:rgba(55,78,124,.28);
  writing-mode:vertical-rl;
  text-orientation:mixed;
  pointer-events:none;
}
#about::after{content:"01  PROFILE · EXPERIENCE"}
.projects::after{content:"02  BUILD · PROJECTS"}
.video-section::after{content:"03  VISION"}
.tech-section::after{content:"04  ENGINEERING STACK"}
.contact::after{content:"05  NEXT CHAPTER"}

/* V2.63 — French chapter labels stay fully localized. */
html[lang="fr"] #about::after{content:"01  PROFIL · EXPÉRIENCE"}
html[lang="fr"] .projects::after{content:"02  CONCEPTION · PROJETS"}
html[lang="fr"] .video-section::after{content:"03  VISION"}
html[lang="fr"] .tech-section::after{content:"04  INGÉNIERIE · TECHNOLOGIES"}
html[lang="fr"] .contact::after{content:"05  PROCHAINE ÉTAPE"}

/* The destination: no white cut at the bottom. */
.footer{
  border-top:1px solid rgba(69,92,137,.12);
  background:linear-gradient(180deg,#edf1f7 0%,#e7edf6 100%);
  color:#66748d;
}
.footer .container{position:relative;z-index:1}

@keyframes engineeringGridDrift{
  to{transform:translate3d(46px,46px,0)}
}
@keyframes engineeringOrbit{to{transform:rotate(360deg)}}
@keyframes engineeringOrbitDot{to{transform:rotate(360deg) translate(214px,-10px) rotate(-360deg)}}

@media(max-width:1280px){
  #about::after,.projects::after,.video-section::after,.tech-section::after,.contact::after{display:none}
}
@media(max-width:980px){
  .journey-track{top:760px;opacity:.72}
  .portrait-wrap::before{width:392px;height:392px}
  .portrait-wrap::after{display:none}
}
@media(max-width:700px){
  main#top{background-size:48px 48px,48px 48px,100% 100%,100% 100%}
  .journey-track{left:-38%;right:-38%;opacity:.32}
  .journey-line-progress{stroke-width:2.4}
  .hero:after{opacity:.22}
  .portrait-wrap::before{width:332px;height:332px}
}
@media(prefers-reduced-motion:reduce){
  .hero:after,.portrait-wrap::before,.portrait-wrap::after{animation:none!important}
  .journey-reveal{opacity:1!important;transform:none!important;transition:none!important}
}


/* V2.63 — Journey marker refinements. */
.journey-waypoints circle{r:7}
.journey-waypoints circle:nth-child(3){r:6.5}

/* V2.64 — Experience timeline journey lights.
   Milestones start dormant and illuminate progressively as the reader reaches them. */
#about .timeline .exp::before{
  background:#738097;
  border-color:#f7f9fc;
  box-shadow:
    0 0 0 4px rgba(93,108,134,.14),
    0 3px 9px rgba(31,48,78,.10);
  opacity:.72;
  transition:
    background-color .42s ease,
    border-color .42s ease,
    box-shadow .52s ease,
    opacity .42s ease,
    transform .42s cubic-bezier(.2,.8,.2,1);
}
#about .timeline .exp.is-journey-reached::before{
  background:#2f68ee;
  border-color:#fff;
  opacity:1;
  box-shadow:
    0 0 0 5px rgba(47,104,238,.13),
    0 0 18px rgba(47,104,238,.34),
    0 0 34px rgba(47,104,238,.14);
  transform:translateY(-50%) scale(1.08);
}
#about .timeline .exp.is-journey-current::before{
  background:#2764ff;
  box-shadow:
    0 0 0 6px rgba(39,100,255,.15),
    0 0 22px rgba(39,100,255,.50),
    0 0 42px rgba(39,100,255,.22);
  transform:translateY(-50%) scale(1.18);
  animation:experienceJourneyGlow 1.8s ease-in-out infinite;
}
#about .timeline .exp.is-journey-reached::after{
  background:linear-gradient(90deg,rgba(47,104,238,.25),rgba(47,104,238,.72));
}
#about .timeline .exp:nth-child(even).is-journey-reached::after{
  background:linear-gradient(90deg,rgba(47,104,238,.72),rgba(47,104,238,.25));
}
@keyframes experienceJourneyGlow{
  0%,100%{
    box-shadow:
      0 0 0 5px rgba(39,100,255,.13),
      0 0 17px rgba(39,100,255,.42),
      0 0 34px rgba(39,100,255,.16);
  }
  50%{
    box-shadow:
      0 0 0 8px rgba(39,100,255,.08),
      0 0 27px rgba(39,100,255,.58),
      0 0 48px rgba(39,100,255,.22);
  }
}
@media(prefers-reduced-motion:reduce){
  #about .timeline .exp::before{transition:none!important}
  #about .timeline .exp.is-journey-current::before{animation:none!important}
}


/* v2.76 CSP-safe replacements for former inline styles */
.video-illustration-media{height:auto;aspect-ratio:16/9;border-radius:17px;background:linear-gradient(135deg,#edf4ff,#fff3e8)}
.video-illustration-image{object-fit:contain;max-height:250px}
