/* ===== 00-critical.css ===== */
/* ==========================================================================
   00-critical.css — foundation · inlined in <head> AND kept in site.css
   DESIGN §3 tokens (verbatim) + context overrides, the metric-matched serif fallback (§2),
   html / body base, skip link. Keep it lean: nothing else belongs here.
   Section files never change a token; they read them.
   ========================================================================== */
:root{
  /* ---------- 3.1 grounds ---------- */
  --ink:#040913;
  --navy-950:#060D1B;
  --navy-900:#0A1528;
  --navy-850:#07101F;
  --navy-800:#0F1F3A;
  --navy-700:#173058;

  /* ---------- 3.2 paper (type on dark) ---------- */
  --paper:#F4EFE6;
  --paper-2:rgba(244,239,230,.80);
  --paper-3:rgba(244,239,230,.64);
  --paper-4:rgba(244,239,230,.34);
  --paper-88:rgba(244,239,230,.88);
  --paper-90:rgba(244,239,230,.90);

  /* ---------- 3.3 gold scale ---------- */
  --gold-lo:#8E7137;
  --gold:#C9A55C;
  --gold-hi:#E7CD92;
  --gold-pale:#F6E3B4;
  --champ:#E9DEC6;
  --champ-hi:#F3EAD8;
  --hair:rgba(244,239,230,.16);
  --hair-2:rgba(244,239,230,.09);
  --hair-gold:rgba(201,165,92,.62);
  --gold-50:rgba(201,165,92,.5);
  --gold-14:rgba(201,165,92,.14);
  --err:#EBA99B;

  /* ---------- 3.4 film scrims (hero-video.md §3; animate opacity only) ---------- */
  --scrim-top:linear-gradient(180deg,rgba(4,10,22,.66) 0%,rgba(4,10,22,.44) 9%,rgba(4,10,22,.16) 18%,rgba(4,10,22,0) 28%);
  --scrim-bot:linear-gradient(0deg,rgba(4,10,22,.62) 0%,rgba(4,10,22,.34) 14%,rgba(4,10,22,0) 34%);
  --scrim-wm:radial-gradient(58% 34% at 50.2% 84%,rgba(4,10,22,.52) 0%,rgba(4,10,22,.26) 55%,rgba(4,10,22,0) 100%);
  --vignette:radial-gradient(120% 90% at 50% 45%,rgba(4,10,22,0) 55%,rgba(4,10,22,.38) 100%);
  --film-side:linear-gradient(90deg,rgba(4,9,19,.16),rgba(4,9,19,0) 30%,rgba(4,9,19,0) 60%,rgba(4,9,19,.30)),radial-gradient(120% 90% at 50% 45%,rgba(4,9,19,0) 60%,rgba(4,9,19,.32));

  /* ---------- 3.5 glass (see §4 for the recipes) ---------- */
  --glass-sheen:linear-gradient(116deg,rgba(255,255,255,.11) 0%,rgba(255,255,255,.025) 26%,rgba(255,255,255,0) 50%);
  --glass-fill:linear-gradient(180deg,rgba(9,19,38,.58),rgba(5,11,23,.74));
  --glass-bevel-fill:linear-gradient(180deg,rgba(16,32,62,.26),rgba(5,11,23,.40));
  --glass-bevel-color:rgba(226,238,255,.15) rgba(170,198,245,.045) rgba(190,214,255,.07) rgba(208,226,255,.095);
  --glass-rim:linear-gradient(135deg,rgba(255,255,255,.66) 0%,rgba(255,255,255,.16) 22%,rgba(255,255,255,.04) 48%,rgba(231,205,146,.10) 74%,rgba(231,205,146,.46) 100%);
  --glass-reflect:linear-gradient(112deg,rgba(255,255,255,0) 57%,rgba(255,255,255,.05) 64%,rgba(255,255,255,.012) 72%,rgba(255,255,255,0) 78%);
  --glass-shadow:0 0 0 1px rgba(4,9,19,.34),inset 0 0 0 1px rgba(255,255,255,.055),inset 0 26px 46px -30px rgba(255,255,255,.12),inset 0 -22px 34px -28px rgba(150,190,255,.10),0 40px 80px -36px rgba(0,0,0,.72),0 12px 26px -16px rgba(0,0,0,.5);
  --glass-blur:blur(20px) saturate(1.35);
  --glass-solid:linear-gradient(180deg,rgba(12,25,50,.93),rgba(6,13,27,.95));
  --glass-solid-bevel:linear-gradient(180deg,rgba(24,42,76,.9),rgba(10,20,40,.92));
  --deep-fill:linear-gradient(180deg,rgba(9,21,46,.66),rgba(5,11,23,.82));
  --deep-blur:blur(20px) saturate(1.1) brightness(.84);
  --clear-fill:linear-gradient(180deg,rgba(13,26,50,.18),rgba(5,11,23,.30));
  --pill-fill:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.03));
  --pill-border:rgba(255,255,255,.32);
  --pill-shadow:inset 0 0 0 3px rgba(255,255,255,.04),inset 0 1px 0 rgba(255,255,255,.34),0 8px 24px -12px rgba(0,0,0,.6);
  --pill-blur:blur(12px) saturate(1.3);
  --pill-solid:rgba(14,28,54,.9);
  --bar-fill:linear-gradient(180deg,rgba(9,19,38,.74),rgba(6,13,27,.80));
  --bar-shadow:inset 0 1px 0 rgba(255,255,255,.14),inset 0 -1px 0 rgba(255,255,255,.12),0 18px 50px -24px rgba(0,0,0,.7);
  --bar-blur:blur(18px) saturate(1.35);
  --bar-solid:rgba(7,15,30,.96);
  --veil-blur:blur(22px) saturate(1.3);
  /* light fields: give section glass something to refract (static backgrounds, new) */
  --field-cold:radial-gradient(70% 55% at 16% 0%,rgba(60,96,160,.14),rgba(10,21,40,0) 70%);
  --field-warm:radial-gradient(55% 45% at 90% 100%,rgba(201,165,92,.07),rgba(201,165,92,0) 70%);
  --grain:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='256' height='256'><filter id='n' x='0' y='0' width='100%25' height='100%25'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='3 0 0 0 -1  3 0 0 0 -1  3 0 0 0 -1  0 0 0 0 1'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");

  /* ---------- 3.6 type ---------- */
  --serif:'Noto Serif Display','TV Serif Fallback',Georgia,'Times New Roman',serif;
  --sans:'Inter Tight','Segoe UI',system-ui,-apple-system,Roboto,Arial,sans-serif;
  --fs-micro:11.5px;
  --fs-micro-s:11px;
  --fs-small:13px;
  --fs-body:16px;
  --fs-text:clamp(15px,1vw,17px);
  --fs-lede:clamp(15px,1.04vw,18px);
  --fs-card:clamp(13.5px,.92vw,15.5px);
  --fs-intro:clamp(14px,.96vw,16.5px);
  --fs-row:clamp(16.5px,1.12vw,21px);
  --fs-note:clamp(15.5px,1.05vw,19.5px);
  --fs-cap:clamp(14.5px,.98vw,16.5px);
  --fs-h5:clamp(17px,1.25vw,22px);
  --fs-h4:clamp(20px,1.45vw,28px);
  --fs-h4b:clamp(19px,1.36vw,26px);
  --fs-h3:clamp(26px,2.2vw,42px);
  --fs-h3r:clamp(24px,2vw,36px);
  --fs-h2:clamp(30px,3vw,60px);
  --fs-h2-phone:clamp(25px,7vw,40px);
  --fs-panel:clamp(20px,1.42vw,28px);
  --fs-quote:clamp(21px,1.7vw,32px);
  --fs-mark:clamp(20px,1.6vw,28px);
  --fs-figure:clamp(32px,2.5vw,50px);
  --fs-stat:clamp(40px,3.6vw,72px);
  --fs-latin:clamp(40px,3.4vw,64px);
  --fs-dsg:clamp(56px,5.2vw,104px);
  --fs-tagline:clamp(20px,2.9svh,44px);
  --tr-caps:.2em; --tr-nav:.18em; --tr-mark:.18em; --tr-lock:.15em;

  /* ---------- 3.7 space ---------- */
  --m:clamp(20px,5vw,128px);
  --g:clamp(14px,1.7vw,28px);
  --wrap:1760px;
  --gutter:max(var(--m),calc((100% - var(--wrap)) / 2));
  --hh:clamp(64px,9.4vh,92px);
  --fh:clamp(54px,6.8vh,68px);
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:24px; --s-6:32px; --s-7:48px; --s-8:64px; --s-9:96px; --s-10:128px;
  --sec-pt:clamp(88px,11vh,150px);
  --sec-pb:clamp(84px,11vh,140px);
  --chap-pt:clamp(36px,6vh,72px);
  --head-gap:clamp(26px,3.6vh,48px);
  --block-gap:clamp(40px,6vh,76px);
  --inner-gap:clamp(24px,3.4vh,40px);
  --pad-panel:clamp(16px,1.3vw,26px);
  --pad-card:clamp(18px,1.5vw,26px);
  --measure:44ch;
  --measure-text:62ch;

  /* ---------- 3.8 radii: photo in a frame · controls (buttons, chips, tags, inputs) · glass panels, frames, dock · logo, pins ---------- */
  --r-1:1px; --r-2:2px; --r-3:3px; --r-round:50%;

  /* ---------- 3.9 z-index map ---------- */
  --z-film:1; --z-scrim:2; --z-grain:3; --z-frame-edge:4;
  --z-panel:25; --z-folio:26; --z-cover:30; --z-conn:31;
  --z-intro:40; --z-cover-intro:60;
  --z-header:100; --z-menu:200; --z-skip:300;
  /* local stacks: glass children 1, glass rim 3, reflection 0; layers window: film 0, side scrim 4, grain 5, overlay 5 */

  /* ---------- 3.10 motion ---------- */
  --ease:cubic-bezier(.22,.61,.36,1);
  --ease-out:cubic-bezier(.16,1,.3,1);
  --ease-io:cubic-bezier(.7,0,.2,1);
  --ease-std:cubic-bezier(.4,0,.2,1);
  --ease-drift:cubic-bezier(.45,0,.25,1);
  --t-swap:170ms;
  --t-exit:280ms;
  --t-fast:300ms;
  --t-hover:400ms;
  --t-base:600ms;
  --t-reveal:900ms;
  --t-slow:1200ms;
  --t-seg:5000ms;
  --t-intro:3520ms; --t-intro-short:640ms;

  /* ---------- 3.11 breakpoints (documentation; media queries use the literals) ---------- */
  --bp-xs:374px;
  --bp-phone:760px;
  --bp-tablet:1120px;
  --bp-nav:1280px;
  --bp-wide:1600px;
  --bp-ultra:2200px;
}
/* token overrides by context (proto values, new breakpoints) */
@media (orientation:portrait) and (max-width:1119.98px){:root{--hh:60px;--m:clamp(20px,5.2vw,56px);--fa:.5625}}
@media (orientation:portrait) and (max-width:760px){:root{--fa:.75}}
/* final-fix (AD item 4): real phone heights (390 × 664 Safari, 360 × 640 Android) — the hero film becomes a 16:10 band of the 4:3 film
   (object-fit:cover crops sky and tarmac only; the aircraft is centred), so the sheets below never sit on the aircraft */
@media (orientation:portrait) and (max-width:760px) and (max-height:700px){:root{--fa:.62}}
@media (orientation:landscape) and (max-height:500px){:root{--hh:52px;--fh:48px}}
@media (max-width:760px){:root{--sec-pt:80px;--sec-pb:72px}}
@media (min-width:2200px){:root{--fs-micro:13.5px;--fs-micro-s:12.5px;--fs-small:15px}}

/* serif fallback sized to the same TERRAVIA ink width, so the lockup fit holds before the web font arrives (§2, proto) */
@font-face{font-family:'TV Serif Fallback';src:local('Georgia'),local('Times New Roman');size-adjust:94.9%;ascent-override:113%;descent-override:31%}

/* base that the first paint needs (§3 base, §2 font features) */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;background:var(--ink);color-scheme:dark}
body{margin:0;font-family:var(--sans);font-weight:400;font-size:var(--fs-body);line-height:1.6;color:var(--paper);background:var(--navy-950);overflow-x:hidden;
  font-variant-numeric:lining-nums;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;font-synthesis:none}
/* skip link: the first focus stop of the page */
.skip{position:fixed;left:16px;top:-60px;z-index:var(--z-skip);background:var(--paper);color:var(--navy-950);padding:10px 16px;border-radius:var(--r-2);font-size:13px;font-weight:500;letter-spacing:.06em}
.skip:focus{top:16px}

/* ===== 01-base.css ===== */
/* ==========================================================================
   01-base.css — foundation · element reset, typographic defaults, .sec, scroll margins,
   tabular figures, generic vertical arrows, reduced-motion safety, print (DESIGN §2, §3, §6.6, §10)
   ========================================================================== */

/* ---- element reset (proto) ---- */
img{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer;text-align:inherit}
input,select,textarea{font:inherit;color:inherit;margin:0}
h1,h2,h3,h4,p,ul,ol,dl,dd,figure{margin:0;padding:0}
ul,ol{list-style:none}
em{font-style:italic}
b,strong{font-weight:500}                          /* 600 is never used on the page; never a faux bold (§2) */
a,button,summary,label{-webkit-tap-highlight-color:transparent}
::selection{background:rgba(231,205,146,.26);color:var(--paper)}

/* ---- focus: 1 px gold-hi, 4 px outside, on the ground (§6.5) ---- */
:focus-visible{outline:1px solid var(--gold-hi);outline-offset:4px}

/* ---- figures and wrapping (§2, binding) ---- */
.num,.qty,.st-v b,.lr-n,.dsg,.idx .r{font-variant-numeric:lining-nums tabular-nums}      /* every figure that stands in a column */
.h2,.p-t,.grp-title{text-wrap:balance}
p{text-wrap:pretty}                                                                       /* progressive; never relied on for fit */

/* ---- section shell (§3) ---- */
.sec{position:relative;isolation:isolate;padding:var(--sec-pt) var(--gutter) var(--sec-pb)}
.grp[id],#summary,#fleet-concrete,#fleet-asphalt,#fleet-earth,#fleet-transport{scroll-margin-top:calc(var(--hh) + 24px)}
/* integration: a section reached by a jump (nav, menu, deep link, no-JS anchor, the hero's release) begins where the header bar ends;
   its own padding-top stays the air above the overline. #objects sets the same in 30-objects.css; #technology (sticky stage) keeps 0 */
#company,#leadership,#fleet,#now,#contact{scroll-margin-top:var(--hh)}

/* ---- generic vertical arrows: .up = «Наверх» and back-links to a section above; .dn = down (§5.3) ---- */
.up,.dn{display:block;flex:none;width:1px;height:11px;background:currentColor;position:relative}
.up::after{content:"";position:absolute;left:-3px;top:0;width:6px;height:6px;border-left:1px solid currentColor;border-top:1px solid currentColor;transform:rotate(45deg)}
.dn::after{content:"";position:absolute;left:-3px;bottom:0;width:6px;height:6px;border-right:1px solid currentColor;border-bottom:1px solid currentColor;transform:rotate(45deg)}

/* ---- reduced motion: global safety rule (§6.6, proto); html.reduced also covers ?motion=0 ---- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}
}
html.reduced *,html.reduced *::before,html.reduced *::after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}

/* ---- print: for the official who prints the page (§10) ---- */
@media print{
  html,body{background:#fff!important;color:#111!important}
  body *{color:#111!important;-webkit-text-fill-color:currentColor!important;text-shadow:none!important}   /* cream-on-white would vanish; the gradient lockup too */
  .intro,.hero,.hdr,.menu,.t-fig,.form-acts,.foot-nav,.skip{display:none!important}
  .hero-fb{display:block!important} .t-track{height:auto!important} .t-stage{position:static!important;height:auto!important}
  .vit{background:none!important;border:1px solid #bbb!important;box-shadow:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
  .vit::before,.vit::after,.grain,[class*="scr"]{display:none!important}
  .lede,.txt,.st-l,.lb-text,.photo-cap{color:#333!important} .h2,.h3,.lb-name,.st-v{color:#111!important}
}

/* ===== 02-glass.css ===== */
/* ==========================================================================
   02-glass.css — foundation · the one material, four levels (DESIGN §4, proto verbatim)
   Navy smoked vitrine · mitred bevel · specular rim (white key top-left, champagne bounce bottom-right) · one reflection.
   Rules of use (§4.5): ≤ 3 backdrop surfaces over the moving film, blur ≤ 20 px over video, never animate backdrop-filter,
   depth ≤ 2, bevel ≤ 5 px (6 px ultra), radii 3 px vitrines / 2 px controls, glass only on a textured ground.
   ========================================================================== */

/* ---- Level A · Vitrine (.vit), Level B · Pane (.vit--thin), Window (.vit--clear), deep (.vit--deep) — §4.1 ---- */
.vit{
  --bev:5px;
  position:relative;isolation:isolate;border-radius:var(--r-3);border:var(--bev) solid;
  border-color:var(--glass-bevel-color);
  background:var(--glass-sheen) padding-box,var(--glass-fill) padding-box,var(--glass-bevel-fill) border-box;
  -webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);
  box-shadow:var(--glass-shadow);
}
.vit::before{ /* specular rim: white key light top-left, warm champagne bounce bottom-right */
  content:"";position:absolute;inset:calc(var(--bev)*-1);border-radius:inherit;padding:1.25px;pointer-events:none;z-index:3;
  background:var(--glass-rim);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
          mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0)}
.vit::after{ /* one calm reflection */
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;background:var(--glass-reflect)}
.vit>*{position:relative;z-index:1}
.vit--thin{--bev:3px}
.vit--deep{ /* over the lit cumulus / sun: calm the backdrop before tinting, so the glass stays navy */
  background:linear-gradient(116deg,rgba(255,255,255,.10) 0%,rgba(255,255,255,.02) 24%,rgba(255,255,255,0) 50%) padding-box,
             var(--deep-fill) padding-box,
             linear-gradient(180deg,rgba(16,32,62,.16),rgba(5,11,23,.30)) border-box;
  -webkit-backdrop-filter:var(--deep-blur);backdrop-filter:var(--deep-blur)}
.vit--clear{background:
    linear-gradient(116deg,rgba(255,255,255,.12) 0%,rgba(255,255,255,.03) 26%,rgba(255,255,255,0) 52%) padding-box,
    var(--clear-fill) padding-box,
    linear-gradient(180deg,rgba(13,26,50,.22),rgba(5,11,23,.36)) border-box}
@media (min-width:2200px){.vit{--bev:6px}.vit--thin{--bev:4px}}

/* ---- Level C · Pill — §4.2 (the components' geometry lives with their owners: .btn here in 03, .next/.dock in 10-hero) ---- */
.btn--glass,.next{border:1px solid var(--pill-border);background:var(--pill-fill);
  -webkit-backdrop-filter:var(--pill-blur);backdrop-filter:var(--pill-blur);box-shadow:var(--pill-shadow)}
.next{border-color:rgba(255,255,255,.30);background:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.025));
  box-shadow:inset 0 0 0 3px rgba(255,255,255,.04),inset 0 1px 0 rgba(255,255,255,.34),0 10px 26px -14px rgba(0,0,0,.7)}
.btn--glass:hover,.next:hover{background-color:rgba(255,255,255,.14);border-color:rgba(255,255,255,.5)}
.dock{border:1px solid rgba(255,255,255,.2);border-radius:var(--r-3);background:linear-gradient(180deg,rgba(20,38,70,.55),rgba(6,13,27,.72));
  -webkit-backdrop-filter:blur(16px) saturate(1.3);backdrop-filter:blur(16px) saturate(1.3);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22),inset 0 -1px 0 rgba(231,205,146,.12),0 18px 40px -18px rgba(0,0,0,.8)}

/* ---- Level D · Bar — §4.3 (header bar: transparent over the hero, solid past it; mobile menu veil) ---- */
.hdr::before{content:"";position:absolute;inset:0;z-index:-1;opacity:0;transition:opacity .5s var(--ease);
  background:var(--bar-fill);-webkit-backdrop-filter:var(--bar-blur);backdrop-filter:var(--bar-blur);box-shadow:var(--bar-shadow)}
.hdr.is-solid::before{opacity:1}
.menu{background:rgba(4,9,19,.6);-webkit-backdrop-filter:var(--veil-blur);backdrop-filter:var(--veil-blur)}

/* ---- Fallbacks — §4.4: html.low (saveData / weak device), html.noglass (no backdrop-filter), no-JS @supports ---- */
html.low .vit,html.noglass .vit,
html.low .vit--deep,html.noglass .vit--deep{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--glass-solid) padding-box,var(--glass-solid-bevel) border-box}
html.low .vit--clear,html.noglass .vit--clear{background:linear-gradient(180deg,rgba(13,26,50,.30),rgba(5,11,23,.40)) padding-box,var(--glass-solid-bevel) border-box}
html.low .btn--glass,html.noglass .btn--glass,html.low .next,html.noglass .next,
html.low .tag--photo,html.noglass .tag--photo{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--pill-solid)}
html.low .photo-cap--over,html.noglass .photo-cap--over{-webkit-backdrop-filter:none;backdrop-filter:none;background:rgba(6,13,27,.9)}
html.low .dock,html.noglass .dock{-webkit-backdrop-filter:none;backdrop-filter:none;background:rgba(10,20,40,.95)}
html.low .hdr::before,html.noglass .hdr::before{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--bar-solid)}
html.low .menu,html.noglass .menu{-webkit-backdrop-filter:none;backdrop-filter:none;background:rgba(4,9,19,.94)}
@supports not ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .vit,.vit--deep{background:var(--glass-solid) padding-box,var(--glass-solid-bevel) border-box}
  .vit--clear{background:linear-gradient(180deg,rgba(13,26,50,.30),rgba(5,11,23,.40)) padding-box,var(--glass-solid-bevel) border-box}
  .btn--glass,.next,.tag--photo{background:var(--pill-solid)} .photo-cap--over{background:rgba(6,13,27,.9)}
  .dock{background:rgba(10,20,40,.95)} .hdr::before{background:var(--bar-solid)} .menu{background:rgba(4,9,19,.94)}
}
@media (prefers-contrast:more){
  .vit,.vit--deep{background:var(--glass-solid) padding-box,var(--glass-solid-bevel) border-box}
  .vit--clear{background:linear-gradient(180deg,rgba(13,26,50,.30),rgba(5,11,23,.40)) padding-box,var(--glass-solid-bevel) border-box}
  .lede,.txt{color:var(--paper)}
}
@media (forced-colors:active){ .vit,.btn,.next,.dock,.chip,.tag,.inp{border:1px solid CanvasText} .vit::before,.vit::after{display:none} }
html.low .grain,html.reduced .grain,html.low .t-film::before,html.reduced .t-film::before{display:none}

/* ===== 03-components.css ===== */
/* ==========================================================================
   03-components.css — foundation · shared components (DESIGN §5, ownership §10)
   Sections USE these classes and may add a scoped modifier (.objects .tag{…}); they never redefine a base rule.
   Owned elsewhere: .chap (28) · .ledger .lr* .pm (30) · .t-* .pin .ld .co .ctx .chips (50) · .card .cbody .card-label .lb-* .qty (60)
                    · .form-grid .fld* .inp .form-* (80) · .foot* (90) · .hdr* .menu* (06) · hero furniture (10) · intro states (08)
   ========================================================================== */

/* ---------- 5.1 The lockup (the name) — static parts; hero adds .sw/.si/.au/.ix (08 / 10) ---------- */
.lk-fit{container:lk / inline-size;width:100%}
.lk{
  --tr:.15em; --wem:5.74; --fv:1000px; --hl:max(1px,.0065em); --cs:max(10px,.15em); --dy:.25em;
  position:relative;display:flex;flex-direction:column;width:max-content;margin:0 auto;
  font-size:min(calc(100cqi / var(--wem)),var(--fv));font-family:var(--serif);font-weight:300;line-height:1;color:var(--paper);text-align:left;
  font-kerning:none;font-variant-ligatures:none;font-synthesis:none}
.wm{position:relative;display:flex;white-space:nowrap;margin:-.169em -.008em -.112em -.025em;filter:drop-shadow(0 2px 22px rgba(4,9,19,.55))}
/* audit: an engine without container units (Safari < 16, e.g. iOS 15.x) cannot evaluate 100cqi: the whole min() above is then invalid at
   computed-value time (var() inside) and font-size falls back to the inherited ~16 px. There the hero / intro size comes from --fv, which
   their fit routines write in px, capped by the page column; the footer keeps §5.1's 62.7 px in its 360 px box */
@supports not (width:1cqi){
  .lk{font-size:min(var(--fv),calc((100vw - 2 * var(--m)) / var(--wem)))}
  .foot .foot-lk .lk{--fv:62.7px}
}
.ch{display:block;position:relative;margin-right:calc(var(--tr) + var(--k,0em))}
.ch:last-child{margin-right:0}
.ch b,.ch .au{display:block;font-weight:inherit;font-style:normal;
  background:linear-gradient(180deg,#FFFFFF 8%,#F4EFE6 46%,#DDD3BF 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
.ch.k-te{--k:-.042em}.ch.k-er{--k:-.006em}.ch.k-rr{--k:.012em}.ch.k-ra{--k:.010em}.ch.k-av{--k:-.07em}.ch.k-vi{--k:-.03em}.ch.k-ia{--k:-.034em}
.ch .au{position:absolute;left:0;top:0;opacity:0;background-image:linear-gradient(180deg,#F6E3B4 6%,#E7CD92 40%,#B8924A 100%)}
.dim{display:flex;align-items:center;height:var(--cs);margin-top:calc(var(--dy) - var(--cs) / 2);position:relative}
.dim .tk{flex:none;width:var(--hl);height:.1em;background:var(--gold)}
.dim .sg{flex:1 1 0;min-width:.3em;height:var(--hl);transform-origin:0 50%}
.dim .sg.l{background:linear-gradient(90deg,var(--gold-lo),var(--gold) 45%,var(--gold-hi))}
.dim .sg.r{background:linear-gradient(90deg,var(--gold-hi),var(--gold) 55%,var(--gold-lo))}
.dim .cn{flex:none;font:500 var(--cs)/1 var(--sans);letter-spacing:.46em;padding:0 .7em 0 1.16em;color:rgba(244,239,230,.95);white-space:nowrap;text-shadow:0 1px 12px rgba(4,9,19,.6)}

/* ---------- 5.20 Descriptor — mandatory wherever the wordmark stands alone ---------- */
.desc{--ds:clamp(11px,1.2svh,17px);display:flex;flex-wrap:wrap;justify-content:center;align-items:center;font:500 var(--ds)/1.4 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-88);text-shadow:0 1px 12px rgba(4,9,19,.75)}
.desc span{white-space:nowrap}
.desc .dl{display:inline-flex;align-items:center}
.desc .dl+.dl::before,.desc .dl i{content:"";display:inline-block;width:1.5em;height:1px;background:var(--gold);margin:0 1.1em 0 calc(1.1em - .18em);transform:translateY(-.06em)}
.desc .dl:last-child>span:last-child{margin-right:-.18em}
/* Everything above is §5.20 verbatim: one line (hero desktop, OG).
   .desc--stack (new): two lines d1 — d2 / d3 — place for a box narrower than the line (footer brand column, cards);
   no orphan dash at a line start; each line keeps the container's alignment (justify-content), size, caps and tracking. */
.desc--stack{row-gap:.5em}
.desc--stack .dl{flex-basis:100%;justify-content:inherit}
.desc--stack .dl+.dl::before{display:none}
.desc--stack .dl>span:last-child{margin-right:-.18em}
/* portrait phones (§5.20 «phones: two lines, sentence case»; the §7.4 values): the tracked caps line cannot fit
   (d1 — d2 at 11 px caps = 356 px; a 360 phone column is 320). Stacked like .desc--stack — so the container's
   alignment is kept: centred by default, flex-start in .foot-desc — in sentence case, never below §2's 13 px floor
   for non-caps text (a section's --ds ≥ 13 px is kept as is). The hero adds its own centred P-mode look in 10-hero.css. */
@media (orientation:portrait) and (max-width:760px){
  .desc{row-gap:4px;font-size:max(13px,var(--ds));font-weight:400;letter-spacing:.01em;text-transform:none}
  .desc .dl{flex-basis:100%;justify-content:inherit}
  .desc .dl+.dl::before{display:none}
  .desc .dl i{width:14px;margin:0 11px;transform:none}
  .desc .dl>span:last-child,.desc .dl:last-child>span:last-child{margin-right:0}
}

/* ---------- 5.2 Eyebrow — the chapter mark on panels and cards ---------- */
.eyebrow{display:flex;align-items:center;gap:14px;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-2)}
.eyebrow .mk{font-family:var(--serif);font-weight:400;font-size:14px;letter-spacing:.18em;color:var(--paper);white-space:nowrap;margin-right:-.18em;text-transform:none}
.eyebrow .rule{flex:1;min-width:18px;height:1px;background:linear-gradient(90deg,var(--hair-gold),rgba(201,165,92,.14))}
.eyebrow .lb{white-space:nowrap;margin-right:-.2em}
@media (min-width:2200px){.eyebrow .mk{font-size:16.5px}}

/* ---------- 5.3 Section overline — runhead (the numeral lives inside the i18n value) ---------- */
.runhead{display:flex;align-items:center;gap:16px;font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-2)}
.runhead .ov{display:inline-flex;align-items:center;gap:16px;white-space:nowrap}
.runhead .no{font:400 17px/1 var(--serif);letter-spacing:.08em;color:var(--paper);text-transform:none}
.runhead .dot{color:var(--paper-4);letter-spacing:0}
.runhead .rl{flex:1;min-width:24px;height:7px;align-self:center;       /* runway tick scale */
  background:linear-gradient(90deg,var(--hair-gold),rgba(201,165,92,.12)) 0 100%/100% 1px no-repeat,
             repeating-linear-gradient(90deg,rgba(201,165,92,.5) 0 1px,transparent 1px 56px) 0 100%/100% 5px no-repeat}
.runhead .rt{display:inline-flex;align-items:center;gap:10px;color:var(--paper-2);white-space:nowrap;padding:8px 0;border-bottom:1px solid var(--hair-gold);transition:color var(--t-fast)}
.runhead .rt:hover{color:var(--paper)}
@media (max-width:760px){.runhead{flex-wrap:wrap;row-gap:10px}
  /* phones: the right slot keeps only its arrow — the words stay for screen readers, the target stays 44 px, no stub underline */
  .runhead .rt{min-width:44px;min-height:44px;justify-content:flex-end;padding:0;border-bottom-color:transparent}
  .runhead .rt .tx{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}}

/* ---------- 5.5 Section heading, lede, body ---------- */
.h2{font-family:var(--serif);font-weight:300;font-size:var(--fs-h2);line-height:1.06;letter-spacing:-.008em;text-wrap:balance}
.h2 em{display:block;font-weight:300;color:rgba(244,239,230,.86)}
.h3{font:300 var(--fs-h3r)/1.12 var(--serif);letter-spacing:.002em;color:var(--paper)}
.lede{font-size:var(--fs-lede);line-height:1.64;color:var(--paper-2);max-width:var(--measure)}
.lede--strong{color:var(--paper)}
.txt{font-size:var(--fs-text);line-height:1.62;color:var(--paper-2);max-width:var(--measure-text)}
.txt+.txt{margin-top:1em}
.sec-head{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:var(--g);align-items:end;margin-top:var(--head-gap)}
.sec-head .lede{justify-self:end}
@media (max-width:1119.98px){.sec-head{grid-template-columns:1fr}.sec-head .lede{justify-self:start}}
@media (max-width:760px){.h2{font-size:var(--fs-h2-phone)}}

/* ---------- 5.6 Buttons, arrow, link-with-rule ---------- */
.arr{display:block;width:26px;height:1px;position:relative;flex:none;overflow:visible}
.arr::before{content:"";position:absolute;inset:0;background:currentColor;transform-origin:0 50%;transform:scaleX(.82);transition:transform .45s var(--ease)}
.arr::after{content:"";position:absolute;right:0;top:-3px;width:7px;height:7px;border-top:1px solid currentColor;border-right:1px solid currentColor;transform:rotate(45deg)}
a:hover>.arr::before,button:hover>.arr::before{transform:scaleX(1)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:14px;height:44px;padding:0 22px;font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;white-space:nowrap;border-radius:var(--r-2);transition:background-color var(--t-hover) var(--ease),color var(--t-hover) var(--ease),border-color var(--t-hover) var(--ease)}
.btn--glass{color:var(--paper)}
.btn--champ{background:var(--champ);color:var(--navy-950);border:1px solid rgba(255,255,255,.55);box-shadow:inset 0 1px 0 rgba(255,255,255,.7),0 10px 26px -14px rgba(0,0,0,.6)}
.btn--champ:hover{background:var(--champ-hi)}
.btn--wide{width:100%;justify-content:space-between}                                   /* hero III, phone sheets, menu, form on phones */
.btn:disabled{opacity:.45;pointer-events:none}
.lnk{display:inline-flex;align-items:center;gap:14px;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper);padding-bottom:8px;border-bottom:1px solid var(--hair-gold);white-space:nowrap;transition:color var(--t-fast)}
.lnk:hover{color:#fff}
@media (min-width:2200px){.btn{height:48px;padding:0 24px}}
/* touch targets ≥ 44 px below 1120 px: the hit area grows, the underline stays on the text (§5.6) */
@media (max-width:1119.98px){.lnk{position:relative}.lnk::before{content:"";position:absolute;left:0;right:0;top:-13px;bottom:-9px}}

/* ---------- 5.7 Chip (toggle) and tag (label) — the .chips row belongs to its section (50) ---------- */
.chip{min-height:32px;padding:5px 10px;border-radius:var(--r-2);font-size:12px;line-height:1.3;color:var(--paper-2);border:1px solid var(--hair);transition:color .3s,border-color .3s,background-color .3s}
.chip[aria-pressed="true"]{color:var(--paper);border-color:rgba(255,255,255,.4);background:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.03));box-shadow:inset 0 1px 0 rgba(255,255,255,.3)}
.chip:hover{border-color:rgba(255,255,255,.3)}
html.touch .chip{position:relative}
html.touch .chip::after{content:"";position:absolute;left:0;right:0;top:-6px;bottom:-6px}          /* 44 px hit area on touch */
.tag{display:inline-flex;align-items:center;gap:8px;height:24px;padding:0 9px;border:1px solid var(--hair);border-radius:var(--r-2);font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--paper-2);white-space:nowrap}
.tag--gold{border-color:var(--hair-gold);color:var(--gold-hi)}                            /* role tags */
.tag--live{border-color:var(--hair-gold);color:var(--paper)}                              /* «В работе», «В работе сейчас» */
.tag--live::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--gold-hi);box-shadow:0 0 0 3px rgba(231,205,146,.16)}   /* static, never pulses */
a.tag{position:relative;transition:border-color var(--t-fast),color var(--t-fast)}
a.tag::after{content:"";position:absolute;inset:-10px -6px}                                  /* 44 px hit area */
a.tag:hover{border-color:var(--gold);color:#fff}
.tag--photo{position:absolute;left:12px;top:12px;z-index:4;border-color:rgba(255,255,255,.22);color:var(--paper);background:rgba(6,13,27,.62);-webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2)}
@media (min-width:2200px){.chip{font-size:15px}.tag{height:27px;padding:0 10px}}

/* ---------- 5.9 Stat — the numbers strip (one vitrine, hairline tiles, static figures) ---------- */
.stats-panel{padding:0 var(--pad-panel)}
.stats{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));overflow:hidden}
.st{position:relative;display:flex;flex-direction:column;padding:clamp(20px,2.2vh,30px) clamp(14px,1.3vw,24px) clamp(18px,2vh,28px);box-shadow:-1px 0 0 var(--hair-2),0 -1px 0 var(--hair-2)}
.st-pre{display:block;min-height:1.2em;margin-bottom:10px;font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-3)}  /* reserved even when empty: figures share one baseline */
.st-v{display:flex;align-items:baseline;gap:.16em;font:300 var(--fs-stat)/.9 var(--serif);color:var(--paper);white-space:nowrap}
.st-v b{font-weight:inherit}                               /* the base b{500} must not thicken the figure */
.st-u{font:italic 300 .42em/1 var(--serif);color:var(--paper-2)}
.st-l{margin-top:14px;font-size:13.5px;line-height:1.45;color:var(--paper-2);max-width:20ch}
/* tiles 1 + 2 read as one fact («8 … из них 5 …»): a gold dimension bracket over both */
.st:nth-child(-n+2)::before{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:var(--hair-gold)}
.st:nth-child(1)::after,.st:nth-child(2)::after{content:"";position:absolute;top:0;width:1px;height:8px;background:var(--gold)}
.st:nth-child(1)::after{left:0}.st:nth-child(2)::after{right:0}
@media (max-width:1119.98px){.stats{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:760px){.stats{grid-template-columns:repeat(2,minmax(0,1fr))}.st-l{max-width:none}}
@media (min-width:2200px){.st-l{font-size:15px}}
/* word values (leadership facts «5 лет», «Одна команда») */
.stats--word .st-v{font-size:clamp(26px,2.2vw,40px);line-height:1.05;white-space:normal}
/* further .stats--word tweaks (e.g. no 1 + 2 gold bracket on the leadership facts) belong to 40-leadership.css (§10) */

/* ---------- 5.11 Photo figure with caption (real and silent photographs) ---------- */
.photo{position:relative}
.photo-win{padding:6px}                                   /* Level B frame; omit .photo-win for an unframed photo */
.photo-box,.slot{position:relative;overflow:hidden;border-radius:var(--r-1);aspect-ratio:4/3;
  background:radial-gradient(120% 90% at 28% 0%,rgba(60,96,160,.22),rgba(10,21,40,0) 60%),
             repeating-linear-gradient(135deg,rgba(255,255,255,.022) 0 1px,transparent 1px 10px),
             linear-gradient(180deg,rgba(10,22,44,.40),rgba(6,13,27,.62))}
[data-ratio="16x9"] .photo-box,.slot[data-ratio="16x9"]{aspect-ratio:16/9}
[data-ratio="3x2"] .photo-box,.slot[data-ratio="3x2"]{aspect-ratio:3/2}
[data-ratio="4x5"] .photo-box,.slot[data-ratio="4x5"]{aspect-ratio:4/5}
.photo-box img,.slot img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
.photo-box::after,.slot::after{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;
  background:linear-gradient(112deg,rgba(255,255,255,0) 40%,rgba(255,255,255,.045) 48%,rgba(255,255,255,.01) 57%,rgba(255,255,255,0) 63%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
.photo-box::before{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;background:var(--grain) 0 0/256px 256px;opacity:.04}   /* light grain on every photograph */
/* the loader (02-slots.js) fades a photograph in. Real photos may carry src="…" as well as data-src: without JS they are shown as is */
html.js .photo[data-slot] .photo-box img{opacity:0;transition:opacity .6s ease}
html.js .photo.is-shown .photo-box img{opacity:1}
html.js .photo[data-slot]:not(.has-img) .photo-box img{visibility:hidden}
.photo.has-img .slot-ph{display:none}
.photo-box img:not([src]),.slot img:not([src]){visibility:hidden}          /* no JS: an image the loader never filled shows no alt text, no broken icon */
/* hanging dash: the caption is one text flow, so values with inline markup (<span class="nb">, &nbsp;) never split into cells */
.photo-cap{margin-top:14px;padding-left:28px;text-indent:-28px;font:italic 300 var(--fs-cap)/1.4 var(--serif);color:var(--paper-2)}
.photo-cap::before{content:"—";display:inline-block;width:28px;text-indent:0;font:500 11px/1 var(--sans);letter-spacing:.2em;color:var(--paper-3)}
.photo-cap--over{position:absolute;left:12px;right:12px;bottom:12px;z-index:4;display:block;width:max-content;max-width:calc(100% - 24px);padding:7px 11px;text-indent:0;border:1px solid rgba(255,255,255,.18);border-radius:var(--r-2);
  font:italic 300 14px/1.35 var(--serif);color:var(--paper);background:rgba(6,13,27,.62);-webkit-backdrop-filter:blur(10px) saturate(1.2);backdrop-filter:blur(10px) saturate(1.2)}
.photo-cap--over::before{display:none}
html.reduced .photo[data-slot] .photo-box img{transition:none}

/* ---------- 5.12 OPEN PHOTO SLOT — museum label (no «скоро», no camera icon) ---------- */
.slot-ph{position:absolute;inset:0;z-index:1;display:grid;place-content:center;justify-items:center;gap:14px}
.slot-ph::before{content:"";position:absolute;inset:14px;pointer-events:none;opacity:.8;       /* viewfinder corners */
  background:linear-gradient(var(--gold),var(--gold)) 0 0/16px 1px no-repeat,linear-gradient(var(--gold),var(--gold)) 0 0/1px 16px no-repeat,
   linear-gradient(var(--gold),var(--gold)) 100% 0/16px 1px no-repeat,linear-gradient(var(--gold),var(--gold)) 100% 0/1px 16px no-repeat,
   linear-gradient(var(--gold),var(--gold)) 0 100%/16px 1px no-repeat,linear-gradient(var(--gold),var(--gold)) 0 100%/1px 16px no-repeat,
   linear-gradient(var(--gold),var(--gold)) 100% 100%/16px 1px no-repeat,linear-gradient(var(--gold),var(--gold)) 100% 100%/1px 16px no-repeat}
.slot.has-img .slot-ph{display:none}
.keys{display:flex;gap:.9em;font-size:clamp(9px,.72vw,13px)}
.keys span{display:flex;gap:.34em}
.keys i{display:block;width:.42em;height:2.6em;background:linear-gradient(180deg,rgba(244,239,230,.34),rgba(244,239,230,.16))}
.dsg{font:300 var(--fs-dsg)/.9 var(--serif);letter-spacing:.02em;color:transparent;-webkit-text-stroke:1px rgba(244,239,230,.5);font-variant-numeric:lining-nums tabular-nums}
/* ↑ §2 wins over §5.12's «lining-nums»: the `font` shorthand resets font-variant-numeric, so the 01-base rule cannot reach .dsg — it is restated here */
.dsg small{font:400 .22em/1 var(--sans);letter-spacing:.1em;-webkit-text-stroke:0;color:var(--paper-3);vertical-align:top;margin-left:.3em}
.slot-ar{position:absolute;right:22px;bottom:18px;font:500 11px/1 var(--sans);letter-spacing:.14em;color:var(--paper-4)}
/* name variant — open slots without an index (company figure if the file is removed, `now` card 2) */
.slot-ph--name .ph-name{max-width:26ch;padding:0 24px;text-align:center;font:italic 300 clamp(17px,1.3vw,22px)/1.3 var(--serif);color:var(--paper-2)}

/* ---------- 5.13 SILENT SLOT strip — hides as a whole until one photo arrives (no JS needed) ---------- */
.strip{display:none}
.strip:has(.photo.has-img){display:block}          /* heading + grid appear with the first photo */
.strip.has-photo{display:block}                    /* audit: the same for engines without :has() (class set by 95-audit.js) */
.strip-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--g)}
@media (max-width:760px){.strip-grid{grid-template-columns:1fr}}

/* ---------- 5.15 Progress I · II · III (hero) and the three-stop progress of the layers film ---------- */
.steps{display:flex;align-items:center;gap:14px}
.steps li{display:flex;align-items:center;gap:10px;color:var(--paper-3);transition:color .6s}
.steps .rn{font-family:var(--serif);font-weight:400;font-size:15px;letter-spacing:.08em;text-transform:none}
.steps .sl{margin-right:-.2em}
.steps li.is-done{color:var(--paper-2)}
.steps li.is-now{color:var(--paper)}
.trk{display:block;width:clamp(28px,3vw,64px);height:1px;background:rgba(244,239,230,.26);position:relative;overflow:hidden}
.trk u{position:absolute;inset:0;background:var(--gold-hi);transform:scaleX(0);transform-origin:0 50%}   /* filled by `progress` p, scaleX only */
@media (max-width:1279.98px){.steps .sl{display:none}}
@media (min-width:2200px){.steps .rn{font-size:18px}}
.tprog{display:flex;align-items:center;gap:12px;color:var(--paper-3)}
.tprog li{display:flex;align-items:center;gap:12px;white-space:nowrap;transition:color .5s}
.tprog li+li::before{content:"";width:22px;height:1px;background:var(--hair)}
.tprog li span{padding:6px 0 5px;border-bottom:1px solid transparent;transition:border-color .5s}
.tprog li.on{color:var(--paper)}
.tprog li.on span{border-bottom-color:var(--gold)}
@media (max-width:760px){.tprog,.tprog li{gap:8px}.tprog li+li::before{width:10px}}   /* proto; the tech stage tightens the tracking itself (§8.6) */

/* ---------- 5.17 Language switch ---------- */
/* §5.17 with min-width:28px restored. The 28 px box is padding + glyphs (7 + ~15 + 7), so the gold rule is inset by the same
   7 px and still ends with the glyphs (minus the trailing tracking); the slash sits optically centred between RU and UZ.
   margin-inline:-7px puts the glyph ink (not the padded box) on the container's edge, like the text around it. */
.lang{display:flex;align-items:center;gap:9px;margin-inline:-7px;font:500 var(--fs-micro)/1 var(--sans);letter-spacing:.16em}
.lang button{position:relative;min-width:28px;padding:10px 7px;color:var(--paper-3);transition:color var(--t-fast)}
.lang button:hover{color:var(--paper-2)}
.lang button[aria-pressed="true"]{color:var(--paper)}
.lang button[aria-pressed="true"]::after{content:"";position:absolute;left:7px;right:calc(7px + .16em);bottom:4px;height:1px;background:var(--gold)}
.lang span{color:var(--paper-4)}
/* touch: ≥ 44 × 44 hit area = 28 px box + 8 px each side (× 31.5 + 7 + 7); the two areas stay ≥ 6 px apart (9 + slash + 9 − 16) */
@media (max-width:1279.98px){.lang button::before{content:"";position:absolute;inset:-7px -8px}}
html.touch .lang button::before{content:"";position:absolute;inset:-7px -8px}

/* ===== 04-segment-player.css ===== */
/* TV.SegmentPlayer layers: two stacked films + two posters. Focal point comes from --sp-pos on the root. */
.sp{position:absolute; inset:0; overflow:hidden; background:#030c18; contain:strict}
.sp-v,.sp-poster{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; object-position:var(--sp-pos,50% 50%); opacity:0; pointer-events:none; user-select:none; -webkit-user-select:none}
.sp-v{z-index:1}
.sp-v.is-on{opacity:1}
.sp-poster{z-index:2; transition:opacity .45s ease}
.sp-poster2{z-index:3; transition:opacity .7s ease}
.sp-poster.is-on{opacity:1}
html.reduced .sp-poster{transition:none}

/* ===== 05-functional.css ===== */
/* Functional rules owned by the foundation (behaviour, not look). Design lives in 00-critical/01-03 and the section files. */
html.hero-locked, html.hero-locked body { overflow: hidden; overscroll-behavior: none; }
html.hero-locked #top .hero-stage, html.hero-locked [data-hero-stage] { touch-action: none; }
[hidden] { display: none !important; }
/* reveal: visible without JS, with reduced motion and after the safety timeout */
html.js:not(.reveal-all):not(.reduced) [data-reveal]:not(.is-in) { opacity: 0; transform: translate3d(0, 18px, 0); }
[data-reveal] { transition: opacity .9s var(--ease-out, cubic-bezier(.16,1,.3,1)) var(--d, 0ms), transform .9s var(--ease-out, cubic-bezier(.16,1,.3,1)) var(--d, 0ms); }
html.reduced [data-reveal] { transition: none; }
/* language switch: a short fade of the content, never of the header */
main, footer { transition: opacity .18s ease; }
html.lang-switching main, html.lang-switching footer { opacity: .2; }
/* photo slots: the image fades in when decoded */
.slot img { opacity: 0; transition: opacity .6s ease; }
.slot.is-shown img { opacity: 1; }
.slot:not(.has-img) img { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
html.reduced .slot img { transition: none; }
/* never-break spans from the copy deck */
.nb { white-space: nowrap; }
/* visually hidden, still read by screen readers */
.sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* ===== 06-header.css ===== */
/* ==========================================================================
   06-header.css — the page chrome: header, «Меню», the full-screen glass menu (DESIGN §5.16, §5.17, §8.11; ARCHITECTURE §2)
   Over the hero the header is BARE TYPE on the film's top scrim (a bar would sit on the cockpit glazing at stop I);
   past the hero it becomes the Level D glass bar. The bar and the veil recipes live in 02-glass.css (§4.3),
   .btn / .btn--glass / .arr / .lang in 03-components.css — used here, never redefined.
   State classes (07-header.js): .hdr.is-solid + html.past-hero · html.menu-open · .menu.is-open · a[aria-current="true"]
   No JS: «Меню» is a link to #menu and the menu opens with :target; the language switch (JS-only) is not shown.
   ========================================================================== */

/* the skip link (.skip, 00-critical.css) lives in 02-header.html; its target — and the section a menu link opened — takes focus
   without drawing a frame round the page (07-header.js) */
.is-focus-target:focus{outline:none}

/* ---------- shell ---------- */
.hdr{position:fixed;left:0;right:0;top:0;z-index:var(--z-header);height:var(--hh);padding:0 var(--gutter);
  display:grid;grid-template-columns:1fr auto 1fr;column-gap:clamp(24px,2.6vw,48px);align-items:center}   /* ≥ a nav gap between the three groups, also in UZ at 1280 */
/* the bar (::before, §4.3) is invisible over the film — keep it out of the backdrop budget there (§4.5: ≤ 3 over the moving film) */
.hdr::before{visibility:hidden;transition:opacity .5s var(--ease),visibility 0s .5s}
.hdr.is-solid::before{visibility:visible;transition:opacity .5s var(--ease),visibility 0s}
/* the bare type's own soft scrim: it deepens the film's top scrim just under the words (the hero thins that scrim to .5 at stop III,
   where the cumulus reaches the nav — ТЕХНИКА measured 3.7:1 without it, ≥ 4.8:1 with it). A gradient with no edge, never a bar
   and no hairline (§9 rule 2); plain alpha, no backdrop; it fades out under the solid bar */
.hdr::after{content:"";position:absolute;left:0;right:0;top:0;height:calc(var(--hh) + 48px);z-index:-2;pointer-events:none;
  background:linear-gradient(180deg,rgba(4,9,19,.34) 0%,rgba(4,9,19,.22) 45%,rgba(4,9,19,0) 100%);transition:opacity .5s var(--ease)}
.hdr.is-solid::after{opacity:0}
@media (orientation:portrait) and (max-width:1119.98px){.hdr::after{display:none}}   /* P mode (§7.4): the film starts below the header's navy band */

/* ---------- brand: emblem 40 + the optical master of the name (Serif 420, CONSTRUCTIONS justified to the ink) ---------- */
.hdr-brand{display:inline-flex;align-items:center;gap:14px;justify-self:start;min-width:0;min-height:44px}   /* audit: 44 px tap target (the emblem is 40) */
.hdr-logo{width:40px;height:40px;border-radius:var(--r-round);overflow:hidden;flex:none;box-shadow:0 0 0 1px rgba(231,205,146,.55),0 6px 18px -6px rgba(0,0,0,.6)}
.hdr-logo img{width:100%;height:100%;transform:scale(1.04)}
.hdr-name{display:inline-flex;flex-direction:column;gap:6px;line-height:1;white-space:nowrap;transition:opacity .6s var(--ease),transform .7s var(--ease-out)}
.hdr-name b{font-family:var(--serif);font-weight:420;font-size:19px;letter-spacing:.24em;margin-right:-.24em;text-shadow:0 1px 12px rgba(4,9,19,.45)}
.hdr-name i{display:flex;justify-content:space-between;font:500 9.5px/1 var(--sans);font-style:normal;color:var(--paper-2);padding-right:.1em}
html[data-hero="0"]:not(.past-hero) .hdr-name{opacity:0;transform:translateX(-8px)}     /* state 0: the big name is on screen */

/* ---------- desktop nav (≥ 1280): six items, gold rule on hover and on the section in view ---------- */
.hdr-nav{justify-self:center}
.hdr-nav ul{display:flex;gap:clamp(18px,2.2vw,40px)}
.hdr-nav a{position:relative;display:block;font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-nav);text-transform:uppercase;color:var(--paper-90);
  padding:12px 0;margin-right:-.18em;white-space:nowrap;text-shadow:0 1px 10px rgba(4,9,19,.5);transition:color var(--t-fast) var(--ease)}
.hdr-nav a::after{content:"";position:absolute;left:0;right:.18em;bottom:5px;height:1px;background:var(--gold);transform:scaleX(0);transform-origin:left;transition:transform .5s var(--ease-out)}
.hdr-nav a:hover,.hdr-nav a[aria-current="true"]{color:var(--paper)}
.hdr-nav a:hover::after,.hdr-nav a[aria-current="true"]::after{transform:scaleX(1)}
html.touch .hdr-nav a{padding:16px 0}                     /* 44 px targets on large touch screens */
html.touch .hdr-nav a::after{bottom:9px}

/* ---------- tools: glass CTA · RU / UZ · «Меню» ---------- */
.hdr-tools{justify-self:end;display:flex;align-items:center;gap:clamp(16px,2vw,30px)}
.hdr .btn{height:40px;padding:0 18px;gap:12px}
/* RU / UZ in the bar and in the menu: the §5.17 ink rhythm (9 px glyph ↔ slash) on the foundation's 28 px boxes, so the switch reads
   as one group next to the CTA and «Меню». Touch areas (the foundation's ::before, below 1280 and on touch) grow outwards:
   4 px towards the slash (the two meet there without overlapping), 12 px outside → ≥ 28 + 16 = 44 px wide, 45 px tall (§9 rule 34) */
.hdr .lang,.menu .lang{gap:2px}
.hdr .lang button{text-shadow:0 1px 10px rgba(4,9,19,.5)}
html .hdr .lang button:first-child::before,html .menu .lang button:first-child::before{inset:-7px -4px -7px -12px}
html .hdr .lang button:last-child::before,html .menu .lang button:last-child::before{inset:-7px -12px -7px -4px}
/* over the film the switch stands on the top scrim only, which a bright cloud can outshine (UZ measured 3.96:1 in --paper-3):
   the idle language takes --paper-2 there (§4.5 rule 4, §9 rule 14; ≥ 5.4:1 with the scrim above, states 0–III, 1024–2560);
   on the solid bar (a navy ground) it keeps the foundation's --paper-3 (≥ 5.9:1 over the brightest film under the bar) */
.hdr:not(.is-solid) .lang button[aria-pressed="false"]{color:var(--paper-2)}
.hdr:not(.is-solid) .lang button[aria-pressed="false"]:hover{color:var(--paper)}
.menu-btn{display:none;align-items:center;gap:12px;height:44px;font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper);
  text-shadow:0 1px 10px rgba(4,9,19,.5)}
.menu-btn i{display:grid;gap:6px;width:26px}
.menu-btn i::before,.menu-btn i::after{content:"";height:1px;background:currentColor;box-shadow:0 1px 8px rgba(4,9,19,.35)}
.menu-btn i::after{width:62%;justify-self:end}

/* ---------- mobile menu (below 1280): Level D veil (§4.3) + one vitrine; opens with opacity / transform only ---------- */
.menu{position:fixed;inset:0;z-index:var(--z-menu);overflow:hidden;
  opacity:0;visibility:hidden;transition:opacity .4s var(--ease),visibility 0s .4s}
.menu:focus{outline:none}                                  /* the dialog itself takes focus only as a catch-all; its controls show the ring */
.menu.is-open{opacity:1;visibility:visible;transition:opacity .4s var(--ease),visibility 0s}
/* reduced motion: the global .01 ms rule (01-base.css) gives every element a real transition of «all» — the dialog's «visibility 0s»
   and the visibility each control inherits from it would lag a frame, so «Закрыть» is still hidden when 07-header.js focuses it.
   Here visibility switches at once; only opacity keeps its (.01 ms) transition */
html.reduced .menu,html.reduced .menu.is-open,html.reduced .menu *{transition-property:opacity}
@media (prefers-reduced-motion:reduce){.menu,.menu.is-open,.menu *{transition-property:opacity}}
/* the sheet scrolls below the header band (short landscape screens); «Закрыть» stays put above it */
.menu-sc{position:absolute;left:0;right:0;top:var(--hh);bottom:0;overflow:auto;overscroll-behavior:contain;padding:10px var(--m) calc(32px + env(safe-area-inset-bottom,0px));
  -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 10px);mask-image:linear-gradient(180deg,transparent 0,#000 10px)}   /* scrolled glass fades out under the band */
.menu-in{max-width:560px;margin:0 auto;padding:22px 26px 28px;transform:translate3d(0,12px,0);transition:transform .6s var(--ease-out)}   /* .vit */
.menu.is-open .menu-in{transform:none}
/* «Закрыть» takes the exact place of «Меню» (same centre line, same right edge; --sbw = the scrollbar the lock removed) */
.menu-close{position:absolute;z-index:2;right:calc(var(--m) + var(--sbw,0px));top:calc(var(--hh) / 2 - 22px);display:inline-flex;align-items:center;gap:12px;height:44px;
  font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper)}
.menu-close i{position:relative;width:26px;height:13px}
.menu-close i::before,.menu-close i::after{content:"";position:absolute;right:2px;top:50%;width:18px;height:1px;margin-top:-.5px;background:currentColor;transform:rotate(45deg)}
.menu-close i::after{transform:rotate(-45deg)}
.menu-list li{border-bottom:1px solid var(--hair)}
.menu-list a{display:flex;align-items:baseline;gap:16px;padding:13px 0;font-family:var(--serif);font-weight:300;font-size:25px;line-height:1.15;color:var(--paper);transition:color var(--t-fast) var(--ease)}
.menu-list a:hover{color:#fff}
.menu-list a small{flex:none;min-width:2.2em;font-family:var(--serif);font-weight:400;font-size:14px;letter-spacing:.12em;color:var(--gold-hi)}
.menu-list a[aria-current="true"]::after{content:"";flex:none;align-self:center;width:18px;height:1px;margin-left:auto;background:var(--gold)}   /* the section in view */
.menu .btn{margin-top:24px;height:auto;min-height:44px;padding-block:13px;line-height:1.35;white-space:normal}   /* a long UZ label wraps inside the pill, never past it */
/* depth ≤ 2 (§4.5 rule 3, §9 rule 16): veil (D) → sheet (A) → the pill keeps its fill, border and hover but blurs nothing */
.menu .btn--glass{-webkit-backdrop-filter:none;backdrop-filter:none}
.menu .lang{margin-top:20px}
html.menu-open,html.menu-open body{overflow:hidden}
html.menu-open body{padding-right:var(--sbw,0px)}         /* no layout jump when the lock hides a classic scrollbar */
html.menu-open .hdr{right:var(--sbw,0px)}

/* ---------- no JS (and tv-fallback: site.js never ran) ----------
   The header scrolls away with the page instead of floating as bare type over the text (it cannot turn solid without JS);
   at the top it stands over the state-0 lockup, so the small name steps back as it does in state 0.
   «Меню» is a link, the menu opens with :target, «Закрыть» leaves it without scrolling; RU / UZ needs JS and is not shown. */
.menu-btn--nojs,.menu-close--nojs{display:none}
html.js .menu-btn--nojs,html.js .menu-close--nojs,html:not(.js) button.menu-btn,html:not(.js) button.menu-close{display:none}
html:not(.js) .menu-close--nojs,html.tv-fallback .menu-close--nojs{display:inline-flex}
html.tv-fallback button.menu-btn,html.tv-fallback button.menu-close{display:none}
html:not(.js) .hdr,html.tv-fallback .hdr{position:absolute}
html:not(.js):has(#top) .hdr-name,html.tv-fallback:has(#top) .hdr-name{opacity:0}
html:not(.js) .hdr .lang,html:not(.js) .menu .lang,html.tv-fallback .hdr .lang,html.tv-fallback .menu .lang{display:none}
html:not(.js) .menu:target,html.tv-fallback .menu:target{opacity:1;visibility:visible;transition:opacity .4s var(--ease),visibility 0s}
html:not(.js) .menu:target .menu-in,html.tv-fallback .menu:target .menu-in{transform:none}

/* ---------- widths ---------- */
@media (min-width:2200px){.hdr .btn{height:48px;padding:0 24px}.hdr-logo{width:48px;height:48px}.hdr-name b{font-size:22px}.hdr-name i{font-size:11px}}
@media (max-width:1400px){.hdr-nav a{font-size:11px;letter-spacing:.15em}.hdr .btn{padding:0 15px;gap:10px;letter-spacing:.16em;font-size:11px}.hdr-tools{gap:16px}}
@media (min-width:1280px) and (max-width:1400px){.hdr .lang{font-size:11px;letter-spacing:.15em}
  html.touch .hdr .lang{margin-left:-3px}}                /* 13 px from the CTA: RU's 12 px touch margin never lies on the pill */
@media (max-width:1279.98px){
  .hdr{grid-template-columns:auto 1fr}.hdr-nav{display:none}.hdr .btn{display:none}
  .hdr-tools{gap:24px}
  .menu-btn{display:inline-flex}
  html.tv-fallback .menu-btn--nojs{display:inline-flex}html.tv-fallback button.menu-btn{display:none}
}
/* «Меню» keeps its word while the name keeps ≥ 24 px from RU (html.hdr-tight is measured by 07-header.js; ≤ 374 px always icon only).
   The icon alone keeps a 44 × 44 target and its ink stays on the gutter; «Закрыть» follows «Меню». */
html.hdr-tight .menu-btn>span,html.hdr-tight .menu-close>span{display:none}
html.hdr-tight .menu-btn,html.hdr-tight .menu-close{padding:0 9px;margin-right:-9px}
@media (max-width:374px){
  .menu-btn>span,.menu-close>span{display:none}
  .menu-btn,.menu-close{padding:0 9px;margin-right:-9px}
}
@media (orientation:landscape) and (max-height:500px){.hdr-logo{width:32px;height:32px}.hdr-name b{font-size:15px}.hdr-name i{display:none}}
@media (forced-colors:active){.menu-btn i::before,.menu-btn i::after,.menu-close i::before,.menu-close i::after{forced-color-adjust:none;background:CanvasText}}

/* ===== 08-intro.critical.css ===== */
/* ==========================================================================
   08-intro.critical.css — brand intro «превью» · DESIGN §6.1 (storyboard), §5.1 (intro furniture), ARCHITECTURE §3.0, TECH §6
   Inlined in <head> (and kept in site.css): on a first visit the first painted frame is already smoked glass, never the bare page.
   Owns (DESIGN §10): .intro .iv-* .geo · the lockup's intro furniture .sw .si .ix and its intro states · html.intro-full / intro-short rules.
   Motion lives in 08-intro.js (Web Animations, transform / opacity only). backdrop-filter never animates; the frost fades by its opacity.
   ========================================================================== */

/* ---- the overlay: above the first screen, below the header; never takes a pointer or focus (aria-hidden in the markup) ---- */
.intro{position:fixed;inset:0;z-index:var(--z-intro);display:none;overflow:hidden;pointer-events:none}
html.intro-full .intro,html.intro-short .intro{display:block}

/* ---- 1 · the state-0 film seen through smoked glass.
   With the hero on the page the frost blurs the hero's own film. .iv-film is its stand-in only on a page without #top (isolated build):
   the state-0 poster at the hero's geometry, the hero's scrims on top. ---- */
.iv-film{position:absolute;inset:0;z-index:0;display:none;overflow:hidden;background:var(--ink)}   /* own stack: its layers stay under the frost */
.intro.is-solo .iv-film{display:block}
.iv-amb{position:absolute;inset:-12%;display:none;background:var(--navy-900) 50% 50%/cover no-repeat;filter:blur(46px) saturate(1.35) brightness(.62)}   /* ambient surround (framed / portrait), §7.6 */
.intro.is-amb .iv-amb{display:block}
.intro.is-p .iv-amb{inset:-20% -30%}
.intro.is-amb .iv-film::after{content:"";position:absolute;inset:0;z-index:1;background:radial-gradient(90% 80% at 50% 45%,rgba(6,13,27,.25),rgba(4,9,19,.78))}
.iv-frame{position:absolute;z-index:2;overflow:hidden;left:var(--ifx,0px);top:var(--ify,0px);width:var(--ifw,100%);height:var(--ifh,100%)}
.iv-frame img{position:absolute;left:var(--iix,0px);top:var(--iiy,0px);width:var(--iiw,100%);height:var(--iih,100%);max-width:none;object-fit:cover}
.iv-frame::after{content:"";position:absolute;inset:0;background:var(--scrim-top),var(--scrim-bot),var(--vignette)}
.intro.is-p .iv-frame{-webkit-mask:linear-gradient(180deg,rgba(0,0,0,.35) 0,#000 9%,#000 74%,transparent 100%);mask:linear-gradient(180deg,rgba(0,0,0,.35) 0,#000 9%,#000 74%,transparent 100%)}
.intro.is-p .iv-frame::after{background:none}

/* ---- 2 · frost (Level-A-like glass over the whole first screen), navy veil on the vanishing point, edge light ---- */
.iv-frost{position:absolute;inset:0;-webkit-backdrop-filter:blur(26px) saturate(1.25) brightness(.9);backdrop-filter:blur(26px) saturate(1.25) brightness(.9);
  background:linear-gradient(116deg,rgba(255,255,255,.08) 0%,rgba(255,255,255,.02) 26%,rgba(255,255,255,0) 50%),rgba(8,17,34,.22)}
/* the veil is centred on the film's vanishing point from the first painted frame. 08-intro.js writes the measured --vpx / --vpy;
   until then --vpy0 is the same point from the hero's state-0 geometry (proto geo(0), vy = .386 of the film box):
   D / N / L: film box = the (framed ≤ 2048×1152) frame, oversized to 16:9 × 1.04 and raised as far as the fin allows —
   vy = fy + clamp(fhh − .63856·Hf, finMin + .26624·Hf, .40144·Hf); P: the film sits under the header at its own aspect. */
.intro{--v-fw:min(100vw,2048px);--v-fh:min(100vh,1152px);--v-fy:calc((100vh - var(--v-fh)) / 2);--v-hf:max(var(--v-fh),var(--v-fw) * .5625);
  --v-fin:max(max(0px,var(--hh) - var(--v-fy)) * .9,var(--v-fh) * .04);
  --vpy0:calc(var(--v-fy) + clamp(var(--v-fh) - var(--v-hf) * .63856,var(--v-fin) + var(--v-hf) * .26624,var(--v-hf) * .40144))}
@media (min-aspect-ratio:19/10){.intro{--v-fin:max(max(0px,var(--hh) - var(--v-fy)) * .45,var(--v-fh) * .04)}}
@media (orientation:portrait) and (max-width:1119.98px){.intro{--vpy0:calc(var(--hh) + 100vw * var(--fa) * .386)}}
.iv-navy{position:absolute;inset:0;background:
  radial-gradient(44% 5% at var(--vpx,50%) var(--vpy,var(--vpy0)),rgba(231,205,146,.10),rgba(231,205,146,.02) 60%,rgba(231,205,146,0) 100%),
  radial-gradient(60% 46% at var(--vpx,50%) var(--vpy,var(--vpy0)),rgba(14,30,60,.40),rgba(7,15,31,.62) 60%,rgba(5,10,21,.80) 100%),
  linear-gradient(180deg,rgba(6,13,27,.42),rgba(6,13,27,.12) 40%,rgba(4,9,19,.55))}
.iv-navy::after{content:"";position:absolute;inset:0;background-image:var(--grain);background-size:256px 256px;opacity:.05}   /* plain alpha: a blend mode here would make .intro a backdrop root and stop the frost */
.iv-edge{position:absolute;inset:0;box-shadow:inset 0 1px 0 rgba(255,255,255,.22),inset 1px 0 0 rgba(255,255,255,.08),inset 0 -1px 0 rgba(231,205,146,.16)}
/* fallbacks: no blur available or a weak device — the glass becomes the solid smoked fill of §4.4 (α .93–.95): the sharp film never
   shows through, so the drawn runway never crosses the aircraft; the film appears only as the frost lifts */
html.low .iv-frost,html.noglass .iv-frost{-webkit-backdrop-filter:none;backdrop-filter:none;background:var(--glass-solid)}
@supports not ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){.iv-frost{background:var(--glass-solid)}}
html.noglass .intro.is-solo .iv-frame img{filter:blur(24px)}
html.low .intro.is-solo .iv-film{display:none}

/* ---- 3 · the runway drawn in one-point perspective (horizon, bead, centre-line dashes, edges; SVG built by 08-intro.js) ---- */
.geo{position:absolute;left:0;top:0;overflow:visible}
.geo *{transform-box:fill-box}
.geo polygon{transform-origin:50% 100%}
.geo rect{transform-origin:50% 50%}

/* ---- 4 · the intro lockup: the §5.1 drawing, placed by JS on the hero lockup's rect (--lx / --ly / --fv); hidden until placed ---- */
.iv-lk{position:absolute;left:0;top:var(--ly,0px);width:100%;visibility:hidden}
.intro.is-placed .iv-lk{visibility:visible}
.intro .lk{margin:0 0 0 var(--lx,0px);transform-origin:0 0}
/* letters wait 1.05 em below their baseline inside a clip; the dimension line waits unseen (full version only) */
.intro .wm>.ch{clip-path:inset(-.5em -.5em .1em -.5em)}
html.intro-full .intro .wm>.ch>b{transform:translateY(1.05em)}
html.intro-full .intro .dim>*{opacity:0}
.iv-probe{position:absolute;left:0;top:0;box-sizing:content-box;visibility:hidden;width:var(--m);height:var(--hh);padding-left:var(--fh)}   /* resolves tokens for JS */

/* ---- lockup furniture for the intro (§5.1: .sw/.si specular pass, .au hinge, .ix brackets / glosses / centre-line dash / gold run).
   Unscoped on purpose: a hero lockup that carries the same furniture keeps it invisible. ---- */
/* one specular pass while the glass clears: a skewed window slides, its content counter-slides (transform only) */
.sw{position:absolute;left:0;top:-.12em;height:1.1em;width:1.15em;overflow:hidden;pointer-events:none;opacity:0;transform-origin:0 0;
  -webkit-mask:linear-gradient(90deg,transparent,#000 42%,#000 58%,transparent);mask:linear-gradient(90deg,transparent,#000 42%,#000 58%,transparent)}
.si{position:absolute;left:0;top:0;padding-top:.12em;display:flex;white-space:nowrap;transform-origin:0 0}
.si .ch b{background:linear-gradient(180deg,#FFFFFF,#FFF8EA 60%,#F3E2BD);-webkit-background-clip:text;background-clip:text;filter:drop-shadow(0 0 .08em rgba(255,236,196,.55))}
.ix{position:absolute;left:0;top:0;width:0;height:0;pointer-events:none}
.ix i{position:absolute;left:0;display:block;opacity:0}
.ix .g-sg{top:calc(-.27em - var(--hl) / 2);width:1em;height:var(--hl);transform-origin:0 50%;background:linear-gradient(90deg,var(--gold-lo),var(--gold) 50%,var(--gold-lo))}
.ix .g-tk{top:-.32em;width:var(--hl);height:.1em;background:var(--gold)}
/* beat B: a runway centre-line dash in the gap, BELOW the baseline (never a caret at cap height) */
.ix .cl{top:calc(.719em + .055em);height:.15em;width:max(1.5px,.02em);margin-left:calc(max(1.5px,.02em) / -2);background:linear-gradient(180deg,var(--gold-hi),var(--gold));transform-origin:50% 0}
/* beat C: the gold leaves the hinge A and runs into the dimension line */
.ix .gr{top:calc(.719em + var(--dy) - .0045em);width:1em;height:max(1.5px,.009em);background:linear-gradient(90deg,rgba(231,205,146,0),var(--gold-pale) 30%,var(--gold-pale) 70%,rgba(231,205,146,0));transform-origin:0 50%}
.ix .lb{position:absolute;left:0;width:0;height:0;opacity:0}
.ix .lb.t{top:-.27em}
.ix .lb.b{top:calc(.719em + var(--dy))}
.ix .lb span{position:absolute;left:0;top:0;transform:translate(-50%,-.61em);font:500 max(11px,.112em)/1 var(--sans);letter-spacing:.26em;text-indent:.26em;white-space:nowrap;color:rgba(244,239,230,.96)}

/* ---- 5 · the hero's first screen waits under the intro (production hooks for proto `html.intro-on`).
   Its lockup is revealed by the hand-off (html.intro-handoff); tagline, descriptor, index, folio, connector and header fade in at the end
   of beat C (08-intro.js). [data-intro-ui] opts any other first-screen element into the same fade. The state-0 stack rides above the veil. ---- */
html:is(.intro-full,.intro-short):not(.intro-handoff) #top [data-lockup]{opacity:0}
html:is(.intro-full,.intro-short) :is(#top .tagline,#top .tag-f,#top .desc,#top .idx,#top .folio,#top .conn,.hdr,[data-intro-ui]){opacity:0}
/* the stack rides above the veil; at the hand-off (every intro layer is clear by then) it drops back, so the copy lies on top of the
   revealed lockup and the specular pass finishes on the name instead of being cut by it */
html:is(.intro-full,.intro-short):not(.intro-handoff) #top .cover{z-index:var(--z-cover-intro)}

/* ---- safety net: if the script never ends the intro, the page is given back at 7.5 s (visibility / opacity keyframes only;
   an opacity animation on .intro itself would turn it into a backdrop root and stop the frost). ?intro=hold opts out. ---- */
@keyframes iv-gone{to{visibility:hidden}}
@keyframes iv-show{to{opacity:1}}
html:is(.intro-full,.intro-short):not(.intro-hold) .intro{animation:iv-gone 1ms linear 7.5s both}
html:is(.intro-full,.intro-short):not(.intro-hold) :is(#top [data-lockup],#top .tagline,#top .tag-f,#top .desc,#top .idx,#top .folio,#top .conn,.hdr,[data-intro-ui]){animation:iv-show 1ms linear 7.5s both}
@media (forced-colors:active){.intro{display:none!important}}

/* ===== 10-hero.css ===== */
/* ==========================================================================
   10-hero.css — the three-swipe hero (DESIGN §7, §5.15, §6.2, §8.5; ARCHITECTURE §3.1, §7)
   Owns: .hero .amb .frame .film .scr* .vig .grain .cover .tagline .idx .conn .panel .p-* .rows .ph*
         .folio .cue* .ctrl .dock (hero use) .next .prev .skipfilm .tag-f .hero-fb
   Uses the foundation as is: .lk (03), .desc (03), .eyebrow (03), .steps/.trk (03), .vit/.next/.dock glass (02), .btn/.lnk (03).
   Stacking contract (§6.1): .hero never creates a stacking context — no isolation, z-index, transform, filter,
   opacity < 1 or will-change on .hero itself — so the fixed intro (z 40) sits between the film and the lockup.
   Runtime custom properties written by 10-hero.js (every one has a CSS fallback here):
   frame --fx --fy --fw --fhh --fl --frr --fb · film box --Wf --Hf --fs --pan --pany · lockup --cb --nx --fv
   panels --pr --pw --p1t --pb --pd · portrait --ct --st
   ========================================================================== */

/* ---------- 7.1 the first screen ---------- */
.hero{position:relative;height:100vh;height:100svh;overflow:hidden;overflow:clip;background:var(--ink)}
.hero-probe{position:absolute;left:0;top:0;width:0;height:0;visibility:hidden;pointer-events:none;padding:var(--hh) 0 var(--fh) var(--m)}   /* resolves --hh --fh --m to px for the geometry */
.hero.no-anim,.hero.no-anim *,.hero.no-anim *::before,.hero.no-anim *::after{transition:none!important}   /* initial paint, deep link, ?hero=N */

/* ---------- 7.6 film treatment and framing ---------- */
.amb{position:absolute;inset:0;z-index:0;overflow:hidden;display:none}                        /* ambient surround: framed + P modes */
.amb i{position:absolute;inset:-12%;background:var(--navy-900) 50% 50%/cover no-repeat;filter:blur(46px) saturate(1.35) brightness(.62);opacity:0;transition:opacity var(--t-slow) linear}
.amb i.is-on{opacity:1}
.amb::after{content:"";position:absolute;inset:0;background:radial-gradient(90% 80% at 50% 45%,rgba(6,13,27,.25),rgba(4,9,19,.78))}
.frame{position:absolute;z-index:var(--z-film);left:var(--fx,0px);top:var(--fy,0px);width:var(--fw,100%);height:var(--fhh,100%);overflow:hidden}
.film{position:absolute;left:50%;top:50%;width:var(--Wf,100%);height:var(--Hf,100%);will-change:transform;
  transform:translate(-50%,-50%) translate3d(var(--pan,0px),var(--pany,0px),0) scale(var(--fs,1.03));transition:transform .7s var(--ease-io)}
.film .sp{background:var(--ink)}
.film .st-poster img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 30%}   /* no-JS state-0 poster (§7.3 table) */
.scr{position:absolute;inset:0;pointer-events:none;z-index:var(--z-scrim)}
.scr-top{background:var(--scrim-top);transition:opacity 1s var(--ease)}
.hero[data-state="2"] .scr-top{opacity:.7}.hero[data-state="3"] .scr-top{opacity:.5}
.scr-bot{background:var(--scrim-bot)}
.scr-wm{background:var(--scrim-wm);opacity:0;transition:opacity .7s var(--ease)}.hero.cover-on .scr-wm{opacity:1}
.vig{background:var(--vignette)}
.grain{z-index:var(--z-grain);background-image:var(--grain);background-size:256px 256px;opacity:.055}   /* plain alpha, no blend mode */
.hero.framed .amb{display:block}
.hero.framed .frame{border-radius:var(--r-3);box-shadow:0 0 0 1px rgba(4,9,19,.5),0 60px 120px -40px rgba(0,0,0,.8)}
.hero.framed .frame::after{content:"";position:absolute;inset:0;z-index:var(--z-frame-edge);border-radius:inherit;padding:1.25px;pointer-events:none;
  background:linear-gradient(135deg,rgba(255,255,255,.5),rgba(255,255,255,.08) 24%,rgba(255,255,255,0) 50%,rgba(231,205,146,.08) 76%,rgba(231,205,146,.36));
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box exclude,linear-gradient(#000 0 0)}
.hero.framed .grain{opacity:.085}

/* ---------- 7.2 state 0 — the lockup stack on the film's axis ---------- */
.cover{position:absolute;z-index:var(--z-cover);left:var(--fl,0px);right:var(--frr,0px);bottom:var(--cb,calc(var(--fh) + 32px));
  padding:0 calc(var(--m) - var(--nx,0px)) 0 calc(var(--m) + var(--nx,0px));
  display:flex;flex-direction:column;align-items:center;text-align:center;pointer-events:none;
  transition:opacity .5s var(--ease),transform .7s var(--ease-out),visibility 0s}
.cover .lk{--fv:12.6svh}                                   /* no-JS size ≈ .9 · fMax; the fit routine writes the measured one inline */
.hero:not(.cover-on) .cover{opacity:0;visibility:hidden;transform:translate3d(0,-12px,0);transition:opacity .45s var(--ease),transform .6s var(--ease),visibility 0s .6s}
/* §7.7: the page's one <h1> stays in the accessibility tree at every state (released, deep-linked, ?hero=N). The cover's opacity 0
   already hides it on screen; its visual parts (.wm, .dim) are aria-hidden, so only the sr-only name and descriptor tail are exposed */
.hero:not(.cover-on) .cover .lk{visibility:visible}
.hero.hero-measure .cover{transform:none!important;transition:none!important}   /* the fit measures the resting pose */
.tagline{margin-top:clamp(9px,1.2svh,22px);font:italic 300 var(--fs-tagline)/1.1 var(--serif);letter-spacing:.004em;color:var(--paper);text-shadow:0 2px 22px rgba(4,9,19,.62)}
.cover .desc{margin-top:clamp(8px,1.15svh,20px)}
.idx{display:none}
.conn{position:absolute;left:0;top:0;z-index:var(--z-conn);pointer-events:none;overflow:visible;display:none}

/* ---------- 7.3 states I–III — one panel component: same width, same right edge, same inner grid ---------- */
.panel{position:absolute;z-index:var(--z-panel);right:var(--pr,72px);width:var(--pw,340px);padding:clamp(16px,1.3vw,26px) clamp(16px,1.3vw,26px) clamp(16px,1.3vw,24px);
  opacity:0;visibility:hidden;transform:translate3d(0,14px,0);transition:opacity var(--t-exit) var(--ease),transform .3s var(--ease),visibility 0s .3s}
.p1{top:var(--p1t,110px)}
.p2,.p3{bottom:var(--pb,96px);width:var(--pw2,var(--pw,340px))}   /* final-fix (AD item 5): II / III have their own width (free up to the wingtip) */
.hero.p1c .p1 .p-note{display:none}                                  /* final-fix (AD item 3): compact panel I beside the fuselage */
.p2{transform:translate3d(28px,0,0)}                        /* II slides in from the right: its edge never meets the wingtip */
.panel.is-on{opacity:1;visibility:visible;transform:none;transition:opacity var(--pd,1s) var(--ease-out),transform var(--pd,1.1s) var(--ease-out),visibility 0s}
/* title size from the panel's CONTENT width (not its outer width): «Восемь объектов команды.» (13.1 em) stays one line at every desktop size,
   so title I is two lines, II four (two per sentence), III two — never three (§9.5). Language-independent: UZ never shrinks the type (§9.21) */
.p-t{margin-top:clamp(12px,1.6vh,18px);font-family:var(--serif);font-weight:300;font-size:min(var(--fs-panel),calc((var(--pw,400px) - 2 * clamp(16px,1.3vw,26px) - 2 * var(--bev,5px)) * .0746));line-height:1.14;letter-spacing:.002em;color:var(--paper);text-wrap:balance}
/* final-fix (AD item 5): II / III size their title from their own measure (--pw2): «Собственный комплекс GOMACO.» is 16.31 em in the
   serif (measured), so 1 / 16.6 of the content width keeps «Собственный комплекс GOMACO.» / «Собственный бетонный завод.» one line each */
.p2 .p-t,.p3 .p-t{font-size:min(var(--fs-panel),calc((var(--pw2,var(--pw,400px)) - 2 * clamp(16px,1.3vw,26px) - 2 * var(--bev,5px)) * .0602))}
.p-t>span{display:block;text-wrap:balance}
.p-row{margin-top:clamp(12px,1.6vh,16px);padding-top:clamp(12px,1.6vh,16px);border-top:1px solid var(--hair);font:300 var(--fs-row)/1.38 var(--serif);color:var(--paper)}
.p-note{margin-top:clamp(10px,1.3vh,14px);font:italic 300 var(--fs-note)/1.35 var(--serif);color:var(--paper-2)}
.rows{margin-top:clamp(12px,1.6vh,18px);border-top:1px solid var(--hair)}
.rows li{padding:clamp(8px,1.15vh,12px) 0;border-bottom:1px solid var(--hair-2)}
.rows b{display:block;font:300 var(--fs-h4b)/1.12 var(--serif);color:var(--paper)}
.rows li>span{display:block;margin-top:4px;font-size:clamp(13px,.9vw,15.5px);line-height:1.42;color:var(--paper-2)}
.rows .inl{display:flex;align-items:baseline;gap:12px}
.rows .inl b{font-size:var(--fs-figure);line-height:.9;font-variant-numeric:lining-nums tabular-nums}
.rows .inl>span{margin:0}
.p-foot{margin-top:clamp(14px,2vh,22px)}
.p-role{margin-top:clamp(10px,1.3vh,14px);font:italic 300 var(--fs-note)/1.35 var(--serif);color:var(--paper-2)}
.p3 .btn{width:100%;justify-content:space-between}
/* the one CTA may take two lines (long UZ «Obyektni muhokama qilish» in a 292 px panel): the arrow never leaves the button */
.p3 .btn,.hero-fb .btn{height:auto;min-height:44px;padding-top:11px;padding-bottom:11px;white-space:normal;line-height:1.35;text-align:left}
.p3 .btn>span,.hero-fb .btn>span{min-width:0}
.ph{display:none}                                           /* phone lines (COPY *.m keys), shown in N / L / P */
.ph-lines{margin-top:12px;border-top:1px solid var(--hair)}
.ph-lines li{padding:9px 0;border-bottom:1px solid var(--hair-2);font-size:14.5px;line-height:1.42;color:var(--paper-2)}
.ph-lines li b{display:block;margin-bottom:1px;font:300 19px/1.2 var(--serif);color:var(--paper)}
.ph-lines:last-child li:last-child{border-bottom:0;padding-bottom:0}           /* a sheet ends on its words, not on a stray rule */

/* ---------- 7.5 folio — cue (left) · ↑ · progress I II III · Next · Skip (bottom-right, the darkest corner) ---------- */
.folio{position:absolute;z-index:var(--z-folio);left:max(calc(var(--fl,0px) + var(--m)),var(--gutter));right:max(calc(var(--frr,0px) + var(--m)),var(--gutter));bottom:var(--fb,0px);height:var(--fh);
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-2)}
.cue{display:flex;align-items:center;gap:14px;white-space:nowrap;transition:opacity .6s var(--ease)}
.hero:not(.cover-on) .cue{opacity:0}
.cue-line{position:relative;display:block;flex:none;width:1px;height:26px;background:var(--hair);overflow:hidden}
.cue-line::after{content:"";position:absolute;left:0;top:0;width:1px;height:12px;background:var(--gold-hi);animation:cue 2.6s var(--ease-io) 1.2s 3 both}
@keyframes cue{0%{transform:translateY(-14px)}60%,100%{transform:translateY(28px)}}
.cue .t,.cue .rh{display:none}
html.touch .cue .w{display:none} html.touch .cue .t{display:inline}
/* released hero back at the very top: «Вверх — вернуться к фильму» replaces the cue */
.hero.relock-on .cue{opacity:1}
.hero.relock-on .cue .w,.hero.relock-on .cue .t{display:none}
.hero.relock-on .cue .rh{display:inline}
.ctrl{display:flex;align-items:center;gap:clamp(16px,2vw,32px)}
.folio .dock{display:flex;align-items:center;gap:clamp(16px,2vw,32px)}
/* §4.5.4 / §9.14: nothing below --paper-2 over the film — upcoming steps are lifted from the foundation's --paper-3
   (done = paper-2 with a gold track, now = paper; the track tells done from upcoming). P mode resets it: its dock sits on navy, not on the film */
.folio .steps li:not(.is-now){color:var(--paper-2)}
@media not all and (orientation:portrait) and (max-width:1119.98px){          /* D / N / L: the dock is a bare row, glass only in P */
  html .folio .dock{padding:0;border:0;border-radius:0;background:none;-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none}
}
.next{position:relative;display:inline-flex;align-items:center;gap:12px;white-space:nowrap;flex:none;height:42px;padding:0 16px 0 20px;border-radius:var(--r-2);color:var(--paper);
  letter-spacing:var(--tr-caps);text-transform:uppercase;transition:background-color var(--t-hover),border-color var(--t-hover)}   /* + Level C (02-glass) */
.next .nh{color:var(--paper-2);padding-left:12px;border-left:1px solid var(--hair)}   /* §9.14: nothing below paper-2 over the film */
.next .nh:empty{display:none}
.next .dn{display:block;width:1px;height:14px;background:currentColor;position:relative}
.next .dn::after{content:"";position:absolute;left:-3px;bottom:0;width:7px;height:7px;border-right:1px solid currentColor;border-bottom:1px solid currentColor;transform:rotate(45deg)}
/* ↑ previous step: bare (no fourth glass surface over the film), 44 px target, absent at state 0 */
.prev{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:none;width:30px;height:42px;margin-right:-6px;color:var(--paper-2);
  transition:color var(--t-fast),opacity var(--t-base) var(--ease),visibility 0s}
.prev::before{content:"";position:absolute;inset:-1px -7px}
.prev:hover{color:var(--paper)}
.prev .up{height:14px}
.prev .up::after{left:-3px;width:7px;height:7px}
.hero[data-state="0"] .prev{opacity:0;visibility:hidden;transition:opacity var(--t-exit) var(--ease),visibility 0s var(--t-exit)}
.skipfilm{position:relative;display:inline-flex;align-items:center;min-height:44px;color:var(--paper-2);letter-spacing:var(--tr-caps);text-transform:uppercase;white-space:nowrap;padding:0;transition:color var(--t-fast)}   /* §9.34: 44 px target */
html.touch .next{height:44px}                                /* §9.34: ≥ 44 px on touch (1024 / 1366 tablets in D / N) */
.skipfilm:hover{color:var(--paper)}
.hero[data-state="3"] .skipfilm{visibility:hidden}
.tag-f{display:none;font:italic 300 clamp(19px,2.6svh,30px)/1.1 var(--serif);letter-spacing:.004em;text-transform:none;color:var(--paper);white-space:nowrap;text-shadow:0 2px 18px rgba(4,9,19,.7);transition:opacity .6s var(--ease)}
.hero.tag-low .tag-f{display:block}
.hero.tag-low .cue,.hero.tag-low .cover .tagline{display:none}
.hero.tag-low:not(.cover-on) .tag-f{opacity:0}
.hero.tag-low.relock-on .tag-f{display:none}
.hero.tag-low.relock-on .cue{display:flex}
/* the folio's fit (10-hero.js): labels of the progress go first, then the next-step hint */
.hero.f-tight .folio .steps .sl{display:none}
.hero.f-tight2 .folio .next .nh{display:none}

/* ---------- 7.3 N mode — landscape narrower than 16:10 (4:3, 5:4) and rotated monitors wider than 1120: a low two-column sheet ---------- */
@media (max-aspect-ratio:1599/1000) and (min-height:501px) and (min-width:1120px),(orientation:landscape) and (max-aspect-ratio:1599/1000) and (min-height:501px){
  .hero .panel{left:calc(var(--fl,0px) + var(--m));right:calc(var(--frr,0px) + var(--m))!important;width:auto!important;top:auto!important;bottom:var(--pb)!important;
    display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);column-gap:clamp(24px,3vw,48px);align-items:start;padding:16px clamp(20px,2.2vw,30px)}
  .hero .panel .eyebrow,.hero .panel .p-t{grid-column:1}
  .hero .panel .p-t{font-size:clamp(20px,2.2vw,28px)}
  .hero .panel .dk{display:none}.hero .panel .ph{display:block}
  .hero .panel .ph-lines{grid-column:2;grid-row:1/span 3;margin-top:0}
  .p3 .p-foot{grid-column:1;margin-top:12px}
}

/* ---------- 7.3 L mode — landscape phones: everything inside 100 svh, compact ---------- */
@media (orientation:landscape) and (max-height:500px){
  .hero .panel{padding:12px 14px}
  .hero .panel .dk{display:none}.hero .panel .ph{display:block}
  .hero .p-t{font-size:18px;margin-top:8px}
  .hero .p-t>span{display:inline}                          /* the 240 px panel: the two sentences balance over three lines, not four (§9.5) */
  .ph-lines{margin-top:8px}.ph-lines li{padding:6px 0;font-size:13px}.ph-lines li b{font-size:16px}
  .hero .p-foot{margin-top:8px}
  .p3 .btn{min-height:38px;padding-top:8px;padding-bottom:8px;margin-top:0}
  .tagline{font-size:16px;margin-top:8px}
  .cover .desc{--ds:11px;margin-top:6px}                   /* §7.3 says 10.5 px; §2 / §9.18 floor micro caps at 11 px */
  .next,html.touch .next{height:36px}.prev{height:36px}
  .next::before{content:"";position:absolute;inset:-5px -1px}.prev::before{inset:-4px -7px}   /* 36 px pills, 44 px targets (§9.34; the pill has a 1 px border) */
  .next .nh,.folio .steps .sl{display:none}
}

/* ---------- 7.4 P mode — phones and portrait tablets: the film on top at its own aspect, words below, a glass dock ---------- */
@media (orientation:portrait) and (max-width:1119.98px){
  .hero{background:var(--navy-950)}
  .amb{display:block}.amb i{inset:-20% -30%}
  .frame{left:0;top:var(--hh);width:100%;height:calc(100vw * var(--fa));
    -webkit-mask:linear-gradient(180deg,rgba(0,0,0,.35) 0,#000 9%,#000 74%,transparent 100%);mask:linear-gradient(180deg,rgba(0,0,0,.35) 0,#000 9%,#000 74%,transparent 100%)}
  .film{left:0;top:0;width:100%;height:100%;transform:none!important}
  .film .st-poster img{object-position:50% 50%}
  .scr-top,.scr-wm,.vig{display:none}
  .grain{opacity:.04}
  .cover{top:var(--ct,calc(var(--hh) + 100vw * var(--fa) + 50px));bottom:auto;left:0;right:0}
  .cover .lk{--fv:12svh}
  .tagline{margin-top:clamp(14px,2.2vh,26px);font-size:clamp(21px,5.9vw,34px)}
  .cover .desc{margin-top:clamp(10px,1.6vh,18px);display:grid;justify-items:center;gap:4px;--ds:clamp(13px,3.6vw,16px);font-size:var(--ds);font-weight:400;letter-spacing:.01em;text-transform:none;color:var(--paper-2)}
  .cover .desc .dl{display:flex;align-items:center}
  .cover .desc .dl+.dl::before{display:none}
  .cover .desc .dl i{width:14px;margin:0 11px;transform:none}
  .cover .desc .dl>span:last-child,.cover .desc .dl:last-child>span:last-child{margin-right:0}
  .idx{display:block;width:min(100%,420px);margin-top:clamp(16px,2.6vh,30px);border-top:1px solid var(--hair);text-align:left}
  .idx li{display:grid;grid-template-columns:2.4em 1fr auto;align-items:baseline;padding:clamp(8px,1.3vh,12px) 2px;border-bottom:1px solid var(--hair-2)}
  .idx .r{font:400 16px/1 var(--serif);color:var(--gold-hi);font-variant-numeric:lining-nums tabular-nums}
  .idx .m{font:400 13px/1 var(--serif);letter-spacing:.3em;color:var(--paper-3)}
  .idx .f{font:500 12px/1 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper)}
  .hero.idx-c .idx{margin-top:10px}.hero.idx-c .idx li{padding:6px 2px}
  .hero.no-idx .idx{display:none}
  .hero.no-tag .cover .tagline{display:none}
  .conn{display:block}
  .hero .panel{left:12px;right:12px!important;width:auto!important;top:var(--st,50%)!important;bottom:auto!important;padding:18px 20px 20px;--bev:4px}
  .p2{transform:translate3d(0,14px,0)}
  .hero .panel .dk{display:none}.hero .panel .ph{display:block}
  .hero .p-t{font-size:min(clamp(22px,6vw,32px),calc((min(100vw - 24px,640px) - 48px) * .0746));margin-top:12px}   /* the live sheet's measure only (the fallback sizes its own) */
  .p3 .btn{margin-top:14px;min-height:48px}
  .hero .p-foot{margin-top:0}
  /* short phones (360 × 740): placePanels() adds .sh-c when a sheet would come within 14 px of the dock — the sheet can rise only
     26 px into the film, so it tightens its vertical rhythm instead (type sizes and the 48 px CTA are untouched) */
  .hero.sh-c .panel{padding-top:14px;padding-bottom:16px}
  .hero.sh-c .p-t{margin-top:8px}
  .hero.sh-c .ph-lines{margin-top:8px}
  .hero.sh-c .ph-lines li{padding:6px 0}
  .hero.sh-c .p3 .btn{margin-top:10px}
  .folio{left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));height:auto;display:grid;grid-template-columns:1fr auto;row-gap:10px;column-gap:12px;font-size:11px;letter-spacing:.16em}
  .cue{grid-column:1;grid-row:1;padding-left:8px;min-width:0;white-space:normal;line-height:1.35}
  .hero:not(.cover-on) .cue{visibility:hidden}
  .hero.relock-on .cue{visibility:visible}
  .ctrl{display:contents}
  .prev{grid-column:1;grid-row:1;justify-self:start;width:44px;height:44px;margin:-9px 0 -9px -4px}   /* 44 px target in a 26 px row */
  .hero.relock-on .prev{visibility:hidden}
  .skipfilm{grid-column:2;grid-row:1;justify-self:end;padding:0 8px;margin:-9px 0}   /* 44 px target in the 26 px row, like .prev; text keeps its 8 px inset (mirrors the cue) */
  .hero[data-state="3"] .skipfilm{visibility:hidden}          /* keeps its column: the cue row (and the ↑) stays the same height in every state, so the sheets' 14 px clearance holds */
  .folio .dock{grid-column:1/-1;grid-row:2;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:5px 5px 5px 16px}   /* + Level C dock glass (02) */
  .steps{flex:1;justify-content:space-between;gap:6px;min-width:0}
  .steps li{gap:7px}
  .folio .steps li:not(.is-now):not(.is-done){color:var(--paper-3)}   /* on the navy dock, with no track, colour alone tells upcoming from done */
  .folio .steps .sl{display:inline;font-size:11px;letter-spacing:.12em;margin-right:0}
  .steps .trk{display:none}
  .steps li+li::before{content:"";width:clamp(8px,3vw,28px);height:1px;background:var(--hair);margin-right:4px}
  .next,html.touch .next{width:46px;height:46px;padding:0;justify-content:center;border-color:rgba(255,255,255,.34)}
  .next .nx,.next .nh{display:none}
  .hero[data-state="3"] .steps{display:none}
  .hero[data-state="3"] .folio .dock{padding:5px}
  .hero[data-state="3"] .next{flex:1;width:auto;justify-content:space-between;padding:0 16px}
  .hero[data-state="3"] .next .nx{display:inline;font-size:11px}
}
@media (orientation:portrait) and (min-width:600px) and (max-width:1119.98px){
  .folio{left:50%;right:auto;width:min(640px,calc(100% - 24px));transform:translateX(-50%)}
  .hero .panel{left:max(12px,calc(50% - 320px));right:max(12px,calc(50% - 320px))!important}   /* sheets share the dock's 640 px column */
}
@media (orientation:portrait) and (max-width:374px){
  .cue{letter-spacing:.1em}                                  /* final-fix (AD nice-to-have 10): «Смахните вверх · три шага» holds one line at 360 */
  .folio .steps .sl{font-size:10.5px;letter-spacing:.08em}
  .steps li+li::before{width:6px}
  .folio .dock{padding-left:12px}
}
/* final-fix (AD item 4): short phones — with the 16:10 band (--fa .62, 00-critical) the sheets are compacted so they fit between
   the film's feathered last 26 px and the folio; placePanels() never lifts a sheet above that line (glass never hides the aircraft) */
@media (orientation:portrait) and (max-width:760px) and (max-height:700px){
  .hero .panel,.hero.sh-c .panel{padding:12px 16px}
  .hero .p-t,.hero.sh-c .p-t{font-size:20px;margin-top:6px;line-height:1.12}
  .hero .ph-lines,.hero.sh-c .ph-lines{margin-top:6px}
  .hero .ph-lines li,.hero.sh-c .ph-lines li{padding:5px 0}
  .hero .ph-lines li b{font-size:17px;line-height:1.16}
  .hero .p3 .btn,.hero.sh-c .p3 .btn{min-height:44px;margin-top:8px}
}

/* ---------- 7.8 / 8.5 reduced motion · no JS · tv-fallback: the three panels as ordinary content under the first screen ---------- */
/* ground (§8.0 / §9.25): starts and ends on --navy-950 — the two light fields (the same colour stops as --field-cold / --field-warm)
   sit inside the block and have faded out before either edge, so neither the film above nor company below meets a cut-off glow */
.hero-fb{display:none;padding:clamp(48px,8vh,96px) var(--gutter);
  background:radial-gradient(60% 50% at 14% 44%,rgba(60,96,160,.14),rgba(10,21,40,0) 70%),radial-gradient(50% 44% at 88% 54%,rgba(201,165,92,.07),rgba(201,165,92,0) 70%),var(--navy-950)}
html.reduced .hero-fb,html:not(.js) .hero-fb,html.tv-fallback .hero-fb{display:block}
.hero-fb .fb-note{margin:0 0 clamp(18px,2.6vh,30px);font-size:var(--fs-small);line-height:1.55;color:var(--paper-3)}   /* audit: the <noscript> line (ui.noscript) */
.hero-fb .fb-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--g);align-items:stretch}   /* §7.8: three columns on the gutter, one only ≤ 760 */
.hero-fb .panel{position:relative;inset:auto;width:auto;display:flex;flex-direction:column;opacity:1;visibility:visible;transform:none;container-type:inline-size}
/* the title is sized from the fallback panel's own content box (not the live column's --pw / the live sheet's measure):
   «Восемь объектов команды.» keeps one line wherever the column allows it; narrow tablet columns keep ≥ 19 px and take two lines a sentence */
.hero-fb .p-t{font-size:max(19px,min(var(--fs-panel),100cqi * .0746))}
.hero-fb .p-foot{margin-top:auto;padding-top:clamp(18px,2.4vh,26px)}   /* the three links on one line */
html.reduced .hero .panel,html:not(.js) .hero .panel,html.tv-fallback .hero .panel{display:none}
html.reduced .ctrl,html.reduced .cue,html:not(.js) .ctrl,html:not(.js) .cue,html.tv-fallback .ctrl,html.tv-fallback .cue{display:none}
/* 761–999 px (portrait tablets 768–834): three columns would be 220 px — «Собственный / комплекс / GOMACO.» in three lines and
   «Ташкент-Восточный» through the padding. The column needs ≥ 291 px (the live panel's minimum), so here the three panels stack on the
   full gutter as the N-mode low two-column sheet (§7.3): mark · title · link on the left, the rows on the right */
@media (min-width:761px) and (max-width:999.98px){
  .hero-fb .fb-grid{grid-template-columns:minmax(0,1fr)}
  .hero-fb .panel{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);grid-template-rows:auto auto 1fr auto;column-gap:clamp(24px,3vw,48px);align-items:start;padding:16px clamp(20px,2.2vw,30px) 18px}
  .hero-fb .panel>.eyebrow{grid-area:1/1}
  .hero-fb .panel>.p-t{grid-area:2/1;font-size:clamp(20px,2.2vw,28px)}
  .hero-fb .panel>.p-foot{grid-area:4/1;align-self:end}
  .hero-fb .fb-1>.p-row{grid-area:1/2/4/3;margin-top:0;padding-top:0;border-top:0}   /* the right column starts level with the mark */
  .hero-fb .fb-1>.p-note{grid-area:4/2/5/3;align-self:end}
  .hero-fb .fb-2>.rows,.hero-fb .fb-3>.rows{grid-area:1/2/4/3;margin-top:0;border-top:0}
  .hero-fb .fb-2>.rows{grid-row:1/5}
  .hero-fb .panel>.rows li:first-child{padding-top:0}
  .hero-fb .fb-3>.p-role{grid-area:4/2/5/3;align-self:end}
}
@media (max-width:760px){
  .hero-fb .fb-grid{grid-template-columns:minmax(0,1fr)}
  .hero-fb .p-t{font-size:min(clamp(22px,6vw,32px),100cqi * .0746)}   /* the phone sheet's size, capped by this panel's measure (307 px at 390, 278 at 360) */
}
/* audit: no container units (Safari < 16): the var() + cqi size above is dropped at computed-value time (→ ~16 px); the panel token instead */
@supports not (width:1cqi){.hero-fb .p-t{font-size:var(--fs-panel)}}

/* ---------- ultra ≥ 2200 ---------- */
@media (min-width:2200px){.next,html.touch .next{height:50px;padding:0 20px 0 24px}.prev{height:50px}}

/* ---------- integration: the folio steps back once the released hero has scrolled away (html.past-hero, 07-header.js) ----------
   A release lands the first section under the header bar, so the folio's row lies exactly under the bar: blurred it is a smudge,
   and html.low's solid bar (.96) let I · II · III show through. Fades both ways; inputs off while hidden. */
html.intro-done .hero .folio{transition:opacity .35s var(--ease)}
html.past-hero .hero .folio{opacity:0;pointer-events:none}

/* ===== 20-company.css ===== */
/* ==========================================================================
   20-company.css — «Компания» (DESIGN §8.1, §5.5, §5.9, §5.11; ARCHITECTURE §3.2)
   Owns: .company ground · text/figure row (.cm-row .cm-text .cm-fig) · role cards (.cm-roles* .cm-role .cm-proof)
         · partner line (.cm-partner) · decode (.cm-decode .cm-dhead .cm-cells .dec*) · closing link (.cm-more)
   Uses unchanged: .runhead .sec-head .h2 .h3 .lede .txt .vit .stats .st* .photo* .slot-ph .tag .lnk (foundation).
   Prefix is cm- (not co-: .co / .co-h / .co-b belong to the layers callout, 50-technology).
   ========================================================================== */

/* ---- ground (§8.0): cold light field over navy 950 → 900 → 950 + static grain .03, so the glass reads (§4.5 r7) ---- */
.company{background:var(--field-cold),linear-gradient(180deg,var(--navy-950),var(--navy-900) 50%,var(--navy-950))}
.company::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--grain) 0 0/256px 256px;opacity:.03}

/* ---- rhythm (§8.0): runhead → head-gap → head → block-gap → blocks ---- */
.cm-stats,.cm-row,.cm-roles,.cm-decode,.cm-more{margin-top:var(--block-gap)}

/* ---- numbers strip (§5.9, foundation): the UZ units of tiles 5–6 («tadan ortiq», «yildan ortiq») set as a two-line italic
        annotation beside the figure, the last line on the figure's baseline — never pushes the tile wider ---- */
.cm-stats .st-u{white-space:normal;max-width:5.4em;line-height:1.08;align-self:last baseline}
.cm-stats .st-u:empty{display:none}                          /* no JS: the empty n5 unit adds no flex gap */
/* The qualifier line («более», UZ «ulardan») is reserved so that figures share one baseline — per ROW: when the strip wraps
   (3 columns ≤ 1119, 2 columns ≤ 760) a row whose tiles carry no qualifier drops the empty line (no :has() → stays reserved).
   A qualifier is a [data-i] span that is neither [hidden] (a launch token, set by 01-i18n.js) nor :empty (no JS: the empty
   RU token is never [hidden]). UZ: tiles 5 and 6 carry «…dan ortiq» in the unit, their pre is a blank &nbsp; placeholder
   (it only stops 01-i18n.js from falling back to the Cyrillic «более»), so in UZ their row never reserves the line.
   The two blocks are exclusive: 761–1119 is written «≤ 1119.98 and not ≤ 760» — only the literal breakpoints of §3.8. */
@media (max-width:1119.98px) and (not (max-width:760px)){
  .cm-stats .stats:not(:has(.st:nth-child(-n+3) .st-pre>[data-i]:not([hidden]):not(:empty))) .st:nth-child(-n+3) .st-pre,
  .cm-stats .stats:not(:has(.st:nth-child(n+4) .st-pre>[data-i]:not([hidden]):not(:empty))) .st:nth-child(n+4) .st-pre,
  html.lang-uz .cm-stats .st:nth-child(n+4) .st-pre{display:none}
}
@media (max-width:760px){
  .cm-stats .stats:not(:has(.st:nth-child(-n+2) .st-pre>[data-i]:not([hidden]):not(:empty))) .st:nth-child(-n+2) .st-pre,
  .cm-stats .stats:not(:has(.st:nth-child(n+3):nth-child(-n+4) .st-pre>[data-i]:not([hidden]):not(:empty))) .st:nth-child(n+3):nth-child(-n+4) .st-pre,
  .cm-stats .stats:not(:has(.st:nth-child(n+5) .st-pre>[data-i]:not([hidden]):not(:empty))) .st:nth-child(n+5) .st-pre,
  html.lang-uz .cm-stats .st:nth-child(n+5) .st-pre{display:none}
  /* final-fix (AD nice-to-have 7): 13 px holds «самосвалов Shacman / в собственном парке» in two lines at 390 (it took four); the copy
     keeps its own no-break (в&nbsp;собственном) — the whole phrase unbroken (124 px) would overflow the 111 px tile at 360 */
  .cm-stats .st{padding-left:12px;padding-right:12px}          /* «самосвалов Shacman» is 126.4 px at 13 px: 12 px insets give it 130 at 390 */
  .cm-stats .st-l{font-size:13px}
}

/* ---- text / figure row: 5fr text · 7fr figure (≤ 1100 px, 1200 px source) ---- */
.cm-row{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);column-gap:calc(var(--g) * 2);align-items:start}
/* final-fix (AD nice-to-have 12): the text starts on the photograph's top edge (inside the frame's bevel), so stats → text → photo read
   as one block (centred, the paragraphs began ≈ 120 px under the strip while the frame started higher) */
.cm-text{align-self:start;padding-top:6px}
.cm-fig{width:100%;max-width:1100px;justify-self:end}
/* real slot: the museum label shows only if the file is gone (.is-empty) — never while loading */
.cm-fig .slot-ph{visibility:hidden}
.cm-fig.is-empty .slot-ph{visibility:visible}
.cm-fig.is-empty .tag--photo{display:none}
/* the caption leaves the picture (the label already says it) but stays with assistive technology, next to slot.sr */
.cm-fig.is-empty .photo-cap{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.cm-fig:not(.is-empty) .cm-sr{display:none}
.cm-row:has(.cm-fig.is-empty) .cm-text{padding-bottom:0}         /* no caption under the label → centre on the frame as is */
/* no JS (the loader never runs): resolved by painting alone. The label lies UNDER the photograph, so the file covers it;
   the photograph, its tag and its caption are masked by the same file — a mask image that fails to load is transparent black
   (CSS Masking §mask-image) — so a removed file leaves the museum label alone: no broken-image glyph, no alt text,
   no «Иллюстрация», no repeated caption. With the file present the mask is opaque: pixel-identical to the JS page.
   The URL is relative to assets/site.css (= data-src). */
html:not(.js) .cm-fig .slot-ph{visibility:visible;z-index:0}
html:not(.js) .cm-fig .photo-box img{z-index:1}
html:not(.js) .cm-fig .photo-box img,html:not(.js) .cm-fig .tag--photo,html:not(.js) .cm-fig .photo-cap{
  -webkit-mask:url(img/company/pavement.jpg) 0 0/100% 100% no-repeat;mask:url(img/company/pavement.jpg) 0 0/100% 100% no-repeat}

/* ---- role cards: two vitrines of equal weight; title / text / proof rows aligned across the pair (subgrid) ---- */
.cm-roles-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto auto auto;column-gap:var(--g);row-gap:0;align-items:stretch}
.cm-role{display:grid;grid-row:span 3;grid-template-rows:subgrid;align-content:start;padding:clamp(22px,2vw,36px)}
/* §4.5 r1 (≤ 4 backdrop surfaces per viewport, header bar included) — measured by scrolling the section at 360–2560 px.
   The section is tall and glass-rich (numbers, frame, pill, 2 cards, 3 panes), so the blur is spent where it can be seen:
   the numbers vitrine and the «Иллюстрация» pill over the picture (→ max 2 + header). The frame, the role cards and the
   decode panes keep the whole recipe (fill, bevel, rim, reflection, shadow) minus the blur — over this static ground
   (navy gradient, light field, grain .03) a 20 px blur of the backdrop is not visible, so nothing changes to the eye. */
.cm-role,.cm-fig .photo-win,.dec{-webkit-backdrop-filter:none;backdrop-filter:none}
.cm-role .txt{margin-top:12px;color:var(--paper)}
.cm-proof{margin-top:18px;padding-top:14px;border-top:1px solid var(--hair-2);font-size:max(14px,var(--fs-small));line-height:1.55;color:var(--paper-2);
  padding-right:max(0px,calc(100% - var(--measure-text)))}   /* hairline spans the card; the text keeps the running-text measure */

/* ---- partner line: the quiet sentence for general contractors and consultants ---- */
.cm-partner{margin-top:clamp(20px,3vh,32px);padding-left:20px;border-left:1px solid var(--hair-gold);font:italic 300 clamp(17px,1.25vw,22px)/1.4 var(--serif);color:var(--paper-2);max-width:64ch}

/* ---- decode: the name, read once — head centred, three panes ---- */
.cm-dhead{text-align:center;max-width:56ch;margin-inline:auto}
.cm-dhead .lede{max-width:56ch;margin:14px auto 0;text-wrap:balance}
.cm-cells{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--g);margin-top:clamp(28px,4vh,48px)}
.dec{padding:clamp(24px,2.4vw,40px);text-align:center}
.dec-w{display:inline-flex;flex-direction:column;align-items:stretch}
.dec-l{font:300 var(--fs-latin)/1 var(--serif);letter-spacing:var(--tr-lock);margin-right:calc(var(--tr-lock) * -1);color:var(--paper);font-kerning:none;font-synthesis:none}
.dec-dim{display:flex;align-items:center;margin-top:14px;height:18px}
.dec-dim .sg{flex:1;min-width:12px;height:1px;background:linear-gradient(90deg,var(--gold-lo),var(--gold) 45%,var(--gold-hi))}
.dec-dim .sg.r{background:linear-gradient(90deg,var(--gold-hi),var(--gold) 55%,var(--gold-lo))}
.dec-dim .tk{flex:none;width:1px;height:10px;background:var(--gold)}
.dec-dim span{padding:0 .8em;font:italic 300 clamp(17px,1.2vw,21px)/1 var(--serif);color:var(--gold-hi);white-space:nowrap}
.dec-s{margin-top:18px;font-size:var(--fs-text);line-height:1.55;color:var(--paper-2);text-wrap:balance}
.dec-s>span{display:block}                                    /* scope, then the motto on its own line */
.dec-s .dec-m{margin-top:6px;font:italic 300 var(--fs-cap)/1.4 var(--serif);color:var(--paper-2)}

/* ---- closing link, centred under the decode ---- */
.cm-more{text-align:center}

/* ---- tablet 761–1119: text above the figure (p1 | p2 side by side), figure full width; stats 3 cols (foundation) ---- */
@media (max-width:1119.98px){
  .cm-row{grid-template-columns:minmax(0,1fr);row-gap:var(--inner-gap)}
  .cm-text{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:calc(var(--g) * 2);align-items:start}
  .cm-text .txt+.txt{margin-top:0}
  .cm-text{padding-bottom:0;padding-top:0}
  .cm-fig{justify-self:stretch}
}

/* ---- phones ≤ 760: one column; roles and cells stacked; decode head and link left-aligned ---- */
@media (max-width:760px){
  .cm-text{display:block}
  .cm-text .txt+.txt{margin-top:1em}
  .cm-roles-grid{grid-template-columns:minmax(0,1fr);grid-template-rows:none;row-gap:var(--g)}
  .cm-role{display:flex;flex-direction:column;grid-row:auto}
  .cm-dhead{text-align:left;margin-inline:0}
  .cm-dhead .lede{margin-inline:0}
  .cm-cells{grid-template-columns:minmax(0,1fr)}
  .cm-more{text-align:left}
}

/* ===== 28-chapters.css ===== */
/* ==========================================================================
   28-chapters.css — chapter bands I · TERRA / II · VIA / III · AVIA (DESIGN §5.4, §8.2; ARCHITECTURE §3.3)
   One quiet Level-B pane per chapter: mark · label · line. No imagery, no link, no numbers.
   The band's own ground is the seam between two sections (§8.0): it starts on whatever the section above
   ends on and ends on whatever the section below starts with, so no seam is ever visible:
     I   company (navy + grain .03)     → objects (navy + grain .03)      : grain throughout
     II  leadership (--field-warm at 90 % 100 %, no grain) → technology (navy 950 → 900 → 950; the stage's own
         light field is technology's to fade in) : the warm field carries on and dies out, the band ends on navy-950
     III fleet (navy + grain .03)       → now (warm field at 88 % 0 %)    : grain fades out, the warm field begins
   html.low: objects and fleet drop their grain (30-objects.css, 60-fleet.css), company keeps it (20-company.css)
     → band III drops its grain, band I fades its grain out top → bottom (company's grain in, objects' none out).
   ========================================================================== */
/* z-index:1 — the band is a positioned sibling of the sections, so without it the next .sec (positioned, painted later)
   covers whatever leaves the band's box: the pane's bottom rim while it rises in (reveal, 18 px → 0) and its drop shadow.
   The band's grounds stay inside its own box; only the pane's overflow reaches into the next section's top padding. */
.chap{position:relative;z-index:1;isolation:isolate;padding:var(--chap-pt) var(--gutter) 0;
  --chap-warm:rgba(201,165,92,.07);   /* the colour stop of --field-warm (00-critical §3.5) and of the now ground (70-now.css) — keep in step */
  background:radial-gradient(40% 120% at 50% 100%,rgba(231,205,146,.045),rgba(231,205,146,0) 70%),var(--navy-950)}

/* the pane: one line on desktop — mark · label · line (right-aligned) */
.chap-in{display:grid;grid-template-columns:auto auto 1fr;align-items:center;gap:clamp(16px,2.4vw,40px);padding:clamp(18px,2.4vh,26px) clamp(20px,2vw,34px)}
.chap .mk{font:400 var(--fs-mark)/1 var(--serif);letter-spacing:.2em;white-space:nowrap;margin-right:-.2em}     /* trailing tracking out of the gap */
.chap .lb{font:500 var(--fs-micro)/1 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi);white-space:nowrap;margin-right:-.2em;
  text-box:trim-both cap alphabetic}      /* the label's box = its cap height, so its caps centre on the mark's caps (Inter sits ~1 px high at line-height 1); ignored where unsupported */
.chap .ln{font:italic 300 clamp(17px,1.3vw,23px)/1.3 var(--serif);color:var(--paper-2);justify-self:end;text-align:right;text-wrap:balance}

/* ---- grounds that meet the neighbours (literal geometry mirrors the neighbour's field, §8.0) ---- */
.chap--1::before,.chap--3::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:var(--grain) 0 0/256px 256px;opacity:.03}
.chap--3::before,
html.low .chap--1::before{-webkit-mask-image:linear-gradient(180deg,#000,transparent);mask-image:linear-gradient(180deg,#000,transparent)}
html.low .chap--3::before{display:none}   /* fleet has no grain under low (60-fleet.css) */
.chap--2{background:radial-gradient(55% 140% at 90% 0%,var(--chap-warm),transparent 70%),
  radial-gradient(40% 120% at 50% 100%,rgba(231,205,146,.045),rgba(231,205,146,0) 70%),var(--navy-950)}
.chap--3{background:radial-gradient(55% 140% at 88% 100%,var(--chap-warm),transparent 70%),
  radial-gradient(40% 120% at 50% 100%,rgba(231,205,146,.045),rgba(231,205,146,0) 70%),var(--navy-950)}

/* phones: two rows — mark + label / line */
@media (max-width:760px){
  .chap-in{grid-template-columns:auto 1fr;row-gap:8px}
  .chap .ln{grid-column:1/-1;justify-self:start;text-align:left}
}

/* the section that follows a band starts closer: the band is its chapter head (not the sticky tech stage) */
.chap + .sec:not(.tech){padding-top:clamp(56px,7vh,96px)}

/* ===== 30-objects.css ===== */
/* ==========================================================================
   30-objects.css — «Объекты команды», chapter I (DESIGN §8.3, §5.10, §5.11, §5.13; ownership §10:
   .ledger .lr* .pm, attribution block, summary block). Uses the foundation classes (.runhead .h2 .lede .txt
   .lnk .tag .vit .photo) unchanged; everything here is scoped to the section.
   ========================================================================== */

/* ---------- ground (§8.0): navy-950 → navy-900 → navy-950 + grain .03 so the ledger glass has a surface to refract ---------- */
.objects{padding-top:clamp(56px,7vh,96px);background:linear-gradient(180deg,var(--navy-950),var(--navy-900) 50%,var(--navy-950))}
.objects::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--grain) 0 0/256px 256px;opacity:.03;
  -webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 160px),transparent);mask-image:linear-gradient(180deg,#000 calc(100% - 160px),transparent)}   /* integration: leadership below has no grain — the lift (+4 RGB) fades out instead of stopping on a line */
html.low .objects::before{display:none}
#objects{scroll-margin-top:var(--hh)}
.objects .lr[id]{scroll-margin-top:calc(var(--hh) + var(--s-5))}

/* ---------- head (§8.3): h2 + attribution 7fr · summary 5fr, bottoms aligned ---------- */
.obj-head{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);column-gap:var(--g);align-items:end;margin-top:var(--head-gap)}
/* attribution block: D5 formula directly under the title, the open exception under it; one gold rule carries both */
.obj-attr{margin-top:18px}
/* measure — recorded deviation from --measure (44ch): at 44ch «Роль указана у каждого объекта: генеральный подряд или
   субподряд.» breaks 2 + 1 under a one-line first sentence; 66ch sets each D5 sentence on one line at ≥ 1120.
   +19 px = the gold rule (1 px) + its 18 px padding, so the text measure itself is 66ch. */
.obj-attr .lede,.obj-note{max-width:calc(66ch + 19px);padding-left:18px;border-left:1px solid var(--hair-gold)}
.obj-attr .lede>span{display:block}                /* each sentence of the D5 formula starts a line: no ragged 445 / 317 / 160 px rag */
@media (max-width:760px){.obj-attr .lede>span{display:inline}}   /* phones: the column is narrower than a sentence — let it flow */
/* final-fix (AD item 8): «Восемь объектов команды.» (13.18 em) holds one line on phones — 6.4vw keeps it inside the 390 / 360 measure */
@media (max-width:760px){.objects .h2{font-size:clamp(23px,6.4vw,40px)}}
.obj-note{padding-top:12px}
.obj-link{margin-top:18px;padding-left:19px}
/* summary: three quiet rows on hairlines (the geo row italic, paper-2) */
.obj-sum{border-bottom:1px solid var(--hair-2)}
.obj-sum li{padding:12px 0;border-top:1px solid var(--hair-2);font:300 17px/1.4 var(--serif);color:var(--paper);font-variant-numeric:lining-nums tabular-nums;text-wrap:balance}   /* a row that must wrap (1120–1439) splits in even halves: never «1 — здание» or «трасса А-380» alone */
.obj-sum .obj-geo{font:italic 300 16px/1.4 var(--serif);color:var(--paper-2)}
/* phones: each count on its own line (the «·» separators are .dot spans of the value — text content = COPY) */
@media (max-width:760px){.obj-sum li:not(.obj-geo) .nb{display:block}.obj-sum li:not(.obj-geo) .dot{display:none}}
@media (max-width:1119.98px){
  .obj-head{grid-template-columns:minmax(0,1fr)}
  .obj-sum{margin-top:var(--inner-gap);max-width:var(--measure-text)}
}
@media (min-width:2200px){.obj-sum li{font-size:19px}.obj-sum .obj-geo{font-size:18px}}

/* ---------- 5.10 ledger — one vitrine, a typographic register (verbatim, then section refinements) ----------
   Recorded deviation (to go back into DESIGN §5.10): the numeral column is 3.4rem, not 3.4em. --lr-cols resolves per
   element, and in the 11 px .lr-head 3.4em is 37 px against 54 px in the rows — the column heads would sit 17 px left of
   their columns. --lr-nw carries that width so the ≤ 1119 row padding follows the same value. */
.ledger{--lr-nw:3.4rem;--lr-cols:var(--lr-nw) minmax(0,6fr) minmax(0,5fr) 8.5rem 9rem;margin-top:var(--block-gap);padding:0 var(--pad-panel) 6px}
.lr-head{display:grid;grid-template-columns:var(--lr-cols);column-gap:var(--g);padding:16px 0 12px;border-bottom:1px solid var(--hair);font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-3)}
.lr-grp{display:flex;align-items:center;gap:12px;padding:24px 0 10px;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi)}
.lr-grp b{font:400 17px/1 var(--serif);letter-spacing:.06em;color:var(--paper);text-transform:none;font-variant-numeric:lining-nums tabular-nums}
.lr-grp::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--gold-50),rgba(201,165,92,0))}
.lr{position:relative;border-bottom:1px solid var(--hair-2)}
.lr:last-child{border-bottom:0}
/* hover wash (§6.5) as an opacity layer that runs to the glass edge (under the panel padding), so the band reads as a
   row of the vitrine, not a box floating inside it; focus-visible draws the §5.10 gold outline on the same band */
.lr::before{content:"";position:absolute;inset:0 calc(var(--pad-panel) * -1);z-index:-1;pointer-events:none;background:rgba(255,255,255,.022);opacity:0;transition:opacity var(--t-hover) var(--ease)}
@media (hover:hover){.lr:hover::before{opacity:1}.lr:hover .lr-tg{color:var(--paper)}}   /* §6.5 wash + toggle label → paper; never sticks after a tap */
.lr-row{position:relative;display:grid;grid-template-columns:var(--lr-cols);column-gap:var(--g);align-items:baseline;padding:clamp(16px,2.2vh,24px) 0}   /* the stretched button covers the row only, never the open panel */
.lr-n{font:400 15px/1 var(--serif);letter-spacing:.04em;color:var(--paper-3);font-variant-numeric:lining-nums tabular-nums;transition:color var(--t-hover)}
.lr-cell{min-width:0}
.lr-cell h4{font:inherit}
.lr-btn{display:block;width:100%}
.lr-btn::after{content:"";position:absolute;inset:0;z-index:1}                  /* the whole row clicks */
/* focus: the gold ring moves from the button to the row band only where it can be drawn — the accordion is live
   (30-objects.js ran) and :has() exists. Everywhere else the button keeps its own gold-hi outline (01-base, below). */
@supports selector(:has(*)){
  .objects.is-live .lr-btn:focus-visible{outline:none}
  .objects.is-live .lr:has(.lr-btn:focus-visible)::before{opacity:1;box-shadow:inset 0 0 0 1px var(--gold-hi)}
}
.lr-t{display:block;font:300 var(--fs-h4b)/1.2 var(--serif);color:var(--paper);text-wrap:balance}   /* no one-word second lines («…Ташкентской / области») */
.lr-type{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;margin-top:10px}
.lr-type a.tag{z-index:2}
.lr-short{font-size:var(--fs-card);line-height:1.55;color:var(--paper-2);transition:opacity var(--t-hover) var(--ease)}
/* desktop: an open row prints its scope in full right below — the short form beside it steps back (opacity only, no reflow) */
@media (min-width:1120px){.lr.is-open .lr-short,.lr.is-closing .lr-short{opacity:0}}
.lr-role{justify-self:start}
.lr-tg{justify-self:end;display:inline-flex;align-items:center;gap:10px;font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-2);white-space:nowrap;transition:color var(--t-hover) var(--ease)}
.lr .t-less,.lr.is-open .t-more{display:none}.lr.is-open .t-less{display:inline}
.pm{position:relative;display:block;width:11px;height:11px;flex:none}
.pm::before,.pm::after{content:"";position:absolute;background:currentColor}
.pm::before{left:0;right:0;top:5px;height:1px}
.pm::after{top:0;bottom:0;left:5px;width:1px;transition:transform .4s var(--ease-out)}
.lr.is-open .pm::after{transform:scaleY(0)}
.lr.is-open .lr-n{color:var(--gold-hi)}

/* expanded panel: fades in on open (no height animation), fades out in --t-swap on close, then `hidden` (30-objects.js) */
.lr-more{display:grid;grid-template-columns:var(--lr-cols);column-gap:var(--g);padding:0 0 clamp(22px,3vh,34px)}
.lr-more>div{grid-column:2/4;min-width:0;animation:lr-in .5s var(--ease-out) both}
@keyframes lr-in{from{opacity:0;transform:translate3d(0,8px,0)}to{opacity:1;transform:none}}
@keyframes lr-out{from{opacity:1;transform:none}to{opacity:0;transform:translate3d(0,-4px,0)}}
/* collapsed before the first paint; once 30-objects.js has run (.is-live) — also after a late boot under tv-fallback — JS adds `hidden` too */
html.js:not(.tv-fallback) .lr:not(.is-open):not(.is-closing)>.lr-more,.objects.is-live .lr:not(.is-open):not(.is-closing)>.lr-more{display:none}
.lr.is-closing .lr-more>div{animation:lr-out var(--t-swap) var(--ease) both}
.lr-scope{font:300 var(--fs-row)/1.45 var(--serif);color:var(--paper);max-width:52ch}
.lr-dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px var(--g);margin-top:18px}
.lr-dl:not(:has(>div:not([hidden]))){display:none}
.lr-dl dt{font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-3)}
.lr-dl dd{margin-top:6px;font:300 17px/1.35 var(--serif);color:var(--paper)}
.lr-ph{margin-top:20px;max-width:640px}
#obj-06 .lr-ph{max-width:520px}                                                    /* 680 px source (§5.11 limit) */

/* no JS, or site.js has not run by the 7 s safety net (tv-fallback without .is-live): every panel stays open as ordinary
   content, nothing pretends to toggle. A late site.js marks the section .is-live and the full accordion comes back. */
:is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-tg{display:none}
:is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-btn{cursor:text}
:is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-btn::after{display:none}
:is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr::before{display:none}
.objects:not(.is-live) .lr-btn:focus-visible{outline:1px solid var(--gold-hi);outline-offset:4px}   /* §6.5 / §9: a visible ring on every tab stop */
html:not(.js) .lr-more>div{animation:none}
/* site.js never ran — two foundation states would blank this section (escalated to the foundation; guarded here):
   05-functional keeps [data-reveal] at opacity 0 until .is-in / .reveal-all, and 03-components keeps a slot image at
   opacity 0 until the loader marks it .is-shown. The row-06 photograph is already in the HTML (src). */
html.tv-fallback #objects [data-reveal]:not(.is-in){opacity:1;transform:none}
html.tv-fallback #objects .photo[data-slot="real"] .photo-box img[src]{opacity:1;visibility:visible}

/* tablet and phone (≤ 1119): the column heads are gone (§5.10), so the role tag no longer needs a headed column of its own.
   One flowing column beside the numeral — title / type + role tags on ONE line (row 06's chip follows) / short — and the
   toggle hangs on the title's first line at the right (tablet) or closes the row as a 44 px line (phone).
   Why not §5.10's grid: at 768 it squeezed the titles into a 273 px column (three-line titles) beside a headless role
   column, and on phones it stacked the role tag two lines under the type tag, splitting the two labels of one object.
   The row keeps its stretched button; .lr-more keeps the numeral grid. */
@media (max-width:1119.98px){
  .ledger{--lr-nw:3.2rem;--lr-cols:var(--lr-nw) minmax(0,1fr)}
  .lr-head{display:none}
  .lr-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;padding-left:calc(var(--lr-nw) + var(--g));padding-right:calc(8.5rem + var(--g))}
  .lr-cell,.lr-type{display:contents}
  .lr-n{position:absolute;left:0;top:clamp(16px,2.2vh,24px);line-height:calc(var(--fs-h4b) * 1.2)}
  .lr-cell h4{order:1;flex:0 0 100%;margin-bottom:2px}
  .lr-type .tag{order:2}
  .lr-role{order:3}
  .lr-type a.tag{order:4}
  .lr-short{order:5;flex:0 0 100%;margin-top:4px}
  .lr-tg{position:absolute;right:0;top:clamp(16px,2.2vh,24px);height:calc(var(--fs-h4b) * 1.2)}
  .lr-more>div{grid-column:2/-1}
}
@media (max-width:760px){
  .ledger{--lr-nw:2.6rem}
  .lr-row{padding:clamp(16px,2.2vh,24px) 0 2px calc(var(--lr-nw) + var(--g))}
  .lr-tg{position:static;order:6;height:auto;min-height:44px}
  .lr-dl{grid-template-columns:1fr}
  :is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-row{padding-bottom:14px}   /* no toggle line: keep air above the scope */
}
/* ≤ 374 (360 phones): a narrower numeral column gives the titles the room to break in two, not four («…/ аэропорт /…») */
@media (max-width:374.98px){.ledger{--lr-nw:2.2rem}}
/* inert ledger on tablet / phone: the scope sentence is the full form of the short one right above it — print it once */
@media (max-width:1119.98px){
  :is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-short{display:none}
  :is(html:not(.js),html.tv-fallback) .objects:not(.is-live) .lr-row{padding-right:0}
}
@media (min-width:2200px){.lr-n{font-size:17px}.lr-grp b{font-size:19px}.lr-dl dd{font-size:19px}}
html.reduced .lr-more>div,html.reduced .lr.is-closing .lr-more>div{animation:none}

/* ===== 40-leadership.css ===== */
/* ==========================================================================
   40-leadership.css — «Руководство», chapter I (DESIGN §8.4 · §5.9 · §5.11 · §5.13; ARCHITECTURE §3.5)
   Owns: portrait grid, name block (the portrait's museum label), .stats--word tweaks. Everything else is foundation.
   Deviations from §8.4 for the design lead: facts as register rows ≥ 1120 with labels at --fs-text (see facts block below);
   portrait ≥ 1600 = director-full.jpg at ≤ 640 via <picture> (see portrait block; reshoot note in the partial).
   ========================================================================== */

/* ---- ground (§8.0): warm field on navy-950 — starts and ends on navy-950, no seam with objects / band II ---- */
.leadership{background:var(--field-warm),var(--navy-950)}

/* ---- portrait grid: portrait 5fr | text 7fr; phones: h2 → portrait → name → text (§8.4) ---- */
.lead-grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);grid-template-rows:auto 1fr;
  grid-template-areas:"fig head" "fig body";column-gap:clamp(32px,4vw,80px);align-items:start;margin-top:var(--head-gap)}
.lead-h{grid-area:head;margin-top:-.19em}                   /* optical: the cap line of the title, not its line box, meets the frame's top edge */
.lead-body{grid-area:body;margin-top:var(--inner-gap)}

/* ---- portrait + name block: the name block is the portrait's museum label and sits under the photo at every width (§8.4) ---- */
.lead-fig{grid-area:fig}
.lead-fig .photo-win{max-width:420px}                        /* director.jpg is 500 px wide: never above 420 CSS px (§5.11, §9.29) */
@media (min-width:1600px){                                   /* <picture> swaps in director-full.jpg (768 px, ✦ retouched): the portrait fills its
                                                                5fr column (573–700 px) up to 640 — the same ≈ 1.2 source px per CSS px as 500 → 420 */
  .lead-fig .photo-win{max-width:640px}
}
.lead-id{display:flex;flex-direction:column;align-items:flex-start;margin-top:var(--s-5)}
.lead-name{font:300 var(--fs-h3r)/1.1 var(--serif);letter-spacing:.002em;color:var(--paper)}
.lead-role{margin-top:10px;margin-right:-.2em;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi)}
.lead-org{margin-top:var(--s-2);font-size:14px;line-height:1.45;color:var(--paper-2)}

/* ---- facts: three word facts in one vitrine (§5.9 .stats--word) ----
   «Одна команда» needs ≈ 6.8 em of the value size and «ООО «DORKOMPLEKTSNAB PLUS»» (never broken) ≈ 208–233 px, so §8.4's three
   equal columns wrap the value and collide below ≈ 1600 px. From 1120 up the tiles therefore read as a register — value | label on
   one baseline, hairline between rows — and the vitrine spans the text column (right edge = runhead / team strip). Below 1120
   (every tablet and landscape phone, whatever the orientation) and on phones they stack: value over label, the §5.9 tile as is.
   No 1 + 2 gold bracket (a pair rule of the numbers strip). */
.lead-facts{margin-top:var(--block-gap)}
.leadership .stats--word .st::before,.leadership .stats--word .st::after{display:none}
.leadership .stats--word .st-l{max-width:none}                 /* the unbreakable DORKOMPLEKTSNAB PLUS run gets the whole row / tile */

/* register rows ≥ 1120 */
@media not all and (max-width:1119.98px){
  .leadership .stats--word{grid-template-columns:max-content minmax(0,1fr)}   /* value column = the widest value, exactly, in RU and UZ */
  .leadership .stats--word .st{grid-column:1/-1;display:grid;grid-template-columns:subgrid;column-gap:calc(var(--g) * 2);align-items:baseline}
  .leadership .stats--word .st-l{margin-top:0;font-size:var(--fs-text);line-height:1.5}   /* a register line reads at the paragraph size */
  @supports not (grid-template-columns:subgrid){                              /* older engines: every row reserves «Одна команда» (≈ 6.8 em) */
    .leadership .stats--word .st{grid-template-columns:auto minmax(0,1fr)}
    .leadership .stats--word .st-v{min-width:7em}
  }
}

/* stacked facts ≤ 1119.98: one column (§8.4 phones: word facts are not a pair rule); tile and label are the §5.9 foundation, untouched */
@media (max-width:1119.98px){
  .leadership .stats--word{grid-template-columns:minmax(0,1fr)}
}

.lead-more{margin-top:var(--inner-gap)}

/* ---- silent: on-site photograph (3:2) after the link; team strip (3 × 4:3) under the grid — both leave no trace without files.
        Unframed (§5.13: figure.photo > .photo-box): only the portrait wears a glass frame (§8.4), which keeps the backdrop budget
        at portrait + facts + header = 3 when every file is present (§4.5.1). ---- */
.lead-site{margin-top:var(--block-gap);font-size:var(--fs-text);max-width:var(--measure-text)}   /* the paragraphs' measure: secondary to the portrait, never a hero */
.lead-team{margin-top:var(--block-gap);padding-top:var(--inner-gap);border-top:1px solid var(--hair-2)}
.lead-team .strip-grid{margin-top:var(--inner-gap)}

/* final-fix (AD nice-to-have 8): 1280–1599 the 420 px portrait takes its own column (no dead gutter before the text); on every
   desktop the facts + link rest on the name block's baseline when the portrait column is taller (1920: 300 px of air otherwise) —
   the story keeps its block gap above them when there is no spare room */
@media (min-width:1280px) and (max-width:1599.98px){.lead-grid{grid-template-columns:minmax(0,420px) minmax(0,1fr)}}
@media not all and (max-width:1119.98px){
  .lead-body{align-self:stretch;display:flex;flex-direction:column}
  .lead-body>.lead-story{margin-bottom:var(--block-gap)}
  .lead-body>.lead-facts{margin-top:auto}
}

/* ---- tablet (761–1119): same order, 4fr | 6fr ---- */
@media (max-width:1119.98px){
  .lead-grid{grid-template-columns:minmax(0,4fr) minmax(0,6fr)}
}

/* ---- phones: one column ---- */
@media (max-width:760px){
  .lead-grid{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-template-areas:"head" "fig" "body"}
  .lead-h{margin-top:0}
  .lead-fig{margin-top:var(--inner-gap)}
}

/* ===== 50-technology.css ===== */
/* ==========================================================================
   50-technology.css — «Технология»: the layers film on a sticky stage, chapter II
   DESIGN §8.6 (scene, thresholds, anchors, legend, phones, static), §5.14 (pins · leader · vitrine), §5.15 (.tprog), §6.3 (motion);
   ARCHITECTURE §3.6 and D14 amended (scroll track, no lock). Owner of: .t-* .lg* .pin .ld .co .co-* .ctx .chips (DESIGN §10).
   50-technology.js picks one of four homes for the detail vitrine by measurement and marks the stage .t-run (film running):
     .is-film  — on the film, right ≤ 40 %, a gold leader from the active pin (desktop ≥ 1120, when the tallest callout fits)
     .is-side  — in the copy column instead of the legend: «the card is the legend» (landscape tablets, short desktops)
     .is-stack — one column: heading → film → card → caption → body (phones, portrait tablets)
     .is-land  — landscape phones (max-height 500): heading row, then film | card/body side by side
   The film never moves while the stops change (DESIGN §1.4): stack/land give the three headings one shared row and put the
   stop-dependent text below / beside the film. Fit order (§8.6, all decided per stage, never per stop): note → .job/.mch behind
   «Подробнее» (only the layers that need it) → smaller h2; a card that still does not fit scrolls inside its own glass.
   The stage is never shifted under the header. tech.small never hides.
   ========================================================================== */

/* ---------- scene: tall track, sticky stage (no scroll lock) ---------- */
.sec.tech{padding:0;background:linear-gradient(180deg,var(--navy-950),var(--navy-900) 55%,var(--navy-950))}
.t-track{position:relative;height:300vh;height:300svh}
.t-stage{position:-webkit-sticky;position:sticky;top:0;min-height:100vh;min-height:100svh;padding:calc(var(--hh) + clamp(12px,2.2vh,26px)) var(--gutter) clamp(16px,2.6vh,32px);display:flex;flex-direction:column;overflow-x:clip}
/* a light field behind the stage: the vitrine and the window rim need something to refract (§4.5 rule 7) */
.t-stage::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--field-cold),var(--field-warm);
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 180px);mask-image:linear-gradient(180deg,transparent,#000 180px)}   /* integration: the cold field peaks on the stage's top edge — it met band II's navy-950 on a line; now it rises out of it */
.t-stage>.runhead{flex:none}
.t-stage .runhead .tprog{margin-left:auto}
/* measuring (50-technology.js walks every stop / layer / chip in one frame): nothing may start a transition, and the stage
   shows its natural height so spare room is measurable */
.t-stage.t-measure,.t-stage.t-measure *,.t-stage.t-measure *::before,.t-stage.t-measure *::after{transition:none!important}
.t-stage.t-measure{min-height:0!important}

/* ---------- grid: copy 4fr · film 8fr (§8.6, top-aligned) ---------- */
.t-grid{position:relative;flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);column-gap:clamp(28px,3.2vw,64px);margin-top:clamp(18px,3vh,40px);align-items:start;align-content:start}
/* large desktops: the runhead travels with its content — the whole group is centred in the free height, never split (§8.0 rhythm) */
.t-stage.t-run.is-film>.runhead{margin-top:auto}
.t-stage.t-run.is-film>.t-grid{flex:none;margin-bottom:auto}
.t-copy{display:grid;align-content:start;min-width:0}
.t-s{grid-area:1/1;min-width:0;opacity:0;visibility:hidden;transform:translate3d(0,14px,0);transition:opacity .35s var(--ease),transform .4s var(--ease),visibility 0s .4s}
.t-stage[data-s="0"] .t-s0,.t-stage[data-s="1"] .t-s1,.t-stage[data-s="2"] .t-s2{opacity:1;visibility:visible;transform:none;transition:opacity .8s var(--ease-out) .12s,transform .9s var(--ease-out) .12s,visibility 0s}
.t-s .lede{margin-top:clamp(14px,2.2vh,24px)}
/* two-column stage: the copy column is 4fr, so the titles step down a tenth — each sentence keeps its own line (no one-word lines) */
@media (min-width:1120px),(orientation:landscape) and (min-width:761px){.t-s .h2{font-size:calc(var(--fs-h2) * .9)}}
.t-btns{display:flex;flex-wrap:wrap;gap:12px 28px;margin-top:clamp(18px,3vh,32px)}
.t-cue{display:flex;align-items:center;gap:12px;margin-top:clamp(16px,2.6vh,28px);font:500 var(--fs-micro)/1.4 var(--sans);letter-spacing:.16em;text-transform:uppercase;color:var(--paper-3)}
.t-cue::before{content:"";flex:none;width:1px;height:22px;background:linear-gradient(180deg,var(--gold-hi),rgba(231,205,146,0))}
/* the stop-1 cue waits for the callouts (§8.6: «after the callouts are in») */
.t-s1 .t-cue{opacity:0;transition:opacity .18s var(--ease)}
.t-stage.open .t-s1 .t-cue{opacity:1;transition:opacity .8s var(--ease-out) 1s}
.tech .brand-line{margin-top:clamp(16px,2.6vh,28px);padding-top:clamp(14px,2.2vh,22px);border-top:1px solid var(--hair);font:italic 300 var(--fs-quote)/1.25 var(--serif);color:var(--paper);text-wrap:balance}
.tech .handover{margin-top:clamp(12px,2vh,20px);font-size:var(--fs-intro);line-height:1.55;color:var(--paper-2)}
.t-slot:empty{display:none}

/* ---------- legend (desktop left column, stop 1) — grouped the way the norm groups them ---------- */
.lg{margin-top:clamp(12px,2.2vh,26px)}
.lg-cap{display:flex;align-items:center;gap:10px;margin:clamp(8px,1.4vh,14px) 0 2px;font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--gold-hi)}
.lg-cap::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--gold-50),rgba(201,165,92,0))}
.lg-mid{position:relative;padding-left:14px}
.lg-mid::before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:6px;border:1px solid rgba(201,165,92,.55);border-right:0}   /* «Искусственное основание» bracket over 2–4 */
.lg button{display:grid;grid-template-columns:1.9em minmax(0,1fr) auto;align-items:baseline;width:100%;padding:clamp(6px,1vh,10px) 0;border-bottom:1px solid var(--hair-2);text-align:left;
  opacity:0;transform:translate3d(0,8px,0);transition:opacity .5s var(--ease-out) var(--d,0ms),transform .6s var(--ease-out) var(--d,0ms)}
.t-stage.open .lg button{opacity:1;transform:none}
.lg-cap,.lg-mid::before{opacity:0;transition:opacity .5s var(--ease-out) .1s}
.t-stage.open .lg-cap,.t-stage.open .lg-mid::before{opacity:1}
.t-stage:not(.open) .lg button,.t-stage:not(.open) .lg-cap,.t-stage:not(.open) .lg-mid::before{transition-duration:.18s;transition-delay:0s}
.lg .n{font:400 15px/1 var(--serif);color:var(--paper-3);transition:color .4s}
.lg .tx{min-width:0}
.lg .nm{display:block;font:300 var(--fs-h5)/1.2 var(--serif);color:var(--paper-2);transition:color .4s}
.lg .mt{display:block;margin-top:2px;font-size:var(--fs-small);line-height:1.4;color:var(--paper-3)}
.lg button:hover .nm{color:var(--paper)}
.lg button[aria-current="true"] .n{color:var(--gold-hi)}
.lg button[aria-current="true"] .nm{color:var(--paper)}
.lg button:focus-visible{outline-offset:2px}
/* silent 1:1 material close-ups (§5.13): invisible until a file exists */
.lg .th{display:block;width:44px;margin-left:12px;align-self:center}
.th img,.co-th img{display:block;width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;border-radius:var(--r-1);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08)}
/* the card is the legend wherever the vitrine is not on the film */
.t-stage.t-run:is(.is-side,.is-stack,.is-land) .t-s1 .lg{display:none}

/* ---------- the film window (.vit.vit--clear) ---------- */
.t-fig{position:relative;justify-self:end;width:min(100%,calc((100svh - var(--hh) - var(--tchrome,230px)) * 1.7778));min-width:0;margin:0}
.t-win{--bev:5px;display:block;aspect-ratio:16/9}
.t-film{position:absolute;inset:0;overflow:hidden;border-radius:var(--r-1);background:var(--ink)}
.t-film::after{content:"";position:absolute;inset:0;z-index:4;pointer-events:none;background:var(--film-side)}
.t-film::before{content:"";position:absolute;inset:0;z-index:5;pointer-events:none;background-image:var(--grain);background-size:256px 256px;opacity:.05}
.t-still img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

/* ---------- pins and leader (§5.14) ---------- */
.t-ov{position:absolute;inset:0;z-index:5;pointer-events:none}
.pin{--hs:3px;position:absolute;left:var(--x);top:var(--y);width:26px;height:26px;margin:-13px 0 0 -13px;border-radius:var(--r-round);display:grid;place-items:center;pointer-events:auto;
  font:400 12.5px/1 var(--serif);font-variant-numeric:lining-nums;color:var(--paper);border:1px solid var(--gold-hi);background:rgba(6,13,27,.6);box-shadow:0 0 0 4px rgba(6,13,27,.22);
  opacity:0;visibility:hidden;transform:scale(.6);transition:opacity .4s var(--ease-out) var(--d,0ms),transform .5s var(--ease-out) var(--d,0ms),background-color .3s,color .3s,visibility 0s .5s}
.pin::after{content:"";position:absolute;inset:-10px;border-radius:50%}                        /* 44 px hit area (26 + 2 × 9, 24 + 2 × 10 on phones) */
/* pins 2 and 3 sit closest (11–13 % of the frame): their hit areas meet half-way instead of overlapping, and grow sideways */
.pin[data-l="2"]::after{bottom:calc(var(--hs) * -1);left:-16px;right:-16px;border-radius:22px}
.pin[data-l="3"]::after{top:calc(var(--hs) * -1);left:-16px;right:-16px;border-radius:22px}
.t-stage.open .pin{opacity:1;visibility:visible;transform:none;transition:opacity .4s var(--ease-out) var(--d,0ms),transform .5s var(--ease-out) var(--d,0ms),background-color .3s,color .3s,visibility 0s}
.pin:hover{background:var(--pill-solid)}
.pin[aria-current="true"]{background:var(--gold-hi);color:var(--navy-950)}
.pin:focus-visible{outline-offset:3px}
/* the leader is a 1 px line drawn with transform only: it glides with the vitrine when the active layer changes */
.ld{position:absolute;left:0;top:0;width:1px;height:1px;transform-origin:0 50%;transform:translate3d(var(--x,0px),var(--y,0px),0) scaleX(var(--w,0));
  background:linear-gradient(90deg,var(--gold-hi),rgba(231,205,146,.7));opacity:0;transition:opacity .3s var(--ease)}
.t-stage.is-film.open .ld{opacity:1;transition:opacity .4s var(--ease-out) .45s,transform .6s var(--ease-out)}
.t-stage:not(.is-film) .ld{display:none}
/* exits ≤ 200 ms (layers-video.md §1): the reverse film moves at once */
.t-stage:not(.open) .pin,.t-stage:not(.open) .ld,.t-stage:not(.open) .co{transition-duration:.18s;transition-delay:0s}

/* ---------- the detail vitrine (.co.vit.vit--thin) — shared ---------- */
.co{--bev:4px;display:flex;flex-direction:column;padding:15px 18px;pointer-events:auto;opacity:0;visibility:hidden;transition:opacity .18s var(--ease),transform .55s var(--ease-out),visibility 0s .18s}
.t-stage.open .co{opacity:1;visibility:visible}
/* the inner column carries the content; when a card is taller than its room (smallest phones) this — not the glass — scrolls */
.co-in{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;margin:-4px -6px -10px;padding:4px 6px 10px}   /* the padding keeps focus rings and 44 px hit areas inside the scroll box */
.t-stage.t-run:not(.is-film) .co-in{max-height:var(--co-max,none);overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(231,205,146,.35) transparent}
.co-in.is-over:not(.is-end){-webkit-mask:linear-gradient(180deg,#000 calc(100% - 52px),transparent calc(100% - 6px));mask:linear-gradient(180deg,#000 calc(100% - 52px),transparent calc(100% - 6px))}   /* the last lines dissolve: «there is more», never a line cut in half */
.co-b{position:relative;display:flex;flex-direction:column;flex:1 0 auto;transition:opacity .25s var(--ease)}
.co-b>.lnk{align-self:flex-start;margin-top:auto;padding-top:12px}             /* the link rests on the card's floor */
.co.swap .co-b{opacity:0}
.co-h{display:flex;align-items:baseline;gap:12px}
.co-h .n{font:400 16px/1 var(--serif);font-variant-numeric:lining-nums;color:var(--gold-hi)}
.co-h .nm{font:300 clamp(19px,1.45vw,26px)/1.12 var(--serif);color:var(--paper);text-wrap:balance}
.co .grpn{margin-top:6px;font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.16em;text-transform:uppercase;color:var(--paper-3)}
.co .mat{margin-top:6px;font:italic 300 clamp(15px,1.06vw,18px)/1.35 var(--serif);color:var(--paper)}
.co .job{margin-top:8px;padding-top:8px;border-top:1px solid var(--hair-2);font-size:var(--fs-small);line-height:1.5;color:var(--paper-2)}
.co .mch{margin-top:8px;font-size:var(--fs-small);line-height:1.5;color:var(--paper-2)}
.co .mch b{font-weight:500;color:var(--paper);letter-spacing:.02em}
.co .lnk{font-size:var(--fs-micro-s)}
.co-th{display:none}
/* callout 1: two chips (rigid / flexible) — they switch only the text and the link, never the film; each label on one line (§5.7) */
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.chips .chip{white-space:nowrap}
.ctx{margin-top:8px;font-size:var(--fs-small);line-height:1.5;color:var(--paper-2)}
.ctx-t{display:none}
.ctx-x{display:block}
.ctx small{display:block;margin-top:6px;padding-left:10px;border-left:1px solid var(--hair-gold);font-size:var(--fs-small);line-height:1.45;color:var(--paper-3)}
/* «Подробнее» — only on a layer whose card would not fit otherwise (.is-compact) */
.co.is-compact:not(.is-more) :is(.job,.mch,.ctx small){display:none}
.co-more{align-self:flex-start;display:inline-flex;align-items:center;gap:10px;min-height:32px;margin-top:6px;font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-2);transition:color var(--t-fast)}
.co-more:hover{color:var(--paper)}
.co-more .t-less,.co.is-more .co-more .t-more{display:none}
.co.is-more .co-more .t-less{display:inline}
.co-pm{position:relative;display:block;flex:none;width:9px;height:9px}
.co-pm::before,.co-pm::after{content:"";position:absolute;background:currentColor}
.co-pm::before{left:0;right:0;top:4px;height:1px}
.co-pm::after{top:0;bottom:0;left:4px;width:1px;transition:transform .4s var(--ease-out)}
.co.is-more .co-pm::after{transform:scaleY(0)}
html.touch .co-more{position:relative}
html.touch .co-more::after{content:"";position:absolute;left:-6px;right:-6px;top:-6px;bottom:-6px}

/* ---------- home 1 · on the film (.is-film) ---------- */
.t-stage.is-film .co{position:absolute;right:2.5%;top:0;width:clamp(290px,40%,460px);transform:translate3d(12px,var(--cy,0px),0)}
.t-stage.is-film.open .co{transform:translate3d(0,var(--cy,0px),0);transition:opacity .6s var(--ease-out) .35s,transform .6s var(--ease-out),visibility 0s}
/* over the film only --paper, --paper-2 and --gold-hi are text tones (§4.5 rule 4) */
.t-stage.is-film .co .grpn,.t-stage.is-film .ctx small{color:var(--paper-2)}

/* ---------- home 2 · in the copy column (.is-side): the card is the legend ---------- */
.t-stage.is-side .t-grid{grid-template-columns:minmax(0,5fr) minmax(0,7fr)}
.t-stage.is-side .co{margin-top:clamp(16px,2.6vh,26px);transform:translate3d(0,10px,0)}
.t-stage.is-side.open .co{transform:none;transition:opacity .6s var(--ease-out) .15s,transform .7s var(--ease-out) .15s,visibility 0s}

/* ---------- home 3 · under the film (.is-stack) ---------- */
.t-stage.is-stack .co{margin-top:12px;transform:translate3d(0,8px,0)}
.t-stage.is-stack.open .co{transform:none;transition:opacity .6s var(--ease-out) .15s,transform .7s var(--ease-out) .15s,visibility 0s}
.t-stage.t-run.is-stack:not([data-s="1"]) .co{display:none}

/* ---------- stack / land while the film runs: one heading row, the film anchored, the stop text below (stack) or beside (land) it.
   The three headings share one cell (the row keeps the tallest); the three bodies share another and only the current one is in flow ---------- */
.t-stage.t-run.is-stack .t-grid{grid-template-columns:minmax(0,1fr);grid-template-areas:"head" "fig" "body";row-gap:clamp(16px,2.2vh,24px)}
.t-stage.t-run.is-land .t-grid{grid-template-columns:var(--tfw,50%) minmax(0,1fr);grid-template-areas:"head head" "fig body";column-gap:clamp(20px,3vw,32px);row-gap:10px;margin-top:10px}
.t-stage.t-run:is(.is-stack,.is-land) :is(.t-copy,.t-s){display:contents}
.t-stage.t-run:is(.is-stack,.is-land) .t-fig{grid-area:fig;justify-self:stretch;width:auto}
.t-stage.t-run:is(.is-stack,.is-land) .t-s>.h2{grid-area:head;min-width:0;opacity:0;visibility:hidden;transform:translate3d(0,12px,0);transition:opacity .35s var(--ease),transform .4s var(--ease),visibility 0s .4s}
.t-stage.t-run:is(.is-stack,.is-land) .t-s>.t-b{grid-area:body;position:absolute;left:0;right:0;min-width:0;opacity:0;visibility:hidden;transform:translate3d(0,12px,0);transition:opacity .35s var(--ease),transform .4s var(--ease),visibility 0s .4s}
.t-stage.t-run:is(.is-stack,.is-land)[data-s="0"] .t-s0>:is(.h2,.t-b),.t-stage.t-run:is(.is-stack,.is-land)[data-s="1"] .t-s1>:is(.h2,.t-b),.t-stage.t-run:is(.is-stack,.is-land)[data-s="2"] .t-s2>:is(.h2,.t-b){position:relative;opacity:1;visibility:visible;transform:none;transition:opacity .8s var(--ease-out) .12s,transform .9s var(--ease-out) .12s,visibility 0s}
.t-stage.t-run:is(.is-stack,.is-land) .t-b>:first-child{margin-top:0}
/* one column on touch screens: the card is the legend and carries the stop-1 story; scrolling needs no cue (§8.6 Phone) */
.t-stage.t-run.is-stack :is(.t-s1 .lede,.t-cue){display:none}
/* safety for phones shorter than every rung: the stop-0 text scrolls inside its own column (never the stage, never under the header) */
.t-stage.t-run:is(.is-stack,.is-land) .t-s0>.t-b.t-sc{max-height:var(--b0-max,none)}
.t-stage.t-run .t-b.t-sc{overflow-y:auto;margin:-4px -6px -10px;padding:4px 6px 10px;scrollbar-width:thin;scrollbar-color:rgba(231,205,146,.35) transparent}
.t-b.t-sc.is-over:not(.is-end){-webkit-mask:linear-gradient(180deg,#000 calc(100% - 52px),transparent calc(100% - 6px));mask:linear-gradient(180deg,#000 calc(100% - 52px),transparent calc(100% - 6px))}
.t-stage.t-run:is(.is-stack,.is-land):not([data-s="1"]) .t-cap .note{display:none}

/* ---------- caption: the mandatory small print, every stop ---------- */
.t-cap{display:grid;grid-template-columns:28px minmax(0,1fr);row-gap:6px;margin-top:14px;align-items:baseline}
/* audit: one column (stack / land) — the caption steps out while a stop swaps the card slot above it and fades back in (50-technology.js) */
.t-stage.t-run:is(.is-stack,.is-land) .t-cap{transition:opacity .35s var(--ease)}
.t-stage.cap-hold .t-cap{visibility:hidden;opacity:0;transition:none}
.t-cap::before{content:"—";grid-column:1;grid-row:1;font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.2em;color:var(--paper-3)}
.t-small{grid-column:2;font:italic 300 var(--fs-cap)/1.4 var(--serif);color:var(--paper-2)}
.t-cap .note{grid-column:2;font-size:var(--fs-small);line-height:1.5;color:var(--paper-3);max-width:96ch;visibility:hidden;opacity:0;transition:opacity .3s var(--ease),visibility 0s .3s}
.t-stage[data-s="1"] .t-cap .note{visibility:visible;opacity:1;transition:opacity .8s var(--ease-out) .5s,visibility 0s}

/* ---------- ultra (≥ 2200) ---------- */
@media (min-width:2200px){.co .job{font-size:15.5px}}      /* .mch, .ctx, .mt follow --fs-small (15 px at ultra) */

/* ---------- phones ≤ 760 (§8.6 Phone; a phone held sideways is the land home below) ---------- */
@media (max-width:760px) and (orientation:portrait),(max-width:760px) and (min-height:501px){
  .t-track{height:240vh;height:240svh}
  .t-stage{padding-top:calc(var(--hh) + 10px);padding-bottom:12px}
  .t-stage .runhead{flex-wrap:nowrap}
  .t-stage.t-run .runhead :is(.ovl,.dot,.rl){display:none}                     /* the progress takes the right slot while the film runs */
  .t-stage .runhead .tprog{letter-spacing:.06em}
  .t-grid{margin-top:10px;row-gap:10px}
  .t-stage.t-run.is-stack .t-grid{row-gap:10px}
  .t-s .lede{margin-top:10px;font-size:var(--fs-intro)}
  .t-stage.t-run .t-s1 .lede{display:none}                                        /* the card is the legend */
  .t-btns{margin-top:12px;gap:10px 16px}
  .t-btns .lnk{gap:10px;letter-spacing:.14em;padding-bottom:6px}
  .t-btns .arr{width:18px}
  .t-stage.t-run :is(.t-back,.t-cue){display:none}
  .tech .brand-line{margin-top:12px;padding-top:10px}
  .tech .handover{margin-top:10px}
  /* film full-bleed, 4:3, rim off */
  .t-fig,.t-stage.t-run.is-stack .t-fig{margin:0 calc(var(--m) * -1);width:auto}
  .t-win{--bev:0px;aspect-ratio:4/3;border:0;border-radius:0;box-shadow:none}
  .t-win::before,.t-win::after{display:none}
  .t-film{border-radius:0}
  /* five glass dots on the x = 84 % ruler, no leader */
  .pin{left:var(--xm);top:var(--ym);width:24px;height:24px;margin:-12px 0 0 -12px;font-size:12px}
  /* the vitrine becomes a card under the film */
  .co{margin:10px var(--m) 0;padding:12px 16px}
  .t-stage.is-stack .co{margin-top:10px}
  .co :is(.grpn,.lnk,.ctx small){display:none}
  .co .job{font-size:13.5px}
  .chips{flex-wrap:nowrap}
  .chips .chip{flex:1 1 0;min-width:0;padding:5px 8px;font-size:11.5px;white-space:normal;text-align:center}   /* one segmented pair */
  .co-th{display:block;position:absolute;right:0;top:0;width:56px}
  .co-b:has(.co-th:not([hidden])) .co-h,.co-b:has(.co-th:not([hidden])) .mat{padding-right:68px}
  .t-cap{margin:10px var(--m) 0;grid-template-columns:minmax(0,1fr)}
  .t-cap::before{display:none}
  .t-small,.t-cap .note{grid-column:1}
  .t-small{font-size:var(--fs-small)}
}

/* ---------- final-fix (AD item 2) · the compact hold — short phones (100 svh ≤ 760 px, or wherever the card would otherwise scroll).
   .t-short is set by 50-technology.js on phones only. The card never scrolls inside: two lines of .job, the chips, «Подробнее»
   right below; the opened card grows upward over the film (--co-lift keeps its lower edge in place). Below ~680 px svh the
   script chooses the static layout instead. ---------- */
.t-stage.t-short .t-s1>.h2,.t-stage.t-short[data-s="1"] .t-s>.h2{display:none}      /* the runhead's progress already reads «Разрез» */
.t-stage.t-run.is-stack.t-short[data-s="1"] .t-grid{grid-template-areas:"fig" "body"}
.t-stage.t-short .t-win{aspect-ratio:auto;height:min(75vw,36vh);height:min(75vw,36svh)}   /* the 4:3 film is cropped top / bottom (object-fit:cover) */
.t-stage.t-short .pin{top:calc(50% + (var(--ym) - 50%) * var(--ky,1))}                    /* each dot stays on its band through the crop */
.t-stage.t-lift .co{position:relative;margin-top:calc(10px - var(--co-lift,0px))}   /* .t-lift = every phone stack (normal and compact) */
.t-stage.t-run.t-lift:not(.is-film) .co-in{max-height:none;overflow:visible}
.t-stage.t-short .co:not(.is-more) .job{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}
.t-stage.t-short .co:not(.is-more) :is(.mch,.ctx){display:none}
.t-stage.t-short .co{padding:10px 14px}
.t-stage.t-short .co .job{margin-top:6px;padding-top:6px}
.t-stage.t-short .chips{margin-top:8px}
.t-stage.t-short .co-more{margin-top:6px;min-height:30px}
.t-stage.t-short .t-cap{margin-top:8px}
.t-stage.t-short .t-s1 .t-btns{margin-top:10px}

/* ---------- land · a phone held sideways (orientation landscape, max-height 500; set by the script) ---------- */
.t-stage.t-run.is-land{padding-top:calc(var(--hh) + 8px);padding-bottom:10px}
.t-stage.t-run.is-land .t-s .h2{font-size:clamp(20px,2.6vw,24px);line-height:1.12}
.t-stage.t-run.is-land .t-s .h2 em{display:inline}                                /* one line per heading when it fits */
.t-stage.t-run.is-land .t-s .lede{font-size:var(--fs-intro);line-height:1.55}
.t-stage.t-run.is-land :is(.t-s1 .lede,.t-back,.t-cue){display:none}
.t-stage.t-run.is-land .t-btns{margin-top:12px;gap:10px 20px}
.t-stage.t-run.is-land .t-btns .lnk{gap:10px;letter-spacing:.14em;padding-bottom:6px}
.t-stage.t-run.is-land .t-btns .arr{width:18px}
.t-stage.t-run.is-land .t-win{--bev:3px}
.t-stage.t-run.is-land .pin{--hs:1px;left:var(--xr);top:var(--yr);width:24px;height:24px;margin:-12px 0 0 -12px;font-size:12px}
.t-stage.t-run.is-land .co{margin:0;padding:12px 16px;transform:translate3d(0,8px,0)}
.t-stage.t-run.is-land.open .co{transform:none;transition:opacity .6s var(--ease-out) .15s,transform .7s var(--ease-out) .15s,visibility 0s}
.t-stage.t-run.is-land .co :is(.grpn,.lnk,.ctx small){display:none}
.t-stage.t-run.is-land .co :is(.job,.mch,.ctx){font-size:13px}
.t-stage.t-run.is-land .chips{flex-wrap:nowrap}
.t-stage.t-run.is-land .chips .chip{flex:1 1 0;min-width:0;padding:5px 8px;font-size:11.5px;white-space:normal;text-align:center}
.t-stage.t-run.is-land .t-cap{margin-top:8px;grid-template-columns:minmax(0,1fr);row-gap:4px}
.t-stage.t-run.is-land .t-cap::before{display:none}
.t-stage.t-run.is-land :is(.t-small,.t-cap .note){grid-column:1}
.t-stage.t-run.is-land .t-small{font-size:var(--fs-small)}
.t-stage.t-run.is-land .brand-line{margin-top:12px;padding-top:10px;font-size:20px}
.t-stage.t-run.is-land .handover{margin-top:8px}

/* ---------- fit ladder (set by 50-technology.js for the whole stage; each rung only when the one before is not enough) ---------- */
.t-stage.fit-mt .lg .mt{display:none}
.t-stage.fit-pair .chips{flex-wrap:nowrap}
.t-stage.fit-pair .chips .chip{flex:1 1 0;min-width:0;white-space:normal;text-align:center}   /* on-film vitrine only, when wrapped chips would not fit */
.t-stage.fit-lede .t-s1 .lede{display:none}
.t-stage.fit-note .t-cap .note{display:none}
.t-stage.fit-h2 .t-s .h2{font-size:var(--fs-h3)}
@media (max-width:760px) and (orientation:portrait),(max-width:760px) and (min-height:501px){.t-stage.fit-h2 .t-s .h2{font-size:22px}}
.t-stage.t-run.is-land.fit-h2 .t-s .h2{font-size:19px}
/* the stop-2 text sits tighter (phones / land, only when stop 2 would not fit otherwise; the brand line takes the prototype's phone size) */
.t-stage.fit-s2 .t-s2 .lede{line-height:1.55}
.t-stage.fit-s2 .brand-line{margin-top:10px;padding-top:8px;font-size:20px}
.t-stage.fit-s2 .handover{margin-top:8px}
.t-stage.fit-s2 .t-s2 .t-btns{margin-top:10px}

/* ==========================================================================
   STATIC — reduced motion (html.t-static, set by the script), no JS, or site.js never ran (tv-fallback):
   no track, the stop-1 poster, every stop as ordinary content (§8.6 Reduced motion / static; ARCHITECTURE §7)
   ========================================================================== */
:is(html.t-static,html:not(.js),html.tv-fallback) .t-track{height:auto}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-stage{position:relative;top:auto;min-height:0;padding-bottom:var(--sec-pb);overflow:visible}
/* integration: a jump to the static section lands its overline where every other section's lands (bar + --sec-pt), not 20 px under the bar */
:is(html.t-static,html:not(.js),html.tv-fallback) #technology{scroll-margin-top:calc(var(--sec-pt) - clamp(12px,2.2vh,26px))}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-s{grid-area:auto;opacity:1;visibility:visible;transform:none;transition:none}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-s+.t-s{margin-top:var(--block-gap)}
:is(html.t-static,html:not(.js),html.tv-fallback) :is(.t-s0 .t-btns,.t-s1 .t-btns,.t-cue,[data-t]){display:none}
:is(html.t-static,html:not(.js),html.tv-fallback) :is(.pin,.co,.lg button,.lg-cap,.lg-mid::before){opacity:1;visibility:visible;transform:none;transition:none}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-stage.is-film .co{transform:translate3d(0,var(--cy,0px),0)}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-cap .note{display:block;visibility:visible;opacity:1;transition:none}
:is(html.t-static,html:not(.js),html.tv-fallback) .t-stage .tprog{display:none}                 /* a film progress means nothing without the film */
/* every layer listed at once (no JS, static phones and portrait tablets): no pin is «current» */
:is(html:not(.js),html.tv-fallback) .pin[aria-current="true"],.t-stage.t-all .pin[aria-current="true"]{background:rgba(6,13,27,.6);color:var(--paper)}
@media (min-width:1120px),(orientation:landscape) and (min-width:761px){
  /* the figure stays in view while the three stops are read in the left column */
  html.t-static .t-fig{position:-webkit-sticky;position:sticky;top:calc(var(--hh) + 24px)}
}
@media (orientation:landscape) and (max-height:500px){
  /* a phone held sideways: no room for a sticky figure — it takes its column and scrolls with the page */
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-fig{position:relative;top:auto;width:100%}
}
/* no JS / fallback: the five callouts become one stacked legend under the film; the chips give way to both texts with their labels */
:is(html:not(.js),html.tv-fallback) .lg,:is(html:not(.js),html.tv-fallback) .chips,:is(html:not(.js),html.tv-fallback) .ld{display:none}
:is(html:not(.js),html.tv-fallback) .co{margin-top:12px}
:is(html:not(.js),html.tv-fallback) .ctx-t{display:block;margin-bottom:2px;font:500 var(--fs-micro-s)/1.3 var(--sans);letter-spacing:.14em;text-transform:uppercase;color:var(--paper)}
/* all five blocks in one card (static phones and portrait tablets, no JS): separated by hairlines */
.co-b+.co-b{margin-top:14px;padding-top:14px;border-top:1px solid var(--hair)}
.co-b[hidden]+.co-b,.co-b+.co-b[hidden]{margin-top:0;padding-top:0;border-top:0}
:is(html:not(.js),html.tv-fallback) .t-still{display:block}
@media (max-width:760px),(orientation:portrait) and (max-width:1119.98px){
  /* phones / portrait tablets: stop 0 and the principle above the figure, stop 2 below it; the card is the legend */
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-grid{grid-template-columns:minmax(0,1fr);row-gap:var(--inner-gap)}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-fig{justify-self:stretch;width:100%}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s1 .lg{display:none}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-copy{display:contents}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s.t-s1,:is(html.t-static,html:not(.js),html.tv-fallback) .t-s.t-s2{margin-top:calc(var(--block-gap) - var(--inner-gap))}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s0{order:1}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s1{order:2}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-fig{order:3}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s2{order:4}
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-s1 .lede{display:block}
}
@media (max-width:760px) and (orientation:portrait),(max-width:760px) and (min-height:501px){
  /* static phones: the film stays full-bleed; the overline speaks in full («II · Технология», §5.3) because the
     numeral-only runhead is a run-mode rule (.t-run) — the film progress that filled its right slot is gone here */
  :is(html.t-static,html:not(.js),html.tv-fallback) .t-fig{margin:0 calc(var(--m) * -1);width:auto}
}

/* ===== 60-fleet.css ===== */
/* ==========================================================================
   60-fleet.css — «Техника», chapter II (DESIGN §8.7, §5.8, §5.12, ARCHITECTURE §3.7)
   Owns: fleet ground · .grp* · .chain · .cards · .card .cbody .card-label .lb-* .qty .card--h (DESIGN §10)
   Uses (never redefines): .runhead .sec-head .h2 .lede · .vit · .slot .slot-ph .keys .dsg .slot-ar · .photo .photo-cap
   ========================================================================== */

/* ---------- ground (§8.0): starts and ends on --navy-950 (no seam), grain .03 under the glass ---------- */
.fleet{background:linear-gradient(180deg,var(--navy-950),var(--navy-900) 12%,var(--navy-850) 45%,var(--navy-950))}
.fleet::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;background:var(--grain) 0 0/256px 256px;opacity:.03;
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 160px);mask-image:linear-gradient(180deg,transparent,#000 160px)}   /* integration: technology above has no grain — fade in, no line at the seam */
html.low .fleet::before{display:none}

/* ---------- head: lede + the fleet.total token under it (empty at launch → not rendered) ---------- */
.fleet .f-lede{justify-self:end;max-width:var(--measure);font-size:var(--fs-lede)}   /* same 44ch box as a lone .sec-head .lede */
.fleet .f-lede>.lede{justify-self:stretch}   /* forward guard, inert today: no engine applies justify-self to block-level boxes yet; once one does
                                                 (CSS Align 3), .sec-head .lede{justify-self:end} would shrink-fit lede + token line to the right */
.fleet .f-total{margin-top:.7em}
.fleet .f-total:empty,.fleet .lb-model:empty{display:none}          /* no-JS parity for empty launch tokens (ARCHITECTURE §6) */

/* ---------- silent wide slots (§5.13): no trace until the client's photograph exists ---------- */
.fleet .f-wide{margin-top:var(--block-gap)}

/* ---------- group ---------- */
.grp{margin-top:var(--block-gap);border-top:1px solid var(--hair);padding-top:var(--inner-gap)}
.grp-head{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);gap:var(--g);align-items:start}
.grp-tag{font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi)}
.grp-title{margin-top:12px;font:italic 300 var(--fs-h3)/1.05 var(--serif)}
.grp-intro{margin-top:14px;font-size:var(--fs-intro);line-height:1.62;color:var(--paper-2);max-width:40ch}
.grp-head>.grp-intro{margin-top:calc(12px + .6em)}                  /* groups 2–4: intro in the right column, on the title line */

/* ---------- the chain (group 1): six steps on one gold rule ---------- */
.chain{position:relative;display:grid;grid-template-columns:repeat(6,minmax(0,1fr));column-gap:12px;padding-top:4px}
.chain::before{content:"";position:absolute;left:0;right:0;top:26px;height:1px;background:linear-gradient(90deg,var(--gold),rgba(201,165,92,.4))}
.chain li{position:relative;padding-top:38px;min-width:0}
.chain li::before{content:"";position:absolute;left:0;top:21px;width:1px;height:11px;background:var(--gold-hi)}
.chain .cn{position:absolute;left:0;top:0;font:400 17px/1 var(--serif);color:var(--gold-hi)}
.chain .cl{display:block;font:500 var(--fs-micro)/1.3 var(--sans);letter-spacing:.16em;text-transform:uppercase;color:var(--paper)}
.chain .cs{display:block;margin-top:6px;font-size:var(--fs-small);line-height:1.45;color:var(--paper-3)}
.chain li.off .cn,.chain li.off .cl{color:var(--paper-3)}
.chain li.off::before{background:var(--paper-4)}
.chain .cs a{position:relative;z-index:1;display:inline-flex;align-items:center;gap:8px;margin-top:6px;color:var(--paper-2);border-bottom:1px solid var(--hair-gold);padding-bottom:3px;
  font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.16em;text-transform:uppercase;white-space:nowrap;transition:color var(--t-fast)}
.chain .cs a:hover{color:var(--paper)}
/* hit area 45 px tall (14 px padding box + 16 + 15) × text + 20 px, above the next step (z-index 1); the underline stays on the text */
.chain .cs a::after{content:"";position:absolute;inset:-16px -10px -15px}
.chain .cs a .dn{height:9px}
/* the step numbers share one line even when a label wraps («ТЕКСТУРА И УХОД», «TEKSTURA VA PARVARISH»): every step is a
   2-row subgrid — label row, then number row (progressive; the phone timeline below has its own grid) */
@supports (grid-template-rows:subgrid){
  @media not all and (max-width:760px){
    .chain li{display:grid;grid-row:span 2;grid-template-rows:subgrid;row-gap:0;align-content:start}
  }
}

/* ---------- cards grid: 6 columns, cards span 2 (group 2: span 3) ---------- */
.cards{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:var(--g);margin-top:clamp(28px,4vh,52px);align-items:stretch}
.cards>.card{grid-column:span 2}
.cards--2>.card{grid-column:span 3}
.cards>.card:nth-child(3n+2){--d:100ms}.cards>.card:nth-child(3n){--d:200ms}   /* reveal stagger by column (§6.4) */
.cards--2>.card:nth-child(2n){--d:100ms}

/* ---------- glass card = museum label with an open slot (§5.8) ---------- */
.card{display:flex;flex-direction:column}
.card.sig{box-shadow:0 0 0 1px rgba(4,9,19,.34),inset 0 0 0 1px rgba(255,255,255,.055),inset 0 2px 0 -1px rgba(231,205,146,.5),0 40px 80px -36px rgba(0,0,0,.72)}  /* gold top arris: 03, 04 */
.cbody{display:flex;flex-direction:column;flex:1}
.card .slot{margin:6px 6px 0}
.card-label{padding:clamp(16px,1.3vw,24px) var(--pad-card) 0;display:flex;flex-direction:column}
.lb-ix{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font:500 var(--fs-micro-s)/1.2 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-3)}
.lb-ix b{font:400 15px/1 var(--serif);letter-spacing:.06em;color:var(--paper);text-transform:none;white-space:nowrap;font-variant-numeric:lining-nums tabular-nums}
.lb-ix i{flex:1;min-width:24px;height:1px;background:linear-gradient(90deg,var(--hair-gold),rgba(201,165,92,.1))}
.lb-ix span{white-space:nowrap;margin-right:-.18em}
.lb-top{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-top:12px}
.lb-name{min-width:0;font:300 var(--fs-h4)/1.14 var(--serif);letter-spacing:.003em}
.lb-model{white-space:nowrap}
.qty{flex:none;display:flex;align-items:baseline;gap:5px;padding-left:14px;border-left:1px solid var(--hair);font:300 clamp(28px,2.1vw,40px)/.9 var(--serif);font-variant-numeric:lining-nums tabular-nums}
.qty small{font:500 var(--fs-micro-s)/1 var(--sans);letter-spacing:.12em;color:var(--paper-3)}
.lb-kind{margin-top:6px;font:italic 300 clamp(15px,1.02vw,18px)/1.35 var(--serif);color:var(--gold-hi)}
.lb-text{margin-top:12px;padding-top:12px;border-top:1px solid var(--hair-2);font-size:var(--fs-card);line-height:1.58;color:var(--paper-2)}
.cbody>.lb-text{margin:12px var(--pad-card) var(--pad-card)}
.fleet .slot.has-img>.sr-only{display:none}                         /* «photo will appear later» is void once it has */

/* Glass budget (§4.5 rule 1: ≤ 4 backdrop surfaces in one viewport off the hero, header included): up to six cards share a
   desktop viewport, over a still ground where a 20 px blur has nothing to refract. The vitrine keeps every layer of the
   material — bevel, sheen, fill, rim, reflection, shadow — and drops only the backdrop pass (same look, no GPU cost). */
.fleet .card.vit{-webkit-backdrop-filter:none;backdrop-filter:none}

/* Catalogue alignment: in a row, slots, labels and the text hairlines sit on shared lines (subgrid; progressive).
   The subgrid's row-gap 0 inside the parent's gap is resolved by the spec as half-gap margins, so slot → label → text
   keep their own spacing while card rows keep var(--g). */
@supports (grid-template-rows:subgrid){
  .cards>.card{display:grid;grid-row:span 3;grid-template-rows:subgrid;row-gap:0}
  .cards>.card>.cbody{display:grid;grid-row:1 / -1;grid-template-rows:subgrid;row-gap:0}
  .cards>.card>.cbody>.lb-text{align-self:stretch}
  /* final-fix (AD nice-to-have 3): the labels of a row share one height; the name row takes the spare line of a two-line name
     (04 «GOMACO · текстурирование и уход за бетоном»), so every kind in the row sits on one line (= min-height 2lh where needed) */
  .cards>.card>.cbody>.card-label>.lb-top{flex:1 0 auto}
}

/* horizontal variant (group 2, desktop only — tablets and phones stack it like the others) */
@media not all and (max-width:1119.98px){
  .cards>.card--h{display:flex;grid-row:auto}
  .cards>.card--h>.cbody{display:grid;grid-template-columns:minmax(0,46%) minmax(0,1fr);grid-template-rows:auto 1fr;align-items:start}
  .card--h .slot{grid-row:1 / span 2;margin:6px 0 6px 6px}
  .card--h .card-label{padding-top:var(--pad-card)}
  .card--h .cbody>.lb-text{grid-column:2;margin-top:12px}          /* same kind → hairline rhythm as the vertical cards */
  .card--h .dsg{font-size:calc(var(--fs-dsg) * .78)}                /* a narrower slot: the designator keeps its proportion */
}

/* ---------- ultra ≥ 2200 (tokens step up by themselves; the serif index follows) ---------- */
@media (min-width:2200px){.lb-ix b{font-size:17px}.chain .cn{font-size:19px}}

/* the chain keeps six equal «ruler» intervals at every width (§8.7); its narrowest interval, ≈ 100 px at 1120, holds the
   longest word of step 3 in both languages («автотранспорте.», «transportimizda») */
/* final-fix (AD nice-to-have 4): step 3 is the only step with a sentence (and the «off» one: transport, not a machine of the line) —
   it takes two tracks of a seven-track ruler, so «Смесь идёт к укладчику…» reads in two lines instead of four or five at 1024–1440 */
@media not all and (max-width:760px){
  .chain{grid-template-columns:repeat(7,minmax(0,1fr))}
  .chain li.off{grid-column:span 2}
}

/* ---------- tablet ≤ 1119.98: head stacked, chain under it, two columns ---------- */
@media (max-width:1119.98px){
  .fleet .f-lede{justify-self:start}
  .grp-head{grid-template-columns:1fr;row-gap:0}                    /* stacked: title → intro 14 px in every group (no grid gap on top) */
  .grp-head>.grp-intro{margin-top:14px}
  .chain{margin-top:calc(20px + var(--g))}                          /* group 1: intro → chain keeps its air on its own margin */
  .cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .cards>.card,.cards--2>.card{grid-column:auto}
  .cards>.card:nth-child(n){--d:0ms}.cards>.card:nth-child(2n){--d:100ms}
  /* an odd last card (groups 3 and 4) takes the whole row as a horizontal label — no orphan half-row;
     its slot and its label snap to the two columns above: slot edges = the left card's slot, text = the right card's text */
  .cards>.card:last-child:nth-child(odd){grid-column:1 / -1;display:flex;grid-row:auto;--d:0ms}
  .cards>.card:last-child:nth-child(odd)>.cbody{display:grid;grid-template-columns:calc((100% - var(--g)) / 2 - var(--bev)) minmax(0,1fr);grid-template-rows:auto 1fr;align-items:start;column-gap:0}
  .cards>.card:last-child:nth-child(odd) .slot{grid-row:1 / span 2;margin:6px}
  .cards>.card:last-child:nth-child(odd) .card-label{padding-top:clamp(16px,1.3vw,24px);padding-left:calc(var(--pad-card) + var(--g) + var(--bev) * 2)}
  .cards>.card:last-child:nth-child(odd)>.cbody>.lb-text{grid-column:2;margin-top:12px;margin-left:calc(var(--pad-card) + var(--g) + var(--bev) * 2)}
}

/* ---------- phones ≤ 760: one column, the chain becomes a vertical timeline, compact .sm labels ---------- */
@media (max-width:760px){
  .cards{grid-template-columns:1fr}
  .cards>.card:nth-child(n){--d:0ms}
  .chain{grid-template-columns:1fr;row-gap:0;padding:0 0 0 28px}
  .chain::before{left:6px;right:auto;top:6px;bottom:6px;width:1px;height:auto;background:linear-gradient(180deg,var(--gold),rgba(201,165,92,.35))}
  .chain li{padding:0 0 12px 0;display:grid;grid-template-columns:2em minmax(0,1fr) auto;align-items:baseline}
  .chain li::before{left:-26px;top:6px;width:11px;height:1px}
  .chain .cn{position:static;font-size:16px}
  .chain .cs{grid-column:3;margin:0}
  .chain li.off .cs{grid-column:2 / -1;grid-row:2;margin-top:4px}

  /* every card back to a plain stack (no subgrid, no horizontal variants) … */
  .cards>.card,.cards>.card:last-child:nth-child(odd){display:flex;grid-row:auto;grid-column:auto}
  .cards>.card>.cbody,.cards>.card:last-child:nth-child(odd)>.cbody{display:flex;flex-direction:column;grid-row:auto}
  .cards>.card .slot,.cards>.card:last-child:nth-child(odd) .slot{grid-row:auto;margin:6px 6px 0}
  .cards>.card .card-label,.cards>.card:last-child:nth-child(odd) .card-label{padding-top:clamp(16px,1.3vw,24px)}
  .cards>.card>.cbody>.lb-text,.cards>.card:last-child:nth-child(odd)>.cbody>.lb-text{grid-column:auto;margin:12px var(--pad-card) var(--pad-card)}
  /* … then the compact museum label (proto .sm): slot 40 % | label, text under both — every card except 03 and 04.
     Below ≈ 400 px every compact slot yields together (never under 36 %), so the label keeps 210 px = the longest unbreakable
     name, «Асфальтоукладчик» at 19 px, + label padding: one slot edge down the whole stack. The label column also never drops
     below its own longest word (min-content) — a filled model token or a fallback font takes px from its slot, never the glass */
  .cards>.card.sm>.cbody,.cards>.card.sm:last-child:nth-child(odd)>.cbody{display:grid;grid-template-columns:minmax(0,clamp(36%,100% - 210px,40%)) minmax(min-content,1fr);grid-template-rows:none;align-items:start}
  .cards>.card.sm .slot,.cards>.card.sm:last-child:nth-child(odd) .slot{grid-row:auto;margin:6px 0 0 6px}
  .cards>.card.sm .card-label,.cards>.card.sm:last-child:nth-child(odd) .card-label{padding:12px 14px 16px 16px;min-width:0}
  .card.sm .lb-top{flex-wrap:wrap;gap:8px}
  .cards>.card.sm>.cbody>.lb-text,.cards>.card.sm:last-child:nth-child(odd)>.cbody>.lb-text{grid-column:1 / -1;margin:0 16px 16px;padding-top:12px}
  .card.sm .dsg{font-size:40px}.card.sm .keys{font-size:7px}
  .card.sm .slot-ar{right:12px;bottom:10px;font-size:10px}.card.sm .slot-ph::before{inset:8px}
  .card.sm .slot-ph{gap:10px}
  .card.sm .lb-name{font-size:19px}
  .card.sm .lb-ix{column-gap:8px}
  /* the quantity sits under the name as its own figure: no stray hairline when it wraps */
  .card.sm .qty{flex-basis:100%;padding-left:0;border-left:0}
}
/* ---------- 360 phones (component level): the slot is at its 36 % floor, so every compact name steps to 18 px — card 07
   keeps the same slot edge as the others and its name stays inside the label box ---------- */
@media (max-width:374px){.card.sm .lb-name{font-size:18px}}

/* ===== 70-now.css ===== */
/* ==========================================================================
   70-now.css — «Сейчас», chapter III (DESIGN §8.8 · ARCHITECTURE §3.8 · ownership §10: .now-card, .duo, caption switch)
   Uses the foundation as is (.sec .runhead .sec-head .h2 .h3 .lede .txt .vit .tag--live .btn--champ
   .photo .photo-box .photo-cap--over .slot-ph--name .keys .slot-ar .strip); everything below is a section modifier.
   Colours, sizes, spaces = tokens; literals are geometry that exists only here (card cap 646 px, grid ratios).
   ========================================================================== */

/* ---- ground (§8.0 row 7): starts and ends on navy-950, warm field top-right ---- */
.sec.now{padding-top:clamp(56px,7vh,96px);
  background:radial-gradient(55% 45% at 88% 0%,rgba(201,165,92,.07),rgba(201,165,92,0) 70%),
             linear-gradient(180deg,var(--navy-950),var(--navy-900) 50%,var(--navy-950))}

/* ---- layout · 761–1599: head 7/5 (stacked < 1120, foundation) · cards 6/6 · CTA row ----
   Tablets and landscape phones keep the pair side by side, as the fleet cards do: both cards in one view, no empty band
   to the right of a capped single column. The head and the CTA row keep the gutter like every section (§8.0: no narrower
   container); only the pair is capped, so a card stays ≤ 646 px (satellite shown ≤ 640): from 1463 px the pair stops at
   2 × 646 + gap, left-aligned. */
.now-grid{display:grid;grid-template-columns:minmax(0,1fr);margin-top:var(--head-gap)}
.now .now-head{margin-top:0}
.now-lead .ln{display:block}                                    /* one sentence per line: the pair of names, then the kind */
.now-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:var(--g);max-width:calc(2 * 646px + var(--g));margin-top:var(--block-gap)}
.now-act{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s-4) var(--s-6);margin-top:var(--block-gap)}
.now-asof{font:500 var(--fs-micro-s)/1.3 var(--sans);letter-spacing:.18em;text-transform:uppercase;color:var(--paper-3)}
.now-asof:empty{display:none}                                   /* launch token: no JS ⇒ still no trace */

/* ---- the card (§8.8): figure with a 6 px inset, then chip → title → text → silent thumbs ----
   Equal heights come from the grid row; inside, chip, title and text flow freely (chip → title is always 14 px),
   so any spare height of the shorter card collects at its floor, above the thumbnails. */
.now-card{display:flex;flex-direction:column;min-width:0}
.now-card+.now-card{--d:100ms}                                  /* reveal by column (§6.4); 0 ms once the cards stack */
.now-ph{margin:6px 6px 0;container:now-ph/inline-size}          /* the main figure only; the thumbnails keep the text edge */
.now-body{display:flex;flex-direction:column;flex:1;padding:var(--pad-card)}
.now-st{display:flex}                                           /* the tag without a line-box strut under it */
.now-t{margin-top:14px;text-wrap:balance}
.now-x{margin-top:10px}
.now-strip{margin-top:auto;padding-top:18px}                    /* silent thumbnails sit on the card's floor */
.now-strip .strip-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}

/* ---- caption over the main image: its plate stands on the card's text column (figure inset 6 px + 6 px = --pad-card),
   the same distance from the bottom edge; two sentences = two lines in a narrow figure (the plate hugs the longer one),
   one line once the figure is wide enough for the longest caption in either language
   (RU «…Спутниковый снимок.» = 381 px of text + 24 px plate + 2 × ≤ 20 px inset = 445 px).
   Glass budget (§4.5.1: ≤ 4 backdrop surfaces per viewport): header bar + header CTA pill + the two cards = 4, so the
   plate is always a solid navy plate, never a fifth blur (paper on 86 % navy ≥ 12:1 over any pixel of the photograph) ---- */
.now-card .photo-cap--over{--cap-in:calc(var(--pad-card) - 6px);left:var(--cap-in);right:auto;bottom:var(--cap-in);max-width:calc(100% - 2 * var(--cap-in));text-wrap:balance;
  -webkit-backdrop-filter:none;backdrop-filter:none;background:rgba(6,13,27,.86)}   /* = color-mix(in srgb,var(--navy-950) 86%,transparent); audit: written as rgba — with var() inside, an engine without color-mix() (Safari < 16.2) dropped the plate to transparent at computed-value time */
.now-card .photo-cap--over .ln{display:block}
@container now-ph (min-width:460px){ .now-card .photo-cap--over .ln{display:inline} }

/* ---- card 1 · Ташкент-Восточный: override | base. The loader writes data-loaded; until then (and without JS) the base is assumed ---- */
.now-card .photo-box{isolation:isolate}                        /* the duotone blends with the image only */
/* one download: with JS the base <img> stays display:none (a lazy image without a box is never fetched) until the loader
   has picked the file (override first); without JS the class is absent and the base shows as is */
html.js .now-ph--sat:not(.has-img) .photo-box img{display:none}
.now-card .duo{display:none;position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,var(--navy-700),var(--navy-950));mix-blend-mode:color;opacity:.85}
.now-ph--sat:not([data-loaded]) .duo,
.now-ph--sat[data-loaded$="vostochny-satellite.jpg"] .duo{display:block}
.now-ph--sat:not([data-loaded]) .photo-box img,
.now-ph--sat[data-loaded$="vostochny-satellite.jpg"] .photo-box img{filter:grayscale(1) contrast(.92) brightness(.78)}      /* map labels recede */
.now-ph--sat:not([data-loaded]) .photo-box::before,
.now-ph--sat[data-loaded$="vostochny-satellite.jpg"] .photo-box::before{opacity:.07}                                       /* heavier grain */
/* caption switch: «…Спутниковый снимок.» for the base, «…Ход работ.» the moment vostochny-progress-01.jpg is the loaded file */
.now-ph--sat .cap-sat{display:block}
.now-ph--sat .cap-photo{display:none}
.now-ph--sat[data-loaded]:not([data-loaded$="vostochny-satellite.jpg"]) .cap-sat{display:none}
.now-ph--sat[data-loaded]:not([data-loaded$="vostochny-satellite.jpg"]) .cap-photo{display:block}

/* ---- card 2 · Бухара: open slot (museum label = the caption the photo will carry); the caption over the image only with a file ---- */
.now-ph--open:not(.has-img) .photo-cap--over{display:none}
.now-ph.has-img .now-sr{display:none}
.now-ph--open .ph-name{max-width:42ch;text-wrap:balance}
.now-ph--open .ph-name .ln{display:block}                       /* museum label: the name, then what the photo will show */

/* ---- wide ≥ 1600: head column 4fr · the pair 8fr (no head gap: 1920 → 562, 2560 → 572, §8.8); CTA on the cards' floor.
   The head keeps its own air on the right, so a long title never runs up to card 1 ---- */
@media (min-width:1600px){
  .now-grid{grid-template-columns:minmax(0,4fr) minmax(0,8fr);grid-template-rows:auto 1fr;column-gap:0}
  .now .now-head{grid-column:1;grid-row:1;grid-template-columns:minmax(0,1fr);align-items:start;row-gap:var(--s-5);padding-right:var(--g)}
  .now .now-head .lede{justify-self:start}
  .now-cards{grid-column:2;grid-row:1 / 3;margin-top:0}
  .now-act{grid-column:1;grid-row:2;align-self:end;margin-top:var(--block-gap);padding-right:var(--g)}
}

/* ---- phones: one column (a card never narrower than the phone's, capped at 646); the caption leaves the image
   (a 2-line plate would cover a third of a 170 px photograph) and becomes the ordinary photo caption with its hanging dash,
   on the card's text column — 8 px under the photograph, 8 + card padding (≥ 26 px) above the chip; the CTA as wide as the cards ---- */
@media (max-width:760px){
  .now-cards{grid-template-columns:minmax(0,646px);row-gap:var(--s-5)}
  .now-card+.now-card{--d:0ms}
  .now .now-card .photo-cap--over{position:static;width:auto;max-width:none;margin:var(--s-2) 0;
    padding:0 var(--cap-in) 0 calc(var(--cap-in) + 28px);text-indent:-28px;border:0;border-radius:0;
    background:none;-webkit-backdrop-filter:none;backdrop-filter:none;
    font:italic 300 var(--fs-cap)/1.4 var(--serif);color:var(--paper-2);text-wrap:pretty}
  .now .now-card .photo-cap--over::before{display:inline-block}
  .now .now-card .photo-cap--over .ln,
  .now .now-ph--sat .cap-sat{display:inline}
  .now .now-ph--sat .cap-photo{display:none}
  .now .now-ph--sat[data-loaded]:not([data-loaded$="vostochny-satellite.jpg"]) .cap-sat{display:none}
  .now .now-ph--sat[data-loaded]:not([data-loaded$="vostochny-satellite.jpg"]) .cap-photo{display:inline}
  .now-act .btn{width:100%;max-width:646px;justify-content:space-between}
}

/* ===== 80-contact.css ===== */
/* ==========================================================================
   80-contact.css — «Контакты», chapter III (DESIGN §8.9, §5.18 · ARCHITECTURE §3.9 · ownership §10:
   channels, legal block, .form-grid .fld* .inp .form-*, «Сводка», EN capsule)
   Uses the foundation as is (.sec .runhead .sec-head .h2 .h3 .lede .vit .btn .btn--champ .btn--glass .lnk .arr);
   everything below is either §5.18 (owned here) or a section modifier. Colours, sizes, spaces = tokens; literals are
   geometry that exists only here or values DESIGN §8.9 states literally (15.5 px rows, 14.5 px capsule, 14 px country).
   ========================================================================== */

/* ---- ground (§8.0 row 8): starts and ends on navy-950, cold light field behind the glass ---- */
.sec.contact{background:linear-gradient(180deg,var(--navy-950),rgba(6,13,27,0) 180px),var(--field-cold),linear-gradient(180deg,var(--navy-950),var(--navy-900) 50%,var(--navy-950))}   /* integration: the ground starts on navy-950 (§8.0) — the cold field peaked on the top edge and cut a line under «now» */

/* ---- body grid · desktop ≥ 1120: [channels · legal] 5fr | [form vitrine] 7fr ----
   DOM order = phone order (channels → form → legal); the desktop places them by rows. Row 1 = the channels only
   (the form spans both rows and grows the 1fr row), so the legal block always sits right under the last channel. */
.ct-body{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);grid-template-rows:auto 1fr;column-gap:clamp(32px,4vw,80px);align-items:start;margin-top:var(--block-gap)}
.ct-ch{grid-column:1;grid-row:1}
.ct-form{grid-column:2;grid-row:1 / 3}
.ct-side{grid-column:1;grid-row:2}
.contact.has-ch .ct-side{margin-top:var(--s-6)}                            /* §8.9: 32 px under the last channel, 0 when the legal block leads */
/* without JS nothing can build or hand over a message: no dead form, no dead buttons — the facts stay */
html:not(.js) .ct-form,html:not(.js) .ct-lang,html:not(.js) .sum-acts{display:none}

/* ---- channels (rendered from TV.cfg; nothing in the markup when empty) ---- */
.ct-ch{border-bottom:1px solid var(--hair-2)}
/* key column = §8.9 minmax(8rem,11rem): 15.31em of the micro type is exactly 176 px = 11rem at 11.5 px, and it follows the micro token's
   ultra step (13.5 px ≥ 2200) so «ЭЛЕКТРОННАЯ ПОЧТА» never breaks; the row's own font-size only feeds this track (dt / dd set theirs) */
.ct-row{font-size:var(--fs-micro);display:grid;grid-template-columns:minmax(8rem,15.31em) minmax(0,1fr);gap:6px 20px;align-items:baseline;padding:16px 0;border-top:1px solid var(--hair-2)}
.ct-row:first-child{border-top-color:var(--hair)}
.ct-row dt{font:500 var(--fs-micro)/1.3 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-3)}
.ct-row dd{font:300 clamp(20px,1.5vw,26px)/1.25 var(--serif);color:var(--paper);overflow-wrap:anywhere}
.ct-row .num{font-variant-numeric:lining-nums tabular-nums;white-space:nowrap}
.ct-row a{text-decoration:underline 1px;text-decoration-color:transparent;text-underline-offset:.24em;transition:text-decoration-color var(--t-fast) var(--ease)}
.ct-row a:hover{text-decoration-color:var(--hair-gold)}
/* touch target ≥ 44 px (§5.6, §9.34): the link box grows by padding and gives it back by margin — the line box, the row rhythm
   and the underline stay exactly where they were; the extension lives inside the row's own 14–16 px padding */
.ct-row dd a{display:inline-block;padding-block:10px;margin-block:-10px}
.ct-row .ct-free{font-size:var(--fs-row);line-height:1.4;text-wrap:pretty}                             /* address / hours: sentences, not handles */

/* ---- legal block · language link · documents ---- */
.ct-cap{font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi)}
.ct-name{font:300 clamp(20px,1.5vw,26px)/1.3 var(--serif);color:var(--paper)}
.ct-names{display:flex;flex-direction:column;gap:var(--s-1);margin-top:var(--s-4)}         /* order = DOM order (80-contact.js puts the version's own legal form first) */
.ct-country{margin-top:var(--s-3);font-size:14px;line-height:1.5;color:var(--paper-2)}
.ct-lang{margin-top:var(--s-6)}
.ct-docs{margin-top:var(--s-7)}
.ct-docs:not(:has(.ct-doc:not([hidden]))){display:none}                                   /* silent: no heading without a document */
.ct-doclist{margin-top:var(--s-3)}
.ct-doc{display:grid;grid-template-columns:minmax(8rem,11rem) minmax(0,1fr);gap:4px 20px;align-items:baseline;padding:12px 0;border-top:1px solid var(--hair-2)}
.ct-doc dt{font-size:var(--fs-small);line-height:1.45;color:var(--paper-2)}
.ct-doc dd{font-size:var(--fs-text);line-height:1.45;color:var(--paper)}
.ct-doc a{border-bottom:1px solid var(--hair-gold);transition:color var(--t-fast)}
.ct-doc a:hover{color:#fff}

/* ---- the form vitrine (§8.9) ---- */
.ct-form{padding:clamp(22px,2.2vw,40px)}
.ct-form-t{text-wrap:balance}
.ct-form .form-grid{margin-top:clamp(22px,3vh,32px)}
/* glass budget (§4.5.1, depth §4.5.3): pills sitting on the vitrine need no backdrop of their own — the vitrine already frosted it */
.ct-form .btn--glass,.ct-sum .btn--glass{-webkit-backdrop-filter:none;backdrop-filter:none}

/* ---------- 5.18 Form fields (owned here) ---------- */
.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px var(--g)}
.fld{display:grid;gap:8px;align-content:start;min-width:0}
.fld--full{grid-column:1/-1}
.fld-l{display:block;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-2)}
.fld-l .req{display:inline-block;width:5px;height:5px;margin-left:calc(8px - var(--tr-caps));vertical-align:.14em;border-radius:50%;background:var(--gold-hi)}   /* required: a gold point after the last word (also when the label wraps); title=form.required on the input */
.inp{width:100%;height:52px;padding:0 16px;font:400 var(--fs-body)/1.4 var(--sans);color:var(--paper);caret-color:var(--gold-hi);
  background:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.02));border:1px solid var(--hair);border-radius:var(--r-2);
  box-shadow:inset 0 1px 0 rgba(0,0,0,.25);transition:border-color .3s var(--ease),background-color .3s var(--ease),box-shadow .3s var(--ease)}
textarea.inp{display:block;height:auto;min-height:148px;padding:14px 16px;line-height:1.55;resize:vertical}
.inp::placeholder{color:var(--paper-3);opacity:1}
.inp:hover{border-color:rgba(244,239,230,.28)}
.inp:focus{outline:none;border-color:rgba(231,205,146,.72);background-color:rgba(255,255,255,.06);box-shadow:inset 0 1px 0 rgba(0,0,0,.25),0 0 0 3px rgba(231,205,146,.14)}
.inp[aria-invalid="true"]{border-color:var(--err)}
select.inp{appearance:none;-webkit-appearance:none;padding-right:44px;cursor:pointer;
  background:linear-gradient(45deg,transparent 50%,var(--paper-2) 50%) calc(100% - 22px) 50%/5px 5px no-repeat,
             linear-gradient(135deg,var(--paper-2) 50%,transparent 50%) calc(100% - 17px) 50%/5px 5px no-repeat,
             linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.02))}
select.inp option{background:var(--navy-900);color:var(--paper)}
/* browser autofill must not paint a pale box on the glass */
.inp:-webkit-autofill,.inp:-webkit-autofill:hover,.inp:-webkit-autofill:focus{-webkit-text-fill-color:var(--paper);caret-color:var(--gold-hi);
  -webkit-box-shadow:inset 0 0 0 100px var(--navy-900);box-shadow:inset 0 0 0 100px var(--navy-900);transition:background-color 600000s 0s}
.fld-err{font-size:var(--fs-small);line-height:1.45;color:var(--err)}
.form-sum{margin-top:22px;padding:12px 14px;border:1px solid rgba(235,169,155,.4);border-radius:var(--r-2);font-size:14px;line-height:1.45;color:var(--err)}   /* form.err.summary */
.form-acts{display:flex;flex-wrap:wrap;align-items:center;gap:14px 20px;margin-top:26px}
.form-msg{min-height:1.5em;margin-top:14px;font:italic 300 var(--fs-cap)/1.4 var(--serif);color:var(--gold-hi)}   /* role="status" */
.form-note{margin-top:18px;font-size:var(--fs-small);line-height:1.55;color:var(--paper-3);max-width:60ch}
.form-pre{margin-top:18px;border-top:1px solid var(--hair-2);padding-top:14px}
.form-pre summary{cursor:pointer;font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--paper-2);list-style:none}
.form-pre summary::-webkit-details-marker{display:none}
.form-pre pre{margin:12px 0 0;white-space:pre-wrap;overflow-wrap:anywhere;font:400 13.5px/1.6 var(--sans);color:var(--paper-2)}
@media (max-width:760px){.form-grid{grid-template-columns:1fr}.form-acts .btn{width:100%;justify-content:space-between}}

/* section refinements of §5.18 */
.ct-empty{margin-top:22px;min-height:0}                                   /* «Скопируйте текст…» leads the actions when no channel exists */
.ct-empty:not([hidden])+.form-acts{margin-top:14px}
.form-sum:not([hidden])+.ct-empty{margin-top:14px}
.ct-copy{min-height:44px;padding-bottom:0;border-bottom:0}                 /* .lnk as an action: the rule stays under the words, the target is 44 px */
.ct-copy>span{padding-bottom:8px;border-bottom:1px solid var(--hair-gold)}
.ct-copy.btn{min-height:0}
.ct-copy.btn>span{padding:0;border:0}
.form-acts .btn:not(:has(.arr)){justify-content:center}
.form-acts .btn{min-width:0;max-width:100%}                               /* the foundation button as is: one line, 44 px (48 px ≥ 2200) */
/* two or three channels: a two-column grid, equal buttons, edges aligned (TG | WA / e-mail | copy); the copy link keeps the column edge.
   A label never breaks and never leaves its button: 80-contact.js measures the labels (any language, any font) and sets data-stack —
   one full-width column, like the phone — whenever a cell is narrower than its longest label (1120–1260 px, iPad landscape). */
.form-acts[data-n="2"],.form-acts[data-n="3"]{display:grid;grid-template-columns:repeat(2,minmax(0,20rem));align-items:center}
.form-acts[data-n="2"] .btn,.form-acts[data-n="3"] .btn{width:100%;justify-content:space-between}
.form-acts[data-stack]{grid-template-columns:minmax(0,1fr)}
.form-acts[data-n="2"] .ct-copy,.form-acts[data-n="3"] .ct-copy{justify-self:start}
.ct-status:empty{margin-top:0;min-height:0}
.ct-status:not(:empty){margin-top:18px}
.form-pre summary{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:44px;margin-top:-10px;margin-bottom:-10px;transition:color var(--t-fast)}
.form-pre summary:hover{color:var(--paper)}
.form-pre[open] summary{color:var(--paper)}
.form-pre summary:focus-visible{outline-offset:2px}
.ct-pm{position:relative;display:block;flex:none;width:11px;height:11px}
.ct-pm::before,.ct-pm::after{content:"";position:absolute;background:currentColor}
.ct-pm::before{left:0;right:0;top:5px;height:1px}
.ct-pm::after{top:0;bottom:0;left:5px;width:1px;transition:transform .4s var(--ease-out)}
.form-pre[open] .ct-pm::after{transform:scaleY(0)}
.form-pre[open] pre{animation:ct-in .5s var(--ease-out) both}
@keyframes ct-in{from{opacity:0;transform:translate3d(0,6px,0)}to{opacity:1;transform:none}}

/* ---- «Сводка» — the glass fact sheet (#summary) ---- */
.ct-sum{display:grid;grid-template-columns:minmax(0,8fr) minmax(0,4fr);column-gap:clamp(28px,3vw,56px);row-gap:var(--s-6);align-items:start;margin-top:var(--block-gap);padding:clamp(22px,2.2vw,40px)}
.sum-lead{margin-top:var(--s-3)}
.sum-rows{margin-top:clamp(22px,3vh,32px);border-top:1px solid var(--hair)}
.sum-r{display:grid;grid-template-columns:minmax(9rem,13rem) minmax(0,1fr);column-gap:var(--g);align-items:baseline;padding:12px 0;border-bottom:1px solid var(--hair-2)}
.sum-r dt{font:500 var(--fs-micro-s)/1.4 var(--sans);letter-spacing:var(--tr-nav);text-transform:uppercase;color:var(--paper-3)}
.sum-r dd{font-size:15.5px;line-height:1.5;color:var(--paper);overflow-wrap:anywhere;text-wrap:pretty}
.sum-r dd .num{font-variant-numeric:lining-nums tabular-nums}
/* phone / e-mail from TV.cfg: the gold rule under the words, a ≥ 44 px target (padding given back by margin: rows keep their 12 px rhythm) */
.sum-r dd a{display:inline-block;padding-block:11px;margin-block:-11px;text-decoration:underline 1px var(--hair-gold);text-underline-offset:.28em;transition:color var(--t-fast)}
.sum-r dd a:hover{color:#fff}
.sum-acts{margin-top:clamp(22px,3vh,32px)}
/* no clipboard at all: the plain-text sheet (summary.tpl) appears under the button, selected, to be copied by hand */
.sum-pre{margin:18px 0 0;border-top:1px solid var(--hair-2);padding-top:14px;white-space:pre-wrap;overflow-wrap:anywhere;font:400 13.5px/1.6 var(--sans);color:var(--paper-2);max-width:72ch;-webkit-user-select:text;user-select:text}
/* the copy button keeps one width: both labels share one cell, only opacity changes */
.sum-lbl{display:grid}
.sum-lbl>span{grid-area:1/1;transition:opacity var(--t-fast) var(--ease)}
.sum-b{opacity:0}
.sum-copy.is-copied .sum-a{opacity:0}
.sum-copy.is-copied .sum-b{opacity:1}
/* EN capsule: one paragraph, identical in both language versions (D11) */
.sum-en{padding-left:20px;border-left:1px solid var(--hair-gold)}
.sum-en-t{font:500 var(--fs-micro)/1.2 var(--sans);letter-spacing:var(--tr-caps);text-transform:uppercase;color:var(--gold-hi)}
.sum-en p{margin-top:var(--s-3);font-size:14.5px;line-height:1.6;color:var(--paper-2);max-width:60ch}

/* ---- tablet and phone: one column — channels → form → legal · language · documents → «Сводка» (EN capsule under the rows) ---- */
@media (max-width:1119.98px){
  .ct-body{grid-template-columns:minmax(0,1fr);grid-template-rows:none;row-gap:clamp(32px,5vh,48px)}
  .ct-ch,.ct-form,.ct-side{grid-column:1;grid-row:auto}
  .contact.has-ch .ct-side{margin-top:0}
  .ct-sum{grid-template-columns:minmax(0,1fr)}
  .sum-en p{max-width:70ch}
}
/* tablet: final-fix (AD nice-to-have 2) — the language link stays with the legal block it belongs to: under the country line,
   left-aligned, exactly as on phones (the base rules). The old right-hand placement left it detached at the far edge at 768 / 1024. */
@media (max-width:760px){
  .ct-row{grid-template-columns:1fr;row-gap:6px;padding:14px 0}
  .ct-doc{grid-template-columns:1fr}
  .sum-r{grid-template-columns:1fr;row-gap:4px}
  .ct-copy{width:100%;justify-content:center}
  .sum-copy{width:100%}                                                     /* like the form's actions on phones */
  .form-acts[data-n="2"],.form-acts[data-n="3"]{grid-template-columns:minmax(0,1fr)}
  /* full-width actions at the input height (52 px) for every button; the one place a label may take two lines (safety net for 320 px) */
  .form-acts .btn{height:auto;min-height:52px;padding-block:9px;white-space:normal;line-height:1.35;text-align:left}
}
/* ultra ≥ 2200: only micro / small type steps up (tokens, DESIGN §0); every other size stays at its §8.9 value */

/* ---- reduced motion: no fades inside the form ---- */
html.reduced .form-pre[open] pre{animation:none}

/* ---- print: the official gets the facts, not an empty form ---- */
@media print{.ct-form,.ct-lang,.sum-acts{display:none!important}.ct-body{display:block!important}}

/* ===== 90-footer.css ===== */
/* ==========================================================================
   90-footer.css — footer (DESIGN §5.19, §8.10 · owns .foot*)
   Ground --ink + cold light field, gold hairline on --gutter at the seam. No glass, no reveal (§6.4): the close is still.
   The lockup is §5.1's footer size at every width: --fv:64px in a 360 px box (62.7 px, 356 px drawn) — never stepped up.
   Refinements to §5.19 (same content, same order, same tokens) — listed in qa/footer/REPORT.md for the design lead:
   · ≥ 761 px: .foot-mid sits on the grid of .foot-top instead of a space-between row: legal in the brand column, RU / UZ
     on the first nav column, «Наверх» on the right edge — every item of the bottom row stands on a line of the grid above;
     items align on their first baseline. Phones keep §8.10: legal / lang / top stacked.
   · legal names in sentence case (COPY §0.7: capitals only in the wordmark, Latin marks and overlines; the UZ name is [nt]
     and must read exactly «Terravia Constructions» MChJ); the separator is drawn by CSS and clipped when the UZ name wraps
     to a new line (no dangling «·»); phones stack the two names without it.
   · touch targets ≥ 44 px (§9.34) on touch screens at every width: nav links, RU / UZ (foundation), «Наверх».
   ========================================================================== */
.foot{--fcg:clamp(32px,4vw,80px);position:relative;isolation:isolate;padding:clamp(72px,10vh,120px) var(--gutter) calc(40px + env(safe-area-inset-bottom));background:var(--field-cold),var(--ink);color:var(--paper-2)}
.foot::before{content:"";position:absolute;left:var(--gutter);right:var(--gutter);top:0;height:1px;background:linear-gradient(90deg,rgba(201,165,92,0),var(--hair-gold) 20%,var(--hair-gold) 80%,rgba(201,165,92,0))}

/* ---- brand column · nav ---- */
.foot-top{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:40px var(--fcg);align-items:start}
.foot-lk{max-width:360px}
.foot-lk .lk{--fv:64px;margin:0}
.foot-tag{margin-top:20px;font:italic 300 clamp(19px,1.4vw,24px)/1.2 var(--serif);color:var(--paper)}
.foot-desc{--ds:var(--fs-micro-s);justify-content:flex-start;margin-top:14px;text-shadow:none}

.foot-nav{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px}
/* numeral box heights: two columns (≥ 1120 px) — the nav's first row spans the wordmark's cap height: numerals on the cap
   line of TERRAVIA, the first links on its baseline (62.7 px lockup: cap 44.5 px; numeral cap 2 px under its box top;
   tuned to Noto Serif Display — the metric-matched fallback misses by ≈ 1 px until the web font arrives) */
.foot-nav .fg-n{height:28px;font:400 15px/1 var(--serif);letter-spacing:.08em;color:var(--gold-hi)}
.foot-nav a{display:inline-block;padding:8px 4px;margin-inline:-4px;font:500 var(--fs-micro)/1.3 var(--sans);letter-spacing:var(--tr-nav);text-transform:uppercase;color:var(--paper-2);transition:color var(--t-fast)}
.foot-nav a:hover{color:var(--paper)}
.foot-nav a:focus-visible{outline-offset:2px}          /* with the 4 px inline padding: 6 px of air left / right, clear of the next link and the numeral */
@media (min-width:1120px){.foot-nav{margin-top:-3px}}
@media (min-width:2200px){.foot-nav .fg-n{height:26px}}                             /* --fs-micro 13.5: the link baseline sits 2 px lower in its box */

/* ---- legal · RU / UZ · «Наверх» — on the grid of .foot-top ---- */
.foot-mid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);column-gap:var(--fcg);row-gap:16px;align-items:baseline;margin-top:clamp(40px,6vh,72px);padding-top:20px;border-top:1px solid var(--hair-2)}
.foot-mid .lang{grid-area:1/2;justify-self:start}
.foot-up{grid-area:1/2;justify-self:end}
.foot-legal{overflow:hidden;font:500 var(--fs-small)/1.5 var(--sans);letter-spacing:.01em;color:var(--paper-2)}
.foot-legal .fl{display:flex;flex-wrap:wrap;row-gap:2px;margin-left:-28px}                       /* the leading separator of every line lies in the clipped 28 px */
.foot-legal .fl>span::before{content:"·";content:"·"/"";display:inline-block;width:28px;text-align:center;letter-spacing:0;color:var(--paper-4)}

.foot-disc{margin-top:22px;max-width:70ch;font-size:var(--fs-small);line-height:1.55;color:var(--paper-3)}
.foot-copy{margin-top:10px;font-size:var(--fs-small);color:var(--paper-3)}
.foot-document{color:var(--paper-2);text-decoration:underline;text-decoration-color:var(--hair-2);text-underline-offset:.2em}
.foot-document:hover{color:var(--paper)}

/* no JS / site.js never ran: the switch cannot work — leave it out (as the header does) */
html:not(.js) .foot .lang,html.tv-fallback .foot .lang{display:none}

/* touch targets ≥ 44 px (§9.34): the link box grows to 44 px and the numeral box gives back the extra half-leading,
   so a numeral stays close to its first link (touch desktops also keep the first links on the wordmark's baseline);
   «Наверх» gets the .lnk hit area that the foundation only draws below 1120 px */
@media (max-width:1119.98px){.foot-nav a{display:inline-flex;align-items:center;min-height:44px;padding:0 4px}.foot-nav .fg-n{height:18px}}
html.touch .foot-nav a{display:inline-flex;align-items:center;min-height:44px;padding:0 4px}
@media (min-width:1120px){html.touch .foot-nav .fg-n{height:21.5px}}
html.touch .foot-up{position:relative}
html.touch .foot-up::before{content:"";position:absolute;left:0;right:0;top:-13px;bottom:-9px}

/* tablets: one column; the bottom row takes the nav's four columns (legal 1–2, RU / UZ on 3, «Наверх» at the end of 4) */
@media (max-width:1119.98px){
  .foot-top{grid-template-columns:1fr}
  .foot-mid{grid-template-columns:repeat(4,minmax(0,1fr));column-gap:24px}
  .foot-legal{grid-column:1/span 2}
  .foot-mid .lang{grid-area:1/3}
  .foot-up{grid-area:1/4}
}
/* phones (§8.10): nav 2 × 2; legal / lang / top stacked — 20 px apart, so the 44 px hit areas of RU / UZ and «Наверх» never overlap */
@media (max-width:760px){
  .foot-nav{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:28px}          /* chapter break clearly larger than the 44 px link pitch */
  .foot-mid{display:flex;flex-direction:column;align-items:flex-start;gap:20px}
  .foot-legal{align-self:stretch}
  .foot-legal .fl{flex-direction:column;margin-left:0}
  .foot-legal .fl>span::before{display:none}
}

/* ---- AI chat preview ---- */
.ai-chat-teaser{
  --ai-bottom:max(76px,env(safe-area-inset-bottom));--ai-gap:74px;
  position:fixed;right:max(22px,env(safe-area-inset-right));bottom:calc(var(--ai-bottom) + var(--ai-keyboard-offset,0px));z-index:90;
  color:#20252b;color-scheme:light;transition:opacity var(--t-fast) var(--ease),transform var(--t-fast) var(--ease),visibility var(--t-fast)
}
.ai-chat-launch{display:grid;place-items:center;width:60px;height:60px;border:1px solid #e5e7eb;border-radius:50%;color:#17202d;background:#fff;font:600 20px/1 var(--sans);letter-spacing:-.04em;box-shadow:0 5px 24px rgba(0,0,0,.2);transition:transform var(--t-fast),box-shadow var(--t-fast)}
.ai-chat-launch:hover{transform:translateY(-2px);box-shadow:0 8px 28px rgba(0,0,0,.28)}
.ai-chat-panel{position:absolute;right:0;bottom:var(--ai-gap);display:flex;flex-direction:column;width:min(360px,calc(100vw - 44px));height:440px;max-height:calc(var(--ai-viewport-height,100dvh) - var(--ai-bottom) - var(--ai-gap) - 14px);overflow:hidden;border:1px solid #e5e7eb;border-radius:18px;background:#fff;box-shadow:0 16px 56px rgba(0,0,0,.24)}
.ai-chat-panel[hidden]{display:none}
.ai-chat-header{display:flex;flex:none;align-items:center;justify-content:space-between;padding:12px 12px 12px 18px;border-bottom:1px solid #eceef0}
.ai-chat-heading{display:flex;align-items:center;gap:11px}
.ai-chat-avatar{display:grid;place-items:center;width:38px;height:38px;border:1px solid #e5e7eb;border-radius:50%;font:600 15px/1 var(--sans);background:#fff}
.ai-chat-header h2{font:500 15px/1.4 var(--sans)}
.ai-chat-status{font:400 12px/1.4 var(--sans);color:#727880}
.ai-chat-close{display:grid;place-items:center;width:44px;height:44px;border-radius:50%;color:#727880}
.ai-chat-close:hover{background:#f3f4f6;color:#17202d}
.ai-chat-close svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.5}
.ai-chat-messages{display:flex;flex:1;min-height:0;flex-direction:column;gap:14px;overflow-y:auto;overscroll-behavior:contain;padding:20px 16px;scrollbar-width:thin}
.ai-chat-message{flex:none;max-width:88%;padding:12px 14px;border-radius:14px;background:#f3f4f6;align-self:flex-start}
.ai-chat-author{display:block;margin-bottom:5px;font:500 11px/1.3 var(--sans);color:#727880}
.ai-chat-message p{white-space:pre-wrap;overflow-wrap:anywhere;font:400 14px/1.55 var(--sans);text-wrap:wrap}
.ai-chat-message--user{align-self:flex-end;background:#17202d;color:#fff}
.ai-chat-message--user .ai-chat-author{color:#ced3dc}
.ai-chat-composer{display:flex;flex:none;align-items:flex-end;gap:8px;padding:12px;border-top:1px solid #eceef0;background:#fff}
.ai-chat-composer textarea{display:block;flex:1;min-width:0;min-height:44px;max-height:96px;padding:11px 12px;resize:none;border:1px solid #e4e7eb;border-radius:12px;background:#f8f9fa;color:#20252b;font:400 16px/22px var(--sans)}
.ai-chat-composer textarea::placeholder{color:#7c828b}
.ai-chat-teaser :focus-visible{outline:2px solid #7c899b;outline-offset:2px}
.ai-chat-send{display:grid;place-items:center;flex:none;width:44px;height:44px;border-radius:12px;background:#17202d;color:#fff}
.ai-chat-send:disabled{background:#e9ecef;color:#9da3ac;cursor:default}
.ai-chat-send svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
html:is(.intro-full,.intro-short,.menu-open,.f3-modal-open) .ai-chat-teaser{opacity:0;visibility:hidden;transform:translateY(8px)}
@media (max-width:760px){
  .ai-chat-teaser{--ai-bottom:max(68px,env(safe-area-inset-bottom));--ai-gap:68px;right:max(16px,env(safe-area-inset-right))}
  .ai-chat-launch{width:56px;height:56px}
  .ai-chat-panel{width:min(360px,calc(100vw - 32px))}
}
.ai-chat-teaser.is-keyboard{--ai-bottom:10px}
@media print{.ai-chat-teaser{display:none!important}}

