/* Inovvity — mobile-first, breakpoints 768px (tablet) and 1100px (desktop). */

/* Fonts (self-hosted, latin subset, SIL OFL — see fonts/OFL.txt) */
@font-face{font-family:'Syne';font-style:normal;font-weight:600 800;font-display:swap;src:url(../fonts/syne.woff2) format('woff2')}
@font-face{font-family:'Instrument Serif';font-style:italic;font-weight:400;font-display:swap;src:url(../fonts/instrument-serif-italic.woff2) format('woff2')}
@font-face{font-family:'Figtree';font-style:normal;font-weight:400 600;font-display:swap;src:url(../fonts/figtree.woff2) format('woff2')}
@font-face{font-family:'JetBrains Mono';font-style:normal;font-weight:400 500;font-display:swap;src:url(../fonts/jetbrains-mono.woff2) format('woff2')}

/* Tokens */
:root{--bg:#0B0B0F;--s1:#131318;--s2:#1B1B22;--ln:rgba(255,255,255,.08);--ln2:rgba(255,255,255,.16);--tx:#F2F0EA;--tx2:#A9A8B3;--tx3:#85848F;--acc:#D4FF3A;--dsp:'Syne',sans-serif;--ser:'Instrument Serif',serif;--mono:'JetBrains Mono',monospace;color-scheme:dark}

/* Base */
*,*::before,*::after{box-sizing:border-box}
html{scroll-padding-top:84px;-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--tx);font-family:'Figtree',sans-serif;font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:clip}
a{color:var(--tx)}
a:hover{color:#fff}
a:focus-visible,button:focus-visible{outline:2px solid var(--acc);outline-offset:3px;border-radius:999px}
h1,h2,h3{margin:0;font-family:var(--dsp);font-weight:800;letter-spacing:-.03em;line-height:1;overflow-wrap:break-word}
p{margin:0}
.sr{font-family:var(--ser);font-style:italic;font-weight:400;letter-spacing:-.01em}
.acc{color:var(--acc)}
.wrap{max-width:1280px;margin:0 auto;padding:0 16px}
.pill{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border:1px solid var(--ln2);border-radius:999px;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--tx2)}
.dt{width:7px;height:7px;border-radius:50%;background:var(--acc);display:inline-block;flex:none}

/* Buttons */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:14px;min-height:56px;padding:0 8px 0 26px;border-radius:999px;font-weight:600;font-size:16px;text-decoration:none;transition:transform .2s,background .2s,border-color .2s}
.btn-p{background:var(--acc);color:#0B0B0F}
.btn-p:hover{transform:translateY(-2px);color:#0B0B0F}
.ci{width:40px;height:40px;border-radius:50%;background:#0B0B0F;color:var(--acc);display:inline-flex;align-items:center;justify-content:center;font-size:18px;transition:transform .25s}
.btn:hover .ci{transform:rotate(-45deg)}
.btn-g{border:1px solid var(--ln2);color:var(--tx);padding:0 26px}
.btn-g:hover{border-color:var(--tx);color:var(--tx)}

/* Nav */
.nav{position:sticky;top:0;z-index:30;padding:12px 12px 0}
.nav-in{max-width:1280px;margin:0 auto;display:flex;align-items:center;gap:4px;height:60px;padding:0 8px 0 22px;background:rgba(19,19,24,.85);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--ln);border-radius:999px}
.logo{display:inline-flex;align-items:center;min-height:44px;font-family:var(--dsp);font-weight:800;font-size:21px;letter-spacing:-.04em;text-decoration:none;color:var(--tx);margin-right:auto}
.logo i{font-style:normal;color:var(--acc)}
.nl{display:none;align-items:center;min-height:44px;padding:10px 16px;border-radius:999px;font-size:14px;font-weight:500;color:var(--tx2);text-decoration:none}
.nl:hover{background:var(--s2);color:var(--tx)}
.lang{display:inline-flex;align-items:center;justify-content:center;flex:none;width:44px;height:44px;margin-right:4px;border:1px solid var(--ln2);border-radius:50%;font-family:var(--mono);font-size:11px;letter-spacing:.08em;color:var(--tx2);text-decoration:none;transition:border-color .2s,color .2s}
.lang:hover{border-color:var(--tx);color:var(--tx)}
.nc{display:inline-flex;align-items:center;min-height:44px;padding:0 20px;border-radius:999px;background:var(--acc);color:#0B0B0F;font-weight:600;font-size:14px;text-decoration:none}
.nc:hover{color:#0B0B0F;background:#E4FF7A}
.d-only{display:none}

/* Hero */
.hero{padding:56px 0 72px}
/* minmax(0,1fr): an implicit auto column grew to the code lines' width (~560px) and pushed the hero off small screens. */
.hero-g{display:grid;grid-template-columns:minmax(0,1fr);gap:56px}
/* Phone sizes: a heading is never larger than its box width / its widest word's width per px of font
   (measured: hero "processes." 8.21, services "d’expertise," 8.73, cards "Développement" 12.52, steps "Conception" 9.2).
   The design sizes still apply wherever the widest word fits.
   Hero max = size at the 1440 design width: the spec's 94px pushed "processes." 38px under the code block from 1460px up. */
.hero h1{font-size:clamp(min(42px,(100vw - 32px) / 8.21),6.2vw,89.28px);margin:24px 0 28px}
.hero h1 .sr{font-size:1.1em;line-height:.9}
.lead{font-size:18px;color:var(--tx2);max-width:52ch}
.lead strong{color:var(--tx);font-weight:600}
.ctas{display:flex;flex-wrap:wrap;gap:12px;margin-top:36px}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:32px}

/* Hero code editor (decorative) */
.vis{position:relative;padding:32px 6px 48px}
.code{position:relative;background:var(--s1);border:1px solid var(--ln2);border-radius:24px;overflow:hidden}
.code-h{display:flex;align-items:center;gap:6px;padding:14px 18px;border-bottom:1px solid var(--ln);font-family:var(--mono);font-size:11px;color:var(--tx3)}
.code-h .d{width:10px;height:10px;border-radius:50%;background:var(--s2);border:1px solid var(--ln2)}
.code-h b{margin-left:10px;font-weight:400;color:var(--tx2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Decorative: scrolls by touch/trackpad without a scrollbar (classic Windows/Linux scrollbars drew a light bar across the block). */
.code-b{padding:16px 0;overflow-x:auto;scrollbar-width:none;font-family:var(--mono);font-size:12px;line-height:1.75;color:var(--tx2);counter-reset:ln}
.code-b::-webkit-scrollbar{display:none}
.cl{display:flex;white-space:pre;padding-right:16px}
/* Line numbers drawn by CSS: decorative (WCAG incidental text), kept out of the page text so they are neither read nor copied. */
.cl::before{counter-increment:ln;content:counter(ln);width:38px;flex:none;text-align:right;padding-right:14px;color:#55545E}
.k{color:var(--acc)}
.s{color:#E3C9A6}
.c{color:var(--tx3);font-style:italic}
.f{color:var(--tx)}
.mods{display:flex;flex-wrap:wrap;gap:6px;padding:14px 18px;border-top:1px solid var(--ln)}
.mod{padding:4px 10px;border-radius:999px;background:var(--s2);font-family:var(--mono);font-size:11px;color:var(--tx2)}
.mod.cus{background:var(--acc);color:#0B0B0F}
.float{position:absolute;top:10px;left:24px;z-index:2;display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:var(--s2);border:1px solid var(--ln2);color:var(--tx2);font-family:var(--mono);font-size:12px}

/* Stack band */
.mq{border-top:1px solid var(--ln);border-bottom:1px solid var(--ln);padding:28px 0;background:var(--s1)}
.mq .wrap{display:flex;flex-wrap:wrap;align-items:center;gap:16px 32px}
.mq-l{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--tx3)}
.mq-t{display:flex;flex-wrap:wrap;align-items:center;gap:8px 0}
.mq-t span{font-family:var(--dsp);font-weight:700;font-size:clamp(17px,1.6vw,22px);letter-spacing:-.01em;padding:0 14px;white-space:nowrap;line-height:1.3}
.mq-t .o{color:var(--tx2)}
.mq-t .x{color:var(--acc);padding:0;font-weight:400}

/* Services */
.sec{padding:96px 0}
.sec-h{display:grid;grid-template-columns:minmax(0,1fr);gap:28px;margin-bottom:48px}
.sec-h h2{font-size:clamp(min(36px,(100vw - 32px) / 8.73),5vw,72px);margin-top:20px;max-width:15ch}
.diff{background:var(--s1);border:1px solid var(--ln);border-radius:24px;padding:28px;align-self:end}
.diff .q{font-family:var(--ser);font-style:italic;font-size:26px;line-height:1.2;color:var(--tx);margin-bottom:14px}
.diff p{color:var(--tx2);font-size:15px}
.svcs{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}
.svc{display:grid;grid-template-columns:minmax(0,1fr);gap:28px;padding:28px 22px;border:1px solid var(--ln);border-radius:28px;background:var(--bg);transition:border-color .25s,background .25s}
.svc:hover{border-color:rgba(212,255,58,.5);background:var(--s1)}
.svc-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.svc-n{font-family:var(--mono);font-size:13px;font-weight:500;letter-spacing:.1em;line-height:1;color:var(--tx3);transition:color .25s}
.svc:hover .svc-n{color:var(--acc)}
.core{border-color:rgba(212,255,58,.55);color:var(--acc)}
.svc h3{font-size:clamp(min(28px,(100vw - 78px) / 12.55),3.2vw,46px);margin-top:20px}
.ben{font-size:17px;color:var(--tx2);margin-top:14px;max-width:46ch}
.tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px}
.tag{font-family:var(--mono);font-size:12px;padding:6px 12px;border-radius:999px;background:var(--s2);color:var(--tx2)}
.inc{background:var(--s2);border-radius:20px;padding:24px}
.inc-h{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--tx3)}
.inc ul{list-style:none;margin:16px 0 0;padding:0;display:grid;gap:12px}
.inc li{display:flex;gap:12px;align-items:baseline;font-size:15px;line-height:1.45}
.inc li::before{content:"";flex:none;width:8px;height:8px;border-radius:50%;background:var(--acc);transform:translateY(-1px)}
.svc-x{margin-top:16px;padding:20px 24px;border:1px dashed var(--ln2);border-radius:24px;font-size:15px;color:var(--tx2);display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center}
.svc-x b{font-family:var(--ser);font-style:italic;font-weight:400;font-size:22px;color:var(--acc)}

/* Process */
.proc-w{padding:0 12px}
.proc{max-width:1416px;margin:0 auto;background:var(--s1);border:1px solid var(--ln);border-radius:32px;padding:64px 0}
.proc h2{font-size:clamp(34px,4.4vw,64px);margin-top:20px}
.tl{list-style:none;margin:44px 0 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:32px;position:relative}
.tl::before{content:"";position:absolute;left:27px;top:28px;bottom:28px;width:1px;background:var(--ln2)}
/* align-content:start: without it a step with a shorter text gets its rows stretched and its title drops 12px. */
.st{position:relative;display:grid;grid-template-columns:56px minmax(0,1fr);gap:20px;align-content:start}
.st-c{position:relative;z-index:1;width:56px;height:56px;border-radius:50%;border:1px solid var(--acc);background:var(--s1);display:flex;align-items:center;justify-content:center;font-family:var(--dsp);font-weight:800;font-size:17px;color:var(--acc)}
.st:first-child .st-c{background:var(--acc);color:#0B0B0F}
.st h3{font-size:min(22px,(100vw - 134px) / 9.2);letter-spacing:-.02em;margin:12px 0 8px}
.st p{color:var(--tx2);font-size:15px}

/* Final CTA */
.cta-w{padding:80px 12px 0}
.cta{max-width:1416px;margin:0 auto;background:var(--s1);color:var(--tx);border:1px solid var(--ln2);border-radius:32px;padding:64px 24px}
.cta h2{font-size:clamp(42px,6.8vw,108px);line-height:.95;letter-spacing:-.04em;margin-top:24px;max-width:14ch}
.cta h2 .sr{white-space:nowrap}
.cta-b{display:flex;flex-direction:column;gap:20px;margin-top:44px;padding-top:32px;border-top:1px solid var(--ln)}
.micro{font-family:var(--mono);font-size:13px;line-height:1.7;color:var(--tx2)}

/* Footer + mobile sticky CTA */
.foot .wrap{display:flex;flex-direction:column;gap:4px;padding-top:28px;padding-bottom:28px;font-size:14px;color:var(--tx3)}
.foot a{color:var(--tx2);text-decoration:none;min-height:44px;display:inline-flex;align-items:center}
.foot a:hover{color:var(--tx)}
.mbar{position:sticky;bottom:0;z-index:31;padding:0 12px 12px;transition:opacity .25s,visibility .25s}
/* With JS, the bar waits until the hero buttons have left the screen: same action, and it partly covered them. */
.js .mbar:not(.on){opacity:0;visibility:hidden}
.mbar .btn{width:100%;justify-content:space-between;box-shadow:0 0 0 6px var(--bg)}

/* Motion: hero entrance on load (.rv) and scroll reveal (.reveal, js/main.js adds .in when it enters the viewport).
   .reveal is only hidden on screen, with JS running (html.js) and without reduced motion: content never stays invisible. */
@keyframes rise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
.rv,.js .reveal.in{animation:rise .8s cubic-bezier(.2,.7,.2,1) both;animation-delay:calc(var(--i,0) * 100ms)}
.hero h1{--i:1}.lead{--i:2}.ctas,.vis{--i:3}.chips{--i:4}
@media screen and (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}.js .reveal{opacity:0}
/* The process line draws itself (left→right, top→bottom on phones) once the first step is in. */
.js .tl::before{transform:scale(0);transform-origin:0 0;transition:transform 1.2s cubic-bezier(.2,.7,.2,1)}.js .tl:has(.in)::before{transform:none}}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}

/* Phones: focused elements scroll clear of the sticky contact bar (WCAG 2.4.11). */
@media (max-width:767px){html{scroll-padding-bottom:80px}}
/* Under 360px (iPhone SE 1st gen and alike): tighter paddings so the nav pill and the contact button keep one line. */
@media (max-width:359px){.nav-in{padding-left:16px}.lang{margin-right:0}.nc{padding:0 16px}.cta{padding-left:16px;padding-right:16px}.btn{gap:10px}}

@media (min-width:768px){
.wrap{padding:0 40px}
.nl{display:inline-flex}
.d-only{display:inline}
.m-only{display:none}
.mbar{display:none}
.svc{padding:40px}
.tl{grid-template-columns:repeat(2,minmax(0,1fr))}
.tl::before{display:none}
.foot .wrap{flex-direction:row;justify-content:space-between;align-items:center}
.code-b{font-size:12.5px}
}

@media (min-width:1100px){
.hero{padding:88px 0 104px}
.hero-g{grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:64px;align-items:center}
.hero h1{overflow-wrap:normal}
.sec{padding:136px 0}
.sec-h{grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:64px;align-items:end;margin-bottom:64px}
.svc{grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:56px;padding:48px 56px;align-items:center}
.svc:nth-child(even){grid-template-columns:minmax(0,5fr) minmax(0,7fr)}
.svc:nth-child(even) .inc{order:-1}
.proc{padding:96px 0 104px}
.tl{grid-template-columns:repeat(4,minmax(0,1fr));gap:32px}
.tl::before{display:block;left:28px;right:28px;top:28px;bottom:auto;width:auto;height:1px}
.st{grid-template-columns:minmax(0,1fr);gap:0}
.st h3{margin-top:28px}
.cta{padding:120px 80px;border-radius:48px}
.cta-b{flex-direction:row;align-items:center;justify-content:space-between}
}
