/* Henkinn home — four full-screen steps over the live graph (home.js). */

:root{
  --bg:#06070C;
  --ink:#F3F5FB;
  --dim:#8C92A6;
  --line:rgba(255,255,255,.10);
  --red:#FF4D5E;
  --red-soft:#FF8A96;
  --blue:#4F8CFF;
  --blue-soft:#8DB4FF;
  --green:#43D18A;
  --amber:#F5B84A;
  --sans:'Nunito',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  --display:'Anton',Impact,'Haettenschweiler','Arial Narrow Bold',sans-serif;
  --mono:ui-monospace,'SF Mono',Menlo,Consolas,'Liberation Mono',monospace;
  --ease:cubic-bezier(.22,1,.36,1);
  --pad:clamp(20px,5vw,72px);
  --dir:1;
  color-scheme:dark;
}

*,*::before,*::after{box-sizing:border-box}
html,body{height:100%;margin:0;overflow:hidden;overscroll-behavior:none}
body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased}
a{color:inherit}
button,input,textarea{font:inherit;color:inherit}
img{max-width:100%;display:block}
:focus-visible{outline:2px solid var(--blue);outline-offset:3px;border-radius:10px}
[tabindex="-1"]:focus{outline:none}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* language switch */
[data-lang]{display:none}
.lang-fr [data-lang="fr"],.lang-en [data-lang="en"]{display:inline}

/* ------------------------------------------------------------- atmosphere */
.atmos{position:fixed;inset:0;z-index:0;pointer-events:none;
  background:
    radial-gradient(60vmax 50vmax at 6% 108%,rgba(255,77,94,.24),transparent 60%),
    radial-gradient(55vmax 45vmax at 96% -8%,rgba(79,140,255,.24),transparent 60%),
    radial-gradient(40vmax 40vmax at 70% 55%,rgba(168,110,255,.07),transparent 70%)}
.atmos::after{content:"";position:absolute;inset:0;
  background:repeating-linear-gradient(90deg,rgba(255,255,255,.035) 0 1px,transparent 1px 22px);
  -webkit-mask-image:radial-gradient(42vmax 62vh at 68% 50%,#000,transparent 75%);
  mask-image:radial-gradient(42vmax 62vh at 68% 50%,#000,transparent 75%)}
#graph{position:fixed;inset:0;z-index:1;display:block}

/* ------------------------------------------------------------ lens cursor
   With a mouse, the lens is the cursor: the arrow is hidden, the lens rim and
   its center dot follow the pointer, it shrinks to a ring over anything
   clickable and steps aside for the text cursor in form fields. The magnified
   graph inside it is drawn on the canvas below. */
.lens{position:fixed;left:0;top:0;z-index:40;display:none;pointer-events:none;opacity:0;border-radius:50%;
  border:1px solid rgba(255,255,255,.42);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.35),inset 0 0 26px rgba(140,170,255,.16),0 10px 30px -12px rgba(0,0,0,.7);
  transition:background-color .25s,border-color .25s;will-change:transform,width,height,opacity}
.lens::before{content:"";position:absolute;left:12%;top:12%;width:46%;height:18%;border-radius:50%;
  background:radial-gradient(closest-side,rgba(255,255,255,.34),transparent);transform:rotate(-32deg);transition:opacity .25s}
.lens i{position:absolute;left:50%;top:50%;width:4px;height:4px;margin:-2px 0 0 -2px;border-radius:50%;background:#fff;box-shadow:0 0 8px rgba(255,255,255,.8)}
.lens.link{border-color:rgba(255,255,255,.85);background:rgba(255,255,255,.08)}
.lens.link::before{opacity:0}
.lens-cursor .lens{display:block}
/* !important: component rules like .btn{cursor:pointer} would otherwise win and
   bring the hand back whenever a button slides under a still mouse */
.lens-cursor,.lens-cursor *{cursor:none!important}
.lens-cursor input,.lens-cursor textarea,.lens-cursor :is(p,h1,h2,h3,dt,dd,li){cursor:text!important}

/* ----------------------------------------------------------------- header */
.top{position:fixed;inset:0 0 auto;z-index:10;display:flex;align-items:center;gap:28px;height:76px;padding-inline:var(--pad)}
.logo{margin-right:auto;font-family:var(--display);font-size:20px;letter-spacing:.16em;text-decoration:none}
.nav{display:flex;gap:4px}
.nav a{position:relative;padding:8px 14px;border-radius:999px;font-size:14px;color:var(--dim);text-decoration:none;transition:color .3s}
.nav a:hover,.nav a[aria-current]{color:var(--ink)}
.nav a::after{content:"";position:absolute;left:50%;bottom:0;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--red);transform:scale(0);transition:transform .45s var(--ease)}
.nav a[aria-current]::after{transform:scale(1)}
.langs{position:relative;display:grid;grid-template-columns:1fr 1fr;padding:3px;border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.04);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}
.langs .thumb{position:absolute;top:3px;bottom:3px;left:3px;width:calc((100% - 6px) / 2);border-radius:999px;background:var(--ink);transition:transform .45s var(--ease)}
.lang-en .langs .thumb{transform:translateX(100%)}
.langs button{position:relative;z-index:1;border:0;background:none;cursor:pointer;padding:5px 10px;border-radius:999px;font-family:var(--mono);font-size:12px;color:var(--dim);transition:color .35s}
.lang-fr .langs [data-set="fr"],.lang-en .langs [data-set="en"]{color:var(--bg)}

/* ------------------------------------------------------------------ steps */
#stage{position:fixed;inset:0;z-index:2}
.step{position:absolute;inset:0;display:flex;flex-direction:column;padding:104px calc(var(--pad) + 28px) 96px var(--pad);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none;visibility:hidden;pointer-events:none}
.step::-webkit-scrollbar{display:none}
.step.is-active{pointer-events:auto}
.step.is-active,.step.was-active,.findable .step{visibility:visible}
.step-inner{width:100%;max-width:1240px;margin:auto}

.rise{opacity:0;transform:translateY(calc(var(--dir) * 44px));transition:opacity .5s var(--ease),transform .7s var(--ease),filter .5s var(--ease)}
.is-active .rise{opacity:1;transform:none;transition-duration:.8s,1.1s,.8s;transition-delay:calc(var(--d,0) * 90ms + 200ms)}
.was-active .rise{opacity:0;transform:translateY(calc(var(--dir) * -44px));transition-duration:.35s,.5s,.35s;transition-delay:0s}
/* language switch: the visible text blurs out, the language changes, and it
   comes back with the step's own staggered entrance */
.lang-swap .is-active .rise{opacity:0;filter:blur(8px);transform:translateY(-10px);transition-duration:.22s,.22s,.22s;transition-delay:0s}

/* ------------------------------------------------------------- typography */
.eyebrow{display:inline-flex;align-items:center;gap:12px;font-family:var(--mono);font-size:12px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim)}
.eyebrow::before{content:"";width:24px;height:1px;background:linear-gradient(90deg,var(--red),var(--blue))}
.display{margin:18px 0 0;font-family:var(--display);font-weight:400;text-transform:uppercase;font-size:clamp(46px,min(8.4vw,15vh),142px);line-height:.9;letter-spacing:.004em}
.display .line{display:block}
.display .dim{color:#767C8F}
.display.compact{font-size:clamp(40px,min(6vw,11vh),100px)}
.lede{margin:28px 0 0;max-width:30ch;font-size:clamp(19px,min(2.2vw,3.4vh),30px);line-height:1.28}
.red{color:var(--red)}
.blue{color:var(--blue-soft)}
.sub{margin:14px 0 0;max-width:48ch;color:var(--dim)}

/* ---------------------------------------------------------------- buttons */
.actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:34px}
.btn{display:inline-flex;align-items:center;gap:12px;height:54px;padding:0 24px;border-radius:999px;cursor:pointer;text-decoration:none;font-weight:700;font-size:15px;color:var(--ink);
  border:1.5px solid transparent;
  background:linear-gradient(#0A0C15,#0A0C15) padding-box,linear-gradient(90deg,var(--blue),var(--red)) border-box;
  box-shadow:0 0 30px -12px rgba(255,77,94,.75),0 0 30px -12px rgba(79,140,255,.75);
  transition:transform .35s var(--ease),box-shadow .35s var(--ease),background-color .3s,opacity .3s}
.btn:hover{transform:translateY(-2px);box-shadow:0 0 38px -8px rgba(255,77,94,.85),0 0 38px -8px rgba(79,140,255,.85)}
.btn:disabled{opacity:.55;transform:none;cursor:progress}
.btn .arrow{transition:transform .35s var(--ease)}
.btn:hover .arrow{transform:translateX(4px)}
.btn.ghost{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.14);box-shadow:none}
.btn.ghost:hover{background:rgba(255,255,255,.09)}

/* ------------------------------------------------------------------ glass */
.glass{position:relative;isolation:isolate;border-radius:22px;
  background:linear-gradient(160deg,rgba(255,255,255,.07),rgba(255,255,255,.01) 62%);
  border:1px solid rgba(255,255,255,.12);
  /* light blur: the graph should stay readable through the glass */
  -webkit-backdrop-filter:blur(4px) saturate(170%);backdrop-filter:blur(4px) saturate(170%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),inset 0 -1px 0 rgba(255,255,255,.04),0 30px 60px -30px rgba(0,0,0,.85)}
.glass::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;pointer-events:none;
  background:radial-gradient(280px circle at var(--mx,50%) var(--my,0%),rgba(255,255,255,.13),transparent 65%);
  opacity:0;transition:opacity .4s}
.glass:hover::before{opacity:1}

/* ---------------------------------------------------------- 1 presentation */
.intro{max-width:820px}

/* ------------------------------------------------------------- 2 expertise */
.head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:16px 48px;margin-bottom:30px}
.head .display{font-size:clamp(40px,min(5.4vw,10vh),92px)}
.head .sub{max-width:34ch;margin:0}
.panels{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.panel{display:flex;flex-direction:column;gap:8px;padding:24px 22px 22px;transition:border-color .4s}
.panel:hover{border-color:rgba(255,255,255,.26)}
.panel .tag{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--blue-soft)}
.panel h3{margin:0;font-size:21px;font-weight:800;line-height:1.2}
.panel p{margin:0;font-size:15px;color:var(--dim)}
.techs{display:grid;grid-template-columns:repeat(auto-fill,minmax(64px,1fr));gap:16px 6px;margin:14px 0 0;padding:14px 0 0;list-style:none;border-top:1px solid var(--line)}
.techs li{display:flex;flex-direction:column;align-items:center;gap:8px;font-family:var(--mono);font-size:10px;letter-spacing:.02em;line-height:1.2;text-align:center;color:var(--dim);transition:color .3s}
.techs i{display:block;width:30px;height:30px;background:currentColor;
  -webkit-mask:var(--icon) center/contain no-repeat;mask:var(--icon) center/contain no-repeat}
.techs li:hover{color:var(--ink)}

/* --------------------------------------------------------------- 3 projets */
.project{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(32px,6vw,96px);align-items:center}
.phone{justify-self:center;width:min(290px,100%);padding:9px;border-radius:46px}
/* The screenshot already carries the status bar and home indicator (painted
   by the stokky repo's site_shots.dart), so the frame is only a bezel. */
.screen{overflow:hidden;border-radius:37px;background:#FBF4EA}
.screen img{width:100%;height:auto}
.status-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px}
.chip{display:inline-flex;align-items:center;gap:8px;height:30px;padding:0 12px;border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.04);font-size:13px;font-weight:700}
.chip i{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 10px var(--green)}
.chip.soon i{background:var(--amber);box-shadow:0 0 10px var(--amber)}
.facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:26px 0 0;border-radius:18px}
.facts div{padding:16px 18px}
.facts div+div{border-left:1px solid var(--line)}
.facts dt{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.facts dd{margin:6px 0 0;font-weight:700}
.doclinks{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:24px}
.doclinks a{font-size:13px;color:var(--dim);text-decoration:none}
.doclinks a:hover{color:var(--ink)}

/* -------------------------------------------------------------- 4 contact */
.contact{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,7fr);gap:clamp(32px,5vw,80px);align-items:center}
.glyph{justify-self:center;width:min(100%,46vh);aspect-ratio:1}
.form{display:grid;gap:14px;margin-top:24px;padding:22px}
.row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.field{display:flex;flex-direction:column;gap:6px;font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.field input,.field textarea{width:100%;padding:12px 14px;border-radius:14px;border:1px solid rgba(255,255,255,.14);background:rgba(6,7,12,.45);
  font-family:var(--sans);font-size:16px;letter-spacing:normal;text-transform:none;color:var(--ink);transition:border-color .25s,box-shadow .25s}
.field textarea{resize:vertical;min-height:96px}
.field input:focus,.field textarea:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(79,140,255,.25)}
.trap{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}
.sent{display:grid;justify-items:start;gap:6px}
.sent p{margin:0;color:var(--dim)}
.sent .sent-title{font-size:21px;font-weight:800;color:var(--green)}
.sent .btn{margin-top:10px}
.form:not(.is-sent) .sent,.form.is-sent>:not(.sent){display:none}
.form-foot{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px}
.form-status{font-size:14px;color:var(--dim)}
.form-status[data-state="sent"]{color:var(--green)}
.form-status[data-state="invalid"],.form-status[data-state="error"]{color:var(--red-soft)}
.alt{margin:14px 0 0;font-size:14px;color:var(--dim)}
.alt a{color:var(--blue-soft);font-weight:700;text-decoration:none}
.alt a:hover{text-decoration:underline;text-underline-offset:3px}

/* -------------------------------------------------------------- hud, rail */
.hud{position:fixed;inset:auto 0 0;z-index:10;display:flex;align-items:center;gap:18px;height:76px;padding-inline:var(--pad);pointer-events:none}
.hud>*{pointer-events:auto}
.legal{margin-right:auto;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);text-decoration:none}
.legal:hover{color:var(--ink)}
.counter{font-family:var(--mono);font-size:12px;letter-spacing:.1em;color:var(--dim);white-space:nowrap}
.counter b{color:var(--ink);font-weight:400}
.next{display:grid;place-items:center;width:46px;height:46px;border-radius:50%;cursor:pointer;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.05);transition:background .3s}
.next:hover{background:rgba(255,255,255,.11)}
.next svg{transition:transform .5s var(--ease)}
.next[data-last="true"] svg{transform:rotate(180deg)}
.next .lbl-top,.next[data-last="true"] .lbl-next{display:none}
.next[data-last="true"] .lbl-top{display:inline}

.rail{position:fixed;top:50%;right:calc(var(--pad) * .4 - 10px);z-index:10;display:flex;flex-direction:column;transform:translateY(-50%)}
.rail a{display:grid;place-items:center;width:44px;height:44px}
.rail a::before{content:"";width:3px;height:14px;border-radius:2px;background:rgba(255,255,255,.22);transition:height .5s var(--ease),background .4s}
.rail a[aria-current]::before{height:34px;background:linear-gradient(var(--blue),var(--red))}

/* ------------------------------------------------------------- responsive */
@media (max-width:1100px){
  .panels{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:980px){
  .project,.contact{grid-template-columns:1fr}
  .phone{width:min(230px,62vw)}
  .glyph{width:min(46vw,24vh)}
}
@media (min-width:761px) and (max-height:860px){
  .step{padding-block:84px 76px}
  .display{margin-top:12px}
  .lede{margin-top:18px}
  .actions{margin-top:22px}
  .head{margin-bottom:18px}
  .panels{gap:12px}
  .panel{gap:6px;padding:16px 18px}
  .panel h3{font-size:18px}
  .panel p{font-size:14px;line-height:1.45}
  .techs{gap:10px 4px;margin-top:8px;padding-top:10px}
  .techs i{width:24px;height:24px}
  .facts{margin-top:18px}
  .facts div{padding:12px 16px}
  .status-row{margin-top:14px}
  .phone{width:min(250px,100%,calc((100vh - 200px) * .44))}
  .form{gap:10px;margin-top:16px;padding:16px 18px}
  .field textarea{min-height:72px}
}
@media (max-width:760px){
  .nav a:not([data-go="3"]){display:none}
  .top{height:64px;gap:12px;background:linear-gradient(var(--bg) 40%,transparent)}
  .step{padding:78px 40px 88px 20px}
  .panels{grid-template-columns:1fr;gap:10px}
  .panel{padding:16px 18px}
  .panel h3{font-size:18px}
  .panel p{font-size:14px}
  .techs{grid-template-columns:repeat(auto-fill,minmax(58px,1fr))}
  .techs i{width:26px;height:26px}
  .facts{grid-template-columns:1fr}
  .facts div+div{border-left:0;border-top:1px solid var(--line)}
  .project .phone{order:2;width:min(180px,48vw);margin-top:8px}
  /* the node count is fixed, so a small glyph packs its dots into a blob */
  .glyph{width:min(76vw,36vh)}
  .row{grid-template-columns:1fr}
  .form{padding:16px}
  .hud{height:64px;background:linear-gradient(transparent,var(--bg) 55%)}
  .legal .copy{display:none}
  .rail{right:-4px}
  .btn{height:50px;padding:0 20px}
}
@media (prefers-reduced-motion:reduce){
  .rise,.is-active .rise,.was-active .rise,.lang-swap .is-active .rise{transform:none;filter:none;transition:opacity .2s linear;transition-delay:0s}
  .langs .thumb{transition:none}
  .btn,.panel,.next svg{transition:none}
}
