/* ============================================================
   KOMASA INC — Porcelain design system
   White glass surfaces · hairline strokes · green accent
   ============================================================ */
:root{
  /* --muted was #69758a, which failed WCAG 1.4.3 AA on every ground it appears
     over: 4.45:1 on the body gradient's top stop, 4.14 at the middle, 3.87 at the
     bottom and 4.29 through glass. The gradient darkens down the page, so the
     footer was the worst case. #5f6a7e is 12% toward ink, solved against the
     DARKEST stop so it passes everywhere: 5.22 / 4.85 / 4.54 / 5.03. It is the
     lightest permitted text colour in the system -- don't lighten it again. */
  --ink:#141a22; --slate:#3a4552; --muted:#5f6a7e;
  /* rgb triplets live next to their hex so an rgba() literal elsewhere can never
     drift from the token again — that is exactly how the line-card corner glow and
     the kicker dash kept the old hue-128 green through the 2026-08-16 retint. */
  --green-rgb:39,158,105; --green-light-rgb:110,222,171;
  --green:#279e69; --green-dark:#1f7d53; --green-soft:#e8f6ea;
  --green-glow:rgba(var(--green-rgb),.45);
  --blue:#0F6CBD; --blue-dark:#0B5493; --cyan:#3fc9e8; --cyan-deep:#19a8cc;
  --edge:#e2e6ec; --edge-soft:#eef1f5;
  --glass-hi:rgba(255,255,255,.62); --glass-lo:rgba(255,255,255,.30);
  --shadow-soft:0 10px 30px -12px rgba(18,28,44,.20);
  --shadow-card:0 24px 60px -18px rgba(18,28,44,.28);
  --radius:18px;
  --maxw:1340px;
  --green-light:#6edeab;--green-lighter:#a4f2cf;
  /* Promoted from index.html's inline block, because it is no longer scene-only.
     --green-dark clears 5.10:1 on pure white, but the body gradient darkens from
     #f8fafd to #e4ebf3 down the page, and against the lower half it drops to
     4.41 / 4.33 / 4.29 / 4.25 -- under AA. Every kicker now uses this instead,
     which holds 5.86-7.04 across the whole gradient. */
  --green-on-stage:#196542;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  font-family:Montserrat,system-ui,-apple-system,sans-serif;
  color:var(--ink);-webkit-font-smoothing:antialiased;overflow-x:hidden;
  background:linear-gradient(180deg,#f8fafd 0%,#eef2f7 40%,#e9eef5 75%,#e4ebf3 100%);
}
a{text-decoration:none;color:inherit}
img{display:block;max-width:100%}
::selection{background:var(--green-soft);color:var(--green-dark)}

/* ---------- ambient background ---------- */
.blobs{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.blob{position:absolute;border-radius:50%;filter:blur(90px);opacity:.5;will-change:transform}
.blob.b1{width:44vw;height:44vw;left:-10vw;top:-14vw;background:radial-gradient(circle,#d3f0f9 0%,transparent 65%)}
.blob.b2{width:38vw;height:38vw;right:-8vw;top:26vh;background:radial-gradient(circle,#dcf2e2 0%,transparent 65%)}
.blob.b3{width:46vw;height:46vw;left:24vw;bottom:-20vw;background:radial-gradient(circle,#e3ecf7 0%,transparent 62%)}

/* ---------- liquid glass nav ---------- */
.nav{position:fixed;top:0;left:0;right:0;z-index:90;display:flex;align-items:center;
  gap:clamp(10px,3vw,22px);
  padding:12px clamp(18px,4vw,46px);
  background:linear-gradient(180deg,rgba(255,255,255,.75),rgba(255,255,255,.56));
  backdrop-filter:blur(26px) saturate(190%);-webkit-backdrop-filter:blur(26px) saturate(190%);
  border-bottom:1px solid rgba(255,255,255,.7);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85),0 10px 30px -18px rgba(18,28,44,.25)}
/* The logo link is a flex item and used to inherit flex-shrink:1, so once the nav
   ran out of room flexbox crushed the <a> and img{max-width:100%} squashed the
   logo's width while height stayed pinned at 26px — 82% aspect distortion at
   768px, 78% at 375px. flex:0 0 auto on both the link and the img makes the
   brand un-squashable (same fix already applied to .lang and .burger); the
   clamp is what actually shrinks it on small screens, proportionally.
   :first-child so the RFQ .btn keeps its own shrink behaviour. */
.nav > a:first-child{flex:0 0 auto}
/* 30px is proportioned, not maximised. 38px was the measured ceiling and read as
   too big: it left 0.5px of air in the 39px content box and matched the CTA's
   height exactly, so a solid full-height hexagon spanned the bar edge to edge
   and competed with the primary action. Three criteria agree on 30-32:

     mark occupies 60-75% of the 39px content box   ->  24-30px  (30 = 77%)
     logo stays under the 38px CTA, identity < action -> <=32px  (30 = 79%)
     wordmark reads against the 15px nav links       ->  30-34px (30 = 1.06x)

   The old mark sat at 0.92x the link text, which was timid; 1.06x lets the brand
   lead without shouting. Below ~390px the width budget binds before 30px does —
   the language toggle and burger are fixed, so the room left for the mark grows
   with the viewport.

   RE-MEASURED 2026-09-04 for the Industrial Emerald lockup. Its trimmed aspect is
   6.20 against the old mark's 5.686, so it is 9.4% wider at the same height, and
   the old 16vw - 29px taper broke the narrow end: at 320px the burger overran the
   content edge by 10px and ate the whole 18px right gutter; at 360px it sat 12px
   into it. The budget is measured, not guessed — nav width, minus 2x the padding
   clamp, minus the fixed 126px of language toggle + burger, minus three gap
   clamps:

     viewport   logo budget   fits height   this clamp   slack
       320px        128px        20.6px       20.0px      4px
       360px        165px        26.7px       25.7px      6px
       375px        179px        28.9px       27.9px      6px
      >=390px       193px+       31.1px+      30.0px      7px+

   30px still caps it: that number came from the logo's HEIGHT against the 39px
   content box and the 38px CTA, neither of which the aspect change touched.
   Re-measure again if the aspect, the toggle, or the burger ever changes. */
.nav .logo{height:clamp(20px,14.5vw - 26.5px,30px);width:auto;flex:0 0 auto}
.nav .spacer{flex:1}
.nav .links{display:flex;gap:22px;font-size:15px;font-weight:700;color:var(--ink)}
.nav .links a{position:relative;padding:4px 0;transition:color .18s}
.nav .links a:hover,.nav .links a.on{color:var(--green-dark)}
.nav .links a.on::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px;border-radius:2px;background:var(--green)}
/* real <button> so Enter/Space work without hand-rolled key handling.
   nowrap + flex:none because a <button> flex-item shrinks and wraps where the
   old <span> did not — without these the nav grows to ~112px tall. */
.lang{font-family:inherit;font-size:12.5px;font-weight:700;line-height:1.2;color:var(--muted);
  white-space:nowrap;flex:0 0 auto;align-self:center;
  border:1px solid rgba(20,26,34,.12);
  border-radius:8px;padding:7px 10px;background:rgba(255,255,255,.55);cursor:pointer;user-select:none}
.lang b{color:var(--ink)}
/* flex:0 0 auto — as a flex item the button shrank to 22px wide despite the
   declared 40px, making the only mobile nav control near-untappable */
.burger{display:none;width:44px;height:44px;flex:0 0 auto;border:1px solid var(--edge);border-radius:10px;background:rgba(255,255,255,.6);cursor:pointer;position:relative}
.burger span,.burger span::before,.burger span::after{content:"";position:absolute;left:12px;right:12px;height:2px;border-radius:2px;background:var(--ink)}
.burger span{top:21px}.burger span::before{top:-6px;left:0;right:0}.burger span::after{top:6px;left:0;right:0}
.mmenu{display:none;position:fixed;top:64px;left:12px;right:12px;z-index:89;border-radius:16px;padding:12px;
  background:rgba(255,255,255,.92);backdrop-filter:blur(20px);border:1px solid var(--edge);box-shadow:var(--shadow-card)}
.mmenu a{display:block;padding:12px 14px;font-weight:700;color:var(--slate);border-radius:10px}
.mmenu a:hover{background:var(--edge-soft);color:var(--ink)}
.mmenu.open{display:block}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:10px;
  font-weight:700;font-size:14px;min-height:44px;padding:0 22px;cursor:pointer;border:none;
  /* was `all`, which covered non-animatable gradient backgrounds for nothing.
     ease-out because these are entering states, not exiting ones. */
  transition:color .18s ease-out,border-color .18s ease-out,box-shadow .18s ease-out,
             transform .18s ease-out,background-color .18s ease-out;
  font-family:inherit}
/* press feedback. Every button had :hover and none had :active, so on touch — where
   hover never fires — a tap produced no acknowledgement at all until the page moved. */
.btn:active{transform:translateY(0) scale(.985)}

/* ---- primary CTA ----
   FILL: the bright stop is *finished* by 35%, which keeps #34b37a at full strength
   while every glyph pixel clears 4.5:1 on white. The old 0/45/100 ramp measured
   3.13:1 and failed WCAG 1.4.3 AA — 14px/700 does not reach the large-text tier,
   which starts at 18.66px bold.

   35% is set by the SMALLEST button, not the common one. The label band begins at
   29.5% of the 38px/13px nav button, 30.9% of the 44px/14px default and 32.7% of
   the 52px/15px .btn-lg — so solving for 44px alone left the nav CTA at 4.43:1,
   just short. Re-check this number if any button's height or font-size changes.

   RIM: a counter-gradient — top matched to the fill's bottom colour, bottom matched
   to the fill's top. Two backgrounds, one clipped to padding-box and one to
   border-box; border-image would ignore the corner radius. Beyond the look, it is
   the only rim that survives both grounds this button ships on: against light glass
   the dark half carries (5.52:1) and against the dark line-card tile the light half
   does (6.09:1). Any single-colour rim can only ever win one of the two — the old
   white hairline measured 1.06:1 on glass and 9.64:1 on the tile. */
.btn-primary{
  background:linear-gradient(180deg,#34b37a 0%,var(--green-dark) 35%,#1c714a 100%) padding-box,
             linear-gradient(180deg,#1c714a 0%,#34b37a 100%) border-box;
  color:#fff;border:1px solid transparent;
  box-shadow:0 8px 18px -8px var(--green-glow)}
/* hover keeps the same shape one step deeper, so the label stays over 4.5:1 there too */
.btn-primary:hover{
  background:linear-gradient(180deg,var(--green) 0%,#175d3d 32%,#134a31 100%) padding-box,
             linear-gradient(180deg,#134a31 0%,var(--green) 100%) border-box;
  transform:translateY(-1px)}

/* ---- secondary ----
   Neutral at rest so the primary is the only green thing in the pair, then the ink
   fill rises from the bottom edge on hover and the label flips to white.

   The label is deliberately NOT wrapped in a <span>: applyLang() assigns innerHTML
   on every [data-en] element, so a wrapper would be deleted the first time anyone
   toggled the language, and the fill would then cover the text. isolation:isolate
   plus z-index:-1 paints the pseudo-element after the button's own background but
   before its inline content — same result, no markup to destroy. */
.btn-ghost{position:relative;isolation:isolate;overflow:hidden;
  background:rgba(255,255,255,.55);border:1px solid rgba(20,26,34,.18);color:var(--ink)}
/* scaleY, not translateY(100%): a percentage translate resolves against the
   pseudo-element's own height, and these buttons sit inside .rv blocks that are
   zero-height until revealed — 100% of 0 is 0, which would leave the ink fill
   covering the label at rest. scaleY(0) is 0 at any height. */
.btn-ghost::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--ink);
  transform:scaleY(0);transform-origin:bottom;
  transition:transform .3s cubic-bezier(.22,.7,.24,1)}
.btn-ghost:hover{color:#fff;border-color:var(--ink)}
.btn-ghost:hover::before{transform:scaleY(1)}
.btn-lg{min-height:52px;padding:0 30px;font-size:15px;border-radius:12px}
.nav .btn{min-height:38px;font-size:13px;padding:0 16px}
:focus-visible{outline:2px solid var(--blue);outline-offset:2px}

/* ---------- touch targets ----------
   Apple HIG 44x44pt / Material 48x48dp. Applies to coarse pointers (real
   phones/tablets) OR any viewport at tablet width and below, so touch laptops
   and narrow windows are covered too. Wide desktop density is unchanged. */
@media (pointer:coarse),(max-width:1020px){
  .nav .btn,.btn{min-height:44px}
  .nav .links a{padding:12px 0}
  .lang{min-height:44px}
  /* logo link and skip link are real targets too */
  .nav > a{display:inline-flex;align-items:center;min-height:44px}
  .skip-link{display:inline-flex;align-items:center;min-height:44px}
  /* footer nav columns: bare <a> in .foot, no class to hook */
  .foot a{display:inline-flex;align-items:center;min-height:44px}
  .legal a{display:inline-flex;align-items:center;min-height:44px}
  .mmenu a{padding:14px}
  .add-part{min-height:44px}
  /* standalone (non-prose) mailto links */
  .mail-link{display:inline-flex;align-items:center;min-height:44px}
  /* the hero pause control was the one interactive element this block missed, so
     it sat at 34px -- the smallest target on the page, and the only way to stop
     the hero animation on a tablet */
  .vid-toggle{min-height:44px}
  /* NOTE: inline links inside sentences (.lead a, .ph a) are deliberately left
     alone — WCAG 2.5.8 exempts them, and padding them breaks line layout. */
}

/* ---------- a11y utilities ---------- */
.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}
/* skip link: off-canvas until focused, then pinned over the fixed nav.
   px translate (not %) and :focus (not :focus-visible) — an anchor reached by
   Tab must reveal reliably, and % against a wrapping box resolved to 0. */
.skip-link{position:fixed;top:10px;left:10px;z-index:100;transform:translateY(-150px);
  white-space:nowrap;padding:10px 16px;border-radius:10px;font-size:13.5px;font-weight:700;
  background:#fff;color:var(--green-dark);border:1px solid var(--edge);
  box-shadow:var(--shadow-card);transition:transform .18s ease-out}
.skip-link:focus{transform:translateY(0)}
/* reduced-motion handling for .skip-link lives in the single block at the end */

/* ---------- layout primitives ---------- */
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 clamp(20px,4vw,44px);position:relative;z-index:1}
.section{padding:clamp(64px,9vh,110px) 0;position:relative}
.kicker{display:inline-flex;align-items:center;gap:10px;font-size:12px;font-weight:700;
  letter-spacing:.16em;text-transform:uppercase;color:var(--green-on-stage)}
/* A 3x14 bar at the label's own colour, not a 26x2 dash in --green-light.
   currentColor is the point: the mark can no longer drift away from its label on
   any ground. The old pale dash measured 1.47:1 against the light glass it sat on
   (below the 3:1 floor in WCAG 1.4.11 for a meaningful non-text mark) and 3.08:1
   LIGHTER than the label beside it; inverting it to a fixed dark green would have
   produced the same 3.08:1 gap the other way on the Boardroom band. Inheriting
   solves both at once, and it follows the two kickers that use --green-on-stage
   (hero, About) without needing their own rule. Now 4.71:1 on light, 10.46:1 on
   dark, and exactly 1.00:1 against the label everywhere.
   No glow: an 8px spread in currentColor would smear dark green across the page
   ground, which is the opposite of what the glow was doing for the pale dash. */
.kicker::before{content:"";width:3px;height:14px;border-radius:2px;background:currentColor}
h1{font-size:clamp(32px,4.6vw,58px);line-height:1.05;font-weight:800;letter-spacing:-.02em}
h2{font-size:clamp(24px,3.2vw,40px);line-height:1.1;font-weight:800;letter-spacing:-.02em}
h3{font-size:19px;font-weight:800;letter-spacing:-.01em}
.em{color:var(--green-dark)}
.lead{font-size:clamp(15px,1.35vw,18px);line-height:1.65;color:var(--slate);font-weight:500}
.sub{font-size:14.5px;line-height:1.65;color:var(--muted)}

/* ---------- glass surfaces ---------- */
.glass{background:linear-gradient(165deg,var(--glass-hi),var(--glass-lo));
  backdrop-filter:blur(20px) saturate(165%);-webkit-backdrop-filter:blur(20px) saturate(165%);
  border:1px solid rgba(255,255,255,.78);border-radius:var(--radius);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),var(--shadow-soft)}
.glass-deep{box-shadow:inset 0 1px 0 rgba(255,255,255,.9),var(--shadow-card)}
.card{padding:26px}
.tile{padding:28px;transition:transform .25s ease,box-shadow .25s ease}
.tile:hover{transform:translateY(-4px);box-shadow:inset 0 1px 0 rgba(255,255,255,.9),var(--shadow-card)}

/* ---------- hero ---------- */
.hero{position:relative;min-height:100vh;display:flex;align-items:center;overflow:hidden;
  padding:110px 0 40px}
.hero-grid{display:grid;grid-template-columns:minmax(340px,46%) 1fr;gap:clamp(20px,4vw,60px);align-items:center}
.hero-visual{position:relative}
.hero-visual img{width:100%;height:auto;filter:drop-shadow(0 34px 44px rgba(20,30,48,.26));will-change:transform}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px}
.chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:700;color:var(--slate);
  background:rgba(255,255,255,.55);border:1px solid rgba(255,255,255,.8);border-radius:999px;padding:6px 12px}
.chip .dot{width:6px;height:6px;border-radius:50%;background:var(--green)}
.scrollcue{position:absolute;left:50%;bottom:18px;transform:translateX(-50%);z-index:5;
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-weight:700;
  display:flex;align-items:center;gap:10px;pointer-events:none}
.scrollcue .ln{width:1px;height:28px;background:linear-gradient(var(--cyan-deep),transparent);animation:cue 1.8s ease-in-out infinite}
@keyframes cue{0%,100%{opacity:.35;transform:scaleY(.7)}50%{opacity:1;transform:scaleY(1)}}

/* ---------- stat strip ---------- */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(12px,2vw,22px)}
.stat{padding:22px 24px;text-align:left}
.stat .n{font-size:clamp(26px,3vw,38px);font-weight:800;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums}
.stat .n .u{color:var(--green-dark)}
.stat .l{font-size:12.5px;font-weight:600;color:var(--muted);margin-top:4px}

/* ---------- feature grid ---------- */
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(14px,2vw,26px)}
.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:clamp(14px,2vw,26px)}
.icn{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;
  background:var(--green-soft);color:var(--green-dark);margin-bottom:16px}
.icn.blue{background:#e7f1fb;color:var(--blue)}
.icn.cyan{background:#e5f7fc;color:var(--cyan-deep)}
.icn svg{width:22px;height:22px}

/* ---------- industry cards (parallax floats) ---------- */
.ind-card{position:relative;overflow:visible;padding:30px 26px 26px;text-align:center}
.ind-card .bimg{height:150px;display:flex;align-items:flex-end;justify-content:center;margin-bottom:6px}
.ind-card .bimg img{max-height:150px;width:auto;filter:drop-shadow(0 16px 18px rgba(20,30,48,.18));will-change:transform}
.ind-card .shadow{width:56%;height:14px;margin:2px auto 14px;border-radius:50%;
  background:radial-gradient(ellipse,rgba(18,28,44,.28) 0%,transparent 68%);filter:blur(4px)}
.ind-card .tags{display:flex;flex-wrap:wrap;gap:7px;justify-content:center;margin-top:14px}
.tag{font-size:11.5px;font-weight:700;color:var(--slate);background:var(--edge-soft);border-radius:6px;padding:5px 10px}

/* ---------- OEM marquee ---------- */
.marquee{overflow:hidden;position:relative;padding:8px 0;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.marquee .row{display:flex;gap:16px;width:max-content;will-change:transform}
.brand{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;
  font-weight:800;letter-spacing:.02em;color:var(--slate);font-size:clamp(15px,1.6vw,20px);
  padding:16px 30px;border-radius:14px;
  background:linear-gradient(165deg,rgba(255,255,255,.7),rgba(255,255,255,.4));
  border:1px solid rgba(255,255,255,.8);box-shadow:var(--shadow-soft)}
.brand:hover{color:var(--ink)}
.brand small{font-weight:600;color:var(--muted);margin-left:8px;font-size:.72em}

/* ---------- process steps ---------- */
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(12px,2vw,22px);counter-reset:step}
.step{padding:24px;position:relative}
.step .num{font-size:12px;font-weight:800;letter-spacing:.12em;color:var(--cyan-deep)}
.step h3{margin:8px 0 8px}
.step p{font-size:13.5px;line-height:1.6;color:var(--muted)}

/* ---------- accordions ---------- */
details.acc{border-top:1px solid rgba(20,26,34,.08)}
details.acc summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;
  padding:13px 2px;font-size:14.5px;font-weight:700;color:var(--slate)}
details.acc summary::-webkit-details-marker{display:none}
details.acc summary:hover{color:var(--ink)}
details.acc summary::after{content:"+";font-size:16px;color:#1c9860;font-weight:800;transition:transform .2s}
details.acc[open] summary::after{transform:rotate(45deg)}
details.acc .body{padding:0 2px 13px;font-size:13.5px;line-height:1.6;color:var(--muted)}
details.acc .body b{color:var(--slate)}

/* ---------- forms ---------- */
.f-label{display:block;font-size:13px;font-weight:700;color:var(--ink);margin-bottom:6px}
.f-label .req{color:#DC2626}
.f-input,.f-select,.f-textarea{width:100%;border:1px solid var(--edge);border-radius:10px;
  background:rgba(255,255,255,.85);padding:12px 14px;font-size:14.5px;font-family:inherit;color:var(--ink);
  min-height:46px;transition:border .15s,box-shadow .15s}
.f-input:focus,.f-select:focus,.f-textarea:focus{outline:none;border-color:var(--blue);
  box-shadow:0 0 0 3px rgba(15,108,189,.15)}
.f-textarea{min-height:110px;resize:vertical}
.f-hint{font-size:12px;color:var(--muted);margin-top:5px}
.f-err{font-size:12.5px;font-weight:600;color:#DC2626;margin-top:5px;display:none}
.f-row{display:grid;gap:16px}
.invalid .f-input,.invalid .f-select{border-color:#DC2626}
.invalid .f-err{display:block}

/* ---------- footer ---------- */
footer{position:relative;z-index:1;margin-top:40px;
  background:linear-gradient(180deg,rgba(255,255,255,.55),rgba(255,255,255,.35));
  backdrop-filter:blur(18px);border-top:1px solid rgba(255,255,255,.8)}
.foot{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:30px;padding:52px 0 34px}
/* The footer has no height constraint — the limit is the column, 320px at its
   narrowest, so the hard cap is ~56px. 40px is the readable size that still
   leaves the mark subordinate to the copy beneath it. */
.foot .logo{height:40px;margin-bottom:14px}
.foot p{font-size:13px;line-height:1.65;color:var(--muted);max-width:340px}
/* h3, not h4 — the preceding heading in the document is an h2, so h4 skipped a level */
.foot h3,.foot h4{font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--slate);margin-bottom:12px}
.foot a{display:block;font-size:13.5px;font-weight:600;color:var(--muted);padding:4px 0}
.foot a:hover{color:var(--ink)}
.legal{border-top:1px solid rgba(20,26,34,.08);padding:18px 0 52px; /* bottom bookend = .foot top padding */display:flex;justify-content:space-between;
  flex-wrap:wrap;gap:10px;font-size:12px;color:var(--muted)}

/* ---------- page hero (inner pages) ---------- */
.page-hero{padding:150px 0 40px;position:relative}
.page-hero .lead{max-width:640px;margin-top:16px}

/* ---------- reveal / parallax helpers ---------- */
.rv{opacity:0;transform:translateY(34px)}
.no-js .rv,body.static .rv{opacity:1;transform:none}
/* the pinned-scene About block is opacity:0 inline and was NOT covered above,
   so it stayed invisible on desktop whenever the choreography never ran */
.no-js .about-title{opacity:1!important;position:static!important;transform:none!important;
  width:100%!important;margin:26px auto 0!important}
.no-js .scrollcue{display:none}
.parallax-deep,.parallax-mid,.parallax-soft{will-change:transform}


/* ---------- responsive ---------- */
@media (max-width:1020px){
  /* Collapse to the burger at 1020, not 720. The 6-link row + logo + language
     toggle + CTA needs ~895px, so between 721-895 the nav overflowed and the
     logo took the squeeze. 1020 also matches the tablet breakpoint used by the
     hero video gate, so there is one fewer breakpoint to reason about. */
  .nav .links{display:none}
  .burger{display:block}
  .hero-grid{grid-template-columns:1fr;gap:34px}
  .grid-3{grid-template-columns:1fr 1fr}
  .steps{grid-template-columns:1fr 1fr}
  .stats{grid-template-columns:1fr 1fr}
  .foot{grid-template-columns:1fr 1fr}
}
@media (max-width:720px){
  .grid-3,.grid-2,.steps{grid-template-columns:1fr}
  .hero{padding-top:96px}
  .foot{grid-template-columns:1fr}
}
@media (max-width:560px){
  /* Below ~560 the nav CTA no longer fits beside the logo without shrinking
     something. It is redundant on phones anyway: the burger menu already ends
     with "Request a Quote →", and the hero carries the primary CTA.
     Two classes beats .nav > a's one-class-one-element, so this wins. */
  .nav .btn{display:none}
}
/* single reduced-motion block — the .skip-link rule used to live separately */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .rv{opacity:1;transform:none}
  .scrollcue .ln{animation:none}
  .skip-link{transition:none}
  /* buttons keep every state change — they carry meaning — but arrive instantly,
     and the hover lift and press scale are dropped rather than animated */
  .btn,.btn-ghost::before{transition:none}
  .btn:hover,.btn:active{transform:none}
}
