/* =============================================================================
   OCCHIO TEC SDN BHD — site stylesheet
   Design language: "Blueprint" (designs/3-blueprint/index.html), extended to a
   five-page site and to carrying real photography as drawing-set PLATES.
   ========================================================================== */

/* ============ TOKENS ============ */
:root{
  --paper:#F4F3EF;
  --paper-lift:#FCFBF7;
  --ink:#141413;
  --ink-60:rgba(20,20,19,.62);
  --ink-mute:rgba(20,20,19,.60);    /* TEXT grade — 4.65:1 on paper (AA). Do not lower.
                                       There is no lighter text token on purpose: the old
                                       --ink-40 at .40 measured 2.54:1 and failed 39 times. */
  --ink-decor:rgba(20,20,19,.4);    /* NON-TEXT only: rules, crosses, drawing linework. */
  --rule:#D8D5CB;
  --rule-strong:#B9B5A8;         /* decorative rules - not held to 3:1 */
  --field-line:#8F8B7E;          /* 3.05:1 on --paper-lift (WCAG 1.4.11) */
  --blue:#1B4FFF;
  --blue-08:rgba(27,79,255,.08);
  --blue-lift:#4B72FF;           /* same accent, lifted for the ink band only */
  --paper-on-ink:rgba(244,243,239,.92);
  --rule-on-ink:rgba(244,243,239,.16);
  --d:'Archivo',system-ui,-apple-system,sans-serif;
  --m:'Space Mono',ui-monospace,'Courier New',monospace;
  --pad:clamp(20px,4.5vw,56px);
}

/* ============ RESET ============ */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{overflow-x:clip}
@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}
body{
  background:var(--paper);
  color:var(--ink);
  font-family:var(--d);
  font-size:16px;
  line-height:1.55;
  overflow-x:clip;
  -webkit-font-smoothing:antialiased;
}
::selection{background:var(--blue);color:var(--paper)}
a{color:inherit;text-decoration:none}
img{max-width:100%;height:auto;display:block}
:focus-visible{outline:2px solid var(--blue);outline-offset:3px}
/* on the ink band a single blue ring measures 3.17:1 - a hair over 1.4.11.
   The paper ring underneath makes it robust on either ground. */
.why :focus-visible,.cta :focus-visible,.footer :focus-visible{
  outline-color:var(--paper);box-shadow:0 0 0 4px var(--blue)}
[id]{scroll-margin-top:96px}
.wcard[id]{scroll-margin-top:88px}
.skip{position:absolute;left:-9999px;top:0;background:var(--blue);color:#fff;font-family:var(--m);font-size:12px;padding:10px 16px;z-index:300}
.skip:focus{left:0}
/* kept: needed the moment a visually-hidden heading is added */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

/* ONE micro-type scale. The concept separated drawing content from sheet metadata
   by CONTRAST; AA will not allow that at 10px, so the separation is carried by size
   and tracking instead. SIX roles - a drawing sheet genuinely distinguishes all six:
     1 MICRO    9.5px / .2em   eyebrows, reference codes, keys
     2 KEY      10px  / .14em  the key that opens a panel
     3 CAPTION  10.5px/ .1em   plate captions, foot rules
     4 LABEL    11px  / .22em  section labels
     5 VALUE    11.5px/ .03em  title-block data (near-zero tracking - it is data)
     6 ACTION   12px  / .16em  buttons and mono links
   TWO RULES, both learned the hard way:
     - Do NOT re-declare font-size or letter-spacing on a selector listed below.
       Doing so silently made this whole block inert once.
     - Do NOT merge another declaration into one of these selector lists. Splicing a
       link-underline rule onto the VALUE list dropped .tb-v to 16px site-wide.
   SVG internals (#tower text) are exempt - they scale with the viewBox. */
.sec-mark,.tb-k,.wcard .ix,
.footer-in .eye,.cred-k,.addr-head,.footer-col h3,
.svccard .code,.sn-idx,.sn-ref,
.crumb{
  font-size:9.5px;letter-spacing:.2em;
}
.sec-label,.brand-sub{font-size:11px;letter-spacing:.22em}
/* fourth role: the 10px "key" that opens a panel (CHANNEL, AUTHORISED BY, NOT LISTED) */
.chan-k,.svccard.more .k,.wcard.more .k,.register-grp b,.sch-role,.drawer a .ref,
.tower-cap,.addr .k,.ph-na .x,.faq summary .q{font-size:10px;letter-spacing:.14em}
/* the card ask is a label on a card-sized target, not the target itself */
.wcard-ask{font-size:11px;letter-spacing:.12em}
/* fifth role: title-block VALUES - data, so near-zero tracking */
.tb-v,.addr li,.leader-list li{font-size:11.5px;letter-spacing:.03em}
/* link affordance for the symptom list - a RULE OF ITS OWN, never merged into a
   sizing selector list (doing exactly that dropped .tb-v to 16px once already). */
#existing .leader-list{max-width:none}
.leader-list a{border-bottom:1px solid var(--rule-strong);padding-bottom:1px;
  transition:color .2s ease,border-color .2s ease}
.leader-list a:hover,.leader-list a:focus-visible{color:var(--blue);border-bottom-color:var(--blue)}
/* third role: CAPTIONS and foot rules */
.work-foot,.sectors-foot,.hero-note,.cta-note,.plate-cap{font-size:10.5px;letter-spacing:.1em}
/* sixth role: ACTIONS - buttons and mono links */
.btn,.nav-links a,.nav-cta,.drawer a,.chan-links a,.wcard.more .go,.svccard.more .go,
.footer-in,.form-status{font-size:12px;letter-spacing:.16em}
.work-foot{font-size:10.5px;letter-spacing:.1em}
.hero-note{line-height:2.05}
.work-foot,.sectors-foot{line-height:1.9}

/* ============ TYPE UTILITIES ============ */
.mono{font-family:var(--m)}
h1,h2,h3{font-weight:800;line-height:1.02;letter-spacing:-.01em}

/* ============ NAV ============ */
.nav{
  position:sticky;top:0;z-index:100;
  background:var(--paper);   /* opaque: on flat paper, translucency reads as a
                                rendering fault, not as depth */
  border-bottom:1px solid var(--rule);
  transition:border-color .3s ease;
}
.nav.scrolled{border-bottom-color:var(--rule-strong)}
.nav-in{
  max-width:1280px;margin:0 auto;padding:0 var(--pad);
  display:flex;align-items:center;justify-content:space-between;
  height:64px;
}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
/* The client's own logo, not a drawn stand-in. Source is 343x100 - the only
   resolution that exists (occhiotec.com/images/logo.png). Height-locked so the
   header rule never shifts; width:auto keeps the 3.43:1 ratio. */
.brand-logo{height:26px;width:auto;flex:none;display:block}
.brand-logo-lg{height:32px;margin-bottom:6px}
.footer-brand .brand-sub{margin-left:0}
.brand-sub{font-family:var(--m);color:var(--ink-60);margin-left:2px;white-space:nowrap}
.nav-links{display:flex;align-items:center;gap:clamp(14px,2.4vw,32px);list-style:none}
.nav-links a{
  font-family:var(--m);
  color:var(--ink-60);padding:6px 0;border-bottom:1px solid transparent;
  transition:color .2s ease,border-color .2s ease;
}
.nav-links a:hover{color:var(--ink);border-bottom-color:var(--blue)}
.nav-links a[aria-current="page"]{color:var(--ink);border-bottom-color:var(--blue)}
.nav-links a.nav-cta{
  font-family:var(--m);font-size:11px;
  background:var(--ink);color:var(--paper);
  padding:10px 18px;border:1px solid var(--ink);
  transition:background .2s ease,color .2s ease,border-color .2s ease;
  white-space:nowrap;
}
.nav-links a.nav-cta:hover,.nav-links a.nav-cta[aria-current="page"]{background:var(--blue);border-color:var(--blue);color:#fff}

/* burger + drawer */
.burger{
  display:none;background:none;border:1px solid var(--rule-strong);
  width:40px;height:38px;cursor:pointer;padding:0;
  align-items:center;justify-content:center;flex-direction:column;gap:4px;
}
.burger span{display:block;width:17px;height:1.5px;background:var(--ink);transition:transform .25s ease,opacity .25s ease}
.burger[aria-expanded="true"] span:nth-child(1){transform:translateY(5.5px) rotate(45deg)}
.burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-5.5px) rotate(-45deg)}
.drawer{
  display:none;
  border-top:1px solid var(--rule);
  background:var(--paper-lift);
}
.drawer.open{display:block}
.drawer ul{list-style:none;padding:6px var(--pad) 4px}
.drawer-act{display:grid;gap:10px;padding:16px var(--pad) 22px}
.drawer-act .btn{justify-content:center;padding:16px 20px}
/* .drawer a is (0,1,1) and outranks .btn-ink (0,1,0) - without these two the
   CALL button paints --ink-60 on --ink and measures 1.00:1. */
.drawer-act .btn-ink{color:var(--paper)}
.drawer-act .btn-ghost{color:var(--ink)}
.drawer li{border-bottom:1px solid var(--rule)}
.drawer li:last-child{border-bottom:none}
.drawer a{
  display:flex;justify-content:space-between;align-items:baseline;gap:14px;
  font-family:var(--m);font-size:12px;letter-spacing:.16em;
  padding:15px 2px;color:var(--ink-60);
}
.drawer a[aria-current="page"]{color:var(--blue)}
.drawer a .ref{color:var(--ink-mute);font-size:10px;letter-spacing:.1em}
@media (max-width:900px){
  /* only the CALL action survives the collapse - keeping CONTACT as well pushed the
     wordmark under the buttons at 390px. The drawer carries the survey CTA. */
  .nav-links li:not(.mob-call){display:none}
  .nav-links{gap:0}
  .burger{display:flex}
  .nav-cta{padding:0 15px;min-height:44px;display:inline-flex;align-items:center;font-size:11px;letter-spacing:.1em}
  .burger{width:44px;height:44px}
}
@media (min-width:901px){.mob-call{display:none}}
@media (max-width:480px){.brand-sub{display:none}}
@media (max-width:340px){.nav-cta{padding:10px 10px}.brand-logo{height:22px}}

/* ============ SHEET FRAME ============ */
.sheet{max-width:1280px;margin:0 auto;border-inline:1px solid var(--rule)}
@media (max-width:1281px){.sheet{border-inline:none}}
.wrap{padding-inline:var(--pad)}

.sec{border-top:1px solid var(--rule)}
.sec-head{display:flex;align-items:baseline;gap:16px;padding:22px 0 0}
.sec-num{font-family:var(--m);font-size:13px;font-weight:700;color:var(--blue);letter-spacing:.08em;flex:none}
.sec-label{font-family:var(--m);font-size:11px;letter-spacing:.22em;color:var(--ink-60);flex:none}
.sec-rule{flex:1;height:1px;background:var(--rule);align-self:center;min-width:24px}
.sec-mark{font-family:var(--m);color:var(--ink-mute);flex:none}
@media (max-width:620px){.sec-mark{display:none}}
/* WCAG 1.4.10: .sec-label is flex:none, so a long label ran 72px past a 320px
   viewport and html{overflow-x:clip} left no scrollbar to recover it. */
@media (max-width:520px){
  /* num + label on one line; the rule and cross are pure furniture and are the
     first things to go when there is no room for them. */
  .sec-head{flex-wrap:nowrap;gap:10px}
  .sec-label{flex:1 1 auto;min-width:0;overflow-wrap:break-word}
  .sec-head .sec-rule,.sec-head .cross{display:none}
}

.cross{
  width:15px;height:15px;display:inline-block;flex:none;
  background:
    linear-gradient(var(--ink-decor),var(--ink-decor)) center/1px 100% no-repeat,
    linear-gradient(var(--ink-decor),var(--ink-decor)) center/100% 1px no-repeat;
}

/* ============ HERO (home) ============ */
.hero{position:relative;padding-top:clamp(48px,8vh,96px)}
.hero-corners{position:absolute;inset:24px var(--pad) auto;display:flex;justify-content:space-between;pointer-events:none}
.hero-kicker{
  font-family:var(--m);font-size:11px;letter-spacing:.22em;color:var(--ink-60);
  display:flex;align-items:flex-start;gap:14px;margin-bottom:clamp(28px,4vh,44px);
}
.hero-kicker::after{content:"";flex:1;height:1px;background:var(--rule);margin-top:.55em}
.hero-kicker b{color:var(--blue);font-weight:700}
.k-short{display:none}
@media (max-width:560px){
  /* one stacked run, not two flex columns - the two-column layout orphaned a
     lone em-dash on its own line. */
  .hero-kicker{display:block;line-height:1.9}
  .hero-kicker::after{display:none}
  .hero-kicker .k-long{display:none}
  .hero-kicker .k-short{display:inline}
}
.hero h1{
  font-size:clamp(2.7rem,7.8vw,6.6rem);
  font-stretch:125%;font-weight:800;text-transform:uppercase;
  line-height:.94;letter-spacing:-.015em;max-width:14ch;
}
.hero h1 .hollow{color:var(--paper);-webkit-text-stroke:max(2px,.028em) var(--ink);paint-order:stroke}
@supports not (-webkit-text-stroke:1px black){.hero h1 .hollow{color:var(--ink)}}
/* MUST stay after the rule above - same specificity, so source order decides.
   Below ~560px the 2px stroke has too few pixels to resolve and picks up
   subpixel colour fringing: two hues that are not in the palette. */
/* the 2px floor goes proportionally HEAVIER as the h1 clamps down - that is what
   looked wrong, not a lack of pixels. Lower the floor and keep the outline: it is
   the one typographic move that carries 'drawn to spec'. */
@media (max-width:560px){.hero h1 .hollow{-webkit-text-stroke:max(1.6px,.028em) var(--ink)}}
.hero h1 .dot{color:var(--blue)}
.hero-grid{
  display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);
  gap:clamp(24px,4vw,64px);align-items:end;
  padding:clamp(28px,4.5vh,52px) 0 clamp(40px,6vh,72px);
}
.hero-side{align-self:end;display:flex;flex-direction:column;gap:18px}
@media (max-width:900px){.hero-side{align-self:start}}
@media (max-width:560px){
  /* keep the geography, drop the etymology - the districts qualify the business,
     the word origin is colour. */
  .hero-side .hero-note:not(.issue){display:none}
  .hero-side .issue{margin-top:0}
}
.hero-lede{max-width:46ch;hyphens:none;font-size:clamp(1rem,1.35vw,1.19rem);line-height:1.6;color:var(--ink-60)}
.hero-lede strong{color:var(--ink);font-weight:600}
.hero-actions{display:flex;gap:18px;align-items:center;margin-top:28px;flex-wrap:wrap}
.hero-note{font-family:var(--m);color:var(--ink-mute)}
.hero-note em{font-style:normal;color:var(--blue)}
@media (max-width:900px){.hero-grid{grid-template-columns:minmax(0,1fr)}}

.btn{
  display:inline-flex;align-items:center;gap:10px;
  font-family:var(--m);
  padding:14px 24px;border:1px solid var(--ink);
  transition:background .2s ease,color .2s ease,border-color .2s ease;
}
.btn-ink{background:var(--ink);color:var(--paper)}
.btn-ink:hover{background:var(--blue);border-color:var(--blue);color:#fff}
.btn-ghost{background:transparent;color:var(--ink)}
.btn-ghost:hover{border-color:var(--blue);color:var(--blue)}
@media (max-width:620px){
  .btn{padding:17px 22px}
  .hero-actions{display:grid;gap:12px;width:100%}
  .hero-actions .btn{justify-content:center}
}

/* title block — architect's corner block */
.titleblock{border:1px solid var(--rule-strong);display:grid;grid-template-columns:repeat(6,1fr);background:var(--paper-lift)}
.tb-cell{padding:12px 14px;border-right:1px solid var(--rule);min-width:0}
.tb-cell:last-child{border-right:none}
.tb-k{font-family:var(--m);color:var(--ink-mute);display:block;margin-bottom:4px}
.tb-v{font-family:var(--m);font-weight:700;display:block;overflow-wrap:break-word}
.tb-v.blue{color:var(--blue)}
@media (max-width:900px){
  .titleblock{grid-template-columns:repeat(3,1fr)}
  .tb-cell:nth-child(3){border-right:none}
  .tb-cell:nth-child(-n+3){border-bottom:1px solid var(--rule)}
}
@media (max-width:480px){
  .tb-v{white-space:normal;overflow:visible;text-overflow:clip}
  .titleblock{grid-template-columns:repeat(2,1fr)}
  .tb-cell{border-right:1px solid var(--rule)}
  .tb-cell:nth-child(2n){border-right:none}
  .tb-cell:nth-child(-n+4){border-bottom:1px solid var(--rule)}
  .tb-cell:nth-child(3){border-right:1px solid var(--rule)}
}

/* ============ CREDIBILITY STRIP ============ */
.cred{border-top:1px solid var(--rule);display:grid;grid-template-columns:repeat(3,1fr)}
.cred-cell{padding:20px var(--pad);border-right:1px solid var(--rule);display:flex;flex-direction:column;gap:4px;min-width:0}
.cred-cell:last-child{border-right:none}
.cred-k{font-family:var(--m);font-size:9.5px;letter-spacing:.2em;color:var(--blue)}
.cred-v{font-size:14.5px;font-weight:600;letter-spacing:-.01em}
.cred-v a{border-bottom:1px solid var(--rule-strong);transition:color .2s,border-color .2s}
.cred-v a:hover,.cred-v a:focus-visible{color:var(--blue);border-bottom-color:var(--blue)}
@media (max-width:760px){
  .cred{grid-template-columns:minmax(0,1fr)}
  .cred-cell{border-right:none;border-bottom:1px solid var(--rule);padding-block:14px}
  .cred-cell:last-child{border-bottom:none}
}

/* ============ INNER-PAGE HEADER (about / services / work / contact) ============ */
.phead{padding-block:clamp(40px,7vh,84px) clamp(28px,4.5vh,52px);position:relative}
/* NOTE: .phead also carries .wrap — never use the `padding` shorthand here, it resets
   padding-inline and drops the page title off the sheet margin. */
.crumb{font-family:var(--m);color:var(--ink-mute);display:flex;align-items:center;gap:9px;margin-bottom:clamp(22px,3.5vh,38px);flex-wrap:wrap}
.crumb a{color:var(--ink-60);border-bottom:1px solid transparent}
.crumb a:hover{color:var(--blue);border-bottom-color:var(--blue)}
.crumb .now{color:var(--blue)}
/* min lowered from 2.3rem: at 320px a long H1 ("one contractor.") overran the 16ch
   measure and the blue stop was clipped 42px outside the viewport by overflow-x:clip. */
.phead h1{font-size:clamp(1.9rem,6vw,4.6rem);font-stretch:122%;text-transform:uppercase;line-height:.96;
  max-width:min(16ch,100%);overflow-wrap:break-word}
.phead h1 .dot{color:var(--blue)}
.phead-lede{margin-top:clamp(20px,3vh,30px);max-width:56ch;color:var(--ink-60);font-size:clamp(1rem,1.3vw,1.12rem);line-height:1.65}
.phead-lede strong{color:var(--ink);font-weight:600}

.notes-block{border:1px solid var(--rule);background:var(--paper-lift);padding:16px 18px;align-self:start}
.notes-block .k{display:block;font-family:var(--m);font-size:10px;letter-spacing:.14em;color:var(--blue);margin-bottom:12px}
.notes-block ol{list-style:none;counter-reset:n;display:grid;gap:9px}
@media (min-width:900px){.notes-block ol{grid-template-columns:1fr 1fr;gap:9px 28px}}
.notes-block li{counter-increment:n;display:grid;grid-template-columns:26px minmax(0,1fr);gap:10px;
  font-size:.86rem;color:var(--ink-60);line-height:1.55}
.notes-block li::before{content:counter(n,decimal-leading-zero);font-family:var(--m);font-size:10px;
  letter-spacing:.1em;color:var(--ink-mute);padding-top:3px}

.jumpstrip{margin:clamp(18px,2.6vh,26px) 0 0}
@media (min-width:901px){.jumpstrip{display:none}}

/* ============ PLATE — how photography enters a drawing set ============ */
.plate{border:1px solid var(--rule-strong);background:var(--paper-lift);margin:0}
.plate-img{position:relative;overflow:hidden;background:var(--rule)}
.plate-img img{width:100%;height:100%;object-fit:cover;display:block}
.plate-cap{
  display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  border-top:1px solid var(--rule);padding:10px 13px;
  font-family:var(--m);color:var(--ink-60);
}
.plate-cap .ref{color:var(--blue);white-space:nowrap;font-weight:700}
.plate-cap .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-transform:uppercase}

/* a property we hold no usable photograph for. Reads as a record, not a hole. */
.wcard .ph.ph-na,.wcard.endsheet{display:flex;align-items:center;justify-content:center;text-align:center;
  background:repeating-linear-gradient(-45deg,transparent 0 9px,rgba(20,20,19,.045) 9px 10px),var(--paper-lift)}
.wcard.endsheet span{font-family:var(--m);font-size:10px;letter-spacing:.14em;color:var(--ink-mute);line-height:1.9}
.ph-na{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  text-align:center;padding:18px;background:
    repeating-linear-gradient(-45deg,transparent 0 9px,rgba(20,20,19,.045) 9px 10px),
    var(--paper-lift);
}
.ph-na .x{font-family:var(--m);color:var(--ink-mute);max-width:20ch;line-height:1.7}
.ph-na .g{width:26px;height:26px;opacity:.5;background:
  linear-gradient(var(--ink-decor),var(--ink-decor)) center/1px 100% no-repeat,
  linear-gradient(var(--ink-decor),var(--ink-decor)) center/100% 1px no-repeat}


/* ============ AWARD PLATE ============
   The certificate itself is client-gated (FACTS.md open question 3). Every field below
   is established verbatim in FACTS.md, so the award is SET as a record rather than
   asserted in prose - the section had a full-width claim and no artefact. Swap the
   whole .ph-award block for the scan the day it arrives; keep the AW-01 reference. */
.awardplate{align-self:start;grid-column:2;margin-top:clamp(20px,3vh,30px)}
@media (max-width:900px){.awardplate{grid-column:1}}
.ph-award{padding:clamp(20px,2.6vw,30px);background:
  repeating-linear-gradient(-45deg,transparent 0 11px,rgba(27,79,255,.035) 11px 12px),var(--paper-lift)}
.aw-k{display:block;font-family:var(--m);font-size:10px;letter-spacing:.14em;color:var(--blue);margin-bottom:16px}
.aw-list{list-style:none;display:grid;gap:10px}
.aw-list li{display:flex;align-items:baseline;font-family:var(--m);font-size:10px;letter-spacing:.1em;gap:0}
.aw-list .k{color:var(--ink-mute);white-space:nowrap}
.aw-list .dots{flex:1;border-bottom:1px dotted var(--rule-strong);margin:0 9px;transform:translateY(-3px);min-width:14px}
.aw-list .v{text-align:right;color:var(--ink);font-weight:700;min-width:0}
@media (max-width:620px){
  .aw-list li{display:grid;gap:3px}
  .aw-list .dots{display:none}
  .aw-list .v{text-align:left}
}

/* ============ STACK / TOWER DIAGRAM ============ */
.stack-lede{padding:clamp(28px,4vh,48px) 0 clamp(20px,3vh,36px);display:grid;grid-template-columns:minmax(0,8fr) minmax(0,4fr);gap:clamp(24px,4vw,64px)}
/* change the VOICE, not just the size - at display caps in a second tint it read as a
   second headline rather than a subordinate clause. */
#award-h .sub{font-size:.36em;font-stretch:100%;font-weight:400;text-transform:none;
  letter-spacing:0;line-height:1.45;display:block;margin-top:.85em;color:var(--ink-60)}
.stack-lede h2{font-size:clamp(1.9rem,3.6vw,3rem);font-stretch:118%;text-transform:uppercase;max-width:19ch;text-wrap:balance}
/* one rule for every section intro: body copy hangs from the headline's baseline,
   not from the bottom of the cell. Two adjacent sections using opposite rules reads
   as accident on a site whose premise is alignment. */
.stack-lede p{color:var(--ink-60);max-width:42ch;align-self:start;font-size:1.02rem}
.stack-lede p strong{color:var(--ink);font-weight:600}
@media (max-width:900px){.stack-lede{grid-template-columns:minmax(0,1fr)}}

.stack-grid{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:clamp(24px,3.5vw,56px);padding-bottom:clamp(40px,6vh,72px);align-items:start}
.tower-fig{position:sticky;top:88px;align-self:start;margin:0}
.tower-frame{border:1px solid var(--rule-strong);background:var(--paper-lift);overflow:hidden;
  display:flex;align-items:center;justify-content:center;padding:clamp(8px,1.4vw,20px)}
#tower{display:block;width:auto;max-width:100%;height:auto;max-height:calc(100vh - 150px);margin-inline:auto}
.tower-cap{
  display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;
  border:1px solid var(--rule-strong);border-top:none;padding:10px 14px;background:var(--paper-lift);
  font-family:var(--m);color:var(--ink-60);
}
.tower-cap .hint{color:var(--blue);display:none}
/* the hint only exists where hovering does; on touch the scroll-spy IS the mechanism */
@media (min-width:901px) and (hover:hover){.js .tower-cap .hint{display:inline}}
@media (hover:none){.tower-cap .hint{display:none}}

.stack-notes{list-style:none}
.stack-note{border-top:1px solid var(--rule);padding:26px 18px 30px;transition:background .25s ease,box-shadow .25s ease;position:relative}
.stack-note:last-child{border-bottom:1px solid var(--rule)}
.sn-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px}
.sn-idx{font-family:var(--m);color:var(--ink-mute);transition:color .25s ease}
.sn-ref{font-family:var(--m);color:var(--ink-mute);transition:color .25s ease}
.stack-note h3{font-size:1.16rem;font-weight:700;font-stretch:112%;margin-bottom:8px;letter-spacing:0}
.stack-note p{font-size:.93rem;color:var(--ink-60);line-height:1.6}
.stack-note.is-active{background:var(--paper-lift);box-shadow:inset 3px 0 0 var(--blue)}
.stack-note.is-active .sn-idx,.stack-note.is-active .sn-ref{color:var(--blue)}
@media (max-width:980px){
  .stack-grid{grid-template-columns:minmax(0,1fr)}
  /* stays sticky on touch: the scroll-spy highlights a layer, so that layer has to
     still be on screen while the note that triggered it is being read. */
  .tower-fig{position:sticky;top:56px;z-index:2;background:var(--paper);
             max-width:660px;margin:0 auto;width:100%}
  #tower{max-height:46vh}
  .stack-notes{max-width:660px;margin:0 auto;width:100%}
}

#tower .frameln{stroke:var(--ink-decor);stroke-width:1;fill:none}
#tower .gridtxt{font-family:var(--m);font-size:11px;fill:var(--ink-decor);letter-spacing:.1em}
#tower .struct{stroke:var(--ink);fill:none}
#tower .s15{stroke-width:1.5}
#tower .s08{stroke-width:.8;opacity:.75}
#tower .lyr{color:var(--ink);transition:opacity .35s ease}
#tower .lyr .ln{stroke:currentColor;fill:none;stroke-width:1.3}
#tower .lyr .lnf{stroke:currentColor;fill:none;stroke-width:.9}
#tower .lyr .fl{fill:currentColor;stroke:none}
#tower .lyr text{fill:currentColor}
#tower .fov{stroke:currentColor;stroke-width:.75;stroke-dasharray:2 4;fill:none;opacity:.5}
#tower .leader{stroke:currentColor;stroke-width:1;stroke-dasharray:2 5;fill:none}
/* ~12px RENDERED at every breakpoint - see the compensation table below. */
#tower .ann text{font-family:var(--m);font-size:18px;letter-spacing:.05em;font-weight:700;
  paint-order:stroke fill;stroke:var(--paper-lift);stroke-width:4px;stroke-linejoin:round}
#tower .mini{font-family:var(--m);font-size:14px;fill:var(--ink-60);letter-spacing:.12em;font-weight:400;
  paint-order:stroke fill;stroke:var(--paper-lift);stroke-width:5px;stroke-linejoin:round}
#tower .dim{stroke:var(--ink-decor);stroke-width:.9;fill:none}
#tower .dimtxt{font-family:var(--m);font-size:10px;fill:var(--ink-60);letter-spacing:.18em}
.js #tower.has-active .lyr:not(.is-active){opacity:.45}
.js #tower.has-active .lyr:not(.is-active) .ann{opacity:1}
#tower .lyr.is-active{color:var(--blue)}
#tower .lyr.is-active .fov{opacity:1}
#tower .lyr.is-active .leader{animation:dashflow .9s linear infinite}
@keyframes dashflow{to{stroke-dashoffset:-14}}
/* 680-1000px: the figure is sticky AND height-capped, so it renders narrowest here
   (measured 285px wide, scale 0.40). Biggest compensation of the three. */
@media (min-width:680px) and (max-width:1000px){
  /* give the figure more height rather than inflating the type - a 30px annotation
     needed 40+ units of leading and the drawing does not have it. */
  #tower{max-height:70vh}
  #tower .ann text{font-size:18px}
  #tower .mini{font-size:14px}
  #tower .dim,#tower .dimtxt,#tower .gridtxt{display:none}
}
@media (max-width:679px){
  /* No bleed: 116%/-8% clipped 21-48px off each side and took the corner
     registration marks with it. Bands are narrow because the SVG scales fluidly
     within each one - a single user-unit size per band swung the rendered type
     from 8.96px at 320 to 19.85px at 679. */
  #tower .dim,#tower .dimtxt,#tower .gridtxt{display:none}
  .tower-frame{overflow:hidden}
  #tower{width:100%;max-width:100%;margin-left:0;max-height:38vh}
}
/* Below 400px the drawing is ~280px wide; a 19-character mono callout cannot fit
   inside a 720-unit box at any legible size. The five .stack-notes directly beneath
   carry every label verbatim, so the drawing keeps its linework and drops the text. */
@media (max-width:400px){#tower .ann{display:none}#tower .mini{font-size:19px}}
@media (min-width:401px) and (max-width:520px){#tower .ann text{font-size:22px}#tower .mini{font-size:16px}}
@media (min-width:521px) and (max-width:679px){#tower .ann text{font-size:17px}#tower .mini{font-size:13px}}

/* ============ SCOPE OF WORKS (service rows) ============ */
.sec-h2{margin-top:clamp(24px,3.5vh,40px)}
/* One headline system. .story-h2 is the section rank; .story-h2.lg is the display
   rank. Both carry the blue stop - before this the four bespoke h2s were larger
   AND unmarked, so the accent landed on the smaller ones. */
.story-h2.lg{font-size:clamp(2.1rem,4.3vw,3.4rem);max-width:15ch}
/* an authored break is a decision; a measure cap re-wrapping it is not. Where the
   headline carries its own <br>, the cap stands down. */
.story-h2:has(br),.story-h2.lg:has(br),.cta h2:has(br),.stack-lede h2:has(br){max-width:none;text-wrap:wrap}
.story-h2{font-size:clamp(1.8rem,3.4vw,2.8rem);font-stretch:118%;text-transform:uppercase;line-height:1.04;max-width:18ch}
.story-h2 .dot{color:var(--blue)}
.works-intro{padding:clamp(24px,3.5vh,40px) 0;color:var(--ink-60);max-width:58ch}
.works-intro strong{color:var(--ink);font-weight:600}


/* ============ DRAWN PLATES ============
   Two services shipped with stock photography that fought the brief: a razor-wire
   perimeter (reads "detention centre") and a gloved hand with a torch at a door
   (reads "burglar"), both under headings about a condominium. There is no
   alternative photograph in assets/uploads/ - so these two plates are drawn in the
   site's own language instead. Same frame, same caption bar, same reference code. */
.drawplate{width:100%;height:100%;display:block;background:var(--paper-lift)}
.drawplate .dp-grid path{stroke:var(--blue);stroke-width:.5;opacity:.12;fill:none}
.drawplate .dp-line{stroke:var(--ink);stroke-width:1.4;fill:none}
.drawplate .dp-thin{stroke:var(--ink);stroke-width:.8;opacity:.7;fill:none}
.drawplate .dp-ground{stroke:var(--ink);stroke-width:1.4}
.drawplate .dp-hatch{stroke:var(--ink);stroke-width:.7;opacity:.55;fill:none}
.drawplate .dp-act{stroke:var(--blue);stroke-width:1.4;fill:none}
.drawplate .dp-beam{stroke:var(--blue);stroke-width:1;stroke-dasharray:5 4}
.drawplate .dp-route{stroke:var(--blue);stroke-width:1.6;fill:none;stroke-dasharray:7 5}
.drawplate .dp-node{fill:var(--paper-lift);stroke:var(--blue);stroke-width:1.4}
.drawplate .dp-leader{stroke:var(--ink);stroke-width:.8;stroke-dasharray:2 4;fill:none}
.drawplate .dp-t{font-family:var(--m);font-size:13px;font-weight:700;fill:var(--ink);letter-spacing:.1em}
.drawplate .dp-m{font-family:var(--m);font-size:12px;fill:var(--ink-60);letter-spacing:.12em}
.drawplate .dp-cloud{stroke:var(--blue);stroke-width:1;fill:none;stroke-dasharray:6 4;opacity:.85}
.drawplate .dp-s{font-family:var(--m);font-size:10px;fill:var(--ink-60);letter-spacing:.12em}
.drawplate .dp-n{font-family:var(--m);font-size:8px;font-weight:700;fill:var(--blue)}
/* every plate is MOUNTED - without this the pale ones dissolve into the sheet and
   read as holes rather than as photographs. */
.svccard .ph,.wcard .ph,.plate-img{box-shadow:inset 0 0 0 1px var(--rule)}
.svccard .ph:has(.drawplate){background:var(--paper-lift)}

/* ============ SERVICE PLATE GRID (services page + home preview) ============ */
.svcgrid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(258px,1fr));
  border-top:1px solid var(--rule-strong);border-left:1px solid var(--rule);
  margin-top:clamp(24px,3.5vh,40px);margin-bottom:clamp(40px,6vh,72px);
}
.svcgrid.of3{grid-template-columns:repeat(3,1fr)}
@media (max-width:860px){.svcgrid.of3{grid-template-columns:repeat(auto-fill,minmax(258px,1fr))}}
.svccard.more{grid-column:span 2;text-align:left;display:flex;flex-direction:column;justify-content:space-between;gap:10px;
  padding:clamp(20px,2.6vw,32px);background:var(--paper-lift)}
.svccard.more .k{font-family:var(--m);color:var(--blue)}
.svccard.more .big{font-size:clamp(1.5rem,2.6vw,2.15rem);font-stretch:112%;font-weight:800;text-transform:uppercase;line-height:1.06}
.svccard.more .go{font-family:var(--m);color:var(--ink-mute);
  border-bottom:1px solid var(--rule-strong);padding-bottom:2px;align-self:flex-start}
.svccard.more:hover .go{color:var(--blue);border-bottom-color:var(--blue)}
@media (max-width:860px){.svccard.more{grid-column:auto}}
.svccard{
  border-right:1px solid var(--rule);border-bottom:1px solid var(--rule);
  background:var(--paper);display:flex;flex-direction:column;min-width:0;
  transition:background .25s ease;
}
.svccard:hover{background:var(--paper-lift)}
.svccard .ph{aspect-ratio:3/2;overflow:hidden;background:var(--rule);border-bottom:1px solid var(--rule)}
.svccard .ph img{width:100%;height:100%;object-fit:cover;transition:transform .5s cubic-bezier(.2,.6,.2,1);filter:none}
.svccard:hover .ph img{transform:scale(1.045)}
.svccard .bd{padding:16px 16px 20px;display:flex;flex-direction:column;gap:7px;flex:1}
/* caption strip, not a floating label: same idiom as .plate-cap so a photograph
   reads as a plate in a drawing set rather than a card in a card grid. */
.svccard .code{
  display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  margin:-16px -16px 10px;padding:9px 16px;border-bottom:1px solid var(--rule);
  font-family:var(--m);color:var(--ink-mute);
}
.svccard .code .t{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.svccard .code .ref{color:var(--blue);font-weight:700;white-space:nowrap}
.svccard:hover .code{background:var(--paper)}
.svccard h3{font-size:1.03rem;font-weight:700;font-stretch:112%;line-height:1.2}
.svccard p{font-size:.88rem;color:var(--ink-60);line-height:1.6}

/* ============ WORK / PROJECT INDEX ============ */
.workgrid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));
  border-top:1px solid var(--rule-strong);border-left:1px solid var(--rule);
  margin-top:clamp(24px,3.5vh,40px);
}
.workgrid.of4{grid-template-columns:repeat(4,1fr)}
@media (max-width:1000px){.workgrid.of4{grid-template-columns:repeat(auto-fill,minmax(228px,1fr))}}
@media (max-width:560px){
  .workgrid.of4,.workgrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .wcard .bd{padding:10px 11px 12px}
  .wcard .nm{font-size:.82rem;line-height:1.25}
  .wcard-ask{font-size:11px;letter-spacing:.1em}
}
.wcard{
  position:relative;border-right:1px solid var(--rule);border-bottom:1px solid var(--rule);
  min-width:0;background:var(--paper);display:block;
}
.wcard .ph{aspect-ratio:1/1;overflow:hidden;background:var(--rule)}
.wcard .ph img{width:100%;height:100%;object-fit:cover;transition:transform .55s cubic-bezier(.2,.6,.2,1),filter .35s ease;filter:none}
.wcard:hover .ph img{transform:scale(1.05);filter:brightness(1.05)}
.wcard-link{display:block;color:inherit;text-decoration:none}
/* Grey at rest (measured 4.65:1, passes), blue on hover/focus. Colour is set HERE
   and nowhere else - two declarations 464 lines apart is a landmine. Grey is
   deliberate: 29 blue labels in one grid became a band of noise competing with
   the plates they sit under. */
.wcard-ask{grid-column:1/-1;justify-self:start;white-space:nowrap;padding:7px 0 2px;font-family:var(--m);color:var(--ink-mute);
  border-bottom:1px solid var(--rule-strong);padding-bottom:1px;align-self:flex-start;
  transition:color .2s,border-color .2s}
.wcard-link:hover .wcard-ask,.wcard-link:focus-visible .wcard-ask{border-bottom-color:var(--blue)}
.wcard .bd{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;
  align-content:space-between;column-gap:10px;row-gap:8px;padding:12px 13px 14px;min-height:100%}
.wcard:hover .bd{background:var(--paper-lift);box-shadow:inset 0 -2px 0 var(--blue)}
.wcard .nm{grid-column:1;min-width:0;font-size:.9rem;font-weight:600;letter-spacing:-.005em;line-height:1.3;min-width:0}
.wcard .ix{grid-column:2;justify-self:end;font-family:var(--m);color:var(--ink-mute);flex:none;transition:color .25s ease}
.wcard:hover .ix{color:var(--blue)}
li.wcard.more{grid-column:span 2}   /* 29 cards + this (2 cols) + the end tile = 8 full rows */
/* MUST stay after the line above - same specificity, so source order decides.
   Below this width the grid is 1-2 columns and the span invents a column. */
@media (max-width:1000px){li.wcard.more{grid-column:auto}}
.wcard.more{display:flex;flex-direction:column;justify-content:space-between;align-items:flex-start;gap:10px;padding:clamp(20px,2.6vw,32px);background:var(--paper-lift)}
.wcard.more .k{font-family:var(--m);color:var(--blue)}
/* two-column instance (work.html, an <li>) gets the wide rank; the single-column
   instances on index and services keep a rank that fits a 226px cell. */
a.wcard.more .big,.svccard.more .big{font-size:clamp(1.2rem,1.8vw,1.55rem)}
.wcard.more .big{font-size:clamp(1.5rem,2.6vw,2.15rem);font-stretch:112%;font-weight:800;text-transform:uppercase;line-height:1.04;max-width:100%;overflow-wrap:normal;hyphens:none}
.wcard.more .go{font-family:var(--m);color:var(--ink-60);border-bottom:1px solid var(--rule-strong);padding-bottom:2px;transition:color .2s,border-color .2s}
.wcard.more:hover .go{color:var(--blue);border-bottom-color:var(--blue)}
.work-foot{border-top:1px solid var(--rule);padding:14px 0 clamp(40px,6vh,64px);font-family:var(--m);font-size:10.5px;letter-spacing:.1em;color:var(--ink-mute)}

/* ============ SECTORS ============ */
.sectors{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);border-top:1px solid var(--rule);margin-top:clamp(24px,3.5vh,40px)}
.sector{padding:clamp(28px,4vh,48px) clamp(18px,2.5vw,40px);border-right:1px solid var(--rule);min-width:0}
.sector:last-child{border-right:none}
.sector .tag{font-family:var(--m);color:var(--blue);display:block;margin-bottom:14px}
.sector h3{font-size:clamp(1.5rem,2.6vw,2.1rem);font-stretch:118%;text-transform:uppercase;margin-bottom:14px}
.sector p{color:var(--ink-60);font-size:.97rem;max-width:44ch;margin-bottom:22px}
.leader-list{list-style:none}
.leader-list li{display:flex;align-items:baseline;font-family:var(--m);font-size:11.5px;letter-spacing:.03em;padding:7px 0}
.leader-list .dots{flex:1;border-bottom:1px dotted var(--rule-strong);margin:0 10px;transform:translateY(-3px)}
.leader-list .ref{color:var(--blue);font-weight:700;white-space:nowrap}
.sectors-foot{border-top:1px solid var(--rule);padding:14px 0 clamp(40px,6vh,64px);font-family:var(--m);font-size:10.5px;letter-spacing:.1em;color:var(--ink-mute)}
@media (max-width:760px){
  .sectors{grid-template-columns:minmax(0,1fr)}
  .sector{border-right:none;border-bottom:1px solid var(--rule)}
  .sector:last-child{border-bottom:none}
}

/* ============ METHOD ============ */
.method-intro{padding:clamp(24px,3.5vh,40px) 0 clamp(28px,4vh,44px);color:var(--ink-60);max-width:58ch}
.steps{list-style:none;display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--rule-strong);margin-bottom:clamp(48px,7vh,80px)}
.step{position:relative;padding:30px clamp(14px,1.8vw,26px) 8px 0}
.step::before{content:"";position:absolute;top:-5px;left:0;width:9px;height:9px;border-radius:50%;background:var(--paper);border:1.5px solid var(--ink);transition:background .25s ease,border-color .25s ease}
.step:hover::before{background:var(--blue);border-color:var(--blue)}
.step .sn{font-family:var(--m);font-weight:700;color:var(--blue);font-size:12px;letter-spacing:.16em;display:block;margin-bottom:12px}
.step h3{font-size:1.12rem;font-weight:700;font-stretch:112%;margin-bottom:10px;max-width:13ch}
.step p{font-size:.9rem;color:var(--ink-60);line-height:1.6;max-width:30ch}
.step .arr{position:absolute;top:-9px;right:-7px;font-family:var(--m);color:var(--ink-mute);font-size:13px;background:var(--paper);padding:0 3px;line-height:1}
.step:last-child .arr{display:none}
@media (max-width:860px){
  .steps{grid-template-columns:minmax(0,1fr);border-top:none;border-left:1px solid var(--rule-strong);padding-left:26px}
  .step{padding:0 0 32px 0}
  .step::before{top:4px;left:-31px}
  .step .arr{display:none}
  .step h3,.step p{max-width:60ch}
}

/* ============ STORY (about) ============ */
.story{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:clamp(28px,4.5vw,72px);padding:clamp(28px,4.5vh,56px) 0 clamp(40px,6vh,72px);align-items:start}
.story-body p{color:var(--ink-60);margin-bottom:18px;font-size:1.02rem;line-height:1.7;max-width:60ch}
.story-body p strong{color:var(--ink);font-weight:600}
.story-aside{position:sticky;top:84px}
@media (max-width:900px){.story{grid-template-columns:minmax(0,1fr)}.story-aside{position:static}}

/* ============ MILESTONES ============ */
.miles{list-style:none;border-top:1px solid var(--rule-strong);margin:clamp(24px,3.5vh,40px) 0 clamp(44px,6.5vh,76px)}
.mile{
  display:grid;grid-template-columns:68px minmax(0,1fr) minmax(0,1.35fr);
  gap:clamp(16px,2.6vw,44px);padding:24px 0;border-bottom:1px solid var(--rule);
  transition:background .25s ease,box-shadow .25s ease;
}
.mile:hover{background:var(--paper-lift);box-shadow:inset 3px 0 0 var(--blue)}
.mile .yr{font-family:var(--m);font-size:15px;font-weight:700;letter-spacing:.06em;color:var(--blue)}
.mile h3{font-size:1.1rem;font-weight:700;font-stretch:112%;line-height:1.2}
.mile p{font-size:.93rem;color:var(--ink-60);line-height:1.65}
@media (max-width:760px){
  .mile{grid-template-columns:minmax(0,1fr);row-gap:8px;padding:22px 12px}
}

/* ============ LOGO SHEETS ============ */
.sheetrow{border-top:1px solid var(--rule);padding:clamp(26px,4vh,44px) 0;display:grid;gap:clamp(20px,3vh,32px)}
.sheetrow:first-child{border-top:none}
.sheet-k{font-family:var(--m);color:var(--blue)}
.sheet-k + p{color:var(--ink-60);font-size:.95rem;max-width:56ch;margin-top:8px}
.brands-block{padding-bottom:clamp(44px,6.5vh,76px)}

/* A drafting sheet fills its field - that is what title blocks and revision notes
   are for. Four sections had a headline in one corner and blank paper in the
   opposite one; this is the smallest object that closes them honestly. */
.sheetnote{border:1px solid var(--rule);background:var(--paper-lift);
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-self:end}
.sheetnote div{padding:12px 14px;border-right:1px solid var(--rule);min-width:0}
.sheetnote div:last-child{border-right:none}
.sheetnote .k{display:block;font-family:var(--m);font-size:9.5px;letter-spacing:.2em;
  color:var(--ink-mute);margin-bottom:5px}
.sheetnote .v{font-family:var(--m);font-size:11.5px;letter-spacing:.03em;font-weight:700}
.sheetnote .v.blue{color:var(--blue)}
@media (max-width:620px){.sheetnote{grid-template-columns:repeat(2,minmax(0,1fr))}
  .sheetnote div:nth-child(2){border-right:none}}

/* ============ DRAWING REGISTER (work page) ============ */
.register{border:1px solid var(--rule-strong);background:var(--paper-lift);margin-top:clamp(20px,3vh,32px)}
.register-k{
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;
  padding:11px 16px;border-bottom:1px solid var(--rule);
  font-family:var(--m);color:var(--blue);
}
.register-k .n{color:var(--ink-60)}
.register-grp{display:grid;grid-template-columns:176px minmax(0,1fr);gap:8px 20px;padding:15px 16px;border-bottom:1px solid var(--rule)}
.register-grp:last-child{border-bottom:none}
.register-foot{border-top:1px solid var(--rule);padding:15px 16px;display:flex;
  gap:14px 22px;flex-wrap:wrap;align-items:baseline;justify-content:space-between}
.register-foot p{font-size:.93rem;color:var(--ink-60);line-height:1.6;max-width:62ch}
.register-foot p b{color:var(--ink);font-weight:700}
.register-grp b{font-family:var(--m);color:var(--ink-60);font-weight:400;padding-top:3px}
.register-grp .names{font-size:.93rem;line-height:1.75}
/* each building name stays whole; the run breaks BETWEEN names. Both halves matter -
   without the whitespace in the markup this collapses to one unbreakable line. */
.register-grp .names{overflow-wrap:break-word}
.register-grp .names a{border-bottom:1px solid var(--rule-strong);transition:color .2s,border-color .2s;white-space:nowrap;display:inline-block}
.register-grp .names a:hover,.register-grp .names a:focus-visible{color:var(--blue);border-bottom-color:var(--blue)}
.register-grp .names .sep{color:var(--ink-mute);padding:0 3px}
@media (max-width:700px){.register-grp{grid-template-columns:minmax(0,1fr);gap:7px}}

/* ============ SCHEDULE OF APPROVALS (typeset, not a logo wall) ============ */
.schedule{border:1px solid var(--rule-strong);background:var(--paper-lift)}
.schedule.compact .sch-row{padding:13px 18px}
.schedule.compact .sch-name{font-size:1rem}
@media (min-width:861px){.schedule.supply{display:grid;grid-template-columns:minmax(0,1fr) 1fr 1fr}
  .schedule.supply .sch-row{border-right:1px solid var(--rule)}
  .schedule.supply .sch-row:nth-child(3n){border-right:none}}
.sch-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 20px;align-items:baseline;padding:16px 18px;border-bottom:1px solid var(--rule)}
.sch-row:last-child{border-bottom:none}
.sch-name{font-size:1.12rem;font-weight:700;font-stretch:112%;letter-spacing:0;min-width:0}
.sch-role{font-family:var(--m);color:var(--blue);text-align:right;white-space:nowrap}
.sch-role .yr{color:var(--ink-60);margin-left:9px}
.sch-note{grid-column:1/-1;font-size:.9rem;color:var(--ink-60);line-height:1.6;max-width:64ch}
@media (max-width:560px){
  .sch-row{grid-template-columns:minmax(0,1fr)}
  .sch-role{text-align:left;white-space:normal}
}

/* Row registration ONLY where a row exists - each grid's own collapse point. */
@media (min-width:561px){.svccard h3{min-height:2.6em}}
@media (min-width:761px){.sector h3{min-height:2.2em}}
@media (min-width:701px){.why-cell h3{min-height:2.6em}}
.wcard .nm{min-height:2.3em;display:flex;align-items:flex-end}

/* Lock the HEADING, not the paragraph. A min-height on the paragraph measured
   inert because both already exceeded the floor - it is the one-line vs two-line
   heading that throws the columns out of register. */
@media (min-width:761px){.sector h3{min-height:2.2em}}
@media (min-width:761px){.step h3{min-height:2.6em}}

/* ============ WHY (ink section) ============ */
.why{
  background:var(--ink);color:var(--paper-on-ink);
  background-image:
    linear-gradient(rgba(107,138,255,.09) 1px,transparent 1px),
    linear-gradient(90deg,rgba(107,138,255,.09) 1px,transparent 1px);
  background-size:52px 52px;
  padding-bottom:clamp(48px,7vh,88px);
}
.why .sec-head{border-top:none}
.why .sec-num{color:var(--blue-lift)}
.why .sec-label{color:rgba(244,243,239,.55)}
.why .sec-rule{background:var(--rule-on-ink)}
.why .sec-mark{color:rgba(244,243,239,.50)}
.why-lede{padding:clamp(28px,4vh,52px) 0 clamp(30px,4.5vh,56px);display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:clamp(24px,4vw,64px)}
.why-lede h2{font-size:clamp(1.9rem,3.8vw,3.1rem);font-stretch:120%;text-transform:uppercase;color:#F4F3EF;max-width:15ch}
.why-lede h2 .blue{color:var(--blue-lift)}
.why-lede p{color:rgba(244,243,239,.6);align-self:end;max-width:42ch}
.why-grid{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid var(--rule-on-ink)}
.why-cell{padding:clamp(24px,3vh,40px) clamp(18px,2.4vw,36px);border-right:1px solid var(--rule-on-ink);border-bottom:1px solid var(--rule-on-ink);min-width:0}
.why-cell:nth-child(3n){border-right:none}
.why-cell:nth-child(n+4){border-bottom:none}
.why-cell .wn{font-family:var(--m);color:#6E8CFF;display:block;margin-bottom:14px}
.why-cell h3{font-size:1.16rem;color:#F4F3EF;font-stretch:112%;margin-bottom:10px}
.why-cell p{font-size:.92rem;color:rgba(244,243,239,.6);line-height:1.65;max-width:40ch}
@media (max-width:1000px){
  .why-grid{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .why-cell{border-right:1px solid var(--rule-on-ink);border-bottom:1px solid var(--rule-on-ink)}
  .why-cell:nth-child(3n){border-right:1px solid var(--rule-on-ink)}
  .why-cell:nth-child(2n){border-right:none}
  .why-cell:nth-child(n+5){border-bottom:none}
}
@media (max-width:700px){
  .why-lede{grid-template-columns:minmax(0,1fr)}
  .why-grid{grid-template-columns:minmax(0,1fr)}
  .why-cell,.why-cell:nth-child(3n),.why-cell:nth-child(2n){border-right:none;border-bottom:1px solid var(--rule-on-ink)}
  .why-cell:last-child{border-bottom:none}
}

/* ============ CONTACT ============ */
.contact-grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(28px,4.5vw,80px);padding:clamp(32px,5vh,60px) 0 clamp(48px,7vh,88px)}
.contact-grid > .contact-intro{grid-column:1;grid-row:1}
.contact-grid > #survey-form{grid-column:2;grid-row:1/span 2}
.contact-grid > .addr{grid-column:1;grid-row:2;align-self:start;margin-top:32px}
.contact-grid h2{font-size:clamp(2rem,4vw,3.2rem);font-stretch:120%;text-transform:uppercase;max-width:12ch;margin-bottom:18px}
.contact-grid h2 .dot{color:var(--blue)}
.contact-copy{color:var(--ink-60);max-width:40ch;margin-bottom:32px}
.addr{border:1px solid var(--rule-strong);background:var(--paper-lift)}
.addr-head{padding:10px 16px;border-bottom:1px solid var(--rule);font-family:var(--m);color:var(--blue)}
.addr ul{list-style:none;padding:14px 16px 16px}
.addr li{display:flex;align-items:baseline;font-family:var(--m);padding:6px 0;gap:0}
.addr .k{color:var(--ink-mute);white-space:nowrap}
.addr .dots{flex:1;border-bottom:1px dotted var(--rule-strong);margin:0 10px;transform:translateY(-3px);min-width:16px}
.addr .v{text-align:right;font-weight:700;min-width:0;white-space:normal;overflow-wrap:anywhere}
.addr li.wide .v{text-align:right}
.addr .v a{border-bottom:1px solid transparent;transition:color .2s,border-color .2s}
.addr .v a:hover{color:var(--blue);border-bottom-color:var(--blue)}

/* contact channel cards */
.chan{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--rule-strong);border-left:1px solid var(--rule);margin-top:clamp(24px,3.5vh,40px)}
.chan-cell{border-right:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:clamp(22px,3vw,34px);display:flex;flex-direction:column;gap:9px;min-width:0}
.chan-k{font-family:var(--m);color:var(--blue)}
.chan-cell.static .chan-v{font-size:1rem;font-weight:600}
.chan-v{font-size:clamp(1.05rem,1.7vw,1.35rem);font-weight:700;font-stretch:112%;letter-spacing:-.01em;line-height:1.25;word-break:break-word}
.chan-v a{border-bottom:1px solid var(--rule-strong);transition:color .2s,border-color .2s}
.chan-v a:hover{color:var(--blue);border-bottom-color:var(--blue)}
.chan-n{font-size:.87rem;color:var(--ink-60);line-height:1.6}
.chan-links{display:flex;gap:14px;flex-wrap:wrap;margin-top:2px}
.chan-links a{font-family:var(--m);color:var(--ink-60);border-bottom:1px solid var(--rule-strong);padding-bottom:2px;transition:color .2s,border-color .2s}
.chan-links a:hover{color:var(--blue);border-bottom-color:var(--blue)}
@media (max-width:860px){.chan{grid-template-columns:minmax(0,1fr)}}

.form{border:1px solid var(--rule-strong);background:var(--paper-lift);padding:clamp(20px,2.8vw,36px)}
.form-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:20px}
.field{margin-bottom:22px;min-width:0}
/* 11px, not the 9.5px micro grade: these are the only text on the site the user
   must read IN ORDER TO ACT, and the buyer is frequently 50+ on a phone.
   Tracking comes down with the size so the label does not outgrow its field. */
.field label{display:block;font-family:var(--m);font-size:11px;letter-spacing:.16em;color:var(--ink-60);margin-bottom:8px}
.req{color:var(--blue)}
.form-hint .req{font-family:var(--m)}
.field input,.field select,.field textarea{
  width:100%;background:transparent;border:none;border-bottom:1px solid var(--field-line);
  font-family:var(--d);font-size:16px;color:var(--ink);padding:10px 2px;border-radius:0;
  transition:border-color .2s ease,background .2s ease;
}
.field textarea{resize:none;min-height:132px;line-height:1.5}
.field input:hover,.field select:hover,.field textarea:hover{border-bottom-color:var(--ink)}
.field input:focus-visible,.field select:focus-visible,.field textarea:focus-visible{
  border-bottom-color:var(--blue);background:var(--blue-08)}
/* deliberately NO outline:none here - the global :focus-visible ring is the only
   cue left once [aria-invalid] repaints the border. */
/* opacity:1 is required or Firefox applies its own on top */
.field ::placeholder{color:var(--ink-mute);opacity:1}
.sel-wrap{position:relative}
.sel-wrap select{appearance:none;-webkit-appearance:none;padding-right:28px;cursor:pointer}
/* colour only - NEVER a font-size here. Under 16px iOS Safari zooms the page on
   focus and does not zoom back out. */
.sel-wrap select:has(option[value=""]:checked){color:var(--ink-mute)}
.sel-wrap select option{color:var(--ink)}
.sel-wrap svg{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:11px;height:7px;pointer-events:none}
.sel-wrap svg path{stroke:var(--blue);stroke-width:1.7;fill:none}
.filewrap{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding-top:6px}
.filewrap input[type=file]{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden}
.filebtn{font-family:var(--m);font-size:11px;letter-spacing:.14em;padding:11px 16px;
  border:1px solid var(--rule-strong);cursor:pointer;background:var(--paper-lift);
  transition:border-color .2s ease,color .2s ease}
.filebtn:hover{border-color:var(--blue);color:var(--blue)}
.filewrap input[type=file]:focus-visible + .filebtn{outline:2px solid var(--blue);outline-offset:2px}
.filename{font-family:var(--m);font-size:11px;color:var(--ink-mute)}
.form-foot{display:flex;align-items:center;gap:20px;flex-wrap:wrap;margin-top:6px}
.form-note{font-family:var(--d);font-size:12.5px;letter-spacing:0;color:var(--ink-60);max-width:42ch;line-height:1.6;text-transform:none}
.req{color:var(--blue)}
#prefill-note{font-family:var(--m);font-size:11.5px;letter-spacing:.02em;color:var(--ink);
  border-left:2px solid var(--blue);background:var(--blue-08);
  padding:12px 14px;margin:0 0 20px;text-transform:none;line-height:1.6}
.form-hint{font-family:var(--d);font-size:12.5px;letter-spacing:0;color:var(--ink-60);line-height:1.6;margin:0 0 16px;text-transform:none}
.field input[aria-invalid="true"],.field select[aria-invalid="true"],.field textarea[aria-invalid="true"]{border-bottom-color:#A5231C;border-bottom-width:2px}
.form-status{font-family:var(--m);color:var(--blue);margin-top:16px;display:none;line-height:1.7;max-width:52ch}
.form-status.err{color:#A5231C}
.form-status.show{display:block}
@media (max-width:900px){
  /* the title block repeats the address that §01 already gave twice; on a phone
     it sat between the CTA heading and the field it refers to. */
  /* The form carries class="form reveal d1", so a `.contact-grid > .reveal` rule
     (0,2,0) also matches it and beats `.contact-grid > form` (0,1,1) - which is how
     this reorder silently did nothing the first time. Select the form by ID. */
  .contact-grid{grid-template-columns:minmax(0,1fr);display:flex;flex-direction:column;gap:0}
  .contact-grid > .contact-intro{order:1}
  .contact-grid > #survey-form{order:2}
  .contact-grid > .addr{order:3;margin-top:clamp(28px,4vh,44px)}
}
@media (max-width:520px){
  .form-row{grid-template-columns:minmax(0,1fr);gap:0}
  .form .btn{width:100%;justify-content:center}
  .form-foot{gap:14px}
}

/* ============ FAQ ============ */
.faq{border-top:1px solid var(--rule-strong);margin-top:clamp(24px,3.5vh,40px);margin-bottom:clamp(44px,6.5vh,76px)}
.faq details{border-bottom:1px solid var(--rule)}
.faq summary{
  display:flex;align-items:baseline;gap:0;cursor:pointer;
  padding:19px 14px;font-size:1.02rem;font-weight:700;font-stretch:110%;list-style:none;
  transition:background .2s ease;
}
.faq summary .q{font-family:var(--m);font-size:10px;letter-spacing:.14em;color:var(--blue);
  flex:none;margin-right:16px;align-self:center}
.faq summary .qt{min-width:0}
.faq summary .dots{flex:1;border-bottom:1px dotted var(--rule-strong);margin:0 14px;
  align-self:flex-start;margin-top:11px;min-width:110px}
@media (max-width:820px){.faq summary .dots{display:none}.faq summary .qt{flex:1}}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";font-family:var(--m);font-size:16px;color:var(--blue);flex:none;line-height:1;align-self:flex-start;margin-top:3px}
.faq details[open] summary::after{content:"\2013"}
.faq summary:hover{background:var(--paper-lift)}
.faq details[open] summary{background:var(--paper-lift);box-shadow:inset 3px 0 0 var(--blue)}
.faq .a{padding:0 14px 24px 60px;color:var(--ink-60);max-width:70ch;line-height:1.65;font-size:.97rem}
.faq .a p + p{margin-top:12px}

/* ============ CTA BAND ============ */
.cta{border-top:1px solid var(--rule-strong);background:var(--paper-lift)}
.cta-in{
  padding:clamp(34px,5.5vh,64px) var(--pad);
  display:grid;grid-template-columns:minmax(0,8fr) minmax(0,4fr);
  align-items:center;gap:clamp(20px,4vw,56px);
}
@media (max-width:820px){.cta-in{grid-template-columns:minmax(0,1fr)}}
.cta h2{font-size:clamp(1.5rem,3.1vw,2.5rem);font-stretch:118%;text-transform:uppercase;max-width:22ch;line-height:1.06}
.cta h2 .dot{color:var(--blue)}
.cta-side{display:flex;flex-direction:column;gap:14px;align-items:flex-start}
.cta-note{font-family:var(--m);color:var(--ink-mute)}

/* ============ FOOTER ============ */
.footer{border-top:1px solid var(--rule-strong)}
.footer-top{
  display:grid;grid-template-columns:minmax(0,1.4fr) repeat(3,minmax(0,1fr));
  gap:clamp(24px,3.5vw,56px);padding:clamp(32px,5vh,56px) var(--pad);
}
.footer-brand .fk{display:block;font-family:var(--m);font-size:9.5px;letter-spacing:.2em;color:var(--blue);margin-bottom:14px}
.footer-blurb{font-size:.9rem;color:var(--ink-60);max-width:34ch;margin-top:14px;line-height:1.65}
.footer-col h3{font-family:var(--m);color:var(--blue);font-weight:400;margin-bottom:14px}
.footer-col ul{list-style:none;display:flex;flex-direction:column;gap:9px}
.footer-col li{font-size:.88rem;color:var(--ink-60);line-height:1.5}
.footer-col a{border-bottom:1px solid transparent;transition:color .2s,border-color .2s}
.footer-col a:hover{color:var(--blue);border-bottom-color:var(--blue)}
@media (max-width:860px){.footer-top{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
@media (max-width:520px){
  .footer-top{grid-template-columns:minmax(0,1fr);gap:0}
  .footer-col{border-top:1px solid var(--rule);padding-top:22px;margin-top:22px}
}
.footer-in{
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:18px;
  padding:20px var(--pad);border-top:1px solid var(--rule);
  font-family:var(--m);color:var(--ink-60);
}
.footer-in .eye{color:var(--ink-mute);text-align:center}
.footer-in > :last-child{justify-self:end}
@media (max-width:760px){.footer-in{grid-template-columns:1fr;text-align:left}
  .footer-in .eye{text-align:left}.footer-in > :last-child{justify-self:start}}
.footer-in .eye b{color:var(--blue);font-weight:700}
.footer-in a{border-bottom:1px solid transparent;transition:color .2s,border-color .2s}
.footer-in a:hover{color:var(--blue);border-bottom-color:var(--blue)}

/* 1.4.10 at 400% zoom: 320x256 left ~40px to read in once the nav and the
   sticky figure had taken their share. */
@media (max-height:520px){.tower-fig{position:sticky;top:0}}
@media (max-height:420px){.tower-fig{position:static}.nav{position:static}}

/* ============ REVEALS & MOTION ============ */
.js .reveal{opacity:0;transform:translateY(16px);transition:opacity .7s cubic-bezier(.2,.6,.2,1),transform .7s cubic-bezier(.2,.6,.2,1)}
.js .reveal.in{opacity:1;transform:none}
.js .reveal.d1{transition-delay:.08s}
.js .reveal.d2{transition-delay:.16s}
.js .reveal.d3{transition-delay:.24s}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
  .js .reveal{opacity:1;transform:none}
  #tower .lyr.is-active .leader{animation:none}
}
