/* Palette built from the Space Codesign and SpaceStudio logos: sky #42AFE3 and slate #2D3E50.
   --blue is a darker sky that keeps white text above 5:1 contrast. */
:root{
  --ink:#1A2736;
  --ink-soft:#4E5D6E;
  --slate:#2D3E50;
  --slate-deep:#1C2A3A;
  --sky:#42AFE3;
  --sky-pale:#A9DCF4;
  --blue:#1170AE;
  --blue-deep:#0B5A8E;
  --tint:#EEF6FC;
  --rule:#D5E1EB;
  --white:#FFFFFF;
  --sans:"Schibsted Grotesk",system-ui,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,monospace;
  --wrap:1180px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--sans);color:var(--ink);background:var(--white);font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:inherit}
img{max-width:100%;display:block}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 32px}
:focus-visible{outline:3px solid var(--sky);outline-offset:3px;border-radius:4px}
[id]{scroll-margin-top:88px}

.btn{display:inline-flex;align-items:center;justify-content:center;font:500 16px/1 var(--sans);text-decoration:none;padding:15px 24px;border-radius:6px;border:1.5px solid transparent;transition:background .15s,border-color .15s;background:transparent;cursor:pointer}
.btn-primary{background:var(--blue);color:var(--white)}
.btn-primary:hover{background:var(--blue-deep)}
.btn-ghost{border-color:var(--slate);color:var(--slate)}
.btn-ghost:hover{background:var(--tint)}
.btn-light{background:var(--white);color:var(--blue-deep)}
.btn-light:hover{background:var(--tint)}
.btn-outline-light{border-color:rgba(255,255,255,.6);color:var(--white)}
.btn-outline-light:hover{border-color:var(--white);background:rgba(255,255,255,.08)}

/* Nav */
.nav{border-bottom:1px solid var(--rule);background:rgba(255,255,255,.96);backdrop-filter:blur(6px);position:sticky;top:0;z-index:10}
.nav .wrap{display:flex;align-items:center;justify-content:space-between;height:72px;gap:24px}
.logo{display:flex;align-items:center;text-decoration:none}
/* The company logo's heights keep the width the header's breakpoints were
   measured with. */
.logo img{height:36px;width:auto}
/* Links are lowercased in CSS only, so the markup keeps proper case for
   screen readers and search engines. A sky underline slides in on hover and
   stays under the current page; it is drawn with a transform, so it never
   shifts the layout the way a font-weight change would. */
.nav ul{display:flex;list-style:none;gap:30px;font-size:15.5px}
.nav ul a{position:relative;display:inline-block;padding:6px 0;text-decoration:none;text-transform:lowercase;color:var(--ink-soft);transition:color .2s ease}
.nav ul a::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;border-radius:2px;background:var(--sky);transform:scaleX(0);transform-origin:left;transition:transform .28s cubic-bezier(.2,.7,.2,1)}
.nav ul a:hover{color:var(--ink)}
.nav ul a:hover::after,.nav ul a[aria-current="page"]::after{transform:scaleX(1)}
.nav-right{display:flex;align-items:center;gap:20px;font-size:15px}
.nav-right .lang{text-decoration:none;text-transform:lowercase;color:var(--ink-soft);transition:color .2s ease}
.nav-right .lang:hover{color:var(--ink)}
.nav .btn{padding:11px 18px;font-size:15px}

/* Hero */
.hero{padding:88px 0 96px;background:linear-gradient(180deg,var(--white) 0%,var(--white) 55%,var(--tint) 100%)}
.hero .wrap{display:grid;grid-template-columns:1.05fr 1fr;gap:64px;align-items:center}
/* Without this, the code block's unwrapped lines widen the grid column past the viewport on phones. */
.hero .wrap > *{min-width:0}
.eyebrow{font-size:15px;font-weight:500;color:var(--blue);margin-bottom:18px}
/* The product's own logo introduces the product the hero describes. */
.hero-product{height:32px;width:auto;margin-bottom:28px}
/* Balanced lines, so a short last word never ends up alone on its line. */
.hero h1{font-size:clamp(38px,5vw,60px);line-height:1.05;letter-spacing:-.025em;font-weight:700;max-width:15ch;color:var(--slate);text-wrap:balance}
.hero h1 em{font-style:normal;color:var(--blue)}
.hero-sub{font-size:20px;line-height:1.55;color:var(--ink-soft);margin:24px 0 36px;max-width:36em}
.hero-actions{display:flex;gap:14px;flex-wrap:wrap}
.hero-note{margin-top:24px;font-size:15px;color:var(--ink-soft);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hero-note .pill{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;background:var(--tint);color:var(--blue-deep);border:1px solid var(--sky-pale);padding:3px 8px;border-radius:99px}
.hero-note a{color:var(--blue);font-weight:500}

.board{background:var(--slate-deep);border-radius:14px;padding:26px;color:#DCE6F0;box-shadow:0 24px 48px -24px rgba(28,42,58,.45)}
.code{font-family:var(--mono);font-size:13.5px;line-height:1.85;white-space:pre;overflow-x:auto;padding-bottom:20px;border-bottom:1px solid #2E4157}
.code .k{color:#8EA6BF}
.code .fn{border-radius:3px;padding:1px 3px;margin:0 -3px}
.code .hot{animation:hot 1s ease forwards 1.2s}
@keyframes hot{to{background:rgba(66,175,227,.2);color:#BFE6F8}}
.arch{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:20px}
.col{border:1px solid #33475E;border-radius:8px;padding:14px}
.col.fpga{border-color:#3A8DBA;background:rgba(66,175,227,.08)}
.col h3{font-size:13px;font-weight:500;color:#9DB1C6;margin-bottom:10px;display:flex;justify-content:space-between}
.col.fpga h3{color:var(--sky-pale)}
.chip{font-family:var(--mono);font-size:12.5px;padding:7px 10px;border-radius:5px;background:#26384C;margin-top:7px;color:#DCE6F0}
.col.cpu .chip.leaving{animation:leave .6s ease forwards 1.2s}
@keyframes leave{to{background:transparent;color:#5F7289;outline:1px dashed #3C5068}}
.col.fpga .chip{background:var(--blue);color:#F1F9FE;opacity:0;transform:translateX(-24px);animation:arrive .7s cubic-bezier(.2,.7,.2,1) forwards}
.col.fpga .chip:nth-of-type(1){animation-delay:1.5s}
.col.fpga .chip:nth-of-type(2){animation-delay:1.7s}
@keyframes arrive{to{opacity:1;transform:none}}
.status{margin-top:16px;font-size:13px;color:#9DB1C6;display:flex;align-items:center;gap:8px;opacity:0;animation:arrive .5s ease forwards 2.4s}
.status i{width:8px;height:8px;border-radius:50%;background:var(--sky);display:inline-block}
/* The deployment is in progress: the dot pulses once the status has appeared. */
.status i{animation:pulse 1.6s ease-in-out infinite 2.9s}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(66,175,227,.6)}50%{box-shadow:0 0 0 6px rgba(66,175,227,0)}}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .nav ul a::after{transition:none}
  .code .hot,.col.cpu .chip.leaving,.col.fpga .chip,.status{animation-duration:0s!important;animation-delay:0s!important}
  .status i{animation:none}
}

/* Trust: a slowly scrolling band of customer and partner logos, in their own
   colours (mostly blues, which sit well with the palette).
   Visitors who ask for reduced motion get a static, wrapped grid instead. */
.trust{border-top:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:48px 0 52px;background:var(--white)}
.trust-title{font-size:15px;font-weight:500;color:var(--blue);text-align:center;letter-spacing:.01em;margin-bottom:32px}
/* The loop holds two copies of the list and slides by one copy's width, so the
   band must stay narrower than one copy (about 2200px): on a wider screen, the
   end of the second copy scrolls into view before the loop restarts and leaves
   a blank stretch. Capping it also keeps it in line with the page content. */
.logos{max-width:1440px;margin:0 auto;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent)}
.logos-track{display:flex;width:max-content;animation:logos 70s linear infinite}
.logos ul{display:flex;align-items:center;gap:72px;padding-right:72px;list-style:none}
.logos li{flex:0 0 auto;display:flex;align-items:center;height:56px}
@keyframes logos{to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){
  .logos{-webkit-mask-image:none;mask-image:none}
  .logos-track{animation:none;width:auto;justify-content:center;padding:0 32px}
  .logos ul{flex-wrap:wrap;justify-content:center;gap:28px 56px;padding-right:0}
  .logos ul[aria-hidden]{display:none}
}

/* Sections */
section.block{padding:104px 0}
.section-head{max-width:660px;margin-bottom:56px}
.section-head h2{font-size:clamp(30px,3.4vw,42px);line-height:1.12;letter-spacing:-.02em;font-weight:700;color:var(--slate)}
.section-head p{font-size:19px;color:var(--ink-soft);margin-top:16px}
/* A heading that reads best on one line: only its intro keeps the narrow measure. */
.section-head.wide{max-width:none}
.section-head.wide p{max-width:660px}

/* Steps */
.steps{display:grid;grid-template-columns:repeat(3,1fr);counter-reset:step;border-top:2px solid var(--slate)}
.step{padding:28px 32px 0 0;counter-increment:step}
.step + .step{padding-left:32px;border-left:1px solid var(--rule)}
.step::before{content:counter(step,decimal-leading-zero);display:block;font-family:var(--mono);font-weight:500;font-size:14px;color:var(--blue);margin-bottom:18px}
.step h3{font-size:22px;letter-spacing:-.01em;margin-bottom:10px;color:var(--slate)}
.step p{color:var(--ink-soft)}

/* Benefits */
.benefits{background:var(--tint)}
.benefit-grid{display:grid;grid-template-columns:1fr 1fr;gap:52px 56px}
/* Each benefit: an icon tile beside its title and text. */
.benefit{display:grid;grid-template-columns:52px 1fr;column-gap:22px;align-items:start}
.benefit-icon{display:grid;place-items:center;width:52px;height:52px;border-radius:14px;background:var(--white);border:1px solid var(--sky-pale);color:var(--blue);box-shadow:0 10px 24px -18px rgba(28,42,58,.5)}
.benefit-icon svg{width:26px;height:26px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.benefit h3{font-size:22px;letter-spacing:-.01em;line-height:1.25;margin-bottom:10px;padding-top:12px;color:var(--slate)}
.benefit p{color:var(--ink-soft)}

/* New in 5.0: white section, light-blue cards. It sits between the tinted
   benefits section and the white solutions section, so it stays white and
   the cards carry the colour; #solutions gets a rule to separate the two. */
.release{background:var(--white)}
.new-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.new-item{background:var(--tint);border:1px solid var(--rule);border-radius:10px;padding:28px}
.new-item.lead{grid-column:span 2;background:linear-gradient(135deg,#D3ECFA 0%,var(--tint) 70%);border-color:var(--sky-pale)}
.new-item h3{font-size:19px;letter-spacing:-.01em;margin-bottom:8px;color:var(--slate)}
.new-item.lead h3{font-size:24px;color:var(--blue-deep)}
.new-item p{color:var(--ink-soft);font-size:16px}
.new-item.lead p{font-size:17px;max-width:38em}
#solutions{border-top:1px solid var(--rule)}

/* Solutions */
/* The two toolkits side by side, then the four other cards in a row. */
.toolkits{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:20px}
.solutions-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
.sol{border:1px solid var(--rule);border-radius:10px;padding:30px;display:flex;flex-direction:column;text-decoration:none;transition:border-color .15s}
a.sol:hover{border-color:var(--blue)}
.sol h3{font-size:21px;line-height:1.25;letter-spacing:-.01em;margin-bottom:10px;color:var(--slate)}
.sol p{color:var(--ink-soft);font-size:16px;flex:1}
.sol .more{margin-top:20px;font-weight:500;color:var(--blue);font-size:15px}
.sol.feature{background:var(--blue);color:var(--white);border-color:var(--blue);padding:36px}
.sol.feature .based{margin-top:22px;font-size:14px;color:#DCEEFA;padding-top:16px;border-top:1px solid rgba(255,255,255,.22)}
.sol.feature .based strong{color:var(--white);font-weight:500}
.sol.feature .more{margin-top:14px}
a.sol.feature:hover{background:var(--blue-deep);border-color:var(--blue-deep)}
.sol.feature h3{color:var(--white);font-size:28px;line-height:1.15;margin-bottom:14px}
.sol.feature p{color:#DCEEFA}
.sol.feature .more{color:var(--white)}
.sol.feature .tag{align-self:flex-start;font-size:13px;font-weight:500;background:var(--white);color:var(--blue-deep);padding:5px 10px;border-radius:4px;margin-bottom:22px}

/* Quotes */
.quotes{border-top:1px solid var(--rule)}
.quote-grid{display:grid;grid-template-columns:1fr 1fr;gap:72px}
blockquote{border-left:3px solid var(--sky);padding-left:28px}
blockquote p{font-size:22px;line-height:1.45;letter-spacing:-.01em;color:var(--slate)}
blockquote footer{margin-top:22px;font-size:15px;color:var(--ink-soft)}
blockquote footer strong{display:block;color:var(--ink);font-weight:500;font-size:16px}

/* Resources: a grid of cards, each previewing what it opens, all with
   previews of the same height: the video and the documentation share the
   first row, the three others the second. PDFs show their first page as a
   sheet of paper. */
.resources{background:var(--tint)}
.res-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:24px}
.res-card{display:flex;flex-direction:column;background:var(--white);border:1px solid var(--rule);border-radius:14px;overflow:hidden;text-decoration:none;color:inherit;transition:transform .25s ease,box-shadow .25s ease,border-color .25s ease}
.res-card:hover{transform:translateY(-4px);box-shadow:0 24px 44px -26px rgba(28,42,58,.5);border-color:var(--sky-pale)}
.res-card{grid-column:span 2}
.res-video,.res-docs{grid-column:span 3}
.res-media{position:relative;display:block;overflow:hidden;background:var(--tint);height:220px;border-bottom:1px solid var(--rule)}
.res-media img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.res-card:hover .res-media img{transform:scale(1.03)}
.res-docs .res-media img{object-position:top left}
.res-media.paper{background:linear-gradient(160deg,#D6ECFA 0%,var(--tint) 70%)}
.res-media.paper img{position:absolute;left:50%;top:24px;width:56%;height:auto;object-fit:initial;border-radius:3px;transform:translateX(-50%) rotate(-2deg);box-shadow:0 16px 32px -14px rgba(28,42,58,.5)}
.res-card:hover .res-media.paper img{transform:translateX(-50%) translateY(-6px) rotate(0)}
.res-media.banner{background:var(--white)}
.res-media.banner img{object-fit:contain;padding:28px}
/* The video and documentation cards must read as what they open, not as
   two more screenshots: the preview is dimmed like a poster, under a large
   white button (play, or an open book) and a badge (running time, or the
   documentation site). */
.res-video .res-media::before,.res-docs .res-media::before{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(180deg,rgba(20,30,42,.25) 0%,rgba(20,30,42,.62) 100%);transition:background .25s ease}
.res-video:hover .res-media::before,.res-docs:hover .res-media::before{background:linear-gradient(180deg,rgba(20,30,42,.15) 0%,rgba(20,30,42,.5) 100%)}
.res-media .play,.res-media .open{position:absolute;z-index:2;left:50%;top:50%;width:72px;height:72px;margin:-36px 0 0 -36px;border-radius:50%;background:var(--white);box-shadow:0 0 0 10px rgba(255,255,255,.22),0 14px 34px -8px rgba(0,0,0,.55);transition:transform .25s ease,box-shadow .25s ease}
.res-media .play::after{content:"";position:absolute;left:29px;top:22px;border-left:22px solid var(--blue);border-top:14px solid transparent;border-bottom:14px solid transparent}
.res-video:hover .play,.res-docs:hover .open{transform:scale(1.08);box-shadow:0 0 0 16px rgba(255,255,255,.18),0 14px 34px -8px rgba(0,0,0,.55)}
.res-media .duration,.res-media .site{position:absolute;z-index:2;right:14px;bottom:14px;display:flex;align-items:center;gap:7px;background:rgba(20,30,42,.85);color:var(--white);font:500 13px/1 var(--mono);padding:7px 9px;border-radius:5px}
.res-media .open svg{position:absolute;left:50%;top:50%;width:30px;height:30px;margin:-15px 0 0 -15px;fill:none;stroke:var(--blue);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.res-media .site{font-family:var(--sans);font-size:13.5px}
.res-media .duration::before{content:"";border-left:8px solid var(--white);border-top:5px solid transparent;border-bottom:5px solid transparent}
.res-icon{position:absolute;z-index:2;left:14px;top:14px;width:40px;height:40px;border-radius:10px;background:rgba(255,255,255,.95);border:1px solid var(--sky-pale);display:grid;place-items:center;color:var(--blue)}
.res-icon svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.res-text{display:flex;flex-direction:column;gap:6px;padding:22px 24px 24px}
.res-text h3{font-size:19px;line-height:1.3;letter-spacing:-.01em;color:var(--slate)}
.res-desc{font-size:15px;color:var(--ink-soft)}
.res-text .more{margin-top:8px;font-size:15px;font-weight:500;color:var(--blue)}
.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}

/* CTA */
.cta{background:var(--blue);color:var(--white);padding:96px 0}
/* The heading spans the whole width so it reads on one line; the text and
   the buttons share the row below it. The text's wrapper steps aside
   (display:contents) so the heading and the text are both grid items. */
.cta .wrap{display:grid;grid-template-columns:1.2fr 1fr;column-gap:48px;row-gap:16px;align-items:end}
.cta .wrap > div:first-child{display:contents}
.cta h2{grid-column:1/-1;font-size:clamp(32px,4vw,48px);line-height:1.08;letter-spacing:-.02em}
.cta p{font-size:19px;color:#DCEEFA;max-width:30em}
.cta-actions{display:flex;gap:14px;flex-wrap:wrap;justify-content:flex-end}

/* Footer */
footer.site{padding:56px 0 40px;font-size:15px;color:var(--ink-soft)}
.foot-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:40px;padding-bottom:40px;border-bottom:1px solid var(--rule)}
.foot-grid h3{font-size:15px;color:var(--ink);font-weight:500;margin-bottom:12px}
.foot-grid ul{list-style:none;display:grid;gap:8px}
.foot-grid a{text-decoration:none}
.foot-grid a:hover{color:var(--ink);text-decoration:underline}
.foot-about p{max-width:30em;margin-top:16px}
.foot-bottom{display:flex;justify-content:space-between;padding-top:24px;flex-wrap:wrap;gap:12px}
.foot-bottom a{text-decoration:none}
.foot-bottom a:hover{text-decoration:underline}

/* Cookie banner: a bar along the bottom of the screen until the visitor
   chooses. Accepting and declining are buttons of the same size, since
   declining must be as easy as accepting. */
.consent{position:fixed;left:0;right:0;bottom:0;z-index:20;background:var(--white);border-top:1px solid var(--rule);box-shadow:0 -10px 30px -12px rgba(20,30,42,.25)}
.consent[hidden]{display:none}
.consent .wrap{display:flex;align-items:center;gap:16px 40px;padding-top:20px;padding-bottom:20px;flex-wrap:wrap}
.consent p{flex:1 1 30em;font-size:15px;line-height:1.55;color:var(--ink-soft)}
.consent-actions{display:flex;gap:12px}
.consent .btn{padding:11px 22px;font-size:15px;min-width:110px}

/* Nav: current page and the phone menu */
.nav ul a[aria-current="page"]{color:var(--ink)}
.menu-toggle{display:none;font:500 15px/1 var(--sans);color:var(--slate);background:none;border:1.5px solid var(--rule);border-radius:6px;padding:10px 14px;cursor:pointer}
.menu-toggle:hover{border-color:var(--slate)}
.nav ul .menu-only{display:none}
/* Nothing in the header may wrap or shrink: below the width they need, the
   links collapse behind the Menu button instead (see the 1114px query). */
.nav ul a,.nav .btn,.nav-right .lang{white-space:nowrap}
.nav ul,.nav-right,.nav .logo{flex-shrink:0}
.nav .btn-trial[aria-current="page"]{border-color:var(--blue);color:var(--blue)}

/* Inner pages */
.page-hero{padding:80px 0 72px;background:linear-gradient(180deg,var(--white) 0%,var(--tint) 100%);border-bottom:1px solid var(--rule)}
.page-hero h1{font-size:clamp(36px,4.6vw,56px);line-height:1.06;letter-spacing:-.025em;font-weight:700;color:var(--slate);max-width:18ch}
.page-hero .lead{font-size:20px;line-height:1.55;color:var(--ink-soft);margin-top:22px;max-width:38em}
.page-hero .hero-actions{margin-top:32px}
/* "Not found" pages: the hero fills most of the screen, so the footer
   doesn't ride up; a row of links to the main pages sits under the buttons. */
.not-found{min-height:calc(100vh - 73px - 120px);display:flex;align-items:center}
.not-found .wrap{width:100%}
.nf-links{list-style:none;display:flex;flex-wrap:wrap;gap:12px 28px;margin-top:36px;padding-top:24px;border-top:1px solid var(--rule)}
.nf-links a{color:var(--blue);font-weight:500;text-decoration:none}
.nf-links a:hover{text-decoration:underline}

.svc-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.svc{border:1px solid var(--rule);border-radius:10px;padding:28px;background:var(--white)}
.svc-icon{display:grid;place-items:center;width:48px;height:48px;border-radius:12px;background:var(--tint);border:1px solid var(--sky-pale);color:var(--blue);margin-bottom:20px}
.svc-icon svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.svc h3{font-size:20px;letter-spacing:-.01em;line-height:1.25;margin-bottom:10px;color:var(--slate)}
.svc p{color:var(--ink-soft);font-size:16px}

.adv-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:40px 56px}
.adv h3{font-size:19px;letter-spacing:-.01em;margin-bottom:8px;color:var(--slate);padding-top:18px;border-top:2px solid var(--sky)}
.adv p{color:var(--ink-soft);font-size:16px}

.story{display:grid;grid-template-columns:1fr 2.4fr;gap:64px;align-items:start}
.story h2{font-size:clamp(28px,3vw,36px);line-height:1.15;letter-spacing:-.02em;color:var(--slate)}
.story-text p{font-size:19px;line-height:1.65;color:var(--ink)}
.story-text p + p{margin-top:20px}
/* Key figures sit under the heading, so the left column isn't left blank
   beside the long story text. */
.facts{display:grid;grid-template-columns:1fr;border-top:2px solid var(--slate);margin-top:36px;max-width:300px}
.fact{padding:22px 0}
.fact + .fact{border-top:1px solid var(--rule)}
.fact strong{display:block;font-size:34px;letter-spacing:-.02em;line-height:1.1;color:var(--blue)}
.fact span{display:block;margin-top:8px;color:var(--ink-soft);font-size:16px}

/* Team: one card per person, with a small round portrait beside the name,
   title and degree, and the bio across the full card below. */
.team-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;max-width:1040px}
.member{display:grid;grid-template-columns:112px 1fr;column-gap:24px;align-items:center;background:var(--white);border:1px solid var(--rule);border-radius:12px;padding:32px}
.member img{grid-column:1;grid-row:1/4;width:112px;height:112px;border-radius:50%;object-fit:cover;background:var(--rule);box-shadow:0 0 0 4px var(--white),0 0 0 5px var(--sky-pale)}
.member h3{grid-column:2;align-self:end;font-size:21px;letter-spacing:-.01em;color:var(--slate)}
.member .role{grid-column:2;font-size:15px;color:var(--blue);font-weight:500;margin-top:2px}
.member .cred{grid-column:2;align-self:start;font-size:14px;color:var(--ink-soft);margin-top:2px}
.member p.bio{grid-column:1/-1;color:var(--ink-soft);font-size:16px;margin-top:24px;padding-top:20px;border-top:1px solid var(--rule)}
/* The LinkedIn logo, in LinkedIn's blue, as the link to each profile. */
.member .in{grid-column:1/-1;justify-self:start;margin-top:16px;display:inline-flex;color:#0A66C2;border-radius:4px;transition:opacity .15s}
.member .in svg{width:28px;height:28px;fill:currentColor}
.member .in:hover{opacity:.8}

/* Overlays (site.js): videos and PDFs open over a dimmed page.
   margin:auto is what centres a modal dialog; the global reset removes it. */
.video-dialog,.pdf-dialog{margin:auto;padding:0;border:0;max-width:none;max-height:none}
.video-dialog::backdrop,.pdf-dialog::backdrop{background:rgba(20,30,42,.8)}
html:has(.video-dialog[open]),html:has(.pdf-dialog[open]){overflow:hidden}
.overlay-close{width:40px;height:40px;border-radius:50%;border:0;font:400 26px/1 var(--sans);cursor:pointer;transition:background .15s;flex-shrink:0}

/* Video: a 16:9 player with the close button above it. Its width is also
   capped by the height, so both fit on a phone held sideways. */
.video-dialog{background:transparent;width:min(960px,calc(100vw - 32px),calc((100vh - 140px) * 16 / 9));overflow:visible}
.video-dialog .overlay-body{position:relative;aspect-ratio:16/9;background:#000;border-radius:12px;overflow:hidden;box-shadow:0 30px 60px -20px rgba(0,0,0,.6)}
.video-dialog iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.video-dialog .overlay-close{position:absolute;top:-52px;right:0;background:rgba(255,255,255,.16);color:var(--white)}
.video-dialog .overlay-close:hover{background:rgba(255,255,255,.3)}

/* PDF: a large panel, a slim title bar, and the browser's own PDF viewer. */
.pdf-dialog{width:min(1100px,calc(100vw - 48px));height:calc(100vh - 48px);border-radius:12px;overflow:hidden;background:var(--white);box-shadow:0 30px 60px -20px rgba(0,0,0,.6)}
.pdf-dialog[open]{display:flex;flex-direction:column}
.pdf-bar{display:flex;align-items:center;gap:18px;padding:10px 12px 10px 24px;border-bottom:1px solid var(--rule)}
.pdf-title{flex:1;min-width:0;font-weight:500;color:var(--slate);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pdf-open{font-size:15px;font-weight:500;color:var(--blue);white-space:nowrap;text-decoration:none}
.pdf-open:hover{text-decoration:underline}
.pdf-dialog .overlay-close{width:36px;height:36px;font-size:24px;background:var(--tint);color:var(--slate)}
.pdf-dialog .overlay-close:hover{background:var(--rule)}
.pdf-dialog .overlay-body{flex:1;background:#525659}
.pdf-dialog iframe{display:block;width:100%;height:100%;border:0}

/* Contact */
.hq{font-style:normal;font-size:17px;line-height:1.65;color:var(--ink-soft);padding:18px 0;border-top:2px solid var(--slate);border-bottom:1px solid var(--rule)}
.hq strong{display:block;color:var(--ink);font-weight:500}
.hq-row{display:flex;justify-content:space-between;align-items:baseline;padding:16px 0;border-bottom:1px solid var(--rule);font-size:17px}
.hq-row span{color:var(--ink-soft);font-size:15px}
.hq-row a{color:var(--blue);font-weight:500;text-decoration:none}
.hq-row a:hover{text-decoration:underline}

/* Trial request */
.trial-layout{display:grid;grid-template-columns:1.5fr 1fr;gap:64px;align-items:start}
.form-card{display:grid;grid-template-columns:1fr 1fr;gap:22px 20px;background:var(--white);border:1px solid var(--rule);border-radius:12px;padding:36px;box-shadow:0 24px 48px -32px rgba(28,42,58,.35)}
.field{display:flex;flex-direction:column;gap:7px;min-width:0}
.field.wide{grid-column:1/-1}
.field label{font-size:15px;font-weight:500;color:var(--slate)}
.field .optional{font-weight:400;color:var(--ink-soft);font-size:14px;margin-left:6px}
.field input,.field select,.field textarea{font:400 16px/1.4 var(--sans);color:var(--ink);background:var(--white);border:1.5px solid var(--rule);border-radius:6px;padding:11px 13px;width:100%;transition:border-color .15s,box-shadow .15s}
.field textarea{resize:vertical;min-height:110px}
.field select{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--slate) 50%),linear-gradient(135deg,var(--slate) 50%,transparent 50%);background-position:calc(100% - 20px) 50%,calc(100% - 15px) 50%;background-size:5px 5px;background-repeat:no-repeat;padding-right:40px}
.field input:hover,.field select:hover,.field textarea:hover{border-color:#B9CCDB}
.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--sky);box-shadow:0 0 0 3px rgba(66,175,227,.22)}
/* Flag invalid fields only once the visitor has typed in them. */
.field input:user-invalid,.field select:user-invalid{border-color:#C2410C}
.field .help{font-size:14px;color:var(--ink-soft)}
.field code{font-family:var(--mono);font-size:13px;background:var(--tint);padding:1px 5px;border-radius:4px;color:var(--slate)}
.field.submit{margin-top:6px}
.field.submit .btn{align-self:flex-start;padding:16px 28px}
.field.submit .btn[disabled]{opacity:.65;cursor:progress}
.hp{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}

/* Outcome messages: shown by :target, from the URL fragment the form handler
   sends the visitor to (or that site.js sets after submitting with fetch). */
.form-status{display:none;border-radius:10px;padding:20px 24px;margin-bottom:24px;font-size:16px}
.form-status:target{display:block}
.form-status.ok{background:var(--tint);border:1px solid var(--sky-pale);padding:32px}
.form-status.ok h2{font-size:26px;letter-spacing:-.015em;color:var(--slate);margin-bottom:10px}
.form-status.ok p{color:var(--ink-soft)}
.form-status.err{background:#FFF4ED;border:1px solid #F6C9A8;color:#7C2D12}
.form-status a{color:inherit;font-weight:500}
.form-status.ok a{color:var(--blue)}
#sent:target ~ .form-card{display:none}

.trial-aside{position:sticky;top:104px}
.trial-aside h2{font-size:22px;letter-spacing:-.01em;color:var(--slate);margin-bottom:18px}
.needs{list-style:none;border-top:2px solid var(--slate)}
.needs li{padding:16px 0 16px 30px;border-bottom:1px solid var(--rule);color:var(--ink-soft);font-size:16px;position:relative}
.needs li::before{content:"";position:absolute;left:4px;top:23px;width:12px;height:7px;border-left:2px solid var(--blue);border-bottom:2px solid var(--blue);transform:rotate(-45deg)}
.needs strong{color:var(--ink);font-weight:500}
.aside-link{margin-top:16px;font-size:15px}
.aside-link a{color:var(--blue);font-weight:500}
.aside-demo{margin-top:36px;padding:26px;background:var(--tint);border-radius:10px}
.aside-demo h3{font-size:18px;color:var(--slate);margin-bottom:6px}
.aside-demo p{font-size:15px;color:var(--ink-soft);margin-bottom:16px}

/* The full header needs 1034px in English and 1114px in French (measured);
   below that, the links collapse behind the Menu button. */
@media (max-width:1114px){
  .menu-toggle{display:inline-block}
  .nav ul{display:none}
  .nav.open ul{display:flex;flex-direction:column;gap:0;position:absolute;top:72px;left:0;right:0;background:var(--white);border-bottom:1px solid var(--rule);padding:8px 32px 16px;box-shadow:0 16px 24px -16px rgba(28,42,58,.25)}
  .nav.open ul li{border-top:1px solid var(--rule)}
  .nav.open ul li:first-child{border-top:0}
  .nav.open ul a{display:block;padding:14px 0;font-size:17px;color:var(--ink)}
  .nav.open ul a::after{display:none}
  .nav.open ul a[aria-current="page"]{color:var(--blue)}
  .nav ul .menu-only{display:block}
}
@media (max-width:960px){
  .svc-grid,.adv-grid{grid-template-columns:1fr 1fr}
  .story{grid-template-columns:1fr;gap:36px}
  .team-grid{grid-template-columns:1fr;max-width:640px}
  .facts{grid-template-columns:1fr 1fr;max-width:none;margin-top:28px}
  .fact + .fact{border-top:0;border-left:1px solid var(--rule);padding-left:28px}
  .page-hero{padding:56px 0 56px}
  .trial-layout{grid-template-columns:1fr;gap:48px}
  .trial-aside{position:static}
  .hero .wrap,.cta .wrap,.quote-grid{grid-template-columns:1fr}
  .res-grid{grid-template-columns:1fr 1fr}
  .res-card,.res-docs{grid-column:auto}
  .res-video{grid-column:span 2}
  .hero{padding:56px 0 72px}
  .steps{grid-template-columns:1fr;border-top:0}
  .step,.step + .step{padding:24px 0;border-left:0;border-top:1px solid var(--rule)}
  .benefit-grid{grid-template-columns:1fr;gap:36px}
  .new-grid{grid-template-columns:1fr}
  .new-item.lead{grid-column:auto}
  .toolkits{grid-template-columns:1fr}
  .solutions-grid{grid-template-columns:1fr 1fr}
  .quote-grid{gap:48px}
  .cta-actions{justify-content:flex-start;margin-top:16px}
  .foot-grid{grid-template-columns:1fr 1fr}
  .foot-about{grid-column:1/-1}
  section.block{padding:72px 0}
}
/* Both are in the Menu, and the bar can't hold them next to Book a demo. */
@media (max-width:760px){
  .nav-right .lang,.nav .btn-trial{display:none}
}
@media (max-width:520px){
  .consent-actions{width:100%}
  .consent .btn{flex:1}
  .wrap{padding:0 16px}
  .nav .wrap{gap:12px}
  .nav-right{gap:8px}
  .logo img{height:27px}
  .nav .btn{padding:10px 12px;font-size:14px;white-space:nowrap}
  .menu-toggle{padding:9px 11px;font-size:14px}
  .nav.open ul{padding:8px 16px 16px}
  .trust{padding:40px 0 44px}
  .trust-title{padding:0 8px;margin-bottom:24px}
  .logos ul{gap:48px;padding-right:48px}
  .logos img{transform:scale(.85)}
  .svc-grid,.adv-grid,.team-grid,.solutions-grid{grid-template-columns:1fr}
  .member{grid-template-columns:80px 1fr;column-gap:18px;padding:24px 20px}
  .benefit{grid-template-columns:44px 1fr;column-gap:16px}
  .benefit-icon{width:44px;height:44px;border-radius:12px}
  .benefit-icon svg{width:22px;height:22px}
  .benefit h3{font-size:20px;padding-top:9px}
  .member img{width:80px;height:80px}
  .member h3{font-size:19px}
  .form-card{grid-template-columns:1fr;padding:24px 20px}
  .facts{grid-template-columns:1fr}
  .fact + .fact{border-left:0;padding-left:0;border-top:1px solid var(--rule)}
  .board{padding:18px}
  .code{font-size:12px}
  .arch{grid-template-columns:1fr}
  .res-grid{grid-template-columns:1fr;gap:18px}
  .res-video{grid-column:auto}
  blockquote{padding-left:20px}
  blockquote p{font-size:19px}
}
/* The narrowest phones (320px) can't fit the logo, "Réserver une démo" and
   the word "Menu": shrink the first two a little and draw Menu as an icon. The
   word stays in the markup, so screen readers still announce it. */
@media (max-width:400px){
  .logo img{height:21px}
  .nav .wrap{padding:0 12px}
  .nav .btn{padding:9px 10px;font-size:13.5px}
  .menu-toggle{position:relative;width:40px;height:38px;padding:0;font-size:0}
  .menu-toggle::before{content:"";position:absolute;left:11px;right:11px;top:13px;height:2px;border-radius:1px;background:var(--slate);box-shadow:0 5px 0 var(--slate),0 10px 0 var(--slate)}
}
