/* ═══════════════════════════════════════════════════════════════
   FLOWSYNERGY — site.css : chrome (lifted from Meridian, fixed) + shared components.
   Tokens live in tokens.css. Per-type sheets extend; they never redefine chrome.
   ═══════════════════════════════════════════════════════════════ */

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%; scroll-behavior:smooth; scroll-padding-top:calc(var(--rail-h) + 24px)}
body{
  margin:0; background:var(--bg); color:var(--txt);
  font-family:var(--body); font-size:16px; line-height:1.55;
  -webkit-font-smoothing:antialiased; overflow-x:hidden;
  padding-top:var(--rail-h);
}
img,svg{display:block; max-width:100%}
img{height:auto}
a{color:inherit; text-decoration:none}
/* .98 is a DISPLAY leading -- right on a 74px h1, wrong on a 24px section heading, where it
   gives 23.5px of line box and descenders land on the next line's cap-line. The clamp on
   .prose h2 bottoms out at 1.5rem on a phone and this rule was never re-tuned for it, so ~20
   pages set 5.8 lines average (eight on one) of colliding type. Leading tracks size. */
h1,h2,h3,h4{margin:0; font-family:var(--disp); font-weight:700; letter-spacing:-.03em; line-height:.98}
/* 1180, not 900: `.prose h2`'s clamp does not leave its 24px floor until a 923px viewport,
   and 1180 is where both page shells break anyway. Keyed at 900 the fix missed the band it
   was written for. */
@media (max-width:1180px){
  h2,h3,h4{line-height:1.14}
  .prose h2,.sechead h2{line-height:1.16}
}
p{margin:0}
ul,ol{margin:0; padding:0}
.mono{font-family:var(--mono); font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1}
.ta-r{text-align:right}
.sr{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap}
/* C1-09: the focus ring lives HERE, with the chrome it has to decorate. It used to be
   declared in five per-type sheets, and in none of them were the header, the menu, the
   footer or the button in scope -- so the same chrome focused differently depending on
   which page you happened to be on. One declaration, everything focusable. */
a:focus-visible,button:focus-visible,summary:focus-visible,input:focus-visible,
select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--sig); outline-offset:3px; border-radius:1px;
}
/* the skip link: no page had one. It stays off-canvas until focused. */
.skip{position:absolute; left:var(--gut); top:8px; z-index:200; padding:10px 16px;
  background:var(--bg-3); border:1px solid var(--sig); border-radius:var(--radius);
  color:var(--sig); font-family:var(--mono); font-size:12px; letter-spacing:.14em;
  text-transform:uppercase; transform:translateY(-180%); transition:transform .2s var(--ease);
}
.skip:focus{transform:none}

/* film grain */
.grain{
  position:fixed; inset:-50%; z-index:9999; pointer-events:none; opacity:.028;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ── persistent spec rail (header) ─────────────────────────── */
.rail{
  position:fixed; top:0; left:0; right:0; z-index:100; height:var(--rail-h);
  display:flex; align-items:center; gap:clamp(16px,3vw,40px);
  padding:0 var(--gut);
  background:rgba(8,9,11,.82); backdrop-filter:blur(16px) saturate(140%);
  border-bottom:1px solid var(--line-struct);
}
/* delta #1: the rail is always visible (the concept hid it until JS + scroll) */
.rail__mark{display:flex; align-items:center; gap:9px; flex:none; color:var(--sig)}
.rail__mark svg{width:18px; height:18px}
.rail__mark span{font-family:var(--disp); font-weight:700; font-size:12px; letter-spacing:.16em; color:var(--txt)}
.rail__state{display:flex; align-items:center; gap:clamp(14px,2.4vw,32px); margin-left:auto}
.rail__cell{display:flex; flex-direction:column; gap:1px; line-height:1.1}
.rail__cell .k{font-family:var(--mono); font-size:12px; letter-spacing:.18em; color:var(--dim)}
.rail__cell .v{font-size:12px; font-weight:500; color:var(--txt-2); white-space:nowrap}
.rail__cell--verdict .v{color:var(--sig); transition:color .3s}
.rail__cell--verdict.is-bad .v{color:var(--bad)}
.rail__cell--verdict.is-tbc .v{color:var(--warn)}
.rail__nav{display:flex; gap:clamp(12px,1.8vw,26px); flex:none; padding-left:clamp(14px,2.4vw,32px); border-left:1px solid var(--line-struct)}
.rail__nav a{font-family:var(--mono); font-size:12px; letter-spacing:.1em; text-transform:uppercase; color:var(--dim); transition:color .25s}
.rail__nav a:hover,.rail__nav a[aria-current="page"]{color:var(--sig)}
/* delta #2: CSS-only menu for ≤1180 */
.rail__menu{display:none; position:relative; flex:none}
.rail__menu summary{
  list-style:none; cursor:pointer; font-family:var(--mono); font-size:12px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--txt-2); border:1px solid var(--line-struct); padding:11px 14px; border-radius:var(--radius);
}
.rail__menu summary::-webkit-details-marker{display:none}
.rail__menu[open] summary{color:var(--sig); border-color:var(--sig)}
.rail__menu ul{
  list-style:none; position:absolute; right:0; top:calc(100% + 10px); min-width:220px;
  background:var(--bg-3); border:1px solid var(--line-struct); border-radius:var(--radius-frame); padding:8px 0;
}
.rail__menu li a{display:block; padding:14px 16px; font-family:var(--mono); font-size:12px; letter-spacing:.08em; text-transform:uppercase; color:var(--txt-2); border-left:2px solid transparent}
.rail__menu li a:hover{color:var(--sig); background:var(--bg-2)}
/* C1-06: the desktop nav carried aria-current into a rule inside `display:none`, so the
   only nav a phone ever sees never said where you were. The border is the non-colour cue. */
.rail__menu li a[aria-current="page"]{color:var(--sig); border-left-color:var(--sig); background:var(--bg-2)}
/* the primary four, then everything else */
.rail__menu li.is-split a{border-top:1px solid var(--line-struct)}
.rail__menu li.is-2nd a{color:var(--dim)}

/* ── shell / section ───────────────────────────────────────── */
.sec{max-width:var(--wide); margin-inline:auto; padding:clamp(56px,9vh,120px) var(--gut); border-top:1px solid var(--line-struct)}
.sec--first{border-top:0}
.sechead{display:flex; gap:clamp(18px,3vw,52px); margin-bottom:clamp(30px,4.6vh,56px)}
.sechead .num{flex:none; font-family:var(--mono); font-size:12px; letter-spacing:.12em; color:var(--txt-2); padding-top:.62em}
.sechead h2{font-size:clamp(1.8rem,3.8vw,3.4rem); font-weight:700; text-wrap:balance}
.lede{margin-top:14px; max-width:56ch; color:var(--txt-2); font-size:clamp(14.5px,1.1vw,16.5px); text-wrap:pretty}
.eyebrow{
  display:flex; align-items:center; gap:12px;
  font-family:var(--mono); font-size:12px; letter-spacing:.22em; text-transform:uppercase; color:var(--sig);
  margin-bottom:clamp(16px,2.6vh,28px);
  /* C6-02: 'ONE ADDRESS, ONE ROUTE / IN' -- a two-letter last line above the fold on the only
     conversion page. Balancing costs one property and the phrase stops orphaning. */
  text-wrap:balance;
}
.eyebrow i{display:block; width:clamp(26px,4vw,64px); height:1px; background:currentColor; opacity:.5}
.eyebrow a{color:inherit}
.crumbs{display:flex; flex-wrap:wrap; gap:8px; list-style:none; font-family:var(--mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; color:var(--dim); margin-bottom:clamp(16px,2.6vh,28px)}
.crumbs li+li::before{content:'/'; margin-right:8px; opacity:.5}
.crumbs a:hover{color:var(--sig)}

/* ── prose ─────────────────────────────────────────────────── */
.prose{max-width:var(--measure); font-size:17px; line-height:1.65; color:var(--txt-2)}
.prose p+p,.prose p+ul,.prose ul+p,.prose ol+p,.prose p+ol{margin-top:1.1em}
.prose h2{font-size:clamp(1.5rem,2.6vw,2.3rem); color:var(--txt); margin:2.6em 0 .7em; padding-top:.9em; border-top:1px solid var(--line-struct); display:flex; gap:18px; align-items:baseline}
.prose h2 .num{font-family:var(--mono); font-size:12px; letter-spacing:.12em; color:var(--sig); flex:none}
.prose h3{font-size:clamp(1.1rem,1.5vw,1.35rem); color:var(--txt); margin:1.8em 0 .5em; letter-spacing:-.02em}
.prose a{color:var(--sig); border-bottom:1px solid rgba(133,224,255,.35)}
.prose a:hover{border-bottom-color:var(--sig)}
.prose strong{color:var(--txt); font-weight:600}
/* Fenced off .steps. `.steps` is the hairline-grid technique -- its BACKGROUND is the line,
   showing through 1px gaps -- so a padding-left on it paints a solid bar of --line-struct
   down its left edge, and a margin between items paints bars across it. Invisible while the
   line measured 1.50:1; a 21px slab at 3.21:1. Raising the line revealed this, not caused it. */
.prose :is(ul,ol):not(.steps){padding-left:1.3em}
.prose :is(ul,ol):not(.steps) > li + li{margin-top:.45em}
.prose code,.prose .std{font-family:var(--mono); font-size:.9em; color:var(--txt)}
.lead{font-size:clamp(17px,1.36vw,20px); line-height:1.55; color:var(--txt); max-width:var(--measure); text-wrap:pretty}
.lead.is-dim{color:var(--txt-2)}
.caveat{font-family:var(--mono); font-size:12px; letter-spacing:.04em; color:var(--dim); line-height:1.6; max-width:var(--measure); padding-top:12px; border-top:1px solid var(--line-struct); margin-top:1.4em}

/* ── readout card (signature) ──────────────────────────────── */
.readout{background:var(--bg-3); border:1px solid var(--line-struct); border-radius:var(--radius-frame); padding:clamp(18px,2vw,26px); display:flex; flex-direction:column; gap:18px}
.readout .k{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--dim); margin-bottom:8px}
.readout .big{display:flex; align-items:baseline; gap:9px; font-family:var(--disp); font-size:clamp(2.4rem,4vw,3.4rem); font-weight:600; letter-spacing:-.035em; color:var(--txt); line-height:1}
.readout .big i{font-style:normal; font-size:13px; letter-spacing:.04em; color:var(--dim); font-weight:400; font-family:var(--mono)}
.readout .row{display:grid; grid-template-columns:1fr 1fr; gap:14px; padding-bottom:16px; border-bottom:1px solid var(--line-struct)}
.readout .v{font-size:15px; color:var(--txt-2)}
.verdict{
  display:flex; align-items:center; gap:10px; padding:10px 13px; border-radius:var(--radius);
  background:rgba(133,224,255,.07); border:1px solid rgba(133,224,255,.24);
  font-family:var(--mono); font-size:12px; letter-spacing:.08em; color:var(--sig);
}
.verdict .dot{width:6px; height:6px; border-radius:50%; background:currentColor; flex:none; box-shadow:0 0 0 4px rgba(133,224,255,.14)}
.verdict.is-bad{background:rgba(255,122,99,.08); border-color:rgba(255,122,99,.30); color:var(--bad)}
.verdict.is-bad .dot{box-shadow:0 0 0 4px rgba(255,122,99,.13)}
.verdict.is-tbc{background:rgba(255,196,107,.07); border-color:rgba(255,196,107,.3); color:var(--warn)}
.taglist{list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:5px}
/* C5-03: the <li> was painted as a chip and the <a> inside it was the only clickable part --
   a 61x19 link in an 81x31 chip, so more than half of what reads as a button did nothing on
   tap. The padding belongs to whatever is being pressed. */
.taglist li{font-family:var(--mono); font-size:12px; letter-spacing:.04em; border-radius:var(--radius); background:rgba(255,255,255,.045); border:1px solid var(--line-struct); color:var(--txt-2)}
.taglist li{padding:5px 9px}
.taglist li:has(a){padding:0}
/* no negative margin: it pulled the linked chips 2px smaller than the unlinked ones beside
   them. The <li> gives up its padding instead (above), so the box is unchanged. */
.taglist li > a{display:block; padding:5px 9px; border-radius:var(--radius)}
.taglist--quiet li{background:transparent; color:var(--dim)}
.taglist a:hover{color:var(--sig)}
.note{font-size:13px; line-height:1.62; color:var(--txt-2); text-wrap:pretty}
.tbc{
  display:inline-block; font-family:var(--mono); font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--warn); border:1px dashed rgba(255,196,107,.45); padding:4px 10px; border-radius:var(--radius); white-space:nowrap;
}

/* ── hairline cell grid (signature) ────────────────────────── */
.cells{display:grid; gap:1px; background:var(--line-struct); border:1px solid var(--line-struct); border-radius:var(--radius-frame); overflow:hidden}
.cells--2{grid-template-columns:repeat(2,1fr)}
.cells--3{grid-template-columns:repeat(3,1fr)}
.cells--4{grid-template-columns:repeat(4,1fr)}
.cell{background:var(--bg-2); padding:clamp(20px,2.2vw,30px); display:flex; flex-direction:column; gap:12px; position:relative; min-width:0}
.cell::after{content:''; position:absolute; left:0; top:0; width:100%; height:2px; background:var(--sig); transform:scaleX(0); transform-origin:left; transition:transform .45s var(--ease)}
a.cell:hover,.cell:hover{background:var(--bg-3)}
a.cell:hover::after{transform:none}
.cell__ix{font-family:var(--mono); font-size:12px; letter-spacing:.18em; color:var(--txt-2); text-transform:uppercase}
/* `.cell__t` is the card title for grids that live inside .prose, where an <h3> would be
   counted as a section heading and fail the heading-rhythm check on three words. It was
   declared in legal.css, which articles do not load -- the same wrong-sheet mistake as
   `.steps__h`, so it lives with the component this time. */
.cell h3,.cell .cell__t{font-size:clamp(1.05rem,1.4vw,1.3rem); font-weight:600; letter-spacing:-.02em; line-height:1.15; color:var(--txt); font-family:var(--disp); margin:0}
.cell p{font-size:13px; line-height:1.62; color:var(--txt-2); text-wrap:pretty}
.cell__foot{margin-top:auto; padding-top:12px; border-top:1px solid var(--line-struct); font-family:var(--mono); font-size:12px; letter-spacing:.1em; text-transform:uppercase; color:var(--dim)}
.cell__foot b{color:var(--warn); font-weight:500}
.cell__foot .ok{color:var(--txt-2); font-weight:500}

/* ── standards / data table (signature) ─────────────────────── */
.tbl{width:100%; border-collapse:collapse; font-size:15px}
.tbl th{text-align:left; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--txt-2); font-weight:400; padding:0 16px 12px 0; border-bottom:1px solid var(--line-struct); vertical-align:bottom}
.tbl td{padding:14px 16px 14px 0; border-bottom:1px solid var(--line-struct); vertical-align:top; color:var(--txt-2); line-height:1.5}
.tbl td:first-child{font-family:var(--mono); font-size:13px; color:var(--txt); white-space:nowrap; width:1%}
.tbl td:last-child,.tbl th:last-child{padding-right:0}
.tbl tr.is-on td:first-child{color:var(--sig)}
.tbl tr.is-on td{color:var(--txt-2)}
.tbl td.hi{color:var(--sig)}
.tbl td.lo{color:var(--dim)}
.tbl--wrap td:first-child{white-space:normal; width:auto; min-width:9ch}
.tbl--cols td:first-child{color:var(--txt); font-family:var(--mono); font-size:13px}
.tbl--cols th:not(:first-child){color:var(--txt-2)}
.tblwrap{overflow-x:auto; -webkit-overflow-scrolling:touch}
/* R1-02: on narrow screens a wide table scrolls sideways — say so. Right-edge fade + a mono cue.
   Both are removed for tables that restack instead of scrolling (.tbl--duel ≤720, .stds ≤480,
   .tbl--wrap ≤480 — see below and service.css). */
@media (max-width:720px){
  .tblwrap{
    -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 44px),transparent);
    mask-image:linear-gradient(90deg,#000 calc(100% - 44px),transparent);
  }
  .tblwrap::before{
    content:"scroll \2192"; display:block; font-family:var(--mono); font-size:12px;
    letter-spacing:.16em; text-transform:uppercase; color:var(--dim); padding-bottom:10px;
  }
  .tblwrap:has(.tbl--duel){-webkit-mask-image:none; mask-image:none}
  .tblwrap:has(.tbl--duel)::before{content:none}
}
@media (max-width:480px){
  /* the standards tables restack as cards at ≤480: no sideways scroll, no cue */
  .tblwrap:has(.stds),.tblwrap:has(.tbl--wrap){overflow-x:visible; -webkit-mask-image:none; mask-image:none}
  .tblwrap:has(.stds)::before,.tblwrap:has(.tbl--wrap)::before{content:none}
  .tbl.stds{min-width:0; font-size:13px}
  .tbl.stds thead{display:none}
  .tbl.stds tr{display:grid; grid-template-columns:minmax(0,1fr) auto; gap:4px 14px; padding:14px 0; border-bottom:1px solid var(--line-struct); align-items:baseline}
  .tbl.stds td{display:block; border-bottom:0; padding:0}
  .tbl.stds td:first-child{white-space:normal; width:auto; font-size:13px}
  .tbl.stds td:nth-child(2){grid-column:1 / -1; grid-row:2}
  .tbl.stds td:last-child{grid-column:2; grid-row:1; text-align:right}
}
.chip{display:inline-block; font-family:var(--mono); font-size:12px; letter-spacing:.14em; text-transform:uppercase; padding:4px 9px; border-radius:var(--radius); border:1px solid var(--line-struct); color:var(--txt-2); white-space:nowrap}
.is-on .chip,.chip.is-on{border-color:rgba(133,224,255,.4); color:var(--sig); background:rgba(133,224,255,.07)}

/* ── frames / images ───────────────────────────────────────── */
.frame{background:var(--bg-2); border:1px solid var(--line-struct); border-radius:var(--radius-frame); overflow:hidden; margin:0}
/* GRADING HAPPENS ONCE, AT BUILD TIME -- deliberately not here (2026-08-21).
   This rule used to carry two CSS grades: a light one on every framed image and, on
   `.frame--photo`, a heavy cool cast built from sepia + hue-rotate(165deg) to pull raw client
   photography towards ice blue. Both are retired.
   Two reasons. First, `design-system/images.py grade()` now grades every image as it is
   written -- generated, client and catalogue plate alike -- so a CSS filter on top was a
   second, invisible grade stacked on the first, and the result was muddy. Second, and worse,
   hue-rotate is a hue ROTATION, not a tint: it turned the blue Pettinaroli balancing valve on
   the homepage card brass, so the picture contradicted its own alt text. Product colour is
   information on this site -- a blue body, a yellow lever, a brass manifold -- and CSS must
   not invent it. Change the grade in images.py, where it can be seen in the file on disk. */
.frame img{width:100%; height:auto; display:block}
.frame figcaption{padding:12px 16px; border-top:1px solid var(--line-struct); font-family:var(--mono); font-size:12px; letter-spacing:.04em; color:var(--dim); line-height:1.6}
.frame--ratio img{aspect-ratio:16/9; object-fit:cover}

/* ── pull panel / key box ──────────────────────────────────── */
.panel{background:var(--bg-3); border:1px solid var(--line-struct); border-left:2px solid var(--sig); border-radius:var(--radius-frame); padding:clamp(18px,2vw,26px); max-width:var(--exhibit)}
.panel .k{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--txt-2); margin-bottom:10px}
.panel p{font-size:15px; line-height:1.6; color:var(--txt)}
.panel p+p{margin-top:.8em}
.panel--warn{border-left-color:var(--warn)}
.panel--warn .k{color:var(--warn)}

/* ── step list ─────────────────────────────────────────────── */
.steps{list-style:none; counter-reset:s; display:grid; gap:1px; background:var(--line-struct); border:1px solid var(--line-struct); border-radius:var(--radius-frame); overflow:hidden}
.steps li{counter-increment:s; background:var(--bg-2); padding:clamp(16px,1.8vw,22px) clamp(18px,2vw,26px); display:grid; grid-template-columns:3.2ch 1fr; gap:16px}
.steps li::before{content:counter(s,decimal-leading-zero); font-family:var(--mono); font-size:12px; letter-spacing:.12em; color:var(--txt-2); padding-top:.35em}
/* Every heading spelling this component has ever used, in the sheet that owns the component.
   `.steps` had drifted into three: `.steps h3` here, `.steps .steps__h` in article.css and
   `.steps .t` in about.css and contact.css separately -- so a page that emitted one spelling
   but did not load that sheet got an unstyled heading. about.html did exactly that. */
.steps h3,.steps .steps__h,.steps .t{display:block; font-family:var(--disp); font-size:1.05rem;
  font-weight:600; letter-spacing:-.02em; color:var(--txt); margin-bottom:6px}
/* A4-01: the reading measure applies to the prose INSIDE an exhibit, not only to the page's
   own column. Capping it on one page in one sheet left every other ledger at ~126 characters. */
.steps p:not(.steps__h):not(.t){max-width:var(--measure)}
/* B6-01: and so does the FRAME. Capping it on the article shell alone left one component
   rendering three widths -- 1,011px of frame around text stopping 320px short on both
   comparison pages. The band variant is a three-column row and genuinely needs the width;
   it opts back out below. */
.steps{max-width:calc(var(--measure) + 6ch)}
/* ...but the measure caps a COLUMN of prose. A multi-column steps variant is a different
   object and opts out: capping it produced three 249px columns of 21-character lines. */
.steps--3,.steps--4{max-width:none}
.steps p{font-size:15px; line-height:1.6; color:var(--txt-2)}

/* ── sticky index (gutter device) ──────────────────────────── */
.index{position:sticky; top:calc(var(--rail-h) + 28px); align-self:start}
.index .k{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--dim); margin-bottom:12px}
.index ol{list-style:none; border-left:1px solid var(--line-struct)}
.index li a{display:block; padding:7px 0 7px 14px; margin-left:-1px; border-left:1px solid transparent; font-family:var(--mono); font-size:12px; letter-spacing:.06em; color:var(--dim); line-height:1.4}
.index li a:hover{color:var(--sig); border-left-color:var(--sig)}
.index li a .n{color:var(--sig); margin-right:8px}

/* ── CTA (the one button) ──────────────────────────────────── */
.btn{
  display:inline-flex; align-items:center; gap:10px; padding:13px 18px; border-radius:var(--radius);
  /* <button> and <a> do not share a default line-height, so the ONE button on the site
     that actually submits the enquiry rendered 41px against 44.6px everywhere else. */
  line-height:1.35;
  background:var(--sig); color:#04161D; font-family:var(--mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase; font-weight:600;
  border:1px solid var(--sig); transition:background .25s,color .25s;
}
.btn:hover{background:transparent; color:var(--sig)}
.btn--ghost{background:transparent; color:var(--txt-2); border-color:var(--line-struct)}
.btn--ghost:hover{color:var(--sig); border-color:var(--sig)}
.enquire{max-width:var(--wide); margin-inline:auto; padding:clamp(48px,7vh,90px) var(--gut); border-top:1px solid var(--line-struct)}
.enquire__in{display:grid; grid-template-columns:minmax(0,1.2fr) minmax(0,1fr); gap:clamp(24px,4vw,72px); align-items:end}
.enquire h2{font-size:clamp(1.7rem,3.2vw,2.8rem); text-wrap:balance}
.enquire p{margin-top:14px; max-width:52ch; color:var(--txt-2)}
.enquire__fields{display:grid; grid-template-columns:repeat(2,1fr); gap:1px; background:var(--line-struct); border:1px solid var(--line-struct); border-radius:var(--radius-frame); overflow:hidden}
.enquire__fields div{background:var(--bg-2); padding:12px 14px; display:flex; flex-direction:column; gap:3px}
.enquire__fields .k{font-family:var(--mono); font-size:12px; letter-spacing:.18em; text-transform:uppercase; color:var(--dim)}
.enquire__fields .v{font-size:13px; color:var(--txt-2)}
.enquire .btn{margin-top:22px}

/* A3-§4: the closing band used to be byte-identical on every page. The round-2 variants key
   off `data-hero`, which only the service pages carry, so index / about / insights / glossary
   still closed alike. `data-page-type` is on every <body>, so the shape keys off that here.
   Same children, same words -- four arrangements instead of one. */
body[data-page-type="hub"] .enquire__in,
body[data-page-type="glossary"] .enquire__in{grid-template-columns:1fr}
body[data-page-type="hub"] .enquire__fields,
body[data-page-type="glossary"] .enquire__fields{grid-template-columns:repeat(4,1fr); margin-top:clamp(22px,3vh,34px)}
body[data-page-type="about"] .enquire__in{grid-template-columns:minmax(0,1fr) minmax(0,1.35fr)}
body[data-page-type="about"] .enquire__fields{order:-1}
body[data-page-type="home"] .enquire__fields{grid-template-columns:1fr}
@media (max-width:900px){
  body[data-page-type="hub"] .enquire__fields,
  body[data-page-type="glossary"] .enquire__fields{grid-template-columns:repeat(2,1fr)}
  body[data-page-type="about"] .enquire__in{grid-template-columns:1fr}
  body[data-page-type="about"] .enquire__fields{order:0}
}
@media (max-width:720px){
  body[data-page-type="hub"] .enquire__fields,
  body[data-page-type="glossary"] .enquire__fields{grid-template-columns:1fr}
}

/* ── related strip ─────────────────────────────────────────── */
.related{max-width:var(--wide); margin-inline:auto; padding:clamp(40px,6vh,72px) var(--gut) 0}
.related .k{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--dim); margin-bottom:16px}

/* ── footer ────────────────────────────────────────────────── */
.foot{max-width:var(--wide); margin-inline:auto; padding:clamp(40px,6vh,64px) var(--gut) 40px; border-top:1px solid var(--line-struct)}
.foot__cols{display:grid; grid-template-columns:1.4fr 1fr 1fr 1fr; gap:clamp(20px,3vw,48px); padding-bottom:clamp(28px,4vh,44px); border-bottom:1px solid var(--line-struct); margin-bottom:22px}
.foot__brand{display:flex; align-items:center; gap:9px; color:var(--sig); margin-bottom:14px}
.foot__brand svg{width:18px; height:18px}
.foot__brand span{font-family:var(--disp); font-weight:700; font-size:12px; letter-spacing:.16em; color:var(--txt)}
.foot__addr{font-style:normal; font-size:13px; line-height:1.65; color:var(--txt-2); max-width:34ch}
.foot__col .k{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase; color:var(--dim); margin-bottom:12px}
.foot__col ul{list-style:none}
.foot__col li{padding:4px 0}
.foot__col a{font-size:13px; color:var(--txt-2)}
.foot__col a:hover{color:var(--sig)}
.foot__legal{display:flex; flex-wrap:wrap; gap:14px; justify-content:space-between; font-family:var(--mono); font-size:12px; letter-spacing:.12em; color:var(--dim); text-transform:uppercase}
.foot__legal .dim{letter-spacing:.04em; text-transform:none; max-width:70ch}
.foot__legal a:hover{color:var(--sig)}

/* ── hero fade: CSS-only, ends visible, never depends on JS ── */
.fade{animation:fadeUp .9s var(--ease) both}
.d1{animation-delay:.09s} .d2{animation-delay:.18s} .d3{animation-delay:.27s}
@keyframes fadeUp{from{opacity:0; transform:translateY(20px)} to{opacity:1; transform:none}}

/* ── responsive ────────────────────────────────────────────── */
@media (max-width:1180px){
  .rail__nav{display:none}
  .rail__menu{display:block}
  .enquire__in{grid-template-columns:1fr}
  .foot__cols{grid-template-columns:1fr 1fr}
  .cells--4{grid-template-columns:repeat(2,1fr)}
  .cells--3{grid-template-columns:repeat(3,1fr)}
  .index{position:static}
}
@media (max-width:720px){
  /* C1-13: the eyebrow's rule is drawn to sit against ONE line. At 390 the phrase wraps to
     three, and align-items:center stranded the rule in the middle of the block. */
  .eyebrow{align-items:flex-start}
  .eyebrow i{margin-top:.62em; flex:none}
  :root{--rail-h:54px}
  .rail{gap:10px}
  .rail__state{gap:10px; min-width:0}
  .rail__cell:nth-child(1),.rail__cell:nth-child(3){display:none}
  .rail__cell .v{max-width:16ch; overflow:hidden; text-overflow:ellipsis}
  .sechead{flex-direction:column; gap:10px}
  .sechead .num{padding-top:0}
  .cells--2,.cells--3,.cells--4{grid-template-columns:1fr}
  .tbl{font-size:13px}
  .tbl td{padding:12px 12px 12px 0}
  /* C1-08: one column turned the footer into a 1,150px seventeen-link stack -- 60% of the
     404 page. Two columns for the registers, the brand block spanning both, a rule over
     each register so three lists read as three things, and 44px rows. */
  .foot__cols{grid-template-columns:repeat(2,1fr); gap:24px clamp(20px,4vw,32px)}
  .foot__cols > div:first-child{grid-column:1 / -1}
  .foot__col{border-top:1px solid var(--line-struct); padding-top:16px}
  .foot__col li{padding:0}
  .foot__col a{display:block; padding:12px 0}
  .foot__legal{flex-direction:column}
  .foot__legal .dim{text-align:left}
  .enquire__fields{grid-template-columns:1fr}
  .prose{font-size:16px}
  .readout .row{grid-template-columns:1fr}
}
@media (max-width:480px){
  .rail__cell:nth-child(2){display:none}
  .rail{gap:8px}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important; transition-duration:.001ms !important}
  html{scroll-behavior:auto}
  .fade{animation:none}
}

/* ══ design review round 2 ════════════════════════════════════════════ */
/* The menu grew 18 items x 44px inside a FIXED 60px header, so its foot -- Privacy, Contact --
   fell off the bottom of a phone with no way to reach it. A dropdown taller than the viewport
   has to scroll itself. */
/* dvh, not vh: with the URL bar showing, 100vh is taller than the visible viewport and the
   last two items sit below the fold again -- the exact bug this cap was added to fix. */
.rail__menu ul{max-height:calc(100dvh - var(--rail-h) - 24px); overflow-y:auto; overscroll-behavior:contain}
@media (max-width:720px){
  /* three registers in two columns orphans the third: it spans instead. */
  .foot__col:last-child{grid-column:1 / -1}
  /* the last 2px on the devices that measured 42.x against a 44px target */
  .rail__menu summary{padding:12px 14px}
  .pillars a{padding:14px 15px}
}


/* 2026-09-02 client feedback: key points must stand out. Writers wrap ONE phrase per paragraph in <strong>. */
main p strong,main li strong,main .prose strong{color:var(--sig);font-weight:600}

/* Fadli's confirmed contact details and trading brands, 11 Sep 2026. */
.foot__contact{font-size:14px;line-height:1.8;margin-top:1.5rem;overflow-wrap:anywhere}
.foot__contact p+p{margin-top:1rem}.foot__contact a{color:var(--ice,#bceafa)}
.trading-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px}
.trading-card{display:flex;flex-direction:column;gap:10px;padding:18px;border:1px solid #32434a;text-decoration:none!important;min-width:0}
.trading-card strong{font-size:20px;line-height:1.25;color:#ecf5f8}.trading-card>span:last-child{font-size:14px;line-height:1.5;color:#adc0c8}
.trading-logo{display:flex;align-items:center;justify-content:center;background:white;min-height:94px;padding:8px;border-radius:3px}
.trading-logo img{width:100%;height:78px;object-fit:contain;filter:none!important}.trading-card:hover{border-color:#a8ddeb}
.contact__dl dd,.entity dd{overflow-wrap:anywhere}.contact__dl a,.entity a{color:inherit}
@media(max-width:1000px){.trading-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:600px){.trading-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.trading-card{padding:12px}.trading-card strong{font-size:18px}.trading-logo{min-height:80px}.trading-logo img{height:64px}}
