:root{
  /* True neutral black, not navy-tinted — the old --bg/--surface (#05070F /
     #0D1226) carried a deliberate blue tint that read as "dark grey" next
     to the pure #000 already used on Hero/Partners/Footer. These are now
     genuinely neutral so every dark section matches those exactly. */
  --bg:#000000;
  --surface:#0D0D0D;
  --surface-2:#181818;
  --border:#282828;
  --text:#EDEFF7;
  --text-muted:#8B93B0;
  --text-dim:#5A6382;
  --accent:#4C7CFF;
  --accent-2:#34E0C4;
  --accent-soft:rgba(76,124,255,0.12);
  --radius:14px;
  --maxw:1240px;
}
*{box-sizing:border-box;}
/* Global visible focus state for keyboard users. Specific components with
   their own focus treatment (form inputs, lead/gallery photos) declare a
   more specific selector below, which wins on specificity and overrides
   this baseline — this rule exists so every other interactive element
   (nav buttons, dropdown triggers, theme toggle, back-to-top, carousel
   arrows, plain links) gets a clear, on-brand focus ring instead of
   relying on whatever the browser default happens to render, which can
   get clipped by rounded/overflow-hidden containers. */
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible, [tabindex]:focus-visible{
  outline:2px solid var(--accent); outline-offset:2px; border-radius:4px;
}
html{scroll-behavior:smooth; overflow-x:hidden; max-width:100%;}
body{
  margin:0;
  background:var(--bg);
  color:var(--text);
  font-family:'Inter', sans-serif;
  font-weight:430;
  font-size:16px;
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
h1,h2,h3,h4{
  font-family:'Inter', sans-serif;
  font-weight:650;
  line-height:1.15;
  margin:0;
  letter-spacing:-0.02em;
}
/* Left-aligned (ragged-right) body copy. An earlier round tried justified
   text so both edges lined up, but justify stretches word-spacing to hit
   the right edge on every line — inside this site's many narrow card/column
   widths, a line with only a couple of words gets its gaps stretched very
   wide, reading as random huge gaps. Left-aligned avoids that everywhere,
   not just below a breakpoint. */
p{margin:0;}
a{color:inherit;text-decoration:none;}
img{max-width:100%;display:block;}
.mono{font-family:'JetBrains Mono', monospace;}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 32px; position:relative; z-index:1;}
section{position:relative; overflow:hidden;}
::selection{background:var(--accent);color:#000000;}

/* Reduced motion */
@media (prefers-reduced-motion: reduce){
  *{animation-duration:0.001ms !important; animation-iteration-count:1 !important; transition-duration:0.001ms !important; scroll-behavior:auto !important;}
}

/* Scroll reveal — retuned to a slower, "premium corporate" cadence: a
   650ms duration with a gentle settle-in curve (cubic-bezier(.22,1,.36,1) —
   overshoots slightly then eases to rest, reads as deliberate rather than
   mechanical) and a full 35px of travel so the motion is unmistakable even
   on a fast scroll, not just a barely-visible flicker. */
.reveal{opacity:0; transform:translateY(35px); transition:opacity .65s cubic-bezier(.22,1,.36,1), transform .65s cubic-bezier(.22,1,.36,1);}
.reveal.is-visible{opacity:1; transform:translateY(0);}

/* Scroll reveal — "pop" variant (individually staggered cards): 600ms with
   the same settle-in curve, 38px of travel. Stagger delay between siblings
   is 100ms (set via inline transition-delay in the markup) — enough for
   each card's arrival to actually register as a separate beat rather than
   all of them landing in the same instant. */
.reveal.pop{
  transform:translateY(38px);
  transition:opacity .6s cubic-bezier(.22,1,.36,1), transform .6s cubic-bezier(.22,1,.36,1);
}
.reveal.pop.is-visible{transform:translateY(0);}

/* ---------- INTRO SPLASH ---------- */
html.intro-lock, html.intro-lock body{overflow:hidden; height:100%;}
html.lightbox-lock, html.lightbox-lock body{overflow:hidden; height:100%;}
.intro-splash{
  --ix:50%; --iy:50%;
  position:fixed; inset:0; z-index:10000; background:#000;
  display:flex; align-items:center; justify-content:center; overflow:hidden; cursor:pointer;
  clip-path:circle(150% at var(--ix) var(--iy));
  transition:clip-path 1.05s cubic-bezier(.65,0,.35,1), filter 1.05s ease;
}
.intro-splash.dismissed{clip-path:circle(0% at var(--ix) var(--iy)); filter:brightness(1.4) saturate(1.3); pointer-events:none;}
.intro-splash.dismissed .intro-content{opacity:0; transform:scale(.92); transition:opacity .4s ease, transform .4s ease;}
.intro-video-wrap{position:absolute; inset:0; overflow:hidden; pointer-events:none;}
.intro-video-wrap video{
  position:absolute; top:50%; left:50%; transform:translate(-50%,-50%) scale(1.02);
  width:100vw; height:56.25vw; min-height:100vh; min-width:177.78vh;
  object-fit:cover; border:0; filter:grayscale(25%) brightness(.8) contrast(1.05);
  animation:introKenBurns 22s ease-in-out infinite alternate;
}
.intro-video-wrap video::-webkit-media-controls,
.intro-video-wrap video::-webkit-media-controls-start-playback-button,
.intro-video-wrap video::-webkit-media-controls-panel{
  display:none !important;
  -webkit-appearance:none;
}
@keyframes introKenBurns{from{transform:translate(-50%,-50%) scale(1.02);} to{transform:translate(-50%,-50%) scale(1.14);}}
.intro-overlay{
  position:absolute; inset:0;
  background:radial-gradient(ellipse 70% 55% at 50% 48%, rgba(0,0,0,.35) 0%, rgba(0,0,0,.86) 78%),
             linear-gradient(180deg, rgba(0,0,0,.75) 0%, rgba(0,0,0,.35) 30%, rgba(0,0,0,.55) 70%, rgba(0,0,0,.92) 100%);
}
.intro-content{position:relative; z-index:1; text-align:center; padding:0 24px;}
.intro-brand{
  display:flex; align-items:center; justify-content:center; gap:12px;
  font-family:'Inter',sans-serif; font-weight:600; font-size:clamp(28px,5vw,44px); color:var(--text);
  opacity:0; animation:fadeUp .9s cubic-bezier(.2,.7,.2,1) .2s forwards;
}
.intro-mark{height:clamp(38px,5.5vw,56px); width:auto; object-fit:contain; filter:drop-shadow(0 0 14px rgba(52,224,196,.45));}
.intro-tag{
  margin-top:14px; font-size:clamp(14px,2vw,18px); color:var(--text-muted); font-family:'Inter',sans-serif; letter-spacing:.02em;
  opacity:0; animation:fadeUp .9s cubic-bezier(.2,.7,.2,1) .45s forwards;
}
.intro-hint{
  margin-top:38px; display:inline-flex; align-items:center; gap:8px;
  font-family:'JetBrains Mono',monospace; font-size:11.5px; font-weight:500; letter-spacing:.14em; text-transform:uppercase;
  color:var(--text-dim); opacity:0; animation:fadeUp .9s cubic-bezier(.2,.7,.2,1) .8s forwards, introHintPulse 2.2s ease-in-out 1.8s infinite;
}
.intro-hint svg{width:14px; height:14px; stroke:currentColor; animation:introHintBob 1.6s ease-in-out 1.8s infinite;}
@keyframes introHintPulse{0%,100%{opacity:.55;} 50%{opacity:1;}}
@keyframes introHintBob{0%,100%{transform:translateY(0);} 50%{transform:translateY(3px);}}
/* Landing with a #section link in the URL (e.g. About from another page)
   skips the splash entirely (see inline head script + main.js) so the
   visitor lands exactly where they clicked, instead of behind a locked
   full-screen intro they didn't ask for. */
html.skip-intro .intro-splash{display:none !important;}
html.skip-intro.intro-lock, html.skip-intro.intro-lock body{overflow:auto !important; height:auto !important;}
@media (max-width:640px){ .intro-video-wrap video{animation-duration:26s;} .intro-hint{margin-top:28px;} }
@media (prefers-reduced-motion: reduce){ .intro-video-wrap video{animation:none; display:none;} .intro-hint, .intro-hint svg{animation:fadeUp .9s cubic-bezier(.2,.7,.2,1) .8s forwards;} }

/* ---------- NAV ---------- */
.nav{
  position:fixed; top:0; left:0; right:0; z-index:100;
  background:#000;
  border-bottom:1px solid transparent;
  transition:border-color .3s ease;
}
.nav.scrolled{border-bottom-color:var(--border);}
.nav-inner{
  max-width:var(--maxw); margin:0 auto; padding:0 32px;
  height:76px; display:flex; align-items:center; justify-content:space-between;
}
.brand{display:flex; align-items:center; gap:9px; font-family:'Inter',sans-serif; font-weight:650; font-size:19px; letter-spacing:-0.01em;}
.brand-accent{color:var(--accent-2);}
.brand-mark{
  height:36px; width:auto; object-fit:contain; flex-shrink:0;
  filter:drop-shadow(0 0 7px rgba(52,224,196,.28));
}
.nav-links{display:flex; gap:36px; list-style:none; margin:0; padding:0;}
.nav-links a{
  font-size:14.5px; font-weight:510; letter-spacing:-0.01em; color:var(--text-muted); position:relative; padding:4px 0;
  transition:color .25s ease;
}
.nav-links a::after{
  content:"";position:absolute;left:0;bottom:-2px;width:0;height:1px;background:var(--accent-2);
  transition:width .3s ease;
}
.nav-links a:hover{color:var(--text);}
.nav-links a:hover::after{width:100%;}
.nav-links a.active, .mobile-menu a.active{color:var(--accent-2);}
.nav-links a.active::after{width:100%; background:var(--accent-2);}
.nav-cta{
  padding:10px 20px;border-radius:9px;border:1px solid var(--accent);
  font-size:14px; font-weight:510; transition:all .25s ease; white-space:nowrap;
  color:var(--accent); background:var(--accent-soft);
}
.nav-cta:hover{background:var(--accent); color:#050810; box-shadow:0 8px 24px -8px rgba(76,124,255,0.55);}
.nav-toggle{display:none; flex-direction:column; gap:5px; cursor:pointer; background:none; border:none; padding:8px;}
.nav-toggle span{width:22px;height:2px;background:var(--text);display:block;transition:transform .3s ease, opacity .3s ease;}
.mobile-menu{
  display:none; position:fixed; top:76px; left:0; right:0; background:var(--surface); z-index:99;
  padding:6px 28px 14px; flex-direction:column;
  border-bottom:1px solid var(--border);
  box-shadow:0 24px 40px -24px rgba(0,0,0,.7);
  max-height:calc(100vh - 76px); overflow-y:auto;
  transform:translateY(-8px); opacity:0; pointer-events:none; transition:opacity .25s ease, transform .25s ease;
}
.mobile-menu.open{opacity:1; transform:translateY(0); pointer-events:auto;}
.mobile-menu a{
  font-size:16px; font-weight:500; font-family:'Inter',sans-serif; color:var(--text);
  padding:15px 0; border-bottom:1px solid var(--border);
}
.mobile-menu a:last-child{border-bottom:none;}
/* Same idea as the desktop .nav-cta pill — the Contact link shouldn't read
   as just another row in the list, it's the CTA. */
.mobile-menu a.mobile-cta{
  color:var(--accent); font-weight:600; text-align:center;
  background:var(--accent-soft); border:1px solid var(--accent); border-radius:10px;
  padding:14px 16px; margin:10px 0 4px;
}
.mobile-menu a.mobile-cta:hover, .mobile-menu a.mobile-cta:active{background:var(--accent); color:#050810;}

@media (max-width:900px){
  .nav-links, .nav-cta{display:none;}
  .nav-toggle{display:flex;}
  .mobile-menu{display:flex;}
  .hero-tag{font-size:11.5px; white-space:normal; text-align:center;}
}

/* ---------- SCROLL CONTINUITY RAIL ---------- */
/* A thin fixed reading-progress line down the left edge, filling as the
   visitor scrolls — the throughline that ties every section into one
   continuous page rather than a stack of independent blocks. Desktop only:
   on narrow viewports it would just eat edge space next to already-tight
   content, so it's dropped at the same breakpoint the nav collapses at. */
.scroll-rail{
  position:fixed; left:0; top:76px; bottom:0; width:3px; z-index:95;
  background:var(--border); pointer-events:none;
}
.scroll-rail-fill{
  width:100%; height:0%;
  background:linear-gradient(180deg, var(--accent), var(--accent-2));
  transition:height .12s linear;
}
@media (max-width:900px){ .scroll-rail{display:none;} }
@media (prefers-reduced-motion: reduce){ .scroll-rail-fill{transition:none;} }

/* ---------- HERO ---------- */
.hero{
  min-height:100vh; display:flex; align-items:center; position:relative;
  padding:110px 0 40px; overflow:hidden; background:#000;
}
#hero-canvas, .section-canvas{position:absolute; inset:0; width:100%; height:100%; z-index:0; opacity:1; pointer-events:none;}
.hero-video{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:0; pointer-events:none;
  opacity:.45; filter:saturate(1.05);
}
@media (prefers-reduced-motion: reduce){ .hero-video{display:none;} }
/* Safari renders its own default "start playback" button on any <video>
   without a controls attribute, and it can flash visibly for a moment
   before autoplay actually kicks in — this is what shows up as a stray
   pause/play icon over the hero on load. Not a preload/timing issue;
   these are Safari-only pseudo-elements that need to be explicitly
   switched off (no effect on Chrome/Firefox). */
.hero-video::-webkit-media-controls,
.hero-video::-webkit-media-controls-start-playback-button,
.hero-video::-webkit-media-controls-panel{
  display:none !important;
  -webkit-appearance:none;
}
.hero-vignette{
  position:absolute; inset:0; z-index:1; pointer-events:none;
  background:radial-gradient(ellipse 60% 50% at 50% 30%, transparent 0%, #000 85%),
             linear-gradient(180deg, transparent 0%, #000 100%);
}
.hero-inner{position:relative; z-index:2; max-width:var(--maxw); margin:0 auto; padding:0 32px; width:100%;}
.hero-tag{
  display:inline-flex; align-items:center; gap:8px;
  font-size:12.5px; font-weight:600; letter-spacing:.06em; text-transform:uppercase;
  color:var(--accent-2); font-family:'Inter',sans-serif;
  border:1px solid var(--border); padding:7px 16px; border-radius:100px;
  margin-bottom:20px; background:rgba(52,224,196,0.06);
  opacity:0; transform:translateY(14px);
}
.hero.hero-play .hero-tag{animation:fadeUp .7s cubic-bezier(.2,.7,.2,1) forwards;}
.hero-tag .dot{width:6px;height:6px;border-radius:50%;background:var(--accent-2); box-shadow:0 0 8px var(--accent-2); animation:pulse 2s ease-in-out infinite;}
@keyframes pulse{0%,100%{opacity:1;} 50%{opacity:.4;}}
.hero h1{
  font-size:clamp(2.2rem, 5.6vw, 4.4rem); max-width:20ch; color:var(--text);
  letter-spacing:-0.035em;
}
.hero h1 .line{display:block; overflow:hidden;}
.hero h1 .line span{display:inline-block; transform:translateY(110%);}
.hero.hero-play h1 .line span{animation:riseUp .9s cubic-bezier(.2,.7,.2,1) forwards;}
@keyframes riseUp{to{transform:translateY(0);}}
.hero-sub{
  margin-top:20px; font-size:17px; color:var(--text-muted); max-width:640px; line-height:1.6;
  opacity:0;
}
.hero.hero-play .hero-sub{animation:fadeUp .8s ease .22s forwards;}
.hero-ctas{margin-top:28px; display:flex; gap:16px; flex-wrap:wrap; opacity:0;}
.hero.hero-play .hero-ctas{animation:fadeUp .8s ease .36s forwards;}
@keyframes fadeUp{from{opacity:0; transform:translateY(16px);} to{opacity:1; transform:translateY(0);}}
.btn{
  display:inline-flex; align-items:center; gap:10px; padding:15px 26px; border-radius:10px;
  font-size:15px; font-weight:510; letter-spacing:-0.01em; cursor:pointer; transition:all .25s cubic-bezier(.2,.7,.2,1); border:1px solid transparent;
}
.btn-primary{background:var(--accent); color:#050810;}
.btn-primary:hover{background:#6690ff; transform:translateY(-2px); box-shadow:0 10px 30px -8px rgba(76,124,255,0.55);}
.btn-ghost{border-color:var(--border); color:var(--text);}
.btn-ghost:hover{border-color:var(--text-muted); background:rgba(255,255,255,0.03);}
/* A clearly-colored secondary CTA — for buttons that need to read as a real
   call-to-action (not just a neutral secondary link like "Download PDF" or
   "Send your resume", which stay .btn-ghost) but shouldn't compete with a
   .btn-primary sitting right next to it. */
.btn-accent{border-color:var(--accent); color:var(--accent); background:transparent;}
.btn-accent:hover{background:var(--accent); color:#050810; transform:translateY(-2px); box-shadow:0 10px 30px -8px rgba(76,124,255,0.55);}
.btn-arrow{display:inline-block; transition:transform .25s cubic-bezier(.2,.7,.2,1);}
.btn:hover .btn-arrow{transform:translateX(4px);}
.btn:active{transform:scale(.98); transition-duration:.1s;}

/* Shared press feedback for the site's round icon buttons (theme toggle,
   gallery/lightbox arrows) — instant tactile scale-down on tap/click.
   The vertically-centered arrows keep their translateY(-50%) positioning
   transform so the press doesn't also shift them off-center. */
.theme-toggle:active, .gallery-dot:active, .lead-lightbox-close:active{
  transform:scale(.92); transition-duration:.1s;
}
.gallery-arrow:active, .lead-lightbox-nav:active{
  transform:translateY(-50%) scale(.92); transition-duration:.1s;
}

.hero-stats{
  margin-top:40px; display:grid; grid-template-columns:repeat(4,1fr); gap:0;
  border-top:1px solid var(--border); padding-top:20px;
  opacity:0;
}
.hero.hero-play .hero-stats{animation:fadeUp .8s ease .5s forwards;}
.hero-stats div{padding-right:20px;}
.hero-stats .num{font-family:'Inter',sans-serif; font-size:28px; font-weight:600; color:var(--text); display:flex; align-items:baseline; gap:2px;}
.hero-stats .num .accent{color:var(--accent-2);}
.hero-stats .label{font-size:13px; color:var(--text-dim); margin-top:4px;}
@media (max-width:800px){ .hero-stats{grid-template-columns:repeat(2,1fr); row-gap:24px;} }

/* ---------- SECTION HEADERS ---------- */
/* More generous vertical rhythm between sections — deliberate breathing
   room reads as premium, cramped stacking reads as a template. Scaled
   back down on small screens so mobile scroll length stays reasonable. */
.section{padding:108px 0;}
.section-tight{padding:78px 0;}
@media (max-width:700px){
  .section{padding:68px 0;}
  .section-tight{padding:56px 0;}
}
.kicker{
  font-family:'Inter',sans-serif; font-weight:700; font-size:15px; letter-spacing:.07em; text-transform:uppercase;
  color:var(--accent-2);
  margin-bottom:18px;
}
.section-title{font-size:clamp(1.8rem,3.4vw,2.6rem); max-width:16ch;}
.section-desc{margin-top:18px; font-size:16.5px; color:var(--text-muted); max-width:560px; line-height:1.7;}
.section-head{display:flex; justify-content:space-between; align-items:flex-end; gap:40px; flex-wrap:wrap; margin-bottom:52px;}

/* ---------- ABOUT ---------- */
.about-grid{display:grid; grid-template-columns:1.1fr 0.9fr; gap:80px; align-items:start;}
.about-copy p{color:var(--text-muted); font-size:16.5px; line-height:1.75; margin-bottom:20px;}
.about-quote{
  border-left:2px solid var(--accent); padding-left:22px; margin:32px 0;
  font-family:'Inter',sans-serif; font-size:20px; font-style:normal; color:var(--text); line-height:1.5;
}
.fact-list{display:flex; flex-direction:column; border-top:1px solid var(--border);}
.fact-row{
  display:flex; justify-content:space-between; align-items:center; gap:20px;
  padding:20px 0; border-bottom:1px solid var(--border);
}
.fact-row .k{font-size:12px; color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.08em;}
.fact-row .v{font-size:15.5px; color:var(--text); text-align:right; font-weight:500;}
@media (max-width:900px){.about-grid{grid-template-columns:1fr; gap:48px;}}
.journey-grid{grid-template-columns:0.9fr 1.1fr;}
@media (max-width:900px){.journey-grid{grid-template-columns:1fr;}}
@media (max-width:480px){
  .fact-row{flex-direction:column; align-items:flex-start; gap:4px;}
  .fact-row .v{text-align:left;}
}

/* ---------- LIGHT SECTION OVERRIDE (Solutions/Industries/Trust/Process/FAQ) ---------- */
/* These sections stay permanently white/light regardless of the dark/light
   toggle — a deliberate readability choice for dense text/cert/case-study/
   FAQ content, same as Hero/Nav/Partners/Footer stay permanently dark.
   Local CSS-variable overrides, same technique as the pinned-dark chrome. */
.section-light{
  color:var(--text);
  --text:#0C1222;
  --text-muted:#565F76;
  --text-dim:#7A8298;
  --border:#E4E7F0;
  --surface:#F5F6FA;
  --surface-2:#ECEEF5;
  --accent-soft:rgba(76,124,255,0.08);
  --accent-2:#087F6D;
}
.section-light .btn-ghost:hover{background:rgba(12,18,34,0.04);}

/* ---------- SOLUTIONS ---------- */
.sol-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:16px;}
.sol-card{
  background:var(--surface); padding:26px 24px; position:relative; overflow:hidden;
  border:1px solid var(--border); border-radius:var(--radius);
  transition:background .15s ease-out, border-color .15s ease-out, transform .15s ease-out, box-shadow .15s ease-out;
}
.sol-card:hover{background:var(--surface-2); border-color:var(--accent); transform:translateY(-4px); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.sol-card:active{transform:scale(.98); transition-duration:.1s;}
.sol-card .idx{font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--text-dim); margin-bottom:14px; display:block;}
.sol-icon{
  width:38px;height:38px;border-radius:10px; background:var(--accent-soft);
  display:flex; align-items:center; justify-content:center; margin-bottom:14px;
  transition:transform .3s cubic-bezier(.2,.7,.2,1), background .3s ease;
}
.sol-card:hover .sol-icon{transform:translateY(-4px) rotate(-4deg); background:rgba(52,224,196,0.14);}
.sol-icon svg{width:22px;height:22px;stroke:var(--accent-2);}
.sol-card h3{font-size:17.5px; margin-bottom:6px;}
.sol-card p{font-size:13.5px; color:var(--text-muted); line-height:1.55; margin-bottom:12px;}
.sol-tags{display:flex; flex-wrap:wrap; gap:8px;}
.chip-plain{
  font-size:11.5px; font-family:'JetBrains Mono',monospace; color:var(--text-dim);
  border:1px solid var(--border); padding:4px 9px; border-radius:6px;
}
/* Brand chips — recolored partner logos (name on hover via title).
   Width is auto rather than a fixed square: several partner marks are wide
   wordmarks (Dell, TP-Link, Bosch, NVIDIA, MSI...), and forcing those into
   an 18x18 square squeezed them into an illegible sliver. Letting the pill
   grow to the logo's natural aspect ratio keeps icon-shaped marks (HP, AWS)
   compact while giving wordmarks room to actually read. */
.brand-chip{
  display:inline-flex; align-items:center; justify-content:center;
  height:36px; min-width:36px; padding:7px 13px; border-radius:100px;
  border:1px solid var(--border); background:var(--surface);
  border-color:var(--bc, var(--accent));
  background:color-mix(in srgb, var(--bc, var(--accent)) 9%, var(--surface));
  transition:transform .25s cubic-bezier(.2,.7,.2,1), background .25s ease, box-shadow .25s ease;
}
.brand-chip img{height:21px; width:auto; max-width:72px; object-fit:contain; display:block; flex-shrink:0;}
.brand-chip:hover{
  transform:translateY(-2px) scale(1.08);
  background:color-mix(in srgb, var(--bc, var(--accent)) 20%, var(--surface));
  box-shadow:0 6px 16px -8px var(--bc, var(--accent));
}
@media (max-width:900px){.sol-grid{grid-template-columns:1fr;}}

/* ---------- INDUSTRIES ---------- */
/* Sized and dressed to match the Solutions cards (same icon treatment, same
   padding scale, heading + supporting line) rather than reading as a
   smaller, lesser afterthought next to them. */
.ind-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:16px;}
.ind-card{
  display:block; border:1px solid var(--border); border-radius:var(--radius); padding:26px 22px;
  text-align:left; transition:border-color .15s ease-out, transform .15s ease-out, background .15s ease-out, box-shadow .15s ease-out;
  background:var(--surface);
}
.ind-card:active{transform:scale(.98); transition-duration:.1s;}
.ind-card:hover{border-color:var(--accent); transform:translateY(-4px); background:var(--surface-2); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.ind-icon-wrap{
  width:38px;height:38px;border-radius:10px; background:var(--accent-soft);
  display:flex; align-items:center; justify-content:center; margin-bottom:14px;
  transition:transform .3s cubic-bezier(.2,.7,.2,1), background .3s ease;
}
.ind-card:hover .ind-icon-wrap{transform:translateY(-4px) rotate(-4deg); background:rgba(52,224,196,0.14);}
.ind-card .ind-icon{width:22px;height:22px; stroke:var(--accent-2); fill:none;}
.ind-card h4{font-size:17px; font-weight:600; font-family:'Inter',sans-serif; margin-bottom:6px;}
.ind-card p{font-size:13.5px; color:var(--text-muted); line-height:1.55; margin:0;}
.ind-band{
  margin-top:20px; border:1px solid var(--border); border-radius:12px; padding:18px 26px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:12px;
  color:var(--text-muted); font-size:14.5px;
}
.ind-band strong{color:var(--accent-2); font-family:'Inter',sans-serif; font-weight:700;}
@media (max-width:1100px){.ind-grid{grid-template-columns:repeat(3,1fr);}}
@media (max-width:900px){.ind-grid{grid-template-columns:repeat(2,1fr);}}

/* ---------- Fixed 3-column variant of .ind-card's grid, for the homepage's
   "What we do" (3 buckets) and "Solutions" (6 cards, 2 neat rows) sections. ---------- */
.ind-grid-3{display:grid; grid-template-columns:repeat(3,1fr); gap:16px;}
@media (max-width:900px){.ind-grid-3{grid-template-columns:repeat(2,1fr);}}
@media (max-width:560px){.ind-grid-3{grid-template-columns:1fr;}}

/* ---------- Homepage "Why NexusTech" highlight strip (inside #trust) ---------- */
.why-chips{display:flex; flex-wrap:wrap; gap:10px; margin:18px 0 30px;}
.why-chips li{list-style:none; border:1px solid var(--border); border-radius:999px; padding:8px 16px; font-size:13.5px; color:var(--text-muted); background:var(--surface);}

/* ---------- PROJECT EXPERIENCE (real case studies) ---------- */
.proj-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:18px; margin-top:32px;}
.proj-card{
  border:1px solid var(--border); border-radius:var(--radius); padding:26px 24px;
  background:var(--surface); display:flex; flex-direction:column; gap:12px;
  transition:border-color .15s ease-out, transform .15s ease-out, background .15s ease-out, box-shadow .15s ease-out;
}
.proj-card:hover{border-color:var(--accent); transform:translateY(-4px); background:var(--surface-2); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.proj-tag{
  display:inline-block; font-size:11px; font-family:'JetBrains Mono',monospace; color:var(--accent-2);
  border:1px solid var(--border); padding:4px 10px; border-radius:6px; letter-spacing:.03em; align-self:flex-start;
}
.proj-card h4{font-size:17.5px; font-weight:600;}
.proj-card p{font-size:13.5px; color:var(--text-muted); line-height:1.6;}
.proj-facts{display:flex; flex-direction:column; gap:6px; border-top:1px solid var(--border); padding-top:12px; margin-top:auto;}
.proj-fact{display:flex; justify-content:space-between; gap:10px; font-size:12.5px;}
.proj-fact .k{color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.05em; text-transform:uppercase;}
.proj-fact .v{color:var(--text); font-weight:500; text-align:right;}
.proj-note{
  margin-top:24px; border:1px solid var(--border); border-radius:12px; padding:16px 22px;
  color:var(--text-dim); font-size:13px; line-height:1.6;
}
@media (max-width:900px){.proj-grid{grid-template-columns:1fr;}}

/* ---------- PROJECT EXPERIENCE REGISTER ---------- */
.reg-table-wrap{overflow-x:auto; border:1px solid var(--border); border-radius:var(--radius); margin-top:8px;}
.reg-table{width:100%; border-collapse:collapse; min-width:640px;}
.reg-table th{
  text-align:left; font-size:11px; font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.06em; text-transform:uppercase;
  color:var(--text-dim); padding:14px 18px; border-bottom:1px solid var(--border); background:var(--surface-2);
}
.reg-table td{padding:16px 18px; border-bottom:1px solid var(--border); font-size:14px; color:var(--text); vertical-align:top;}
.reg-table tr:last-child td{border-bottom:none;}
.reg-table .reg-project{font-weight:600;}
.reg-table .reg-sub{display:block; font-size:12.5px; color:var(--text-muted); font-weight:400; margin-top:2px;}
.reg-role{
  display:inline-block; font-size:11px; font-family:'JetBrains Mono',monospace; color:var(--accent-2);
  border:1px solid var(--border); padding:3px 8px; border-radius:6px; white-space:nowrap;
}
@media (max-width:900px){.reg-table{min-width:560px;}}

/* ---------- OFFERINGS CAROUSEL ---------- */
/* Homepage-only "what we offer" showcase — Products + Solutions combined
   into one AMD-style carousel (big image-top cards, prev/next arrows,
   page dots) instead of two separate stacked grid sections. Cards link
   straight out to the real products.html/solutions.html category. */
.offer-head{text-align:center; align-items:center; flex-direction:column; gap:14px;}
.offer-head .kicker{margin-bottom:0;}
.offer-head .section-title{max-width:15ch}
.offer-head .section-desc{max-width:560px; margin:0 auto;}
.offer-carousel-wrap{
  display:flex; align-items:center; gap:12px; margin-top:44px;
  max-width:1240px; margin-left:auto; margin-right:auto; padding:0 24px;
}
.offer-arrow{
  flex:0 0 auto; width:46px; height:46px; border-radius:100px;
  border:1px solid var(--border); background:var(--surface);
  display:flex; align-items:center; justify-content:center; color:var(--text);
  transition:background .2s ease, border-color .2s ease, transform .15s ease, opacity .2s ease;
}
.offer-arrow svg{width:19px; height:19px; stroke:currentColor;}
.offer-arrow:hover{border-color:var(--accent-2); background:var(--surface-2);}
.offer-arrow:active{transform:scale(.92);}
.offer-arrow.prev svg{transform:rotate(180deg);}
.offer-arrow[disabled]{opacity:.3; pointer-events:none;}
.offer-carousel{
  flex:1; min-width:0; display:flex; gap:22px; overflow-x:auto; scroll-snap-type:x mandatory;
  scrollbar-width:none; -ms-overflow-style:none; padding:4px 2px 10px;
}
.offer-carousel::-webkit-scrollbar{display:none;}
.offer-card{
  flex:0 0 auto; width:266px; scroll-snap-align:start;
  border:1px solid var(--border); border-radius:var(--radius); overflow:hidden;
  background:var(--surface); display:flex; flex-direction:column;
  transition:border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.offer-card:hover{border-color:var(--oc, var(--accent)); transform:translateY(-4px); box-shadow:0 18px 34px -18px rgba(0,0,0,.5);}
.offer-card-media{
  aspect-ratio:4/3; position:relative; overflow:hidden;
  background:linear-gradient(160deg, #1a2033, #0a0d16);
}
.offer-card-media img{
  width:100%; height:100%; object-fit:cover; display:block;
  transition:transform .5s ease;
}
.offer-card:hover .offer-card-media img{transform:scale(1.07);}
.offer-card-media::after{
  content:''; position:absolute; inset:0; pointer-events:none;
  background:
    linear-gradient(180deg, transparent 45%, rgba(4,6,11,.65) 100%),
    radial-gradient(ellipse 85% 70% at 12% 0%, color-mix(in srgb, var(--oc, var(--accent)) 40%, transparent), transparent 60%);
}
.offer-card-body{padding:18px 20px 22px; display:flex; flex-direction:column; gap:7px; flex:1;}
.offer-tag{
  font-size:10.5px; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
  color:var(--oc, var(--accent-2)); font-family:'Inter',sans-serif;
}
.offer-card h4{font-size:16.5px; font-weight:600; font-family:'Inter',sans-serif;}
.offer-card p{font-size:13px; color:var(--text-muted); line-height:1.55; margin:0;}
.offer-dots{display:flex; justify-content:center; gap:8px; margin-top:26px;}
.offer-dot{width:7px; height:7px; border-radius:100px; background:var(--border); transition:background .2s ease, width .2s ease; padding:0; border:none;}
.offer-dot.active{background:var(--accent-2); width:22px;}
@media (max-width:640px){
  .offer-carousel-wrap{gap:6px; padding:0 6px;}
  .offer-arrow{width:38px; height:38px;}
  .offer-card{width:78vw; max-width:280px;}
}

/* Case studies page: 3-up case-card grid (case-grid's own responsive
   breakpoint stays untouched for the homepage's 2-up usage) */
.case-grid.case-grid-3{grid-template-columns:repeat(3,1fr);}
@media (max-width:900px){.case-grid.case-grid-3{grid-template-columns:repeat(2,1fr);}}
@media (max-width:640px){.case-grid.case-grid-3{grid-template-columns:1fr;}}

/* ---------- PARTNERS / MARQUEE ---------- */
.marquee-block{margin-top:56px;}
.marquee-label{font-size:12px; color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.08em; text-transform:uppercase; margin-bottom:18px;}
.marquee{
  overflow-x:auto; overflow-y:hidden; position:relative;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  cursor:grab;
  /* Scrollable (wheel/trackpad/touch-swipe/click-drag — see main.js) so a
     visitor can browse the logos at their own pace, but the scrollbar itself
     stays hidden since the auto-scroll already communicates "more content" —
     a visible bar would just fight the edge fade mask above. */
  scrollbar-width:none; -ms-overflow-style:none;
}
.marquee::-webkit-scrollbar{display:none;}
.marquee.dragging{cursor:grabbing; scroll-behavior:auto;}
.marquee-track{display:flex; gap:64px; width:max-content; animation:scrollLeft 34s linear infinite; animation-play-state:paused;}
.marquee-track.rev{animation-direction:reverse; animation-duration:40s;}
/* Stays paused until its block actually scrolls into view (the .reveal
   IntersectionObserver in main.js adds .is-visible) — the marquee visibly
   "starts up" as the visitor arrives at Partners, instead of having been
   silently scrolling the whole time off-screen. Also paused whenever the
   visitor is actively scrolling/dragging it themselves (main.js toggles
   .user-scrolling), so the auto-motion never fights their input. */
.marquee-block.is-visible .marquee-track{animation-play-state:running;}
.marquee:hover .marquee-track, .marquee.user-scrolling .marquee-track{animation-play-state:paused;}
@keyframes scrollLeft{from{transform:translateX(0);} to{transform:translateX(-50%);}}
.logo-item{height:34px; display:flex; align-items:center; flex-shrink:0; position:relative;}
.logo-item img{height:100%; width:auto; object-fit:contain; position:relative;}
.logo-item .logo-base{opacity:0.55; transition:opacity .3s ease;}
.logo-item .logo-tint{position:absolute; left:0; top:0; opacity:0; transition:opacity .3s ease;}
.logo-item:hover .logo-base{opacity:0;}
.logo-item:hover .logo-tint{opacity:1;}
/* Text-wordmark variant — for partners added without a logo file on hand
   yet (real artwork can replace this the same way the image-based marks
   above work, no markup change needed elsewhere). Same dim/hover-color
   interaction as the image marks, just typeset instead of recolored. */
.logo-item-text{
  font-family:'Inter',sans-serif; font-weight:700; font-size:21px; letter-spacing:.01em;
  color:var(--text-dim); opacity:.55; transition:opacity .3s ease, color .3s ease; white-space:nowrap;
}
.logo-item-text:hover{opacity:1; color:var(--tc, var(--accent-2));}

/* ---------- LEADERSHIP ---------- */
.leadership-gallery{margin-bottom:64px;}
.leadership-gallery .gallery{aspect-ratio:16/9; border-radius:var(--radius);}
/* Full color, not desaturated — these are meant to show genuine warmth and
   relationships, not read as a moody editorial portfolio shot. */
.leadership-gallery .gallery-slide img{filter:contrast(1.03);}
.group-photo-caption{
  position:absolute; left:0; right:0; bottom:0; padding:28px 32px;
  background:linear-gradient(180deg,transparent,rgba(0,0,0,0.92) 70%);
  display:flex; justify-content:space-between; align-items:flex-end; flex-wrap:wrap; gap:12px;
}
.group-photo-caption h3{font-size:20px; color:#fff;}
.group-photo-caption p{font-size:13.5px; color:var(--text-muted); margin-top:4px;}
.lead-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:18px;}
.lead-card{text-align:left;}
.lead-photo{
  aspect-ratio:1/1; border-radius:12px; overflow:hidden; margin-bottom:12px; border:1px solid var(--border);
  position:relative; cursor:pointer; transition:transform .1s ease-in-out;
}
.lead-photo:active{transform:scale(.98);}
.lead-photo img{width:100%; height:100%; object-fit:cover; transition:transform .5s ease;}
.lead-card:hover .lead-photo img{transform:scale(1.04);}
.lead-photo-expand{
  position:absolute; top:10px; right:10px; width:32px; height:32px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:rgba(0,0,0,0.55); backdrop-filter:blur(6px); color:#fff;
  border:1px solid rgba(237,239,247,0.25);
  opacity:0; transform:translateY(-4px); transition:opacity .25s ease, transform .25s ease, background .25s ease, border-color .25s ease;
}
.lead-card:hover .lead-photo-expand, .lead-photo:focus-visible .lead-photo-expand{
  opacity:1; transform:translateY(0);
}
.lead-photo:hover .lead-photo-expand{background:var(--accent); border-color:var(--accent); color:#050810;}
.lead-photo:focus-visible{outline:2px solid var(--accent); outline-offset:2px;}
/* Touch devices have no :hover, so the expand icon above never gets its
   reveal trigger — tapping the photo still opens the lightbox, but nothing
   ever hints that it's tappable. Show it by default wherever hover isn't
   available. */
@media (hover:none){
  .lead-photo-expand{opacity:1; transform:translateY(0);}
}

/* ---------- LEADERSHIP LIGHTBOX ---------- */
.lead-lightbox{
  position:fixed; inset:0; z-index:2000;
  display:flex; align-items:center; justify-content:center;
  opacity:0; visibility:hidden; pointer-events:none;
  transition:opacity .3s cubic-bezier(.2,0,0,1), visibility 0s linear .3s;
}
.lead-lightbox.open{opacity:1; visibility:visible; pointer-events:auto; transition:opacity .3s cubic-bezier(.2,0,0,1), visibility 0s linear 0s;}
.lead-lightbox-backdrop{
  position:absolute; inset:0; background:rgba(0,0,0,0.82); backdrop-filter:blur(8px);
}
.lead-lightbox-content{
  position:relative; z-index:1; margin:0; max-width:min(560px, 88vw); max-height:86vh;
  display:flex; flex-direction:column; align-items:center;
  transform:scale(.95) translateY(26px); transition:transform .32s cubic-bezier(.2,0,0,1);
}
.lead-lightbox.open .lead-lightbox-content{transform:scale(1) translateY(0);}
.lead-lightbox-content img{
  width:100%; max-height:66vh; object-fit:cover; border-radius:16px; border:1px solid rgba(237,239,247,0.15);
  aspect-ratio:1/1;
}
/* #photoLightbox reuses the same lightbox markup/CSS as the individual
   director headshots above, but its photos (leadership group shot, Hari
   Raya gallery) are landscape, not square — so it needs its own sizing:
   no forced 1:1 crop, natural aspect ratio, and a wider content box. */
#photoLightbox .lead-lightbox-content{max-width:min(920px, 92vw);}
#photoLightbox .lead-lightbox-content img{
  width:auto; height:auto; max-width:100%; max-height:78vh; object-fit:contain;
  aspect-ratio:auto;
}
.lead-lightbox-content figcaption{margin-top:20px; text-align:center;}
.lead-lightbox-content h4{font-size:20px; color:#EDEFF7; margin-bottom:4px;}
.lead-lightbox-content .role{font-size:14px; color:var(--accent-2); font-family:'Inter',sans-serif; font-weight:510; letter-spacing:.02em;}
.lead-lightbox-close, .lead-lightbox-nav{
  position:absolute; z-index:2; width:44px; height:44px; border-radius:50%; border:1px solid rgba(237,239,247,0.25);
  background:rgba(0,0,0,0.55); backdrop-filter:blur(6px); color:#EDEFF7;
  display:flex; align-items:center; justify-content:center; cursor:pointer; transition:all .25s ease;
}
.lead-lightbox-close:hover, .lead-lightbox-nav:hover{background:var(--accent); border-color:var(--accent); color:#050810;}
.lead-lightbox-close{top:24px; right:24px;}
.lead-lightbox-nav.prev{left:24px; top:50%; transform:translateY(-50%);}
.lead-lightbox-nav.next{right:24px; top:50%; transform:translateY(-50%);}
.lead-lightbox-nav:hover{transform:translateY(-50%) scale(1.06);}
@media (max-width:640px){
  .lead-lightbox-nav{width:38px; height:38px;}
  .lead-lightbox-nav.prev{left:10px;}
  .lead-lightbox-nav.next{right:10px;}
  .lead-lightbox-close{top:14px; right:14px; width:38px; height:38px;}
}
.lead-card h4{font-size:16.5px; margin-bottom:4px;}
.lead-card .role{font-size:13.5px; color:var(--accent-2); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.02em;}
@media (max-width:900px){.lead-grid{grid-template-columns:repeat(2,1fr);}}

/* ---------- TRACK RECORD ---------- */
.timeline{position:relative; padding-left:2px;}
.timeline::before{content:"";position:absolute; left:0; top:8px; bottom:8px; width:1px; background:var(--border);}
/* Draws in on top of the static track as each year scrolls into view (see
   the dedicated IntersectionObserver in main.js) — the "story appearing as
   you scroll" line, not just a fixed rail every item happens to sit on. */
.tl-fill{
  position:absolute; left:0; top:8px; width:1px; height:0;
  background:linear-gradient(180deg, var(--accent), var(--accent-2));
  transition:height .7s cubic-bezier(.22,1,.36,1); z-index:1;
}
.tl-item{position:relative; padding:0 0 52px 42px;}
.tl-item:last-child{padding-bottom:0;}
.tl-dot{
  position:absolute; left:-5px; top:2px; width:11px;height:11px;border-radius:50%; z-index:2;
  background:var(--bg); border:2px solid var(--border); box-shadow:0 0 0 4px rgba(52,224,196,0);
  transition:border-color .5s ease, box-shadow .5s ease;
}
.tl-item.is-visible .tl-dot{border-color:var(--accent-2); box-shadow:0 0 0 4px rgba(52,224,196,0.08);}
.tl-year{font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.03em; color:var(--accent-2); font-size:14.5px; margin-bottom:8px; display:block;}
.tl-item h4{font-size:19px; margin-bottom:8px;}
.tl-item p{color:var(--text-muted); font-size:14.5px; max-width:520px; line-height:1.65;}

/* ---------- COMMUNITY ---------- */
.community-grid{display:grid; grid-template-columns:0.9fr 1.1fr; gap:56px; align-items:center;}
.community-grid img{border-radius:var(--radius); border:1px solid var(--border);}
@media (max-width:900px){.community-grid{grid-template-columns:1fr;}}

/* ---------- EVENT GALLERY ---------- */
.gallery{position:relative; border-radius:var(--radius); overflow:hidden; border:1px solid var(--border); aspect-ratio:3/2; background:var(--surface-2);}
.gallery-track{position:relative; width:100%; height:100%;}
.gallery-slide{position:absolute; inset:0; opacity:0; transition:opacity .5s ease; pointer-events:none;}
.gallery-slide.active{opacity:1; pointer-events:auto;}
.gallery-slide img{width:100%; height:100%; object-fit:cover; display:block;}
.gallery-arrow{
  position:absolute; top:50%; right:16px; transform:translateY(-50%);
  width:44px; height:44px; border-radius:50%; border:1px solid rgba(237,239,247,0.25);
  background:rgba(0,0,0,0.55); backdrop-filter:blur(6px);
  color:var(--text); display:flex; align-items:center; justify-content:center;
  cursor:pointer; transition:all .25s ease; z-index:2;
}
.gallery-arrow:hover{background:var(--accent); border-color:var(--accent); color:#050810; transform:translateY(-50%) scale(1.06);}
.gallery-dots{position:absolute; left:0; right:0; bottom:16px; display:flex; justify-content:center; gap:8px; z-index:2;}
.gallery-dot{width:8px; height:8px; border-radius:50%; border:none; background:rgba(237,239,247,0.35); cursor:pointer; padding:0; transition:all .25s ease;}
.gallery-dot.active{background:var(--accent-2); width:22px; border-radius:4px;}
.gallery-dot:hover{background:rgba(237,239,247,0.6);}
/* Click-to-enlarge affordance on gallery slides (leadership group photo +
   Hari Raya community gallery) — same visual language as .lead-photo-expand
   on the individual director cards. Only the .active slide has
   pointer-events, so this only ever fires for the currently visible photo. */
.gallery-slide{cursor:pointer;}
.gallery-expand{
  position:absolute; top:10px; right:10px; width:32px; height:32px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:rgba(0,0,0,0.55); backdrop-filter:blur(6px); color:#fff;
  border:1px solid rgba(237,239,247,0.25); z-index:2;
  opacity:0; transform:translateY(-4px); transition:opacity .25s ease, transform .25s ease, background .25s ease, border-color .25s ease;
}
.gallery-slide:hover .gallery-expand, .gallery-slide:focus-visible .gallery-expand{opacity:1; transform:translateY(0);}
.gallery-slide:hover .gallery-expand{background:var(--accent); border-color:var(--accent); color:#050810;}
.gallery-slide:focus-visible{outline:2px solid var(--accent); outline-offset:-2px;}
/* Same touch-device fix as .lead-photo-expand above: no hover on touch, so
   show the expand icon by default instead of only on a hover that never fires. */
@media (hover:none){
  .gallery-expand{opacity:1; transform:translateY(0);}
}

/* ---------- CONTACT ---------- */
.contact-grid{display:grid; grid-template-columns:1fr 1fr; gap:70px;}
.contact-info-row{display:flex; gap:18px; padding:22px 0; border-bottom:1px solid var(--border);}
.contact-info-row:first-child{border-top:1px solid var(--border);}
.contact-icon{width:38px;height:38px;border-radius:10px; background:var(--accent-soft); display:flex; align-items:center; justify-content:center; flex-shrink:0;}
.contact-icon svg{width:18px;height:18px; stroke:var(--accent-2);}
.contact-info-row .label{font-size:11.5px; color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.08em; text-transform:uppercase; margin-bottom:5px;}
.contact-info-row .val{font-size:15.5px;}
.contact-info-row a:hover{color:var(--accent-2);}

.form-field{margin-bottom:20px;}
.form-field label{display:block; font-size:13px; color:var(--text-dim); margin-bottom:8px; font-family:'Inter',sans-serif; font-weight:500;}
.form-field label .optional{color:var(--text-dim); font-weight:400; text-transform:none; letter-spacing:0;}
.form-field input, .form-field textarea, .form-field select{
  width:100%; background:var(--surface); border:1px solid var(--border); border-radius:9px;
  padding:14px 16px; color:var(--text); font-family:'Inter',sans-serif; font-size:14.5px;
  transition:border-color .25s ease, background .25s ease;
}
.form-field input:focus, .form-field textarea:focus, .form-field select:focus{outline:none; border-color:var(--accent); background:var(--surface-2);}
.form-field textarea{resize:vertical; min-height:110px;}
.form-field select{appearance:none; -webkit-appearance:none; cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%238A93A6' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 12px center; padding-right:40px;
}
.form-row{display:flex; gap:14px;}
.form-row .form-field{flex:1; min-width:0;}
.form-msg{margin-top:16px; font-size:14px; color:var(--accent-2); display:none;}
.form-msg.show{display:block;}
.form-msg.error{color:#e5484d;}
.form-hp{position:absolute; left:-9999px; top:-9999px; width:1px; height:1px; overflow:hidden;}
@media (max-width:900px){.contact-grid{grid-template-columns:1fr; gap:48px;} .form-row{flex-direction:column; gap:0;}}

/* ---------- FOOTER ---------- */
footer{border-top:1px solid var(--border); padding:72px 0 32px;}
.foot-top{display:grid; grid-template-columns:1.2fr 0.8fr 0.8fr 0.8fr 0.8fr 0.8fr; gap:28px; padding-bottom:56px;}
.foot-brand p{color:var(--text-muted); font-size:14.5px; margin-top:16px; max-width:280px; line-height:1.7;}
.foot-col h5{font-size:12px; color:var(--text-dim); font-family:'Inter',sans-serif; letter-spacing:.08em; text-transform:uppercase; margin-bottom:20px; font-weight:600;}
.foot-col ul{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:13px;}
.foot-col a{font-size:14.5px; color:var(--text-muted); transition:color .2s ease;}
.foot-col a:hover{color:var(--text);}
.foot-bottom{
  border-top:1px solid var(--border); padding-top:28px; display:flex; justify-content:space-between;
  align-items:center; flex-wrap:wrap; gap:16px; font-size:13.5px; color:var(--text-dim);
}
.foot-bottom .flinks{display:flex; gap:24px;}
@media (max-width:900px){.foot-top{grid-template-columns:1fr 1fr; row-gap:36px;}}
@media (max-width:1150px) and (min-width:901px){.foot-top{grid-template-columns:1.2fr 1fr 1fr; row-gap:36px;}}
/* On phones, 2 uneven-height columns (e.g. brand vs. a 5-link Solutions
   list) leave an awkward blank gap under the shorter column — stack to a
   single column instead. */
@media (max-width:640px){
  .foot-top{grid-template-columns:1fr; row-gap:40px;}
  .foot-brand p{max-width:none;}
}

/* ---------- TRUST & CREDIBILITY ---------- */
.cert-grid{display:grid; grid-template-columns:repeat(3,1fr); gap:14px; margin-bottom:56px;}
.cert-chip{
  display:flex; align-items:center; gap:14px; padding:18px 20px;
  border:1px solid var(--border); border-radius:12px; background:var(--surface);
  transition:border-color .15s ease-out, transform .15s ease-out, box-shadow .15s ease-out;
}
.cert-chip:hover{border-color:var(--accent); transform:translateY(-4px); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.cert-chip:active{transform:scale(.98); transition-duration:.1s;}
.cert-chip .cert-icon{
  width:38px; height:38px; border-radius:10px; background:var(--accent-soft); flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
}
.cert-chip .cert-icon svg{width:20px; height:20px; stroke:var(--accent-2);}
.cert-chip .k{font-size:12px; color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.05em; text-transform:uppercase; margin-bottom:3px;}
.cert-chip .v{font-size:14.5px; color:var(--text); font-weight:500;}
/* Placeholder credentials / case studies / testimonials — a shared "pending"
   visual language (dashed border, transparent fill, muted italic copy, a
   small uppercase tag) so unfilled content reads as a deliberate to-do slot
   the owner will complete, not as a bug or fabricated content. Swap the
   bracketed copy for the real thing and drop .is-placeholder to promote a
   card to the normal solid-card treatment used elsewhere on the page. */
.cert-chip.is-placeholder{border-style:dashed; background:transparent;}
.cert-chip.is-placeholder .cert-icon{background:transparent; border:1px dashed var(--border);}
.cert-chip.is-placeholder .cert-icon svg{stroke:var(--text-dim);}
.cert-chip.is-placeholder .v{color:var(--text-dim); font-weight:400; font-style:italic;}
.pdpa-note{
  display:flex; align-items:flex-start; gap:14px; padding:20px 22px;
  border:1px solid var(--border); border-radius:12px; background:var(--accent-soft);
  color:var(--text-muted); font-size:14.5px; line-height:1.65;
}
.pdpa-note svg{width:20px; height:20px; stroke:var(--accent-2); flex-shrink:0; margin-top:2px;}
.pdpa-note strong{color:var(--text);}

/* Certifications page: "Download procurement documents" quick-link list —
   reuses the same certificate images/PDF already on the page, just gives
   a procurement reviewer one place to grab all of them without hunting
   through the page for each download/view-full link individually. */
.doc-download-list{display:flex; flex-direction:column; border:1px solid var(--border); border-radius:12px; overflow:hidden; max-width:640px;}
.doc-download-row{
  display:flex; align-items:center; gap:14px; padding:16px 20px;
  border-bottom:1px solid var(--border); text-decoration:none; color:inherit;
  transition:background .2s ease;
}
.doc-download-row:last-child{border-bottom:none;}
.doc-download-row:hover{background:var(--surface-2);}
.doc-download-icon{
  flex-shrink:0; width:38px; height:38px; border-radius:9px; background:var(--surface-2);
  display:flex; align-items:center; justify-content:center; color:var(--accent-2);
}
.doc-download-row:hover .doc-download-icon{background:var(--accent-soft);}
.doc-download-icon svg{width:18px; height:18px;}
.doc-download-text{flex:1; min-width:0;}
.doc-download-text .name{display:block; font-size:14.5px; font-weight:600; color:var(--text);}
.doc-download-text .desc{display:block; font-size:13px; color:var(--text-dim); margin-top:2px;}
.doc-download-action{flex-shrink:0; font-size:13px; font-weight:600; color:var(--accent-2); display:flex; align-items:center; gap:5px;}
.doc-download-action svg{width:14px; height:14px;}

/* Three distinct trust mechanisms (certifications, case studies,
   testimonials) rather than one long undifferentiated block: each gets its
   own bold accent eyebrow above the existing muted subhead, plus a rule
   between groups so the section visibly breaks into three readable parts. */
.trust-group{padding-top:44px; border-top:1px solid var(--border);}
.trust-group:first-child{padding-top:0; border-top:none;}
.trust-eyebrow{
  font-size:13.5px; color:var(--accent-2); font-family:'Inter',sans-serif; font-weight:700;
  letter-spacing:.08em; text-transform:uppercase; margin-bottom:10px;
}
.trust-subhead{font-size:14px; color:var(--text-dim); font-family:'Inter',sans-serif; font-weight:600; letter-spacing:.06em; text-transform:uppercase; margin-bottom:20px;}

/* ---------- CERTIFICATIONS PAGE ---------- */
/* Kept compact and thumbnail-like on purpose (like Lumico/PBB Group's
   certificate galleries) — the frame is a fixed, modest height with the
   scanned document shown in full via object-fit:contain, not stretched
   to its native width. Full resolution is one click away. */
.cert-doc-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:24px; margin-top:8px;}
.cert-doc-card{
  border:1px solid var(--border); border-radius:var(--radius); padding:22px;
  background:var(--surface); transition:border-color .2s ease-out, transform .2s ease-out, box-shadow .2s ease-out;
}
.cert-doc-card:hover{border-color:var(--accent); transform:translateY(-4px); box-shadow:0 20px 40px -20px rgba(0,0,0,0.35);}
.cert-doc-frame{
  position:relative; display:flex; align-items:center; justify-content:center;
  height:230px; border-radius:10px; overflow:hidden; border:1px solid var(--border); margin-bottom:18px;
  background:#eef0f3; cursor:pointer;
}
.cert-doc-frame img{display:block; width:100%; height:100%; object-fit:contain; padding:14px; box-sizing:border-box; transition:transform .5s ease;}
.cert-doc-card:hover .cert-doc-frame img{transform:scale(1.05);}
.cert-doc-expand{
  position:absolute; top:10px; right:10px; width:30px; height:30px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:rgba(0,0,0,0.55); backdrop-filter:blur(6px); color:#fff;
  border:1px solid rgba(237,239,247,0.25);
  opacity:0; transform:translateY(-4px); transition:opacity .25s ease, transform .25s ease, background .25s ease, border-color .25s ease;
}
.cert-doc-card:hover .cert-doc-expand, .cert-doc-frame:focus-visible .cert-doc-expand{opacity:1; transform:translateY(0);}
.cert-doc-frame:hover .cert-doc-expand{background:var(--accent); border-color:var(--accent); color:#050810;}
.cert-doc-frame:focus-visible{outline:2px solid var(--accent); outline-offset:2px;}
@media (hover:none){ .cert-doc-expand{opacity:1; transform:translateY(0);} }
.cert-doc-badge{display:inline-flex; align-items:center; gap:6px; font-size:11.5px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--accent-2); margin-bottom:8px;}
.cert-doc-card h3{font-size:17.5px; margin-bottom:6px;}
.cert-doc-desc{font-size:13.5px; color:var(--text-muted); line-height:1.6; margin-bottom:16px;}
.cert-doc-facts{display:flex; flex-direction:column; border-top:1px solid var(--border);}
.cert-doc-facts .fact-row{padding:9px 0;}
.cert-doc-view{display:inline-flex; align-items:center; gap:6px; margin-top:14px; font-size:13px; font-weight:600; color:var(--accent-2); text-decoration:none;}
.cert-doc-view svg{width:14px; height:14px; stroke:currentColor; transition:transform .15s ease-out;}
.cert-doc-view:hover svg{transform:translate(3px,-3px);}
@media (max-width:900px){.cert-doc-grid{grid-template-columns:1fr;} .cert-doc-frame{height:280px;}}
.case-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:18px;}
.case-card{
  border-radius:var(--radius); padding:28px 26px;
  transition:border-color .15s ease-out, transform .15s ease-out, box-shadow .15s ease-out, background .15s ease-out;
}
.case-card.is-placeholder{border:1px dashed var(--border); background:transparent;}
.case-card.is-placeholder:hover{border-color:var(--accent); transform:translateY(-4px); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.case-card:active{transform:scale(.98); transition-duration:.1s;}
.case-tag{
  display:inline-block; font-size:11px; font-family:'JetBrains Mono',monospace; color:var(--accent-2);
  border:1px dashed var(--border); padding:4px 10px; border-radius:6px; margin-bottom:16px; letter-spacing:.03em;
}
.case-card h4{font-size:18px; margin-bottom:10px; color:var(--text-dim); font-style:italic; font-weight:500;}
.case-result{font-family:'Inter',sans-serif; font-size:15px; font-weight:600; color:var(--accent-2); margin-bottom:10px;}
.case-card p{font-size:14px; color:var(--text-dim); line-height:1.65; font-style:italic;}

.testi-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:18px;}
.testi-card{
  border-radius:var(--radius); padding:28px 26px;
  transition:border-color .15s ease-out, transform .15s ease-out, box-shadow .15s ease-out, background .15s ease-out;
}
.testi-card.is-placeholder{border:1px dashed var(--border); background:transparent;}
.testi-card.is-placeholder:hover{border-color:var(--accent); transform:translateY(-4px); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.testi-card:active{transform:scale(.98); transition-duration:.1s;}
.testi-card .quote-mark{font-family:'Inter',sans-serif; font-size:32px; color:var(--accent-soft); line-height:1; margin-bottom:6px; display:block;}
.testi-card p{font-size:15px; color:var(--text-dim); font-style:italic; line-height:1.65; margin-bottom:18px;}
.testi-who{display:flex; align-items:center; gap:12px;}
.testi-avatar{
  width:40px; height:40px; border-radius:50%; background:transparent; border:1px dashed var(--border);
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
}
.testi-avatar svg{width:18px; height:18px; stroke:var(--text-dim);}
.testi-who .name{font-size:14.5px; color:var(--text-dim); font-weight:500;}
.testi-who .role{font-size:12.5px; color:var(--text-dim); opacity:.8;}
@media (max-width:900px){.cert-grid, .case-grid, .testi-grid{grid-template-columns:1fr;}}

/* ---------- PROCESS ---------- */
.process-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin-bottom:44px;}
.process-step{
  border:1px solid var(--border); border-radius:var(--radius); padding:26px 22px; background:var(--surface);
  position:relative; transition:border-color .15s ease-out, transform .15s ease-out, background .15s ease-out, box-shadow .15s ease-out;
}
.process-step:hover{border-color:var(--accent); transform:translateY(-4px); background:var(--surface-2); box-shadow:0 14px 30px -14px rgba(0,0,0,0.4);}
.process-step:active{transform:scale(.98); transition-duration:.1s;}
.process-step .pnum{
  font-family:'Inter',sans-serif; font-weight:700; font-size:13px; color:var(--accent-2);
  border:1px solid var(--border); width:30px; height:30px; border-radius:50%;
  display:flex; align-items:center; justify-content:center; margin-bottom:16px;
}
.process-step h4{font-size:16.5px; margin-bottom:8px;}
.process-step p{font-size:13.5px; color:var(--text-muted); line-height:1.6;}
.process-cta{
  border:1px solid var(--border); border-radius:12px; padding:22px 28px;
  display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:16px;
  background:var(--surface);
}
.process-cta p{font-size:14.5px; color:var(--text-muted);}
.process-cta .actions{display:flex; gap:12px; flex-wrap:wrap;}
@media (max-width:1100px){.process-grid{grid-template-columns:repeat(2,1fr);}}

/* ---------- COMPANY TEASER (homepage) ---------- */
/* Leadership/Journey/Community/FAQ moved to their own company.html page
   (same pattern as Products/Solutions/Careers already getting dedicated
   pages) — this replaces all four on the homepage with one compact band:
   a strip of team photos, a line of copy, and a link out. */
.company-teaser-band{
  display:flex; align-items:center; gap:28px; flex-wrap:wrap;
  border:1px solid var(--border); border-radius:var(--radius); padding:24px 28px;
  background:var(--surface);
}
.company-teaser-photos{display:flex; flex-shrink:0;}
.company-teaser-photos img{
  width:56px; height:56px; border-radius:50%; object-fit:cover;
  border:2px solid var(--bg); margin-left:-14px; box-shadow:0 4px 12px -4px rgba(0,0,0,.5);
}
.company-teaser-photos img:first-child{margin-left:0;}
.company-teaser-copy{flex:0 1 auto; max-width:640px; min-width:240px;}
.company-teaser-copy .kicker{margin-bottom:8px;}
.company-teaser-copy .section-desc{margin-top:8px; text-align:left;}
@media (max-width:760px){
  .company-teaser-band{flex-direction:column; align-items:flex-start; text-align:left;}
  .company-teaser-band .btn{width:100%; justify-content:center;}
}

/* ---------- CAREERS ---------- */
.careers-grid{display:grid; grid-template-columns:1.1fr 0.9fr; gap:64px; align-items:start;}
.careers-copy p{color:var(--text-muted); font-size:15.5px; line-height:1.75; margin-bottom:16px;}
.careers-panel{border:1px solid var(--border); border-radius:var(--radius); padding:28px; background:var(--surface);}
.careers-panel h4{font-size:15px; margin-bottom:10px;}
.careers-panel p{font-size:14px; color:var(--text-muted); line-height:1.65; margin-bottom:20px;}
.careers-fallback{font-size:12.5px !important; color:var(--text-dim) !important; margin:12px 0 0 !important; text-align:center;}
.careers-fallback a{color:var(--accent-2); text-decoration:underline; text-underline-offset:2px;}
@media (max-width:900px){.careers-grid{grid-template-columns:1fr; gap:36px;}}

/* ---------- FAQ ---------- */
.faq-list{max-width:760px;}
.faq-item{border-bottom:1px solid var(--border);}
.faq-item summary{
  display:flex; justify-content:space-between; align-items:center; gap:20px;
  padding:22px 0; cursor:pointer; list-style:none; font-family:'Inter',sans-serif;
  font-size:16px; font-weight:500; color:var(--text);
}
.faq-item summary::-webkit-details-marker{display:none;}
.faq-item .chevron{width:18px; height:18px; stroke:var(--text-dim); flex-shrink:0; transition:transform .3s ease;}
.faq-item[open] .chevron{transform:rotate(180deg);}
.faq-item p{padding:0 0 22px; margin:0; font-size:14.5px; color:var(--text-muted); line-height:1.7; max-width:640px;}

/* ---------- THEME TOGGLE / LIGHT MODE ---------- */
/* A lighter, projector/print-friendly palette for the main content sections.
   The opening splash, hero, partner marquee band, footer, and nav/mobile-menu
   chrome are the ONLY parts of the site that stay solid dark regardless of
   theme (an explicit design choice — see their inline background:#000 and
   the rules just below); every other section — including the ones styled
   with var(--surface) for a lighter panel look (Solutions/Industries/Trust/
   Process/FAQ) — properly follows the toggle, since --surface
   itself flips from near-black to white below. */
:root[data-theme="light"]{
  --bg:#F7F8FC;
  --surface:#FFFFFF;
  --surface-2:#F1F3FA;
  --border:#E3E6F0;
  --text:#0C1222;
  --text-muted:#565F76;
  --text-dim:#7A8298;
  --accent-soft:rgba(76,124,255,0.08);
  --accent-2:#0E8F79;
}
:root[data-theme="light"] #introSplash,
:root[data-theme="light"] .nav,
:root[data-theme="light"] .mobile-menu,
:root[data-theme="light"] .hero,
:root[data-theme="light"] footer,
:root[data-theme="light"] #partners,
:root[data-theme="light"] #offerings{
  /* `color` has to be re-declared here, not just the --text variable: `color`
     is an inherited property, so any descendant that doesn't set its own
     `color` (e.g. .section-title, used bare in #partners) was inheriting the
     computed value from body{color:var(--text)} — resolved against the
     GLOBAL light-theme --text, not this block's pinned-dark one — and
     rendering near-invisible dark navy text on a black background. Setting
     color here gives those descendants the correct pinned value to inherit. */
  color:#EDEFF7;
  --bg:#000000;
  --surface:#0D0D0D;
  --surface-2:#181818;
  --border:#282828;
  --text:#EDEFF7;
  --text-muted:#8B93B0;
  --text-dim:#5A6382;
  --accent-soft:rgba(76,124,255,0.12);
}
.theme-toggle{
  display:inline-flex; align-items:center; justify-content:center;
  width:38px; height:38px; border-radius:50%; border:1px solid var(--border);
  background:transparent; color:var(--text); cursor:pointer; flex-shrink:0; padding:0;
  transition:border-color .25s ease, background .25s ease, transform .25s ease;
}
.theme-toggle:hover{border-color:var(--accent); background:var(--accent-soft); transform:translateY(-1px);}
.theme-toggle svg{width:17px; height:17px; stroke:currentColor;}
.theme-toggle .icon-sun{display:none;}
:root[data-theme="light"] .theme-toggle .icon-moon{display:none;}
:root[data-theme="light"] .theme-toggle .icon-sun{display:block;}
.nav-actions{display:flex; align-items:center; gap:14px;}
.mobile-theme-row{display:flex; align-items:center; justify-content:space-between; padding:15px 0; border-bottom:1px solid var(--border);}
.mobile-theme-row span{font-size:16px; font-weight:500; font-family:'Inter',sans-serif; color:var(--text);}
/* Theme toggle stays visible in the compact mobile header too — previously
   only reachable by opening the hamburger menu and scrolling to
   "Appearance", which is one extra step just to flip light/dark. Left the
   copy inside the mobile menu as-is (harmless to have both). */

/* Back to top */
.totop{
  position:fixed; right:24px; bottom:24px; width:46px;height:46px;border-radius:50%;
  background:var(--surface); border:1px solid var(--border); display:flex; align-items:center; justify-content:center;
  cursor:pointer; opacity:0; pointer-events:none; transition:opacity .3s ease, transform .25s ease; z-index:90;
  padding:0; font:inherit; -webkit-appearance:none; appearance:none;
}
.totop.show{opacity:1; pointer-events:auto;}
.totop:hover{transform:translateY(-3px); border-color:var(--accent);}
.totop svg{width:18px;height:18px; stroke:var(--text);}

/* =========================================================================
   MULTI-PAGE ARCHITECTURE — nav dropdowns, mobile accordion, scroll cards,
   product stage, and shared "placeholder/pending" pattern used across the
   new standalone pages (products/solutions/case-studies/careers/insights).
   ========================================================================= */

/* ---------- Desktop nav dropdowns (Products / Solutions / Company) ---------- */
.nav-dropdown{position:relative;}
.nav-dd-trigger{
  display:inline-flex; align-items:center; gap:5px; background:none; border:none; cursor:pointer;
  font-family:'Inter',sans-serif; font-size:15px; color:var(--text-muted); padding:0; font:inherit;
}
.nav-links li{position:relative; padding:4px 0;}
.nav-dd-trigger:hover, .nav-dropdown.open .nav-dd-trigger{color:var(--text);}
.nav-dd-chevron{width:13px; height:13px; stroke:currentColor; transition:transform .2s ease;}
.nav-dropdown.open .nav-dd-chevron{transform:rotate(180deg);}
.nav-dd-panel{
  position:absolute; top:calc(100% + 14px); left:50%; transform:translateX(-50%) translateY(-6px);
  min-width:240px; background:var(--surface); border:1px solid var(--border); border-radius:12px;
  padding:8px; display:flex; flex-direction:column; gap:1px;
  box-shadow:0 24px 40px -20px rgba(0,0,0,.6);
  opacity:0; visibility:hidden; pointer-events:none;
  transition:opacity .2s ease, transform .2s ease, visibility 0s linear .2s;
  z-index:120;
}
.nav-dropdown.open .nav-dd-panel{
  opacity:1; visibility:visible; pointer-events:auto; transform:translateX(-50%) translateY(0);
  transition:opacity .2s ease, transform .2s ease;
}
.nav-dd-panel a{
  display:block; padding:10px 14px; border-radius:8px; font-size:14.5px; color:var(--text-muted);
  white-space:nowrap; transition:background .2s ease, color .2s ease;
}
.nav-dd-panel a:hover{background:var(--accent-soft); color:var(--text);}
@media (max-width:900px){ .nav-dropdown{display:none;} }

/* Wide two-column variant — used by the merged "What We Do" dropdown, which
   holds both Hardware and Solutions items under one trigger. Left-aligned
   to the trigger (not centered) since a 480px-wide panel centered under a
   short "What We Do" label near the left edge of the nav would run off
   the viewport. Both selectors below need the extra .nav-dd-panel-wide
   class to out-specificity the single-class base rules regardless of
   source order. */
.nav-dd-panel.nav-dd-panel-wide{
  min-width:480px; left:0; transform:translateY(-6px);
  display:grid; grid-template-columns:1fr 1fr; gap:0 4px;
}
.nav-dropdown.open .nav-dd-panel.nav-dd-panel-wide{ transform:translateY(0); }
.nav-dd-group-label{
  font-size:11px; font-weight:600; letter-spacing:.08em; text-transform:uppercase;
  color:var(--text-dim); padding:10px 14px 6px; font-family:'Inter',sans-serif;
}

/* ---------- Mobile accordion (What We Do / Company groups) ---------- */
.mobile-dd .mobile-dd-trigger{
  width:100%; display:flex; align-items:center; justify-content:space-between;
  background:none; border:none; padding:15px 0; font:inherit;
  font-size:16px; font-weight:500; font-family:'Inter',sans-serif; color:var(--text); cursor:pointer;
}
.mobile-dd .nav-dd-chevron{width:16px; height:16px; stroke:currentColor; transition:transform .25s ease; flex-shrink:0;}
.mobile-dd.open .nav-dd-chevron{transform:rotate(180deg);}
.mobile-dd-panel{
  max-height:0; overflow:hidden; transition:max-height .3s ease;
  display:flex; flex-direction:column;
}
.mobile-dd.open .mobile-dd-panel{max-height:700px;}
.mobile-dd-panel a{
  padding:12px 0 12px 16px; font-size:15px; color:var(--text-muted); border-bottom:none;
}
.mobile-dd{border-bottom:1px solid var(--border);}
.mobile-dd .mobile-dd-panel a:last-child{padding-bottom:16px;}
.mobile-dd-group{display:flex; flex-direction:column;}
.mobile-dd-group-label{
  font-size:11px; font-weight:600; letter-spacing:.08em; text-transform:uppercase;
  color:var(--text-dim); padding:14px 0 4px 16px;
}

/* ---------- Brand-listing grid ---------- */
/* Used for "Available brands" / "Platforms & brands" rows across
   Products/Solutions. This used to be a horizontal scroll-snap strip
   with the last card deliberately left peeking off the edge to hint
   it scrolls — but a partially-visible brand tile (even faded) still
   reads as a broken/cropped box, not an intentional peek, so it's a
   wrapping grid instead: every brand is fully visible, no scroll
   gesture required or to discover. */
.scroll-cards{
  display:grid; grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));
  gap:20px; padding:4px; margin:0;
}
.scroll-card{
  background:var(--surface); border:1px solid var(--border); border-radius:var(--radius);
  overflow:hidden; display:flex; flex-direction:column;
  transition:border-color .25s ease, transform .25s ease;
}
.scroll-card:hover{border-color:var(--text-dim); transform:translateY(-3px);}
.scroll-card-media{
  aspect-ratio:16/10; background:var(--surface-2); display:flex; align-items:center; justify-content:center;
  position:relative; overflow:hidden;
}
.scroll-card-media img{width:100%; height:100%; object-fit:cover;}
.scroll-card-media .sc-icon{width:44px; height:44px; stroke:var(--text-dim); stroke-width:1.4;}
.scroll-card-body{padding:20px 22px 22px; display:flex; flex-direction:column; gap:8px; flex:1;}
.scroll-card-body h4{font-size:17px;}
.scroll-card-body p{font-size:14px; color:var(--text-muted); line-height:1.6; flex:1;}
.scroll-card-body .sc-link{
  font-size:13.5px; font-weight:600; color:var(--accent-2); display:inline-flex; align-items:center; gap:6px;
  margin-top:4px;
}
.scroll-card-body .sc-link .btn-arrow{transition:transform .25s cubic-bezier(.2,.7,.2,1);}
.scroll-card:hover .sc-link .btn-arrow{transform:translateX(4px);}

/* Brand-listing variant of the scroll card, used in products.html under
   each category stage — a brand logo swatch instead of a photo/icon.
   Tinted background keyed off each card's own --bc custom property, same
   color-mix technique as .brand-chip elsewhere on the site, so the brand's
   real color reads clearly on the dark surface instead of sitting in a
   stark white box. Always-colored (not hover-only) since scroll cards get
   dragged/tapped on touch devices that have no hover state at all. */
.scroll-card-brand{align-items:center; text-align:center;}
.scroll-card-brand .scroll-card-media{
  aspect-ratio:auto; height:130px; padding:20px;
  background:color-mix(in srgb, var(--bc, var(--accent)) 14%, var(--surface-2));
}
.scroll-card-brand .scroll-card-media img{width:auto; height:44px; max-width:75%; object-fit:contain;}
.scroll-card-brand .scroll-card-body{align-items:center; text-align:center;}

/* ---------- Section eyebrow / page-hero shared across new pages ---------- */
.page-hero{padding:150px 0 60px; position:relative;}
.page-hero .kicker{margin-bottom:16px;}
.page-hero h1{font-size:clamp(2rem, 4.6vw, 3.4rem); max-width:22ch; color:var(--text); letter-spacing:-0.03em;}
.page-hero .page-sub{margin-top:18px; font-size:16.5px; color:var(--text-muted); max-width:640px; line-height:1.65;}
.breadcrumb{
  display:flex; align-items:center; gap:8px; font-size:13px; color:var(--text-dim);
  margin-bottom:24px; font-family:'Inter',sans-serif;
}
.breadcrumb a{color:var(--text-dim); transition:color .2s ease;}
.breadcrumb a:hover{color:var(--accent-2);}

/* ---------- Apple-style product category stage (products.html) ---------- */
.product-stage{
  min-height:82vh; display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center; background:#000; position:relative; padding:100px 32px 70px; overflow:hidden;
}
.product-stage-glow{
  position:absolute; inset:0; pointer-events:none;
  background:radial-gradient(ellipse 42% 46% at 50% 42%, rgba(76,124,255,0.22), transparent 68%);
}
.product-stage-icon{
  position:relative; z-index:1; margin-bottom:36px;
  display:flex; align-items:center; justify-content:center;
  opacity:0; transform:translateY(18px) scale(.96);
  transition:opacity .9s cubic-bezier(.2,.7,.2,1), transform .9s cubic-bezier(.2,.7,.2,1);
}
.product-stage.is-visible .product-stage-icon{opacity:1; transform:translateY(0) scale(1);}
/* The illustration itself gets its own continuous float/tilt animation on
   a separate element from the reveal above, since a CSS transition and a
   keyframe animation can't both drive the same element's `transform`
   without one clobbering the other. Reduced-motion is already handled
   globally (animation-duration forced to ~0 above), so no separate
   override is needed here. */
.product-stage-visual{
  width:min(320px, 62vw); filter:drop-shadow(0 34px 44px rgba(0,0,0,.5));
  animation:stageFloat 7s ease-in-out infinite;
}
.product-stage-visual.is-compact{width:min(220px, 48vw);}
/* Real product photography, swapped in for the hand-drawn SVGs above.
   img fills the same floating/tilting wrapper as the SVGs did, so the
   stageFloat animation and reveal-on-scroll transition both keep working
   unchanged — only the content inside differs. */
.product-stage-visual img{display:block; width:100%; height:auto;}
/* Cutout: background already removed, so the shape itself (laptop,
   tower) reads as the "object" and the existing drop-shadow filter
   casts a shadow that follows its silhouette, not a hard rectangle. */
.product-stage-visual-cutout{width:min(300px, 58vw);}
/* Photo: a full rectangular product shot (kept its own background) —
   rounded corners plus a hairline inner border read as a styled photo
   card rather than a screenshot, and it gets a bit more width since a
   landscape photo needs more room to stay legible than a cutout icon. */
.product-stage-visual-photo{width:min(380px, 74vw); filter:drop-shadow(0 26px 34px rgba(0,0,0,.55));}
.product-stage-visual-photo img{border-radius:16px; box-shadow:0 0 0 1px rgba(255,255,255,.08) inset;}
@keyframes stageFloat{
  0%, 100%{transform:translateY(0) rotate(-1.4deg);}
  50%{transform:translateY(-16px) rotate(1.4deg);}
}
.product-stage-eyebrow{
  position:relative; z-index:1; font-size:22px; font-weight:700; letter-spacing:.03em; text-transform:uppercase;
  color:var(--accent-2); margin-bottom:16px; font-family:'Inter',sans-serif;
}
@media (max-width:640px){
  .product-stage-eyebrow{font-size:17px;}
}
.product-stage h2{position:relative; z-index:1; font-size:clamp(2.2rem, 5vw, 3.8rem); color:#fff; letter-spacing:-0.03em; max-width:16ch;}
.product-stage .stage-sub{position:relative; z-index:1; margin-top:16px; font-size:16px; color:var(--text-muted); max-width:520px; line-height:1.65;}
.stage-note{
  position:relative; z-index:1; margin-top:28px; display:inline-flex; align-items:center; gap:8px;
  font-size:12.5px; color:var(--text-dim); border:1px dashed var(--border); border-radius:100px; padding:8px 16px;
}
.product-brands{padding:56px 0 90px; background:var(--bg);}
.product-brands .wrap > .kicker{margin-bottom:6px;}
.product-brands h3{font-size:22px; margin-bottom:24px;}

/* ---------- Optional "tell us what you need" spec configurator, one per
   product category on products.html. Reuses .form-field for inputs so it
   matches the contact form exactly; every field is a free-typeable input
   backed by a <datalist> of suggestions (same pattern as the contact form's
   "interest" field), not a locked-down <select>, since the visitor may want
   to type something not on the list. ---------- */
.config-panel{
  border:1px solid var(--border); border-radius:16px; background:var(--surface);
  padding:28px 30px; margin-top:28px;
}
.config-panel h4{margin:0 0 6px; font-size:17px;}
.config-panel .config-desc{font-size:13.5px; color:var(--text-dim); margin:0 0 20px; max-width:640px; line-height:1.7;}
.config-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:2px 18px;}
.config-grid .form-field{margin-bottom:16px;}
.config-panel .config-submit-row{margin-top:8px; display:flex; align-items:center; gap:16px; flex-wrap:wrap;}
.config-panel .config-note{font-size:12.5px; color:var(--text-dim);}
@media (max-width:640px){.config-panel{padding:22px 20px;}}

/* ---------- Shared "pending" placeholder pattern (already used for cert
   chips / case studies / testimonials on the homepage Trust section) —
   reused here for case-studies.html and insights.html cards that don't
   have real content yet. ---------- */
.pending-card{
  border:1px dashed var(--border); background:transparent;
}
.pending-card .pending-label{
  font-size:11.5px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--text-dim);
  font-family:'Inter',sans-serif;
}
.pending-card p, .pending-card h4{color:var(--text-dim) !important; font-style:italic;}

/* ---------- Anchor-link offset (site-wide) ---------- */
/* Any #section deep link (nav dropdown, footer, the About/Partners/Contact
   links other pages point back at index.html with) should stop with some
   breathing room below the fixed nav, not land flush underneath it. */
section[id]{scroll-margin-top:92px;}
.product-stage, .solution-block{scroll-margin-top:76px;}
